From 885824d34f6f6626fde2fb041801408cbaf1f6f1 Mon Sep 17 00:00:00 2001 From: drl7x Date: Tue, 13 Jun 2000 02:39:09 +0000 Subject: [PATCH] Initial revision --- LICENSE | 363 + Makefile.in | 256 + README | 78 + configure | 583 + emacs/lclint-abbrevs | 58 + imports/assert.lcl | 5 + imports/assert.lcs | 121 + imports/ctype.lcl | 20 + imports/ctype.lcs | 149 + imports/errno.lcl | 22 + imports/errno.lcs | 399 + imports/limits.lcl | 111 + imports/limits.lcs | 386 + imports/locale.lcl | 37 + imports/locale.lcs | 409 + imports/math.lcl | 78 + imports/math.lcs | 587 + imports/setjmp.lcl | 94 + imports/setjmp.lcs | 569 + imports/signal.lcl | 167 + imports/signal.lcs | 761 + imports/stdarg.lcl | 22 + imports/stdarg.lcs | 652 + imports/stdio.lcl | 258 + imports/stdio.lcs | 435 + imports/stdlib.lcl | 246 + imports/stdlib.lcs | 303 + imports/string.lcl | 95 + imports/string.lcs | 883 ++ imports/strings.lcl | 95 + imports/strings.lcs | 883 ++ imports/time.lcl | 66 + imports/time.lcs | 1140 ++ lib/CTrait.syms | 99 + lib/CTraitGen.lcl | 1 + lib/Makefile | 10 + lib/ansi.h | 936 ++ lib/ansi.lcd | 890 ++ lib/ansistrict.lcd | 846 ++ lib/bool.h | 37 + lib/lclinit.lci | 40 + lib/lslinit.lsi | 43 + lib/posix.h | 890 ++ lib/posix.lcd | 1271 ++ lib/posixstrict.lcd | 1234 ++ lib/unix.h | 1451 ++ lib/unix.lcd | 1897 +++ lib/unixstrict.lcd | 1859 +++ src/DATE | 1 + src/Headers/256_random_numbers.nf | 256 + src/Headers/CTypesNode.h | 7 + src/Headers/abstBodyNode.h | 14 + src/Headers/abstract.h | 565 + src/Headers/abstractNode.h | 16 + src/Headers/aliasChecks.h | 35 + src/Headers/aliasStack.h | 53 + src/Headers/aliasTable.h | 86 + src/Headers/arrayQualNode.h | 9 + src/Headers/basic.h | 84 + src/Headers/bool.h | 42 + src/Headers/boolStack.h | 45 + src/Headers/cgrammar.h | 21 + src/Headers/cgrammar_tokens.h | 251 + src/Headers/checking.h | 10 + src/Headers/clabstract.h | 113 + src/Headers/claimNode.h | 17 + src/Headers/clause.h | 30 + src/Headers/clauseStack.h | 57 + src/Headers/code.h | 12 + src/Headers/constDeclarationNode.h | 13 + src/Headers/constants.h | 189 + src/Headers/context.h | 305 + src/Headers/cpp.h | 57 + src/Headers/cpperror.h | 35 + src/Headers/cppexp.h | 2 + src/Headers/cpphash.h | 62 + src/Headers/cpplib.h | 647 + src/Headers/cprim.h | 118 + src/Headers/cstring.h | 192 + src/Headers/cstringList.h | 63 + src/Headers/cstringSList.h | 66 + src/Headers/ctokens.h | 8 + src/Headers/ctypeList.h | 51 + src/Headers/cvar.h | 15 + src/Headers/declaratorInvNode.h | 17 + src/Headers/declaratorInvNodeList.h | 47 + src/Headers/declaratorNode.h | 17 + src/Headers/declaratorNodeList.h | 45 + src/Headers/dmalloc.h | 448 + src/Headers/ekind.h | 58 + src/Headers/enumNameList.h | 64 + src/Headers/enumNameSList.h | 39 + src/Headers/enumSpecNode.h | 16 + src/Headers/exportNode.h | 26 + src/Headers/exposedNode.h | 14 + src/Headers/exprChecks.h | 30 + src/Headers/exprNode.h | 353 + src/Headers/exprNodeList.h | 60 + src/Headers/exprNodeSList.h | 50 + src/Headers/fcnNode.h | 23 + src/Headers/fcnNodeList.h | 60 + src/Headers/fileId.h | 35 + src/Headers/fileIdList.h | 51 + src/Headers/fileTable.h | 118 + src/Headers/fileloc.h | 186 + src/Headers/filelocList.h | 67 + src/Headers/filelocStack.h | 46 + src/Headers/flagMarker.h | 83 + src/Headers/flagMarkerList.h | 49 + src/Headers/flag_codes.gen | 395 + src/Headers/flag_codes.h | 43 + src/Headers/flags.h | 105 + src/Headers/forwardTypes.h | 44 + src/Headers/general.h | 102 + src/Headers/globSet.h | 58 + src/Headers/globalList.h | 12 + src/Headers/globals.h | 123 + src/Headers/gram.h | 9 + src/Headers/guardSet.h | 61 + src/Headers/handle.h | 7 + src/Headers/hashTable.h | 68 + src/Headers/herald.h | 7 + src/Headers/herald.last | 7 + src/Headers/idDecl.h | 48 + src/Headers/idDeclList.h | 41 + src/Headers/importNode.h | 24 + src/Headers/importNodeList.h | 42 + src/Headers/imports.h | 9 + src/Headers/initDeclNode.h | 14 + src/Headers/initDeclNodeList.h | 44 + src/Headers/intSet.h | 54 + src/Headers/interfaceNode.h | 27 + src/Headers/interfaceNodeList.h | 52 + src/Headers/iterNode.h | 13 + src/Headers/lclForwardTypes.h | 15 + src/Headers/lclMisc.h | 10 + src/Headers/lclPredicateNode.h | 19 + src/Headers/lclTypeSpecNode.h | 52 + src/Headers/lcl_constants.h | 82 + src/Headers/lclctypes.h | 47 + src/Headers/lclinit.h | 18 + src/Headers/lclintMacros.nf | 134 + src/Headers/lcllib.h | 16 + src/Headers/lclscan.h | 31 + src/Headers/lclscanline.h | 55 + src/Headers/lclsyntable.h | 16 + src/Headers/lcltokentable.h | 20 + src/Headers/lctype.h | 356 + src/Headers/letDeclNode.h | 14 + src/Headers/letDeclNodeList.h | 42 + src/Headers/lh.h | 23 + src/Headers/limwr.h | 20 + src/Headers/llbasic.h | 23 + src/Headers/llerror.h | 239 + src/Headers/llglobals.h | 18 + src/Headers/llgrammar.h | 12 + src/Headers/llgrammar2.h | 8 + src/Headers/llgrammar_gen.h | 289 + src/Headers/llgrammar_gen2.h | 289 + src/Headers/llmain.h | 54 + src/Headers/lltok.h | 34 + src/Headers/local_constants-os2.h | 15 + src/Headers/local_constants.h | 7 + src/Headers/local_constants.last | 9 + src/Headers/lslOp.h | 15 + src/Headers/lslOpList.h | 32 + src/Headers/lslOpSet.h | 55 + src/Headers/lslinit.h | 197 + src/Headers/lslparse.h | 21 + src/Headers/lsymbol.h | 39 + src/Headers/lsymbolList.h | 39 + src/Headers/lsymbolSet.h | 48 + src/Headers/ltoken.h | 216 + src/Headers/ltokenList.h | 77 + src/Headers/macrocache.h | 50 + src/Headers/mapping.h | 33 + src/Headers/message.h | 22 + src/Headers/messageLog.h | 51 + src/Headers/misc.h | 126 + src/Headers/modifyNode.h | 26 + src/Headers/multiVal.h | 64 + src/Headers/nameChecks.h | 19 + src/Headers/nameNode.h | 18 + src/Headers/opFormNode.h | 31 + src/Headers/osd.h | 98 + src/Headers/pairNode.h | 17 + src/Headers/pairNodeList.h | 49 + src/Headers/paramNode.h | 38 + src/Headers/paramNodeList.h | 65 + src/Headers/portab.h | 88 + src/Headers/pp.h | 7 + src/Headers/privateNode.h | 22 + src/Headers/programNode.h | 23 + src/Headers/programNodeList.h | 42 + src/Headers/qtype.h | 62 + src/Headers/qual.h | 367 + src/Headers/qualList.h | 66 + src/Headers/quantifiedTermNode.h | 13 + src/Headers/quantifierNode.h | 14 + src/Headers/quantifierNodeList.h | 45 + src/Headers/renamingNode.h | 20 + src/Headers/replaceNode.h | 21 + src/Headers/replaceNodeList.h | 50 + src/Headers/reservedNames.nf | 201 + src/Headers/sHerald.h | 4 + src/Headers/sRef.h | 598 + src/Headers/sRefSet.h | 124 + src/Headers/sRefSetList.h | 52 + src/Headers/sRefSetStack.h | 51 + src/Headers/sRefTable.h | 53 + src/Headers/scan.h | 25 + src/Headers/scanline.h | 58 + src/Headers/sgrammar.h | 39 + src/Headers/sgrammar_tokens.h | 290 + src/Headers/shift.h | 15 + src/Headers/sigNode.h | 18 + src/Headers/sigNodeSet.h | 64 + src/Headers/signNode.h | 14 + src/Headers/signature.h | 23 + src/Headers/signature2.h | 8 + src/Headers/signature_gen.h | 102 + src/Headers/sort.h | 177 + src/Headers/sortList.h | 37 + src/Headers/sortSet.h | 54 + src/Headers/sortSetList.h | 51 + src/Headers/source.h | 59 + src/Headers/specialClauses.h | 160 + src/Headers/stDeclNode.h | 12 + src/Headers/stDeclNodeList.h | 48 + src/Headers/stmtNode.h | 12 + src/Headers/storeRefNode.h | 33 + src/Headers/storeRefNodeList.h | 42 + src/Headers/strOrUnionNode.h | 17 + src/Headers/structNames.h | 18 + src/Headers/symtable.h | 196 + src/Headers/syntable.h | 15 + src/Headers/system_constants.h | 135 + src/Headers/taggedUnionNode.h | 12 + src/Headers/termNode.h | 31 + src/Headers/termNodeList.h | 81 + src/Headers/tmpname.h | 1 + src/Headers/tokentable.h | 22 + src/Headers/traitRefNode.h | 11 + src/Headers/traitRefNodeList.h | 41 + src/Headers/typeExpr.h | 43 + src/Headers/typeIdSet.h | 61 + src/Headers/typeNameNode.h | 13 + src/Headers/typeNameNodeList.h | 49 + src/Headers/typeNamePack.h | 11 + src/Headers/typeNode.h | 23 + src/Headers/uentry.h | 583 + src/Headers/uentryList.h | 105 + src/Headers/usymId.h | 18 + src/Headers/usymIdSet.h | 66 + src/Headers/usymtab.h | 408 + src/Headers/usymtab_interface.h | 45 + src/Headers/varDeclarationNode.h | 26 + src/Headers/varDeclarationNodeList.h | 44 + src/Headers/varKinds.h | 250 + src/Headers/varNode.h | 21 + src/Headers/varNodeList.h | 42 + src/Headers/version.h | 23 + src/Headers/ynm.h | 37 + src/LICENSE | 1 + src/Makefile | 307 + src/Makefile.depend.real | 261 + src/Makefile.mine | 331 + src/Makefile.nodepend | 5 + src/Makefile.os2 | 187 + src/Makefile.sources | 82 + src/Makefile.sys | 80 + src/Makefile.sys-mine | 92 + src/abstract.c | 6407 ++++++++ src/aliasChecks.c | 3728 +++++ src/aliasTable.c | 824 + src/bison.head | 46 + src/bison.reset | 42 + src/cgrammar.c.der | 5482 +++++++ src/cgrammar.mod | 5477 +++++++ src/cgrammar.tab.c | 5436 +++++++ src/cgrammar.tab.h | 205 + src/cgrammar.y | 1612 ++ src/checking.c | 820 + src/clabstract.c | 2273 +++ src/clause.c | 155 + src/clauseStack.c | 186 + src/configure.scan | 31 + src/context.c | 4095 +++++ src/cpperror.c | 399 + src/cppexp.c | 1337 ++ src/cpphash.c | 492 + src/cpplib.c | 7425 +++++++++ src/cppmain.c | 222 + src/cprim.c | 393 + src/cscanner.c.der | 5435 +++++++ src/cscanner.l | 2855 ++++ src/cstring.c | 942 ++ src/cstringList.c | 243 + src/cstringSList.c | 252 + src/ctbase.i | 2454 +++ src/cttable.i | 656 + src/ctype.c | 2309 +++ src/ctypeList.c | 131 + src/cvar.c | 31 + src/declaratorInvNodeList.c | 114 + src/declaratorNodeList.c | 130 + src/dummy.c | 3 + src/ekind.c | 106 + src/enumNameList.c | 275 + src/enumNameSList.c | 45 + src/exprChecks.c | 1357 ++ src/exprData.i | 684 + src/exprNode.c | 9735 ++++++++++++ src/exprNodeList.c | 202 + src/exprNodeSList.c | 138 + src/fcnNodeList.c | 127 + src/fileIdList.c | 36 + src/fileTable.c | 822 + src/fileloc.c | 798 + src/filelocList.c | 294 + src/filelocStack.c | 234 + src/flagMarker.c | 155 + src/flagMarkerList.c | 541 + src/flags.c | 1199 ++ src/flags.def | 3420 +++++ src/flex.head | 83 + src/flex.reset | 56 + src/general.c | 736 + src/globSet.c | 165 + src/globals.c | 96 + src/guardSet.c | 356 + src/hashTable.c | 469 + src/idDecl.c | 181 + src/idDeclList.c | 109 + src/importNodeList.c | 114 + src/imports.c | 383 + src/initDeclNodeList.c | 118 + src/intSet.c | 176 + src/interfaceNodeList.c | 114 + src/lastversion | 1 + src/lclctypes.c | 172 + src/lclinit.c | 1557 ++ src/lclint.lcd | 20118 +++++++++++++++++++++++++ src/lclint.lclintrc | 82 + src/lcllib.c | 565 + src/lclscan.c | 212 + src/lclscanline.c | 1944 +++ src/lclsyntable.c | 181 + src/lcltokentable.c | 230 + src/letDeclNodeList.c | 117 + src/lex.yy.c | 5352 +++++++ src/lh.c | 499 + src/llerror.c | 1657 ++ src/llgrammar.c | 3852 +++++ src/llgrammar.c.der | 3852 +++++ src/llgrammar.tab.c | 3754 +++++ src/llgrammar.tab.h | 201 + src/llgrammar.y | 1321 ++ src/llmain.c | 2377 +++ src/lltok.c | 164 + src/lslOpList.c | 107 + src/lslOpSet.c | 198 + src/lslinit.c | 1555 ++ src/lslparse.c | 512 + src/lsymbol.c | 360 + src/lsymbolList.c | 95 + src/lsymbolSet.c | 157 + src/ltoken.c | 326 + src/ltokenList.c | 231 + src/macrocache.c | 408 + src/mapping.c | 124 + src/message.c | 277 + src/messageLog.c | 214 + src/multiVal.c | 306 + src/nameChecks.c | 1462 ++ src/osd.c | 543 + src/pairNodeList.c | 116 + src/paramNodeList.c | 167 + src/programNodeList.c | 111 + src/qtype.c | 226 + src/qual.c | 115 + src/qualList.c | 204 + src/quantifierNodeList.c | 120 + src/replaceNodeList.c | 114 + src/sRef.c | 8972 +++++++++++ src/sRefSet.c | 998 ++ src/sRefSetList.c | 104 + src/sRefTable.c | 147 + src/scan.c | 168 + src/scanline.c | 822 + src/shift.c | 100 + src/sigNodeSet.c | 222 + src/signature.c | 1320 ++ src/signature.c.der | 1320 ++ src/signature.tab.c | 1204 ++ src/signature.tab.h | 56 + src/signature.y | 322 + src/sort.c | 3159 ++++ src/sortList.c | 139 + src/sortSet.c | 236 + src/sortSetList.c | 140 + src/source.c | 332 + src/specialClauses.c | 942 ++ src/stDeclNodeList.c | 129 + src/storeRefNodeList.c | 142 + src/structNames.c | 154 + src/symtable.c | 2121 +++ src/syntable.c | 218 + src/termNodeList.c | 260 + src/tokentable.c | 180 + src/traitRefNodeList.c | 111 + src/typeIdSet.c | 299 + src/typeNameNodeList.c | 112 + src/uentry.c | 9396 ++++++++++++ src/uentryList.c | 848 ++ src/usymIdSet.c | 388 + src/usymtab.c | 5587 +++++++ src/usymtab_interface.c | 1733 +++ src/varDeclarationNodeList.c | 107 + src/varKinds.c | 623 + src/varNodeList.c | 138 + src/ynm.c | 54 + test/Makefile | 603 + test/abst_t.lcl | 3 + test/abst_t.lcs | 131 + test/abstptr.c | 24 + test/abstptr.expect | 25 + test/abstptr.lcl | 1 + test/abstptr.lcs | 123 + test/abstptr.out | 25 + test/abstract.expect | 22 + test/abstract.out | 22 + test/alias.c | 58 + test/alias.expect | 125 + test/alias.lcl | 8 + test/alias.lcs | 165 + test/alias.out | 125 + test/alias2.c | 64 + test/alias2.lcl | 5 + test/alias2.lcs | 154 + test/alias3.c | 67 + test/alias3.lcl | 13 + test/alias3.lcs | 226 + test/alias3.lh | 27 + test/alias4.c | 34 + test/alias4.lcl | 11 + test/alias4.lcs | 205 + test/alias4.lh | 14 + test/alias5.c | 33 + test/alias5.lcl | 9 + test/alias5.lcs | 135 + test/alias5.lh | 10 + test/alttypes.c | 25 + test/alttypes.expect | 11 + test/alttypes.out | 11 + test/ansireserved.c | 20 + test/ansireserved.expect | 73 + test/ansireserved.out | 73 + test/argorder.c | 14 + test/argorder.expect | 86 + test/argorder.out | 86 + test/argorder2.c | 20 + test/argorder2.lcl | 5 + test/argorder2.lcs | 127 + test/argorder3.c | 13 + test/argorder4.c | 39 + test/argorder4.lcl | 8 + test/argorder4.lcs | 127 + test/argorder5.c | 12 + test/args.c | 79 + test/args.expect | 27 + test/args.lcl | 7 + test/args.lcs | 133 + test/args.out | 27 + test/blocks.c | 25 + test/blocks.expect | 64 + test/blocks.out | 64 + test/bool.h | 34 + test/break.c | 48 + test/break.expect | 33 + test/break.out | 33 + test/cases.c | 41 + test/cases.expect | 42 + test/cases.out | 42 + test/cases2.c | 40 + test/cast.c | 23 + test/cast.expect | 40 + test/cast.lcl | 2 + test/cast.lcs | 127 + test/cast.out | 40 + test/cast2.c | 26 + test/charlit.c | 12 + test/charlit.expect | 31 + test/charlit.out | 31 + test/clauses.c | 24 + test/clauses.expect | 40 + test/clauses.out | 40 + test/clauses2.c | 19 + test/clauses3.c | 69 + test/commentchar.c | 15 + test/commentchar.expect | 17 + test/commentchar.out | 17 + test/commentcmd.c | 51 + test/compdestroy.c | 28 + test/compdestroy.expect | 39 + test/compdestroy.out | 39 + test/controldepth.c | 26 + test/controldepth.expect | 16 + test/controldepth.out | 16 + test/csyntax.c | 35 + test/csyntax.expect | 18 + test/csyntax.out | 18 + test/csyntax10.c | 20 + test/csyntax11.c | 7 + test/csyntax12.c | 11 + test/csyntax13.c | 12 + test/csyntax14.c | 12 + test/csyntax15.c | 11 + test/csyntax16.c | 48 + test/csyntax17.c | 13 + test/csyntax2.c | 17 + test/csyntax3.c | 12 + test/csyntax4.c | 12 + test/csyntax5.c | 7 + test/csyntax6.c | 1 + test/csyntax7.c | 3 + test/csyntax8.c | 8 + test/csyntax9.c | 2 + test/czechnames.c | 38 + test/czechnames.expect | 41 + test/czechnames.out | 41 + test/czechoslovaknames.c | 38 + test/czechoslovaknames.expect | 25 + test/czechoslovaknames.out | 25 + test/db1.expect | 686 + test/db1.out | 686 + test/db1/Makefile | 73 + test/db1/README | 18 + test/db1/bool.h | 34 + test/db1/bool.lcl | 5 + test/db1/bool.lcs | 121 + test/db1/bool.lh | 4 + test/db1/dbase.c | 278 + test/db1/dbase.h | 9 + test/db1/dbase.lcl | 96 + test/db1/dbase.lcs | 691 + test/db1/dbase.lh | 30 + test/db1/drive.c | 163 + test/db1/employee.c | 35 + test/db1/employee.h | 11 + test/db1/employee.lcl | 53 + test/db1/employee.lcs | 205 + test/db1/employee.lh | 30 + test/db1/empset.c | 157 + test/db1/empset.h | 36 + test/db1/empset.lcl | 86 + test/db1/empset.lcs | 251 + test/db1/empset.lh | 21 + test/db1/erc.c | 161 + test/db1/erc.h | 30 + test/db1/erc.lcl | 97 + test/db1/erc.lcs | 279 + test/db1/erc.lh | 21 + test/db1/eref.c | 87 + test/db1/eref.h | 28 + test/db1/eref.lcl | 44 + test/db1/eref.lcs | 233 + test/db1/eref.lh | 12 + test/db1/ereftab.c | 49 + test/db1/ereftab.h | 13 + test/db1/ereftab.lcl | 31 + test/db1/ereftab.lcs | 283 + test/db1/ereftab.lh | 12 + test/db2.expect | 169 + test/db2.out | 169 + test/db2/Makefile | 74 + test/db2/bool.h | 38 + test/db2/dbase.c | 269 + test/db2/dbase.h | 9 + test/db2/dbase.lcl | 96 + test/db2/dbase.lcs | 1048 ++ test/db2/dbase.lh | 30 + test/db2/drive.c | 164 + test/db2/employee.c | 35 + test/db2/employee.h | 11 + test/db2/employee.lcl | 54 + test/db2/employee.lcs | 518 + test/db2/employee.lh | 30 + test/db2/empset.c | 149 + test/db2/empset.h | 40 + test/db2/empset.lcl | 90 + test/db2/empset.lcs | 564 + test/db2/empset.lh | 21 + test/db2/erc.c | 143 + test/db2/erc.h | 26 + test/db2/erc.lcl | 72 + test/db2/erc.lcs | 582 + test/db2/erc.lh | 17 + test/db2/eref.c | 85 + test/db2/eref.h | 28 + test/db2/eref.lcl | 44 + test/db2/eref.lcs | 546 + test/db2/eref.lh | 12 + test/db2/ereftab.c | 46 + test/db2/ereftab.h | 16 + test/db2/ereftab.lcl | 36 + test/db2/ereftab.lcs | 776 + test/db2/ereftab.lh | 12 + test/db2/etest.c | 49 + test/db2/etest.lcl | 44 + test/db3.expect | 141 + test/db3.out | 141 + test/db3/.lclintrc | 6 + test/db3/Makefile | 80 + test/db3/README | 18 + test/db3/bool.h | 40 + test/db3/bool.lcl | 9 + test/db3/bool.lcs | 393 + test/db3/bool.lh | 8 + test/db3/check.lcl | 3 + test/db3/check.lcs | 401 + test/db3/check.lh | 6 + test/db3/dbase.c | 315 + test/db3/dbase.h | 9 + test/db3/dbase.lcl | 97 + test/db3/dbase.lcs | 1048 ++ test/db3/dbase.lh | 30 + test/db3/drive.c | 191 + test/db3/employee.c | 40 + test/db3/employee.h | 14 + test/db3/employee.lcl | 54 + test/db3/employee.lcs | 518 + test/db3/employee.lh | 30 + test/db3/empset.c | 177 + test/db3/empset.h | 36 + test/db3/empset.lcl | 91 + test/db3/empset.lcs | 564 + test/db3/empset.lh | 21 + test/db3/erc.c | 166 + test/db3/erc.h | 30 + test/db3/erc.lcl | 72 + test/db3/erc.lcs | 584 + test/db3/erc.lh | 17 + test/db3/eref.c | 122 + test/db3/eref.h | 16 + test/db3/eref.lcl | 47 + test/db3/eref.lcs | 548 + test/db3/eref.lh | 13 + test/db3/ereftab.c | 51 + test/db3/ereftab.h | 14 + test/db3/ereftab.lcl | 36 + test/db3/ereftab.lcs | 778 + test/db3/ereftab.lh | 12 + test/decl.c | 8 + test/decl.expect | 27 + test/decl.out | 27 + test/decl2.c | 9 + test/decl2.h | 4 + test/decl2.lcl | 1 + test/decl2.lcs | 121 + test/empty.lcl | 0 test/enum.c | 64 + test/enum.expect | 72 + test/enum.lcl | 8 + test/enum.lcs | 227 + test/enum.out | 72 + test/exports.c | 8 + test/exports.expect | 20 + test/exports.h | 5 + test/exports.out | 20 + test/external.c | 11 + test/external.expect | 52 + test/external.out | 52 + test/fields.c | 77 + test/fields.expect | 43 + test/fields.out | 43 + test/fields2.c | 47 + test/fields3.c | 40 + test/flags.c | 18 + test/flags.expect | 42 + test/flags.out | 42 + test/funcpointer.c | 80 + test/funcpointer.expect | 32 + test/funcpointer.out | 32 + test/glob.c | 28 + test/glob.expect | 31 + test/glob.lcl | 16 + test/glob.lcs | 129 + test/glob.out | 31 + test/globals.c | 22 + test/globals.expect | 61 + test/globals.out | 61 + test/help.expect | 985 ++ test/help.out | 985 ++ test/impabstract.c | 17 + test/impabstract.expect | 26 + test/impabstract.lcl | 2 + test/impabstract.lcs | 125 + test/impabstract.out | 26 + test/init.c | 16 + test/init.expect | 38 + test/init.out | 38 + test/inparam.c | 14 + test/inparam.expect | 14 + test/inparam.out | 14 + test/internal.c | 31 + test/internal.expect | 78 + test/internal.out | 78 + test/iter.c | 34 + test/iter.expect | 52 + test/iter.h | 13 + test/iter.lcl | 5 + test/iter.lcs | 119 + test/iter.out | 52 + test/iter2.c | 32 + test/iter2.h | 15 + test/keep.c | 66 + test/keep.expect | 20 + test/keep.out | 20 + test/libs.c | 60 + test/libs.expect | 172 + test/libs.out | 172 + test/lintcomments.c | 28 + test/lintcomments.expect | 27 + test/lintcomments.out | 27 + test/list.c | 41 + test/list.expect | 11 + test/list.out | 11 + test/macros.c | 29 + test/macros.expect | 129 + test/macros.lcl | 23 + test/macros.lcs | 152 + test/macros.out | 129 + test/macrosef.c | 15 + test/macrosef.expect | 34 + test/macrosef.lcl | 3 + test/macrosef.lcs | 137 + test/macrosef.out | 34 + test/merge.c | 55 + test/merge.expect | 11 + test/merge.out | 11 + test/minc1.h | 4 + test/minc2.h | 3 + test/minc3.h | 2 + test/minc4.h | 1 + test/minc5.h | 1 + test/modclient.c | 7 + test/modifies.c | 37 + test/modifies.expect | 22 + test/modifies.h | 4 + test/modifies.out | 22 + test/modtest.c | 37 + test/modtest.expect | 59 + test/modtest.lcl | 20 + test/modtest.lcs | 174 + test/modtest.out | 59 + test/moduncon.c | 15 + test/moduncon.expect | 57 + test/moduncon.out | 57 + test/mongoincludes.c | 3 + test/mongoincludes.expect | 124 + test/mongoincludes.out | 124 + test/mut.c | 18 + test/mut.h | 3 + test/mut.lcl | 5 + test/mut.lcs | 127 + test/mut.lh | 6 + test/mut.lh.expect | 6 + test/null.expect | 176 + test/null.out | 176 + test/null1.c | 71 + test/null2.c | 43 + test/null3.c | 79 + test/null4.c | 47 + test/null5.c | 38 + test/null6.c | 85 + test/null6.lcd | 896 ++ test/null6.lcl | 1 + test/null6.lcs | 123 + test/observer.c | 51 + test/observer.expect | 54 + test/observer.lcl | 3 + test/observer.lcs | 125 + test/observer.out | 54 + test/oldstyle.c | 24 + test/oldstyle.expect | 10 + test/oldstyle.lcl | 3 + test/oldstyle.lcs | 125 + test/oldstyle.out | 10 + test/outglob.c | 54 + test/outglob.expect | 20 + test/outglob.lcl | 7 + test/outglob.lcs | 127 + test/outglob.out | 20 + test/outparam.c | 52 + test/outparam.expect | 20 + test/outparam.lcl | 7 + test/outparam.lcs | 167 + test/outparam.out | 20 + test/pivo.h | 1 + test/preds.c | 49 + test/preds.expect | 65 + test/preds.out | 65 + test/prefixes.c | 24 + test/prefixes.expect | 161 + test/prefixes.out | 161 + test/printflike.c | 18 + test/printflike.expect | 30 + test/printflike.out | 30 + test/rc.c | 4 + test/rc.expect | 33 + test/rc.out | 33 + test/rc1.lclintrc | 7 + test/rc2.lclintrc | 1 + test/rc3.lclintrc | 6 + test/refcounts.c | 75 + test/refcounts.expect | 23 + test/refcounts.out | 23 + test/release.c | 26 + test/release.expect | 6 + test/release.out | 6 + test/repexpose.c | 66 + test/repexpose.expect | 124 + test/repexpose.h | 20 + test/repexpose.lcl | 17 + test/repexpose.lcs | 172 + test/repexpose.lh | 14 + test/repexpose.lh.expect | 14 + test/repexpose.out | 124 + test/sharing.expect | 153 + test/sharing.out | 153 + test/sharing1.c | 65 + test/sharing2.c | 48 + test/sharing3.c | 61 + test/sharing4.c | 47 + test/sharing5.c | 41 + test/slovaknames.c | 44 + test/slovaknames.expect | 54 + test/slovaknames.out | 54 + test/specclauses.c | 45 + test/specclauses.expect | 84 + test/specclauses.out | 84 + test/specclauses2.c | 76 + test/specclauses3.c | 61 + test/specclauses4.c | 47 + test/specclauses5.c | 52 + test/special.c | 47 + test/special.expect | 89 + test/special.lcl | 5 + test/special.lcs | 126 + test/special.out | 89 + test/stack.c | 40 + test/stack.expect | 14 + test/stack.out | 14 + test/staticarray.c | 28 + test/staticarray.expect | 12 + test/staticarray.out | 12 + test/strings.c | 26 + test/strings.expect | 23 + test/strings.out | 23 + test/structassign.c | 46 + test/structassign.expect | 18 + test/structassign.out | 18 + test/switch.c | 73 + test/tests2.2.expect | 78 + test/tests2.2.out | 78 + test/tests2.2/arbints.c | 34 + test/tests2.2/arrayfcn.c | 6 + test/tests2.2/bool.lcl | 1 + test/tests2.2/bool.lcs | 119 + test/tests2.2/booldef.c | 1 + test/tests2.2/boolenum.c | 20 + test/tests2.2/boolops.c | 21 + test/tests2.2/break.c | 11 + test/tests2.2/bstring.c | 4 + test/tests2.2/decl.c | 8 + test/tests2.2/enumbool.c | 13 + test/tests2.2/extension.c | 2 + test/tests2.2/libraries.c | 3 + test/tests2.2/libraries.lcd | 2068 +++ test/tests2.2/mbool.h | 1 + test/tests2.2/modarray.c | 11 + test/tests2.2/nestext.c | 6 + test/tests2.2/obsolete.lcd | 938 ++ test/tests2.2/offsetof.c | 19 + test/tests2.2/oldversion.lcd | 1422 ++ test/tests2.2/posix.c | 7 + test/tests2.2/realloc.c | 6 + test/tests2.2/rex.c | 27 + test/tests2.2/sizeofarray.c | 11 + test/tests2.2/struct.c | 20 + test/tests2.2a.expect | 124 + test/tests2.2a.out | 124 + test/tests2.2a/addassign.c | 11 + test/tests2.2a/arrayparam.c | 30 + test/tests2.2a/bitops.c | 30 + test/tests2.2a/boolcomp.c | 20 + test/tests2.2a/boolenum.c | 1 + test/tests2.2a/dobb.c | 8 + test/tests2.2a/duff.c | 17 + test/tests2.2a/erik.c | 9 + test/tests2.2a/floatdouble.c | 9 + test/tests2.2a/florian.c | 5 + test/tests2.2a/fred.c | 13 + test/tests2.2a/isalpha.c | 6 + test/tests2.2a/notreached.c | 9 + test/tests2.2a/obviousloop.c | 77 + test/tests2.2a/popik.c | 35 + test/tests2.2a/sizeof.c | 4 + test/tests2.2a/toralf.c | 35 + test/tests2.3.expect | 117 + test/tests2.4.expect | 123 + test/tests2.4.out | 123 + test/tests2.4/alignof.c | 6 + test/tests2.4/bitfields.c | 4 + test/tests2.4/bug1.c | 16 + test/tests2.4/bug2.c | 20 + test/tests2.4/bug3.c | 14 + test/tests2.4/cpptest.c | 6 + test/tests2.4/driverstub.c | 8175 ++++++++++ test/tests2.4/duffs.c | 16 + test/tests2.4/emptycase.c | 9 + test/tests2.4/enumtest.c | 10 + test/tests2.4/error.c | 5 + test/tests2.4/fink.c | 13 + test/tests2.4/hexconstants.c | 6 + test/tests2.4/innercomment.c | 16 + test/tests2.4/komazi.c | 5 + test/tests2.4/longlong.c | 14 + test/tests2.4/nothing.c | 47 + test/tests2.4/offsetof.c | 14 + test/tests2.4/print.c | 9 + test/tests2.4/subdir/main.c | 1 + test/tests2.4/subdir/main.lcl | 1 + test/tests2.4/subdir/main.lcs | 121 + test/tests2.4/syslog.c | 3 + test/tests2.4/test0.c | 37 + test/tests2.4/test1.c | 37 + test/tests2.4/test2.c | 35 + test/tests2.4/ulrich.c | 17 + test/tq.h | 8 + test/tq.lcl | 5 + test/tq.lcs | 149 + test/typequals.c | 10 + test/typequals.expect | 18 + test/typequals.out | 18 + test/ud.c | 69 + test/ud.expect | 21 + test/ud.out | 21 + test/ud2.c | 24 + test/ud2.lcl | 3 + test/ud2.lcs | 153 + test/ulstypes.c | 25 + test/ulstypes.expect | 54 + test/ulstypes.out | 54 + test/union.c | 84 + test/union.expect | 25 + test/union.out | 25 + test/unreachable.c | 48 + test/unreachable.expect | 27 + test/unreachable.out | 27 + test/unused.c | 28 + test/unused.expect | 17 + test/unused.out | 17 + 964 files changed, 276582 insertions(+) create mode 100644 LICENSE create mode 100644 Makefile.in create mode 100644 README create mode 100755 configure create mode 100644 emacs/lclint-abbrevs create mode 100644 imports/assert.lcl create mode 100644 imports/assert.lcs create mode 100644 imports/ctype.lcl create mode 100644 imports/ctype.lcs create mode 100644 imports/errno.lcl create mode 100644 imports/errno.lcs create mode 100644 imports/limits.lcl create mode 100644 imports/limits.lcs create mode 100644 imports/locale.lcl create mode 100644 imports/locale.lcs create mode 100644 imports/math.lcl create mode 100644 imports/math.lcs create mode 100644 imports/setjmp.lcl create mode 100644 imports/setjmp.lcs create mode 100644 imports/signal.lcl create mode 100644 imports/signal.lcs create mode 100644 imports/stdarg.lcl create mode 100644 imports/stdarg.lcs create mode 100644 imports/stdio.lcl create mode 100644 imports/stdio.lcs create mode 100644 imports/stdlib.lcl create mode 100644 imports/stdlib.lcs create mode 100644 imports/string.lcl create mode 100644 imports/string.lcs create mode 100644 imports/strings.lcl create mode 100644 imports/strings.lcs create mode 100644 imports/time.lcl create mode 100644 imports/time.lcs create mode 100644 lib/CTrait.syms create mode 100644 lib/CTraitGen.lcl create mode 100644 lib/Makefile create mode 100644 lib/ansi.h create mode 100644 lib/ansi.lcd create mode 100644 lib/ansistrict.lcd create mode 100644 lib/bool.h create mode 100644 lib/lclinit.lci create mode 100644 lib/lslinit.lsi create mode 100644 lib/posix.h create mode 100644 lib/posix.lcd create mode 100644 lib/posixstrict.lcd create mode 100644 lib/unix.h create mode 100644 lib/unix.lcd create mode 100644 lib/unixstrict.lcd create mode 100644 src/DATE create mode 100644 src/Headers/256_random_numbers.nf create mode 100644 src/Headers/CTypesNode.h create mode 100644 src/Headers/abstBodyNode.h create mode 100644 src/Headers/abstract.h create mode 100644 src/Headers/abstractNode.h create mode 100644 src/Headers/aliasChecks.h create mode 100644 src/Headers/aliasStack.h create mode 100644 src/Headers/aliasTable.h create mode 100644 src/Headers/arrayQualNode.h create mode 100644 src/Headers/basic.h create mode 100644 src/Headers/bool.h create mode 100644 src/Headers/boolStack.h create mode 100644 src/Headers/cgrammar.h create mode 100644 src/Headers/cgrammar_tokens.h create mode 100644 src/Headers/checking.h create mode 100644 src/Headers/clabstract.h create mode 100644 src/Headers/claimNode.h create mode 100644 src/Headers/clause.h create mode 100644 src/Headers/clauseStack.h create mode 100644 src/Headers/code.h create mode 100644 src/Headers/constDeclarationNode.h create mode 100644 src/Headers/constants.h create mode 100644 src/Headers/context.h create mode 100644 src/Headers/cpp.h create mode 100644 src/Headers/cpperror.h create mode 100644 src/Headers/cppexp.h create mode 100644 src/Headers/cpphash.h create mode 100644 src/Headers/cpplib.h create mode 100644 src/Headers/cprim.h create mode 100644 src/Headers/cstring.h create mode 100644 src/Headers/cstringList.h create mode 100644 src/Headers/cstringSList.h create mode 100644 src/Headers/ctokens.h create mode 100644 src/Headers/ctypeList.h create mode 100644 src/Headers/cvar.h create mode 100644 src/Headers/declaratorInvNode.h create mode 100644 src/Headers/declaratorInvNodeList.h create mode 100644 src/Headers/declaratorNode.h create mode 100644 src/Headers/declaratorNodeList.h create mode 100644 src/Headers/dmalloc.h create mode 100644 src/Headers/ekind.h create mode 100644 src/Headers/enumNameList.h create mode 100644 src/Headers/enumNameSList.h create mode 100644 src/Headers/enumSpecNode.h create mode 100644 src/Headers/exportNode.h create mode 100644 src/Headers/exposedNode.h create mode 100644 src/Headers/exprChecks.h create mode 100644 src/Headers/exprNode.h create mode 100644 src/Headers/exprNodeList.h create mode 100644 src/Headers/exprNodeSList.h create mode 100644 src/Headers/fcnNode.h create mode 100644 src/Headers/fcnNodeList.h create mode 100644 src/Headers/fileId.h create mode 100644 src/Headers/fileIdList.h create mode 100644 src/Headers/fileTable.h create mode 100644 src/Headers/fileloc.h create mode 100644 src/Headers/filelocList.h create mode 100644 src/Headers/filelocStack.h create mode 100644 src/Headers/flagMarker.h create mode 100644 src/Headers/flagMarkerList.h create mode 100644 src/Headers/flag_codes.gen create mode 100644 src/Headers/flag_codes.h create mode 100644 src/Headers/flags.h create mode 100644 src/Headers/forwardTypes.h create mode 100644 src/Headers/general.h create mode 100644 src/Headers/globSet.h create mode 100644 src/Headers/globalList.h create mode 100644 src/Headers/globals.h create mode 100644 src/Headers/gram.h create mode 100644 src/Headers/guardSet.h create mode 100644 src/Headers/handle.h create mode 100644 src/Headers/hashTable.h create mode 100644 src/Headers/herald.h create mode 100644 src/Headers/herald.last create mode 100644 src/Headers/idDecl.h create mode 100644 src/Headers/idDeclList.h create mode 100644 src/Headers/importNode.h create mode 100644 src/Headers/importNodeList.h create mode 100644 src/Headers/imports.h create mode 100644 src/Headers/initDeclNode.h create mode 100644 src/Headers/initDeclNodeList.h create mode 100644 src/Headers/intSet.h create mode 100644 src/Headers/interfaceNode.h create mode 100644 src/Headers/interfaceNodeList.h create mode 100644 src/Headers/iterNode.h create mode 100644 src/Headers/lclForwardTypes.h create mode 100644 src/Headers/lclMisc.h create mode 100644 src/Headers/lclPredicateNode.h create mode 100644 src/Headers/lclTypeSpecNode.h create mode 100644 src/Headers/lcl_constants.h create mode 100644 src/Headers/lclctypes.h create mode 100644 src/Headers/lclinit.h create mode 100644 src/Headers/lclintMacros.nf create mode 100644 src/Headers/lcllib.h create mode 100644 src/Headers/lclscan.h create mode 100644 src/Headers/lclscanline.h create mode 100644 src/Headers/lclsyntable.h create mode 100644 src/Headers/lcltokentable.h create mode 100644 src/Headers/lctype.h create mode 100644 src/Headers/letDeclNode.h create mode 100644 src/Headers/letDeclNodeList.h create mode 100644 src/Headers/lh.h create mode 100644 src/Headers/limwr.h create mode 100644 src/Headers/llbasic.h create mode 100644 src/Headers/llerror.h create mode 100644 src/Headers/llglobals.h create mode 100644 src/Headers/llgrammar.h create mode 100644 src/Headers/llgrammar2.h create mode 100644 src/Headers/llgrammar_gen.h create mode 100644 src/Headers/llgrammar_gen2.h create mode 100644 src/Headers/llmain.h create mode 100644 src/Headers/lltok.h create mode 100644 src/Headers/local_constants-os2.h create mode 100644 src/Headers/local_constants.h create mode 100644 src/Headers/local_constants.last create mode 100644 src/Headers/lslOp.h create mode 100644 src/Headers/lslOpList.h create mode 100644 src/Headers/lslOpSet.h create mode 100644 src/Headers/lslinit.h create mode 100644 src/Headers/lslparse.h create mode 100644 src/Headers/lsymbol.h create mode 100644 src/Headers/lsymbolList.h create mode 100644 src/Headers/lsymbolSet.h create mode 100644 src/Headers/ltoken.h create mode 100644 src/Headers/ltokenList.h create mode 100644 src/Headers/macrocache.h create mode 100644 src/Headers/mapping.h create mode 100644 src/Headers/message.h create mode 100644 src/Headers/messageLog.h create mode 100644 src/Headers/misc.h create mode 100644 src/Headers/modifyNode.h create mode 100644 src/Headers/multiVal.h create mode 100644 src/Headers/nameChecks.h create mode 100644 src/Headers/nameNode.h create mode 100644 src/Headers/opFormNode.h create mode 100644 src/Headers/osd.h create mode 100644 src/Headers/pairNode.h create mode 100644 src/Headers/pairNodeList.h create mode 100644 src/Headers/paramNode.h create mode 100644 src/Headers/paramNodeList.h create mode 100644 src/Headers/portab.h create mode 100644 src/Headers/pp.h create mode 100644 src/Headers/privateNode.h create mode 100644 src/Headers/programNode.h create mode 100644 src/Headers/programNodeList.h create mode 100644 src/Headers/qtype.h create mode 100644 src/Headers/qual.h create mode 100644 src/Headers/qualList.h create mode 100644 src/Headers/quantifiedTermNode.h create mode 100644 src/Headers/quantifierNode.h create mode 100644 src/Headers/quantifierNodeList.h create mode 100644 src/Headers/renamingNode.h create mode 100644 src/Headers/replaceNode.h create mode 100644 src/Headers/replaceNodeList.h create mode 100644 src/Headers/reservedNames.nf create mode 100644 src/Headers/sHerald.h create mode 100644 src/Headers/sRef.h create mode 100644 src/Headers/sRefSet.h create mode 100644 src/Headers/sRefSetList.h create mode 100644 src/Headers/sRefSetStack.h create mode 100644 src/Headers/sRefTable.h create mode 100644 src/Headers/scan.h create mode 100644 src/Headers/scanline.h create mode 100644 src/Headers/sgrammar.h create mode 100644 src/Headers/sgrammar_tokens.h create mode 100644 src/Headers/shift.h create mode 100644 src/Headers/sigNode.h create mode 100644 src/Headers/sigNodeSet.h create mode 100644 src/Headers/signNode.h create mode 100644 src/Headers/signature.h create mode 100644 src/Headers/signature2.h create mode 100644 src/Headers/signature_gen.h create mode 100644 src/Headers/sort.h create mode 100644 src/Headers/sortList.h create mode 100644 src/Headers/sortSet.h create mode 100644 src/Headers/sortSetList.h create mode 100644 src/Headers/source.h create mode 100644 src/Headers/specialClauses.h create mode 100644 src/Headers/stDeclNode.h create mode 100644 src/Headers/stDeclNodeList.h create mode 100644 src/Headers/stmtNode.h create mode 100644 src/Headers/storeRefNode.h create mode 100644 src/Headers/storeRefNodeList.h create mode 100644 src/Headers/strOrUnionNode.h create mode 100644 src/Headers/structNames.h create mode 100644 src/Headers/symtable.h create mode 100644 src/Headers/syntable.h create mode 100644 src/Headers/system_constants.h create mode 100644 src/Headers/taggedUnionNode.h create mode 100644 src/Headers/termNode.h create mode 100644 src/Headers/termNodeList.h create mode 100644 src/Headers/tmpname.h create mode 100644 src/Headers/tokentable.h create mode 100644 src/Headers/traitRefNode.h create mode 100644 src/Headers/traitRefNodeList.h create mode 100644 src/Headers/typeExpr.h create mode 100644 src/Headers/typeIdSet.h create mode 100644 src/Headers/typeNameNode.h create mode 100644 src/Headers/typeNameNodeList.h create mode 100644 src/Headers/typeNamePack.h create mode 100644 src/Headers/typeNode.h create mode 100644 src/Headers/uentry.h create mode 100644 src/Headers/uentryList.h create mode 100644 src/Headers/usymId.h create mode 100644 src/Headers/usymIdSet.h create mode 100644 src/Headers/usymtab.h create mode 100644 src/Headers/usymtab_interface.h create mode 100644 src/Headers/varDeclarationNode.h create mode 100644 src/Headers/varDeclarationNodeList.h create mode 100644 src/Headers/varKinds.h create mode 100644 src/Headers/varNode.h create mode 100644 src/Headers/varNodeList.h create mode 100644 src/Headers/version.h create mode 100644 src/Headers/ynm.h create mode 100644 src/LICENSE create mode 100644 src/Makefile create mode 100644 src/Makefile.depend.real create mode 100644 src/Makefile.mine create mode 100644 src/Makefile.nodepend create mode 100644 src/Makefile.os2 create mode 100644 src/Makefile.sources create mode 100644 src/Makefile.sys create mode 100644 src/Makefile.sys-mine create mode 100644 src/abstract.c create mode 100644 src/aliasChecks.c create mode 100644 src/aliasTable.c create mode 100644 src/bison.head create mode 100644 src/bison.reset create mode 100644 src/cgrammar.c.der create mode 100644 src/cgrammar.mod create mode 100644 src/cgrammar.tab.c create mode 100644 src/cgrammar.tab.h create mode 100644 src/cgrammar.y create mode 100644 src/checking.c create mode 100644 src/clabstract.c create mode 100644 src/clause.c create mode 100644 src/clauseStack.c create mode 100644 src/configure.scan create mode 100644 src/context.c create mode 100644 src/cpperror.c create mode 100644 src/cppexp.c create mode 100644 src/cpphash.c create mode 100644 src/cpplib.c create mode 100644 src/cppmain.c create mode 100644 src/cprim.c create mode 100644 src/cscanner.c.der create mode 100644 src/cscanner.l create mode 100644 src/cstring.c create mode 100644 src/cstringList.c create mode 100644 src/cstringSList.c create mode 100644 src/ctbase.i create mode 100644 src/cttable.i create mode 100644 src/ctype.c create mode 100644 src/ctypeList.c create mode 100644 src/cvar.c create mode 100644 src/declaratorInvNodeList.c create mode 100644 src/declaratorNodeList.c create mode 100644 src/dummy.c create mode 100644 src/ekind.c create mode 100644 src/enumNameList.c create mode 100644 src/enumNameSList.c create mode 100644 src/exprChecks.c create mode 100644 src/exprData.i create mode 100644 src/exprNode.c create mode 100644 src/exprNodeList.c create mode 100644 src/exprNodeSList.c create mode 100644 src/fcnNodeList.c create mode 100644 src/fileIdList.c create mode 100644 src/fileTable.c create mode 100644 src/fileloc.c create mode 100644 src/filelocList.c create mode 100644 src/filelocStack.c create mode 100644 src/flagMarker.c create mode 100644 src/flagMarkerList.c create mode 100644 src/flags.c create mode 100644 src/flags.def create mode 100644 src/flex.head create mode 100644 src/flex.reset create mode 100644 src/general.c create mode 100644 src/globSet.c create mode 100644 src/globals.c create mode 100644 src/guardSet.c create mode 100644 src/hashTable.c create mode 100644 src/idDecl.c create mode 100644 src/idDeclList.c create mode 100644 src/importNodeList.c create mode 100644 src/imports.c create mode 100644 src/initDeclNodeList.c create mode 100644 src/intSet.c create mode 100644 src/interfaceNodeList.c create mode 100644 src/lastversion create mode 100644 src/lclctypes.c create mode 100644 src/lclinit.c create mode 100644 src/lclint.lcd create mode 100644 src/lclint.lclintrc create mode 100644 src/lcllib.c create mode 100644 src/lclscan.c create mode 100644 src/lclscanline.c create mode 100644 src/lclsyntable.c create mode 100644 src/lcltokentable.c create mode 100644 src/letDeclNodeList.c create mode 100644 src/lex.yy.c create mode 100644 src/lh.c create mode 100644 src/llerror.c create mode 100644 src/llgrammar.c create mode 100644 src/llgrammar.c.der create mode 100644 src/llgrammar.tab.c create mode 100644 src/llgrammar.tab.h create mode 100644 src/llgrammar.y create mode 100644 src/llmain.c create mode 100644 src/lltok.c create mode 100644 src/lslOpList.c create mode 100644 src/lslOpSet.c create mode 100644 src/lslinit.c create mode 100644 src/lslparse.c create mode 100644 src/lsymbol.c create mode 100644 src/lsymbolList.c create mode 100644 src/lsymbolSet.c create mode 100644 src/ltoken.c create mode 100644 src/ltokenList.c create mode 100644 src/macrocache.c create mode 100644 src/mapping.c create mode 100644 src/message.c create mode 100644 src/messageLog.c create mode 100644 src/multiVal.c create mode 100644 src/nameChecks.c create mode 100644 src/osd.c create mode 100644 src/pairNodeList.c create mode 100644 src/paramNodeList.c create mode 100644 src/programNodeList.c create mode 100644 src/qtype.c create mode 100644 src/qual.c create mode 100644 src/qualList.c create mode 100644 src/quantifierNodeList.c create mode 100644 src/replaceNodeList.c create mode 100644 src/sRef.c create mode 100644 src/sRefSet.c create mode 100644 src/sRefSetList.c create mode 100644 src/sRefTable.c create mode 100644 src/scan.c create mode 100644 src/scanline.c create mode 100644 src/shift.c create mode 100644 src/sigNodeSet.c create mode 100644 src/signature.c create mode 100644 src/signature.c.der create mode 100644 src/signature.tab.c create mode 100644 src/signature.tab.h create mode 100644 src/signature.y create mode 100644 src/sort.c create mode 100644 src/sortList.c create mode 100644 src/sortSet.c create mode 100644 src/sortSetList.c create mode 100644 src/source.c create mode 100644 src/specialClauses.c create mode 100644 src/stDeclNodeList.c create mode 100644 src/storeRefNodeList.c create mode 100644 src/structNames.c create mode 100644 src/symtable.c create mode 100644 src/syntable.c create mode 100644 src/termNodeList.c create mode 100644 src/tokentable.c create mode 100644 src/traitRefNodeList.c create mode 100644 src/typeIdSet.c create mode 100644 src/typeNameNodeList.c create mode 100644 src/uentry.c create mode 100644 src/uentryList.c create mode 100644 src/usymIdSet.c create mode 100644 src/usymtab.c create mode 100644 src/usymtab_interface.c create mode 100644 src/varDeclarationNodeList.c create mode 100644 src/varKinds.c create mode 100644 src/varNodeList.c create mode 100644 src/ynm.c create mode 100644 test/Makefile create mode 100644 test/abst_t.lcl create mode 100644 test/abst_t.lcs create mode 100644 test/abstptr.c create mode 100644 test/abstptr.expect create mode 100644 test/abstptr.lcl create mode 100644 test/abstptr.lcs create mode 100644 test/abstptr.out create mode 100644 test/abstract.expect create mode 100644 test/abstract.out create mode 100644 test/alias.c create mode 100644 test/alias.expect create mode 100644 test/alias.lcl create mode 100644 test/alias.lcs create mode 100644 test/alias.out create mode 100644 test/alias2.c create mode 100644 test/alias2.lcl create mode 100644 test/alias2.lcs create mode 100644 test/alias3.c create mode 100644 test/alias3.lcl create mode 100644 test/alias3.lcs create mode 100644 test/alias3.lh create mode 100644 test/alias4.c create mode 100644 test/alias4.lcl create mode 100644 test/alias4.lcs create mode 100644 test/alias4.lh create mode 100644 test/alias5.c create mode 100644 test/alias5.lcl create mode 100644 test/alias5.lcs create mode 100644 test/alias5.lh create mode 100644 test/alttypes.c create mode 100644 test/alttypes.expect create mode 100644 test/alttypes.out create mode 100644 test/ansireserved.c create mode 100644 test/ansireserved.expect create mode 100644 test/ansireserved.out create mode 100644 test/argorder.c create mode 100644 test/argorder.expect create mode 100644 test/argorder.out create mode 100644 test/argorder2.c create mode 100644 test/argorder2.lcl create mode 100644 test/argorder2.lcs create mode 100644 test/argorder3.c create mode 100644 test/argorder4.c create mode 100644 test/argorder4.lcl create mode 100644 test/argorder4.lcs create mode 100644 test/argorder5.c create mode 100644 test/args.c create mode 100644 test/args.expect create mode 100644 test/args.lcl create mode 100644 test/args.lcs create mode 100644 test/args.out create mode 100644 test/blocks.c create mode 100644 test/blocks.expect create mode 100644 test/blocks.out create mode 100644 test/bool.h create mode 100644 test/break.c create mode 100644 test/break.expect create mode 100644 test/break.out create mode 100644 test/cases.c create mode 100644 test/cases.expect create mode 100644 test/cases.out create mode 100644 test/cases2.c create mode 100644 test/cast.c create mode 100644 test/cast.expect create mode 100644 test/cast.lcl create mode 100644 test/cast.lcs create mode 100644 test/cast.out create mode 100644 test/cast2.c create mode 100644 test/charlit.c create mode 100644 test/charlit.expect create mode 100644 test/charlit.out create mode 100644 test/clauses.c create mode 100644 test/clauses.expect create mode 100644 test/clauses.out create mode 100644 test/clauses2.c create mode 100644 test/clauses3.c create mode 100644 test/commentchar.c create mode 100644 test/commentchar.expect create mode 100644 test/commentchar.out create mode 100644 test/commentcmd.c create mode 100644 test/compdestroy.c create mode 100644 test/compdestroy.expect create mode 100644 test/compdestroy.out create mode 100644 test/controldepth.c create mode 100644 test/controldepth.expect create mode 100644 test/controldepth.out create mode 100644 test/csyntax.c create mode 100644 test/csyntax.expect create mode 100644 test/csyntax.out create mode 100644 test/csyntax10.c create mode 100644 test/csyntax11.c create mode 100644 test/csyntax12.c create mode 100644 test/csyntax13.c create mode 100644 test/csyntax14.c create mode 100644 test/csyntax15.c create mode 100644 test/csyntax16.c create mode 100644 test/csyntax17.c create mode 100644 test/csyntax2.c create mode 100644 test/csyntax3.c create mode 100644 test/csyntax4.c create mode 100644 test/csyntax5.c create mode 100644 test/csyntax6.c create mode 100644 test/csyntax7.c create mode 100644 test/csyntax8.c create mode 100644 test/csyntax9.c create mode 100644 test/czechnames.c create mode 100644 test/czechnames.expect create mode 100644 test/czechnames.out create mode 100644 test/czechoslovaknames.c create mode 100644 test/czechoslovaknames.expect create mode 100644 test/czechoslovaknames.out create mode 100644 test/db1.expect create mode 100644 test/db1.out create mode 100644 test/db1/Makefile create mode 100644 test/db1/README create mode 100644 test/db1/bool.h create mode 100644 test/db1/bool.lcl create mode 100644 test/db1/bool.lcs create mode 100644 test/db1/bool.lh create mode 100644 test/db1/dbase.c create mode 100644 test/db1/dbase.h create mode 100644 test/db1/dbase.lcl create mode 100644 test/db1/dbase.lcs create mode 100644 test/db1/dbase.lh create mode 100644 test/db1/drive.c create mode 100644 test/db1/employee.c create mode 100644 test/db1/employee.h create mode 100644 test/db1/employee.lcl create mode 100644 test/db1/employee.lcs create mode 100644 test/db1/employee.lh create mode 100644 test/db1/empset.c create mode 100644 test/db1/empset.h create mode 100644 test/db1/empset.lcl create mode 100644 test/db1/empset.lcs create mode 100644 test/db1/empset.lh create mode 100644 test/db1/erc.c create mode 100644 test/db1/erc.h create mode 100644 test/db1/erc.lcl create mode 100644 test/db1/erc.lcs create mode 100644 test/db1/erc.lh create mode 100644 test/db1/eref.c create mode 100644 test/db1/eref.h create mode 100644 test/db1/eref.lcl create mode 100644 test/db1/eref.lcs create mode 100644 test/db1/eref.lh create mode 100644 test/db1/ereftab.c create mode 100644 test/db1/ereftab.h create mode 100644 test/db1/ereftab.lcl create mode 100644 test/db1/ereftab.lcs create mode 100644 test/db1/ereftab.lh create mode 100644 test/db2.expect create mode 100644 test/db2.out create mode 100644 test/db2/Makefile create mode 100644 test/db2/bool.h create mode 100644 test/db2/dbase.c create mode 100644 test/db2/dbase.h create mode 100644 test/db2/dbase.lcl create mode 100644 test/db2/dbase.lcs create mode 100644 test/db2/dbase.lh create mode 100644 test/db2/drive.c create mode 100644 test/db2/employee.c create mode 100644 test/db2/employee.h create mode 100644 test/db2/employee.lcl create mode 100644 test/db2/employee.lcs create mode 100644 test/db2/employee.lh create mode 100644 test/db2/empset.c create mode 100644 test/db2/empset.h create mode 100644 test/db2/empset.lcl create mode 100644 test/db2/empset.lcs create mode 100644 test/db2/empset.lh create mode 100644 test/db2/erc.c create mode 100644 test/db2/erc.h create mode 100644 test/db2/erc.lcl create mode 100644 test/db2/erc.lcs create mode 100644 test/db2/erc.lh create mode 100644 test/db2/eref.c create mode 100644 test/db2/eref.h create mode 100644 test/db2/eref.lcl create mode 100644 test/db2/eref.lcs create mode 100644 test/db2/eref.lh create mode 100644 test/db2/ereftab.c create mode 100644 test/db2/ereftab.h create mode 100644 test/db2/ereftab.lcl create mode 100644 test/db2/ereftab.lcs create mode 100644 test/db2/ereftab.lh create mode 100644 test/db2/etest.c create mode 100644 test/db2/etest.lcl create mode 100644 test/db3.expect create mode 100644 test/db3.out create mode 100644 test/db3/.lclintrc create mode 100644 test/db3/Makefile create mode 100644 test/db3/README create mode 100644 test/db3/bool.h create mode 100644 test/db3/bool.lcl create mode 100644 test/db3/bool.lcs create mode 100644 test/db3/bool.lh create mode 100644 test/db3/check.lcl create mode 100644 test/db3/check.lcs create mode 100644 test/db3/check.lh create mode 100644 test/db3/dbase.c create mode 100644 test/db3/dbase.h create mode 100644 test/db3/dbase.lcl create mode 100644 test/db3/dbase.lcs create mode 100644 test/db3/dbase.lh create mode 100644 test/db3/drive.c create mode 100644 test/db3/employee.c create mode 100644 test/db3/employee.h create mode 100644 test/db3/employee.lcl create mode 100644 test/db3/employee.lcs create mode 100644 test/db3/employee.lh create mode 100644 test/db3/empset.c create mode 100644 test/db3/empset.h create mode 100644 test/db3/empset.lcl create mode 100644 test/db3/empset.lcs create mode 100644 test/db3/empset.lh create mode 100644 test/db3/erc.c create mode 100644 test/db3/erc.h create mode 100644 test/db3/erc.lcl create mode 100644 test/db3/erc.lcs create mode 100644 test/db3/erc.lh create mode 100644 test/db3/eref.c create mode 100644 test/db3/eref.h create mode 100644 test/db3/eref.lcl create mode 100644 test/db3/eref.lcs create mode 100644 test/db3/eref.lh create mode 100644 test/db3/ereftab.c create mode 100644 test/db3/ereftab.h create mode 100644 test/db3/ereftab.lcl create mode 100644 test/db3/ereftab.lcs create mode 100644 test/db3/ereftab.lh create mode 100644 test/decl.c create mode 100644 test/decl.expect create mode 100644 test/decl.out create mode 100644 test/decl2.c create mode 100644 test/decl2.h create mode 100644 test/decl2.lcl create mode 100644 test/decl2.lcs create mode 100644 test/empty.lcl create mode 100644 test/enum.c create mode 100644 test/enum.expect create mode 100644 test/enum.lcl create mode 100644 test/enum.lcs create mode 100644 test/enum.out create mode 100644 test/exports.c create mode 100644 test/exports.expect create mode 100644 test/exports.h create mode 100644 test/exports.out create mode 100644 test/external.c create mode 100644 test/external.expect create mode 100644 test/external.out create mode 100644 test/fields.c create mode 100644 test/fields.expect create mode 100644 test/fields.out create mode 100644 test/fields2.c create mode 100644 test/fields3.c create mode 100644 test/flags.c create mode 100644 test/flags.expect create mode 100644 test/flags.out create mode 100644 test/funcpointer.c create mode 100644 test/funcpointer.expect create mode 100644 test/funcpointer.out create mode 100644 test/glob.c create mode 100644 test/glob.expect create mode 100644 test/glob.lcl create mode 100644 test/glob.lcs create mode 100644 test/glob.out create mode 100644 test/globals.c create mode 100644 test/globals.expect create mode 100644 test/globals.out create mode 100644 test/help.expect create mode 100644 test/help.out create mode 100644 test/impabstract.c create mode 100644 test/impabstract.expect create mode 100644 test/impabstract.lcl create mode 100644 test/impabstract.lcs create mode 100644 test/impabstract.out create mode 100644 test/init.c create mode 100644 test/init.expect create mode 100644 test/init.out create mode 100644 test/inparam.c create mode 100644 test/inparam.expect create mode 100644 test/inparam.out create mode 100644 test/internal.c create mode 100644 test/internal.expect create mode 100644 test/internal.out create mode 100644 test/iter.c create mode 100644 test/iter.expect create mode 100644 test/iter.h create mode 100644 test/iter.lcl create mode 100644 test/iter.lcs create mode 100644 test/iter.out create mode 100644 test/iter2.c create mode 100644 test/iter2.h create mode 100644 test/keep.c create mode 100644 test/keep.expect create mode 100644 test/keep.out create mode 100644 test/libs.c create mode 100644 test/libs.expect create mode 100644 test/libs.out create mode 100644 test/lintcomments.c create mode 100644 test/lintcomments.expect create mode 100644 test/lintcomments.out create mode 100644 test/list.c create mode 100644 test/list.expect create mode 100644 test/list.out create mode 100644 test/macros.c create mode 100644 test/macros.expect create mode 100644 test/macros.lcl create mode 100644 test/macros.lcs create mode 100644 test/macros.out create mode 100644 test/macrosef.c create mode 100644 test/macrosef.expect create mode 100644 test/macrosef.lcl create mode 100644 test/macrosef.lcs create mode 100644 test/macrosef.out create mode 100644 test/merge.c create mode 100644 test/merge.expect create mode 100644 test/merge.out create mode 100644 test/minc1.h create mode 100644 test/minc2.h create mode 100644 test/minc3.h create mode 100644 test/minc4.h create mode 100644 test/minc5.h create mode 100644 test/modclient.c create mode 100644 test/modifies.c create mode 100644 test/modifies.expect create mode 100644 test/modifies.h create mode 100644 test/modifies.out create mode 100644 test/modtest.c create mode 100644 test/modtest.expect create mode 100644 test/modtest.lcl create mode 100644 test/modtest.lcs create mode 100644 test/modtest.out create mode 100644 test/moduncon.c create mode 100644 test/moduncon.expect create mode 100644 test/moduncon.out create mode 100644 test/mongoincludes.c create mode 100644 test/mongoincludes.expect create mode 100644 test/mongoincludes.out create mode 100644 test/mut.c create mode 100644 test/mut.h create mode 100644 test/mut.lcl create mode 100644 test/mut.lcs create mode 100644 test/mut.lh create mode 100644 test/mut.lh.expect create mode 100644 test/null.expect create mode 100644 test/null.out create mode 100644 test/null1.c create mode 100644 test/null2.c create mode 100644 test/null3.c create mode 100644 test/null4.c create mode 100644 test/null5.c create mode 100644 test/null6.c create mode 100644 test/null6.lcd create mode 100644 test/null6.lcl create mode 100644 test/null6.lcs create mode 100644 test/observer.c create mode 100644 test/observer.expect create mode 100644 test/observer.lcl create mode 100644 test/observer.lcs create mode 100644 test/observer.out create mode 100644 test/oldstyle.c create mode 100644 test/oldstyle.expect create mode 100644 test/oldstyle.lcl create mode 100644 test/oldstyle.lcs create mode 100644 test/oldstyle.out create mode 100644 test/outglob.c create mode 100644 test/outglob.expect create mode 100644 test/outglob.lcl create mode 100644 test/outglob.lcs create mode 100644 test/outglob.out create mode 100644 test/outparam.c create mode 100644 test/outparam.expect create mode 100644 test/outparam.lcl create mode 100644 test/outparam.lcs create mode 100644 test/outparam.out create mode 100644 test/pivo.h create mode 100644 test/preds.c create mode 100644 test/preds.expect create mode 100644 test/preds.out create mode 100644 test/prefixes.c create mode 100644 test/prefixes.expect create mode 100644 test/prefixes.out create mode 100644 test/printflike.c create mode 100644 test/printflike.expect create mode 100644 test/printflike.out create mode 100644 test/rc.c create mode 100644 test/rc.expect create mode 100644 test/rc.out create mode 100644 test/rc1.lclintrc create mode 100644 test/rc2.lclintrc create mode 100644 test/rc3.lclintrc create mode 100644 test/refcounts.c create mode 100644 test/refcounts.expect create mode 100644 test/refcounts.out create mode 100644 test/release.c create mode 100644 test/release.expect create mode 100644 test/release.out create mode 100644 test/repexpose.c create mode 100644 test/repexpose.expect create mode 100644 test/repexpose.h create mode 100644 test/repexpose.lcl create mode 100644 test/repexpose.lcs create mode 100644 test/repexpose.lh create mode 100644 test/repexpose.lh.expect create mode 100644 test/repexpose.out create mode 100644 test/sharing.expect create mode 100644 test/sharing.out create mode 100644 test/sharing1.c create mode 100644 test/sharing2.c create mode 100644 test/sharing3.c create mode 100644 test/sharing4.c create mode 100644 test/sharing5.c create mode 100644 test/slovaknames.c create mode 100644 test/slovaknames.expect create mode 100644 test/slovaknames.out create mode 100644 test/specclauses.c create mode 100644 test/specclauses.expect create mode 100644 test/specclauses.out create mode 100644 test/specclauses2.c create mode 100644 test/specclauses3.c create mode 100644 test/specclauses4.c create mode 100644 test/specclauses5.c create mode 100644 test/special.c create mode 100644 test/special.expect create mode 100644 test/special.lcl create mode 100644 test/special.lcs create mode 100644 test/special.out create mode 100644 test/stack.c create mode 100644 test/stack.expect create mode 100644 test/stack.out create mode 100644 test/staticarray.c create mode 100644 test/staticarray.expect create mode 100644 test/staticarray.out create mode 100644 test/strings.c create mode 100644 test/strings.expect create mode 100644 test/strings.out create mode 100644 test/structassign.c create mode 100644 test/structassign.expect create mode 100644 test/structassign.out create mode 100644 test/switch.c create mode 100644 test/tests2.2.expect create mode 100644 test/tests2.2.out create mode 100644 test/tests2.2/arbints.c create mode 100644 test/tests2.2/arrayfcn.c create mode 100644 test/tests2.2/bool.lcl create mode 100644 test/tests2.2/bool.lcs create mode 100644 test/tests2.2/booldef.c create mode 100644 test/tests2.2/boolenum.c create mode 100644 test/tests2.2/boolops.c create mode 100644 test/tests2.2/break.c create mode 100644 test/tests2.2/bstring.c create mode 100644 test/tests2.2/decl.c create mode 100644 test/tests2.2/enumbool.c create mode 100644 test/tests2.2/extension.c create mode 100644 test/tests2.2/libraries.c create mode 100644 test/tests2.2/libraries.lcd create mode 100644 test/tests2.2/mbool.h create mode 100644 test/tests2.2/modarray.c create mode 100644 test/tests2.2/nestext.c create mode 100644 test/tests2.2/obsolete.lcd create mode 100644 test/tests2.2/offsetof.c create mode 100644 test/tests2.2/oldversion.lcd create mode 100644 test/tests2.2/posix.c create mode 100644 test/tests2.2/realloc.c create mode 100644 test/tests2.2/rex.c create mode 100644 test/tests2.2/sizeofarray.c create mode 100644 test/tests2.2/struct.c create mode 100644 test/tests2.2a.expect create mode 100644 test/tests2.2a.out create mode 100644 test/tests2.2a/addassign.c create mode 100644 test/tests2.2a/arrayparam.c create mode 100644 test/tests2.2a/bitops.c create mode 100644 test/tests2.2a/boolcomp.c create mode 100644 test/tests2.2a/boolenum.c create mode 100644 test/tests2.2a/dobb.c create mode 100644 test/tests2.2a/duff.c create mode 100644 test/tests2.2a/erik.c create mode 100644 test/tests2.2a/floatdouble.c create mode 100644 test/tests2.2a/florian.c create mode 100644 test/tests2.2a/fred.c create mode 100644 test/tests2.2a/isalpha.c create mode 100644 test/tests2.2a/notreached.c create mode 100644 test/tests2.2a/obviousloop.c create mode 100644 test/tests2.2a/popik.c create mode 100644 test/tests2.2a/sizeof.c create mode 100644 test/tests2.2a/toralf.c create mode 100644 test/tests2.3.expect create mode 100644 test/tests2.4.expect create mode 100644 test/tests2.4.out create mode 100644 test/tests2.4/alignof.c create mode 100644 test/tests2.4/bitfields.c create mode 100644 test/tests2.4/bug1.c create mode 100644 test/tests2.4/bug2.c create mode 100644 test/tests2.4/bug3.c create mode 100644 test/tests2.4/cpptest.c create mode 100644 test/tests2.4/driverstub.c create mode 100644 test/tests2.4/duffs.c create mode 100644 test/tests2.4/emptycase.c create mode 100644 test/tests2.4/enumtest.c create mode 100644 test/tests2.4/error.c create mode 100644 test/tests2.4/fink.c create mode 100644 test/tests2.4/hexconstants.c create mode 100644 test/tests2.4/innercomment.c create mode 100644 test/tests2.4/komazi.c create mode 100644 test/tests2.4/longlong.c create mode 100644 test/tests2.4/nothing.c create mode 100644 test/tests2.4/offsetof.c create mode 100644 test/tests2.4/print.c create mode 100644 test/tests2.4/subdir/main.c create mode 100644 test/tests2.4/subdir/main.lcl create mode 100644 test/tests2.4/subdir/main.lcs create mode 100644 test/tests2.4/syslog.c create mode 100644 test/tests2.4/test0.c create mode 100644 test/tests2.4/test1.c create mode 100644 test/tests2.4/test2.c create mode 100644 test/tests2.4/ulrich.c create mode 100644 test/tq.h create mode 100644 test/tq.lcl create mode 100644 test/tq.lcs create mode 100644 test/typequals.c create mode 100644 test/typequals.expect create mode 100644 test/typequals.out create mode 100644 test/ud.c create mode 100644 test/ud.expect create mode 100644 test/ud.out create mode 100644 test/ud2.c create mode 100644 test/ud2.lcl create mode 100644 test/ud2.lcs create mode 100644 test/ulstypes.c create mode 100644 test/ulstypes.expect create mode 100644 test/ulstypes.out create mode 100644 test/union.c create mode 100644 test/union.expect create mode 100644 test/union.out create mode 100644 test/unreachable.c create mode 100644 test/unreachable.expect create mode 100644 test/unreachable.out create mode 100644 test/unused.c create mode 100644 test/unused.expect create mode 100644 test/unused.out diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0f7ddb8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,363 @@ +LCLint - annotation-assisted static program checker +Copyright (C) 1994-2000 University of Virginia, + Massachusetts Institute of Technology + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2 of the License, or (at your +option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +The GNU General Public License is attached to this file and available +from http://www.gnu.org/ or the Free Software Foundation, Inc., 59 +Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +For information on lclint: lclint-request@cs.virginia.edu +To report a bug: lclint-bug@cs.virginia.edu +http://lclint.cs.virginia.edu + +============================================================================== + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..c1ef3d2 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,256 @@ +### +### Makefile for building and installing LCLint 2.5 +### +### Updated for LCLint 2.5: 23 May 2000 +### Updated for LCLint 2.4: 12 April 1998 +### Updated for LCLint 2.2: 25 August 1996 +### Updated for LCLint 2.1a: 17 April 1996 +### Updated for LCLint 2.0: 24 February 1996 +### Updated for LCLint 1.4: 29 January 1995 +### Original for LCLint 1.0: 20 February 1994 +### + +### +### This makefile assumes the gnu version of make is available. +### +### Run: make to build LCLint. +### make install to install. +### +### +### These constants will be compiled into the lclint binary. +### +### They may be overridden by environment variables, but these +### constants set the default values when no environment variables +### are set. +### + +### Command to run C preprocessor: + +DEFAULT_CPPCMD = @CPP@ + +### Directory containing system include files: + +SYSTEM_LIBDIR = "/usr/include" + +### +### Select installation directories: +### +### The LIBDIR and IMPORTSDIR are compiled into the binary to +### select the default LARCH_PATH and LCLIMPORTDIR, which can +### also be overridden by environment variables. +### + +### directory for lclint libraries +LIBDIR = @installdir@/lib + +### directory for lclint standard imports +IMPORTSDIR = @installdir@/imports + +### directory for lclint binary +INSTALLDIR = @installdir@/bin + +### this should be the complete path for the directory where this +### Makefile is, with no trailing / or spaces. + +BASEDIR = @cwdir@ + +### +### Then, run: +### +### make +### +### I recommend doing this in an emacs shell (or buffered terminal) so +### you can scroll through the output. +### +### This should (hopefully) work on most systems without further changes. +### +### If you do not have gcc, set CC = cc (or some other compiler) +### later in this file. +### +### It should: +### o build lclint +### o put lclint in BASEDIR/bin/lclint +### +### If you have installed the test suite, then do: +### +### make test +### +### to verify lclint. +### + +### +### shell --- should work with /bin/sh or similar shells too. +### + +SHELL = /bin/csh + +### +### If you wish to install lclint in some other directory, set these +### variables, and do +### +### make install +### + +### installation command +INSTALL = @INSTALL@ +INSTALLFLAGS = + +### this works with nfs, change to whatever is needed to make +### a file executable on your system + +MAKEEXE = chmod 755 + +### +### end of installation variables +### + +### +### compiler --- gcc is recommended, but lclint has been compiled +### without changes using cc on several platforms. +### + +CC = @CC@ @DEFS@ + +### +### optimizing compiler --- add optimization flags here +### + +CCOPT = $(CC) @OPT@ + +### +### link flags --- this links the lex or flex library +### + +LINKFLAGS = @LINKLEX@ + +### +### do you have bison and/or flex? +### (Note: yacc will probably not work; lex might work but is not recommended.) +### + +BISON = @BISON@ +FLEX = @FLEX@ + +### +### is the test suite available? (must be full path here) +### + +TESTDIR = $(BASEDIR)/test + +### +### if this Makefile is used with one of the +### standard installation packages, no changes should be +### necessary below this line. +### + +.PHONY: install dobinaries dolibraries doimports test + +### +### set this to a different directory +### to install binaries elsewhere +### + +RELEASEDIR = $(BASEDIR)/bin + +all: bin/lclint +lclint: bin/lclint + +bin/lclint: + @echo 'Building lclint from source' +ifeq ($(SHELL), /bin/csh) + cd src ; setenv CC '$(CC)' ; setenv CCOPT '$(CCOPT)'; \ + setenv BISON '$(BISON)' ; setenv FLEX '$(FLEX)' ; \ + setenv DEFAULT_CPPCMD '"$(DEFAULT_CPPCMD)"' ; \ + setenv SYSTEM_LIBDIR '$(SYSTEM_LIBDIR)' ; \ + setenv LINKFLAGS '$(LINKFLAGS)' ; \ + setenv DEFAULT_LARCHPATH '".:$(LIBDIR)"' ; \ + setenv DEFAULT_LCLIMPORTDIR '"$(IMPORTSDIR)"' ; \ + $(MAKE) -e +else + cd src ; CC='$(CC)'; export CC; CCOPT='$(CCOPT)'; \ + BISON='$(BISON)' ; export BISON; FLEX='$(FLEX)'; export FLEX; \ + DEFAULT_CPPCMD='$(DEFAULT_CPPCMD)' ; export DEFAULT_CPPCMD ;\ + SYSTEM_LIBDIR='$(SYSTEM_LIBDIR)' ; export SYSTEM_LIBDIR ;\ + DEFAULT_LARCHPATH='".:$(LIBDIR)/"' ; export DEFAULT_LARCHPATH ;\ + LINKFLAGS='$(LINKFLAGS)'; export LINK_FLAGS; \ + DEFAULT_LCLIMPORTDIR='"$(IMPORTSDIR)"' ; export DEFAULT_LCLIMPORTDIR ;\ + $(MAKE) -e +endif + @echo '// ' + @echo '// Run: '$(MAKE)' test to check' + @echo '// ' + mv src/lclint bin/lclint + +test: +ifeq ($(SHELL), /bin/csh) + cd $(TESTDIR) ; setenv LCLINT $(RELEASEDIR)/lclint ; $(MAKE) -e +else + cd $(TESTDIR) ; LCLINT=$(RELEASEDIR)/lclint ; export LCLINT ; $(MAKE) -e +endif + +clean: + cd src; $(MAKE) clean + rm bin/lclint + +### +### locations of standard LCLint files +### +### this should NOT have to be edited if you use the standard +### installation package + +CP = cp + +LCLINTBINDIR = $(BASEDIR)/bin +LCLINTBIN = lclint + +LCLINTLIB = $(BASEDIR)/lib +LCLINTIMPORTS = $(BASEDIR)/imports + +### +### uses recursive make calls directly, so installation +### will continue even if there are errors! +### + +install: + @echo '// ' + @echo '// Doing lclint installation' + @echo '// ' + @echo ' ' + -@$(MAKE) dobinaries + @echo ' ' + -@$(MAKE) dolibraries + @echo ' ' + -@$(MAKE) doimports + @echo ' ' + @echo '// Installation complete.' + +dobinaries: + @echo '// Installing binaries in '$(INSTALLDIR) + cd $(LCLINTBINDIR); $(INSTALL) $(INSTALLFLAGS) lclint $(INSTALLDIR) + @echo '// Installed: lclint in '$(INSTALLDIR) + +dolibraries: + @echo '// Installing libraries in '$(LIBDIR) + @echo " (This will complain if the directory already exists, don't worry about it.)" + -mkdir $(LIBDIR) + $(CP) $(LCLINTLIB)/* $(LIBDIR) + @echo '// Installed libraries.' + +doimports: + @echo '// Installing imports in '$(IMPORTSDIR) + @echo " (This will complain if the directory already exists, don't worry about it.)" + -mkdir $(IMPORTSDIR) + $(CP) $(LCLINTIMPORTS)/* $(IMPORTSDIR) + @echo '// Installed imports.' + + + + + + + + + + + + diff --git a/README b/README new file mode 100644 index 0000000..20cce10 --- /dev/null +++ b/README @@ -0,0 +1,78 @@ + LCLint Version 2.5m + 23 May 2000 + + David Evans + evans@cs.virginia.edu + + +LCLint Documentation +==================== + +For documentation on LCLint, please see http://lclint.cs.virginia.edu. + +Build Instructions +================== + +To build LCLint you need: + + o a (hopefully ANSI-conforming) C compiler. On most modern Unix systems, + cc will work fine. For older or less standard systems, gcc is + recommended. + o gmake, the GNU make utility. If you don't have gmake installed on your + system, download it from prep.ai.mit.edu. + o standard Unix tools: gzip, tar + +1. Download the LCLint source package (lclint.src.tar.gz). + + Copy this package to the directory where you want to build LCLint. When + the tar file is extracted, it will create an lclint-2.5m subdirectory. + +2. Uncompress the package: + gzip -d lclint.src.tar.gz + +3. Extract files from the tar archive: + tar xf lclint.src.tar + +4. Run: configure + + This will create a Makefile with settings for your system. If you + want to install LCLint or associated libraries different + directories, edit the Makefile. + +5. Run: gmake + + It is best to do this in an emacs shell or a buffered terminal, + so you can scroll through the output. + +6. Set environment variables + + LARCH_PATH - path to search for lclint libraries and + initializations files. If you are using the standard directories, this + should be .:/lclint-2.5m/lib. + + LCLIMPORTDIR - directory containing lcl imports files. If you are using + the standard directories, this is /lclint-2.5m/imports. + + Put the commands to set these variables (the actual commands will depend + on the shell you are using) in one of your initialization dotfiles + (usually ~/.environment). + + Set up your PATH to include the directory containing + lclint-2.5m/bin/lclint, or move the binary to a directory on + your command path. + +7. Run: gmake test + + Examine the test output. If there are errors, send a bug + report to lclint-bug@cs.virginia.edu + +To subscribe to announcements of new lclint releases, send a message to +majordomo@virginia.edu containing the body: + +subscribe lclint-announce + +To participate in discussions related to lclint, send a message to +majordomo@virginia.edu containing the body: + +subscribe lclint-interest + diff --git a/configure b/configure new file mode 100755 index 0000000..e14d032 --- /dev/null +++ b/configure @@ -0,0 +1,583 @@ +#!/bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf. +# Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +# Usage: configure [--srcdir=DIR] [--host=HOST] [--gas] [--nfp] [--no-create] +# [--prefix=PREFIX] [--exec-prefix=PREFIX] [--with-PACKAGE] [TARGET] +# Ignores all args except --srcdir, --prefix, --exec-prefix, --no-create, and +# --with-PACKAGE unless this script has special code to handle it. + + +for arg +do + # Handle --exec-prefix with a space before the argument. + if test x$next_exec_prefix = xyes; then exec_prefix=$arg; next_exec_prefix= + # Handle --host with a space before the argument. + elif test x$next_host = xyes; then next_host= + # Handle --prefix with a space before the argument. + elif test x$next_prefix = xyes; then prefix=$arg; next_prefix= + # Handle --srcdir with a space before the argument. + elif test x$next_srcdir = xyes; then srcdir=$arg; next_srcdir= + else + case $arg in + # For backward compatibility, also recognize exact --exec_prefix. + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* | --exec=* | --exe=* | --ex=* | --e=*) + exec_prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;; + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- | --exec | --exe | --ex | --e) + next_exec_prefix=yes ;; + + -gas | --gas | --ga | --g) ;; + + -host=* | --host=* | --hos=* | --ho=* | --h=*) ;; + -host | --host | --hos | --ho | --h) + next_host=yes ;; + + -nfp | --nfp | --nf) ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre | --no-cr | --no-c | --no- | --no) + no_create=1 ;; + + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;; + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + next_prefix=yes ;; + + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=* | --s=*) + srcdir=`echo $arg | sed 's/[-a-z_]*=//'` ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr | --s) + next_srcdir=yes ;; + + -with-* | --with-*) + package=`echo $arg|sed 's/-*with-//'` + # Delete all the valid chars; see if any are left. + if test -n "`echo $package|sed 's/[-a-zA-Z0-9_]*//g'`"; then + echo "configure: $package: invalid package name" >&2; exit 1 + fi + eval "with_`echo $package|sed s/-/_/g`=1" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb | --ver | --ve | --v) + verbose=yes ;; + + *) ;; + esac + fi +done + +trap 'rm -f conftest* core; exit 1' 1 3 15 + +# Needed for some versions of `tr' so that character classes in `[]' work. +if test "${LANG+set}" = "set" ; then + LANG=C + LC_ALL=C + export LANG LC_ALL +fi + +rm -f conftest* +compile='${CC-cc} $CFLAGS $DEFS conftest.c -o conftest $LIBS >/dev/null 2>&1' + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +unique_file=Makefile.in + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + srcdirdefaulted=yes + # Try the directory containing this script, then `..'. + prog=$0 + confdir=`echo $prog|sed 's%/[^/][^/]*$%%'` + test "X$confdir" = "X$prog" && confdir=. + srcdir=$confdir + if test ! -r $srcdir/$unique_file; then + srcdir=.. + fi +fi +if test ! -r $srcdir/$unique_file; then + if test x$srcdirdefaulted = xyes; then + echo "configure: Can not find sources in \`${confdir}' or \`..'." 1>&2 + else + echo "configure: Can not find sources in \`${srcdir}'." 1>&2 + fi + exit 1 +fi + +# Preserve a srcdir of `.' to avoid automounter screwups with pwd. +# But we can't avoid them for `..', to make subdirectories work. +case $srcdir in + .|/*|~*) ;; + *) srcdir=`cd $srcdir; pwd` ;; # Make relative path absolute. +esac + +if test -z "$CC"; then + # Extract the first word of `gcc', so it can be a program name with args. + set dummy gcc; word=$2 + echo checking for $word + IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/$word; then + CC="gcc" + break + fi + done + IFS="$saveifs" +fi +test -z "$CC" && CC="cc" +test -n "$CC" -a -n "$verbose" && echo " setting CC to $CC" + +# Find out if we are using GNU C, under whatever name. +cat > conftest.c < conftest.out 2>&1 +if egrep yes conftest.out >/dev/null 2>&1; then + GCC=1 # For later tests. + CFLAGS="${CFLAGS--O}" +fi +rm -f conftest* + +if test -z "$BISON"; then + echo checking for bison + IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/bison; then + BISON=$dir/bison + break + fi + done + IFS="$saveifs" +fi + +test -n "$BISON" -a -n "$verbose" && echo " setting BISON to $BISON" + +if test -z "$FLEX"; then + echo checking for flex + IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/flex; then + FLEX=$dir/flex + break + fi + done + IFS="$saveifs" +fi + +test -n "$FLEX" -a -n "$verbose" && echo " setting FLEX to $FLEX" + +echo checking how to run the C preprocessor +if test -z "$CPP"; then + CPP='gcc -E' + cat > conftest.c < +EOF +err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + : +else + CPP=/lib/cpp +fi +rm -f conftest* +fi + +echo 'checking if pre-processor defined __STDC__' +echo '# ifndef __STDC__' > conftest.c +echo '# error "No STDC"' >> conftest.c +echo 'int main (void) { exit (0); }' >> conftest.c +eval "$CPP conftest.c > conftest.out 2>&1" +if egrep "No STDC" conftest.out >/dev/null 2>&1; then + test -n "$verbose" && echo ' __STDC__ not defined' + DEFS="$DEFS -DNEED_STDC" +fi + +echo 'checking for optimization levels' +echo 'int main (void) { exit (0); }' > conftest.c +eval "$CC -O -o conftest conftest.c > conftest.out 2>&1" +if egrep "O" conftest.out >/dev/null 2>&1; then + test -n "$verbose" && echo ' No optimization flags found' + OPT='' +else + eval "$CC -O2 -o conftest conftest.c > conftest.out 2>&1" + if egrep "O2" conftest.out >/dev/null 2>&1; then + test -n "$verbose" && echo ' Optimization: -O' + OPT='-O' + else + eval "$CC -O3 -o conftest conftest.c > conftest.out 2>&1" + if egrep "O3" conftest.out >/dev/null 2>&1; then + test -n "$verbose" && echo ' Optimization: -O2' + OPT='-O2' + else + if egrep "O4" conftest.out >/dev/null 2>&1; then + test -n "$verbose" && echo ' Optimization: -O3' + OPT='-O2' + else + test -n "$verbose" && echo ' Optimization: -O4' + OPT='-O2' +# bug in gcc makes -O3 and -O4 bad - bug in compiling parser + fi + fi + fi +fi +rm -f conftest* + +# Make sure to not get the incompatible SysV /etc/install and +# /usr/sbin/install, which might be in PATH before a BSD-like install, +# or the SunOS /usr/etc/install directory, or the AIX /bin/install, +# or the AFS install, which mishandles nonexistent args, or +# /usr/ucb/install on SVR4, which tries to use the nonexistent group +# `staff'. On most BSDish systems install is in /usr/bin, not /usr/ucb +# anyway. Sigh. +if test "z${INSTALL}" = "z" ; then + echo checking for install + IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" + for dir in $PATH; do + test -z "$dir" && dir=. + case $dir in + /etc|/usr/sbin|/usr/etc|/usr/afsws/bin|/usr/ucb) ;; + *) + if test -f $dir/installbsd; then + INSTALL="$dir/installbsd -c" # OSF1 + INSTALL_PROGRAM='$(INSTALL)' + INSTALL_DATA='$(INSTALL) -m 644' + break + fi + if test -f $dir/install; then + if grep dspmsg $dir/install >/dev/null 2>&1; then + : # AIX + else + INSTALL="$dir/install -c" + INSTALL_PROGRAM='$(INSTALL)' + INSTALL_DATA='$(INSTALL) -m 644' + break + fi + fi + ;; + esac + done + IFS="$saveifs" +fi +INSTALL=${INSTALL-cp} +INSTALL_PROGRAM=${INSTALL_PROGRAM-'$(INSTALL)'} +INSTALL_DATA=${INSTALL_DATA-'$(INSTALL)'} + +echo checking for ANSI C header files +cat > conftest.c < +#include +#include +#include +EOF +err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +echo '#include ' > conftest.c +eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" +if egrep "memchr" conftest.out >/dev/null 2>&1; then + # SGI's /bin/cc from Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +cat > conftest.c < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e,f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +eval $compile +if test -s conftest && (./conftest; exit) 2>/dev/null; then + { +test -n "$verbose" && \ +echo ' defining' STDC_HEADERS +DEFS="$DEFS -DSTDC_HEADERS=1" +} + +fi +rm -f conftest* +fi +rm -f conftest* + +fi +rm -f conftest* + +echo checking for stdarg.h +cat > conftest.c < +EOF +err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + USEVARARGS=0 : +else + { +test -n "$verbose" && \ +echo ' defining' USEVARARGS +DEFS="$DEFS -DUSEVARARGS=1" +USEVARARGS=1 +} +fi + +echo checking for string.h +cat > conftest.c < +EOF +err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + : +else + { +test -n "$verbose" && \ +echo ' defining' NO_STRING_H +DEFS="$DEFS -DNO_STRING_H=1" +} + +fi +rm -f conftest* + +echo checking for stdlib.h +cat > conftest.c < +EOF +err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + : +else + { +test -n "$verbose" && \ +echo ' defining' NO_STDLIB_H +DEFS="$DEFS -DNO_STDLIB_H=1" +} + +fi +rm -f conftest* + +echo checking for size_t in sys/types.h +echo '#include ' > conftest.c +eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" +if egrep "size_t" conftest.out >/dev/null 2>&1; then + : +else + { +test -n "$verbose" && \ +echo ' defining' size_t to be 'unsigned' +DEFS="$DEFS -Dsize_t=unsigned" +} + +fi +rm -f conftest* + +echo '#include ' > conftest.c +eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" +if egrep "off_t" conftest.out >/dev/null 2>&1; then + : +else + { +test -n "$verbose" && \ +echo ' defining' NO_OFF_T +DEFS="$DEFS -DNO_OFF_T=1" +} +fi + +echo checking for EXIT_SUCCESS +cat > conftest.c < +int main (void) { return EXIT_SUCCESS; } +EOF +err=`eval "($CC -c \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + : +else + { +test -n "$verbose" && \ +echo ' no EXIT_SUCCESS' +DEFS="$DEFS -DEXIT_SUCCESS=0" +} +fi + +echo checking for EXIT_FAILURE +cat > conftest.c < +int main (void) { return EXIT_FAILURE; } +EOF +err=`eval "($CC -c \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + : +else + { +test -n "$verbose" && \ +echo ' no EXIT_FAILURE' +DEFS="$DEFS -DEXIT_FAILURE=-1" +} +fi + +echo checking for -ll +echo 'int main (void) { exit (0); }' > conftest.c +err=`eval "($CC conftest.c -o conftest -ll >/dev/null) 2>&1"` +if test -z "$err"; then +LINKLEX="-ll" +else +echo ' No -ll...trying -lfl' +err=`eval "($CC conftest.c -o conftest -lfl >/dev/null) 2>&1"` +if test -z "$err"; then +echo 'Okay!' +LINKLEX="-lfl" +else +echo '*** No lex or flex library found. Must have -ll or -lfl to build lclint.' +echo '*** If this is installed on your system, try editing the configure +script to use the correct flags to locate this file.' +fi +fi +rm -f conftest* + +if test -z "$cwdir" + then + cwdir=`pwd` + echo setting current directory to $cwdir + fi + +if test -z "$prefix" +then + prefix=$cwdir + echo " chose installation directory prefix ${prefix}" + echo " will install binaries in ${prefix}/bin" + echo " will install libraries in ${prefix}/lib" + echo " will install imports in ${prefix}/imports" + echo " will install emacs files in ${prefix}/emacs" + echo " edit Makefile to change installation directories" +fi + +if test -z "$G" -a -n "$prefix" -a -f $prefix/bin/gznew; then + G=g +fi +if test -z "$ZCAT"; then + if test -n "$prefix" -a -f $prefix/bin/gzcat; then + ZCAT=gzcat + else + ZCAT=${G}zcat + fi +fi +if test -n "$prefix"; then + test -z "$exec_prefix" && exec_prefix='${prefix}' + prsub="s%^prefix\\([ ]*\\)=\\([ ]*\\).*$%prefix\\1=\\2$prefix%" +fi +if test -n "$exec_prefix"; then + prsub="$prsub +s%^exec_prefix\\([ ]*\\)=\\([ ]*\\).*$%\ +exec_prefix\\1=\\2$exec_prefix%" +fi +cat >conftest.def < config.status </dev/null | sed 1q`: +# +# $0 $* + +for arg +do + case "\$arg" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + exec /bin/sh $0 $* ;; + *) echo "Usage: config.status --recheck" 2>&1; exit 1 ;; + esac +done + +trap 'rm -f Makefile; exit 1' 1 3 15 +CC='$CC' +CPP='$CPP' +OPT='$OPT' +cwdir='$cwdir' +INSTALL='$INSTALL' +INSTALL_PROGRAM='$INSTALL_PROGRAM' +INSTALL_DATA='$INSTALL_DATA' +BISON='$BISON' +FLEX='$FLEX' +ZCAT='$ZCAT' +LINKLEX='$LINKLEX' +G='$G' +CFLAGS='$CFLAGS' +ASCPP='$ASCPP' +OBJA='$OBJA' +SEDCMD='$SEDCMD' +LIBS='$LIBS' +srcdir='$srcdir' +DEFS='$DEFS' +prefix='$prefix' +installdir='$prefix' +exec_prefix='$exec_prefix' +prsub='$prsub' +EOF +cat >> config.status <<\EOF + +top_srcdir=$srcdir + +# Allow make-time overrides of the generated file list. +test -n "$gen_files" || gen_files="Makefile" + +for file in .. $gen_files; do if [ "x$file" != "x.." ]; then + srcdir=$top_srcdir + # Remove last slash and all that follows it. Not all systems have dirname. + dir=`echo $file|sed 's%/[^/][^/]*$%%'` + if test "$dir" != "$file"; then + test "$top_srcdir" != . && srcdir=$top_srcdir/$dir + test ! -d $dir && mkdir $dir + fi + echo creating $file + rm -f $file + echo "# Generated automatically from `echo $file|sed 's|.*/||'`.in by configure." > $file + sed -e " +$prsub +s%@CC@%$CC%g +s%@CPP@%$CPP%g +s%@OPT@%$OPT%g +s%@LINKLEX@%$LINKLEX%g +s%@BISON@%$BISON%g +s%@FLEX@%$FLEX%g +s%@cwdir@%$cwdir%g +s%@installdir@%$installdir%g +s%@INSTALL@%$INSTALL%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@ZCAT@%$ZCAT%g +s%@G@%$G%g +s%@CFLAGS@%$CFLAGS%g +s%@OBJA@%$OBJA%g +s%@SEDCMD@%$SEDCMD%g +s%@LIBS@%$LIBS%g +s%@srcdir@%$srcdir%g +s%@DEFS@%$DEFS% +" $top_srcdir/${file}.in >> $file +fi; done + +exit 0 +EOF +chmod +x config.status +test -n "$no_create" || ./config.status + diff --git a/emacs/lclint-abbrevs b/emacs/lclint-abbrevs new file mode 100644 index 0000000..341e633 --- /dev/null +++ b/emacs/lclint-abbrevs @@ -0,0 +1,58 @@ +(define-abbrev-table 'c-mode-abbrev-table + '(("out" "/*@out@*/" nil 0) + ("inn" "/*@in@*/" nil 0) + ("only" "/*@only@*/" nil 0) + ("owned" "/*@owned@*/" nil 0) + ("dependent" "/*@dependent@*/" nil 0) + ("partial" "/*@partial@*/" nil 0) + ("special" "/*@special@*/" nil 0) + ("truenull" "/*@truenull@*/" nil 0) + ("falsenull" "/*@falsenull@*/" nil 0) + ("keep" "/*@keep@*/" nil 0) + ("kept" "/*@kept@*/" nil 0) + ("notnull" "/*@notnull@*/" nil 0) + ("abstract" "/*@abstract@*/" nil 0) + ("concrete" "/*@concrete@*/" nil 0) + ("mutable" "/*@mutable@*/" nil 0) + ("immutable" "/*@immutable@*/" nil 0) + ("unused" "/*@unused@*/" nil 0) + ("external" "/*@external@*/" nil 0) + ("sef" "/*@sef@*/" nil 0) + ("unique" "/*@unique@*/" nil 0) + ("returned" "/*@returned@*/" nil 0) + ("exposed" "/*@exposed@*/" nil 0) + ("refcounted" "/*@refcounted@*/" nil 0) + ("refs" "/*@refs@*/" nil 0) + ("newref" "/*@newref@*/" nil 0) + ("tempref" "/*@tempref@*/" nil 0) + ("killref" "/*@killref@*/" nil 0) + ("nll" "/*@null@*/" nil 0) + ("relnull" "/*@relnull@*/" nil 0) + ("reldef" "/*@reldef@*/" nil 0) + ("observer" "/*@observer@*/" nil 0) + ("exits" "/*@exits@*/" nil 0) + ("mayexit" "/*@mayexit@*/" nil 0) + ("trueexit" "/*@trueexit@*/" nil 0) + ("falseexit" "/*@falseexit@*/" nil 0) + ("neverexit" "/*@neverexit@*/" nil 0) + ("temp" "/*@temp@*/" nil 0) + ("shared" "/*@shared@*/" nil 0) + ("unchecked" "/*@unchecked@*/" nil 0) + ("checked" "/*@checked@*/" nil 0) + ("checkmod" "/*@checkmod@*/" nil 0) + ("checkedstrict" "/*@checkedstrict@*/" nil 0) + ("innercontinue" "/*@innercontinue@*/" nil 0) + ("innerbreak" "/*@innerbreak@*/" nil 0) + ("loopbreak" "/*@loopbreak@*/" nil 0) + ("switchbreak" "/*@switchbreak@*/" nil 0) + ("safebreak" "/*@safebreak@*/" nil 0) + ("fallthrough" "/*@fallthrough@*/" nil 0) + ("notreached" "/*@notreached@*/" nil 0) + ("printflike" "/*@printflike@*/" nil 0) + ("scanflike" "/*@scanflike@*/" nil 0) + ("messagelike" "/*@messagelike@*/" nil 0) + ("anytype" "/*@anytype@*/" nil 0) + ("integraltype" "/*@integraltype@*/" nil 0) + ("unsignedintegraltype" "/*@unsignedintegraltype@*/" nil 0) + ("signedintegraltype" "/*@signedintegraltype@*/" nil 0) + )) diff --git a/imports/assert.lcl b/imports/assert.lcl new file mode 100644 index 0000000..047024b --- /dev/null +++ b/imports/assert.lcl @@ -0,0 +1,5 @@ +/* +** assert.h +*/ + +void assert() { ensures true; } diff --git a/imports/assert.lcs b/imports/assert.lcs new file mode 100644 index 0000000..28b7807 --- /dev/null +++ b/imports/assert.lcs @@ -0,0 +1,121 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop mod :int, int -> int +%LCLop min :int, int -> int +%LCLop max :int, int -> int +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop count :char, _char_Vec -> int +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop init :_char_Vec -> _char_Vec +%LCLop isEmpty :_char_Vec -> bool +%LCLop last :_char_Vec -> char +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop lenStr :_char_Vec -> int +%LCLop times10plus :int, int -> int +%LCLop plus1 :int -> int +%LCLop 2 : -> int +%LCLop 3 : -> int +%LCLop 4 : -> int +%LCLop 5 : -> int +%LCLop 6 : -> int +%LCLop 7 : -> int +%LCLop 8 : -> int +%LCLop 9 : -> int +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop { __ } :char -> _char_Vec +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop null : -> char +%LCLop NIL : -> __char_Obj_Ptr +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop succ :int -> int +%LCLop pred :int -> int +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLfcn assert : -> void +%LCLfcnGlobals +%LCLSymbolTableEnd diff --git a/imports/ctype.lcl b/imports/ctype.lcl new file mode 100644 index 0000000..c81079d --- /dev/null +++ b/imports/ctype.lcl @@ -0,0 +1,20 @@ +/* +** ctype.h +*/ + +| int : bool | isalnum (| int : char | c ) { ensures true; } +| int : bool | isalpha (| int : char | c ) { ensures true; } +| int : bool | isascii (| int : char | c ) { ensures true; } +| int : bool | iscntrl (| int : char | c ) { ensures true; } +| int : bool | isdigit (| int : char | c ) { ensures true; } +| int : bool | isgraph (| int : char | c ) { ensures true; } +| int : bool | islower (| int : char | c ) { ensures true; } +| int : bool | isprint (| int : char | c ) { ensures true; } +| int : bool | ispunct (| int : char | c ) { ensures true; } +| int : bool | isspace (| int : char | c ) { ensures true; } +| int : bool | isupper (| int : char | c ) { ensures true; } +| int : bool | isxdigit (| int : char | c ) { ensures true; } +| int : char | toascii (| int : char | c ) { ensures true; } +| int : char | tolower (| int : char | c ) { ensures true; } +| int : char | toupper (| int : char | c ) { ensures true; } + diff --git a/imports/ctype.lcs b/imports/ctype.lcs new file mode 100644 index 0000000..a01224b --- /dev/null +++ b/imports/ctype.lcs @@ -0,0 +1,149 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop mod :int, int -> int +%LCLop min :int, int -> int +%LCLop max :int, int -> int +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop count :char, _char_Vec -> int +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop init :_char_Vec -> _char_Vec +%LCLop isEmpty :_char_Vec -> bool +%LCLop last :_char_Vec -> char +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop lenStr :_char_Vec -> int +%LCLop times10plus :int, int -> int +%LCLop plus1 :int -> int +%LCLop 2 : -> int +%LCLop 3 : -> int +%LCLop 4 : -> int +%LCLop 5 : -> int +%LCLop 6 : -> int +%LCLop 7 : -> int +%LCLop 8 : -> int +%LCLop 9 : -> int +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop { __ } :char -> _char_Vec +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop null : -> char +%LCLop NIL : -> __char_Obj_Ptr +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop succ :int -> int +%LCLop pred :int -> int +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLfcn isalnum : int -> int +%LCLfcnGlobals +%LCLfcn isalpha : int -> int +%LCLfcnGlobals +%LCLfcn isascii : int -> int +%LCLfcnGlobals +%LCLfcn iscntrl : int -> int +%LCLfcnGlobals +%LCLfcn isdigit : int -> int +%LCLfcnGlobals +%LCLfcn isgraph : int -> int +%LCLfcnGlobals +%LCLfcn islower : int -> int +%LCLfcnGlobals +%LCLfcn isprint : int -> int +%LCLfcnGlobals +%LCLfcn ispunct : int -> int +%LCLfcnGlobals +%LCLfcn isspace : int -> int +%LCLfcnGlobals +%LCLfcn isupper : int -> int +%LCLfcnGlobals +%LCLfcn isxdigit : int -> int +%LCLfcnGlobals +%LCLfcn toascii : int -> int +%LCLfcnGlobals +%LCLfcn tolower : int -> int +%LCLfcnGlobals +%LCLfcn toupper : int -> int +%LCLfcnGlobals +%LCLSymbolTableEnd diff --git a/imports/errno.lcl b/imports/errno.lcl new file mode 100644 index 0000000..6f2b98b --- /dev/null +++ b/imports/errno.lcl @@ -0,0 +1,22 @@ +/* +** errno.h +*/ + +enum { EPERM, ENOENT, ESRCH, EINTR, EIO, ENXIO, E2BIG ,ENOEXEC,EBADF, + ECHILD, EAGAIN, ENOMEM, EACCES, EFAULT, ENOTBLK,EBUSY, EEXIST, EXDEV, + ENODEV, ENOTDIR,EISDIR, EINVAL, ENFILE, EMFILE, ENOTTY, ETXTBSY, EFBIG, + ENOSPC, ESPIPE, EROFS, EMLINK, EPIPE, EDOM, ERANGE, + EWOULDBLOCK, EINPROGRESS, EALREADY, ENOTSOCK, EDESTADDRREQ, EMSGSIZE, + EPROTOTYPE, ENOPROTOOPT, EPROTONOSUPPORT, ESOCKTNOSUPPORT, EOPNOTSUPP, + EPFNOSUPPORT, EAFNOSUPPORT, EADDRINUSE, EADDRNOTAVAIL, ENETDOWN, + ENETUNREACH, ENETRESET, ECONNABORTED, ECONNRESET, ENOBUFS, EISCONN, + ENOTCONN, ESHUTDOWN, ETOOMANYREFS, ETIMEDOUT, ECONNREFUSED, ELOOP , + ENAMETOOLONG, EHOSTDOWN, EHOSTUNREACH, ENOTEMPTY, EPROCLIM, EUSERS, + EDQUOT, ESTALE, EREMOTE, ENOMSG, EIDRM, EALIGN, EDEADLK, + ENOLCK, ENOSYS, EACTIVE, ENOACTIVE, ENORESOURCES, ENOSYSTEM, + ENODUST, EDUPNOCONN, EDUPNODISCONN, EDUPNOTCNTD, EDUPNOTIDLE, + EDUPNOTWAIT, EDUPNOTRUN, EDUPBADOPCODE, EDUPINTRANSIT, + EDUPTOOMANYCPUS + } _errorcodes ; + +int errno ; \ No newline at end of file diff --git a/imports/errno.lcs b/imports/errno.lcs new file mode 100644 index 0000000..d8fc5ba --- /dev/null +++ b/imports/errno.lcs @@ -0,0 +1,399 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _eerrno0e_Enum enum eerrno0e nil +%LCLsort EDUPTOOMANYCPUS enumMem nil nil +%LCLsort EDUPINTRANSIT enumMem nil nil +%LCLsort EDUPBADOPCODE enumMem nil nil +%LCLsort EDUPNOTRUN enumMem nil nil +%LCLsort EDUPNOTWAIT enumMem nil nil +%LCLsort EDUPNOTIDLE enumMem nil nil +%LCLsort EDUPNOTCNTD enumMem nil nil +%LCLsort EDUPNODISCONN enumMem nil nil +%LCLsort EDUPNOCONN enumMem nil nil +%LCLsort ENODUST enumMem nil nil +%LCLsort ENOSYSTEM enumMem nil nil +%LCLsort ENORESOURCES enumMem nil nil +%LCLsort ENOACTIVE enumMem nil nil +%LCLsort EACTIVE enumMem nil nil +%LCLsort ENOSYS enumMem nil nil +%LCLsort ENOLCK enumMem nil nil +%LCLsort EDEADLK enumMem nil nil +%LCLsort EALIGN enumMem nil nil +%LCLsort EIDRM enumMem nil nil +%LCLsort ENOMSG enumMem nil nil +%LCLsort EREMOTE enumMem nil nil +%LCLsort ESTALE enumMem nil nil +%LCLsort EDQUOT enumMem nil nil +%LCLsort EUSERS enumMem nil nil +%LCLsort EPROCLIM enumMem nil nil +%LCLsort ENOTEMPTY enumMem nil nil +%LCLsort EHOSTUNREACH enumMem nil nil +%LCLsort EHOSTDOWN enumMem nil nil +%LCLsort ENAMETOOLONG enumMem nil nil +%LCLsort ELOOP enumMem nil nil +%LCLsort ECONNREFUSED enumMem nil nil +%LCLsort ETIMEDOUT enumMem nil nil +%LCLsort ETOOMANYREFS enumMem nil nil +%LCLsort ESHUTDOWN enumMem nil nil +%LCLsort ENOTCONN enumMem nil nil +%LCLsort EISCONN enumMem nil nil +%LCLsort ENOBUFS enumMem nil nil +%LCLsort ECONNRESET enumMem nil nil +%LCLsort ECONNABORTED enumMem nil nil +%LCLsort ENETRESET enumMem nil nil +%LCLsort ENETUNREACH enumMem nil nil +%LCLsort ENETDOWN enumMem nil nil +%LCLsort EADDRNOTAVAIL enumMem nil nil +%LCLsort EADDRINUSE enumMem nil nil +%LCLsort EAFNOSUPPORT enumMem nil nil +%LCLsort EPFNOSUPPORT enumMem nil nil +%LCLsort EOPNOTSUPP enumMem nil nil +%LCLsort ESOCKTNOSUPPORT enumMem nil nil +%LCLsort EPROTONOSUPPORT enumMem nil nil +%LCLsort ENOPROTOOPT enumMem nil nil +%LCLsort EPROTOTYPE enumMem nil nil +%LCLsort EMSGSIZE enumMem nil nil +%LCLsort EDESTADDRREQ enumMem nil nil +%LCLsort ENOTSOCK enumMem nil nil +%LCLsort EALREADY enumMem nil nil +%LCLsort EINPROGRESS enumMem nil nil +%LCLsort EWOULDBLOCK enumMem nil nil +%LCLsort ERANGE enumMem nil nil +%LCLsort EDOM enumMem nil nil +%LCLsort EPIPE enumMem nil nil +%LCLsort EMLINK enumMem nil nil +%LCLsort EROFS enumMem nil nil +%LCLsort ESPIPE enumMem nil nil +%LCLsort ENOSPC enumMem nil nil +%LCLsort EFBIG enumMem nil nil +%LCLsort ETXTBSY enumMem nil nil +%LCLsort ENOTTY enumMem nil nil +%LCLsort EMFILE enumMem nil nil +%LCLsort ENFILE enumMem nil nil +%LCLsort EINVAL enumMem nil nil +%LCLsort EISDIR enumMem nil nil +%LCLsort ENOTDIR enumMem nil nil +%LCLsort ENODEV enumMem nil nil +%LCLsort EXDEV enumMem nil nil +%LCLsort EEXIST enumMem nil nil +%LCLsort EBUSY enumMem nil nil +%LCLsort ENOTBLK enumMem nil nil +%LCLsort EFAULT enumMem nil nil +%LCLsort EACCES enumMem nil nil +%LCLsort ENOMEM enumMem nil nil +%LCLsort EAGAIN enumMem nil nil +%LCLsort ECHILD enumMem nil nil +%LCLsort EBADF enumMem nil nil +%LCLsort ENOEXEC enumMem nil nil +%LCLsort E2BIG enumMem nil nil +%LCLsort ENXIO enumMem nil nil +%LCLsort EIO enumMem nil nil +%LCLsort EINTR enumMem nil nil +%LCLsort ESRCH enumMem nil nil +%LCLsort ENOENT enumMem nil nil +%LCLsort EPERM enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __eerrno0e_Enum_Obj obj _eerrno0e_Enum nil +%LCLsort _int_Obj obj int nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop ENOMSG : -> _eerrno0e_Enum +%LCLop mod :int, int -> int +%LCLop EIDRM : -> _eerrno0e_Enum +%LCLop min :int, int -> int +%LCLop EALIGN : -> _eerrno0e_Enum +%LCLop max :int, int -> int +%LCLop EDEADLK : -> _eerrno0e_Enum +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop ENOLCK : -> _eerrno0e_Enum +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop ENOSYS : -> _eerrno0e_Enum +%LCLop EACTIVE : -> _eerrno0e_Enum +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop ENOACTIVE : -> _eerrno0e_Enum +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop ENORESOURCES : -> _eerrno0e_Enum +%LCLop ENOSYSTEM : -> _eerrno0e_Enum +%LCLop ENODUST : -> _eerrno0e_Enum +%LCLop count :char, _char_Vec -> int +%LCLop EDUPNOCONN : -> _eerrno0e_Enum +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop EDUPNODISCONN : -> _eerrno0e_Enum +%LCLop init :_char_Vec -> _char_Vec +%LCLop EDUPNOTCNTD : -> _eerrno0e_Enum +%LCLop isEmpty :_char_Vec -> bool +%LCLop EDUPNOTIDLE : -> _eerrno0e_Enum +%LCLop last :_char_Vec -> char +%LCLop EDUPNOTWAIT : -> _eerrno0e_Enum +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop EDUPNOTRUN : -> _eerrno0e_Enum +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop EDUPBADOPCODE : -> _eerrno0e_Enum +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop EDUPINTRANSIT : -> _eerrno0e_Enum +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop EDUPTOOMANYCPUS : -> _eerrno0e_Enum +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop lenStr :_char_Vec -> int +%LCLop times10plus :int, int -> int +%LCLop plus1 :int -> int +%LCLop 2 : -> int +%LCLop 3 : -> int +%LCLop 4 : -> int +%LCLop 5 : -> int +%LCLop 6 : -> int +%LCLop 7 : -> int +%LCLop 8 : -> int +%LCLop 9 : -> int +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop { __ } :char -> _char_Vec +%LCLop EPERM : -> _eerrno0e_Enum +%LCLop ENOENT : -> _eerrno0e_Enum +%LCLop ESRCH : -> _eerrno0e_Enum +%LCLop EINTR : -> _eerrno0e_Enum +%LCLop EIO : -> _eerrno0e_Enum +%LCLop ENXIO : -> _eerrno0e_Enum +%LCLop E2BIG : -> _eerrno0e_Enum +%LCLop ENOEXEC : -> _eerrno0e_Enum +%LCLop EBADF : -> _eerrno0e_Enum +%LCLop ECHILD : -> _eerrno0e_Enum +%LCLop EAGAIN : -> _eerrno0e_Enum +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop ENOMEM : -> _eerrno0e_Enum +%LCLop EACCES : -> _eerrno0e_Enum +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop EFAULT : -> _eerrno0e_Enum +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop ENOTBLK : -> _eerrno0e_Enum +%LCLop EBUSY : -> _eerrno0e_Enum +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop EEXIST : -> _eerrno0e_Enum +%LCLop EXDEV : -> _eerrno0e_Enum +%LCLop ENODEV : -> _eerrno0e_Enum +%LCLop ENOTDIR : -> _eerrno0e_Enum +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop EISDIR : -> _eerrno0e_Enum +%LCLop EINVAL : -> _eerrno0e_Enum +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop ENFILE : -> _eerrno0e_Enum +%LCLop EMFILE : -> _eerrno0e_Enum +%LCLop ENOTTY : -> _eerrno0e_Enum +%LCLop ETXTBSY : -> _eerrno0e_Enum +%LCLop null : -> char +%LCLop EFBIG : -> _eerrno0e_Enum +%LCLop ENOSPC : -> _eerrno0e_Enum +%LCLop ESPIPE : -> _eerrno0e_Enum +%LCLop EROFS : -> _eerrno0e_Enum +%LCLop EMLINK : -> _eerrno0e_Enum +%LCLop EPIPE : -> _eerrno0e_Enum +%LCLop EDOM : -> _eerrno0e_Enum +%LCLop ERANGE : -> _eerrno0e_Enum +%LCLop EWOULDBLOCK : -> _eerrno0e_Enum +%LCLop EINPROGRESS : -> _eerrno0e_Enum +%LCLop EALREADY : -> _eerrno0e_Enum +%LCLop ENOTSOCK : -> _eerrno0e_Enum +%LCLop EDESTADDRREQ : -> _eerrno0e_Enum +%LCLop EMSGSIZE : -> _eerrno0e_Enum +%LCLop EPROTOTYPE : -> _eerrno0e_Enum +%LCLop ENOPROTOOPT : -> _eerrno0e_Enum +%LCLop EPROTONOSUPPORT : -> _eerrno0e_Enum +%LCLop ESOCKTNOSUPPORT : -> _eerrno0e_Enum +%LCLop EOPNOTSUPP : -> _eerrno0e_Enum +%LCLop EPFNOSUPPORT : -> _eerrno0e_Enum +%LCLop EAFNOSUPPORT : -> _eerrno0e_Enum +%LCLop EADDRINUSE : -> _eerrno0e_Enum +%LCLop EADDRNOTAVAIL : -> _eerrno0e_Enum +%LCLop NIL : -> __char_Obj_Ptr +%LCLop ENETDOWN : -> _eerrno0e_Enum +%LCLop ENETUNREACH : -> _eerrno0e_Enum +%LCLop ENETRESET : -> _eerrno0e_Enum +%LCLop ECONNABORTED : -> _eerrno0e_Enum +%LCLop ECONNRESET : -> _eerrno0e_Enum +%LCLop ENOBUFS : -> _eerrno0e_Enum +%LCLop EISCONN : -> _eerrno0e_Enum +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop ENOTCONN : -> _eerrno0e_Enum +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop ESHUTDOWN : -> _eerrno0e_Enum +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop sizeof :_eerrno0e_Enum -> int +%LCLop ETOOMANYREFS : -> _eerrno0e_Enum +%LCLop ETIMEDOUT : -> _eerrno0e_Enum +%LCLop ECONNREFUSED : -> _eerrno0e_Enum +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop ELOOP : -> _eerrno0e_Enum +%LCLop ENAMETOOLONG : -> _eerrno0e_Enum +%LCLop EHOSTDOWN : -> _eerrno0e_Enum +%LCLop EHOSTUNREACH : -> _eerrno0e_Enum +%LCLop ENOTEMPTY : -> _eerrno0e_Enum +%LCLop succ :int -> int +%LCLop EPROCLIM : -> _eerrno0e_Enum +%LCLop pred :int -> int +%LCLop EUSERS : -> _eerrno0e_Enum +%LCLop EDQUOT : -> _eerrno0e_Enum +%LCLop ESTALE : -> _eerrno0e_Enum +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop EREMOTE : -> _eerrno0e_Enum +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLenumConst EPERM _eerrno0e_Enum +%LCLenumConst ENOENT _eerrno0e_Enum +%LCLenumConst ESRCH _eerrno0e_Enum +%LCLenumConst EINTR _eerrno0e_Enum +%LCLenumConst EIO _eerrno0e_Enum +%LCLenumConst ENXIO _eerrno0e_Enum +%LCLenumConst E2BIG _eerrno0e_Enum +%LCLenumConst ENOEXEC _eerrno0e_Enum +%LCLenumConst EBADF _eerrno0e_Enum +%LCLenumConst ECHILD _eerrno0e_Enum +%LCLenumConst EAGAIN _eerrno0e_Enum +%LCLenumConst ENOMEM _eerrno0e_Enum +%LCLenumConst EACCES _eerrno0e_Enum +%LCLenumConst EFAULT _eerrno0e_Enum +%LCLenumConst ENOTBLK _eerrno0e_Enum +%LCLenumConst EBUSY _eerrno0e_Enum +%LCLenumConst EEXIST _eerrno0e_Enum +%LCLenumConst EXDEV _eerrno0e_Enum +%LCLenumConst ENODEV _eerrno0e_Enum +%LCLenumConst ENOTDIR _eerrno0e_Enum +%LCLenumConst EISDIR _eerrno0e_Enum +%LCLenumConst EINVAL _eerrno0e_Enum +%LCLenumConst ENFILE _eerrno0e_Enum +%LCLenumConst EMFILE _eerrno0e_Enum +%LCLenumConst ENOTTY _eerrno0e_Enum +%LCLenumConst ETXTBSY _eerrno0e_Enum +%LCLenumConst EFBIG _eerrno0e_Enum +%LCLenumConst ENOSPC _eerrno0e_Enum +%LCLenumConst ESPIPE _eerrno0e_Enum +%LCLenumConst EROFS _eerrno0e_Enum +%LCLenumConst EMLINK _eerrno0e_Enum +%LCLenumConst EPIPE _eerrno0e_Enum +%LCLenumConst EDOM _eerrno0e_Enum +%LCLenumConst ERANGE _eerrno0e_Enum +%LCLenumConst EWOULDBLOCK _eerrno0e_Enum +%LCLenumConst EINPROGRESS _eerrno0e_Enum +%LCLenumConst EALREADY _eerrno0e_Enum +%LCLenumConst ENOTSOCK _eerrno0e_Enum +%LCLenumConst EDESTADDRREQ _eerrno0e_Enum +%LCLenumConst EMSGSIZE _eerrno0e_Enum +%LCLenumConst EPROTOTYPE _eerrno0e_Enum +%LCLenumConst ENOPROTOOPT _eerrno0e_Enum +%LCLenumConst EPROTONOSUPPORT _eerrno0e_Enum +%LCLenumConst ESOCKTNOSUPPORT _eerrno0e_Enum +%LCLenumConst EOPNOTSUPP _eerrno0e_Enum +%LCLenumConst EPFNOSUPPORT _eerrno0e_Enum +%LCLenumConst EAFNOSUPPORT _eerrno0e_Enum +%LCLenumConst EADDRINUSE _eerrno0e_Enum +%LCLenumConst EADDRNOTAVAIL _eerrno0e_Enum +%LCLenumConst ENETDOWN _eerrno0e_Enum +%LCLenumConst ENETUNREACH _eerrno0e_Enum +%LCLenumConst ENETRESET _eerrno0e_Enum +%LCLenumConst ECONNABORTED _eerrno0e_Enum +%LCLenumConst ECONNRESET _eerrno0e_Enum +%LCLenumConst ENOBUFS _eerrno0e_Enum +%LCLenumConst EISCONN _eerrno0e_Enum +%LCLenumConst ENOTCONN _eerrno0e_Enum +%LCLenumConst ESHUTDOWN _eerrno0e_Enum +%LCLenumConst ETOOMANYREFS _eerrno0e_Enum +%LCLenumConst ETIMEDOUT _eerrno0e_Enum +%LCLenumConst ECONNREFUSED _eerrno0e_Enum +%LCLenumConst ELOOP _eerrno0e_Enum +%LCLenumConst ENAMETOOLONG _eerrno0e_Enum +%LCLenumConst EHOSTDOWN _eerrno0e_Enum +%LCLenumConst EHOSTUNREACH _eerrno0e_Enum +%LCLenumConst ENOTEMPTY _eerrno0e_Enum +%LCLenumConst EPROCLIM _eerrno0e_Enum +%LCLenumConst EUSERS _eerrno0e_Enum +%LCLenumConst EDQUOT _eerrno0e_Enum +%LCLenumConst ESTALE _eerrno0e_Enum +%LCLenumConst EREMOTE _eerrno0e_Enum +%LCLenumConst ENOMSG _eerrno0e_Enum +%LCLenumConst EIDRM _eerrno0e_Enum +%LCLenumConst EALIGN _eerrno0e_Enum +%LCLenumConst EDEADLK _eerrno0e_Enum +%LCLenumConst ENOLCK _eerrno0e_Enum +%LCLenumConst ENOSYS _eerrno0e_Enum +%LCLenumConst EACTIVE _eerrno0e_Enum +%LCLenumConst ENOACTIVE _eerrno0e_Enum +%LCLenumConst ENORESOURCES _eerrno0e_Enum +%LCLenumConst ENOSYSTEM _eerrno0e_Enum +%LCLenumConst ENODUST _eerrno0e_Enum +%LCLenumConst EDUPNOCONN _eerrno0e_Enum +%LCLenumConst EDUPNODISCONN _eerrno0e_Enum +%LCLenumConst EDUPNOTCNTD _eerrno0e_Enum +%LCLenumConst EDUPNOTIDLE _eerrno0e_Enum +%LCLenumConst EDUPNOTWAIT _eerrno0e_Enum +%LCLenumConst EDUPNOTRUN _eerrno0e_Enum +%LCLenumConst EDUPBADOPCODE _eerrno0e_Enum +%LCLenumConst EDUPINTRANSIT _eerrno0e_Enum +%LCLenumConst EDUPTOOMANYCPUS _eerrno0e_Enum +%LCLvar _errorcodes __eerrno0e_Enum_Obj +%LCLvar errno _int_Obj +%LCLSymbolTableEnd diff --git a/imports/limits.lcl b/imports/limits.lcl new file mode 100644 index 0000000..2fdd333 --- /dev/null +++ b/imports/limits.lcl @@ -0,0 +1,111 @@ +/* +** limits.h +*/ + +constant int FLT_RADIX; +constant int FLT_ROUNDS; +constant int FLT_MANT_DIG; +constant int DBL_MANT_DIG; +constant int LDBL_MANT_DIG; + +constant float FLT_EPSILON; +constant double DBL_EPSILON; +constant double LDBL_EPSILON; + +constant int FLT_DIG; +constant int DBL_DIG; +constant int LDBL_DIG; + +constant int FLT_MIN_EXP; +constant int DBL_MIN_EXP; +constant int LDBL_MIN_EXP; + +constant float FLT_MIN; +constant double DBL_MIN; +constant double LDBL_MIN; + +constant int FLT_MIN_10_EXP; +constant int DBL_MIN_10_EXP; +constant int LDBL_MIN_10_EXP; + +constant int FLT_MAX_EXP; +constant int DBL_MAX_EXP; +constant int LDBL_MAX_EXP; + +constant float FLT_MAX; +constant double DBL_MAX; +constant double LDBL_MAX; + +constant int FLT_MAX_10_EXP; +constant int DBL_MAX_10_EXP; +constant int LDBL_MAX_10_EXP; + +constant int ARG_MAX; +constant int CHAR_BIT; +constant int CHAR_MIN; +constant int CHAR_MAX; +constant int UCHAR_MAX; +constant int SCHAR_MIN; +constant int SCHAR_MAX; + +constant int CHILD_MAX; +constant int FCHR_MAX; + +constant double HUGE_VAL; + +constant int LOCK_MAX; +constant int LINK_MAX; + +constant int SHRT_MIN; +constant int SHRT_MAX; + +constant int USHRT_MAX; + +constant int INT_MIN; +constant int INT_MAX; + +constant int UINT_MAX; +constant int LONG_MIN; +constant int LONG_MAX; +constant int ULONG_MAX; +constant int USI_MAX; + +constant int WORD_BIT; +constant int LONG_BIT; + +constant int NAME_MAX; + +constant int NGROUPS_MAX; +constant int MAX_INPUT; +constant int MAX_CANON; +constant int MAX_CHAR; +constant int OPEN_MAX; +constant int PASS_MAX; +constant int PATH_MAX; +constant int PID_MAX; +constant int SYSPID_MAX; + +constant int PIPE_BUF; +constant int PIPE_MAX; + +constant int PROC_MAX; + +constant int STD_BLK; + +constant int SYS_NMLN; +constant int SYS_OPEN; + +constant int TMP_MAX; + +constant int NZERO; + +constant int UID_MAX; + +constant int MB_LEN_MAX; +constant int NL_ARGMAX; +constant int NL_MSGMAX; +constant int NL_NMAX; +constant int NL_SETMAX; +constant int NL_TEXTMAX; +constant int NL_LBLMAX; +constant int NL_LANGMAX; diff --git a/imports/limits.lcs b/imports/limits.lcs new file mode 100644 index 0000000..4336d34 --- /dev/null +++ b/imports/limits.lcs @@ -0,0 +1,386 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _eerrno0e_Enum enum eerrno0e nil +%LCLsort EDUPTOOMANYCPUS enumMem nil nil +%LCLsort EDUPINTRANSIT enumMem nil nil +%LCLsort EDUPBADOPCODE enumMem nil nil +%LCLsort EDUPNOTRUN enumMem nil nil +%LCLsort EDUPNOTWAIT enumMem nil nil +%LCLsort EDUPNOTIDLE enumMem nil nil +%LCLsort EDUPNOTCNTD enumMem nil nil +%LCLsort EDUPNODISCONN enumMem nil nil +%LCLsort EDUPNOCONN enumMem nil nil +%LCLsort ENODUST enumMem nil nil +%LCLsort ENOSYSTEM enumMem nil nil +%LCLsort ENORESOURCES enumMem nil nil +%LCLsort ENOACTIVE enumMem nil nil +%LCLsort EACTIVE enumMem nil nil +%LCLsort ENOSYS enumMem nil nil +%LCLsort ENOLCK enumMem nil nil +%LCLsort EDEADLK enumMem nil nil +%LCLsort EALIGN enumMem nil nil +%LCLsort EIDRM enumMem nil nil +%LCLsort ENOMSG enumMem nil nil +%LCLsort EREMOTE enumMem nil nil +%LCLsort ESTALE enumMem nil nil +%LCLsort EDQUOT enumMem nil nil +%LCLsort EUSERS enumMem nil nil +%LCLsort EPROCLIM enumMem nil nil +%LCLsort ENOTEMPTY enumMem nil nil +%LCLsort EHOSTUNREACH enumMem nil nil +%LCLsort EHOSTDOWN enumMem nil nil +%LCLsort ENAMETOOLONG enumMem nil nil +%LCLsort ELOOP enumMem nil nil +%LCLsort ECONNREFUSED enumMem nil nil +%LCLsort ETIMEDOUT enumMem nil nil +%LCLsort ETOOMANYREFS enumMem nil nil +%LCLsort ESHUTDOWN enumMem nil nil +%LCLsort ENOTCONN enumMem nil nil +%LCLsort EISCONN enumMem nil nil +%LCLsort ENOBUFS enumMem nil nil +%LCLsort ECONNRESET enumMem nil nil +%LCLsort ECONNABORTED enumMem nil nil +%LCLsort ENETRESET enumMem nil nil +%LCLsort ENETUNREACH enumMem nil nil +%LCLsort ENETDOWN enumMem nil nil +%LCLsort EADDRNOTAVAIL enumMem nil nil +%LCLsort EADDRINUSE enumMem nil nil +%LCLsort EAFNOSUPPORT enumMem nil nil +%LCLsort EPFNOSUPPORT enumMem nil nil +%LCLsort EOPNOTSUPP enumMem nil nil +%LCLsort ESOCKTNOSUPPORT enumMem nil nil +%LCLsort EPROTONOSUPPORT enumMem nil nil +%LCLsort ENOPROTOOPT enumMem nil nil +%LCLsort EPROTOTYPE enumMem nil nil +%LCLsort EMSGSIZE enumMem nil nil +%LCLsort EDESTADDRREQ enumMem nil nil +%LCLsort ENOTSOCK enumMem nil nil +%LCLsort EALREADY enumMem nil nil +%LCLsort EINPROGRESS enumMem nil nil +%LCLsort EWOULDBLOCK enumMem nil nil +%LCLsort ERANGE enumMem nil nil +%LCLsort EDOM enumMem nil nil +%LCLsort EPIPE enumMem nil nil +%LCLsort EMLINK enumMem nil nil +%LCLsort EROFS enumMem nil nil +%LCLsort ESPIPE enumMem nil nil +%LCLsort ENOSPC enumMem nil nil +%LCLsort EFBIG enumMem nil nil +%LCLsort ETXTBSY enumMem nil nil +%LCLsort ENOTTY enumMem nil nil +%LCLsort EMFILE enumMem nil nil +%LCLsort ENFILE enumMem nil nil +%LCLsort EINVAL enumMem nil nil +%LCLsort EISDIR enumMem nil nil +%LCLsort ENOTDIR enumMem nil nil +%LCLsort ENODEV enumMem nil nil +%LCLsort EXDEV enumMem nil nil +%LCLsort EEXIST enumMem nil nil +%LCLsort EBUSY enumMem nil nil +%LCLsort ENOTBLK enumMem nil nil +%LCLsort EFAULT enumMem nil nil +%LCLsort EACCES enumMem nil nil +%LCLsort ENOMEM enumMem nil nil +%LCLsort EAGAIN enumMem nil nil +%LCLsort ECHILD enumMem nil nil +%LCLsort EBADF enumMem nil nil +%LCLsort ENOEXEC enumMem nil nil +%LCLsort E2BIG enumMem nil nil +%LCLsort ENXIO enumMem nil nil +%LCLsort EIO enumMem nil nil +%LCLsort EINTR enumMem nil nil +%LCLsort ESRCH enumMem nil nil +%LCLsort ENOENT enumMem nil nil +%LCLsort EPERM enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __eerrno0e_Enum_Obj obj _eerrno0e_Enum nil +%LCLsort _int_Obj obj int nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop ENOMSG : -> _eerrno0e_Enum +%LCLop mod :int, int -> int +%LCLop EIDRM : -> _eerrno0e_Enum +%LCLop min :int, int -> int +%LCLop EALIGN : -> _eerrno0e_Enum +%LCLop max :int, int -> int +%LCLop EDEADLK : -> _eerrno0e_Enum +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop ENOLCK : -> _eerrno0e_Enum +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop ENOSYS : -> _eerrno0e_Enum +%LCLop EACTIVE : -> _eerrno0e_Enum +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop ENOACTIVE : -> _eerrno0e_Enum +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop ENORESOURCES : -> _eerrno0e_Enum +%LCLop ENOSYSTEM : -> _eerrno0e_Enum +%LCLop ENODUST : -> _eerrno0e_Enum +%LCLop count :char, _char_Vec -> int +%LCLop EDUPNOCONN : -> _eerrno0e_Enum +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop EDUPNODISCONN : -> _eerrno0e_Enum +%LCLop init :_char_Vec -> _char_Vec +%LCLop EDUPNOTCNTD : -> _eerrno0e_Enum +%LCLop isEmpty :_char_Vec -> bool +%LCLop EDUPNOTIDLE : -> _eerrno0e_Enum +%LCLop last :_char_Vec -> char +%LCLop EDUPNOTWAIT : -> _eerrno0e_Enum +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop EDUPNOTRUN : -> _eerrno0e_Enum +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop EDUPBADOPCODE : -> _eerrno0e_Enum +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop EDUPINTRANSIT : -> _eerrno0e_Enum +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop EDUPTOOMANYCPUS : -> _eerrno0e_Enum +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop lenStr :_char_Vec -> int +%LCLop times10plus :int, int -> int +%LCLop plus1 :int -> int +%LCLop 2 : -> int +%LCLop 3 : -> int +%LCLop 4 : -> int +%LCLop 5 : -> int +%LCLop 6 : -> int +%LCLop 7 : -> int +%LCLop 8 : -> int +%LCLop 9 : -> int +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop { __ } :char -> _char_Vec +%LCLop EPERM : -> _eerrno0e_Enum +%LCLop ENOENT : -> _eerrno0e_Enum +%LCLop ESRCH : -> _eerrno0e_Enum +%LCLop EINTR : -> _eerrno0e_Enum +%LCLop EIO : -> _eerrno0e_Enum +%LCLop ENXIO : -> _eerrno0e_Enum +%LCLop E2BIG : -> _eerrno0e_Enum +%LCLop ENOEXEC : -> _eerrno0e_Enum +%LCLop EBADF : -> _eerrno0e_Enum +%LCLop ECHILD : -> _eerrno0e_Enum +%LCLop EAGAIN : -> _eerrno0e_Enum +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop ENOMEM : -> _eerrno0e_Enum +%LCLop EACCES : -> _eerrno0e_Enum +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop EFAULT : -> _eerrno0e_Enum +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop ENOTBLK : -> _eerrno0e_Enum +%LCLop EBUSY : -> _eerrno0e_Enum +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop EEXIST : -> _eerrno0e_Enum +%LCLop EXDEV : -> _eerrno0e_Enum +%LCLop ENODEV : -> _eerrno0e_Enum +%LCLop ENOTDIR : -> _eerrno0e_Enum +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop EISDIR : -> _eerrno0e_Enum +%LCLop EINVAL : -> _eerrno0e_Enum +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop ENFILE : -> _eerrno0e_Enum +%LCLop EMFILE : -> _eerrno0e_Enum +%LCLop ENOTTY : -> _eerrno0e_Enum +%LCLop ETXTBSY : -> _eerrno0e_Enum +%LCLop null : -> char +%LCLop EFBIG : -> _eerrno0e_Enum +%LCLop ENOSPC : -> _eerrno0e_Enum +%LCLop ESPIPE : -> _eerrno0e_Enum +%LCLop EROFS : -> _eerrno0e_Enum +%LCLop EMLINK : -> _eerrno0e_Enum +%LCLop EPIPE : -> _eerrno0e_Enum +%LCLop EDOM : -> _eerrno0e_Enum +%LCLop ERANGE : -> _eerrno0e_Enum +%LCLop EWOULDBLOCK : -> _eerrno0e_Enum +%LCLop EINPROGRESS : -> _eerrno0e_Enum +%LCLop EALREADY : -> _eerrno0e_Enum +%LCLop ENOTSOCK : -> _eerrno0e_Enum +%LCLop EDESTADDRREQ : -> _eerrno0e_Enum +%LCLop EMSGSIZE : -> _eerrno0e_Enum +%LCLop EPROTOTYPE : -> _eerrno0e_Enum +%LCLop ENOPROTOOPT : -> _eerrno0e_Enum +%LCLop EPROTONOSUPPORT : -> _eerrno0e_Enum +%LCLop ESOCKTNOSUPPORT : -> _eerrno0e_Enum +%LCLop EOPNOTSUPP : -> _eerrno0e_Enum +%LCLop EPFNOSUPPORT : -> _eerrno0e_Enum +%LCLop EAFNOSUPPORT : -> _eerrno0e_Enum +%LCLop EADDRINUSE : -> _eerrno0e_Enum +%LCLop EADDRNOTAVAIL : -> _eerrno0e_Enum +%LCLop NIL : -> __char_Obj_Ptr +%LCLop ENETDOWN : -> _eerrno0e_Enum +%LCLop ENETUNREACH : -> _eerrno0e_Enum +%LCLop ENETRESET : -> _eerrno0e_Enum +%LCLop ECONNABORTED : -> _eerrno0e_Enum +%LCLop ECONNRESET : -> _eerrno0e_Enum +%LCLop ENOBUFS : -> _eerrno0e_Enum +%LCLop EISCONN : -> _eerrno0e_Enum +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop ENOTCONN : -> _eerrno0e_Enum +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop ESHUTDOWN : -> _eerrno0e_Enum +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop sizeof :_eerrno0e_Enum -> int +%LCLop ETOOMANYREFS : -> _eerrno0e_Enum +%LCLop ETIMEDOUT : -> _eerrno0e_Enum +%LCLop ECONNREFUSED : -> _eerrno0e_Enum +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop ELOOP : -> _eerrno0e_Enum +%LCLop ENAMETOOLONG : -> _eerrno0e_Enum +%LCLop EHOSTDOWN : -> _eerrno0e_Enum +%LCLop EHOSTUNREACH : -> _eerrno0e_Enum +%LCLop ENOTEMPTY : -> _eerrno0e_Enum +%LCLop succ :int -> int +%LCLop EPROCLIM : -> _eerrno0e_Enum +%LCLop pred :int -> int +%LCLop EUSERS : -> _eerrno0e_Enum +%LCLop EDQUOT : -> _eerrno0e_Enum +%LCLop ESTALE : -> _eerrno0e_Enum +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop EREMOTE : -> _eerrno0e_Enum +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLconst FLT_RADIX int +%LCLconst FLT_ROUNDS int +%LCLconst FLT_MANT_DIG int +%LCLconst DBL_MANT_DIG int +%LCLconst LDBL_MANT_DIG int +%LCLconst FLT_EPSILON double +%LCLconst DBL_EPSILON double +%LCLconst LDBL_EPSILON double +%LCLconst FLT_DIG int +%LCLconst DBL_DIG int +%LCLconst LDBL_DIG int +%LCLconst FLT_MIN_EXP int +%LCLconst DBL_MIN_EXP int +%LCLconst LDBL_MIN_EXP int +%LCLconst FLT_MIN double +%LCLconst DBL_MIN double +%LCLconst LDBL_MIN double +%LCLconst FLT_MIN_10_EXP int +%LCLconst DBL_MIN_10_EXP int +%LCLconst LDBL_MIN_10_EXP int +%LCLconst FLT_MAX_EXP int +%LCLconst DBL_MAX_EXP int +%LCLconst LDBL_MAX_EXP int +%LCLconst FLT_MAX double +%LCLconst DBL_MAX double +%LCLconst LDBL_MAX double +%LCLconst FLT_MAX_10_EXP int +%LCLconst DBL_MAX_10_EXP int +%LCLconst LDBL_MAX_10_EXP int +%LCLconst ARG_MAX int +%LCLconst CHAR_BIT int +%LCLconst CHAR_MIN int +%LCLconst CHAR_MAX int +%LCLconst UCHAR_MAX int +%LCLconst SCHAR_MIN int +%LCLconst SCHAR_MAX int +%LCLconst CHILD_MAX int +%LCLconst FCHR_MAX int +%LCLconst HUGE_VAL double +%LCLconst LOCK_MAX int +%LCLconst LINK_MAX int +%LCLconst SHRT_MIN int +%LCLconst SHRT_MAX int +%LCLconst USHRT_MAX int +%LCLconst INT_MIN int +%LCLconst INT_MAX int +%LCLconst UINT_MAX int +%LCLconst LONG_MIN int +%LCLconst LONG_MAX int +%LCLconst ULONG_MAX int +%LCLconst USI_MAX int +%LCLconst WORD_BIT int +%LCLconst LONG_BIT int +%LCLconst NAME_MAX int +%LCLconst NGROUPS_MAX int +%LCLconst MAX_INPUT int +%LCLconst MAX_CANON int +%LCLconst MAX_CHAR int +%LCLconst OPEN_MAX int +%LCLconst PASS_MAX int +%LCLconst PATH_MAX int +%LCLconst PID_MAX int +%LCLconst SYSPID_MAX int +%LCLconst PIPE_BUF int +%LCLconst PIPE_MAX int +%LCLconst PROC_MAX int +%LCLconst STD_BLK int +%LCLconst SYS_NMLN int +%LCLconst SYS_OPEN int +%LCLconst TMP_MAX int +%LCLconst NZERO int +%LCLconst UID_MAX int +%LCLconst MB_LEN_MAX int +%LCLconst NL_ARGMAX int +%LCLconst NL_MSGMAX int +%LCLconst NL_NMAX int +%LCLconst NL_SETMAX int +%LCLconst NL_TEXTMAX int +%LCLconst NL_LBLMAX int +%LCLconst NL_LANGMAX int +%LCLSymbolTableEnd diff --git a/imports/locale.lcl b/imports/locale.lcl new file mode 100644 index 0000000..8c1b75d --- /dev/null +++ b/imports/locale.lcl @@ -0,0 +1,37 @@ +/* +** locale.h +*/ + +constant int LC_ALL; +constant int LC_COLLATE; +constant int LC_CTYPE; +constant int LC_NUMERIC; +constant int LC_TIME; +constant int LC_MONETARY; + +/* lcl can't handle just struct lconv... */ +typedef struct lconv { + char *decimal_point ; + char *thousands_sep ; + char *grouping ; + char *int_curr_symbol ; + char *currency_symbol ; + char *mon_decimal_point ; + char *mon_thousands_sep ; + char *mon_grouping ; + char *positive_sign ; + char *negative_sign ; + char int_frac_digits ; + char frac_digits ; + char p_cs_precedes ; + char p_sep_by_space ; + char n_cs_precedes ; + char n_sep_by_space ; + char p_sign_posn ; + char n_sign_posn ; + } __lconv ; + +struct lconv *localeconv(void) { ensures true; } + +char *etlocale(int __category, char *__locale ) { ensures true; } + diff --git a/imports/locale.lcs b/imports/locale.lcs new file mode 100644 index 0000000..16cf95a --- /dev/null +++ b/imports/locale.lcs @@ -0,0 +1,409 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _eerrno0e_Enum enum eerrno0e nil +%LCLsort EDUPTOOMANYCPUS enumMem nil nil +%LCLsort EDUPINTRANSIT enumMem nil nil +%LCLsort EDUPBADOPCODE enumMem nil nil +%LCLsort EDUPNOTRUN enumMem nil nil +%LCLsort EDUPNOTWAIT enumMem nil nil +%LCLsort EDUPNOTIDLE enumMem nil nil +%LCLsort EDUPNOTCNTD enumMem nil nil +%LCLsort EDUPNODISCONN enumMem nil nil +%LCLsort EDUPNOCONN enumMem nil nil +%LCLsort ENODUST enumMem nil nil +%LCLsort ENOSYSTEM enumMem nil nil +%LCLsort ENORESOURCES enumMem nil nil +%LCLsort ENOACTIVE enumMem nil nil +%LCLsort EACTIVE enumMem nil nil +%LCLsort ENOSYS enumMem nil nil +%LCLsort ENOLCK enumMem nil nil +%LCLsort EDEADLK enumMem nil nil +%LCLsort EALIGN enumMem nil nil +%LCLsort EIDRM enumMem nil nil +%LCLsort ENOMSG enumMem nil nil +%LCLsort EREMOTE enumMem nil nil +%LCLsort ESTALE enumMem nil nil +%LCLsort EDQUOT enumMem nil nil +%LCLsort EUSERS enumMem nil nil +%LCLsort EPROCLIM enumMem nil nil +%LCLsort ENOTEMPTY enumMem nil nil +%LCLsort EHOSTUNREACH enumMem nil nil +%LCLsort EHOSTDOWN enumMem nil nil +%LCLsort ENAMETOOLONG enumMem nil nil +%LCLsort ELOOP enumMem nil nil +%LCLsort ECONNREFUSED enumMem nil nil +%LCLsort ETIMEDOUT enumMem nil nil +%LCLsort ETOOMANYREFS enumMem nil nil +%LCLsort ESHUTDOWN enumMem nil nil +%LCLsort ENOTCONN enumMem nil nil +%LCLsort EISCONN enumMem nil nil +%LCLsort ENOBUFS enumMem nil nil +%LCLsort ECONNRESET enumMem nil nil +%LCLsort ECONNABORTED enumMem nil nil +%LCLsort ENETRESET enumMem nil nil +%LCLsort ENETUNREACH enumMem nil nil +%LCLsort ENETDOWN enumMem nil nil +%LCLsort EADDRNOTAVAIL enumMem nil nil +%LCLsort EADDRINUSE enumMem nil nil +%LCLsort EAFNOSUPPORT enumMem nil nil +%LCLsort EPFNOSUPPORT enumMem nil nil +%LCLsort EOPNOTSUPP enumMem nil nil +%LCLsort ESOCKTNOSUPPORT enumMem nil nil +%LCLsort EPROTONOSUPPORT enumMem nil nil +%LCLsort ENOPROTOOPT enumMem nil nil +%LCLsort EPROTOTYPE enumMem nil nil +%LCLsort EMSGSIZE enumMem nil nil +%LCLsort EDESTADDRREQ enumMem nil nil +%LCLsort ENOTSOCK enumMem nil nil +%LCLsort EALREADY enumMem nil nil +%LCLsort EINPROGRESS enumMem nil nil +%LCLsort EWOULDBLOCK enumMem nil nil +%LCLsort ERANGE enumMem nil nil +%LCLsort EDOM enumMem nil nil +%LCLsort EPIPE enumMem nil nil +%LCLsort EMLINK enumMem nil nil +%LCLsort EROFS enumMem nil nil +%LCLsort ESPIPE enumMem nil nil +%LCLsort ENOSPC enumMem nil nil +%LCLsort EFBIG enumMem nil nil +%LCLsort ETXTBSY enumMem nil nil +%LCLsort ENOTTY enumMem nil nil +%LCLsort EMFILE enumMem nil nil +%LCLsort ENFILE enumMem nil nil +%LCLsort EINVAL enumMem nil nil +%LCLsort EISDIR enumMem nil nil +%LCLsort ENOTDIR enumMem nil nil +%LCLsort ENODEV enumMem nil nil +%LCLsort EXDEV enumMem nil nil +%LCLsort EEXIST enumMem nil nil +%LCLsort EBUSY enumMem nil nil +%LCLsort ENOTBLK enumMem nil nil +%LCLsort EFAULT enumMem nil nil +%LCLsort EACCES enumMem nil nil +%LCLsort ENOMEM enumMem nil nil +%LCLsort EAGAIN enumMem nil nil +%LCLsort ECHILD enumMem nil nil +%LCLsort EBADF enumMem nil nil +%LCLsort ENOEXEC enumMem nil nil +%LCLsort E2BIG enumMem nil nil +%LCLsort ENXIO enumMem nil nil +%LCLsort EIO enumMem nil nil +%LCLsort EINTR enumMem nil nil +%LCLsort ESRCH enumMem nil nil +%LCLsort ENOENT enumMem nil nil +%LCLsort EPERM enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __eerrno0e_Enum_Obj obj _eerrno0e_Enum nil +%LCLsort _int_Obj obj int nil +%LCLsort _lconv_Struct str lconv nil +%LCLsort n_sign_posn strMem _char_Obj nil +%LCLsort p_sign_posn strMem _char_Obj nil +%LCLsort n_sep_by_space strMem _char_Obj nil +%LCLsort n_cs_precedes strMem _char_Obj nil +%LCLsort p_sep_by_space strMem _char_Obj nil +%LCLsort p_cs_precedes strMem _char_Obj nil +%LCLsort frac_digits strMem _char_Obj nil +%LCLsort int_frac_digits strMem _char_Obj nil +%LCLsort negative_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort positive_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort currency_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort int_curr_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil +%LCLsort _lconv_Struct_Tuple tup _lconv_Struct nil +%LCLsort __lconv_Struct_Ptr ptr _lconv_Struct nil +%LCLsort __lconv_Struct_Arr arr _lconv_Struct nil +%LCLsort __lconv_Struct_Tuple_Vec vec _lconv_Struct_Tuple __lconv_Struct_Arr +%LCLsort ___lconv synonym _lconv_Struct nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop ENOMSG : -> _eerrno0e_Enum +%LCLop mod :int, int -> int +%LCLop EIDRM : -> _eerrno0e_Enum +%LCLop min :int, int -> int +%LCLop EALIGN : -> _eerrno0e_Enum +%LCLop max :int, int -> int +%LCLop EDEADLK : -> _eerrno0e_Enum +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop ENOLCK : -> _eerrno0e_Enum +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop ENOSYS : -> _eerrno0e_Enum +%LCLop EACTIVE : -> _eerrno0e_Enum +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop ENOACTIVE : -> _eerrno0e_Enum +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop ENORESOURCES : -> _eerrno0e_Enum +%LCLop ENOSYSTEM : -> _eerrno0e_Enum +%LCLop ENODUST : -> _eerrno0e_Enum +%LCLop count :char, _char_Vec -> int +%LCLop EDUPNOCONN : -> _eerrno0e_Enum +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop EDUPNODISCONN : -> _eerrno0e_Enum +%LCLop init :_char_Vec -> _char_Vec +%LCLop EDUPNOTCNTD : -> _eerrno0e_Enum +%LCLop isEmpty :_char_Vec -> bool +%LCLop EDUPNOTIDLE : -> _eerrno0e_Enum +%LCLop last :_char_Vec -> char +%LCLop EDUPNOTWAIT : -> _eerrno0e_Enum +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop EDUPNOTRUN : -> _eerrno0e_Enum +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop EDUPBADOPCODE : -> _eerrno0e_Enum +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop EDUPINTRANSIT : -> _eerrno0e_Enum +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop EDUPTOOMANYCPUS : -> _eerrno0e_Enum +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop __ \select decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop lenStr :_char_Vec -> int +%LCLop __ \select thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop times10plus :int, int -> int +%LCLop __ \field_arrow decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop plus1 :int -> int +%LCLop __ \field_arrow thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_curr_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select int_curr_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 2 : -> int +%LCLop __ \field_arrow grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select currency_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select currency_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 3 : -> int +%LCLop __ \field_arrow int_curr_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 4 : -> int +%LCLop __ \field_arrow currency_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 5 : -> int +%LCLop __ \field_arrow mon_decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 6 : -> int +%LCLop __ \field_arrow mon_thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select positive_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select positive_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 7 : -> int +%LCLop __ \field_arrow mon_grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select negative_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select negative_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 8 : -> int +%LCLop __ \field_arrow positive_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select int_frac_digits :_lconv_Struct -> _char_Obj +%LCLop 9 : -> int +%LCLop __ \field_arrow negative_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select frac_digits :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow int_frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select p_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select n_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \field_arrow n_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop { __ } :char -> _char_Vec +%LCLop EPERM : -> _eerrno0e_Enum +%LCLop ENOENT : -> _eerrno0e_Enum +%LCLop ESRCH : -> _eerrno0e_Enum +%LCLop EINTR : -> _eerrno0e_Enum +%LCLop EIO : -> _eerrno0e_Enum +%LCLop ENXIO : -> _eerrno0e_Enum +%LCLop E2BIG : -> _eerrno0e_Enum +%LCLop ENOEXEC : -> _eerrno0e_Enum +%LCLop EBADF : -> _eerrno0e_Enum +%LCLop ECHILD : -> _eerrno0e_Enum +%LCLop EAGAIN : -> _eerrno0e_Enum +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [] :__lconv_Struct_Ptr -> __lconv_Struct_Arr +%LCLop ENOMEM : -> _eerrno0e_Enum +%LCLop EACCES : -> _eerrno0e_Enum +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ [__] :__lconv_Struct_Tuple_Vec, int -> _lconv_Struct_Tuple +%LCLop __ [__] :__lconv_Struct_Arr, int -> _lconv_Struct +%LCLop EFAULT : -> _eerrno0e_Enum +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop ENOTBLK : -> _eerrno0e_Enum +%LCLop EBUSY : -> _eerrno0e_Enum +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop EEXIST : -> _eerrno0e_Enum +%LCLop EXDEV : -> _eerrno0e_Enum +%LCLop ENODEV : -> _eerrno0e_Enum +%LCLop ENOTDIR : -> _eerrno0e_Enum +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop EISDIR : -> _eerrno0e_Enum +%LCLop EINVAL : -> _eerrno0e_Enum +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop ENFILE : -> _eerrno0e_Enum +%LCLop EMFILE : -> _eerrno0e_Enum +%LCLop ENOTTY : -> _eerrno0e_Enum +%LCLop ETXTBSY : -> _eerrno0e_Enum +%LCLop null : -> char +%LCLop EFBIG : -> _eerrno0e_Enum +%LCLop ENOSPC : -> _eerrno0e_Enum +%LCLop ESPIPE : -> _eerrno0e_Enum +%LCLop EROFS : -> _eerrno0e_Enum +%LCLop EMLINK : -> _eerrno0e_Enum +%LCLop EPIPE : -> _eerrno0e_Enum +%LCLop EDOM : -> _eerrno0e_Enum +%LCLop ERANGE : -> _eerrno0e_Enum +%LCLop EWOULDBLOCK : -> _eerrno0e_Enum +%LCLop EINPROGRESS : -> _eerrno0e_Enum +%LCLop EALREADY : -> _eerrno0e_Enum +%LCLop ENOTSOCK : -> _eerrno0e_Enum +%LCLop EDESTADDRREQ : -> _eerrno0e_Enum +%LCLop EMSGSIZE : -> _eerrno0e_Enum +%LCLop EPROTOTYPE : -> _eerrno0e_Enum +%LCLop ENOPROTOOPT : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] :char, char, char, char, char, char, char, char, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr -> _lconv_Struct_Tuple +%LCLop EPROTONOSUPPORT : -> _eerrno0e_Enum +%LCLop ESOCKTNOSUPPORT : -> _eerrno0e_Enum +%LCLop EOPNOTSUPP : -> _eerrno0e_Enum +%LCLop EPFNOSUPPORT : -> _eerrno0e_Enum +%LCLop EAFNOSUPPORT : -> _eerrno0e_Enum +%LCLop EADDRINUSE : -> _eerrno0e_Enum +%LCLop EADDRNOTAVAIL : -> _eerrno0e_Enum +%LCLop NIL : -> __char_Obj_Ptr +%LCLop NIL : -> __lconv_Struct_Ptr +%LCLop ENETDOWN : -> _eerrno0e_Enum +%LCLop ENETUNREACH : -> _eerrno0e_Enum +%LCLop ENETRESET : -> _eerrno0e_Enum +%LCLop ECONNABORTED : -> _eerrno0e_Enum +%LCLop ECONNRESET : -> _eerrno0e_Enum +%LCLop ENOBUFS : -> _eerrno0e_Enum +%LCLop EISCONN : -> _eerrno0e_Enum +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop ENOTCONN : -> _eerrno0e_Enum +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ + __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ + __ :int, __lconv_Struct_Ptr -> __lconv_Struct_Ptr +%LCLop ESHUTDOWN : -> _eerrno0e_Enum +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop __ - __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ - __ :__lconv_Struct_Ptr, __lconv_Struct_Ptr -> int +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop sizeof :_eerrno0e_Enum -> int +%LCLop ETOOMANYREFS : -> _eerrno0e_Enum +%LCLop ETIMEDOUT : -> _eerrno0e_Enum +%LCLop ECONNREFUSED : -> _eerrno0e_Enum +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop isSub :__lconv_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__lconv_Struct_Arr, int -> bool +%LCLtag lconv struct +%LCLop ELOOP : -> _eerrno0e_Enum +%LCLop ENAMETOOLONG : -> _eerrno0e_Enum +%LCLop EHOSTDOWN : -> _eerrno0e_Enum +%LCLop EHOSTUNREACH : -> _eerrno0e_Enum +%LCLop ENOTEMPTY : -> _eerrno0e_Enum +%LCLop succ :int -> int +%LCLop EPROCLIM : -> _eerrno0e_Enum +%LCLop pred :int -> int +%LCLop EUSERS : -> _eerrno0e_Enum +%LCLop EDQUOT : -> _eerrno0e_Enum +%LCLop ESTALE : -> _eerrno0e_Enum +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop EREMOTE : -> _eerrno0e_Enum +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLconst LC_ALL int +%LCLconst LC_COLLATE int +%LCLconst LC_CTYPE int +%LCLconst LC_NUMERIC int +%LCLconst LC_TIME int +%LCLconst LC_MONETARY int +%LCLtype __lconv ___lconv exposed +%LCLfcn localeconv : -> __lconv_Struct_Ptr +%LCLfcnGlobals +%LCLfcn etlocale : int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLSymbolTableEnd diff --git a/imports/math.lcl b/imports/math.lcl new file mode 100644 index 0000000..a5197a0 --- /dev/null +++ b/imports/math.lcl @@ -0,0 +1,78 @@ +/* +** math.h +*/ + +int errno, signgam; + +typedef struct exception { + int ttype ; /* should be type */ + char *name ; + double arg1 ; + double arg2 ; + double retval ; +} __exception ; + +double acos(double __x ) { ensures true; } +double acosh(double __x ) { ensures true; } +double asin(double __x ) { ensures true; } +double asinh(double __x ) { ensures true; } +double atan(double __x ) { ensures true; } +double atanh(double __x) { ensures true; } +double atan2(double __x,double __y ) { ensures true; } +double cbrt(double __x ) { ensures true; } +double ceil(double __x ) { ensures true; } +double cos(double __x ) { ensures true; } +double cosh(double __x ) { ensures true; } +double exp(double __x ) { ensures true; } +double fabs(double __x ) { ensures true; } +double floor(double __x ) { ensures true; } +double fmod(double __x,double __y ) { ensures true; } +double frexp(double __value, int *__eptr ) { ensures true; } +double ldexp(double __value, int __exp ) { ensures true; } +double log(double __x ) { ensures true; } +double log10(double __x ) { ensures true; } +double modf(double __value,double *__iptr) { ensures true; } +double pow(double __x,double __y ) { ensures true; } +double rint(double __x ) { ensures true; } +double sin(double __x ) { ensures true; } +double sinh(double __x ) { ensures true; } +double sqrt(double __x ) { ensures true; } +double tan(double __x ) { ensures true; } +double tanh(double __x ) { ensures true; } +double trunc(double __x ) { ensures true; } + +double j0(double __x ) { ensures true; } +double j1(double __x ) { ensures true; } +double jn( int __n,double __x ) { ensures true; } +double y0(double __x ) { ensures true; } +double y1(double __x ) { ensures true; } +double yn( int __n,double __x ) { ensures true; } +double erf(double __x ) { ensures true; } +double erfc(double __x ) { ensures true; } +double gamma(double __x ) { ensures true; } +double lgamma(double __x ) { ensures true; } +double hypot(double __x,double __y ) { ensures true; } +| int : bool | isnan() { ensures true; } +int matherr(struct exception *__x) { ensures true; } + +constant double M_E; +constant double M_LOG2E; +constant double M_LOG10E; +constant double M_LN2; +constant double M_LN10; +constant double M_PI ; +constant double M_PI_2 ; +constant double M_PI_4 ; +constant double M_1_PI ; +constant double M_2_PI ; +constant double M_2_SQRTPI ; +constant double M_SQRT2 ; +constant double M_SQRT1_2 ; + +constant double MAXFLOAT; +constant double HUGE; + +enum { DOMAIN, SING, OVERFLOW, + UNDERFLOW, TLOSS, PLOSS } _matherrors; + + diff --git a/imports/math.lcs b/imports/math.lcs new file mode 100644 index 0000000..00f13fc --- /dev/null +++ b/imports/math.lcs @@ -0,0 +1,587 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _eerrno0e_Enum enum eerrno0e nil +%LCLsort EDUPTOOMANYCPUS enumMem nil nil +%LCLsort EDUPINTRANSIT enumMem nil nil +%LCLsort EDUPBADOPCODE enumMem nil nil +%LCLsort EDUPNOTRUN enumMem nil nil +%LCLsort EDUPNOTWAIT enumMem nil nil +%LCLsort EDUPNOTIDLE enumMem nil nil +%LCLsort EDUPNOTCNTD enumMem nil nil +%LCLsort EDUPNODISCONN enumMem nil nil +%LCLsort EDUPNOCONN enumMem nil nil +%LCLsort ENODUST enumMem nil nil +%LCLsort ENOSYSTEM enumMem nil nil +%LCLsort ENORESOURCES enumMem nil nil +%LCLsort ENOACTIVE enumMem nil nil +%LCLsort EACTIVE enumMem nil nil +%LCLsort ENOSYS enumMem nil nil +%LCLsort ENOLCK enumMem nil nil +%LCLsort EDEADLK enumMem nil nil +%LCLsort EALIGN enumMem nil nil +%LCLsort EIDRM enumMem nil nil +%LCLsort ENOMSG enumMem nil nil +%LCLsort EREMOTE enumMem nil nil +%LCLsort ESTALE enumMem nil nil +%LCLsort EDQUOT enumMem nil nil +%LCLsort EUSERS enumMem nil nil +%LCLsort EPROCLIM enumMem nil nil +%LCLsort ENOTEMPTY enumMem nil nil +%LCLsort EHOSTUNREACH enumMem nil nil +%LCLsort EHOSTDOWN enumMem nil nil +%LCLsort ENAMETOOLONG enumMem nil nil +%LCLsort ELOOP enumMem nil nil +%LCLsort ECONNREFUSED enumMem nil nil +%LCLsort ETIMEDOUT enumMem nil nil +%LCLsort ETOOMANYREFS enumMem nil nil +%LCLsort ESHUTDOWN enumMem nil nil +%LCLsort ENOTCONN enumMem nil nil +%LCLsort EISCONN enumMem nil nil +%LCLsort ENOBUFS enumMem nil nil +%LCLsort ECONNRESET enumMem nil nil +%LCLsort ECONNABORTED enumMem nil nil +%LCLsort ENETRESET enumMem nil nil +%LCLsort ENETUNREACH enumMem nil nil +%LCLsort ENETDOWN enumMem nil nil +%LCLsort EADDRNOTAVAIL enumMem nil nil +%LCLsort EADDRINUSE enumMem nil nil +%LCLsort EAFNOSUPPORT enumMem nil nil +%LCLsort EPFNOSUPPORT enumMem nil nil +%LCLsort EOPNOTSUPP enumMem nil nil +%LCLsort ESOCKTNOSUPPORT enumMem nil nil +%LCLsort EPROTONOSUPPORT enumMem nil nil +%LCLsort ENOPROTOOPT enumMem nil nil +%LCLsort EPROTOTYPE enumMem nil nil +%LCLsort EMSGSIZE enumMem nil nil +%LCLsort EDESTADDRREQ enumMem nil nil +%LCLsort ENOTSOCK enumMem nil nil +%LCLsort EALREADY enumMem nil nil +%LCLsort EINPROGRESS enumMem nil nil +%LCLsort EWOULDBLOCK enumMem nil nil +%LCLsort ERANGE enumMem nil nil +%LCLsort EDOM enumMem nil nil +%LCLsort EPIPE enumMem nil nil +%LCLsort EMLINK enumMem nil nil +%LCLsort EROFS enumMem nil nil +%LCLsort ESPIPE enumMem nil nil +%LCLsort ENOSPC enumMem nil nil +%LCLsort EFBIG enumMem nil nil +%LCLsort ETXTBSY enumMem nil nil +%LCLsort ENOTTY enumMem nil nil +%LCLsort EMFILE enumMem nil nil +%LCLsort ENFILE enumMem nil nil +%LCLsort EINVAL enumMem nil nil +%LCLsort EISDIR enumMem nil nil +%LCLsort ENOTDIR enumMem nil nil +%LCLsort ENODEV enumMem nil nil +%LCLsort EXDEV enumMem nil nil +%LCLsort EEXIST enumMem nil nil +%LCLsort EBUSY enumMem nil nil +%LCLsort ENOTBLK enumMem nil nil +%LCLsort EFAULT enumMem nil nil +%LCLsort EACCES enumMem nil nil +%LCLsort ENOMEM enumMem nil nil +%LCLsort EAGAIN enumMem nil nil +%LCLsort ECHILD enumMem nil nil +%LCLsort EBADF enumMem nil nil +%LCLsort ENOEXEC enumMem nil nil +%LCLsort E2BIG enumMem nil nil +%LCLsort ENXIO enumMem nil nil +%LCLsort EIO enumMem nil nil +%LCLsort EINTR enumMem nil nil +%LCLsort ESRCH enumMem nil nil +%LCLsort ENOENT enumMem nil nil +%LCLsort EPERM enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __eerrno0e_Enum_Obj obj _eerrno0e_Enum nil +%LCLsort _int_Obj obj int nil +%LCLsort _lconv_Struct str lconv nil +%LCLsort n_sign_posn strMem _char_Obj nil +%LCLsort p_sign_posn strMem _char_Obj nil +%LCLsort n_sep_by_space strMem _char_Obj nil +%LCLsort n_cs_precedes strMem _char_Obj nil +%LCLsort p_sep_by_space strMem _char_Obj nil +%LCLsort p_cs_precedes strMem _char_Obj nil +%LCLsort frac_digits strMem _char_Obj nil +%LCLsort int_frac_digits strMem _char_Obj nil +%LCLsort negative_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort positive_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort currency_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort int_curr_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil +%LCLsort _lconv_Struct_Tuple tup _lconv_Struct nil +%LCLsort __lconv_Struct_Ptr ptr _lconv_Struct nil +%LCLsort __lconv_Struct_Arr arr _lconv_Struct nil +%LCLsort __lconv_Struct_Tuple_Vec vec _lconv_Struct_Tuple __lconv_Struct_Arr +%LCLsort ___lconv synonym _lconv_Struct nil +%LCLsort _exception_Struct str exception nil +%LCLsort retval strMem _double_Obj nil +%LCLsort arg2 strMem _double_Obj nil +%LCLsort arg1 strMem _double_Obj nil +%LCLsort name strMem ___char_Obj_Ptr_Obj nil +%LCLsort ttype strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _double_Obj obj double nil +%LCLsort _exception_Struct_Tuple tup _exception_Struct nil +%LCLsort __exception_Struct_Ptr ptr _exception_Struct nil +%LCLsort __exception_Struct_Arr arr _exception_Struct nil +%LCLsort __exception_Struct_Tuple_Vec vec _exception_Struct_Tuple __exception_Struct_Arr +%LCLsort ___exception synonym _exception_Struct nil +%LCLsort __int_Obj_Ptr ptr _int_Obj nil +%LCLsort __int_Obj_Arr arr _int_Obj nil +%LCLsort _int_Vec vec int __int_Obj_Arr +%LCLsort __double_Obj_Ptr ptr _double_Obj nil +%LCLsort __double_Obj_Arr arr _double_Obj nil +%LCLsort _double_Vec vec double __double_Obj_Arr +%LCLsort _emath1e_Enum enum emath1e nil +%LCLsort PLOSS enumMem nil nil +%LCLsort TLOSS enumMem nil nil +%LCLsort UNDERFLOW enumMem nil nil +%LCLsort OVERFLOW enumMem nil nil +%LCLsort SING enumMem nil nil +%LCLsort DOMAIN enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __emath1e_Enum_Obj obj _emath1e_Enum nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop ENOMSG : -> _eerrno0e_Enum +%LCLop mod :int, int -> int +%LCLop EIDRM : -> _eerrno0e_Enum +%LCLop min :int, int -> int +%LCLop EALIGN : -> _eerrno0e_Enum +%LCLop max :int, int -> int +%LCLop EDEADLK : -> _eerrno0e_Enum +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop ENOLCK : -> _eerrno0e_Enum +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop ENOSYS : -> _eerrno0e_Enum +%LCLop EACTIVE : -> _eerrno0e_Enum +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop ENOACTIVE : -> _eerrno0e_Enum +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop ENORESOURCES : -> _eerrno0e_Enum +%LCLop ENOSYSTEM : -> _eerrno0e_Enum +%LCLop ENODUST : -> _eerrno0e_Enum +%LCLop count :char, _char_Vec -> int +%LCLop EDUPNOCONN : -> _eerrno0e_Enum +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop EDUPNODISCONN : -> _eerrno0e_Enum +%LCLop init :_char_Vec -> _char_Vec +%LCLop EDUPNOTCNTD : -> _eerrno0e_Enum +%LCLop isEmpty :_char_Vec -> bool +%LCLop EDUPNOTIDLE : -> _eerrno0e_Enum +%LCLop last :_char_Vec -> char +%LCLop EDUPNOTWAIT : -> _eerrno0e_Enum +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop EDUPNOTRUN : -> _eerrno0e_Enum +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop EDUPBADOPCODE : -> _eerrno0e_Enum +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop EDUPINTRANSIT : -> _eerrno0e_Enum +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop EDUPTOOMANYCPUS : -> _eerrno0e_Enum +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop __ \select decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop lenStr :_char_Vec -> int +%LCLop __ \select thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop times10plus :int, int -> int +%LCLop __ \field_arrow decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop plus1 :int -> int +%LCLop __ \field_arrow thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_curr_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select int_curr_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 2 : -> int +%LCLop __ \field_arrow grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select currency_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select currency_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 3 : -> int +%LCLtag exception struct +%LCLop __ \field_arrow int_curr_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 4 : -> int +%LCLop __ \field_arrow currency_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 5 : -> int +%LCLop __ \field_arrow mon_decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 6 : -> int +%LCLop __ \field_arrow mon_thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select positive_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select positive_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 7 : -> int +%LCLop __ \field_arrow mon_grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select negative_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select negative_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 8 : -> int +%LCLop __ \field_arrow positive_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select int_frac_digits :_lconv_Struct -> _char_Obj +%LCLop 9 : -> int +%LCLop __ \field_arrow negative_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select frac_digits :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow int_frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select p_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select n_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \field_arrow n_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop { __ } :char -> _char_Vec +%LCLop EPERM : -> _eerrno0e_Enum +%LCLop ENOENT : -> _eerrno0e_Enum +%LCLop ESRCH : -> _eerrno0e_Enum +%LCLop EINTR : -> _eerrno0e_Enum +%LCLop __ \select ttype :_exception_Struct_Tuple -> int +%LCLop __ \select ttype :_exception_Struct -> _int_Obj +%LCLop EIO : -> _eerrno0e_Enum +%LCLop __ \select name :_exception_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select name :_exception_Struct -> ___char_Obj_Ptr_Obj +%LCLop ENXIO : -> _eerrno0e_Enum +%LCLop __ \field_arrow ttype :__exception_Struct_Ptr -> _int_Obj +%LCLop __ \select arg1 :_exception_Struct_Tuple -> double +%LCLop __ \select arg1 :_exception_Struct -> _double_Obj +%LCLop E2BIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow name :__exception_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select arg2 :_exception_Struct_Tuple -> double +%LCLop __ \select arg2 :_exception_Struct -> _double_Obj +%LCLop ENOEXEC : -> _eerrno0e_Enum +%LCLop __ \field_arrow arg1 :__exception_Struct_Ptr -> _double_Obj +%LCLop __ \select retval :_exception_Struct_Tuple -> double +%LCLop __ \select retval :_exception_Struct -> _double_Obj +%LCLop EBADF : -> _eerrno0e_Enum +%LCLop __ \field_arrow arg2 :__exception_Struct_Ptr -> _double_Obj +%LCLop ECHILD : -> _eerrno0e_Enum +%LCLop __ \field_arrow retval :__exception_Struct_Ptr -> _double_Obj +%LCLop EAGAIN : -> _eerrno0e_Enum +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [] :__lconv_Struct_Ptr -> __lconv_Struct_Arr +%LCLop __ [] :__exception_Struct_Ptr -> __exception_Struct_Arr +%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr +%LCLop __ [] :__double_Obj_Ptr -> __double_Obj_Arr +%LCLop ENOMEM : -> _eerrno0e_Enum +%LCLop EACCES : -> _eerrno0e_Enum +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ [__] :__lconv_Struct_Tuple_Vec, int -> _lconv_Struct_Tuple +%LCLop __ [__] :__lconv_Struct_Arr, int -> _lconv_Struct +%LCLop __ [__] :__exception_Struct_Tuple_Vec, int -> _exception_Struct_Tuple +%LCLop __ [__] :__exception_Struct_Arr, int -> _exception_Struct +%LCLop __ [__] :_int_Vec, int -> int +%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj +%LCLop __ [__] :_double_Vec, int -> double +%LCLop __ [__] :__double_Obj_Arr, int -> _double_Obj +%LCLop EFAULT : -> _eerrno0e_Enum +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop ENOTBLK : -> _eerrno0e_Enum +%LCLop EBUSY : -> _eerrno0e_Enum +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop [__, __, __, __, __] :double, double, double, __char_Obj_Ptr, int -> _exception_Struct_Tuple +%LCLop EEXIST : -> _eerrno0e_Enum +%LCLop EXDEV : -> _eerrno0e_Enum +%LCLop ENODEV : -> _eerrno0e_Enum +%LCLop ENOTDIR : -> _eerrno0e_Enum +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop EISDIR : -> _eerrno0e_Enum +%LCLop EINVAL : -> _eerrno0e_Enum +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop ENFILE : -> _eerrno0e_Enum +%LCLop EMFILE : -> _eerrno0e_Enum +%LCLop ENOTTY : -> _eerrno0e_Enum +%LCLop ETXTBSY : -> _eerrno0e_Enum +%LCLop null : -> char +%LCLop EFBIG : -> _eerrno0e_Enum +%LCLop ENOSPC : -> _eerrno0e_Enum +%LCLop ESPIPE : -> _eerrno0e_Enum +%LCLop EROFS : -> _eerrno0e_Enum +%LCLop EMLINK : -> _eerrno0e_Enum +%LCLop EPIPE : -> _eerrno0e_Enum +%LCLop EDOM : -> _eerrno0e_Enum +%LCLop ERANGE : -> _eerrno0e_Enum +%LCLop EWOULDBLOCK : -> _eerrno0e_Enum +%LCLop EINPROGRESS : -> _eerrno0e_Enum +%LCLop EALREADY : -> _eerrno0e_Enum +%LCLop ENOTSOCK : -> _eerrno0e_Enum +%LCLop EDESTADDRREQ : -> _eerrno0e_Enum +%LCLop EMSGSIZE : -> _eerrno0e_Enum +%LCLop EPROTOTYPE : -> _eerrno0e_Enum +%LCLop ENOPROTOOPT : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] :char, char, char, char, char, char, char, char, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr -> _lconv_Struct_Tuple +%LCLop EPROTONOSUPPORT : -> _eerrno0e_Enum +%LCLop ESOCKTNOSUPPORT : -> _eerrno0e_Enum +%LCLop EOPNOTSUPP : -> _eerrno0e_Enum +%LCLop EPFNOSUPPORT : -> _eerrno0e_Enum +%LCLop EAFNOSUPPORT : -> _eerrno0e_Enum +%LCLop EADDRINUSE : -> _eerrno0e_Enum +%LCLop EADDRNOTAVAIL : -> _eerrno0e_Enum +%LCLop NIL : -> __char_Obj_Ptr +%LCLop NIL : -> __lconv_Struct_Ptr +%LCLop NIL : -> __exception_Struct_Ptr +%LCLop NIL : -> __int_Obj_Ptr +%LCLop NIL : -> __double_Obj_Ptr +%LCLop ENETDOWN : -> _eerrno0e_Enum +%LCLop ENETUNREACH : -> _eerrno0e_Enum +%LCLop ENETRESET : -> _eerrno0e_Enum +%LCLop ECONNABORTED : -> _eerrno0e_Enum +%LCLop ECONNRESET : -> _eerrno0e_Enum +%LCLop ENOBUFS : -> _eerrno0e_Enum +%LCLop EISCONN : -> _eerrno0e_Enum +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop ENOTCONN : -> _eerrno0e_Enum +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ + __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ + __ :int, __lconv_Struct_Ptr -> __lconv_Struct_Ptr +%LCLop __ + __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ + __ :int, __exception_Struct_Ptr -> __exception_Struct_Ptr +%LCLop __ + __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ + __ :int, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ + __ :int, __double_Obj_Ptr -> __double_Obj_Ptr +%LCLop ESHUTDOWN : -> _eerrno0e_Enum +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop __ - __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ - __ :__lconv_Struct_Ptr, __lconv_Struct_Ptr -> int +%LCLop __ - __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ - __ :__exception_Struct_Ptr, __exception_Struct_Ptr -> int +%LCLop __ - __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ - __ :__int_Obj_Ptr, __int_Obj_Ptr -> int +%LCLop __ - __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ - __ :__double_Obj_Ptr, __double_Obj_Ptr -> int +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop sizeof :_eerrno0e_Enum -> int +%LCLop sizeof :_emath1e_Enum -> int +%LCLop DOMAIN : -> _emath1e_Enum +%LCLop ETOOMANYREFS : -> _eerrno0e_Enum +%LCLop SING : -> _emath1e_Enum +%LCLop ETIMEDOUT : -> _eerrno0e_Enum +%LCLop OVERFLOW : -> _emath1e_Enum +%LCLop ECONNREFUSED : -> _eerrno0e_Enum +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop isSub :__lconv_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__lconv_Struct_Arr, int -> bool +%LCLop isSub :__exception_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__exception_Struct_Arr, int -> bool +%LCLop isSub :_int_Vec, int -> bool +%LCLop isSub :__int_Obj_Arr, int -> bool +%LCLop isSub :_double_Vec, int -> bool +%LCLop isSub :__double_Obj_Arr, int -> bool +%LCLtag lconv struct +%LCLop UNDERFLOW : -> _emath1e_Enum +%LCLop ELOOP : -> _eerrno0e_Enum +%LCLop TLOSS : -> _emath1e_Enum +%LCLop ENAMETOOLONG : -> _eerrno0e_Enum +%LCLop PLOSS : -> _emath1e_Enum +%LCLop EHOSTDOWN : -> _eerrno0e_Enum +%LCLop EHOSTUNREACH : -> _eerrno0e_Enum +%LCLop ENOTEMPTY : -> _eerrno0e_Enum +%LCLop succ :int -> int +%LCLop EPROCLIM : -> _eerrno0e_Enum +%LCLop pred :int -> int +%LCLop EUSERS : -> _eerrno0e_Enum +%LCLop EDQUOT : -> _eerrno0e_Enum +%LCLop ESTALE : -> _eerrno0e_Enum +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop EREMOTE : -> _eerrno0e_Enum +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLvar errno _int_Obj +%LCLvar signgam _int_Obj +%LCLtype __exception ___exception exposed +%LCLfcn acos : double -> double +%LCLfcnGlobals +%LCLfcn acosh : double -> double +%LCLfcnGlobals +%LCLfcn asin : double -> double +%LCLfcnGlobals +%LCLfcn asinh : double -> double +%LCLfcnGlobals +%LCLfcn atan : double -> double +%LCLfcnGlobals +%LCLfcn atanh : double -> double +%LCLfcnGlobals +%LCLfcn atan2 : double, double -> double +%LCLfcnGlobals +%LCLfcn cbrt : double -> double +%LCLfcnGlobals +%LCLfcn ceil : double -> double +%LCLfcnGlobals +%LCLfcn cos : double -> double +%LCLfcnGlobals +%LCLfcn cosh : double -> double +%LCLfcnGlobals +%LCLfcn exp : double -> double +%LCLfcnGlobals +%LCLfcn fabs : double -> double +%LCLfcnGlobals +%LCLfcn floor : double -> double +%LCLfcnGlobals +%LCLfcn fmod : double, double -> double +%LCLfcnGlobals +%LCLfcn frexp : double, __int_Obj_Ptr -> double +%LCLfcnGlobals +%LCLfcn ldexp : double, int -> double +%LCLfcnGlobals +%LCLfcn log : double -> double +%LCLfcnGlobals +%LCLfcn log10 : double -> double +%LCLfcnGlobals +%LCLfcn modf : double, __double_Obj_Ptr -> double +%LCLfcnGlobals +%LCLfcn pow : double, double -> double +%LCLfcnGlobals +%LCLfcn rint : double -> double +%LCLfcnGlobals +%LCLfcn sin : double -> double +%LCLfcnGlobals +%LCLfcn sinh : double -> double +%LCLfcnGlobals +%LCLfcn sqrt : double -> double +%LCLfcnGlobals +%LCLfcn tan : double -> double +%LCLfcnGlobals +%LCLfcn tanh : double -> double +%LCLfcnGlobals +%LCLfcn trunc : double -> double +%LCLfcnGlobals +%LCLfcn j0 : double -> double +%LCLfcnGlobals +%LCLfcn j1 : double -> double +%LCLfcnGlobals +%LCLfcn jn : int, double -> double +%LCLfcnGlobals +%LCLfcn y0 : double -> double +%LCLfcnGlobals +%LCLfcn y1 : double -> double +%LCLfcnGlobals +%LCLfcn yn : int, double -> double +%LCLfcnGlobals +%LCLfcn erf : double -> double +%LCLfcnGlobals +%LCLfcn erfc : double -> double +%LCLfcnGlobals +%LCLfcn gamma : double -> double +%LCLfcnGlobals +%LCLfcn lgamma : double -> double +%LCLfcnGlobals +%LCLfcn hypot : double, double -> double +%LCLfcnGlobals +%LCLfcn isnan : -> int +%LCLfcnGlobals +%LCLfcn matherr : __exception_Struct_Ptr -> int +%LCLfcnGlobals +%LCLconst M_E double +%LCLconst M_LOG2E double +%LCLconst M_LOG10E double +%LCLconst M_LN2 double +%LCLconst M_LN10 double +%LCLconst M_PI double +%LCLconst M_PI_2 double +%LCLconst M_PI_4 double +%LCLconst M_1_PI double +%LCLconst M_2_PI double +%LCLconst M_2_SQRTPI double +%LCLconst M_SQRT2 double +%LCLconst M_SQRT1_2 double +%LCLconst MAXFLOAT double +%LCLconst HUGE double +%LCLenumConst DOMAIN _emath1e_Enum +%LCLenumConst SING _emath1e_Enum +%LCLenumConst OVERFLOW _emath1e_Enum +%LCLenumConst UNDERFLOW _emath1e_Enum +%LCLenumConst TLOSS _emath1e_Enum +%LCLenumConst PLOSS _emath1e_Enum +%LCLvar _matherrors __emath1e_Enum_Obj +%LCLSymbolTableEnd diff --git a/imports/setjmp.lcl b/imports/setjmp.lcl new file mode 100644 index 0000000..32c784e --- /dev/null +++ b/imports/setjmp.lcl @@ -0,0 +1,94 @@ +/* +** setjmp.h +*/ + +constant int JB_ONSIGSTK; +constant int JB_SIGMASK; +constant int JB_PC; +constant int JB_REGS; +constant int JB_ZERO; +constant int JB_MAGIC; +constant int JB_AT; +constant int JB_V0; +constant int JB_V1 ; +constant int JB_A0 ; +constant int JB_A1 ; +constant int JB_A2 ; +constant int JB_A3 ; +constant int JB_T0 ; +constant int JB_T1 ; +constant int JB_T2 ; +constant int JB_T3 ; +constant int JB_T4 ; +constant int JB_T5 ; +constant int JB_T6 ; +constant int JB_T7 ; +constant int JB_S0 ; +constant int JB_S1 ; +constant int JB_S2 ; +constant int JB_S3 ; +constant int JB_S4 ; +constant int JB_S5 ; +constant int JB_S6 ; +constant int JB_S7 ; +constant int JB_T8 ; +constant int JB_T9 ; +constant int JB_K0 ; +constant int JB_K1 ; +constant int JB_GP ; +constant int JB_SP ; +constant int JB_S8 ; +constant int JB_RA ; + +constant int JB_FREGS ; +constant int JB_F0 ; +constant int JB_F1 ; +constant int JB_F2 ; +constant int JB_F3 ; +constant int JB_F4 ; +constant int JB_F5 ; +constant int JB_F6 ; +constant int JB_F7 ; +constant int JB_F8 ; +constant int JB_F9 ; +constant int JB_F10 ; +constant int JB_F11 ; +constant int JB_F12 ; +constant int JB_F13 ; +constant int JB_F14 ; +constant int JB_F15 ; +constant int JB_F16 ; +constant int JB_F17 ; +constant int JB_F18 ; +constant int JB_F19 ; +constant int JB_F20 ; +constant int JB_F21 ; +constant int JB_F22 ; +constant int JB_F23 ; +constant int JB_F24 ; +constant int JB_F25 ; +constant int JB_F26 ; +constant int JB_F27 ; +constant int JB_F28 ; +constant int JB_F29 ; +constant int JB_F30 ; +constant int JB_F31 ; +constant int JB_FPC_CSR ; + +constant int SC_MDLO ; +constant int SC_MDHI ; + +constant int JB_FLAGS ; +constant int JBMAGIC ; + +constant int SIGCONTEXT_PAD; +constant int NJBREGS ; + +typedef int jmp_buf[]; +typedef int sigjmp_buf[]; + +void longjmp( jmp_buf __env, int __val ) { ensures true; } +int setjmp( jmp_buf __env ) { ensures true; } +int sigsetjmp(sigjmp_buf __env, int __savemask) { ensures true; } +void siglongjmp( sigjmp_buf __env, int __val) { ensures true; } + diff --git a/imports/setjmp.lcs b/imports/setjmp.lcs new file mode 100644 index 0000000..fd88c5b --- /dev/null +++ b/imports/setjmp.lcs @@ -0,0 +1,569 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _eerrno0e_Enum enum eerrno0e nil +%LCLsort EDUPTOOMANYCPUS enumMem nil nil +%LCLsort EDUPINTRANSIT enumMem nil nil +%LCLsort EDUPBADOPCODE enumMem nil nil +%LCLsort EDUPNOTRUN enumMem nil nil +%LCLsort EDUPNOTWAIT enumMem nil nil +%LCLsort EDUPNOTIDLE enumMem nil nil +%LCLsort EDUPNOTCNTD enumMem nil nil +%LCLsort EDUPNODISCONN enumMem nil nil +%LCLsort EDUPNOCONN enumMem nil nil +%LCLsort ENODUST enumMem nil nil +%LCLsort ENOSYSTEM enumMem nil nil +%LCLsort ENORESOURCES enumMem nil nil +%LCLsort ENOACTIVE enumMem nil nil +%LCLsort EACTIVE enumMem nil nil +%LCLsort ENOSYS enumMem nil nil +%LCLsort ENOLCK enumMem nil nil +%LCLsort EDEADLK enumMem nil nil +%LCLsort EALIGN enumMem nil nil +%LCLsort EIDRM enumMem nil nil +%LCLsort ENOMSG enumMem nil nil +%LCLsort EREMOTE enumMem nil nil +%LCLsort ESTALE enumMem nil nil +%LCLsort EDQUOT enumMem nil nil +%LCLsort EUSERS enumMem nil nil +%LCLsort EPROCLIM enumMem nil nil +%LCLsort ENOTEMPTY enumMem nil nil +%LCLsort EHOSTUNREACH enumMem nil nil +%LCLsort EHOSTDOWN enumMem nil nil +%LCLsort ENAMETOOLONG enumMem nil nil +%LCLsort ELOOP enumMem nil nil +%LCLsort ECONNREFUSED enumMem nil nil +%LCLsort ETIMEDOUT enumMem nil nil +%LCLsort ETOOMANYREFS enumMem nil nil +%LCLsort ESHUTDOWN enumMem nil nil +%LCLsort ENOTCONN enumMem nil nil +%LCLsort EISCONN enumMem nil nil +%LCLsort ENOBUFS enumMem nil nil +%LCLsort ECONNRESET enumMem nil nil +%LCLsort ECONNABORTED enumMem nil nil +%LCLsort ENETRESET enumMem nil nil +%LCLsort ENETUNREACH enumMem nil nil +%LCLsort ENETDOWN enumMem nil nil +%LCLsort EADDRNOTAVAIL enumMem nil nil +%LCLsort EADDRINUSE enumMem nil nil +%LCLsort EAFNOSUPPORT enumMem nil nil +%LCLsort EPFNOSUPPORT enumMem nil nil +%LCLsort EOPNOTSUPP enumMem nil nil +%LCLsort ESOCKTNOSUPPORT enumMem nil nil +%LCLsort EPROTONOSUPPORT enumMem nil nil +%LCLsort ENOPROTOOPT enumMem nil nil +%LCLsort EPROTOTYPE enumMem nil nil +%LCLsort EMSGSIZE enumMem nil nil +%LCLsort EDESTADDRREQ enumMem nil nil +%LCLsort ENOTSOCK enumMem nil nil +%LCLsort EALREADY enumMem nil nil +%LCLsort EINPROGRESS enumMem nil nil +%LCLsort EWOULDBLOCK enumMem nil nil +%LCLsort ERANGE enumMem nil nil +%LCLsort EDOM enumMem nil nil +%LCLsort EPIPE enumMem nil nil +%LCLsort EMLINK enumMem nil nil +%LCLsort EROFS enumMem nil nil +%LCLsort ESPIPE enumMem nil nil +%LCLsort ENOSPC enumMem nil nil +%LCLsort EFBIG enumMem nil nil +%LCLsort ETXTBSY enumMem nil nil +%LCLsort ENOTTY enumMem nil nil +%LCLsort EMFILE enumMem nil nil +%LCLsort ENFILE enumMem nil nil +%LCLsort EINVAL enumMem nil nil +%LCLsort EISDIR enumMem nil nil +%LCLsort ENOTDIR enumMem nil nil +%LCLsort ENODEV enumMem nil nil +%LCLsort EXDEV enumMem nil nil +%LCLsort EEXIST enumMem nil nil +%LCLsort EBUSY enumMem nil nil +%LCLsort ENOTBLK enumMem nil nil +%LCLsort EFAULT enumMem nil nil +%LCLsort EACCES enumMem nil nil +%LCLsort ENOMEM enumMem nil nil +%LCLsort EAGAIN enumMem nil nil +%LCLsort ECHILD enumMem nil nil +%LCLsort EBADF enumMem nil nil +%LCLsort ENOEXEC enumMem nil nil +%LCLsort E2BIG enumMem nil nil +%LCLsort ENXIO enumMem nil nil +%LCLsort EIO enumMem nil nil +%LCLsort EINTR enumMem nil nil +%LCLsort ESRCH enumMem nil nil +%LCLsort ENOENT enumMem nil nil +%LCLsort EPERM enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __eerrno0e_Enum_Obj obj _eerrno0e_Enum nil +%LCLsort _int_Obj obj int nil +%LCLsort _lconv_Struct str lconv nil +%LCLsort n_sign_posn strMem _char_Obj nil +%LCLsort p_sign_posn strMem _char_Obj nil +%LCLsort n_sep_by_space strMem _char_Obj nil +%LCLsort n_cs_precedes strMem _char_Obj nil +%LCLsort p_sep_by_space strMem _char_Obj nil +%LCLsort p_cs_precedes strMem _char_Obj nil +%LCLsort frac_digits strMem _char_Obj nil +%LCLsort int_frac_digits strMem _char_Obj nil +%LCLsort negative_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort positive_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort currency_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort int_curr_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil +%LCLsort _lconv_Struct_Tuple tup _lconv_Struct nil +%LCLsort __lconv_Struct_Ptr ptr _lconv_Struct nil +%LCLsort __lconv_Struct_Arr arr _lconv_Struct nil +%LCLsort __lconv_Struct_Tuple_Vec vec _lconv_Struct_Tuple __lconv_Struct_Arr +%LCLsort ___lconv synonym _lconv_Struct nil +%LCLsort _exception_Struct str exception nil +%LCLsort retval strMem _double_Obj nil +%LCLsort arg2 strMem _double_Obj nil +%LCLsort arg1 strMem _double_Obj nil +%LCLsort name strMem ___char_Obj_Ptr_Obj nil +%LCLsort ttype strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _double_Obj obj double nil +%LCLsort _exception_Struct_Tuple tup _exception_Struct nil +%LCLsort __exception_Struct_Ptr ptr _exception_Struct nil +%LCLsort __exception_Struct_Arr arr _exception_Struct nil +%LCLsort __exception_Struct_Tuple_Vec vec _exception_Struct_Tuple __exception_Struct_Arr +%LCLsort ___exception synonym _exception_Struct nil +%LCLsort __int_Obj_Ptr ptr _int_Obj nil +%LCLsort __int_Obj_Arr arr _int_Obj nil +%LCLsort _int_Vec vec int __int_Obj_Arr +%LCLsort __double_Obj_Ptr ptr _double_Obj nil +%LCLsort __double_Obj_Arr arr _double_Obj nil +%LCLsort _double_Vec vec double __double_Obj_Arr +%LCLsort _emath1e_Enum enum emath1e nil +%LCLsort PLOSS enumMem nil nil +%LCLsort TLOSS enumMem nil nil +%LCLsort UNDERFLOW enumMem nil nil +%LCLsort OVERFLOW enumMem nil nil +%LCLsort SING enumMem nil nil +%LCLsort DOMAIN enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __emath1e_Enum_Obj obj _emath1e_Enum nil +%LCLsort _jmp_buf synonym __int_Obj_Arr nil +%LCLsort _sigjmp_buf synonym __int_Obj_Arr nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop ENOMSG : -> _eerrno0e_Enum +%LCLop mod :int, int -> int +%LCLop EIDRM : -> _eerrno0e_Enum +%LCLop min :int, int -> int +%LCLop EALIGN : -> _eerrno0e_Enum +%LCLop max :int, int -> int +%LCLop EDEADLK : -> _eerrno0e_Enum +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop ENOLCK : -> _eerrno0e_Enum +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop ENOSYS : -> _eerrno0e_Enum +%LCLop EACTIVE : -> _eerrno0e_Enum +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop ENOACTIVE : -> _eerrno0e_Enum +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop ENORESOURCES : -> _eerrno0e_Enum +%LCLop ENOSYSTEM : -> _eerrno0e_Enum +%LCLop ENODUST : -> _eerrno0e_Enum +%LCLop count :char, _char_Vec -> int +%LCLop EDUPNOCONN : -> _eerrno0e_Enum +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop EDUPNODISCONN : -> _eerrno0e_Enum +%LCLop init :_char_Vec -> _char_Vec +%LCLop EDUPNOTCNTD : -> _eerrno0e_Enum +%LCLop isEmpty :_char_Vec -> bool +%LCLop EDUPNOTIDLE : -> _eerrno0e_Enum +%LCLop last :_char_Vec -> char +%LCLop EDUPNOTWAIT : -> _eerrno0e_Enum +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop EDUPNOTRUN : -> _eerrno0e_Enum +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop EDUPBADOPCODE : -> _eerrno0e_Enum +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop EDUPINTRANSIT : -> _eerrno0e_Enum +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop EDUPTOOMANYCPUS : -> _eerrno0e_Enum +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop __ \select decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop lenStr :_char_Vec -> int +%LCLop __ \select thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop times10plus :int, int -> int +%LCLop __ \field_arrow decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop plus1 :int -> int +%LCLop __ \field_arrow thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_curr_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select int_curr_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 2 : -> int +%LCLop __ \field_arrow grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select currency_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select currency_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 3 : -> int +%LCLtag exception struct +%LCLop __ \field_arrow int_curr_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 4 : -> int +%LCLop __ \field_arrow currency_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 5 : -> int +%LCLop __ \field_arrow mon_decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 6 : -> int +%LCLop __ \field_arrow mon_thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select positive_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select positive_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 7 : -> int +%LCLop __ \field_arrow mon_grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select negative_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select negative_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 8 : -> int +%LCLop __ \field_arrow positive_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select int_frac_digits :_lconv_Struct -> _char_Obj +%LCLop 9 : -> int +%LCLop __ \field_arrow negative_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select frac_digits :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow int_frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select p_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select n_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \field_arrow n_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop { __ } :char -> _char_Vec +%LCLop EPERM : -> _eerrno0e_Enum +%LCLop ENOENT : -> _eerrno0e_Enum +%LCLop ESRCH : -> _eerrno0e_Enum +%LCLop EINTR : -> _eerrno0e_Enum +%LCLop __ \select ttype :_exception_Struct_Tuple -> int +%LCLop __ \select ttype :_exception_Struct -> _int_Obj +%LCLop EIO : -> _eerrno0e_Enum +%LCLop __ \select name :_exception_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select name :_exception_Struct -> ___char_Obj_Ptr_Obj +%LCLop ENXIO : -> _eerrno0e_Enum +%LCLop __ \field_arrow ttype :__exception_Struct_Ptr -> _int_Obj +%LCLop __ \select arg1 :_exception_Struct_Tuple -> double +%LCLop __ \select arg1 :_exception_Struct -> _double_Obj +%LCLop E2BIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow name :__exception_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select arg2 :_exception_Struct_Tuple -> double +%LCLop __ \select arg2 :_exception_Struct -> _double_Obj +%LCLop ENOEXEC : -> _eerrno0e_Enum +%LCLop __ \field_arrow arg1 :__exception_Struct_Ptr -> _double_Obj +%LCLop __ \select retval :_exception_Struct_Tuple -> double +%LCLop __ \select retval :_exception_Struct -> _double_Obj +%LCLop EBADF : -> _eerrno0e_Enum +%LCLop __ \field_arrow arg2 :__exception_Struct_Ptr -> _double_Obj +%LCLop ECHILD : -> _eerrno0e_Enum +%LCLop __ \field_arrow retval :__exception_Struct_Ptr -> _double_Obj +%LCLop EAGAIN : -> _eerrno0e_Enum +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [] :__lconv_Struct_Ptr -> __lconv_Struct_Arr +%LCLop __ [] :__exception_Struct_Ptr -> __exception_Struct_Arr +%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr +%LCLop __ [] :__double_Obj_Ptr -> __double_Obj_Arr +%LCLop ENOMEM : -> _eerrno0e_Enum +%LCLop EACCES : -> _eerrno0e_Enum +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ [__] :__lconv_Struct_Tuple_Vec, int -> _lconv_Struct_Tuple +%LCLop __ [__] :__lconv_Struct_Arr, int -> _lconv_Struct +%LCLop __ [__] :__exception_Struct_Tuple_Vec, int -> _exception_Struct_Tuple +%LCLop __ [__] :__exception_Struct_Arr, int -> _exception_Struct +%LCLop __ [__] :_int_Vec, int -> int +%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj +%LCLop __ [__] :_double_Vec, int -> double +%LCLop __ [__] :__double_Obj_Arr, int -> _double_Obj +%LCLop EFAULT : -> _eerrno0e_Enum +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop ENOTBLK : -> _eerrno0e_Enum +%LCLop EBUSY : -> _eerrno0e_Enum +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop [__, __, __, __, __] :double, double, double, __char_Obj_Ptr, int -> _exception_Struct_Tuple +%LCLop EEXIST : -> _eerrno0e_Enum +%LCLop EXDEV : -> _eerrno0e_Enum +%LCLop ENODEV : -> _eerrno0e_Enum +%LCLop ENOTDIR : -> _eerrno0e_Enum +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop EISDIR : -> _eerrno0e_Enum +%LCLop EINVAL : -> _eerrno0e_Enum +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop ENFILE : -> _eerrno0e_Enum +%LCLop EMFILE : -> _eerrno0e_Enum +%LCLop ENOTTY : -> _eerrno0e_Enum +%LCLop ETXTBSY : -> _eerrno0e_Enum +%LCLop null : -> char +%LCLop EFBIG : -> _eerrno0e_Enum +%LCLop ENOSPC : -> _eerrno0e_Enum +%LCLop ESPIPE : -> _eerrno0e_Enum +%LCLop EROFS : -> _eerrno0e_Enum +%LCLop EMLINK : -> _eerrno0e_Enum +%LCLop EPIPE : -> _eerrno0e_Enum +%LCLop EDOM : -> _eerrno0e_Enum +%LCLop ERANGE : -> _eerrno0e_Enum +%LCLop EWOULDBLOCK : -> _eerrno0e_Enum +%LCLop EINPROGRESS : -> _eerrno0e_Enum +%LCLop EALREADY : -> _eerrno0e_Enum +%LCLop ENOTSOCK : -> _eerrno0e_Enum +%LCLop EDESTADDRREQ : -> _eerrno0e_Enum +%LCLop EMSGSIZE : -> _eerrno0e_Enum +%LCLop EPROTOTYPE : -> _eerrno0e_Enum +%LCLop ENOPROTOOPT : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] :char, char, char, char, char, char, char, char, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr -> _lconv_Struct_Tuple +%LCLop EPROTONOSUPPORT : -> _eerrno0e_Enum +%LCLop ESOCKTNOSUPPORT : -> _eerrno0e_Enum +%LCLop EOPNOTSUPP : -> _eerrno0e_Enum +%LCLop EPFNOSUPPORT : -> _eerrno0e_Enum +%LCLop EAFNOSUPPORT : -> _eerrno0e_Enum +%LCLop EADDRINUSE : -> _eerrno0e_Enum +%LCLop EADDRNOTAVAIL : -> _eerrno0e_Enum +%LCLop NIL : -> __char_Obj_Ptr +%LCLop NIL : -> __lconv_Struct_Ptr +%LCLop NIL : -> __exception_Struct_Ptr +%LCLop NIL : -> __int_Obj_Ptr +%LCLop NIL : -> __double_Obj_Ptr +%LCLop ENETDOWN : -> _eerrno0e_Enum +%LCLop ENETUNREACH : -> _eerrno0e_Enum +%LCLop ENETRESET : -> _eerrno0e_Enum +%LCLop ECONNABORTED : -> _eerrno0e_Enum +%LCLop ECONNRESET : -> _eerrno0e_Enum +%LCLop ENOBUFS : -> _eerrno0e_Enum +%LCLop EISCONN : -> _eerrno0e_Enum +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop ENOTCONN : -> _eerrno0e_Enum +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ + __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ + __ :int, __lconv_Struct_Ptr -> __lconv_Struct_Ptr +%LCLop __ + __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ + __ :int, __exception_Struct_Ptr -> __exception_Struct_Ptr +%LCLop __ + __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ + __ :int, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ + __ :int, __double_Obj_Ptr -> __double_Obj_Ptr +%LCLop ESHUTDOWN : -> _eerrno0e_Enum +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop __ - __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ - __ :__lconv_Struct_Ptr, __lconv_Struct_Ptr -> int +%LCLop __ - __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ - __ :__exception_Struct_Ptr, __exception_Struct_Ptr -> int +%LCLop __ - __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ - __ :__int_Obj_Ptr, __int_Obj_Ptr -> int +%LCLop __ - __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ - __ :__double_Obj_Ptr, __double_Obj_Ptr -> int +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop sizeof :_eerrno0e_Enum -> int +%LCLop sizeof :_emath1e_Enum -> int +%LCLop DOMAIN : -> _emath1e_Enum +%LCLop ETOOMANYREFS : -> _eerrno0e_Enum +%LCLop SING : -> _emath1e_Enum +%LCLop ETIMEDOUT : -> _eerrno0e_Enum +%LCLop OVERFLOW : -> _emath1e_Enum +%LCLop ECONNREFUSED : -> _eerrno0e_Enum +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop isSub :__lconv_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__lconv_Struct_Arr, int -> bool +%LCLop isSub :__exception_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__exception_Struct_Arr, int -> bool +%LCLop isSub :_int_Vec, int -> bool +%LCLop isSub :__int_Obj_Arr, int -> bool +%LCLop isSub :_double_Vec, int -> bool +%LCLop isSub :__double_Obj_Arr, int -> bool +%LCLtag lconv struct +%LCLop UNDERFLOW : -> _emath1e_Enum +%LCLop ELOOP : -> _eerrno0e_Enum +%LCLop TLOSS : -> _emath1e_Enum +%LCLop ENAMETOOLONG : -> _eerrno0e_Enum +%LCLop PLOSS : -> _emath1e_Enum +%LCLop EHOSTDOWN : -> _eerrno0e_Enum +%LCLop EHOSTUNREACH : -> _eerrno0e_Enum +%LCLop ENOTEMPTY : -> _eerrno0e_Enum +%LCLop succ :int -> int +%LCLop EPROCLIM : -> _eerrno0e_Enum +%LCLop pred :int -> int +%LCLop EUSERS : -> _eerrno0e_Enum +%LCLop EDQUOT : -> _eerrno0e_Enum +%LCLop ESTALE : -> _eerrno0e_Enum +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop EREMOTE : -> _eerrno0e_Enum +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLconst JB_ONSIGSTK int +%LCLconst JB_SIGMASK int +%LCLconst JB_PC int +%LCLconst JB_REGS int +%LCLconst JB_ZERO int +%LCLconst JB_MAGIC int +%LCLconst JB_AT int +%LCLconst JB_V0 int +%LCLconst JB_V1 int +%LCLconst JB_A0 int +%LCLconst JB_A1 int +%LCLconst JB_A2 int +%LCLconst JB_A3 int +%LCLconst JB_T0 int +%LCLconst JB_T1 int +%LCLconst JB_T2 int +%LCLconst JB_T3 int +%LCLconst JB_T4 int +%LCLconst JB_T5 int +%LCLconst JB_T6 int +%LCLconst JB_T7 int +%LCLconst JB_S0 int +%LCLconst JB_S1 int +%LCLconst JB_S2 int +%LCLconst JB_S3 int +%LCLconst JB_S4 int +%LCLconst JB_S5 int +%LCLconst JB_S6 int +%LCLconst JB_S7 int +%LCLconst JB_T8 int +%LCLconst JB_T9 int +%LCLconst JB_K0 int +%LCLconst JB_K1 int +%LCLconst JB_GP int +%LCLconst JB_SP int +%LCLconst JB_S8 int +%LCLconst JB_RA int +%LCLconst JB_FREGS int +%LCLconst JB_F0 int +%LCLconst JB_F1 int +%LCLconst JB_F2 int +%LCLconst JB_F3 int +%LCLconst JB_F4 int +%LCLconst JB_F5 int +%LCLconst JB_F6 int +%LCLconst JB_F7 int +%LCLconst JB_F8 int +%LCLconst JB_F9 int +%LCLconst JB_F10 int +%LCLconst JB_F11 int +%LCLconst JB_F12 int +%LCLconst JB_F13 int +%LCLconst JB_F14 int +%LCLconst JB_F15 int +%LCLconst JB_F16 int +%LCLconst JB_F17 int +%LCLconst JB_F18 int +%LCLconst JB_F19 int +%LCLconst JB_F20 int +%LCLconst JB_F21 int +%LCLconst JB_F22 int +%LCLconst JB_F23 int +%LCLconst JB_F24 int +%LCLconst JB_F25 int +%LCLconst JB_F26 int +%LCLconst JB_F27 int +%LCLconst JB_F28 int +%LCLconst JB_F29 int +%LCLconst JB_F30 int +%LCLconst JB_F31 int +%LCLconst JB_FPC_CSR int +%LCLconst SC_MDLO int +%LCLconst SC_MDHI int +%LCLconst JB_FLAGS int +%LCLconst JBMAGIC int +%LCLconst SIGCONTEXT_PAD int +%LCLconst NJBREGS int +%LCLtype jmp_buf _jmp_buf exposed +%LCLtype sigjmp_buf _sigjmp_buf exposed +%LCLfcn longjmp : __int_Obj_Arr, int -> void +%LCLfcnGlobals +%LCLfcn setjmp : __int_Obj_Arr -> int +%LCLfcnGlobals +%LCLfcn sigsetjmp : __int_Obj_Arr, int -> int +%LCLfcnGlobals +%LCLfcn siglongjmp : __int_Obj_Arr, int -> void +%LCLfcnGlobals +%LCLSymbolTableEnd diff --git a/imports/signal.lcl b/imports/signal.lcl new file mode 100644 index 0000000..cfa360d --- /dev/null +++ b/imports/signal.lcl @@ -0,0 +1,167 @@ +/* +** signal.h +*/ + +constant int NSIG; + +constant int SIGHUP; +constant int SIGINT; +constant int SIGQUIT; +constant int SIGILL; + + +constant int ILL_RESAD_FAULT; +constant int ILL_PRIVIN_FAULT; +constant int ILL_RESOP_FAULT; +constant int ILL_VECOP_FAULT; +constant int ILL_VECINST_FAULT; + + + + +constant int SIGTRAP; +constant int SIGIOT; +constant int SIGEMT; +constant int SIGFPE; + + +constant int FPE_INTOVF_TRAP; +constant int FPE_INTDIV_TRAP; +constant int FPE_FLTOVF_TRAP; +constant int FPE_FLTDIV_TRAP; +constant int FPE_FLTUND_TRAP; +constant int FPE_DECOVF_TRAP; +constant int FPE_SUBRNG_TRAP; +constant int FPE_FLTOVF_FAULT; +constant int FPE_FLTDIV_FAULT; +constant int FPE_FLTUND_FAULT; + + + +constant int FPE_VECTOR ; +constant int VFPE_FLTUND_TRAP ; +constant int VFPE_FLTDIV_TRAP ; +constant int VFPE_FLTRSV_TRAP ; +constant int VPFE_FLTOVF_FAULT ; +constant int VFPE_INTOVF_TRAP ; + + +constant int SIGKILL ; +constant int SIGBUS ; +constant int SIGSEGV ; +constant int SIGSYS ; +constant int SIGPIPE ; +constant int SIGALRM ; +constant int SIGTERM ; + + +constant int TERM_VECT_HARD ; +constant int TERM_VECT_TOOMANY ; + + +constant int SIGURG ; +constant int SIGSTOP ; +constant int SIGTSTP ; +constant int SIGCONT ; +constant int SIGCHLD ; +constant int SIGTTIN ; +constant int SIGTTOU ; +constant int SIGIO ; +constant int SIGXCPU ; +constant int SIGXFSZ ; +constant int SIGVTALRM ; +constant int SIGPROF ; +constant int SIGWINCH ; +constant int SIGLOST ; +constant int SIGUSR1 ; +constant int SIGUSR2 ; + +constant int SIGCLD ; +constant int SIGABRT; + +constant int BRK_USERBP ; +constant int BRK_KERNELBP ; +constant int BRK_ABORT ; +constant int BRK_BD_TAKEN ; +constant int BRK_BD_NOTTAKEN ; +constant int BRK_SSTEPBP ; +constant int BRK_OVERFLOW ; +constant int BRK_DIVZERO; +constant int BRK_RANGE ; +constant int BRK_STACKOVERFLOW; + +typedef long sig_atomic_t; +typedef int sigset_t; + +typedef struct sigvec { + void (*sv_handler)(); + sigset_t sv_mask; + int sv_flags; +} __sigvec; + +typedef struct sigaction { + void (*sa_handler)(); + sigset_t sa_mask; + int sa_flags; +} __sigaction; + +constant int SV_ONSTACK ; +constant int SV_INTERRUPT ; + +constant int SA_NOCLDSTOP ; + +constant int SV_OLDSIG ; +constant int sv_onstack ; + +constant int SIG_BLOCK ; +constant int SIG_UNBLOCK ; +constant int SIG_SETMASK ; + +typedef struct sigstack { + char *ss_sp; + int ss_onstack; +} __sigstack ; + +typedef struct sigcontext { + int sc_onstack; + int sc_mask; + int sc_pc; + int sc_regs[32]; + int sc_mdlo; + int sc_mdhi; + int sc_ownedfp; + int sc_fpregs[32]; + int sc_fpc_csr; + int sc_fpc_eir; + int sc_cause; + int sc_badvaddr; + int sc_badpaddr; +} __sigcontext; + +typedef void(*__scp)(int); + +constant __scp BADSIG; +constant __scp SIG_ERR; +constant __scp SIG_DFL; +constant __scp SIG_IGN; + +typedef int pid_t; + +/* + void (*signal(int __sig, void(*__func)(int)))(int) { ensures true; } +*/ +int raise( int __sig ) { ensures true; } +int kill( pid_t __pid, int __sig ) { ensures true; } +int sigemptyset( sigset_t *__set ) { ensures true; } +int sigfillset( sigset_t *__set ) { ensures true; } +int sigaddset( sigset_t *__set, int __signo ) { ensures true; } +int sigdelset( sigset_t *__set, int __signo ) { ensures true; } +int sigismember( sigset_t *__set, int __signo ) { ensures true; } +int sigaction( int __sig, struct sigaction *__act, + struct sigaction *__oact ) { ensures true; } +int sigprocmask( int __how, sigset_t *__set, sigset_t *__oset ) { ensures true; } +int sigpending( sigset_t *__set ) { ensures true; } +int sigsuspend( sigset_t *__sigmask ) { ensures true; } + +int sigmask(int m) { ensures true; } /* i think...? */ + diff --git a/imports/signal.lcs b/imports/signal.lcs new file mode 100644 index 0000000..42dd31c --- /dev/null +++ b/imports/signal.lcs @@ -0,0 +1,761 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _eerrno0e_Enum enum eerrno0e nil +%LCLsort EDUPTOOMANYCPUS enumMem nil nil +%LCLsort EDUPINTRANSIT enumMem nil nil +%LCLsort EDUPBADOPCODE enumMem nil nil +%LCLsort EDUPNOTRUN enumMem nil nil +%LCLsort EDUPNOTWAIT enumMem nil nil +%LCLsort EDUPNOTIDLE enumMem nil nil +%LCLsort EDUPNOTCNTD enumMem nil nil +%LCLsort EDUPNODISCONN enumMem nil nil +%LCLsort EDUPNOCONN enumMem nil nil +%LCLsort ENODUST enumMem nil nil +%LCLsort ENOSYSTEM enumMem nil nil +%LCLsort ENORESOURCES enumMem nil nil +%LCLsort ENOACTIVE enumMem nil nil +%LCLsort EACTIVE enumMem nil nil +%LCLsort ENOSYS enumMem nil nil +%LCLsort ENOLCK enumMem nil nil +%LCLsort EDEADLK enumMem nil nil +%LCLsort EALIGN enumMem nil nil +%LCLsort EIDRM enumMem nil nil +%LCLsort ENOMSG enumMem nil nil +%LCLsort EREMOTE enumMem nil nil +%LCLsort ESTALE enumMem nil nil +%LCLsort EDQUOT enumMem nil nil +%LCLsort EUSERS enumMem nil nil +%LCLsort EPROCLIM enumMem nil nil +%LCLsort ENOTEMPTY enumMem nil nil +%LCLsort EHOSTUNREACH enumMem nil nil +%LCLsort EHOSTDOWN enumMem nil nil +%LCLsort ENAMETOOLONG enumMem nil nil +%LCLsort ELOOP enumMem nil nil +%LCLsort ECONNREFUSED enumMem nil nil +%LCLsort ETIMEDOUT enumMem nil nil +%LCLsort ETOOMANYREFS enumMem nil nil +%LCLsort ESHUTDOWN enumMem nil nil +%LCLsort ENOTCONN enumMem nil nil +%LCLsort EISCONN enumMem nil nil +%LCLsort ENOBUFS enumMem nil nil +%LCLsort ECONNRESET enumMem nil nil +%LCLsort ECONNABORTED enumMem nil nil +%LCLsort ENETRESET enumMem nil nil +%LCLsort ENETUNREACH enumMem nil nil +%LCLsort ENETDOWN enumMem nil nil +%LCLsort EADDRNOTAVAIL enumMem nil nil +%LCLsort EADDRINUSE enumMem nil nil +%LCLsort EAFNOSUPPORT enumMem nil nil +%LCLsort EPFNOSUPPORT enumMem nil nil +%LCLsort EOPNOTSUPP enumMem nil nil +%LCLsort ESOCKTNOSUPPORT enumMem nil nil +%LCLsort EPROTONOSUPPORT enumMem nil nil +%LCLsort ENOPROTOOPT enumMem nil nil +%LCLsort EPROTOTYPE enumMem nil nil +%LCLsort EMSGSIZE enumMem nil nil +%LCLsort EDESTADDRREQ enumMem nil nil +%LCLsort ENOTSOCK enumMem nil nil +%LCLsort EALREADY enumMem nil nil +%LCLsort EINPROGRESS enumMem nil nil +%LCLsort EWOULDBLOCK enumMem nil nil +%LCLsort ERANGE enumMem nil nil +%LCLsort EDOM enumMem nil nil +%LCLsort EPIPE enumMem nil nil +%LCLsort EMLINK enumMem nil nil +%LCLsort EROFS enumMem nil nil +%LCLsort ESPIPE enumMem nil nil +%LCLsort ENOSPC enumMem nil nil +%LCLsort EFBIG enumMem nil nil +%LCLsort ETXTBSY enumMem nil nil +%LCLsort ENOTTY enumMem nil nil +%LCLsort EMFILE enumMem nil nil +%LCLsort ENFILE enumMem nil nil +%LCLsort EINVAL enumMem nil nil +%LCLsort EISDIR enumMem nil nil +%LCLsort ENOTDIR enumMem nil nil +%LCLsort ENODEV enumMem nil nil +%LCLsort EXDEV enumMem nil nil +%LCLsort EEXIST enumMem nil nil +%LCLsort EBUSY enumMem nil nil +%LCLsort ENOTBLK enumMem nil nil +%LCLsort EFAULT enumMem nil nil +%LCLsort EACCES enumMem nil nil +%LCLsort ENOMEM enumMem nil nil +%LCLsort EAGAIN enumMem nil nil +%LCLsort ECHILD enumMem nil nil +%LCLsort EBADF enumMem nil nil +%LCLsort ENOEXEC enumMem nil nil +%LCLsort E2BIG enumMem nil nil +%LCLsort ENXIO enumMem nil nil +%LCLsort EIO enumMem nil nil +%LCLsort EINTR enumMem nil nil +%LCLsort ESRCH enumMem nil nil +%LCLsort ENOENT enumMem nil nil +%LCLsort EPERM enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __eerrno0e_Enum_Obj obj _eerrno0e_Enum nil +%LCLsort _int_Obj obj int nil +%LCLsort _lconv_Struct str lconv nil +%LCLsort n_sign_posn strMem _char_Obj nil +%LCLsort p_sign_posn strMem _char_Obj nil +%LCLsort n_sep_by_space strMem _char_Obj nil +%LCLsort n_cs_precedes strMem _char_Obj nil +%LCLsort p_sep_by_space strMem _char_Obj nil +%LCLsort p_cs_precedes strMem _char_Obj nil +%LCLsort frac_digits strMem _char_Obj nil +%LCLsort int_frac_digits strMem _char_Obj nil +%LCLsort negative_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort positive_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort currency_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort int_curr_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil +%LCLsort _lconv_Struct_Tuple tup _lconv_Struct nil +%LCLsort __lconv_Struct_Ptr ptr _lconv_Struct nil +%LCLsort __lconv_Struct_Arr arr _lconv_Struct nil +%LCLsort __lconv_Struct_Tuple_Vec vec _lconv_Struct_Tuple __lconv_Struct_Arr +%LCLsort ___lconv synonym _lconv_Struct nil +%LCLsort _exception_Struct str exception nil +%LCLsort retval strMem _double_Obj nil +%LCLsort arg2 strMem _double_Obj nil +%LCLsort arg1 strMem _double_Obj nil +%LCLsort name strMem ___char_Obj_Ptr_Obj nil +%LCLsort ttype strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _double_Obj obj double nil +%LCLsort _exception_Struct_Tuple tup _exception_Struct nil +%LCLsort __exception_Struct_Ptr ptr _exception_Struct nil +%LCLsort __exception_Struct_Arr arr _exception_Struct nil +%LCLsort __exception_Struct_Tuple_Vec vec _exception_Struct_Tuple __exception_Struct_Arr +%LCLsort ___exception synonym _exception_Struct nil +%LCLsort __int_Obj_Ptr ptr _int_Obj nil +%LCLsort __int_Obj_Arr arr _int_Obj nil +%LCLsort _int_Vec vec int __int_Obj_Arr +%LCLsort __double_Obj_Ptr ptr _double_Obj nil +%LCLsort __double_Obj_Arr arr _double_Obj nil +%LCLsort _double_Vec vec double __double_Obj_Arr +%LCLsort _emath1e_Enum enum emath1e nil +%LCLsort PLOSS enumMem nil nil +%LCLsort TLOSS enumMem nil nil +%LCLsort UNDERFLOW enumMem nil nil +%LCLsort OVERFLOW enumMem nil nil +%LCLsort SING enumMem nil nil +%LCLsort DOMAIN enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __emath1e_Enum_Obj obj _emath1e_Enum nil +%LCLsort _jmp_buf synonym __int_Obj_Arr nil +%LCLsort _sigjmp_buf synonym __int_Obj_Arr nil +%LCLsort _sig_atomic_t synonym int nil +%LCLsort _sigset_t synonym int nil +%LCLsort _sigvec_Struct str sigvec nil +%LCLsort sv_flags strMem _int_Obj nil +%LCLsort sv_mask strMem _int_Obj nil +%LCLsort sv_handler strMem _HOF_sort_43 nil +%LCLsort strEnd nil nil nil +%LCLsort _HOF_sort_43 hof nil nil +%LCLsort _sigvec_Struct_Tuple tup _sigvec_Struct nil +%LCLsort __sigvec_Struct_Ptr ptr _sigvec_Struct nil +%LCLsort __sigvec_Struct_Arr arr _sigvec_Struct nil +%LCLsort __sigvec_Struct_Tuple_Vec vec _sigvec_Struct_Tuple __sigvec_Struct_Arr +%LCLsort ___sigvec synonym _sigvec_Struct nil +%LCLsort _sigaction_Struct str sigaction nil +%LCLsort sa_flags strMem _int_Obj nil +%LCLsort sa_mask strMem _int_Obj nil +%LCLsort sa_handler strMem _HOF_sort_50 nil +%LCLsort strEnd nil nil nil +%LCLsort _HOF_sort_50 hof nil nil +%LCLsort _sigaction_Struct_Tuple tup _sigaction_Struct nil +%LCLsort __sigaction_Struct_Ptr ptr _sigaction_Struct nil +%LCLsort __sigaction_Struct_Arr arr _sigaction_Struct nil +%LCLsort __sigaction_Struct_Tuple_Vec vec _sigaction_Struct_Tuple __sigaction_Struct_Arr +%LCLsort ___sigaction synonym _sigaction_Struct nil +%LCLsort _sigstack_Struct str sigstack nil +%LCLsort ss_onstack strMem _int_Obj nil +%LCLsort ss_sp strMem ___char_Obj_Ptr_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sigstack_Struct_Tuple tup _sigstack_Struct nil +%LCLsort __sigstack_Struct_Ptr ptr _sigstack_Struct nil +%LCLsort __sigstack_Struct_Arr arr _sigstack_Struct nil +%LCLsort __sigstack_Struct_Tuple_Vec vec _sigstack_Struct_Tuple __sigstack_Struct_Arr +%LCLsort ___sigstack synonym _sigstack_Struct nil +%LCLsort _sigcontext_Struct str sigcontext nil +%LCLsort sc_badpaddr strMem _int_Obj nil +%LCLsort sc_badvaddr strMem _int_Obj nil +%LCLsort sc_cause strMem _int_Obj nil +%LCLsort sc_fpc_eir strMem _int_Obj nil +%LCLsort sc_fpc_csr strMem _int_Obj nil +%LCLsort sc_fpregs strMem __int_Obj_Arr nil +%LCLsort sc_ownedfp strMem _int_Obj nil +%LCLsort sc_mdhi strMem _int_Obj nil +%LCLsort sc_mdlo strMem _int_Obj nil +%LCLsort sc_regs strMem __int_Obj_Arr nil +%LCLsort sc_pc strMem _int_Obj nil +%LCLsort sc_mask strMem _int_Obj nil +%LCLsort sc_onstack strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sigcontext_Struct_Tuple tup _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Ptr ptr _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Arr arr _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Tuple_Vec vec _sigcontext_Struct_Tuple __sigcontext_Struct_Arr +%LCLsort ___sigcontext synonym _sigcontext_Struct nil +%LCLsort _HOF_sort_68 hof nil nil +%LCLsort ___scp synonym _HOF_sort_68 nil +%LCLsort _pid_t synonym int nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop __ \field_arrow sc_badvaddr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop ENOMSG : -> _eerrno0e_Enum +%LCLop mod :int, int -> int +%LCLop __ \field_arrow sc_badpaddr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop EIDRM : -> _eerrno0e_Enum +%LCLop min :int, int -> int +%LCLop EALIGN : -> _eerrno0e_Enum +%LCLop max :int, int -> int +%LCLop EDEADLK : -> _eerrno0e_Enum +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop ENOLCK : -> _eerrno0e_Enum +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop ENOSYS : -> _eerrno0e_Enum +%LCLop EACTIVE : -> _eerrno0e_Enum +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop ENOACTIVE : -> _eerrno0e_Enum +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop ENORESOURCES : -> _eerrno0e_Enum +%LCLop ENOSYSTEM : -> _eerrno0e_Enum +%LCLop ENODUST : -> _eerrno0e_Enum +%LCLop count :char, _char_Vec -> int +%LCLop EDUPNOCONN : -> _eerrno0e_Enum +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop EDUPNODISCONN : -> _eerrno0e_Enum +%LCLop init :_char_Vec -> _char_Vec +%LCLop EDUPNOTCNTD : -> _eerrno0e_Enum +%LCLop isEmpty :_char_Vec -> bool +%LCLop EDUPNOTIDLE : -> _eerrno0e_Enum +%LCLop last :_char_Vec -> char +%LCLop EDUPNOTWAIT : -> _eerrno0e_Enum +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop EDUPNOTRUN : -> _eerrno0e_Enum +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop EDUPBADOPCODE : -> _eerrno0e_Enum +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop EDUPINTRANSIT : -> _eerrno0e_Enum +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop EDUPTOOMANYCPUS : -> _eerrno0e_Enum +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop __ \select decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop lenStr :_char_Vec -> int +%LCLop __ \select thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop times10plus :int, int -> int +%LCLop __ \field_arrow decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop plus1 :int -> int +%LCLop __ \field_arrow thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_curr_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select int_curr_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 2 : -> int +%LCLop __ \field_arrow grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select currency_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select currency_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 3 : -> int +%LCLtag exception struct +%LCLop __ \field_arrow int_curr_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 4 : -> int +%LCLop __ \field_arrow currency_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 5 : -> int +%LCLop __ \field_arrow mon_decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 6 : -> int +%LCLop __ \field_arrow mon_thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select positive_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select positive_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 7 : -> int +%LCLop __ \field_arrow mon_grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select negative_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select negative_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 8 : -> int +%LCLtag sigvec struct +%LCLop __ \field_arrow positive_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select int_frac_digits :_lconv_Struct -> _char_Obj +%LCLop 9 : -> int +%LCLop __ \field_arrow negative_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select frac_digits :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow int_frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select p_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select n_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \field_arrow n_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLtag sigaction struct +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop { __ } :char -> _char_Vec +%LCLop EPERM : -> _eerrno0e_Enum +%LCLop ENOENT : -> _eerrno0e_Enum +%LCLop ESRCH : -> _eerrno0e_Enum +%LCLop EINTR : -> _eerrno0e_Enum +%LCLop __ \select ttype :_exception_Struct_Tuple -> int +%LCLop __ \select ttype :_exception_Struct -> _int_Obj +%LCLop EIO : -> _eerrno0e_Enum +%LCLop __ \select name :_exception_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select name :_exception_Struct -> ___char_Obj_Ptr_Obj +%LCLop ENXIO : -> _eerrno0e_Enum +%LCLop __ \field_arrow ttype :__exception_Struct_Ptr -> _int_Obj +%LCLop __ \select arg1 :_exception_Struct_Tuple -> double +%LCLop __ \select arg1 :_exception_Struct -> _double_Obj +%LCLop E2BIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow name :__exception_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select arg2 :_exception_Struct_Tuple -> double +%LCLop __ \select arg2 :_exception_Struct -> _double_Obj +%LCLop ENOEXEC : -> _eerrno0e_Enum +%LCLop __ \field_arrow arg1 :__exception_Struct_Ptr -> _double_Obj +%LCLop __ \select retval :_exception_Struct_Tuple -> double +%LCLop __ \select retval :_exception_Struct -> _double_Obj +%LCLop EBADF : -> _eerrno0e_Enum +%LCLop __ \select sv_handler :_sigvec_Struct_Tuple -> _HOF_sort_43 +%LCLop __ \select sv_handler :_sigvec_Struct -> _HOF_sort_43 +%LCLop __ \field_arrow arg2 :__exception_Struct_Ptr -> _double_Obj +%LCLop ECHILD : -> _eerrno0e_Enum +%LCLop [__, __] :int, __char_Obj_Ptr -> _sigstack_Struct_Tuple +%LCLop __ \select sv_mask :_sigvec_Struct_Tuple -> int +%LCLop __ \select sv_mask :_sigvec_Struct -> _int_Obj +%LCLop __ \field_arrow retval :__exception_Struct_Ptr -> _double_Obj +%LCLop EAGAIN : -> _eerrno0e_Enum +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [] :__lconv_Struct_Ptr -> __lconv_Struct_Arr +%LCLop __ [] :__exception_Struct_Ptr -> __exception_Struct_Arr +%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr +%LCLop __ [] :__double_Obj_Ptr -> __double_Obj_Arr +%LCLop __ [] :__sigvec_Struct_Ptr -> __sigvec_Struct_Arr +%LCLop __ [] :__sigaction_Struct_Ptr -> __sigaction_Struct_Arr +%LCLop __ [] :__sigstack_Struct_Ptr -> __sigstack_Struct_Arr +%LCLop __ [] :__sigcontext_Struct_Ptr -> __sigcontext_Struct_Arr +%LCLop __ \field_arrow sv_handler :__sigvec_Struct_Ptr -> _HOF_sort_43 +%LCLop __ \select sv_flags :_sigvec_Struct_Tuple -> int +%LCLop __ \select sv_flags :_sigvec_Struct -> _int_Obj +%LCLop ENOMEM : -> _eerrno0e_Enum +%LCLtag sigstack struct +%LCLop __ \field_arrow sv_mask :__sigvec_Struct_Ptr -> _int_Obj +%LCLop [__, __, __] :int, int, _HOF_sort_43 -> _sigvec_Struct_Tuple +%LCLop [__, __, __] :int, int, _HOF_sort_50 -> _sigaction_Struct_Tuple +%LCLop EACCES : -> _eerrno0e_Enum +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ [__] :__lconv_Struct_Tuple_Vec, int -> _lconv_Struct_Tuple +%LCLop __ [__] :__lconv_Struct_Arr, int -> _lconv_Struct +%LCLop __ [__] :__exception_Struct_Tuple_Vec, int -> _exception_Struct_Tuple +%LCLop __ [__] :__exception_Struct_Arr, int -> _exception_Struct +%LCLop __ [__] :_int_Vec, int -> int +%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj +%LCLop __ [__] :_double_Vec, int -> double +%LCLop __ [__] :__double_Obj_Arr, int -> _double_Obj +%LCLop __ [__] :__sigvec_Struct_Tuple_Vec, int -> _sigvec_Struct_Tuple +%LCLop __ [__] :__sigvec_Struct_Arr, int -> _sigvec_Struct +%LCLop __ [__] :__sigaction_Struct_Tuple_Vec, int -> _sigaction_Struct_Tuple +%LCLop __ [__] :__sigaction_Struct_Arr, int -> _sigaction_Struct +%LCLop __ [__] :__sigstack_Struct_Tuple_Vec, int -> _sigstack_Struct_Tuple +%LCLop __ [__] :__sigstack_Struct_Arr, int -> _sigstack_Struct +%LCLop __ [__] :__sigcontext_Struct_Tuple_Vec, int -> _sigcontext_Struct_Tuple +%LCLop __ [__] :__sigcontext_Struct_Arr, int -> _sigcontext_Struct +%LCLop __ \field_arrow sv_flags :__sigvec_Struct_Ptr -> _int_Obj +%LCLop EFAULT : -> _eerrno0e_Enum +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop ENOTBLK : -> _eerrno0e_Enum +%LCLop EBUSY : -> _eerrno0e_Enum +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop [__, __, __, __, __] :double, double, double, __char_Obj_Ptr, int -> _exception_Struct_Tuple +%LCLop EEXIST : -> _eerrno0e_Enum +%LCLop EXDEV : -> _eerrno0e_Enum +%LCLop ENODEV : -> _eerrno0e_Enum +%LCLop ENOTDIR : -> _eerrno0e_Enum +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop EISDIR : -> _eerrno0e_Enum +%LCLop EINVAL : -> _eerrno0e_Enum +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop ENFILE : -> _eerrno0e_Enum +%LCLop __ \select sa_handler :_sigaction_Struct_Tuple -> _HOF_sort_50 +%LCLop __ \select sa_handler :_sigaction_Struct -> _HOF_sort_50 +%LCLop EMFILE : -> _eerrno0e_Enum +%LCLtag sigcontext struct +%LCLop __ \select sa_mask :_sigaction_Struct_Tuple -> int +%LCLop __ \select sa_mask :_sigaction_Struct -> _int_Obj +%LCLop ENOTTY : -> _eerrno0e_Enum +%LCLop __ \field_arrow sa_handler :__sigaction_Struct_Ptr -> _HOF_sort_50 +%LCLop __ \select sa_flags :_sigaction_Struct_Tuple -> int +%LCLop __ \select sa_flags :_sigaction_Struct -> _int_Obj +%LCLop ETXTBSY : -> _eerrno0e_Enum +%LCLop null : -> char +%LCLop __ \field_arrow sa_mask :__sigaction_Struct_Ptr -> _int_Obj +%LCLop EFBIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow sa_flags :__sigaction_Struct_Ptr -> _int_Obj +%LCLop ENOSPC : -> _eerrno0e_Enum +%LCLop ESPIPE : -> _eerrno0e_Enum +%LCLop 32 : -> double +%LCLop EROFS : -> _eerrno0e_Enum +%LCLop EMLINK : -> _eerrno0e_Enum +%LCLop EPIPE : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __] :int, int, int, int, int, _int_Vec, int, int, int, _int_Vec, int, int, int -> _sigcontext_Struct_Tuple +%LCLop EDOM : -> _eerrno0e_Enum +%LCLop ERANGE : -> _eerrno0e_Enum +%LCLop EWOULDBLOCK : -> _eerrno0e_Enum +%LCLop EINPROGRESS : -> _eerrno0e_Enum +%LCLop EALREADY : -> _eerrno0e_Enum +%LCLop ENOTSOCK : -> _eerrno0e_Enum +%LCLop EDESTADDRREQ : -> _eerrno0e_Enum +%LCLop EMSGSIZE : -> _eerrno0e_Enum +%LCLop EPROTOTYPE : -> _eerrno0e_Enum +%LCLop ENOPROTOOPT : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] :char, char, char, char, char, char, char, char, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr -> _lconv_Struct_Tuple +%LCLop EPROTONOSUPPORT : -> _eerrno0e_Enum +%LCLop ESOCKTNOSUPPORT : -> _eerrno0e_Enum +%LCLop EOPNOTSUPP : -> _eerrno0e_Enum +%LCLop __ \select ss_sp :_sigstack_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select ss_sp :_sigstack_Struct -> ___char_Obj_Ptr_Obj +%LCLop EPFNOSUPPORT : -> _eerrno0e_Enum +%LCLop __ \select ss_onstack :_sigstack_Struct_Tuple -> int +%LCLop __ \select ss_onstack :_sigstack_Struct -> _int_Obj +%LCLop EAFNOSUPPORT : -> _eerrno0e_Enum +%LCLop __ \field_arrow ss_sp :__sigstack_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop EADDRINUSE : -> _eerrno0e_Enum +%LCLop __ \field_arrow ss_onstack :__sigstack_Struct_Ptr -> _int_Obj +%LCLop EADDRNOTAVAIL : -> _eerrno0e_Enum +%LCLop NIL : -> __char_Obj_Ptr +%LCLop NIL : -> __lconv_Struct_Ptr +%LCLop NIL : -> __exception_Struct_Ptr +%LCLop NIL : -> __int_Obj_Ptr +%LCLop NIL : -> __double_Obj_Ptr +%LCLop NIL : -> __sigvec_Struct_Ptr +%LCLop NIL : -> __sigaction_Struct_Ptr +%LCLop NIL : -> __sigstack_Struct_Ptr +%LCLop NIL : -> __sigcontext_Struct_Ptr +%LCLop ENETDOWN : -> _eerrno0e_Enum +%LCLop ENETUNREACH : -> _eerrno0e_Enum +%LCLop ENETRESET : -> _eerrno0e_Enum +%LCLop ECONNABORTED : -> _eerrno0e_Enum +%LCLop ECONNRESET : -> _eerrno0e_Enum +%LCLop ENOBUFS : -> _eerrno0e_Enum +%LCLop EISCONN : -> _eerrno0e_Enum +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop ENOTCONN : -> _eerrno0e_Enum +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ + __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ + __ :int, __lconv_Struct_Ptr -> __lconv_Struct_Ptr +%LCLop __ + __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ + __ :int, __exception_Struct_Ptr -> __exception_Struct_Ptr +%LCLop __ + __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ + __ :int, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ + __ :int, __double_Obj_Ptr -> __double_Obj_Ptr +%LCLop __ + __ :__sigvec_Struct_Ptr, int -> __sigvec_Struct_Ptr +%LCLop __ + __ :int, __sigvec_Struct_Ptr -> __sigvec_Struct_Ptr +%LCLop __ + __ :__sigaction_Struct_Ptr, int -> __sigaction_Struct_Ptr +%LCLop __ + __ :int, __sigaction_Struct_Ptr -> __sigaction_Struct_Ptr +%LCLop __ + __ :__sigstack_Struct_Ptr, int -> __sigstack_Struct_Ptr +%LCLop __ + __ :int, __sigstack_Struct_Ptr -> __sigstack_Struct_Ptr +%LCLop __ + __ :__sigcontext_Struct_Ptr, int -> __sigcontext_Struct_Ptr +%LCLop __ + __ :int, __sigcontext_Struct_Ptr -> __sigcontext_Struct_Ptr +%LCLop __ \select sc_onstack :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_onstack :_sigcontext_Struct -> _int_Obj +%LCLop ESHUTDOWN : -> _eerrno0e_Enum +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop __ - __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ - __ :__lconv_Struct_Ptr, __lconv_Struct_Ptr -> int +%LCLop __ - __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ - __ :__exception_Struct_Ptr, __exception_Struct_Ptr -> int +%LCLop __ - __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ - __ :__int_Obj_Ptr, __int_Obj_Ptr -> int +%LCLop __ - __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ - __ :__double_Obj_Ptr, __double_Obj_Ptr -> int +%LCLop __ - __ :__sigvec_Struct_Ptr, int -> __sigvec_Struct_Ptr +%LCLop __ - __ :__sigvec_Struct_Ptr, __sigvec_Struct_Ptr -> int +%LCLop __ - __ :__sigaction_Struct_Ptr, int -> __sigaction_Struct_Ptr +%LCLop __ - __ :__sigaction_Struct_Ptr, __sigaction_Struct_Ptr -> int +%LCLop __ - __ :__sigstack_Struct_Ptr, int -> __sigstack_Struct_Ptr +%LCLop __ - __ :__sigstack_Struct_Ptr, __sigstack_Struct_Ptr -> int +%LCLop __ - __ :__sigcontext_Struct_Ptr, int -> __sigcontext_Struct_Ptr +%LCLop __ - __ :__sigcontext_Struct_Ptr, __sigcontext_Struct_Ptr -> int +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop sizeof :_eerrno0e_Enum -> int +%LCLop sizeof :_emath1e_Enum -> int +%LCLop __ \select sc_mask :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mask :_sigcontext_Struct -> _int_Obj +%LCLop DOMAIN : -> _emath1e_Enum +%LCLop ETOOMANYREFS : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_onstack :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_pc :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_pc :_sigcontext_Struct -> _int_Obj +%LCLop SING : -> _emath1e_Enum +%LCLop ETIMEDOUT : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mask :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_regs :_sigcontext_Struct_Tuple -> _int_Vec +%LCLop __ \select sc_regs :_sigcontext_Struct -> __int_Obj_Arr +%LCLop OVERFLOW : -> _emath1e_Enum +%LCLop ECONNREFUSED : -> _eerrno0e_Enum +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop isSub :__lconv_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__lconv_Struct_Arr, int -> bool +%LCLop isSub :__exception_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__exception_Struct_Arr, int -> bool +%LCLop isSub :_int_Vec, int -> bool +%LCLop isSub :__int_Obj_Arr, int -> bool +%LCLop isSub :_double_Vec, int -> bool +%LCLop isSub :__double_Obj_Arr, int -> bool +%LCLop isSub :__sigvec_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigvec_Struct_Arr, int -> bool +%LCLop isSub :__sigaction_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigaction_Struct_Arr, int -> bool +%LCLop isSub :__sigstack_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigstack_Struct_Arr, int -> bool +%LCLop isSub :__sigcontext_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigcontext_Struct_Arr, int -> bool +%LCLtag lconv struct +%LCLop __ \field_arrow sc_pc :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop UNDERFLOW : -> _emath1e_Enum +%LCLop ELOOP : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_regs :__sigcontext_Struct_Ptr -> __int_Obj_Arr +%LCLop __ \select sc_mdlo :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mdlo :_sigcontext_Struct -> _int_Obj +%LCLop TLOSS : -> _emath1e_Enum +%LCLop ENAMETOOLONG : -> _eerrno0e_Enum +%LCLop __ \select sc_mdhi :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mdhi :_sigcontext_Struct -> _int_Obj +%LCLop PLOSS : -> _emath1e_Enum +%LCLop EHOSTDOWN : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mdlo :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_ownedfp :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_ownedfp :_sigcontext_Struct -> _int_Obj +%LCLop EHOSTUNREACH : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mdhi :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_fpregs :_sigcontext_Struct_Tuple -> _int_Vec +%LCLop __ \select sc_fpregs :_sigcontext_Struct -> __int_Obj_Arr +%LCLop ENOTEMPTY : -> _eerrno0e_Enum +%LCLop succ :int -> int +%LCLop __ \field_arrow sc_ownedfp :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_fpc_csr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_fpc_csr :_sigcontext_Struct -> _int_Obj +%LCLop EPROCLIM : -> _eerrno0e_Enum +%LCLop pred :int -> int +%LCLop __ \field_arrow sc_fpregs :__sigcontext_Struct_Ptr -> __int_Obj_Arr +%LCLop __ \select sc_fpc_eir :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_fpc_eir :_sigcontext_Struct -> _int_Obj +%LCLop EUSERS : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_fpc_csr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_cause :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_cause :_sigcontext_Struct -> _int_Obj +%LCLop EDQUOT : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_fpc_eir :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_badvaddr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_badvaddr :_sigcontext_Struct -> _int_Obj +%LCLop ESTALE : -> _eerrno0e_Enum +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop __ \field_arrow sc_cause :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_badpaddr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_badpaddr :_sigcontext_Struct -> _int_Obj +%LCLop EREMOTE : -> _eerrno0e_Enum +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLconst NSIG int +%LCLconst SIGHUP int +%LCLconst SIGINT int +%LCLconst SIGQUIT int +%LCLconst SIGILL int +%LCLconst ILL_RESAD_FAULT int +%LCLconst ILL_PRIVIN_FAULT int +%LCLconst ILL_RESOP_FAULT int +%LCLconst ILL_VECOP_FAULT int +%LCLconst ILL_VECINST_FAULT int +%LCLconst SIGTRAP int +%LCLconst SIGIOT int +%LCLconst SIGEMT int +%LCLconst SIGFPE int +%LCLconst FPE_INTOVF_TRAP int +%LCLconst FPE_INTDIV_TRAP int +%LCLconst FPE_FLTOVF_TRAP int +%LCLconst FPE_FLTDIV_TRAP int +%LCLconst FPE_FLTUND_TRAP int +%LCLconst FPE_DECOVF_TRAP int +%LCLconst FPE_SUBRNG_TRAP int +%LCLconst FPE_FLTOVF_FAULT int +%LCLconst FPE_FLTDIV_FAULT int +%LCLconst FPE_FLTUND_FAULT int +%LCLconst FPE_VECTOR int +%LCLconst VFPE_FLTUND_TRAP int +%LCLconst VFPE_FLTDIV_TRAP int +%LCLconst VFPE_FLTRSV_TRAP int +%LCLconst VPFE_FLTOVF_FAULT int +%LCLconst VFPE_INTOVF_TRAP int +%LCLconst SIGKILL int +%LCLconst SIGBUS int +%LCLconst SIGSEGV int +%LCLconst SIGSYS int +%LCLconst SIGPIPE int +%LCLconst SIGALRM int +%LCLconst SIGTERM int +%LCLconst TERM_VECT_HARD int +%LCLconst TERM_VECT_TOOMANY int +%LCLconst SIGURG int +%LCLconst SIGSTOP int +%LCLconst SIGTSTP int +%LCLconst SIGCONT int +%LCLconst SIGCHLD int +%LCLconst SIGTTIN int +%LCLconst SIGTTOU int +%LCLconst SIGIO int +%LCLconst SIGXCPU int +%LCLconst SIGXFSZ int +%LCLconst SIGVTALRM int +%LCLconst SIGPROF int +%LCLconst SIGWINCH int +%LCLconst SIGLOST int +%LCLconst SIGUSR1 int +%LCLconst SIGUSR2 int +%LCLconst SIGCLD int +%LCLconst SIGABRT int +%LCLconst BRK_USERBP int +%LCLconst BRK_KERNELBP int +%LCLconst BRK_ABORT int +%LCLconst BRK_BD_TAKEN int +%LCLconst BRK_BD_NOTTAKEN int +%LCLconst BRK_SSTEPBP int +%LCLconst BRK_OVERFLOW int +%LCLconst BRK_DIVZERO int +%LCLconst BRK_RANGE int +%LCLconst BRK_STACKOVERFLOW int +%LCLtype sig_atomic_t _sig_atomic_t exposed +%LCLtype sigset_t _sigset_t exposed +%LCLtype __sigvec ___sigvec exposed +%LCLtype __sigaction ___sigaction exposed +%LCLconst SV_ONSTACK int +%LCLconst SV_INTERRUPT int +%LCLconst SA_NOCLDSTOP int +%LCLconst SV_OLDSIG int +%LCLconst sv_onstack int +%LCLconst SIG_BLOCK int +%LCLconst SIG_UNBLOCK int +%LCLconst SIG_SETMASK int +%LCLtype __sigstack ___sigstack exposed +%LCLtype __sigcontext ___sigcontext exposed +%LCLtype __scp ___scp exposed +%LCLconst BADSIG _HOF_sort_68 +%LCLconst SIG_ERR _HOF_sort_68 +%LCLconst SIG_DFL _HOF_sort_68 +%LCLconst SIG_IGN _HOF_sort_68 +%LCLtype pid_t _pid_t exposed +%LCLfcn raise : int -> int +%LCLfcnGlobals +%LCLfcn kill : int, int -> int +%LCLfcnGlobals +%LCLfcn sigemptyset : __int_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn sigfillset : __int_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn sigaddset : __int_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn sigdelset : __int_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn sigismember : __int_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn sigaction : int, __sigaction_Struct_Ptr, __sigaction_Struct_Ptr -> int +%LCLfcnGlobals +%LCLfcn sigprocmask : int, __int_Obj_Ptr, __int_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn sigpending : __int_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn sigsuspend : __int_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn sigmask : int -> int +%LCLfcnGlobals +%LCLSymbolTableEnd diff --git a/imports/stdarg.lcl b/imports/stdarg.lcl new file mode 100644 index 0000000..b666bd8 --- /dev/null +++ b/imports/stdarg.lcl @@ -0,0 +1,22 @@ +/* +** stdarg.h +** +** NOT INCLUDED +*/ + +/* +typedef char *va_list; + +void va_end(va_list) { ensures true; } +va_list va_start(va_list va, parmN) (list = ((va_list)&parmN + sizeof(parmN))) + + +constant va_arg(list, mode) ((mode *)(list = (va_list) ((((int)list + (__builtin_alignof(mode)<=4?3:7)) & (__builtin_alignof(mode)<=4?-4:-8))+sizeof(mode))))[-1] + +*/ + +typedef int ptrdiff_t; + +/* +#define offsetof(s_name,m_name) (size_t)&(((s_name*)0))->m_name +*/ diff --git a/imports/stdarg.lcs b/imports/stdarg.lcs new file mode 100644 index 0000000..c4e47aa --- /dev/null +++ b/imports/stdarg.lcs @@ -0,0 +1,652 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _eerrno0e_Enum enum eerrno0e nil +%LCLsort EDUPTOOMANYCPUS enumMem nil nil +%LCLsort EDUPINTRANSIT enumMem nil nil +%LCLsort EDUPBADOPCODE enumMem nil nil +%LCLsort EDUPNOTRUN enumMem nil nil +%LCLsort EDUPNOTWAIT enumMem nil nil +%LCLsort EDUPNOTIDLE enumMem nil nil +%LCLsort EDUPNOTCNTD enumMem nil nil +%LCLsort EDUPNODISCONN enumMem nil nil +%LCLsort EDUPNOCONN enumMem nil nil +%LCLsort ENODUST enumMem nil nil +%LCLsort ENOSYSTEM enumMem nil nil +%LCLsort ENORESOURCES enumMem nil nil +%LCLsort ENOACTIVE enumMem nil nil +%LCLsort EACTIVE enumMem nil nil +%LCLsort ENOSYS enumMem nil nil +%LCLsort ENOLCK enumMem nil nil +%LCLsort EDEADLK enumMem nil nil +%LCLsort EALIGN enumMem nil nil +%LCLsort EIDRM enumMem nil nil +%LCLsort ENOMSG enumMem nil nil +%LCLsort EREMOTE enumMem nil nil +%LCLsort ESTALE enumMem nil nil +%LCLsort EDQUOT enumMem nil nil +%LCLsort EUSERS enumMem nil nil +%LCLsort EPROCLIM enumMem nil nil +%LCLsort ENOTEMPTY enumMem nil nil +%LCLsort EHOSTUNREACH enumMem nil nil +%LCLsort EHOSTDOWN enumMem nil nil +%LCLsort ENAMETOOLONG enumMem nil nil +%LCLsort ELOOP enumMem nil nil +%LCLsort ECONNREFUSED enumMem nil nil +%LCLsort ETIMEDOUT enumMem nil nil +%LCLsort ETOOMANYREFS enumMem nil nil +%LCLsort ESHUTDOWN enumMem nil nil +%LCLsort ENOTCONN enumMem nil nil +%LCLsort EISCONN enumMem nil nil +%LCLsort ENOBUFS enumMem nil nil +%LCLsort ECONNRESET enumMem nil nil +%LCLsort ECONNABORTED enumMem nil nil +%LCLsort ENETRESET enumMem nil nil +%LCLsort ENETUNREACH enumMem nil nil +%LCLsort ENETDOWN enumMem nil nil +%LCLsort EADDRNOTAVAIL enumMem nil nil +%LCLsort EADDRINUSE enumMem nil nil +%LCLsort EAFNOSUPPORT enumMem nil nil +%LCLsort EPFNOSUPPORT enumMem nil nil +%LCLsort EOPNOTSUPP enumMem nil nil +%LCLsort ESOCKTNOSUPPORT enumMem nil nil +%LCLsort EPROTONOSUPPORT enumMem nil nil +%LCLsort ENOPROTOOPT enumMem nil nil +%LCLsort EPROTOTYPE enumMem nil nil +%LCLsort EMSGSIZE enumMem nil nil +%LCLsort EDESTADDRREQ enumMem nil nil +%LCLsort ENOTSOCK enumMem nil nil +%LCLsort EALREADY enumMem nil nil +%LCLsort EINPROGRESS enumMem nil nil +%LCLsort EWOULDBLOCK enumMem nil nil +%LCLsort ERANGE enumMem nil nil +%LCLsort EDOM enumMem nil nil +%LCLsort EPIPE enumMem nil nil +%LCLsort EMLINK enumMem nil nil +%LCLsort EROFS enumMem nil nil +%LCLsort ESPIPE enumMem nil nil +%LCLsort ENOSPC enumMem nil nil +%LCLsort EFBIG enumMem nil nil +%LCLsort ETXTBSY enumMem nil nil +%LCLsort ENOTTY enumMem nil nil +%LCLsort EMFILE enumMem nil nil +%LCLsort ENFILE enumMem nil nil +%LCLsort EINVAL enumMem nil nil +%LCLsort EISDIR enumMem nil nil +%LCLsort ENOTDIR enumMem nil nil +%LCLsort ENODEV enumMem nil nil +%LCLsort EXDEV enumMem nil nil +%LCLsort EEXIST enumMem nil nil +%LCLsort EBUSY enumMem nil nil +%LCLsort ENOTBLK enumMem nil nil +%LCLsort EFAULT enumMem nil nil +%LCLsort EACCES enumMem nil nil +%LCLsort ENOMEM enumMem nil nil +%LCLsort EAGAIN enumMem nil nil +%LCLsort ECHILD enumMem nil nil +%LCLsort EBADF enumMem nil nil +%LCLsort ENOEXEC enumMem nil nil +%LCLsort E2BIG enumMem nil nil +%LCLsort ENXIO enumMem nil nil +%LCLsort EIO enumMem nil nil +%LCLsort EINTR enumMem nil nil +%LCLsort ESRCH enumMem nil nil +%LCLsort ENOENT enumMem nil nil +%LCLsort EPERM enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __eerrno0e_Enum_Obj obj _eerrno0e_Enum nil +%LCLsort _int_Obj obj int nil +%LCLsort _lconv_Struct str lconv nil +%LCLsort n_sign_posn strMem _char_Obj nil +%LCLsort p_sign_posn strMem _char_Obj nil +%LCLsort n_sep_by_space strMem _char_Obj nil +%LCLsort n_cs_precedes strMem _char_Obj nil +%LCLsort p_sep_by_space strMem _char_Obj nil +%LCLsort p_cs_precedes strMem _char_Obj nil +%LCLsort frac_digits strMem _char_Obj nil +%LCLsort int_frac_digits strMem _char_Obj nil +%LCLsort negative_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort positive_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort currency_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort int_curr_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil +%LCLsort _lconv_Struct_Tuple tup _lconv_Struct nil +%LCLsort __lconv_Struct_Ptr ptr _lconv_Struct nil +%LCLsort __lconv_Struct_Arr arr _lconv_Struct nil +%LCLsort __lconv_Struct_Tuple_Vec vec _lconv_Struct_Tuple __lconv_Struct_Arr +%LCLsort ___lconv synonym _lconv_Struct nil +%LCLsort _exception_Struct str exception nil +%LCLsort retval strMem _double_Obj nil +%LCLsort arg2 strMem _double_Obj nil +%LCLsort arg1 strMem _double_Obj nil +%LCLsort name strMem ___char_Obj_Ptr_Obj nil +%LCLsort ttype strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _double_Obj obj double nil +%LCLsort _exception_Struct_Tuple tup _exception_Struct nil +%LCLsort __exception_Struct_Ptr ptr _exception_Struct nil +%LCLsort __exception_Struct_Arr arr _exception_Struct nil +%LCLsort __exception_Struct_Tuple_Vec vec _exception_Struct_Tuple __exception_Struct_Arr +%LCLsort ___exception synonym _exception_Struct nil +%LCLsort __int_Obj_Ptr ptr _int_Obj nil +%LCLsort __int_Obj_Arr arr _int_Obj nil +%LCLsort _int_Vec vec int __int_Obj_Arr +%LCLsort __double_Obj_Ptr ptr _double_Obj nil +%LCLsort __double_Obj_Arr arr _double_Obj nil +%LCLsort _double_Vec vec double __double_Obj_Arr +%LCLsort _emath1e_Enum enum emath1e nil +%LCLsort PLOSS enumMem nil nil +%LCLsort TLOSS enumMem nil nil +%LCLsort UNDERFLOW enumMem nil nil +%LCLsort OVERFLOW enumMem nil nil +%LCLsort SING enumMem nil nil +%LCLsort DOMAIN enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __emath1e_Enum_Obj obj _emath1e_Enum nil +%LCLsort _jmp_buf synonym __int_Obj_Arr nil +%LCLsort _sigjmp_buf synonym __int_Obj_Arr nil +%LCLsort _sig_atomic_t synonym int nil +%LCLsort _sigset_t synonym int nil +%LCLsort _sigvec_Struct str sigvec nil +%LCLsort sv_flags strMem _int_Obj nil +%LCLsort sv_mask strMem _int_Obj nil +%LCLsort sv_handler strMem _HOF_sort_43 nil +%LCLsort strEnd nil nil nil +%LCLsort _HOF_sort_43 hof nil nil +%LCLsort _sigvec_Struct_Tuple tup _sigvec_Struct nil +%LCLsort __sigvec_Struct_Ptr ptr _sigvec_Struct nil +%LCLsort __sigvec_Struct_Arr arr _sigvec_Struct nil +%LCLsort __sigvec_Struct_Tuple_Vec vec _sigvec_Struct_Tuple __sigvec_Struct_Arr +%LCLsort ___sigvec synonym _sigvec_Struct nil +%LCLsort _sigaction_Struct str sigaction nil +%LCLsort sa_flags strMem _int_Obj nil +%LCLsort sa_mask strMem _int_Obj nil +%LCLsort sa_handler strMem _HOF_sort_50 nil +%LCLsort strEnd nil nil nil +%LCLsort _HOF_sort_50 hof nil nil +%LCLsort _sigaction_Struct_Tuple tup _sigaction_Struct nil +%LCLsort __sigaction_Struct_Ptr ptr _sigaction_Struct nil +%LCLsort __sigaction_Struct_Arr arr _sigaction_Struct nil +%LCLsort __sigaction_Struct_Tuple_Vec vec _sigaction_Struct_Tuple __sigaction_Struct_Arr +%LCLsort ___sigaction synonym _sigaction_Struct nil +%LCLsort _sigstack_Struct str sigstack nil +%LCLsort ss_onstack strMem _int_Obj nil +%LCLsort ss_sp strMem ___char_Obj_Ptr_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sigstack_Struct_Tuple tup _sigstack_Struct nil +%LCLsort __sigstack_Struct_Ptr ptr _sigstack_Struct nil +%LCLsort __sigstack_Struct_Arr arr _sigstack_Struct nil +%LCLsort __sigstack_Struct_Tuple_Vec vec _sigstack_Struct_Tuple __sigstack_Struct_Arr +%LCLsort ___sigstack synonym _sigstack_Struct nil +%LCLsort _sigcontext_Struct str sigcontext nil +%LCLsort sc_badpaddr strMem _int_Obj nil +%LCLsort sc_badvaddr strMem _int_Obj nil +%LCLsort sc_cause strMem _int_Obj nil +%LCLsort sc_fpc_eir strMem _int_Obj nil +%LCLsort sc_fpc_csr strMem _int_Obj nil +%LCLsort sc_fpregs strMem __int_Obj_Arr nil +%LCLsort sc_ownedfp strMem _int_Obj nil +%LCLsort sc_mdhi strMem _int_Obj nil +%LCLsort sc_mdlo strMem _int_Obj nil +%LCLsort sc_regs strMem __int_Obj_Arr nil +%LCLsort sc_pc strMem _int_Obj nil +%LCLsort sc_mask strMem _int_Obj nil +%LCLsort sc_onstack strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sigcontext_Struct_Tuple tup _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Ptr ptr _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Arr arr _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Tuple_Vec vec _sigcontext_Struct_Tuple __sigcontext_Struct_Arr +%LCLsort ___sigcontext synonym _sigcontext_Struct nil +%LCLsort _HOF_sort_68 hof nil nil +%LCLsort ___scp synonym _HOF_sort_68 nil +%LCLsort _pid_t synonym int nil +%LCLsort _ptrdiff_t synonym int nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop __ \field_arrow sc_badvaddr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop ENOMSG : -> _eerrno0e_Enum +%LCLop mod :int, int -> int +%LCLop __ \field_arrow sc_badpaddr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop EIDRM : -> _eerrno0e_Enum +%LCLop min :int, int -> int +%LCLop EALIGN : -> _eerrno0e_Enum +%LCLop max :int, int -> int +%LCLop EDEADLK : -> _eerrno0e_Enum +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop ENOLCK : -> _eerrno0e_Enum +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop ENOSYS : -> _eerrno0e_Enum +%LCLop EACTIVE : -> _eerrno0e_Enum +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop ENOACTIVE : -> _eerrno0e_Enum +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop ENORESOURCES : -> _eerrno0e_Enum +%LCLop ENOSYSTEM : -> _eerrno0e_Enum +%LCLop ENODUST : -> _eerrno0e_Enum +%LCLop count :char, _char_Vec -> int +%LCLop EDUPNOCONN : -> _eerrno0e_Enum +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop EDUPNODISCONN : -> _eerrno0e_Enum +%LCLop init :_char_Vec -> _char_Vec +%LCLop EDUPNOTCNTD : -> _eerrno0e_Enum +%LCLop isEmpty :_char_Vec -> bool +%LCLop EDUPNOTIDLE : -> _eerrno0e_Enum +%LCLop last :_char_Vec -> char +%LCLop EDUPNOTWAIT : -> _eerrno0e_Enum +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop EDUPNOTRUN : -> _eerrno0e_Enum +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop EDUPBADOPCODE : -> _eerrno0e_Enum +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop EDUPINTRANSIT : -> _eerrno0e_Enum +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop EDUPTOOMANYCPUS : -> _eerrno0e_Enum +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop __ \select decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop lenStr :_char_Vec -> int +%LCLop __ \select thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop times10plus :int, int -> int +%LCLop __ \field_arrow decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop plus1 :int -> int +%LCLop __ \field_arrow thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_curr_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select int_curr_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 2 : -> int +%LCLop __ \field_arrow grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select currency_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select currency_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 3 : -> int +%LCLtag exception struct +%LCLop __ \field_arrow int_curr_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 4 : -> int +%LCLop __ \field_arrow currency_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 5 : -> int +%LCLop __ \field_arrow mon_decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 6 : -> int +%LCLop __ \field_arrow mon_thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select positive_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select positive_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 7 : -> int +%LCLop __ \field_arrow mon_grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select negative_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select negative_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 8 : -> int +%LCLtag sigvec struct +%LCLop __ \field_arrow positive_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select int_frac_digits :_lconv_Struct -> _char_Obj +%LCLop 9 : -> int +%LCLop __ \field_arrow negative_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select frac_digits :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow int_frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select p_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select n_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \field_arrow n_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLtag sigaction struct +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop { __ } :char -> _char_Vec +%LCLop EPERM : -> _eerrno0e_Enum +%LCLop ENOENT : -> _eerrno0e_Enum +%LCLop ESRCH : -> _eerrno0e_Enum +%LCLop EINTR : -> _eerrno0e_Enum +%LCLop __ \select ttype :_exception_Struct_Tuple -> int +%LCLop __ \select ttype :_exception_Struct -> _int_Obj +%LCLop EIO : -> _eerrno0e_Enum +%LCLop __ \select name :_exception_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select name :_exception_Struct -> ___char_Obj_Ptr_Obj +%LCLop ENXIO : -> _eerrno0e_Enum +%LCLop __ \field_arrow ttype :__exception_Struct_Ptr -> _int_Obj +%LCLop __ \select arg1 :_exception_Struct_Tuple -> double +%LCLop __ \select arg1 :_exception_Struct -> _double_Obj +%LCLop E2BIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow name :__exception_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select arg2 :_exception_Struct_Tuple -> double +%LCLop __ \select arg2 :_exception_Struct -> _double_Obj +%LCLop ENOEXEC : -> _eerrno0e_Enum +%LCLop __ \field_arrow arg1 :__exception_Struct_Ptr -> _double_Obj +%LCLop __ \select retval :_exception_Struct_Tuple -> double +%LCLop __ \select retval :_exception_Struct -> _double_Obj +%LCLop EBADF : -> _eerrno0e_Enum +%LCLop __ \select sv_handler :_sigvec_Struct_Tuple -> _HOF_sort_43 +%LCLop __ \select sv_handler :_sigvec_Struct -> _HOF_sort_43 +%LCLop __ \field_arrow arg2 :__exception_Struct_Ptr -> _double_Obj +%LCLop ECHILD : -> _eerrno0e_Enum +%LCLop [__, __] :int, __char_Obj_Ptr -> _sigstack_Struct_Tuple +%LCLop __ \select sv_mask :_sigvec_Struct_Tuple -> int +%LCLop __ \select sv_mask :_sigvec_Struct -> _int_Obj +%LCLop __ \field_arrow retval :__exception_Struct_Ptr -> _double_Obj +%LCLop EAGAIN : -> _eerrno0e_Enum +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [] :__lconv_Struct_Ptr -> __lconv_Struct_Arr +%LCLop __ [] :__exception_Struct_Ptr -> __exception_Struct_Arr +%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr +%LCLop __ [] :__double_Obj_Ptr -> __double_Obj_Arr +%LCLop __ [] :__sigvec_Struct_Ptr -> __sigvec_Struct_Arr +%LCLop __ [] :__sigaction_Struct_Ptr -> __sigaction_Struct_Arr +%LCLop __ [] :__sigstack_Struct_Ptr -> __sigstack_Struct_Arr +%LCLop __ [] :__sigcontext_Struct_Ptr -> __sigcontext_Struct_Arr +%LCLop __ \field_arrow sv_handler :__sigvec_Struct_Ptr -> _HOF_sort_43 +%LCLop __ \select sv_flags :_sigvec_Struct_Tuple -> int +%LCLop __ \select sv_flags :_sigvec_Struct -> _int_Obj +%LCLop ENOMEM : -> _eerrno0e_Enum +%LCLtag sigstack struct +%LCLop __ \field_arrow sv_mask :__sigvec_Struct_Ptr -> _int_Obj +%LCLop [__, __, __] :int, int, _HOF_sort_43 -> _sigvec_Struct_Tuple +%LCLop [__, __, __] :int, int, _HOF_sort_50 -> _sigaction_Struct_Tuple +%LCLop EACCES : -> _eerrno0e_Enum +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ [__] :__lconv_Struct_Tuple_Vec, int -> _lconv_Struct_Tuple +%LCLop __ [__] :__lconv_Struct_Arr, int -> _lconv_Struct +%LCLop __ [__] :__exception_Struct_Tuple_Vec, int -> _exception_Struct_Tuple +%LCLop __ [__] :__exception_Struct_Arr, int -> _exception_Struct +%LCLop __ [__] :_int_Vec, int -> int +%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj +%LCLop __ [__] :_double_Vec, int -> double +%LCLop __ [__] :__double_Obj_Arr, int -> _double_Obj +%LCLop __ [__] :__sigvec_Struct_Tuple_Vec, int -> _sigvec_Struct_Tuple +%LCLop __ [__] :__sigvec_Struct_Arr, int -> _sigvec_Struct +%LCLop __ [__] :__sigaction_Struct_Tuple_Vec, int -> _sigaction_Struct_Tuple +%LCLop __ [__] :__sigaction_Struct_Arr, int -> _sigaction_Struct +%LCLop __ [__] :__sigstack_Struct_Tuple_Vec, int -> _sigstack_Struct_Tuple +%LCLop __ [__] :__sigstack_Struct_Arr, int -> _sigstack_Struct +%LCLop __ [__] :__sigcontext_Struct_Tuple_Vec, int -> _sigcontext_Struct_Tuple +%LCLop __ [__] :__sigcontext_Struct_Arr, int -> _sigcontext_Struct +%LCLop __ \field_arrow sv_flags :__sigvec_Struct_Ptr -> _int_Obj +%LCLop EFAULT : -> _eerrno0e_Enum +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop ENOTBLK : -> _eerrno0e_Enum +%LCLop EBUSY : -> _eerrno0e_Enum +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop [__, __, __, __, __] :double, double, double, __char_Obj_Ptr, int -> _exception_Struct_Tuple +%LCLop EEXIST : -> _eerrno0e_Enum +%LCLop EXDEV : -> _eerrno0e_Enum +%LCLop ENODEV : -> _eerrno0e_Enum +%LCLop ENOTDIR : -> _eerrno0e_Enum +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop EISDIR : -> _eerrno0e_Enum +%LCLop EINVAL : -> _eerrno0e_Enum +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop ENFILE : -> _eerrno0e_Enum +%LCLop __ \select sa_handler :_sigaction_Struct_Tuple -> _HOF_sort_50 +%LCLop __ \select sa_handler :_sigaction_Struct -> _HOF_sort_50 +%LCLop EMFILE : -> _eerrno0e_Enum +%LCLtag sigcontext struct +%LCLop __ \select sa_mask :_sigaction_Struct_Tuple -> int +%LCLop __ \select sa_mask :_sigaction_Struct -> _int_Obj +%LCLop ENOTTY : -> _eerrno0e_Enum +%LCLop __ \field_arrow sa_handler :__sigaction_Struct_Ptr -> _HOF_sort_50 +%LCLop __ \select sa_flags :_sigaction_Struct_Tuple -> int +%LCLop __ \select sa_flags :_sigaction_Struct -> _int_Obj +%LCLop ETXTBSY : -> _eerrno0e_Enum +%LCLop null : -> char +%LCLop __ \field_arrow sa_mask :__sigaction_Struct_Ptr -> _int_Obj +%LCLop EFBIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow sa_flags :__sigaction_Struct_Ptr -> _int_Obj +%LCLop ENOSPC : -> _eerrno0e_Enum +%LCLop ESPIPE : -> _eerrno0e_Enum +%LCLop 32 : -> double +%LCLop EROFS : -> _eerrno0e_Enum +%LCLop EMLINK : -> _eerrno0e_Enum +%LCLop EPIPE : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __] :int, int, int, int, int, _int_Vec, int, int, int, _int_Vec, int, int, int -> _sigcontext_Struct_Tuple +%LCLop EDOM : -> _eerrno0e_Enum +%LCLop ERANGE : -> _eerrno0e_Enum +%LCLop EWOULDBLOCK : -> _eerrno0e_Enum +%LCLop EINPROGRESS : -> _eerrno0e_Enum +%LCLop EALREADY : -> _eerrno0e_Enum +%LCLop ENOTSOCK : -> _eerrno0e_Enum +%LCLop EDESTADDRREQ : -> _eerrno0e_Enum +%LCLop EMSGSIZE : -> _eerrno0e_Enum +%LCLop EPROTOTYPE : -> _eerrno0e_Enum +%LCLop ENOPROTOOPT : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] :char, char, char, char, char, char, char, char, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr -> _lconv_Struct_Tuple +%LCLop EPROTONOSUPPORT : -> _eerrno0e_Enum +%LCLop ESOCKTNOSUPPORT : -> _eerrno0e_Enum +%LCLop EOPNOTSUPP : -> _eerrno0e_Enum +%LCLop __ \select ss_sp :_sigstack_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select ss_sp :_sigstack_Struct -> ___char_Obj_Ptr_Obj +%LCLop EPFNOSUPPORT : -> _eerrno0e_Enum +%LCLop __ \select ss_onstack :_sigstack_Struct_Tuple -> int +%LCLop __ \select ss_onstack :_sigstack_Struct -> _int_Obj +%LCLop EAFNOSUPPORT : -> _eerrno0e_Enum +%LCLop __ \field_arrow ss_sp :__sigstack_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop EADDRINUSE : -> _eerrno0e_Enum +%LCLop __ \field_arrow ss_onstack :__sigstack_Struct_Ptr -> _int_Obj +%LCLop EADDRNOTAVAIL : -> _eerrno0e_Enum +%LCLop NIL : -> __char_Obj_Ptr +%LCLop NIL : -> __lconv_Struct_Ptr +%LCLop NIL : -> __exception_Struct_Ptr +%LCLop NIL : -> __int_Obj_Ptr +%LCLop NIL : -> __double_Obj_Ptr +%LCLop NIL : -> __sigvec_Struct_Ptr +%LCLop NIL : -> __sigaction_Struct_Ptr +%LCLop NIL : -> __sigstack_Struct_Ptr +%LCLop NIL : -> __sigcontext_Struct_Ptr +%LCLop ENETDOWN : -> _eerrno0e_Enum +%LCLop ENETUNREACH : -> _eerrno0e_Enum +%LCLop ENETRESET : -> _eerrno0e_Enum +%LCLop ECONNABORTED : -> _eerrno0e_Enum +%LCLop ECONNRESET : -> _eerrno0e_Enum +%LCLop ENOBUFS : -> _eerrno0e_Enum +%LCLop EISCONN : -> _eerrno0e_Enum +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop ENOTCONN : -> _eerrno0e_Enum +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ + __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ + __ :int, __lconv_Struct_Ptr -> __lconv_Struct_Ptr +%LCLop __ + __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ + __ :int, __exception_Struct_Ptr -> __exception_Struct_Ptr +%LCLop __ + __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ + __ :int, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ + __ :int, __double_Obj_Ptr -> __double_Obj_Ptr +%LCLop __ + __ :__sigvec_Struct_Ptr, int -> __sigvec_Struct_Ptr +%LCLop __ + __ :int, __sigvec_Struct_Ptr -> __sigvec_Struct_Ptr +%LCLop __ + __ :__sigaction_Struct_Ptr, int -> __sigaction_Struct_Ptr +%LCLop __ + __ :int, __sigaction_Struct_Ptr -> __sigaction_Struct_Ptr +%LCLop __ + __ :__sigstack_Struct_Ptr, int -> __sigstack_Struct_Ptr +%LCLop __ + __ :int, __sigstack_Struct_Ptr -> __sigstack_Struct_Ptr +%LCLop __ + __ :__sigcontext_Struct_Ptr, int -> __sigcontext_Struct_Ptr +%LCLop __ + __ :int, __sigcontext_Struct_Ptr -> __sigcontext_Struct_Ptr +%LCLop __ \select sc_onstack :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_onstack :_sigcontext_Struct -> _int_Obj +%LCLop ESHUTDOWN : -> _eerrno0e_Enum +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop __ - __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ - __ :__lconv_Struct_Ptr, __lconv_Struct_Ptr -> int +%LCLop __ - __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ - __ :__exception_Struct_Ptr, __exception_Struct_Ptr -> int +%LCLop __ - __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ - __ :__int_Obj_Ptr, __int_Obj_Ptr -> int +%LCLop __ - __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ - __ :__double_Obj_Ptr, __double_Obj_Ptr -> int +%LCLop __ - __ :__sigvec_Struct_Ptr, int -> __sigvec_Struct_Ptr +%LCLop __ - __ :__sigvec_Struct_Ptr, __sigvec_Struct_Ptr -> int +%LCLop __ - __ :__sigaction_Struct_Ptr, int -> __sigaction_Struct_Ptr +%LCLop __ - __ :__sigaction_Struct_Ptr, __sigaction_Struct_Ptr -> int +%LCLop __ - __ :__sigstack_Struct_Ptr, int -> __sigstack_Struct_Ptr +%LCLop __ - __ :__sigstack_Struct_Ptr, __sigstack_Struct_Ptr -> int +%LCLop __ - __ :__sigcontext_Struct_Ptr, int -> __sigcontext_Struct_Ptr +%LCLop __ - __ :__sigcontext_Struct_Ptr, __sigcontext_Struct_Ptr -> int +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop sizeof :_eerrno0e_Enum -> int +%LCLop sizeof :_emath1e_Enum -> int +%LCLop __ \select sc_mask :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mask :_sigcontext_Struct -> _int_Obj +%LCLop DOMAIN : -> _emath1e_Enum +%LCLop ETOOMANYREFS : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_onstack :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_pc :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_pc :_sigcontext_Struct -> _int_Obj +%LCLop SING : -> _emath1e_Enum +%LCLop ETIMEDOUT : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mask :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_regs :_sigcontext_Struct_Tuple -> _int_Vec +%LCLop __ \select sc_regs :_sigcontext_Struct -> __int_Obj_Arr +%LCLop OVERFLOW : -> _emath1e_Enum +%LCLop ECONNREFUSED : -> _eerrno0e_Enum +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop isSub :__lconv_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__lconv_Struct_Arr, int -> bool +%LCLop isSub :__exception_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__exception_Struct_Arr, int -> bool +%LCLop isSub :_int_Vec, int -> bool +%LCLop isSub :__int_Obj_Arr, int -> bool +%LCLop isSub :_double_Vec, int -> bool +%LCLop isSub :__double_Obj_Arr, int -> bool +%LCLop isSub :__sigvec_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigvec_Struct_Arr, int -> bool +%LCLop isSub :__sigaction_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigaction_Struct_Arr, int -> bool +%LCLop isSub :__sigstack_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigstack_Struct_Arr, int -> bool +%LCLop isSub :__sigcontext_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigcontext_Struct_Arr, int -> bool +%LCLtag lconv struct +%LCLop __ \field_arrow sc_pc :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop UNDERFLOW : -> _emath1e_Enum +%LCLop ELOOP : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_regs :__sigcontext_Struct_Ptr -> __int_Obj_Arr +%LCLop __ \select sc_mdlo :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mdlo :_sigcontext_Struct -> _int_Obj +%LCLop TLOSS : -> _emath1e_Enum +%LCLop ENAMETOOLONG : -> _eerrno0e_Enum +%LCLop __ \select sc_mdhi :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mdhi :_sigcontext_Struct -> _int_Obj +%LCLop PLOSS : -> _emath1e_Enum +%LCLop EHOSTDOWN : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mdlo :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_ownedfp :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_ownedfp :_sigcontext_Struct -> _int_Obj +%LCLop EHOSTUNREACH : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mdhi :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_fpregs :_sigcontext_Struct_Tuple -> _int_Vec +%LCLop __ \select sc_fpregs :_sigcontext_Struct -> __int_Obj_Arr +%LCLop ENOTEMPTY : -> _eerrno0e_Enum +%LCLop succ :int -> int +%LCLop __ \field_arrow sc_ownedfp :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_fpc_csr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_fpc_csr :_sigcontext_Struct -> _int_Obj +%LCLop EPROCLIM : -> _eerrno0e_Enum +%LCLop pred :int -> int +%LCLop __ \field_arrow sc_fpregs :__sigcontext_Struct_Ptr -> __int_Obj_Arr +%LCLop __ \select sc_fpc_eir :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_fpc_eir :_sigcontext_Struct -> _int_Obj +%LCLop EUSERS : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_fpc_csr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_cause :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_cause :_sigcontext_Struct -> _int_Obj +%LCLop EDQUOT : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_fpc_eir :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_badvaddr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_badvaddr :_sigcontext_Struct -> _int_Obj +%LCLop ESTALE : -> _eerrno0e_Enum +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop __ \field_arrow sc_cause :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_badpaddr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_badpaddr :_sigcontext_Struct -> _int_Obj +%LCLop EREMOTE : -> _eerrno0e_Enum +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLtype ptrdiff_t _ptrdiff_t exposed +%LCLSymbolTableEnd diff --git a/imports/stdio.lcl b/imports/stdio.lcl new file mode 100644 index 0000000..e7a9514 --- /dev/null +++ b/imports/stdio.lcl @@ -0,0 +1,258 @@ +/* +** stdio.lcl +** +** based on /usr/include/stdio.h on red-cross +*/ + +imports ; + +/* +** we need to allow casts to and from these types... +** they should be exposed, but unknown type. +*/ + +immutable type FILE; + +typedef void *va_list; +typedef void *fpos_t; + +FILE *stdin; +FILE *stdout; +FILE *stderr; + +constant int EOF ; + +| int : char | getc (FILE *stream ) +{ + ensures true; +} + +| int : char | getchar (void) +{ + ensures true; +} + +| int : void | putc (| int : char | c, FILE *stream) +{ + ensures true; +} + +int putchar (|int : char| c) +{ + ensures true; +} + +| int : bool | feof (FILE *stream) +{ + ensures true; +} + +| int : bool | ferror (FILE *stream ) +{ + ensures true; +} + +int fileno (FILE *stream) +{ + ensures true; +} + +int _filbuf (FILE *p) +{ + ensures true; +} + +int _flsbuf (unsigned char x, FILE *p) +{ + ensures true; +} + +void clearerr (FILE *stream) +{ + ensures true; +} + +| int : void | fclose (FILE *stream ) +{ + ensures true; +} + +FILE * fdopen (int filedes, char *ttype) +{ + ensures true; +} + +| int : void | fflush (FILE *stream ) +{ + ensures true; +} + +| int : char | fgetc (FILE *stream ) +{ + ensures true; +} + +int fgetpos (FILE *stream, fpos_t *pos ) +{ + ensures true; +} + +char *fgets (char *s, int n, FILE *stream ) +{ + ensures true; +} + + +FILE *fopen (char *filename, char *ttype ) +{ + ensures true; +} + +printflike +| int : void | fprintf (FILE *stream, char *format, ...) +{ + ensures true; +} + +printflike +| int : void | sprintf (FILE *stream, char *format, ...) +{ + ensures true; +} + +| int : void | fputc (| int : char | c, FILE *stream ) +{ + ensures true; +} + +| int : void | fputs( char *s, FILE *stream ) +{ + ensures true; +} + +size_t fread (void *ptr, size_t size, + size_t nitems, FILE *stream ) +{ + ensures true; +} + +FILE *freopen (char *filename, char *ttype, + FILE *stream) +{ + ensures true; +} + +scanflike +int fscanf (FILE *stream, char *format, ... ) +{ + ensures true; +} + +| int : void | fseek (FILE *stream, long offset, int ptrname) +{ + ensures true; +} + +int fsetpos (FILE *stream, fpos_t *pos) +{ + ensures true; +} + +long ftell (FILE *stream) +{ + ensures true; +} + +size_t fwrite (void *ptr, size_t size, + size_t nitems, FILE *stream) +{ + ensures true; +} + +char *gets (char *s) +{ + ensures true; +} + +void perror (char *s) +{ + ensures true; +} + +FILE *popen (char *command, char *ttype) +{ + ensures true; +} + +| int : void | ungetc(char c, FILE *stream) +{ + ensures true; +} + +printflike +| int : void | printf (char *format, ...) +{ + ensures true; +} + +| int : void | puts (char *s) +{ + ensures true; +} + +| int : bool | remove (char *filename) +{ + ensures true; +} + +| int : bool | rename (char *from, char *to) +{ + ensures true; +} + +void rewind (FILE *stream) +{ + ensures true; +} + +scanflike +| int : void | scanf (char *format, ...) +{ + ensures true; +} + +void setbuf (FILE *stream, char *buf) +{ + ensures true; +} + +int setvbuf (FILE *stream, char *buf, + int ttype, size_t size ) +{ + ensures true; +} + +scanflike +| int : void | sscanf (char *s, char *format, ...) +{ + ensures true; +} + +FILE *tmpfile( void ) +{ + ensures true; +} + +char *tmpnam (char *s) +{ + ensures true; +} + + + + + + + + + diff --git a/imports/stdio.lcs b/imports/stdio.lcs new file mode 100644 index 0000000..5df8462 --- /dev/null +++ b/imports/stdio.lcs @@ -0,0 +1,435 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _size_t synonym int nil +%LCLsort _wchar_t synonym int nil +%LCLsort _sstdlib0s_Struct str sstdlib0s nil +%LCLsort quot strMem _int_Obj nil +%LCLsort rem strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _int_Obj obj int nil +%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr +%LCLsort _div_t synonym _sstdlib0s_Struct nil +%LCLsort _sstdlib1s_Struct str sstdlib1s nil +%LCLsort quot strMem _int_Obj nil +%LCLsort rem strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr +%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil +%LCLsort _void_Obj obj void nil +%LCLsort __void_Obj_Ptr ptr _void_Obj nil +%LCLsort __void_Obj_Arr arr _void_Obj nil +%LCLsort _void_Vec vec void __void_Obj_Arr +%LCLsort _HOF_sort_32 hof nil nil +%LCLsort _HOF_sort_33 hof nil nil +%LCLsort __int_Obj_Ptr ptr _int_Obj nil +%LCLsort __int_Obj_Arr arr _int_Obj nil +%LCLsort _int_Vec vec int __int_Obj_Arr +%LCLsort _HOF_sort_37 hof nil nil +%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil +%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil +%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil +%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr +%LCLsort FILE immutable nil nil +%LCLsort _va_list synonym __void_Obj_Ptr nil +%LCLsort _fpos_t synonym __void_Obj_Ptr nil +%LCLsort _FILE_Obj obj FILE nil +%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil +%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil +%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr +%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil +%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil +%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil +%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil +%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr +%LCLSortTableEnd +%LCLSymbolTable +%LCLop mod :int, int -> int +%LCLop min :int, int -> int +%LCLop max :int, int -> int +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop count :char, _char_Vec -> int +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop init :_char_Vec -> _char_Vec +%LCLop isEmpty :_char_Vec -> bool +%LCLop last :_char_Vec -> char +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop lenStr :_char_Vec -> int +%LCLop times10plus :int, int -> int +%LCLop plus1 :int -> int +%LCLop 2 : -> int +%LCLop 3 : -> int +%LCLop 4 : -> int +%LCLop 5 : -> int +%LCLop 6 : -> int +%LCLop 7 : -> int +%LCLop 8 : -> int +%LCLop 9 : -> int +%LCLtag sstdlib0s struct +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLtag sstdlib1s struct +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop { __ } :char -> _char_Vec +%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr +%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr +%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr +%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr +%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr +%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr +%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple +%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct +%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple +%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct +%LCLop __ [__] :_void_Vec, int -> void +%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj +%LCLop __ [__] :_int_Vec, int -> int +%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj +%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr +%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj +%LCLop __ [__] :_FILE_Vec, int -> FILE +%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj +%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr +%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj +%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj +%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop null : -> char +%LCLop NIL : -> __char_Obj_Ptr +%LCLop NIL : -> __sstdlib0s_Struct_Ptr +%LCLop NIL : -> __sstdlib1s_Struct_Ptr +%LCLop NIL : -> __void_Obj_Ptr +%LCLop NIL : -> __int_Obj_Ptr +%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr +%LCLop NIL : -> __FILE_Obj_Ptr +%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ + __ :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr +%LCLop __ + __ :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr +%LCLop __ + __ :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr +%LCLop __ + __ :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr +%LCLop __ + __ :__void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLop __ + __ :int, __void_Obj_Ptr -> __void_Obj_Ptr +%LCLop __ + __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ + __ :int, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr +%LCLop __ + __ :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr +%LCLop __ + __ :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop __ - __ :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr +%LCLop __ - __ :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int +%LCLop __ - __ :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr +%LCLop __ - __ :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int +%LCLop __ - __ :__void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLop __ - __ :__void_Obj_Ptr, __void_Obj_Ptr -> int +%LCLop __ - __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ - __ :__int_Obj_Ptr, __int_Obj_Ptr -> int +%LCLop __ - __ :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ - __ :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int +%LCLop __ - __ :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr +%LCLop __ - __ :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int +%LCLop __ - __ :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ - __ :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop sizeof :FILE -> int +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool +%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool +%LCLop isSub :_void_Vec, int -> bool +%LCLop isSub :__void_Obj_Arr, int -> bool +%LCLop isSub :_int_Vec, int -> bool +%LCLop isSub :__int_Obj_Arr, int -> bool +%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool +%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool +%LCLop isSub :_FILE_Vec, int -> bool +%LCLop isSub :__FILE_Obj_Arr, int -> bool +%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool +%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool +%LCLop succ :int -> int +%LCLop pred :int -> int +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLtype size_t _size_t exposed +%LCLtype wchar_t _wchar_t exposed +%LCLtype div_t _div_t exposed +%LCLtype ldiv_t _ldiv_t exposed +%LCLconst NULL __void_Obj_Ptr +%LCLconst EXIT_FAILURE int +%LCLconst EXIT_SUCCESS int +%LCLconst RAND_MAX int +%LCLconst MB_CUR_MAX int +%LCLfcn abort : -> void +%LCLfcnGlobals +%LCLfcn abs : int -> int +%LCLfcnGlobals +%LCLfcn atexit : _HOF_sort_32 -> int +%LCLfcnGlobals +%LCLfcn atof : __char_Obj_Ptr -> double +%LCLfcnGlobals +%LCLfcn atoi : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn atol : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn calloc : int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn div : int, int -> _sstdlib0s_Struct +%LCLfcnGlobals +%LCLfcn exit : int -> void +%LCLfcnGlobals +%LCLfcn free : __void_Obj_Ptr -> void +%LCLfcnGlobals +%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn labs : int -> int +%LCLfcnGlobals +%LCLfcn ldiv : int, int -> _sstdlib1s_Struct +%LCLfcnGlobals +%LCLfcn malloc : int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn mblen : __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void +%LCLfcnGlobals +%LCLfcn rand : -> int +%LCLfcnGlobals +%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn srand : int -> void +%LCLfcnGlobals +%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double +%LCLfcnGlobals +%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn system : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn wctomb : __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void +%LCLfcnGlobals +%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool +%LCLfcnGlobals +%LCLfcn bzero : __char_Obj_Ptr, int -> void +%LCLfcnGlobals +%LCLfcn ffs : int -> int +%LCLfcnGlobals +%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool +%LCLfcnGlobals +%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLtype FILE FILE immutable +%LCLtype va_list _va_list exposed +%LCLtype fpos_t _fpos_t exposed +%LCLvar stdin ___FILE_Obj_Ptr_Obj +%LCLvar stdout ___FILE_Obj_Ptr_Obj +%LCLvar stderr ___FILE_Obj_Ptr_Obj +%LCLconst EOF int +%LCLfcn getc : __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn getchar : -> int +%LCLfcnGlobals +%LCLfcn putc : int, __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn putchar : int -> int +%LCLfcnGlobals +%LCLfcn feof : __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn ferror : __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn fileno : __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn _filbuf : __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn clearerr : __FILE_Obj_Ptr -> void +%LCLfcnGlobals +%LCLfcn fclose : __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr +%LCLfcnGlobals +%LCLfcn fflush : __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn fgetc : __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr +%LCLfcnGlobals +%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn fputc : int, __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr +%LCLfcnGlobals +%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int +%LCLfcnGlobals +%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn ftell : __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn perror : __char_Obj_Ptr -> void +%LCLfcnGlobals +%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr +%LCLfcnGlobals +%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn printf : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn puts : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn remove : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn rewind : __FILE_Obj_Ptr -> void +%LCLfcnGlobals +%LCLfcn scanf : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void +%LCLfcnGlobals +%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int +%LCLfcnGlobals +%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn tmpfile : -> __FILE_Obj_Ptr +%LCLfcnGlobals +%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLSymbolTableEnd diff --git a/imports/stdlib.lcl b/imports/stdlib.lcl new file mode 100644 index 0000000..879234a --- /dev/null +++ b/imports/stdlib.lcl @@ -0,0 +1,246 @@ +/* +** stdlib.lcl +** +** based on red-cross:/usr/include/stdlib.h +** also includes misc functions from man bcopy +** man memory +*/ + +typedef unsigned int size_t; +typedef unsigned int wchar_t; + +typedef struct { + int quot; /* quotient */ + int rem; /* remainder */ + } div_t; /* result of div() */ + +typedef struct { + long quot; /* quotient */ + long rem; /* remainder */ + } ldiv_t; /* result of ldiv() */ + +constant null void *NULL; /* should be constant */ + +constant int EXIT_FAILURE, EXIT_SUCCESS; +constant long RAND_MAX; + +constant int MB_CUR_MAX; + +void abort(void) +{ + ensures true; +} + +int abs(int i) +{ + ensures result = abs(i); +} + +int atexit (void (*f)()) +{ + ensures true; +} + +double atof (char *nptr) +{ + ensures true ; /* sprintf(result) = nptr^ ? */ +} + +int atoi (char *nptr) +{ + ensures true ; +} + +long atol (char *nptr) +{ + ensures true ; +} + +void *bsearch (void *key, void *base, size_t nel, size_t size, + int (*compar)(void *, void *)) +{ + ensures true ; +} + +void *calloc (size_t nelem, size_t size) +{ + ensures true ; +} + +div_t div (int numer, int denom) +{ + ensures true; +} + +void exit(int status) +{ + ensures true; +} + +void free(void *ptr) +{ + modifies *ptr; + ensures true; /* trashed(ptr); */ +} + +char *getenv (char *name) +{ + ensures true; +} + +long labs (long j) +{ + ensures true; +} + +ldiv_t ldiv (long numer, long denum) +{ + ensures true; +} + +void *malloc (size_t size) +{ + ensures true; +} + +int mblen (char *s, size_t n) +{ + ensures true; +} + +size_t mbstowcs ( wchar_t *pwcs, char *s, size_t n) +{ + modifies *pwcs; + ensures true; +} + +int mbtowc (wchar_t *pwc, char *s, size_t n) +{ + modifies *pwc; + ensures true; +} + +void qsort (void *base, size_t nel, size_t width, + int (*compar)(void *, void *)) +{ + modifies *base; + ensures true; +} + +int rand (void) +{ + ensures true; +} + +void *realloc(void *ptr, size_t size) +{ + ensures true; +} + +void srand (unsigned int seed) +{ + ensures true; +} + +double strtod (char *nptr, char **eptr) +{ + modifies *eptr; + ensures true; +} + +long strtol (char *nptr, char **eptr, int base) +{ + modifies *eptr; + ensures true; +} + +unsigned long strtoul (char *nptr, char **eptr, int base) +{ + modifies *eptr; + ensures true; +} + +int system (char *string) +{ + ensures true; +} + +size_t wcstombs (char *s, wchar_t *pwcs, size_t n) +{ + modifies *s; + ensures true; +} + +int wctomb (char *s, wchar_t wchar) +{ + modifies *s; + ensures true; +} + +/* +** not part of stdlib.h, but built in to c? +*/ + +void bcopy (char *b1, char *b2, int length) +{ + modifies *b2; + ensures true; +} + +| bool : int | bcmp (char *b1, char *b2, int length) +{ + ensures true; +} + +void bzero (char *b1, int length) +{ + modifies *b1; + ensures true; +} + +int ffs (int i) +{ + ensures true; +} + +void *memccpy (void *s1, void *s2, int c, size_t n) +{ + modifies *s1; + ensures true; +} + +void *memchr (void *s, int c, size_t n) +{ + ensures true; +} + +| bool : int | memcmp (void *s1, void *s2, size_t n) +{ + ensures true; +} + +void *memcpy (void *s1, void *s2, size_t n) +{ + modifies *s1; + ensures true; +} + +void *memset (void *s, int c, size_t n) +{ + modifies *s; + ensures true; +} + +void *memmove (void *s1, void *s2, size_t n) +{ + modifies *s1; + ensures true; +} + + + + + + + + diff --git a/imports/stdlib.lcs b/imports/stdlib.lcs new file mode 100644 index 0000000..fdec47a --- /dev/null +++ b/imports/stdlib.lcs @@ -0,0 +1,303 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _size_t synonym int nil +%LCLsort _wchar_t synonym int nil +%LCLsort _sstdlib0s_Struct str sstdlib0s nil +%LCLsort rem strMem _int_Obj nil +%LCLsort quot strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _int_Obj obj int nil +%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr +%LCLsort _div_t synonym _sstdlib0s_Struct nil +%LCLsort _sstdlib1s_Struct str sstdlib1s nil +%LCLsort rem strMem _int_Obj nil +%LCLsort quot strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr +%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil +%LCLsort _void_Obj obj void nil +%LCLsort __void_Obj_Ptr ptr _void_Obj nil +%LCLsort __void_Obj_Arr arr _void_Obj nil +%LCLsort _void_Vec vec void __void_Obj_Arr +%LCLsort _HOF_sort_32 hof nil nil +%LCLsort _HOF_sort_33 hof nil nil +%LCLsort __int_Obj_Ptr ptr _int_Obj nil +%LCLsort __int_Obj_Arr arr _int_Obj nil +%LCLsort _int_Vec vec int __int_Obj_Arr +%LCLsort _HOF_sort_37 hof nil nil +%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil +%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil +%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil +%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr +%LCLSortTableEnd +%LCLSymbolTable +%LCLop mod :int, int -> int +%LCLop min :int, int -> int +%LCLop max :int, int -> int +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop count :char, _char_Vec -> int +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop init :_char_Vec -> _char_Vec +%LCLop isEmpty :_char_Vec -> bool +%LCLop last :_char_Vec -> char +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop lenStr :_char_Vec -> int +%LCLop times10plus :int, int -> int +%LCLop plus1 :int -> int +%LCLop 2 : -> int +%LCLop 3 : -> int +%LCLop 4 : -> int +%LCLop 5 : -> int +%LCLop 6 : -> int +%LCLop 7 : -> int +%LCLop 8 : -> int +%LCLop 9 : -> int +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop { __ } :char -> _char_Vec +%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr +%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr +%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr +%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr +%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple +%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct +%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple +%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct +%LCLop __ [__] :_void_Vec, int -> void +%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj +%LCLop __ [__] :_int_Vec, int -> int +%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj +%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr +%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj +%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop null : -> char +%LCLop NIL : -> __char_Obj_Ptr +%LCLop NIL : -> __sstdlib0s_Struct_Ptr +%LCLop NIL : -> __sstdlib1s_Struct_Ptr +%LCLop NIL : -> __void_Obj_Ptr +%LCLop NIL : -> __int_Obj_Ptr +%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ + __ :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr +%LCLop __ + __ :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr +%LCLop __ + __ :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr +%LCLop __ + __ :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr +%LCLop __ + __ :__void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLop __ + __ :int, __void_Obj_Ptr -> __void_Obj_Ptr +%LCLop __ + __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ + __ :int, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop __ - __ :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr +%LCLop __ - __ :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int +%LCLop __ - __ :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr +%LCLop __ - __ :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int +%LCLop __ - __ :__void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLop __ - __ :__void_Obj_Ptr, __void_Obj_Ptr -> int +%LCLop __ - __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ - __ :__int_Obj_Ptr, __int_Obj_Ptr -> int +%LCLop __ - __ :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ - __ :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool +%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool +%LCLop isSub :_void_Vec, int -> bool +%LCLop isSub :__void_Obj_Arr, int -> bool +%LCLop isSub :_int_Vec, int -> bool +%LCLop isSub :__int_Obj_Arr, int -> bool +%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool +%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool +%LCLop succ :int -> int +%LCLop pred :int -> int +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLtype size_t _size_t exposed +%LCLtype wchar_t _wchar_t exposed +%LCLtype div_t _div_t exposed +%LCLtype ldiv_t _ldiv_t exposed +%LCLconst NULL __void_Obj_Ptr +%LCLconst EXIT_FAILURE int +%LCLconst EXIT_SUCCESS int +%LCLconst RAND_MAX int +%LCLconst MB_CUR_MAX int +%LCLfcn abort : -> void +%LCLfcnGlobals +%LCLfcn abs : int -> int +%LCLfcnGlobals +%LCLfcn atexit : _HOF_sort_32 -> int +%LCLfcnGlobals +%LCLfcn atof : __char_Obj_Ptr -> double +%LCLfcnGlobals +%LCLfcn atoi : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn atol : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn calloc : int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn div : int, int -> _sstdlib0s_Struct +%LCLfcnGlobals +%LCLfcn exit : int -> void +%LCLfcnGlobals +%LCLfcn free : __void_Obj_Ptr -> void +%LCLfcnGlobals +%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn labs : int -> int +%LCLfcnGlobals +%LCLfcn ldiv : int, int -> _sstdlib1s_Struct +%LCLfcnGlobals +%LCLfcn malloc : int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn mblen : __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void +%LCLfcnGlobals +%LCLfcn rand : -> int +%LCLfcnGlobals +%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn srand : int -> void +%LCLfcnGlobals +%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double +%LCLfcnGlobals +%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn system : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn wctomb : __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void +%LCLfcnGlobals +%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool +%LCLfcnGlobals +%LCLfcn bzero : __char_Obj_Ptr, int -> void +%LCLfcnGlobals +%LCLfcn ffs : int -> int +%LCLfcnGlobals +%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool +%LCLfcnGlobals +%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLSymbolTableEnd diff --git a/imports/string.lcl b/imports/string.lcl new file mode 100644 index 0000000..1f2e05f --- /dev/null +++ b/imports/string.lcl @@ -0,0 +1,95 @@ +/* +** strings.lcl +*/ + +int strcasecmp(char *s1, char *s2) +{ + ensures true ; +} + +int strncasecmp(char *s1, char *s2, int n) +{ + ensures true ; +} + +char *strcat(char *s1, char *s2) +{ + ensures true ; +} + +char *strncat(char *s1, char *s2, int n) +{ + ensures true ; +} + +int strcmp(char *s1, char *s2) +{ + ensures true ; +} + +int strncmp(char *s1, char *s2, int n) +{ + ensures true ; +} + +| char : void | *strcpy(char *s1, char *s2) +{ + ensures true ; +} + +char *strncpy(char *s1, char *s2, int n) +{ + ensures true ; +} + +int strlen(char *s) +{ + ensures true ; +} + +char *strchr(char *s, int c) +{ + ensures true ; +} + +char *strrchr(char *s, int c) +{ + ensures true ; +} + +char *strpbrk(char *s1, char *s2) +{ + ensures true ; +} + +int strspn(char *s1, char *s2) +{ + ensures true ; +} + +int strcspn(char *s1, char *s2) +{ + ensures true ; +} + +char *strtok(char *s1, char *s2) +{ + ensures true ; +} + +char *index(char *s, char c) +{ + ensures true ; +} + +char *rindex(char *s, char c) +{ + ensures true ; +} + +char *strstr(char *s1, char *s2) +{ + ensures true ; +} + + diff --git a/imports/string.lcs b/imports/string.lcs new file mode 100644 index 0000000..ea85b5d --- /dev/null +++ b/imports/string.lcs @@ -0,0 +1,883 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _eerrno0e_Enum enum eerrno0e nil +%LCLsort EDUPTOOMANYCPUS enumMem nil nil +%LCLsort EDUPINTRANSIT enumMem nil nil +%LCLsort EDUPBADOPCODE enumMem nil nil +%LCLsort EDUPNOTRUN enumMem nil nil +%LCLsort EDUPNOTWAIT enumMem nil nil +%LCLsort EDUPNOTIDLE enumMem nil nil +%LCLsort EDUPNOTCNTD enumMem nil nil +%LCLsort EDUPNODISCONN enumMem nil nil +%LCLsort EDUPNOCONN enumMem nil nil +%LCLsort ENODUST enumMem nil nil +%LCLsort ENOSYSTEM enumMem nil nil +%LCLsort ENORESOURCES enumMem nil nil +%LCLsort ENOACTIVE enumMem nil nil +%LCLsort EACTIVE enumMem nil nil +%LCLsort ENOSYS enumMem nil nil +%LCLsort ENOLCK enumMem nil nil +%LCLsort EDEADLK enumMem nil nil +%LCLsort EALIGN enumMem nil nil +%LCLsort EIDRM enumMem nil nil +%LCLsort ENOMSG enumMem nil nil +%LCLsort EREMOTE enumMem nil nil +%LCLsort ESTALE enumMem nil nil +%LCLsort EDQUOT enumMem nil nil +%LCLsort EUSERS enumMem nil nil +%LCLsort EPROCLIM enumMem nil nil +%LCLsort ENOTEMPTY enumMem nil nil +%LCLsort EHOSTUNREACH enumMem nil nil +%LCLsort EHOSTDOWN enumMem nil nil +%LCLsort ENAMETOOLONG enumMem nil nil +%LCLsort ELOOP enumMem nil nil +%LCLsort ECONNREFUSED enumMem nil nil +%LCLsort ETIMEDOUT enumMem nil nil +%LCLsort ETOOMANYREFS enumMem nil nil +%LCLsort ESHUTDOWN enumMem nil nil +%LCLsort ENOTCONN enumMem nil nil +%LCLsort EISCONN enumMem nil nil +%LCLsort ENOBUFS enumMem nil nil +%LCLsort ECONNRESET enumMem nil nil +%LCLsort ECONNABORTED enumMem nil nil +%LCLsort ENETRESET enumMem nil nil +%LCLsort ENETUNREACH enumMem nil nil +%LCLsort ENETDOWN enumMem nil nil +%LCLsort EADDRNOTAVAIL enumMem nil nil +%LCLsort EADDRINUSE enumMem nil nil +%LCLsort EAFNOSUPPORT enumMem nil nil +%LCLsort EPFNOSUPPORT enumMem nil nil +%LCLsort EOPNOTSUPP enumMem nil nil +%LCLsort ESOCKTNOSUPPORT enumMem nil nil +%LCLsort EPROTONOSUPPORT enumMem nil nil +%LCLsort ENOPROTOOPT enumMem nil nil +%LCLsort EPROTOTYPE enumMem nil nil +%LCLsort EMSGSIZE enumMem nil nil +%LCLsort EDESTADDRREQ enumMem nil nil +%LCLsort ENOTSOCK enumMem nil nil +%LCLsort EALREADY enumMem nil nil +%LCLsort EINPROGRESS enumMem nil nil +%LCLsort EWOULDBLOCK enumMem nil nil +%LCLsort ERANGE enumMem nil nil +%LCLsort EDOM enumMem nil nil +%LCLsort EPIPE enumMem nil nil +%LCLsort EMLINK enumMem nil nil +%LCLsort EROFS enumMem nil nil +%LCLsort ESPIPE enumMem nil nil +%LCLsort ENOSPC enumMem nil nil +%LCLsort EFBIG enumMem nil nil +%LCLsort ETXTBSY enumMem nil nil +%LCLsort ENOTTY enumMem nil nil +%LCLsort EMFILE enumMem nil nil +%LCLsort ENFILE enumMem nil nil +%LCLsort EINVAL enumMem nil nil +%LCLsort EISDIR enumMem nil nil +%LCLsort ENOTDIR enumMem nil nil +%LCLsort ENODEV enumMem nil nil +%LCLsort EXDEV enumMem nil nil +%LCLsort EEXIST enumMem nil nil +%LCLsort EBUSY enumMem nil nil +%LCLsort ENOTBLK enumMem nil nil +%LCLsort EFAULT enumMem nil nil +%LCLsort EACCES enumMem nil nil +%LCLsort ENOMEM enumMem nil nil +%LCLsort EAGAIN enumMem nil nil +%LCLsort ECHILD enumMem nil nil +%LCLsort EBADF enumMem nil nil +%LCLsort ENOEXEC enumMem nil nil +%LCLsort E2BIG enumMem nil nil +%LCLsort ENXIO enumMem nil nil +%LCLsort EIO enumMem nil nil +%LCLsort EINTR enumMem nil nil +%LCLsort ESRCH enumMem nil nil +%LCLsort ENOENT enumMem nil nil +%LCLsort EPERM enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __eerrno0e_Enum_Obj obj _eerrno0e_Enum nil +%LCLsort _int_Obj obj int nil +%LCLsort _lconv_Struct str lconv nil +%LCLsort n_sign_posn strMem _char_Obj nil +%LCLsort p_sign_posn strMem _char_Obj nil +%LCLsort n_sep_by_space strMem _char_Obj nil +%LCLsort n_cs_precedes strMem _char_Obj nil +%LCLsort p_sep_by_space strMem _char_Obj nil +%LCLsort p_cs_precedes strMem _char_Obj nil +%LCLsort frac_digits strMem _char_Obj nil +%LCLsort int_frac_digits strMem _char_Obj nil +%LCLsort negative_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort positive_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort currency_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort int_curr_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil +%LCLsort _lconv_Struct_Tuple tup _lconv_Struct nil +%LCLsort __lconv_Struct_Ptr ptr _lconv_Struct nil +%LCLsort __lconv_Struct_Arr arr _lconv_Struct nil +%LCLsort __lconv_Struct_Tuple_Vec vec _lconv_Struct_Tuple __lconv_Struct_Arr +%LCLsort ___lconv synonym _lconv_Struct nil +%LCLsort _exception_Struct str exception nil +%LCLsort retval strMem _double_Obj nil +%LCLsort arg2 strMem _double_Obj nil +%LCLsort arg1 strMem _double_Obj nil +%LCLsort name strMem ___char_Obj_Ptr_Obj nil +%LCLsort ttype strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _double_Obj obj double nil +%LCLsort _exception_Struct_Tuple tup _exception_Struct nil +%LCLsort __exception_Struct_Ptr ptr _exception_Struct nil +%LCLsort __exception_Struct_Arr arr _exception_Struct nil +%LCLsort __exception_Struct_Tuple_Vec vec _exception_Struct_Tuple __exception_Struct_Arr +%LCLsort ___exception synonym _exception_Struct nil +%LCLsort __int_Obj_Ptr ptr _int_Obj nil +%LCLsort __int_Obj_Arr arr _int_Obj nil +%LCLsort _int_Vec vec int __int_Obj_Arr +%LCLsort __double_Obj_Ptr ptr _double_Obj nil +%LCLsort __double_Obj_Arr arr _double_Obj nil +%LCLsort _double_Vec vec double __double_Obj_Arr +%LCLsort _emath1e_Enum enum emath1e nil +%LCLsort PLOSS enumMem nil nil +%LCLsort TLOSS enumMem nil nil +%LCLsort UNDERFLOW enumMem nil nil +%LCLsort OVERFLOW enumMem nil nil +%LCLsort SING enumMem nil nil +%LCLsort DOMAIN enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __emath1e_Enum_Obj obj _emath1e_Enum nil +%LCLsort _jmp_buf synonym __int_Obj_Arr nil +%LCLsort _sigjmp_buf synonym __int_Obj_Arr nil +%LCLsort _sig_atomic_t synonym int nil +%LCLsort _sigset_t synonym int nil +%LCLsort _sigvec_Struct str sigvec nil +%LCLsort sv_flags strMem _int_Obj nil +%LCLsort sv_mask strMem _int_Obj nil +%LCLsort sv_handler strMem _HOF_sort_43 nil +%LCLsort strEnd nil nil nil +%LCLsort _HOF_sort_43 hof nil nil +%LCLsort _sigvec_Struct_Tuple tup _sigvec_Struct nil +%LCLsort __sigvec_Struct_Ptr ptr _sigvec_Struct nil +%LCLsort __sigvec_Struct_Arr arr _sigvec_Struct nil +%LCLsort __sigvec_Struct_Tuple_Vec vec _sigvec_Struct_Tuple __sigvec_Struct_Arr +%LCLsort ___sigvec synonym _sigvec_Struct nil +%LCLsort _sigaction_Struct str sigaction nil +%LCLsort sa_flags strMem _int_Obj nil +%LCLsort sa_mask strMem _int_Obj nil +%LCLsort sa_handler strMem _HOF_sort_50 nil +%LCLsort strEnd nil nil nil +%LCLsort _HOF_sort_50 hof nil nil +%LCLsort _sigaction_Struct_Tuple tup _sigaction_Struct nil +%LCLsort __sigaction_Struct_Ptr ptr _sigaction_Struct nil +%LCLsort __sigaction_Struct_Arr arr _sigaction_Struct nil +%LCLsort __sigaction_Struct_Tuple_Vec vec _sigaction_Struct_Tuple __sigaction_Struct_Arr +%LCLsort ___sigaction synonym _sigaction_Struct nil +%LCLsort _sigstack_Struct str sigstack nil +%LCLsort ss_onstack strMem _int_Obj nil +%LCLsort ss_sp strMem ___char_Obj_Ptr_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sigstack_Struct_Tuple tup _sigstack_Struct nil +%LCLsort __sigstack_Struct_Ptr ptr _sigstack_Struct nil +%LCLsort __sigstack_Struct_Arr arr _sigstack_Struct nil +%LCLsort __sigstack_Struct_Tuple_Vec vec _sigstack_Struct_Tuple __sigstack_Struct_Arr +%LCLsort ___sigstack synonym _sigstack_Struct nil +%LCLsort _sigcontext_Struct str sigcontext nil +%LCLsort sc_badpaddr strMem _int_Obj nil +%LCLsort sc_badvaddr strMem _int_Obj nil +%LCLsort sc_cause strMem _int_Obj nil +%LCLsort sc_fpc_eir strMem _int_Obj nil +%LCLsort sc_fpc_csr strMem _int_Obj nil +%LCLsort sc_fpregs strMem __int_Obj_Arr nil +%LCLsort sc_ownedfp strMem _int_Obj nil +%LCLsort sc_mdhi strMem _int_Obj nil +%LCLsort sc_mdlo strMem _int_Obj nil +%LCLsort sc_regs strMem __int_Obj_Arr nil +%LCLsort sc_pc strMem _int_Obj nil +%LCLsort sc_mask strMem _int_Obj nil +%LCLsort sc_onstack strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sigcontext_Struct_Tuple tup _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Ptr ptr _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Arr arr _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Tuple_Vec vec _sigcontext_Struct_Tuple __sigcontext_Struct_Arr +%LCLsort ___sigcontext synonym _sigcontext_Struct nil +%LCLsort _HOF_sort_68 hof nil nil +%LCLsort ___scp synonym _HOF_sort_68 nil +%LCLsort _pid_t synonym int nil +%LCLsort _ptrdiff_t synonym int nil +%LCLsort _size_t synonym int nil +%LCLsort _wchar_t synonym int nil +%LCLsort _sstdlib_lcl0s_Struct str sstdlib_lcl0s nil +%LCLsort quot strMem _int_Obj nil +%LCLsort rem strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib_lcl0s_Struct_Tuple tup _sstdlib_lcl0s_Struct nil +%LCLsort __sstdlib_lcl0s_Struct_Ptr ptr _sstdlib_lcl0s_Struct nil +%LCLsort __sstdlib_lcl0s_Struct_Arr arr _sstdlib_lcl0s_Struct nil +%LCLsort __sstdlib_lcl0s_Struct_Tuple_Vec vec _sstdlib_lcl0s_Struct_Tuple __sstdlib_lcl0s_Struct_Arr +%LCLsort _div_t synonym _sstdlib_lcl0s_Struct nil +%LCLsort _sstdlib_lcl1s_Struct str sstdlib_lcl1s nil +%LCLsort quot strMem _int_Obj nil +%LCLsort rem strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib_lcl1s_Struct_Tuple tup _sstdlib_lcl1s_Struct nil +%LCLsort __sstdlib_lcl1s_Struct_Ptr ptr _sstdlib_lcl1s_Struct nil +%LCLsort __sstdlib_lcl1s_Struct_Arr arr _sstdlib_lcl1s_Struct nil +%LCLsort __sstdlib_lcl1s_Struct_Tuple_Vec vec _sstdlib_lcl1s_Struct_Tuple __sstdlib_lcl1s_Struct_Arr +%LCLsort _ldiv_t synonym _sstdlib_lcl1s_Struct nil +%LCLsort _void_Obj obj void nil +%LCLsort __void_Obj_Ptr ptr _void_Obj nil +%LCLsort __void_Obj_Arr arr _void_Obj nil +%LCLsort _void_Vec vec void __void_Obj_Arr +%LCLsort ____vp synonym __void_Obj_Ptr nil +%LCLsort _HOF_Sort_33 hof nil nil +%LCLsort _HOF_Sort_34 hof nil nil +%LCLsort _HOF_Sort_38 hof nil nil +%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil +%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil +%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr +%LCLsort FILE immutable nil nil +%LCLsort _va_list synonym __void_Obj_Ptr nil +%LCLsort _fpos_t synonym __void_Obj_Ptr nil +%LCLsort _FILE_Obj obj FILE nil +%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil +%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil +%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr +%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil +%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil +%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil +%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil +%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr +%LCLsort _sstdlib0s_Struct str sstdlib0s nil +%LCLsort rem strMem _int_Obj nil +%LCLsort quot strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr +%LCLsort _sstdlib1s_Struct str sstdlib1s nil +%LCLsort rem strMem _int_Obj nil +%LCLsort quot strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr +%LCLsort _HOF_sort_119 hof nil nil +%LCLsort _HOF_sort_120 hof nil nil +%LCLsort _HOF_sort_121 hof nil nil +%LCLsort _HOF_sort_122 hof nil nil +%LCLsort _HOF_sort_123 hof nil nil +%LCLsort _HOF_sort_124 hof nil nil +%LCLsort _HOF_sort_125 hof nil nil +%LCLsort _HOF_sort_126 hof nil nil +%LCLsort _HOF_sort_127 hof nil nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop __ \field_arrow sc_badvaddr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop ENOMSG : -> _eerrno0e_Enum +%LCLop mod :int, int -> int +%LCLop __ \field_arrow sc_badpaddr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop EIDRM : -> _eerrno0e_Enum +%LCLop min :int, int -> int +%LCLop EALIGN : -> _eerrno0e_Enum +%LCLop max :int, int -> int +%LCLop EDEADLK : -> _eerrno0e_Enum +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop ENOLCK : -> _eerrno0e_Enum +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop ENOSYS : -> _eerrno0e_Enum +%LCLop EACTIVE : -> _eerrno0e_Enum +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop ENOACTIVE : -> _eerrno0e_Enum +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop ENORESOURCES : -> _eerrno0e_Enum +%LCLop ENOSYSTEM : -> _eerrno0e_Enum +%LCLop ENODUST : -> _eerrno0e_Enum +%LCLop count :char, _char_Vec -> int +%LCLop EDUPNOCONN : -> _eerrno0e_Enum +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop EDUPNODISCONN : -> _eerrno0e_Enum +%LCLop init :_char_Vec -> _char_Vec +%LCLop EDUPNOTCNTD : -> _eerrno0e_Enum +%LCLop isEmpty :_char_Vec -> bool +%LCLop EDUPNOTIDLE : -> _eerrno0e_Enum +%LCLop last :_char_Vec -> char +%LCLop EDUPNOTWAIT : -> _eerrno0e_Enum +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop EDUPNOTRUN : -> _eerrno0e_Enum +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop EDUPBADOPCODE : -> _eerrno0e_Enum +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop EDUPINTRANSIT : -> _eerrno0e_Enum +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop EDUPTOOMANYCPUS : -> _eerrno0e_Enum +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLtag sstdlib_lcl0s struct +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLtag eerrno0e enum +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop __ \select decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop lenStr :_char_Vec -> int +%LCLop __ \select thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop times10plus :int, int -> int +%LCLop __ \field_arrow decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop plus1 :int -> int +%LCLop __ \field_arrow thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_curr_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select int_curr_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 2 : -> int +%LCLop __ \field_arrow grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select currency_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select currency_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 3 : -> int +%LCLtag exception struct +%LCLop __ \field_arrow int_curr_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 4 : -> int +%LCLtag sstdlib_lcl1s struct +%LCLop __ \field_arrow currency_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 5 : -> int +%LCLop __ \field_arrow mon_decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 6 : -> int +%LCLop __ \field_arrow mon_thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select positive_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select positive_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 7 : -> int +%LCLop __ \field_arrow mon_grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select negative_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select negative_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 8 : -> int +%LCLtag sigvec struct +%LCLop __ \field_arrow positive_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select int_frac_digits :_lconv_Struct -> _char_Obj +%LCLop 9 : -> int +%LCLop __ \field_arrow negative_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select frac_digits :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow int_frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select p_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select n_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \field_arrow n_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLtag sigaction struct +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \select rem :_sstdlib_lcl0s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib_lcl0s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib_lcl1s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib_lcl1s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \select quot :_sstdlib_lcl0s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib_lcl0s_Struct -> _int_Obj +%LCLop __ \select quot :_sstdlib_lcl1s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib_lcl1s_Struct -> _int_Obj +%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj +%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop __ \field_arrow rem :__sstdlib_lcl0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib_lcl1s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj +%LCLop { __ } :char -> _char_Vec +%LCLop __ \field_arrow quot :__sstdlib_lcl0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib_lcl1s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj +%LCLop EPERM : -> _eerrno0e_Enum +%LCLop ENOENT : -> _eerrno0e_Enum +%LCLtag sstdlib0s struct +%LCLop ESRCH : -> _eerrno0e_Enum +%LCLop EINTR : -> _eerrno0e_Enum +%LCLop __ \select ttype :_exception_Struct_Tuple -> int +%LCLop __ \select ttype :_exception_Struct -> _int_Obj +%LCLop EIO : -> _eerrno0e_Enum +%LCLop __ \select name :_exception_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select name :_exception_Struct -> ___char_Obj_Ptr_Obj +%LCLop ENXIO : -> _eerrno0e_Enum +%LCLop __ \field_arrow ttype :__exception_Struct_Ptr -> _int_Obj +%LCLop __ \select arg1 :_exception_Struct_Tuple -> double +%LCLop __ \select arg1 :_exception_Struct -> _double_Obj +%LCLop E2BIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow name :__exception_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select arg2 :_exception_Struct_Tuple -> double +%LCLop __ \select arg2 :_exception_Struct -> _double_Obj +%LCLop ENOEXEC : -> _eerrno0e_Enum +%LCLtag sstdlib1s struct +%LCLop __ \field_arrow arg1 :__exception_Struct_Ptr -> _double_Obj +%LCLop __ \select retval :_exception_Struct_Tuple -> double +%LCLop __ \select retval :_exception_Struct -> _double_Obj +%LCLop EBADF : -> _eerrno0e_Enum +%LCLop __ \select sv_handler :_sigvec_Struct_Tuple -> _HOF_sort_43 +%LCLop __ \select sv_handler :_sigvec_Struct -> _HOF_sort_43 +%LCLop __ \field_arrow arg2 :__exception_Struct_Ptr -> _double_Obj +%LCLop ECHILD : -> _eerrno0e_Enum +%LCLop [__, __] :int, __char_Obj_Ptr -> _sigstack_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib_lcl0s_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib_lcl1s_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple +%LCLop __ \select sv_mask :_sigvec_Struct_Tuple -> int +%LCLop __ \select sv_mask :_sigvec_Struct -> _int_Obj +%LCLop __ \field_arrow retval :__exception_Struct_Ptr -> _double_Obj +%LCLop EAGAIN : -> _eerrno0e_Enum +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [] :__lconv_Struct_Ptr -> __lconv_Struct_Arr +%LCLop __ [] :__exception_Struct_Ptr -> __exception_Struct_Arr +%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr +%LCLop __ [] :__double_Obj_Ptr -> __double_Obj_Arr +%LCLop __ [] :__sigvec_Struct_Ptr -> __sigvec_Struct_Arr +%LCLop __ [] :__sigaction_Struct_Ptr -> __sigaction_Struct_Arr +%LCLop __ [] :__sigstack_Struct_Ptr -> __sigstack_Struct_Arr +%LCLop __ [] :__sigcontext_Struct_Ptr -> __sigcontext_Struct_Arr +%LCLop __ [] :__sstdlib_lcl0s_Struct_Ptr -> __sstdlib_lcl0s_Struct_Arr +%LCLop __ [] :__sstdlib_lcl1s_Struct_Ptr -> __sstdlib_lcl1s_Struct_Arr +%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr +%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr +%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr +%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr +%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr +%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr +%LCLop __ \field_arrow sv_handler :__sigvec_Struct_Ptr -> _HOF_sort_43 +%LCLop __ \select sv_flags :_sigvec_Struct_Tuple -> int +%LCLop __ \select sv_flags :_sigvec_Struct -> _int_Obj +%LCLop ENOMEM : -> _eerrno0e_Enum +%LCLtag sigstack struct +%LCLop __ \field_arrow sv_mask :__sigvec_Struct_Ptr -> _int_Obj +%LCLop [__, __, __] :int, int, _HOF_sort_43 -> _sigvec_Struct_Tuple +%LCLop [__, __, __] :int, int, _HOF_sort_50 -> _sigaction_Struct_Tuple +%LCLop EACCES : -> _eerrno0e_Enum +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ [__] :__lconv_Struct_Tuple_Vec, int -> _lconv_Struct_Tuple +%LCLop __ [__] :__lconv_Struct_Arr, int -> _lconv_Struct +%LCLop __ [__] :__exception_Struct_Tuple_Vec, int -> _exception_Struct_Tuple +%LCLop __ [__] :__exception_Struct_Arr, int -> _exception_Struct +%LCLop __ [__] :_int_Vec, int -> int +%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj +%LCLop __ [__] :_double_Vec, int -> double +%LCLop __ [__] :__double_Obj_Arr, int -> _double_Obj +%LCLop __ [__] :__sigvec_Struct_Tuple_Vec, int -> _sigvec_Struct_Tuple +%LCLop __ [__] :__sigvec_Struct_Arr, int -> _sigvec_Struct +%LCLop __ [__] :__sigaction_Struct_Tuple_Vec, int -> _sigaction_Struct_Tuple +%LCLop __ [__] :__sigaction_Struct_Arr, int -> _sigaction_Struct +%LCLop __ [__] :__sigstack_Struct_Tuple_Vec, int -> _sigstack_Struct_Tuple +%LCLop __ [__] :__sigstack_Struct_Arr, int -> _sigstack_Struct +%LCLop __ [__] :__sigcontext_Struct_Tuple_Vec, int -> _sigcontext_Struct_Tuple +%LCLop __ [__] :__sigcontext_Struct_Arr, int -> _sigcontext_Struct +%LCLop __ [__] :__sstdlib_lcl0s_Struct_Tuple_Vec, int -> _sstdlib_lcl0s_Struct_Tuple +%LCLop __ [__] :__sstdlib_lcl0s_Struct_Arr, int -> _sstdlib_lcl0s_Struct +%LCLop __ [__] :__sstdlib_lcl1s_Struct_Tuple_Vec, int -> _sstdlib_lcl1s_Struct_Tuple +%LCLop __ [__] :__sstdlib_lcl1s_Struct_Arr, int -> _sstdlib_lcl1s_Struct +%LCLop __ [__] :_void_Vec, int -> void +%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj +%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr +%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj +%LCLop __ [__] :_FILE_Vec, int -> FILE +%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj +%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr +%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj +%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple +%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct +%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple +%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct +%LCLop __ \field_arrow sv_flags :__sigvec_Struct_Ptr -> _int_Obj +%LCLop EFAULT : -> _eerrno0e_Enum +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop ENOTBLK : -> _eerrno0e_Enum +%LCLop EBUSY : -> _eerrno0e_Enum +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop [__, __, __, __, __] :double, double, double, __char_Obj_Ptr, int -> _exception_Struct_Tuple +%LCLop EEXIST : -> _eerrno0e_Enum +%LCLop EXDEV : -> _eerrno0e_Enum +%LCLop ENODEV : -> _eerrno0e_Enum +%LCLop ENOTDIR : -> _eerrno0e_Enum +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop EISDIR : -> _eerrno0e_Enum +%LCLop EINVAL : -> _eerrno0e_Enum +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop ENFILE : -> _eerrno0e_Enum +%LCLop \A :bool, bool -> bool +%LCLop \A :int, bool -> bool +%LCLop \A :double, bool -> bool +%LCLop \A :_char_Vec, bool -> bool +%LCLop \A :char, bool -> bool +%LCLop __ \select sa_handler :_sigaction_Struct_Tuple -> _HOF_sort_50 +%LCLop __ \select sa_handler :_sigaction_Struct -> _HOF_sort_50 +%LCLop EMFILE : -> _eerrno0e_Enum +%LCLtag sigcontext struct +%LCLop \E :bool, bool -> bool +%LCLop \E :int, bool -> bool +%LCLop \E :double, bool -> bool +%LCLop \E :_char_Vec, bool -> bool +%LCLop \E :char, bool -> bool +%LCLop __ \select sa_mask :_sigaction_Struct_Tuple -> int +%LCLop __ \select sa_mask :_sigaction_Struct -> _int_Obj +%LCLop ENOTTY : -> _eerrno0e_Enum +%LCLop __ \field_arrow sa_handler :__sigaction_Struct_Ptr -> _HOF_sort_50 +%LCLop __ \select sa_flags :_sigaction_Struct_Tuple -> int +%LCLop __ \select sa_flags :_sigaction_Struct -> _int_Obj +%LCLop ETXTBSY : -> _eerrno0e_Enum +%LCLop null : -> char +%LCLop __ \field_arrow sa_mask :__sigaction_Struct_Ptr -> _int_Obj +%LCLop EFBIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow sa_flags :__sigaction_Struct_Ptr -> _int_Obj +%LCLop ENOSPC : -> _eerrno0e_Enum +%LCLop ESPIPE : -> _eerrno0e_Enum +%LCLop 32 : -> double +%LCLop EROFS : -> _eerrno0e_Enum +%LCLop EMLINK : -> _eerrno0e_Enum +%LCLop __ \iff __ :bool, bool -> bool +%LCLop EPIPE : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __] :int, int, int, int, int, _int_Vec, int, int, int, _int_Vec, int, int, int -> _sigcontext_Struct_Tuple +%LCLop EDOM : -> _eerrno0e_Enum +%LCLop ERANGE : -> _eerrno0e_Enum +%LCLop EWOULDBLOCK : -> _eerrno0e_Enum +%LCLop EINPROGRESS : -> _eerrno0e_Enum +%LCLop EALREADY : -> _eerrno0e_Enum +%LCLop ENOTSOCK : -> _eerrno0e_Enum +%LCLop EDESTADDRREQ : -> _eerrno0e_Enum +%LCLop EMSGSIZE : -> _eerrno0e_Enum +%LCLop EPROTOTYPE : -> _eerrno0e_Enum +%LCLop ENOPROTOOPT : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] :char, char, char, char, char, char, char, char, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr -> _lconv_Struct_Tuple +%LCLop EPROTONOSUPPORT : -> _eerrno0e_Enum +%LCLop ESOCKTNOSUPPORT : -> _eerrno0e_Enum +%LCLop EOPNOTSUPP : -> _eerrno0e_Enum +%LCLop __ \select ss_sp :_sigstack_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select ss_sp :_sigstack_Struct -> ___char_Obj_Ptr_Obj +%LCLop EPFNOSUPPORT : -> _eerrno0e_Enum +%LCLop __ \select ss_onstack :_sigstack_Struct_Tuple -> int +%LCLop __ \select ss_onstack :_sigstack_Struct -> _int_Obj +%LCLop EAFNOSUPPORT : -> _eerrno0e_Enum +%LCLop __ \field_arrow ss_sp :__sigstack_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop EADDRINUSE : -> _eerrno0e_Enum +%LCLop __ \field_arrow ss_onstack :__sigstack_Struct_Ptr -> _int_Obj +%LCLop EADDRNOTAVAIL : -> _eerrno0e_Enum +%LCLop NIL : -> __char_Obj_Ptr +%LCLop NIL : -> __lconv_Struct_Ptr +%LCLop NIL : -> __exception_Struct_Ptr +%LCLop NIL : -> __int_Obj_Ptr +%LCLop NIL : -> __double_Obj_Ptr +%LCLop NIL : -> __sigvec_Struct_Ptr +%LCLop NIL : -> __sigaction_Struct_Ptr +%LCLop NIL : -> __sigstack_Struct_Ptr +%LCLop NIL : -> __sigcontext_Struct_Ptr +%LCLop NIL : -> __sstdlib_lcl0s_Struct_Ptr +%LCLop NIL : -> __sstdlib_lcl1s_Struct_Ptr +%LCLop NIL : -> __void_Obj_Ptr +%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr +%LCLop NIL : -> __FILE_Obj_Ptr +%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr +%LCLop NIL : -> __sstdlib0s_Struct_Ptr +%LCLop NIL : -> __sstdlib1s_Struct_Ptr +%LCLop ENETDOWN : -> _eerrno0e_Enum +%LCLop ENETUNREACH : -> _eerrno0e_Enum +%LCLop ENETRESET : -> _eerrno0e_Enum +%LCLop ECONNABORTED : -> _eerrno0e_Enum +%LCLop ECONNRESET : -> _eerrno0e_Enum +%LCLop ENOBUFS : -> _eerrno0e_Enum +%LCLop EISCONN : -> _eerrno0e_Enum +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop ENOTCONN : -> _eerrno0e_Enum +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ + __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ + __ :int, __lconv_Struct_Ptr -> __lconv_Struct_Ptr +%LCLop __ + __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ + __ :int, __exception_Struct_Ptr -> __exception_Struct_Ptr +%LCLop __ + __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ + __ :int, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ + __ :int, __double_Obj_Ptr -> __double_Obj_Ptr +%LCLop __ + __ :__sigvec_Struct_Ptr, int -> __sigvec_Struct_Ptr +%LCLop __ + __ :int, __sigvec_Struct_Ptr -> __sigvec_Struct_Ptr +%LCLop __ + __ :__sigaction_Struct_Ptr, int -> __sigaction_Struct_Ptr +%LCLop __ + __ :int, __sigaction_Struct_Ptr -> __sigaction_Struct_Ptr +%LCLop __ + __ :__sigstack_Struct_Ptr, int -> __sigstack_Struct_Ptr +%LCLop __ + __ :int, __sigstack_Struct_Ptr -> __sigstack_Struct_Ptr +%LCLop __ + __ :__sigcontext_Struct_Ptr, int -> __sigcontext_Struct_Ptr +%LCLop __ + __ :int, __sigcontext_Struct_Ptr -> __sigcontext_Struct_Ptr +%LCLop __ + __ :__char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :__sstdlib_lcl0s_Struct_Ptr, int -> __sstdlib_lcl0s_Struct_Ptr +%LCLop __ + __ :__sstdlib_lcl0s_Struct_Ptr, __sstdlib_lcl0s_Struct_Ptr -> __sstdlib_lcl0s_Struct_Ptr +%LCLop __ + __ :__sstdlib_lcl1s_Struct_Ptr, int -> __sstdlib_lcl1s_Struct_Ptr +%LCLop __ + __ :__sstdlib_lcl1s_Struct_Ptr, __sstdlib_lcl1s_Struct_Ptr -> __sstdlib_lcl1s_Struct_Ptr +%LCLop __ + __ :__void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLop __ + __ :__void_Obj_Ptr, __void_Obj_Ptr -> __void_Obj_Ptr +%LCLop __ + __ :__int_Obj_Ptr, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr +%LCLop __ + __ :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr +%LCLop __ + __ :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr +%LCLop __ + __ :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr +%LCLop __ + __ :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr +%LCLop __ + __ :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr +%LCLop __ \select sc_onstack :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_onstack :_sigcontext_Struct -> _int_Obj +%LCLop ESHUTDOWN : -> _eerrno0e_Enum +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop __ - __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ - __ :__lconv_Struct_Ptr, __lconv_Struct_Ptr -> int +%LCLop __ - __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ - __ :__exception_Struct_Ptr, __exception_Struct_Ptr -> int +%LCLop __ - __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ - __ :__int_Obj_Ptr, __int_Obj_Ptr -> int +%LCLop __ - __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ - __ :__double_Obj_Ptr, __double_Obj_Ptr -> int +%LCLop __ - __ :__sigvec_Struct_Ptr, int -> __sigvec_Struct_Ptr +%LCLop __ - __ :__sigvec_Struct_Ptr, __sigvec_Struct_Ptr -> int +%LCLop __ - __ :__sigaction_Struct_Ptr, int -> __sigaction_Struct_Ptr +%LCLop __ - __ :__sigaction_Struct_Ptr, __sigaction_Struct_Ptr -> int +%LCLop __ - __ :__sigstack_Struct_Ptr, int -> __sigstack_Struct_Ptr +%LCLop __ - __ :__sigstack_Struct_Ptr, __sigstack_Struct_Ptr -> int +%LCLop __ - __ :__sigcontext_Struct_Ptr, int -> __sigcontext_Struct_Ptr +%LCLop __ - __ :__sigcontext_Struct_Ptr, __sigcontext_Struct_Ptr -> int +%LCLop __ - __ :__sstdlib_lcl0s_Struct_Ptr, int -> __sstdlib_lcl0s_Struct_Ptr +%LCLop __ - __ :__sstdlib_lcl0s_Struct_Ptr, __sstdlib_lcl0s_Struct_Ptr -> int +%LCLop __ - __ :__sstdlib_lcl1s_Struct_Ptr, int -> __sstdlib_lcl1s_Struct_Ptr +%LCLop __ - __ :__sstdlib_lcl1s_Struct_Ptr, __sstdlib_lcl1s_Struct_Ptr -> int +%LCLop __ - __ :__void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLop __ - __ :__void_Obj_Ptr, __void_Obj_Ptr -> int +%LCLop __ - __ :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ - __ :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int +%LCLop __ - __ :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr +%LCLop __ - __ :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int +%LCLop __ - __ :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ - __ :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int +%LCLop __ - __ :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr +%LCLop __ - __ :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int +%LCLop __ - __ :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr +%LCLop __ - __ :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop sizeof :_eerrno0e_Enum -> int +%LCLop sizeof :_emath1e_Enum -> int +%LCLop sizeof :FILE -> int +%LCLop __ \select sc_mask :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mask :_sigcontext_Struct -> _int_Obj +%LCLop DOMAIN : -> _emath1e_Enum +%LCLop ETOOMANYREFS : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_onstack :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_pc :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_pc :_sigcontext_Struct -> _int_Obj +%LCLop SING : -> _emath1e_Enum +%LCLop ETIMEDOUT : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mask :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_regs :_sigcontext_Struct_Tuple -> _int_Vec +%LCLop __ \select sc_regs :_sigcontext_Struct -> __int_Obj_Arr +%LCLop OVERFLOW : -> _emath1e_Enum +%LCLop ECONNREFUSED : -> _eerrno0e_Enum +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop isSub :__lconv_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__lconv_Struct_Arr, int -> bool +%LCLop isSub :__exception_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__exception_Struct_Arr, int -> bool +%LCLop isSub :_int_Vec, int -> bool +%LCLop isSub :__int_Obj_Arr, int -> bool +%LCLop isSub :_double_Vec, int -> bool +%LCLop isSub :__double_Obj_Arr, int -> bool +%LCLop isSub :__sigvec_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigvec_Struct_Arr, int -> bool +%LCLop isSub :__sigaction_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigaction_Struct_Arr, int -> bool +%LCLop isSub :__sigstack_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigstack_Struct_Arr, int -> bool +%LCLop isSub :__sigcontext_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigcontext_Struct_Arr, int -> bool +%LCLop isSub :__sstdlib_lcl0s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib_lcl0s_Struct_Arr, int -> bool +%LCLop isSub :__sstdlib_lcl1s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib_lcl1s_Struct_Arr, int -> bool +%LCLop isSub :_void_Vec, int -> bool +%LCLop isSub :__void_Obj_Arr, int -> bool +%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool +%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool +%LCLop isSub :_FILE_Vec, int -> bool +%LCLop isSub :__FILE_Obj_Arr, int -> bool +%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool +%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool +%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool +%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool +%LCLtag lconv struct +%LCLop __ \field_arrow sc_pc :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop UNDERFLOW : -> _emath1e_Enum +%LCLop ELOOP : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_regs :__sigcontext_Struct_Ptr -> __int_Obj_Arr +%LCLop __ \select sc_mdlo :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mdlo :_sigcontext_Struct -> _int_Obj +%LCLop TLOSS : -> _emath1e_Enum +%LCLop ENAMETOOLONG : -> _eerrno0e_Enum +%LCLop __ \select sc_mdhi :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mdhi :_sigcontext_Struct -> _int_Obj +%LCLop PLOSS : -> _emath1e_Enum +%LCLop EHOSTDOWN : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mdlo :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_ownedfp :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_ownedfp :_sigcontext_Struct -> _int_Obj +%LCLop EHOSTUNREACH : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mdhi :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_fpregs :_sigcontext_Struct_Tuple -> _int_Vec +%LCLop __ \select sc_fpregs :_sigcontext_Struct -> __int_Obj_Arr +%LCLop ENOTEMPTY : -> _eerrno0e_Enum +%LCLop succ :int -> int +%LCLtag emath1e enum +%LCLop __ \field_arrow sc_ownedfp :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_fpc_csr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_fpc_csr :_sigcontext_Struct -> _int_Obj +%LCLop EPROCLIM : -> _eerrno0e_Enum +%LCLop pred :int -> int +%LCLop __ \field_arrow sc_fpregs :__sigcontext_Struct_Ptr -> __int_Obj_Arr +%LCLop __ \select sc_fpc_eir :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_fpc_eir :_sigcontext_Struct -> _int_Obj +%LCLop EUSERS : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_fpc_csr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_cause :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_cause :_sigcontext_Struct -> _int_Obj +%LCLop EDQUOT : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_fpc_eir :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_badvaddr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_badvaddr :_sigcontext_Struct -> _int_Obj +%LCLop ESTALE : -> _eerrno0e_Enum +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop __ \field_arrow sc_cause :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_badpaddr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_badpaddr :_sigcontext_Struct -> _int_Obj +%LCLop EREMOTE : -> _eerrno0e_Enum +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLfcn strcasecmp : __char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn strncasecmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn strcat : __char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strncat : __char_Obj_Ptr, __char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strcmp : __char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn strncmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn strcpy : __char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strncpy : __char_Obj_Ptr, __char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strlen : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn strchr : __char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strrchr : __char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strpbrk : __char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strspn : __char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn strcspn : __char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn strtok : __char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn index : __char_Obj_Ptr, char -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn rindex : __char_Obj_Ptr, char -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strstr : __char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLSymbolTableEnd diff --git a/imports/strings.lcl b/imports/strings.lcl new file mode 100644 index 0000000..1f2e05f --- /dev/null +++ b/imports/strings.lcl @@ -0,0 +1,95 @@ +/* +** strings.lcl +*/ + +int strcasecmp(char *s1, char *s2) +{ + ensures true ; +} + +int strncasecmp(char *s1, char *s2, int n) +{ + ensures true ; +} + +char *strcat(char *s1, char *s2) +{ + ensures true ; +} + +char *strncat(char *s1, char *s2, int n) +{ + ensures true ; +} + +int strcmp(char *s1, char *s2) +{ + ensures true ; +} + +int strncmp(char *s1, char *s2, int n) +{ + ensures true ; +} + +| char : void | *strcpy(char *s1, char *s2) +{ + ensures true ; +} + +char *strncpy(char *s1, char *s2, int n) +{ + ensures true ; +} + +int strlen(char *s) +{ + ensures true ; +} + +char *strchr(char *s, int c) +{ + ensures true ; +} + +char *strrchr(char *s, int c) +{ + ensures true ; +} + +char *strpbrk(char *s1, char *s2) +{ + ensures true ; +} + +int strspn(char *s1, char *s2) +{ + ensures true ; +} + +int strcspn(char *s1, char *s2) +{ + ensures true ; +} + +char *strtok(char *s1, char *s2) +{ + ensures true ; +} + +char *index(char *s, char c) +{ + ensures true ; +} + +char *rindex(char *s, char c) +{ + ensures true ; +} + +char *strstr(char *s1, char *s2) +{ + ensures true ; +} + + diff --git a/imports/strings.lcs b/imports/strings.lcs new file mode 100644 index 0000000..ea85b5d --- /dev/null +++ b/imports/strings.lcs @@ -0,0 +1,883 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _eerrno0e_Enum enum eerrno0e nil +%LCLsort EDUPTOOMANYCPUS enumMem nil nil +%LCLsort EDUPINTRANSIT enumMem nil nil +%LCLsort EDUPBADOPCODE enumMem nil nil +%LCLsort EDUPNOTRUN enumMem nil nil +%LCLsort EDUPNOTWAIT enumMem nil nil +%LCLsort EDUPNOTIDLE enumMem nil nil +%LCLsort EDUPNOTCNTD enumMem nil nil +%LCLsort EDUPNODISCONN enumMem nil nil +%LCLsort EDUPNOCONN enumMem nil nil +%LCLsort ENODUST enumMem nil nil +%LCLsort ENOSYSTEM enumMem nil nil +%LCLsort ENORESOURCES enumMem nil nil +%LCLsort ENOACTIVE enumMem nil nil +%LCLsort EACTIVE enumMem nil nil +%LCLsort ENOSYS enumMem nil nil +%LCLsort ENOLCK enumMem nil nil +%LCLsort EDEADLK enumMem nil nil +%LCLsort EALIGN enumMem nil nil +%LCLsort EIDRM enumMem nil nil +%LCLsort ENOMSG enumMem nil nil +%LCLsort EREMOTE enumMem nil nil +%LCLsort ESTALE enumMem nil nil +%LCLsort EDQUOT enumMem nil nil +%LCLsort EUSERS enumMem nil nil +%LCLsort EPROCLIM enumMem nil nil +%LCLsort ENOTEMPTY enumMem nil nil +%LCLsort EHOSTUNREACH enumMem nil nil +%LCLsort EHOSTDOWN enumMem nil nil +%LCLsort ENAMETOOLONG enumMem nil nil +%LCLsort ELOOP enumMem nil nil +%LCLsort ECONNREFUSED enumMem nil nil +%LCLsort ETIMEDOUT enumMem nil nil +%LCLsort ETOOMANYREFS enumMem nil nil +%LCLsort ESHUTDOWN enumMem nil nil +%LCLsort ENOTCONN enumMem nil nil +%LCLsort EISCONN enumMem nil nil +%LCLsort ENOBUFS enumMem nil nil +%LCLsort ECONNRESET enumMem nil nil +%LCLsort ECONNABORTED enumMem nil nil +%LCLsort ENETRESET enumMem nil nil +%LCLsort ENETUNREACH enumMem nil nil +%LCLsort ENETDOWN enumMem nil nil +%LCLsort EADDRNOTAVAIL enumMem nil nil +%LCLsort EADDRINUSE enumMem nil nil +%LCLsort EAFNOSUPPORT enumMem nil nil +%LCLsort EPFNOSUPPORT enumMem nil nil +%LCLsort EOPNOTSUPP enumMem nil nil +%LCLsort ESOCKTNOSUPPORT enumMem nil nil +%LCLsort EPROTONOSUPPORT enumMem nil nil +%LCLsort ENOPROTOOPT enumMem nil nil +%LCLsort EPROTOTYPE enumMem nil nil +%LCLsort EMSGSIZE enumMem nil nil +%LCLsort EDESTADDRREQ enumMem nil nil +%LCLsort ENOTSOCK enumMem nil nil +%LCLsort EALREADY enumMem nil nil +%LCLsort EINPROGRESS enumMem nil nil +%LCLsort EWOULDBLOCK enumMem nil nil +%LCLsort ERANGE enumMem nil nil +%LCLsort EDOM enumMem nil nil +%LCLsort EPIPE enumMem nil nil +%LCLsort EMLINK enumMem nil nil +%LCLsort EROFS enumMem nil nil +%LCLsort ESPIPE enumMem nil nil +%LCLsort ENOSPC enumMem nil nil +%LCLsort EFBIG enumMem nil nil +%LCLsort ETXTBSY enumMem nil nil +%LCLsort ENOTTY enumMem nil nil +%LCLsort EMFILE enumMem nil nil +%LCLsort ENFILE enumMem nil nil +%LCLsort EINVAL enumMem nil nil +%LCLsort EISDIR enumMem nil nil +%LCLsort ENOTDIR enumMem nil nil +%LCLsort ENODEV enumMem nil nil +%LCLsort EXDEV enumMem nil nil +%LCLsort EEXIST enumMem nil nil +%LCLsort EBUSY enumMem nil nil +%LCLsort ENOTBLK enumMem nil nil +%LCLsort EFAULT enumMem nil nil +%LCLsort EACCES enumMem nil nil +%LCLsort ENOMEM enumMem nil nil +%LCLsort EAGAIN enumMem nil nil +%LCLsort ECHILD enumMem nil nil +%LCLsort EBADF enumMem nil nil +%LCLsort ENOEXEC enumMem nil nil +%LCLsort E2BIG enumMem nil nil +%LCLsort ENXIO enumMem nil nil +%LCLsort EIO enumMem nil nil +%LCLsort EINTR enumMem nil nil +%LCLsort ESRCH enumMem nil nil +%LCLsort ENOENT enumMem nil nil +%LCLsort EPERM enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __eerrno0e_Enum_Obj obj _eerrno0e_Enum nil +%LCLsort _int_Obj obj int nil +%LCLsort _lconv_Struct str lconv nil +%LCLsort n_sign_posn strMem _char_Obj nil +%LCLsort p_sign_posn strMem _char_Obj nil +%LCLsort n_sep_by_space strMem _char_Obj nil +%LCLsort n_cs_precedes strMem _char_Obj nil +%LCLsort p_sep_by_space strMem _char_Obj nil +%LCLsort p_cs_precedes strMem _char_Obj nil +%LCLsort frac_digits strMem _char_Obj nil +%LCLsort int_frac_digits strMem _char_Obj nil +%LCLsort negative_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort positive_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort currency_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort int_curr_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil +%LCLsort _lconv_Struct_Tuple tup _lconv_Struct nil +%LCLsort __lconv_Struct_Ptr ptr _lconv_Struct nil +%LCLsort __lconv_Struct_Arr arr _lconv_Struct nil +%LCLsort __lconv_Struct_Tuple_Vec vec _lconv_Struct_Tuple __lconv_Struct_Arr +%LCLsort ___lconv synonym _lconv_Struct nil +%LCLsort _exception_Struct str exception nil +%LCLsort retval strMem _double_Obj nil +%LCLsort arg2 strMem _double_Obj nil +%LCLsort arg1 strMem _double_Obj nil +%LCLsort name strMem ___char_Obj_Ptr_Obj nil +%LCLsort ttype strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _double_Obj obj double nil +%LCLsort _exception_Struct_Tuple tup _exception_Struct nil +%LCLsort __exception_Struct_Ptr ptr _exception_Struct nil +%LCLsort __exception_Struct_Arr arr _exception_Struct nil +%LCLsort __exception_Struct_Tuple_Vec vec _exception_Struct_Tuple __exception_Struct_Arr +%LCLsort ___exception synonym _exception_Struct nil +%LCLsort __int_Obj_Ptr ptr _int_Obj nil +%LCLsort __int_Obj_Arr arr _int_Obj nil +%LCLsort _int_Vec vec int __int_Obj_Arr +%LCLsort __double_Obj_Ptr ptr _double_Obj nil +%LCLsort __double_Obj_Arr arr _double_Obj nil +%LCLsort _double_Vec vec double __double_Obj_Arr +%LCLsort _emath1e_Enum enum emath1e nil +%LCLsort PLOSS enumMem nil nil +%LCLsort TLOSS enumMem nil nil +%LCLsort UNDERFLOW enumMem nil nil +%LCLsort OVERFLOW enumMem nil nil +%LCLsort SING enumMem nil nil +%LCLsort DOMAIN enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __emath1e_Enum_Obj obj _emath1e_Enum nil +%LCLsort _jmp_buf synonym __int_Obj_Arr nil +%LCLsort _sigjmp_buf synonym __int_Obj_Arr nil +%LCLsort _sig_atomic_t synonym int nil +%LCLsort _sigset_t synonym int nil +%LCLsort _sigvec_Struct str sigvec nil +%LCLsort sv_flags strMem _int_Obj nil +%LCLsort sv_mask strMem _int_Obj nil +%LCLsort sv_handler strMem _HOF_sort_43 nil +%LCLsort strEnd nil nil nil +%LCLsort _HOF_sort_43 hof nil nil +%LCLsort _sigvec_Struct_Tuple tup _sigvec_Struct nil +%LCLsort __sigvec_Struct_Ptr ptr _sigvec_Struct nil +%LCLsort __sigvec_Struct_Arr arr _sigvec_Struct nil +%LCLsort __sigvec_Struct_Tuple_Vec vec _sigvec_Struct_Tuple __sigvec_Struct_Arr +%LCLsort ___sigvec synonym _sigvec_Struct nil +%LCLsort _sigaction_Struct str sigaction nil +%LCLsort sa_flags strMem _int_Obj nil +%LCLsort sa_mask strMem _int_Obj nil +%LCLsort sa_handler strMem _HOF_sort_50 nil +%LCLsort strEnd nil nil nil +%LCLsort _HOF_sort_50 hof nil nil +%LCLsort _sigaction_Struct_Tuple tup _sigaction_Struct nil +%LCLsort __sigaction_Struct_Ptr ptr _sigaction_Struct nil +%LCLsort __sigaction_Struct_Arr arr _sigaction_Struct nil +%LCLsort __sigaction_Struct_Tuple_Vec vec _sigaction_Struct_Tuple __sigaction_Struct_Arr +%LCLsort ___sigaction synonym _sigaction_Struct nil +%LCLsort _sigstack_Struct str sigstack nil +%LCLsort ss_onstack strMem _int_Obj nil +%LCLsort ss_sp strMem ___char_Obj_Ptr_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sigstack_Struct_Tuple tup _sigstack_Struct nil +%LCLsort __sigstack_Struct_Ptr ptr _sigstack_Struct nil +%LCLsort __sigstack_Struct_Arr arr _sigstack_Struct nil +%LCLsort __sigstack_Struct_Tuple_Vec vec _sigstack_Struct_Tuple __sigstack_Struct_Arr +%LCLsort ___sigstack synonym _sigstack_Struct nil +%LCLsort _sigcontext_Struct str sigcontext nil +%LCLsort sc_badpaddr strMem _int_Obj nil +%LCLsort sc_badvaddr strMem _int_Obj nil +%LCLsort sc_cause strMem _int_Obj nil +%LCLsort sc_fpc_eir strMem _int_Obj nil +%LCLsort sc_fpc_csr strMem _int_Obj nil +%LCLsort sc_fpregs strMem __int_Obj_Arr nil +%LCLsort sc_ownedfp strMem _int_Obj nil +%LCLsort sc_mdhi strMem _int_Obj nil +%LCLsort sc_mdlo strMem _int_Obj nil +%LCLsort sc_regs strMem __int_Obj_Arr nil +%LCLsort sc_pc strMem _int_Obj nil +%LCLsort sc_mask strMem _int_Obj nil +%LCLsort sc_onstack strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sigcontext_Struct_Tuple tup _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Ptr ptr _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Arr arr _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Tuple_Vec vec _sigcontext_Struct_Tuple __sigcontext_Struct_Arr +%LCLsort ___sigcontext synonym _sigcontext_Struct nil +%LCLsort _HOF_sort_68 hof nil nil +%LCLsort ___scp synonym _HOF_sort_68 nil +%LCLsort _pid_t synonym int nil +%LCLsort _ptrdiff_t synonym int nil +%LCLsort _size_t synonym int nil +%LCLsort _wchar_t synonym int nil +%LCLsort _sstdlib_lcl0s_Struct str sstdlib_lcl0s nil +%LCLsort quot strMem _int_Obj nil +%LCLsort rem strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib_lcl0s_Struct_Tuple tup _sstdlib_lcl0s_Struct nil +%LCLsort __sstdlib_lcl0s_Struct_Ptr ptr _sstdlib_lcl0s_Struct nil +%LCLsort __sstdlib_lcl0s_Struct_Arr arr _sstdlib_lcl0s_Struct nil +%LCLsort __sstdlib_lcl0s_Struct_Tuple_Vec vec _sstdlib_lcl0s_Struct_Tuple __sstdlib_lcl0s_Struct_Arr +%LCLsort _div_t synonym _sstdlib_lcl0s_Struct nil +%LCLsort _sstdlib_lcl1s_Struct str sstdlib_lcl1s nil +%LCLsort quot strMem _int_Obj nil +%LCLsort rem strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib_lcl1s_Struct_Tuple tup _sstdlib_lcl1s_Struct nil +%LCLsort __sstdlib_lcl1s_Struct_Ptr ptr _sstdlib_lcl1s_Struct nil +%LCLsort __sstdlib_lcl1s_Struct_Arr arr _sstdlib_lcl1s_Struct nil +%LCLsort __sstdlib_lcl1s_Struct_Tuple_Vec vec _sstdlib_lcl1s_Struct_Tuple __sstdlib_lcl1s_Struct_Arr +%LCLsort _ldiv_t synonym _sstdlib_lcl1s_Struct nil +%LCLsort _void_Obj obj void nil +%LCLsort __void_Obj_Ptr ptr _void_Obj nil +%LCLsort __void_Obj_Arr arr _void_Obj nil +%LCLsort _void_Vec vec void __void_Obj_Arr +%LCLsort ____vp synonym __void_Obj_Ptr nil +%LCLsort _HOF_Sort_33 hof nil nil +%LCLsort _HOF_Sort_34 hof nil nil +%LCLsort _HOF_Sort_38 hof nil nil +%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil +%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil +%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr +%LCLsort FILE immutable nil nil +%LCLsort _va_list synonym __void_Obj_Ptr nil +%LCLsort _fpos_t synonym __void_Obj_Ptr nil +%LCLsort _FILE_Obj obj FILE nil +%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil +%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil +%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr +%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil +%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil +%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil +%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil +%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr +%LCLsort _sstdlib0s_Struct str sstdlib0s nil +%LCLsort rem strMem _int_Obj nil +%LCLsort quot strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr +%LCLsort _sstdlib1s_Struct str sstdlib1s nil +%LCLsort rem strMem _int_Obj nil +%LCLsort quot strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr +%LCLsort _HOF_sort_119 hof nil nil +%LCLsort _HOF_sort_120 hof nil nil +%LCLsort _HOF_sort_121 hof nil nil +%LCLsort _HOF_sort_122 hof nil nil +%LCLsort _HOF_sort_123 hof nil nil +%LCLsort _HOF_sort_124 hof nil nil +%LCLsort _HOF_sort_125 hof nil nil +%LCLsort _HOF_sort_126 hof nil nil +%LCLsort _HOF_sort_127 hof nil nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop __ \field_arrow sc_badvaddr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop ENOMSG : -> _eerrno0e_Enum +%LCLop mod :int, int -> int +%LCLop __ \field_arrow sc_badpaddr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop EIDRM : -> _eerrno0e_Enum +%LCLop min :int, int -> int +%LCLop EALIGN : -> _eerrno0e_Enum +%LCLop max :int, int -> int +%LCLop EDEADLK : -> _eerrno0e_Enum +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop ENOLCK : -> _eerrno0e_Enum +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop ENOSYS : -> _eerrno0e_Enum +%LCLop EACTIVE : -> _eerrno0e_Enum +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop ENOACTIVE : -> _eerrno0e_Enum +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop ENORESOURCES : -> _eerrno0e_Enum +%LCLop ENOSYSTEM : -> _eerrno0e_Enum +%LCLop ENODUST : -> _eerrno0e_Enum +%LCLop count :char, _char_Vec -> int +%LCLop EDUPNOCONN : -> _eerrno0e_Enum +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop EDUPNODISCONN : -> _eerrno0e_Enum +%LCLop init :_char_Vec -> _char_Vec +%LCLop EDUPNOTCNTD : -> _eerrno0e_Enum +%LCLop isEmpty :_char_Vec -> bool +%LCLop EDUPNOTIDLE : -> _eerrno0e_Enum +%LCLop last :_char_Vec -> char +%LCLop EDUPNOTWAIT : -> _eerrno0e_Enum +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop EDUPNOTRUN : -> _eerrno0e_Enum +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop EDUPBADOPCODE : -> _eerrno0e_Enum +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop EDUPINTRANSIT : -> _eerrno0e_Enum +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop EDUPTOOMANYCPUS : -> _eerrno0e_Enum +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLtag sstdlib_lcl0s struct +%LCLop nullTerminated :_char_Vec -> bool +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLtag eerrno0e enum +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop __ \select decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop lenStr :_char_Vec -> int +%LCLop __ \select thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop times10plus :int, int -> int +%LCLop __ \field_arrow decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop plus1 :int -> int +%LCLop __ \field_arrow thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_curr_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select int_curr_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 2 : -> int +%LCLop __ \field_arrow grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select currency_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select currency_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 3 : -> int +%LCLtag exception struct +%LCLop __ \field_arrow int_curr_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 4 : -> int +%LCLtag sstdlib_lcl1s struct +%LCLop __ \field_arrow currency_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 5 : -> int +%LCLop __ \field_arrow mon_decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 6 : -> int +%LCLop __ \field_arrow mon_thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select positive_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select positive_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 7 : -> int +%LCLop __ \field_arrow mon_grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select negative_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select negative_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 8 : -> int +%LCLtag sigvec struct +%LCLop __ \field_arrow positive_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select int_frac_digits :_lconv_Struct -> _char_Obj +%LCLop 9 : -> int +%LCLop __ \field_arrow negative_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select frac_digits :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow int_frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select p_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select n_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \field_arrow n_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop true : -> bool +%LCLop false : -> bool +%LCLtag sigaction struct +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLop __ \select rem :_sstdlib_lcl0s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib_lcl0s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib_lcl1s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib_lcl1s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \select quot :_sstdlib_lcl0s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib_lcl0s_Struct -> _int_Obj +%LCLop __ \select quot :_sstdlib_lcl1s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib_lcl1s_Struct -> _int_Obj +%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj +%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop __ \field_arrow rem :__sstdlib_lcl0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib_lcl1s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj +%LCLop { __ } :char -> _char_Vec +%LCLop __ \field_arrow quot :__sstdlib_lcl0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib_lcl1s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj +%LCLop EPERM : -> _eerrno0e_Enum +%LCLop ENOENT : -> _eerrno0e_Enum +%LCLtag sstdlib0s struct +%LCLop ESRCH : -> _eerrno0e_Enum +%LCLop EINTR : -> _eerrno0e_Enum +%LCLop __ \select ttype :_exception_Struct_Tuple -> int +%LCLop __ \select ttype :_exception_Struct -> _int_Obj +%LCLop EIO : -> _eerrno0e_Enum +%LCLop __ \select name :_exception_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select name :_exception_Struct -> ___char_Obj_Ptr_Obj +%LCLop ENXIO : -> _eerrno0e_Enum +%LCLop __ \field_arrow ttype :__exception_Struct_Ptr -> _int_Obj +%LCLop __ \select arg1 :_exception_Struct_Tuple -> double +%LCLop __ \select arg1 :_exception_Struct -> _double_Obj +%LCLop E2BIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow name :__exception_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select arg2 :_exception_Struct_Tuple -> double +%LCLop __ \select arg2 :_exception_Struct -> _double_Obj +%LCLop ENOEXEC : -> _eerrno0e_Enum +%LCLtag sstdlib1s struct +%LCLop __ \field_arrow arg1 :__exception_Struct_Ptr -> _double_Obj +%LCLop __ \select retval :_exception_Struct_Tuple -> double +%LCLop __ \select retval :_exception_Struct -> _double_Obj +%LCLop EBADF : -> _eerrno0e_Enum +%LCLop __ \select sv_handler :_sigvec_Struct_Tuple -> _HOF_sort_43 +%LCLop __ \select sv_handler :_sigvec_Struct -> _HOF_sort_43 +%LCLop __ \field_arrow arg2 :__exception_Struct_Ptr -> _double_Obj +%LCLop ECHILD : -> _eerrno0e_Enum +%LCLop [__, __] :int, __char_Obj_Ptr -> _sigstack_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib_lcl0s_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib_lcl1s_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple +%LCLop __ \select sv_mask :_sigvec_Struct_Tuple -> int +%LCLop __ \select sv_mask :_sigvec_Struct -> _int_Obj +%LCLop __ \field_arrow retval :__exception_Struct_Ptr -> _double_Obj +%LCLop EAGAIN : -> _eerrno0e_Enum +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [] :__lconv_Struct_Ptr -> __lconv_Struct_Arr +%LCLop __ [] :__exception_Struct_Ptr -> __exception_Struct_Arr +%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr +%LCLop __ [] :__double_Obj_Ptr -> __double_Obj_Arr +%LCLop __ [] :__sigvec_Struct_Ptr -> __sigvec_Struct_Arr +%LCLop __ [] :__sigaction_Struct_Ptr -> __sigaction_Struct_Arr +%LCLop __ [] :__sigstack_Struct_Ptr -> __sigstack_Struct_Arr +%LCLop __ [] :__sigcontext_Struct_Ptr -> __sigcontext_Struct_Arr +%LCLop __ [] :__sstdlib_lcl0s_Struct_Ptr -> __sstdlib_lcl0s_Struct_Arr +%LCLop __ [] :__sstdlib_lcl1s_Struct_Ptr -> __sstdlib_lcl1s_Struct_Arr +%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr +%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr +%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr +%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr +%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr +%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr +%LCLop __ \field_arrow sv_handler :__sigvec_Struct_Ptr -> _HOF_sort_43 +%LCLop __ \select sv_flags :_sigvec_Struct_Tuple -> int +%LCLop __ \select sv_flags :_sigvec_Struct -> _int_Obj +%LCLop ENOMEM : -> _eerrno0e_Enum +%LCLtag sigstack struct +%LCLop __ \field_arrow sv_mask :__sigvec_Struct_Ptr -> _int_Obj +%LCLop [__, __, __] :int, int, _HOF_sort_43 -> _sigvec_Struct_Tuple +%LCLop [__, __, __] :int, int, _HOF_sort_50 -> _sigaction_Struct_Tuple +%LCLop EACCES : -> _eerrno0e_Enum +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ [__] :__lconv_Struct_Tuple_Vec, int -> _lconv_Struct_Tuple +%LCLop __ [__] :__lconv_Struct_Arr, int -> _lconv_Struct +%LCLop __ [__] :__exception_Struct_Tuple_Vec, int -> _exception_Struct_Tuple +%LCLop __ [__] :__exception_Struct_Arr, int -> _exception_Struct +%LCLop __ [__] :_int_Vec, int -> int +%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj +%LCLop __ [__] :_double_Vec, int -> double +%LCLop __ [__] :__double_Obj_Arr, int -> _double_Obj +%LCLop __ [__] :__sigvec_Struct_Tuple_Vec, int -> _sigvec_Struct_Tuple +%LCLop __ [__] :__sigvec_Struct_Arr, int -> _sigvec_Struct +%LCLop __ [__] :__sigaction_Struct_Tuple_Vec, int -> _sigaction_Struct_Tuple +%LCLop __ [__] :__sigaction_Struct_Arr, int -> _sigaction_Struct +%LCLop __ [__] :__sigstack_Struct_Tuple_Vec, int -> _sigstack_Struct_Tuple +%LCLop __ [__] :__sigstack_Struct_Arr, int -> _sigstack_Struct +%LCLop __ [__] :__sigcontext_Struct_Tuple_Vec, int -> _sigcontext_Struct_Tuple +%LCLop __ [__] :__sigcontext_Struct_Arr, int -> _sigcontext_Struct +%LCLop __ [__] :__sstdlib_lcl0s_Struct_Tuple_Vec, int -> _sstdlib_lcl0s_Struct_Tuple +%LCLop __ [__] :__sstdlib_lcl0s_Struct_Arr, int -> _sstdlib_lcl0s_Struct +%LCLop __ [__] :__sstdlib_lcl1s_Struct_Tuple_Vec, int -> _sstdlib_lcl1s_Struct_Tuple +%LCLop __ [__] :__sstdlib_lcl1s_Struct_Arr, int -> _sstdlib_lcl1s_Struct +%LCLop __ [__] :_void_Vec, int -> void +%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj +%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr +%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj +%LCLop __ [__] :_FILE_Vec, int -> FILE +%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj +%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr +%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj +%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple +%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct +%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple +%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct +%LCLop __ \field_arrow sv_flags :__sigvec_Struct_Ptr -> _int_Obj +%LCLop EFAULT : -> _eerrno0e_Enum +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop ENOTBLK : -> _eerrno0e_Enum +%LCLop EBUSY : -> _eerrno0e_Enum +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop [__, __, __, __, __] :double, double, double, __char_Obj_Ptr, int -> _exception_Struct_Tuple +%LCLop EEXIST : -> _eerrno0e_Enum +%LCLop EXDEV : -> _eerrno0e_Enum +%LCLop ENODEV : -> _eerrno0e_Enum +%LCLop ENOTDIR : -> _eerrno0e_Enum +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop EISDIR : -> _eerrno0e_Enum +%LCLop EINVAL : -> _eerrno0e_Enum +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop ENFILE : -> _eerrno0e_Enum +%LCLop \A :bool, bool -> bool +%LCLop \A :int, bool -> bool +%LCLop \A :double, bool -> bool +%LCLop \A :_char_Vec, bool -> bool +%LCLop \A :char, bool -> bool +%LCLop __ \select sa_handler :_sigaction_Struct_Tuple -> _HOF_sort_50 +%LCLop __ \select sa_handler :_sigaction_Struct -> _HOF_sort_50 +%LCLop EMFILE : -> _eerrno0e_Enum +%LCLtag sigcontext struct +%LCLop \E :bool, bool -> bool +%LCLop \E :int, bool -> bool +%LCLop \E :double, bool -> bool +%LCLop \E :_char_Vec, bool -> bool +%LCLop \E :char, bool -> bool +%LCLop __ \select sa_mask :_sigaction_Struct_Tuple -> int +%LCLop __ \select sa_mask :_sigaction_Struct -> _int_Obj +%LCLop ENOTTY : -> _eerrno0e_Enum +%LCLop __ \field_arrow sa_handler :__sigaction_Struct_Ptr -> _HOF_sort_50 +%LCLop __ \select sa_flags :_sigaction_Struct_Tuple -> int +%LCLop __ \select sa_flags :_sigaction_Struct -> _int_Obj +%LCLop ETXTBSY : -> _eerrno0e_Enum +%LCLop null : -> char +%LCLop __ \field_arrow sa_mask :__sigaction_Struct_Ptr -> _int_Obj +%LCLop EFBIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow sa_flags :__sigaction_Struct_Ptr -> _int_Obj +%LCLop ENOSPC : -> _eerrno0e_Enum +%LCLop ESPIPE : -> _eerrno0e_Enum +%LCLop 32 : -> double +%LCLop EROFS : -> _eerrno0e_Enum +%LCLop EMLINK : -> _eerrno0e_Enum +%LCLop __ \iff __ :bool, bool -> bool +%LCLop EPIPE : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __] :int, int, int, int, int, _int_Vec, int, int, int, _int_Vec, int, int, int -> _sigcontext_Struct_Tuple +%LCLop EDOM : -> _eerrno0e_Enum +%LCLop ERANGE : -> _eerrno0e_Enum +%LCLop EWOULDBLOCK : -> _eerrno0e_Enum +%LCLop EINPROGRESS : -> _eerrno0e_Enum +%LCLop EALREADY : -> _eerrno0e_Enum +%LCLop ENOTSOCK : -> _eerrno0e_Enum +%LCLop EDESTADDRREQ : -> _eerrno0e_Enum +%LCLop EMSGSIZE : -> _eerrno0e_Enum +%LCLop EPROTOTYPE : -> _eerrno0e_Enum +%LCLop ENOPROTOOPT : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] :char, char, char, char, char, char, char, char, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr -> _lconv_Struct_Tuple +%LCLop EPROTONOSUPPORT : -> _eerrno0e_Enum +%LCLop ESOCKTNOSUPPORT : -> _eerrno0e_Enum +%LCLop EOPNOTSUPP : -> _eerrno0e_Enum +%LCLop __ \select ss_sp :_sigstack_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select ss_sp :_sigstack_Struct -> ___char_Obj_Ptr_Obj +%LCLop EPFNOSUPPORT : -> _eerrno0e_Enum +%LCLop __ \select ss_onstack :_sigstack_Struct_Tuple -> int +%LCLop __ \select ss_onstack :_sigstack_Struct -> _int_Obj +%LCLop EAFNOSUPPORT : -> _eerrno0e_Enum +%LCLop __ \field_arrow ss_sp :__sigstack_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop EADDRINUSE : -> _eerrno0e_Enum +%LCLop __ \field_arrow ss_onstack :__sigstack_Struct_Ptr -> _int_Obj +%LCLop EADDRNOTAVAIL : -> _eerrno0e_Enum +%LCLop NIL : -> __char_Obj_Ptr +%LCLop NIL : -> __lconv_Struct_Ptr +%LCLop NIL : -> __exception_Struct_Ptr +%LCLop NIL : -> __int_Obj_Ptr +%LCLop NIL : -> __double_Obj_Ptr +%LCLop NIL : -> __sigvec_Struct_Ptr +%LCLop NIL : -> __sigaction_Struct_Ptr +%LCLop NIL : -> __sigstack_Struct_Ptr +%LCLop NIL : -> __sigcontext_Struct_Ptr +%LCLop NIL : -> __sstdlib_lcl0s_Struct_Ptr +%LCLop NIL : -> __sstdlib_lcl1s_Struct_Ptr +%LCLop NIL : -> __void_Obj_Ptr +%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr +%LCLop NIL : -> __FILE_Obj_Ptr +%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr +%LCLop NIL : -> __sstdlib0s_Struct_Ptr +%LCLop NIL : -> __sstdlib1s_Struct_Ptr +%LCLop ENETDOWN : -> _eerrno0e_Enum +%LCLop ENETUNREACH : -> _eerrno0e_Enum +%LCLop ENETRESET : -> _eerrno0e_Enum +%LCLop ECONNABORTED : -> _eerrno0e_Enum +%LCLop ECONNRESET : -> _eerrno0e_Enum +%LCLop ENOBUFS : -> _eerrno0e_Enum +%LCLop EISCONN : -> _eerrno0e_Enum +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop ENOTCONN : -> _eerrno0e_Enum +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ + __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ + __ :int, __lconv_Struct_Ptr -> __lconv_Struct_Ptr +%LCLop __ + __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ + __ :int, __exception_Struct_Ptr -> __exception_Struct_Ptr +%LCLop __ + __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ + __ :int, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ + __ :int, __double_Obj_Ptr -> __double_Obj_Ptr +%LCLop __ + __ :__sigvec_Struct_Ptr, int -> __sigvec_Struct_Ptr +%LCLop __ + __ :int, __sigvec_Struct_Ptr -> __sigvec_Struct_Ptr +%LCLop __ + __ :__sigaction_Struct_Ptr, int -> __sigaction_Struct_Ptr +%LCLop __ + __ :int, __sigaction_Struct_Ptr -> __sigaction_Struct_Ptr +%LCLop __ + __ :__sigstack_Struct_Ptr, int -> __sigstack_Struct_Ptr +%LCLop __ + __ :int, __sigstack_Struct_Ptr -> __sigstack_Struct_Ptr +%LCLop __ + __ :__sigcontext_Struct_Ptr, int -> __sigcontext_Struct_Ptr +%LCLop __ + __ :int, __sigcontext_Struct_Ptr -> __sigcontext_Struct_Ptr +%LCLop __ + __ :__char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :__sstdlib_lcl0s_Struct_Ptr, int -> __sstdlib_lcl0s_Struct_Ptr +%LCLop __ + __ :__sstdlib_lcl0s_Struct_Ptr, __sstdlib_lcl0s_Struct_Ptr -> __sstdlib_lcl0s_Struct_Ptr +%LCLop __ + __ :__sstdlib_lcl1s_Struct_Ptr, int -> __sstdlib_lcl1s_Struct_Ptr +%LCLop __ + __ :__sstdlib_lcl1s_Struct_Ptr, __sstdlib_lcl1s_Struct_Ptr -> __sstdlib_lcl1s_Struct_Ptr +%LCLop __ + __ :__void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLop __ + __ :__void_Obj_Ptr, __void_Obj_Ptr -> __void_Obj_Ptr +%LCLop __ + __ :__int_Obj_Ptr, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr +%LCLop __ + __ :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr +%LCLop __ + __ :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr +%LCLop __ + __ :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr +%LCLop __ + __ :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr +%LCLop __ + __ :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr +%LCLop __ \select sc_onstack :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_onstack :_sigcontext_Struct -> _int_Obj +%LCLop ESHUTDOWN : -> _eerrno0e_Enum +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop __ - __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ - __ :__lconv_Struct_Ptr, __lconv_Struct_Ptr -> int +%LCLop __ - __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ - __ :__exception_Struct_Ptr, __exception_Struct_Ptr -> int +%LCLop __ - __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ - __ :__int_Obj_Ptr, __int_Obj_Ptr -> int +%LCLop __ - __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ - __ :__double_Obj_Ptr, __double_Obj_Ptr -> int +%LCLop __ - __ :__sigvec_Struct_Ptr, int -> __sigvec_Struct_Ptr +%LCLop __ - __ :__sigvec_Struct_Ptr, __sigvec_Struct_Ptr -> int +%LCLop __ - __ :__sigaction_Struct_Ptr, int -> __sigaction_Struct_Ptr +%LCLop __ - __ :__sigaction_Struct_Ptr, __sigaction_Struct_Ptr -> int +%LCLop __ - __ :__sigstack_Struct_Ptr, int -> __sigstack_Struct_Ptr +%LCLop __ - __ :__sigstack_Struct_Ptr, __sigstack_Struct_Ptr -> int +%LCLop __ - __ :__sigcontext_Struct_Ptr, int -> __sigcontext_Struct_Ptr +%LCLop __ - __ :__sigcontext_Struct_Ptr, __sigcontext_Struct_Ptr -> int +%LCLop __ - __ :__sstdlib_lcl0s_Struct_Ptr, int -> __sstdlib_lcl0s_Struct_Ptr +%LCLop __ - __ :__sstdlib_lcl0s_Struct_Ptr, __sstdlib_lcl0s_Struct_Ptr -> int +%LCLop __ - __ :__sstdlib_lcl1s_Struct_Ptr, int -> __sstdlib_lcl1s_Struct_Ptr +%LCLop __ - __ :__sstdlib_lcl1s_Struct_Ptr, __sstdlib_lcl1s_Struct_Ptr -> int +%LCLop __ - __ :__void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLop __ - __ :__void_Obj_Ptr, __void_Obj_Ptr -> int +%LCLop __ - __ :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ - __ :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int +%LCLop __ - __ :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr +%LCLop __ - __ :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int +%LCLop __ - __ :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ - __ :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int +%LCLop __ - __ :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr +%LCLop __ - __ :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int +%LCLop __ - __ :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr +%LCLop __ - __ :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop sizeof :_eerrno0e_Enum -> int +%LCLop sizeof :_emath1e_Enum -> int +%LCLop sizeof :FILE -> int +%LCLop __ \select sc_mask :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mask :_sigcontext_Struct -> _int_Obj +%LCLop DOMAIN : -> _emath1e_Enum +%LCLop ETOOMANYREFS : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_onstack :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_pc :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_pc :_sigcontext_Struct -> _int_Obj +%LCLop SING : -> _emath1e_Enum +%LCLop ETIMEDOUT : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mask :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_regs :_sigcontext_Struct_Tuple -> _int_Vec +%LCLop __ \select sc_regs :_sigcontext_Struct -> __int_Obj_Arr +%LCLop OVERFLOW : -> _emath1e_Enum +%LCLop ECONNREFUSED : -> _eerrno0e_Enum +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop isSub :__lconv_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__lconv_Struct_Arr, int -> bool +%LCLop isSub :__exception_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__exception_Struct_Arr, int -> bool +%LCLop isSub :_int_Vec, int -> bool +%LCLop isSub :__int_Obj_Arr, int -> bool +%LCLop isSub :_double_Vec, int -> bool +%LCLop isSub :__double_Obj_Arr, int -> bool +%LCLop isSub :__sigvec_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigvec_Struct_Arr, int -> bool +%LCLop isSub :__sigaction_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigaction_Struct_Arr, int -> bool +%LCLop isSub :__sigstack_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigstack_Struct_Arr, int -> bool +%LCLop isSub :__sigcontext_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigcontext_Struct_Arr, int -> bool +%LCLop isSub :__sstdlib_lcl0s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib_lcl0s_Struct_Arr, int -> bool +%LCLop isSub :__sstdlib_lcl1s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib_lcl1s_Struct_Arr, int -> bool +%LCLop isSub :_void_Vec, int -> bool +%LCLop isSub :__void_Obj_Arr, int -> bool +%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool +%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool +%LCLop isSub :_FILE_Vec, int -> bool +%LCLop isSub :__FILE_Obj_Arr, int -> bool +%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool +%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool +%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool +%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool +%LCLtag lconv struct +%LCLop __ \field_arrow sc_pc :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop UNDERFLOW : -> _emath1e_Enum +%LCLop ELOOP : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_regs :__sigcontext_Struct_Ptr -> __int_Obj_Arr +%LCLop __ \select sc_mdlo :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mdlo :_sigcontext_Struct -> _int_Obj +%LCLop TLOSS : -> _emath1e_Enum +%LCLop ENAMETOOLONG : -> _eerrno0e_Enum +%LCLop __ \select sc_mdhi :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mdhi :_sigcontext_Struct -> _int_Obj +%LCLop PLOSS : -> _emath1e_Enum +%LCLop EHOSTDOWN : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mdlo :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_ownedfp :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_ownedfp :_sigcontext_Struct -> _int_Obj +%LCLop EHOSTUNREACH : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mdhi :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_fpregs :_sigcontext_Struct_Tuple -> _int_Vec +%LCLop __ \select sc_fpregs :_sigcontext_Struct -> __int_Obj_Arr +%LCLop ENOTEMPTY : -> _eerrno0e_Enum +%LCLop succ :int -> int +%LCLtag emath1e enum +%LCLop __ \field_arrow sc_ownedfp :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_fpc_csr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_fpc_csr :_sigcontext_Struct -> _int_Obj +%LCLop EPROCLIM : -> _eerrno0e_Enum +%LCLop pred :int -> int +%LCLop __ \field_arrow sc_fpregs :__sigcontext_Struct_Ptr -> __int_Obj_Arr +%LCLop __ \select sc_fpc_eir :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_fpc_eir :_sigcontext_Struct -> _int_Obj +%LCLop EUSERS : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_fpc_csr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_cause :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_cause :_sigcontext_Struct -> _int_Obj +%LCLop EDQUOT : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_fpc_eir :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_badvaddr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_badvaddr :_sigcontext_Struct -> _int_Obj +%LCLop ESTALE : -> _eerrno0e_Enum +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop __ \field_arrow sc_cause :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_badpaddr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_badpaddr :_sigcontext_Struct -> _int_Obj +%LCLop EREMOTE : -> _eerrno0e_Enum +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLfcn strcasecmp : __char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn strncasecmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn strcat : __char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strncat : __char_Obj_Ptr, __char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strcmp : __char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn strncmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn strcpy : __char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strncpy : __char_Obj_Ptr, __char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strlen : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn strchr : __char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strrchr : __char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strpbrk : __char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strspn : __char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn strcspn : __char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn strtok : __char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn index : __char_Obj_Ptr, char -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn rindex : __char_Obj_Ptr, char -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn strstr : __char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLSymbolTableEnd diff --git a/imports/time.lcl b/imports/time.lcl new file mode 100644 index 0000000..a4036d0 --- /dev/null +++ b/imports/time.lcl @@ -0,0 +1,66 @@ +/* +** time.h +*/ + +imports ; + +typedef struct timeval { + long tv_sec; + long tv_usec; +} __timeval; + +typedef struct timezone { + int tz_minuteswest; + int tz_dsttime; +} __timezone; + +enum { DST_NONE, DST_USA, DST_AUST, DST_WET, DST_MET, DST_EET } __timezones; + +| bool : int | timerisset(struct timeval tvp) { ensures true; } + +void timerclear(struct timeval tvp); + +constant int ITIMER_REAL; +constant int ITIMER_VIRTUAL; +constant int ITIMER_PROF; + +typedef struct itimerval { + struct timeval it_interval; + struct timeval it_value; +} __itimerval; + +typedef struct tm { + int tm_sec ; + int tm_min ; + int tm_hour ; + int tm_mday ; + int tm_mon ; + int tm_year ; + int tm_wday ; + int tm_yday ; + int tm_isdst ; + long tm_gmtoff ; + char *tm_zone ; +} __tm; + +typedef int time_t ; +typedef int clock_t ; + +constant int CLOCKS_PER_SEC ; + +char * asctime( struct tm *__tm ) { ensures true; } +clock_t clock( void ) { ensures true; } +char * ctime( time_t *__clock ); +double difftime( time_t __time1, time_t __time0 ) { ensures true; } +struct tm * gmtime( time_t *__clock ) { ensures true; } +struct tm * localtime( time_t *__clock ) { ensures true; } +time_t mktime( struct tm *__timeptr ) { ensures true; } +size_t strftime( char *__s, size_t __maxsize, + char *__format, struct tm *__tm ) { ensures true; } +time_t time( time_t *__tloc ) {ensures true; } + +char *tzname[]; + +char *timezone() { ensures true; } + + diff --git a/imports/time.lcs b/imports/time.lcs new file mode 100644 index 0000000..c6c1be8 --- /dev/null +++ b/imports/time.lcs @@ -0,0 +1,1140 @@ +%PASSED Output from LCLint 2.0 +%LCLimports +%LCLSortTable +%LCLsort bool immutable nil nil +%LCLsort Bool synonym bool nil +%LCLsort int primitive nil nil +%LCLsort char primitive nil nil +%LCLsort void primitive nil nil +%LCLsort _char_Obj obj char nil +%LCLsort __char_Obj_Ptr ptr _char_Obj nil +%LCLsort __char_Obj_Arr arr _char_Obj nil +%LCLsort _char_Vec vec char __char_Obj_Arr +%LCLsort float primitive nil nil +%LCLsort double primitive nil nil +%LCLsort _eerrno0e_Enum enum eerrno0e nil +%LCLsort EPERM enumMem nil nil +%LCLsort ENOENT enumMem nil nil +%LCLsort ESRCH enumMem nil nil +%LCLsort EINTR enumMem nil nil +%LCLsort EIO enumMem nil nil +%LCLsort ENXIO enumMem nil nil +%LCLsort E2BIG enumMem nil nil +%LCLsort ENOEXEC enumMem nil nil +%LCLsort EBADF enumMem nil nil +%LCLsort ECHILD enumMem nil nil +%LCLsort EAGAIN enumMem nil nil +%LCLsort ENOMEM enumMem nil nil +%LCLsort EACCES enumMem nil nil +%LCLsort EFAULT enumMem nil nil +%LCLsort ENOTBLK enumMem nil nil +%LCLsort EBUSY enumMem nil nil +%LCLsort EEXIST enumMem nil nil +%LCLsort EXDEV enumMem nil nil +%LCLsort ENODEV enumMem nil nil +%LCLsort ENOTDIR enumMem nil nil +%LCLsort EISDIR enumMem nil nil +%LCLsort EINVAL enumMem nil nil +%LCLsort ENFILE enumMem nil nil +%LCLsort EMFILE enumMem nil nil +%LCLsort ENOTTY enumMem nil nil +%LCLsort ETXTBSY enumMem nil nil +%LCLsort EFBIG enumMem nil nil +%LCLsort ENOSPC enumMem nil nil +%LCLsort ESPIPE enumMem nil nil +%LCLsort EROFS enumMem nil nil +%LCLsort EMLINK enumMem nil nil +%LCLsort EPIPE enumMem nil nil +%LCLsort EDOM enumMem nil nil +%LCLsort ERANGE enumMem nil nil +%LCLsort EWOULDBLOCK enumMem nil nil +%LCLsort EINPROGRESS enumMem nil nil +%LCLsort EALREADY enumMem nil nil +%LCLsort ENOTSOCK enumMem nil nil +%LCLsort EDESTADDRREQ enumMem nil nil +%LCLsort EMSGSIZE enumMem nil nil +%LCLsort EPROTOTYPE enumMem nil nil +%LCLsort ENOPROTOOPT enumMem nil nil +%LCLsort EPROTONOSUPPORT enumMem nil nil +%LCLsort ESOCKTNOSUPPORT enumMem nil nil +%LCLsort EOPNOTSUPP enumMem nil nil +%LCLsort EPFNOSUPPORT enumMem nil nil +%LCLsort EAFNOSUPPORT enumMem nil nil +%LCLsort EADDRINUSE enumMem nil nil +%LCLsort EADDRNOTAVAIL enumMem nil nil +%LCLsort ENETDOWN enumMem nil nil +%LCLsort ENETUNREACH enumMem nil nil +%LCLsort ENETRESET enumMem nil nil +%LCLsort ECONNABORTED enumMem nil nil +%LCLsort ECONNRESET enumMem nil nil +%LCLsort ENOBUFS enumMem nil nil +%LCLsort EISCONN enumMem nil nil +%LCLsort ENOTCONN enumMem nil nil +%LCLsort ESHUTDOWN enumMem nil nil +%LCLsort ETOOMANYREFS enumMem nil nil +%LCLsort ETIMEDOUT enumMem nil nil +%LCLsort ECONNREFUSED enumMem nil nil +%LCLsort ELOOP enumMem nil nil +%LCLsort ENAMETOOLONG enumMem nil nil +%LCLsort EHOSTDOWN enumMem nil nil +%LCLsort EHOSTUNREACH enumMem nil nil +%LCLsort ENOTEMPTY enumMem nil nil +%LCLsort EPROCLIM enumMem nil nil +%LCLsort EUSERS enumMem nil nil +%LCLsort EDQUOT enumMem nil nil +%LCLsort ESTALE enumMem nil nil +%LCLsort EREMOTE enumMem nil nil +%LCLsort ENOMSG enumMem nil nil +%LCLsort EIDRM enumMem nil nil +%LCLsort EALIGN enumMem nil nil +%LCLsort EDEADLK enumMem nil nil +%LCLsort ENOLCK enumMem nil nil +%LCLsort ENOSYS enumMem nil nil +%LCLsort EACTIVE enumMem nil nil +%LCLsort ENOACTIVE enumMem nil nil +%LCLsort ENORESOURCES enumMem nil nil +%LCLsort ENOSYSTEM enumMem nil nil +%LCLsort ENODUST enumMem nil nil +%LCLsort EDUPNOCONN enumMem nil nil +%LCLsort EDUPNODISCONN enumMem nil nil +%LCLsort EDUPNOTCNTD enumMem nil nil +%LCLsort EDUPNOTIDLE enumMem nil nil +%LCLsort EDUPNOTWAIT enumMem nil nil +%LCLsort EDUPNOTRUN enumMem nil nil +%LCLsort EDUPBADOPCODE enumMem nil nil +%LCLsort EDUPINTRANSIT enumMem nil nil +%LCLsort EDUPTOOMANYCPUS enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __eerrno0e_Enum_Obj obj _eerrno0e_Enum nil +%LCLsort _int_Obj obj int nil +%LCLsort _lconv_Struct str lconv nil +%LCLsort decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort int_curr_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort currency_symbol strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_decimal_point strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_thousands_sep strMem ___char_Obj_Ptr_Obj nil +%LCLsort mon_grouping strMem ___char_Obj_Ptr_Obj nil +%LCLsort positive_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort negative_sign strMem ___char_Obj_Ptr_Obj nil +%LCLsort int_frac_digits strMem _char_Obj nil +%LCLsort frac_digits strMem _char_Obj nil +%LCLsort p_cs_precedes strMem _char_Obj nil +%LCLsort p_sep_by_space strMem _char_Obj nil +%LCLsort n_cs_precedes strMem _char_Obj nil +%LCLsort n_sep_by_space strMem _char_Obj nil +%LCLsort p_sign_posn strMem _char_Obj nil +%LCLsort n_sign_posn strMem _char_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil +%LCLsort _lconv_Struct_Tuple tup _lconv_Struct nil +%LCLsort __lconv_Struct_Ptr ptr _lconv_Struct nil +%LCLsort __lconv_Struct_Arr arr _lconv_Struct nil +%LCLsort __lconv_Struct_Tuple_Vec vec _lconv_Struct_Tuple __lconv_Struct_Arr +%LCLsort ___lconv synonym _lconv_Struct nil +%LCLsort _exception_Struct str exception nil +%LCLsort ttype strMem _int_Obj nil +%LCLsort name strMem ___char_Obj_Ptr_Obj nil +%LCLsort arg1 strMem _double_Obj nil +%LCLsort arg2 strMem _double_Obj nil +%LCLsort retval strMem _double_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _double_Obj obj double nil +%LCLsort _exception_Struct_Tuple tup _exception_Struct nil +%LCLsort __exception_Struct_Ptr ptr _exception_Struct nil +%LCLsort __exception_Struct_Arr arr _exception_Struct nil +%LCLsort __exception_Struct_Tuple_Vec vec _exception_Struct_Tuple __exception_Struct_Arr +%LCLsort ___exception synonym _exception_Struct nil +%LCLsort __int_Obj_Ptr ptr _int_Obj nil +%LCLsort __int_Obj_Arr arr _int_Obj nil +%LCLsort _int_Vec vec int __int_Obj_Arr +%LCLsort __double_Obj_Ptr ptr _double_Obj nil +%LCLsort __double_Obj_Arr arr _double_Obj nil +%LCLsort _double_Vec vec double __double_Obj_Arr +%LCLsort _emath1e_Enum enum emath1e nil +%LCLsort DOMAIN enumMem nil nil +%LCLsort SING enumMem nil nil +%LCLsort OVERFLOW enumMem nil nil +%LCLsort UNDERFLOW enumMem nil nil +%LCLsort TLOSS enumMem nil nil +%LCLsort PLOSS enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __emath1e_Enum_Obj obj _emath1e_Enum nil +%LCLsort _jmp_buf synonym __int_Obj_Arr nil +%LCLsort _sigjmp_buf synonym __int_Obj_Arr nil +%LCLsort _sig_atomic_t synonym int nil +%LCLsort _sigset_t synonym int nil +%LCLsort _sigvec_Struct str sigvec nil +%LCLsort sv_handler strMem _HOF_sort_43 nil +%LCLsort sv_mask strMem _int_Obj nil +%LCLsort sv_flags strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _HOF_sort_43 hof nil nil +%LCLsort _sigvec_Struct_Tuple tup _sigvec_Struct nil +%LCLsort __sigvec_Struct_Ptr ptr _sigvec_Struct nil +%LCLsort __sigvec_Struct_Arr arr _sigvec_Struct nil +%LCLsort __sigvec_Struct_Tuple_Vec vec _sigvec_Struct_Tuple __sigvec_Struct_Arr +%LCLsort ___sigvec synonym _sigvec_Struct nil +%LCLsort _sigaction_Struct str sigaction nil +%LCLsort sa_handler strMem _HOF_sort_50 nil +%LCLsort sa_mask strMem _int_Obj nil +%LCLsort sa_flags strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _HOF_sort_50 hof nil nil +%LCLsort _sigaction_Struct_Tuple tup _sigaction_Struct nil +%LCLsort __sigaction_Struct_Ptr ptr _sigaction_Struct nil +%LCLsort __sigaction_Struct_Arr arr _sigaction_Struct nil +%LCLsort __sigaction_Struct_Tuple_Vec vec _sigaction_Struct_Tuple __sigaction_Struct_Arr +%LCLsort ___sigaction synonym _sigaction_Struct nil +%LCLsort _sigstack_Struct str sigstack nil +%LCLsort ss_sp strMem ___char_Obj_Ptr_Obj nil +%LCLsort ss_onstack strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sigstack_Struct_Tuple tup _sigstack_Struct nil +%LCLsort __sigstack_Struct_Ptr ptr _sigstack_Struct nil +%LCLsort __sigstack_Struct_Arr arr _sigstack_Struct nil +%LCLsort __sigstack_Struct_Tuple_Vec vec _sigstack_Struct_Tuple __sigstack_Struct_Arr +%LCLsort ___sigstack synonym _sigstack_Struct nil +%LCLsort _sigcontext_Struct str sigcontext nil +%LCLsort sc_onstack strMem _int_Obj nil +%LCLsort sc_mask strMem _int_Obj nil +%LCLsort sc_pc strMem _int_Obj nil +%LCLsort sc_regs strMem __int_Obj_Arr nil +%LCLsort sc_mdlo strMem _int_Obj nil +%LCLsort sc_mdhi strMem _int_Obj nil +%LCLsort sc_ownedfp strMem _int_Obj nil +%LCLsort sc_fpregs strMem __int_Obj_Arr nil +%LCLsort sc_fpc_csr strMem _int_Obj nil +%LCLsort sc_fpc_eir strMem _int_Obj nil +%LCLsort sc_cause strMem _int_Obj nil +%LCLsort sc_badvaddr strMem _int_Obj nil +%LCLsort sc_badpaddr strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sigcontext_Struct_Tuple tup _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Ptr ptr _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Arr arr _sigcontext_Struct nil +%LCLsort __sigcontext_Struct_Tuple_Vec vec _sigcontext_Struct_Tuple __sigcontext_Struct_Arr +%LCLsort ___sigcontext synonym _sigcontext_Struct nil +%LCLsort _HOF_sort_68 hof nil nil +%LCLsort ___scp synonym _HOF_sort_68 nil +%LCLsort _pid_t synonym int nil +%LCLsort _ptrdiff_t synonym int nil +%LCLsort _size_t synonym int nil +%LCLsort _wchar_t synonym int nil +%LCLsort _sstdlib_lcl0s_Struct str sstdlib_lcl0s nil +%LCLsort rem strMem _int_Obj nil +%LCLsort quot strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib_lcl0s_Struct_Tuple tup _sstdlib_lcl0s_Struct nil +%LCLsort __sstdlib_lcl0s_Struct_Ptr ptr _sstdlib_lcl0s_Struct nil +%LCLsort __sstdlib_lcl0s_Struct_Arr arr _sstdlib_lcl0s_Struct nil +%LCLsort __sstdlib_lcl0s_Struct_Tuple_Vec vec _sstdlib_lcl0s_Struct_Tuple __sstdlib_lcl0s_Struct_Arr +%LCLsort _div_t synonym _sstdlib_lcl0s_Struct nil +%LCLsort _sstdlib_lcl1s_Struct str sstdlib_lcl1s nil +%LCLsort rem strMem _int_Obj nil +%LCLsort quot strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib_lcl1s_Struct_Tuple tup _sstdlib_lcl1s_Struct nil +%LCLsort __sstdlib_lcl1s_Struct_Ptr ptr _sstdlib_lcl1s_Struct nil +%LCLsort __sstdlib_lcl1s_Struct_Arr arr _sstdlib_lcl1s_Struct nil +%LCLsort __sstdlib_lcl1s_Struct_Tuple_Vec vec _sstdlib_lcl1s_Struct_Tuple __sstdlib_lcl1s_Struct_Arr +%LCLsort _ldiv_t synonym _sstdlib_lcl1s_Struct nil +%LCLsort _void_Obj obj void nil +%LCLsort __void_Obj_Ptr ptr _void_Obj nil +%LCLsort __void_Obj_Arr arr _void_Obj nil +%LCLsort _void_Vec vec void __void_Obj_Arr +%LCLsort ____vp synonym __void_Obj_Ptr nil +%LCLsort _HOF_Sort_33 hof nil nil +%LCLsort _HOF_Sort_34 hof nil nil +%LCLsort _HOF_Sort_38 hof nil nil +%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil +%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil +%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr +%LCLsort FILE immutable nil nil +%LCLsort _va_list synonym __void_Obj_Ptr nil +%LCLsort _fpos_t synonym __void_Obj_Ptr nil +%LCLsort _FILE_Obj obj FILE nil +%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil +%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil +%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr +%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil +%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil +%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil +%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil +%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr +%LCLsort _sstdlib0s_Struct str sstdlib0s nil +%LCLsort quot strMem _int_Obj nil +%LCLsort rem strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil +%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr +%LCLsort _sstdlib1s_Struct str sstdlib1s nil +%LCLsort quot strMem _int_Obj nil +%LCLsort rem strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil +%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr +%LCLsort _HOF_sort_119 hof nil nil +%LCLsort _HOF_sort_120 hof nil nil +%LCLsort _HOF_sort_121 hof nil nil +%LCLsort _HOF_sort_122 hof nil nil +%LCLsort _HOF_sort_123 hof nil nil +%LCLsort _HOF_sort_124 hof nil nil +%LCLsort _HOF_sort_125 hof nil nil +%LCLsort _HOF_sort_126 hof nil nil +%LCLsort _HOF_sort_127 hof nil nil +%LCLsort _timeval_Struct str timeval nil +%LCLsort tv_usec strMem _int_Obj nil +%LCLsort tv_sec strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _timeval_Struct_Tuple tup _timeval_Struct nil +%LCLsort __timeval_Struct_Ptr ptr _timeval_Struct nil +%LCLsort __timeval_Struct_Arr arr _timeval_Struct nil +%LCLsort __timeval_Struct_Tuple_Vec vec _timeval_Struct_Tuple __timeval_Struct_Arr +%LCLsort ___timeval synonym _timeval_Struct nil +%LCLsort _timezone_Struct str timezone nil +%LCLsort tz_dsttime strMem _int_Obj nil +%LCLsort tz_minuteswest strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _timezone_Struct_Tuple tup _timezone_Struct nil +%LCLsort __timezone_Struct_Ptr ptr _timezone_Struct nil +%LCLsort __timezone_Struct_Arr arr _timezone_Struct nil +%LCLsort __timezone_Struct_Tuple_Vec vec _timezone_Struct_Tuple __timezone_Struct_Arr +%LCLsort ___timezone synonym _timezone_Struct nil +%LCLsort _etime2e_Enum enum etime2e nil +%LCLsort DST_EET enumMem nil nil +%LCLsort DST_MET enumMem nil nil +%LCLsort DST_WET enumMem nil nil +%LCLsort DST_AUST enumMem nil nil +%LCLsort DST_USA enumMem nil nil +%LCLsort DST_NONE enumMem nil nil +%LCLsort enumEnd nil nil nil +%LCLsort __etime2e_Enum_Obj obj _etime2e_Enum nil +%LCLsort _HOF_sort_142 hof nil nil +%LCLsort _itimerval_Struct str itimerval nil +%LCLsort it_value strMem _timeval_Struct nil +%LCLsort it_interval strMem _timeval_Struct nil +%LCLsort strEnd nil nil nil +%LCLsort _itimerval_Struct_Tuple tup _itimerval_Struct nil +%LCLsort __itimerval_Struct_Ptr ptr _itimerval_Struct nil +%LCLsort __itimerval_Struct_Arr arr _itimerval_Struct nil +%LCLsort __itimerval_Struct_Tuple_Vec vec _itimerval_Struct_Tuple __itimerval_Struct_Arr +%LCLsort ___itimerval synonym _itimerval_Struct nil +%LCLsort _tm_Struct str tm nil +%LCLsort tm_zone strMem ___char_Obj_Ptr_Obj nil +%LCLsort tm_gmtoff strMem _int_Obj nil +%LCLsort tm_isdst strMem _int_Obj nil +%LCLsort tm_yday strMem _int_Obj nil +%LCLsort tm_wday strMem _int_Obj nil +%LCLsort tm_year strMem _int_Obj nil +%LCLsort tm_mon strMem _int_Obj nil +%LCLsort tm_mday strMem _int_Obj nil +%LCLsort tm_hour strMem _int_Obj nil +%LCLsort tm_min strMem _int_Obj nil +%LCLsort tm_sec strMem _int_Obj nil +%LCLsort strEnd nil nil nil +%LCLsort _tm_Struct_Tuple tup _tm_Struct nil +%LCLsort __tm_Struct_Ptr ptr _tm_Struct nil +%LCLsort __tm_Struct_Arr arr _tm_Struct nil +%LCLsort __tm_Struct_Tuple_Vec vec _tm_Struct_Tuple __tm_Struct_Arr +%LCLsort ___tm synonym _tm_Struct nil +%LCLsort _time_t synonym int nil +%LCLsort _clock_t synonym int nil +%LCLsort _HOF_sort_157 hof nil nil +%LCLSortTableEnd +%LCLSymbolTable +%LCLop __ \field_arrow sc_badvaddr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop ENOMSG : -> _eerrno0e_Enum +%LCLop mod :int, int -> int +%LCLop __ \field_arrow sc_badpaddr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop EIDRM : -> _eerrno0e_Enum +%LCLop min :int, int -> int +%LCLop EALIGN : -> _eerrno0e_Enum +%LCLop max :int, int -> int +%LCLop EDEADLK : -> _eerrno0e_Enum +%LCLop 0 : -> int +%LCLop 0 : -> double +%LCLop ENOLCK : -> _eerrno0e_Enum +%LCLop 1 : -> int +%LCLop 1 : -> double +%LCLop if __ then __ else __ :bool, bool, bool -> bool +%LCLop if __ then __ else __ :bool, int, int -> int +%LCLop if __ then __ else __ :bool, double, double -> double +%LCLop if __ then __ else __ :bool, _char_Vec, _char_Vec -> _char_Vec +%LCLop if __ then __ else __ :bool, char, char -> char +%LCLop ENOSYS : -> _eerrno0e_Enum +%LCLop EACTIVE : -> _eerrno0e_Enum +%LCLop __ < __ :int, int -> bool +%LCLop __ < __ :double, double -> bool +%LCLop ENOACTIVE : -> _eerrno0e_Enum +%LCLop empty : -> _char_Vec +%LCLop __ > __ :int, int -> bool +%LCLop __ > __ :double, double -> bool +%LCLop ENORESOURCES : -> _eerrno0e_Enum +%LCLop ENOSYSTEM : -> _eerrno0e_Enum +%LCLtag timezone struct +%LCLop ENODUST : -> _eerrno0e_Enum +%LCLop count :char, _char_Vec -> int +%LCLop EDUPNOCONN : -> _eerrno0e_Enum +%LCLop head :_char_Vec -> char +%LCLop __ \inv :double -> double +%LCLop EDUPNODISCONN : -> _eerrno0e_Enum +%LCLop init :_char_Vec -> _char_Vec +%LCLop EDUPNOTCNTD : -> _eerrno0e_Enum +%LCLop isEmpty :_char_Vec -> bool +%LCLop EDUPNOTIDLE : -> _eerrno0e_Enum +%LCLop last :_char_Vec -> char +%LCLop EDUPNOTWAIT : -> _eerrno0e_Enum +%LCLop len :_char_Vec -> int +%LCLop __ \implies __ :bool, bool -> bool +%LCLop EDUPNOTRUN : -> _eerrno0e_Enum +%LCLop prefix :_char_Vec, int -> _char_Vec +%LCLop __ / __ :double, double -> double +%LCLop EDUPBADOPCODE : -> _eerrno0e_Enum +%LCLop removePrefix :_char_Vec, int -> _char_Vec +%LCLop EDUPINTRANSIT : -> _eerrno0e_Enum +%LCLop substring :_char_Vec, int, int -> _char_Vec +%LCLop __ || __ :_char_Vec, _char_Vec -> _char_Vec +%LCLop EDUPTOOMANYCPUS : -> _eerrno0e_Enum +%LCLop tail :_char_Vec -> _char_Vec +%LCLop __ \in __ :char, _char_Vec -> bool +%LCLtag sstdlib_lcl0s struct +%LCLop nullTerminated :_char_Vec -> bool +%LCLop DST_NONE : -> _etime2e_Enum +%LCLop throughNull :_char_Vec -> _char_Vec +%LCLtag eerrno0e enum +%LCLop DST_USA : -> _etime2e_Enum +%LCLop sameStr :_char_Vec, _char_Vec -> bool +%LCLop DST_AUST : -> _etime2e_Enum +%LCLop __ \select decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop lenStr :_char_Vec -> int +%LCLop DST_WET : -> _etime2e_Enum +%LCLop __ \select thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop times10plus :int, int -> int +%LCLop DST_MET : -> _etime2e_Enum +%LCLop __ \field_arrow decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop plus1 :int -> int +%LCLop DST_EET : -> _etime2e_Enum +%LCLop __ \field_arrow thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_curr_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select int_curr_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 2 : -> int +%LCLop __ \field_arrow grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select currency_symbol :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select currency_symbol :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 3 : -> int +%LCLtag exception struct +%LCLop __ \field_arrow int_curr_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_decimal_point :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_decimal_point :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 4 : -> int +%LCLtag sstdlib_lcl1s struct +%LCLop __ \field_arrow currency_symbol :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_thousands_sep :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_thousands_sep :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 5 : -> int +%LCLop __ \field_arrow mon_decimal_point :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select mon_grouping :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select mon_grouping :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 6 : -> int +%LCLop __ \select tv_sec :_timeval_Struct_Tuple -> int +%LCLop __ \select tv_sec :_timeval_Struct -> _int_Obj +%LCLop __ \field_arrow mon_thousands_sep :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select positive_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select positive_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 7 : -> int +%LCLop __ \select tv_usec :_timeval_Struct_Tuple -> int +%LCLop __ \select tv_usec :_timeval_Struct -> _int_Obj +%LCLop __ \field_arrow mon_grouping :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select negative_sign :_lconv_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select negative_sign :_lconv_Struct -> ___char_Obj_Ptr_Obj +%LCLop 8 : -> int +%LCLtag sigvec struct +%LCLop __ \field_arrow tv_sec :__timeval_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow positive_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select int_frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select int_frac_digits :_lconv_Struct -> _char_Obj +%LCLop 9 : -> int +%LCLop __ \field_arrow tv_usec :__timeval_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow negative_sign :__lconv_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select frac_digits :_lconv_Struct_Tuple -> char +%LCLop __ \select frac_digits :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow int_frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select p_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow frac_digits :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_cs_precedes :_lconv_Struct_Tuple -> char +%LCLop __ \select n_cs_precedes :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sep_by_space :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sep_by_space :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow n_cs_precedes :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select p_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select p_sign_posn :_lconv_Struct -> _char_Obj +%LCLtag itimerval struct +%LCLop __ \field_arrow n_sep_by_space :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \select n_sign_posn :_lconv_Struct_Tuple -> char +%LCLop __ \select n_sign_posn :_lconv_Struct -> _char_Obj +%LCLop __ \field_arrow p_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ \field_arrow n_sign_posn :__lconv_Struct_Ptr -> _char_Obj +%LCLop __ * __ :int, int -> int +%LCLop __ * __ :double, double -> double +%LCLop __ \select tz_minuteswest :_timezone_Struct_Tuple -> int +%LCLop __ \select tz_minuteswest :_timezone_Struct -> _int_Obj +%LCLop __ \select tz_dsttime :_timezone_Struct_Tuple -> int +%LCLop __ \select tz_dsttime :_timezone_Struct -> _int_Obj +%LCLop __ \field_arrow tz_minuteswest :__timezone_Struct_Ptr -> _int_Obj +%LCLop true : -> bool +%LCLop __ \field_arrow tz_dsttime :__timezone_Struct_Ptr -> _int_Obj +%LCLop false : -> bool +%LCLtag sigaction struct +%LCLop __ \and __ :bool, bool -> bool +%LCLop __ \or __ :bool, bool -> bool +%LCLtag tm struct +%LCLop __ \select rem :_sstdlib_lcl0s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib_lcl0s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib_lcl1s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib_lcl1s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj +%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int +%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj +%LCLop __ \eq __ :bool, bool -> bool +%LCLop __ \eq __ :int, int -> bool +%LCLop __ \eq __ :double, double -> bool +%LCLop __ \eq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \eq __ :char, char -> bool +%LCLop \not __ :bool -> bool +%LCLop __ \select quot :_sstdlib_lcl0s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib_lcl0s_Struct -> _int_Obj +%LCLop __ \select quot :_sstdlib_lcl1s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib_lcl1s_Struct -> _int_Obj +%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj +%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int +%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj +%LCLop __ \neq __ :bool, bool -> bool +%LCLop __ \neq __ :int, int -> bool +%LCLop __ \neq __ :double, double -> bool +%LCLop __ \neq __ :_char_Vec, _char_Vec -> bool +%LCLop __ \neq __ :char, char -> bool +%LCLop __ \field_arrow rem :__sstdlib_lcl0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib_lcl1s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj +%LCLop { __ } :char -> _char_Vec +%LCLop __ \field_arrow quot :__sstdlib_lcl0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib_lcl1s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj +%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj +%LCLop EPERM : -> _eerrno0e_Enum +%LCLop ENOENT : -> _eerrno0e_Enum +%LCLtag sstdlib0s struct +%LCLop ESRCH : -> _eerrno0e_Enum +%LCLop EINTR : -> _eerrno0e_Enum +%LCLop __ \select ttype :_exception_Struct_Tuple -> int +%LCLop __ \select ttype :_exception_Struct -> _int_Obj +%LCLop EIO : -> _eerrno0e_Enum +%LCLop __ \select name :_exception_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select name :_exception_Struct -> ___char_Obj_Ptr_Obj +%LCLop ENXIO : -> _eerrno0e_Enum +%LCLop __ \field_arrow ttype :__exception_Struct_Ptr -> _int_Obj +%LCLop __ \select arg1 :_exception_Struct_Tuple -> double +%LCLop __ \select arg1 :_exception_Struct -> _double_Obj +%LCLop E2BIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow name :__exception_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop __ \select arg2 :_exception_Struct_Tuple -> double +%LCLop __ \select arg2 :_exception_Struct -> _double_Obj +%LCLop ENOEXEC : -> _eerrno0e_Enum +%LCLtag sstdlib1s struct +%LCLop __ \field_arrow arg1 :__exception_Struct_Ptr -> _double_Obj +%LCLop __ \select retval :_exception_Struct_Tuple -> double +%LCLop __ \select retval :_exception_Struct -> _double_Obj +%LCLop EBADF : -> _eerrno0e_Enum +%LCLop __ \select sv_handler :_sigvec_Struct_Tuple -> _HOF_sort_43 +%LCLop __ \select sv_handler :_sigvec_Struct -> _HOF_sort_43 +%LCLop __ \field_arrow arg2 :__exception_Struct_Ptr -> _double_Obj +%LCLop ECHILD : -> _eerrno0e_Enum +%LCLop [__, __] :int, __char_Obj_Ptr -> _sigstack_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib_lcl0s_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib_lcl1s_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple +%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple +%LCLop [__, __] :int, int -> _timeval_Struct_Tuple +%LCLop [__, __] :int, int -> _timezone_Struct_Tuple +%LCLop [__, __] :_timeval_Struct_Tuple, _timeval_Struct_Tuple -> _itimerval_Struct_Tuple +%LCLop __ \select sv_mask :_sigvec_Struct_Tuple -> int +%LCLop __ \select sv_mask :_sigvec_Struct -> _int_Obj +%LCLop __ \field_arrow retval :__exception_Struct_Ptr -> _double_Obj +%LCLop EAGAIN : -> _eerrno0e_Enum +%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr +%LCLop __ [] :__lconv_Struct_Ptr -> __lconv_Struct_Arr +%LCLop __ [] :__exception_Struct_Ptr -> __exception_Struct_Arr +%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr +%LCLop __ [] :__double_Obj_Ptr -> __double_Obj_Arr +%LCLop __ [] :__sigvec_Struct_Ptr -> __sigvec_Struct_Arr +%LCLop __ [] :__sigaction_Struct_Ptr -> __sigaction_Struct_Arr +%LCLop __ [] :__sigstack_Struct_Ptr -> __sigstack_Struct_Arr +%LCLop __ [] :__sigcontext_Struct_Ptr -> __sigcontext_Struct_Arr +%LCLop __ [] :__sstdlib_lcl0s_Struct_Ptr -> __sstdlib_lcl0s_Struct_Arr +%LCLop __ [] :__sstdlib_lcl1s_Struct_Ptr -> __sstdlib_lcl1s_Struct_Arr +%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr +%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr +%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr +%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr +%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr +%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr +%LCLop __ [] :__timeval_Struct_Ptr -> __timeval_Struct_Arr +%LCLop __ [] :__timezone_Struct_Ptr -> __timezone_Struct_Arr +%LCLop __ [] :__itimerval_Struct_Ptr -> __itimerval_Struct_Arr +%LCLop __ [] :__tm_Struct_Ptr -> __tm_Struct_Arr +%LCLop __ \field_arrow sv_handler :__sigvec_Struct_Ptr -> _HOF_sort_43 +%LCLop __ \select sv_flags :_sigvec_Struct_Tuple -> int +%LCLop __ \select sv_flags :_sigvec_Struct -> _int_Obj +%LCLop ENOMEM : -> _eerrno0e_Enum +%LCLtag sigstack struct +%LCLop __ \field_arrow sv_mask :__sigvec_Struct_Ptr -> _int_Obj +%LCLop [__, __, __] :int, int, _HOF_sort_43 -> _sigvec_Struct_Tuple +%LCLop [__, __, __] :int, int, _HOF_sort_50 -> _sigaction_Struct_Tuple +%LCLop EACCES : -> _eerrno0e_Enum +%LCLop __ [__] :_char_Vec, int -> char +%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj +%LCLop __ [__] :__lconv_Struct_Tuple_Vec, int -> _lconv_Struct_Tuple +%LCLop __ [__] :__lconv_Struct_Arr, int -> _lconv_Struct +%LCLop __ [__] :__exception_Struct_Tuple_Vec, int -> _exception_Struct_Tuple +%LCLop __ [__] :__exception_Struct_Arr, int -> _exception_Struct +%LCLop __ [__] :_int_Vec, int -> int +%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj +%LCLop __ [__] :_double_Vec, int -> double +%LCLop __ [__] :__double_Obj_Arr, int -> _double_Obj +%LCLop __ [__] :__sigvec_Struct_Tuple_Vec, int -> _sigvec_Struct_Tuple +%LCLop __ [__] :__sigvec_Struct_Arr, int -> _sigvec_Struct +%LCLop __ [__] :__sigaction_Struct_Tuple_Vec, int -> _sigaction_Struct_Tuple +%LCLop __ [__] :__sigaction_Struct_Arr, int -> _sigaction_Struct +%LCLop __ [__] :__sigstack_Struct_Tuple_Vec, int -> _sigstack_Struct_Tuple +%LCLop __ [__] :__sigstack_Struct_Arr, int -> _sigstack_Struct +%LCLop __ [__] :__sigcontext_Struct_Tuple_Vec, int -> _sigcontext_Struct_Tuple +%LCLop __ [__] :__sigcontext_Struct_Arr, int -> _sigcontext_Struct +%LCLop __ [__] :__sstdlib_lcl0s_Struct_Tuple_Vec, int -> _sstdlib_lcl0s_Struct_Tuple +%LCLop __ [__] :__sstdlib_lcl0s_Struct_Arr, int -> _sstdlib_lcl0s_Struct +%LCLop __ [__] :__sstdlib_lcl1s_Struct_Tuple_Vec, int -> _sstdlib_lcl1s_Struct_Tuple +%LCLop __ [__] :__sstdlib_lcl1s_Struct_Arr, int -> _sstdlib_lcl1s_Struct +%LCLop __ [__] :_void_Vec, int -> void +%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj +%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr +%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj +%LCLop __ [__] :_FILE_Vec, int -> FILE +%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj +%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr +%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj +%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple +%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct +%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple +%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct +%LCLop __ [__] :__timeval_Struct_Tuple_Vec, int -> _timeval_Struct_Tuple +%LCLop __ [__] :__timeval_Struct_Arr, int -> _timeval_Struct +%LCLop __ [__] :__timezone_Struct_Tuple_Vec, int -> _timezone_Struct_Tuple +%LCLop __ [__] :__timezone_Struct_Arr, int -> _timezone_Struct +%LCLop __ [__] :__itimerval_Struct_Tuple_Vec, int -> _itimerval_Struct_Tuple +%LCLop __ [__] :__itimerval_Struct_Arr, int -> _itimerval_Struct +%LCLop __ [__] :__tm_Struct_Tuple_Vec, int -> _tm_Struct_Tuple +%LCLop __ [__] :__tm_Struct_Arr, int -> _tm_Struct +%LCLop __ \field_arrow sv_flags :__sigvec_Struct_Ptr -> _int_Obj +%LCLop EFAULT : -> _eerrno0e_Enum +%LCLop __ |- __ :_char_Vec, char -> _char_Vec +%LCLop ENOTBLK : -> _eerrno0e_Enum +%LCLop EBUSY : -> _eerrno0e_Enum +%LCLop __ -| __ :char, _char_Vec -> _char_Vec +%LCLop __ \select it_interval :_itimerval_Struct_Tuple -> _timeval_Struct_Tuple +%LCLop __ \select it_interval :_itimerval_Struct -> _timeval_Struct +%LCLop [__, __, __, __, __] :double, double, double, __char_Obj_Ptr, int -> _exception_Struct_Tuple +%LCLop EEXIST : -> _eerrno0e_Enum +%LCLop __ \select it_value :_itimerval_Struct_Tuple -> _timeval_Struct_Tuple +%LCLop __ \select it_value :_itimerval_Struct -> _timeval_Struct +%LCLop EXDEV : -> _eerrno0e_Enum +%LCLop __ \field_arrow it_interval :__itimerval_Struct_Ptr -> _timeval_Struct +%LCLop ENODEV : -> _eerrno0e_Enum +%LCLop __ \field_arrow it_value :__itimerval_Struct_Ptr -> _timeval_Struct +%LCLop ENOTDIR : -> _eerrno0e_Enum +%LCLop __ \leq __ :int, int -> bool +%LCLop __ \leq __ :double, double -> bool +%LCLop EISDIR : -> _eerrno0e_Enum +%LCLop EINVAL : -> _eerrno0e_Enum +%LCLop __ \geq __ :int, int -> bool +%LCLop __ \geq __ :double, double -> bool +%LCLop ENFILE : -> _eerrno0e_Enum +%LCLop \A :bool, bool -> bool +%LCLop \A :int, bool -> bool +%LCLop \A :double, bool -> bool +%LCLop \A :_char_Vec, bool -> bool +%LCLop \A :char, bool -> bool +%LCLop __ \select sa_handler :_sigaction_Struct_Tuple -> _HOF_sort_50 +%LCLop __ \select sa_handler :_sigaction_Struct -> _HOF_sort_50 +%LCLop EMFILE : -> _eerrno0e_Enum +%LCLtag sigcontext struct +%LCLop \E :bool, bool -> bool +%LCLop \E :int, bool -> bool +%LCLop \E :double, bool -> bool +%LCLop \E :_char_Vec, bool -> bool +%LCLop \E :char, bool -> bool +%LCLop __ \select sa_mask :_sigaction_Struct_Tuple -> int +%LCLop __ \select sa_mask :_sigaction_Struct -> _int_Obj +%LCLop ENOTTY : -> _eerrno0e_Enum +%LCLop __ \field_arrow sa_handler :__sigaction_Struct_Ptr -> _HOF_sort_50 +%LCLop __ \select sa_flags :_sigaction_Struct_Tuple -> int +%LCLop __ \select sa_flags :_sigaction_Struct -> _int_Obj +%LCLop ETXTBSY : -> _eerrno0e_Enum +%LCLop null : -> char +%LCLop __ \field_arrow sa_mask :__sigaction_Struct_Ptr -> _int_Obj +%LCLop EFBIG : -> _eerrno0e_Enum +%LCLop __ \field_arrow sa_flags :__sigaction_Struct_Ptr -> _int_Obj +%LCLop ENOSPC : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __] :__char_Obj_Ptr, int, int, int, int, int, int, int, int, int, int -> _tm_Struct_Tuple +%LCLop __ \select tm_sec :_tm_Struct_Tuple -> int +%LCLop __ \select tm_sec :_tm_Struct -> _int_Obj +%LCLop ESPIPE : -> _eerrno0e_Enum +%LCLop __ \select tm_min :_tm_Struct_Tuple -> int +%LCLop __ \select tm_min :_tm_Struct -> _int_Obj +%LCLop 32 : -> double +%LCLop EROFS : -> _eerrno0e_Enum +%LCLop __ \field_arrow tm_sec :__tm_Struct_Ptr -> _int_Obj +%LCLop __ \select tm_hour :_tm_Struct_Tuple -> int +%LCLop __ \select tm_hour :_tm_Struct -> _int_Obj +%LCLop EMLINK : -> _eerrno0e_Enum +%LCLop __ \field_arrow tm_min :__tm_Struct_Ptr -> _int_Obj +%LCLop __ \select tm_mday :_tm_Struct_Tuple -> int +%LCLop __ \select tm_mday :_tm_Struct -> _int_Obj +%LCLop __ \iff __ :bool, bool -> bool +%LCLop EPIPE : -> _eerrno0e_Enum +%LCLop __ \field_arrow tm_hour :__tm_Struct_Ptr -> _int_Obj +%LCLop __ \select tm_mon :_tm_Struct_Tuple -> int +%LCLop __ \select tm_mon :_tm_Struct -> _int_Obj +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __] :int, int, int, int, int, _int_Vec, int, int, int, _int_Vec, int, int, int -> _sigcontext_Struct_Tuple +%LCLop EDOM : -> _eerrno0e_Enum +%LCLop __ \field_arrow tm_mday :__tm_Struct_Ptr -> _int_Obj +%LCLop __ \select tm_year :_tm_Struct_Tuple -> int +%LCLop __ \select tm_year :_tm_Struct -> _int_Obj +%LCLop ERANGE : -> _eerrno0e_Enum +%LCLop __ \field_arrow tm_mon :__tm_Struct_Ptr -> _int_Obj +%LCLop __ \select tm_wday :_tm_Struct_Tuple -> int +%LCLop __ \select tm_wday :_tm_Struct -> _int_Obj +%LCLop EWOULDBLOCK : -> _eerrno0e_Enum +%LCLop __ \field_arrow tm_year :__tm_Struct_Ptr -> _int_Obj +%LCLop __ \select tm_yday :_tm_Struct_Tuple -> int +%LCLop __ \select tm_yday :_tm_Struct -> _int_Obj +%LCLop EINPROGRESS : -> _eerrno0e_Enum +%LCLop __ \field_arrow tm_wday :__tm_Struct_Ptr -> _int_Obj +%LCLop __ \select tm_isdst :_tm_Struct_Tuple -> int +%LCLop __ \select tm_isdst :_tm_Struct -> _int_Obj +%LCLop EALREADY : -> _eerrno0e_Enum +%LCLop __ \field_arrow tm_yday :__tm_Struct_Ptr -> _int_Obj +%LCLop __ \select tm_gmtoff :_tm_Struct_Tuple -> int +%LCLop __ \select tm_gmtoff :_tm_Struct -> _int_Obj +%LCLop ENOTSOCK : -> _eerrno0e_Enum +%LCLop __ \field_arrow tm_isdst :__tm_Struct_Ptr -> _int_Obj +%LCLop __ \select tm_zone :_tm_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select tm_zone :_tm_Struct -> ___char_Obj_Ptr_Obj +%LCLop EDESTADDRREQ : -> _eerrno0e_Enum +%LCLop __ \field_arrow tm_gmtoff :__tm_Struct_Ptr -> _int_Obj +%LCLop EMSGSIZE : -> _eerrno0e_Enum +%LCLop __ \field_arrow tm_zone :__tm_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop EPROTOTYPE : -> _eerrno0e_Enum +%LCLop ENOPROTOOPT : -> _eerrno0e_Enum +%LCLop [__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __] :char, char, char, char, char, char, char, char, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr, __char_Obj_Ptr -> _lconv_Struct_Tuple +%LCLop EPROTONOSUPPORT : -> _eerrno0e_Enum +%LCLop ESOCKTNOSUPPORT : -> _eerrno0e_Enum +%LCLop EOPNOTSUPP : -> _eerrno0e_Enum +%LCLop __ \select ss_sp :_sigstack_Struct_Tuple -> __char_Obj_Ptr +%LCLop __ \select ss_sp :_sigstack_Struct -> ___char_Obj_Ptr_Obj +%LCLop EPFNOSUPPORT : -> _eerrno0e_Enum +%LCLop __ \select ss_onstack :_sigstack_Struct_Tuple -> int +%LCLop __ \select ss_onstack :_sigstack_Struct -> _int_Obj +%LCLop EAFNOSUPPORT : -> _eerrno0e_Enum +%LCLop __ \field_arrow ss_sp :__sigstack_Struct_Ptr -> ___char_Obj_Ptr_Obj +%LCLop EADDRINUSE : -> _eerrno0e_Enum +%LCLop __ \field_arrow ss_onstack :__sigstack_Struct_Ptr -> _int_Obj +%LCLop EADDRNOTAVAIL : -> _eerrno0e_Enum +%LCLop NIL : -> __char_Obj_Ptr +%LCLop NIL : -> __lconv_Struct_Ptr +%LCLop NIL : -> __exception_Struct_Ptr +%LCLop NIL : -> __int_Obj_Ptr +%LCLop NIL : -> __double_Obj_Ptr +%LCLop NIL : -> __sigvec_Struct_Ptr +%LCLop NIL : -> __sigaction_Struct_Ptr +%LCLop NIL : -> __sigstack_Struct_Ptr +%LCLop NIL : -> __sigcontext_Struct_Ptr +%LCLop NIL : -> __sstdlib_lcl0s_Struct_Ptr +%LCLop NIL : -> __sstdlib_lcl1s_Struct_Ptr +%LCLop NIL : -> __void_Obj_Ptr +%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr +%LCLop NIL : -> __FILE_Obj_Ptr +%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr +%LCLop NIL : -> __sstdlib0s_Struct_Ptr +%LCLop NIL : -> __sstdlib1s_Struct_Ptr +%LCLop NIL : -> __timeval_Struct_Ptr +%LCLop NIL : -> __timezone_Struct_Ptr +%LCLop NIL : -> __itimerval_Struct_Ptr +%LCLop NIL : -> __tm_Struct_Ptr +%LCLop ENETDOWN : -> _eerrno0e_Enum +%LCLop ENETUNREACH : -> _eerrno0e_Enum +%LCLop ENETRESET : -> _eerrno0e_Enum +%LCLop ECONNABORTED : -> _eerrno0e_Enum +%LCLop ECONNRESET : -> _eerrno0e_Enum +%LCLop ENOBUFS : -> _eerrno0e_Enum +%LCLop EISCONN : -> _eerrno0e_Enum +%LCLop - __ :int -> int +%LCLop - __ :double -> double +%LCLop ENOTCONN : -> _eerrno0e_Enum +%LCLop __ + __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ + __ :int, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :int, int -> int +%LCLop __ + __ :double, double -> double +%LCLop __ + __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ + __ :int, __lconv_Struct_Ptr -> __lconv_Struct_Ptr +%LCLop __ + __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ + __ :int, __exception_Struct_Ptr -> __exception_Struct_Ptr +%LCLop __ + __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ + __ :int, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ + __ :int, __double_Obj_Ptr -> __double_Obj_Ptr +%LCLop __ + __ :__sigvec_Struct_Ptr, int -> __sigvec_Struct_Ptr +%LCLop __ + __ :int, __sigvec_Struct_Ptr -> __sigvec_Struct_Ptr +%LCLop __ + __ :__sigaction_Struct_Ptr, int -> __sigaction_Struct_Ptr +%LCLop __ + __ :int, __sigaction_Struct_Ptr -> __sigaction_Struct_Ptr +%LCLop __ + __ :__sigstack_Struct_Ptr, int -> __sigstack_Struct_Ptr +%LCLop __ + __ :int, __sigstack_Struct_Ptr -> __sigstack_Struct_Ptr +%LCLop __ + __ :__sigcontext_Struct_Ptr, int -> __sigcontext_Struct_Ptr +%LCLop __ + __ :int, __sigcontext_Struct_Ptr -> __sigcontext_Struct_Ptr +%LCLop __ + __ :__char_Obj_Ptr, __char_Obj_Ptr -> __char_Obj_Ptr +%LCLop __ + __ :__sstdlib_lcl0s_Struct_Ptr, int -> __sstdlib_lcl0s_Struct_Ptr +%LCLop __ + __ :__sstdlib_lcl0s_Struct_Ptr, __sstdlib_lcl0s_Struct_Ptr -> __sstdlib_lcl0s_Struct_Ptr +%LCLop __ + __ :__sstdlib_lcl1s_Struct_Ptr, int -> __sstdlib_lcl1s_Struct_Ptr +%LCLop __ + __ :__sstdlib_lcl1s_Struct_Ptr, __sstdlib_lcl1s_Struct_Ptr -> __sstdlib_lcl1s_Struct_Ptr +%LCLop __ + __ :__void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLop __ + __ :__void_Obj_Ptr, __void_Obj_Ptr -> __void_Obj_Ptr +%LCLop __ + __ :__int_Obj_Ptr, __int_Obj_Ptr -> __int_Obj_Ptr +%LCLop __ + __ :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr +%LCLop __ + __ :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr +%LCLop __ + __ :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ + __ :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr +%LCLop __ + __ :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr +%LCLop __ + __ :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr +%LCLop __ + __ :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr +%LCLop __ + __ :__timeval_Struct_Ptr, int -> __timeval_Struct_Ptr +%LCLop __ + __ :int, __timeval_Struct_Ptr -> __timeval_Struct_Ptr +%LCLop __ + __ :__timezone_Struct_Ptr, int -> __timezone_Struct_Ptr +%LCLop __ + __ :int, __timezone_Struct_Ptr -> __timezone_Struct_Ptr +%LCLop __ + __ :__itimerval_Struct_Ptr, int -> __itimerval_Struct_Ptr +%LCLop __ + __ :int, __itimerval_Struct_Ptr -> __itimerval_Struct_Ptr +%LCLop __ + __ :__tm_Struct_Ptr, int -> __tm_Struct_Ptr +%LCLop __ + __ :int, __tm_Struct_Ptr -> __tm_Struct_Ptr +%LCLop __ \select sc_onstack :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_onstack :_sigcontext_Struct -> _int_Obj +%LCLop ESHUTDOWN : -> _eerrno0e_Enum +%LCLop __ - __ :__char_Obj_Ptr, int -> __char_Obj_Ptr +%LCLop __ - __ :__char_Obj_Ptr, __char_Obj_Ptr -> int +%LCLop __ - __ :int, int -> int +%LCLop __ - __ :double, double -> double +%LCLop __ - __ :__lconv_Struct_Ptr, int -> __lconv_Struct_Ptr +%LCLop __ - __ :__lconv_Struct_Ptr, __lconv_Struct_Ptr -> int +%LCLop __ - __ :__exception_Struct_Ptr, int -> __exception_Struct_Ptr +%LCLop __ - __ :__exception_Struct_Ptr, __exception_Struct_Ptr -> int +%LCLop __ - __ :__int_Obj_Ptr, int -> __int_Obj_Ptr +%LCLop __ - __ :__int_Obj_Ptr, __int_Obj_Ptr -> int +%LCLop __ - __ :__double_Obj_Ptr, int -> __double_Obj_Ptr +%LCLop __ - __ :__double_Obj_Ptr, __double_Obj_Ptr -> int +%LCLop __ - __ :__sigvec_Struct_Ptr, int -> __sigvec_Struct_Ptr +%LCLop __ - __ :__sigvec_Struct_Ptr, __sigvec_Struct_Ptr -> int +%LCLop __ - __ :__sigaction_Struct_Ptr, int -> __sigaction_Struct_Ptr +%LCLop __ - __ :__sigaction_Struct_Ptr, __sigaction_Struct_Ptr -> int +%LCLop __ - __ :__sigstack_Struct_Ptr, int -> __sigstack_Struct_Ptr +%LCLop __ - __ :__sigstack_Struct_Ptr, __sigstack_Struct_Ptr -> int +%LCLop __ - __ :__sigcontext_Struct_Ptr, int -> __sigcontext_Struct_Ptr +%LCLop __ - __ :__sigcontext_Struct_Ptr, __sigcontext_Struct_Ptr -> int +%LCLop __ - __ :__sstdlib_lcl0s_Struct_Ptr, int -> __sstdlib_lcl0s_Struct_Ptr +%LCLop __ - __ :__sstdlib_lcl0s_Struct_Ptr, __sstdlib_lcl0s_Struct_Ptr -> int +%LCLop __ - __ :__sstdlib_lcl1s_Struct_Ptr, int -> __sstdlib_lcl1s_Struct_Ptr +%LCLop __ - __ :__sstdlib_lcl1s_Struct_Ptr, __sstdlib_lcl1s_Struct_Ptr -> int +%LCLop __ - __ :__void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLop __ - __ :__void_Obj_Ptr, __void_Obj_Ptr -> int +%LCLop __ - __ :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr +%LCLop __ - __ :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int +%LCLop __ - __ :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr +%LCLop __ - __ :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int +%LCLop __ - __ :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr +%LCLop __ - __ :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int +%LCLop __ - __ :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr +%LCLop __ - __ :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int +%LCLop __ - __ :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr +%LCLop __ - __ :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int +%LCLop __ - __ :__timeval_Struct_Ptr, int -> __timeval_Struct_Ptr +%LCLop __ - __ :__timeval_Struct_Ptr, __timeval_Struct_Ptr -> int +%LCLop __ - __ :__timezone_Struct_Ptr, int -> __timezone_Struct_Ptr +%LCLop __ - __ :__timezone_Struct_Ptr, __timezone_Struct_Ptr -> int +%LCLop __ - __ :__itimerval_Struct_Ptr, int -> __itimerval_Struct_Ptr +%LCLop __ - __ :__itimerval_Struct_Ptr, __itimerval_Struct_Ptr -> int +%LCLop __ - __ :__tm_Struct_Ptr, int -> __tm_Struct_Ptr +%LCLop __ - __ :__tm_Struct_Ptr, __tm_Struct_Ptr -> int +%LCLop sizeof :bool -> int +%LCLop sizeof :int -> int +%LCLop sizeof :char -> int +%LCLop sizeof :void -> int +%LCLop sizeof :float -> int +%LCLop sizeof :double -> int +%LCLop sizeof :_eerrno0e_Enum -> int +%LCLop sizeof :_emath1e_Enum -> int +%LCLop sizeof :FILE -> int +%LCLop sizeof :_etime2e_Enum -> int +%LCLop __ \select sc_mask :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mask :_sigcontext_Struct -> _int_Obj +%LCLop DOMAIN : -> _emath1e_Enum +%LCLop ETOOMANYREFS : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_onstack :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_pc :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_pc :_sigcontext_Struct -> _int_Obj +%LCLop SING : -> _emath1e_Enum +%LCLop ETIMEDOUT : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mask :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_regs :_sigcontext_Struct_Tuple -> _int_Vec +%LCLop __ \select sc_regs :_sigcontext_Struct -> __int_Obj_Arr +%LCLop OVERFLOW : -> _emath1e_Enum +%LCLop ECONNREFUSED : -> _eerrno0e_Enum +%LCLop isSub :_char_Vec, int -> bool +%LCLop isSub :__char_Obj_Arr, int -> bool +%LCLop isSub :__lconv_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__lconv_Struct_Arr, int -> bool +%LCLop isSub :__exception_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__exception_Struct_Arr, int -> bool +%LCLop isSub :_int_Vec, int -> bool +%LCLop isSub :__int_Obj_Arr, int -> bool +%LCLop isSub :_double_Vec, int -> bool +%LCLop isSub :__double_Obj_Arr, int -> bool +%LCLop isSub :__sigvec_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigvec_Struct_Arr, int -> bool +%LCLop isSub :__sigaction_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigaction_Struct_Arr, int -> bool +%LCLop isSub :__sigstack_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigstack_Struct_Arr, int -> bool +%LCLop isSub :__sigcontext_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sigcontext_Struct_Arr, int -> bool +%LCLop isSub :__sstdlib_lcl0s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib_lcl0s_Struct_Arr, int -> bool +%LCLop isSub :__sstdlib_lcl1s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib_lcl1s_Struct_Arr, int -> bool +%LCLop isSub :_void_Vec, int -> bool +%LCLop isSub :__void_Obj_Arr, int -> bool +%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool +%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool +%LCLop isSub :_FILE_Vec, int -> bool +%LCLop isSub :__FILE_Obj_Arr, int -> bool +%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool +%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool +%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool +%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool +%LCLop isSub :__timeval_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__timeval_Struct_Arr, int -> bool +%LCLop isSub :__timezone_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__timezone_Struct_Arr, int -> bool +%LCLop isSub :__itimerval_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__itimerval_Struct_Arr, int -> bool +%LCLop isSub :__tm_Struct_Tuple_Vec, int -> bool +%LCLop isSub :__tm_Struct_Arr, int -> bool +%LCLtag lconv struct +%LCLop __ \field_arrow sc_pc :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop UNDERFLOW : -> _emath1e_Enum +%LCLop ELOOP : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_regs :__sigcontext_Struct_Ptr -> __int_Obj_Arr +%LCLop __ \select sc_mdlo :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mdlo :_sigcontext_Struct -> _int_Obj +%LCLop TLOSS : -> _emath1e_Enum +%LCLop ENAMETOOLONG : -> _eerrno0e_Enum +%LCLop __ \select sc_mdhi :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_mdhi :_sigcontext_Struct -> _int_Obj +%LCLop PLOSS : -> _emath1e_Enum +%LCLop EHOSTDOWN : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mdlo :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_ownedfp :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_ownedfp :_sigcontext_Struct -> _int_Obj +%LCLop EHOSTUNREACH : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_mdhi :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_fpregs :_sigcontext_Struct_Tuple -> _int_Vec +%LCLop __ \select sc_fpregs :_sigcontext_Struct -> __int_Obj_Arr +%LCLop ENOTEMPTY : -> _eerrno0e_Enum +%LCLop succ :int -> int +%LCLtag emath1e enum +%LCLop __ \field_arrow sc_ownedfp :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_fpc_csr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_fpc_csr :_sigcontext_Struct -> _int_Obj +%LCLop EPROCLIM : -> _eerrno0e_Enum +%LCLop pred :int -> int +%LCLop __ \field_arrow sc_fpregs :__sigcontext_Struct_Ptr -> __int_Obj_Arr +%LCLop __ \select sc_fpc_eir :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_fpc_eir :_sigcontext_Struct -> _int_Obj +%LCLop EUSERS : -> _eerrno0e_Enum +%LCLop __ \field_arrow sc_fpc_csr :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_cause :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_cause :_sigcontext_Struct -> _int_Obj +%LCLop EDQUOT : -> _eerrno0e_Enum +%LCLtag timeval struct +%LCLop __ \field_arrow sc_fpc_eir :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_badvaddr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_badvaddr :_sigcontext_Struct -> _int_Obj +%LCLop ESTALE : -> _eerrno0e_Enum +%LCLop abs :int -> int +%LCLop abs :double -> double +%LCLop __ \field_arrow sc_cause :__sigcontext_Struct_Ptr -> _int_Obj +%LCLop __ \select sc_badpaddr :_sigcontext_Struct_Tuple -> int +%LCLop __ \select sc_badpaddr :_sigcontext_Struct -> _int_Obj +%LCLop EREMOTE : -> _eerrno0e_Enum +%LCLop div :int, int -> int +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLtype float float exposed +%LCLtype bool bool immutable +%LCLconst FALSE bool +%LCLconst TRUE bool +%LCLtype size_t _size_t exposed +%LCLtype wchar_t _wchar_t exposed +%LCLtype div_t _div_t exposed +%LCLtype ldiv_t _ldiv_t exposed +%LCLconst NULL __void_Obj_Ptr +%LCLconst EXIT_FAILURE int +%LCLconst EXIT_SUCCESS int +%LCLconst RAND_MAX int +%LCLconst MB_CUR_MAX int +%LCLfcn abort : -> void +%LCLfcnGlobals +%LCLfcn abs : int -> int +%LCLfcnGlobals +%LCLfcn atexit : _HOF_sort_125 -> int +%LCLfcnGlobals +%LCLfcn atof : __char_Obj_Ptr -> double +%LCLfcnGlobals +%LCLfcn atoi : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn atol : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_126 -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn calloc : int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn div : int, int -> _sstdlib_lcl0s_Struct +%LCLfcnGlobals +%LCLfcn exit : int -> void +%LCLfcnGlobals +%LCLfcn free : __void_Obj_Ptr -> void +%LCLfcnGlobals +%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn labs : int -> int +%LCLfcnGlobals +%LCLfcn ldiv : int, int -> _sstdlib_lcl1s_Struct +%LCLfcnGlobals +%LCLfcn malloc : int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn mblen : __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_127 -> void +%LCLfcnGlobals +%LCLfcn rand : -> int +%LCLfcnGlobals +%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn srand : int -> void +%LCLfcnGlobals +%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double +%LCLfcnGlobals +%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn system : __char_Obj_Ptr -> int +%LCLfcnGlobals +%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn wctomb : __char_Obj_Ptr, int -> int +%LCLfcnGlobals +%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void +%LCLfcnGlobals +%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool +%LCLfcnGlobals +%LCLfcn bzero : __char_Obj_Ptr, int -> void +%LCLfcnGlobals +%LCLfcn ffs : int -> int +%LCLfcnGlobals +%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool +%LCLfcnGlobals +%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr +%LCLfcnGlobals +%LCLtype __timeval ___timeval exposed +%LCLtype __timezone ___timezone exposed +%LCLenumConst DST_NONE _etime2e_Enum +%LCLenumConst DST_USA _etime2e_Enum +%LCLenumConst DST_AUST _etime2e_Enum +%LCLenumConst DST_WET _etime2e_Enum +%LCLenumConst DST_MET _etime2e_Enum +%LCLenumConst DST_EET _etime2e_Enum +%LCLvar __timezones __etime2e_Enum_Obj +%LCLfcn timerisset : _timeval_Struct_Tuple -> bool +%LCLfcnGlobals +%LCLvar timerclear _HOF_sort_142 +%LCLconst ITIMER_REAL int +%LCLconst ITIMER_VIRTUAL int +%LCLconst ITIMER_PROF int +%LCLtype __itimerval ___itimerval exposed +%LCLtype __tm ___tm exposed +%LCLtype time_t _time_t exposed +%LCLtype clock_t _clock_t exposed +%LCLconst CLOCKS_PER_SEC int +%LCLfcn asctime : __tm_Struct_Ptr -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLfcn clock : -> int +%LCLfcnGlobals +%LCLvar ctime _HOF_sort_157 +%LCLfcn difftime : int, int -> double +%LCLfcnGlobals +%LCLfcn gmtime : __int_Obj_Ptr -> __tm_Struct_Ptr +%LCLfcnGlobals +%LCLfcn localtime : __int_Obj_Ptr -> __tm_Struct_Ptr +%LCLfcnGlobals +%LCLfcn mktime : __tm_Struct_Ptr -> int +%LCLfcnGlobals +%LCLfcn strftime : __char_Obj_Ptr, int, __char_Obj_Ptr, __tm_Struct_Ptr -> int +%LCLfcnGlobals +%LCLfcn time : __int_Obj_Ptr -> int +%LCLfcnGlobals +%LCLvar tzname ____char_Obj_Ptr_Obj_Arr +%LCLfcn timezone : -> __char_Obj_Ptr +%LCLfcnGlobals +%LCLSymbolTableEnd diff --git a/lib/CTrait.syms b/lib/CTrait.syms new file mode 100644 index 0000000..a99e3a8 --- /dev/null +++ b/lib/CTrait.syms @@ -0,0 +1,99 @@ +true: -> Bool +false: -> Bool +\not __: Bool -> Bool +__ \and __: Bool, Bool -> Bool +__ \or __: Bool, Bool -> Bool +__ \implies __: Bool, Bool -> Bool +__ \eq __: Bool, Bool -> Bool +__ \eq __: Int, Int -> Bool +__ \eq __: double, double -> Bool +__ \eq __: float, float -> Bool +__ \eq __: _char_Vec, _char_Vec -> Bool +__ \eq __: char, char -> Bool +__ \neq __: Bool, Bool -> Bool +__ \neq __: Int, Int -> Bool +__ \neq __: double, double -> Bool +__ \neq __: float, float -> Bool +__ \neq __: _char_Vec, _char_Vec -> Bool +__ \neq __: char, char -> Bool +if __ then __ else __: Bool, Bool, Bool -> Bool +if __ then __ else __: Bool, Int, Int -> Int +if __ then __ else __: Bool, double, double -> double +if __ then __ else __: Bool, float, float -> float +if __ then __ else __: Bool, _char_Vec, _char_Vec -> _char_Vec +if __ then __ else __: Bool, char, char -> char +__ |- __: _char_Vec, char -> _char_Vec +__ -| __: char, _char_Vec -> _char_Vec +__ \leq __: Int, Int -> Bool +__ \leq __: double, double -> Bool +__ \leq __: float, float -> Bool +__ \geq __: Int, Int -> Bool +__ \geq __: double, double -> Bool +__ \geq __: float, float -> Bool +succ: Int -> Int +pred: Int -> Int +- __: Int -> Int +__ - __: Int, Int -> Int +- __: double -> double +__ - __: double, double -> double +- __: float -> float +__ - __: float, float -> float +__ + __: Int, Int -> Int +__ + __: double, double -> double +__ + __: float, float -> float +__ * __: Int, Int -> Int +__ * __: double, double -> double +__ * __: float, float -> float +__ < __: Int, Int -> Bool +__ < __: double, double -> Bool +__ < __: float, float -> Bool +__ > __: Int, Int -> Bool +__ > __: double, double -> Bool +__ > __: float, float -> Bool +abs: Int -> Int +abs: double -> double +abs: float -> float +div: Int, Int -> Int +mod: Int, Int -> Int +min: Int, Int -> Int +max: Int, Int -> Int +0: -> Int +0: -> double +0: -> float +1: -> Int +1: -> double +1: -> float +__ \inv: double -> double +__ \inv: float -> float +__ / __: double, double -> double +__ / __: float, float -> float +empty: -> _char_Vec +__ || __: _char_Vec, _char_Vec -> _char_Vec +__ \in __: char, _char_Vec -> Bool +count: char, _char_Vec -> Int +head: _char_Vec -> char +init: _char_Vec -> _char_Vec +isEmpty: _char_Vec -> Bool +last: _char_Vec -> char +len: _char_Vec -> Int +prefix: _char_Vec, Int -> _char_Vec +removePrefix: _char_Vec, Int -> _char_Vec +substring: _char_Vec, Int, Int -> _char_Vec +tail: _char_Vec -> _char_Vec +null: -> char +nullTerminated: _char_Vec -> Bool +throughNull: _char_Vec -> _char_Vec +sameStr: _char_Vec, _char_Vec -> Bool +lenStr: _char_Vec -> Int +times10plus: Int, Int -> Int +plus1: Int -> Int +2: -> Int +3: -> Int +4: -> Int +5: -> Int +6: -> Int +7: -> Int +8: -> Int +9: -> Int +__ [ __ ]: _char_Vec, Int -> char +{ __ }: char -> _char_Vec diff --git a/lib/CTraitGen.lcl b/lib/CTraitGen.lcl new file mode 100644 index 0000000..4f47f52 --- /dev/null +++ b/lib/CTraitGen.lcl @@ -0,0 +1 @@ +includes CTrait (char [] for String) \ No newline at end of file diff --git a/lib/Makefile b/lib/Makefile new file mode 100644 index 0000000..9e142e0 --- /dev/null +++ b/lib/Makefile @@ -0,0 +1,10 @@ +LCLINT = ../bin/lclint + +all: + ${LCLINT} -nolib +impconj ansi.h -dump ansi + ${LCLINT} -nolib +impconj -DSTRICT ansi.h -dump ansistrict + ${LCLINT} -nolib +impconj ansi.h posix.h -dump posix + ${LCLINT} -nolib +impconj -DSTRICT ansi.h posix.h -dump posixstrict + ${LCLINT} -nolib +impconj ansi.h posix.h unix.h -dump unix + ${LCLINT} -nolib +impconj -DSTRICT ansi.h posix.h unix.h -dump unixstrict + diff --git a/lib/ansi.h b/lib/ansi.h new file mode 100644 index 0000000..a76bd0e --- /dev/null +++ b/lib/ansi.h @@ -0,0 +1,936 @@ +/* +** ansi.h --- LCLint Standard C Library +** +** Process with -DSTRICT to get strict library. +*/ + +/*@-nextlinemacros@*/ +/*@+allimponly@*/ +/*@+globsimpmodifiesnothing@*/ + +/* +** errno.h +*/ + +/*@constant int EDOM;@*/ +/*@constant int ERANGE;@*/ +/*@constant int EILSEQ;@*/ + +# ifdef STRICT +/*@checkedstrict@*/ extern int errno; +# else +/*@unchecked@*/ extern int errno; +# endif + +/* +** types +*/ + +typedef /*@integraltype@*/ ptrdiff_t; +typedef /*@unsignedintegraltype@*/ size_t; +typedef /*@signedintegraltype@*/ ssize_t; +typedef /*@integraltype@*/ wchar_t; + +/* +** Added by Amendment 1 to ISO. +*/ + +typedef /*@integraltype@*/ wint_t; +typedef /*@abstract@*/ mbstate_t; + +/*@constant null anytype NULL = 0;@*/ + +/* +** assert.h +*/ + +/*@constant lltX_bool NDEBUG;@*/ + +# ifdef STRICT +extern /*@falseexit@*/ void assert (/*@sef@*/ lltX_bool e) + /*@*/ ; +# else +extern /*@falseexit@*/ void assert (/*@sef@*/ lltX_bool /*@alt int@*/ e) + /*@*/ ; +# endif + + +/* +** ctype.h +*/ + +# ifdef STRICT +extern lltX_bool isalnum (unsigned char c) /*@*/ ; +extern lltX_bool isalpha (unsigned char c) /*@*/ ; +extern lltX_bool iscntrl (unsigned char c) /*@*/ ; +extern lltX_bool isdigit (unsigned char c) /*@*/ ; +extern lltX_bool isgraph (unsigned char c) /*@*/ ; +extern lltX_bool islower (unsigned char c) /*@*/ ; +extern lltX_bool isprint (unsigned char c) /*@*/ ; +extern lltX_bool ispunct (unsigned char c) /*@*/ ; +extern lltX_bool isspace (unsigned char c) /*@*/ ; +extern lltX_bool isupper (unsigned char c) /*@*/ ; +extern lltX_bool isxdigit (unsigned char c) /*@*/ ; +extern char tolower (unsigned char c) /*@*/ ; +extern char toupper (unsigned char c) /*@*/ ; +# else +extern lltX_bool /*@alt int@*/ isalnum (unsigned char /*@alt int@*/ c) /*@*/ ; +extern lltX_bool /*@alt int@*/ isalpha (unsigned char /*@alt int@*/ c) /*@*/ ; +extern lltX_bool /*@alt int@*/ iscntrl (unsigned char /*@alt int@*/ c) /*@*/ ; +extern lltX_bool /*@alt int@*/ isdigit (unsigned char /*@alt int@*/ c) /*@*/ ; +extern lltX_bool /*@alt int@*/ isgraph (unsigned char /*@alt int@*/ c) /*@*/ ; +extern lltX_bool /*@alt int@*/ islower (unsigned char /*@alt int@*/ c) /*@*/ ; +extern lltX_bool /*@alt int@*/ isprint (unsigned char /*@alt int@*/ c) /*@*/ ; +extern lltX_bool /*@alt int@*/ ispunct (unsigned char /*@alt int@*/ c) /*@*/ ; +extern lltX_bool /*@alt int@*/ isspace (unsigned char /*@alt int@*/ c) /*@*/ ; +extern lltX_bool /*@alt int@*/ isupper (unsigned char /*@alt int@*/ c) /*@*/ ; +extern lltX_bool /*@alt int@*/ isxdigit (unsigned char /*@alt int@*/ c) /*@*/ ; +extern char /*@alt int@*/ tolower (unsigned char /*@alt int@*/ c) /*@*/ ; +extern char /*@alt int@*/ toupper (unsigned char /*@alt int@*/ c) /*@*/ ; +# endif + +/* +** locale.h +*/ + +struct lconv +{ + char *decimal_point; + char *thousands_sep; + char *grouping; + char *int_curr_symbol; + char *currency_symbol; + char *mon_decimal_point; + char *mon_thousands_sep; + char *mon_grouping; + char *positive_sign; + char *negative_sign; + char int_frac_digits; + char frac_digits; + char p_cs_precedes; + char p_sep_by_space; + char n_cs_precedes; + char n_sep_by_space; + char p_sign_posn; + char n_sign_posn; +} ; + +/*@constant int LC_ALL;@*/ +/*@constant int LC_COLLATE;@*/ +/*@constant int LC_CTYPE;@*/ +/*@constant int LC_MONETARY;@*/ +/*@constant int LC_NUMERIC;@*/ +/*@constant int LC_TIME;@*/ + +extern /*@observer@*/ /*@null@*/ char *setlocale (int category, /*@null@*/ char *locale) + /*@modifies internalState, errno@*/ ; + +extern struct lconv *localeconv (void) /*@*/ ; + +/* +** float.h +*/ + +/* +** Note, these are defined by macros, but NOT necessarily +** constants. They may be used as lvalues. +*/ + +/*@unchecked@*/ extern int DBL_DIG; +/*@unchecked@*/ extern double DBL_EPSILON; +/*@unchecked@*/ extern int DBL_MANT_DIG; +/*@unchecked@*/ extern double DBL_MAX; +/*@unchecked@*/ extern int DBL_MAX_10_EXP; +/*@unchecked@*/ extern int DBL_MAX_EXP; +/*@unchecked@*/ extern double DBL_MIN; +/*@unchecked@*/ extern int DBL_MIN_10_EXP; +/*@unchecked@*/ extern int DBL_MIN_EXP; + +/*@unchecked@*/ extern int FLT_DIG; +/*@unchecked@*/ extern float FLT_EPSILON; +/*@unchecked@*/ extern int FLT_MANT_DIG; +/*@unchecked@*/ extern float FLT_MAX; +/*@unchecked@*/ extern int FLT_MAX_10_EXP; +/*@unchecked@*/ extern int FLT_MAX_EXP; +/*@unchecked@*/ extern float FLT_MIN; +/*@unchecked@*/ extern int FLT_MIN_10_EXP; +/*@unchecked@*/ extern int FLT_MIN_EXP; +/*@constant int FLT_RADIX@*/ +/*@unchecked@*/ extern int FLT_ROUNDS; + +/*@unchecked@*/ extern int LDBL_DIG; +/*@unchecked@*/ extern long double LDBL_EPSILON; +/*@unchecked@*/ extern int LDBL_MANT_DIG; +/*@unchecked@*/ extern long double LDBL_MAX; +/*@unchecked@*/ extern int LDBL_MAX_10_EXP; +/*@unchecked@*/ extern int LDBL_MAX_EXP; +/*@unchecked@*/ extern long double LDBL_MIN; +/*@unchecked@*/ extern int LDBL_MIN_10_EXP; +/*@unchecked@*/ extern int LDBL_MIN_EXP; + +/* +** limits.h +*/ + +/*@constant int CHAR_BIT; @*/ +/*@constant char CHAR_MAX; @*/ +/*@constant char CHAR_MIN; @*/ +/*@constant int INT_MAX; @*/ +/*@constant int INT_MIN; @*/ +/*@constant long int LONG_MAX; @*/ +/*@constant long int LONG_MIN; @*/ +/*@constant long int MB_LEN_MAX@*/ +/*@constant signed char SCHAR_MAX; @*/ +/*@constant signed char SCHAR_MIN; @*/ +/*@constant short SHRT_MAX; @*/ +/*@constant short SHRT_MIN; @*/ +/*@constant unsigned char UCHAR_MAX; @*/ +/*@constant unsigned char UCHAR_MIN; @*/ +/*@constant unsigned int UINT_MAX; @*/ +/*@constant unsigned long ULONG_MAX; @*/ +/*@constant unsigned short USHRT_MAX; @*/ + +/* +** math.h +*/ + +/*@constant double HUGE_VAL; @*/ + +/* +** math functions that may have a range error modify errno +*/ + +extern double sin (double x) /*@*/ ; +extern double cos (double x) /*@*/ ; +extern double tan (double x) /*@*/ ; +extern double asin (double x) /*@modifies errno@*/ ; +extern double acos (double x) /*@modifies errno@*/ ; +extern double atan (double x) /*@*/ ; +extern double atan2 (double y, double x) /*@*/ ; +extern double sinh (double x) /*@*/ ; +extern double cosh (double x) /*@modifies errno@*/ ; +extern double tanh (double x) /*@*/ ; + +extern double exp (double x) /*@modifies errno@*/ ; +extern double ldexp (double x, int n) /*@modifies errno@*/ ; +extern double frexp (double x, /*@out@*/ int *xp) /*@modifies *xp;@*/ ; + +extern double log (double x) /*@modifies errno@*/ ; +extern double log10 (double x) /*@modifies errno@*/ ; + +extern double pow (double x, double y) /*@modifies errno@*/ ; +extern double sqrt (double x) /*@modifies errno@*/ ; + +extern double ceil (double x) /*@*/ ; +extern double floor (double x) /*@*/ ; +extern double fabs (double x) /*@*/ ; + +double modf (double x, /*@out@*/ double *ip) /*@modifies *ip;@*/ ; +double fmod (double x, double y) /*@*/ ; + +/* +** These functions are optional in iso C. An implementation does not +** have to provide them. They are included in comments here, but +** are not required to be part of the standard library. +*/ + +# ifdef OPTIONAL_MATH + +extern float acosf (float x) /*@modifies errno@*/ ; +extern long double acosl (long double x) /*@modifies errno@*/ ; +extern float asinf (float x) /*@modifies errno@*/ ; +extern long double asinl (long double x) /*@modifies errno@*/ ; +extern float atanf (float x) /*@*/ ; +extern long double atanl (long double x) /*@*/ ; +extern float atan2f (float y, float x) /*@*/ ; +extern long double atan2l (long double y, long double x) /*@*/ ; +extern float ceilf (float x) /*@*/ ; +extern long double ceill (long double x) /*@*/ ; +extern float cosf (float x) /*@*/ ; +extern long double cosl (long double x) /*@*/ ; +extern float coshf (float x) /*@modifies errno@*/ ; +extern long double coshl (long double x) /*@modifies errno@*/ ; +extern float expf (float x) /*@modifies errno@*/ ; +extern long double expl (long double x) /*@modifies errno@*/; +extern float fabsf (float x) /*@*/ ; +extern long double fabsl (long double x) /*@*/ ; +extern float floorf (float x) /*@*/ ; +extern long double floorl (long double x) /*@*/ ; +extern float fmodf (float x, float y) /*@*/ ; +extern long double fmodl (long double x, long double y) /*@*/ ; +extern float frexpf (float x, /*@out@*/ int *xp) /*@modifies *xp@*/; +extern long double frexpl (long double x, /*@out@*/ int *xp) /*@modifies *xp@*/; +extern float ldexpf (float x, int n) /*@modifies errno@*/ ; +extern long double ldexpl (long double x, int n) /*@modifies errno@*/ ; +extern float logf (float x) /*@modifies errno@*/ ; +extern long double logl (long double x) /*@modifies errno@*/ ; +extern float log10f (float x) /*@modifies errno@*/; +extern long double log10l (long double x) /*@modifies errno@*/; +extern float modff (float x, /*@out@*/ float *xp) /*@modifies *xp@*/ ; +extern long double modfl (long double x, /*@out@*/ long double *xp) /*@modifies *xp@*/ ; +extern float powf (float x, float y) /*@modifies errno@*/ ; +extern long double powl (long double x, long double y) /*@modifies errno@*/ ; +extern float sinf (float x) /*@*/ ; +extern long double sinl (long double x) /*@*/ ; +extern float sinhf (float x) /*@*/ ; +extern long double sinhl (long double x) /*@*/ ; +extern float sqrtf (float x) /*@modifies errno@*/ ; +extern long double sqrtl (long double x) /*@modifies errno@*/ ; +extern float tanf (float x) /*@*/ ; +extern long double tanl (long double x) /*@*/ ; +extern float tanhf (float x) /*@*/ ; +extern long double tanhl (long double x) /*@*/ ; + +# endif + +/* +** setjmp.h +*/ + +typedef /*@abstract@*/ /*@mutable@*/ void *jmp_buf; + +extern int setjmp (/*@out@*/ jmp_buf env) /*@modifies env;@*/ ; +extern /*@mayexit@*/ void longjmp (jmp_buf env, int val) /*@*/ ; + +/* +** signal.h +*/ + +/*@constant int SIGABRT; @*/ +/*@constant int SIGFPE; @*/ +/*@constant int SIGILL; @*/ +/*@constant int SIGINT; @*/ +/*@constant int SIGSEGV; @*/ +/*@constant int SIGTERM; @*/ + +typedef /*@integraltype@*/ sig_atomic_t; + +/*@constant void (*SIG_DFL)(int); @*/ +/*@constant void (*SIG_ERR)(int); @*/ +/*@constant void (*SIG_IGN)(int); @*/ + +/* +** signal takes an int, and a function takes int returns void, and +** returns the function (or NULL if unsuccessful). +*/ + +extern /*@null@*/ void (*signal (int sig, /*@null@*/ void (*func)(int))) (int) + /*@modifies internalState, errno;@*/ ; + +extern /*@mayexit@*/ int raise (int sig) ; + +/* +** stdarg.h +*/ + +typedef /*@abstract@*/ /*@mutable@*/ void *va_list; + +extern void va_start (/*@out@*/ va_list ap, ...) /*@modifies ap;@*/ ; +extern void va_end (va_list va) /*@modifies va;@*/ ; + +/* +** va_arg is builtin +*/ + +/* +** stdio.h +*/ + +typedef /*@abstract@*/ /*@mutable@*/ void *FILE; +typedef /*@abstract@*/ /*@mutable@*/ void *fpos_t; + +/*@constant int _IOFBF; @*/ +/*@constant int _IOLBF; @*/ +/*@constant int _IONBF; @*/ + +/*@constant int BUFSIZ; @*/ +/*@constant int EOF; @*/ + +/*@constant int FOPEN_MAX; @*/ +/*@constant int FILENAME_MAX; @*/ + +/*@constant int L_tmpnam; @*/ + +/*@constant int SEEK_CUR; @*/ +/*@constant int SEEK_END; @*/ +/*@constant int SEEK_SET; @*/ + +/*@constant int TMP_MAX; @*/ + +# ifdef STRICT +/*@checked@*/ FILE *stderr; +/*@checked@*/ FILE *stdin; +/*@checked@*/ FILE *stdout; +# else +/*@unchecked@*/ FILE *stderr; +/*@unchecked@*/ FILE *stdin; +/*@unchecked@*/ FILE *stdout; +# endif + +extern int remove (char *filename) /*@modifies fileSystem, errno@*/ ; +extern int rename (char *old, char *new) /*@modifies fileSystem, errno@*/ ; + +extern /*@null@*/ FILE *tmpfile (void) /*@modifies fileSystem@*/ ; +extern /*@observer@*/ char * + tmpnam (/*@out@*/ /*@null@*/ /*@returned@*/ char *s) + /*@modifies *s, internalState@*/ ; + +extern int fclose (FILE *stream) /*@modifies *stream, errno, fileSystem;@*/ ; +extern int fflush (/*@null@*/ FILE *stream) + /*@modifies *stream, errno, fileSystem;@*/ ; + +extern /*@null@*/ /*@dependent@*/ FILE *fopen (char *filename, char *mode) + /*@modifies fileSystem@*/ ; + +extern /*@null@*/ FILE *freopen (char *filename, char *mode, FILE *stream) + /*@modifies *stream, fileSystem, errno@*/ ; + +extern void setbuf (FILE *stream, /*@null@*/ /*@exposed@*/ char *buf) + /*@modifies fileSystem, *stream, *buf@*/ ; + +extern int setvbuf (FILE *stream, /*@null@*/ /*@exposed@*/ char *buf, + int mode, size_t size) + /*@modifies fileSystem, *stream, *buf@*/ ; + +# ifdef STRICT +/*@printflike@*/ +extern int fprintf (FILE *stream, char *format, ...) + /*@modifies fileSystem, *stream@*/ ; +# else +/*@printflike@*/ +extern int /*@alt void@*/ fprintf (FILE *stream, char *format, ...) + /*@modifies fileSystem, *stream@*/ ; +# endif + +/*@scanflike@*/ +extern int fscanf (FILE *stream, char *format, ...) + /*@modifies fileSystem, *stream@*/ ; + +# ifdef STRICT +/*@printflike@*/ +extern int printf (char *format, ...) + /*@globals stdout@*/ + /*@modifies fileSystem, *stdout@*/ ; +# else +/*@printflike@*/ +extern int /*@alt void@*/ printf (char *format, ...) + /*@globals stdout@*/ + /*@modifies fileSystem, *stdout@*/ ; +# endif + +/*@scanflike@*/ +extern int scanf(char *format, ...) + /*@globals stdin@*/ + /*@modifies fileSystem, *stdin@*/ ; + +# ifdef STRICT +/*@printflike@*/ +extern int sprintf (/*@out@*/ char *s, char *format, ...) + /*@modifies *s@*/ ; +# else +/*@printflike@*/ +extern int /*@alt void@*/ sprintf (/*@out@*/ char *s, char *format, ...) + /*@modifies *s@*/ ; +# endif + +/*@scanflike@*/ +int sscanf (/*@out@*/ char *s, char *format, ...) /*@*/ ; + /* modifies extra arguments */ + +extern int vfprintf (FILE *stream, char *format, va_list arg) + /*@modifies fileSystem, *stream, arg, errno@*/ ; + +extern int vprintf (char *format, va_list arg) + /*@globals stdout@*/ + /*@modifies fileSystem, arg, *stdout@*/ ; + +extern int vsprintf (/*@out@*/ char *s, char *format, va_list arg) + /*@modifies *s, arg@*/ ; + +extern int fgetc (FILE *stream) + /*@modifies fileSystem, *stream, errno@*/ ; + +extern /*@null@*/ char * + fgets (/*@returned@*/ /*@out@*/ char *s, int n, FILE *stream) + /*@modifies fileSystem, *s, *stream, errno@*/ ; + +extern int fputc (int /*@alt char@*/ c, FILE *stream) + /*@modifies fileSystem, *stream, errno@*/ ; + +extern int fputs (char *s, FILE *stream) + /*@modifies fileSystem, *stream@*/ ; + +/* note use of sef --- stream may be evaluated more than once */ +extern int getc (/*@sef@*/ FILE *stream) + /*@modifies fileSystem, *stream@*/ ; + +extern int getchar (void) /*@globals stdin@*/ /*@modifies fileSystem, *stdin@*/ ; + +extern /*@null@*/ char *gets (/*@out@*/ char *s) + /*@globals stdin@*/ /*@modifies fileSystem, *s, *stdin, errno@*/ ; + +extern int putc (int /*@alt char@*/ c, /*@sef@*/ FILE *stream) + /*@modifies fileSystem, *stream;@*/ ; + +extern int putchar (int /*@alt char@*/ c) + /*@globals stdout@*/ /*@modifies fileSystem, *stdout@*/ ; + +extern int puts (const char *s) + /*@globals stdout@*/ /*@modifies fileSystem, *stdout@*/ ; + +extern int ungetc (int /*@alt char@*/ c, FILE *stream) + /*@modifies fileSystem, *stream, errno@*/ ; + +extern size_t + fread (/*@out@*/ void *ptr, size_t size, size_t nobj, FILE *stream) + /*@modifies fileSystem, *ptr, *stream, errno@*/ ; + +extern size_t fwrite (void *ptr, size_t size, size_t nobj, FILE *stream) + /*@modifies fileSystem, *stream, errno@*/ ; + +extern int fgetpos (FILE *stream, /*@out@*/ fpos_t *pos) + /*@modifies *pos, errno@*/ ; + +extern int fseek (FILE *stream, long int offset, int whence) + /*@modifies fileSystem, *stream, errno@*/ ; + +extern int fsetpos (FILE *stream, fpos_t *pos) + /*@modifies fileSystem, *stream, errno@*/ ; + +extern long int ftell(FILE *stream) /*@modifies errno@*/ ; + +extern void rewind (FILE *stream) /*@modifies *stream@*/ ; +extern void clearerr (FILE *stream) /*@modifies *stream@*/ ; + +extern int feof (FILE *stream) /*@modifies errno@*/ ; +extern int ferror (FILE *stream) /*@modifies errno@*/ ; + +extern void perror (/*@null@*/ char *s) + /*@globals errno, stderr@*/ /*@modifies fileSystem, *stderr@*/ ; + +/* +** stdlib.h +*/ + +extern double atof (char *s) /*@*/ ; +extern int atoi (char *s) /*@*/ ; +extern long int atol (char *s) /*@*/ ; + +extern double strtod (char *s, /*@null@*/ /*@out@*/ char **endp) + /*@modifies *endp, errno@*/ ; + +extern long strtol (char *s, /*@null@*/ /*@out@*/ char **endp, int base) + /*@modifies *endp, errno@*/ ; + +extern unsigned long + strtoul (char *s, /*@null@*/ /*@out@*/ char **endp, int base) + /*@modifies *endp, errno@*/ ; + +/*@constant int RAND_MAX; @*/ +extern int rand (void) /*@modifies internalState@*/ ; +extern void srand (unsigned int seed) /*@modifies internalState@*/ ; + +extern /*@null@*/ /*@only@*/ void *calloc (size_t nobj, size_t size) /*@*/ ; +extern /*@null@*/ /*@out@*/ /*@only@*/ void *malloc (size_t size) /*@*/ ; + +/* 11 June 1997: removed out on return value */ + +# if 0 +extern /*@null@*/ /*@only@*/ void * + realloc (/*@null@*/ /*@only@*/ /*@special@*/ void *p, + size_t size) /*@releases p@*/ /*@modifies *p@*/ ; +# endif + +/* +** LCLint annotations cannot fully describe realloc. The semantics we +** want are: +** realloc returns null: ownership of parameter is not changed +** realloc returns non-null: ownership of parameter is transferred to return value +** +** Otherwise, storage is in the same state before and after the call. +*/ + +extern /*@null@*/ /*@only@*/ void * + realloc (/*@null@*/ /*@only@*/ /*@out@*/ /*@returned@*/ void *p, size_t size) + /*@modifies *p @*/; + +extern void free (/*@null@*/ /*@out@*/ /*@only@*/ void *p) /*@modifies *p@*/ ; + +/*@constant int EXIT_FAILURE; @*/ +/*@constant int EXIT_SUCCESS; @*/ + +extern /*@exits@*/ void abort (void) /*@*/ ; +extern /*@exits@*/ void exit (int status) /*@*/ ; +extern int atexit (void (*func)(void)) /*@modifies internalState@*/ ; + +extern /*@observer@*/ /*@null@*/ char *getenv (char *name) /*@*/ ; + +extern int system (/*@null@*/ char *s) /*@modifies fileSystem@*/ ; + +extern /*@null@*/ /*@dependent@*/ void * + bsearch (void *key, void *base, + size_t n, size_t size, + int (*compar)(void *, void *)) /*@*/ ; + +extern void qsort (void *base, size_t n, size_t size, + int (*compar)(void *, void *)) + /*@modifies *base, errno@*/ ; + +extern int abs (int n) /*@*/ ; + +typedef /*@concrete@*/ struct +{ + int quot; + int rem; +} div_t ; + +extern div_t div (int num, int denom) /*@*/ ; + +extern long int labs (long int n) /*@*/ ; + +typedef /*@concrete@*/ struct +{ + long int quot; + long int rem; +} ldiv_t ; + +extern ldiv_t ldiv (long num, long denom) /*@*/ ; + +/*@constant size_t MB_CUR_MAX; @*/ + +/* +** wchar_t and wint_t functions added by Amendment 1 to ISO. +*/ + +/*@constant int WCHAR_MAX@*/ +/*@constant int WCHAR_MIN@*/ +/*@constant wint_t WEOF@*/ + +extern wint_t btowc (int c) /*@*/ ; + +extern wint_t fgetwc (FILE *fp) /*@modifies fileSystem, *fp*/ ; + +extern /*@null@*/ wchar_t *fgetws (/*@returned@*/ wchar_t *s, int n, FILE *stream) + /*@modifies fileSystem, *s, *stream@*/; + +extern wint_t fputwc (wchar_t c, FILE *stream) + /*@modifies fileSystem, *stream@*/; + +extern int fputws (const wchar_t *s, FILE *stream) + /*@modifies fileSystem, *stream@*/ ; + +extern int fwide (FILE *stream, int mode) /*@*/ ; + /* does not modify the stream */ + +/*@printflike@*/ extern int fwprintf (FILE *stream, const wchar_t *format, ...) + /*@modifies *stream, fileSystem@*/ ; + +/*@scanflike@*/ extern int fwscanf (FILE *stream, const wchar_t *format, ...) + /*@modifies *stream, fileSystem@*/ ; + +/* note use of sef --- stream may be evaluated more than once */ +extern wint_t getwc (/*@sef@*/ FILE *stream) /*@modifies fileSystem, *stream@*/ ; + +extern wint_t getwchar (void) /*@modifies fileSystem, *stdin@*/; + +extern size_t mbrlen (const char *s, size_t n, /*@null@*/ mbstate_t *ps) /*@*/ ; + +extern size_t mbrtowc (/*@null@*/ wchar_t *pwc, const char *s, size_t n, + /*@null@*/ mbstate_t *ps) + /*@modifies *pwc@*/ ; + +extern int mbsinit (/*@null@*/ const mbstate_t *ps) /*@*/ ; + +extern size_t mbsrtowcs (/*@null@*/ wchar_t *dst, const char **src, size_t len, + /*@null@*/ mbstate_t *ps) + /*@modifies *dst@*/ ; + +/* note use of sef --- stream may be evaluated more than once */ +extern wint_t putwc (wchar_t c, /*@sef@*/ FILE *stream) /*@modifies fileSystem, *stream@*/ ; + +extern wint_t putwchar (wchar_t c) /*@modifies fileSystem, *stdout@*/ ; + +/*@printflike@*/ extern int swprintf (wchar_t *s, size_t n, const wchar_t *format, ...) + /*@modifies *s@*/ ; + +/*@scanflike@*/ extern int swscanf (const wchar_t *s, const wchar_t *format, ...) + /*@modifies *stdin@*/ ; + +extern wint_t ungetwc (wint_t c, FILE *stream) /*@modifies fileSystem, *stream@*/ ; + +extern int vfwprintf (FILE *stream, const wchar_t *format, va_list arg) + /*@modifies fileSystem, *stream@*/ ; + +extern int vswprintf (wchar_t *s, size_t n, const wchar_t *format, va_list arg) + /*@modifies *s@*/ ; + +extern int vwprintf (const wchar_t *format, va_list arg) + /*@modifies fileSystem, *stdout@*/ ; + +extern size_t wcrtomb (/*@null@*/ /*@out@*/ char *s, wchar_t wc, /*@null@*/ mbstate_t *ps) + /*@modifies *s@*/; + +extern void /*@alt wchar_t *@*/ + wcscat (/*@unique@*/ /*@returned@*/ /*@out@*/ wchar_t *s1, const wchar_t *s2) + /*@modifies *s1@*/ ; + +extern /*@exposed@*/ /*@null@*/ wchar_t * + wcschr (/*@returned@*/ const wchar_t *s, wchar_t c) + /*@*/ ; + +extern int wcscmp (const wchar_t *s1, const wchar_t *s2) /*@*/ ; + +extern int wcscoll (const wchar_t *s1, const wchar_t *s2) /*@*/ ; + +extern void /*@alt wchar_t *@*/ + wcscpy (/*@unique@*/ /*@out@*/ /*@returned@*/ wchar_t *s1, const wchar_t *s2) + /*@modifies *s1@*/ ; + +extern size_t wcscspn (const wchar_t *s1, const wchar_t *s2) /*@*/ ; + +extern size_t wcsftime (/*@out@*/ wchar_t *s, size_t maxsize, const wchar_t *format, + const struct tm *timeptr) + /*@modifies *s@*/ ; + +extern size_t wcslen (const wchar_t *s) /*@*/ ; + +extern void /*@alt wchar_t *@*/ + wcsncat (/*@unique@*/ /*@returned@*/ /*@out@*/ wchar_t *s1, const wchar_t *s2, + size_t n) + /*@modifies *s1@*/ ; + +extern int wcsncmp (const wchar_t *s1, const wchar_t *s2, size_t n) /*@*/ ; + +extern void /*@alt wchar_t *@*/ + wcsncpy (/*@unique@*/ /*@returned@*/ /*@out@*/ wchar_t *s1, const wchar_t *s2, + size_t n) + /*@modifies *s1@*/ ; + +extern /*@null@*/ wchar_t * + wcspbrk (/*@returned@*/ const wchar_t *s1, const wchar_t *s2) + /*@*/ ; + +extern /*@null@*/ wchar_t * + wcsrchr (/*@returned@*/ const wchar_t *s, wchar_t c) + /*@*/ ; + +extern size_t + wcsrtombs (/*@null@*/ char *dst, const wchar_t **src, size_t len, + /*@null@*/ mbstate_t *ps) + /*@modifies *src@*/ ; + +extern size_t wcsspn (const wchar_t *s1, const wchar_t *s2) /*@*/ ; + +extern /*@null@*/ wchar_t *wcsstr (const wchar_t *s1, const wchar_t *s2) /*@*/ ; + +extern double wcstod (const wchar_t *nptr, /*@null@*/ wchar_t **endptr) + /*@modifies *endptr@*/ ; + +extern /*@null@*/ wchar_t * + wcstok (/*@null@*/ wchar_t *s1, const wchar_t *s2, wchar_t **ptr) + /*@modifies *ptr@*/; + +extern long wcstol (const wchar_t *nptr, /*@null@*/ wchar_t **endptr, int base) + /*@modifies *endptr@*/; + +extern unsigned long + wcstoul (const wchar_t *nptr, /*@null@*/ wchar_t **endptr, int base) + /*@modifies *endptr@*/; + +extern size_t + wcsxfrm (/*@null@*/ wchar_t *s1, const wchar_t *s2, size_t n) + /*@modifies *s1@*/; + +extern int wctob (wint_t c) /*@*/; + +extern /*@null@*/ wchar_t *wmemchr (const wchar_t *s, wchar_t c, size_t n) /*@*/ ; + +extern int wmemcmp (const wchar_t *s1, const wchar_t *s2, size_t n) /*@*/ ; + +extern wchar_t *wmemcpy (/*@returned@*/ wchar_t *s1, const wchar_t *s2, size_t n) + /*@modifies *s1@*/; + +extern wchar_t *wmemmove (/*@returned@*/ wchar_t *s1, const wchar_t *s2, size_t n) + /*@modifies *s1@*/; + +extern wchar_t *wmemset (/*@returned@*/ wchar_t *s, wchar_t c, size_t n) + /*@modifies *s@*/; + +/*@printflike@*/ extern int wprintf (const wchar_t *format, ...) + /*@globals stdout@*/ /*@modifies errno, *stdout@*/; + +/*@scanflike@*/ extern int + wscanf (const wchar_t *format, ...) + /*@globals stdin@*/ /*@modifies errno, *stdin@*/; + +/* +** wctype.h (added by Amendment 1) +*/ + +/* Warning: not sure about these (maybe abstract?): */ +typedef /*@integraltype@*/ wctype_t; +typedef /*@integraltype@*/ wctrans_t; + +# ifdef STRICT +extern lltX_bool iswalnum (wint_t c) /*@*/ ; +extern lltX_bool iswalpha (wint_t c) /*@*/ ; +extern lltX_bool iswcntrl (wint_t c) /*@*/ ; +extern lltX_bool iswctype (wint_t c, wctype_t ctg) /*@*/ ; +extern lltX_bool iswdigit (wint_t c) /*@*/ ; +extern lltX_bool iswgraph (wint_t c) /*@*/ ; +extern lltX_bool iswlower (wint_t c) /*@*/ ; +extern lltX_bool iswprint (wint_t c) /*@*/ ; +extern lltX_bool iswpunct (wint_t c) /*@*/ ; +extern lltX_bool iswspace (wint_t c) /*@*/ ; +extern lltX_bool iswupper (wint_t c) /*@*/ ; +extern lltX_bool iswxdigit (wint_t c) /*@*/ ; + +extern wint_t towctrans (wint_t c, wctrans_t ctg) /*@*/ ; +extern wint_t towlower (wint_t c) /*@*/ ; +extern wint_t towupper (wint_t c) /*@*/ ; +# else +extern lltX_bool /*@alt int@*/ iswalnum (wint_t c) /*@*/ ; +extern lltX_bool /*@alt int@*/ iswalpha (wint_t c) /*@*/ ; +extern lltX_bool /*@alt int@*/ iswcntrl (wint_t c) /*@*/ ; +extern lltX_bool /*@alt int@*/ iswctype (wint_t c, wctype_t ctg) /*@*/ ; +extern lltX_bool /*@alt int@*/ iswdigit (wint_t c) /*@*/ ; +extern lltX_bool /*@alt int@*/ iswgraph (wint_t c) /*@*/ ; +extern lltX_bool /*@alt int@*/ iswlower (wint_t c) /*@*/ ; +extern lltX_bool /*@alt int@*/ iswprint (wint_t c) /*@*/ ; +extern lltX_bool /*@alt int@*/ iswpunct (wint_t c) /*@*/ ; +extern lltX_bool /*@alt int@*/ iswspace (wint_t c) /*@*/ ; +extern lltX_bool /*@alt int@*/ iswupper (wint_t c) /*@*/ ; +extern lltX_bool /*@alt int@*/ iswxdigit (wint_t c) /*@*/ ; + +extern wint_t /*@alt int@*/ towctrans (wint_t c, wctrans_t ctg) /*@*/ ; +extern wint_t /*@alt int@*/ towlower (wint_t c) /*@*/ ; +extern wint_t /*@alt int@*/ towupper (wint_t c) /*@*/ ; +# endif + +extern wctrans_t wctrans (const char *property) /*@*/ ; +extern wctype_t wctype (const char *property) /*@*/ ; + +extern int mblen (char *s, size_t n) /*@*/ ; +extern int mbtowc (/*@null@*/ wchar_t *pwc, /*@null@*/ char *s, size_t n) + /*@modifies *pwc@*/ ; +extern int wctomb (/*@out@*/ /*@null@*/ char *s, wchar_t wchar) + /*@modifies *s@*/ ; +extern size_t mbstowcs (/*@out@*/ wchar_t *pwcs, char *s, size_t n) + /*@modifies *pwcs@*/ ; +extern size_t wcstombs (/*@out@*/ char *s, wchar_t *pwcs, size_t n) + /*@modifies *s@*/ ; + +/* +** string.h +*/ + +extern void /*@alt void * @*/ + memcpy (/*@unique@*/ /*@returned@*/ /*@out@*/ void *s1, void *s2, size_t n) + /*@modifies *s1@*/ ; + +extern void /*@alt void * @*/ + memmove (/*@returned@*/ /*@out@*/ void *s1, void *s2, size_t n) + /*@modifies *s1@*/ ; + +extern void /*@alt char * @*/ + strcpy (/*@unique@*/ /*@out@*/ /*@returned@*/ char *s1, char *s2) + /*@modifies *s1@*/ ; + +extern void /*@alt char * @*/ + strncpy (/*@unique@*/ /*@out@*/ /*@returned@*/ char *s1, char *s2, size_t n) + /*@modifies *s1@*/ ; + +extern void /*@alt char * @*/ + strcat (/*@unique@*/ /*@returned@*/ /*@out@*/ char *s1, char *s2) + /*@modifies *s1@*/ ; + +extern void /*@alt char * @*/ + strncat (/*@unique@*/ /*@returned@*/ /*@out@*/ char *s1, char *s2, int n) + /*@modifies *s1@*/ ; + +extern int memcmp (void *s1, void *s2, size_t n) /*@*/ ; +extern int strcmp (char *s1, char *s2) /*@*/ ; +extern int strcoll (char *s1, char *s2) /*@*/ ; +extern int strncmp (char *s1, char *s2, size_t n) /*@*/ ; +extern size_t strxfrm (/*@out@*/ /*@null@*/ char *s1, char *s2, size_t n) + /*@modifies *s1@*/ ; /* s1 may be null only if n == 0 */ + +extern /*@null@*/ void *memchr (void *s, int c, size_t n) /*@*/ ; + +# ifdef STRICT +extern /*@exposed@*/ /*@null@*/ char * + strchr (/*@returned@*/ char *s, char c) /*@*/ ; +# else +extern /*@exposed@*/ /*@null@*/ char * + strchr (/*@returned@*/ char *s, int /*@alt char@*/ c) /*@*/ ; +# endif + +extern size_t strcspn (char *s1, char *s2) /*@*/ ; +extern /*@null@*/ /*@exposed@*/ char * + strpbrk (/*@returned@*/ char *s, char *t) /*@*/ ; + +# ifdef STRICT +extern /*@null@*/ /*@exposed@*/ char * + strrchr (/*@returned@*/ char *s, char c) /*@*/ ; +# else +extern /*@null@*/ /*@exposed@*/ char * + strrchr (/*@returned@*/ char *s, int /*@alt char@*/ c) /*@*/ ; +# endif + +extern size_t strspn (char *s, char *t) /*@*/ ; +extern /*@null@*/ /*@exposed@*/ char * + strstr (/*@returned@*/ /*@unique@*/ char *s, char *t) /*@*/ ; +extern /*@null@*/ /*@exposed@*/ char * + strtok (/*@returned@*/ /*@null@*/ char *s, char *t) + /*@modifies *s, internalState, errno@*/ ; + +extern void /*@alt void *@*/ memset (/*@out@*/ /*@returned@*/ void *s, + int c, size_t n) + /*@modifies *s@*/ ; + +extern /*@observer@*/ char *strerror (int errnum) /*@*/ ; + +extern size_t strlen (char *s) /*@*/ ; + +/* +** time.h +*/ + +/*@constant int CLOCKS_PER_SEC;@*/ + +typedef /*@integraltype@*/ clock_t; +typedef /*@integraltype@*/ time_t; + +struct tm + { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + } ; + +extern clock_t clock (void) /*@modifies internalState@*/ ; +extern double difftime (time_t time1, time_t time0) /*@*/ ; +extern time_t mktime (struct tm *timeptr) /*@*/ ; + +extern time_t time (/*@null@*/ /*@out@*/ time_t *tp) + /*@modifies *tp@*/ ; + +extern /*@observer@*/ char *asctime (struct tm *timeptr) + /*@modifies errno*/ ; + +extern /*@observer@*/ char *ctime (time_t *tp) /*@*/ ; + +extern /*@null@*/ /*@observer@*/ struct tm *gmtime (time_t *tp) /*@*/ ; + +extern /*@null@*/ /*@observer@*/ struct tm *localtime (time_t *tp) + /*@modifies errno@*/ ; + +extern size_t strftime (/*@out@*/ char *s, size_t smax, + char *fmt, struct tm *timeptr) + /*@modifies *s@*/ ; diff --git a/lib/ansi.lcd b/lib/ansi.lcd new file mode 100644 index 0000000..cd5a3c6 --- /dev/null +++ b/lib/ansi.lcd @@ -0,0 +1,890 @@ +;;LCLint Dump: ansi.lcd +;;LCLint 2.5m --- 20 May 2000 +;;lib:166 +;;ctTable +0 u-2 19 38 +0 p1|-2 20 39 +0 b-2 21 40 +0 p3|-2 22 41 +0 p4|-2 23 42 +0 p5|-2 24 43 +0 p6|-2 25 44 +0 p7|-2 26 45 +0 p8|-2 27 46 +0 p9|-2 28 47 +0 p10|-2 29 48 +0 p11|-2 30 49 +0 p12|-2 31 50 +0 p13|-2 32 51 +0 p14|-2 33 52 +0 p15|-2 34 53 +0 p16|-2 35 54 +0 p17|-2 36 55 +0 p18|-2 37 56 +1 t0|0 314 -1 +1 t1|1& +1 t2|2& +1 t3|3& +1 t4|4 315 -1 +1 t5|5& +1 t6|6& +1 t7|7& +1 t8|8& +1 t9|9& +1 t10|10& +1 t11|11& +1 t12|12& +1 t13|13& +1 t14|14& +1 t15|15& +1 t16|16& +1 t17|17& +1 t18|18& +2 y0|0& +2 y1|1& +2 y2|2& +2 y3|3& +2 y4|4& +2 y5|5& +2 y6|6& +2 y7|7& +2 y8|8& +2 y9|9& +2 y10|10& +2 y11|11& +2 y12|12& +2 y13|13& +2 y14|14& +2 y15|15& +2 y16|16& +2 y17|17& +2 y18|18& +-2 ?! +0 s1|& +0 s2|& +0 s3|& +0 s4|& +0 s5|& +0 s13|& +0 s14|& +0 s6|-1 383 -1 +0 s7|& +0 a0|-1 401 -1 +3 C0.5/20|! +3 C0.68/2|! +3 C0.2/5|! +3 f0 (70|@7|$#,)! +3 f1 (70|@7|$#,)! +3 C0.4/5|! +3 C0.3/5|! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 C0.2/5|! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f87 (74|$#,)! +3 C0.4/5|! +3 C0.3/5|! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f87 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f87 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f87 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 C0.2/5|! +3 f104 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f104 (92|$#,)! +3 C0.4/5|! +3 C0.3/5|! +3 f0 (110|$#,)! +3 f2 (110|$#,)! +3 f104 (110|$#,)! +3 f0 (110|$#,)! +3 f4 (110|$#,)! +3 f109 (110|$#,)! +3 f0 (110|$#,)! +3 f4 (110|$#,)! +3 f109 (110|$#,)! +3 Slconv{23|@1|0@0@3&#decimal_point,23|@1|0@0@3&#thousands_sep,23|@1|0@0@3&#grouping,23|@1|0@0@3&#int_curr_symbol,23|@1|0@0@3&#currency_symbol,23|@1|0@0@3&#mon_decimal_point,23|@1|0@0@3&#mon_thousands_sep,23|@1|0@0@3&#mon_grouping,23|@1|0@0@3&#positive_sign,23|@1|0@0@3&#negative_sign,4|@1|^#int_frac_digits,4|@1|^#frac_digits,4|@1|^#p_cs_precedes,4|@1|^#p_sep_by_space,4|@1|^#n_cs_precedes,4|@1|^#n_sep_by_space,4|@1|^#p_sign_posn,4|@1|^#n_sign_posn,}! +0 s340|-1 127 -1 +3 f0 (5|$#,23|0@5@7&#,)! +3 f19 (5|$#,23|0@5@7&#,)! +3 f23 (5|$#,23|0@5@7&#,)! +3 f0 ()! +3 f19 ()! +1 t121|121& +3 f127 ()! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,5|$#,)! +3 f17 (17|$#,5|$#,)! +3 f0 (17|$#,24|4@0@7&#,)! +3 f17 (17|$#,24|4@0@7&#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,36|4@0@7&#,)! +3 f17 (17|$#,36|4@0@7&#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +0 a15|& +3 f0 (173|4@0@7&#,)! +3 f5 (173|4@0@7&#,)! +3 f0 (173|$#,5|$#,)! +3 f1 (173|$#,5|$#,)! +0 s8|& +3 ?! +3 f179 (5|$#,)! +3 f1 (5|$#,)^182 +1 t181|181& +3 ?! +3 f183 (5|$#,)! +3 f1 (5|$#,)^186 +1 t185|185& +3 ?! +3 f187 (5|$#,)! +3 f1 (5|$#,)^190 +1 t189|189& +3 ?! +3 f191 (5|$#,)! +3 f1 (5|$#,)^194 +1 t193|193& +3 f0 (5|$#,194|0@5@7&#,)! +3 f19 (5|$#,194|0@5@7&#,)^197 +1 t196|196& +3 ?! +3 f198 (5|$#,)! +3 f19 (5|$#,)! +3 f1 (5|$#,194|0@5@7&#,)! +3 f1 (5|$#,)! +3 f202 (5|$#,194|0@5@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +0 a16|& +3 f0 (206|4@0@7&#,!.,)! +3 f1 (206|4@0@7&#,!.,)! +3 f0 (206|$#,)! +3 f1 (206|$#,)! +0 a17|-1 213 -1 +0 a18|-1 289 -1 +1 t211|211& +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 ()! +3 f19 ()! +3 f213 ()! +3 f0 (23|@5|4@5@7&#,)! +3 f19 (23|@5|4@5@7&#,)! +3 f23 (23|@5|4@5@7&#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (213|0@5@7&#,)! +3 f5 (213|0@5@7&#,)! +3 f0 (23|$#,23|$#,)! +3 f19 (23|$#,23|$#,)! +3 f213 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,213|$#,)! +3 f19 (23|$#,23|$#,213|$#,)! +3 f213 (23|$#,23|$#,213|$#,)! +3 f0 (213|$#,23|0@5@19@2@0#,)! +3 f1 (213|$#,23|0@5@19@2@0#,)! +3 f0 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f5 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 C0.5/1|! +3 f0 (213|$#,23|$#,!.,)! +3 f5 (213|$#,23|$#,!.,)! +3 f238 (213|$#,23|$#,!.,)! +3 f0 (213|$#,23|$#,!.,)! +3 f5 (213|$#,23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f238 (23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f238 (23|4@0@7&#,23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f0 (213|$#,23|$#,206|$#,)! +3 f5 (213|$#,23|$#,206|$#,)! +3 f0 (23|$#,206|$#,)! +3 f5 (23|$#,206|$#,)! +3 f0 (23|4@0@7&#,23|$#,206|$#,)! +3 f5 (23|4@0@7&#,23|$#,206|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (23|@5|4@0@7&#,5|$#,213|$#,)! +3 f19 (23|@5|4@0@7&#,5|$#,213|$#,)! +3 f23 (23|@5|4@0@7&#,5|$#,213|$#,)! +3 C0.5/4|! +3 f0 (265|$#,213|$#,)! +3 f5 (265|$#,213|$#,)! +3 f0 (23|$#,213|$#,)! +3 f5 (23|$#,213|$#,)! +3 f0 (213|@7|$#,)! +3 f5 (213|@7|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (23|4@0@7&#,)! +3 f19 (23|4@0@7&#,)! +3 f23 (23|4@0@7&#,)! +3 f0 (265|$#,213|@7|$#,)! +3 f5 (265|$#,213|@7|$#,)! +3 f0 (265|$#,)! +3 f5 (265|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (265|$#,213|$#,)! +3 f5 (265|$#,213|$#,)! +3 f0 (20|4@0@7&#,63|$#,63|$#,213|$#,)! +3 f63 (20|4@0@7&#,63|$#,63|$#,213|$#,)! +3 f0 (20|$#,63|$#,63|$#,213|$#,)! +3 f63 (20|$#,63|$#,63|$#,213|$#,)! +1 t212|212& +3 f0 (213|$#,289|4@0@7&#,)! +3 f5 (213|$#,289|4@0@7&#,)! +3 f0 (213|$#,9|$#,5|$#,)! +3 f5 (213|$#,9|$#,5|$#,)! +3 f0 (213|$#,289|$#,)! +3 f5 (213|$#,289|$#,)! +3 f0 (213|$#,)! +3 f9 (213|$#,)! +3 f0 (213|$#,)! +3 f1 (213|$#,)! +3 f0 (213|$#,)! +3 f1 (213|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (23|0@5@7&#,)! +3 f1 (23|0@5@7&#,)! +3 f0 (23|$#,)! +3 f17 (23|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,)! +3 f9 (23|$#,)! +1 t19|19& +1 t23|23& +3 f0 (23|$#,315|4@5@7&#,)! +3 f17 (23|$#,315|4@5@7&#,)! +3 f0 (23|$#,315|4@5@7&#,5|$#,)! +3 f9 (23|$#,315|4@5@7&#,5|$#,)! +3 f0 (23|$#,315|4@5@7&#,5|$#,)! +3 f10 (23|$#,315|4@5@7&#,5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (6|$#,)! +3 f1 (6|$#,)! +3 f0 (63|$#,63|$#,)! +3 f19 (63|$#,63|$#,)! +3 f20 (63|$#,63|$#,)! +3 f0 (63|$#,)! +3 f19 (63|$#,)! +3 f20 (63|$#,)! +3 f0 (20|@5|4@5@2&#,63|$#,)! +3 f19 (20|@5|4@5@2&#,63|$#,)! +3 f20 (20|@5|4@5@2&#,63|$#,)! +3 f0 (20|4@5@2&#,)! +3 f1 (20|4@5@2&#,)! +3 f0 ()! +3 f1 ()! +3 f0 (5|$#,)! +3 f1 (5|$#,)! +3 ?! +3 f341 ()! +3 f1 ()^344 +1 t343|343& +3 f0 (344|$#,)! +3 f5 (344|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f23 (23|$#,)! +3 f0 (23|0@5@7&#,)! +3 f5 (23|0@5@7&#,)! +3 ?! +3 f352 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^355 +1 t354|354& +3 f0 (20|$#,20|$#,63|$#,63|$#,355|$#,)! +3 f19 (20|$#,20|$#,63|$#,63|$#,355|$#,)! +3 f20 (20|$#,20|$#,63|$#,63|$#,355|$#,)! +3 ?! +3 f359 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^362 +1 t361|361& +3 f0 (20|$#,63|$#,63|$#,362|$#,)! +3 f1 (20|$#,63|$#,63|$#,362|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 S!2{5|@1|^#quot,5|@1|^#rem,}! +0 s337|& +0 s19|& +3 f0 (5|$#,5|$#,)! +3 f369 (5|$#,5|$#,)! +3 f0 (9|$#,)! +3 f9 (9|$#,)! +3 S!3{9|@1|^#quot,9|@1|^#rem,}! +0 s338|& +0 s20|& +3 f0 (9|$#,9|$#,)! +3 f376 (9|$#,9|$#,)! +3 f0 (5|$#,)! +3 f66 (5|$#,)! +3 f0 (213|$#,)! +3 f66 (213|$#,)! +1 t65|65 465 -1 +3 f0 (383|@5|$#,5|$#,213|$#,)! +3 f19 (383|@5|$#,5|$#,213|$#,)! +3 f383 (383|@5|$#,5|$#,213|$#,)! +3 f0 (65|$#,213|$#,)! +3 f66 (65|$#,213|$#,)! +3 f0 (383|$#,213|$#,)! +3 f5 (383|$#,213|$#,)! +3 f0 (213|$#,5|$#,)! +3 f5 (213|$#,5|$#,)! +3 f0 (213|$#,383|$#,!.,)! +3 f5 (213|$#,383|$#,!.,)! +3 f0 (213|$#,383|$#,!.,)! +3 f5 (213|$#,383|$#,!.,)! +3 f0 (213|@7|$#,)! +3 f66 (213|@7|$#,)! +3 f0 ()! +3 f66 ()! +1 t67|67& +3 f0 (23|$#,63|$#,401|0@5@7&#,)! +3 f63 (23|$#,63|$#,401|0@5@7&#,)! +3 f0 (383|0@5@7&#,23|$#,63|$#,401|0@5@7&#,)! +3 f63 (383|0@5@7&#,23|$#,63|$#,401|0@5@7&#,)! +3 f0 (401|0@5@7&#,)! +3 f5 (401|0@5@7&#,)! +3 f0 (383|0@5@7&#,315|$#,63|$#,401|0@5@7&#,)! +3 f63 (383|0@5@7&#,315|$#,63|$#,401|0@5@7&#,)! +3 f0 (65|$#,213|@7|$#,)! +3 f66 (65|$#,213|@7|$#,)! +3 f0 (65|$#,)! +3 f66 (65|$#,)! +3 f0 (383|$#,63|$#,383|$#,!.,)! +3 f5 (383|$#,63|$#,383|$#,!.,)! +3 f0 (383|$#,383|$#,!.,)! +3 f5 (383|$#,383|$#,!.,)! +3 f0 (66|$#,213|$#,)! +3 f66 (66|$#,213|$#,)! +3 f0 (213|$#,383|$#,206|$#,)! +3 f5 (213|$#,383|$#,206|$#,)! +3 f0 (383|$#,63|$#,383|$#,206|$#,)! +3 f5 (383|$#,63|$#,383|$#,206|$#,)! +3 f0 (383|$#,206|$#,)! +3 f5 (383|$#,206|$#,)! +3 f0 (23|4@5@7&#,65|$#,401|0@5@7&#,)! +3 f63 (23|4@5@7&#,65|$#,401|0@5@7&#,)! +3 C0.1/383|! +3 f0 (383|@5|4@0@9&#,383|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,)! +3 f428 (383|@5|4@0@9&#,383|$#,)! +3 f0 (383|@5|$#,65|$#,)! +3 f19 (383|@5|$#,65|$#,)! +3 f383 (383|@5|$#,65|$#,)! +3 f0 (383|$#,383|$#,)! +3 f5 (383|$#,383|$#,)! +3 f0 (383|$#,383|$#,)! +3 f5 (383|$#,383|$#,)! +3 f0 (383|@5|4@0@9&#,383|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,)! +3 f428 (383|@5|4@0@9&#,383|$#,)! +3 f0 (383|$#,383|$#,)! +3 f63 (383|$#,383|$#,)! +0 s339|-1 445 -1 +1 t444|444& +3 f0 (383|4@0@7&#,63|$#,383|$#,445|$#,)! +3 f63 (383|4@0@7&#,63|$#,383|$#,445|$#,)! +3 f0 (383|$#,)! +3 f63 (383|$#,)! +3 C0.1/383|! +3 f0 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f450 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f0 (383|$#,383|$#,63|$#,)! +3 f5 (383|$#,383|$#,63|$#,)! +3 f0 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f450 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f0 (383|@5|$#,383|$#,)! +3 f19 (383|@5|$#,383|$#,)! +3 f383 (383|@5|$#,383|$#,)! +3 f0 (383|@5|$#,65|$#,)! +3 f19 (383|@5|$#,65|$#,)! +3 f383 (383|@5|$#,65|$#,)! +1 t383|383& +3 f0 (23|0@5@7&#,465|$#,63|$#,401|0@5@7&#,)! +3 f63 (23|0@5@7&#,465|$#,63|$#,401|0@5@7&#,)! +3 f0 (383|$#,383|$#,)! +3 f63 (383|$#,383|$#,)! +3 f0 (383|$#,383|$#,)! +3 f19 (383|$#,383|$#,)! +3 f383 (383|$#,383|$#,)! +3 f0 (383|$#,465|0@5@7&#,)! +3 f17 (383|$#,465|0@5@7&#,)! +3 f0 (383|0@5@7&#,383|$#,465|$#,)! +3 f19 (383|0@5@7&#,383|$#,465|$#,)! +3 f383 (383|0@5@7&#,383|$#,465|$#,)! +3 f0 (383|$#,465|0@5@7&#,5|$#,)! +3 f9 (383|$#,465|0@5@7&#,5|$#,)! +3 f0 (383|$#,465|0@5@7&#,5|$#,)! +3 f10 (383|$#,465|0@5@7&#,5|$#,)! +3 f0 (383|0@5@7&#,383|$#,63|$#,)! +3 f63 (383|0@5@7&#,383|$#,63|$#,)! +3 f0 (66|$#,)! +3 f5 (66|$#,)! +3 f0 (383|$#,65|$#,63|$#,)! +3 f19 (383|$#,65|$#,63|$#,)! +3 f383 (383|$#,65|$#,63|$#,)! +3 f0 (383|$#,383|$#,63|$#,)! +3 f5 (383|$#,383|$#,63|$#,)! +3 f0 (383|@5|$#,383|$#,63|$#,)! +3 f19 (383|@5|$#,383|$#,63|$#,)! +3 f383 (383|@5|$#,383|$#,63|$#,)! +3 f0 (383|@5|$#,383|$#,63|$#,)! +3 f19 (383|@5|$#,383|$#,63|$#,)! +3 f383 (383|@5|$#,383|$#,63|$#,)! +3 f0 (383|@5|$#,65|$#,63|$#,)! +3 f19 (383|@5|$#,65|$#,63|$#,)! +3 f383 (383|@5|$#,65|$#,63|$#,)! +3 f0 (383|$#,!.,)! +3 f5 (383|$#,!.,)! +3 f0 (383|$#,!.,)! +3 f5 (383|$#,!.,)! +0 s9|& +0 s10|& +3 C0.2/5|! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,504|$#,)! +3 f2 (66|$#,504|$#,)! +3 f506 (66|$#,504|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 C0.2/5|! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 C0.2/5|! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f541 (66|$#,)! +3 C0.66/5|! +3 f0 (66|$#,505|$#,)! +3 f66 (66|$#,505|$#,)! +3 f545 (66|$#,505|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f545 (66|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f545 (66|$#,)! +3 f0 (23|$#,)! +3 f505 (23|$#,)! +3 f0 (23|$#,)! +3 f504 (23|$#,)! +3 f0 (23|$#,63|$#,)! +3 f5 (23|$#,63|$#,)! +3 f0 (383|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f5 (383|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f0 (23|4@5@7&#,65|$#,)! +3 f5 (23|4@5@7&#,65|$#,)! +3 f0 (383|4@0@7&#,23|$#,63|$#,)! +3 f63 (383|4@0@7&#,23|$#,63|$#,)! +3 f0 (23|4@0@7&#,383|$#,63|$#,)! +3 f63 (23|4@0@7&#,383|$#,63|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f569 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f0 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f569 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 C0.1/23|! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f0 (20|$#,20|$#,63|$#,)! +3 f5 (20|$#,20|$#,63|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,63|$#,)! +3 f5 (23|$#,23|$#,63|$#,)! +3 f0 (23|4@5@7&#,23|$#,63|$#,)! +3 f63 (23|4@5@7&#,23|$#,63|$#,)! +3 f0 (20|$#,5|$#,63|$#,)! +3 f19 (20|$#,5|$#,63|$#,)! +3 f20 (20|$#,5|$#,63|$#,)! +3 f0 (23|@5|$#,265|$#,)! +3 f19 (23|@5|$#,265|$#,)! +3 f23 (23|@5|$#,265|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|$#,23|$#,)! +3 f19 (23|@5|$#,23|$#,)! +3 f23 (23|@5|$#,23|$#,)! +3 f0 (23|@5|$#,265|$#,)! +3 f19 (23|@5|$#,265|$#,)! +3 f23 (23|@5|$#,265|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|0@0@9&#,23|$#,)! +3 f19 (23|@5|0@0@9&#,23|$#,)! +3 f23 (23|@5|0@0@9&#,23|$#,)! +3 f0 (23|@5|0@5@7&#,23|$#,)! +3 f19 (23|@5|0@5@7&#,23|$#,)! +3 f23 (23|@5|0@5@7&#,23|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f621 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f0 (5|$#,)! +3 f19 (5|$#,)! +3 f23 (5|$#,)! +3 f0 (23|$#,)! +3 f63 (23|$#,)! +0 s11|& +0 s12|-1 639 -1 +3 Stm{5|@1|^#tm_sec,5|@1|^#tm_min,5|@1|^#tm_hour,5|@1|^#tm_mday,5|@1|^#tm_mon,5|@1|^#tm_year,5|@1|^#tm_wday,5|@1|^#tm_yday,5|@1|^#tm_isdst,}! +3 f0 ()! +3 f630 ()! +3 f0 (631|$#,631|$#,)! +3 f17 (631|$#,631|$#,)! +3 f0 (445|$#,)! +3 f631 (445|$#,)! +1 t631|631& +3 f0 (639|4@5@7&#,)! +3 f631 (639|4@5@7&#,)! +3 f0 (445|$#,)! +3 f19 (445|$#,)! +3 f23 (445|$#,)! +3 f0 (639|$#,)! +3 f19 (639|$#,)! +3 f23 (639|$#,)! +3 f0 (639|$#,)! +3 f19 (639|$#,)! +3 f445 (639|$#,)! +3 f0 (639|$#,)! +3 f19 (639|$#,)! +3 f445 (639|$#,)! +3 f0 (23|4@0@7&#,63|$#,23|$#,445|$#,)! +3 f63 (23|4@0@7&#,63|$#,23|$#,445|$#,)! +;;tistable +0 +0,15 +15 +0,15,16 +16 +0,15,16,17 +17 +0,15,16,17,18 +18 +;;symTable +*0 (Datatype) +0@+@=@0@0@0@0@67#mbstate_t +2@-@-@0@0@0@0@2#lltX_bool +13@-@-@0@0@0@0@59#__SIZE_TYPE__ +13@-@-@0@0@0@0@60#__PTRDIFF_TYPE__ +13@-@-@0@0@0@0@61#__WCHAR_TYPE__ +13@-@-@0@0@0@0@62#ptrdiff_t +13@-@-@0@0@0@0@65#wchar_t +13@-@-@0@0@0@0@66#wint_t +13@-@-@0@0@0@0@178#sig_atomic_t +13@-@-@0@0@0@0@504#wctype_t +13@-@-@0@0@0@0@505#wctrans_t +13@-@-@0@0@0@0@630#clock_t +13@-@-@0@0@0@0@631#time_t +14@-@-@0@0@0@0@63#size_t +15@-@-@0@0@0@0@64#ssize_t +20@+@+@0@0@0@0@173#jmp_buf +20@+@+@0@0@0@0@206#va_list +20@+@+@0@0@0@0@211#FILE +20@+@+@0@0@0@0@212#fpos_t +367@-@-@0@0@0@0@369#div_t +374@-@-@0@0@0@0@376#ldiv_t +*1 (Constant) +0@i0@0@6#NULL +2@i1@0@0#TRUE +2@i0@0@6#FALSE +3$#UCHAR_MAX#UCHAR_MIN +4$#CHAR_MAX#CHAR_MIN#SCHAR_MAX#SCHAR_MIN +5$#BUFSIZ#CHAR_BIT#CLOCKS_PER_SEC#EDOM#EILSEQ#EOF#ERANGE#EXIT_FAILURE#EXIT_SUCCESS#FILENAME_MAX#FLT_RADIX#FOPEN_MAX#INT_MAX#INT_MIN#LC_ALL#LC_COLLATE#LC_CTYPE#LC_MONETARY#LC_NUMERIC#LC_TIME#L_tmpnam#RAND_MAX#SEEK_CUR#SEEK_END#SEEK_SET#SIGABRT#SIGFPE#SIGILL#SIGINT#SIGSEGV#SIGTERM#TMP_MAX#WCHAR_MAX#WCHAR_MIN#_IOFBF#_IOLBF#_IONBF#__INCLUDE_LEVEL__#__LCLINT__#__LINE__ +6$#UINT_MAX +7$#SHRT_MAX#SHRT_MIN +8$#USHRT_MAX +9$#LONG_MAX#LONG_MIN#MB_LEN_MAX +10$#ULONG_MAX +17$#HUGE_VAL +23$#__BASE_FILE__#__DATE__#__FILE__#__REGISTER_PREFIX__#__TIME__#__USER_LABEL_PREFIX__#__VERSION__ +2$#NDEBUG +63$#MB_CUR_MAX +66$#WEOF +182$#SIG_DFL +186$#SIG_ERR +190$#SIG_IGN +*3 (Variable) +5|@1|0@0@0@0@1#DBL_DIG#DBL_MANT_DIG#DBL_MAX_10_EXP#DBL_MAX_EXP#DBL_MIN_10_EXP#DBL_MIN_EXP#FLT_DIG#FLT_MANT_DIG#FLT_MAX_10_EXP#FLT_MAX_EXP#FLT_MIN_10_EXP#FLT_MIN_EXP#FLT_ROUNDS#LDBL_DIG#LDBL_MANT_DIG#LDBL_MAX_10_EXP#LDBL_MAX_EXP#LDBL_MIN_10_EXP#LDBL_MIN_EXP#errno +16|@1|0@0@0@0@1#FLT_EPSILON#FLT_MAX#FLT_MIN +17|@1|0@0@0@0@1#DBL_EPSILON#DBL_MAX#DBL_MIN +18|@1|0@0@0@0@1#LDBL_EPSILON#LDBL_MAX#LDBL_MIN +213|@1|0@0@0@0@1#stderr#stdin#stdout +*4 (Function) +364$@0@g111@0@0@1@tp0,g111$@0#qsort +177@6@0@5@0@0@1@@1@s0$@0#longjmp +208$@0@@1@p0$@0#va_start +235$@0@s3@1@s3,tp0,tp1$@0#setbuf +340@6@0@6@0@0@1@@1@s0$@0#exit +325$@0@s1@1@s1$@0#srand +336$@0@@1@tp0$@0#free +307$@1@g111@0@0,g121@0@0,s3@1@s3,tg121$@0#perror +210$@0@@1@p0$@0#va_end +301$@0@@1@tp0$@0#clearerr#rewind +72@6@0@8@0@0@1@@1@s0$@0#assert +338@6@0@6@0@0@1@@1@s0$@0#abort +237$@0@s3@1@s3,tp0,tp1$@0#setvbuf +423$@0@@1@tp0$@0#vswprintf +415@6@0@1@1@0@0@@1@tp0$@0#swprintf +590$@1@@1@s0$@0#memcmp +596$@1@@1@s0$@0#strncmp +253@6@0@1@2@0@1@@1@s0$@0#sscanf +259$@0@@1@tp0,p2$@0#vsprintf +293$@0@s3,g111@0@0@1@s3,tp0,g111$@0#fseek +255$@0@s3,g111@0@0@1@s3,tp0,p2,g111$@0#vfprintf +243@6@0@1@2@0@0@s3@1@s3,tp0$@0#fscanf +421$@0@s3@1@s3,tp0$@0#vfwprintf +394@6@0@1@1@0@0@s3@1@tp0,s3$@0#fwprintf +396@6@0@1@2@0@0@s3@1@tp0,s3$@0#fwscanf +455$@1@@1@s0$@0#wcsncmp#wmemcmp +417@6@0@1@2@0@0@g122@0@0@1@tg122$@0#swscanf +562$@0@@1@tp0$@0#mbtowc +592$@1@@1@s0$@0#strcmp#strcoll +217$@0@s3,g111@0@0@1@s3,g111$@0#rename +560$@1@@1@s0$@0#mblen +257$@1@g123@0@0,s3@1@s3,p1,tg123$@0#vprintf +269$@0@s3@1@s3,tp1$@0#fputs +248@6@0@1@2@0@1@g122@0@0,s3@1@s3,tg122$@0#scanf +564$@0@@1@tp0$@0#wctomb +392$@1@@1@s0$@0#fwide +295$@0@s3,g111@0@0@1@s3,tp0,g111$@0#fsetpos +291$@0@g111@0@0@1@tp1,g111$@0#fgetpos +425$@0@s3,g123@0@0@1@s3,tg123$@0#vwprintf +390$@0@s3@1@s3,tp1$@0#fputws +436$@1@@1@s0$@0#wcscmp#wcscoll +501@6@0@1@1@0@1@g123@0@0,g111@0@0@1@g111,tg123$@0#wprintf +503@6@0@1@2@0@1@g122@0@0,g111@0@0@1@g111,tg122$@0#wscanf +267$@0@s3,g111@0@0@1@s3,tp1,g111$@0#fputc#ungetc +278$@0@s3@1@s3,tp1$@0#putc +366$@1@@1@s0$@0#abs +205@6@0@5@0@0$$@0#raise +282$@1@g123@0@0,s3@1@s3,tg123$@0#puts +215$@0@s3,g111@0@0@1@s3,g111$@0#remove +311$@1@@1@s0$@0#atoi +351$@0@s3@1@s3$@0#system +485$@1@@1@s0$@0#wctob +175$@0@@1@p0$@0#setjmp +225$@0@g111@0@0,s3@1@tp0,g111,s3$@0#fclose#fgetc +303$@0@g111@0@0@1@g111$@0#feof#ferror +271$@0@s3@1@s3,tp0$@0#getc +227$@0@g111@0@0,s3@1@tp0,g111,s3$@0#fflush +346$@0@s1@1@s1$@0#atexit +407$@1@@1@s0$@0#mbsinit +280$@1@g123@0@0,s3@1@s3,tg123$@0#putchar +273$@1@g122@0@0,s3@1@s3,tg122$@0#getchar +323$@0@s1@1@s1$@0#rand +319$@0@g111@0@0@1@tp1,g111$@0#strtol +479$@0@@1@tp1$@0#wcstol +373$@1@@1@s0$@0#labs +313$@1@@1@s0$@0#atol +297$@0@g111@0@0@1@g111$@0#ftell +321$@0@g111@0@0@1@tp1,g111$@0#strtoul +481$@0@@1@tp1$@0#wcstoul +152$@0@g111@0@0@1@g111$@0#ldexp +142$@1@@1@s0$@0#atan2#fmod +160$@0@g111@0@0@1@g111$@0#pow +154$@0@@1@tp1$@0#frexp +170$@0@@1@tp1$@0#modf +317$@0@g111@0@0@1@tp1,g111$@0#strtod +474$@0@@1@tp1$@0#wcstod +636$@1@@1@s0$@0#difftime +138$@0@g111@0@0@1@g111$@0#acos#asin#cosh#exp#log#log10#sqrt +140$@1@@1@s0$@0#atan#ceil#cos#fabs#floor#sin#sinh#tan#tanh +309$@1@@1@s0$@0#atof +358@6@5@1@0@0@1@@1@s0@18@0@0#bsearch +601@6@5@1@0@0@1@@1@s0@3@0@0#memchr +334@6@5@1@0@0@0@@1@tp0@2@0@0#realloc +328@6@5@1@0@0@1@@1@s0@2@0@0#calloc +331@4@5@1@0@0@1@@1@s0@2@0@0#malloc +264@6@5@1@0@0@0@s3,g111@0@0@1@s3,tp0,tp2,g111$@0#fgets +124@6@5@1@0@0@0@s1,g111@0@0@1@s1,g111@19@3@0#setlocale +609@6@5@1@0@0@1@@1@s0@19@2@0#strpbrk +604@6@5@1@0@0@1@@1@s0@19@2@0#strchr#strrchr +620@6@5@1@0@0@0@s1,g111@0@0@1@tp0,s1,g111@19@2@0#strtok +617@6@5@1@0@0@1@@1@s0@19@2@0#strstr +627$@1@@1@s0@19@3@0#strerror +349@6@5@1@0@0@1@@1@s0@19@3@0#getenv +276@6@5@1@0@0@1@g122@0@0,s3,g111@0@0@1@s3,tp0,tg122,g111@3@0@0#gets +223$@0@s1@1@tp0,s1@19@3@0#tmpnam +644$@0@g111@0@0@1@g111@19@3@0#asctime +647$@1@@1@s0@19@3@0#ctime +288$@0@s3,g111@0@0@1@s3,tp3,g111$@0#fwrite +286$@0@s3,g111@0@0@1@s3,tp0,tp3,g111$@0#fread +467$@0@@1@tp1$@0#wcsrtombs +655$@0@@1@tp0$@0#strftime +405$@0@@1@tp0$@0#mbrtowc +409$@0@@1@tp0$@0#mbsrtowcs +447$@0@@1@tp0$@0#wcsftime +403$@1@@1@s0$@0#mbrlen +568$@0@@1@tp0$@0#wcstombs +598$@0@@1@tp0$@0#strxfrm +427$@0@@1@tp0$@0#wcrtomb +483$@0@@1@tp0$@0#wcsxfrm +566$@0@@1@tp0$@0#mbstowcs +606$@1@@1@s0$@0#strcspn#strspn +443$@1@@1@s0$@0#wcscspn#wcsspn +629$@1@@1@s0$@0#strlen +449$@1@@1@s0$@0#wcslen +388$@0@s3@1@s3,tp1$@0#fputwc +411$@0@s3@1@s3,tp1$@0#putwc +419$@0@s3@1@s3,tp1$@0#ungetwc +380$@1@@1@s0$@0#btowc +413$@0@s3,g123@0@0@1@s3,tg123$@0#putwchar +382$@0@s3@1@s3,tp0$@0#fgetwc +398$@0@s3@1@s3,tp0$@0#getwc +400$@0@s3,g122@0@0@1@s3,tg122$@0#getwchar +128$@1@@1@s0@3@0@0#localeconv +233@6@5@1@0@0@0@s3,g111@0@0@1@tp2,s3,g111@3@0@0#freopen +230@6@5@1@0@0@0@s3@1@s3@18@0@0#fopen +220@6@5@1@0@0@0@s3@1@s3@3@0@0#tmpfile +371$@1@@1@s0$@0#div +378$@1@@1@s0$@0#ldiv +488@6@5@1@0@0@1@@1@s0@3@0@0#wmemchr +386@6@5@1@0@0@0@s3@1@s3,tp0,tp2$@0#fgetws +499$@0@@1@tp0$@0#wmemset +493$@0@@1@tp0$@0#wmemcpy#wmemmove +477@6@5@1@0@0@0@@1@tp2@3@0@0#wcstok +472@6@5@1@0@0@1@@1@s0@3@0@0#wcsstr +464@6@5@1@0@0@1@@1@s0$@0#wcsrchr +434@6@5@1@0@0@1@@1@s0@19@2@0#wcschr +461@6@5@1@0@0@1@@1@s0$@0#wcspbrk +653@6@5@1@0@0@0@g111@0@0@1@g111@19@3@0#localtime +650@6@5@1@0@0@1@@1@s0@19@3@0#gmtime +558$@1@@1@s0$@0#wctype +556$@1@@1@s0$@0#wctrans +634$@0@s1@1@s1$@0#clock +638$@1@@1@s0$@0#mktime +641$@0@@1@tp0$@0#time +203@6@5@1@0@0@0@s1,g111@0@0@1@s1,g111$@0#signal +624$@0@@1@tp0$@0#memset +575$@0@@1@tp0$@0#memmove +572$@0@@1@tp0$@0#memcpy +588$@0@@1@tp0$@0#strncat +582$@0@@1@tp0$@0#strncpy +585$@0@@1@tp0$@0#strcat#strcpy +453$@0@@1@tp0$@0#wcsncat#wcsncpy +431$@0@@1@tp0$@0#wcscat#wcscpy +518$@1@@1@s0$@0#iswctype +509$@1@@1@s0$@0#iswalnum#iswalpha#iswcntrl#iswdigit#iswgraph#iswlower#iswprint#iswpunct#iswspace#iswupper#iswxdigit +77$@1@@1@s0$@0#isalnum#isalpha#iscntrl#isdigit#isgraph#islower#isprint#ispunct#isspace#isupper#isxdigit +116$@1@@1@s0$@0#tolower#toupper +251@6@0@1@1@0@0@@1@tp0$@0#sprintf +241@6@0@1@1@0@0@s3@1@s3,tp0$@0#fprintf +246@6@0@1@1@0@1@g123@0@0,s3@1@s3,tg123$@0#printf +548$@1@@1@s0$@0#towctrans +551$@1@@1@s0$@0#towlower#towupper +*7 (Struct tag) +367@368#@!2 +374@375#@!3 +632@444#@tm +120@121#@lconv +;; Modules access +ansi#8@ +;;End diff --git a/lib/ansistrict.lcd b/lib/ansistrict.lcd new file mode 100644 index 0000000..d6e3170 --- /dev/null +++ b/lib/ansistrict.lcd @@ -0,0 +1,846 @@ +;;LCLint Dump: ansistrict.lcd +;;LCLint 2.5m --- 20 May 2000 +;;lib:166 +;;ctTable +0 u-2 19 38 +0 p1|-2 20 39 +0 b-2 21 40 +0 p3|-2 22 41 +0 p4|-2 23 42 +0 p5|-2 24 43 +0 p6|-2 25 44 +0 p7|-2 26 45 +0 p8|-2 27 46 +0 p9|-2 28 47 +0 p10|-2 29 48 +0 p11|-2 30 49 +0 p12|-2 31 50 +0 p13|-2 32 51 +0 p14|-2 33 52 +0 p15|-2 34 53 +0 p16|-2 35 54 +0 p17|-2 36 55 +0 p18|-2 37 56 +1 t0|0 288 -1 +1 t1|1& +1 t2|2& +1 t3|3& +1 t4|4 289 -1 +1 t5|5& +1 t6|6& +1 t7|7& +1 t8|8& +1 t9|9& +1 t10|10& +1 t11|11& +1 t12|12& +1 t13|13& +1 t14|14& +1 t15|15& +1 t16|16& +1 t17|17& +1 t18|18& +2 y0|0& +2 y1|1& +2 y2|2& +2 y3|3& +2 y4|4& +2 y5|5& +2 y6|6& +2 y7|7& +2 y8|8& +2 y9|9& +2 y10|10& +2 y11|11& +2 y12|12& +2 y13|13& +2 y14|14& +2 y15|15& +2 y16|16& +2 y17|17& +2 y18|18& +-2 ?! +0 s1|& +0 s2|& +0 s3|& +0 s4|& +0 s5|& +0 s13|& +0 s14|& +0 s6|-1 357 -1 +0 s7|& +0 a0|-1 375 -1 +3 C0.5/20|! +3 C0.68/2|! +3 f0 (2|@7|$#,)! +3 f1 (2|@7|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f4 (3|$#,)! +3 f0 (3|$#,)! +3 f4 (3|$#,)! +3 Slconv{23|@1|0@0@3&#decimal_point,23|@1|0@0@3&#thousands_sep,23|@1|0@0@3&#grouping,23|@1|0@0@3&#int_curr_symbol,23|@1|0@0@3&#currency_symbol,23|@1|0@0@3&#mon_decimal_point,23|@1|0@0@3&#mon_thousands_sep,23|@1|0@0@3&#mon_grouping,23|@1|0@0@3&#positive_sign,23|@1|0@0@3&#negative_sign,4|@1|^#int_frac_digits,4|@1|^#frac_digits,4|@1|^#p_cs_precedes,4|@1|^#p_sep_by_space,4|@1|^#n_cs_precedes,4|@1|^#n_sep_by_space,4|@1|^#p_sign_posn,4|@1|^#n_sign_posn,}! +0 s340|-1 105 -1 +3 f0 (5|$#,23|0@5@7&#,)! +3 f19 (5|$#,23|0@5@7&#,)! +3 f23 (5|$#,23|0@5@7&#,)! +3 f0 ()! +3 f19 ()! +1 t99|99& +3 f105 ()! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,5|$#,)! +3 f17 (17|$#,5|$#,)! +3 f0 (17|$#,24|4@0@7&#,)! +3 f17 (17|$#,24|4@0@7&#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,36|4@0@7&#,)! +3 f17 (17|$#,36|4@0@7&#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +0 a15|& +3 f0 (151|4@0@7&#,)! +3 f5 (151|4@0@7&#,)! +3 f0 (151|$#,5|$#,)! +3 f1 (151|$#,5|$#,)! +0 s8|& +3 ?! +3 f157 (5|$#,)! +3 f1 (5|$#,)^160 +1 t159|159& +3 ?! +3 f161 (5|$#,)! +3 f1 (5|$#,)^164 +1 t163|163& +3 ?! +3 f165 (5|$#,)! +3 f1 (5|$#,)^168 +1 t167|167& +3 ?! +3 f169 (5|$#,)! +3 f1 (5|$#,)^172 +1 t171|171& +3 f0 (5|$#,172|0@5@7&#,)! +3 f19 (5|$#,172|0@5@7&#,)^175 +1 t174|174& +3 ?! +3 f176 (5|$#,)! +3 f19 (5|$#,)! +3 f1 (5|$#,172|0@5@7&#,)! +3 f1 (5|$#,)! +3 f180 (5|$#,172|0@5@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +0 a16|& +3 f0 (184|4@0@7&#,!.,)! +3 f1 (184|4@0@7&#,!.,)! +3 f0 (184|$#,)! +3 f1 (184|$#,)! +0 a17|-1 191 -1 +0 a18|-1 263 -1 +1 t189|189& +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 ()! +3 f19 ()! +3 f191 ()! +3 f0 (23|@5|4@5@7&#,)! +3 f19 (23|@5|4@5@7&#,)! +3 f23 (23|@5|4@5@7&#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (191|0@5@7&#,)! +3 f5 (191|0@5@7&#,)! +3 f0 (23|$#,23|$#,)! +3 f19 (23|$#,23|$#,)! +3 f191 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,191|$#,)! +3 f19 (23|$#,23|$#,191|$#,)! +3 f191 (23|$#,23|$#,191|$#,)! +3 f0 (191|$#,23|0@5@19@2@0#,)! +3 f1 (191|$#,23|0@5@19@2@0#,)! +3 f0 (191|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f5 (191|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f0 (191|$#,23|$#,!.,)! +3 f5 (191|$#,23|$#,!.,)! +3 f0 (191|$#,23|$#,!.,)! +3 f5 (191|$#,23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f0 (191|$#,23|$#,184|$#,)! +3 f5 (191|$#,23|$#,184|$#,)! +3 f0 (23|$#,184|$#,)! +3 f5 (23|$#,184|$#,)! +3 f0 (23|4@0@7&#,23|$#,184|$#,)! +3 f5 (23|4@0@7&#,23|$#,184|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (23|@5|4@0@7&#,5|$#,191|$#,)! +3 f19 (23|@5|4@0@7&#,5|$#,191|$#,)! +3 f23 (23|@5|4@0@7&#,5|$#,191|$#,)! +3 C0.5/4|! +3 f0 (239|$#,191|$#,)! +3 f5 (239|$#,191|$#,)! +3 f0 (23|$#,191|$#,)! +3 f5 (23|$#,191|$#,)! +3 f0 (191|@7|$#,)! +3 f5 (191|@7|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (23|4@0@7&#,)! +3 f19 (23|4@0@7&#,)! +3 f23 (23|4@0@7&#,)! +3 f0 (239|$#,191|@7|$#,)! +3 f5 (239|$#,191|@7|$#,)! +3 f0 (239|$#,)! +3 f5 (239|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (239|$#,191|$#,)! +3 f5 (239|$#,191|$#,)! +3 f0 (20|4@0@7&#,63|$#,63|$#,191|$#,)! +3 f63 (20|4@0@7&#,63|$#,63|$#,191|$#,)! +3 f0 (20|$#,63|$#,63|$#,191|$#,)! +3 f63 (20|$#,63|$#,63|$#,191|$#,)! +1 t190|190& +3 f0 (191|$#,263|4@0@7&#,)! +3 f5 (191|$#,263|4@0@7&#,)! +3 f0 (191|$#,9|$#,5|$#,)! +3 f5 (191|$#,9|$#,5|$#,)! +3 f0 (191|$#,263|$#,)! +3 f5 (191|$#,263|$#,)! +3 f0 (191|$#,)! +3 f9 (191|$#,)! +3 f0 (191|$#,)! +3 f1 (191|$#,)! +3 f0 (191|$#,)! +3 f1 (191|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (23|0@5@7&#,)! +3 f1 (23|0@5@7&#,)! +3 f0 (23|$#,)! +3 f17 (23|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,)! +3 f9 (23|$#,)! +1 t19|19& +1 t23|23& +3 f0 (23|$#,289|4@5@7&#,)! +3 f17 (23|$#,289|4@5@7&#,)! +3 f0 (23|$#,289|4@5@7&#,5|$#,)! +3 f9 (23|$#,289|4@5@7&#,5|$#,)! +3 f0 (23|$#,289|4@5@7&#,5|$#,)! +3 f10 (23|$#,289|4@5@7&#,5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (6|$#,)! +3 f1 (6|$#,)! +3 f0 (63|$#,63|$#,)! +3 f19 (63|$#,63|$#,)! +3 f20 (63|$#,63|$#,)! +3 f0 (63|$#,)! +3 f19 (63|$#,)! +3 f20 (63|$#,)! +3 f0 (20|@5|4@5@2&#,63|$#,)! +3 f19 (20|@5|4@5@2&#,63|$#,)! +3 f20 (20|@5|4@5@2&#,63|$#,)! +3 f0 (20|4@5@2&#,)! +3 f1 (20|4@5@2&#,)! +3 f0 ()! +3 f1 ()! +3 f0 (5|$#,)! +3 f1 (5|$#,)! +3 ?! +3 f315 ()! +3 f1 ()^318 +1 t317|317& +3 f0 (318|$#,)! +3 f5 (318|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f23 (23|$#,)! +3 f0 (23|0@5@7&#,)! +3 f5 (23|0@5@7&#,)! +3 ?! +3 f326 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^329 +1 t328|328& +3 f0 (20|$#,20|$#,63|$#,63|$#,329|$#,)! +3 f19 (20|$#,20|$#,63|$#,63|$#,329|$#,)! +3 f20 (20|$#,20|$#,63|$#,63|$#,329|$#,)! +3 ?! +3 f333 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^336 +1 t335|335& +3 f0 (20|$#,63|$#,63|$#,336|$#,)! +3 f1 (20|$#,63|$#,63|$#,336|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 S!2{5|@1|^#quot,5|@1|^#rem,}! +0 s337|& +0 s19|& +3 f0 (5|$#,5|$#,)! +3 f343 (5|$#,5|$#,)! +3 f0 (9|$#,)! +3 f9 (9|$#,)! +3 S!3{9|@1|^#quot,9|@1|^#rem,}! +0 s338|& +0 s20|& +3 f0 (9|$#,9|$#,)! +3 f350 (9|$#,9|$#,)! +3 f0 (5|$#,)! +3 f66 (5|$#,)! +3 f0 (191|$#,)! +3 f66 (191|$#,)! +1 t65|65 439 -1 +3 f0 (357|@5|$#,5|$#,191|$#,)! +3 f19 (357|@5|$#,5|$#,191|$#,)! +3 f357 (357|@5|$#,5|$#,191|$#,)! +3 f0 (65|$#,191|$#,)! +3 f66 (65|$#,191|$#,)! +3 f0 (357|$#,191|$#,)! +3 f5 (357|$#,191|$#,)! +3 f0 (191|$#,5|$#,)! +3 f5 (191|$#,5|$#,)! +3 f0 (191|$#,357|$#,!.,)! +3 f5 (191|$#,357|$#,!.,)! +3 f0 (191|$#,357|$#,!.,)! +3 f5 (191|$#,357|$#,!.,)! +3 f0 (191|@7|$#,)! +3 f66 (191|@7|$#,)! +3 f0 ()! +3 f66 ()! +1 t67|67& +3 f0 (23|$#,63|$#,375|0@5@7&#,)! +3 f63 (23|$#,63|$#,375|0@5@7&#,)! +3 f0 (357|0@5@7&#,23|$#,63|$#,375|0@5@7&#,)! +3 f63 (357|0@5@7&#,23|$#,63|$#,375|0@5@7&#,)! +3 f0 (375|0@5@7&#,)! +3 f5 (375|0@5@7&#,)! +3 f0 (357|0@5@7&#,289|$#,63|$#,375|0@5@7&#,)! +3 f63 (357|0@5@7&#,289|$#,63|$#,375|0@5@7&#,)! +3 f0 (65|$#,191|@7|$#,)! +3 f66 (65|$#,191|@7|$#,)! +3 f0 (65|$#,)! +3 f66 (65|$#,)! +3 f0 (357|$#,63|$#,357|$#,!.,)! +3 f5 (357|$#,63|$#,357|$#,!.,)! +3 f0 (357|$#,357|$#,!.,)! +3 f5 (357|$#,357|$#,!.,)! +3 f0 (66|$#,191|$#,)! +3 f66 (66|$#,191|$#,)! +3 f0 (191|$#,357|$#,184|$#,)! +3 f5 (191|$#,357|$#,184|$#,)! +3 f0 (357|$#,63|$#,357|$#,184|$#,)! +3 f5 (357|$#,63|$#,357|$#,184|$#,)! +3 f0 (357|$#,184|$#,)! +3 f5 (357|$#,184|$#,)! +3 f0 (23|4@5@7&#,65|$#,375|0@5@7&#,)! +3 f63 (23|4@5@7&#,65|$#,375|0@5@7&#,)! +3 C0.1/357|! +3 f0 (357|@5|4@0@9&#,357|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,)! +3 f402 (357|@5|4@0@9&#,357|$#,)! +3 f0 (357|@5|$#,65|$#,)! +3 f19 (357|@5|$#,65|$#,)! +3 f357 (357|@5|$#,65|$#,)! +3 f0 (357|$#,357|$#,)! +3 f5 (357|$#,357|$#,)! +3 f0 (357|$#,357|$#,)! +3 f5 (357|$#,357|$#,)! +3 f0 (357|@5|4@0@9&#,357|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,)! +3 f402 (357|@5|4@0@9&#,357|$#,)! +3 f0 (357|$#,357|$#,)! +3 f63 (357|$#,357|$#,)! +0 s339|-1 419 -1 +1 t418|418& +3 f0 (357|4@0@7&#,63|$#,357|$#,419|$#,)! +3 f63 (357|4@0@7&#,63|$#,357|$#,419|$#,)! +3 f0 (357|$#,)! +3 f63 (357|$#,)! +3 C0.1/357|! +3 f0 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f424 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f0 (357|$#,357|$#,63|$#,)! +3 f5 (357|$#,357|$#,63|$#,)! +3 f0 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f424 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f0 (357|@5|$#,357|$#,)! +3 f19 (357|@5|$#,357|$#,)! +3 f357 (357|@5|$#,357|$#,)! +3 f0 (357|@5|$#,65|$#,)! +3 f19 (357|@5|$#,65|$#,)! +3 f357 (357|@5|$#,65|$#,)! +1 t357|357& +3 f0 (23|0@5@7&#,439|$#,63|$#,375|0@5@7&#,)! +3 f63 (23|0@5@7&#,439|$#,63|$#,375|0@5@7&#,)! +3 f0 (357|$#,357|$#,)! +3 f63 (357|$#,357|$#,)! +3 f0 (357|$#,357|$#,)! +3 f19 (357|$#,357|$#,)! +3 f357 (357|$#,357|$#,)! +3 f0 (357|$#,439|0@5@7&#,)! +3 f17 (357|$#,439|0@5@7&#,)! +3 f0 (357|0@5@7&#,357|$#,439|$#,)! +3 f19 (357|0@5@7&#,357|$#,439|$#,)! +3 f357 (357|0@5@7&#,357|$#,439|$#,)! +3 f0 (357|$#,439|0@5@7&#,5|$#,)! +3 f9 (357|$#,439|0@5@7&#,5|$#,)! +3 f0 (357|$#,439|0@5@7&#,5|$#,)! +3 f10 (357|$#,439|0@5@7&#,5|$#,)! +3 f0 (357|0@5@7&#,357|$#,63|$#,)! +3 f63 (357|0@5@7&#,357|$#,63|$#,)! +3 f0 (66|$#,)! +3 f5 (66|$#,)! +3 f0 (357|$#,65|$#,63|$#,)! +3 f19 (357|$#,65|$#,63|$#,)! +3 f357 (357|$#,65|$#,63|$#,)! +3 f0 (357|$#,357|$#,63|$#,)! +3 f5 (357|$#,357|$#,63|$#,)! +3 f0 (357|@5|$#,357|$#,63|$#,)! +3 f19 (357|@5|$#,357|$#,63|$#,)! +3 f357 (357|@5|$#,357|$#,63|$#,)! +3 f0 (357|@5|$#,357|$#,63|$#,)! +3 f19 (357|@5|$#,357|$#,63|$#,)! +3 f357 (357|@5|$#,357|$#,63|$#,)! +3 f0 (357|@5|$#,65|$#,63|$#,)! +3 f19 (357|@5|$#,65|$#,63|$#,)! +3 f357 (357|@5|$#,65|$#,63|$#,)! +3 f0 (357|$#,!.,)! +3 f5 (357|$#,!.,)! +3 f0 (357|$#,!.,)! +3 f5 (357|$#,!.,)! +0 s9|& +0 s10|& +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,478|$#,)! +3 f2 (66|$#,478|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,479|$#,)! +3 f66 (66|$#,479|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f0 (23|$#,)! +3 f479 (23|$#,)! +3 f0 (23|$#,)! +3 f478 (23|$#,)! +3 f0 (23|$#,63|$#,)! +3 f5 (23|$#,63|$#,)! +3 f0 (357|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f5 (357|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f0 (23|4@5@7&#,65|$#,)! +3 f5 (23|4@5@7&#,65|$#,)! +3 f0 (357|4@0@7&#,23|$#,63|$#,)! +3 f63 (357|4@0@7&#,23|$#,63|$#,)! +3 f0 (23|4@0@7&#,357|$#,63|$#,)! +3 f63 (23|4@0@7&#,357|$#,63|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f524 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f0 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f524 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 C0.1/23|! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f0 (20|$#,20|$#,63|$#,)! +3 f5 (20|$#,20|$#,63|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,63|$#,)! +3 f5 (23|$#,23|$#,63|$#,)! +3 f0 (23|4@5@7&#,23|$#,63|$#,)! +3 f63 (23|4@5@7&#,23|$#,63|$#,)! +3 f0 (20|$#,5|$#,63|$#,)! +3 f19 (20|$#,5|$#,63|$#,)! +3 f20 (20|$#,5|$#,63|$#,)! +3 f0 (23|@5|$#,4|$#,)! +3 f19 (23|@5|$#,4|$#,)! +3 f23 (23|@5|$#,4|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|$#,23|$#,)! +3 f19 (23|@5|$#,23|$#,)! +3 f23 (23|@5|$#,23|$#,)! +3 f0 (23|@5|$#,4|$#,)! +3 f19 (23|@5|$#,4|$#,)! +3 f23 (23|@5|$#,4|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|0@0@9&#,23|$#,)! +3 f19 (23|@5|0@0@9&#,23|$#,)! +3 f23 (23|@5|0@0@9&#,23|$#,)! +3 f0 (23|@5|0@5@7&#,23|$#,)! +3 f19 (23|@5|0@5@7&#,23|$#,)! +3 f23 (23|@5|0@5@7&#,23|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f576 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f0 (5|$#,)! +3 f19 (5|$#,)! +3 f23 (5|$#,)! +3 f0 (23|$#,)! +3 f63 (23|$#,)! +0 s11|& +0 s12|-1 594 -1 +3 Stm{5|@1|^#tm_sec,5|@1|^#tm_min,5|@1|^#tm_hour,5|@1|^#tm_mday,5|@1|^#tm_mon,5|@1|^#tm_year,5|@1|^#tm_wday,5|@1|^#tm_yday,5|@1|^#tm_isdst,}! +3 f0 ()! +3 f585 ()! +3 f0 (586|$#,586|$#,)! +3 f17 (586|$#,586|$#,)! +3 f0 (419|$#,)! +3 f586 (419|$#,)! +1 t586|586& +3 f0 (594|4@5@7&#,)! +3 f586 (594|4@5@7&#,)! +3 f0 (419|$#,)! +3 f19 (419|$#,)! +3 f23 (419|$#,)! +3 f0 (594|$#,)! +3 f19 (594|$#,)! +3 f23 (594|$#,)! +3 f0 (594|$#,)! +3 f19 (594|$#,)! +3 f419 (594|$#,)! +3 f0 (594|$#,)! +3 f19 (594|$#,)! +3 f419 (594|$#,)! +3 f0 (23|4@0@7&#,63|$#,23|$#,419|$#,)! +3 f63 (23|4@0@7&#,63|$#,23|$#,419|$#,)! +;;tistable +0 +0,15 +15 +0,15,16 +16 +0,15,16,17 +17 +0,15,16,17,18 +18 +;;symTable +*0 (Datatype) +0@+@=@0@0@0@0@67#mbstate_t +2@-@-@0@0@0@0@2#lltX_bool +13@-@-@0@0@0@0@59#__SIZE_TYPE__ +13@-@-@0@0@0@0@60#__PTRDIFF_TYPE__ +13@-@-@0@0@0@0@61#__WCHAR_TYPE__ +13@-@-@0@0@0@0@62#ptrdiff_t +13@-@-@0@0@0@0@65#wchar_t +13@-@-@0@0@0@0@66#wint_t +13@-@-@0@0@0@0@156#sig_atomic_t +13@-@-@0@0@0@0@478#wctype_t +13@-@-@0@0@0@0@479#wctrans_t +13@-@-@0@0@0@0@585#clock_t +13@-@-@0@0@0@0@586#time_t +14@-@-@0@0@0@0@63#size_t +15@-@-@0@0@0@0@64#ssize_t +20@+@+@0@0@0@0@151#jmp_buf +20@+@+@0@0@0@0@184#va_list +20@+@+@0@0@0@0@189#FILE +20@+@+@0@0@0@0@190#fpos_t +341@-@-@0@0@0@0@343#div_t +348@-@-@0@0@0@0@350#ldiv_t +*1 (Constant) +0@i0@0@6#NULL +2@i1@0@0#TRUE +2@i0@0@6#FALSE +3$#UCHAR_MAX#UCHAR_MIN +4$#CHAR_MAX#CHAR_MIN#SCHAR_MAX#SCHAR_MIN +5$#BUFSIZ#CHAR_BIT#CLOCKS_PER_SEC#EDOM#EILSEQ#EOF#ERANGE#EXIT_FAILURE#EXIT_SUCCESS#FILENAME_MAX#FLT_RADIX#FOPEN_MAX#INT_MAX#INT_MIN#LC_ALL#LC_COLLATE#LC_CTYPE#LC_MONETARY#LC_NUMERIC#LC_TIME#L_tmpnam#RAND_MAX#SEEK_CUR#SEEK_END#SEEK_SET#SIGABRT#SIGFPE#SIGILL#SIGINT#SIGSEGV#SIGTERM#TMP_MAX#WCHAR_MAX#WCHAR_MIN#_IOFBF#_IOLBF#_IONBF#__INCLUDE_LEVEL__#__LCLINT__#__LINE__ +6$#UINT_MAX +7$#SHRT_MAX#SHRT_MIN +8$#USHRT_MAX +9$#LONG_MAX#LONG_MIN#MB_LEN_MAX +10$#ULONG_MAX +17$#HUGE_VAL +23$#__BASE_FILE__#__DATE__#__FILE__#__REGISTER_PREFIX__#__TIME__#__USER_LABEL_PREFIX__#__VERSION__ +2$#NDEBUG +63$#MB_CUR_MAX +66$#WEOF +160$#SIG_DFL +164$#SIG_ERR +168$#SIG_IGN +*3 (Variable) +5|@1|0@0@0@0@1#DBL_DIG#DBL_MANT_DIG#DBL_MAX_10_EXP#DBL_MAX_EXP#DBL_MIN_10_EXP#DBL_MIN_EXP#FLT_DIG#FLT_MANT_DIG#FLT_MAX_10_EXP#FLT_MAX_EXP#FLT_MIN_10_EXP#FLT_MIN_EXP#FLT_ROUNDS#LDBL_DIG#LDBL_MANT_DIG#LDBL_MAX_10_EXP#LDBL_MAX_EXP#LDBL_MIN_10_EXP#LDBL_MIN_EXP +5|@1|0@0@0@0@4#errno +16|@1|0@0@0@0@1#FLT_EPSILON#FLT_MAX#FLT_MIN +17|@1|0@0@0@0@1#DBL_EPSILON#DBL_MAX#DBL_MIN +18|@1|0@0@0@0@1#LDBL_EPSILON#LDBL_MAX#LDBL_MIN +191|@1|0@0@0@0@2#stderr#stdin#stdout +*4 (Function) +338$@0@g111@0@0@1@tp0,g111$@0#qsort +155@6@0@5@0@0@1@@1@s0$@0#longjmp +186$@0@@1@p0$@0#va_start +213$@0@s3@1@s3,tp0,tp1$@0#setbuf +314@6@0@6@0@0@1@@1@s0$@0#exit +299$@0@s1@1@s1$@0#srand +310$@0@@1@tp0$@0#free +281$@1@g111@0@0,g121@0@0,s3@1@s3,tg121$@0#perror +71@6@0@8@0@0@1@@1@s0$@0#assert +188$@0@@1@p0$@0#va_end +275$@0@@1@tp0$@0#clearerr#rewind +312@6@0@6@0@0@1@@1@s0$@0#abort +95$@1@@1@s0$@0#tolower#toupper +215$@0@s3@1@s3,tp0,tp1$@0#setvbuf +397$@0@@1@tp0$@0#vswprintf +389@6@0@1@1@0@0@@1@tp0$@0#swprintf +545$@1@@1@s0$@0#memcmp +551$@1@@1@s0$@0#strncmp +227@6@0@1@2@0@1@@1@s0$@0#sscanf +233$@0@@1@tp0,p2$@0#vsprintf +225@6@0@1@1@0@0@@1@tp0$@0#sprintf +267$@0@s3,g111@0@0@1@s3,tp0,g111$@0#fseek +229$@0@s3,g111@0@0@1@s3,tp0,p2,g111$@0#vfprintf +217@6@0@1@1@0@0@s3@1@s3,tp0$@0#fprintf +219@6@0@1@2@0@0@s3@1@s3,tp0$@0#fscanf +395$@0@s3@1@s3,tp0$@0#vfwprintf +368@6@0@1@1@0@0@s3@1@tp0,s3$@0#fwprintf +370@6@0@1@2@0@0@s3@1@tp0,s3$@0#fwscanf +429$@1@@1@s0$@0#wcsncmp#wmemcmp +391@6@0@1@2@0@0@g122@0@0@1@tg122$@0#swscanf +517$@0@@1@tp0$@0#mbtowc +547$@1@@1@s0$@0#strcmp#strcoll +195$@0@s3,g111@0@0@1@s3,g111$@0#rename +515$@1@@1@s0$@0#mblen +231$@1@g123@0@0,s3@1@s3,p1,tg123$@0#vprintf +243$@0@s3@1@s3,tp1$@0#fputs +221@6@0@1@1@0@1@g123@0@0,s3@1@s3,tg123$@0#printf +223@6@0@1@2@0@1@g122@0@0,s3@1@s3,tg122$@0#scanf +519$@0@@1@tp0$@0#wctomb +366$@1@@1@s0$@0#fwide +269$@0@s3,g111@0@0@1@s3,tp0,g111$@0#fsetpos +265$@0@g111@0@0@1@tp1,g111$@0#fgetpos +399$@0@s3,g123@0@0@1@s3,tg123$@0#vwprintf +364$@0@s3@1@s3,tp1$@0#fputws +410$@1@@1@s0$@0#wcscmp#wcscoll +475@6@0@1@1@0@1@g123@0@0,g111@0@0@1@g111,tg123$@0#wprintf +477@6@0@1@2@0@1@g122@0@0,g111@0@0@1@g111,tg122$@0#wscanf +241$@0@s3,g111@0@0@1@s3,tp1,g111$@0#fputc#ungetc +252$@0@s3@1@s3,tp1$@0#putc +340$@1@@1@s0$@0#abs +183@6@0@5@0@0$$@0#raise +193$@0@s3,g111@0@0@1@s3,g111$@0#remove +256$@1@g123@0@0,s3@1@s3,tg123$@0#puts +285$@1@@1@s0$@0#atoi +325$@0@s3@1@s3$@0#system +459$@1@@1@s0$@0#wctob +153$@0@@1@p0$@0#setjmp +203$@0@g111@0@0,s3@1@tp0,g111,s3$@0#fclose#fgetc +277$@0@g111@0@0@1@g111$@0#feof#ferror +245$@0@s3@1@s3,tp0$@0#getc +205$@0@g111@0@0,s3@1@tp0,g111,s3$@0#fflush +320$@0@s1@1@s1$@0#atexit +381$@1@@1@s0$@0#mbsinit +254$@1@g123@0@0,s3@1@s3,tg123$@0#putchar +297$@0@s1@1@s1$@0#rand +247$@1@g122@0@0,s3@1@s3,tg122$@0#getchar +293$@0@g111@0@0@1@tp1,g111$@0#strtol +453$@0@@1@tp1$@0#wcstol +347$@1@@1@s0$@0#labs +287$@1@@1@s0$@0#atol +271$@0@g111@0@0@1@g111$@0#ftell +295$@0@g111@0@0@1@tp1,g111$@0#strtoul +455$@0@@1@tp1$@0#wcstoul +130$@0@g111@0@0@1@g111$@0#ldexp +120$@1@@1@s0$@0#atan2#fmod +138$@0@g111@0@0@1@g111$@0#pow +132$@0@@1@tp1$@0#frexp +148$@0@@1@tp1$@0#modf +291$@0@g111@0@0@1@tp1,g111$@0#strtod +448$@0@@1@tp1$@0#wcstod +591$@1@@1@s0$@0#difftime +116$@0@g111@0@0@1@g111$@0#acos#asin#cosh#exp#log#log10#sqrt +118$@1@@1@s0$@0#atan#ceil#cos#fabs#floor#sin#sinh#tan#tanh +283$@1@@1@s0$@0#atof +332@6@5@1@0@0@1@@1@s0@18@0@0#bsearch +556@6@5@1@0@0@1@@1@s0@3@0@0#memchr +308@6@5@1@0@0@0@@1@tp0@2@0@0#realloc +302@6@5@1@0@0@1@@1@s0@2@0@0#calloc +305@4@5@1@0@0@1@@1@s0@2@0@0#malloc +238@6@5@1@0@0@0@s3,g111@0@0@1@s3,tp0,tp2,g111$@0#fgets +102@6@5@1@0@0@0@s1,g111@0@0@1@s1,g111@19@3@0#setlocale +559@6@5@1@0@0@1@@1@s0@19@2@0#strchr#strrchr +564@6@5@1@0@0@1@@1@s0@19@2@0#strpbrk +575@6@5@1@0@0@0@s1,g111@0@0@1@tp0,s1,g111@19@2@0#strtok +572@6@5@1@0@0@1@@1@s0@19@2@0#strstr +582$@1@@1@s0@19@3@0#strerror +323@6@5@1@0@0@1@@1@s0@19@3@0#getenv +250@6@5@1@0@0@1@g122@0@0,s3,g111@0@0@1@s3,tp0,tg122,g111@3@0@0#gets +201$@0@s1@1@tp0,s1@19@3@0#tmpnam +599$@0@g111@0@0@1@g111@19@3@0#asctime +602$@1@@1@s0@19@3@0#ctime +487$@1@@1@s0$@0#iswctype +73$@1@@1@s0$@0#isalnum#isalpha#iscntrl#isdigit#isgraph#islower#isprint#ispunct#isspace#isupper#isxdigit +481$@1@@1@s0$@0#iswalnum#iswalpha#iswcntrl#iswdigit#iswgraph#iswlower#iswprint#iswpunct#iswspace#iswupper#iswxdigit +262$@0@s3,g111@0@0@1@s3,tp3,g111$@0#fwrite +260$@0@s3,g111@0@0@1@s3,tp0,tp3,g111$@0#fread +441$@0@@1@tp1$@0#wcsrtombs +610$@0@@1@tp0$@0#strftime +379$@0@@1@tp0$@0#mbrtowc +383$@0@@1@tp0$@0#mbsrtowcs +421$@0@@1@tp0$@0#wcsftime +377$@1@@1@s0$@0#mbrlen +523$@0@@1@tp0$@0#wcstombs +553$@0@@1@tp0$@0#strxfrm +401$@0@@1@tp0$@0#wcrtomb +457$@0@@1@tp0$@0#wcsxfrm +521$@0@@1@tp0$@0#mbstowcs +561$@1@@1@s0$@0#strcspn#strspn +417$@1@@1@s0$@0#wcscspn#wcsspn +584$@1@@1@s0$@0#strlen +423$@1@@1@s0$@0#wcslen +362$@0@s3@1@s3,tp1$@0#fputwc +385$@0@s3@1@s3,tp1$@0#putwc +393$@0@s3@1@s3,tp1$@0#ungetwc +505$@1@@1@s0$@0#towctrans +354$@1@@1@s0$@0#btowc +387$@0@s3,g123@0@0@1@s3,tg123$@0#putwchar +507$@1@@1@s0$@0#towlower#towupper +356$@0@s3@1@s3,tp0$@0#fgetwc +372$@0@s3@1@s3,tp0$@0#getwc +374$@0@s3,g122@0@0@1@s3,tg122$@0#getwchar +106$@1@@1@s0@3@0@0#localeconv +211@6@5@1@0@0@0@s3,g111@0@0@1@tp2,s3,g111@3@0@0#freopen +208@6@5@1@0@0@0@s3@1@s3@18@0@0#fopen +198@6@5@1@0@0@0@s3@1@s3@3@0@0#tmpfile +345$@1@@1@s0$@0#div +352$@1@@1@s0$@0#ldiv +462@6@5@1@0@0@1@@1@s0@3@0@0#wmemchr +360@6@5@1@0@0@0@s3@1@s3,tp0,tp2$@0#fgetws +473$@0@@1@tp0$@0#wmemset +467$@0@@1@tp0$@0#wmemcpy#wmemmove +451@6@5@1@0@0@0@@1@tp2@3@0@0#wcstok +446@6@5@1@0@0@1@@1@s0@3@0@0#wcsstr +438@6@5@1@0@0@1@@1@s0$@0#wcsrchr +408@6@5@1@0@0@1@@1@s0@19@2@0#wcschr +435@6@5@1@0@0@1@@1@s0$@0#wcspbrk +608@6@5@1@0@0@0@g111@0@0@1@g111@19@3@0#localtime +605@6@5@1@0@0@1@@1@s0@19@3@0#gmtime +513$@1@@1@s0$@0#wctype +511$@1@@1@s0$@0#wctrans +589$@0@s1@1@s1$@0#clock +593$@1@@1@s0$@0#mktime +596$@0@@1@tp0$@0#time +181@6@5@1@0@0@0@s1,g111@0@0@1@s1,g111$@0#signal +579$@0@@1@tp0$@0#memset +530$@0@@1@tp0$@0#memmove +527$@0@@1@tp0$@0#memcpy +543$@0@@1@tp0$@0#strncat +537$@0@@1@tp0$@0#strncpy +540$@0@@1@tp0$@0#strcat#strcpy +427$@0@@1@tp0$@0#wcsncat#wcsncpy +405$@0@@1@tp0$@0#wcscat#wcscpy +*7 (Struct tag) +341@342#@!2 +348@349#@!3 +587@418#@tm +98@99#@lconv +;; Modules access +ansi#8@ +;;End diff --git a/lib/bool.h b/lib/bool.h new file mode 100644 index 0000000..ff9294b --- /dev/null +++ b/lib/bool.h @@ -0,0 +1,37 @@ +#ifndef BOOL_H +#define BOOL_H + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +/* bool is a keyword in C++ */ +/*@-cppnames@*/ +typedef int bool; +/*@=cppnames@*/ + +/* +** bool_initMod has no real effect +** Declared with modifies internalState, so no noeffect errors are +** reported when it is called.) +*/ + +extern /*@unused@*/ void bool_initMod (void) /*@modifies internalState@*/ ; +/*@-mustmod@*/ +# define bool_initMod() +/*@=mustmod@*/ + +extern /*@unused@*/ /*@observer@*/ char *bool_unparse (bool) /*@*/ ; +# define bool_unparse(b) ((b) ? "true" : "false" ) + +extern /*@unused@*/ bool bool_not (bool) /*@*/ ; +# define bool_not(b) ((b) ? FALSE : TRUE) + +extern /*@unused@*/ bool bool_equal (bool, bool) /*@*/ ; +# define bool_equal(a,b) ((a) ? (b) : !(b)) + +# endif diff --git a/lib/lclinit.lci b/lib/lclinit.lci new file mode 100644 index 0000000..e7d5542 --- /dev/null +++ b/lib/lclinit.lci @@ -0,0 +1,40 @@ +\comment Standard Larch C Interface Language (LCL) init file + +commentSym // + +opChar ~!#$&?@| + +openSym \< \langle +closeSym \> \rangle +selectSym . + +simpleId \bot \top + +synonym int Int +synonym double float + +synonym \and /\ +synonym \or \/ +synonym \implies => +synonym \marker __ +synonym = == +synonym \neq != +synonym \not ! +synonym \not not +synonym \not ~ +synonym \pre ^ +synonym \post ' +synonym \arrow -> +synonym \arrow \ra + +synonym |- \postcat +synonym -| \pretcat +synonym |- \vdash +synonym -| \dashv +synonym \leq <= +synonym \geq >= +synonym \cap \I +synonym \cup \U +synonym \diamond \rel +synonym \sqcap \lub +synonym \sqcup \glb diff --git a/lib/lslinit.lsi b/lib/lslinit.lsi new file mode 100644 index 0000000..2094791 --- /dev/null +++ b/lib/lslinit.lsi @@ -0,0 +1,43 @@ +\comment Standard Larch Shared Language (LSL) init file + +commentSym % + +idChar ' +opChar ~!#$&?@| +singleChar ; + +\comment for versions of lsl before 3.1, add [ and ] to the +\comment openSym and closeSym lists: +openSym { \< \langle +closeSym } \> \rangle +selectSym . + +simpleId \bot \top + +synonym \and /\ +synonym \or \/ +synonym \implies => +synonym \not not +synonym \not ~ +synonym \eq = +synonym \neq ~= +synonym \arrow -> +synonym \marker __ +synonym \equals == +synonym \forall forall +synonym \eqsep ; + +synonym |- \postcat +synonym -| \pretcat +synonym |- \vdash +synonym -| \dashv +synonym \leq <= +synonym \geq >= +synonym \cap \I +synonym \cup \U +synonym \diamond \rel +synonym \sqcap \lub +synonym \sqcup \glb + +synonym Bool bool +synonym Int int \ No newline at end of file diff --git a/lib/posix.h b/lib/posix.h new file mode 100644 index 0000000..19d0855 --- /dev/null +++ b/lib/posix.h @@ -0,0 +1,890 @@ +/* +** posix.h +** +** This file should be processed with one of the standard libraries +** (standard.h or strict.h) to produce posix.lcd or posixstrict.lcd. +*/ + +/*@-nextlinemacros@*/ +/*@+allimponly@*/ +/*@+globsimpmodifiesnothing@*/ + +/* + * LCLint ISO C + POSIX Library + * + * $Id$ + */ + +/* + * In 1988, IEEE Std 1003.1-1988, commonly known as "POSIX" or the + * "IEEE Portable Operating System Interface for Computing Environments" + * was published as an American National Standard. In 1990, IEEE Std + * 1003.1-1990 was published as an International Standard. The two + * standards differ slightly, and where they do, the 1990 International + * standard was used for this lclint library. The differences are: + * + * 1988: cuserid() + * 1990: -removed- (but still in this lclint library) + * + * 1988: int read (int, void*, unsigned int) + * 1990: ssize_t read (int, void*, size_t) + * + * 1988: int write (int, const void*, unsigned int) + * 1990: ssize_t write (int, const void*, size_t) + * + * The other differences are in the semantics of functions. + */ + +/* + * The reference for the ISO C part of this library was + * Plauger, Brodie's "Standard C - A Reference", Prentice Hall. + * The reference for the POSIX part of this library was + * Donald Lewine's "POSIX Programmer's Guide", O'Reilly. + * Transcription by Jens Schweikhardt + */ + +/* + * Note that Amendment 1 to ISO C was published in 1995 after POSIX was out. + * Amendment 1 basically adds support for wide characters and iso 646 + * source character sets. In particular, there are three new headers: + * , , and + */ + +/* + * Each header has annotations in this order: + * + * 1) type definitions (if any) + * 2) constant definitions (if any) + * 3) structure definitions (if any) + * 4) function prototypes and externals (if any) + * + * 5) type definitions augmented by POSIX (if any) + * 6) constant definitions augmented by POSIX (if any) + * 7) structure definitions augmented by POSIX (if any) + * 8) function prototypes and externals augmented by POSIX (if any) + * + * Builtins are mentioned in the header where they appear according to ISO. + */ + +/* +** sys/types.h +*/ + +typedef /*@integraltype@*/ dev_t; +typedef /*@integraltype@*/ gid_t; +typedef /*@integraltype@*/ ino_t; +typedef /*@integraltype@*/ mode_t; +typedef /*@integraltype@*/ nlink_t; +typedef /*@integraltype@*/ off_t; +typedef /*@integraltype@*/ pid_t; +typedef /*@integraltype@*/ uid_t; + +/* +** dirent.h +*/ + +typedef /*@abstract@*/ /*@mutable@*/ void *DIR; + +struct dirent { + char d_name[]; +}; + + extern int +closedir (DIR *dirp) + /*@modifies errno@*/; + + extern /*@null@*/ DIR * +opendir (const char *dirname) + /*@modifies errno@*/; + + extern /*@null@*/ struct dirent * +readdir (DIR *dirp) + /*@modifies errno@*/; + + extern void +rewinddir (DIR *dirp) + /*@*/; + +/* +** errno.h +*/ + +/*@constant int E2BIG@*/ +/*@constant int EACCES@*/ +/*@constant int EAGAIN@*/ +/*@constant int EBADF@*/ +/*@constant int EBUSY@*/ +/*@constant int ECHILD@*/ +/*@constant int EDEADLK@*/ +/*@constant int EEXIST@*/ +/*@constant int EFAULT@*/ +/*@constant int EFBIG@*/ +/*@constant int EINTR@*/ +/*@constant int EINVAL@*/ +/*@constant int EIO@*/ +/*@constant int EISDIR@*/ +/*@constant int EMFILE@*/ +/*@constant int EMLINK@*/ +/*@constant int ENAMETOOLONG@*/ +/*@constant int ENFILE@*/ +/*@constant int ENODEV@*/ +/*@constant int ENOENT@*/ +/*@constant int ENOEXEC@*/ +/*@constant int ENOLCK@*/ +/*@constant int ENOMEM@*/ +/*@constant int ENOSPC@*/ +/*@constant int ENOSYS@*/ +/*@constant int ENOTDIR@*/ +/*@constant int ENOTEMPTY@*/ +/*@constant int ENOTTY@*/ +/*@constant int ENXIO@*/ +/*@constant int EPERM@*/ +/*@constant int EPIPE@*/ +/*@constant int EROFS@*/ +/*@constant int ESPIPE@*/ +/*@constant int ESRCH@*/ +/*@constant int EXDEV@*/ + +/* +** fcntl.h +*/ + +/*@constant int FD_CLOEXEC@*/ +/*@constant int F_DUPFD@*/ +/*@constant int F_GETFD@*/ +/*@constant int F_GETFL@*/ +/*@constant int F_GETLK@*/ +/*@constant int F_RDLCK@*/ +/*@constant int F_SETFD@*/ +/*@constant int F_SETFL@*/ +/*@constant int F_SETLK@*/ +/*@constant int F_SETLKW@*/ +/*@constant int F_UNLCK@*/ +/*@constant int F_WRLCK@*/ +/*@constant int O_ACCMODE@*/ +/*@constant int O_APPEND@*/ +/*@constant int O_CREAT@*/ +/*@constant int O_EXCL@*/ +/*@constant int O_NOCTTY@*/ +/*@constant int O_NONBLOCK@*/ +/*@constant int O_RDONLY@*/ +/*@constant int O_RDWR@*/ +/*@constant int O_TRUNC@*/ +/*@constant int O_WRONLY@*/ +/*@constant int SEEK_CUR@*/ +/*@constant int SEEK_END@*/ +/*@constant int SEEK_SET@*/ +/*@constant int S_IRGRP@*/ +/*@constant int S_IROTH@*/ +/*@constant int S_IUSR@*/ +/*@constant int S_IWXG@*/ +/*@constant int S_IWXO@*/ +/*@constant int S_IWXU@*/ +/*@constant int S_ISGID@*/ +/*@constant int S_ISUID@*/ +/*@constant int S_IWGRP@*/ +/*@constant int S_IWOTH@*/ +/*@constant int S_IWUSR@*/ +/*@constant int S_IXGRP@*/ +/*@constant int S_IXOTH@*/ +/*@constant int S_IXUSR@*/ + +struct flock { + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; +}; + + extern int +creat (const char *path, mode_t mode) + /*@modifies errno@*/; + + extern int +fcntl (int fd, int cmd, ...) + /*@modifies errno@*/; + + extern int +open (const char *path, int oflag, ...) + /*@modifies errno@*/; + +/* +** grp.h +*/ + +struct group { + char *gr_name; + gid_t gr_gid; + char **gr_mem; +}; + + extern /*@null@*/ struct group * +getgrgid (gid_t gid) + /*@modifies errno@*/; + + extern /*@null@*/ struct group * +getgrnam (const char *nm) + /*@modifies errno@*/; + +/* +** limits.h +*/ + +/*@constant long ARG_MAX@*/ +/*@constant long CHILD_MAX@*/ +/*@constant long LINK_MAX@*/ +/*@constant long MAX_CANON@*/ +/*@constant long MAX_INPUT@*/ +/*@constant long NAME_MAX@*/ +/*@constant long NGROUPS_MAX@*/ +/*@constant long OPEN_MAX@*/ +/*@constant long PIPE_BUF@*/ +/*@constant long SSIZE_MAX@*/ +/*@constant long STREAM_MAX@*/ +/*@constant long TZNAME_MAX@*/ +/*@constant long _POSIX_ARG_MAX@*/ +/*@constant long _POSIX_CHILD_MAX@*/ +/*@constant long _POSIX_LINK_MAX@*/ +/*@constant long _POSIX_MAX_CANON@*/ +/*@constant long _POSIX_MAX_INPUT@*/ +/*@constant long _POSIX_NAME_MAX@*/ +/*@constant long _POSIX_NGROUPS_MAX@*/ +/*@constant long _POSIX_OPEN_MAX@*/ +/*@constant long _POSIX_PATH_MAX@*/ +/*@constant long _POSIX_PIPE_BUF@*/ +/*@constant long _POSIX_SSIZE@*/ +/*@constant long _POSIX_STREAM@*/ +/*@constant long _POSIX_TZNAME_MAX@*/ + +/* +** pwd.h +*/ + +struct passwd { + char *pw_name; + uid_t pw_uid; + gid_t pw_gid; + char *pw_dir; + char *pw_shell; +} ; + + extern /*@observer@*/ /*@null@*/ struct passwd * +getpwnam (const char *) + /*@modifies errno@*/; + + extern /*@observer@*/ /*@null@*/ struct passwd * +getpwuid (uid_t uid) + /*@modifies errno@*/; + +/* +** setjmp.h +*/ + +typedef /*@abstract@*/ /*@mutable@*/ void *sigjmp_buf; + + extern /*@mayexit@*/ void +siglongjmp (sigjmp_buf env, int val) + /*@*/; + + extern int +sigsetjmp (/*@out@*/ sigjmp_buf env, int savemask) + /*@modifies env@*/; + +/* +** signal.h +*/ + +typedef /*@abstract@*/ sigset_t; + +/*@constant int SA_NOCLDSTOP@*/ +/*@constant int SIG_BLOCK@*/ +/*@constant int SIG_SETMASK@*/ +/*@constant int SIG_UNBLOCK@*/ +/*@constant int SIGALRM@*/ +/*@constant int SIGCHLD@*/ +/*@constant int SIGCONT@*/ +/*@constant int SIGHUP@*/ +/*@constant int SIGKILL@*/ +/*@constant int SIGPIPE@*/ +/*@constant int SIGQUIT@*/ +/*@constant int SIGSTOP@*/ +/*@constant int SIGTSTP@*/ +/*@constant int SIGTTIN@*/ +/*@constant int SIGTTOU@*/ +/*@constant int SIGUSR1@*/ +/*@constant int SIGUSR2@*/ + +struct sigaction { + void (*sa_handler)(); + sigset_t sa_mask; + int sa_flags; +} ; + + extern /*@mayexit@*/ int +kill (pid_t pid, int sig) + /*@modifies errno@*/; + + extern int +sigaction (int sig, const struct sigaction *act, /*@out@*/ /*@null@*/ struct sigaction *oact) + /*@modifies *oact, errno, internalState@*/; + + extern int +sigaddset (sigset_t *set, int signo) + /*@modifies *set, errno@*/; + + extern int +sigdelset (sigset_t *set, int signo) + /*@modifies *set, errno@*/; + + extern int +sigemptyset (/*@out@*/ sigset_t *set) + /*@modifies *set, errno@*/; + + extern int +sigfillset (/*@out@*/ sigset_t *set) + /*@modifies *set, errno@*/; + + extern int +sigismember (const sigset_t *set, int signo) + /*@modifies errno@*/; + + extern int +sigpending (/*@out@*/ sigset_t *set) + /*@modifies *set, errno@*/; + + extern int +sigprocmask (int how, /*@null@*/ const sigset_t *set, /*@null@*/ /*@out@*/ sigset_t *oset) + /*@modifies *oset, errno, internalState@*/; + + extern int +sigsuspend (const sigset_t *sigmask) + /*@modifies errno, internalState@*/; + +/* +** stdio.h +*/ + +/*@constant int L_ctermid@*/ +/*@constant int L_cuserid@*/ +/*@constant int STREAM_MAX@*/ + + extern /*@null@*/ /*@dependent@*/ FILE * +fdopen (int fd, const char *type) + /*@modifies errno, fileSystem@*/; + + extern int +fileno (FILE *fp) + /*@modifies errno@*/; + +/* +** sys/stat.h +*/ + +/*@constant int S_IRGRP@*/ +/*@constant int S_IROTH@*/ +/*@constant int S_IUSR@*/ +/*@constant int S_IWXG@*/ +/*@constant int S_IWXO@*/ +/*@constant int S_IWXU@*/ +/*@constant int S_ISGID@*/ +/*@constant int S_ISUID@*/ +/*@constant int S_IWGRP@*/ +/*@constant int S_IWOTH@*/ +/*@constant int S_IWUSR@*/ +/*@constant int S_IXGRP@*/ +/*@constant int S_IXOTH@*/ +/*@constant int S_IXUSR@*/ + +struct stat { + mode_t st_mode; + ino_t st_ino; + dev_t st_dev; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + off_t st_size; + time_t st_st_atime; + time_t st_st_mtime; + time_t st_st_ctime; +} ; + +/* +** POSIX does not require that the S_I* be functions. They're +** macros virtually everywhere. +*/ + +# ifdef STRICT +/*@notfunction@*/ +# define SBOOLINT lltX_bool /*@alt int@*/ +# else +/*@notfunction@*/ +# define SBOOLINT lltX_bool +# endif + +extern SBOOLINT S_ISBLK (/*@sef@*/ mode_t m) /*@*/ ; + +extern SBOOLINT S_ISCHR (/*@sef@*/ mode_t m) /*@*/ ; + +extern SBOOLINT S_ISDIR (/*@sef@*/ mode_t m) /*@*/ ; + +extern SBOOLINT S_ISFIFO (/*@sef@*/ mode_t m) /*@*/ ; + +extern SBOOLINT S_ISREG (/*@sef@*/ mode_t m) /*@*/ ; + +extern int chmod (const char *path, mode_t mode) + /*@modifies fileSystem, errno@*/ ; + +extern int fstat (int fd, /*@out@*/ struct stat *buf) + /*@modifies errno, *buf@*/ ; + +extern int +mkdir (const char *path, mode_t mode) + /*@modifies fileSystem, errno@*/; + + extern int +mkfifo (const char *path, mode_t mode) + /*@modifies fileSystem, errno@*/; + + extern int +stat (const char *path, /*@out@*/ struct stat *buf) + /*@modifies errno, *buf@*/; + + extern int +umask (mode_t cmask) + /*@modifies internalState@*/; + +/* +** sys/times.h +*/ + +struct tms { + clock_t tms_utime; + clock_t tms_stime; + clock_t tms_cutime; + clock_t tms_cstime; +}; + + extern clock_t +times (/*@out@*/ struct tms *tp) + /*@modifies *tp@*/; + +/* +** sys/utsname.h +*/ + +struct utsname { + char sysname[]; + char nodename[]; + char release[]; + char version[]; + char machine[]; +}; + + extern int +uname (/*@out@*/ struct utsname *name) + /*@modifies *name, errno@*/ ; + +/* +** sys/wait.h +*/ + +extern int WEXITSTATUS (int status) /*@*/ ; +extern int WIFEXITED (int status) /*@*/ ; +extern int WIFSIGNALED (int status) /*@*/ ; +extern int WIFSTOPPED (int status) /*@*/ ; +extern int WSTOPSIG (int status) /*@*/ ; +extern int WTERMSIG (int status) /*@*/ ; + +/*@constant int WUNTRACED@*/ + + extern pid_t +wait (/*@out@*/ /*@null@*/ int *st) + /*@modifies *st, errno@*/; + + extern pid_t +waitpid (pid_t pid, /*@out@*/ int *st, int opt) + /*@modifies *st, errno@*/; + +/* +** termios.h +*/ + +typedef unsigned char /*@alt unsigned short@*/ cc_t; +typedef unsigned long /*@alt long@*/ speed_t; +typedef unsigned long /*@alt long@*/ tcflag_t; + +/*@constant int B0@*/ +/*@constant int B50@*/ +/*@constant int B75@*/ +/*@constant int B110@*/ +/*@constant int B134@*/ +/*@constant int B150@*/ +/*@constant int B200@*/ +/*@constant int B300@*/ +/*@constant int B600@*/ +/*@constant int B1200@*/ +/*@constant int B1800@*/ +/*@constant int B2400@*/ +/*@constant int B4800@*/ +/*@constant int B9600@*/ +/*@constant int B19200@*/ +/*@constant int B38400@*/ +/*@constant int BRKINT@*/ +/*@constant int CLOCAL@*/ +/*@constant int CREAD@*/ +/*@constant int CS5@*/ +/*@constant int CS6@*/ +/*@constant int CS7@*/ +/*@constant int CS8@*/ +/*@constant int CSIZE@*/ +/*@constant int CSTOPB@*/ +/*@constant int ECHO@*/ +/*@constant int ECHOE@*/ +/*@constant int ECHOK@*/ +/*@constant int ECHONL@*/ +/*@constant int HUPCL@*/ +/*@constant int ICANON@*/ +/*@constant int ICRNL@*/ +/*@constant int IEXTEN@*/ +/*@constant int IGNBRK@*/ +/*@constant int IGNCR@*/ +/*@constant int IGNPAR@*/ +/*@constant int IGNLCR@*/ +/*@constant int INPCK@*/ +/*@constant int ISIG@*/ +/*@constant int ISTRIP@*/ +/*@constant int IXOFF@*/ +/*@constant int IXON@*/ +/*@constant int NCCS@*/ +/*@constant int NOFLSH@*/ +/*@constant int OPOST@*/ +/*@constant int PARENB@*/ +/*@constant int PARMRK@*/ +/*@constant int PARODD@*/ +/*@constant int TCIFLUSH@*/ +/*@constant int TCIOFF@*/ +/*@constant int TCIOFLUSH@*/ +/*@constant int TCION@*/ +/*@constant int TCOFLUSH@*/ +/*@constant int TCSADRAIN@*/ +/*@constant int TCSAFLUSH@*/ +/*@constant int TCSANOW@*/ +/*@constant int TOSTOP@*/ +/*@constant int VEOF@*/ +/*@constant int VEOL@*/ +/*@constant int VERASE@*/ +/*@constant int VINTR@*/ +/*@constant int VKILL@*/ +/*@constant int VMIN@*/ +/*@constant int VQUIT@*/ +/*@constant int VSTART@*/ +/*@constant int VSTOP@*/ +/*@constant int VSUSP@*/ +/*@constant int VTIME@*/ + +struct termios { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_cc; +} ; + + extern speed_t +cfgetispeed (const struct termios *p) + /*@*/; + + extern speed_t +cfgetospeed (const struct termios *p) + /*@*/; + + extern int +cfsetispeed (struct termios *p) + /*@modifies *p@*/; + + extern int +cfsetospeed (struct termios *p) + /*@modifies *p@*/; + + extern int +tcdrain (int fd) + /*@modifies errno@*/; + + extern int +tcflow (int fd, int action) + /*@modifies errno@*/; + + extern int +tcflush (int fd, int qs) + /*@modifies errno@*/; + + extern int +tcgetattr (int fd, /*@out@*/ struct termios *p) + /*@modifies errno, *p@*/; + + extern int +tcsendbreak (int fd, int d) + /*@modifies errno@*/; + + extern int +tcsetattr (int fd, int opt, const struct termios *p) + /*@modifies errno@*/; + +/* +** time.h +*/ + +/* Environ must be known before it can be used in `globals' clauses. */ + +/*@unchecked@*/ extern char **environ; + +/*@constant int CLK_TCK@*/ + + extern void +tzset (void) + /*@globals environ@*/ /*@modifies internalState@*/; + +/* +** unistd.h +*/ + +/*@constant int F_OK@*/ +/*@constant int R_OK@*/ +/*@constant int SEEK_CUR@*/ +/*@constant int SEEK_END@*/ +/*@constant int SEEK_SET@*/ +/*@constant int STDERR_FILENO@*/ +/*@constant int STDIN_FILENO@*/ +/*@constant int STDOUT_FILENO@*/ +/*@constant int W_OK@*/ +/*@constant int X_OK@*/ +/*@constant int _PC_CHOWN_RESTRUCTED@*/ +/*@constant int _PC_MAX_CANON@*/ +/*@constant int _PC_MAX_INPUT@*/ +/*@constant int _PC_NAME_MAX@*/ +/*@constant int _PC_NO_TRUNC@*/ +/*@constant int _PC_PATH_MAX@*/ +/*@constant int _PC_PIPE_BUF@*/ +/*@constant int _PC_VDISABLE@*/ +/*@constant int _POSIX_CHOWN_RESTRICTED@*/ +/*@constant int _POSIX_JOB_CONTROL@*/ +/*@constant int _POSIX_NO_TRUNC@*/ +/*@constant int _POSIX_SAVED_IDS@*/ +/*@constant int _POSIX_VDISABLE@*/ +/*@constant int _POSIX_VERSION@*/ +/*@constant int _SC_ARG_MAX@*/ +/*@constant int _SC_CHILD_MAX@*/ +/*@constant int _SC_CLK_TCK@*/ +/*@constant int _SC_JOB_CONTROL@*/ +/*@constant int _SC_NGROUPS_MAX@*/ +/*@constant int _SC_OPEN_MAX@*/ +/*@constant int _SC_SAVED_IDS@*/ +/*@constant int _SC_STREAM_MAX@*/ +/*@constant int _SC_TZNAME_MAX@*/ +/*@constant int _SC_VERSION@*/ + + extern /*@exits@*/ void +_exit (int status) + /*@*/; + + extern int +access (const char *path, int mode) + /*@modifies errno@*/; + + extern unsigned int +alarm (unsigned int) + /*@modifies internalState@*/; + + extern int +chdir (const char *path) + /*@modifies errno@*/; + + extern int +chown (const char *path, uid_t owner, gid_t group) + /*@modifies fileSystem, errno@*/; + + extern int +close (int fd) + /*@modifies fileSystem, errno, internalState@*/; + /* state: record locks are unlocked */ + + extern char * +ctermid (/*@returned@*/ /*@out@*/ /*@null@*/ char *s) + /*@modifies *s, internalState@*/; + + /* cuserid is in the 1988 version of POSIX but removed in 1990 */ + extern char * +cuserid (/*@null@*/ /*@out@*/ char *s) + /*@modifies *s@*/; + + extern int +dup2 (int fd, int fd2) + /*@modifies errno, fileSystem@*/; + + extern int +dup (int fd) + /*@modifies errno, fileSystem@*/; + + extern /*@mayexit@*/ int +execl (const char *path, const char *arg, ...) + /*@modifies errno@*/; + + extern /*@mayexit@*/ int +execle (const char *file, const char *arg, ...) + /*@modifies errno@*/; + + extern /*@mayexit@*/ int +execlp (const char *file, const char *arg, ...) + /*@modifies errno@*/; + + extern /*@mayexit@*/ int +execv (const char *path, char *const argv[]) + /*@modifies errno@*/; + + extern /*@mayexit@*/ int +execve (const char *path, char *const argv[], char *const *envp) + /*@modifies errno@*/; + + extern /*@mayexit@*/ int +execvp (const char *file, char *const argv[]) + /*@modifies errno@*/; + + extern pid_t +fork (void) + /*@modifies fileSystem, errno@*/; + + extern long +fpathconf (int fd, int name) + /*@modifies errno@*/; + + extern char * +getcwd (/*@returned@*/ /*@out@*/ char *buf, size_t size) + /*@modifies errno, *buf@*/; + + extern gid_t +getegid (void) + /*@*/; + + extern uid_t +geteuid (void) + /*@*/; + + extern gid_t +getgid (void) + /*@*/; + + extern int +getgroups (int gs, /*@out@*/ gid_t gl[]) + /*@modifies errno, gl[]@*/; + + extern /*@observer@*/ char * +getlogin (void) + /*@*/; + + extern pid_t +getpgrp (void) + /*@*/; + + extern pid_t +getpid (void) + /*@*/; + + extern pid_t +getppid (void) + /*@*/; + + extern uid_t +getuid (void) + /*@*/; + + extern int +isatty (int fd) + /*@*/; + + extern int +link (const char *o, const char *n) + /*@modifies errno, fileSystem@*/; + + extern off_t +lseek (int fd, off_t offset, int whence) + /*@modifies errno@*/; + + extern long +pathconf (const char *path, int name) + /*@modifies errno@*/; + + extern int +pause (void) + /*@modifies errno@*/; + + extern int +pipe (/*@out@*/ int fd[]) /* Out parameter noticed by Marc Espie. */ + /*@modifies errno@*/; + + extern ssize_t +read (int fd, /*@out@*/ void *buf, size_t nbyte) + /*@modifies errno, *buf@*/; + + extern int +rmdir (const char *path) + /*@modifies fileSystem, errno@*/; + + extern int +setgid (gid_t gid) + /*@modifies errno, internalState@*/; + + extern int +setpgid (pid_t pid, pid_t pgid) + /*@modifies errno, internalState@*/; + + extern pid_t +setsid (void) + /*@*/; + + extern int +setuid (uid_t uid) + /*@modifies errno, internalState@*/; + + extern unsigned int +sleep (unsigned int sec) + /*@*/; + + extern long +sysconf (int name) + /*@modifies errno@*/; + + extern pid_t +tcgetpgrp (int fd) + /*@modifies errno@*/; + + extern int +tcsetpgrp (int fd, pid_t pgrpid) + /*@modifies errno, internalState@*/; + + /* Q: observer ok? */ + extern /*@null@*/ /*@observer@*/ char * +ttyname (int fd) + /*@modifies errno@*/; + + extern int +unlink (const char *path) + /*@modifies fileSystem, errno@*/; + + extern ssize_t +write (int fd, const void *buf, size_t nbyte) + /*@modifies errno@*/; + +/* +** utime.h +*/ + +struct utimbuf { + time_t actime; + time_t modtime; +} ; + + extern int +utime (const char *path, /*@null@*/ const struct utimbuf *times) + /*@modifies fileSystem, errno@*/; + diff --git a/lib/posix.lcd b/lib/posix.lcd new file mode 100644 index 0000000..8a46a39 --- /dev/null +++ b/lib/posix.lcd @@ -0,0 +1,1271 @@ +;;LCLint Dump: posix.lcd +;;LCLint 2.5m --- 20 May 2000 +;;lib:166 +;;ctTable +0 u-2 19 38 +0 p1|-2 20 39 +0 b-2 21 40 +0 p3|-2 22 41 +0 p4|-2 23 42 +0 p5|-2 24 43 +0 p6|-2 25 44 +0 p7|-2 26 45 +0 p8|-2 27 46 +0 p9|-2 28 47 +0 p10|-2 29 48 +0 p11|-2 30 49 +0 p12|-2 31 50 +0 p13|-2 32 51 +0 p14|-2 33 52 +0 p15|-2 34 53 +0 p16|-2 35 54 +0 p17|-2 36 55 +0 p18|-2 37 56 +1 t0|0 314 855 +1 t1|1& +1 t2|2& +1 t3|3& +1 t4|4 315 856 +1 t5|5& +1 t6|6& +1 t7|7& +1 t8|8& +1 t9|9& +1 t10|10& +1 t11|11& +1 t12|12& +1 t13|13& +1 t14|14& +1 t15|15& +1 t16|16& +1 t17|17& +1 t18|18& +2 y0|0& +2 y1|1& +2 y2|2& +2 y3|3& +2 y4|4& +2 y5|5& +2 y6|6& +2 y7|7& +2 y8|8& +2 y9|9& +2 y10|10& +2 y11|11& +2 y12|12& +2 y13|13& +2 y14|14& +2 y15|15& +2 y16|16& +2 y17|17& +2 y18|18& +-2 ?! +0 s2|& +0 s3|& +0 s4|& +0 s5|& +0 s6|& +0 s22|& +0 s23|& +0 s7|-1 383 -1 +0 s8|& +0 a0|-1 401 -1 +3 C0.5/20|! +3 C0.68/2|! +3 C0.2/5|! +3 f0 (70|@7|$#,)! +3 f1 (70|@7|$#,)! +3 C0.4/5|! +3 C0.3/5|! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 C0.2/5|! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f87 (74|$#,)! +3 C0.4/5|! +3 C0.3/5|! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f87 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f87 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f87 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 C0.2/5|! +3 f104 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f104 (92|$#,)! +3 C0.4/5|! +3 C0.3/5|! +3 f0 (110|$#,)! +3 f2 (110|$#,)! +3 f104 (110|$#,)! +3 f0 (110|$#,)! +3 f4 (110|$#,)! +3 f109 (110|$#,)! +3 f0 (110|$#,)! +3 f4 (110|$#,)! +3 f109 (110|$#,)! +3 Slconv{23|@1|0@0@3&#decimal_point,23|@1|0@0@3&#thousands_sep,23|@1|0@0@3&#grouping,23|@1|0@0@3&#int_curr_symbol,23|@1|0@0@3&#currency_symbol,23|@1|0@0@3&#mon_decimal_point,23|@1|0@0@3&#mon_thousands_sep,23|@1|0@0@3&#mon_grouping,23|@1|0@0@3&#positive_sign,23|@1|0@0@3&#negative_sign,4|@1|^#int_frac_digits,4|@1|^#frac_digits,4|@1|^#p_cs_precedes,4|@1|^#p_sep_by_space,4|@1|^#n_cs_precedes,4|@1|^#n_sep_by_space,4|@1|^#p_sign_posn,4|@1|^#n_sign_posn,}! +0 s686|-1 127 -1 +3 f0 (5|$#,23|0@5@7&#,)! +3 f19 (5|$#,23|0@5@7&#,)! +3 f23 (5|$#,23|0@5@7&#,)! +3 f0 ()! +3 f19 ()! +1 t121|121& +3 f127 ()! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,5|$#,)! +3 f17 (17|$#,5|$#,)! +3 f0 (17|$#,24|4@0@7&#,)! +3 f17 (17|$#,24|4@0@7&#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,36|4@0@7&#,)! +3 f17 (17|$#,36|4@0@7&#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +0 a24|& +3 f0 (173|4@0@7&#,)! +3 f5 (173|4@0@7&#,)! +3 f0 (173|$#,5|$#,)! +3 f1 (173|$#,5|$#,)! +0 s9|& +3 ?! +3 f179 (5|$#,)! +3 f1 (5|$#,)^182 +1 t181|181& +3 ?! +3 f183 (5|$#,)! +3 f1 (5|$#,)^186 +1 t185|185& +3 ?! +3 f187 (5|$#,)! +3 f1 (5|$#,)^190 +1 t189|189& +3 ?! +3 f191 (5|$#,)! +3 f1 (5|$#,)^194 +1 t193|193& +3 f0 (5|$#,194|0@5@7&#,)! +3 f19 (5|$#,194|0@5@7&#,)^197 +1 t196|196& +3 ?! +3 f198 (5|$#,)! +3 f19 (5|$#,)! +3 f1 (5|$#,194|0@5@7&#,)! +3 f1 (5|$#,)! +3 f202 (5|$#,194|0@5@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +0 a25|& +3 f0 (206|4@0@7&#,!.,)! +3 f1 (206|4@0@7&#,!.,)! +3 f0 (206|$#,)! +3 f1 (206|$#,)! +0 a26|-1 213 -1 +0 a27|-1 289 -1 +1 t211|211& +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 ()! +3 f19 ()! +3 f213 ()! +3 f0 (23|@5|4@5@7&#,)! +3 f19 (23|@5|4@5@7&#,)! +3 f23 (23|@5|4@5@7&#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (213|0@5@7&#,)! +3 f5 (213|0@5@7&#,)! +3 f0 (23|$#,23|$#,)! +3 f19 (23|$#,23|$#,)! +3 f213 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,213|$#,)! +3 f19 (23|$#,23|$#,213|$#,)! +3 f213 (23|$#,23|$#,213|$#,)! +3 f0 (213|$#,23|0@5@19@2@0#,)! +3 f1 (213|$#,23|0@5@19@2@0#,)! +3 f0 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f5 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 C0.5/1|! +3 f0 (213|$#,23|$#,!.,)! +3 f5 (213|$#,23|$#,!.,)! +3 f238 (213|$#,23|$#,!.,)! +3 f0 (213|$#,23|$#,!.,)! +3 f5 (213|$#,23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f238 (23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f238 (23|4@0@7&#,23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f0 (213|$#,23|$#,206|$#,)! +3 f5 (213|$#,23|$#,206|$#,)! +3 f0 (23|$#,206|$#,)! +3 f5 (23|$#,206|$#,)! +3 f0 (23|4@0@7&#,23|$#,206|$#,)! +3 f5 (23|4@0@7&#,23|$#,206|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (23|@5|4@0@7&#,5|$#,213|$#,)! +3 f19 (23|@5|4@0@7&#,5|$#,213|$#,)! +3 f23 (23|@5|4@0@7&#,5|$#,213|$#,)! +3 C0.5/4|! +3 f0 (265|$#,213|$#,)! +3 f5 (265|$#,213|$#,)! +3 f0 (23|$#,213|$#,)! +3 f5 (23|$#,213|$#,)! +3 f0 (213|@7|$#,)! +3 f5 (213|@7|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (23|4@0@7&#,)! +3 f19 (23|4@0@7&#,)! +3 f23 (23|4@0@7&#,)! +3 f0 (265|$#,213|@7|$#,)! +3 f5 (265|$#,213|@7|$#,)! +3 f0 (265|$#,)! +3 f5 (265|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (265|$#,213|$#,)! +3 f5 (265|$#,213|$#,)! +3 f0 (20|4@0@7&#,63|$#,63|$#,213|$#,)! +3 f63 (20|4@0@7&#,63|$#,63|$#,213|$#,)! +3 f0 (20|$#,63|$#,63|$#,213|$#,)! +3 f63 (20|$#,63|$#,63|$#,213|$#,)! +1 t212|212& +3 f0 (213|$#,289|4@0@7&#,)! +3 f5 (213|$#,289|4@0@7&#,)! +3 f0 (213|$#,9|$#,5|$#,)! +3 f5 (213|$#,9|$#,5|$#,)! +3 f0 (213|$#,289|$#,)! +3 f5 (213|$#,289|$#,)! +3 f0 (213|$#,)! +3 f9 (213|$#,)! +3 f0 (213|$#,)! +3 f1 (213|$#,)! +3 f0 (213|$#,)! +3 f1 (213|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (23|0@5@7&#,)! +3 f1 (23|0@5@7&#,)! +3 f0 (23|$#,)! +3 f17 (23|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,)! +3 f9 (23|$#,)! +1 t19|19& +1 t23|23& +3 f0 (23|$#,315|4@5@7&#,)! +3 f17 (23|$#,315|4@5@7&#,)! +3 f0 (23|$#,315|4@5@7&#,5|$#,)! +3 f9 (23|$#,315|4@5@7&#,5|$#,)! +3 f0 (23|$#,315|4@5@7&#,5|$#,)! +3 f10 (23|$#,315|4@5@7&#,5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (6|$#,)! +3 f1 (6|$#,)! +3 f0 (63|$#,63|$#,)! +3 f19 (63|$#,63|$#,)! +3 f20 (63|$#,63|$#,)! +3 f0 (63|$#,)! +3 f19 (63|$#,)! +3 f20 (63|$#,)! +3 f0 (20|@5|4@5@2&#,63|$#,)! +3 f19 (20|@5|4@5@2&#,63|$#,)! +3 f20 (20|@5|4@5@2&#,63|$#,)! +3 f0 (20|4@5@2&#,)! +3 f1 (20|4@5@2&#,)! +3 f0 ()! +3 f1 ()! +3 f0 (5|$#,)! +3 f1 (5|$#,)! +3 ?! +3 f341 ()! +3 f1 ()^344 +1 t343|343& +3 f0 (344|$#,)! +3 f5 (344|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f23 (23|$#,)! +3 f0 (23|0@5@7&#,)! +3 f5 (23|0@5@7&#,)! +3 ?! +3 f352 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^355 +1 t354|354& +3 f0 (20|$#,20|$#,63|$#,63|$#,355|$#,)! +3 f19 (20|$#,20|$#,63|$#,63|$#,355|$#,)! +3 f20 (20|$#,20|$#,63|$#,63|$#,355|$#,)! +3 ?! +3 f359 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^362 +1 t361|361& +3 f0 (20|$#,63|$#,63|$#,362|$#,)! +3 f1 (20|$#,63|$#,63|$#,362|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 S!2{5|@1|^#quot,5|@1|^#rem,}! +0 s675|& +0 s30|& +3 f0 (5|$#,5|$#,)! +3 f369 (5|$#,5|$#,)! +3 f0 (9|$#,)! +3 f9 (9|$#,)! +3 S!3{9|@1|^#quot,9|@1|^#rem,}! +0 s676|& +0 s31|& +3 f0 (9|$#,9|$#,)! +3 f376 (9|$#,9|$#,)! +3 f0 (5|$#,)! +3 f66 (5|$#,)! +3 f0 (213|$#,)! +3 f66 (213|$#,)! +1 t65|65 465 -1 +3 f0 (383|@5|$#,5|$#,213|$#,)! +3 f19 (383|@5|$#,5|$#,213|$#,)! +3 f383 (383|@5|$#,5|$#,213|$#,)! +3 f0 (65|$#,213|$#,)! +3 f66 (65|$#,213|$#,)! +3 f0 (383|$#,213|$#,)! +3 f5 (383|$#,213|$#,)! +3 f0 (213|$#,5|$#,)! +3 f5 (213|$#,5|$#,)! +3 f0 (213|$#,383|$#,!.,)! +3 f5 (213|$#,383|$#,!.,)! +3 f0 (213|$#,383|$#,!.,)! +3 f5 (213|$#,383|$#,!.,)! +3 f0 (213|@7|$#,)! +3 f66 (213|@7|$#,)! +3 f0 ()! +3 f66 ()! +1 t67|67& +3 f0 (23|$#,63|$#,401|0@5@7&#,)! +3 f63 (23|$#,63|$#,401|0@5@7&#,)! +3 f0 (383|0@5@7&#,23|$#,63|$#,401|0@5@7&#,)! +3 f63 (383|0@5@7&#,23|$#,63|$#,401|0@5@7&#,)! +3 f0 (401|0@5@7&#,)! +3 f5 (401|0@5@7&#,)! +3 f0 (383|0@5@7&#,315|$#,63|$#,401|0@5@7&#,)! +3 f63 (383|0@5@7&#,315|$#,63|$#,401|0@5@7&#,)! +3 f0 (65|$#,213|@7|$#,)! +3 f66 (65|$#,213|@7|$#,)! +3 f0 (65|$#,)! +3 f66 (65|$#,)! +3 f0 (383|$#,63|$#,383|$#,!.,)! +3 f5 (383|$#,63|$#,383|$#,!.,)! +3 f0 (383|$#,383|$#,!.,)! +3 f5 (383|$#,383|$#,!.,)! +3 f0 (66|$#,213|$#,)! +3 f66 (66|$#,213|$#,)! +3 f0 (213|$#,383|$#,206|$#,)! +3 f5 (213|$#,383|$#,206|$#,)! +3 f0 (383|$#,63|$#,383|$#,206|$#,)! +3 f5 (383|$#,63|$#,383|$#,206|$#,)! +3 f0 (383|$#,206|$#,)! +3 f5 (383|$#,206|$#,)! +3 f0 (23|4@5@7&#,65|$#,401|0@5@7&#,)! +3 f63 (23|4@5@7&#,65|$#,401|0@5@7&#,)! +3 C0.1/383|! +3 f0 (383|@5|4@0@9&#,383|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,)! +3 f428 (383|@5|4@0@9&#,383|$#,)! +3 f0 (383|@5|$#,65|$#,)! +3 f19 (383|@5|$#,65|$#,)! +3 f383 (383|@5|$#,65|$#,)! +3 f0 (383|$#,383|$#,)! +3 f5 (383|$#,383|$#,)! +3 f0 (383|$#,383|$#,)! +3 f5 (383|$#,383|$#,)! +3 f0 (383|@5|4@0@9&#,383|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,)! +3 f428 (383|@5|4@0@9&#,383|$#,)! +3 f0 (383|$#,383|$#,)! +3 f63 (383|$#,383|$#,)! +0 s684|-1 445 -1 +1 t444|444& +3 f0 (383|4@0@7&#,63|$#,383|$#,445|$#,)! +3 f63 (383|4@0@7&#,63|$#,383|$#,445|$#,)! +3 f0 (383|$#,)! +3 f63 (383|$#,)! +3 C0.1/383|! +3 f0 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f450 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f0 (383|$#,383|$#,63|$#,)! +3 f5 (383|$#,383|$#,63|$#,)! +3 f0 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f450 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f0 (383|@5|$#,383|$#,)! +3 f19 (383|@5|$#,383|$#,)! +3 f383 (383|@5|$#,383|$#,)! +3 f0 (383|@5|$#,65|$#,)! +3 f19 (383|@5|$#,65|$#,)! +3 f383 (383|@5|$#,65|$#,)! +1 t383|383& +3 f0 (23|0@5@7&#,465|$#,63|$#,401|0@5@7&#,)! +3 f63 (23|0@5@7&#,465|$#,63|$#,401|0@5@7&#,)! +3 f0 (383|$#,383|$#,)! +3 f63 (383|$#,383|$#,)! +3 f0 (383|$#,383|$#,)! +3 f19 (383|$#,383|$#,)! +3 f383 (383|$#,383|$#,)! +3 f0 (383|$#,465|0@5@7&#,)! +3 f17 (383|$#,465|0@5@7&#,)! +3 f0 (383|0@5@7&#,383|$#,465|$#,)! +3 f19 (383|0@5@7&#,383|$#,465|$#,)! +3 f383 (383|0@5@7&#,383|$#,465|$#,)! +3 f0 (383|$#,465|0@5@7&#,5|$#,)! +3 f9 (383|$#,465|0@5@7&#,5|$#,)! +3 f0 (383|$#,465|0@5@7&#,5|$#,)! +3 f10 (383|$#,465|0@5@7&#,5|$#,)! +3 f0 (383|0@5@7&#,383|$#,63|$#,)! +3 f63 (383|0@5@7&#,383|$#,63|$#,)! +3 f0 (66|$#,)! +3 f5 (66|$#,)! +3 f0 (383|$#,65|$#,63|$#,)! +3 f19 (383|$#,65|$#,63|$#,)! +3 f383 (383|$#,65|$#,63|$#,)! +3 f0 (383|$#,383|$#,63|$#,)! +3 f5 (383|$#,383|$#,63|$#,)! +3 f0 (383|@5|$#,383|$#,63|$#,)! +3 f19 (383|@5|$#,383|$#,63|$#,)! +3 f383 (383|@5|$#,383|$#,63|$#,)! +3 f0 (383|@5|$#,383|$#,63|$#,)! +3 f19 (383|@5|$#,383|$#,63|$#,)! +3 f383 (383|@5|$#,383|$#,63|$#,)! +3 f0 (383|@5|$#,65|$#,63|$#,)! +3 f19 (383|@5|$#,65|$#,63|$#,)! +3 f383 (383|@5|$#,65|$#,63|$#,)! +3 f0 (383|$#,!.,)! +3 f5 (383|$#,!.,)! +3 f0 (383|$#,!.,)! +3 f5 (383|$#,!.,)! +0 s10|& +0 s11|& +3 C0.2/5|! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,504|$#,)! +3 f2 (66|$#,504|$#,)! +3 f506 (66|$#,504|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 C0.2/5|! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 C0.2/5|! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f541 (66|$#,)! +3 C0.66/5|! +3 f0 (66|$#,505|$#,)! +3 f66 (66|$#,505|$#,)! +3 f545 (66|$#,505|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f545 (66|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f545 (66|$#,)! +3 f0 (23|$#,)! +3 f505 (23|$#,)! +3 f0 (23|$#,)! +3 f504 (23|$#,)! +3 f0 (23|$#,63|$#,)! +3 f5 (23|$#,63|$#,)! +3 f0 (383|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f5 (383|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f0 (23|4@5@7&#,65|$#,)! +3 f5 (23|4@5@7&#,65|$#,)! +3 f0 (383|4@0@7&#,23|$#,63|$#,)! +3 f63 (383|4@0@7&#,23|$#,63|$#,)! +3 f0 (23|4@0@7&#,383|$#,63|$#,)! +3 f63 (23|4@0@7&#,383|$#,63|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f569 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f0 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f569 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 C0.1/23|! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f0 (20|$#,20|$#,63|$#,)! +3 f5 (20|$#,20|$#,63|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,63|$#,)! +3 f5 (23|$#,23|$#,63|$#,)! +3 f0 (23|4@5@7&#,23|$#,63|$#,)! +3 f63 (23|4@5@7&#,23|$#,63|$#,)! +3 f0 (20|$#,5|$#,63|$#,)! +3 f19 (20|$#,5|$#,63|$#,)! +3 f20 (20|$#,5|$#,63|$#,)! +3 f0 (23|@5|$#,265|$#,)! +3 f19 (23|@5|$#,265|$#,)! +3 f23 (23|@5|$#,265|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|$#,23|$#,)! +3 f19 (23|@5|$#,23|$#,)! +3 f23 (23|@5|$#,23|$#,)! +3 f0 (23|@5|$#,265|$#,)! +3 f19 (23|@5|$#,265|$#,)! +3 f23 (23|@5|$#,265|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|0@0@9&#,23|$#,)! +3 f19 (23|@5|0@0@9&#,23|$#,)! +3 f23 (23|@5|0@0@9&#,23|$#,)! +3 f0 (23|@5|0@5@7&#,23|$#,)! +3 f19 (23|@5|0@5@7&#,23|$#,)! +3 f23 (23|@5|0@5@7&#,23|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f621 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f0 (5|$#,)! +3 f19 (5|$#,)! +3 f23 (5|$#,)! +3 f0 (23|$#,)! +3 f63 (23|$#,)! +0 s12|& +0 s13|-1 639 -1 +3 Stm{5|@1|^#tm_sec,5|@1|^#tm_min,5|@1|^#tm_hour,5|@1|^#tm_mday,5|@1|^#tm_mon,5|@1|^#tm_year,5|@1|^#tm_wday,5|@1|^#tm_yday,5|@1|^#tm_isdst,}! +3 f0 ()! +3 f630 ()! +3 f0 (631|$#,631|$#,)! +3 f17 (631|$#,631|$#,)! +3 f0 (445|$#,)! +3 f631 (445|$#,)! +1 t631|631& +3 f0 (639|4@5@7&#,)! +3 f631 (639|4@5@7&#,)! +3 f0 (445|$#,)! +3 f19 (445|$#,)! +3 f23 (445|$#,)! +3 f0 (639|$#,)! +3 f19 (639|$#,)! +3 f23 (639|$#,)! +3 f0 (639|$#,)! +3 f19 (639|$#,)! +3 f445 (639|$#,)! +3 f0 (639|$#,)! +3 f19 (639|$#,)! +3 f445 (639|$#,)! +3 f0 (23|4@0@7&#,63|$#,23|$#,445|$#,)! +3 f63 (23|4@0@7&#,63|$#,23|$#,445|$#,)! +0 s14|& +0 s15|-1 -1 876 +0 s16|& +0 s17|& +0 s18|& +0 s19|& +0 s20|& +0 s21|& +0 a28|-1 667 -1 +3 Sdirent{42|@1|^#d_name,}! +0 s673|-1 675 -1 +1 t664|664& +3 f0 (667|$#,)! +3 f5 (667|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f667 (23|$#,)! +3 f0 (667|$#,)! +3 f19 (667|$#,)! +1 t666|666& +3 f675 (667|$#,)! +3 f0 (667|$#,)! +3 f1 (667|$#,)! +3 Sflock{7|@1|^#l_type,7|@1|^#l_whence,661|@1|^#l_start,661|@1|^#l_len,662|@1|^#l_pid,}! +0 s681|& +3 f0 (23|$#,659|$#,)! +3 f5 (23|$#,659|$#,)! +3 f0 (5|$#,5|$#,!.,)! +3 f5 (5|$#,5|$#,!.,)! +3 f0 (23|$#,5|$#,!.,)! +3 f5 (23|$#,5|$#,!.,)! +3 Sgroup{23|@1|0@0@3&#gr_name,657|@1|^#gr_gid,315|@1|0@0@3&#gr_mem,}! +0 s677|-1 691 -1 +3 f0 (657|$#,)! +3 f19 (657|$#,)! +1 t688|688& +3 f691 (657|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f691 (23|$#,)! +3 Spasswd{23|@1|0@0@3&#pw_name,663|@1|^#pw_uid,657|@1|^#pw_gid,23|@1|0@0@3&#pw_dir,23|@1|0@0@3&#pw_shell,}! +0 s682|-1 700 -1 +3 f0 (23|$#,)! +3 f19 (23|$#,)! +1 t697|697& +3 f700 (23|$#,)! +3 f0 (663|$#,)! +3 f19 (663|$#,)! +3 f700 (663|$#,)! +0 a29|& +3 f0 (705|$#,5|$#,)! +3 f1 (705|$#,5|$#,)! +3 f0 (705|4@0@7&#,5|$#,)! +3 f5 (705|4@0@7&#,5|$#,)! +0 a1|-1 722 -1 +3 ?! +3 f711 ()! +3 f1 ()^714 +1 t713|713& +3 Ssigaction{!714$$$@0#sa_handler,710|@1|0@0@3&#sa_mask,5|@1|^#sa_flags,}! +0 s678|-1 719 -1 +3 f0 (662|$#,5|$#,)! +3 f5 (662|$#,5|$#,)! +1 t716|716& +3 f0 (5|$#,719|$#,719|4@5@7&#,)! +3 f5 (5|$#,719|$#,719|4@5@7&#,)! +1 t710|710& +3 f0 (722|$#,5|$#,)! +3 f5 (722|$#,5|$#,)! +3 f0 (722|$#,5|$#,)! +3 f5 (722|$#,5|$#,)! +3 f0 (722|4@0@7&#,)! +3 f5 (722|4@0@7&#,)! +3 f0 (722|4@0@7&#,)! +3 f5 (722|4@0@7&#,)! +3 f0 (722|$#,5|$#,)! +3 f5 (722|$#,5|$#,)! +3 f0 (722|4@0@7&#,)! +3 f5 (722|4@0@7&#,)! +3 f0 (5|$#,722|0@5@7&#,722|4@5@7&#,)! +3 f5 (5|$#,722|0@5@7&#,722|4@5@7&#,)! +3 f0 (722|$#,)! +3 f5 (722|$#,)! +3 f0 (5|$#,23|$#,)! +3 f19 (5|$#,23|$#,)! +3 f213 (5|$#,23|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 Sstat{659|@1|^#st_mode,658|@1|^#st_ino,656|@1|^#st_dev,660|@1|^#st_nlink,663|@1|^#st_uid,657|@1|^#st_gid,661|@1|^#st_size,631|@1|^#st_st_atime,631|@1|^#st_st_mtime,631|@1|^#st_st_ctime,}! +0 s685|-1 758 -1 +3 f0 (659|@7|$#,)! +3 f2 (659|@7|$#,)! +3 f0 (659|@7|$#,)! +3 f2 (659|@7|$#,)! +3 f0 (659|@7|$#,)! +3 f2 (659|@7|$#,)! +3 f0 (659|@7|$#,)! +3 f2 (659|@7|$#,)! +3 f0 (659|@7|$#,)! +3 f2 (659|@7|$#,)! +3 f0 (23|$#,659|$#,)! +3 f5 (23|$#,659|$#,)! +1 t745|745& +3 f0 (5|$#,758|4@0@7&#,)! +3 f5 (5|$#,758|4@0@7&#,)! +3 f0 (23|$#,659|$#,)! +3 f5 (23|$#,659|$#,)! +3 f0 (23|$#,659|$#,)! +3 f5 (23|$#,659|$#,)! +3 f0 (23|$#,758|4@0@7&#,)! +3 f5 (23|$#,758|4@0@7&#,)! +3 f0 (659|$#,)! +3 f5 (659|$#,)! +3 Stms{630|@1|^#tms_utime,630|@1|^#tms_stime,630|@1|^#tms_cutime,630|@1|^#tms_cstime,}! +0 s679|-1 771 -1 +1 t770|770& +3 f0 (771|4@0@7&#,)! +3 f630 (771|4@0@7&#,)! +3 Sutsname{42|@1|^#sysname,42|@1|^#nodename,42|@1|^#release,42|@1|^#version,42|@1|^#machine,}! +0 s683|-1 776 -1 +1 t775|775& +3 f0 (776|4@0@7&#,)! +3 f5 (776|4@0@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (24|4@5@7&#,)! +3 f662 (24|4@5@7&#,)! +3 f0 (662|$#,24|4@0@7&#,5|$#,)! +3 f662 (662|$#,24|4@0@7&#,5|$#,)! +3 C0.4/8|! +3 C0.3/8|! +0 s32|& +3 C0.9/9|! +3 C0.10/9|! +0 s33|& +0 s34|& +3 Stermios{801|@1|^#c_iflag,801|@1|^#c_oflag,801|@1|^#c_cflag,801|@1|^#c_lflag,797|@1|^#c_cc,}! +0 s680|-1 804 -1 +1 t803|803& +3 f0 (804|$#,)! +3 f800 (804|$#,)! +3 f0 (804|$#,)! +3 f800 (804|$#,)! +3 f0 (804|$#,)! +3 f5 (804|$#,)! +3 f0 (804|$#,)! +3 f5 (804|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,804|4@0@7&#,)! +3 f5 (5|$#,804|4@0@7&#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,5|$#,804|$#,)! +3 f5 (5|$#,5|$#,804|$#,)! +3 f0 ()! +3 f1 ()! +3 f0 (5|$#,)! +3 f1 (5|$#,)! +3 f0 (23|$#,5|$#,)! +3 f5 (23|$#,5|$#,)! +3 f0 (6|$#,)! +3 f6 (6|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,663|$#,657|$#,)! +3 f5 (23|$#,663|$#,657|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|@5|4@5@7&#,)! +3 f19 (23|@5|4@5@7&#,)! +3 f23 (23|@5|4@5@7&#,)! +3 f0 (23|4@5@7&#,)! +3 f19 (23|4@5@7&#,)! +3 f23 (23|4@5@7&#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +2 y19|19& +2 y23|23& +3 f0 (23|$#,856|$#,)! +3 f5 (23|$#,856|$#,)! +3 f0 (23|$#,856|$#,315|$#,)! +3 f5 (23|$#,856|$#,315|$#,)! +3 f0 (23|$#,856|$#,)! +3 f5 (23|$#,856|$#,)! +3 f0 ()! +3 f662 ()! +3 f0 (5|$#,5|$#,)! +3 f9 (5|$#,5|$#,)! +3 f0 (23|@5|4@0@7&#,63|$#,)! +3 f19 (23|@5|4@0@7&#,63|$#,)! +3 f23 (23|@5|4@0@7&#,63|$#,)! +3 f0 ()! +3 f657 ()! +3 f0 ()! +3 f663 ()! +3 f0 ()! +3 f657 ()! +2 y657|657& +3 f0 (5|$#,876|4@0@7&#,)! +3 f5 (5|$#,876|4@0@7&#,)! +3 f0 ()! +3 f19 ()! +3 f23 ()! +3 f0 ()! +3 f662 ()! +3 f0 ()! +3 f662 ()! +3 f0 ()! +3 f662 ()! +3 f0 ()! +3 f663 ()! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (5|$#,661|$#,5|$#,)! +3 f661 (5|$#,661|$#,5|$#,)! +3 f0 (23|$#,5|$#,)! +3 f9 (23|$#,5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (43|4@0@7&#,)! +3 f5 (43|4@0@7&#,)! +3 f0 (5|$#,20|4@0@7&#,63|$#,)! +3 f64 (5|$#,20|4@0@7&#,63|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (657|$#,)! +3 f5 (657|$#,)! +3 f0 (662|$#,662|$#,)! +3 f5 (662|$#,662|$#,)! +3 f0 ()! +3 f662 ()! +3 f0 (663|$#,)! +3 f5 (663|$#,)! +3 f0 (6|$#,)! +3 f6 (6|$#,)! +3 f0 (5|$#,)! +3 f9 (5|$#,)! +3 f0 (5|$#,)! +3 f662 (5|$#,)! +3 f0 (5|$#,662|$#,)! +3 f5 (5|$#,662|$#,)! +3 f0 (5|$#,)! +3 f19 (5|$#,)! +3 f23 (5|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (5|$#,20|$#,63|$#,)! +3 f64 (5|$#,20|$#,63|$#,)! +3 Sutimbuf{631|@1|^#actime,631|@1|^#modtime,}! +0 s674|-1 931 -1 +1 t930|930& +3 f0 (23|$#,931|0@5@7&#,)! +3 f5 (23|$#,931|0@5@7&#,)! +;;tistable +0 +0,24 +24 +0,24,25 +25 +0,24,25,26 +26 +0,24,25,26,27 +27 +28 +28,29 +29 +28,29,1 +1 +;;symTable +*0 (Datatype) +0@+@=@0@0@0@0@67#mbstate_t +0@+@=@0@0@0@0@710#sigset_t +2@-@-@0@0@0@0@2#lltX_bool +13@-@-@0@0@0@0@59#__SIZE_TYPE__ +13@-@-@0@0@0@0@60#__PTRDIFF_TYPE__ +13@-@-@0@0@0@0@61#__WCHAR_TYPE__ +13@-@-@0@0@0@0@62#ptrdiff_t +13@-@-@0@0@0@0@65#wchar_t +13@-@-@0@0@0@0@66#wint_t +13@-@-@0@0@0@0@178#sig_atomic_t +13@-@-@0@0@0@0@504#wctype_t +13@-@-@0@0@0@0@505#wctrans_t +13@-@-@0@0@0@0@630#clock_t +13@-@-@0@0@0@0@631#time_t +13@-@-@0@0@0@0@656#dev_t +13@-@-@0@0@0@0@657#gid_t +13@-@-@0@0@0@0@658#ino_t +13@-@-@0@0@0@0@659#mode_t +13@-@-@0@0@0@0@660#nlink_t +13@-@-@0@0@0@0@661#off_t +13@-@-@0@0@0@0@662#pid_t +13@-@-@0@0@0@0@663#uid_t +14@-@-@0@0@0@0@63#size_t +15@-@-@0@0@0@0@64#ssize_t +20@+@+@0@0@0@0@173#jmp_buf +20@+@+@0@0@0@0@206#va_list +20@+@+@0@0@0@0@211#FILE +20@+@+@0@0@0@0@212#fpos_t +20@+@+@0@0@0@0@664#DIR +20@+@+@0@0@0@0@705#sigjmp_buf +367@-@-@0@0@0@0@369#div_t +374@-@-@0@0@0@0@376#ldiv_t +796@-@-@0@0@0@0@797#cc_t +799@-@-@0@0@0@0@800#speed_t +799@-@-@0@0@0@0@801#tcflag_t +*1 (Constant) +0@i0@0@6#NULL +2@i1@0@0#TRUE +2@i0@0@6#FALSE +3$#UCHAR_MAX#UCHAR_MIN +4$#CHAR_MAX#CHAR_MIN#SCHAR_MAX#SCHAR_MIN +5$#B0#B110#B1200#B134#B150#B1800#B19200#B200#B2400#B300#B38400#B4800#B50#B600#B75#B9600#BRKINT#BUFSIZ#CHAR_BIT#CLK_TCK#CLOCAL#CLOCKS_PER_SEC#CREAD#CS5#CS6#CS7#CS8#CSIZE#CSTOPB#E2BIG#EACCES#EAGAIN#EBADF#EBUSY#ECHILD#ECHO#ECHOE#ECHOK#ECHONL#EDEADLK#EDOM#EEXIST#EFAULT#EFBIG#EILSEQ#EINTR#EINVAL#EIO#EISDIR#EMFILE#EMLINK#ENAMETOOLONG#ENFILE#ENODEV#ENOENT#ENOEXEC#ENOLCK#ENOMEM#ENOSPC#ENOSYS#ENOTDIR#ENOTEMPTY#ENOTTY#ENXIO#EOF#EPERM#EPIPE#ERANGE#EROFS#ESPIPE#ESRCH#EXDEV#EXIT_FAILURE#EXIT_SUCCESS#FD_CLOEXEC#FILENAME_MAX#FLT_RADIX#FOPEN_MAX#F_DUPFD#F_GETFD#F_GETFL#F_GETLK#F_OK#F_RDLCK#F_SETFD#F_SETFL#F_SETLK#F_SETLKW#F_UNLCK#F_WRLCK#HUPCL#ICANON#ICRNL#IEXTEN#IGNBRK#IGNCR#IGNLCR#IGNPAR#INPCK#INT_MAX#INT_MIN#ISIG#ISTRIP#IXOFF#IXON#LC_ALL#LC_COLLATE#LC_CTYPE#LC_MONETARY#LC_NUMERIC#LC_TIME#L_ctermid#L_cuserid#L_tmpnam#NCCS#NOFLSH#OPOST#O_ACCMODE#O_APPEND#O_CREAT#O_EXCL#O_NOCTTY#O_NONBLOCK#O_RDONLY#O_RDWR#O_TRUNC#O_WRONLY#PARENB#PARMRK#PARODD#RAND_MAX#R_OK#SA_NOCLDSTOP#SEEK_CUR#SEEK_END#SEEK_SET#SIGABRT#SIGALRM#SIGCHLD#SIGCONT#SIGFPE#SIGHUP#SIGILL#SIGINT#SIGKILL#SIGPIPE#SIGQUIT#SIGSEGV#SIGSTOP#SIGTERM#SIGTSTP#SIGTTIN#SIGTTOU#SIGUSR1#SIGUSR2#SIG_BLOCK#SIG_SETMASK#SIG_UNBLOCK#STDERR_FILENO#STDIN_FILENO#STDOUT_FILENO#S_IRGRP#S_IROTH#S_ISGID#S_ISUID#S_IUSR#S_IWGRP#S_IWOTH#S_IWUSR#S_IWXG#S_IWXO#S_IWXU#S_IXGRP#S_IXOTH#S_IXUSR#TCIFLUSH#TCIOFF#TCIOFLUSH#TCION#TCOFLUSH#TCSADRAIN#TCSAFLUSH#TCSANOW#TMP_MAX#TOSTOP#VEOF#VEOL#VERASE#VINTR#VKILL#VMIN#VQUIT#VSTART#VSTOP#VSUSP#VTIME#WCHAR_MAX#WCHAR_MIN#WUNTRACED#W_OK#X_OK#_IOFBF#_IOLBF#_IONBF#_PC_CHOWN_RESTRUCTED#_PC_MAX_CANON#_PC_MAX_INPUT#_PC_NAME_MAX#_PC_NO_TRUNC#_PC_PATH_MAX#_PC_PIPE_BUF#_PC_VDISABLE#_POSIX_CHOWN_RESTRICTED#_POSIX_JOB_CONTROL#_POSIX_NO_TRUNC#_POSIX_SAVED_IDS#_POSIX_VDISABLE#_POSIX_VERSION#_SC_ARG_MAX#_SC_CHILD_MAX#_SC_CLK_TCK#_SC_JOB_CONTROL#_SC_NGROUPS_MAX#_SC_OPEN_MAX#_SC_SAVED_IDS#_SC_STREAM_MAX#_SC_TZNAME_MAX#_SC_VERSION#__INCLUDE_LEVEL__#__LCLINT__#__LINE__ +6$#UINT_MAX +7$#SHRT_MAX#SHRT_MIN +8$#USHRT_MAX +9$#ARG_MAX#CHILD_MAX#LINK_MAX#LONG_MAX#LONG_MIN#MAX_CANON#MAX_INPUT#MB_LEN_MAX#NAME_MAX#NGROUPS_MAX#OPEN_MAX#PIPE_BUF#SSIZE_MAX#STREAM_MAX#TZNAME_MAX#_POSIX_ARG_MAX#_POSIX_CHILD_MAX#_POSIX_LINK_MAX#_POSIX_MAX_CANON#_POSIX_MAX_INPUT#_POSIX_NAME_MAX#_POSIX_NGROUPS_MAX#_POSIX_OPEN_MAX#_POSIX_PATH_MAX#_POSIX_PIPE_BUF#_POSIX_SSIZE#_POSIX_STREAM#_POSIX_TZNAME_MAX +10$#ULONG_MAX +17$#HUGE_VAL +23$#__BASE_FILE__#__DATE__#__FILE__#__REGISTER_PREFIX__#__TIME__#__USER_LABEL_PREFIX__#__VERSION__ +2$#NDEBUG +63$#MB_CUR_MAX +66$#WEOF +182$#SIG_DFL +186$#SIG_ERR +190$#SIG_IGN +*3 (Variable) +5|@1|0@0@0@0@1#DBL_DIG#DBL_MANT_DIG#DBL_MAX_10_EXP#DBL_MAX_EXP#DBL_MIN_10_EXP#DBL_MIN_EXP#FLT_DIG#FLT_MANT_DIG#FLT_MAX_10_EXP#FLT_MAX_EXP#FLT_MIN_10_EXP#FLT_MIN_EXP#FLT_ROUNDS#LDBL_DIG#LDBL_MANT_DIG#LDBL_MAX_10_EXP#LDBL_MAX_EXP#LDBL_MIN_10_EXP#LDBL_MIN_EXP#errno +16|@1|0@0@0@0@1#FLT_EPSILON#FLT_MAX#FLT_MIN +17|@1|0@0@0@0@1#DBL_EPSILON#DBL_MAX#DBL_MIN +18|@1|0@0@0@0@1#LDBL_EPSILON#LDBL_MAX#LDBL_MIN +213|@1|0@0@0@0@1#stderr#stdin#stdout +315|@1|0@0@0@0@1#environ +*4 (Function) +364$@0@g341@0@0@1@tp0,g341$@0#qsort +177@6@0@5@0@0@1@@1@s0$@0#longjmp +208$@0@@1@p0$@0#va_start +235$@0@s3@1@s3,tp0,tp1$@0#setbuf +707@6@0@5@0@0@1@@1@s0$@0#siglongjmp +828@6@0@6@0@0@1@@1@s0$@0#_exit#exit +325$@0@s1@1@s1$@0#srand +336$@0@@1@tp0$@0#free +307$@1@g341@0@0,g351@0@0,s3@1@s3,tg351$@0#perror +210$@0@@1@p0$@0#va_end +301$@0@@1@tp0$@0#clearerr#rewind +678$@1@@1@s0$@0#rewinddir +72@6@0@8@0@0@1@@1@s0$@0#assert +826$@1@g354@0@0,s1@1@s1$@0#tzset +338@6@0@6@0@0@1@@1@s0$@0#abort +237$@0@s3@1@s3,tp0,tp1$@0#setvbuf +423$@0@@1@tp0$@0#vswprintf +415@6@0@1@1@0@0@@1@tp0$@0#swprintf +824$@0@g341@0@0@1@g341$@0#tcsetattr +684$@0@g341@0@0@1@g341$@0#fcntl +721$@0@g341@0@0,s1@1@tp2,g341,s1$@0#sigaction +736$@0@g341@0@0,s1@1@tp2,g341,s1$@0#sigprocmask +590$@1@@1@s0$@0#memcmp +686$@0@g341@0@0@1@g341$@0#open +596$@1@@1@s0$@0#strncmp +850@6@0@5@0@0@0@g341@0@0@1@g341$@0#execl#execle#execlp +836$@0@s3,g341@0@0@1@s3,g341$@0#chown +860@6@0@5@0@0@0@g341@0@0@1@g341$@0#execve +253@6@0@1@2@0@1@@1@s0$@0#sscanf +259$@0@@1@tp0,p2$@0#vsprintf +293$@0@s3,g341@0@0@1@s3,tp0,g341$@0#fseek +255$@0@s3,g341@0@0@1@s3,tp0,p2,g341$@0#vfprintf +243@6@0@1@2@0@0@s3@1@s3,tp0$@0#fscanf +421$@0@s3@1@s3,tp0$@0#vfwprintf +394@6@0@1@1@0@0@s3@1@tp0,s3$@0#fwprintf +396@6@0@1@2@0@0@s3@1@tp0,s3$@0#fwscanf +455$@1@@1@s0$@0#wcsncmp#wmemcmp +417@6@0@1@2@0@0@g352@0@0@1@tg352$@0#swscanf +562$@0@@1@tp0$@0#mbtowc +846$@0@g341@0@0,s3@1@g341,s3$@0#dup2 +816$@0@g341@0@0@1@g341$@0#tcflow#tcflush#tcsendbreak +921$@0@g341@0@0,s1@1@g341,s1$@0#tcsetpgrp +760$@0@g341@0@0@1@g341,tp1$@0#fstat +820$@0@g341@0@0@1@g341,tp1$@0#tcgetattr +878$@0@g341@0@0@1@g341,ap1$@0#getgroups +830$@0@g341@0@0@1@g341$@0#access +592$@1@@1@s0$@0#strcmp#strcoll +893$@0@g341@0@0,s3@1@g341,s3$@0#link#rename +560$@1@@1@s0$@0#mblen +257$@1@g353@0@0,s3@1@s3,p1,tg353$@0#vprintf +269$@0@s3@1@s3,tp1$@0#fputs +757$@0@s3,g341@0@0@1@s3,g341$@0#chmod#mkdir#mkfifo +682$@0@g341@0@0@1@g341$@0#creat +766$@0@g341@0@0@1@g341,tp1$@0#stat +858@6@0@5@0@0@0@g341@0@0@1@g341$@0#execv#execvp +933$@0@s3,g341@0@0@1@s3,g341$@0#utime +248@6@0@1@2@0@1@g352@0@0,s3@1@s3,tg352$@0#scanf +564$@0@@1@tp0$@0#wctomb +392$@1@@1@s0$@0#fwide +295$@0@s3,g341@0@0@1@s3,tp0,g341$@0#fsetpos +291$@0@g341@0@0@1@tp1,g341$@0#fgetpos +425$@0@s3,g353@0@0@1@s3,tg353$@0#vwprintf +390$@0@s3@1@s3,tp1$@0#fputws +436$@1@@1@s0$@0#wcscmp#wcscoll +503@6@0@1@2@0@1@g352@0@0,g341@0@0@1@g341,tg352$@0#wscanf +501@6@0@1@1@0@1@g353@0@0,g341@0@0@1@g341,tg353$@0#wprintf +718@6@0@5@0@0@0@g341@0@0@1@g341$@0#kill +909$@0@g341@0@0,s1@1@g341,s1$@0#setpgid +709$@0@@1@p0$@0#sigsetjmp +724$@0@g341@0@0@1@tp0,g341$@0#sigaddset#sigdelset +732$@0@g341@0@0@1@g341$@0#sigismember +267$@0@s3,g341@0@0@1@s3,tp1,g341$@0#fputc#ungetc +278$@0@s3@1@s3,tp1$@0#putc +838$@0@s3,g341@0@0,s1@1@s3,g341,s1$@0#close +848$@0@g341@0@0,s3@1@g341,s3$@0#dup +814$@0@g341@0@0@1@g341$@0#tcdrain +780$@1@@1@s0$@0#WEXITSTATUS#WIFEXITED#WIFSIGNALED#WIFSTOPPED#WSTOPSIG#WTERMSIG#abs#isatty +205@6@0@5@0@0$$@0#raise +215$@0@s3,g341@0@0@1@s3,g341$@0#remove#rmdir#unlink +834$@0@g341@0@0@1@g341$@0#chdir +282$@1@g353@0@0,s3@1@s3,tg353$@0#puts +311$@1@@1@s0$@0#atoi +351$@0@s3@1@s3$@0#system +901$@0@g341@0@0@1@g341$@0#pipe +485$@1@@1@s0$@0#wctob +175$@0@@1@p0$@0#setjmp +225$@0@g341@0@0,s3@1@tp0,g341,s3$@0#fclose#fgetc +303$@0@g341@0@0@1@g341$@0#feof#ferror#fileno +271$@0@s3@1@s3,tp0$@0#getc +227$@0@g341@0@0,s3@1@tp0,g341,s3$@0#fflush +346$@0@s1@1@s1$@0#atexit +407$@1@@1@s0$@0#mbsinit +907$@0@g341@0@0,s1@1@g341,s1$@0#setgid +768$@0@s1@1@s1$@0#umask +913$@0@g341@0@0,s1@1@g341,s1$@0#setuid +669$@0@g341@0@0@1@g341$@0#closedir +738$@0@g341@0@0,s1@1@g341,s1$@0#sigsuspend +728$@0@g341@0@0@1@tp0,g341$@0#sigemptyset#sigfillset#sigpending +778$@0@g341@0@0@1@tp0,g341$@0#uname +810$@0@@1@tp0$@0#cfsetispeed#cfsetospeed +280$@1@g353@0@0,s3@1@s3,tg353$@0#putchar +323$@0@s1@1@s1$@0#rand +273$@1@g352@0@0,s3@1@s3,tg352$@0#getchar +899$@0@g341@0@0@1@g341$@0#pause +832$@0@s1@1@s1$@0#alarm +915$@1@@1@s0$@0#sleep +319$@0@g341@0@0@1@tp1,g341$@0#strtol +479$@0@@1@tp1$@0#wcstol +866$@0@g341@0@0@1@g341$@0#fpathconf +897$@0@g341@0@0@1@g341$@0#pathconf +917$@0@g341@0@0@1@g341$@0#sysconf +373$@1@@1@s0$@0#labs +313$@1@@1@s0$@0#atol +297$@0@g341@0@0@1@g341$@0#ftell +321$@0@g341@0@0@1@tp1,g341$@0#strtoul +481$@0@@1@tp1$@0#wcstoul +152$@0@g341@0@0@1@g341$@0#ldexp +142$@1@@1@s0$@0#atan2#fmod +160$@0@g341@0@0@1@g341$@0#pow +154$@0@@1@tp1$@0#frexp +170$@0@@1@tp1$@0#modf +317$@0@g341@0@0@1@tp1,g341$@0#strtod +474$@0@@1@tp1$@0#wcstod +636$@1@@1@s0$@0#difftime +138$@0@g341@0@0@1@g341$@0#acos#asin#cosh#exp#log#log10#sqrt +140$@1@@1@s0$@0#atan#ceil#cos#fabs#floor#sin#sinh#tan#tanh +309$@1@@1@s0$@0#atof +358@6@5@1@0@0@1@@1@s0@18@0@0#bsearch +601@6@5@1@0@0@1@@1@s0@3@0@0#memchr +334@6@5@1@0@0@0@@1@tp0@2@0@0#realloc +328@6@5@1@0@0@1@@1@s0@2@0@0#calloc +331@4@5@1@0@0@1@@1@s0@2@0@0#malloc +264@6@5@1@0@0@0@s3,g341@0@0@1@s3,tp0,tp2,g341$@0#fgets +124@6@5@1@0@0@0@s1,g341@0@0@1@s1,g341@19@3@0#setlocale +609@6@5@1@0@0@1@@1@s0@19@2@0#strpbrk +604@6@5@1@0@0@1@@1@s0@19@2@0#strchr#strrchr +620@6@5@1@0@0@0@s1,g341@0@0@1@tp0,s1,g341@19@2@0#strtok +617@6@5@1@0@0@1@@1@s0@19@2@0#strstr +869$@0@g341@0@0@1@g341,tp0$@0#getcwd +627$@1@@1@s0@19@3@0#strerror +924@6@5@1@0@0@0@g341@0@0@1@g341@19@3@0#ttyname +349@6@5@1@0@0@1@@1@s0@19@3@0#getenv +276@6@5@1@0@0@1@g352@0@0,s3,g341@0@0@1@s3,tp0,tg352,g341@3@0@0#gets +844$@0@@1@tp0@3@0@0#cuserid +841$@0@s1@1@tp0,s1$@0#ctermid +223$@0@s1@1@tp0,s1@19@3@0#tmpnam +644$@0@g341@0@0@1@g341@19@3@0#asctime +647$@1@@1@s0@19@3@0#ctime +881$@1@@1@s0@19@3@0#getlogin +747$@1@@1@s0$@0#S_ISBLK#S_ISCHR#S_ISDIR#S_ISFIFO#S_ISREG +288$@0@s3,g341@0@0@1@s3,tp3,g341$@0#fwrite +286$@0@s3,g341@0@0@1@s3,tp0,tp3,g341$@0#fread +467$@0@@1@tp1$@0#wcsrtombs +655$@0@@1@tp0$@0#strftime +405$@0@@1@tp0$@0#mbrtowc +409$@0@@1@tp0$@0#mbsrtowcs +447$@0@@1@tp0$@0#wcsftime +403$@1@@1@s0$@0#mbrlen +568$@0@@1@tp0$@0#wcstombs +598$@0@@1@tp0$@0#strxfrm +427$@0@@1@tp0$@0#wcrtomb +483$@0@@1@tp0$@0#wcsxfrm +566$@0@@1@tp0$@0#mbstowcs +606$@1@@1@s0$@0#strcspn#strspn +443$@1@@1@s0$@0#wcscspn#wcsspn +629$@1@@1@s0$@0#strlen +449$@1@@1@s0$@0#wcslen +928$@0@g341@0@0@1@g341$@0#write +903$@0@g341@0@0@1@g341,tp1$@0#read +388$@0@s3@1@s3,tp1$@0#fputwc +411$@0@s3@1@s3,tp1$@0#putwc +419$@0@s3@1@s3,tp1$@0#ungetwc +380$@1@@1@s0$@0#btowc +413$@0@s3,g353@0@0@1@s3,tg353$@0#putwchar +382$@0@s3@1@s3,tp0$@0#fgetwc +398$@0@s3@1@s3,tp0$@0#getwc +400$@0@s3,g352@0@0@1@s3,tg352$@0#getwchar +128$@1@@1@s0@3@0@0#localeconv +233@6@5@1@0@0@0@s3,g341@0@0@1@tp2,s3,g341@3@0@0#freopen +741@6@5@1@0@0@0@g341@0@0,s3@1@g341,s3@18@0@0#fdopen +230@6@5@1@0@0@0@s3@1@s3@18@0@0#fopen +220@6@5@1@0@0@0@s3@1@s3@3@0@0#tmpfile +371$@1@@1@s0$@0#div +378$@1@@1@s0$@0#ldiv +488@6@5@1@0@0@1@@1@s0@3@0@0#wmemchr +386@6@5@1@0@0@0@s3@1@s3,tp0,tp2$@0#fgetws +499$@0@@1@tp0$@0#wmemset +493$@0@@1@tp0$@0#wmemcpy#wmemmove +477@6@5@1@0@0@0@@1@tp2@3@0@0#wcstok +472@6@5@1@0@0@1@@1@s0@3@0@0#wcsstr +464@6@5@1@0@0@1@@1@s0$@0#wcsrchr +434@6@5@1@0@0@1@@1@s0@19@2@0#wcschr +461@6@5@1@0@0@1@@1@s0$@0#wcspbrk +653@6@5@1@0@0@0@g341@0@0@1@g341@19@3@0#localtime +650@6@5@1@0@0@1@@1@s0@19@3@0#gmtime +558$@1@@1@s0$@0#wctype +556$@1@@1@s0$@0#wctrans +773$@0@@1@tp0$@0#times +634$@0@s1@1@s1$@0#clock +638$@1@@1@s0$@0#mktime +641$@0@@1@tp0$@0#time +871$@1@@1@s0$@0#getegid#getgid +895$@0@g341@0@0@1@g341$@0#lseek +794$@0@g341@0@0@1@tp1,g341$@0#waitpid +919$@0@g341@0@0@1@g341$@0#tcgetpgrp +792$@0@g341@0@0@1@tp0,g341$@0#wait +864$@0@s3,g341@0@0@1@s3,g341$@0#fork +883$@1@@1@s0$@0#getpgrp#getpid#getppid#setsid +873$@1@@1@s0$@0#geteuid#getuid +672@6@5@1@0@0@0@g341@0@0@1@g341@3@0@0#opendir +676@6@5@1@0@0@0@g341@0@0@1@g341@3@0@0#readdir +695@6@5@1@0@0@0@g341@0@0@1@g341@3@0@0#getgrnam +692@6@5@1@0@0@0@g341@0@0@1@g341@3@0@0#getgrgid +701@6@5@1@0@0@0@g341@0@0@1@g341@19@3@0#getpwnam +704@6@5@1@0@0@0@g341@0@0@1@g341@19@3@0#getpwuid +806$@1@@1@s0$@0#cfgetispeed#cfgetospeed +203@6@5@1@0@0@0@s1,g341@0@0@1@s1,g341$@0#signal +624$@0@@1@tp0$@0#memset +575$@0@@1@tp0$@0#memmove +572$@0@@1@tp0$@0#memcpy +588$@0@@1@tp0$@0#strncat +582$@0@@1@tp0$@0#strncpy +585$@0@@1@tp0$@0#strcat#strcpy +453$@0@@1@tp0$@0#wcsncat#wcsncpy +431$@0@@1@tp0$@0#wcscat#wcscpy +518$@1@@1@s0$@0#iswctype +509$@1@@1@s0$@0#iswalnum#iswalpha#iswcntrl#iswdigit#iswgraph#iswlower#iswprint#iswpunct#iswspace#iswupper#iswxdigit +77$@1@@1@s0$@0#isalnum#isalpha#iscntrl#isdigit#isgraph#islower#isprint#ispunct#isspace#isupper#isxdigit +116$@1@@1@s0$@0#tolower#toupper +251@6@0@1@1@0@0@@1@tp0$@0#sprintf +241@6@0@1@1@0@0@s3@1@s3,tp0$@0#fprintf +246@6@0@1@1@0@1@g353@0@0,s3@1@s3,tg353$@0#printf +548$@1@@1@s0$@0#towctrans +551$@1@@1@s0$@0#towlower#towupper +*7 (Struct tag) +665@666#@dirent +929@930#@utimbuf +367@368#@!2 +374@375#@!3 +687@688#@group +715@716#@sigaction +769@770#@tms +802@803#@termios +679@680#@flock +696@697#@passwd +774@775#@utsname +632@444#@tm +744@745#@stat +120@121#@lconv +;; Modules access +ansi#8@ +posix#13@ +;;End diff --git a/lib/posixstrict.lcd b/lib/posixstrict.lcd new file mode 100644 index 0000000..8008944 --- /dev/null +++ b/lib/posixstrict.lcd @@ -0,0 +1,1234 @@ +;;LCLint Dump: posixstrict.lcd +;;LCLint 2.5m --- 20 May 2000 +;;lib:166 +;;ctTable +0 u-2 19 38 +0 p1|-2 20 39 +0 b-2 21 40 +0 p3|-2 22 41 +0 p4|-2 23 42 +0 p5|-2 24 43 +0 p6|-2 25 44 +0 p7|-2 26 45 +0 p8|-2 27 46 +0 p9|-2 28 47 +0 p10|-2 29 48 +0 p11|-2 30 49 +0 p12|-2 31 50 +0 p13|-2 32 51 +0 p14|-2 33 52 +0 p15|-2 34 53 +0 p16|-2 35 54 +0 p17|-2 36 55 +0 p18|-2 37 56 +1 t0|0 288 816 +1 t1|1& +1 t2|2& +1 t3|3& +1 t4|4 289 817 +1 t5|5& +1 t6|6& +1 t7|7& +1 t8|8& +1 t9|9& +1 t10|10& +1 t11|11& +1 t12|12& +1 t13|13& +1 t14|14& +1 t15|15& +1 t16|16& +1 t17|17& +1 t18|18& +2 y0|0& +2 y1|1& +2 y2|2& +2 y3|3& +2 y4|4& +2 y5|5& +2 y6|6& +2 y7|7& +2 y8|8& +2 y9|9& +2 y10|10& +2 y11|11& +2 y12|12& +2 y13|13& +2 y14|14& +2 y15|15& +2 y16|16& +2 y17|17& +2 y18|18& +-2 ?! +0 s2|& +0 s3|& +0 s4|& +0 s5|& +0 s6|& +0 s22|& +0 s23|& +0 s7|-1 357 -1 +0 s8|& +0 a0|-1 375 -1 +3 C0.5/20|! +3 C0.68/2|! +3 f0 (2|@7|$#,)! +3 f1 (2|@7|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f4 (3|$#,)! +3 f0 (3|$#,)! +3 f4 (3|$#,)! +3 Slconv{23|@1|0@0@3&#decimal_point,23|@1|0@0@3&#thousands_sep,23|@1|0@0@3&#grouping,23|@1|0@0@3&#int_curr_symbol,23|@1|0@0@3&#currency_symbol,23|@1|0@0@3&#mon_decimal_point,23|@1|0@0@3&#mon_thousands_sep,23|@1|0@0@3&#mon_grouping,23|@1|0@0@3&#positive_sign,23|@1|0@0@3&#negative_sign,4|@1|^#int_frac_digits,4|@1|^#frac_digits,4|@1|^#p_cs_precedes,4|@1|^#p_sep_by_space,4|@1|^#n_cs_precedes,4|@1|^#n_sep_by_space,4|@1|^#p_sign_posn,4|@1|^#n_sign_posn,}! +0 s686|-1 105 -1 +3 f0 (5|$#,23|0@5@7&#,)! +3 f19 (5|$#,23|0@5@7&#,)! +3 f23 (5|$#,23|0@5@7&#,)! +3 f0 ()! +3 f19 ()! +1 t99|99& +3 f105 ()! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,5|$#,)! +3 f17 (17|$#,5|$#,)! +3 f0 (17|$#,24|4@0@7&#,)! +3 f17 (17|$#,24|4@0@7&#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,36|4@0@7&#,)! +3 f17 (17|$#,36|4@0@7&#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +0 a24|& +3 f0 (151|4@0@7&#,)! +3 f5 (151|4@0@7&#,)! +3 f0 (151|$#,5|$#,)! +3 f1 (151|$#,5|$#,)! +0 s9|& +3 ?! +3 f157 (5|$#,)! +3 f1 (5|$#,)^160 +1 t159|159& +3 ?! +3 f161 (5|$#,)! +3 f1 (5|$#,)^164 +1 t163|163& +3 ?! +3 f165 (5|$#,)! +3 f1 (5|$#,)^168 +1 t167|167& +3 ?! +3 f169 (5|$#,)! +3 f1 (5|$#,)^172 +1 t171|171& +3 f0 (5|$#,172|0@5@7&#,)! +3 f19 (5|$#,172|0@5@7&#,)^175 +1 t174|174& +3 ?! +3 f176 (5|$#,)! +3 f19 (5|$#,)! +3 f1 (5|$#,172|0@5@7&#,)! +3 f1 (5|$#,)! +3 f180 (5|$#,172|0@5@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +0 a25|& +3 f0 (184|4@0@7&#,!.,)! +3 f1 (184|4@0@7&#,!.,)! +3 f0 (184|$#,)! +3 f1 (184|$#,)! +0 a26|-1 191 -1 +0 a27|-1 263 -1 +1 t189|189& +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 ()! +3 f19 ()! +3 f191 ()! +3 f0 (23|@5|4@5@7&#,)! +3 f19 (23|@5|4@5@7&#,)! +3 f23 (23|@5|4@5@7&#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (191|0@5@7&#,)! +3 f5 (191|0@5@7&#,)! +3 f0 (23|$#,23|$#,)! +3 f19 (23|$#,23|$#,)! +3 f191 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,191|$#,)! +3 f19 (23|$#,23|$#,191|$#,)! +3 f191 (23|$#,23|$#,191|$#,)! +3 f0 (191|$#,23|0@5@19@2@0#,)! +3 f1 (191|$#,23|0@5@19@2@0#,)! +3 f0 (191|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f5 (191|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f0 (191|$#,23|$#,!.,)! +3 f5 (191|$#,23|$#,!.,)! +3 f0 (191|$#,23|$#,!.,)! +3 f5 (191|$#,23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f0 (191|$#,23|$#,184|$#,)! +3 f5 (191|$#,23|$#,184|$#,)! +3 f0 (23|$#,184|$#,)! +3 f5 (23|$#,184|$#,)! +3 f0 (23|4@0@7&#,23|$#,184|$#,)! +3 f5 (23|4@0@7&#,23|$#,184|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (23|@5|4@0@7&#,5|$#,191|$#,)! +3 f19 (23|@5|4@0@7&#,5|$#,191|$#,)! +3 f23 (23|@5|4@0@7&#,5|$#,191|$#,)! +3 C0.5/4|! +3 f0 (239|$#,191|$#,)! +3 f5 (239|$#,191|$#,)! +3 f0 (23|$#,191|$#,)! +3 f5 (23|$#,191|$#,)! +3 f0 (191|@7|$#,)! +3 f5 (191|@7|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (23|4@0@7&#,)! +3 f19 (23|4@0@7&#,)! +3 f23 (23|4@0@7&#,)! +3 f0 (239|$#,191|@7|$#,)! +3 f5 (239|$#,191|@7|$#,)! +3 f0 (239|$#,)! +3 f5 (239|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (239|$#,191|$#,)! +3 f5 (239|$#,191|$#,)! +3 f0 (20|4@0@7&#,63|$#,63|$#,191|$#,)! +3 f63 (20|4@0@7&#,63|$#,63|$#,191|$#,)! +3 f0 (20|$#,63|$#,63|$#,191|$#,)! +3 f63 (20|$#,63|$#,63|$#,191|$#,)! +1 t190|190& +3 f0 (191|$#,263|4@0@7&#,)! +3 f5 (191|$#,263|4@0@7&#,)! +3 f0 (191|$#,9|$#,5|$#,)! +3 f5 (191|$#,9|$#,5|$#,)! +3 f0 (191|$#,263|$#,)! +3 f5 (191|$#,263|$#,)! +3 f0 (191|$#,)! +3 f9 (191|$#,)! +3 f0 (191|$#,)! +3 f1 (191|$#,)! +3 f0 (191|$#,)! +3 f1 (191|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (23|0@5@7&#,)! +3 f1 (23|0@5@7&#,)! +3 f0 (23|$#,)! +3 f17 (23|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,)! +3 f9 (23|$#,)! +1 t19|19& +1 t23|23& +3 f0 (23|$#,289|4@5@7&#,)! +3 f17 (23|$#,289|4@5@7&#,)! +3 f0 (23|$#,289|4@5@7&#,5|$#,)! +3 f9 (23|$#,289|4@5@7&#,5|$#,)! +3 f0 (23|$#,289|4@5@7&#,5|$#,)! +3 f10 (23|$#,289|4@5@7&#,5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (6|$#,)! +3 f1 (6|$#,)! +3 f0 (63|$#,63|$#,)! +3 f19 (63|$#,63|$#,)! +3 f20 (63|$#,63|$#,)! +3 f0 (63|$#,)! +3 f19 (63|$#,)! +3 f20 (63|$#,)! +3 f0 (20|@5|4@5@2&#,63|$#,)! +3 f19 (20|@5|4@5@2&#,63|$#,)! +3 f20 (20|@5|4@5@2&#,63|$#,)! +3 f0 (20|4@5@2&#,)! +3 f1 (20|4@5@2&#,)! +3 f0 ()! +3 f1 ()! +3 f0 (5|$#,)! +3 f1 (5|$#,)! +3 ?! +3 f315 ()! +3 f1 ()^318 +1 t317|317& +3 f0 (318|$#,)! +3 f5 (318|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f23 (23|$#,)! +3 f0 (23|0@5@7&#,)! +3 f5 (23|0@5@7&#,)! +3 ?! +3 f326 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^329 +1 t328|328& +3 f0 (20|$#,20|$#,63|$#,63|$#,329|$#,)! +3 f19 (20|$#,20|$#,63|$#,63|$#,329|$#,)! +3 f20 (20|$#,20|$#,63|$#,63|$#,329|$#,)! +3 ?! +3 f333 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^336 +1 t335|335& +3 f0 (20|$#,63|$#,63|$#,336|$#,)! +3 f1 (20|$#,63|$#,63|$#,336|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 S!2{5|@1|^#quot,5|@1|^#rem,}! +0 s675|& +0 s30|& +3 f0 (5|$#,5|$#,)! +3 f343 (5|$#,5|$#,)! +3 f0 (9|$#,)! +3 f9 (9|$#,)! +3 S!3{9|@1|^#quot,9|@1|^#rem,}! +0 s676|& +0 s31|& +3 f0 (9|$#,9|$#,)! +3 f350 (9|$#,9|$#,)! +3 f0 (5|$#,)! +3 f66 (5|$#,)! +3 f0 (191|$#,)! +3 f66 (191|$#,)! +1 t65|65 439 -1 +3 f0 (357|@5|$#,5|$#,191|$#,)! +3 f19 (357|@5|$#,5|$#,191|$#,)! +3 f357 (357|@5|$#,5|$#,191|$#,)! +3 f0 (65|$#,191|$#,)! +3 f66 (65|$#,191|$#,)! +3 f0 (357|$#,191|$#,)! +3 f5 (357|$#,191|$#,)! +3 f0 (191|$#,5|$#,)! +3 f5 (191|$#,5|$#,)! +3 f0 (191|$#,357|$#,!.,)! +3 f5 (191|$#,357|$#,!.,)! +3 f0 (191|$#,357|$#,!.,)! +3 f5 (191|$#,357|$#,!.,)! +3 f0 (191|@7|$#,)! +3 f66 (191|@7|$#,)! +3 f0 ()! +3 f66 ()! +1 t67|67& +3 f0 (23|$#,63|$#,375|0@5@7&#,)! +3 f63 (23|$#,63|$#,375|0@5@7&#,)! +3 f0 (357|0@5@7&#,23|$#,63|$#,375|0@5@7&#,)! +3 f63 (357|0@5@7&#,23|$#,63|$#,375|0@5@7&#,)! +3 f0 (375|0@5@7&#,)! +3 f5 (375|0@5@7&#,)! +3 f0 (357|0@5@7&#,289|$#,63|$#,375|0@5@7&#,)! +3 f63 (357|0@5@7&#,289|$#,63|$#,375|0@5@7&#,)! +3 f0 (65|$#,191|@7|$#,)! +3 f66 (65|$#,191|@7|$#,)! +3 f0 (65|$#,)! +3 f66 (65|$#,)! +3 f0 (357|$#,63|$#,357|$#,!.,)! +3 f5 (357|$#,63|$#,357|$#,!.,)! +3 f0 (357|$#,357|$#,!.,)! +3 f5 (357|$#,357|$#,!.,)! +3 f0 (66|$#,191|$#,)! +3 f66 (66|$#,191|$#,)! +3 f0 (191|$#,357|$#,184|$#,)! +3 f5 (191|$#,357|$#,184|$#,)! +3 f0 (357|$#,63|$#,357|$#,184|$#,)! +3 f5 (357|$#,63|$#,357|$#,184|$#,)! +3 f0 (357|$#,184|$#,)! +3 f5 (357|$#,184|$#,)! +3 f0 (23|4@5@7&#,65|$#,375|0@5@7&#,)! +3 f63 (23|4@5@7&#,65|$#,375|0@5@7&#,)! +3 C0.1/357|! +3 f0 (357|@5|4@0@9&#,357|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,)! +3 f402 (357|@5|4@0@9&#,357|$#,)! +3 f0 (357|@5|$#,65|$#,)! +3 f19 (357|@5|$#,65|$#,)! +3 f357 (357|@5|$#,65|$#,)! +3 f0 (357|$#,357|$#,)! +3 f5 (357|$#,357|$#,)! +3 f0 (357|$#,357|$#,)! +3 f5 (357|$#,357|$#,)! +3 f0 (357|@5|4@0@9&#,357|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,)! +3 f402 (357|@5|4@0@9&#,357|$#,)! +3 f0 (357|$#,357|$#,)! +3 f63 (357|$#,357|$#,)! +0 s684|-1 419 -1 +1 t418|418& +3 f0 (357|4@0@7&#,63|$#,357|$#,419|$#,)! +3 f63 (357|4@0@7&#,63|$#,357|$#,419|$#,)! +3 f0 (357|$#,)! +3 f63 (357|$#,)! +3 C0.1/357|! +3 f0 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f424 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f0 (357|$#,357|$#,63|$#,)! +3 f5 (357|$#,357|$#,63|$#,)! +3 f0 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f424 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f0 (357|@5|$#,357|$#,)! +3 f19 (357|@5|$#,357|$#,)! +3 f357 (357|@5|$#,357|$#,)! +3 f0 (357|@5|$#,65|$#,)! +3 f19 (357|@5|$#,65|$#,)! +3 f357 (357|@5|$#,65|$#,)! +1 t357|357& +3 f0 (23|0@5@7&#,439|$#,63|$#,375|0@5@7&#,)! +3 f63 (23|0@5@7&#,439|$#,63|$#,375|0@5@7&#,)! +3 f0 (357|$#,357|$#,)! +3 f63 (357|$#,357|$#,)! +3 f0 (357|$#,357|$#,)! +3 f19 (357|$#,357|$#,)! +3 f357 (357|$#,357|$#,)! +3 f0 (357|$#,439|0@5@7&#,)! +3 f17 (357|$#,439|0@5@7&#,)! +3 f0 (357|0@5@7&#,357|$#,439|$#,)! +3 f19 (357|0@5@7&#,357|$#,439|$#,)! +3 f357 (357|0@5@7&#,357|$#,439|$#,)! +3 f0 (357|$#,439|0@5@7&#,5|$#,)! +3 f9 (357|$#,439|0@5@7&#,5|$#,)! +3 f0 (357|$#,439|0@5@7&#,5|$#,)! +3 f10 (357|$#,439|0@5@7&#,5|$#,)! +3 f0 (357|0@5@7&#,357|$#,63|$#,)! +3 f63 (357|0@5@7&#,357|$#,63|$#,)! +3 f0 (66|$#,)! +3 f5 (66|$#,)! +3 f0 (357|$#,65|$#,63|$#,)! +3 f19 (357|$#,65|$#,63|$#,)! +3 f357 (357|$#,65|$#,63|$#,)! +3 f0 (357|$#,357|$#,63|$#,)! +3 f5 (357|$#,357|$#,63|$#,)! +3 f0 (357|@5|$#,357|$#,63|$#,)! +3 f19 (357|@5|$#,357|$#,63|$#,)! +3 f357 (357|@5|$#,357|$#,63|$#,)! +3 f0 (357|@5|$#,357|$#,63|$#,)! +3 f19 (357|@5|$#,357|$#,63|$#,)! +3 f357 (357|@5|$#,357|$#,63|$#,)! +3 f0 (357|@5|$#,65|$#,63|$#,)! +3 f19 (357|@5|$#,65|$#,63|$#,)! +3 f357 (357|@5|$#,65|$#,63|$#,)! +3 f0 (357|$#,!.,)! +3 f5 (357|$#,!.,)! +3 f0 (357|$#,!.,)! +3 f5 (357|$#,!.,)! +0 s10|& +0 s11|& +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,478|$#,)! +3 f2 (66|$#,478|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,479|$#,)! +3 f66 (66|$#,479|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f0 (23|$#,)! +3 f479 (23|$#,)! +3 f0 (23|$#,)! +3 f478 (23|$#,)! +3 f0 (23|$#,63|$#,)! +3 f5 (23|$#,63|$#,)! +3 f0 (357|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f5 (357|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f0 (23|4@5@7&#,65|$#,)! +3 f5 (23|4@5@7&#,65|$#,)! +3 f0 (357|4@0@7&#,23|$#,63|$#,)! +3 f63 (357|4@0@7&#,23|$#,63|$#,)! +3 f0 (23|4@0@7&#,357|$#,63|$#,)! +3 f63 (23|4@0@7&#,357|$#,63|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f524 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f0 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f524 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 C0.1/23|! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f0 (20|$#,20|$#,63|$#,)! +3 f5 (20|$#,20|$#,63|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,63|$#,)! +3 f5 (23|$#,23|$#,63|$#,)! +3 f0 (23|4@5@7&#,23|$#,63|$#,)! +3 f63 (23|4@5@7&#,23|$#,63|$#,)! +3 f0 (20|$#,5|$#,63|$#,)! +3 f19 (20|$#,5|$#,63|$#,)! +3 f20 (20|$#,5|$#,63|$#,)! +3 f0 (23|@5|$#,4|$#,)! +3 f19 (23|@5|$#,4|$#,)! +3 f23 (23|@5|$#,4|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|$#,23|$#,)! +3 f19 (23|@5|$#,23|$#,)! +3 f23 (23|@5|$#,23|$#,)! +3 f0 (23|@5|$#,4|$#,)! +3 f19 (23|@5|$#,4|$#,)! +3 f23 (23|@5|$#,4|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|0@0@9&#,23|$#,)! +3 f19 (23|@5|0@0@9&#,23|$#,)! +3 f23 (23|@5|0@0@9&#,23|$#,)! +3 f0 (23|@5|0@5@7&#,23|$#,)! +3 f19 (23|@5|0@5@7&#,23|$#,)! +3 f23 (23|@5|0@5@7&#,23|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f576 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f0 (5|$#,)! +3 f19 (5|$#,)! +3 f23 (5|$#,)! +3 f0 (23|$#,)! +3 f63 (23|$#,)! +0 s12|& +0 s13|-1 594 -1 +3 Stm{5|@1|^#tm_sec,5|@1|^#tm_min,5|@1|^#tm_hour,5|@1|^#tm_mday,5|@1|^#tm_mon,5|@1|^#tm_year,5|@1|^#tm_wday,5|@1|^#tm_yday,5|@1|^#tm_isdst,}! +3 f0 ()! +3 f585 ()! +3 f0 (586|$#,586|$#,)! +3 f17 (586|$#,586|$#,)! +3 f0 (419|$#,)! +3 f586 (419|$#,)! +1 t586|586& +3 f0 (594|4@5@7&#,)! +3 f586 (594|4@5@7&#,)! +3 f0 (419|$#,)! +3 f19 (419|$#,)! +3 f23 (419|$#,)! +3 f0 (594|$#,)! +3 f19 (594|$#,)! +3 f23 (594|$#,)! +3 f0 (594|$#,)! +3 f19 (594|$#,)! +3 f419 (594|$#,)! +3 f0 (594|$#,)! +3 f19 (594|$#,)! +3 f419 (594|$#,)! +3 f0 (23|4@0@7&#,63|$#,23|$#,419|$#,)! +3 f63 (23|4@0@7&#,63|$#,23|$#,419|$#,)! +0 s14|& +0 s15|-1 -1 837 +0 s16|& +0 s17|& +0 s18|& +0 s19|& +0 s20|& +0 s21|& +0 a28|-1 622 -1 +3 Sdirent{42|@1|^#d_name,}! +0 s673|-1 630 -1 +1 t619|619& +3 f0 (622|$#,)! +3 f5 (622|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f622 (23|$#,)! +3 f0 (622|$#,)! +3 f19 (622|$#,)! +1 t621|621& +3 f630 (622|$#,)! +3 f0 (622|$#,)! +3 f1 (622|$#,)! +3 Sflock{7|@1|^#l_type,7|@1|^#l_whence,616|@1|^#l_start,616|@1|^#l_len,617|@1|^#l_pid,}! +0 s681|& +3 f0 (23|$#,614|$#,)! +3 f5 (23|$#,614|$#,)! +3 f0 (5|$#,5|$#,!.,)! +3 f5 (5|$#,5|$#,!.,)! +3 f0 (23|$#,5|$#,!.,)! +3 f5 (23|$#,5|$#,!.,)! +3 Sgroup{23|@1|0@0@3&#gr_name,612|@1|^#gr_gid,289|@1|0@0@3&#gr_mem,}! +0 s677|-1 646 -1 +3 f0 (612|$#,)! +3 f19 (612|$#,)! +1 t643|643& +3 f646 (612|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f646 (23|$#,)! +3 Spasswd{23|@1|0@0@3&#pw_name,618|@1|^#pw_uid,612|@1|^#pw_gid,23|@1|0@0@3&#pw_dir,23|@1|0@0@3&#pw_shell,}! +0 s682|-1 655 -1 +3 f0 (23|$#,)! +3 f19 (23|$#,)! +1 t652|652& +3 f655 (23|$#,)! +3 f0 (618|$#,)! +3 f19 (618|$#,)! +3 f655 (618|$#,)! +0 a29|& +3 f0 (660|$#,5|$#,)! +3 f1 (660|$#,5|$#,)! +3 f0 (660|4@0@7&#,5|$#,)! +3 f5 (660|4@0@7&#,5|$#,)! +0 a1|-1 677 -1 +3 ?! +3 f666 ()! +3 f1 ()^669 +1 t668|668& +3 Ssigaction{!669$$$@0#sa_handler,665|@1|0@0@3&#sa_mask,5|@1|^#sa_flags,}! +0 s678|-1 674 -1 +3 f0 (617|$#,5|$#,)! +3 f5 (617|$#,5|$#,)! +1 t671|671& +3 f0 (5|$#,674|$#,674|4@5@7&#,)! +3 f5 (5|$#,674|$#,674|4@5@7&#,)! +1 t665|665& +3 f0 (677|$#,5|$#,)! +3 f5 (677|$#,5|$#,)! +3 f0 (677|$#,5|$#,)! +3 f5 (677|$#,5|$#,)! +3 f0 (677|4@0@7&#,)! +3 f5 (677|4@0@7&#,)! +3 f0 (677|4@0@7&#,)! +3 f5 (677|4@0@7&#,)! +3 f0 (677|$#,5|$#,)! +3 f5 (677|$#,5|$#,)! +3 f0 (677|4@0@7&#,)! +3 f5 (677|4@0@7&#,)! +3 f0 (5|$#,677|0@5@7&#,677|4@5@7&#,)! +3 f5 (5|$#,677|0@5@7&#,677|4@5@7&#,)! +3 f0 (677|$#,)! +3 f5 (677|$#,)! +3 f0 (5|$#,23|$#,)! +3 f19 (5|$#,23|$#,)! +3 f191 (5|$#,23|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 Sstat{614|@1|^#st_mode,613|@1|^#st_ino,611|@1|^#st_dev,615|@1|^#st_nlink,618|@1|^#st_uid,612|@1|^#st_gid,616|@1|^#st_size,586|@1|^#st_st_atime,586|@1|^#st_st_mtime,586|@1|^#st_st_ctime,}! +0 s685|-1 719 -1 +3 C0.2/5|! +3 f0 (614|@7|$#,)! +3 f2 (614|@7|$#,)! +3 f701 (614|@7|$#,)! +3 f0 (614|@7|$#,)! +3 f2 (614|@7|$#,)! +3 f701 (614|@7|$#,)! +3 f0 (614|@7|$#,)! +3 f2 (614|@7|$#,)! +3 f701 (614|@7|$#,)! +3 f0 (614|@7|$#,)! +3 f2 (614|@7|$#,)! +3 f701 (614|@7|$#,)! +3 f0 (614|@7|$#,)! +3 f2 (614|@7|$#,)! +3 f701 (614|@7|$#,)! +3 f0 (23|$#,614|$#,)! +3 f5 (23|$#,614|$#,)! +1 t700|700& +3 f0 (5|$#,719|4@0@7&#,)! +3 f5 (5|$#,719|4@0@7&#,)! +3 f0 (23|$#,614|$#,)! +3 f5 (23|$#,614|$#,)! +3 f0 (23|$#,614|$#,)! +3 f5 (23|$#,614|$#,)! +3 f0 (23|$#,719|4@0@7&#,)! +3 f5 (23|$#,719|4@0@7&#,)! +3 f0 (614|$#,)! +3 f5 (614|$#,)! +3 Stms{585|@1|^#tms_utime,585|@1|^#tms_stime,585|@1|^#tms_cutime,585|@1|^#tms_cstime,}! +0 s679|-1 732 -1 +1 t731|731& +3 f0 (732|4@0@7&#,)! +3 f585 (732|4@0@7&#,)! +3 Sutsname{42|@1|^#sysname,42|@1|^#nodename,42|@1|^#release,42|@1|^#version,42|@1|^#machine,}! +0 s683|-1 737 -1 +1 t736|736& +3 f0 (737|4@0@7&#,)! +3 f5 (737|4@0@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (24|4@5@7&#,)! +3 f617 (24|4@5@7&#,)! +3 f0 (617|$#,24|4@0@7&#,5|$#,)! +3 f617 (617|$#,24|4@0@7&#,5|$#,)! +3 C0.4/8|! +3 C0.3/8|! +0 s32|& +3 C0.9/9|! +3 C0.10/9|! +0 s33|& +0 s34|& +3 Stermios{762|@1|^#c_iflag,762|@1|^#c_oflag,762|@1|^#c_cflag,762|@1|^#c_lflag,758|@1|^#c_cc,}! +0 s680|-1 765 -1 +1 t764|764& +3 f0 (765|$#,)! +3 f761 (765|$#,)! +3 f0 (765|$#,)! +3 f761 (765|$#,)! +3 f0 (765|$#,)! +3 f5 (765|$#,)! +3 f0 (765|$#,)! +3 f5 (765|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,765|4@0@7&#,)! +3 f5 (5|$#,765|4@0@7&#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,5|$#,765|$#,)! +3 f5 (5|$#,5|$#,765|$#,)! +3 f0 ()! +3 f1 ()! +3 f0 (5|$#,)! +3 f1 (5|$#,)! +3 f0 (23|$#,5|$#,)! +3 f5 (23|$#,5|$#,)! +3 f0 (6|$#,)! +3 f6 (6|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,618|$#,612|$#,)! +3 f5 (23|$#,618|$#,612|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|@5|4@5@7&#,)! +3 f19 (23|@5|4@5@7&#,)! +3 f23 (23|@5|4@5@7&#,)! +3 f0 (23|4@5@7&#,)! +3 f19 (23|4@5@7&#,)! +3 f23 (23|4@5@7&#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +2 y19|19& +2 y23|23& +3 f0 (23|$#,817|$#,)! +3 f5 (23|$#,817|$#,)! +3 f0 (23|$#,817|$#,289|$#,)! +3 f5 (23|$#,817|$#,289|$#,)! +3 f0 (23|$#,817|$#,)! +3 f5 (23|$#,817|$#,)! +3 f0 ()! +3 f617 ()! +3 f0 (5|$#,5|$#,)! +3 f9 (5|$#,5|$#,)! +3 f0 (23|@5|4@0@7&#,63|$#,)! +3 f19 (23|@5|4@0@7&#,63|$#,)! +3 f23 (23|@5|4@0@7&#,63|$#,)! +3 f0 ()! +3 f612 ()! +3 f0 ()! +3 f618 ()! +3 f0 ()! +3 f612 ()! +2 y612|612& +3 f0 (5|$#,837|4@0@7&#,)! +3 f5 (5|$#,837|4@0@7&#,)! +3 f0 ()! +3 f19 ()! +3 f23 ()! +3 f0 ()! +3 f617 ()! +3 f0 ()! +3 f617 ()! +3 f0 ()! +3 f617 ()! +3 f0 ()! +3 f618 ()! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (5|$#,616|$#,5|$#,)! +3 f616 (5|$#,616|$#,5|$#,)! +3 f0 (23|$#,5|$#,)! +3 f9 (23|$#,5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (43|4@0@7&#,)! +3 f5 (43|4@0@7&#,)! +3 f0 (5|$#,20|4@0@7&#,63|$#,)! +3 f64 (5|$#,20|4@0@7&#,63|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (612|$#,)! +3 f5 (612|$#,)! +3 f0 (617|$#,617|$#,)! +3 f5 (617|$#,617|$#,)! +3 f0 ()! +3 f617 ()! +3 f0 (618|$#,)! +3 f5 (618|$#,)! +3 f0 (6|$#,)! +3 f6 (6|$#,)! +3 f0 (5|$#,)! +3 f9 (5|$#,)! +3 f0 (5|$#,)! +3 f617 (5|$#,)! +3 f0 (5|$#,617|$#,)! +3 f5 (5|$#,617|$#,)! +3 f0 (5|$#,)! +3 f19 (5|$#,)! +3 f23 (5|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (5|$#,20|$#,63|$#,)! +3 f64 (5|$#,20|$#,63|$#,)! +3 Sutimbuf{586|@1|^#actime,586|@1|^#modtime,}! +0 s674|-1 892 -1 +1 t891|891& +3 f0 (23|$#,892|0@5@7&#,)! +3 f5 (23|$#,892|0@5@7&#,)! +;;tistable +0 +0,24 +24 +0,24,25 +25 +0,24,25,26 +26 +0,24,25,26,27 +27 +28 +28,29 +29 +28,29,1 +1 +;;symTable +*0 (Datatype) +0@+@=@0@0@0@0@67#mbstate_t +0@+@=@0@0@0@0@665#sigset_t +2@-@-@0@0@0@0@2#lltX_bool +13@-@-@0@0@0@0@59#__SIZE_TYPE__ +13@-@-@0@0@0@0@60#__PTRDIFF_TYPE__ +13@-@-@0@0@0@0@61#__WCHAR_TYPE__ +13@-@-@0@0@0@0@62#ptrdiff_t +13@-@-@0@0@0@0@65#wchar_t +13@-@-@0@0@0@0@66#wint_t +13@-@-@0@0@0@0@156#sig_atomic_t +13@-@-@0@0@0@0@478#wctype_t +13@-@-@0@0@0@0@479#wctrans_t +13@-@-@0@0@0@0@585#clock_t +13@-@-@0@0@0@0@586#time_t +13@-@-@0@0@0@0@611#dev_t +13@-@-@0@0@0@0@612#gid_t +13@-@-@0@0@0@0@613#ino_t +13@-@-@0@0@0@0@614#mode_t +13@-@-@0@0@0@0@615#nlink_t +13@-@-@0@0@0@0@616#off_t +13@-@-@0@0@0@0@617#pid_t +13@-@-@0@0@0@0@618#uid_t +14@-@-@0@0@0@0@63#size_t +15@-@-@0@0@0@0@64#ssize_t +20@+@+@0@0@0@0@151#jmp_buf +20@+@+@0@0@0@0@184#va_list +20@+@+@0@0@0@0@189#FILE +20@+@+@0@0@0@0@190#fpos_t +20@+@+@0@0@0@0@619#DIR +20@+@+@0@0@0@0@660#sigjmp_buf +341@-@-@0@0@0@0@343#div_t +348@-@-@0@0@0@0@350#ldiv_t +757@-@-@0@0@0@0@758#cc_t +760@-@-@0@0@0@0@761#speed_t +760@-@-@0@0@0@0@762#tcflag_t +*1 (Constant) +0@i0@0@6#NULL +2@i1@0@0#TRUE +2@i0@0@6#FALSE +3$#UCHAR_MAX#UCHAR_MIN +4$#CHAR_MAX#CHAR_MIN#SCHAR_MAX#SCHAR_MIN +5$#B0#B110#B1200#B134#B150#B1800#B19200#B200#B2400#B300#B38400#B4800#B50#B600#B75#B9600#BRKINT#BUFSIZ#CHAR_BIT#CLK_TCK#CLOCAL#CLOCKS_PER_SEC#CREAD#CS5#CS6#CS7#CS8#CSIZE#CSTOPB#E2BIG#EACCES#EAGAIN#EBADF#EBUSY#ECHILD#ECHO#ECHOE#ECHOK#ECHONL#EDEADLK#EDOM#EEXIST#EFAULT#EFBIG#EILSEQ#EINTR#EINVAL#EIO#EISDIR#EMFILE#EMLINK#ENAMETOOLONG#ENFILE#ENODEV#ENOENT#ENOEXEC#ENOLCK#ENOMEM#ENOSPC#ENOSYS#ENOTDIR#ENOTEMPTY#ENOTTY#ENXIO#EOF#EPERM#EPIPE#ERANGE#EROFS#ESPIPE#ESRCH#EXDEV#EXIT_FAILURE#EXIT_SUCCESS#FD_CLOEXEC#FILENAME_MAX#FLT_RADIX#FOPEN_MAX#F_DUPFD#F_GETFD#F_GETFL#F_GETLK#F_OK#F_RDLCK#F_SETFD#F_SETFL#F_SETLK#F_SETLKW#F_UNLCK#F_WRLCK#HUPCL#ICANON#ICRNL#IEXTEN#IGNBRK#IGNCR#IGNLCR#IGNPAR#INPCK#INT_MAX#INT_MIN#ISIG#ISTRIP#IXOFF#IXON#LC_ALL#LC_COLLATE#LC_CTYPE#LC_MONETARY#LC_NUMERIC#LC_TIME#L_ctermid#L_cuserid#L_tmpnam#NCCS#NOFLSH#OPOST#O_ACCMODE#O_APPEND#O_CREAT#O_EXCL#O_NOCTTY#O_NONBLOCK#O_RDONLY#O_RDWR#O_TRUNC#O_WRONLY#PARENB#PARMRK#PARODD#RAND_MAX#R_OK#SA_NOCLDSTOP#SEEK_CUR#SEEK_END#SEEK_SET#SIGABRT#SIGALRM#SIGCHLD#SIGCONT#SIGFPE#SIGHUP#SIGILL#SIGINT#SIGKILL#SIGPIPE#SIGQUIT#SIGSEGV#SIGSTOP#SIGTERM#SIGTSTP#SIGTTIN#SIGTTOU#SIGUSR1#SIGUSR2#SIG_BLOCK#SIG_SETMASK#SIG_UNBLOCK#STDERR_FILENO#STDIN_FILENO#STDOUT_FILENO#S_IRGRP#S_IROTH#S_ISGID#S_ISUID#S_IUSR#S_IWGRP#S_IWOTH#S_IWUSR#S_IWXG#S_IWXO#S_IWXU#S_IXGRP#S_IXOTH#S_IXUSR#TCIFLUSH#TCIOFF#TCIOFLUSH#TCION#TCOFLUSH#TCSADRAIN#TCSAFLUSH#TCSANOW#TMP_MAX#TOSTOP#VEOF#VEOL#VERASE#VINTR#VKILL#VMIN#VQUIT#VSTART#VSTOP#VSUSP#VTIME#WCHAR_MAX#WCHAR_MIN#WUNTRACED#W_OK#X_OK#_IOFBF#_IOLBF#_IONBF#_PC_CHOWN_RESTRUCTED#_PC_MAX_CANON#_PC_MAX_INPUT#_PC_NAME_MAX#_PC_NO_TRUNC#_PC_PATH_MAX#_PC_PIPE_BUF#_PC_VDISABLE#_POSIX_CHOWN_RESTRICTED#_POSIX_JOB_CONTROL#_POSIX_NO_TRUNC#_POSIX_SAVED_IDS#_POSIX_VDISABLE#_POSIX_VERSION#_SC_ARG_MAX#_SC_CHILD_MAX#_SC_CLK_TCK#_SC_JOB_CONTROL#_SC_NGROUPS_MAX#_SC_OPEN_MAX#_SC_SAVED_IDS#_SC_STREAM_MAX#_SC_TZNAME_MAX#_SC_VERSION#__INCLUDE_LEVEL__#__LCLINT__#__LINE__ +6$#UINT_MAX +7$#SHRT_MAX#SHRT_MIN +8$#USHRT_MAX +9$#ARG_MAX#CHILD_MAX#LINK_MAX#LONG_MAX#LONG_MIN#MAX_CANON#MAX_INPUT#MB_LEN_MAX#NAME_MAX#NGROUPS_MAX#OPEN_MAX#PIPE_BUF#SSIZE_MAX#STREAM_MAX#TZNAME_MAX#_POSIX_ARG_MAX#_POSIX_CHILD_MAX#_POSIX_LINK_MAX#_POSIX_MAX_CANON#_POSIX_MAX_INPUT#_POSIX_NAME_MAX#_POSIX_NGROUPS_MAX#_POSIX_OPEN_MAX#_POSIX_PATH_MAX#_POSIX_PIPE_BUF#_POSIX_SSIZE#_POSIX_STREAM#_POSIX_TZNAME_MAX +10$#ULONG_MAX +17$#HUGE_VAL +23$#__BASE_FILE__#__DATE__#__FILE__#__REGISTER_PREFIX__#__TIME__#__USER_LABEL_PREFIX__#__VERSION__ +2$#NDEBUG +63$#MB_CUR_MAX +66$#WEOF +160$#SIG_DFL +164$#SIG_ERR +168$#SIG_IGN +*3 (Variable) +5|@1|0@0@0@0@1#DBL_DIG#DBL_MANT_DIG#DBL_MAX_10_EXP#DBL_MAX_EXP#DBL_MIN_10_EXP#DBL_MIN_EXP#FLT_DIG#FLT_MANT_DIG#FLT_MAX_10_EXP#FLT_MAX_EXP#FLT_MIN_10_EXP#FLT_MIN_EXP#FLT_ROUNDS#LDBL_DIG#LDBL_MANT_DIG#LDBL_MAX_10_EXP#LDBL_MAX_EXP#LDBL_MIN_10_EXP#LDBL_MIN_EXP +5|@1|0@0@0@0@4#errno +16|@1|0@0@0@0@1#FLT_EPSILON#FLT_MAX#FLT_MIN +17|@1|0@0@0@0@1#DBL_EPSILON#DBL_MAX#DBL_MIN +18|@1|0@0@0@0@1#LDBL_EPSILON#LDBL_MAX#LDBL_MIN +191|@1|0@0@0@0@2#stderr#stdin#stdout +289|@1|0@0@0@0@1#environ +*4 (Function) +338$@0@g341@0@0@1@tp0,g341$@0#qsort +155@6@0@5@0@0@1@@1@s0$@0#longjmp +186$@0@@1@p0$@0#va_start +213$@0@s3@1@s3,tp0,tp1$@0#setbuf +662@6@0@5@0@0@1@@1@s0$@0#siglongjmp +789@6@0@6@0@0@1@@1@s0$@0#_exit#exit +299$@0@s1@1@s1$@0#srand +310$@0@@1@tp0$@0#free +281$@1@g341@0@0,g351@0@0,s3@1@s3,tg351$@0#perror +71@6@0@8@0@0@1@@1@s0$@0#assert +188$@0@@1@p0$@0#va_end +275$@0@@1@tp0$@0#clearerr#rewind +633$@1@@1@s0$@0#rewinddir +787$@1@g354@0@0,s1@1@s1$@0#tzset +312@6@0@6@0@0@1@@1@s0$@0#abort +95$@1@@1@s0$@0#tolower#toupper +215$@0@s3@1@s3,tp0,tp1$@0#setvbuf +397$@0@@1@tp0$@0#vswprintf +389@6@0@1@1@0@0@@1@tp0$@0#swprintf +785$@0@g341@0@0@1@g341$@0#tcsetattr +639$@0@g341@0@0@1@g341$@0#fcntl +676$@0@g341@0@0,s1@1@tp2,g341,s1$@0#sigaction +691$@0@g341@0@0,s1@1@tp2,g341,s1$@0#sigprocmask +545$@1@@1@s0$@0#memcmp +641$@0@g341@0@0@1@g341$@0#open +551$@1@@1@s0$@0#strncmp +811@6@0@5@0@0@0@g341@0@0@1@g341$@0#execl#execle#execlp +797$@0@s3,g341@0@0@1@s3,g341$@0#chown +821@6@0@5@0@0@0@g341@0@0@1@g341$@0#execve +227@6@0@1@2@0@1@@1@s0$@0#sscanf +233$@0@@1@tp0,p2$@0#vsprintf +225@6@0@1@1@0@0@@1@tp0$@0#sprintf +267$@0@s3,g341@0@0@1@s3,tp0,g341$@0#fseek +229$@0@s3,g341@0@0@1@s3,tp0,p2,g341$@0#vfprintf +217@6@0@1@1@0@0@s3@1@s3,tp0$@0#fprintf +219@6@0@1@2@0@0@s3@1@s3,tp0$@0#fscanf +395$@0@s3@1@s3,tp0$@0#vfwprintf +368@6@0@1@1@0@0@s3@1@tp0,s3$@0#fwprintf +370@6@0@1@2@0@0@s3@1@tp0,s3$@0#fwscanf +429$@1@@1@s0$@0#wcsncmp#wmemcmp +391@6@0@1@2@0@0@g352@0@0@1@tg352$@0#swscanf +517$@0@@1@tp0$@0#mbtowc +807$@0@g341@0@0,s3@1@g341,s3$@0#dup2 +777$@0@g341@0@0@1@g341$@0#tcflow#tcflush#tcsendbreak +882$@0@g341@0@0,s1@1@g341,s1$@0#tcsetpgrp +721$@0@g341@0@0@1@g341,tp1$@0#fstat +781$@0@g341@0@0@1@g341,tp1$@0#tcgetattr +839$@0@g341@0@0@1@g341,ap1$@0#getgroups +791$@0@g341@0@0@1@g341$@0#access +547$@1@@1@s0$@0#strcmp#strcoll +854$@0@g341@0@0,s3@1@g341,s3$@0#link#rename +515$@1@@1@s0$@0#mblen +231$@1@g353@0@0,s3@1@s3,p1,tg353$@0#vprintf +243$@0@s3@1@s3,tp1$@0#fputs +718$@0@s3,g341@0@0@1@s3,g341$@0#chmod#mkdir#mkfifo +637$@0@g341@0@0@1@g341$@0#creat +727$@0@g341@0@0@1@g341,tp1$@0#stat +819@6@0@5@0@0@0@g341@0@0@1@g341$@0#execv#execvp +894$@0@s3,g341@0@0@1@s3,g341$@0#utime +223@6@0@1@2@0@1@g352@0@0,s3@1@s3,tg352$@0#scanf +221@6@0@1@1@0@1@g353@0@0,s3@1@s3,tg353$@0#printf +519$@0@@1@tp0$@0#wctomb +366$@1@@1@s0$@0#fwide +269$@0@s3,g341@0@0@1@s3,tp0,g341$@0#fsetpos +265$@0@g341@0@0@1@tp1,g341$@0#fgetpos +399$@0@s3,g353@0@0@1@s3,tg353$@0#vwprintf +364$@0@s3@1@s3,tp1$@0#fputws +410$@1@@1@s0$@0#wcscmp#wcscoll +477@6@0@1@2@0@1@g352@0@0,g341@0@0@1@g341,tg352$@0#wscanf +475@6@0@1@1@0@1@g353@0@0,g341@0@0@1@g341,tg353$@0#wprintf +673@6@0@5@0@0@0@g341@0@0@1@g341$@0#kill +870$@0@g341@0@0,s1@1@g341,s1$@0#setpgid +664$@0@@1@p0$@0#sigsetjmp +679$@0@g341@0@0@1@tp0,g341$@0#sigaddset#sigdelset +687$@0@g341@0@0@1@g341$@0#sigismember +241$@0@s3,g341@0@0@1@s3,tp1,g341$@0#fputc#ungetc +252$@0@s3@1@s3,tp1$@0#putc +799$@0@s3,g341@0@0,s1@1@s3,g341,s1$@0#close +809$@0@g341@0@0,s3@1@g341,s3$@0#dup +775$@0@g341@0@0@1@g341$@0#tcdrain +741$@1@@1@s0$@0#WEXITSTATUS#WIFEXITED#WIFSIGNALED#WIFSTOPPED#WSTOPSIG#WTERMSIG#abs#isatty +183@6@0@5@0@0$$@0#raise +193$@0@s3,g341@0@0@1@s3,g341$@0#remove +256$@1@g353@0@0,s3@1@s3,tg353$@0#puts +866$@0@s3,g341@0@0@1@s3,g341$@0#rmdir#unlink +795$@0@g341@0@0@1@g341$@0#chdir +285$@1@@1@s0$@0#atoi +325$@0@s3@1@s3$@0#system +862$@0@g341@0@0@1@g341$@0#pipe +459$@1@@1@s0$@0#wctob +153$@0@@1@p0$@0#setjmp +203$@0@g341@0@0,s3@1@tp0,g341,s3$@0#fclose#fgetc +277$@0@g341@0@0@1@g341$@0#feof#ferror#fileno +245$@0@s3@1@s3,tp0$@0#getc +205$@0@g341@0@0,s3@1@tp0,g341,s3$@0#fflush +320$@0@s1@1@s1$@0#atexit +381$@1@@1@s0$@0#mbsinit +868$@0@g341@0@0,s1@1@g341,s1$@0#setgid +729$@0@s1@1@s1$@0#umask +874$@0@g341@0@0,s1@1@g341,s1$@0#setuid +624$@0@g341@0@0@1@g341$@0#closedir +693$@0@g341@0@0,s1@1@g341,s1$@0#sigsuspend +683$@0@g341@0@0@1@tp0,g341$@0#sigemptyset#sigfillset#sigpending +739$@0@g341@0@0@1@tp0,g341$@0#uname +771$@0@@1@tp0$@0#cfsetispeed#cfsetospeed +254$@1@g353@0@0,s3@1@s3,tg353$@0#putchar +297$@0@s1@1@s1$@0#rand +247$@1@g352@0@0,s3@1@s3,tg352$@0#getchar +860$@0@g341@0@0@1@g341$@0#pause +793$@0@s1@1@s1$@0#alarm +876$@1@@1@s0$@0#sleep +293$@0@g341@0@0@1@tp1,g341$@0#strtol +453$@0@@1@tp1$@0#wcstol +827$@0@g341@0@0@1@g341$@0#fpathconf +858$@0@g341@0@0@1@g341$@0#pathconf +878$@0@g341@0@0@1@g341$@0#sysconf +347$@1@@1@s0$@0#labs +287$@1@@1@s0$@0#atol +271$@0@g341@0@0@1@g341$@0#ftell +295$@0@g341@0@0@1@tp1,g341$@0#strtoul +455$@0@@1@tp1$@0#wcstoul +130$@0@g341@0@0@1@g341$@0#ldexp +120$@1@@1@s0$@0#atan2#fmod +138$@0@g341@0@0@1@g341$@0#pow +132$@0@@1@tp1$@0#frexp +148$@0@@1@tp1$@0#modf +291$@0@g341@0@0@1@tp1,g341$@0#strtod +448$@0@@1@tp1$@0#wcstod +591$@1@@1@s0$@0#difftime +116$@0@g341@0@0@1@g341$@0#acos#asin#cosh#exp#log#log10#sqrt +118$@1@@1@s0$@0#atan#ceil#cos#fabs#floor#sin#sinh#tan#tanh +283$@1@@1@s0$@0#atof +332@6@5@1@0@0@1@@1@s0@18@0@0#bsearch +556@6@5@1@0@0@1@@1@s0@3@0@0#memchr +308@6@5@1@0@0@0@@1@tp0@2@0@0#realloc +302@6@5@1@0@0@1@@1@s0@2@0@0#calloc +305@4@5@1@0@0@1@@1@s0@2@0@0#malloc +238@6@5@1@0@0@0@s3,g341@0@0@1@s3,tp0,tp2,g341$@0#fgets +102@6@5@1@0@0@0@s1,g341@0@0@1@s1,g341@19@3@0#setlocale +559@6@5@1@0@0@1@@1@s0@19@2@0#strchr#strrchr +564@6@5@1@0@0@1@@1@s0@19@2@0#strpbrk +575@6@5@1@0@0@0@s1,g341@0@0@1@tp0,s1,g341@19@2@0#strtok +572@6@5@1@0@0@1@@1@s0@19@2@0#strstr +830$@0@g341@0@0@1@g341,tp0$@0#getcwd +582$@1@@1@s0@19@3@0#strerror +885@6@5@1@0@0@0@g341@0@0@1@g341@19@3@0#ttyname +323@6@5@1@0@0@1@@1@s0@19@3@0#getenv +250@6@5@1@0@0@1@g352@0@0,s3,g341@0@0@1@s3,tp0,tg352,g341@3@0@0#gets +805$@0@@1@tp0@3@0@0#cuserid +802$@0@s1@1@tp0,s1$@0#ctermid +201$@0@s1@1@tp0,s1@19@3@0#tmpnam +599$@0@g341@0@0@1@g341@19@3@0#asctime +602$@1@@1@s0@19@3@0#ctime +842$@1@@1@s0@19@3@0#getlogin +487$@1@@1@s0$@0#iswctype +73$@1@@1@s0$@0#isalnum#isalpha#iscntrl#isdigit#isgraph#islower#isprint#ispunct#isspace#isupper#isxdigit +481$@1@@1@s0$@0#iswalnum#iswalpha#iswcntrl#iswdigit#iswgraph#iswlower#iswprint#iswpunct#iswspace#iswupper#iswxdigit +262$@0@s3,g341@0@0@1@s3,tp3,g341$@0#fwrite +260$@0@s3,g341@0@0@1@s3,tp0,tp3,g341$@0#fread +441$@0@@1@tp1$@0#wcsrtombs +610$@0@@1@tp0$@0#strftime +379$@0@@1@tp0$@0#mbrtowc +383$@0@@1@tp0$@0#mbsrtowcs +421$@0@@1@tp0$@0#wcsftime +377$@1@@1@s0$@0#mbrlen +523$@0@@1@tp0$@0#wcstombs +553$@0@@1@tp0$@0#strxfrm +401$@0@@1@tp0$@0#wcrtomb +457$@0@@1@tp0$@0#wcsxfrm +521$@0@@1@tp0$@0#mbstowcs +561$@1@@1@s0$@0#strcspn#strspn +417$@1@@1@s0$@0#wcscspn#wcsspn +584$@1@@1@s0$@0#strlen +423$@1@@1@s0$@0#wcslen +889$@0@g341@0@0@1@g341$@0#write +864$@0@g341@0@0@1@g341,tp1$@0#read +362$@0@s3@1@s3,tp1$@0#fputwc +385$@0@s3@1@s3,tp1$@0#putwc +393$@0@s3@1@s3,tp1$@0#ungetwc +505$@1@@1@s0$@0#towctrans +354$@1@@1@s0$@0#btowc +387$@0@s3,g353@0@0@1@s3,tg353$@0#putwchar +507$@1@@1@s0$@0#towlower#towupper +356$@0@s3@1@s3,tp0$@0#fgetwc +372$@0@s3@1@s3,tp0$@0#getwc +374$@0@s3,g352@0@0@1@s3,tg352$@0#getwchar +106$@1@@1@s0@3@0@0#localeconv +211@6@5@1@0@0@0@s3,g341@0@0@1@tp2,s3,g341@3@0@0#freopen +696@6@5@1@0@0@0@g341@0@0,s3@1@g341,s3@18@0@0#fdopen +208@6@5@1@0@0@0@s3@1@s3@18@0@0#fopen +198@6@5@1@0@0@0@s3@1@s3@3@0@0#tmpfile +345$@1@@1@s0$@0#div +352$@1@@1@s0$@0#ldiv +462@6@5@1@0@0@1@@1@s0@3@0@0#wmemchr +360@6@5@1@0@0@0@s3@1@s3,tp0,tp2$@0#fgetws +473$@0@@1@tp0$@0#wmemset +467$@0@@1@tp0$@0#wmemcpy#wmemmove +451@6@5@1@0@0@0@@1@tp2@3@0@0#wcstok +446@6@5@1@0@0@1@@1@s0@3@0@0#wcsstr +438@6@5@1@0@0@1@@1@s0$@0#wcsrchr +408@6@5@1@0@0@1@@1@s0@19@2@0#wcschr +435@6@5@1@0@0@1@@1@s0$@0#wcspbrk +608@6@5@1@0@0@0@g341@0@0@1@g341@19@3@0#localtime +605@6@5@1@0@0@1@@1@s0@19@3@0#gmtime +513$@1@@1@s0$@0#wctype +511$@1@@1@s0$@0#wctrans +734$@0@@1@tp0$@0#times +589$@0@s1@1@s1$@0#clock +593$@1@@1@s0$@0#mktime +596$@0@@1@tp0$@0#time +832$@1@@1@s0$@0#getegid#getgid +856$@0@g341@0@0@1@g341$@0#lseek +755$@0@g341@0@0@1@tp1,g341$@0#waitpid +880$@0@g341@0@0@1@g341$@0#tcgetpgrp +753$@0@g341@0@0@1@tp0,g341$@0#wait +825$@0@s3,g341@0@0@1@s3,g341$@0#fork +844$@1@@1@s0$@0#getpgrp#getpid#getppid#setsid +834$@1@@1@s0$@0#geteuid#getuid +627@6@5@1@0@0@0@g341@0@0@1@g341@3@0@0#opendir +631@6@5@1@0@0@0@g341@0@0@1@g341@3@0@0#readdir +650@6@5@1@0@0@0@g341@0@0@1@g341@3@0@0#getgrnam +647@6@5@1@0@0@0@g341@0@0@1@g341@3@0@0#getgrgid +656@6@5@1@0@0@0@g341@0@0@1@g341@19@3@0#getpwnam +659@6@5@1@0@0@0@g341@0@0@1@g341@19@3@0#getpwuid +767$@1@@1@s0$@0#cfgetispeed#cfgetospeed +181@6@5@1@0@0@0@s1,g341@0@0@1@s1,g341$@0#signal +579$@0@@1@tp0$@0#memset +530$@0@@1@tp0$@0#memmove +527$@0@@1@tp0$@0#memcpy +543$@0@@1@tp0$@0#strncat +537$@0@@1@tp0$@0#strncpy +540$@0@@1@tp0$@0#strcat#strcpy +427$@0@@1@tp0$@0#wcsncat#wcsncpy +405$@0@@1@tp0$@0#wcscat#wcscpy +704$@1@@1@s0$@0#S_ISBLK#S_ISCHR#S_ISDIR#S_ISFIFO#S_ISREG +*7 (Struct tag) +620@621#@dirent +890@891#@utimbuf +341@342#@!2 +348@349#@!3 +642@643#@group +670@671#@sigaction +730@731#@tms +763@764#@termios +634@635#@flock +651@652#@passwd +735@736#@utsname +587@418#@tm +699@700#@stat +98@99#@lconv +;; Modules access +ansi#8@ +posix#13@ +;;End diff --git a/lib/unix.h b/lib/unix.h new file mode 100644 index 0000000..992a947 --- /dev/null +++ b/lib/unix.h @@ -0,0 +1,1451 @@ +/* +** unix.h +*/ + +/*@-nextlinemacros@*/ + +/* +** Extra stuff in some unixen, not in posix. +*/ + +/*@unchecked@*/ int signgam; + +typedef /*@integraltype@*/ clockid_t; + +extern void bcopy (char *b1, /*@out@*/ char *b2, int length) + /*@modifies *b2@*/ ; /* Yes, the second parameter is the out param! */ + +extern int /*@alt lltX_bool@*/ bcmp (char *b1, char *b2, int length) /*@*/ ; + /* Return value is NOT like strcmp! */ + +extern void bzero (/*@out@*/ char *b1, int length) /*@modifies *b1@*/ ; +extern int ffs (int i) /*@*/ ; +extern int symlink (char *name1, char *name2) /*@modifies fileSystem@*/ ; + +extern int + setvbuf_unlocked (FILE *stream, /*@null@*/ /*@exposed@*/ char *buf, + int mode, size_t size) + /*@modifies internalState@*/ ; + +extern void + setbuffer (FILE *stream, /*@null@*/ /*@exposed@*/ char *buf, int size) + /*@modifies internalState@*/ ; + +extern void setlinebuf (FILE *stream) /*@modifies internalState@*/ ; + +extern int strerror_r (int errnum, /*@out@*/ char *strerrbuf, int buflen) + /*@modifies strerrbuf@*/ ; + +extern size_t + fread_unlocked (/*@out@*/ void *ptr, size_t size, size_t nitems, + FILE *stream) + /*@modifies *stream, *ptr;@*/ ; + +extern size_t + fwrite_unlocked (void *pointer, size_t size, size_t num_items, FILE *stream) + /*@modifies *stream;@*/ ; + +extern void funlockfile (FILE *file) /*@modifies *file;@*/ ; +extern void flockfile (FILE *file) /*@modifies *file@*/ ; + +extern void /*@alt void * @*/ + memccpy (/*@returned@*/ /*@out@*/ void *s1, + /*@unique@*/ void *s2, int c, size_t n) + /*@modifies *s1@*/ ; + +extern int strcasecmp (char *s1, char *s2) /*@*/ ; +extern int strncasecmp (char *s1, char *s2, int n) /*@*/ ; +extern char *strdup (char *s) /*@*/ ; + +extern /*@null@*/ char *tempnam (char *dir, /*@null@*/ char *pfx) + /*@modifies internalState@*/ ; + +extern /*@null@*/ /*@dependent@*/ char * + index (/*@returned@*/ char *s, char c) /*@*/ ; + +extern /*@null@*/ /*@dependent@*/ char * + rindex (/*@returned@*/ char *s, char c) /*@*/ ; + +extern /*@dependent@*/ /*@null@*/ FILE *popen (char *command, char *ttype) + /*@modifies fileSystem, errno@*/ ; +extern int pclose (FILE *stream) /*@modifies fileSystem, *stream, errno@*/ ; + +extern double cbrt (double x) /*@modifies errno@*/ ; +extern double rint (double x) /*@*/ ; +extern double trunc (double x) /*@*/ ; + +/*@constant int ENOTBLK@*/ +/*@constant int ETXTBSY@*/ +/*@constant int EWOULDBLOCK@*/ +/*@constant int EINPROGRESS@*/ +/*@constant int EALREADY@*/ +/*@constant int ENOTSOCK@*/ +/*@constant int EDESTADDRREQ@*/ +/*@constant int EMSGSIZE@*/ +/*@constant int EPROTOTYPE@*/ +/*@constant int ENOPROTOOPT@*/ +/*@constant int EPROTONOSUPPORT@*/ +/*@constant int ESOCKTNOSUPPORT@*/ +/*@constant int EOPNOTSUPP@*/ +/*@constant int EPFNOSUPPORT@*/ +/*@constant int EAFNOSUPPORT@*/ +/*@constant int EADDRINUSE@*/ +/*@constant int EADDRNOTAVAIL@*/ +/*@constant int ENETDOWN@*/ +/*@constant int ENETUNREACH@*/ +/*@constant int ENETRESET@*/ +/*@constant int ECONNABORTED@*/ +/*@constant int ECONNRESET@*/ +/*@constant int ENOBUFS@*/ +/*@constant int EISCONN@*/ +/*@constant int ENOTCONN@*/ +/*@constant int ESHUTDOWN@*/ +/*@constant int ETOOMANYREFS@*/ +/*@constant int ETIMEDOUT@*/ +/*@constant int ECONNREFUSED@*/ +/*@constant int ENAMETOOLONG@*/ +/*@constant int EHOSTDOWN@*/ +/*@constant int EHOSTUNREACH@*/ +/*@constant int ENOTEMPTY@*/ +/*@constant int EPROCLIM@*/ +/*@constant int EUSERS@*/ +/*@constant int EDQUOT@*/ +/*@constant int ESTALE@*/ +/*@constant int EREMOTE@*/ +/*@constant int ENOMSG@*/ +/*@constant int EIDRM@*/ +/*@constant int EALIGN@*/ +/*@constant int EDEADLK@*/ +/*@constant int ENOLCK@*/ +/*@constant int ENOSYS@*/ +/*@constant int EACTIVE@*/ +/*@constant int ENOACTIVE@*/ +/*@constant int ENORESOURCES@*/ +/*@constant int ENOSYSTEM@*/ +/*@constant int ENODUST@*/ +/*@constant int EDUPNOCONN@*/ +/*@constant int EDUPNODISCONN@*/ +/*@constant int EDUPNOTCNTD@*/ +/*@constant int EDUPNOTIDLE@*/ +/*@constant int EDUPNOTWAIT@*/ +/*@constant int EDUPNOTRUN@*/ +/*@constant int EDUPBADOPCODE@*/ +/*@constant int EDUPINTRANSIT@*/ +/*@constant int EDUPTOOMANYCPUS@*/ +/*@constant int ELOOP@*/ + +/*@constant int LOCK_MAX@*/ +/*@constant int FCHR_MAX@*/ +/*@constant int USI_MAX@*/ +/*@constant int WORD_BIT@*/ +/*@constant int LONG_BIT@*/ +/*@constant long NAME_MAX@*/ +/*@constant long NGROUPS_MAX@*/ +/*@constant long MAX_INPUT@*/ +/*@constant long MAX_CANON@*/ +/*@constant int MAX_CHAR@*/ +/*@constant long OPEN_MAX@*/ +/*@constant int PASS_MAX@*/ +/*@constant int PATH_MAX@*/ +/*@constant int PID_MAX@*/ +/*@constant int SYSPID_MAX@*/ +/*@constant long PIPE_BUF@*/ +/*@constant int PIPE_MAX@*/ +/*@constant int PROC_MAX@*/ +/*@constant int STD_BLK@*/ +/*@constant int SYS_NMLN@*/ +/*@constant int SYS_OPEN@*/ +/*@constant int NZERO@*/ +/*@constant int UID_MAX@*/ +/*@constant long MB_LEN_MAX@*/ +/*@constant int NL_ARGMAX@*/ +/*@constant int NL_MSGMAX@*/ +/*@constant int NL_NMAX@*/ +/*@constant int NL_SETMAX@*/ +/*@constant int NL_TEXTMAX@*/ +/*@constant int NL_LBLMAX@*/ +/*@constant int NL_LANGMAX @*/ + +/*@constant double M_E@*/ +/*@constant double M_LOG2E@*/ +/*@constant double M_LOG10E@*/ +/*@constant double M_LN2@*/ +/*@constant double M_LN10@*/ +/*@constant double M_PI@*/ +/*@constant double M_PI_2@*/ +/*@constant double M_PI_4@*/ +/*@constant double M_1_PI@*/ +/*@constant double M_2_PI@*/ +/*@constant double M_2_SQRTPI@*/ +/*@constant double M_SQRT2@*/ +/*@constant double M_SQRT1_2@*/ + +/*@constant double MAXFLOAT@*/ +/*@constant double HUGE@*/ + +/*@constant int DOMAIN@*/ +/*@constant int SING@*/ +/*@constant int OVERFLOW@*/ +/*@constant int UNDERFLOW@*/ +/*@constant int TLOSS@*/ +/*@constant int PLOSS@*/ + +extern /*@unchecked@*/ int daylight; +extern /*@unchecked@*/ long timezone; +extern /*@unchecked@*/ char *tzname[]; + +/*@-incondefs@*/ +extern void tzset(void) /*@modifies daylight, timezone, tzname@*/ ; +/*@=incondefs@*/ + +typedef unsigned char uchar_t; +typedef unsigned short ushort_t; +typedef unsigned int uint_t; +typedef unsigned long ulong_t; +typedef volatile unsigned char vuchar_t; +typedef volatile unsigned short vushort_t; +typedef volatile unsigned int vuint_t; +typedef volatile unsigned long vulong_t; +typedef long label_t; +typedef int level_t; +typedef /*@integraltype@*/ daddr_t; +typedef char *caddr_t; +typedef long *qaddr_t; +typedef char *addr_t; +typedef long physadr_t; +typedef short cnt_t; +typedef int chan_t; +typedef unsigned long rlim_t; +typedef int paddr_t; +typedef /*@integraltype@*/ key_t; +typedef void *mid_t; +typedef char slab_t[12]; +typedef ulong_t shmatt_t; +typedef ulong_t msgqnum_t; +typedef ulong_t msglen_t; +typedef long timer_t; +typedef uchar_t uchar; +typedef ushort_t ushort; +typedef uint_t uint; +typedef ulong_t ulong; +typedef uchar_t u_char; +typedef ushort_t u_short; +typedef uint_t u_int; +typedef ulong_t u_long; +typedef vuchar_t vu_char; +typedef vushort_t vu_short; +typedef vuint_t vu_int; +typedef vulong_t vu_long; +typedef long swblk_t; +typedef u_long fixpt_t; +typedef long segsz_t; +typedef /*@abstract@*/ fd_set; + +int ttyname_r (int fg, /*@out@*/ char *buffer, int len) /*@modifies buffer@*/ ; +int ioctl (int d, int /*@alt long@*/ request, /*@out@*/ void *arg) + /*@modifies *arg, errno@*/ ; /* depends on request! */ + +int gethostname (/*@out@*/ char *address, int address_len) + /*@modifies address@*/ ; + +pid_t vfork (void) /*@modifies fileSystem@*/ ; + + + struct iovec { + void *iov_base; + size_t iov_len; +}; + +/*@constant int UIO_MAXIOV@*/ /* BSD */ +/*@constant int IOV_MAX@*/ /* supposedly SVR4 */ + + extern ssize_t +readv (int fd, const struct iovec iov[], int iovcnt) + /*@modifies iov[].iov_base, fileSystem, errno@*/; + + extern ssize_t +writev (int fd, const struct iovec iov[], int iovcnt) + /*@modifies errno@*/; + +/*________________________________________________________________________ + * poll.h + */ + + struct poll { + int fd; + short events; + short revents; +}; + +/*@constant short POLLIN@*/ +/*@constant short POLLRDNORM@*/ +/*@constant short POLLRDBAND@*/ +/*@constant short POLLPRI@*/ +/*@constant short POLLOUT@*/ +/*@constant short POLLWRNORM@*/ +/*@constant short POLLWRBAND@*/ +/*@constant short POLLERR@*/ +/*@constant short POLLHUP@*/ +/*@constant short POLLNVAL@*/ + +extern int poll (struct poll pollfd[], unsigned long nfds, int timeout) + /*@modifies pollfd[].revents, errno@*/ ; + +/* +** free does not take null +*/ + +/*@-incondefs@*/ +extern void free (/*@notnull@*/ /*@out@*/ /*@only@*/ void *p) /*@modifies *p@*/ ; +/*@=incondefs@*/ + +/*________________________________________________________________________ + * sys/socket.h + */ + +/*@constant int SOCK_STREAM@*/ +/*@constant int SOCK_DGRAM@*/ +/*@constant int SOCK_RAW@*/ +/*@constant int SOCK_RDM@*/ +/*@constant int SOCK_SEQPACKET@*/ +/*@constant int SO_DEBUG@*/ +/*@constant int SO_ACCEPTCONN@*/ +/*@constant int SO_REUSEADDR@*/ +/*@constant int SO_KEEPALIVE@*/ +/*@constant int SO_DONTROUTE@*/ +/*@constant int SO_BROADCAST@*/ +/*@constant int SO_USELOOPBACK@*/ +/*@constant int SO_LINGER@*/ +/*@constant int SO_OOBINLINE@*/ +/*@constant int SO_REUSEPORT@*/ +/*@constant int SO_SNDBUF@*/ +/*@constant int SO_RCVBUF@*/ +/*@constant int SO_SNDLOWAT@*/ +/*@constant int SO_RCVLOWAT@*/ +/*@constant int SO_SNDTIMEO@*/ +/*@constant int SO_RCVTIMEO@*/ +/*@constant int SO_ERROR@*/ +/*@constant int SO_TYPE@*/ +/*@constant int SOL_SOCKET@*/ +/*@constant int AF_UNSPEC@*/ +/*@constant int AF_LOCAL@*/ +/*@constant int AF_UNIX@*/ +/*@constant int AF_INET@*/ +/*@constant int AF_IMPLINK@*/ +/*@constant int AF_PUP@*/ +/*@constant int AF_CHAOS@*/ +/*@constant int AF_NS@*/ +/*@constant int AF_ISO@*/ +/*@constant int AF_OSI@*/ +/*@constant int AF_ECMA@*/ +/*@constant int AF_DATAKIT@*/ +/*@constant int AF_CCITT@*/ +/*@constant int AF_SNA@*/ +/*@constant int AF_DECnet@*/ +/*@constant int AF_DLI@*/ +/*@constant int AF_LAT@*/ +/*@constant int AF_HYLINK@*/ +/*@constant int AF_APPLETALK@*/ +/*@constant int AF_ROUTE@*/ +/*@constant int AF_LINK@*/ +/*@constant int pseudo_AF_XTP@*/ +/*@constant int AF_COIP@*/ +/*@constant int AF_CNT@*/ +/*@constant int pseudo_AF_RTIP@*/ +/*@constant int AF_IPX@*/ +/*@constant int AF_SIP@*/ +/*@constant int pseudo_AF_PIP@*/ +/*@constant int AF_ISDN@*/ +/*@constant int AF_E164@*/ +/*@constant int AF_MAX@*/ +/*@constant int MSG_OOB@*/ +/*@constant int MSG_PEEK@*/ +/*@constant int MSG_DONTROUTE@*/ +/*@constant int MSG_EOR@*/ +/*@constant int MSG_TRUNC@*/ +/*@constant int MSG_CTRUNC@*/ +/*@constant int MSG_WAITALL@*/ +/*@constant int MSG_DONTWAIT@*/ +/*@constant int MSG_EOF@*/ +/*@constant int MSG_COMPAT@*/ +/*@constant int PF_UNSPEC@*/ +/*@constant int PF_LOCAL@*/ +/*@constant int PF_UNIX@*/ +/*@constant int PF_INET@*/ +/*@constant int PF_IMPLINK@*/ +/*@constant int PF_PUP@*/ +/*@constant int PF_CHAOS@*/ +/*@constant int PF_NS@*/ +/*@constant int PF_ISO@*/ +/*@constant int PF_OSI@*/ +/*@constant int PF_ECMA@*/ +/*@constant int PF_DATAKIT@*/ +/*@constant int PF_CCITT@*/ +/*@constant int PF_SNA@*/ +/*@constant int PF_DECnet@*/ +/*@constant int PF_DLI@*/ +/*@constant int PF_LAT@*/ +/*@constant int PF_HYLINK@*/ +/*@constant int PF_APPLETALK@*/ +/*@constant int PF_ROUTE@*/ +/*@constant int PF_LINK@*/ +/*@constant int PF_XTP@*/ +/*@constant int PF_COIP@*/ +/*@constant int PF_CNT@*/ +/*@constant int PF_SIP@*/ +/*@constant int PF_IPX@*/ +/*@constant int PF_RTIP@*/ +/*@constant int PF_PIP@*/ +/*@constant int PF_ISDN@*/ +/*@constant int PF_MAX@*/ +/*@constant int NET_MAXID@*/ +/*@constant int NET_RT_DUMP@*/ +/*@constant int NET_RT_FLAGS@*/ +/*@constant int NET_RT_IFLIST@*/ +/*@constant int NET_RT_MAXID@*/ +/*@constant int SOMAXCONN@*/ +/*@constant int SCM_RIGHTS@*/ + + struct sockaddr { + u_char sa_len; /* total length */ + u_char sa_family; /* address family */ + char sa_data[14]; /* actually longer; address value */ +}; + + struct linger { + int l_onoff; /* option on/off */ + int l_linger; /* linger time */ +}; + + struct sockproto { + u_short sp_family; /* address family */ + u_short sp_protocol; /* protocol */ +}; + struct msghdr { + caddr_t msg_name; /* optional address */ + u_int msg_namelen; /* size of address */ + struct iovec *msg_iov; /* scatter/gather array */ + u_int msg_iovlen; /* # elements in msg_iov */ + caddr_t msg_control; /* ancillary data, see below */ + u_int msg_controllen; /* ancillary data buffer len */ + int msg_flags; /* flags on received message */ +}; + + struct cmsghdr { + u_int cmsg_len; /* data byte count, including hdr */ + int cmsg_level; /* originating protocol */ + int cmsg_type; /* protocol-specific type */ +/* followed by u_char cmsg_data[]; */ +}; + + extern int +accept (int s, struct sockaddr *addr, int *addrlen) + /*@modifies *addrlen, errno@*/; + + extern int +bind (int s, struct sockaddr *name, int namelen) + /*@modifies errno, fileSystem@*/; + + extern int +connect (int s, struct sockaddr *name, int namelen) + /*@modifies errno, internalState@*/; + + extern int +getpeername (int s, /*@out@*/ struct sockaddr *name, int *namelen) + /*@modifies *name, *namelen, errno@*/; + + extern int +getsockname (int s, struct sockaddr *name, int *namelen) + /*@modifies *name, *namelen, errno@*/; + + extern int +getsockopt (int s, int level, int optname, /*@out@*/ void *optval, int *optlen) + /*@modifies *optval, *optlen, errno@*/; + + extern int +listen (int s, int backlog) + /*@modifies errno, internalState@*/; + + extern ssize_t +recv (int s, /*@out@*/ void *buf, size_t len, int flags) + /*@modifies *buf, errno@*/; + + extern ssize_t +recvfrom (int s, void *buf, size_t len, int flags, /*@null@*/ struct sockaddr *from, int *fromlen) + /*@modifies *buf, *from, *fromlen, errno@*/; + + extern ssize_t +recvmsg (int s, struct msghdr *msg, int flags) + /*@modifies msg->msg_iov->iov_base[], errno@*/; + + extern ssize_t +send (int s, const void *msg, size_t len, int flags) + /*@modifies errno@*/; + + extern ssize_t +sendto (int s, const void *msg, size_t len, int flags, const struct sockaddr *to, int tolen) + /*@modifies errno@*/; + + extern ssize_t +sendmsg (int s, const struct msghdr *msg, int flags) + /*@modifies errno@*/; + + extern int +setsockopt (int s, int level, int optname, const void *optval, int optlen) + /*@modifies internalState, errno@*/; + + extern int +shutdown (int s, int how) + /*@modifies errno@*/; + + extern int +socket (int domain, int type, int protocol) + /*@modifies errno@*/; + + extern int +socketpair (int d, int type, int protocol, /*@out@*/ int *sv) + /*@modifies errno@*/; + +/*@constant int BADSIG@*/ +/*@constant int SA_ONSTACK@*/ +/*@constant int SA_RESTART@*/ +/*@constant int SA_DISABLE@*/ +/*@constant int SIGBUS@*/ +/*@constant int SIGEMT@*/ +/*@constant int SIGINFO@*/ +/*@constant int SIGIO@*/ +/*@constant int SIGIOT@*/ +/*@constant int SIGPOLL@*/ +/*@constant int SIGPROF@*/ +/*@constant int SIGPWR@*/ +/*@constant int SIGSYS@*/ +/*@constant int SIGTRAP@*/ +/*@constant int SIGURG@*/ +/*@constant int SIGVTALRM@*/ +/*@constant int SIGWINCH@*/ +/*@constant int SIGXCPU@*/ +/*@constant int SIGXFSZ@*/ + +extern void psignal (int sig, const char *msg) + /*@modifies fileSystem@*/; + +/*@unchecked@*/ extern char *optarg; +/*@unchecked@*/ extern int optind; +/*@unchecked@*/ extern int optopt; +/*@unchecked@*/ extern int opterr; +/*@unchecked@*/ extern int optreset; + + extern int +getopt (int argc, char * const *argv, const char *optstring) + /*@globals optarg, optind, optopt, opterr, optreset@*/ + /*@modifies optarg, optind, optopt@*/; + + extern int +setenv (const char *name, const char *value, int overwrite) + /*@globals environ@*/ + /*@modifies *environ, errno@*/; + + extern int +putenv (const char *string) + /*@globals environ@*/ + /*@modifies *environ, errno@*/; + + extern void +unsetenv (const char *name) + /*@globals environ@*/ + /*@modifies *environ@*/; + +/*________________________________________________________________________ + * sys/wait.h + */ + + extern int +WCOREDUMP (int x) + /*@*/; + + extern int +W_EXITCODE (int ret, int sig) + /*@*/; + + extern int +W_STOPCODE (int sig) + /*@*/; + +/*@constant int WAIT_ANY@*/ +/*@constant int WAIT_MYPGRP@*/ +/*@constant int WSTOPPED@*/ + + extern pid_t +wait3 (int *statloc, int options, /*@null@*/ /*@out@*/ struct rusage *rusage) + /*@modifies *statloc, *rusage, errno@*/; + + extern pid_t +wait4 (pid_t p, int *statloc, int opt, /*@null@*/ /*@out@*/ struct rusage *r) + /*@modifies *statloc, *r, errno@*/; + +struct timeval { + long tv_sec; + long tv_usec; +} ; + +struct timespec { + long ts_sec; + long ts_nsec; +} ; + +struct timezone { + int tz_minuteswest; + int tz_dsttime; +} ; + +/*@constant int DST_NONE@*/ +/*@constant int DST_USA@*/ +/*@constant int DST_AUST@*/ +/*@constant int DST_WET@*/ +/*@constant int DST_MET@*/ +/*@constant int DST_EET@*/ +/*@constant int DST_CAN@*/ + +/*@constant int ITIMER_PROF@*/ +/*@constant int ITIMER_REAL@*/ +/*@constant int ITIMER_VIRTUAL@*/ + + struct itimerval { + struct timeval it_interval; + struct timeval it_value; +}; + + struct clockinfo { + int hz; + int tick; + int stathz; + int profhz; +}; + + extern int +adjtime (const struct timeval *delta, /*@null@*/ /*@out@*/ struct timeval *olddelta) + /*@modifies internalState, *olddelta, errno@*/; + + extern int +getitimer (int which, /*@out@*/ struct itimerval *value) + /*@modifies errno, *value*/; + + extern int +gettimeofday (/*@null@*/ /*@out@*/ struct timeval *tp, /*@null@*/ /*@out@*/ struct timezone *tzp) + /*@modifies *tp, *tzp, errno@*/; + + extern int +setitimer (int which, struct itimerval *val, /*@null@*/ /*@out@*/ struct itimerval *oval) + /*@modifies *oval, errno, internalState*/; + + extern int +settimeofday (const struct timeval *t, const struct timezone *z) + /*@modifies internalState, errno@*/; + + extern int +utimes (const char *file, /*@null@*/ const struct timeval *times) + /*@modifies fileSystem, errno*/; + +/*________________________________________________________________________ + * sys/mman.h + */ + +/*@constant int PROT_READ@*/ +/*@constant int PROT_WRITE@*/ +/*@constant int PROT_EXEC@*/ +/*@constant int MAP_SHARED@*/ +/*@constant int MAP_PRIVATE@*/ +/*@constant int MAP_COPY@*/ +/*@constant int MAP_FIXED@*/ +/*@constant int MAP_RENAME@*/ +/*@constant int MAP_NORESERVE@*/ +/*@constant int MAP_INHERIT@*/ +/*@constant int MAP_NOEXTEND@*/ +/*@constant int MAP_HASSEMAPHORE@*/ +/*@constant int MS_ASYNC@*/ +/*@constant int MS_INVALIDATE@*/ +/*@constant int MAP_FILE@*/ +/*@constant int MAP_ANON@*/ +/*@constant int MADV_NORMAL@*/ +/*@constant int MADV_RANDOM@*/ +/*@constant int MADV_SEQUENTIAL@*/ +/*@constant int MADV_WILLNEED@*/ +/*@constant int MADV_DONTNEED@*/ + + extern caddr_t +mmap (/*@null@*/ /*@returned@*/ caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset) + /*@modifies addr@*/; + + extern int +madvise (caddr_t addr, int len, int behav) + /*@*/; + + extern int +mprotect (caddr_t addr, int len, int prot) + /*@*/; + + extern int +munmap (caddr_t addr, size_t len) + /*@*/; + + extern int +msync (caddr_t addr, int len, int flags) + /*@*/; + + extern int +mlock (caddr_t addr, size_t len) + /*@*/; + + extern int +munlock (caddr_t addr, size_t len) + /*@*/; + + +/*________________________________________________________________________ + * sys/ioctl.h + */ + + struct winsize { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; + unsigned short ws_ypixel; +}; + +/*@constant int TIOCMODG@*/ +/*@constant int TIOCMODS@*/ +/*@constant int TIOCM_LE@*/ +/*@constant int TIOCM_DTR@*/ +/*@constant int TIOCM_RTS@*/ +/*@constant int TIOCM_ST@*/ +/*@constant int TIOCM_SR@*/ +/*@constant int TIOCM_CTS@*/ +/*@constant int TIOCM_CAR@*/ +/*@constant int TIOCM_CD@*/ +/*@constant int TIOCM_RNG@*/ +/*@constant int TIOCM_RI@*/ +/*@constant int TIOCM_DSR@*/ +/*@constant int TIOCEXCL@*/ +/*@constant int TIOCNXCL@*/ +/*@constant int TIOCFLUSH@*/ +/*@constant int TIOCGETA@*/ +/*@constant int TIOCSETA@*/ +/*@constant int TIOCSETAW@*/ +/*@constant int TIOCSETAF@*/ +/*@constant int TIOCGETD@*/ +/*@constant int TIOCSETD@*/ +/*@constant int TIOCSBRK@*/ +/*@constant int TIOCCBRK@*/ +/*@constant int TIOCSDTR@*/ +/*@constant int TIOCCDTR@*/ +/*@constant int TIOCGPGRP@*/ +/*@constant int TIOCSPGRP@*/ +/*@constant int TIOCOUTQ@*/ +/*@constant int TIOCSTI@*/ +/*@constant int TIOCNOTTY@*/ +/*@constant int TIOCPKT@*/ +/*@constant int TIOCPKT_DATA@*/ +/*@constant int TIOCPKT_FLUSHREAD@*/ +/*@constant int TIOCPKT_FLUSHWRITE@*/ +/*@constant int TIOCPKT_STOP@*/ +/*@constant int TIOCPKT_START@*/ +/*@constant int TIOCPKT_NOSTOP@*/ +/*@constant int TIOCPKT_DOSTOP@*/ +/*@constant int TIOCPKT_IOCTL@*/ +/*@constant int TIOCSTOP@*/ +/*@constant int TIOCSTART@*/ +/*@constant int TIOCMSET@*/ +/*@constant int TIOCMBIS@*/ +/*@constant int TIOCMBIC@*/ +/*@constant int TIOCMGET@*/ +/*@constant int TIOCREMOTE@*/ +/*@constant int TIOCGWINSZ@*/ +/*@constant int TIOCSWINSZ@*/ +/*@constant int TIOCUCNTL@*/ +/*@constant int TIOCSTAT@*/ +/*@constant int TIOCCONS@*/ +/*@constant int TIOCSCTTY@*/ +/*@constant int TIOCEXT@*/ +/*@constant int TIOCSIG@*/ +/*@constant int TIOCDRAIN@*/ +/*@constant int TIOCMSDTRWAIT@*/ +/*@constant int TIOCMGDTRWAIT@*/ +/*@constant int TIOCTIMESTAMP@*/ +/*@constant int TIOCSDRAINWAIT@*/ +/*@constant int TIOCGDRAINWAIT@*/ +/*@constant int TTYDISC@*/ +/*@constant int TABLDISC@*/ +/*@constant int SLIPDISC@*/ +/*@constant int PPPDISC@*/ + +/*@constant int MAXHOSTNAMELEN@*/ + + extern void +FD_CLR (int n, fd_set *p) + /*@modifies *p@*/; + + extern void +FD_COPY (fd_set *f, /*@out@*/ fd_set *t) + /*@modifies *t@*/; + + extern int /*@alt lltX_bool@*/ +FD_ISSET (int n, fd_set *p) + /*@*/; + + extern void +FD_SET (int n, fd_set *p) + /*@modifies *p@*/; + + extern void +FD_ZERO (fd_set /*@out@*/ *p) + /*@modifies *p@*/; + + extern int +fchdir (int fd) + /*@modifies internalState, errno@*/; + + extern int +fchown (int fd, uid_t owner, gid_t group) + /*@modifies errno, fileSystem@*/; + + extern int +fsync (int fd) + /*@modifies errno, fileSystem@*/; + + extern int +ftruncate (int fd, off_t length) + /*@modifies errno, fileSystem@*/; + + extern int +gethostname (/*@out@*/ char *name, int namlen) + /*@modifies *name@*/; + + extern int +initgroups (const char *name, int basegid) + /*@modifies internalState@*/; + + extern int +lchown (const char *path, uid_t owner, gid_t group) + /*@modifies errno, fileSystem@*/; + + extern int +readlink (const char *path, /*@out@*/ char *buf, int size) + /*@modifies *buf, errno@*/; + + extern int +select (int mfd, fd_set /*@null@*/ *r, fd_set /*@null@*/ *w, fd_set /*@null@*/ *e, struct timeval *t) + /*@modifies *r, *w, *e, *t, errno@*/; + + extern int +setegid (gid_t egid) + /*@modifies errno, internalState@*/; + + extern int +seteuid (uid_t euid) + /*@modifies errno, internalState@*/; + + extern int +setgroups (int ngroups, const gid_t *gidset) + /*@modifies errno, internalState@*/; + + extern int +setregid (gid_t rgid, gid_t egid) + /*@modifies errno, internalState@*/; + + extern int +setreuid (gid_t ruid, gid_t euid) + /*@modifies errno, internalState@*/; + + extern void +sync (void) + /*@modifies fileSystem@*/; + + extern int +symlink (const char *path, const char *path2) + /*@modifies fileSystem@*/; + + extern int +truncate (const char *name, off_t length) + /*@modifies errno, fileSystem@*/; + +/*@constant int EBADRPC@*/ +/*@constant int ERPCMISMATCH@*/ +/*@constant int EPROGUNAVAIL@*/ +/*@constant int EPROGMISMATCH@*/ +/*@constant int EPROCUNAVAIL@*/ +/*@constant int EFTYPE@*/ +/*@constant int EAUTH@*/ +/*@constant int ENEEDAUTH@*/ +/*@constant int ELAST@*/ + +/*________________________________________________________________________ + * tar.h + */ + +/*@unchecked@*/ extern char *TMAGIC; +/*@constant int TMAGLEN@*/ +/*@unchecked@*/ extern char *TVERSION; +/*@constant int TVERSLEN@*/ + +/*@constant int REGTYPE@*/ +/*@constant int AREGTYPE@*/ +/*@constant int LNKTYPE@*/ +/*@constant int SYMTYPE@*/ +/*@constant int CHRTYPE@*/ +/*@constant int BLKTYPE@*/ +/*@constant int DIRTYPE@*/ +/*@constant int FIFOTYPE@*/ +/*@constant int CONTTYPE@*/ + +/*@constant int TSUID@*/ +/*@constant int TSGID@*/ +/*@constant int TSVTX@*/ + +/*@constant int TUREAD@*/ +/*@constant int TUWRITE@*/ +/*@constant int TUEXEC@*/ +/*@constant int TGREAD@*/ +/*@constant int TGWRITE@*/ +/*@constant int TGEXEC@*/ +/*@constant int TOREAD@*/ +/*@constant int TOWRITE@*/ +/*@constant int TOEXEC@*/ + +struct ipc_perm { + uid_t uid; /* user id */ + gid_t gid; /* group id */ + uid_t cuid; /* creator user id */ + gid_t cgid; /* creator group id */ + mode_t mode; /* r/w permission */ + ulong seq; /* slot usage sequence number */ + key_t key; /* user specified msg/sem/shm key */ +} ; + +/*@constant int IPC_R@*/ +/*@constant int IPC_W@*/ +/*@constant int IPC_M@*/ +/*@constant int IPC_CREAT@*/ +/*@constant int IPC_EXCL@*/ +/*@constant int IPC_NOWAIT@*/ +/*@constant key_t IPC_PRIVATE@*/ +/*@constant int IPC_RMID@*/ +/*@constant int IPC_SET@*/ +/*@constant int IPC_STAT@*/ + +/*________________________________________________________________________ + * sys/msg.h + */ + + struct msqid_ds { + struct ipc_perm msg_perm; /* msg queue permission bits */ + struct msg *msg_first; /* first message in the queue */ + struct msg *msg_last; /* last message in the queue */ + u_long msg_cbytes; /* number of bytes in use on the queue */ + u_long msg_qnum; /* number of msgs in the queue */ + u_long msg_qbytes; /* max # of bytes on the queue */ + pid_t msg_lspid; /* pid of last msgsnd() */ + pid_t msg_lrpid; /* pid of last msgrcv() */ + time_t msg_stime; /* time of last msgsnd() */ + time_t msg_rtime; /* time of last msgrcv() */ + time_t msg_ctime; /* time of last msgctl() */ +}; + + struct mymesg { + long mtype; /* message type (+ve integer) */ + char mtext[]; /* message body */ +}; + +/*@constant int MSG_NOERROR@*/ +/*@constant int MSGMAX@*/ +/*@constant int MSGMNB@*/ +/*@constant int MSGMNI@*/ +/*@constant int MSGTQL@*/ + + extern int +msgctl (int id , int cmd, /*@out@*/ struct msqid_ds *buf) + /*@modifies errno, *buf@*/; + + extern int +msgget (key_t key, int flag) + /*@modifies errno@*/; + + extern int +msgrcv (int id, /*@out@*/ void *ptr, size_t nbytes, long type, int flags) + /*@modifies errno, *ptr@*/; + + extern int +msgsnd (int id, const void *ptr, size_t nbytes, int flag) + /*@modifies errno@*/; + +/*________________________________________________________________________ + * sys/sem.h + */ + + struct semid_ds { + struct ipc_perm sem_perm; + struct sem *sem_base; + ushort sem_nsems; + time_t sem_otime; + time_t sem_ctime; +}; + + struct sem { + ushort semval; + pid_t sempid; + ushort semncnt; + ushort semzcnt; +}; + + union semun { + int val; + struct semid_ds *buf; + ushort *array; +}; + + struct sembuf { + ushort sem_num; + short sem_op; + short sem_flg; +}; + +/*@constant int SEM_A@*/ +/*@constant int SEMAEM@*/ +/*@constant int SEMMNI@*/ +/*@constant int SEMMNS@*/ +/*@constant int SEMMNU@*/ +/*@constant int SEMMSL@*/ +/*@constant int SEMOPN@*/ +/*@constant int SEM_R@*/ +/*@constant int SEMUME@*/ +/*@constant int SEM_UNDO@*/ +/*@constant int SEMVMX@*/ +/*@constant int GETVAL@*/ +/*@constant int SETVAL@*/ +/*@constant int GETPID@*/ +/*@constant int GETNCNT@*/ +/*@constant int GETZCNT@*/ +/*@constant int GETALL@*/ +/*@constant int SETALL@*/ + +/*@constant int ERMID@*/ + + extern int +semctl (int id, int semnum, int cmd, union semun arg) + /*@modifies errno@*/; + + extern int +semget (key_t key, int nsems, int flag) + /*@modifies errno@*/; + + extern int +semop (int id, struct sembuf *semoparray, size_t nops) + /*@modifies errno@*/; + +/*________________________________________________________________________ + * sys/shm.h + */ + + struct shmid_ds { + struct ipc_perm shm_perm; + int shm_segsz; + ushort shm_lkcnt; + pid_t shm_lpid; + pid_t shm_cpid; + ulong shm_nattch; + ulong shm_cnattch; + time_t shm_atime; + time_t shm_dtime; + time_t shm_ctime; +}; + +/*@constant int SHMLBA@*/ +/*@constant int SHM_LOCK@*/ +/*@constant int SHMMAX@*/ +/*@constant int SHMMIN@*/ +/*@constant int SHMMNI@*/ +/*@constant int SHM_R@*/ +/*@constant int SHM_RDONLY@*/ +/*@constant int SHM_RND@*/ +/*@constant int SHMSEG@*/ +/*@constant int SHM_W@*/ +/*@constant int SHM_UNLOCK@*/ + + void * +shmat (int id, /*@null@*/ void *addr, int flag) + /*@modifies errno@*/; + + extern int +shmctl (int id, int cmd, /*@out@*/ struct shmid_ds *buf) + /*@modifies errno, *buf@*/; + + extern int +shmdt (void *addr) + /*@modifies errno@*/; + + extern int +shmget (key_t key, int size, int flag) + /*@modifies errno@*/; + + +/*________________________________________________________________________ + * regex.h -- intended to be POSIX 1003.2 compliant + */ + + typedef off_t regoff_t; + + typedef struct { + int re_magic; + size_t re_nsub; /* number of parenthesized subexpressions */ + char *re_endp; /* end pointer for REG_PEND */ + struct re_guts *re_g; /* none of your business :-) */ +} regex_t; + + typedef struct { + regoff_t rm_so; /* start of match */ + regoff_t rm_eo; /* end of match */ +} regmatch_t; + +/* regcomp() flags */ +/*@constant int REG_BASIC@*/ +/*@constant int REG_EXTENDED@*/ +/*@constant int REG_ICASE@*/ +/*@constant int REG_NOSUB@*/ +/*@constant int REG_NEWLINE@*/ +/*@constant int REG_NOSPEC@*/ +/*@constant int REG_PEND@*/ +/*@constant int REG_DUMP@*/ + +/* regerror() flags */ +/*@constant int REG_NOMATCH@*/ +/*@constant int REG_BADPAT@*/ +/*@constant int REG_ECOLLATE@*/ +/*@constant int REG_ECTYPE@*/ +/*@constant int REG_EESCAPE@*/ +/*@constant int REG_ESUBREG@*/ +/*@constant int REG_EBRACK@*/ +/*@constant int REG_EPAREN@*/ +/*@constant int REG_EBRACE@*/ +/*@constant int REG_BADBR@*/ +/*@constant int REG_ERANGE@*/ +/*@constant int REG_ESPACE@*/ +/*@constant int REG_BADRPT@*/ +/*@constant int REG_EMPTY@*/ +/*@constant int REG_ASSERT@*/ +/*@constant int REG_INVARG@*/ +/*@constant int REG_ATOI@*/ /* non standard */ +/*@constant int REG_ITOA@*/ /* non standard */ + +/* regexec() flags */ +/*@constant int REG_NOTBOL@*/ +/*@constant int REG_NOTEOL@*/ +/*@constant int REG_STARTEND@*/ +/*@constant int REG_TRACE@*/ +/*@constant int REG_LARGE@*/ +/*@constant int REG_BACKR@*/ + + extern int +regcomp (/*@out@*/ regex_t *preg, const char *pattern, int flags) + /*@modifies *preg@*/; + + extern size_t +regerror (int code, const regex_t *re, /*@out@*/ char *errbuf, size_t bufsize) + /*@modifies *errbuf@*/; + + extern int +regexec (const regex_t *preg, const char *s, size_t n, /*@out@*/ regmatch_t *m, int f) + /*@modifies *m@*/; + + extern void +regfree (regex_t *p) + /*@modifies *p@*/; + +/*________________________________________________________________________ + * syslog.h + */ + +/*@constant int LOG_EMERG@*/ +/*@constant int LOG_ALERT@*/ +/*@constant int LOG_CRIT@*/ +/*@constant int LOG_ERR@*/ +/*@constant int LOG_WARNING@*/ +/*@constant int LOG_NOTICE@*/ +/*@constant int LOG_INFO@*/ +/*@constant int LOG_DEBUG@*/ + +/*@constant int LOG_KERN@*/ +/*@constant int LOG_USER@*/ +/*@constant int LOG_MAIL@*/ +/*@constant int LOG_DAEMON@*/ +/*@constant int LOG_AUTH@*/ +/*@constant int LOG_SYSLOG@*/ +/*@constant int LOG_LPR@*/ +/*@constant int LOG_NEWS@*/ +/*@constant int LOG_UUCP@*/ +/*@constant int LOG_CRON@*/ +/*@constant int LOG_AUTHPRIV@*/ +/*@constant int LOG_FTP@*/ +/*@constant int LOG_LOCAL0@*/ +/*@constant int LOG_LOCAL1@*/ +/*@constant int LOG_LOCAL2@*/ +/*@constant int LOG_LOCAL3@*/ +/*@constant int LOG_LOCAL4@*/ +/*@constant int LOG_LOCAL5@*/ +/*@constant int LOG_LOCAL6@*/ +/*@constant int LOG_LOCAL7@*/ + +/*@constant int LOG_PID@*/ +/*@constant int LOG_CONS@*/ +/*@constant int LOG_ODELAY@*/ +/*@constant int LOG_NDELAY@*/ +/*@constant int LOG_NOWAIT@*/ +/*@constant int LOG_PERROR@*/ + + extern int +LOG_MASK (int pri) + /*@*/; + + extern int +LOG_UPTO (int pri) + /*@*/; + + extern void +closelog (void) + /*@modifies fileSystem@*/; + + extern void +openlog (const char *ident, int logopt, int facility) + /*@modifies fileSystem@*/; + + extern int +setlogmask (int maskpri) + /*@modifies internalState@*/; + + extern void /*@printflike@*/ +syslog (int priority, const char *message, ...) + /*@modifies fileSystem@*/; + + extern void +vsyslog (int priority, const char *message, va_list args) + /*@modifies fileSystem@*/; + +/*________________________________________________________________________ + * pwd.h + */ + + extern extern void +endpwent (void) + /*@modifies internalState@*/; + + extern /*@null@*/ struct passwd * +getpwent (void) + /*@modifies internalState@*/; + + extern int +setpassent (int stayopen) + /*@modifies internalState@*/; + + extern int +setpwent (void) + /*@modifies internalState@*/; + +/*________________________________________________________________________ + * grp.h + */ + + extern void +endgrent (void) + /*@modifies internalState@*/; + + extern /*@null@*/ struct group * +getgrent (void) + /*@modifies internalState@*/; + + extern int +setgrent (void) + /*@modifies internalState@*/; + + extern void +setgrfile (const char *name) + /*@modifies internalState@*/; + + extern int +setgroupent (int stayopen) + /*@modifies internalState@*/; + +/*________________________________________________________________________ + * sys/stat.h + */ + +/*@constant int S_ISTXT@*/ +/*@constant int S_IREAD@*/ +/*@constant int S_IWRITE@*/ +/*@constant int S_IEXEC@*/ +/*@constant int S_IFMT@*/ +/*@constant int S_IFIFO@*/ +/*@constant int S_IFCHR@*/ +/*@constant int S_IFDIR@*/ +/*@constant int S_IFBLK@*/ +/*@constant int S_IFREG@*/ +/*@constant int S_IFLNK@*/ +/*@constant int S_IFSOCK@*/ +/*@constant int S_ISVTX@*/ +/*@constant int S_ISVTX@*/ +/*@constant int SF_SETTABLE@*/ +/*@constant int SF_ARCHIVED@*/ +/*@constant int ACCESSPERMS@*/ +/*@constant int ALLPERMS@*/ +/*@constant int DEFFILEMODE@*/ +/*@constant int S_BLKSIZE@*/ +/*@constant int SF_IMMUTABLE@*/ +/*@constant int SF_APPEND@*/ +/*@constant int UF_NODUMP@*/ +/*@constant int UF_IMMUTABLE@*/ +/*@constant int UF_APPEND@*/ + + extern int /*@alt lltX_bool@*/ +S_ISLNK (/*@sef@*/ mode_t m) + /*@*/; + + extern int /*@alt lltX_bool@*/ +S_ISSOCK (/*@sef@*/ mode_t m) + /*@*/; + + extern int +chflags (const char *path, u_long flags) + /*@modifies fileSystem, errno@*/; + + extern int +fchflags (int fd, u_long flags) + /*@modifies fileSystem, errno@*/; + + extern int +fchmod (int fd, mode_t mode) + /*@modifies fileSystem, errno@*/; + + extern int +lstat (const char *path, /*@out@*/ struct stat *buf) + /*@modifies errno, *buf@*/; + +/*________________________________________________________________________ + * stropts.h + */ + +/*@constant int FMNAMESZ@*/ +/*@constant int MSG_BAND@*/ +/*@constant int MSG_HIPRI@*/ +/*@constant int RS_HIPRI@*/ +/*@constant int S_INPUT@*/ +/*@constant int S_RDNORM@*/ +/*@constant int S_RDBAND@*/ +/*@constant int S_BANDURG@*/ +/*@constant int S_HIPRI@*/ +/*@constant int S_OUTPUT@*/ +/*@constant int S_WRNORM@*/ +/*@constant int S_WRBAND@*/ +/*@constant int S_MSG@*/ +/*@constant int S_ERROR@*/ +/*@constant int S_HANGUP@*/ + + struct strbuf { + int maxlen; + int len; + char *buf; +} + + struct str_mlist { + char l_name[]; +} + + struct str_list { + int sl_nmods; + struct str_mlist *sl_modlist; +} + + extern int +getmsg (int fd, /*@out@*/ struct strbuf *c, /*@out@*/ struct strbuf *d, int *f) + /*@modifies *c, *d, errno@*/; + + extern int +getpmsg (int fd, /*@out@*/ struct strbuf *c, /*@out@*/ struct strbuf *d, int *b, int *f) + /*@modifies *b, *c, *d, errno@*/; + + extern int +putmsg (int fd, const struct strbuf *c, const struct strbuf *d, int *f) + /*@modifies internalState, errno@*/; + + extern int +putpmsg (int fd, const struct strbuf *c, const struct strbuf *d, int b, int *f) + /*@modifies internalState, errno@*/; + +/*________________________________________________________________________ + * sys/resource.h + */ + +/*@constant int RLIMIT_CPU@*/ +/*@constant int RLIMIT_FSIZE@*/ +/*@constant int RLIMIT_DATA@*/ +/*@constant int RLIMIT_STACK@*/ +/*@constant int RLIMIT_CORE@*/ +/*@constant int RLIMIT_RSS@*/ +/*@constant int RLIMIT_MEMLOCK@*/ +/*@constant int RLIMIT_NPROC@*/ +/*@constant int RLIMIT_NOFILE@*/ +/*@constant int RLIM_NLIMITS@*/ +/*@constant int RLIM_INFINITY@*/ +/*@constant int PRIO_MIN@*/ +/*@constant int PRIO_MAX@*/ +/*@constant int PRIO_PROCESS@*/ +/*@constant int PRIO_PGRP@*/ +/*@constant int PRIO_USER@*/ +/*@constant int RUSAGE_SELF@*/ +/*@constant int RUSAGE_CHILDREN@*/ + + struct rusage { + struct timeval ru_utime; /* user time used */ + struct timeval ru_stime; /* system time used */ + long ru_maxrss; /* max resident set size */ + long ru_ixrss; /* integral shared memory size */ + long ru_idrss; /* integral unshared data " */ + long ru_isrss; /* integral unshared stack " */ + long ru_minflt; /* page reclaims */ + long ru_majflt; /* page faults */ + long ru_nswap; /* swaps */ + long ru_inblock; /* block input operations */ + long ru_oublock; /* block output operations */ + long ru_msgsnd; /* messages sent */ + long ru_msgrcv; /* messages received */ + long ru_nsignals; /* signals received */ + long ru_nvcsw; /* voluntary context switches */ + long ru_nivcsw; /* involuntary " */ +}; + + struct rlimit { + long rlim_cur; + long rlim_max; +}; + + struct loadavg { + unsigned long ldavg[3]; + long fscale; +}; + + extern int +getpriority (int which, int who) + /*@modifies errno@*/; + + extern int +getrlimit (int res, /*@out@*/ struct rlimit *rlp) + /*@modifies *rlp, errno@*/; + + extern int +getrusage (int who, /*@out@*/ struct rusage *rusage) + /*@modifies *rusage, errno@*/; + + extern int +setpriority (int which, int who, int prio) + /*@modifies errno, internalState@*/; + + extern int +setrlimit (int resource, const struct rlimit *rlp) + /*@modifies errno, internalState@*/; + diff --git a/lib/unix.lcd b/lib/unix.lcd new file mode 100644 index 0000000..2bf0444 --- /dev/null +++ b/lib/unix.lcd @@ -0,0 +1,1897 @@ +;;LCLint Dump: unix.lcd +;;LCLint 2.5m --- 20 May 2000 +;;lib:166 +;;ctTable +0 u-2 19 38 +0 p1|-2 20 39 +0 b-2 21 40 +0 p3|-2 22 41 +0 p4|-2 23 42 +0 p5|-2 24 43 +0 p6|-2 25 44 +0 p7|-2 26 45 +0 p8|-2 27 46 +0 p9|-2 28 47 +0 p10|-2 29 48 +0 p11|-2 30 49 +0 p12|-2 31 50 +0 p13|-2 32 51 +0 p14|-2 33 52 +0 p15|-2 34 53 +0 p16|-2 35 54 +0 p17|-2 36 55 +0 p18|-2 37 56 +1 t0|0 314 855 +1 t1|1& +1 t2|2& +1 t3|3& +1 t4|4 315 856 +1 t5|5& +1 t6|6& +1 t7|7& +1 t8|8& +1 t9|9& +1 t10|10& +1 t11|11& +1 t12|12& +1 t13|13& +1 t14|14& +1 t15|15& +1 t16|16& +1 t17|17& +1 t18|18& +2 y0|0& +2 y1|1& +2 y2|2& +2 y3|3& +2 y4|4& +2 y5|5& +2 y6|6& +2 y7|7& +2 y8|8& +2 y9|9& +2 y10|10& +2 y11|11& +2 y12|12& +2 y13|13& +2 y14|14& +2 y15|15& +2 y16|16& +2 y17|17& +2 y18|18& +-2 ?! +0 s3|& +0 s22|& +0 s23|& +0 s24|& +0 s25|& +0 s44|& +0 s45|& +0 s26|-1 383 -1 +0 s27|& +0 a0|-1 401 -1 +3 C0.5/20|! +3 C0.68/2|! +3 C0.2/5|! +3 f0 (70|@7|$#,)! +3 f1 (70|@7|$#,)! +3 C0.4/5|! +3 C0.3/5|! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f70 (74|$#,)! +3 C0.2/5|! +3 f0 (74|$#,)! +3 f2 (74|$#,)! +3 f87 (74|$#,)! +3 C0.4/5|! +3 C0.3/5|! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f87 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f87 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f87 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 C0.2/5|! +3 f104 (92|$#,)! +3 f0 (92|$#,)! +3 f2 (92|$#,)! +3 f104 (92|$#,)! +3 C0.4/5|! +3 C0.3/5|! +3 f0 (110|$#,)! +3 f2 (110|$#,)! +3 f104 (110|$#,)! +3 f0 (110|$#,)! +3 f4 (110|$#,)! +3 f109 (110|$#,)! +3 f0 (110|$#,)! +3 f4 (110|$#,)! +3 f109 (110|$#,)! +3 Slconv{23|@1|0@0@3&#decimal_point,23|@1|0@0@3&#thousands_sep,23|@1|0@0@3&#grouping,23|@1|0@0@3&#int_curr_symbol,23|@1|0@0@3&#currency_symbol,23|@1|0@0@3&#mon_decimal_point,23|@1|0@0@3&#mon_thousands_sep,23|@1|0@0@3&#mon_grouping,23|@1|0@0@3&#positive_sign,23|@1|0@0@3&#negative_sign,4|@1|^#int_frac_digits,4|@1|^#frac_digits,4|@1|^#p_cs_precedes,4|@1|^#p_sep_by_space,4|@1|^#n_cs_precedes,4|@1|^#n_sep_by_space,4|@1|^#p_sign_posn,4|@1|^#n_sign_posn,}! +0 s1443|-1 127 -1 +3 f0 (5|$#,23|0@5@7&#,)! +3 f19 (5|$#,23|0@5@7&#,)! +3 f23 (5|$#,23|0@5@7&#,)! +3 f0 ()! +3 f19 ()! +1 t121|121& +3 f127 ()! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,5|$#,)! +3 f17 (17|$#,5|$#,)! +3 f0 (17|$#,24|4@0@7&#,)! +3 f17 (17|$#,24|4@0@7&#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,36|4@0@7&#,)! +3 f17 (17|$#,36|4@0@7&#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +0 a46|& +3 f0 (173|4@0@7&#,)! +3 f5 (173|4@0@7&#,)! +3 f0 (173|$#,5|$#,)! +3 f1 (173|$#,5|$#,)! +0 s28|& +3 ?! +3 f179 (5|$#,)! +3 f1 (5|$#,)^182 +1 t181|181& +3 ?! +3 f183 (5|$#,)! +3 f1 (5|$#,)^186 +1 t185|185& +3 ?! +3 f187 (5|$#,)! +3 f1 (5|$#,)^190 +1 t189|189& +3 ?! +3 f191 (5|$#,)! +3 f1 (5|$#,)^194 +1 t193|193& +3 f0 (5|$#,194|0@5@7&#,)! +3 f19 (5|$#,194|0@5@7&#,)^197 +1 t196|196& +3 ?! +3 f198 (5|$#,)! +3 f19 (5|$#,)! +3 f1 (5|$#,194|0@5@7&#,)! +3 f1 (5|$#,)! +3 f202 (5|$#,194|0@5@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +0 a47|& +3 f0 (206|4@0@7&#,!.,)! +3 f1 (206|4@0@7&#,!.,)! +3 f0 (206|$#,)! +3 f1 (206|$#,)! +0 a48|-1 213 -1 +0 a49|-1 289 -1 +1 t211|211& +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 ()! +3 f19 ()! +3 f213 ()! +3 f0 (23|@5|4@5@7&#,)! +3 f19 (23|@5|4@5@7&#,)! +3 f23 (23|@5|4@5@7&#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (213|0@5@7&#,)! +3 f5 (213|0@5@7&#,)! +3 f0 (23|$#,23|$#,)! +3 f19 (23|$#,23|$#,)! +3 f213 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,213|$#,)! +3 f19 (23|$#,23|$#,213|$#,)! +3 f213 (23|$#,23|$#,213|$#,)! +3 f0 (213|$#,23|0@5@19@2@0#,)! +3 f1 (213|$#,23|0@5@19@2@0#,)! +3 f0 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f5 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 C0.5/1|! +3 f0 (213|$#,23|$#,!.,)! +3 f5 (213|$#,23|$#,!.,)! +3 f238 (213|$#,23|$#,!.,)! +3 f0 (213|$#,23|$#,!.,)! +3 f5 (213|$#,23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f238 (23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f238 (23|4@0@7&#,23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f0 (213|$#,23|$#,206|$#,)! +3 f5 (213|$#,23|$#,206|$#,)! +3 f0 (23|$#,206|$#,)! +3 f5 (23|$#,206|$#,)! +3 f0 (23|4@0@7&#,23|$#,206|$#,)! +3 f5 (23|4@0@7&#,23|$#,206|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (23|@5|4@0@7&#,5|$#,213|$#,)! +3 f19 (23|@5|4@0@7&#,5|$#,213|$#,)! +3 f23 (23|@5|4@0@7&#,5|$#,213|$#,)! +3 C0.5/4|! +3 f0 (265|$#,213|$#,)! +3 f5 (265|$#,213|$#,)! +3 f0 (23|$#,213|$#,)! +3 f5 (23|$#,213|$#,)! +3 f0 (213|@7|$#,)! +3 f5 (213|@7|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (23|4@0@7&#,)! +3 f19 (23|4@0@7&#,)! +3 f23 (23|4@0@7&#,)! +3 f0 (265|$#,213|@7|$#,)! +3 f5 (265|$#,213|@7|$#,)! +3 f0 (265|$#,)! +3 f5 (265|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (265|$#,213|$#,)! +3 f5 (265|$#,213|$#,)! +3 f0 (20|4@0@7&#,63|$#,63|$#,213|$#,)! +3 f63 (20|4@0@7&#,63|$#,63|$#,213|$#,)! +3 f0 (20|$#,63|$#,63|$#,213|$#,)! +3 f63 (20|$#,63|$#,63|$#,213|$#,)! +1 t212|212& +3 f0 (213|$#,289|4@0@7&#,)! +3 f5 (213|$#,289|4@0@7&#,)! +3 f0 (213|$#,9|$#,5|$#,)! +3 f5 (213|$#,9|$#,5|$#,)! +3 f0 (213|$#,289|$#,)! +3 f5 (213|$#,289|$#,)! +3 f0 (213|$#,)! +3 f9 (213|$#,)! +3 f0 (213|$#,)! +3 f1 (213|$#,)! +3 f0 (213|$#,)! +3 f1 (213|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (23|0@5@7&#,)! +3 f1 (23|0@5@7&#,)! +3 f0 (23|$#,)! +3 f17 (23|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,)! +3 f9 (23|$#,)! +1 t19|19& +1 t23|23& +3 f0 (23|$#,315|4@5@7&#,)! +3 f17 (23|$#,315|4@5@7&#,)! +3 f0 (23|$#,315|4@5@7&#,5|$#,)! +3 f9 (23|$#,315|4@5@7&#,5|$#,)! +3 f0 (23|$#,315|4@5@7&#,5|$#,)! +3 f10 (23|$#,315|4@5@7&#,5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (6|$#,)! +3 f1 (6|$#,)! +3 f0 (63|$#,63|$#,)! +3 f19 (63|$#,63|$#,)! +3 f20 (63|$#,63|$#,)! +3 f0 (63|$#,)! +3 f19 (63|$#,)! +3 f20 (63|$#,)! +3 f0 (20|@5|4@5@2&#,63|$#,)! +3 f19 (20|@5|4@5@2&#,63|$#,)! +3 f20 (20|@5|4@5@2&#,63|$#,)! +3 f0 (20|4@2@2&#,)! +3 f1 (20|4@2@2&#,)! +3 f0 ()! +3 f1 ()! +3 f0 (5|$#,)! +3 f1 (5|$#,)! +3 ?! +3 f341 ()! +3 f1 ()^344 +1 t343|343& +3 f0 (344|$#,)! +3 f5 (344|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f23 (23|$#,)! +3 f0 (23|0@5@7&#,)! +3 f5 (23|0@5@7&#,)! +3 ?! +3 f352 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^355 +1 t354|354& +3 f0 (20|$#,20|$#,63|$#,63|$#,355|$#,)! +3 f19 (20|$#,20|$#,63|$#,63|$#,355|$#,)! +3 f20 (20|$#,20|$#,63|$#,63|$#,355|$#,)! +3 ?! +3 f359 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^362 +1 t361|361& +3 f0 (20|$#,63|$#,63|$#,362|$#,)! +3 f1 (20|$#,63|$#,63|$#,362|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 S!2{5|@1|^#quot,5|@1|^#rem,}! +0 s1410|& +0 s74|& +3 f0 (5|$#,5|$#,)! +3 f369 (5|$#,5|$#,)! +3 f0 (9|$#,)! +3 f9 (9|$#,)! +3 S!3{9|@1|^#quot,9|@1|^#rem,}! +0 s1411|& +0 s75|& +3 f0 (9|$#,9|$#,)! +3 f376 (9|$#,9|$#,)! +3 f0 (5|$#,)! +3 f66 (5|$#,)! +3 f0 (213|$#,)! +3 f66 (213|$#,)! +1 t65|65 465 -1 +3 f0 (383|@5|$#,5|$#,213|$#,)! +3 f19 (383|@5|$#,5|$#,213|$#,)! +3 f383 (383|@5|$#,5|$#,213|$#,)! +3 f0 (65|$#,213|$#,)! +3 f66 (65|$#,213|$#,)! +3 f0 (383|$#,213|$#,)! +3 f5 (383|$#,213|$#,)! +3 f0 (213|$#,5|$#,)! +3 f5 (213|$#,5|$#,)! +3 f0 (213|$#,383|$#,!.,)! +3 f5 (213|$#,383|$#,!.,)! +3 f0 (213|$#,383|$#,!.,)! +3 f5 (213|$#,383|$#,!.,)! +3 f0 (213|@7|$#,)! +3 f66 (213|@7|$#,)! +3 f0 ()! +3 f66 ()! +1 t67|67& +3 f0 (23|$#,63|$#,401|0@5@7&#,)! +3 f63 (23|$#,63|$#,401|0@5@7&#,)! +3 f0 (383|0@5@7&#,23|$#,63|$#,401|0@5@7&#,)! +3 f63 (383|0@5@7&#,23|$#,63|$#,401|0@5@7&#,)! +3 f0 (401|0@5@7&#,)! +3 f5 (401|0@5@7&#,)! +3 f0 (383|0@5@7&#,315|$#,63|$#,401|0@5@7&#,)! +3 f63 (383|0@5@7&#,315|$#,63|$#,401|0@5@7&#,)! +3 f0 (65|$#,213|@7|$#,)! +3 f66 (65|$#,213|@7|$#,)! +3 f0 (65|$#,)! +3 f66 (65|$#,)! +3 f0 (383|$#,63|$#,383|$#,!.,)! +3 f5 (383|$#,63|$#,383|$#,!.,)! +3 f0 (383|$#,383|$#,!.,)! +3 f5 (383|$#,383|$#,!.,)! +3 f0 (66|$#,213|$#,)! +3 f66 (66|$#,213|$#,)! +3 f0 (213|$#,383|$#,206|$#,)! +3 f5 (213|$#,383|$#,206|$#,)! +3 f0 (383|$#,63|$#,383|$#,206|$#,)! +3 f5 (383|$#,63|$#,383|$#,206|$#,)! +3 f0 (383|$#,206|$#,)! +3 f5 (383|$#,206|$#,)! +3 f0 (23|4@5@7&#,65|$#,401|0@5@7&#,)! +3 f63 (23|4@5@7&#,65|$#,401|0@5@7&#,)! +3 C0.1/383|! +3 f0 (383|@5|4@0@9&#,383|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,)! +3 f428 (383|@5|4@0@9&#,383|$#,)! +3 f0 (383|@5|$#,65|$#,)! +3 f19 (383|@5|$#,65|$#,)! +3 f383 (383|@5|$#,65|$#,)! +3 f0 (383|$#,383|$#,)! +3 f5 (383|$#,383|$#,)! +3 f0 (383|$#,383|$#,)! +3 f5 (383|$#,383|$#,)! +3 f0 (383|@5|4@0@9&#,383|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,)! +3 f428 (383|@5|4@0@9&#,383|$#,)! +3 f0 (383|$#,383|$#,)! +3 f63 (383|$#,383|$#,)! +0 s1438|-1 445 -1 +1 t444|444& +3 f0 (383|4@0@7&#,63|$#,383|$#,445|$#,)! +3 f63 (383|4@0@7&#,63|$#,383|$#,445|$#,)! +3 f0 (383|$#,)! +3 f63 (383|$#,)! +3 C0.1/383|! +3 f0 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f450 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f0 (383|$#,383|$#,63|$#,)! +3 f5 (383|$#,383|$#,63|$#,)! +3 f0 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f1 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f450 (383|@5|4@0@9&#,383|$#,63|$#,)! +3 f0 (383|@5|$#,383|$#,)! +3 f19 (383|@5|$#,383|$#,)! +3 f383 (383|@5|$#,383|$#,)! +3 f0 (383|@5|$#,65|$#,)! +3 f19 (383|@5|$#,65|$#,)! +3 f383 (383|@5|$#,65|$#,)! +1 t383|383& +3 f0 (23|0@5@7&#,465|$#,63|$#,401|0@5@7&#,)! +3 f63 (23|0@5@7&#,465|$#,63|$#,401|0@5@7&#,)! +3 f0 (383|$#,383|$#,)! +3 f63 (383|$#,383|$#,)! +3 f0 (383|$#,383|$#,)! +3 f19 (383|$#,383|$#,)! +3 f383 (383|$#,383|$#,)! +3 f0 (383|$#,465|0@5@7&#,)! +3 f17 (383|$#,465|0@5@7&#,)! +3 f0 (383|0@5@7&#,383|$#,465|$#,)! +3 f19 (383|0@5@7&#,383|$#,465|$#,)! +3 f383 (383|0@5@7&#,383|$#,465|$#,)! +3 f0 (383|$#,465|0@5@7&#,5|$#,)! +3 f9 (383|$#,465|0@5@7&#,5|$#,)! +3 f0 (383|$#,465|0@5@7&#,5|$#,)! +3 f10 (383|$#,465|0@5@7&#,5|$#,)! +3 f0 (383|0@5@7&#,383|$#,63|$#,)! +3 f63 (383|0@5@7&#,383|$#,63|$#,)! +3 f0 (66|$#,)! +3 f5 (66|$#,)! +3 f0 (383|$#,65|$#,63|$#,)! +3 f19 (383|$#,65|$#,63|$#,)! +3 f383 (383|$#,65|$#,63|$#,)! +3 f0 (383|$#,383|$#,63|$#,)! +3 f5 (383|$#,383|$#,63|$#,)! +3 f0 (383|@5|$#,383|$#,63|$#,)! +3 f19 (383|@5|$#,383|$#,63|$#,)! +3 f383 (383|@5|$#,383|$#,63|$#,)! +3 f0 (383|@5|$#,383|$#,63|$#,)! +3 f19 (383|@5|$#,383|$#,63|$#,)! +3 f383 (383|@5|$#,383|$#,63|$#,)! +3 f0 (383|@5|$#,65|$#,63|$#,)! +3 f19 (383|@5|$#,65|$#,63|$#,)! +3 f383 (383|@5|$#,65|$#,63|$#,)! +3 f0 (383|$#,!.,)! +3 f5 (383|$#,!.,)! +3 f0 (383|$#,!.,)! +3 f5 (383|$#,!.,)! +0 s29|& +0 s30|& +3 C0.2/5|! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,504|$#,)! +3 f2 (66|$#,504|$#,)! +3 f506 (66|$#,504|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f506 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 C0.2/5|! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f524 (66|$#,)! +3 C0.2/5|! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f541 (66|$#,)! +3 C0.66/5|! +3 f0 (66|$#,505|$#,)! +3 f66 (66|$#,505|$#,)! +3 f545 (66|$#,505|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f545 (66|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f545 (66|$#,)! +3 f0 (23|$#,)! +3 f505 (23|$#,)! +3 f0 (23|$#,)! +3 f504 (23|$#,)! +3 f0 (23|$#,63|$#,)! +3 f5 (23|$#,63|$#,)! +3 f0 (383|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f5 (383|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f0 (23|4@5@7&#,65|$#,)! +3 f5 (23|4@5@7&#,65|$#,)! +3 f0 (383|4@0@7&#,23|$#,63|$#,)! +3 f63 (383|4@0@7&#,23|$#,63|$#,)! +3 f0 (23|4@0@7&#,383|$#,63|$#,)! +3 f63 (23|4@0@7&#,383|$#,63|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f569 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f0 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f569 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 C0.1/23|! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f576 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f0 (20|$#,20|$#,63|$#,)! +3 f5 (20|$#,20|$#,63|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,63|$#,)! +3 f5 (23|$#,23|$#,63|$#,)! +3 f0 (23|4@5@7&#,23|$#,63|$#,)! +3 f63 (23|4@5@7&#,23|$#,63|$#,)! +3 f0 (20|$#,5|$#,63|$#,)! +3 f19 (20|$#,5|$#,63|$#,)! +3 f20 (20|$#,5|$#,63|$#,)! +3 f0 (23|@5|$#,265|$#,)! +3 f19 (23|@5|$#,265|$#,)! +3 f23 (23|@5|$#,265|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|$#,23|$#,)! +3 f19 (23|@5|$#,23|$#,)! +3 f23 (23|@5|$#,23|$#,)! +3 f0 (23|@5|$#,265|$#,)! +3 f19 (23|@5|$#,265|$#,)! +3 f23 (23|@5|$#,265|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|0@0@9&#,23|$#,)! +3 f19 (23|@5|0@0@9&#,23|$#,)! +3 f23 (23|@5|0@0@9&#,23|$#,)! +3 f0 (23|@5|0@5@7&#,23|$#,)! +3 f19 (23|@5|0@5@7&#,23|$#,)! +3 f23 (23|@5|0@5@7&#,23|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f621 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f0 (5|$#,)! +3 f19 (5|$#,)! +3 f23 (5|$#,)! +3 f0 (23|$#,)! +3 f63 (23|$#,)! +0 s31|& +0 s32|-1 639 -1 +3 Stm{5|@1|^#tm_sec,5|@1|^#tm_min,5|@1|^#tm_hour,5|@1|^#tm_mday,5|@1|^#tm_mon,5|@1|^#tm_year,5|@1|^#tm_wday,5|@1|^#tm_yday,5|@1|^#tm_isdst,}! +3 f0 ()! +3 f630 ()! +3 f0 (631|$#,631|$#,)! +3 f17 (631|$#,631|$#,)! +3 f0 (445|$#,)! +3 f631 (445|$#,)! +1 t631|631& +3 f0 (639|4@5@7&#,)! +3 f631 (639|4@5@7&#,)! +3 f0 (445|$#,)! +3 f19 (445|$#,)! +3 f23 (445|$#,)! +3 f0 (639|$#,)! +3 f19 (639|$#,)! +3 f23 (639|$#,)! +3 f0 (639|$#,)! +3 f19 (639|$#,)! +3 f445 (639|$#,)! +3 f0 (639|$#,)! +3 f19 (639|$#,)! +3 f445 (639|$#,)! +3 f0 (23|4@0@7&#,63|$#,23|$#,445|$#,)! +3 f63 (23|4@0@7&#,63|$#,23|$#,445|$#,)! +0 s33|& +0 s34|-1 1209 876 +0 s35|& +0 s36|& +0 s37|& +0 s38|& +0 s39|& +0 s40|& +0 a50|-1 667 -1 +3 Sdirent{42|@1|^#d_name,}! +0 s1402|-1 675 -1 +1 t664|664& +3 f0 (667|$#,)! +3 f5 (667|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f667 (23|$#,)! +3 f0 (667|$#,)! +3 f19 (667|$#,)! +1 t666|666& +3 f675 (667|$#,)! +3 f0 (667|$#,)! +3 f1 (667|$#,)! +3 Sflock{7|@1|^#l_type,7|@1|^#l_whence,661|@1|^#l_start,661|@1|^#l_len,662|@1|^#l_pid,}! +0 s1432|& +3 f0 (23|$#,659|$#,)! +3 f5 (23|$#,659|$#,)! +3 f0 (5|$#,5|$#,!.,)! +3 f5 (5|$#,5|$#,!.,)! +3 f0 (23|$#,5|$#,!.,)! +3 f5 (23|$#,5|$#,!.,)! +3 Sgroup{23|@1|0@0@3&#gr_name,657|@1|^#gr_gid,315|@1|0@0@3&#gr_mem,}! +0 s1421|-1 691 -1 +3 f0 (657|$#,)! +3 f19 (657|$#,)! +1 t688|688& +3 f691 (657|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f691 (23|$#,)! +3 Spasswd{23|@1|0@0@3&#pw_name,663|@1|^#pw_uid,657|@1|^#pw_gid,23|@1|0@0@3&#pw_dir,23|@1|0@0@3&#pw_shell,}! +0 s1433|-1 700 -1 +3 f0 (23|$#,)! +3 f19 (23|$#,)! +1 t697|697& +3 f700 (23|$#,)! +3 f0 (663|$#,)! +3 f19 (663|$#,)! +3 f700 (663|$#,)! +0 a51|& +3 f0 (705|$#,5|$#,)! +3 f1 (705|$#,5|$#,)! +3 f0 (705|4@0@7&#,5|$#,)! +3 f5 (705|4@0@7&#,5|$#,)! +0 a1|-1 722 -1 +3 ?! +3 f711 ()! +3 f1 ()^714 +1 t713|713& +3 Ssigaction{!714$$$@0#sa_handler,710|@1|0@0@3&#sa_mask,5|@1|^#sa_flags,}! +0 s1423|-1 719 -1 +3 f0 (662|$#,5|$#,)! +3 f5 (662|$#,5|$#,)! +1 t716|716& +3 f0 (5|$#,719|$#,719|4@5@7&#,)! +3 f5 (5|$#,719|$#,719|4@5@7&#,)! +1 t710|710& +3 f0 (722|$#,5|$#,)! +3 f5 (722|$#,5|$#,)! +3 f0 (722|$#,5|$#,)! +3 f5 (722|$#,5|$#,)! +3 f0 (722|4@0@7&#,)! +3 f5 (722|4@0@7&#,)! +3 f0 (722|4@0@7&#,)! +3 f5 (722|4@0@7&#,)! +3 f0 (722|$#,5|$#,)! +3 f5 (722|$#,5|$#,)! +3 f0 (722|4@0@7&#,)! +3 f5 (722|4@0@7&#,)! +3 f0 (5|$#,722|0@5@7&#,722|4@5@7&#,)! +3 f5 (5|$#,722|0@5@7&#,722|4@5@7&#,)! +3 f0 (722|$#,)! +3 f5 (722|$#,)! +3 f0 (5|$#,23|$#,)! +3 f19 (5|$#,23|$#,)! +3 f213 (5|$#,23|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 Sstat{659|@1|^#st_mode,658|@1|^#st_ino,656|@1|^#st_dev,660|@1|^#st_nlink,663|@1|^#st_uid,657|@1|^#st_gid,661|@1|^#st_size,631|@1|^#st_st_atime,631|@1|^#st_st_mtime,631|@1|^#st_st_ctime,}! +0 s1440|-1 758 -1 +3 f0 (659|@7|$#,)! +3 f2 (659|@7|$#,)! +3 f0 (659|@7|$#,)! +3 f2 (659|@7|$#,)! +3 f0 (659|@7|$#,)! +3 f2 (659|@7|$#,)! +3 f0 (659|@7|$#,)! +3 f2 (659|@7|$#,)! +3 f0 (659|@7|$#,)! +3 f2 (659|@7|$#,)! +3 f0 (23|$#,659|$#,)! +3 f5 (23|$#,659|$#,)! +1 t745|745& +3 f0 (5|$#,758|4@0@7&#,)! +3 f5 (5|$#,758|4@0@7&#,)! +3 f0 (23|$#,659|$#,)! +3 f5 (23|$#,659|$#,)! +3 f0 (23|$#,659|$#,)! +3 f5 (23|$#,659|$#,)! +3 f0 (23|$#,758|4@0@7&#,)! +3 f5 (23|$#,758|4@0@7&#,)! +3 f0 (659|$#,)! +3 f5 (659|$#,)! +3 Stms{630|@1|^#tms_utime,630|@1|^#tms_stime,630|@1|^#tms_cutime,630|@1|^#tms_cstime,}! +0 s1429|-1 771 -1 +1 t770|770& +3 f0 (771|4@0@7&#,)! +3 f630 (771|4@0@7&#,)! +3 Sutsname{42|@1|^#sysname,42|@1|^#nodename,42|@1|^#release,42|@1|^#version,42|@1|^#machine,}! +0 s1435|-1 776 -1 +1 t775|775& +3 f0 (776|4@0@7&#,)! +3 f5 (776|4@0@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (24|4@5@7&#,)! +3 f662 (24|4@5@7&#,)! +3 f0 (662|$#,24|4@0@7&#,5|$#,)! +3 f662 (662|$#,24|4@0@7&#,5|$#,)! +3 C0.4/8|! +3 C0.3/8|! +0 s78|& +3 C0.9/9|! +3 C0.10/9|! +0 s79|& +0 s80|& +3 Stermios{801|@1|^#c_iflag,801|@1|^#c_oflag,801|@1|^#c_cflag,801|@1|^#c_lflag,797|@1|^#c_cc,}! +0 s1431|-1 804 -1 +1 t803|803& +3 f0 (804|$#,)! +3 f800 (804|$#,)! +3 f0 (804|$#,)! +3 f800 (804|$#,)! +3 f0 (804|$#,)! +3 f5 (804|$#,)! +3 f0 (804|$#,)! +3 f5 (804|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,804|4@0@7&#,)! +3 f5 (5|$#,804|4@0@7&#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,5|$#,804|$#,)! +3 f5 (5|$#,5|$#,804|$#,)! +3 f0 ()! +3 f1 ()! +3 f0 (5|$#,)! +3 f1 (5|$#,)! +3 f0 (23|$#,5|$#,)! +3 f5 (23|$#,5|$#,)! +3 f0 (6|$#,)! +3 f6 (6|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,663|$#,657|$#,)! +3 f5 (23|$#,663|$#,657|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|@5|4@5@7&#,)! +3 f19 (23|@5|4@5@7&#,)! +3 f23 (23|@5|4@5@7&#,)! +3 f0 (23|4@5@7&#,)! +3 f19 (23|4@5@7&#,)! +3 f23 (23|4@5@7&#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +2 y19|19& +2 y23|23& +3 f0 (23|$#,856|$#,)! +3 f5 (23|$#,856|$#,)! +3 f0 (23|$#,856|$#,315|$#,)! +3 f5 (23|$#,856|$#,315|$#,)! +3 f0 (23|$#,856|$#,)! +3 f5 (23|$#,856|$#,)! +3 f0 ()! +3 f662 ()! +3 f0 (5|$#,5|$#,)! +3 f9 (5|$#,5|$#,)! +3 f0 (23|@5|4@0@7&#,63|$#,)! +3 f19 (23|@5|4@0@7&#,63|$#,)! +3 f23 (23|@5|4@0@7&#,63|$#,)! +3 f0 ()! +3 f657 ()! +3 f0 ()! +3 f663 ()! +3 f0 ()! +3 f657 ()! +2 y657|657& +3 f0 (5|$#,876|4@0@7&#,)! +3 f5 (5|$#,876|4@0@7&#,)! +3 f0 ()! +3 f19 ()! +3 f23 ()! +3 f0 ()! +3 f662 ()! +3 f0 ()! +3 f662 ()! +3 f0 ()! +3 f662 ()! +3 f0 ()! +3 f663 ()! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (5|$#,661|$#,5|$#,)! +3 f661 (5|$#,661|$#,5|$#,)! +3 f0 (23|$#,5|$#,)! +3 f9 (23|$#,5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (43|4@0@7&#,)! +3 f5 (43|4@0@7&#,)! +3 f0 (5|$#,20|4@0@7&#,63|$#,)! +3 f64 (5|$#,20|4@0@7&#,63|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (657|$#,)! +3 f5 (657|$#,)! +3 f0 (662|$#,662|$#,)! +3 f5 (662|$#,662|$#,)! +3 f0 ()! +3 f662 ()! +3 f0 (663|$#,)! +3 f5 (663|$#,)! +3 f0 (6|$#,)! +3 f6 (6|$#,)! +3 f0 (5|$#,)! +3 f9 (5|$#,)! +3 f0 (5|$#,)! +3 f662 (5|$#,)! +3 f0 (5|$#,662|$#,)! +3 f5 (5|$#,662|$#,)! +3 f0 (5|$#,)! +3 f19 (5|$#,)! +3 f23 (5|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (5|$#,20|$#,63|$#,)! +3 f64 (5|$#,20|$#,63|$#,)! +3 Sutimbuf{631|@1|^#actime,631|@1|^#modtime,}! +0 s1404|-1 931 -1 +1 t930|930& +3 f0 (23|$#,931|0@5@7&#,)! +3 f5 (23|$#,931|0@5@7&#,)! +0 s41|& +3 f0 (23|$#,23|4@0@7&#,5|$#,)! +3 f1 (23|$#,23|4@0@7&#,5|$#,)! +3 C0.5/2|! +3 f0 (23|$#,23|$#,5|$#,)! +3 f5 (23|$#,23|$#,5|$#,)! +3 f937 (23|$#,23|$#,5|$#,)! +3 f0 (23|4@0@7&#,5|$#,)! +3 f1 (23|4@0@7&#,5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f5 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f0 (213|$#,23|0@5@19@2@0#,5|$#,)! +3 f1 (213|$#,23|0@5@19@2@0#,5|$#,)! +3 f0 (213|$#,)! +3 f1 (213|$#,)! +3 f0 (5|$#,23|4@0@7&#,5|$#,)! +3 f5 (5|$#,23|4@0@7&#,5|$#,)! +3 f0 (20|4@0@7&#,63|$#,63|$#,213|$#,)! +3 f63 (20|4@0@7&#,63|$#,63|$#,213|$#,)! +3 f0 (20|$#,63|$#,63|$#,213|$#,)! +3 f63 (20|$#,63|$#,63|$#,213|$#,)! +3 f0 (213|$#,)! +3 f1 (213|$#,)! +3 f0 (213|$#,)! +3 f1 (213|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@7&#,20|0@0@9&#,5|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,20|0@0@9&#,5|$#,63|$#,)! +3 f963 (20|@5|4@0@7&#,20|0@0@9&#,5|$#,63|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,5|$#,)! +3 f5 (23|$#,23|$#,5|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f23 (23|$#,)! +3 f0 (23|$#,23|0@5@7&#,)! +3 f19 (23|$#,23|0@5@7&#,)! +3 f23 (23|$#,23|0@5@7&#,)! +3 f0 (23|@5|$#,4|$#,)! +3 f19 (23|@5|$#,4|$#,)! +3 f23 (23|@5|$#,4|$#,)! +3 f0 (23|@5|$#,4|$#,)! +3 f19 (23|@5|$#,4|$#,)! +3 f23 (23|@5|$#,4|$#,)! +3 f0 (23|$#,23|$#,)! +3 f19 (23|$#,23|$#,)! +3 f213 (23|$#,23|$#,)! +3 f0 (213|$#,)! +3 f5 (213|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 ()! +3 f1 ()! +0 s4|& +0 s12|& +0 s9|& +0 s19|& +0 s5|& +0 s13|& +0 s10|& +0 s20|& +0 s14|& +0 s6|& +0 s42|& +0 s53|& +0 s55|& +0 s54|& +0 s15|& +0 s11|& +0 s7|& +0 s21|& +0 s8|& +0 s43|& +0 s52|& +2 F0/12|0& +2 F4/12|4& +0 s72|& +0 s63|& +0 s64|& +0 s65|& +0 s16|& +0 s57|& +0 s59|-1 1245 -1 +0 s61|& +0 s66|& +0 s58|& +0 s60|& +0 s62|& +0 s67|& +0 s68|& +0 s69|& +0 s70|& +0 s71|& +0 s17|& +0 s73|& +0 s18|& +0 a2|-1 1175 -1 +3 f0 (5|$#,23|4@0@7&#,5|$#,)! +3 f5 (5|$#,23|4@0@7&#,5|$#,)! +3 C0.5/9|! +3 f0 (5|$#,1042|$#,20|4@0@7&#,)! +3 f5 (5|$#,1042|$#,20|4@0@7&#,)! +3 f0 (23|4@0@7&#,5|$#,)! +3 f5 (23|4@0@7&#,5|$#,)! +3 f0 ()! +3 f662 ()! +3 Siovec{20|@1|0@0@3&#iov_base,63|@1|^#iov_len,}! +0 s1405|-1 1071 1051 +2 y1050|1050& +3 f0 (5|$#,1051|$#,5|$#,)! +3 f64 (5|$#,1051|$#,5|$#,)! +3 f0 (5|$#,1051|$#,5|$#,)! +3 f64 (5|$#,1051|$#,5|$#,)! +3 Spoll{5|@1|^#fd,7|@1|^#events,7|@1|^#revents,}! +0 s1420|-1 -1 1058 +2 y1057|1057& +3 f0 (1058|$#,10|$#,5|$#,)! +3 f5 (1058|$#,10|$#,5|$#,)! +3 f0 (20|4@2@2&#,)! +3 f1 (20|4@2@2&#,)! +2 F0/14|0& +2 F4/14|4& +3 Ssockaddr{1028|@1|^#sa_len,1028|@1|^#sa_family,1064|@1|^#sa_data,}! +0 s1424|-1 1076 -1 +3 Slinger{5|@1|^#l_onoff,5|@1|^#l_linger,}! +0 s1407|& +3 Ssockproto{1029|@1|^#sp_family,1029|@1|^#sp_protocol,}! +0 s1415|& +1 t1050|1050& +3 Smsghdr{1007|@1|0@0@3&#msg_name,1030|@1|^#msg_namelen,1071|@1|0@0@3&#msg_iov,1030|@1|^#msg_iovlen,1007|@1|0@0@3&#msg_control,1030|@1|^#msg_controllen,5|@1|^#msg_flags,}! +0 s1436|-1 1095 -1 +3 Scmsghdr{1030|@1|^#cmsg_len,5|@1|^#cmsg_level,5|@1|^#cmsg_type,}! +0 s1419|& +1 t1066|1066& +3 f0 (5|$#,1076|$#,24|$#,)! +3 f5 (5|$#,1076|$#,24|$#,)! +3 f0 (5|$#,1076|$#,5|$#,)! +3 f5 (5|$#,1076|$#,5|$#,)! +3 f0 (5|$#,1076|$#,5|$#,)! +3 f5 (5|$#,1076|$#,5|$#,)! +3 f0 (5|$#,1076|4@0@7&#,24|$#,)! +3 f5 (5|$#,1076|4@0@7&#,24|$#,)! +3 f0 (5|$#,1076|$#,24|$#,)! +3 f5 (5|$#,1076|$#,24|$#,)! +3 f0 (5|$#,5|$#,5|$#,20|4@0@7&#,24|$#,)! +3 f5 (5|$#,5|$#,5|$#,20|4@0@7&#,24|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,20|4@0@7&#,63|$#,5|$#,)! +3 f64 (5|$#,20|4@0@7&#,63|$#,5|$#,)! +3 f0 (5|$#,20|$#,63|$#,5|$#,1076|0@5@7&#,24|$#,)! +3 f64 (5|$#,20|$#,63|$#,5|$#,1076|0@5@7&#,24|$#,)! +1 t1073|1073& +3 f0 (5|$#,1095|$#,5|$#,)! +3 f64 (5|$#,1095|$#,5|$#,)! +3 f0 (5|$#,20|$#,63|$#,5|$#,)! +3 f64 (5|$#,20|$#,63|$#,5|$#,)! +3 f0 (5|$#,20|$#,63|$#,5|$#,1076|$#,5|$#,)! +3 f64 (5|$#,20|$#,63|$#,5|$#,1076|$#,5|$#,)! +3 f0 (5|$#,1095|$#,5|$#,)! +3 f64 (5|$#,1095|$#,5|$#,)! +3 f0 (5|$#,5|$#,5|$#,20|$#,5|$#,)! +3 f5 (5|$#,5|$#,5|$#,20|$#,5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,5|$#,5|$#,)! +3 f5 (5|$#,5|$#,5|$#,)! +3 f0 (5|$#,5|$#,5|$#,24|4@0@7&#,)! +3 f5 (5|$#,5|$#,5|$#,24|4@0@7&#,)! +3 f0 (5|$#,23|$#,)! +3 f1 (5|$#,23|$#,)! +3 f0 (5|$#,315|$#,23|$#,)! +3 f5 (5|$#,315|$#,23|$#,)! +3 f0 (23|$#,23|$#,5|$#,)! +3 f5 (23|$#,23|$#,5|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,)! +3 f1 (23|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +0 s1442|-1 1129 -1 +1 t1128|1128& +3 f0 (24|$#,5|$#,1129|4@5@7&#,)! +3 f662 (24|$#,5|$#,1129|4@5@7&#,)! +3 f0 (662|$#,24|$#,5|$#,1129|4@5@7&#,)! +3 f662 (662|$#,24|$#,5|$#,1129|4@5@7&#,)! +3 Stimeval{9|@1|^#tv_sec,9|@1|^#tv_usec,}! +0 s1417|-1 1144 -1 +3 Stimespec{9|@1|^#ts_sec,9|@1|^#ts_nsec,}! +0 s1416|& +3 Stimezone{5|@1|^#tz_minuteswest,5|@1|^#tz_dsttime,}! +0 s1418|-1 1150 -1 +3 Sitimerval{1135|@1|^#it_interval,1135|@1|^#it_value,}! +0 s1406|-1 1147 -1 +3 Sclockinfo{5|@1|^#hz,5|@1|^#tick,5|@1|^#stathz,5|@1|^#profhz,}! +0 s1426|& +1 t1135|1135& +3 f0 (1144|$#,1144|4@5@7&#,)! +3 f5 (1144|$#,1144|4@5@7&#,)! +1 t1141|1141& +3 f0 (5|$#,1147|4@0@7&#,)! +3 f5 (5|$#,1147|4@0@7&#,)! +1 t1139|1139& +3 f0 (1144|4@5@7&#,1150|4@5@7&#,)! +3 f5 (1144|4@5@7&#,1150|4@5@7&#,)! +3 f0 (5|$#,1147|$#,1147|4@5@7&#,)! +3 f5 (5|$#,1147|$#,1147|4@5@7&#,)! +3 f0 (1144|$#,1150|$#,)! +3 f5 (1144|$#,1150|$#,)! +3 f0 (23|$#,1144|0@5@7&#,)! +3 f5 (23|$#,1144|0@5@7&#,)! +3 f0 (1007|@5|0@5@7&#,63|$#,5|$#,5|$#,5|$#,661|$#,)! +3 f1007 (1007|@5|0@5@7&#,63|$#,5|$#,5|$#,5|$#,661|$#,)! +3 f0 (1007|$#,5|$#,5|$#,)! +3 f5 (1007|$#,5|$#,5|$#,)! +3 f0 (1007|$#,5|$#,5|$#,)! +3 f5 (1007|$#,5|$#,5|$#,)! +3 f0 (1007|$#,63|$#,)! +3 f5 (1007|$#,63|$#,)! +3 f0 (1007|$#,5|$#,5|$#,)! +3 f5 (1007|$#,5|$#,5|$#,)! +3 f0 (1007|$#,63|$#,)! +3 f5 (1007|$#,63|$#,)! +3 f0 (1007|$#,63|$#,)! +3 f5 (1007|$#,63|$#,)! +3 Swinsize{8|@1|^#ws_row,8|@1|^#ws_col,8|@1|^#ws_xpixel,8|@1|^#ws_ypixel,}! +0 s1430|& +1 t1039|1039& +3 f0 (5|$#,1175|$#,)! +3 f1 (5|$#,1175|$#,)! +3 f0 (1175|$#,1175|4@0@7&#,)! +3 f1 (1175|$#,1175|4@0@7&#,)! +3 f0 (5|$#,1175|$#,)! +3 f5 (5|$#,1175|$#,)! +3 f937 (5|$#,1175|$#,)! +3 f0 (5|$#,1175|$#,)! +3 f1 (5|$#,1175|$#,)! +3 f0 (1175|4@0@7&#,)! +3 f1 (1175|4@0@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,663|$#,657|$#,)! +3 f5 (5|$#,663|$#,657|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,661|$#,)! +3 f5 (5|$#,661|$#,)! +3 f0 (23|4@0@7&#,5|$#,)! +3 f5 (23|4@0@7&#,5|$#,)! +3 f0 (23|$#,5|$#,)! +3 f5 (23|$#,5|$#,)! +3 f0 (23|$#,663|$#,657|$#,)! +3 f5 (23|$#,663|$#,657|$#,)! +3 f0 (23|$#,23|4@0@7&#,5|$#,)! +3 f5 (23|$#,23|4@0@7&#,5|$#,)! +3 f0 (5|$#,1175|0@5@7&#,1175|0@5@7&#,1175|0@5@7&#,1144|$#,)! +3 f5 (5|$#,1175|0@5@7&#,1175|0@5@7&#,1175|0@5@7&#,1144|$#,)! +3 f0 (657|$#,)! +3 f5 (657|$#,)! +3 f0 (663|$#,)! +3 f5 (663|$#,)! +1 t657|657& +3 f0 (5|$#,1209|$#,)! +3 f5 (5|$#,1209|$#,)! +3 f0 (657|$#,657|$#,)! +3 f5 (657|$#,657|$#,)! +3 f0 (657|$#,657|$#,)! +3 f5 (657|$#,657|$#,)! +3 f0 ()! +3 f1 ()! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,661|$#,)! +3 f5 (23|$#,661|$#,)! +3 Sipc_perm{663|@1|^#uid,657|@1|^#gid,663|@1|^#cuid,657|@1|^#cgid,659|@1|^#mode,1027|@1|^#seq,1015|@1|^#key,}! +0 s1437|& +0 s1400|-1 1225 -1 +1 t1224|1224& +3 Smsqid_ds{1223|@1|^#msg_perm,1225|@1|0@0@3&#msg_first,1225|@1|0@0@3&#msg_last,1031|@1|^#msg_cbytes,1031|@1|^#msg_qnum,1031|@1|^#msg_qbytes,662|@1|^#msg_lspid,662|@1|^#msg_lrpid,631|@1|^#msg_stime,631|@1|^#msg_rtime,631|@1|^#msg_ctime,}! +0 s1441|-1 1230 -1 +3 Smymesg{9|@1|^#mtype,42|@1|^#mtext,}! +0 s1409|& +1 t1227|1227& +3 f0 (5|$#,5|$#,1230|4@0@7&#,)! +3 f5 (5|$#,5|$#,1230|4@0@7&#,)! +3 f0 (1015|$#,5|$#,)! +3 f5 (1015|$#,5|$#,)! +3 f0 (5|$#,20|4@0@7&#,63|$#,9|$#,5|$#,)! +3 f5 (5|$#,20|4@0@7&#,63|$#,9|$#,5|$#,)! +3 f0 (5|$#,20|$#,63|$#,5|$#,)! +3 f5 (5|$#,20|$#,63|$#,5|$#,)! +0 s1428|-1 1240 -1 +1 t1239|1239& +3 Ssemid_ds{1223|@1|^#sem_perm,1240|@1|0@0@3&#sem_base,1025|@1|^#sem_nsems,631|@1|^#sem_otime,631|@1|^#sem_ctime,}! +0 s1434|-1 1244 -1 +3 Ssem{1025|@1|^#semval,662|@1|^#sempid,1025|@1|^#semncnt,1025|@1|^#semzcnt,}! +1 t1242|1242& +1 t1025|1025& +3 Usemun{5|@1|^#val,1244|@1|0@0@3&#buf,1245|@1|0@0@3&#array,}! +0 s1444|& +3 Ssembuf{1025|@1|^#sem_num,7|@1|^#sem_op,7|@1|^#sem_flg,}! +0 s1425|-1 1254 -1 +3 f0 (5|$#,5|$#,5|$#,1247|$#,)! +3 f5 (5|$#,5|$#,5|$#,1247|$#,)! +3 f0 (1015|$#,5|$#,5|$#,)! +3 f5 (1015|$#,5|$#,5|$#,)! +1 t1249|1249& +3 f0 (5|$#,1254|$#,63|$#,)! +3 f5 (5|$#,1254|$#,63|$#,)! +3 Sshmid_ds{1223|@1|^#shm_perm,5|@1|^#shm_segsz,1025|@1|^#shm_lkcnt,662|@1|^#shm_lpid,662|@1|^#shm_cpid,1027|@1|^#shm_nattch,1027|@1|^#shm_cnattch,631|@1|^#shm_atime,631|@1|^#shm_dtime,631|@1|^#shm_ctime,}! +0 s1439|-1 1262 -1 +3 f0 (5|$#,20|0@5@7&#,5|$#,)! +3 f19 (5|$#,20|0@5@7&#,5|$#,)! +3 f20 (5|$#,20|0@5@7&#,5|$#,)! +1 t1258|1258& +3 f0 (5|$#,5|$#,1262|4@0@7&#,)! +3 f5 (5|$#,5|$#,1262|4@0@7&#,)! +3 f0 (20|$#,)! +3 f5 (20|$#,)! +3 f0 (1015|$#,5|$#,5|$#,)! +3 f5 (1015|$#,5|$#,5|$#,)! +0 s56|& +0 s1401|-1 1271 -1 +1 t1270|1270& +3 S!4{5|@1|^#re_magic,63|@1|^#re_nsub,23|@1|0@0@3&#re_endp,1271|@1|0@0@3&#re_g,}! +0 s1427|& +0 s77|-1 1278 -1 +3 S!5{1269|@1|^#rm_so,1269|@1|^#rm_eo,}! +0 s1413|& +0 s76|-1 1283 -1 +1 t1274|1274& +3 f0 (1278|4@0@7&#,23|$#,5|$#,)! +3 f5 (1278|4@0@7&#,23|$#,5|$#,)! +3 f0 (5|$#,1278|$#,23|4@0@7&#,63|$#,)! +3 f63 (5|$#,1278|$#,23|4@0@7&#,63|$#,)! +1 t1277|1277& +3 f0 (1278|$#,23|$#,63|$#,1283|4@0@7&#,5|$#,)! +3 f5 (1278|$#,23|$#,63|$#,1283|4@0@7&#,5|$#,)! +3 f0 (1278|$#,)! +3 f1 (1278|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 ()! +3 f1 ()! +3 f0 (23|$#,5|$#,5|$#,)! +3 f1 (23|$#,5|$#,5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,23|$#,!.,)! +3 f1 (5|$#,23|$#,!.,)! +3 f0 (5|$#,23|$#,206|$#,)! +3 f1 (5|$#,23|$#,206|$#,)! +3 f0 ()! +3 f1 ()! +3 f0 ()! +3 f19 ()! +3 f700 ()! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 ()! +3 f1 ()! +3 f0 ()! +3 f19 ()! +3 f691 ()! +3 f0 ()! +3 f5 ()! +3 f0 (23|$#,)! +3 f1 (23|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (659|@7|$#,)! +3 f5 (659|@7|$#,)! +3 f937 (659|@7|$#,)! +3 f0 (659|@7|$#,)! +3 f5 (659|@7|$#,)! +3 f937 (659|@7|$#,)! +3 f0 (23|$#,1031|$#,)! +3 f5 (23|$#,1031|$#,)! +3 f0 (5|$#,1031|$#,)! +3 f5 (5|$#,1031|$#,)! +3 f0 (5|$#,659|$#,)! +3 f5 (5|$#,659|$#,)! +3 f0 (23|$#,758|4@0@7&#,)! +3 f5 (23|$#,758|4@0@7&#,)! +3 Sstrbuf{5|@1|^#maxlen,5|@1|^#len,23|@1|0@0@3&#buf,}! +0 s1422|-1 1343 -1 +3 Sstr_mlist{42|@1|^#l_name,}! +0 s1403|-1 1340 -1 +1 t1339|1339& +3 Sstr_list{5|@1|^#sl_nmods,1340|@1|0@0@3&#sl_modlist,}! +0 s1414|& +1 t1337|1337& +3 f0 (5|$#,1343|4@0@7&#,1343|4@0@7&#,24|$#,)! +3 f5 (5|$#,1343|4@0@7&#,1343|4@0@7&#,24|$#,)! +3 f0 (5|$#,1343|4@0@7&#,1343|4@0@7&#,24|$#,24|$#,)! +3 f5 (5|$#,1343|4@0@7&#,1343|4@0@7&#,24|$#,24|$#,)! +3 f0 (5|$#,1343|$#,1343|$#,24|$#,)! +3 f5 (5|$#,1343|$#,1343|$#,24|$#,)! +3 f0 (5|$#,1343|$#,1343|$#,5|$#,24|$#,)! +3 f5 (5|$#,1343|$#,1343|$#,5|$#,24|$#,)! +3 Srusage{1135|@1|^#ru_utime,1135|@1|^#ru_stime,9|@1|^#ru_maxrss,9|@1|^#ru_ixrss,9|@1|^#ru_idrss,9|@1|^#ru_isrss,9|@1|^#ru_minflt,9|@1|^#ru_majflt,9|@1|^#ru_nswap,9|@1|^#ru_inblock,9|@1|^#ru_oublock,9|@1|^#ru_msgsnd,9|@1|^#ru_msgrcv,9|@1|^#ru_nsignals,9|@1|^#ru_nvcsw,9|@1|^#ru_nivcsw,}! +3 Srlimit{9|@1|^#rlim_cur,9|@1|^#rlim_max,}! +0 s1412|-1 1361 -1 +2 F0/3|0& +2 F10/3|10& +3 Sloadavg{1356|@1|^#ldavg,9|@1|^#fscale,}! +0 s1408|& +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +1 t1354|1354& +3 f0 (5|$#,1361|4@0@7&#,)! +3 f5 (5|$#,1361|4@0@7&#,)! +3 f0 (5|$#,1129|4@0@7&#,)! +3 f5 (5|$#,1129|4@0@7&#,)! +3 f0 (5|$#,5|$#,5|$#,)! +3 f5 (5|$#,5|$#,5|$#,)! +3 f0 (5|$#,1361|$#,)! +3 f5 (5|$#,1361|$#,)! +;;tistable +0 +0,46 +46 +0,46,47 +47 +0,46,47,48 +48 +0,46,47,48,49 +49 +50 +50,51 +51 +50,51,1 +1 +2 +;;symTable +*0 (Datatype) +0@+@=@0@0@0@0@67#mbstate_t +0@+@=@0@0@0@0@710#sigset_t +0@+@=@0@0@0@0@1039#fd_set +2@-@-@0@0@0@0@2#lltX_bool +3@-@-@0@0@0@0@996#uchar_t +3@-@-@0@0@0@0@1000#vuchar_t +5@-@-@0@0@0@0@1005#level_t +5@-@-@0@0@0@0@1012#chan_t +5@-@-@0@0@0@0@1014#paddr_t +6@-@-@0@0@0@0@998#uint_t +6@-@-@0@0@0@0@1002#vuint_t +7@-@-@0@0@0@0@1011#cnt_t +8@-@-@0@0@0@0@997#ushort_t +8@-@-@0@0@0@0@1001#vushort_t +9@-@-@0@0@0@0@1004#label_t +9@-@-@0@0@0@0@1010#physadr_t +9@-@-@0@0@0@0@1023#timer_t +9@-@-@0@0@0@0@1036#swblk_t +9@-@-@0@0@0@0@1038#segsz_t +10@-@-@0@0@0@0@999#ulong_t +10@-@-@0@0@0@0@1003#vulong_t +10@-@-@0@0@0@0@1013#rlim_t +13@-@-@0@0@0@0@59#__SIZE_TYPE__ +13@-@-@0@0@0@0@60#__PTRDIFF_TYPE__ +13@-@-@0@0@0@0@61#__WCHAR_TYPE__ +13@-@-@0@0@0@0@62#ptrdiff_t +13@-@-@0@0@0@0@65#wchar_t +13@-@-@0@0@0@0@66#wint_t +13@-@-@0@0@0@0@178#sig_atomic_t +13@-@-@0@0@0@0@504#wctype_t +13@-@-@0@0@0@0@505#wctrans_t +13@-@-@0@0@0@0@630#clock_t +13@-@-@0@0@0@0@631#time_t +13@-@-@0@0@0@0@656#dev_t +13@-@-@0@0@0@0@657#gid_t +13@-@-@0@0@0@0@658#ino_t +13@-@-@0@0@0@0@659#mode_t +13@-@-@0@0@0@0@660#nlink_t +13@-@-@0@0@0@0@661#off_t +13@-@-@0@0@0@0@662#pid_t +13@-@-@0@0@0@0@663#uid_t +13@-@-@0@0@0@0@934#clockid_t +13@-@-@0@0@0@0@1006#daddr_t +13@-@-@0@0@0@0@1015#key_t +14@-@-@0@0@0@0@63#size_t +15@-@-@0@0@0@0@64#ssize_t +20@+@+@0@0@0@0@173#jmp_buf +20@+@+@0@0@0@0@206#va_list +20@+@+@0@0@0@0@211#FILE +20@+@+@0@0@0@0@212#fpos_t +20@+@+@0@0@0@0@664#DIR +20@+@+@0@0@0@0@705#sigjmp_buf +20@-@+@0@0@0@0@1016#mid_t +23@-@+@0@0@0@0@1007#caddr_t +23@-@+@0@0@0@0@1009#addr_t +28@-@+@0@0@0@0@1008#qaddr_t +661@-@-@0@0@0@0@1269#regoff_t +996@-@-@0@0@0@0@1024#uchar +996@-@-@0@0@0@0@1028#u_char +997@-@-@0@0@0@0@1025#ushort +997@-@-@0@0@0@0@1029#u_short +998@-@-@0@0@0@0@1026#uint +998@-@-@0@0@0@0@1030#u_int +999@-@-@0@0@0@0@1020#shmatt_t +999@-@-@0@0@0@0@1021#msgqnum_t +999@-@-@0@0@0@0@1022#msglen_t +999@-@-@0@0@0@0@1027#ulong +999@-@-@0@0@0@0@1031#u_long +1000@-@-@0@0@0@0@1032#vu_char +1001@-@-@0@0@0@0@1033#vu_short +1002@-@-@0@0@0@0@1034#vu_int +1003@-@-@0@0@0@0@1035#vu_long +1018@-@-@0@0@0@0@1019#slab_t +1031@-@-@0@0@0@0@1037#fixpt_t +367@-@-@0@0@0@0@369#div_t +374@-@-@0@0@0@0@376#ldiv_t +1275@-@-@0@0@0@0@1277#regmatch_t +1272@-@-@0@0@0@0@1274#regex_t +796@-@-@0@0@0@0@797#cc_t +799@-@-@0@0@0@0@800#speed_t +799@-@-@0@0@0@0@801#tcflag_t +*1 (Constant) +0@i0@0@6#NULL +2@i1@0@0#TRUE +2@i0@0@6#FALSE +3$#UCHAR_MAX#UCHAR_MIN +4$#CHAR_MAX#CHAR_MIN#SCHAR_MAX#SCHAR_MIN +5$#ACCESSPERMS#AF_APPLETALK#AF_CCITT#AF_CHAOS#AF_CNT#AF_COIP#AF_DATAKIT#AF_DECnet#AF_DLI#AF_E164#AF_ECMA#AF_HYLINK#AF_IMPLINK#AF_INET#AF_IPX#AF_ISDN#AF_ISO#AF_LAT#AF_LINK#AF_LOCAL#AF_MAX#AF_NS#AF_OSI#AF_PUP#AF_ROUTE#AF_SIP#AF_SNA#AF_UNIX#AF_UNSPEC#ALLPERMS#AREGTYPE#B0#B110#B1200#B134#B150#B1800#B19200#B200#B2400#B300#B38400#B4800#B50#B600#B75#B9600#BADSIG#BLKTYPE#BRKINT#BUFSIZ#CHAR_BIT#CHRTYPE#CLK_TCK#CLOCAL#CLOCKS_PER_SEC#CONTTYPE#CREAD#CS5#CS6#CS7#CS8#CSIZE#CSTOPB#DEFFILEMODE#DIRTYPE#DOMAIN#DST_AUST#DST_CAN#DST_EET#DST_MET#DST_NONE#DST_USA#DST_WET#E2BIG#EACCES#EACTIVE#EADDRINUSE#EADDRNOTAVAIL#EAFNOSUPPORT#EAGAIN#EALIGN#EALREADY#EAUTH#EBADF#EBADRPC#EBUSY#ECHILD#ECHO#ECHOE#ECHOK#ECHONL#ECONNABORTED#ECONNREFUSED#ECONNRESET#EDEADLK#EDESTADDRREQ#EDOM#EDQUOT#EDUPBADOPCODE#EDUPINTRANSIT#EDUPNOCONN#EDUPNODISCONN#EDUPNOTCNTD#EDUPNOTIDLE#EDUPNOTRUN#EDUPNOTWAIT#EDUPTOOMANYCPUS#EEXIST#EFAULT#EFBIG#EFTYPE#EHOSTDOWN#EHOSTUNREACH#EIDRM#EILSEQ#EINPROGRESS#EINTR#EINVAL#EIO#EISCONN#EISDIR#ELAST#ELOOP#EMFILE#EMLINK#EMSGSIZE#ENAMETOOLONG#ENEEDAUTH#ENETDOWN#ENETRESET#ENETUNREACH#ENFILE#ENOACTIVE#ENOBUFS#ENODEV#ENODUST#ENOENT#ENOEXEC#ENOLCK#ENOMEM#ENOMSG#ENOPROTOOPT#ENORESOURCES#ENOSPC#ENOSYS#ENOSYSTEM#ENOTBLK#ENOTCONN#ENOTDIR#ENOTEMPTY#ENOTSOCK#ENOTTY#ENXIO#EOF#EOPNOTSUPP#EPERM#EPFNOSUPPORT#EPIPE#EPROCLIM#EPROCUNAVAIL#EPROGMISMATCH#EPROGUNAVAIL#EPROTONOSUPPORT#EPROTOTYPE#ERANGE#EREMOTE#ERMID#EROFS#ERPCMISMATCH#ESHUTDOWN#ESOCKTNOSUPPORT#ESPIPE#ESRCH#ESTALE#ETIMEDOUT#ETOOMANYREFS#ETXTBSY#EUSERS#EWOULDBLOCK#EXDEV#EXIT_FAILURE#EXIT_SUCCESS#FCHR_MAX#FD_CLOEXEC#FIFOTYPE#FILENAME_MAX#FLT_RADIX#FMNAMESZ#FOPEN_MAX#F_DUPFD#F_GETFD#F_GETFL#F_GETLK#F_OK#F_RDLCK#F_SETFD#F_SETFL#F_SETLK#F_SETLKW#F_UNLCK#F_WRLCK#GETALL#GETNCNT#GETPID#GETVAL#GETZCNT#HUPCL#ICANON#ICRNL#IEXTEN#IGNBRK#IGNCR#IGNLCR#IGNPAR#INPCK#INT_MAX#INT_MIN#IOV_MAX#IPC_CREAT#IPC_EXCL#IPC_M#IPC_NOWAIT#IPC_R#IPC_RMID#IPC_SET#IPC_STAT#IPC_W#ISIG#ISTRIP#ITIMER_PROF#ITIMER_REAL#ITIMER_VIRTUAL#IXOFF#IXON#LC_ALL#LC_COLLATE#LC_CTYPE#LC_MONETARY#LC_NUMERIC#LC_TIME#LNKTYPE#LOCK_MAX#LOG_ALERT#LOG_AUTH#LOG_AUTHPRIV#LOG_CONS#LOG_CRIT#LOG_CRON#LOG_DAEMON#LOG_DEBUG#LOG_EMERG#LOG_ERR#LOG_FTP#LOG_INFO#LOG_KERN#LOG_LOCAL0#LOG_LOCAL1#LOG_LOCAL2#LOG_LOCAL3#LOG_LOCAL4#LOG_LOCAL5#LOG_LOCAL6#LOG_LOCAL7#LOG_LPR#LOG_MAIL#LOG_NDELAY#LOG_NEWS#LOG_NOTICE#LOG_NOWAIT#LOG_ODELAY#LOG_PERROR#LOG_PID#LOG_SYSLOG#LOG_USER#LOG_UUCP#LOG_WARNING#LONG_BIT#L_ctermid#L_cuserid#L_tmpnam#MADV_DONTNEED#MADV_NORMAL#MADV_RANDOM#MADV_SEQUENTIAL#MADV_WILLNEED#MAP_ANON#MAP_COPY#MAP_FILE#MAP_FIXED#MAP_HASSEMAPHORE#MAP_INHERIT#MAP_NOEXTEND#MAP_NORESERVE#MAP_PRIVATE#MAP_RENAME#MAP_SHARED#MAXHOSTNAMELEN#MAX_CHAR#MSGMAX#MSGMNB#MSGMNI#MSGTQL#MSG_BAND#MSG_COMPAT#MSG_CTRUNC#MSG_DONTROUTE#MSG_DONTWAIT#MSG_EOF#MSG_EOR#MSG_HIPRI#MSG_NOERROR#MSG_OOB#MSG_PEEK#MSG_TRUNC#MSG_WAITALL#MS_ASYNC#MS_INVALIDATE#NCCS#NET_MAXID#NET_RT_DUMP#NET_RT_FLAGS#NET_RT_IFLIST#NET_RT_MAXID#NL_ARGMAX#NL_LANGMAX#NL_LBLMAX#NL_MSGMAX#NL_NMAX#NL_SETMAX#NL_TEXTMAX#NOFLSH#NZERO#OPOST#OVERFLOW#O_ACCMODE#O_APPEND#O_CREAT#O_EXCL#O_NOCTTY#O_NONBLOCK#O_RDONLY#O_RDWR#O_TRUNC#O_WRONLY#PARENB#PARMRK#PARODD#PASS_MAX#PATH_MAX#PF_APPLETALK#PF_CCITT#PF_CHAOS#PF_CNT#PF_COIP#PF_DATAKIT#PF_DECnet#PF_DLI#PF_ECMA#PF_HYLINK#PF_IMPLINK#PF_INET#PF_IPX#PF_ISDN#PF_ISO#PF_LAT#PF_LINK#PF_LOCAL#PF_MAX#PF_NS#PF_OSI#PF_PIP#PF_PUP#PF_ROUTE#PF_RTIP#PF_SIP#PF_SNA#PF_UNIX#PF_UNSPEC#PF_XTP#PID_MAX#PIPE_MAX#PLOSS#PPPDISC#PRIO_MAX#PRIO_MIN#PRIO_PGRP#PRIO_PROCESS#PRIO_USER#PROC_MAX#PROT_EXEC#PROT_READ#PROT_WRITE#RAND_MAX#REGTYPE#REG_ASSERT#REG_ATOI#REG_BACKR#REG_BADBR#REG_BADPAT#REG_BADRPT#REG_BASIC#REG_DUMP#REG_EBRACE#REG_EBRACK#REG_ECOLLATE#REG_ECTYPE#REG_EESCAPE#REG_EMPTY#REG_EPAREN#REG_ERANGE#REG_ESPACE#REG_ESUBREG#REG_EXTENDED#REG_ICASE#REG_INVARG#REG_ITOA#REG_LARGE#REG_NEWLINE#REG_NOMATCH#REG_NOSPEC#REG_NOSUB#REG_NOTBOL#REG_NOTEOL#REG_PEND#REG_STARTEND#REG_TRACE#RLIMIT_CORE#RLIMIT_CPU#RLIMIT_DATA#RLIMIT_FSIZE#RLIMIT_MEMLOCK#RLIMIT_NOFILE#RLIMIT_NPROC#RLIMIT_RSS#RLIMIT_STACK#RLIM_INFINITY#RLIM_NLIMITS#RS_HIPRI#RUSAGE_CHILDREN#RUSAGE_SELF#R_OK#SA_DISABLE#SA_NOCLDSTOP#SA_ONSTACK#SA_RESTART#SCM_RIGHTS#SEEK_CUR#SEEK_END#SEEK_SET#SEMAEM#SEMMNI#SEMMNS#SEMMNU#SEMMSL#SEMOPN#SEMUME#SEMVMX#SEM_A#SEM_R#SEM_UNDO#SETALL#SETVAL#SF_APPEND#SF_ARCHIVED#SF_IMMUTABLE#SF_SETTABLE#SHMLBA#SHMMAX#SHMMIN#SHMMNI#SHMSEG#SHM_LOCK#SHM_R#SHM_RDONLY#SHM_RND#SHM_UNLOCK#SHM_W#SIGABRT#SIGALRM#SIGBUS#SIGCHLD#SIGCONT#SIGEMT#SIGFPE#SIGHUP#SIGILL#SIGINFO#SIGINT#SIGIO#SIGIOT#SIGKILL#SIGPIPE#SIGPOLL#SIGPROF#SIGPWR#SIGQUIT#SIGSEGV#SIGSTOP#SIGSYS#SIGTERM#SIGTRAP#SIGTSTP#SIGTTIN#SIGTTOU#SIGURG#SIGUSR1#SIGUSR2#SIGVTALRM#SIGWINCH#SIGXCPU#SIGXFSZ#SIG_BLOCK#SIG_SETMASK#SIG_UNBLOCK#SING#SLIPDISC#SOCK_DGRAM#SOCK_RAW#SOCK_RDM#SOCK_SEQPACKET#SOCK_STREAM#SOL_SOCKET#SOMAXCONN#SO_ACCEPTCONN#SO_BROADCAST#SO_DEBUG#SO_DONTROUTE#SO_ERROR#SO_KEEPALIVE#SO_LINGER#SO_OOBINLINE#SO_RCVBUF#SO_RCVLOWAT#SO_RCVTIMEO#SO_REUSEADDR#SO_REUSEPORT#SO_SNDBUF#SO_SNDLOWAT#SO_SNDTIMEO#SO_TYPE#SO_USELOOPBACK#STDERR_FILENO#STDIN_FILENO#STDOUT_FILENO#STD_BLK#SYMTYPE#SYSPID_MAX#SYS_NMLN#SYS_OPEN#S_BANDURG#S_BLKSIZE#S_ERROR#S_HANGUP#S_HIPRI#S_IEXEC#S_IFBLK#S_IFCHR#S_IFDIR#S_IFIFO#S_IFLNK#S_IFMT#S_IFREG#S_IFSOCK#S_INPUT#S_IREAD#S_IRGRP#S_IROTH#S_ISGID#S_ISTXT#S_ISUID#S_ISVTX#S_IUSR#S_IWGRP#S_IWOTH#S_IWRITE#S_IWUSR#S_IWXG#S_IWXO#S_IWXU#S_IXGRP#S_IXOTH#S_IXUSR#S_MSG#S_OUTPUT#S_RDBAND#S_RDNORM#S_WRBAND#S_WRNORM#TABLDISC#TCIFLUSH#TCIOFF#TCIOFLUSH#TCION#TCOFLUSH#TCSADRAIN#TCSAFLUSH#TCSANOW#TGEXEC#TGREAD#TGWRITE#TIOCCBRK#TIOCCDTR#TIOCCONS#TIOCDRAIN#TIOCEXCL#TIOCEXT#TIOCFLUSH#TIOCGDRAINWAIT#TIOCGETA#TIOCGETD#TIOCGPGRP#TIOCGWINSZ#TIOCMBIC#TIOCMBIS#TIOCMGDTRWAIT#TIOCMGET#TIOCMODG#TIOCMODS#TIOCMSDTRWAIT#TIOCMSET#TIOCM_CAR#TIOCM_CD#TIOCM_CTS#TIOCM_DSR#TIOCM_DTR#TIOCM_LE#TIOCM_RI#TIOCM_RNG#TIOCM_RTS#TIOCM_SR#TIOCM_ST#TIOCNOTTY#TIOCNXCL#TIOCOUTQ#TIOCPKT#TIOCPKT_DATA#TIOCPKT_DOSTOP#TIOCPKT_FLUSHREAD#TIOCPKT_FLUSHWRITE#TIOCPKT_IOCTL#TIOCPKT_NOSTOP#TIOCPKT_START#TIOCPKT_STOP#TIOCREMOTE#TIOCSBRK#TIOCSCTTY#TIOCSDRAINWAIT#TIOCSDTR#TIOCSETA#TIOCSETAF#TIOCSETAW#TIOCSETD#TIOCSIG#TIOCSPGRP#TIOCSTART#TIOCSTAT#TIOCSTI#TIOCSTOP#TIOCSWINSZ#TIOCTIMESTAMP#TIOCUCNTL#TLOSS#TMAGLEN#TMP_MAX#TOEXEC#TOREAD#TOSTOP#TOWRITE#TSGID#TSUID#TSVTX#TTYDISC#TUEXEC#TUREAD#TUWRITE#TVERSLEN#UF_APPEND#UF_IMMUTABLE#UF_NODUMP#UID_MAX#UIO_MAXIOV#UNDERFLOW#USI_MAX#VEOF#VEOL#VERASE#VINTR#VKILL#VMIN#VQUIT#VSTART#VSTOP#VSUSP#VTIME#WAIT_ANY#WAIT_MYPGRP#WCHAR_MAX#WCHAR_MIN#WORD_BIT#WSTOPPED#WUNTRACED#W_OK#X_OK#_IOFBF#_IOLBF#_IONBF#_PC_CHOWN_RESTRUCTED#_PC_MAX_CANON#_PC_MAX_INPUT#_PC_NAME_MAX#_PC_NO_TRUNC#_PC_PATH_MAX#_PC_PIPE_BUF#_PC_VDISABLE#_POSIX_CHOWN_RESTRICTED#_POSIX_JOB_CONTROL#_POSIX_NO_TRUNC#_POSIX_SAVED_IDS#_POSIX_VDISABLE#_POSIX_VERSION#_SC_ARG_MAX#_SC_CHILD_MAX#_SC_CLK_TCK#_SC_JOB_CONTROL#_SC_NGROUPS_MAX#_SC_OPEN_MAX#_SC_SAVED_IDS#_SC_STREAM_MAX#_SC_TZNAME_MAX#_SC_VERSION#__INCLUDE_LEVEL__#__LCLINT__#__LINE__#pseudo_AF_PIP#pseudo_AF_RTIP#pseudo_AF_XTP +6$#UINT_MAX +7$#POLLERR#POLLHUP#POLLIN#POLLNVAL#POLLOUT#POLLPRI#POLLRDBAND#POLLRDNORM#POLLWRBAND#POLLWRNORM#SHRT_MAX#SHRT_MIN +8$#USHRT_MAX +9$#ARG_MAX#CHILD_MAX#LINK_MAX#LONG_MAX#LONG_MIN#MAX_CANON#MAX_INPUT#MB_LEN_MAX#NAME_MAX#NGROUPS_MAX#OPEN_MAX#PIPE_BUF#SSIZE_MAX#STREAM_MAX#TZNAME_MAX#_POSIX_ARG_MAX#_POSIX_CHILD_MAX#_POSIX_LINK_MAX#_POSIX_MAX_CANON#_POSIX_MAX_INPUT#_POSIX_NAME_MAX#_POSIX_NGROUPS_MAX#_POSIX_OPEN_MAX#_POSIX_PATH_MAX#_POSIX_PIPE_BUF#_POSIX_SSIZE#_POSIX_STREAM#_POSIX_TZNAME_MAX +10$#ULONG_MAX +17$#HUGE#HUGE_VAL#MAXFLOAT#M_1_PI#M_2_PI#M_2_SQRTPI#M_E#M_LN10#M_LN2#M_LOG10E#M_LOG2E#M_PI#M_PI_2#M_PI_4#M_SQRT1_2#M_SQRT2 +23$#__BASE_FILE__#__DATE__#__FILE__#__REGISTER_PREFIX__#__TIME__#__USER_LABEL_PREFIX__#__VERSION__ +2$#NDEBUG +63$#MB_CUR_MAX +66$#WEOF +182$#SIG_DFL +186$#SIG_ERR +190$#SIG_IGN +1015$#IPC_PRIVATE +*3 (Variable) +5|@1|0@0@0@0@1#DBL_DIG#DBL_MANT_DIG#DBL_MAX_10_EXP#DBL_MAX_EXP#DBL_MIN_10_EXP#DBL_MIN_EXP#FLT_DIG#FLT_MANT_DIG#FLT_MAX_10_EXP#FLT_MAX_EXP#FLT_MIN_10_EXP#FLT_MIN_EXP#FLT_ROUNDS#LDBL_DIG#LDBL_MANT_DIG#LDBL_MAX_10_EXP#LDBL_MAX_EXP#LDBL_MIN_10_EXP#LDBL_MIN_EXP#daylight#errno#opterr#optind#optopt#optreset#signgam +9|@1|0@0@0@0@1#timezone +16|@1|0@0@0@0@1#FLT_EPSILON#FLT_MAX#FLT_MIN +17|@1|0@0@0@0@1#DBL_EPSILON#DBL_MAX#DBL_MIN +18|@1|0@0@0@0@1#LDBL_EPSILON#LDBL_MAX#LDBL_MIN +23|@1|0@0@0@0@1#TMAGIC#TVERSION#optarg +213|@1|0@0@0@0@1#stderr#stdin#stdout +315|@1|0@0@0@0@1#environ +856|@1|0@0@0@0@1#tzname +*4 (Function) +364$@0@g920@0@0@1@tp0,g920$@0#qsort +1301$@0@s3@1@s3$@0#vsyslog +1299@6@0@1@1@0@0@s3@1@s3$@0#syslog +1295$@0@s3@1@s3$@0#openlog +936$@0@@1@tp1$@0#bcopy +950$@0@s1@1@s1$@0#setbuffer +1113$@0@s3@1@s3$@0#psignal +1177$@0@@1@tp1$@0#FD_CLR#FD_SET +942$@0@@1@tp0$@0#bzero +177@6@0@5@0@0@1@@1@s0$@0#longjmp +208$@0@@1@p0$@0#va_start +235$@0@s3@1@s3,tp0,tp1$@0#setbuf +707@6@0@5@0@0@1@@1@s0$@0#siglongjmp +1179$@0@@1@tp1$@0#FD_COPY +828@6@0@6@0@0@1@@1@s0$@0#_exit#exit +325$@0@s1@1@s1$@0#srand +1062$@0@@1@tp0$@0#free +1319$@0@s1@1@s1$@0#setgrfile +1121$@1@g942@0@0@1@tg942$@0#unsetenv +307$@1@g920@0@0,g939@0@0,s3@1@s3,tg939$@0#perror +210$@0@@1@p0$@0#va_end +952$@0@s1@1@s1$@0#setlinebuf +301$@0@@1@tp0$@0#clearerr#flockfile#funlockfile#rewind +678$@1@@1@s0$@0#rewinddir +1186$@0@@1@tp0$@0#FD_ZERO +1287$@0@@1@tp0$@0#regfree +72@6@0@8@0@0@1@@1@s0$@0#assert +995$@1@g942@0@0,s1@1@s1,g919,g926,g943$@0#tzset +1293$@0@s3@1@s3$@0#closelog +1312$@0@s1@1@s1$@0#endgrent#endpwent +1217$@0@s3@1@s3$@0#sync +338@6@0@6@0@0@1@@1@s0$@0#abort +1105$@0@s1,g920@0@0@1@s1,g920$@0#setsockopt +1088$@0@g920@0@0@1@tp3,tp4,g920$@0#getsockopt +1236$@0@g920@0@0@1@g920,tp1$@0#msgrcv +1204$@0@g920@0@0@1@tp1,tp2,tp3,tp4,g920$@0#select +1351$@0@s1,g920@0@0@1@s1,g920$@0#putpmsg +1347$@0@g920@0@0@1@tp3,tp1,tp2,g920$@0#getpmsg +1285$@0@@1@tp3$@0#regexec +1111$@0@g920@0@0@1@g920$@0#socketpair +1251$@0@g920@0@0@1@g920$@0#semctl +1238$@0@g920@0@0@1@g920$@0#msgsnd +1349$@0@s1,g920@0@0@1@s1,g920$@0#putmsg +1345$@0@g920@0@0@1@tp1,tp2,g920$@0#getmsg +237$@0@s3@1@s3,tp0,tp1$@0#setvbuf +948$@0@s1@1@s1$@0#setvbuf_unlocked +423$@0@@1@tp0$@0#vswprintf +415@6@0@1@1@0@0@@1@tp0$@0#swprintf +1367$@0@g920@0@0,s1@1@g920,s1$@0#setpriority +1109$@0@g920@0@0@1@g920$@0#socket +824$@0@g920@0@0@1@g920$@0#tcsetattr +1232$@0@g920@0@0@1@g920,tp2$@0#msgctl +1264$@0@g920@0@0@1@g920,tp2$@0#shmctl +684$@0@g920@0@0@1@g920$@0#fcntl +954$@0@@1@p1$@0#strerror_r#ttyname_r +1115$@1@g938@0@0,g922@0@0,g923@0@0,g921@0@0,g924@0@0@1@g938,g922,g923$@0#getopt +1190$@0@g920@0@0,s3@1@g920,s3$@0#fchown +721$@0@g920@0@0,s1@1@tp2,g920,s1$@0#sigaction +736$@0@g920@0@0,s1@1@tp2,g920,s1$@0#sigprocmask +1082$@0@g920@0@0,s1@1@g920,s1$@0#connect +1080$@0@g920@0@0,s3@1@g920,s3$@0#bind +1086$@0@g920@0@0@1@tp1,tp2,g920$@0#getsockname +1078$@0@g920@0@0@1@tp2,g920$@0#accept +1084$@0@g920@0@0@1@tp1,tp2,g920$@0#getpeername +1154$@0@g920@0@0,s1@1@tp2,g920,s1$@0#setitimer +1256$@0@g920@0@0@1@g920$@0#semop +1044$@0@g920@0@0@1@tp2,g920$@0#ioctl +590$@1@@1@s0$@0#memcmp +686$@0@g920@0@0@1@g920$@0#open +970$@1@@1@s0$@0#strncasecmp +596$@1@@1@s0$@0#strncmp +1117$@1@g942@0@0,g920@0@0@1@tg942,g920$@0#setenv +850@6@0@5@0@0@0@g920@0@0@1@g920$@0#execl#execle#execlp +1202$@0@g920@0@0@1@tp1,g920$@0#readlink +836$@0@s3,g920@0@0@1@s3,g920$@0#chown#lchown +860@6@0@5@0@0@0@g920@0@0@1@g920$@0#execve +253@6@0@1@2@0@1@@1@s0$@0#sscanf +259$@0@@1@tp0,p2$@0#vsprintf +293$@0@s3,g920@0@0@1@s3,tp0,g920$@0#fseek +255$@0@s3,g920@0@0@1@s3,tp0,p2,g920$@0#vfprintf +243@6@0@1@2@0@0@s3@1@s3,tp0$@0#fscanf +421$@0@s3@1@s3,tp0$@0#vfwprintf +394@6@0@1@1@0@0@s3@1@tp0,s3$@0#fwprintf +396@6@0@1@2@0@0@s3@1@tp0,s3$@0#fwscanf +455$@1@@1@s0$@0#wcsncmp#wmemcmp +417@6@0@1@2@0@0@g940@0@0@1@tg940$@0#swscanf +562$@0@@1@tp0$@0#mbtowc +1162$@1@@1@s0$@0#madvise#mprotect#msync +1253$@0@g920@0@0@1@g920$@0#semget#shmget +1060$@0@g920@0@0@1@frevents.ap0,g920$@0#poll +1280$@0@@1@tp0$@0#regcomp +1125$@1@@1@s0$@0#W_EXITCODE +846$@0@g920@0@0,s3@1@g920,s3$@0#dup2 +1090$@0@g920@0@0,s1@1@g920,s1$@0#listen +1360$@0@g920@0@0@1@g920$@0#getpriority#shutdown#tcflow#tcflush#tcsendbreak +1333$@0@s3,g920@0@0@1@s3,g920$@0#fchmod +1194$@0@g920@0@0,s3@1@g920,s3$@0#ftruncate +921$@0@g920@0@0,s1@1@g920,s1$@0#tcsetpgrp +760$@0@g920@0@0@1@g920,tp1$@0#fstat +820$@0@g920@0@0@1@g920,tp1$@0#tcgetattr +878$@0@g920@0@0@1@g920,ap1$@0#getgroups +1331$@0@s3,g920@0@0@1@s3,g920$@0#fchflags +1365$@0@g920@0@0@1@tp1,g920$@0#getrusage +1149$@0@g920@0@0@1@g920,tp1$@0#getitimer +1211$@0@g920@0@0,s1@1@g920,s1$@0#setgroups +1369$@0@g920@0@0,s1@1@g920,s1$@0#setrlimit +1363$@0@g920@0@0@1@tp1,g920$@0#getrlimit +1198$@0@s1@1@s1$@0#initgroups +830$@0@g920@0@0@1@g920$@0#access +968$@1@@1@s0$@0#strcasecmp#strcmp#strcoll +893$@0@g920@0@0,s3@1@g920,s3$@0#link#rename +1219$@0@s3@1@s3$@0#symlink +560$@1@@1@s0$@0#mblen +257$@1@g941@0@0,s3@1@s3,p1,tg941$@0#vprintf +269$@0@s3@1@s3,tp1$@0#fputs +757$@0@s3,g920@0@0@1@s3,g920$@0#chmod#mkdir#mkfifo +682$@0@g920@0@0@1@g920$@0#creat +1221$@0@g920@0@0,s3@1@g920,s3$@0#truncate +1335$@0@g920@0@0@1@g920,tp1$@0#lstat#stat +858@6@0@5@0@0@0@g920@0@0@1@g920$@0#execv#execvp +933$@0@s3,g920@0@0@1@s3,g920$@0#utime +1329$@0@s3,g920@0@0@1@s3,g920$@0#chflags +1158$@0@s3,g920@0@0@1@s3,g920$@0#utimes +248@6@0@1@2@0@1@g940@0@0,s3@1@s3,tg940$@0#scanf +1196$@0@@1@p0,tp0$@0#gethostname +564$@0@@1@tp0$@0#wctomb +392$@1@@1@s0$@0#fwide +295$@0@s3,g920@0@0@1@s3,tp0,g920$@0#fsetpos +291$@0@g920@0@0@1@tp1,g920$@0#fgetpos +425$@0@s3,g941@0@0@1@s3,tg941$@0#vwprintf +390$@0@s3@1@s3,tp1$@0#fputws +436$@1@@1@s0$@0#wcscmp#wcscoll +503@6@0@1@2@0@1@g940@0@0,g920@0@0@1@g920,tg940$@0#wscanf +501@6@0@1@1@0@1@g941@0@0,g920@0@0@1@g920,tg941$@0#wprintf +1213$@0@g920@0@0,s1@1@g920,s1$@0#setregid#setreuid +718@6@0@5@0@0@0@g920@0@0@1@g920$@0#kill +909$@0@g920@0@0,s1@1@g920,s1$@0#setpgid +709$@0@@1@p0$@0#sigsetjmp +724$@0@g920@0@0@1@tp0,g920$@0#sigaddset#sigdelset +732$@0@g920@0@0@1@g920$@0#sigismember +1170$@1@@1@s0$@0#mlock#munlock#munmap +1234$@0@g920@0@0@1@g920$@0#msgget +1146$@0@s1,g920@0@0@1@s1,tp1,g920$@0#adjtime +1156$@0@s1,g920@0@0@1@s1,g920$@0#settimeofday +1152$@0@g920@0@0@1@tp0,tp1,g920$@0#gettimeofday +267$@0@s3,g920@0@0@1@s3,tp1,g920$@0#fputc#ungetc +278$@0@s3@1@s3,tp1$@0#putc +838$@0@s3,g920@0@0,s1@1@s3,g920,s1$@0#close +848$@0@g920@0@0,s3@1@g920,s3$@0#dup#fsync +1188$@0@s1,g920@0@0@1@s1,g920$@0#fchdir +1297$@0@s1@1@s1$@0#setlogmask +814$@0@g920@0@0@1@g920$@0#tcdrain +1321$@0@s1@1@s1$@0#setgroupent#setpassent +1289$@1@@1@s0$@0#LOG_MASK#LOG_UPTO#WCOREDUMP#WEXITSTATUS#WIFEXITED#WIFSIGNALED#WIFSTOPPED#WSTOPSIG#WTERMSIG#W_STOPCODE#abs#ffs#isatty +205@6@0@5@0@0$$@0#raise +1266$@0@g920@0@0@1@g920$@0#shmdt +905$@0@s3,g920@0@0@1@s3,g920$@0#rmdir#unlink +1119$@1@g942@0@0,g920@0@0@1@tg942,g920$@0#putenv +215$@0@s3,g920@0@0@1@s3,g920$@0#remove +834$@0@g920@0@0@1@g920$@0#chdir +282$@1@g941@0@0,s3@1@s3,tg941$@0#puts +311$@1@@1@s0$@0#atoi +351$@0@s3@1@s3$@0#system +901$@0@g920@0@0@1@g920$@0#pipe +485$@1@@1@s0$@0#wctob +175$@0@@1@p0$@0#setjmp +225$@0@g920@0@0,s3@1@tp0,g920,s3$@0#fclose#fgetc#pclose +303$@0@g920@0@0@1@g920$@0#feof#ferror#fileno +271$@0@s3@1@s3,tp0$@0#getc +227$@0@g920@0@0,s3@1@tp0,g920,s3$@0#fflush +346$@0@s1@1@s1$@0#atexit +407$@1@@1@s0$@0#mbsinit +1206$@0@g920@0@0,s1@1@g920,s1$@0#setegid#setgid +768$@0@s1@1@s1$@0#umask +1208$@0@g920@0@0,s1@1@g920,s1$@0#seteuid#setuid +669$@0@g920@0@0@1@g920$@0#closedir +738$@0@g920@0@0,s1@1@g920,s1$@0#sigsuspend +728$@0@g920@0@0@1@tp0,g920$@0#sigemptyset#sigfillset#sigpending +778$@0@g920@0@0@1@tp0,g920$@0#uname +810$@0@@1@tp0$@0#cfsetispeed#cfsetospeed +280$@1@g941@0@0,s3@1@s3,tg941$@0#putchar +273$@1@g940@0@0,s3@1@s3,tg940$@0#getchar +323$@0@s1@1@s1$@0#rand#setgrent#setpwent +899$@0@g920@0@0@1@g920$@0#pause +832$@0@s1@1@s1$@0#alarm +915$@1@@1@s0$@0#sleep +319$@0@g920@0@0@1@tp1,g920$@0#strtol +479$@0@@1@tp1$@0#wcstol +866$@0@g920@0@0@1@g920$@0#fpathconf +897$@0@g920@0@0@1@g920$@0#pathconf +917$@0@g920@0@0@1@g920$@0#sysconf +373$@1@@1@s0$@0#labs +313$@1@@1@s0$@0#atol +297$@0@g920@0@0@1@g920$@0#ftell +321$@0@g920@0@0@1@tp1,g920$@0#strtoul +481$@0@@1@tp1$@0#wcstoul +152$@0@g920@0@0@1@g920$@0#ldexp +142$@1@@1@s0$@0#atan2#fmod +160$@0@g920@0@0@1@g920$@0#pow +154$@0@@1@tp1$@0#frexp +170$@0@@1@tp1$@0#modf +317$@0@g920@0@0@1@tp1,g920$@0#strtod +474$@0@@1@tp1$@0#wcstod +636$@1@@1@s0$@0#difftime +138$@0@g920@0@0@1@g920$@0#acos#asin#cbrt#cosh#exp#log#log10#sqrt +140$@1@@1@s0$@0#atan#ceil#cos#fabs#floor#rint#sin#sinh#tan#tanh#trunc +309$@1@@1@s0$@0#atof +358@6@5@1@0@0@1@@1@s0@18@0@0#bsearch +1261$@0@g920@0@0@1@g920@3@0@0#shmat +601@6@5@1@0@0@1@@1@s0@3@0@0#memchr +334@6@5@1@0@0@0@@1@tp0@2@0@0#realloc +328@6@5@1@0@0@1@@1@s0@2@0@0#calloc +331@4@5@1@0@0@1@@1@s0@2@0@0#malloc +264@6@5@1@0@0@0@s3,g920@0@0@1@s3,tp0,tp2,g920$@0#fgets +124@6@5@1@0@0@0@s1,g920@0@0@1@s1,g920@19@3@0#setlocale +976@6@5@1@0@0@0@s1@1@s1@3@0@0#tempnam +979@6@5@1@0@0@1@@1@s0@18@0@0#index#rindex +609@6@5@1@0@0@1@@1@s0@19@2@0#strpbrk +604@6@5@1@0@0@1@@1@s0@19@2@0#strchr#strrchr +620@6@5@1@0@0@0@s1,g920@0@0@1@tp0,s1,g920@19@2@0#strtok +617@6@5@1@0@0@1@@1@s0@19@2@0#strstr +869$@0@g920@0@0@1@g920,tp0$@0#getcwd +627$@1@@1@s0@19@3@0#strerror +924@6@5@1@0@0@0@g920@0@0@1@g920@19@3@0#ttyname +973$@1@@1@s0@3@0@0#strdup +349@6@5@1@0@0@1@@1@s0@19@3@0#getenv +276@6@5@1@0@0@1@g940@0@0,s3,g920@0@0@1@s3,tp0,tg940,g920@3@0@0#gets +844$@0@@1@tp0@3@0@0#cuserid +841$@0@s1@1@tp0,s1$@0#ctermid +223$@0@s1@1@tp0,s1@19@3@0#tmpnam +644$@0@g920@0@0@1@g920@19@3@0#asctime +647$@1@@1@s0@19@3@0#ctime +881$@1@@1@s0@19@3@0#getlogin +747$@1@@1@s0$@0#S_ISBLK#S_ISCHR#S_ISDIR#S_ISFIFO#S_ISREG +1282$@0@@1@tp2$@0#regerror +288$@0@s3,g920@0@0@1@s3,tp3,g920$@0#fwrite +958$@0@@1@tp3$@0#fwrite_unlocked +286$@0@s3,g920@0@0@1@s3,tp0,tp3,g920$@0#fread +956$@0@@1@tp3,tp0$@0#fread_unlocked +467$@0@@1@tp1$@0#wcsrtombs +655$@0@@1@tp0$@0#strftime +405$@0@@1@tp0$@0#mbrtowc +409$@0@@1@tp0$@0#mbsrtowcs +447$@0@@1@tp0$@0#wcsftime +403$@1@@1@s0$@0#mbrlen +568$@0@@1@tp0$@0#wcstombs +598$@0@@1@tp0$@0#strxfrm +427$@0@@1@tp0$@0#wcrtomb +483$@0@@1@tp0$@0#wcsxfrm +566$@0@@1@tp0$@0#mbstowcs +606$@1@@1@s0$@0#strcspn#strspn +443$@1@@1@s0$@0#wcscspn#wcsspn +629$@1@@1@s0$@0#strlen +449$@1@@1@s0$@0#wcslen +1101$@0@g920@0@0@1@g920$@0#sendto +1094$@0@g920@0@0@1@tp1,tp4,tp5,g920$@0#recvfrom +1099$@0@g920@0@0@1@g920$@0#send +1092$@0@g920@0@0@1@tp1,g920$@0#recv +928$@0@g920@0@0@1@g920$@0#write +903$@0@g920@0@0@1@g920,tp1$@0#read +1053$@0@s3,g920@0@0@1@fiov_base.ap1,s3,g920$@0#readv +1055$@0@g920@0@0@1@g920$@0#writev +1097$@0@g920@0@0@1@afiov_base.tfmsg_iov.tp1,g920$@0#recvmsg +1103$@0@g920@0@0@1@g920$@0#sendmsg +388$@0@s3@1@s3,tp1$@0#fputwc +411$@0@s3@1@s3,tp1$@0#putwc +419$@0@s3@1@s3,tp1$@0#ungetwc +380$@1@@1@s0$@0#btowc +413$@0@s3,g941@0@0@1@s3,tg941$@0#putwchar +382$@0@s3@1@s3,tp0$@0#fgetwc +398$@0@s3@1@s3,tp0$@0#getwc +400$@0@s3,g940@0@0@1@s3,tg940$@0#getwchar +128$@1@@1@s0@3@0@0#localeconv +233@6@5@1@0@0@0@s3,g920@0@0@1@tp2,s3,g920@3@0@0#freopen +741@6@5@1@0@0@0@g920@0@0,s3@1@g920,s3@18@0@0#fdopen +985@6@5@1@0@0@0@s3,g920@0@0@1@s3,g920@18@0@0#popen +230@6@5@1@0@0@0@s3@1@s3@18@0@0#fopen +220@6@5@1@0@0@0@s3@1@s3@3@0@0#tmpfile +371$@1@@1@s0$@0#div +378$@1@@1@s0$@0#ldiv +488@6@5@1@0@0@1@@1@s0@3@0@0#wmemchr +386@6@5@1@0@0@0@s3@1@s3,tp0,tp2$@0#fgetws +499$@0@@1@tp0$@0#wmemset +493$@0@@1@tp0$@0#wmemcpy#wmemmove +477@6@5@1@0@0@0@@1@tp2@3@0@0#wcstok +472@6@5@1@0@0@1@@1@s0@3@0@0#wcsstr +464@6@5@1@0@0@1@@1@s0$@0#wcsrchr +434@6@5@1@0@0@1@@1@s0@19@2@0#wcschr +461@6@5@1@0@0@1@@1@s0$@0#wcspbrk +653@6@5@1@0@0@0@g920@0@0@1@g920@19@3@0#localtime +650@6@5@1@0@0@1@@1@s0@19@3@0#gmtime +558$@1@@1@s0$@0#wctype +556$@1@@1@s0$@0#wctrans +773$@0@@1@tp0$@0#times +634$@0@s1@1@s1$@0#clock +638$@1@@1@s0$@0#mktime +641$@0@@1@tp0$@0#time +871$@1@@1@s0$@0#getegid#getgid +895$@0@g920@0@0@1@g920$@0#lseek +1133$@0@g920@0@0@1@tp1,tp3,g920$@0#wait4 +1131$@0@g920@0@0@1@tp0,tp2,g920$@0#wait3 +794$@0@g920@0@0@1@tp1,g920$@0#waitpid +919$@0@g920@0@0@1@g920$@0#tcgetpgrp +792$@0@g920@0@0@1@tp0,g920$@0#wait +864$@0@s3,g920@0@0@1@s3,g920$@0#fork +1048$@0@s3@1@s3$@0#vfork +883$@1@@1@s0$@0#getpgrp#getpid#getppid#setsid +873$@1@@1@s0$@0#geteuid#getuid +672@6@5@1@0@0@0@g920@0@0@1@g920@3@0@0#opendir +676@6@5@1@0@0@0@g920@0@0@1@g920@3@0@0#readdir +695@6@5@1@0@0@0@g920@0@0@1@g920@3@0@0#getgrnam +692@6@5@1@0@0@0@g920@0@0@1@g920@3@0@0#getgrgid +1315@6@5@1@0@0@0@s1@1@s1@3@0@0#getgrent +701@6@5@1@0@0@0@g920@0@0@1@g920@19@3@0#getpwnam +704@6@5@1@0@0@0@g920@0@0@1@g920@19@3@0#getpwuid +1306@6@5@1@0@0@0@s1@1@s1@3@0@0#getpwent +806$@1@@1@s0$@0#cfgetispeed#cfgetospeed +1160$@0@@1@p0$@0#mmap +203@6@5@1@0@0@0@s1,g920@0@0@1@s1,g920$@0#signal +966$@0@@1@tp0$@0#memccpy +624$@0@@1@tp0$@0#memset +575$@0@@1@tp0$@0#memmove +572$@0@@1@tp0$@0#memcpy +588$@0@@1@tp0$@0#strncat +582$@0@@1@tp0$@0#strncpy +585$@0@@1@tp0$@0#strcat#strcpy +453$@0@@1@tp0$@0#wcsncat#wcsncpy +431$@0@@1@tp0$@0#wcscat#wcscpy +518$@1@@1@s0$@0#iswctype +509$@1@@1@s0$@0#iswalnum#iswalpha#iswcntrl#iswdigit#iswgraph#iswlower#iswprint#iswpunct#iswspace#iswupper#iswxdigit +77$@1@@1@s0$@0#isalnum#isalpha#iscntrl#isdigit#isgraph#islower#isprint#ispunct#isspace#isupper#isxdigit +116$@1@@1@s0$@0#tolower#toupper +251@6@0@1@1@0@0@@1@tp0$@0#sprintf +241@6@0@1@1@0@0@s3@1@s3,tp0$@0#fprintf +246@6@0@1@1@0@1@g941@0@0,s3@1@s3,tg941$@0#printf +940$@1@@1@s0$@0#bcmp +1182$@1@@1@s0$@0#FD_ISSET +1324$@1@@1@s0$@0#S_ISLNK#S_ISSOCK +548$@1@@1@s0$@0#towctrans +551$@1@@1@s0$@0#towlower#towupper +*7 (Struct tag) +0@1224#@msg +0@1270#@re_guts +665@666#@dirent +1338@1339#@str_mlist +929@930#@utimbuf +1049@1050#@iovec +1140@1141#@itimerval +1067@1068#@linger +1357@1358#@loadavg +1228@1229#@mymesg +367@368#@!2 +374@375#@!3 +1353@1354#@rlimit +1275@1276#@!5 +1341@1342#@str_list +1069@1070#@sockproto +1136@1137#@timespec +1134@1135#@timeval +1138@1139#@timezone +1074@1075#@cmsghdr +1056@1057#@poll +687@688#@group +1336@1337#@strbuf +715@716#@sigaction +1065@1066#@sockaddr +1248@1249#@sembuf +1142@1143#@clockinfo +1272@1273#@!4 +1243@1239#@sem +769@770#@tms +1173@1174#@winsize +802@803#@termios +679@680#@flock +696@697#@passwd +1241@1242#@semid_ds +774@775#@utsname +1072@1073#@msghdr +1222@1223#@ipc_perm +632@444#@tm +1257@1258#@shmid_ds +744@745#@stat +1226@1227#@msqid_ds +1352@1128#@rusage +120@121#@lconv +*8 (Union tag) +1246@1247#$semun +;; Modules access +ansi#8@ +posix#13@ +unix#15@ +;;End diff --git a/lib/unixstrict.lcd b/lib/unixstrict.lcd new file mode 100644 index 0000000..98f45da --- /dev/null +++ b/lib/unixstrict.lcd @@ -0,0 +1,1859 @@ +;;LCLint Dump: unixstrict.lcd +;;LCLint 2.5m --- 20 May 2000 +;;lib:166 +;;ctTable +0 u-2 19 38 +0 p1|-2 20 39 +0 b-2 21 40 +0 p3|-2 22 41 +0 p4|-2 23 42 +0 p5|-2 24 43 +0 p6|-2 25 44 +0 p7|-2 26 45 +0 p8|-2 27 46 +0 p9|-2 28 47 +0 p10|-2 29 48 +0 p11|-2 30 49 +0 p12|-2 31 50 +0 p13|-2 32 51 +0 p14|-2 33 52 +0 p15|-2 34 53 +0 p16|-2 35 54 +0 p17|-2 36 55 +0 p18|-2 37 56 +1 t0|0 288 816 +1 t1|1& +1 t2|2& +1 t3|3& +1 t4|4 289 817 +1 t5|5& +1 t6|6& +1 t7|7& +1 t8|8& +1 t9|9& +1 t10|10& +1 t11|11& +1 t12|12& +1 t13|13& +1 t14|14& +1 t15|15& +1 t16|16& +1 t17|17& +1 t18|18& +2 y0|0& +2 y1|1& +2 y2|2& +2 y3|3& +2 y4|4& +2 y5|5& +2 y6|6& +2 y7|7& +2 y8|8& +2 y9|9& +2 y10|10& +2 y11|11& +2 y12|12& +2 y13|13& +2 y14|14& +2 y15|15& +2 y16|16& +2 y17|17& +2 y18|18& +-2 ?! +0 s3|& +0 s22|& +0 s23|& +0 s24|& +0 s25|& +0 s44|& +0 s45|& +0 s26|-1 357 -1 +0 s27|& +0 a0|-1 375 -1 +3 C0.5/20|! +3 C0.68/2|! +3 f0 (2|@7|$#,)! +3 f1 (2|@7|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f2 (3|$#,)! +3 f0 (3|$#,)! +3 f4 (3|$#,)! +3 f0 (3|$#,)! +3 f4 (3|$#,)! +3 Slconv{23|@1|0@0@3&#decimal_point,23|@1|0@0@3&#thousands_sep,23|@1|0@0@3&#grouping,23|@1|0@0@3&#int_curr_symbol,23|@1|0@0@3&#currency_symbol,23|@1|0@0@3&#mon_decimal_point,23|@1|0@0@3&#mon_thousands_sep,23|@1|0@0@3&#mon_grouping,23|@1|0@0@3&#positive_sign,23|@1|0@0@3&#negative_sign,4|@1|^#int_frac_digits,4|@1|^#frac_digits,4|@1|^#p_cs_precedes,4|@1|^#p_sep_by_space,4|@1|^#n_cs_precedes,4|@1|^#n_sep_by_space,4|@1|^#p_sign_posn,4|@1|^#n_sign_posn,}! +0 s1443|-1 105 -1 +3 f0 (5|$#,23|0@5@7&#,)! +3 f19 (5|$#,23|0@5@7&#,)! +3 f23 (5|$#,23|0@5@7&#,)! +3 f0 ()! +3 f19 ()! +1 t99|99& +3 f105 ()! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,5|$#,)! +3 f17 (17|$#,5|$#,)! +3 f0 (17|$#,24|4@0@7&#,)! +3 f17 (17|$#,24|4@0@7&#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,36|4@0@7&#,)! +3 f17 (17|$#,36|4@0@7&#,)! +3 f0 (17|$#,17|$#,)! +3 f17 (17|$#,17|$#,)! +0 a46|& +3 f0 (151|4@0@7&#,)! +3 f5 (151|4@0@7&#,)! +3 f0 (151|$#,5|$#,)! +3 f1 (151|$#,5|$#,)! +0 s28|& +3 ?! +3 f157 (5|$#,)! +3 f1 (5|$#,)^160 +1 t159|159& +3 ?! +3 f161 (5|$#,)! +3 f1 (5|$#,)^164 +1 t163|163& +3 ?! +3 f165 (5|$#,)! +3 f1 (5|$#,)^168 +1 t167|167& +3 ?! +3 f169 (5|$#,)! +3 f1 (5|$#,)^172 +1 t171|171& +3 f0 (5|$#,172|0@5@7&#,)! +3 f19 (5|$#,172|0@5@7&#,)^175 +1 t174|174& +3 ?! +3 f176 (5|$#,)! +3 f19 (5|$#,)! +3 f1 (5|$#,172|0@5@7&#,)! +3 f1 (5|$#,)! +3 f180 (5|$#,172|0@5@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +0 a47|& +3 f0 (184|4@0@7&#,!.,)! +3 f1 (184|4@0@7&#,!.,)! +3 f0 (184|$#,)! +3 f1 (184|$#,)! +0 a48|-1 191 -1 +0 a49|-1 263 -1 +1 t189|189& +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 ()! +3 f19 ()! +3 f191 ()! +3 f0 (23|@5|4@5@7&#,)! +3 f19 (23|@5|4@5@7&#,)! +3 f23 (23|@5|4@5@7&#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (191|0@5@7&#,)! +3 f5 (191|0@5@7&#,)! +3 f0 (23|$#,23|$#,)! +3 f19 (23|$#,23|$#,)! +3 f191 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,191|$#,)! +3 f19 (23|$#,23|$#,191|$#,)! +3 f191 (23|$#,23|$#,191|$#,)! +3 f0 (191|$#,23|0@5@19@2@0#,)! +3 f1 (191|$#,23|0@5@19@2@0#,)! +3 f0 (191|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f5 (191|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f0 (191|$#,23|$#,!.,)! +3 f5 (191|$#,23|$#,!.,)! +3 f0 (191|$#,23|$#,!.,)! +3 f5 (191|$#,23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f0 (23|$#,!.,)! +3 f5 (23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f0 (23|4@0@7&#,23|$#,!.,)! +3 f5 (23|4@0@7&#,23|$#,!.,)! +3 f0 (191|$#,23|$#,184|$#,)! +3 f5 (191|$#,23|$#,184|$#,)! +3 f0 (23|$#,184|$#,)! +3 f5 (23|$#,184|$#,)! +3 f0 (23|4@0@7&#,23|$#,184|$#,)! +3 f5 (23|4@0@7&#,23|$#,184|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (23|@5|4@0@7&#,5|$#,191|$#,)! +3 f19 (23|@5|4@0@7&#,5|$#,191|$#,)! +3 f23 (23|@5|4@0@7&#,5|$#,191|$#,)! +3 C0.5/4|! +3 f0 (239|$#,191|$#,)! +3 f5 (239|$#,191|$#,)! +3 f0 (23|$#,191|$#,)! +3 f5 (23|$#,191|$#,)! +3 f0 (191|@7|$#,)! +3 f5 (191|@7|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (23|4@0@7&#,)! +3 f19 (23|4@0@7&#,)! +3 f23 (23|4@0@7&#,)! +3 f0 (239|$#,191|@7|$#,)! +3 f5 (239|$#,191|@7|$#,)! +3 f0 (239|$#,)! +3 f5 (239|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (239|$#,191|$#,)! +3 f5 (239|$#,191|$#,)! +3 f0 (20|4@0@7&#,63|$#,63|$#,191|$#,)! +3 f63 (20|4@0@7&#,63|$#,63|$#,191|$#,)! +3 f0 (20|$#,63|$#,63|$#,191|$#,)! +3 f63 (20|$#,63|$#,63|$#,191|$#,)! +1 t190|190& +3 f0 (191|$#,263|4@0@7&#,)! +3 f5 (191|$#,263|4@0@7&#,)! +3 f0 (191|$#,9|$#,5|$#,)! +3 f5 (191|$#,9|$#,5|$#,)! +3 f0 (191|$#,263|$#,)! +3 f5 (191|$#,263|$#,)! +3 f0 (191|$#,)! +3 f9 (191|$#,)! +3 f0 (191|$#,)! +3 f1 (191|$#,)! +3 f0 (191|$#,)! +3 f1 (191|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (23|0@5@7&#,)! +3 f1 (23|0@5@7&#,)! +3 f0 (23|$#,)! +3 f17 (23|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,)! +3 f9 (23|$#,)! +1 t19|19& +1 t23|23& +3 f0 (23|$#,289|4@5@7&#,)! +3 f17 (23|$#,289|4@5@7&#,)! +3 f0 (23|$#,289|4@5@7&#,5|$#,)! +3 f9 (23|$#,289|4@5@7&#,5|$#,)! +3 f0 (23|$#,289|4@5@7&#,5|$#,)! +3 f10 (23|$#,289|4@5@7&#,5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (6|$#,)! +3 f1 (6|$#,)! +3 f0 (63|$#,63|$#,)! +3 f19 (63|$#,63|$#,)! +3 f20 (63|$#,63|$#,)! +3 f0 (63|$#,)! +3 f19 (63|$#,)! +3 f20 (63|$#,)! +3 f0 (20|@5|4@5@2&#,63|$#,)! +3 f19 (20|@5|4@5@2&#,63|$#,)! +3 f20 (20|@5|4@5@2&#,63|$#,)! +3 f0 (20|4@2@2&#,)! +3 f1 (20|4@2@2&#,)! +3 f0 ()! +3 f1 ()! +3 f0 (5|$#,)! +3 f1 (5|$#,)! +3 ?! +3 f315 ()! +3 f1 ()^318 +1 t317|317& +3 f0 (318|$#,)! +3 f5 (318|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f23 (23|$#,)! +3 f0 (23|0@5@7&#,)! +3 f5 (23|0@5@7&#,)! +3 ?! +3 f326 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^329 +1 t328|328& +3 f0 (20|$#,20|$#,63|$#,63|$#,329|$#,)! +3 f19 (20|$#,20|$#,63|$#,63|$#,329|$#,)! +3 f20 (20|$#,20|$#,63|$#,63|$#,329|$#,)! +3 ?! +3 f333 (20|$#,20|$#,)! +3 f5 (20|$#,20|$#,)^336 +1 t335|335& +3 f0 (20|$#,63|$#,63|$#,336|$#,)! +3 f1 (20|$#,63|$#,63|$#,336|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 S!2{5|@1|^#quot,5|@1|^#rem,}! +0 s1410|& +0 s74|& +3 f0 (5|$#,5|$#,)! +3 f343 (5|$#,5|$#,)! +3 f0 (9|$#,)! +3 f9 (9|$#,)! +3 S!3{9|@1|^#quot,9|@1|^#rem,}! +0 s1411|& +0 s75|& +3 f0 (9|$#,9|$#,)! +3 f350 (9|$#,9|$#,)! +3 f0 (5|$#,)! +3 f66 (5|$#,)! +3 f0 (191|$#,)! +3 f66 (191|$#,)! +1 t65|65 439 -1 +3 f0 (357|@5|$#,5|$#,191|$#,)! +3 f19 (357|@5|$#,5|$#,191|$#,)! +3 f357 (357|@5|$#,5|$#,191|$#,)! +3 f0 (65|$#,191|$#,)! +3 f66 (65|$#,191|$#,)! +3 f0 (357|$#,191|$#,)! +3 f5 (357|$#,191|$#,)! +3 f0 (191|$#,5|$#,)! +3 f5 (191|$#,5|$#,)! +3 f0 (191|$#,357|$#,!.,)! +3 f5 (191|$#,357|$#,!.,)! +3 f0 (191|$#,357|$#,!.,)! +3 f5 (191|$#,357|$#,!.,)! +3 f0 (191|@7|$#,)! +3 f66 (191|@7|$#,)! +3 f0 ()! +3 f66 ()! +1 t67|67& +3 f0 (23|$#,63|$#,375|0@5@7&#,)! +3 f63 (23|$#,63|$#,375|0@5@7&#,)! +3 f0 (357|0@5@7&#,23|$#,63|$#,375|0@5@7&#,)! +3 f63 (357|0@5@7&#,23|$#,63|$#,375|0@5@7&#,)! +3 f0 (375|0@5@7&#,)! +3 f5 (375|0@5@7&#,)! +3 f0 (357|0@5@7&#,289|$#,63|$#,375|0@5@7&#,)! +3 f63 (357|0@5@7&#,289|$#,63|$#,375|0@5@7&#,)! +3 f0 (65|$#,191|@7|$#,)! +3 f66 (65|$#,191|@7|$#,)! +3 f0 (65|$#,)! +3 f66 (65|$#,)! +3 f0 (357|$#,63|$#,357|$#,!.,)! +3 f5 (357|$#,63|$#,357|$#,!.,)! +3 f0 (357|$#,357|$#,!.,)! +3 f5 (357|$#,357|$#,!.,)! +3 f0 (66|$#,191|$#,)! +3 f66 (66|$#,191|$#,)! +3 f0 (191|$#,357|$#,184|$#,)! +3 f5 (191|$#,357|$#,184|$#,)! +3 f0 (357|$#,63|$#,357|$#,184|$#,)! +3 f5 (357|$#,63|$#,357|$#,184|$#,)! +3 f0 (357|$#,184|$#,)! +3 f5 (357|$#,184|$#,)! +3 f0 (23|4@5@7&#,65|$#,375|0@5@7&#,)! +3 f63 (23|4@5@7&#,65|$#,375|0@5@7&#,)! +3 C0.1/357|! +3 f0 (357|@5|4@0@9&#,357|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,)! +3 f402 (357|@5|4@0@9&#,357|$#,)! +3 f0 (357|@5|$#,65|$#,)! +3 f19 (357|@5|$#,65|$#,)! +3 f357 (357|@5|$#,65|$#,)! +3 f0 (357|$#,357|$#,)! +3 f5 (357|$#,357|$#,)! +3 f0 (357|$#,357|$#,)! +3 f5 (357|$#,357|$#,)! +3 f0 (357|@5|4@0@9&#,357|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,)! +3 f402 (357|@5|4@0@9&#,357|$#,)! +3 f0 (357|$#,357|$#,)! +3 f63 (357|$#,357|$#,)! +0 s1438|-1 419 -1 +1 t418|418& +3 f0 (357|4@0@7&#,63|$#,357|$#,419|$#,)! +3 f63 (357|4@0@7&#,63|$#,357|$#,419|$#,)! +3 f0 (357|$#,)! +3 f63 (357|$#,)! +3 C0.1/357|! +3 f0 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f424 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f0 (357|$#,357|$#,63|$#,)! +3 f5 (357|$#,357|$#,63|$#,)! +3 f0 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f1 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f424 (357|@5|4@0@9&#,357|$#,63|$#,)! +3 f0 (357|@5|$#,357|$#,)! +3 f19 (357|@5|$#,357|$#,)! +3 f357 (357|@5|$#,357|$#,)! +3 f0 (357|@5|$#,65|$#,)! +3 f19 (357|@5|$#,65|$#,)! +3 f357 (357|@5|$#,65|$#,)! +1 t357|357& +3 f0 (23|0@5@7&#,439|$#,63|$#,375|0@5@7&#,)! +3 f63 (23|0@5@7&#,439|$#,63|$#,375|0@5@7&#,)! +3 f0 (357|$#,357|$#,)! +3 f63 (357|$#,357|$#,)! +3 f0 (357|$#,357|$#,)! +3 f19 (357|$#,357|$#,)! +3 f357 (357|$#,357|$#,)! +3 f0 (357|$#,439|0@5@7&#,)! +3 f17 (357|$#,439|0@5@7&#,)! +3 f0 (357|0@5@7&#,357|$#,439|$#,)! +3 f19 (357|0@5@7&#,357|$#,439|$#,)! +3 f357 (357|0@5@7&#,357|$#,439|$#,)! +3 f0 (357|$#,439|0@5@7&#,5|$#,)! +3 f9 (357|$#,439|0@5@7&#,5|$#,)! +3 f0 (357|$#,439|0@5@7&#,5|$#,)! +3 f10 (357|$#,439|0@5@7&#,5|$#,)! +3 f0 (357|0@5@7&#,357|$#,63|$#,)! +3 f63 (357|0@5@7&#,357|$#,63|$#,)! +3 f0 (66|$#,)! +3 f5 (66|$#,)! +3 f0 (357|$#,65|$#,63|$#,)! +3 f19 (357|$#,65|$#,63|$#,)! +3 f357 (357|$#,65|$#,63|$#,)! +3 f0 (357|$#,357|$#,63|$#,)! +3 f5 (357|$#,357|$#,63|$#,)! +3 f0 (357|@5|$#,357|$#,63|$#,)! +3 f19 (357|@5|$#,357|$#,63|$#,)! +3 f357 (357|@5|$#,357|$#,63|$#,)! +3 f0 (357|@5|$#,357|$#,63|$#,)! +3 f19 (357|@5|$#,357|$#,63|$#,)! +3 f357 (357|@5|$#,357|$#,63|$#,)! +3 f0 (357|@5|$#,65|$#,63|$#,)! +3 f19 (357|@5|$#,65|$#,63|$#,)! +3 f357 (357|@5|$#,65|$#,63|$#,)! +3 f0 (357|$#,!.,)! +3 f5 (357|$#,!.,)! +3 f0 (357|$#,!.,)! +3 f5 (357|$#,!.,)! +0 s29|& +0 s30|& +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,478|$#,)! +3 f2 (66|$#,478|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,)! +3 f2 (66|$#,)! +3 f0 (66|$#,479|$#,)! +3 f66 (66|$#,479|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f0 (66|$#,)! +3 f66 (66|$#,)! +3 f0 (23|$#,)! +3 f479 (23|$#,)! +3 f0 (23|$#,)! +3 f478 (23|$#,)! +3 f0 (23|$#,63|$#,)! +3 f5 (23|$#,63|$#,)! +3 f0 (357|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f5 (357|0@5@7&#,23|0@5@7&#,63|$#,)! +3 f0 (23|4@5@7&#,65|$#,)! +3 f5 (23|4@5@7&#,65|$#,)! +3 f0 (357|4@0@7&#,23|$#,63|$#,)! +3 f63 (357|4@0@7&#,23|$#,63|$#,)! +3 f0 (23|4@0@7&#,357|$#,63|$#,)! +3 f63 (23|4@0@7&#,357|$#,63|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f524 (20|@5|4@0@9&#,20|$#,63|$#,)! +3 f0 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 f524 (20|@5|4@0@7&#,20|$#,63|$#,)! +3 C0.1/23|! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,63|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,)! +3 f0 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f1 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f531 (23|@5|4@0@9&#,23|$#,5|$#,)! +3 f0 (20|$#,20|$#,63|$#,)! +3 f5 (20|$#,20|$#,63|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,63|$#,)! +3 f5 (23|$#,23|$#,63|$#,)! +3 f0 (23|4@5@7&#,23|$#,63|$#,)! +3 f63 (23|4@5@7&#,23|$#,63|$#,)! +3 f0 (20|$#,5|$#,63|$#,)! +3 f19 (20|$#,5|$#,63|$#,)! +3 f20 (20|$#,5|$#,63|$#,)! +3 f0 (23|@5|$#,4|$#,)! +3 f19 (23|@5|$#,4|$#,)! +3 f23 (23|@5|$#,4|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|$#,23|$#,)! +3 f19 (23|@5|$#,23|$#,)! +3 f23 (23|@5|$#,23|$#,)! +3 f0 (23|@5|$#,4|$#,)! +3 f19 (23|@5|$#,4|$#,)! +3 f23 (23|@5|$#,4|$#,)! +3 f0 (23|$#,23|$#,)! +3 f63 (23|$#,23|$#,)! +3 f0 (23|@5|0@0@9&#,23|$#,)! +3 f19 (23|@5|0@0@9&#,23|$#,)! +3 f23 (23|@5|0@0@9&#,23|$#,)! +3 f0 (23|@5|0@5@7&#,23|$#,)! +3 f19 (23|@5|0@5@7&#,23|$#,)! +3 f23 (23|@5|0@5@7&#,23|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f576 (20|@5|4@0@7&#,5|$#,63|$#,)! +3 f0 (5|$#,)! +3 f19 (5|$#,)! +3 f23 (5|$#,)! +3 f0 (23|$#,)! +3 f63 (23|$#,)! +0 s31|& +0 s32|-1 594 -1 +3 Stm{5|@1|^#tm_sec,5|@1|^#tm_min,5|@1|^#tm_hour,5|@1|^#tm_mday,5|@1|^#tm_mon,5|@1|^#tm_year,5|@1|^#tm_wday,5|@1|^#tm_yday,5|@1|^#tm_isdst,}! +3 f0 ()! +3 f585 ()! +3 f0 (586|$#,586|$#,)! +3 f17 (586|$#,586|$#,)! +3 f0 (419|$#,)! +3 f586 (419|$#,)! +1 t586|586& +3 f0 (594|4@5@7&#,)! +3 f586 (594|4@5@7&#,)! +3 f0 (419|$#,)! +3 f19 (419|$#,)! +3 f23 (419|$#,)! +3 f0 (594|$#,)! +3 f19 (594|$#,)! +3 f23 (594|$#,)! +3 f0 (594|$#,)! +3 f19 (594|$#,)! +3 f419 (594|$#,)! +3 f0 (594|$#,)! +3 f19 (594|$#,)! +3 f419 (594|$#,)! +3 f0 (23|4@0@7&#,63|$#,23|$#,419|$#,)! +3 f63 (23|4@0@7&#,63|$#,23|$#,419|$#,)! +0 s33|& +0 s34|-1 1170 837 +0 s35|& +0 s36|& +0 s37|& +0 s38|& +0 s39|& +0 s40|& +0 a50|-1 622 -1 +3 Sdirent{42|@1|^#d_name,}! +0 s1402|-1 630 -1 +1 t619|619& +3 f0 (622|$#,)! +3 f5 (622|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f622 (23|$#,)! +3 f0 (622|$#,)! +3 f19 (622|$#,)! +1 t621|621& +3 f630 (622|$#,)! +3 f0 (622|$#,)! +3 f1 (622|$#,)! +3 Sflock{7|@1|^#l_type,7|@1|^#l_whence,616|@1|^#l_start,616|@1|^#l_len,617|@1|^#l_pid,}! +0 s1432|& +3 f0 (23|$#,614|$#,)! +3 f5 (23|$#,614|$#,)! +3 f0 (5|$#,5|$#,!.,)! +3 f5 (5|$#,5|$#,!.,)! +3 f0 (23|$#,5|$#,!.,)! +3 f5 (23|$#,5|$#,!.,)! +3 Sgroup{23|@1|0@0@3&#gr_name,612|@1|^#gr_gid,289|@1|0@0@3&#gr_mem,}! +0 s1421|-1 646 -1 +3 f0 (612|$#,)! +3 f19 (612|$#,)! +1 t643|643& +3 f646 (612|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f646 (23|$#,)! +3 Spasswd{23|@1|0@0@3&#pw_name,618|@1|^#pw_uid,612|@1|^#pw_gid,23|@1|0@0@3&#pw_dir,23|@1|0@0@3&#pw_shell,}! +0 s1433|-1 655 -1 +3 f0 (23|$#,)! +3 f19 (23|$#,)! +1 t652|652& +3 f655 (23|$#,)! +3 f0 (618|$#,)! +3 f19 (618|$#,)! +3 f655 (618|$#,)! +0 a51|& +3 f0 (660|$#,5|$#,)! +3 f1 (660|$#,5|$#,)! +3 f0 (660|4@0@7&#,5|$#,)! +3 f5 (660|4@0@7&#,5|$#,)! +0 a1|-1 677 -1 +3 ?! +3 f666 ()! +3 f1 ()^669 +1 t668|668& +3 Ssigaction{!669$$$@0#sa_handler,665|@1|0@0@3&#sa_mask,5|@1|^#sa_flags,}! +0 s1423|-1 674 -1 +3 f0 (617|$#,5|$#,)! +3 f5 (617|$#,5|$#,)! +1 t671|671& +3 f0 (5|$#,674|$#,674|4@5@7&#,)! +3 f5 (5|$#,674|$#,674|4@5@7&#,)! +1 t665|665& +3 f0 (677|$#,5|$#,)! +3 f5 (677|$#,5|$#,)! +3 f0 (677|$#,5|$#,)! +3 f5 (677|$#,5|$#,)! +3 f0 (677|4@0@7&#,)! +3 f5 (677|4@0@7&#,)! +3 f0 (677|4@0@7&#,)! +3 f5 (677|4@0@7&#,)! +3 f0 (677|$#,5|$#,)! +3 f5 (677|$#,5|$#,)! +3 f0 (677|4@0@7&#,)! +3 f5 (677|4@0@7&#,)! +3 f0 (5|$#,677|0@5@7&#,677|4@5@7&#,)! +3 f5 (5|$#,677|0@5@7&#,677|4@5@7&#,)! +3 f0 (677|$#,)! +3 f5 (677|$#,)! +3 f0 (5|$#,23|$#,)! +3 f19 (5|$#,23|$#,)! +3 f191 (5|$#,23|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 Sstat{614|@1|^#st_mode,613|@1|^#st_ino,611|@1|^#st_dev,615|@1|^#st_nlink,618|@1|^#st_uid,612|@1|^#st_gid,616|@1|^#st_size,586|@1|^#st_st_atime,586|@1|^#st_st_mtime,586|@1|^#st_st_ctime,}! +0 s1440|-1 719 -1 +3 C0.2/5|! +3 f0 (614|@7|$#,)! +3 f2 (614|@7|$#,)! +3 f701 (614|@7|$#,)! +3 f0 (614|@7|$#,)! +3 f2 (614|@7|$#,)! +3 f701 (614|@7|$#,)! +3 f0 (614|@7|$#,)! +3 f2 (614|@7|$#,)! +3 f701 (614|@7|$#,)! +3 f0 (614|@7|$#,)! +3 f2 (614|@7|$#,)! +3 f701 (614|@7|$#,)! +3 f0 (614|@7|$#,)! +3 f2 (614|@7|$#,)! +3 f701 (614|@7|$#,)! +3 f0 (23|$#,614|$#,)! +3 f5 (23|$#,614|$#,)! +1 t700|700& +3 f0 (5|$#,719|4@0@7&#,)! +3 f5 (5|$#,719|4@0@7&#,)! +3 f0 (23|$#,614|$#,)! +3 f5 (23|$#,614|$#,)! +3 f0 (23|$#,614|$#,)! +3 f5 (23|$#,614|$#,)! +3 f0 (23|$#,719|4@0@7&#,)! +3 f5 (23|$#,719|4@0@7&#,)! +3 f0 (614|$#,)! +3 f5 (614|$#,)! +3 Stms{585|@1|^#tms_utime,585|@1|^#tms_stime,585|@1|^#tms_cutime,585|@1|^#tms_cstime,}! +0 s1429|-1 732 -1 +1 t731|731& +3 f0 (732|4@0@7&#,)! +3 f585 (732|4@0@7&#,)! +3 Sutsname{42|@1|^#sysname,42|@1|^#nodename,42|@1|^#release,42|@1|^#version,42|@1|^#machine,}! +0 s1435|-1 737 -1 +1 t736|736& +3 f0 (737|4@0@7&#,)! +3 f5 (737|4@0@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (24|4@5@7&#,)! +3 f617 (24|4@5@7&#,)! +3 f0 (617|$#,24|4@0@7&#,5|$#,)! +3 f617 (617|$#,24|4@0@7&#,5|$#,)! +3 C0.4/8|! +3 C0.3/8|! +0 s78|& +3 C0.9/9|! +3 C0.10/9|! +0 s79|& +0 s80|& +3 Stermios{762|@1|^#c_iflag,762|@1|^#c_oflag,762|@1|^#c_cflag,762|@1|^#c_lflag,758|@1|^#c_cc,}! +0 s1431|-1 765 -1 +1 t764|764& +3 f0 (765|$#,)! +3 f761 (765|$#,)! +3 f0 (765|$#,)! +3 f761 (765|$#,)! +3 f0 (765|$#,)! +3 f5 (765|$#,)! +3 f0 (765|$#,)! +3 f5 (765|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,765|4@0@7&#,)! +3 f5 (5|$#,765|4@0@7&#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,5|$#,765|$#,)! +3 f5 (5|$#,5|$#,765|$#,)! +3 f0 ()! +3 f1 ()! +3 f0 (5|$#,)! +3 f1 (5|$#,)! +3 f0 (23|$#,5|$#,)! +3 f5 (23|$#,5|$#,)! +3 f0 (6|$#,)! +3 f6 (6|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,618|$#,612|$#,)! +3 f5 (23|$#,618|$#,612|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|@5|4@5@7&#,)! +3 f19 (23|@5|4@5@7&#,)! +3 f23 (23|@5|4@5@7&#,)! +3 f0 (23|4@5@7&#,)! +3 f19 (23|4@5@7&#,)! +3 f23 (23|4@5@7&#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +3 f0 (23|$#,23|$#,!.,)! +3 f5 (23|$#,23|$#,!.,)! +2 y19|19& +2 y23|23& +3 f0 (23|$#,817|$#,)! +3 f5 (23|$#,817|$#,)! +3 f0 (23|$#,817|$#,289|$#,)! +3 f5 (23|$#,817|$#,289|$#,)! +3 f0 (23|$#,817|$#,)! +3 f5 (23|$#,817|$#,)! +3 f0 ()! +3 f617 ()! +3 f0 (5|$#,5|$#,)! +3 f9 (5|$#,5|$#,)! +3 f0 (23|@5|4@0@7&#,63|$#,)! +3 f19 (23|@5|4@0@7&#,63|$#,)! +3 f23 (23|@5|4@0@7&#,63|$#,)! +3 f0 ()! +3 f612 ()! +3 f0 ()! +3 f618 ()! +3 f0 ()! +3 f612 ()! +2 y612|612& +3 f0 (5|$#,837|4@0@7&#,)! +3 f5 (5|$#,837|4@0@7&#,)! +3 f0 ()! +3 f19 ()! +3 f23 ()! +3 f0 ()! +3 f617 ()! +3 f0 ()! +3 f617 ()! +3 f0 ()! +3 f617 ()! +3 f0 ()! +3 f618 ()! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (5|$#,616|$#,5|$#,)! +3 f616 (5|$#,616|$#,5|$#,)! +3 f0 (23|$#,5|$#,)! +3 f9 (23|$#,5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 (43|4@0@7&#,)! +3 f5 (43|4@0@7&#,)! +3 f0 (5|$#,20|4@0@7&#,63|$#,)! +3 f64 (5|$#,20|4@0@7&#,63|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (612|$#,)! +3 f5 (612|$#,)! +3 f0 (617|$#,617|$#,)! +3 f5 (617|$#,617|$#,)! +3 f0 ()! +3 f617 ()! +3 f0 (618|$#,)! +3 f5 (618|$#,)! +3 f0 (6|$#,)! +3 f6 (6|$#,)! +3 f0 (5|$#,)! +3 f9 (5|$#,)! +3 f0 (5|$#,)! +3 f617 (5|$#,)! +3 f0 (5|$#,617|$#,)! +3 f5 (5|$#,617|$#,)! +3 f0 (5|$#,)! +3 f19 (5|$#,)! +3 f23 (5|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (5|$#,20|$#,63|$#,)! +3 f64 (5|$#,20|$#,63|$#,)! +3 Sutimbuf{586|@1|^#actime,586|@1|^#modtime,}! +0 s1404|-1 892 -1 +1 t891|891& +3 f0 (23|$#,892|0@5@7&#,)! +3 f5 (23|$#,892|0@5@7&#,)! +0 s41|& +3 f0 (23|$#,23|4@0@7&#,5|$#,)! +3 f1 (23|$#,23|4@0@7&#,5|$#,)! +3 C0.5/2|! +3 f0 (23|$#,23|$#,5|$#,)! +3 f5 (23|$#,23|$#,5|$#,)! +3 f898 (23|$#,23|$#,5|$#,)! +3 f0 (23|4@0@7&#,5|$#,)! +3 f1 (23|4@0@7&#,5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (191|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f5 (191|$#,23|0@5@19@2@0#,5|$#,63|$#,)! +3 f0 (191|$#,23|0@5@19@2@0#,5|$#,)! +3 f1 (191|$#,23|0@5@19@2@0#,5|$#,)! +3 f0 (191|$#,)! +3 f1 (191|$#,)! +3 f0 (5|$#,23|4@0@7&#,5|$#,)! +3 f5 (5|$#,23|4@0@7&#,5|$#,)! +3 f0 (20|4@0@7&#,63|$#,63|$#,191|$#,)! +3 f63 (20|4@0@7&#,63|$#,63|$#,191|$#,)! +3 f0 (20|$#,63|$#,63|$#,191|$#,)! +3 f63 (20|$#,63|$#,63|$#,191|$#,)! +3 f0 (191|$#,)! +3 f1 (191|$#,)! +3 f0 (191|$#,)! +3 f1 (191|$#,)! +3 C0.1/20|! +3 f0 (20|@5|4@0@7&#,20|0@0@9&#,5|$#,63|$#,)! +3 f1 (20|@5|4@0@7&#,20|0@0@9&#,5|$#,63|$#,)! +3 f924 (20|@5|4@0@7&#,20|0@0@9&#,5|$#,63|$#,)! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,23|$#,5|$#,)! +3 f5 (23|$#,23|$#,5|$#,)! +3 f0 (23|$#,)! +3 f19 (23|$#,)! +3 f23 (23|$#,)! +3 f0 (23|$#,23|0@5@7&#,)! +3 f19 (23|$#,23|0@5@7&#,)! +3 f23 (23|$#,23|0@5@7&#,)! +3 f0 (23|@5|$#,4|$#,)! +3 f19 (23|@5|$#,4|$#,)! +3 f23 (23|@5|$#,4|$#,)! +3 f0 (23|@5|$#,4|$#,)! +3 f19 (23|@5|$#,4|$#,)! +3 f23 (23|@5|$#,4|$#,)! +3 f0 (23|$#,23|$#,)! +3 f19 (23|$#,23|$#,)! +3 f191 (23|$#,23|$#,)! +3 f0 (191|$#,)! +3 f5 (191|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 (17|$#,)! +3 f17 (17|$#,)! +3 f0 ()! +3 f1 ()! +0 s4|& +0 s12|& +0 s9|& +0 s19|& +0 s5|& +0 s13|& +0 s10|& +0 s20|& +0 s14|& +0 s6|& +0 s42|& +0 s53|& +0 s55|& +0 s54|& +0 s15|& +0 s11|& +0 s7|& +0 s21|& +0 s8|& +0 s43|& +0 s52|& +2 F0/12|0& +2 F4/12|4& +0 s72|& +0 s63|& +0 s64|& +0 s65|& +0 s16|& +0 s57|& +0 s59|-1 1206 -1 +0 s61|& +0 s66|& +0 s58|& +0 s60|& +0 s62|& +0 s67|& +0 s68|& +0 s69|& +0 s70|& +0 s71|& +0 s17|& +0 s73|& +0 s18|& +0 a2|-1 1136 -1 +3 f0 (5|$#,23|4@0@7&#,5|$#,)! +3 f5 (5|$#,23|4@0@7&#,5|$#,)! +3 C0.5/9|! +3 f0 (5|$#,1003|$#,20|4@0@7&#,)! +3 f5 (5|$#,1003|$#,20|4@0@7&#,)! +3 f0 (23|4@0@7&#,5|$#,)! +3 f5 (23|4@0@7&#,5|$#,)! +3 f0 ()! +3 f617 ()! +3 Siovec{20|@1|0@0@3&#iov_base,63|@1|^#iov_len,}! +0 s1405|-1 1032 1012 +2 y1011|1011& +3 f0 (5|$#,1012|$#,5|$#,)! +3 f64 (5|$#,1012|$#,5|$#,)! +3 f0 (5|$#,1012|$#,5|$#,)! +3 f64 (5|$#,1012|$#,5|$#,)! +3 Spoll{5|@1|^#fd,7|@1|^#events,7|@1|^#revents,}! +0 s1420|-1 -1 1019 +2 y1018|1018& +3 f0 (1019|$#,10|$#,5|$#,)! +3 f5 (1019|$#,10|$#,5|$#,)! +3 f0 (20|4@2@2&#,)! +3 f1 (20|4@2@2&#,)! +2 F0/14|0& +2 F4/14|4& +3 Ssockaddr{989|@1|^#sa_len,989|@1|^#sa_family,1025|@1|^#sa_data,}! +0 s1424|-1 1037 -1 +3 Slinger{5|@1|^#l_onoff,5|@1|^#l_linger,}! +0 s1407|& +3 Ssockproto{990|@1|^#sp_family,990|@1|^#sp_protocol,}! +0 s1415|& +1 t1011|1011& +3 Smsghdr{968|@1|0@0@3&#msg_name,991|@1|^#msg_namelen,1032|@1|0@0@3&#msg_iov,991|@1|^#msg_iovlen,968|@1|0@0@3&#msg_control,991|@1|^#msg_controllen,5|@1|^#msg_flags,}! +0 s1436|-1 1056 -1 +3 Scmsghdr{991|@1|^#cmsg_len,5|@1|^#cmsg_level,5|@1|^#cmsg_type,}! +0 s1419|& +1 t1027|1027& +3 f0 (5|$#,1037|$#,24|$#,)! +3 f5 (5|$#,1037|$#,24|$#,)! +3 f0 (5|$#,1037|$#,5|$#,)! +3 f5 (5|$#,1037|$#,5|$#,)! +3 f0 (5|$#,1037|$#,5|$#,)! +3 f5 (5|$#,1037|$#,5|$#,)! +3 f0 (5|$#,1037|4@0@7&#,24|$#,)! +3 f5 (5|$#,1037|4@0@7&#,24|$#,)! +3 f0 (5|$#,1037|$#,24|$#,)! +3 f5 (5|$#,1037|$#,24|$#,)! +3 f0 (5|$#,5|$#,5|$#,20|4@0@7&#,24|$#,)! +3 f5 (5|$#,5|$#,5|$#,20|4@0@7&#,24|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,20|4@0@7&#,63|$#,5|$#,)! +3 f64 (5|$#,20|4@0@7&#,63|$#,5|$#,)! +3 f0 (5|$#,20|$#,63|$#,5|$#,1037|0@5@7&#,24|$#,)! +3 f64 (5|$#,20|$#,63|$#,5|$#,1037|0@5@7&#,24|$#,)! +1 t1034|1034& +3 f0 (5|$#,1056|$#,5|$#,)! +3 f64 (5|$#,1056|$#,5|$#,)! +3 f0 (5|$#,20|$#,63|$#,5|$#,)! +3 f64 (5|$#,20|$#,63|$#,5|$#,)! +3 f0 (5|$#,20|$#,63|$#,5|$#,1037|$#,5|$#,)! +3 f64 (5|$#,20|$#,63|$#,5|$#,1037|$#,5|$#,)! +3 f0 (5|$#,1056|$#,5|$#,)! +3 f64 (5|$#,1056|$#,5|$#,)! +3 f0 (5|$#,5|$#,5|$#,20|$#,5|$#,)! +3 f5 (5|$#,5|$#,5|$#,20|$#,5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,5|$#,5|$#,)! +3 f5 (5|$#,5|$#,5|$#,)! +3 f0 (5|$#,5|$#,5|$#,24|4@0@7&#,)! +3 f5 (5|$#,5|$#,5|$#,24|4@0@7&#,)! +3 f0 (5|$#,23|$#,)! +3 f1 (5|$#,23|$#,)! +3 f0 (5|$#,289|$#,23|$#,)! +3 f5 (5|$#,289|$#,23|$#,)! +3 f0 (23|$#,23|$#,5|$#,)! +3 f5 (23|$#,23|$#,5|$#,)! +3 f0 (23|$#,)! +3 f5 (23|$#,)! +3 f0 (23|$#,)! +3 f1 (23|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +0 s1442|-1 1090 -1 +1 t1089|1089& +3 f0 (24|$#,5|$#,1090|4@5@7&#,)! +3 f617 (24|$#,5|$#,1090|4@5@7&#,)! +3 f0 (617|$#,24|$#,5|$#,1090|4@5@7&#,)! +3 f617 (617|$#,24|$#,5|$#,1090|4@5@7&#,)! +3 Stimeval{9|@1|^#tv_sec,9|@1|^#tv_usec,}! +0 s1417|-1 1105 -1 +3 Stimespec{9|@1|^#ts_sec,9|@1|^#ts_nsec,}! +0 s1416|& +3 Stimezone{5|@1|^#tz_minuteswest,5|@1|^#tz_dsttime,}! +0 s1418|-1 1111 -1 +3 Sitimerval{1096|@1|^#it_interval,1096|@1|^#it_value,}! +0 s1406|-1 1108 -1 +3 Sclockinfo{5|@1|^#hz,5|@1|^#tick,5|@1|^#stathz,5|@1|^#profhz,}! +0 s1426|& +1 t1096|1096& +3 f0 (1105|$#,1105|4@5@7&#,)! +3 f5 (1105|$#,1105|4@5@7&#,)! +1 t1102|1102& +3 f0 (5|$#,1108|4@0@7&#,)! +3 f5 (5|$#,1108|4@0@7&#,)! +1 t1100|1100& +3 f0 (1105|4@5@7&#,1111|4@5@7&#,)! +3 f5 (1105|4@5@7&#,1111|4@5@7&#,)! +3 f0 (5|$#,1108|$#,1108|4@5@7&#,)! +3 f5 (5|$#,1108|$#,1108|4@5@7&#,)! +3 f0 (1105|$#,1111|$#,)! +3 f5 (1105|$#,1111|$#,)! +3 f0 (23|$#,1105|0@5@7&#,)! +3 f5 (23|$#,1105|0@5@7&#,)! +3 f0 (968|@5|0@5@7&#,63|$#,5|$#,5|$#,5|$#,616|$#,)! +3 f968 (968|@5|0@5@7&#,63|$#,5|$#,5|$#,5|$#,616|$#,)! +3 f0 (968|$#,5|$#,5|$#,)! +3 f5 (968|$#,5|$#,5|$#,)! +3 f0 (968|$#,5|$#,5|$#,)! +3 f5 (968|$#,5|$#,5|$#,)! +3 f0 (968|$#,63|$#,)! +3 f5 (968|$#,63|$#,)! +3 f0 (968|$#,5|$#,5|$#,)! +3 f5 (968|$#,5|$#,5|$#,)! +3 f0 (968|$#,63|$#,)! +3 f5 (968|$#,63|$#,)! +3 f0 (968|$#,63|$#,)! +3 f5 (968|$#,63|$#,)! +3 Swinsize{8|@1|^#ws_row,8|@1|^#ws_col,8|@1|^#ws_xpixel,8|@1|^#ws_ypixel,}! +0 s1430|& +1 t1000|1000& +3 f0 (5|$#,1136|$#,)! +3 f1 (5|$#,1136|$#,)! +3 f0 (1136|$#,1136|4@0@7&#,)! +3 f1 (1136|$#,1136|4@0@7&#,)! +3 f0 (5|$#,1136|$#,)! +3 f5 (5|$#,1136|$#,)! +3 f898 (5|$#,1136|$#,)! +3 f0 (5|$#,1136|$#,)! +3 f1 (5|$#,1136|$#,)! +3 f0 (1136|4@0@7&#,)! +3 f1 (1136|4@0@7&#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,618|$#,612|$#,)! +3 f5 (5|$#,618|$#,612|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,616|$#,)! +3 f5 (5|$#,616|$#,)! +3 f0 (23|4@0@7&#,5|$#,)! +3 f5 (23|4@0@7&#,5|$#,)! +3 f0 (23|$#,5|$#,)! +3 f5 (23|$#,5|$#,)! +3 f0 (23|$#,618|$#,612|$#,)! +3 f5 (23|$#,618|$#,612|$#,)! +3 f0 (23|$#,23|4@0@7&#,5|$#,)! +3 f5 (23|$#,23|4@0@7&#,5|$#,)! +3 f0 (5|$#,1136|0@5@7&#,1136|0@5@7&#,1136|0@5@7&#,1105|$#,)! +3 f5 (5|$#,1136|0@5@7&#,1136|0@5@7&#,1136|0@5@7&#,1105|$#,)! +3 f0 (612|$#,)! +3 f5 (612|$#,)! +3 f0 (618|$#,)! +3 f5 (618|$#,)! +1 t612|612& +3 f0 (5|$#,1170|$#,)! +3 f5 (5|$#,1170|$#,)! +3 f0 (612|$#,612|$#,)! +3 f5 (612|$#,612|$#,)! +3 f0 (612|$#,612|$#,)! +3 f5 (612|$#,612|$#,)! +3 f0 ()! +3 f1 ()! +3 f0 (23|$#,23|$#,)! +3 f5 (23|$#,23|$#,)! +3 f0 (23|$#,616|$#,)! +3 f5 (23|$#,616|$#,)! +3 Sipc_perm{618|@1|^#uid,612|@1|^#gid,618|@1|^#cuid,612|@1|^#cgid,614|@1|^#mode,988|@1|^#seq,976|@1|^#key,}! +0 s1437|& +0 s1400|-1 1186 -1 +1 t1185|1185& +3 Smsqid_ds{1184|@1|^#msg_perm,1186|@1|0@0@3&#msg_first,1186|@1|0@0@3&#msg_last,992|@1|^#msg_cbytes,992|@1|^#msg_qnum,992|@1|^#msg_qbytes,617|@1|^#msg_lspid,617|@1|^#msg_lrpid,586|@1|^#msg_stime,586|@1|^#msg_rtime,586|@1|^#msg_ctime,}! +0 s1441|-1 1191 -1 +3 Smymesg{9|@1|^#mtype,42|@1|^#mtext,}! +0 s1409|& +1 t1188|1188& +3 f0 (5|$#,5|$#,1191|4@0@7&#,)! +3 f5 (5|$#,5|$#,1191|4@0@7&#,)! +3 f0 (976|$#,5|$#,)! +3 f5 (976|$#,5|$#,)! +3 f0 (5|$#,20|4@0@7&#,63|$#,9|$#,5|$#,)! +3 f5 (5|$#,20|4@0@7&#,63|$#,9|$#,5|$#,)! +3 f0 (5|$#,20|$#,63|$#,5|$#,)! +3 f5 (5|$#,20|$#,63|$#,5|$#,)! +0 s1428|-1 1201 -1 +1 t1200|1200& +3 Ssemid_ds{1184|@1|^#sem_perm,1201|@1|0@0@3&#sem_base,986|@1|^#sem_nsems,586|@1|^#sem_otime,586|@1|^#sem_ctime,}! +0 s1434|-1 1205 -1 +3 Ssem{986|@1|^#semval,617|@1|^#sempid,986|@1|^#semncnt,986|@1|^#semzcnt,}! +1 t1203|1203& +1 t986|986& +3 Usemun{5|@1|^#val,1205|@1|0@0@3&#buf,1206|@1|0@0@3&#array,}! +0 s1444|& +3 Ssembuf{986|@1|^#sem_num,7|@1|^#sem_op,7|@1|^#sem_flg,}! +0 s1425|-1 1215 -1 +3 f0 (5|$#,5|$#,5|$#,1208|$#,)! +3 f5 (5|$#,5|$#,5|$#,1208|$#,)! +3 f0 (976|$#,5|$#,5|$#,)! +3 f5 (976|$#,5|$#,5|$#,)! +1 t1210|1210& +3 f0 (5|$#,1215|$#,63|$#,)! +3 f5 (5|$#,1215|$#,63|$#,)! +3 Sshmid_ds{1184|@1|^#shm_perm,5|@1|^#shm_segsz,986|@1|^#shm_lkcnt,617|@1|^#shm_lpid,617|@1|^#shm_cpid,988|@1|^#shm_nattch,988|@1|^#shm_cnattch,586|@1|^#shm_atime,586|@1|^#shm_dtime,586|@1|^#shm_ctime,}! +0 s1439|-1 1223 -1 +3 f0 (5|$#,20|0@5@7&#,5|$#,)! +3 f19 (5|$#,20|0@5@7&#,5|$#,)! +3 f20 (5|$#,20|0@5@7&#,5|$#,)! +1 t1219|1219& +3 f0 (5|$#,5|$#,1223|4@0@7&#,)! +3 f5 (5|$#,5|$#,1223|4@0@7&#,)! +3 f0 (20|$#,)! +3 f5 (20|$#,)! +3 f0 (976|$#,5|$#,5|$#,)! +3 f5 (976|$#,5|$#,5|$#,)! +0 s56|& +0 s1401|-1 1232 -1 +1 t1231|1231& +3 S!4{5|@1|^#re_magic,63|@1|^#re_nsub,23|@1|0@0@3&#re_endp,1232|@1|0@0@3&#re_g,}! +0 s1427|& +0 s77|-1 1239 -1 +3 S!5{1230|@1|^#rm_so,1230|@1|^#rm_eo,}! +0 s1413|& +0 s76|-1 1244 -1 +1 t1235|1235& +3 f0 (1239|4@0@7&#,23|$#,5|$#,)! +3 f5 (1239|4@0@7&#,23|$#,5|$#,)! +3 f0 (5|$#,1239|$#,23|4@0@7&#,63|$#,)! +3 f63 (5|$#,1239|$#,23|4@0@7&#,63|$#,)! +1 t1238|1238& +3 f0 (1239|$#,23|$#,63|$#,1244|4@0@7&#,5|$#,)! +3 f5 (1239|$#,23|$#,63|$#,1244|4@0@7&#,5|$#,)! +3 f0 (1239|$#,)! +3 f1 (1239|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 ()! +3 f1 ()! +3 f0 (23|$#,5|$#,5|$#,)! +3 f1 (23|$#,5|$#,5|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (5|$#,23|$#,!.,)! +3 f1 (5|$#,23|$#,!.,)! +3 f0 (5|$#,23|$#,184|$#,)! +3 f1 (5|$#,23|$#,184|$#,)! +3 f0 ()! +3 f1 ()! +3 f0 ()! +3 f19 ()! +3 f655 ()! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 ()! +3 f5 ()! +3 f0 ()! +3 f1 ()! +3 f0 ()! +3 f19 ()! +3 f646 ()! +3 f0 ()! +3 f5 ()! +3 f0 (23|$#,)! +3 f1 (23|$#,)! +3 f0 (5|$#,)! +3 f5 (5|$#,)! +3 f0 (614|@7|$#,)! +3 f5 (614|@7|$#,)! +3 f898 (614|@7|$#,)! +3 f0 (614|@7|$#,)! +3 f5 (614|@7|$#,)! +3 f898 (614|@7|$#,)! +3 f0 (23|$#,992|$#,)! +3 f5 (23|$#,992|$#,)! +3 f0 (5|$#,992|$#,)! +3 f5 (5|$#,992|$#,)! +3 f0 (5|$#,614|$#,)! +3 f5 (5|$#,614|$#,)! +3 f0 (23|$#,719|4@0@7&#,)! +3 f5 (23|$#,719|4@0@7&#,)! +3 Sstrbuf{5|@1|^#maxlen,5|@1|^#len,23|@1|0@0@3&#buf,}! +0 s1422|-1 1304 -1 +3 Sstr_mlist{42|@1|^#l_name,}! +0 s1403|-1 1301 -1 +1 t1300|1300& +3 Sstr_list{5|@1|^#sl_nmods,1301|@1|0@0@3&#sl_modlist,}! +0 s1414|& +1 t1298|1298& +3 f0 (5|$#,1304|4@0@7&#,1304|4@0@7&#,24|$#,)! +3 f5 (5|$#,1304|4@0@7&#,1304|4@0@7&#,24|$#,)! +3 f0 (5|$#,1304|4@0@7&#,1304|4@0@7&#,24|$#,24|$#,)! +3 f5 (5|$#,1304|4@0@7&#,1304|4@0@7&#,24|$#,24|$#,)! +3 f0 (5|$#,1304|$#,1304|$#,24|$#,)! +3 f5 (5|$#,1304|$#,1304|$#,24|$#,)! +3 f0 (5|$#,1304|$#,1304|$#,5|$#,24|$#,)! +3 f5 (5|$#,1304|$#,1304|$#,5|$#,24|$#,)! +3 Srusage{1096|@1|^#ru_utime,1096|@1|^#ru_stime,9|@1|^#ru_maxrss,9|@1|^#ru_ixrss,9|@1|^#ru_idrss,9|@1|^#ru_isrss,9|@1|^#ru_minflt,9|@1|^#ru_majflt,9|@1|^#ru_nswap,9|@1|^#ru_inblock,9|@1|^#ru_oublock,9|@1|^#ru_msgsnd,9|@1|^#ru_msgrcv,9|@1|^#ru_nsignals,9|@1|^#ru_nvcsw,9|@1|^#ru_nivcsw,}! +3 Srlimit{9|@1|^#rlim_cur,9|@1|^#rlim_max,}! +0 s1412|-1 1322 -1 +2 F0/3|0& +2 F10/3|10& +3 Sloadavg{1317|@1|^#ldavg,9|@1|^#fscale,}! +0 s1408|& +3 f0 (5|$#,5|$#,)! +3 f5 (5|$#,5|$#,)! +1 t1315|1315& +3 f0 (5|$#,1322|4@0@7&#,)! +3 f5 (5|$#,1322|4@0@7&#,)! +3 f0 (5|$#,1090|4@0@7&#,)! +3 f5 (5|$#,1090|4@0@7&#,)! +3 f0 (5|$#,5|$#,5|$#,)! +3 f5 (5|$#,5|$#,5|$#,)! +3 f0 (5|$#,1322|$#,)! +3 f5 (5|$#,1322|$#,)! +;;tistable +0 +0,46 +46 +0,46,47 +47 +0,46,47,48 +48 +0,46,47,48,49 +49 +50 +50,51 +51 +50,51,1 +1 +2 +;;symTable +*0 (Datatype) +0@+@=@0@0@0@0@67#mbstate_t +0@+@=@0@0@0@0@665#sigset_t +0@+@=@0@0@0@0@1000#fd_set +2@-@-@0@0@0@0@2#lltX_bool +3@-@-@0@0@0@0@957#uchar_t +3@-@-@0@0@0@0@961#vuchar_t +5@-@-@0@0@0@0@966#level_t +5@-@-@0@0@0@0@973#chan_t +5@-@-@0@0@0@0@975#paddr_t +6@-@-@0@0@0@0@959#uint_t +6@-@-@0@0@0@0@963#vuint_t +7@-@-@0@0@0@0@972#cnt_t +8@-@-@0@0@0@0@958#ushort_t +8@-@-@0@0@0@0@962#vushort_t +9@-@-@0@0@0@0@965#label_t +9@-@-@0@0@0@0@971#physadr_t +9@-@-@0@0@0@0@984#timer_t +9@-@-@0@0@0@0@997#swblk_t +9@-@-@0@0@0@0@999#segsz_t +10@-@-@0@0@0@0@960#ulong_t +10@-@-@0@0@0@0@964#vulong_t +10@-@-@0@0@0@0@974#rlim_t +13@-@-@0@0@0@0@59#__SIZE_TYPE__ +13@-@-@0@0@0@0@60#__PTRDIFF_TYPE__ +13@-@-@0@0@0@0@61#__WCHAR_TYPE__ +13@-@-@0@0@0@0@62#ptrdiff_t +13@-@-@0@0@0@0@65#wchar_t +13@-@-@0@0@0@0@66#wint_t +13@-@-@0@0@0@0@156#sig_atomic_t +13@-@-@0@0@0@0@478#wctype_t +13@-@-@0@0@0@0@479#wctrans_t +13@-@-@0@0@0@0@585#clock_t +13@-@-@0@0@0@0@586#time_t +13@-@-@0@0@0@0@611#dev_t +13@-@-@0@0@0@0@612#gid_t +13@-@-@0@0@0@0@613#ino_t +13@-@-@0@0@0@0@614#mode_t +13@-@-@0@0@0@0@615#nlink_t +13@-@-@0@0@0@0@616#off_t +13@-@-@0@0@0@0@617#pid_t +13@-@-@0@0@0@0@618#uid_t +13@-@-@0@0@0@0@895#clockid_t +13@-@-@0@0@0@0@967#daddr_t +13@-@-@0@0@0@0@976#key_t +14@-@-@0@0@0@0@63#size_t +15@-@-@0@0@0@0@64#ssize_t +20@+@+@0@0@0@0@151#jmp_buf +20@+@+@0@0@0@0@184#va_list +20@+@+@0@0@0@0@189#FILE +20@+@+@0@0@0@0@190#fpos_t +20@+@+@0@0@0@0@619#DIR +20@+@+@0@0@0@0@660#sigjmp_buf +20@-@+@0@0@0@0@977#mid_t +23@-@+@0@0@0@0@968#caddr_t +23@-@+@0@0@0@0@970#addr_t +28@-@+@0@0@0@0@969#qaddr_t +616@-@-@0@0@0@0@1230#regoff_t +957@-@-@0@0@0@0@985#uchar +957@-@-@0@0@0@0@989#u_char +958@-@-@0@0@0@0@986#ushort +958@-@-@0@0@0@0@990#u_short +959@-@-@0@0@0@0@987#uint +959@-@-@0@0@0@0@991#u_int +960@-@-@0@0@0@0@981#shmatt_t +960@-@-@0@0@0@0@982#msgqnum_t +960@-@-@0@0@0@0@983#msglen_t +960@-@-@0@0@0@0@988#ulong +960@-@-@0@0@0@0@992#u_long +961@-@-@0@0@0@0@993#vu_char +962@-@-@0@0@0@0@994#vu_short +963@-@-@0@0@0@0@995#vu_int +964@-@-@0@0@0@0@996#vu_long +979@-@-@0@0@0@0@980#slab_t +992@-@-@0@0@0@0@998#fixpt_t +341@-@-@0@0@0@0@343#div_t +348@-@-@0@0@0@0@350#ldiv_t +1236@-@-@0@0@0@0@1238#regmatch_t +1233@-@-@0@0@0@0@1235#regex_t +757@-@-@0@0@0@0@758#cc_t +760@-@-@0@0@0@0@761#speed_t +760@-@-@0@0@0@0@762#tcflag_t +*1 (Constant) +0@i0@0@6#NULL +2@i1@0@0#TRUE +2@i0@0@6#FALSE +3$#UCHAR_MAX#UCHAR_MIN +4$#CHAR_MAX#CHAR_MIN#SCHAR_MAX#SCHAR_MIN +5$#ACCESSPERMS#AF_APPLETALK#AF_CCITT#AF_CHAOS#AF_CNT#AF_COIP#AF_DATAKIT#AF_DECnet#AF_DLI#AF_E164#AF_ECMA#AF_HYLINK#AF_IMPLINK#AF_INET#AF_IPX#AF_ISDN#AF_ISO#AF_LAT#AF_LINK#AF_LOCAL#AF_MAX#AF_NS#AF_OSI#AF_PUP#AF_ROUTE#AF_SIP#AF_SNA#AF_UNIX#AF_UNSPEC#ALLPERMS#AREGTYPE#B0#B110#B1200#B134#B150#B1800#B19200#B200#B2400#B300#B38400#B4800#B50#B600#B75#B9600#BADSIG#BLKTYPE#BRKINT#BUFSIZ#CHAR_BIT#CHRTYPE#CLK_TCK#CLOCAL#CLOCKS_PER_SEC#CONTTYPE#CREAD#CS5#CS6#CS7#CS8#CSIZE#CSTOPB#DEFFILEMODE#DIRTYPE#DOMAIN#DST_AUST#DST_CAN#DST_EET#DST_MET#DST_NONE#DST_USA#DST_WET#E2BIG#EACCES#EACTIVE#EADDRINUSE#EADDRNOTAVAIL#EAFNOSUPPORT#EAGAIN#EALIGN#EALREADY#EAUTH#EBADF#EBADRPC#EBUSY#ECHILD#ECHO#ECHOE#ECHOK#ECHONL#ECONNABORTED#ECONNREFUSED#ECONNRESET#EDEADLK#EDESTADDRREQ#EDOM#EDQUOT#EDUPBADOPCODE#EDUPINTRANSIT#EDUPNOCONN#EDUPNODISCONN#EDUPNOTCNTD#EDUPNOTIDLE#EDUPNOTRUN#EDUPNOTWAIT#EDUPTOOMANYCPUS#EEXIST#EFAULT#EFBIG#EFTYPE#EHOSTDOWN#EHOSTUNREACH#EIDRM#EILSEQ#EINPROGRESS#EINTR#EINVAL#EIO#EISCONN#EISDIR#ELAST#ELOOP#EMFILE#EMLINK#EMSGSIZE#ENAMETOOLONG#ENEEDAUTH#ENETDOWN#ENETRESET#ENETUNREACH#ENFILE#ENOACTIVE#ENOBUFS#ENODEV#ENODUST#ENOENT#ENOEXEC#ENOLCK#ENOMEM#ENOMSG#ENOPROTOOPT#ENORESOURCES#ENOSPC#ENOSYS#ENOSYSTEM#ENOTBLK#ENOTCONN#ENOTDIR#ENOTEMPTY#ENOTSOCK#ENOTTY#ENXIO#EOF#EOPNOTSUPP#EPERM#EPFNOSUPPORT#EPIPE#EPROCLIM#EPROCUNAVAIL#EPROGMISMATCH#EPROGUNAVAIL#EPROTONOSUPPORT#EPROTOTYPE#ERANGE#EREMOTE#ERMID#EROFS#ERPCMISMATCH#ESHUTDOWN#ESOCKTNOSUPPORT#ESPIPE#ESRCH#ESTALE#ETIMEDOUT#ETOOMANYREFS#ETXTBSY#EUSERS#EWOULDBLOCK#EXDEV#EXIT_FAILURE#EXIT_SUCCESS#FCHR_MAX#FD_CLOEXEC#FIFOTYPE#FILENAME_MAX#FLT_RADIX#FMNAMESZ#FOPEN_MAX#F_DUPFD#F_GETFD#F_GETFL#F_GETLK#F_OK#F_RDLCK#F_SETFD#F_SETFL#F_SETLK#F_SETLKW#F_UNLCK#F_WRLCK#GETALL#GETNCNT#GETPID#GETVAL#GETZCNT#HUPCL#ICANON#ICRNL#IEXTEN#IGNBRK#IGNCR#IGNLCR#IGNPAR#INPCK#INT_MAX#INT_MIN#IOV_MAX#IPC_CREAT#IPC_EXCL#IPC_M#IPC_NOWAIT#IPC_R#IPC_RMID#IPC_SET#IPC_STAT#IPC_W#ISIG#ISTRIP#ITIMER_PROF#ITIMER_REAL#ITIMER_VIRTUAL#IXOFF#IXON#LC_ALL#LC_COLLATE#LC_CTYPE#LC_MONETARY#LC_NUMERIC#LC_TIME#LNKTYPE#LOCK_MAX#LOG_ALERT#LOG_AUTH#LOG_AUTHPRIV#LOG_CONS#LOG_CRIT#LOG_CRON#LOG_DAEMON#LOG_DEBUG#LOG_EMERG#LOG_ERR#LOG_FTP#LOG_INFO#LOG_KERN#LOG_LOCAL0#LOG_LOCAL1#LOG_LOCAL2#LOG_LOCAL3#LOG_LOCAL4#LOG_LOCAL5#LOG_LOCAL6#LOG_LOCAL7#LOG_LPR#LOG_MAIL#LOG_NDELAY#LOG_NEWS#LOG_NOTICE#LOG_NOWAIT#LOG_ODELAY#LOG_PERROR#LOG_PID#LOG_SYSLOG#LOG_USER#LOG_UUCP#LOG_WARNING#LONG_BIT#L_ctermid#L_cuserid#L_tmpnam#MADV_DONTNEED#MADV_NORMAL#MADV_RANDOM#MADV_SEQUENTIAL#MADV_WILLNEED#MAP_ANON#MAP_COPY#MAP_FILE#MAP_FIXED#MAP_HASSEMAPHORE#MAP_INHERIT#MAP_NOEXTEND#MAP_NORESERVE#MAP_PRIVATE#MAP_RENAME#MAP_SHARED#MAXHOSTNAMELEN#MAX_CHAR#MSGMAX#MSGMNB#MSGMNI#MSGTQL#MSG_BAND#MSG_COMPAT#MSG_CTRUNC#MSG_DONTROUTE#MSG_DONTWAIT#MSG_EOF#MSG_EOR#MSG_HIPRI#MSG_NOERROR#MSG_OOB#MSG_PEEK#MSG_TRUNC#MSG_WAITALL#MS_ASYNC#MS_INVALIDATE#NCCS#NET_MAXID#NET_RT_DUMP#NET_RT_FLAGS#NET_RT_IFLIST#NET_RT_MAXID#NL_ARGMAX#NL_LANGMAX#NL_LBLMAX#NL_MSGMAX#NL_NMAX#NL_SETMAX#NL_TEXTMAX#NOFLSH#NZERO#OPOST#OVERFLOW#O_ACCMODE#O_APPEND#O_CREAT#O_EXCL#O_NOCTTY#O_NONBLOCK#O_RDONLY#O_RDWR#O_TRUNC#O_WRONLY#PARENB#PARMRK#PARODD#PASS_MAX#PATH_MAX#PF_APPLETALK#PF_CCITT#PF_CHAOS#PF_CNT#PF_COIP#PF_DATAKIT#PF_DECnet#PF_DLI#PF_ECMA#PF_HYLINK#PF_IMPLINK#PF_INET#PF_IPX#PF_ISDN#PF_ISO#PF_LAT#PF_LINK#PF_LOCAL#PF_MAX#PF_NS#PF_OSI#PF_PIP#PF_PUP#PF_ROUTE#PF_RTIP#PF_SIP#PF_SNA#PF_UNIX#PF_UNSPEC#PF_XTP#PID_MAX#PIPE_MAX#PLOSS#PPPDISC#PRIO_MAX#PRIO_MIN#PRIO_PGRP#PRIO_PROCESS#PRIO_USER#PROC_MAX#PROT_EXEC#PROT_READ#PROT_WRITE#RAND_MAX#REGTYPE#REG_ASSERT#REG_ATOI#REG_BACKR#REG_BADBR#REG_BADPAT#REG_BADRPT#REG_BASIC#REG_DUMP#REG_EBRACE#REG_EBRACK#REG_ECOLLATE#REG_ECTYPE#REG_EESCAPE#REG_EMPTY#REG_EPAREN#REG_ERANGE#REG_ESPACE#REG_ESUBREG#REG_EXTENDED#REG_ICASE#REG_INVARG#REG_ITOA#REG_LARGE#REG_NEWLINE#REG_NOMATCH#REG_NOSPEC#REG_NOSUB#REG_NOTBOL#REG_NOTEOL#REG_PEND#REG_STARTEND#REG_TRACE#RLIMIT_CORE#RLIMIT_CPU#RLIMIT_DATA#RLIMIT_FSIZE#RLIMIT_MEMLOCK#RLIMIT_NOFILE#RLIMIT_NPROC#RLIMIT_RSS#RLIMIT_STACK#RLIM_INFINITY#RLIM_NLIMITS#RS_HIPRI#RUSAGE_CHILDREN#RUSAGE_SELF#R_OK#SA_DISABLE#SA_NOCLDSTOP#SA_ONSTACK#SA_RESTART#SCM_RIGHTS#SEEK_CUR#SEEK_END#SEEK_SET#SEMAEM#SEMMNI#SEMMNS#SEMMNU#SEMMSL#SEMOPN#SEMUME#SEMVMX#SEM_A#SEM_R#SEM_UNDO#SETALL#SETVAL#SF_APPEND#SF_ARCHIVED#SF_IMMUTABLE#SF_SETTABLE#SHMLBA#SHMMAX#SHMMIN#SHMMNI#SHMSEG#SHM_LOCK#SHM_R#SHM_RDONLY#SHM_RND#SHM_UNLOCK#SHM_W#SIGABRT#SIGALRM#SIGBUS#SIGCHLD#SIGCONT#SIGEMT#SIGFPE#SIGHUP#SIGILL#SIGINFO#SIGINT#SIGIO#SIGIOT#SIGKILL#SIGPIPE#SIGPOLL#SIGPROF#SIGPWR#SIGQUIT#SIGSEGV#SIGSTOP#SIGSYS#SIGTERM#SIGTRAP#SIGTSTP#SIGTTIN#SIGTTOU#SIGURG#SIGUSR1#SIGUSR2#SIGVTALRM#SIGWINCH#SIGXCPU#SIGXFSZ#SIG_BLOCK#SIG_SETMASK#SIG_UNBLOCK#SING#SLIPDISC#SOCK_DGRAM#SOCK_RAW#SOCK_RDM#SOCK_SEQPACKET#SOCK_STREAM#SOL_SOCKET#SOMAXCONN#SO_ACCEPTCONN#SO_BROADCAST#SO_DEBUG#SO_DONTROUTE#SO_ERROR#SO_KEEPALIVE#SO_LINGER#SO_OOBINLINE#SO_RCVBUF#SO_RCVLOWAT#SO_RCVTIMEO#SO_REUSEADDR#SO_REUSEPORT#SO_SNDBUF#SO_SNDLOWAT#SO_SNDTIMEO#SO_TYPE#SO_USELOOPBACK#STDERR_FILENO#STDIN_FILENO#STDOUT_FILENO#STD_BLK#SYMTYPE#SYSPID_MAX#SYS_NMLN#SYS_OPEN#S_BANDURG#S_BLKSIZE#S_ERROR#S_HANGUP#S_HIPRI#S_IEXEC#S_IFBLK#S_IFCHR#S_IFDIR#S_IFIFO#S_IFLNK#S_IFMT#S_IFREG#S_IFSOCK#S_INPUT#S_IREAD#S_IRGRP#S_IROTH#S_ISGID#S_ISTXT#S_ISUID#S_ISVTX#S_IUSR#S_IWGRP#S_IWOTH#S_IWRITE#S_IWUSR#S_IWXG#S_IWXO#S_IWXU#S_IXGRP#S_IXOTH#S_IXUSR#S_MSG#S_OUTPUT#S_RDBAND#S_RDNORM#S_WRBAND#S_WRNORM#TABLDISC#TCIFLUSH#TCIOFF#TCIOFLUSH#TCION#TCOFLUSH#TCSADRAIN#TCSAFLUSH#TCSANOW#TGEXEC#TGREAD#TGWRITE#TIOCCBRK#TIOCCDTR#TIOCCONS#TIOCDRAIN#TIOCEXCL#TIOCEXT#TIOCFLUSH#TIOCGDRAINWAIT#TIOCGETA#TIOCGETD#TIOCGPGRP#TIOCGWINSZ#TIOCMBIC#TIOCMBIS#TIOCMGDTRWAIT#TIOCMGET#TIOCMODG#TIOCMODS#TIOCMSDTRWAIT#TIOCMSET#TIOCM_CAR#TIOCM_CD#TIOCM_CTS#TIOCM_DSR#TIOCM_DTR#TIOCM_LE#TIOCM_RI#TIOCM_RNG#TIOCM_RTS#TIOCM_SR#TIOCM_ST#TIOCNOTTY#TIOCNXCL#TIOCOUTQ#TIOCPKT#TIOCPKT_DATA#TIOCPKT_DOSTOP#TIOCPKT_FLUSHREAD#TIOCPKT_FLUSHWRITE#TIOCPKT_IOCTL#TIOCPKT_NOSTOP#TIOCPKT_START#TIOCPKT_STOP#TIOCREMOTE#TIOCSBRK#TIOCSCTTY#TIOCSDRAINWAIT#TIOCSDTR#TIOCSETA#TIOCSETAF#TIOCSETAW#TIOCSETD#TIOCSIG#TIOCSPGRP#TIOCSTART#TIOCSTAT#TIOCSTI#TIOCSTOP#TIOCSWINSZ#TIOCTIMESTAMP#TIOCUCNTL#TLOSS#TMAGLEN#TMP_MAX#TOEXEC#TOREAD#TOSTOP#TOWRITE#TSGID#TSUID#TSVTX#TTYDISC#TUEXEC#TUREAD#TUWRITE#TVERSLEN#UF_APPEND#UF_IMMUTABLE#UF_NODUMP#UID_MAX#UIO_MAXIOV#UNDERFLOW#USI_MAX#VEOF#VEOL#VERASE#VINTR#VKILL#VMIN#VQUIT#VSTART#VSTOP#VSUSP#VTIME#WAIT_ANY#WAIT_MYPGRP#WCHAR_MAX#WCHAR_MIN#WORD_BIT#WSTOPPED#WUNTRACED#W_OK#X_OK#_IOFBF#_IOLBF#_IONBF#_PC_CHOWN_RESTRUCTED#_PC_MAX_CANON#_PC_MAX_INPUT#_PC_NAME_MAX#_PC_NO_TRUNC#_PC_PATH_MAX#_PC_PIPE_BUF#_PC_VDISABLE#_POSIX_CHOWN_RESTRICTED#_POSIX_JOB_CONTROL#_POSIX_NO_TRUNC#_POSIX_SAVED_IDS#_POSIX_VDISABLE#_POSIX_VERSION#_SC_ARG_MAX#_SC_CHILD_MAX#_SC_CLK_TCK#_SC_JOB_CONTROL#_SC_NGROUPS_MAX#_SC_OPEN_MAX#_SC_SAVED_IDS#_SC_STREAM_MAX#_SC_TZNAME_MAX#_SC_VERSION#__INCLUDE_LEVEL__#__LCLINT__#__LINE__#pseudo_AF_PIP#pseudo_AF_RTIP#pseudo_AF_XTP +6$#UINT_MAX +7$#POLLERR#POLLHUP#POLLIN#POLLNVAL#POLLOUT#POLLPRI#POLLRDBAND#POLLRDNORM#POLLWRBAND#POLLWRNORM#SHRT_MAX#SHRT_MIN +8$#USHRT_MAX +9$#ARG_MAX#CHILD_MAX#LINK_MAX#LONG_MAX#LONG_MIN#MAX_CANON#MAX_INPUT#MB_LEN_MAX#NAME_MAX#NGROUPS_MAX#OPEN_MAX#PIPE_BUF#SSIZE_MAX#STREAM_MAX#TZNAME_MAX#_POSIX_ARG_MAX#_POSIX_CHILD_MAX#_POSIX_LINK_MAX#_POSIX_MAX_CANON#_POSIX_MAX_INPUT#_POSIX_NAME_MAX#_POSIX_NGROUPS_MAX#_POSIX_OPEN_MAX#_POSIX_PATH_MAX#_POSIX_PIPE_BUF#_POSIX_SSIZE#_POSIX_STREAM#_POSIX_TZNAME_MAX +10$#ULONG_MAX +17$#HUGE#HUGE_VAL#MAXFLOAT#M_1_PI#M_2_PI#M_2_SQRTPI#M_E#M_LN10#M_LN2#M_LOG10E#M_LOG2E#M_PI#M_PI_2#M_PI_4#M_SQRT1_2#M_SQRT2 +23$#__BASE_FILE__#__DATE__#__FILE__#__REGISTER_PREFIX__#__TIME__#__USER_LABEL_PREFIX__#__VERSION__ +2$#NDEBUG +63$#MB_CUR_MAX +66$#WEOF +160$#SIG_DFL +164$#SIG_ERR +168$#SIG_IGN +976$#IPC_PRIVATE +*3 (Variable) +5|@1|0@0@0@0@1#DBL_DIG#DBL_MANT_DIG#DBL_MAX_10_EXP#DBL_MAX_EXP#DBL_MIN_10_EXP#DBL_MIN_EXP#FLT_DIG#FLT_MANT_DIG#FLT_MAX_10_EXP#FLT_MAX_EXP#FLT_MIN_10_EXP#FLT_MIN_EXP#FLT_ROUNDS#LDBL_DIG#LDBL_MANT_DIG#LDBL_MAX_10_EXP#LDBL_MAX_EXP#LDBL_MIN_10_EXP#LDBL_MIN_EXP#daylight#opterr#optind#optopt#optreset#signgam +5|@1|0@0@0@0@4#errno +9|@1|0@0@0@0@1#timezone +16|@1|0@0@0@0@1#FLT_EPSILON#FLT_MAX#FLT_MIN +17|@1|0@0@0@0@1#DBL_EPSILON#DBL_MAX#DBL_MIN +18|@1|0@0@0@0@1#LDBL_EPSILON#LDBL_MAX#LDBL_MIN +23|@1|0@0@0@0@1#TMAGIC#TVERSION#optarg +191|@1|0@0@0@0@2#stderr#stdin#stdout +289|@1|0@0@0@0@1#environ +817|@1|0@0@0@0@1#tzname +*4 (Function) +338$@0@g925@0@0@1@tp0,g925$@0#qsort +1262$@0@s3@1@s3$@0#vsyslog +1260@6@0@1@1@0@0@s3@1@s3$@0#syslog +1256$@0@s3@1@s3$@0#openlog +897$@0@@1@tp1$@0#bcopy +911$@0@s1@1@s1$@0#setbuffer +1074$@0@s3@1@s3$@0#psignal +1138$@0@@1@tp1$@0#FD_CLR#FD_SET +903$@0@@1@tp0$@0#bzero +155@6@0@5@0@0@1@@1@s0$@0#longjmp +186$@0@@1@p0$@0#va_start +213$@0@s3@1@s3,tp0,tp1$@0#setbuf +662@6@0@5@0@0@1@@1@s0$@0#siglongjmp +1140$@0@@1@tp1$@0#FD_COPY +789@6@0@6@0@0@1@@1@s0$@0#_exit#exit +299$@0@s1@1@s1$@0#srand +1023$@0@@1@tp0$@0#free +1280$@0@s1@1@s1$@0#setgrfile +1082$@1@g942@0@0@1@tg942$@0#unsetenv +281$@1@g925@0@0,g939@0@0,s3@1@s3,tg939$@0#perror +71@6@0@8@0@0@1@@1@s0$@0#assert +188$@0@@1@p0$@0#va_end +913$@0@s1@1@s1$@0#setlinebuf +275$@0@@1@tp0$@0#clearerr#flockfile#funlockfile#rewind +633$@1@@1@s0$@0#rewinddir +1147$@0@@1@tp0$@0#FD_ZERO +1248$@0@@1@tp0$@0#regfree +1254$@0@s3@1@s3$@0#closelog#sync +956$@1@g942@0@0,s1@1@s1,g919,g926,g943$@0#tzset +1273$@0@s1@1@s1$@0#endgrent#endpwent +312@6@0@6@0@0@1@@1@s0$@0#abort +95$@1@@1@s0$@0#tolower#toupper +1066$@0@s1,g925@0@0@1@s1,g925$@0#setsockopt +1049$@0@g925@0@0@1@tp3,tp4,g925$@0#getsockopt +1197$@0@g925@0@0@1@g925,tp1$@0#msgrcv +1165$@0@g925@0@0@1@tp1,tp2,tp3,tp4,g925$@0#select +1312$@0@s1,g925@0@0@1@s1,g925$@0#putpmsg +1308$@0@g925@0@0@1@tp3,tp1,tp2,g925$@0#getpmsg +1246$@0@@1@tp3$@0#regexec +1072$@0@g925@0@0@1@g925$@0#socketpair +1212$@0@g925@0@0@1@g925$@0#semctl +1199$@0@g925@0@0@1@g925$@0#msgsnd +1310$@0@s1,g925@0@0@1@s1,g925$@0#putmsg +1306$@0@g925@0@0@1@tp1,tp2,g925$@0#getmsg +215$@0@s3@1@s3,tp0,tp1$@0#setvbuf +909$@0@s1@1@s1$@0#setvbuf_unlocked +397$@0@@1@tp0$@0#vswprintf +389@6@0@1@1@0@0@@1@tp0$@0#swprintf +1328$@0@g925@0@0,s1@1@g925,s1$@0#setpriority +1070$@0@g925@0@0@1@g925$@0#socket +785$@0@g925@0@0@1@g925$@0#tcsetattr +1193$@0@g925@0@0@1@g925,tp2$@0#msgctl +1225$@0@g925@0@0@1@g925,tp2$@0#shmctl +639$@0@g925@0@0@1@g925$@0#fcntl +915$@0@@1@p1$@0#strerror_r#ttyname_r +1076$@1@g938@0@0,g921@0@0,g922@0@0,g920@0@0,g923@0@0@1@g938,g921,g922$@0#getopt +1151$@0@g925@0@0,s3@1@g925,s3$@0#fchown +676$@0@g925@0@0,s1@1@tp2,g925,s1$@0#sigaction +691$@0@g925@0@0,s1@1@tp2,g925,s1$@0#sigprocmask +1043$@0@g925@0@0,s1@1@g925,s1$@0#connect +1041$@0@g925@0@0,s3@1@g925,s3$@0#bind +1047$@0@g925@0@0@1@tp1,tp2,g925$@0#getsockname +1039$@0@g925@0@0@1@tp2,g925$@0#accept +1045$@0@g925@0@0@1@tp1,tp2,g925$@0#getpeername +1115$@0@g925@0@0,s1@1@tp2,g925,s1$@0#setitimer +1217$@0@g925@0@0@1@g925$@0#semop +1005$@0@g925@0@0@1@tp2,g925$@0#ioctl +545$@1@@1@s0$@0#memcmp +641$@0@g925@0@0@1@g925$@0#open +931$@1@@1@s0$@0#strncasecmp +551$@1@@1@s0$@0#strncmp +1078$@1@g942@0@0,g925@0@0@1@tg942,g925$@0#setenv +811@6@0@5@0@0@0@g925@0@0@1@g925$@0#execl#execle#execlp +1163$@0@g925@0@0@1@tp1,g925$@0#readlink +797$@0@s3,g925@0@0@1@s3,g925$@0#chown#lchown +821@6@0@5@0@0@0@g925@0@0@1@g925$@0#execve +227@6@0@1@2@0@1@@1@s0$@0#sscanf +233$@0@@1@tp0,p2$@0#vsprintf +225@6@0@1@1@0@0@@1@tp0$@0#sprintf +267$@0@s3,g925@0@0@1@s3,tp0,g925$@0#fseek +229$@0@s3,g925@0@0@1@s3,tp0,p2,g925$@0#vfprintf +217@6@0@1@1@0@0@s3@1@s3,tp0$@0#fprintf +219@6@0@1@2@0@0@s3@1@s3,tp0$@0#fscanf +395$@0@s3@1@s3,tp0$@0#vfwprintf +368@6@0@1@1@0@0@s3@1@tp0,s3$@0#fwprintf +370@6@0@1@2@0@0@s3@1@tp0,s3$@0#fwscanf +429$@1@@1@s0$@0#wcsncmp#wmemcmp +391@6@0@1@2@0@0@g940@0@0@1@tg940$@0#swscanf +517$@0@@1@tp0$@0#mbtowc +1123$@1@@1@s0$@0#madvise#mprotect#msync +1214$@0@g925@0@0@1@g925$@0#semget#shmget +1021$@0@g925@0@0@1@frevents.ap0,g925$@0#poll +1241$@0@@1@tp0$@0#regcomp +1086$@1@@1@s0$@0#W_EXITCODE +807$@0@g925@0@0,s3@1@g925,s3$@0#dup2 +1051$@0@g925@0@0,s1@1@g925,s1$@0#listen +1321$@0@g925@0@0@1@g925$@0#getpriority#shutdown#tcflow#tcflush#tcsendbreak +1294$@0@s3,g925@0@0@1@s3,g925$@0#fchmod +1155$@0@g925@0@0,s3@1@g925,s3$@0#ftruncate +882$@0@g925@0@0,s1@1@g925,s1$@0#tcsetpgrp +721$@0@g925@0@0@1@g925,tp1$@0#fstat +781$@0@g925@0@0@1@g925,tp1$@0#tcgetattr +839$@0@g925@0@0@1@g925,ap1$@0#getgroups +1292$@0@s3,g925@0@0@1@s3,g925$@0#fchflags +1326$@0@g925@0@0@1@tp1,g925$@0#getrusage +1110$@0@g925@0@0@1@g925,tp1$@0#getitimer +1172$@0@g925@0@0,s1@1@g925,s1$@0#setgroups +1330$@0@g925@0@0,s1@1@g925,s1$@0#setrlimit +1324$@0@g925@0@0@1@tp1,g925$@0#getrlimit +1159$@0@s1@1@s1$@0#initgroups +791$@0@g925@0@0@1@g925$@0#access +929$@1@@1@s0$@0#strcasecmp#strcmp#strcoll +854$@0@g925@0@0,s3@1@g925,s3$@0#link#rename +1180$@0@s3@1@s3$@0#symlink +515$@1@@1@s0$@0#mblen +231$@1@g941@0@0,s3@1@s3,p1,tg941$@0#vprintf +243$@0@s3@1@s3,tp1$@0#fputs +718$@0@s3,g925@0@0@1@s3,g925$@0#chmod#mkdir#mkfifo +637$@0@g925@0@0@1@g925$@0#creat +1182$@0@g925@0@0,s3@1@g925,s3$@0#truncate +1296$@0@g925@0@0@1@g925,tp1$@0#lstat#stat +819@6@0@5@0@0@0@g925@0@0@1@g925$@0#execv#execvp +894$@0@s3,g925@0@0@1@s3,g925$@0#utime +1290$@0@s3,g925@0@0@1@s3,g925$@0#chflags +1119$@0@s3,g925@0@0@1@s3,g925$@0#utimes +223@6@0@1@2@0@1@g940@0@0,s3@1@s3,tg940$@0#scanf +221@6@0@1@1@0@1@g941@0@0,s3@1@s3,tg941$@0#printf +1157$@0@@1@p0,tp0$@0#gethostname +519$@0@@1@tp0$@0#wctomb +366$@1@@1@s0$@0#fwide +269$@0@s3,g925@0@0@1@s3,tp0,g925$@0#fsetpos +265$@0@g925@0@0@1@tp1,g925$@0#fgetpos +399$@0@s3,g941@0@0@1@s3,tg941$@0#vwprintf +364$@0@s3@1@s3,tp1$@0#fputws +410$@1@@1@s0$@0#wcscmp#wcscoll +475@6@0@1@1@0@1@g941@0@0,g925@0@0@1@g925,tg941$@0#wprintf +477@6@0@1@2@0@1@g940@0@0,g925@0@0@1@g925,tg940$@0#wscanf +1174$@0@g925@0@0,s1@1@g925,s1$@0#setregid#setreuid +673@6@0@5@0@0@0@g925@0@0@1@g925$@0#kill +870$@0@g925@0@0,s1@1@g925,s1$@0#setpgid +664$@0@@1@p0$@0#sigsetjmp +679$@0@g925@0@0@1@tp0,g925$@0#sigaddset#sigdelset +687$@0@g925@0@0@1@g925$@0#sigismember +1131$@1@@1@s0$@0#mlock#munlock#munmap +1195$@0@g925@0@0@1@g925$@0#msgget +1107$@0@s1,g925@0@0@1@s1,tp1,g925$@0#adjtime +1117$@0@s1,g925@0@0@1@s1,g925$@0#settimeofday +1113$@0@g925@0@0@1@tp0,tp1,g925$@0#gettimeofday +241$@0@s3,g925@0@0@1@s3,tp1,g925$@0#fputc#ungetc +252$@0@s3@1@s3,tp1$@0#putc +799$@0@s3,g925@0@0,s1@1@s3,g925,s1$@0#close +809$@0@g925@0@0,s3@1@g925,s3$@0#dup +1149$@0@s1,g925@0@0@1@s1,g925$@0#fchdir +1153$@0@g925@0@0,s3@1@g925,s3$@0#fsync +775$@0@g925@0@0@1@g925$@0#tcdrain +1282$@0@s1@1@s1$@0#setgroupent#setlogmask#setpassent +1250$@1@@1@s0$@0#LOG_MASK#LOG_UPTO#WCOREDUMP#WEXITSTATUS#WIFEXITED#WIFSIGNALED#WIFSTOPPED#WSTOPSIG#WTERMSIG#W_STOPCODE#abs#ffs#isatty +183@6@0@5@0@0$$@0#raise +1227$@0@g925@0@0@1@g925$@0#shmdt +887$@0@s3,g925@0@0@1@s3,g925$@0#unlink +1080$@1@g942@0@0,g925@0@0@1@tg942,g925$@0#putenv +193$@0@s3,g925@0@0@1@s3,g925$@0#remove#rmdir +256$@1@g941@0@0,s3@1@s3,tg941$@0#puts +795$@0@g925@0@0@1@g925$@0#chdir +285$@1@@1@s0$@0#atoi +325$@0@s3@1@s3$@0#system +862$@0@g925@0@0@1@g925$@0#pipe +459$@1@@1@s0$@0#wctob +153$@0@@1@p0$@0#setjmp +203$@0@g925@0@0,s3@1@tp0,g925,s3$@0#fclose#fgetc#pclose +277$@0@g925@0@0@1@g925$@0#feof#ferror#fileno +245$@0@s3@1@s3,tp0$@0#getc +205$@0@g925@0@0,s3@1@tp0,g925,s3$@0#fflush +320$@0@s1@1@s1$@0#atexit +381$@1@@1@s0$@0#mbsinit +1167$@0@g925@0@0,s1@1@g925,s1$@0#setegid#setgid +729$@0@s1@1@s1$@0#umask +1169$@0@g925@0@0,s1@1@g925,s1$@0#seteuid#setuid +624$@0@g925@0@0@1@g925$@0#closedir +693$@0@g925@0@0,s1@1@g925,s1$@0#sigsuspend +683$@0@g925@0@0@1@tp0,g925$@0#sigemptyset#sigfillset#sigpending +739$@0@g925@0@0@1@tp0,g925$@0#uname +771$@0@@1@tp0$@0#cfsetispeed#cfsetospeed +254$@1@g941@0@0,s3@1@s3,tg941$@0#putchar +1278$@0@s1@1@s1$@0#setgrent +860$@0@g925@0@0@1@g925$@0#pause +297$@0@s1@1@s1$@0#rand#setpwent +247$@1@g940@0@0,s3@1@s3,tg940$@0#getchar +793$@0@s1@1@s1$@0#alarm +876$@1@@1@s0$@0#sleep +293$@0@g925@0@0@1@tp1,g925$@0#strtol +453$@0@@1@tp1$@0#wcstol +827$@0@g925@0@0@1@g925$@0#fpathconf +858$@0@g925@0@0@1@g925$@0#pathconf +878$@0@g925@0@0@1@g925$@0#sysconf +347$@1@@1@s0$@0#labs +287$@1@@1@s0$@0#atol +271$@0@g925@0@0@1@g925$@0#ftell +295$@0@g925@0@0@1@tp1,g925$@0#strtoul +455$@0@@1@tp1$@0#wcstoul +130$@0@g925@0@0@1@g925$@0#ldexp +120$@1@@1@s0$@0#atan2#fmod +138$@0@g925@0@0@1@g925$@0#pow +132$@0@@1@tp1$@0#frexp +148$@0@@1@tp1$@0#modf +291$@0@g925@0@0@1@tp1,g925$@0#strtod +448$@0@@1@tp1$@0#wcstod +591$@1@@1@s0$@0#difftime +116$@0@g925@0@0@1@g925$@0#acos#asin#cbrt#cosh#exp#log#log10#sqrt +118$@1@@1@s0$@0#atan#ceil#cos#fabs#floor#rint#sin#sinh#tan#tanh#trunc +283$@1@@1@s0$@0#atof +332@6@5@1@0@0@1@@1@s0@18@0@0#bsearch +1222$@0@g925@0@0@1@g925@3@0@0#shmat +556@6@5@1@0@0@1@@1@s0@3@0@0#memchr +308@6@5@1@0@0@0@@1@tp0@2@0@0#realloc +302@6@5@1@0@0@1@@1@s0@2@0@0#calloc +305@4@5@1@0@0@1@@1@s0@2@0@0#malloc +238@6@5@1@0@0@0@s3,g925@0@0@1@s3,tp0,tp2,g925$@0#fgets +102@6@5@1@0@0@0@s1,g925@0@0@1@s1,g925@19@3@0#setlocale +937@6@5@1@0@0@0@s1@1@s1@3@0@0#tempnam +940@6@5@1@0@0@1@@1@s0@18@0@0#index#rindex +559@6@5@1@0@0@1@@1@s0@19@2@0#strchr#strrchr +564@6@5@1@0@0@1@@1@s0@19@2@0#strpbrk +575@6@5@1@0@0@0@s1,g925@0@0@1@tp0,s1,g925@19@2@0#strtok +572@6@5@1@0@0@1@@1@s0@19@2@0#strstr +830$@0@g925@0@0@1@g925,tp0$@0#getcwd +582$@1@@1@s0@19@3@0#strerror +885@6@5@1@0@0@0@g925@0@0@1@g925@19@3@0#ttyname +934$@1@@1@s0@3@0@0#strdup +323@6@5@1@0@0@1@@1@s0@19@3@0#getenv +250@6@5@1@0@0@1@g940@0@0,s3,g925@0@0@1@s3,tp0,tg940,g925@3@0@0#gets +805$@0@@1@tp0@3@0@0#cuserid +802$@0@s1@1@tp0,s1$@0#ctermid +201$@0@s1@1@tp0,s1@19@3@0#tmpnam +599$@0@g925@0@0@1@g925@19@3@0#asctime +602$@1@@1@s0@19@3@0#ctime +842$@1@@1@s0@19@3@0#getlogin +487$@1@@1@s0$@0#iswctype +73$@1@@1@s0$@0#isalnum#isalpha#iscntrl#isdigit#isgraph#islower#isprint#ispunct#isspace#isupper#isxdigit +481$@1@@1@s0$@0#iswalnum#iswalpha#iswcntrl#iswdigit#iswgraph#iswlower#iswprint#iswpunct#iswspace#iswupper#iswxdigit +1243$@0@@1@tp2$@0#regerror +262$@0@s3,g925@0@0@1@s3,tp3,g925$@0#fwrite +919$@0@@1@tp3$@0#fwrite_unlocked +260$@0@s3,g925@0@0@1@s3,tp0,tp3,g925$@0#fread +917$@0@@1@tp3,tp0$@0#fread_unlocked +441$@0@@1@tp1$@0#wcsrtombs +610$@0@@1@tp0$@0#strftime +379$@0@@1@tp0$@0#mbrtowc +383$@0@@1@tp0$@0#mbsrtowcs +421$@0@@1@tp0$@0#wcsftime +377$@1@@1@s0$@0#mbrlen +523$@0@@1@tp0$@0#wcstombs +553$@0@@1@tp0$@0#strxfrm +401$@0@@1@tp0$@0#wcrtomb +457$@0@@1@tp0$@0#wcsxfrm +521$@0@@1@tp0$@0#mbstowcs +561$@1@@1@s0$@0#strcspn#strspn +417$@1@@1@s0$@0#wcscspn#wcsspn +584$@1@@1@s0$@0#strlen +423$@1@@1@s0$@0#wcslen +1062$@0@g925@0@0@1@g925$@0#sendto +1055$@0@g925@0@0@1@tp1,tp4,tp5,g925$@0#recvfrom +1060$@0@g925@0@0@1@g925$@0#send +1053$@0@g925@0@0@1@tp1,g925$@0#recv +889$@0@g925@0@0@1@g925$@0#write +864$@0@g925@0@0@1@g925,tp1$@0#read +1014$@0@s3,g925@0@0@1@fiov_base.ap1,s3,g925$@0#readv +1016$@0@g925@0@0@1@g925$@0#writev +1058$@0@g925@0@0@1@afiov_base.tfmsg_iov.tp1,g925$@0#recvmsg +1064$@0@g925@0@0@1@g925$@0#sendmsg +362$@0@s3@1@s3,tp1$@0#fputwc +385$@0@s3@1@s3,tp1$@0#putwc +393$@0@s3@1@s3,tp1$@0#ungetwc +505$@1@@1@s0$@0#towctrans +354$@1@@1@s0$@0#btowc +387$@0@s3,g941@0@0@1@s3,tg941$@0#putwchar +507$@1@@1@s0$@0#towlower#towupper +356$@0@s3@1@s3,tp0$@0#fgetwc +372$@0@s3@1@s3,tp0$@0#getwc +374$@0@s3,g940@0@0@1@s3,tg940$@0#getwchar +106$@1@@1@s0@3@0@0#localeconv +211@6@5@1@0@0@0@s3,g925@0@0@1@tp2,s3,g925@3@0@0#freopen +696@6@5@1@0@0@0@g925@0@0,s3@1@g925,s3@18@0@0#fdopen +946@6@5@1@0@0@0@s3,g925@0@0@1@s3,g925@18@0@0#popen +208@6@5@1@0@0@0@s3@1@s3@18@0@0#fopen +198@6@5@1@0@0@0@s3@1@s3@3@0@0#tmpfile +345$@1@@1@s0$@0#div +352$@1@@1@s0$@0#ldiv +462@6@5@1@0@0@1@@1@s0@3@0@0#wmemchr +360@6@5@1@0@0@0@s3@1@s3,tp0,tp2$@0#fgetws +473$@0@@1@tp0$@0#wmemset +467$@0@@1@tp0$@0#wmemcpy#wmemmove +451@6@5@1@0@0@0@@1@tp2@3@0@0#wcstok +446@6@5@1@0@0@1@@1@s0@3@0@0#wcsstr +438@6@5@1@0@0@1@@1@s0$@0#wcsrchr +408@6@5@1@0@0@1@@1@s0@19@2@0#wcschr +435@6@5@1@0@0@1@@1@s0$@0#wcspbrk +608@6@5@1@0@0@0@g925@0@0@1@g925@19@3@0#localtime +605@6@5@1@0@0@1@@1@s0@19@3@0#gmtime +513$@1@@1@s0$@0#wctype +511$@1@@1@s0$@0#wctrans +734$@0@@1@tp0$@0#times +589$@0@s1@1@s1$@0#clock +593$@1@@1@s0$@0#mktime +596$@0@@1@tp0$@0#time +832$@1@@1@s0$@0#getegid#getgid +856$@0@g925@0@0@1@g925$@0#lseek +1094$@0@g925@0@0@1@tp1,tp3,g925$@0#wait4 +1092$@0@g925@0@0@1@tp0,tp2,g925$@0#wait3 +755$@0@g925@0@0@1@tp1,g925$@0#waitpid +880$@0@g925@0@0@1@g925$@0#tcgetpgrp +753$@0@g925@0@0@1@tp0,g925$@0#wait +825$@0@s3,g925@0@0@1@s3,g925$@0#fork +1009$@0@s3@1@s3$@0#vfork +844$@1@@1@s0$@0#getpgrp#getpid#getppid#setsid +834$@1@@1@s0$@0#geteuid#getuid +627@6@5@1@0@0@0@g925@0@0@1@g925@3@0@0#opendir +631@6@5@1@0@0@0@g925@0@0@1@g925@3@0@0#readdir +650@6@5@1@0@0@0@g925@0@0@1@g925@3@0@0#getgrnam +647@6@5@1@0@0@0@g925@0@0@1@g925@3@0@0#getgrgid +1276@6@5@1@0@0@0@s1@1@s1@3@0@0#getgrent +656@6@5@1@0@0@0@g925@0@0@1@g925@19@3@0#getpwnam +659@6@5@1@0@0@0@g925@0@0@1@g925@19@3@0#getpwuid +1267@6@5@1@0@0@0@s1@1@s1@3@0@0#getpwent +767$@1@@1@s0$@0#cfgetispeed#cfgetospeed +1121$@0@@1@p0$@0#mmap +181@6@5@1@0@0@0@s1,g925@0@0@1@s1,g925$@0#signal +927$@0@@1@tp0$@0#memccpy +579$@0@@1@tp0$@0#memset +530$@0@@1@tp0$@0#memmove +527$@0@@1@tp0$@0#memcpy +543$@0@@1@tp0$@0#strncat +537$@0@@1@tp0$@0#strncpy +540$@0@@1@tp0$@0#strcat#strcpy +427$@0@@1@tp0$@0#wcsncat#wcsncpy +405$@0@@1@tp0$@0#wcscat#wcscpy +704$@1@@1@s0$@0#S_ISBLK#S_ISCHR#S_ISDIR#S_ISFIFO#S_ISREG +901$@1@@1@s0$@0#bcmp +1143$@1@@1@s0$@0#FD_ISSET +1285$@1@@1@s0$@0#S_ISLNK#S_ISSOCK +*7 (Struct tag) +0@1185#@msg +0@1231#@re_guts +620@621#@dirent +1299@1300#@str_mlist +890@891#@utimbuf +1010@1011#@iovec +1101@1102#@itimerval +1028@1029#@linger +1318@1319#@loadavg +1189@1190#@mymesg +341@342#@!2 +348@349#@!3 +1314@1315#@rlimit +1236@1237#@!5 +1302@1303#@str_list +1030@1031#@sockproto +1097@1098#@timespec +1095@1096#@timeval +1099@1100#@timezone +1035@1036#@cmsghdr +1017@1018#@poll +642@643#@group +1297@1298#@strbuf +670@671#@sigaction +1026@1027#@sockaddr +1209@1210#@sembuf +1103@1104#@clockinfo +1233@1234#@!4 +1204@1200#@sem +730@731#@tms +1134@1135#@winsize +763@764#@termios +634@635#@flock +651@652#@passwd +1202@1203#@semid_ds +735@736#@utsname +1033@1034#@msghdr +1183@1184#@ipc_perm +587@418#@tm +1218@1219#@shmid_ds +699@700#@stat +1187@1188#@msqid_ds +1313@1089#@rusage +98@99#@lconv +*8 (Union tag) +1207@1208#$semun +;; Modules access +ansi#8@ +posix#13@ +unix#15@ +;;End diff --git a/src/DATE b/src/DATE new file mode 100644 index 0000000..d241c23 --- /dev/null +++ b/src/DATE @@ -0,0 +1 @@ +20 May 2000 diff --git a/src/Headers/256_random_numbers.nf b/src/Headers/256_random_numbers.nf new file mode 100644 index 0000000..a8dbbeb --- /dev/null +++ b/src/Headers/256_random_numbers.nf @@ -0,0 +1,256 @@ +0x7be9c1bd, +0x088aa102, +0x3d38509b, +0x746b9fbe, +0x2d04417f, +0x775d4351, +0x53c48d96, +0x02b26e0b, +0x418fedcf, +0x19dbc19e, +0x78512adb, +0x1a1f5e2b, +0x307d7761, +0x6584c1f0, +0x24e3c36f, +0x2232310f, +0x2dac5ceb, +0x106e8b5a, +0x5a05a938, +0x5e6392b6, +0x66b90348, +0x75264901, +0x4174f402, +0x618b18a4, +0x3a6ab4bf, +0x3c4bc289, +0x2657a9a9, +0x4e68589b, +0x09648aa6, +0x3fc489bb, +0x1c1b715c, +0x054e4c63, +0x484f2abd, +0x5953c1f8, +0x79b9ec22, +0x75536c3d, +0x50b10549, +0x4d7e79b8, +0x7805da48, +0x1240f318, +0x675a3b56, +0x70570523, +0x2c605143, +0x17d7b2b7, +0x55dbc713, +0x514414b2, +0x3a09e3c7, +0x038823ff, +0x61b2a00c, +0x140f8cff, +0x61ebb6b5, +0x486ba354, +0x0935d600, +0x2360aab8, +0x29f6bbf8, +0x43a08abf, +0x5fac6d41, +0x504e65a2, +0x1208e35b, +0x6910f7e7, +0x1012ef5d, +0x2e2454b7, +0x6e5f444b, +0x58621a1b, +0x077816af, +0x6819306d, +0x4db58658, +0x58291bf8, +0x3597aa25, +0x45bb60a0, +0x6a6a0f11, +0x1cf1e57c, +0x361265c4, +0x16ca6054, +0x34c99833, +0x0bee2cd7, +0x680e7507, +0x6ed37bfa, +0x0f7650d6, +0x49c11513, +0x02e308f9, +0x7162078c, +0x122cb868, +0x0c18defa, +0x14c2b244, +0x3c237460, +0x4fb969b9, +0x746f1f85, +0x0c71da02, +0x61c24d14, +0x5d80176d, +0x1c84c960, +0x0fe6a1cc, +0x4bdf5bb8, +0x74e6e37b, +0x175eb87b, +0x33f88c25, +0x429c69d3, +0x6f87d474, +0x6990364a, +0x0857ca73, +0x59f1e385, +0x06821bc6, +0x3e6a3037, +0x70bc43d9, +0x3b4bb3fa, +0x4a585d0f, +0x58cab8e0, +0x2a1f2ff4, +0x59ceade5, +0x228bcdf4, +0x2d0238ee, +0x4b30b571, +0x34b8865c, +0x391b17e8, +0x5ff367b5, +0x70dbfabc, +0x08d481a1, +0x5462873b, +0x7d4dd4bf, +0x6a96ceb6, +0x31e29ea8, +0x19d29e1f, +0x7a7d7082, +0x7dc1fa60, +0x0eb9819a, +0x11dc28fd, +0x31ba8685, +0x5155eb6d, +0x0163fd71, +0x1b4abccf, +0x59adb5e0, +0x5b55e0f6, +0x21ccd896, +0x1817e618, +0x4c1224d0, +0x5d188c90, +0x62704327, +0x24dcddb0, +0x0737bc84, +0x3c3ef10c, +0x4768aba4, +0x3439f572, +0x076fa67e, +0x7c213200, +0x6d550d5a, +0x67630e33, +0x6cfd2cbd, +0x76298efc, +0x3bc5956e, +0x6a4b017c, +0x60c05db2, +0x6da83416, +0x041d9f9b, +0x5b3dce34, +0x6b6a2e76, +0x12d72135, +0x6d19f731, +0x1d24b4fb, +0x642d0ca2, +0x6e7df4a3, +0x386f71cb, +0x3ddac282, +0x49d3d599, +0x5a3c4a61, +0x55f2a89a, +0x15e5fa69, +0x3754d6f1, +0x3862ebc1, +0x3ac2d81a, +0x3e8c9375, +0x74a1dcce, +0x022b83be, +0x72c688e8, +0x7c11834c, +0x7e4cb5bf, +0x601b9642, +0x6374917f, +0x6b49e27c, +0x5645253e, +0x1f3a26ee, +0x5594e3f8, +0x370582f0, +0x0ce25b04, +0x59b28393, +0x12435124, +0x784c897b, +0x6c89a4c8, +0x7f5d4856, +0x15713e76, +0x50b6b16a, +0x6ddb3cf9, +0x4de0b041, +0x0e9173ec, +0x37af1292, +0x281cfaa2, +0x64841c87, +0x4d950cfc, +0x5f71d193, +0x1ce70848, +0x0857e516, +0x1dfe6509, +0x1188e516, +0x0a8368d4, +0x10c4edf1, +0x0d9a6862, +0x08d01e93, +0x70e08433, +0x710ef9e2, +0x741a010f, +0x4725a972, +0x104920d0, +0x49aee507, +0x7e2b2c62, +0x1d2b7bd4, +0x2361689a, +0x106e7d87, +0x1578054f, +0x0feb0d62, +0x0fcbc5dd, +0x2ae943c6, +0x60a1becc, +0x7da702d6, +0x78c9f407, +0x6f3332b9, +0x35561568, +0x20e6eeaa, +0x53b74f40, +0x02eb2264, +0x0058c03d, +0x709e5788, +0x0b43077a, +0x1e572546, +0x02273c9f, +0x15c6704f, +0x2f1c1337, +0x0fc1a501, +0x1e968ee2, +0x1ffc976b, +0x00d09ee3, +0x12b08ff2, +0x672240dd, +0x1119bfb3, +0x5c5f74f9, +0x654d6d3f, +0x2e453b88, +0x7fc0dd94, +0x75bbeac6, +0x43bd40d7, +0x0fabeaf6, +0x0587b0a3, +0x6ea6849d, +0x704da9c3, +0x032eb379, +0x677078a5, +0x5f80dc7c, diff --git a/src/Headers/CTypesNode.h b/src/Headers/CTypesNode.h new file mode 100644 index 0000000..5572e51 --- /dev/null +++ b/src/Headers/CTypesNode.h @@ -0,0 +1,7 @@ + +typedef struct _CTypesNode { + bits intfield; + sort sort; + ltokenList ctypes; +} *CTypesNode; + diff --git a/src/Headers/abstBodyNode.h b/src/Headers/abstBodyNode.h new file mode 100644 index 0000000..430cd34 --- /dev/null +++ b/src/Headers/abstBodyNode.h @@ -0,0 +1,14 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _abstBodyNode { + ltoken tok; /* check for NULLTOKEN before using it */ + /*@null@*/ struct _lclPredicateNode *typeinv; + fcnNodeList fcns; /* only for abstBody, not for optExposedBody */ +} *abstBodyNode; + +extern /*@unused@*/ /*@only@*/ cstring abstBodyNode_unparse (abstBodyNode p_n); + diff --git a/src/Headers/abstract.h b/src/Headers/abstract.h new file mode 100644 index 0000000..86f2534 --- /dev/null +++ b/src/Headers/abstract.h @@ -0,0 +1,565 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef ABSTRACT_H +# define ABSTRACT_H + +# ifdef NOLCL +# error "Bad include" +# endif + +/* +** These two are needed in symtable.c +*/ + +/*@constant int HT_MAXINDEX; @*/ +# define HT_MAXINDEX 255 + +/* simply use the lower-order bits by masking out the higher order bits */ + +# include "ltoken.h" +# include "ltokenList.h" + +/* +** forward declarations for structures +*/ + +struct _lclTypeSpecNode; +struct _opFormNode; +struct _strOrUnionNode; +struct _stmtNode; +struct _lclPredicateNode; +struct _typeExpr; +struct _declaratorNode; +struct _abstBodyNode; +struct _functionTermNode; +struct _quantifiedTermNode; +struct _sigNode; +struct _termNode; +struct _nameNode; +struct _importNode; +struct _pairNode; + +typedef enum +{ + TAG_ENUM, TAG_STRUCT, TAG_UNION, TAG_FWDSTRUCT, TAG_FWDUNION +} tagKind; + +# include "importNode.h" +# include "importNodeList.h" + +extern void checkBrackets (ltoken p_lb, ltoken p_rb); + +# include "sortList.h" +# include "lsymbolList.h" + +# include "lsymbolSet.h" +# include "sortSet.h" + +/* +** added pointer indirects to all typedefs, except as noted +** evs 94-01-05 +*/ + +# include "pairNode.h" +# include "pairNodeList.h" + +# include "declaratorInvNode.h" +# include "declaratorInvNodeList.h" + +# include "typeExpr.h" /* also defines abstDeclaratorNode */ + +# include "declaratorNode.h" +# include "declaratorNodeList.h" + +# include "arrayQualNode.h" + +# include "varNode.h" +# include "varNodeList.h" + +# include "quantifierNode.h" +# include "quantifierNodeList.h" + +# include "storeRefNode.h" +# include "storeRefNodeList.h" + +# include "modifyNode.h" + +# include "letDeclNode.h" +# include "letDeclNodeList.h" + +# include "programNode.h" +# include "programNodeList.h" + +# include "lclPredicateNode.h" +# include "exposedNode.h" + +typedef enum { + TK_ABSTRACT, TK_EXPOSED, TK_UNION + } typeKind ; + +# include "CTypesNode.h" + +# include "initDeclNode.h" +# include "initDeclNodeList.h" + +# include "constDeclarationNode.h" + +typedef enum { + QLF_NONE, QLF_CONST, QLF_VOLATILE + } qualifierKind; + +# include "varDeclarationNode.h" +# include "varDeclarationNodeList.h" + +# include "globalList.h" + +# include "claimNode.h" + +# include "fcnNode.h" +# include "fcnNodeList.h" + +# include "iterNode.h" + +# include "abstBodyNode.h" +# include "abstractNode.h" + +# include "stDeclNode.h" +# include "stDeclNodeList.h" + +# include "taggedUnionNode.h" +# include "typeNode.h" + +# include "strOrUnionNode.h" +# include "enumSpecNode.h" + +# include "lclTypeSpecNode.h" +# include "typeNamePack.h" + +# include "typeNameNode.h" +# include "typeNameNodeList.h" /* this is a list of typeNameNode's */ + +# include "opFormNode.h" + +# include "quantifiedTermNode.h" + +typedef enum { + TRM_LITERAL, TRM_CONST, TRM_VAR, + TRM_ZEROARY, TRM_APPLICATION, TRM_QUANTIFIER, + TRM_UNCHANGEDALL, TRM_UNCHANGEDOTHERS, + TRM_SIZEOF + } termKIND; + +# include "sigNode.h" +# include "sigNodeSet.h" + +# include "signNode.h" +# include "nameNode.h" + +# include "lslOp.h" +# include "lslOpSet.h" + +# include "replaceNode.h" +# include "replaceNodeList.h" + +# include "renamingNode.h" + +# include "traitRefNode.h" +# include "traitRefNodeList.h" + +# include "exportNode.h" +# include "privateNode.h" + +# include "interfaceNode.h" +# include "interfaceNodeList.h" /* note: interfaceList --> interfaceNodeList */ + +# include "termNode.h" +# include "termNodeList.h" +# include "stmtNode.h" + +/* The following are for parsing LSL signatures */ + +# include "sortSetList.h" +# include "lslOpList.h" + +/* function prototypes for parsing LSL signatures */ + +extern /*@only@*/ lslOp + makelslOpNode (/*@only@*/ /*@null@*/ nameNode p_name, + /*@dependent@*/ sigNode p_s); + +extern /*@only@*/ cstring lslOp_unparse (lslOp p_x); + +/*@notfunction@*/ +# define MASH(x,y) \ + (/*@+enumint@*/ (((unsigned) ((x)+1) << 1) + (y)) & HT_MAXINDEX /*@=enumint@*/) + +extern void abstract_init (void); +extern void resetImports (cstring p_current) ; + +extern interfaceNodeList + consInterfaceNode (/*@only@*/ interfaceNode p_n, /*@returned@*/ interfaceNodeList p_ns); + +/* evs 8 Sept 1993 changed to importNodeList */ +extern /*@only@*/ interfaceNode + makeInterfaceNodeImports (/*@only@*/ importNodeList p_x); + +extern /*@only@*/ nameNode + makeNameNodeForm (/*@only@*/ /*@null@*/ opFormNode p_opform) /*@*/ ; +extern /*@only@*/ nameNode + makeNameNodeId (/*@only@*/ ltoken p_opid) /*@*/ ; +extern /*@only@*/ interfaceNode + makeInterfaceNodeUses (/*@only@*/ traitRefNodeList p_x) /*@*/ ; +extern /*@only@*/ interfaceNode + interfaceNode_makeConst (/*@only@*/ constDeclarationNode p_x) /*@*/ ; +extern /*@only@*/ interfaceNode + interfaceNode_makeVar (/*@only@*/ varDeclarationNode p_x) /*@*/ ; +extern /*@only@*/ interfaceNode + interfaceNode_makeType (/*@only@*/ typeNode p_x) /*@*/ ; +extern /*@only@*/ interfaceNode + interfaceNode_makeFcn (/*@only@*/ fcnNode p_x) /*@*/ ; +extern /*@only@*/ interfaceNode + interfaceNode_makeClaim (/*@only@*/ claimNode p_x) /*@*/ ; +extern /*@only@*/ interfaceNode interfaceNode_makeIter (/*@only@*/ iterNode p_x) /*@*/ ; +extern /*@only@*/ interfaceNode interfaceNode_makePrivConst(/*@only@*/ constDeclarationNode p_x) /*@*/ ; +extern /*@only@*/ interfaceNode + interfaceNode_makePrivVar(/*@only@*/ varDeclarationNode p_x) /*@*/ ; +extern /*@only@*/ interfaceNode + interfaceNode_makePrivType(/*@only@*/ typeNode p_x) /*@*/ ; +extern /*@only@*/ interfaceNode + interfaceNode_makePrivFcn(/*@only@*/ fcnNode p_x) /*@*/ ; +extern /*@only@*/ typeNode makeAbstractTypeNode (/*@only@*/ abstractNode p_x) /*@*/ ; +extern /*@only@*/ typeNode makeExposedTypeNode (/*@only@*/ exposedNode p_x) /*@*/ ; + +extern /*@only@*/ traitRefNode + makeTraitRefNode(/*@only@*/ ltokenList p_fl, /*@null@*/ /*@only@*/ renamingNode p_r) /*@*/ ; + +extern /*@only@*/ cstring printLeaves2 (ltokenList p_f) /*@*/ ; +extern /*@only@*/ cstring printRawLeaves2 (ltokenList p_f) /*@*/ ; +extern /*@only@*/ cstring sigNode_unparseText (/*@null@*/ sigNode p_n) /*@*/ ; + +extern /*@only@*/ renamingNode + makeRenamingNode (/*@only@*/ typeNameNodeList p_n, + /*@only@*/ replaceNodeList p_r) /*@*/ ; +extern /*@only@*/ replaceNode + makeReplaceNode (/*@only@*/ ltoken p_t, /*@only@*/ typeNameNode p_tn, bool p_is_ctype, + /*@only@*/ ltoken p_ct, + /*@null@*/ /*@only@*/ nameNode p_nn, + /*@null@*/ /*@only@*/ sigNode p_sn) /*@*/ ; + +extern /*@only@*/ sigNode + makesigNode (/*@only@*/ ltoken p_t, /*@only@*/ ltokenList p_domain, /*@only@*/ ltoken p_range) /*@*/ ; + +extern /*@only@*/ replaceNode + makeReplaceNameNode (/*@only@*/ ltoken p_t, /*@only@*/ typeNameNode p_tn, + /*@only@*/ nameNode p_nn) /*@*/ ; + +extern /*@only@*/ opFormNode + makeOpFormNode(/*@only@*/ ltoken p_t, opFormKind p_k, + opFormUnion p_u, /*@only@*/ ltoken p_close) /*@*/ ; + +extern /*@only@*/ typeNameNode + makeTypeNameNode (bool p_isObj, /*@only@*/ lclTypeSpecNode p_t, + /*@only@*/ abstDeclaratorNode p_n) /*@*/ ; +extern /*@only@*/ typeNameNode + makeTypeNameNodeOp (/*@only@*/ opFormNode p_n) /*@*/ ; + +extern /*@only@*/ lclTypeSpecNode + makeLclTypeSpecNodeConj (/*@only@*/ /*@null@*/ lclTypeSpecNode p_a, + /*@only@*/ /*@null@*/ lclTypeSpecNode p_b) /*@*/ ; + +extern /*@only@*/ lclTypeSpecNode + makeLclTypeSpecNodeType(/*@only@*/ /*@null@*/ CTypesNode p_x) /*@*/ ; + +extern /*@only@*/ lclTypeSpecNode + makeLclTypeSpecNodeSU(/*@only@*/ /*@null@*/ strOrUnionNode p_x) /*@*/ ; + +extern /*@only@*/ lclTypeSpecNode + makeLclTypeSpecNodeEnum(/*@only@*/ /*@null@*/ enumSpecNode p_x) /*@*/ ; + +extern /*@only@*/ lclTypeSpecNode + lclTypeSpecNode_addQual (/*@only@*/ lclTypeSpecNode p_n, qual p_q) + /*@modifies p_n@*/ ; + +extern /*@only@*/ enumSpecNode + makeEnumSpecNode (/*@only@*/ ltoken p_t, /*@only@*/ ltoken p_optTagId, /*@owned@*/ ltokenList p_enums); + +extern /*@only@*/ enumSpecNode + makeEnumSpecNode2 (/*@only@*/ ltoken p_t, /*@only@*/ ltoken p_tagid); + +extern /*@only@*/ strOrUnionNode + makestrOrUnionNode (/*@only@*/ ltoken p_str, suKind p_k, + /*@only@*/ ltoken p_opttagid, /*@only@*/ stDeclNodeList p_x); + +extern /*@only@*/ strOrUnionNode + makeForwardstrOrUnionNode (/*@only@*/ ltoken p_str, suKind p_k, + /*@only@*/ ltoken p_tagid); + +extern /*@only@*/ stDeclNode + makestDeclNode (/*@only@*/ lclTypeSpecNode p_s, + /*@only@*/ declaratorNodeList p_x); +extern /*@only@*/ constDeclarationNode + makeConstDeclarationNode (/*@only@*/ lclTypeSpecNode p_t, + /*@only@*/ initDeclNodeList p_decls); +extern /*@only@*/ varDeclarationNode + makeVarDeclarationNode (/*@only@*/ lclTypeSpecNode p_t, + /*@only@*/ initDeclNodeList p_x, + bool p_isGlobal, bool p_isPrivate); + +extern varDeclarationNode makeFileSystemNode (void); +extern varDeclarationNode makeInternalStateNode (void); + +extern /*@only@*/ initDeclNode + makeInitDeclNode (/*@only@*/ declaratorNode p_d, /*@null@*/ /*@only@*/ termNode p_x); + +extern /*@only@*/ abstractNode + makeAbstractNode (/*@only@*/ ltoken p_t, /*@only@*/ ltoken p_name, + bool p_isMutable, bool p_isRefCounted, + /*@only@*/ abstBodyNode p_a); + +extern /*@unused@*/ /*@only@*/ cstring abstBodyNode_unparseExposed (abstBodyNode p_n); + +extern /*@only@*/ exposedNode + makeExposedNode (/*@only@*/ ltoken p_t, /*@only@*/ lclTypeSpecNode p_s, + /*@only@*/ declaratorInvNodeList p_d); + +extern /*@only@*/ declaratorInvNode + makeDeclaratorInvNode (/*@only@*/ declaratorNode p_d, + /*@only@*/ abstBodyNode p_b); + +extern /*@only@*/ fcnNode + fcnNode_fromDeclarator (/*@only@*/ /*@null@*/ lclTypeSpecNode p_t, + /*@only@*/ declaratorNode p_d); + +extern /*@only@*/ fcnNode + makeFcnNode (qual p_specQual, + /*@only@*/ /*@null@*/ lclTypeSpecNode p_t, + /*@only@*/ declaratorNode p_d, + /*@only@*/ /*@null@*/ globalList p_g, + /*@only@*/ /*@null@*/ varDeclarationNodeList p_privateinits, + /*@only@*/ /*@null@*/ letDeclNodeList p_lets, + /*@only@*/ /*@null@*/ lclPredicateNode p_checks, + /*@only@*/ /*@null@*/ lclPredicateNode p_requires, + /*@only@*/ /*@null@*/ modifyNode p_m, + /*@only@*/ /*@null@*/ lclPredicateNode p_ensures, + /*@only@*/ /*@null@*/ lclPredicateNode p_claims); + +extern /*@only@*/ iterNode + makeIterNode (/*@only@*/ ltoken p_id, /*@only@*/ paramNodeList p_p); + +extern /*@only@*/ claimNode + makeClaimNode (/*@only@*/ ltoken p_id, + /*@only@*/ paramNodeList p_p, + /*@only@*/ /*@null@*/ globalList p_g, + /*@only@*/ /*@null@*/ letDeclNodeList p_lets, + /*@only@*/ /*@null@*/ lclPredicateNode p_requires, + /*@only@*/ /*@null@*/ programNode p_b, + /*@only@*/ /*@null@*/ lclPredicateNode p_ensures); + +extern /*@only@*/ lclPredicateNode + makeIntraClaimNode (/*@only@*/ ltoken p_t, /*@only@*/ lclPredicateNode p_n); + +extern /*@only@*/ lclPredicateNode + makeRequiresNode (/*@only@*/ ltoken p_t, /*@only@*/ lclPredicateNode p_n); + +extern /*@only@*/ lclPredicateNode + makeChecksNode (/*@only@*/ ltoken p_t, /*@only@*/ lclPredicateNode p_n); + +extern /*@only@*/ lclPredicateNode + makeEnsuresNode (/*@only@*/ ltoken p_t, /*@only@*/ lclPredicateNode p_n); + +extern /*@only@*/ lclPredicateNode + makeLclPredicateNode (/*@only@*/ ltoken p_t, /*@only@*/ termNode p_n, + lclPredicateKind p_k); + +extern /*@only@*/ stmtNode + makeStmtNode (/*@only@*/ ltoken p_varId, + /*@only@*/ ltoken p_fcnId, /*@only@*/ termNodeList p_v); + +extern /*@only@*/ programNode + makeProgramNodeAction (/*@only@*/ programNodeList p_x, actionKind p_k); + +extern /*@only@*/ programNode + makeProgramNode (/*@only@*/ stmtNode p_x); + +extern /*@only@*/ storeRefNode + makeStoreRefNodeTerm (/*@only@*/ termNode p_t); + +extern /*@only@*/ storeRefNode + makeStoreRefNodeType (/*@only@*/ lclTypeSpecNode p_t, bool p_isObj); + +extern /*@only@*/ modifyNode + makeModifyNodeSpecial (/*@only@*/ ltoken p_t, bool p_modifiesNothing); + +extern storeRefNode makeStoreRefNodeInternal (void); +extern storeRefNode makeStoreRefNodeSystem (void); + +extern /*@only@*/ modifyNode + makeModifyNodeRef (/*@only@*/ ltoken p_t, /*@only@*/ storeRefNodeList p_y); + +extern /*@only@*/ letDeclNode + makeLetDeclNode(/*@only@*/ ltoken p_varid, /*@null@*/ /*@only@*/ lclTypeSpecNode p_t, + /*@only@*/ termNode p_term); + +extern /*@only@*/ abstBodyNode + makeAbstBodyNode (/*@only@*/ ltoken p_t, /*@only@*/ fcnNodeList p_f); + +extern /*@only@*/ abstBodyNode + makeExposedBodyNode (/*@only@*/ ltoken p_t, /*@only@*/ lclPredicateNode p_inv); + +extern /*@only@*/ abstBodyNode + makeAbstBodyNode2 (/*@only@*/ ltoken p_t, /*@only@*/ ltokenList p_ops); + +extern paramNode markYieldParamNode (/*@returned@*/ paramNode p_p); + +extern /*@only@*/ arrayQualNode + makeArrayQualNode (/*@only@*/ ltoken p_t, /*@null@*/ /*@only@*/ termNode p_term); + +extern /*@only@*/ quantifierNode + makeQuantifierNode (/*@only@*/ varNodeList p_v, /*@only@*/ ltoken p_quant); + +extern /*@only@*/ varNode + makeVarNode (/*@only@*/ ltoken p_varid, bool p_isObj, /*@only@*/ lclTypeSpecNode p_t); + +extern /*@only@*/ typeExpr makeTypeExpr (/*@only@*/ ltoken p_t); + +extern /*@only@*/ declaratorNode + makeDeclaratorNode (/*@only@*/ typeExpr p_t); + +extern /*@only@*/ typeExpr + makeFunctionNode (/*@null@*/ /*@only@*/ typeExpr p_x, /*@only@*/ paramNodeList p_p); + +extern /*@only@*/ typeExpr + makePointerNode (/*@only@*/ ltoken p_star, /*@null@*/ /*@only@*/ /*@returned@*/ typeExpr p_x); + +extern /*@only@*/ typeExpr + makeArrayNode (/*@only@*/ /*@returned@*/ /*@null@*/ typeExpr p_x, + /*@only@*/ arrayQualNode p_a); + +extern /*@only@*/ paramNode + makeParamNode (/*@only@*/ lclTypeSpecNode p_t, /*@only@*/ typeExpr p_d); + +extern /*@only@*/ termNode + makeIfTermNode (/*@only@*/ ltoken p_ift, /*@only@*/ termNode p_ifn, + /*@only@*/ ltoken p_thent, /*@only@*/ termNode p_thenn, + /*@only@*/ ltoken p_elset, /*@only@*/ termNode p_elsen); + +extern /*@only@*/ termNode + makeQuantifiedTermNode (/*@only@*/ quantifierNodeList p_qn, + /*@only@*/ ltoken p_open, + /*@only@*/ termNode p_t, /*@only@*/ ltoken p_close); + +extern /*@only@*/ termNode + makeInfixTermNode (/*@only@*/ termNode p_x, /*@only@*/ ltoken p_op, + /*@only@*/ termNode p_y); + +extern /*@only@*/ termNode + makePostfixTermNode (/*@returned@*/ /*@only@*/ termNode p_secondary, + /*@only@*/ ltokenList p_postfixops); + +extern /*@only@*/ termNode + makePostfixTermNode2 (/*@only@*/ /*@returned@*/ termNode p_secondary, + /*@only@*/ ltoken p_postfixop); + +extern /*@only@*/ termNode + makePrefixTermNode (/*@only@*/ ltoken p_op, /*@only@*/ termNode p_arg); + +extern /*@exposed@*/ termNode + CollapseInfixTermNode (/*@returned@*/ termNode p_secondary, termNodeList p_infix); + +extern /*@only@*/ termNode + makeMatchedNode (/*@only@*/ ltoken p_open, + /*@only@*/ termNodeList p_args, /*@only@*/ ltoken p_close); + +extern /*@only@*/ termNode + makeSqBracketedNode (/*@only@*/ ltoken p_lbracket, + /*@only@*/ termNodeList p_args, + /*@only@*/ ltoken p_rbracket); + +extern /*@only@*/ termNode + updateSqBracketedNode (/*@null@*/ /*@only@*/ termNode p_left, + /*@only@*/ /*@returned@*/ termNode p_t, + /*@null@*/ /*@only@*/ termNode p_right); + +extern termNode + updateMatchedNode (/*@null@*/ /*@only@*/ termNode p_left, /*@returned@*/ termNode p_t, + /*@null@*/ /*@only@*/ termNode p_right); + +extern /*@only@*/ termNode + makeSimpleTermNode (/*@only@*/ ltoken p_varid); +extern /*@only@*/ termNode + makeSelectTermNode (/*@only@*/ termNode p_pri, /*@only@*/ ltoken p_select, + /*@dependent@*/ ltoken p_id); +extern /*@only@*/ termNode + makeMapTermNode (/*@only@*/ termNode p_pri, /*@only@*/ ltoken p_map, + /*@dependent@*/ ltoken p_id); +extern /*@only@*/ termNode + makeLiteralTermNode (/*@only@*/ ltoken p_tok, sort p_s); + +extern /*@only@*/ termNode + makeUnchangedTermNode1 (/*@only@*/ ltoken p_op, /*@only@*/ ltoken p_all); +extern /*@only@*/ termNode + makeUnchangedTermNode2 (/*@only@*/ ltoken p_op, /*@only@*/ storeRefNodeList p_x); +extern /*@only@*/ termNode + makeSizeofTermNode(/*@only@*/ ltoken p_op, /*@only@*/ lclTypeSpecNode p_type); +extern /*@only@*/ termNode + makeOpCallTermNode (/*@only@*/ ltoken p_op, /*@only@*/ ltoken p_open, + /*@only@*/ termNodeList p_args, /*@only@*/ ltoken p_close); + +extern sort sigNode_rangeSort (sigNode p_sig); + +extern /*@only@*/ sortList sigNode_domain (sigNode p_sig); + +extern bool sameNameNode (/*@null@*/ nameNode p_n1, /*@null@*/ nameNode p_n2); + +extern /*@only@*/ CTypesNode + makeCTypesNode (/*@null@*/ /*@only@*/ CTypesNode p_ctypes, /*@only@*/ ltoken p_ct); + +extern /*@only@*/ CTypesNode + makeTypeSpecifier (/*@only@*/ ltoken p_typedefname) ; + +extern bool sigNode_equal (sigNode p_n1, sigNode p_n2); + +extern sort lclTypeSpecNode2sort(lclTypeSpecNode p_type); + +extern sort typeExpr2ptrSort(sort p_base, /*@null@*/ typeExpr p_t); + +/* should be tagKind, instead of int */ +extern lsymbol checkAndEnterTag(tagKind p_k, /*@only@*/ ltoken p_opttagid); +extern void enteringFcnScope(lclTypeSpecNode p_t, declaratorNode p_d, globalList p_g); +extern void enteringClaimScope (paramNodeList p_params, globalList p_g); + +extern /*@observer@*/ ltoken nameNode_errorToken (/*@null@*/ nameNode p_nn); +extern /*@observer@*/ ltoken termNode_errorToken (/*@null@*/ termNode p_n); +extern /*@observer@*/ ltoken lclTypeSpecNode_errorToken (/*@null@*/ lclTypeSpecNode p_t); + +extern opFormUnion opFormUnion_createAnyOp (ltoken p_t); +extern opFormUnion opFormUnion_createMiddle (int p_middle); +extern void LCLBuiltins (void); +extern /*@only@*/ paramNode paramNode_elipsis (void); +extern termNodeList + pushInfixOpPartNode (/*@returned@*/ termNodeList p_x, /*@only@*/ ltoken p_op, + /*@only@*/ termNode p_secondary); +extern /*@only@*/ cstring declaratorNode_unparseCode (declaratorNode p_x); + +extern /*@only@*/ cstring typeExpr_name (/*@null@*/ typeExpr p_x); + +extern void setExposedType (lclTypeSpecNode p_s); +extern void declareForwardType (declaratorNode p_declare); + +extern /*@only@*/ declaratorNode declaratorNode_copy (declaratorNode p_x); + +extern bool lslOp_equal (lslOp p_x, lslOp p_y); + +extern void lsymbol_setbool (lsymbol p_s) /*@modifies internalState@*/ ; +extern lsymbol lsymbol_getbool (void); +extern lsymbol lsymbol_getBool (void); +extern lsymbol lsymbol_getTRUE (void); +extern lsymbol lsymbol_getFALSE (void); + + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/abstractNode.h b/src/Headers/abstractNode.h new file mode 100644 index 0000000..653e863 --- /dev/null +++ b/src/Headers/abstractNode.h @@ -0,0 +1,16 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _abstractNode { + ltoken tok; + bool isMutable; /* TRUE means it is mutable */ + bool isRefCounted; + ltoken name; + sort sort; + abstBodyNode body; +} *abstractNode; + +extern /*@unused@*/ /*@only@*/ cstring abstractNode_unparse(abstractNode p_n); diff --git a/src/Headers/aliasChecks.h b/src/Headers/aliasChecks.h new file mode 100644 index 0000000..66ca414 --- /dev/null +++ b/src/Headers/aliasChecks.h @@ -0,0 +1,35 @@ +/* +** aliasChecks.h +*/ + +extern alkind alkind_resolve (alkind p_a1, alkind p_a2) /*@*/ ; +extern bool checkGlobalDestroyed (sRef p_fref, fileloc p_loc) + /*@modifies g_msgstream@*/ ; +extern void checkLocalDestroyed (sRef p_fref, fileloc p_loc) + /*@modifies g_msgstream@*/ ; + +extern void checkAssignTransfer (exprNode p_lhs, exprNode p_rhs); +extern void checkPassTransfer (exprNode p_fexp, uentry p_arg, bool p_isSpec, + /*@dependent@*/ exprNode p_fcn, int p_argno, int p_totargs); +extern void checkReturnTransfer (exprNode p_fexp, uentry p_rval); +extern void checkGlobReturn (uentry p_glob); +extern void checkParamReturn (uentry p_actual); +extern void checkLoseRef (uentry p_actual); +extern bool canLoseReference (sRef p_sr, fileloc p_loc); +extern void checkInitTransfer (exprNode p_lhs, exprNode p_rhs); +extern void checkStructDestroyed (sRef p_fref, fileloc p_loc); + +/* transfer types: */ + +typedef enum +{ + TT_FCNRETURN, + TT_DOASSIGN, + TT_FIELDASSIGN, + TT_FCNPASS, + TT_GLOBPASS, + TT_GLOBRETURN, + TT_PARAMRETURN, + TT_LEAVETRANS, + TT_GLOBINIT +} transferKind; diff --git a/src/Headers/aliasStack.h b/src/Headers/aliasStack.h new file mode 100644 index 0000000..1400fa4 --- /dev/null +++ b/src/Headers/aliasStack.h @@ -0,0 +1,53 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** aliasStack.h +*/ + +# ifndef aliasStack_H +# define aliasStack_H + +typedef struct _aliasStack *aliasStack ; + +typedef struct _aliasStack +{ + aliasTable elements; + aliasStack thisbranch; + aliasStack lastbranch; + aliasStack parent; + int lexlevel; +} _aliasStack ; + +extern aliasStack aliasStack_new(void); + +extern void aliasStack_newAlias (aliasStack s, sRef el, sRef al); +extern void aliasStack_clearAlias (aliasStack s, sRef el); +extern sRefSet aliasStack_canAlias (aliasStack s, sRef sr); + +extern void aliasStack_push (aliasStack s, sRef el) ; +extern aliasStack aliasStack_pop (aliasStack s) ; +extern sRef aliasStack_top (aliasStack s) ; + +extern cstring aliasStack_unparse (aliasStack s) ; +extern void aliasStack_free (/*@only@*/ aliasStack s) ; + +extern sRefSet aliasStack_aliasedBy (aliasStack s, sRef sr); +extern aliasStack aliasStack_branch (aliasStack s); +extern aliasStack aliasStack_trueBranch (aliasStack s); +extern aliasStack aliasStack_altBranch (aliasStack s); +extern aliasStack aliasStack_popBranches (aliasStack alt); +extern aliasStack aliasStack_popTrueBranch (aliasStack s); +extern void aliasStack_checkGlobs (aliasStack s); + +# define aliasStackBASESIZE MIDBASESIZE +# define aliasStackNULL ((aliasStack)0) +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/aliasTable.h b/src/Headers/aliasTable.h new file mode 100644 index 0000000..bbc9768 --- /dev/null +++ b/src/Headers/aliasTable.h @@ -0,0 +1,86 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** aliasTable.h +*/ + +# ifndef aliasTable_H +# define aliasTable_H + +typedef /*@only@*/ sRefSet o_sRefSet; +typedef /*@exposed@*/ sRef e_sRef; + +struct _aliasTable +{ + int nelements; + int nspace; + /*@reldef@*/ /*@only@*/ e_sRef *keys; + /*@reldef@*/ /*@only@*/ o_sRefSet *values; +} ; + +extern /*@unused@*/ /*@truenull@*/ bool aliasTable_isUndefined (aliasTable p_s); +extern /*@unused@*/ /*@truenull@*/ bool + aliasTable_isEmpty (/*@sef@*/ aliasTable p_s); +extern /*@falsenull@*/ bool aliasTable_isDefined (aliasTable p_s); + +/*@constant null aliasTable aliasTable_undefined; @*/ +# define aliasTable_undefined ((aliasTable) NULL) +# define aliasTable_isDefined(s) ((s) != aliasTable_undefined) +# define aliasTable_isUndefined(s) ((s) == aliasTable_undefined) +# define aliasTable_isEmpty(s) (aliasTable_size(s) == 0) + +extern int aliasTable_size (/*@sef@*/ aliasTable p_s); +# define aliasTable_size(s) (aliasTable_isDefined (s) ? (s)->nelements : 0) + +/*@iter aliasTable_elements (sef aliasTable t, yield exposed sRef key, yield exposed sRefSet values); @*/ +# define aliasTable_elements(t, m_key, m_value) \ + { if (aliasTable_isDefined (t)) \ + { int m_ind; sRef *m_keys = &((t)->keys[0]); \ + sRefSet *m_values = &((t)->values[0]); \ + for (m_ind = 0 ; m_ind < (t)->nelements; m_ind++) \ + { sRef m_key = *(m_keys++); sRefSet m_value = *(m_values++); + +# define end_aliasTable_elements }}} + +extern aliasTable aliasTable_new (void) /*@*/ ; + +extern void aliasTable_clearAliases (aliasTable p_s, sRef p_sr) + /*@modifies p_s, p_sr@*/ ; + +extern /*@only@*/ sRefSet aliasTable_canAlias (aliasTable p_s, sRef p_sr) /*@*/ ; +extern aliasTable aliasTable_copy (aliasTable p_s) /*@*/ ; + +extern /*@only@*/ cstring aliasTable_unparse (aliasTable p_s) /*@*/ ; +extern void aliasTable_free (/*@only@*/ aliasTable p_s) ; + +extern aliasTable + aliasTable_addMustAlias (/*@returned@*/ aliasTable p_s, /*@exposed@*/ sRef p_sr, sRef p_al) + /*@modifies p_s@*/ ; + +extern aliasTable + aliasTable_levelUnion (/*@returned@*/ aliasTable p_t1, aliasTable p_t2, int p_level) + /*@modifies p_t1@*/ ; + +extern aliasTable + aliasTable_levelUnionNew (aliasTable p_t1, aliasTable p_t2, int p_level) + /*@modifies nothing*/ ; + +extern void aliasTable_checkGlobs (aliasTable p_t) /*@modifies g_msgstream@*/ ; +extern /*@only@*/ sRefSet aliasTable_aliasedBy (aliasTable p_s, sRef p_sr) /*@*/ ; +extern void aliasTable_fixSrefs (aliasTable p_s); +extern aliasTable aliasTable_levelUnionSeq (/*@returned@*/ aliasTable p_t1, + /*@only@*/ aliasTable p_t2, int p_level); + +/*@constant int aliasTableBASESIZE; @*/ +# define aliasTableBASESIZE MIDBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/arrayQualNode.h b/src/Headers/arrayQualNode.h new file mode 100644 index 0000000..9fbd548 --- /dev/null +++ b/src/Headers/arrayQualNode.h @@ -0,0 +1,9 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +typedef struct _arrayQualNode { + ltoken tok; + /*@null@*/ struct _termNode *term; +} *arrayQualNode; diff --git a/src/Headers/basic.h b/src/Headers/basic.h new file mode 100644 index 0000000..53f51cf --- /dev/null +++ b/src/Headers/basic.h @@ -0,0 +1,84 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +# ifndef BASIC_H +# define BASIC_H + +# include +# include +# include +# include +# include +# include "general.h" +# include "ynm.h" +# include "message.h" +# include "fileloc.h" +# include "globals.h" +# include "qual.h" +# include "lltok.h" +# include "clause.h" +# include "cstringSList.h" +# include "cstringList.h" +# include "flag_codes.h" +# include "flags.h" +# include "llerror.h" +# include "source.h" +# include "qualList.h" + +# ifndef NOLCL +# include "code.h" +# include "mapping.h" +# include "sort.h" +# include "lclctypes.h" +# include "paramNode.h" +# include "paramNodeList.h" +# include "lsymbol.h" +# include "abstract.h" +# include "symtable.h" +# endif + +# include "exprNodeList.h" +# include "cprim.h" +# include "hashTable.h" +# include "filelocList.h" +# include "enumNameList.h" +# include "enumNameSList.h" +# include "varKinds.h" +# include "sRefSet.h" +# include "ekind.h" +# include "usymIdSet.h" +# include "uentryList.h" +# include "globSet.h" +# include "ctypeList.h" +# include "aliasTable.h" +# include "usymtab.h" +# include "lctype.h" +# include "qtype.h" +# include "idDecl.h" +# include "multiVal.h" +# include "specialClauses.h" +# include "uentry.h" +# include "sRef.h" +# include "guardSet.h" +# include "exprNode.h" +# include "typeIdSet.h" +# include "idDeclList.h" +# include "clabstract.h" +# include "sRefSetList.h" +# include "flagMarker.h" +# include "flagMarkerList.h" +# include "macrocache.h" +# include "fileTable.h" +# include "messageLog.h" +# include "clauseStack.h" +# include "context.h" +# include "constants.h" +# include "local_constants.h" + +# else +# error "Multiple include" +# endif + diff --git a/src/Headers/bool.h b/src/Headers/bool.h new file mode 100644 index 0000000..5abef11 --- /dev/null +++ b/src/Headers/bool.h @@ -0,0 +1,42 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# if !defined(BOOL_H) + +# define BOOL_H + +# ifndef FALSE +# define FALSE 0 +# endif + +# ifndef TRUE +# define TRUE (! FALSE) +# endif + +extern /*@observer@*/ cstring bool_unparse (bool p_b) /*@*/ ; +extern /*@observer@*/ cstring bool_dump (bool p_b) /*@*/ ; +extern /*@unused@*/ bool bool_not (bool p_b) /*@*/ ; +extern bool bool_equal (bool p_b1, bool p_b2) /*@*/ ; +extern int bool_compare (bool p_b1, bool p_b2) /*@*/ ; +extern bool bool_fromInt (int p_i) /*@*/ ; +extern int bool_toInt (bool p_b) /*@*/ ; + +/*@access bool@*/ + +# define bool_unparse(b) (cstring_makeLiteralTemp ((b) ? "true" : "false" )) +# define bool_dump(b) (cstring_makeLiteralTemp ((b) ? "1" : "0" )) +# define bool_not(b) ((b) ? FALSE : TRUE) +# define bool_equal(a,b) ((a) ? (b) : !(b)) +# define bool_compare(a,b) ((a) ? ((b) ? 0 : 1) : ((b) ? -1 : 0)) +# define bool_fromInt(i) (((i) != 0) ? TRUE : FALSE) +# define bool_toInt(b) ((b) ? 1 : 0) + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/boolStack.h b/src/Headers/boolStack.h new file mode 100644 index 0000000..8137fb8 --- /dev/null +++ b/src/Headers/boolStack.h @@ -0,0 +1,45 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** boolStack.h +*/ + +# ifndef boolStack_H +# define boolStack_H + +typedef struct _boolStack +{ + int nelements; + int nspace; + int current; + /*@reldef@*/ bool *elements; +} _boolStack ; + +typedef _boolStack *boolStack ; + +# define boolStack_size(s) ((s)->nelements) +# define boolStack_isEmpty(s) (boolStack_size(s) == 0) +# define boolStack_empty(s) (boolStack_size(s) == 0) + +extern boolStack boolStack_new(void); + +extern void boolStack_push (boolStack s, bool el) ; +extern void boolStack_pop (boolStack s) ; +extern bool boolStack_top (boolStack s) ; + +extern cstring boolStack_unparse (boolStack s) ; +extern void boolStack_free (/*@only@*/ boolStack s) ; +extern void boolStack_switchTop (boolStack s); + +# define boolStackBASESIZE MIDBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/cgrammar.h b/src/Headers/cgrammar.h new file mode 100644 index 0000000..ac20051 --- /dev/null +++ b/src/Headers/cgrammar.h @@ -0,0 +1,21 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** cgrammar.h +*/ + +extern bool g_expectingTypeName ; +extern /*@dependent@*/ /*@observer@*/ uentry coerceId (cstring p_cn); +extern /*@observer@*/ uentry coerceIterId (cstring p_cn); +extern /*@observer@*/ cstring LastIdentifier (void); + +/* #ifndef NCGRAM2 +** # include "cgrammar_tokens.h" +** #endif +*/ + + + diff --git a/src/Headers/cgrammar_tokens.h b/src/Headers/cgrammar_tokens.h new file mode 100644 index 0000000..a8fec69 --- /dev/null +++ b/src/Headers/cgrammar_tokens.h @@ -0,0 +1,251 @@ +/* +** Inserted at beginning of c files generated by bison +** REMEMBER: Change bison.reset too. +*/ + +/*@-allmacros@*/ +/*@+boolint@*/ +/*@+charint@*/ +/*@-macroparams@*/ +/*@-macroundef@*/ +/*@-unreachable@*/ +/*@-macrospec@*/ +/*@-varuse@*/ +/*@+ignorequals@*/ +/*@-macrostmt@*/ +/*@-noeffect@*/ +/*@-shadow@*/ +/*@-exitarg@*/ +/*@-macroredef@*/ +/*@-uniondef@*/ +/*@-compdef@*/ +/*@-matchfields@*/ +/*@-exportlocal@*/ +/*@-evalorderuncon@*/ +/*@-exportheader@*/ +/*@-typeuse@*/ +/*@-redecl@*/ +/*@-redef@*/ +/*@-noparams@*/ +/*@-ansireserved@*/ +/*@-fielduse@*/ +/*@-ifblock@*/ +/*@-elseifcomplete@*/ +/*@-whileblock@*/ +/*@-forblock@*/ +/*@-branchstate@*/ +/*@-readonlytrans@*/ +/*@-namechecks@*/ +/*@-usedef@*/ +/*@-systemunrecog@*/ +/*@-dependenttrans@*/ +/*@-unqualifiedtrans@*/ +/*@-nullassign@*/ + +/* < end of bison.head > */ + +typedef union +{ + lltok tok; + int count; + specialClauseKind sck; + qual typequal; + qualList tquallist; + ctype ctyp; + sRef sr; + /*@only@*/ qtype qtyp; + /*@only@*/ cstring cname; + /*@only@*/ idDecl ntyp; + /*@only@*/ idDeclList ntyplist; + /*@only@*/ uentryList flist; + /*@owned@*/ uentryList entrylist; + /*@observer@*/ /*@dependent@*/ uentry entry; + /*@only@*/ uentry oentry; + /*@only@*/ exprNode expr; + /*@only@*/ enumNameList enumnamelist; + /*@only@*/ exprNodeList alist; + /*@only@*/ sRefSet srset; + /*@only@*/ cstringList cstringlist; +} YYSTYPE; +#define BADTOK 258 +#define SKIPTOK 259 +#define CTOK_ELIPSIS 260 +#define CASE 261 +#define DEFAULT 262 +#define CIF 263 +#define CELSE 264 +#define SWITCH 265 +#define WHILE 266 +#define DO 267 +#define CFOR 268 +#define GOTO 269 +#define CONTINUE 270 +#define BREAK 271 +#define RETURN 272 +#define TSEMI 273 +#define TLBRACE 274 +#define TRBRACE 275 +#define TCOMMA 276 +#define TCOLON 277 +#define TASSIGN 278 +#define TLPAREN 279 +#define TRPAREN 280 +#define TLSQBR 281 +#define TRSQBR 282 +#define TDOT 283 +#define TAMPERSAND 284 +#define TEXCL 285 +#define TTILDE 286 +#define TMINUS 287 +#define TPLUS 288 +#define TMULT 289 +#define TDIV 290 +#define TPERCENT 291 +#define TLT 292 +#define TGT 293 +#define TCIRC 294 +#define TBAR 295 +#define TQUEST 296 +#define CSIZEOF 297 +#define CALIGNOF 298 +#define ARROW_OP 299 +#define CTYPEDEF 300 +#define COFFSETOF 301 +#define INC_OP 302 +#define DEC_OP 303 +#define LEFT_OP 304 +#define RIGHT_OP 305 +#define LE_OP 306 +#define GE_OP 307 +#define EQ_OP 308 +#define NE_OP 309 +#define AND_OP 310 +#define OR_OP 311 +#define MUL_ASSIGN 312 +#define DIV_ASSIGN 313 +#define MOD_ASSIGN 314 +#define ADD_ASSIGN 315 +#define SUB_ASSIGN 316 +#define LEFT_ASSIGN 317 +#define RIGHT_ASSIGN 318 +#define AND_ASSIGN 319 +#define XOR_ASSIGN 320 +#define OR_ASSIGN 321 +#define CSTRUCT 322 +#define CUNION 323 +#define CENUM 324 +#define VA_ARG 325 +#define VA_DCL 326 +#define QGLOBALS 327 +#define QMODIFIES 328 +#define QNOMODS 329 +#define QCONSTANT 330 +#define QFUNCTION 331 +#define QITER 332 +#define QDEFINES 333 +#define QUSES 334 +#define QALLOCATES 335 +#define QSETS 336 +#define QRELEASES 337 +#define QPRECLAUSE 338 +#define QPOSTCLAUSE 339 +#define QALT 340 +#define QUNDEF 341 +#define QKILLED 342 +#define QENDMACRO 343 +#define LLMACRO 344 +#define LLMACROITER 345 +#define LLMACROEND 346 +#define TENDMACRO 347 +#define QSWITCHBREAK 348 +#define QLOOPBREAK 349 +#define QINNERBREAK 350 +#define QSAFEBREAK 351 +#define QINNERCONTINUE 352 +#define QFALLTHROUGH 353 +#define QLINTNOTREACHED 354 +#define QLINTFALLTHROUGH 355 +#define QLINTFALLTHRU 356 +#define QARGSUSED 357 +#define QPRINTFLIKE 358 +#define QLINTPRINTFLIKE 359 +#define QSCANFLIKE 360 +#define QMESSAGELIKE 361 +#define QNOTREACHED 362 +#define QCONST 363 +#define QVOLATILE 364 +#define QINLINE 365 +#define QEXTENSION 366 +#define QEXTERN 367 +#define QSTATIC 368 +#define QAUTO 369 +#define QREGISTER 370 +#define QOUT 371 +#define QIN 372 +#define QYIELD 373 +#define QONLY 374 +#define QTEMP 375 +#define QSHARED 376 +#define QREF 377 +#define QUNIQUE 378 +#define QCHECKED 379 +#define QUNCHECKED 380 +#define QCHECKEDSTRICT 381 +#define QCHECKMOD 382 +#define QKEEP 383 +#define QKEPT 384 +#define QPARTIAL 385 +#define QSPECIAL 386 +#define QOWNED 387 +#define QDEPENDENT 388 +#define QRETURNED 389 +#define QEXPOSED 390 +#define QNULL 391 +#define QOBSERVER 392 +#define QISNULL 393 +#define QEXITS 394 +#define QMAYEXIT 395 +#define QNEVEREXIT 396 +#define QTRUEEXIT 397 +#define QFALSEEXIT 398 +#define QLONG 399 +#define QSIGNED 400 +#define QUNSIGNED 401 +#define QSHORT 402 +#define QUNUSED 403 +#define QSEF 404 +#define QNOTNULL 405 +#define QRELNULL 406 +#define QABSTRACT 407 +#define QCONCRETE 408 +#define QMUTABLE 409 +#define QIMMUTABLE 410 +#define QTRUENULL 411 +#define QFALSENULL 412 +#define QEXTERNAL 413 +#define QREFCOUNTED 414 +#define QREFS 415 +#define QNEWREF 416 +#define QTEMPREF 417 +#define QKILLREF 418 +#define QRELDEF 419 +#define CGCHAR 420 +#define CBOOL 421 +#define CINT 422 +#define CGFLOAT 423 +#define CDOUBLE 424 +#define CVOID 425 +#define QANYTYPE 426 +#define QINTEGRALTYPE 427 +#define QUNSIGNEDINTEGRALTYPE 428 +#define QSIGNEDINTEGRALTYPE 429 +#define IDENTIFIER 430 +#define NEW_IDENTIFIER 431 +#define TYPE_NAME_OR_ID 432 +#define CCONSTANT 433 +#define ITER_NAME 434 +#define ITER_ENDNAME 435 +#define TYPE_NAME 436 + + +extern YYSTYPE yylval; diff --git a/src/Headers/checking.h b/src/Headers/checking.h new file mode 100644 index 0000000..71ba175 --- /dev/null +++ b/src/Headers/checking.h @@ -0,0 +1,10 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +extern termNode checkSort (/*@returned@*/ termNode p_t); +extern /*@null@*/ termNode computePossibleSorts (/*@returned@*/ /*@null@*/ termNode p_t); + +extern void checkLclPredicate (ltoken p_t, lclPredicateNode p_n); diff --git a/src/Headers/clabstract.h b/src/Headers/clabstract.h new file mode 100644 index 0000000..a07555b --- /dev/null +++ b/src/Headers/clabstract.h @@ -0,0 +1,113 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** clabstract.h +*/ + +# ifndef CLABSTRACT_H +# define CLABSTRACT_H + +extern void setArgsUsed (void) /*@modifies internalState@*/ ; +extern void setSpecialFunction (qual p_qu) /*@modifies internalState@*/ ; +extern bool isFlipOldStyle(void) /*@*/ ; +extern bool isNewStyle(void) /*@*/ ; +extern bool processingIterVars(void) /*@*/ ; + +extern ctype declareEnum (/*@only@*/ cstring p_ename, /*@only@*/ enumNameList p_el); +extern ctype declareStruct (/*@temp@*/ cstring p_id, /*@only@*/ uentryList p_f); +extern ctype declareUnnamedStruct (/*@only@*/ uentryList p_f); + +extern ctype declareUnion (/*@temp@*/ cstring p_id, /*@only@*/ uentryList p_f); +extern ctype declareUnnamedUnion (/*@only@*/ uentryList p_f); + +extern void + setFunctionSpecialClause (lltok p_stok, /*@only@*/ sRefSet p_s, lltok p_etok); +extern void + setFunctionStateSpecialClause (lltok p_stok, specialClauseKind p_kind, + /*@only@*/ sRefSet p_s, lltok p_etok); + +extern ctype declareUnnamedEnum (/*@only@*/ enumNameList p_el); +extern ctype handleEnum (/*@only@*/ cstring p_id); +extern ctype handleStruct (/*@only@*/ cstring p_id); +extern ctype handleUnion (/*@only@*/ cstring p_id); + +extern uentryList handleParamIdList (/*@returned@*/ /*@dependent@*/ uentryList p_params); +extern uentryList handleParamTypeList (/*@dependent@*/ /*@returned@*/ uentryList p_params); + +extern uentryList fixUentryList (/*@only@*/ idDeclList p_tl, qtype p_q); +extern uentryList fixUnnamedDecl (qtype p_q) /*@*/ ; + +extern /*@exposed@*/ uentry getCurrentIter(void); + +extern void processNamedDecl (idDecl p_t); +extern void declareFunction (/*@only@*/ idDecl p_tid) + /*@globals internalState@*/ ; +extern void doVaDcl (void); +extern void doneParams (void); + +extern void setCurrentParams (/*@dependent@*/ uentryList p_ue); +extern void clearCurrentParams (void); + +extern /*@exposed@*/ sRef fixModifiesId (cstring p_s); +extern /*@exposed@*/ sRef fixSpecClausesId (cstring p_s); + +extern void setFlipOldStyle(void); +extern void setNewStyle(void); +extern void unsetProcessingGlobals (void); +extern void setProcessingIterVars (uentry p_iter); +extern void setProcessingTypedef (/*@only@*/ qtype p_q); +extern void setProcessingVars (/*@only@*/ qtype p_q); +extern void setStorageClass (storageClassCode p_sc); +extern void storeLoc (void); +extern void unsetProcessingTypedef (void); +extern void unsetProcessingVars (void); + +extern /*@only@*/ uentry makeCurrentParam (idDecl p_t); +extern void setProcessingGlobalsList (void); + +extern /*@exposed@*/ sRef modListArrayFetch (sRef p_s, sRef p_mexp); +extern /*@exposed@*/ sRef modListPointer (sRef p_s); +extern /*@exposed@*/ sRef modListFieldAccess (sRef p_s, /*@only@*/ cstring p_f); +extern /*@exposed@*/ sRef modListArrowAccess (sRef p_s, /*@only@*/ cstring p_f); + +extern sRef globListUnrecognized (cstring p_s); +extern void globListAdd (sRef p_sr, qualList p_quals); + +extern void setFunctionModifies (/*@only@*/ sRefSet p_s); + +extern void checkDoneParams (void); + +extern void exitParamsTemp (void); +extern void enterParamsTemp (void); + +extern void clearProcessingGlobMods (void); +extern bool isProcessingGlobMods (void); +extern void setProcessingGlobMods (void); + +extern void setFunctionNoGlobals (void); +extern int iterParamNo (void); +extern void nextIterParam (void); +extern void declareCIter (cstring p_name, /*@owned@*/ uentryList p_params); +extern void checkModifiesId (uentry p_ue); +extern /*@exposed@*/ sRef checkSpecClausesId (uentry p_ue); + +extern void checkConstant (qtype p_t, idDecl p_id) ; +extern void checkValueConstant (qtype p_t, idDecl p_id, exprNode p_e) ; + +extern void declareStaticFunction (/*@only@*/ idDecl p_tid) + /*@globals internalState@*/ ; + +# else +# error "Multiple include" +# endif + + + + + + + + diff --git a/src/Headers/claimNode.h b/src/Headers/claimNode.h new file mode 100644 index 0000000..f3c8d0d --- /dev/null +++ b/src/Headers/claimNode.h @@ -0,0 +1,17 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _claimNode { + ltoken name; + paramNodeList params; + /*@null@*/ globalList globals; + /*@null@*/ letDeclNodeList lets; + /*@null@*/ lclPredicateNode require; + /*@null@*/ programNode body; + /*@null@*/ lclPredicateNode ensures; +} *claimNode; + +extern /*@unused@*/ /*@only@*/ cstring claimNode_unparse (claimNode p_c); diff --git a/src/Headers/clause.h b/src/Headers/clause.h new file mode 100644 index 0000000..abdabce --- /dev/null +++ b/src/Headers/clause.h @@ -0,0 +1,30 @@ + +typedef enum { + NOCLAUSE, + TRUECLAUSE, + FALSECLAUSE, + ANDCLAUSE, + ORCLAUSE, + WHILECLAUSE, + DOWHILECLAUSE, + FORCLAUSE, + CASECLAUSE, + SWITCHCLAUSE, + CONDCLAUSE, + ITERCLAUSE, + TRUEEXITCLAUSE, + FALSEEXITCLAUSE +} clause; + +extern /*@observer@*/ cstring clause_nameAlternate (clause p_cl) /*@*/ ; +extern /*@observer@*/ cstring clause_nameTaken (clause p_cl) /*@*/ ; +extern /*@observer@*/ cstring clause_nameFlip (clause p_cl, bool p_flip) /*@*/ ; + +extern bool clause_isConditional (clause p_cl) /*@*/ ; +extern bool clause_isBreakable (clause p_cl) /*@*/ ; +extern bool clause_isLoop (clause p_cl) /*@*/ ; +extern bool clause_isSwitch (clause p_cl) /*@*/ ; +extern bool clause_isCase (clause p_cl) /*@*/ ; +extern bool clause_isNone (clause p_cl) /*@*/ ; + +extern /*@observer@*/ cstring clause_unparse (clause p_cl) /*@*/ ; diff --git a/src/Headers/clauseStack.h b/src/Headers/clauseStack.h new file mode 100644 index 0000000..0a59cc3 --- /dev/null +++ b/src/Headers/clauseStack.h @@ -0,0 +1,57 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** clauseStack.h +*/ + +# ifndef clauseStack_H +# define clauseStack_H + +abst_typedef struct _clauseStack +{ + int nelements; + int nspace; + int current; + /*@reldef@*/ clause *elements; +} *clauseStack ; + +/*@iter clauseStack_elements (sef clauseStack s, yield clause el); @*/ +# define clauseStack_elements(s, m_el) \ + { int m_i; for (m_i = (s)->nelements - 1; m_i >= 0; m_i--) { clause m_el = (s)->elements[m_i]; + +# define end_clauseStack_elements }} + +extern int clauseStack_size (clauseStack p_s) /*@*/ ; +extern bool clauseStack_isEmpty (clauseStack p_s) /*@*/ ; + +# define clauseStack_size(s) ((s)->nelements) +# define clauseStack_isEmpty(s) (clauseStack_size(s) == 0) + +extern /*@only@*/ clauseStack clauseStack_new (void) /*@*/ ; + +extern void clauseStack_push (clauseStack p_s, clause p_el) /*@modifies p_s@*/ ; +extern void clauseStack_pop (clauseStack p_s) /*@modifies p_s@*/ ; +extern clause clauseStack_top (clauseStack p_s) /*@*/ ; + +extern /*@only@*/ cstring clauseStack_unparse (clauseStack p_s) /*@*/ ; +extern void clauseStack_free (/*@only@*/ clauseStack p_s) ; +extern void clauseStack_clear (clauseStack p_s) /*@modifies p_s@*/ ; +extern void clauseStack_switchTop (clauseStack p_s, clause p_x) /*@modifies p_s@*/ ; +extern void clauseStack_removeFirst (clauseStack p_s, clause p_key) + /*@modifies p_s@*/ ; + +extern int clauseStack_controlDepth (clauseStack p_s) /*@*/ ; + +/*@constant int clauseStackBASESIZE;@*/ +# define clauseStackBASESIZE MIDBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/code.h b/src/Headers/code.h new file mode 100644 index 0000000..6ab66f5 --- /dev/null +++ b/src/Headers/code.h @@ -0,0 +1,12 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +/*@constant ltokenCode LEOFTOKEN;@*/ +#define LEOFTOKEN 0 + +/* assume this is big enough for bison */ /* BOGUS! */ +/*@constant ltokenCode NOTTOKEN;@*/ +#define NOTTOKEN 9998 diff --git a/src/Headers/constDeclarationNode.h b/src/Headers/constDeclarationNode.h new file mode 100644 index 0000000..ff8f6eb --- /dev/null +++ b/src/Headers/constDeclarationNode.h @@ -0,0 +1,13 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _constDeclarationNode { + lclTypeSpecNode type; + initDeclNodeList decls; +} *constDeclarationNode; + +extern /*@unused@*/ /*@only@*/ cstring + constDeclarationNode_unparse (/*@null@*/ constDeclarationNode p_x); diff --git a/src/Headers/constants.h b/src/Headers/constants.h new file mode 100644 index 0000000..8c8b7d0 --- /dev/null +++ b/src/Headers/constants.h @@ -0,0 +1,189 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** constants.h +*/ + +/* + * This is constants.h from Mike Smith's Win32 port of lclint. + * Modified by Herbert 04/19/97: + * added conditional 'OS2' to conditional 'MSDOS' + */ + +# ifndef CONSTANTS_H +# define CONSTANTS_H + +# if defined(MSDOS) || defined(OS2) +/*@constant observer char *RCFILE; @*/ +# define RCFILE "lclint.rc" +# else +/*@constant observer char *RCFILE; @*/ +# define RCFILE ".lclintrc" +# endif + +/*@constant observer char *C_SUFFIX; @*/ +# define C_SUFFIX ".c" + +/*@constant observer char *LARCH_PATH; @*/ +# define LARCH_PATH "LARCH_PATH" + +/*@constant observer char *LCLIMPORTDIR; @*/ +# define LCLIMPORTDIR "LCLIMPORTDIR" + +/*@constant observer char *LLSTDLIBS_NAME; @*/ +# define LLSTDLIBS_NAME "ansi" + +/*@constant observer char *LLSTRICTLIBS_NAME; @*/ +# define LLSTRICTLIBS_NAME "ansistrict" + +/*@constant observer char *LLUNIXLIBS_NAME; @*/ +# define LLUNIXLIBS_NAME "unix" + +/*@constant observer char *LLUNIXSTRICTLIBS_NAME; @*/ +# define LLUNIXSTRICTLIBS_NAME "unixstrict" + +/*@constant observer char *LLPOSIXLIBS_NAME; @*/ +# define LLPOSIXLIBS_NAME "posix" + +/*@constant observer char *LLPOSIXSTRICTLIBS_NAME; @*/ +# define LLPOSIXSTRICTLIBS_NAME "posixstrict" + +/*@constant observer cstring REFSNAME; @*/ +# define REFSNAME cstring_makeLiteralTemp ("refs") + +/* +** Used to be .lldmp. Truncated to .lcd to fix within +** MS-DOS filename limitations. +*/ + +/*@constant observer char *DUMP_SUFFIX; @*/ +# define DUMP_SUFFIX ".lcd" + +/*@constant int MAX_NAME_LENGTH; @*/ +# define MAX_NAME_LENGTH 256 + +/*@constant int MAX_LINE_LENGTH; @*/ +# define MAX_LINE_LENGTH 1024 + +/*@constant int MAX_DUMP_LINE_LENGTH; @*/ +# define MAX_DUMP_LINE_LENGTH 8192 + +/*@constant int MINLINELEN; @*/ +# define MINLINELEN 20 + +/* +** WARNING: Can't use macros in token for cgrammar.l --> +** must keep these consistent! +*/ + +/*@constant observer char *LLMRCODE; @*/ +# define LLMRCODE "@QLMR" +/* MUST be 5 chars = defin[e]. The number of spaces between the + # and the d is the sixth tag. +*/ + +/*@constant observer char *PPMRCODE; @*/ +# define PPMRCODE "@@MR@@" + +/*@constant observer char *DEFAULT_SYSTEMDIR; @*/ +# define DEFAULT_SYSTEMDIR "/usr/" + +/*@constant char DEFAULT_COMMENTCHAR; @*/ +# define DEFAULT_COMMENTCHAR '@' + +/*@constant int DEFAULT_LINELEN; @*/ +# define DEFAULT_LINELEN 80 + +/* +** These constants are based on implementation limits in ANSI standard, +** Section 3.1. +*/ + +/*@constant int DEFAULT_EXTERNALNAMELEN; @*/ +# define DEFAULT_EXTERNALNAMELEN 6 + +/*@constant int DEFAULT_INTERNALNAMELEN; @*/ +# define DEFAULT_INTERNALNAMELEN 31 + +/*@constant int DEFAULT_CONTROLNESTDEPTH; @*/ +# define DEFAULT_CONTROLNESTDEPTH 15 + +/*@constant int DEFAULT_STRINGLITERALLEN; @*/ +# define DEFAULT_STRINGLITERALLEN 509 + +/*@constant int DEFAULT_INCLUDENEST; @*/ +# define DEFAULT_INCLUDENEST 8 + +/*@constant int DEFAULT_NUMSTRUCTFIELDS; @*/ +# define DEFAULT_NUMSTRUCTFIELDS 127 + +/*@constant int DEFAULT_NUMENUMMEMBERS; @*/ +# define DEFAULT_NUMENUMMEMBERS 127 + +/*@constant int DEFAULT_LIMIT; @*/ +# define DEFAULT_LIMIT -1 /* unlimited messages */ + +/*@constant char PFX_UPPERCASE; @*/ +# define PFX_UPPERCASE '^' + +/*@constant char PFX_LOWERCASE; @*/ +# define PFX_LOWERCASE '&' + +/*@constant char PFX_ANY; @*/ +# define PFX_ANY '?' + +/*@constant char PFX_DIGIT; @*/ +# define PFX_DIGIT '#' + +/*@constant char PFX_NOTUPPER; @*/ +# define PFX_NOTUPPER '%' + +/*@constant char PFX_NOTLOWER; @*/ +# define PFX_NOTLOWER '~' + +/*@constant char PFX_ANYLETTER; @*/ +# define PFX_ANYLETTER '$' + +/*@constant char PFX_ANYLETTERDIGIT; @*/ +# define PFX_ANYLETTERDIGIT '/' + +/* +** Note: this name is wired into ansi.h! +*/ + +/*@constant observer char *DEFAULT_BOOLTYPE;@*/ +# define DEFAULT_BOOLTYPE "lltX_bool" + +/*@constant observer char *PRAGMA_EXPAND; @*/ +# define PRAGMA_EXPAND "expand" + +/*@constant int PRAGMA_LEN_EXPAND; @*/ +# define PRAGMA_LEN_EXPAND 6 + +/*@constant int MAX_PRAGMA_LEN; @*/ +# define MAX_PRAGMA_LEN PRAGMA_LEN_EXPAND + +/* +** Minimum version with compatible libraries. +*/ + +/*@constant float LCL_MIN_VERSION; @*/ +# define LCL_MIN_VERSION 2.2 + +/* +** Flex doesn't pre-process input, so remember to copy these manually +** to cscanner.l. +*/ + +/*@constant observer char *BEFORE_COMMENT_MARKER@*/ +# define BEFORE_COMMENT_MARKER "%{" + +/*@constant observer char *AFTER_COMMENT_MARKER@*/ +# define AFTER_COMMENT_MARKER "%}" + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/context.h b/src/Headers/context.h new file mode 100644 index 0000000..8cb3f59 --- /dev/null +++ b/src/Headers/context.h @@ -0,0 +1,305 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** context.h +*/ + +# ifndef CONTEXT_H +# define CONTEXT_H + +extern void context_pushLoc (void); +extern void context_popLoc (void); + +extern bool context_doMerge (void); +extern bool context_doDump (void); + +extern void context_resetAllFlags (void); + +extern /*@unused@*/ cstring context_unparseFlagMarkers (void) /*@*/ ; + +extern void context_enterDoWhileClause (void) /*@modifies internalState@*/ ; + +extern bool context_hasMods (void); + +extern bool context_isSystemDir (cstring p_dir) /*@*/ ; + +extern /*@observer@*/ char *context_selectedLibrary (void) /*@*/ ; +extern bool context_usingPosixLibrary (void) /*@*/ ; +extern bool context_usingAnsiLibrary (void) /*@*/ ; +extern flagcode context_getLibrary (void) /*@*/ ; +extern void context_setLibrary (flagcode) /*@modifies internalState@*/ ; + +extern void context_setPreprocessing (void) /*@modifies internalState@*/; +extern void context_clearPreprocessing (void) /*@modifies internalState@*/; +extern bool context_isPreprocessing (void) /*@*/; + +extern void context_setInCommandLine (void) /*@modifies internalState@*/ ; +extern void context_clearInCommandLine (void) /*@modifies internalState@*/ ; +extern bool context_isInCommandLine (void) /*@*/ ; + +extern void context_resetErrors (void); + +extern int context_getLinesProcessed (void) /*@*/ ; +extern int context_getSpecLinesProcessed (void) /*@*/ ; + +extern bool context_setBoolName (void) /*@*/ ; +extern /*@observer@*/ cstring context_getBoolName (void) /*@*/ ; +extern /*@observer@*/ cstring context_printBoolName (void) /*@*/ ; +extern /*@observer@*/ cstring context_getFalseName (void) /*@*/ ; +extern /*@observer@*/ cstring context_getTrueName (void) /*@*/ ; +extern /*@observer@*/ cstring context_getLarchPath (void) /*@*/ ; +extern /*@observer@*/ cstring context_getLCLImportDir (void) /*@*/ ; + +extern bool context_checkExport (uentry p_e) /*@*/ ; +extern bool context_checkGlobMod (sRef p_el) /*@*/ ; +extern bool context_checkGlobUse (uentry p_glob); +extern bool context_checkAliasGlob (uentry p_glob); +extern bool context_checkInternalUse (void); +extern void context_recordFileModifies (/*@dependent@*/ sRefSet p_mods); +extern void context_clearJustPopped (void); +extern bool context_justPopped (void); + +extern void context_enterTrueClause (exprNode p_e); +extern void context_enterFalseClause (exprNode p_e); +extern void context_exitClause (exprNode p_pred, + exprNode p_tbranch, exprNode p_fbranch); +extern void context_exitInnerSafe (void); +extern void context_exitInnerPlain (void) /*@modifies internalState@*/ ; + +extern bool context_inGlobalScope (void); +extern bool context_inInnerScope (void); +extern void context_setProtectVars (void); + +extern int context_getLimit (void) /*@*/ ; +extern bool context_unlimitedMessages (void) /*@*/ ; + +extern void context_releaseVars (void); +extern void context_sizeofReleaseVars (void); +extern bool context_inProtectVars (void); + +extern bool context_hasFileAccess (typeId p_t); + +extern void context_hideShowscan (void); +extern void context_unhideShowscan (void); + +extern void context_setMode (cstring p_s); +extern void context_exitAllClauses (void); +extern bool context_inHeader (void); + +extern /*@dependent@*/ /*@exposed@*/ fileTable context_fileTable (void) /*@*/ ; + +extern /*@exposed@*/ messageLog context_messageLog (void); +extern /*@dependent@*/ /*@observer@*/ cstring context_tmpdir (void); + +# ifndef NOLCL +extern void context_enterLCLfile (void); +extern void context_exitLCLfile (void); +extern void context_enterImport (void) ; +extern void context_leaveImport (void) ; +extern void context_processedSpecLine (void) /*@modifies internalState@*/ ; +extern int context_getLCLExpect (void) /*@*/ ; +extern bool context_msgLh (void) /*@*/ ; +extern bool context_inLCLLib (void) /*@globals internalState@*/ ; +extern bool context_inImport (void) /*@globals internalState@*/ ; +extern void context_resetSpecLines (void) /*@modifies internalState@*/ ; +# endif + +extern void context_exitMacroCache (void); +extern void context_enterSuppressRegion (void); +extern void context_exitSuppressRegion (void); +extern void context_enterMacroFile (void); +extern typeIdSet context_fileAccessTypes (void); +extern void context_addFileAccessType (typeId p_t); +extern void context_removeFileAccessType (typeId p_t); +extern /*@observer@*/ uentryList context_getParams (void); + +extern bool context_isSpecialFile (cstring p_fname); +extern /*@observer@*/ cstring context_inFunctionName (void) /*@*/ ; +extern ctype context_currentFunctionType (void) /*@*/ ; +extern void context_exitFile (void); +extern void context_enterConstantMacro (/*@dependent@*/ /*@exposed@*/ uentry p_e); +extern void context_enterMacro (/*@observer@*/ uentry p_e); +extern void context_enterFunction (/*@exposed@*/ uentry p_e); +extern void context_exitFunction (void); +extern void context_initMod (void) /*@modifies internalState@*/ ; +extern void context_enterInnerContext(void); +extern void context_exitInner (exprNode p_exp); +extern bool context_globAccess (sRef p_s); +extern /*@observer@*/ globSet context_getUsedGlobs (void); +extern bool context_hasAccess (typeId p_t); +extern bool context_couldHaveAccess (typeId p_t); +extern /*@only@*/ cstring context_unparse (void); +extern void context_setFunctionDefined (fileloc p_loc); +extern void context_setFlagTemp (flagcode p_f, bool p_b); + +extern bool context_getFlag (flagcode p_d) /*@*/ ; +extern int context_getLineLen (void) /*@*/ ; +# define context_getLineLen() ((int)context_getValue(FLG_LINELEN)) + +extern int context_getValue (flagcode p_flag) /*@*/ ; +extern void context_setValueAndFlag (flagcode p_flag, int p_val) + /*@modifies internalState@*/ ; + +extern /*@unused@*/ int context_getCounter (flagcode p_flag) /*@*/ ; +extern /*@unused@*/ void context_incCounter (flagcode p_flag) + /*@modifies internalState@*/ ; +extern /*@unused@*/ void context_decCounter (flagcode p_flag) + /*@modifies internalState@*/ ; + +extern bool context_maybeSet (flagcode p_d) /*@*/ ; + +extern /*@observer@*/ cstring context_getString (flagcode p_flag) /*@*/ ; +extern void context_setString (flagcode p_flag, /*@only@*/ cstring p_val) + /*@modifies internalState@*/ ; + +extern bool context_getDebug (flagcode p_d); +# define context_getDebug(p_d) context_getFlag(p_d) + +extern void context_userSetFlag (flagcode p_f, bool p_b); + +extern int context_getExpect (void) /*@*/ ; + +extern /*@observer@*/ sRefSet context_modList(void); +extern /*@exposed@*/ uentry context_getHeader(void) /*@*/; +extern void context_usedGlobal (sRef p_el); +extern void context_resetModeFlags (void); +extern ctype context_typeofZero (void); +extern ctype context_typeofOne (void); +extern void context_enterFile (void); +extern void context_enterUnknownMacro (/*@dependent@*/ /*@observer@*/ uentry p_e); +extern char context_getCommentMarkerChar (void); +extern void context_setCommentMarkerChar (char p_c); +extern bool context_inMacroConstant (void) /*@*/ ; +extern void context_returnFunction (void); +extern bool context_processingMacros (void); + +extern void context_saveLocation (void); +extern /*@only@*/ fileloc context_getSaveLocation (void); + +extern void context_setFileId (fileId p_s); +extern void context_setFilename(fileId p_fid, int p_lineno) + /*@globals fileloc g_currentloc; @*/ + /*@modifies g_currentloc@*/ ; + +extern void context_fileSetFlag (flagcode p_f, ynm p_set); + +extern /*@unused@*/ /*@only@*/ cstring context_unparseAccess (void) /*@*/ ; +extern bool context_inFunction(void) /*@*/ ; +extern bool context_inFunctionLike (void) /*@*/ ; + +extern void context_setMacroMissingParams (void); +extern void context_resetMacroMissingParams (void); +extern bool context_isMacroMissingParams (void) /*@*/ ; +extern bool context_inMacroUnknown (void) /*@*/ ; + +/*@observer@*/ cstring context_getDump (void) /*@*/ ; +/*@observer@*/ cstring context_getMerge (void) /*@*/ ; + +extern void context_incLineno (void); +extern bool context_inSuppressRegion (void) /*@*/ ; +extern void context_exitTrueClause (exprNode p_pred, exprNode p_tbranch); +extern void context_destroyMod (void) /*@modifies internalState@*/ ; +extern void context_addMacroCache (/*@only@*/ cstring p_def); +extern void context_processAllMacros (void); +extern void context_addComment (/*@only@*/ cstring p_def); +extern void context_enterSuppressLine (int p_count); +extern bool context_inSuppressZone (fileloc p_fl) /*@*/ ; +extern void context_dumpModuleAccess (FILE *p_fout); +extern void context_loadModuleAccess (FILE *p_in); +extern bool context_inIterDef (void) /*@*/ ; +extern bool context_inMacro (void) /*@*/ ; +extern bool context_inIterEnd (void) /*@*/ ; +extern ctype context_getRetType (void) /*@*/ ; + +extern void context_enterIterDef (/*@observer@*/ uentry p_le); +extern void context_enterIterEnd (/*@observer@*/ uentry p_le); +extern void context_addBoolAccess (void); +extern bool context_canAccessBool (void); +extern void context_quietExitFunction (void); + +/* speedy shortcuts for frequently used flags */ + +extern bool context_msgBoolInt (void) /*@*/ ; +extern bool context_msgCharInt (void) /*@*/ ; +extern bool context_msgEnumInt (void) /*@*/ ; +extern bool context_msgPointerArith (void) /*@*/ ; +extern bool context_msgStrictOps (void) /*@*/ ; + +extern void context_exitStructInnerContext (void); +extern void context_enterStructInnerContext (void); +extern bool context_inRealFunction (void) /*@*/ ; +extern void context_exitOrClause (exprNode p_pred, exprNode p_tbranch); +extern void context_exitAndClause (exprNode p_pred, exprNode p_tbranch); +extern void context_enterOrClause (exprNode p_e); +extern void context_enterAndClause (exprNode p_e); + +extern void context_enterForClause (exprNode p_e); +extern void context_enterWhileClause (exprNode p_e); + +extern void context_enterIterClause (void); +extern void context_exitIterClause (exprNode p_body); + +extern void context_exitWhileClause (exprNode p_pred, exprNode p_body); +extern void context_exitDoWhileClause (exprNode p_pred); +extern void context_exitForClause (exprNode p_forPred, exprNode p_body); + +extern /*@only@*/ cstring context_unparseClauses (void) /*@*/ ; +extern /*@observer@*/ globSet context_getGlobs (void) /*@*/ ; + +extern /*@only@*/ cstring context_getMessageAnnote (void); +extern void context_clearMessageAnnote (void); +extern bool context_hasMessageAnnote (void); +extern void context_setMessageAnnote (/*@only@*/ cstring p_s); +extern bool context_suppressFlagMsg (flagcode p_flag, fileloc p_fl); +extern bool context_suppressNotFlagMsg (flagcode p_flag, fileloc p_fl); +extern void context_enterCaseClause (exprNode p_e); +extern void context_enterSwitch (exprNode p_e); +extern void context_exitSwitch (exprNode p_e, bool p_allpaths); + +extern bool context_showFunction (void); +extern void context_setShownFunction (void); + +extern void context_clearAliasAnnote (void); +extern cstring context_getAliasAnnote (void); +extern bool context_hasAliasAnnote (void); +extern void context_setAliasAnnote (/*@observer@*/ sRef p_s, /*@observer@*/ sRef p_t); + +extern bool context_inDeepLoop (void) /*@globals internalState@*/ ; +extern bool context_inDeepLoopSwitch (void) /*@globals internalState@*/ ; +extern bool context_inConditional (void) /*@globals internalState@*/ ; +extern bool context_inDeepSwitch (void) /*@globals internalState@*/ ; + +extern clause context_breakClause (void); +extern clause context_nextBreakClause (void); + +extern bool context_anyErrors (void) /*@globals internalState@*/ ; +extern void context_hasError (void) /*@modifies internalState@*/ ; +extern int context_numErrors (void) /*@globals internalState@*/ ; +extern bool context_neednl (void); +extern void context_setNeednl (void); + +extern bool context_inGlobalContext (void) /*@globals internalState@*/ ; +extern bool context_inMacroFunction (void) /*@globals internalState@*/ ; + +extern /*@observer@*/ cstring context_moduleName (void) /*@*/ ; +extern void context_recordFileGlobals (/*@dependent@*/ globSet p_mods); +extern void context_checkSuppressCounts (void) /*@modifies g_msgstream@*/ ; + +extern bool context_inFunctionDecl (void) /*@globals internalState@*/ ; +extern void context_enterFunctionDecl (void) /*@modifies internalState@*/ ; +extern void context_exitFunctionDecl (void) /*@modifies internalState@*/ ; + +# else +# error "Multiple include" +# endif + + + + + + + + diff --git a/src/Headers/cpp.h b/src/Headers/cpp.h new file mode 100644 index 0000000..d37c829 --- /dev/null +++ b/src/Headers/cpp.h @@ -0,0 +1,57 @@ +# ifndef CPP_H +# define CPP_H + +typedef struct cppBuffer cppBuffer; +typedef struct cppOptions cppOptions; +typedef struct hashnode cppHashNode; + +enum cpp_token { + CPP_EOF = -1, + CPP_OTHER = 0, + CPP_COMMENT = 1, + CPP_HSPACE, + CPP_VSPACE, /* newlines and #line directives */ + CPP_NAME, + CPP_NUMBER, + CPP_CHAR, + CPP_STRING, + CPP_DIRECTIVE, + CPP_LPAREN, /* "(" */ + CPP_RPAREN, /* ")" */ + CPP_LBRACE, /* "{" */ + CPP_RBRACE, /* "}" */ + CPP_COMMA, /* "," */ + CPP_SEMICOLON,/* ";" */ + CPP_3DOTS, /* "..." */ +#if 0 + CPP_ANDAND, /* "&&" */ + CPP_OROR, /* "||" */ + CPP_LSH, /* "<<" */ + CPP_RSH, /* ">>" */ + CPP_EQL, /* "==" */ + CPP_NEQ, /* "!=" */ + CPP_LEQ, /* "<=" */ + CPP_GEQ, /* ">=" */ + CPP_PLPL, /* "++" */ + CPP_MINMIN, /* "--" */ +#endif + /* POP_TOKEN is returned when we've popped a cppBuffer. */ + CPP_POP +}; + +typedef struct cppReader cppReader; +extern cppReader g_cppState; + +extern int cppProcess (/*@dependent@*/ cstring p_infile, + /*@dependent@*/ cstring p_outfile); +extern void cppAddIncludeDir (cstring); +extern void cppReader_initMod (void); +extern void cppDoDefine (cstring); +extern void cppDoUndefine (cstring); +extern void cppReader_saveDefinitions (void); + +extern void cppReader_initialize (void); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/cpperror.h b/src/Headers/cpperror.h new file mode 100644 index 0000000..37e3183 --- /dev/null +++ b/src/Headers/cpperror.h @@ -0,0 +1,35 @@ +# ifndef CPPERROR_H +# define CPPERROR_H + +/* doesn't exit! */ +extern void cppReader_fatalError (cppReader *p_pfile, /*@only@*/ cstring p_str); + +extern /*@exits@*/ void cppReader_pfatalWithName (cppReader *p_pfile, + cstring p_name); + +extern void cppReader_errorLit (cppReader *p_pfile, /*@observer@*/ cstring p_msg); + +extern void +cppReader_pedwarnWithLine (cppReader *p_pfile, int p_line, int p_column, + /*@only@*/ cstring p_msg); + +extern void cppReader_error (cppReader *p_pfile, /*@only@*/ cstring p_msg); +extern void cppReader_warning (cppReader *p_pfile, /*@only@*/ cstring p_msg); + +extern void cppReader_warningLit (cppReader *p_pfile, /*@observer@*/ cstring p_msg); + +extern void cppReader_pedwarn (cppReader *p_pfile, /*@only@*/ cstring p_msg); + +extern void cppReader_pedwarnLit (cppReader *p_pfile, /*@observer@*/ cstring p_msg); + +extern void cppReader_errorWithLine (cppReader *p_pfile, + long p_line, long p_column, + /*@only@*/ cstring p_msg); + +extern void cppReader_perrorWithName (cppReader *p_pfile, cstring p_name); + +# else +# error "Multiple include" +# endif + + diff --git a/src/Headers/cppexp.h b/src/Headers/cppexp.h new file mode 100644 index 0000000..e4c7b47 --- /dev/null +++ b/src/Headers/cppexp.h @@ -0,0 +1,2 @@ +extern HOST_WIDE_INT cppReader_parseExpression (cppReader *); + diff --git a/src/Headers/cpphash.h b/src/Headers/cpphash.h new file mode 100644 index 0000000..08bcde3 --- /dev/null +++ b/src/Headers/cpphash.h @@ -0,0 +1,62 @@ +# ifndef CPPHASH_H +# define CPPHASH_H + +/*@constant int CPP_HASHSIZE@*/ +# define CPP_HASHSIZE 1403 + +/* different kinds of things that can appear in the value field + of a hash node. Actually, this may be useless now. */ +union hashval { + int ival; + /*@owned@*/ char *cpval; + /*@owned@*/ DEFINITION *defn; +} ; + +struct hashnode { + /* double links for easy deletion */ + /*@only@*/ /*@null@*/ struct hashnode *next; + /*@dependent@*/ /*@null@*/ struct hashnode *prev; + + /* + ** Also, a back pointer to this node's hash + ** chain is kept, in case the node is the head + ** of the chain and gets deleted. + */ + + /*@dependent@*/ struct hashnode **bucket_hdr; + + enum node_type type; /* type of special token */ + int length; /* length of token, for quick comparison */ + cstring name; /* the actual name */ + union hashval value; /* pointer to expansion, or whatever */ +}; + +/* Some definitions for the hash table. The hash function MUST be + computed as shown in hashf () below. That is because the rescan + loop computes the hash value `on the fly' for most tokens, + in order to avoid the overhead of a lot of procedure calls to + the hashf () function. Hashf () only exists for the sake of + politeness, for use when speed isn't so important. */ + +extern void cppReader_deleteMacro (/*@exposed@*/ HASHNODE *p_hp) + /*@modifies internalState, *p_hp@*/; + +extern /*@exposed@*/ HASHNODE *cppReader_install (char *, int, + enum node_type, int, + /*@only@*/ /*@null@*/ char *, int); + +extern void cppReader_hashCleanup (void); +extern /*@null@*/ /*@exposed@*/ cppHashNode *cppReader_lookup (char *, int, int); +extern /*@null@*/ /*@exposed@*/ cppHashNode *cppReader_lookupExpand (char *, int, int); + +extern void cppReader_saveHashtab (void); +extern void cppReader_restoreHashtab (void); +extern int hashf (const char *p_name, int p_len, int p_hashsize); + +extern /*@exposed@*/ HASHNODE * +cppReader_installMacro (char *p_name, int p_len, + /*@only@*/ struct definition *p_defn, int p_hash); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/cpplib.h b/src/Headers/cpplib.h new file mode 100644 index 0000000..53df3b5 --- /dev/null +++ b/src/Headers/cpplib.h @@ -0,0 +1,647 @@ +/* Definitions for CPP library. + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + Written by Per Bothner, 1994-95. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct hashnode HASHNODE; + +typedef enum cpp_token (*parseUnderflow) (cppReader *); +typedef void (*parseCleanup) (cppBuffer *, cppReader *); + +/* A parse_marker indicates a previous position, + which we can backtrack to. */ + +struct parse_marker { + /*@dependent@*/ cppBuffer *buf; + /*@dependent@*/ /*@null@*/ struct parse_marker *next; + int position; +}; + +/* The arglist structure is built by do_define to tell + collect_definition where the argument names begin. That + is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist + would contain pointers to the strings x, y, and z. + Collect_definition would then build a DEFINITION node, + with reflist nodes pointing to the places x, y, and z had + appeared. So the arglist is just convenience data passed + between these two routines. It is not kept around after + the current #define has been processed and entered into the + hash table. */ + +struct arglist { + /*@null@*/ struct arglist *next; + /*@dependent@*/ char *name; + int length; + int argno; + int rest_args; +}; + +extern enum cpp_token cppGetToken (cppReader *); +extern int /*@alt void@*/ cppSkipHspace (cppReader *); + +/* This frees resources used by PFILE. */ +extern /*@unused@*/ void cppCleanup (cppReader *p_pfile); + +struct cppBuffer { + /*@null@*/ /*@only@*/ char *buf; + /*@null@*/ /*@exposed@*/ char *cur; + /*@null@*/ /*@exposed@*/ char *rlimit; /* end of valid data */ + /*@null@*/ /*@exposed@*/ char *alimit; /* end of allocated buffer */ + /*@null@*/ /*@exposed@*/ char *prev; + + /*@dependent@*/ cstring fname; + + /* Filename specified with #line command. */ + /*@exposed@*/ cstring nominal_fname; + + /* Record where in the search path this file was found. + For #include_next. */ + + /*@dependent@*/ /*@null@*/ struct file_name_list *dir; + + long line_base; + int lineno; /* Line number at CPP_LINE_BASE. */ + int colno; /* Column number at CPP_LINE_BASE. */ + parseUnderflow underflow; + parseCleanup cleanup; + + /*@dependent@*/ HASHNODE *hnode; + /*@dependent@*/ /*@null@*/ struct parse_marker *marks; + /* Value of if_stack at start of this file. + Used to prohibit unmatched #endif (etc) in an include file. */ + /*@null@*/ /*@exposed@*/ struct if_stack *if_stack; + + /* True if this is a header file included using . */ + char system_header_p; + char seen_eof; + + /* True if buffer contains escape sequences. + Currently there are three kinds: + "@-" means following identifier should not be macro-expanded. + "@ " means a token-separator. This turns into " " in final output + if not stringizing and needed to separate tokens; otherwise nothing. + "@@" means a normal '@'. + (An '@' inside a string stands for itself and is never an escape.) */ + bool has_escapes; +}; + +struct cpp_pending; /* Forward declaration - for C++. */ +struct file_name_map_list; + +/* Maximum nesting of cppBuffers. We use a static limit, partly for + efficiency, and partly to limit runaway recursion. */ + +/*@constant int CPP_STACK_MAX; @*/ +# define CPP_STACK_MAX 200 + +/* A cppReader encapsulates the "state" of a pre-processor run. + Applying cppGetToken repeatedly yields a stream of pre-processor + tokens. Usually, there is only one cppReader object active. */ + +struct cppReader { + parseUnderflow get_token; + /*@dependent@*/ /*@null@*/ cppBuffer *buffer; + cppBuffer buffer_stack[CPP_STACK_MAX]; + + int errors; /* Error counter for exit code */ + cppOptions *opts; + /* void *data; */ + + /* A buffer used for both for cppGetToken's output, and also internally. */ + /*@relnull@*/ char *token_buffer; + + /* Alocated size of token_buffer. cppReader_reserve allocates space. */ + size_t token_buffer_size; + /* End of the written part of token_buffer. */ + /*@exposed@*/ char *limit; + + /* Line where a newline was first seen in a string constant. */ + int multiline_string_line; + + /* Current depth in #include directives that use <...>. */ + int system_include_depth; + + /* List of other included files. + If ->control_macro if nonzero, the file had a #ifndef + around the entire contents, and ->control_macro gives the macro name. */ + /*@owned@*/ /*@null@*/ struct file_name_list *all_include_files; + + /* Current maximum length of directory names in the search path + for include files. (Altered as we get more of them.) */ + int max_include_len; + + /*@null@*/ struct if_stack *if_stack; + + /* Nonzero means we are inside an IF during a -pcp run. In this mode + macro expansion is done, and preconditions are output for all macro + uses requiring them. */ + char pcp_inside_if; + + /* Nonzero means we have printed (while error reporting) a list of + containing files that matches the current status. */ + char input_stack_listing_current; + + /* If non-zero, macros are not expanded. */ + bool no_macro_expand; + + /* Print column number in error messages. */ + bool show_column; + + /* If true, character between '<' and '>' are a single (string) token. */ + char parsing_include_directive; + + /* True if escape sequences (as described for has_escapes in + parse_buffer) should be emitted. */ + char output_escapes; + + /* 0: Have seen non-white-space on this line. + 1: Only seen white space so far on this line. + 2: Only seen white space so far in this file. */ + char only_seen_white; + + int lineno; + + /*@null@*/ /*@observer@*/ struct tm *timebuf; + +#ifdef __cplusplus + ~cppReader () { cppCleanup (this); } +#endif +}; + +/*@constant int cppReader_fatalErrorLimit; @*/ +#define cppReader_fatalErrorLimit 1000 + +/* True if we have seen a "fatal" error. */ +extern bool cppFatalErrors (cppReader *) /*@*/ ; +#define cppFatalErrors(READER) ((READER)->errors >= cppReader_fatalErrorLimit) + +extern int cppBufPeek (cppBuffer *) /*@*/ ; + +/* Macros for manipulating the token_buffer. */ + +/*@notfunction@*/ +#define CPP_OUT_BUFFER(PFILE) ((PFILE)->token_buffer) + +/* Number of characters currently in PFILE's output buffer. */ + +extern size_t cppReader_getWritten (/*@sef@*/ cppReader *) /*@*/ ; +# define cppReader_getWritten(PFILE) \ + (size_fromInt ((PFILE)->limit - (PFILE)->token_buffer)) + +extern /*@exposed@*/ char *cppReader_getPWritten (cppReader *) /*@*/ ; +# define cppReader_getPWritten(PFILE) ((PFILE)->limit) + +/* Make sure PFILE->token_buffer has space for at least N more characters. */ + +extern void cppReader_reserve (/*@sef@*/ cppReader *, /*@sef@*/ size_t); +#define cppReader_reserve(PFILE, N) \ + (cppReader_getWritten (PFILE) + (N) > (PFILE)->token_buffer_size \ + && (cppReader_growBuffer (PFILE, (N)), 0)) + +/* Append string STR (of length N) to PFILE's output buffer. + Assume there is enough space. */ + +extern void cppReader_putStrN (/*@sef@*/ cppReader *p_file, + /*@unique@*/ char *p_str, /*@sef@*/ size_t p_n) + /*@modifies *p_file; @*/; + +#define cppReader_putStrN(PFILE, STR, N) \ + (memcpy ((PFILE)->limit, STR, (N)), (PFILE)->limit += (N)) + +extern void cppReader_setWritten (/*@sef@*/ /*@special@*/ cppReader *p_file, size_t) + /*@uses p_file, *p_file, p_file->token_buffer;@*/ + /*@sets p_file->limit;@*/ + /*@modifies *p_file@*/ ; + +# define cppReader_setWritten(PFILE,N) \ + ((PFILE)->limit = (PFILE)->token_buffer + (N)) + +extern /*@dependent@*/ /*@exposed@*/ cppOptions *CPPOPTIONS (/*@special@*/ cppReader *p_pfile) + /*@uses p_pfile->opts@*/ ; +#define CPPOPTIONS(PFILE) ((PFILE)->opts) + +/*@notfunction@*/ +#define CPPBUFFER(PFILE) ((PFILE)->buffer) + +/* Checks for null */ +extern /*@exposed@*/ cppBuffer * +cppReader_getBufferSafe (/*@special@*/ cppReader *p_pfile) + /*@uses p_pfile->buffer@*/ + /*@modifies nothing@*/ ; + +extern /*@exposed@*/ cppBuffer *cppBuffer_prevBuffer (cppBuffer *) /*@*/ ; + +/* The bottom of the buffer stack. */ +extern /*@exposed@*/ cppBuffer *cppReader_nullBuffer (/*@special@*/ cppReader *p_pfile) /*@uses p_pfile->buffer_stack@*/ /*@*/ ; +# define cppReader_nullBuffer(PFILE) (&(PFILE)->buffer_stack[CPP_STACK_MAX]) + +/* Pointed to by cppReader::data. */ +struct cppOptions { + /*@dependent@*/ cstring in_fname; + + /* Name of output file, for error messages. */ + /*@dependent@*/ cstring out_fname; + + struct file_name_map_list *map_list; + + /* Non-0 means -v, so print the full set of include dirs. */ + bool verbose; + + /* Nonzero means use extra default include directories for C++. */ + + bool cplusplus; + + /* Nonzero means handle cplusplus style comments */ + + bool cplusplus_comments; + + /* Nonzero means this is an assembly file, and allow + unknown directives, which could be comments. */ + + int lang_asm; + + /* Nonzero means turn NOTREACHED into #pragma NOTREACHED etc */ + + bool for_lint; + + /* Nonzero means handle CHILL comment syntax + and output CHILL string delimiter for __DATE___ etc. */ + + bool chill; + + /* Nonzero means copy comments into the output file. */ + + bool put_out_comments; + + /* Nonzero means don't process the ANSI trigraph sequences. */ + + bool no_trigraphs; + + /* Nonzero means print names of header files (-H). */ + + bool print_include_names; + + /* Nonzero means try to make failure to fit ANSI C an error. */ + + bool pedantic_errors; + + /* Nonzero means don't print warning messages. -w. */ + + bool inhibit_warnings; + + /* Nonzero means warn if slash-star appears in a comment. */ + + bool warn_comments; + + /* Nonzero means warn if a macro argument is (or would be) + stringified with -traditional. */ + + bool warn_stringify; + bool warnings_are_errors; + bool no_output; + + /* Nonzero means don't output line number information. */ + + bool no_line_commands; + +/* Nonzero means output the text in failing conditionals, + inside #failed ... #endfailed. */ + + char output_conditionals; + + char ignore_srcdir; + + /* Zero means dollar signs are punctuation. + This used to be needed for conformance to the C Standard, + before the C Standard was corrected. */ + bool dollars_in_ident; + + /* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */ + bool traditional; + + /* Nonzero for the 1989 C Standard, including corrigenda and amendments. */ + bool c89; + + /* Nonzero means give all the error messages the ANSI standard requires. */ + bool pedantic; + + bool done_initializing; + + /* First dir to search */ + /*@owned@*/ struct file_name_list *include; + /* First dir to search for */ + /* This is the first element to use for #include <...>. + If it is 0, use the entire chain for such includes. */ + /*@dependent@*/ struct file_name_list *first_bracket_include; + /* This is the first element in the chain that corresponds to + a directory of system header files. */ + /*@dependent@*/ struct file_name_list *first_system_include; + /*@exposed@*/ struct file_name_list *last_include; /* Last in chain */ + + /* Chain of include directories to put at the end of the other chain. */ + struct file_name_list *after_include; + /*@exposed@*/ struct file_name_list *last_after_include; /* Last in chain */ + + /* Chain to put at the start of the system include files. */ + struct file_name_list *before_system; + /*@exposed@*/ struct file_name_list *last_before_system; /* Last in chain */ + + /* Directory prefix that should replace `/usr' in the standard + include file directories. */ + char *include_prefix; + + char inhibit_predefs; + char no_standard_includes; + char no_standard_cplusplus_includes; + + /* + ** DUMP_NAMES means pass #define and the macro name through to output. + ** DUMP_DEFINITIONS means pass the whole definition (plus #define) through + */ + + /*@-enummemuse@*/ + enum { DUMP_NONE = 0, DUMP_NAMES, DUMP_DEFINITIONS } + dump_macros; + /*@=enummemuse@*/ + +/* Nonzero means pass all #define and #undef directives which we actually + process through to the output stream. This feature is used primarily + to allow cc1 to record the #defines and #undefs for the sake of + debuggers which understand about preprocessor macros, but it may + also be useful with -E to figure out how symbols are defined, and + where they are defined. */ + int debug_output; +}; + +extern bool cppReader_isTraditional (/*@special@*/ cppReader *p_pfile) + /*@uses p_pfile->opts@*/ + /*@modifies nothing@*/ ; + +#define cppReader_isTraditional(PFILE) (CPPOPTIONS(PFILE)-> traditional) + +extern bool cppReader_isPedantic (cppReader *) /*@*/; +#define cppReader_isPedantic(PFILE) (CPPOPTIONS (PFILE)->pedantic) + +/* The structure of a node in the hash table. The hash table + has entries for all tokens defined by #define commands (type T_MACRO), + plus some special tokens like __LINE__ (these each have their own + type, and the appropriate code is run when that type of node is seen. + It does not contain control words like "#define", which are recognized + by a separate piece of code. */ + +/* different flavors of hash nodes --- also used in keyword table */ +enum node_type { + T_NONE = 0, + T_DEFINE = 1, /* the `#define' keyword */ + T_INCLUDE, /* the `#include' keyword */ + T_INCLUDE_NEXT, /* the `#include_next' keyword */ + T_IFDEF, /* the `#ifdef' keyword */ + T_IFNDEF, /* the `#ifndef' keyword */ + T_IF, /* the `#if' keyword */ + T_ELSE, /* `#else' */ + T_PRAGMA, /* `#pragma' */ + T_ELIF, /* `#elif' */ + T_UNDEF, /* `#undef' */ + T_LINE, /* `#line' */ + T_ERROR, /* `#error' */ + T_WARNING, /* `#warning' */ + T_ENDIF, /* `#endif' */ + T_IDENT, /* `#ident', used on system V. */ + T_SPECLINE, /* special symbol `__LINE__' */ + T_DATE, /* `__DATE__' */ + T_FILE, /* `__FILE__' */ + T_BASE_FILE, /* `__BASE_FILE__' */ + T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */ + T_VERSION, /* `__VERSION__' */ + T_SIZE_TYPE, /* `__SIZE_TYPE__' */ + T_PTRDIFF_TYPE, /* `__PTRDIFF_TYPE__' */ + T_WCHAR_TYPE, /* `__WCHAR_TYPE__' */ + T_USER_LABEL_PREFIX_TYPE, /* `__USER_LABEL_PREFIX__' */ + T_REGISTER_PREFIX_TYPE, /* `__REGISTER_PREFIX__' */ + T_TIME, /* `__TIME__' */ + T_CONST, /* Constant value, used by `__STDC__' */ + T_MACRO, /* macro defined by `#define' */ + T_DISABLED, /* macro temporarily turned off for rescan */ + T_SPEC_DEFINED, /* special `defined' macro for use in #if statements */ + T_PCSTRING, /* precompiled string (hashval is KEYDEF *) */ + T_UNUSED /* Used for something not defined. */ +} ; + +/* Structure returned by create_definition */ +typedef struct macrodef MACRODEF; +struct macrodef +{ + /*@null@*/ struct definition *defn; + /*@relnull@*/ /*@dependent@*/ char *symnam; /* null if defn is null */ + int symlen; +}; + +/* Structure allocated for every #define. For a simple replacement + such as + #define foo bar , + nargs = -1, the `pattern' list is null, and the expansion is just + the replacement text. Nargs = 0 means a functionlike macro with no args, + e.g., + #define getchar() getc (stdin) . + When there are args, the expansion is the replacement text with the + args squashed out, and the reflist is a list describing how to + build the output from the input: e.g., "3 chars, then the 1st arg, + then 9 chars, then the 3rd arg, then 0 chars, then the 2nd arg". + The chars here come from the expansion. Whatever is left of the + expansion after the last arg-occurrence is copied after that arg. + Note that the reflist can be arbitrarily long--- + its length depends on the number of times the arguments appear in + the replacement text, not how many args there are. Example: + #define f(x) x+x+x+x+x+x+x would have replacement text "++++++" and + pattern list + { (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL } + where (x, y) means (nchars, argno). */ + +typedef struct definition DEFINITION; + +struct definition { + int nargs; + size_t length; /* length of expansion string */ + bool predefined; /* True if the macro was builtin or */ + /* came from the command line */ + /*@dependent@*/ char *expansion; + long line; /* Line number of definition */ + /*@exposed@*/ cstring file; /* File of definition */ + + bool noExpand; /* True if macro should not be expanded in code. */ + bool rest_args; /* Nonzero if last arg. absorbs the rest */ + + /*@null@*/ struct reflist { + /*@null@*/ /*@dependent@*/ struct reflist *next; + bool stringify; /* nonzero if this arg was preceded by a + # operator. */ + bool raw_before; /* Nonzero if a ## operator before arg. */ + bool raw_after; /* Nonzero if a ## operator after arg. */ + bool rest_args; /* Nonzero if this arg. absorbs the rest */ + int nchars; /* Number of literal chars to copy before + this arg occurrence. */ + int argno; /* Number of arg to substitute (origin-0) */ + } *pattern; + + union { + /* Names of macro args, concatenated in reverse order + with comma-space between them. + The only use of this is that we warn on redefinition + if this differs between the old and new definitions. */ + /*@null@*/ char *argnames; + } args; +}; + +/* Stack of conditionals currently in progress + (including both successful and failing conditionals). */ + +struct if_stack { + /*@null@*/ struct if_stack *next; /* for chaining to the next stack frame */ + /*@observer@*/ cstring fname; /* copied from input when frame is made */ + int lineno; /* similarly */ + int if_succeeded; /* true if a leg of this if-group + has been passed through rescan */ + + /* For #ifndef at start of file, this is the macro name tested. */ + /*@null@*/ /*@dependent@*/ char *control_macro; + + + enum node_type type; /* type of last directive seen in this group */ +}; +typedef struct if_stack cppIfStackFrame; + +extern void cppBuffer_lineAndColumn (/*@null@*/ cppBuffer *, /*@out@*/ int *, + /*@out@*/ /*@null@*/ int *); +extern /*@exposed@*/ /*@null@*/ cppBuffer *cppReader_fileBuffer (cppReader *); + +extern void cppReader_growBuffer (cppReader *, size_t); +extern int cppReader_parseEscape (cppReader *, char **); + +extern /*@exposed@*/ cppBuffer *cppReader_popBuffer (cppReader *p_pfile) + /*@modifies p_pfile@*/ ; + +#ifdef __cplusplus +} +#endif + +extern void cppReader_skipRestOfLine (cppReader *p_pfile); + +# include + +# ifdef WIN32 +/*@constant observer char *GCC_INCLUDE_DIR;@*/ +# define GCC_INCLUDE_DIR NULL +# else +/*@constant observer char *GCC_INCLUDE_DIR;@*/ +# define GCC_INCLUDE_DIR "/usr/lib/gcc-lib/i386-linux/2.7.2.1/include" +# endif + +# ifdef WIN32 +/*@constant observer char *GCC_INCLUDE_DIR2@*/ +# define GCC_INCLUDE_DIR2 NULL +# else +/*@constant observer char *GCC_INCLUDE_DIR2@*/ +# define GCC_INCLUDE_DIR2 "/usr/include" +# endif + +struct file_name_list +{ + /*@owned@*/ /*@null@*/ struct file_name_list *next; + /*@dependent@*/ cstring fname; + + /* If the following is nonzero, it is a macro name. + Don't include the file again if that macro is defined. */ + + /*@dependent@*/ /*@null@*/ char *control_macro; + /* If the following is nonzero, it is a C-language system include + directory. */ + + bool c_system_include_path; + + /* Mapping of file names for this directory. */ + /*@exposed@*/ /*@relnull@*/ /*@reldef@*/ struct file_name_map *name_map; + + /* Non-zero if name_map is valid. */ + bool got_name_map; +}; + +extern void cppReader_addIncludeChain (/*@special@*/ cppReader *p_pfile, + /*@keep@*/ struct file_name_list *p_dir) + /*@uses p_pfile->opts, p_pfile->max_include_len@*/ + /*@modifies p_pfile, p_dir@*/ ; + +extern void cppReader_define (cppReader *p_pfile, char *p_str); +extern void cppReader_finish (cppReader *p_pfile); +extern void cppReader_init (/*@out@*/ cppReader *p_pfile) ; +extern void cppOptions_init (/*@out@*/ cppOptions *p_opts); +extern void cppReader_initializeReader (cppReader *p_pfile) /*@modifies p_pfile@*/ ; + +extern int cppReader_startProcess (cppReader *p_pfile, cstring p_fname); + +extern bool isIdentifierChar (char) /*@*/ ; + +/* Find the largest host integer type and set its size and type. */ + +#ifndef HOST_BITS_PER_WIDE_INT + +#if HOST_BITS_PER_LONG > HOST_BITS_PER_INT +/*@notfunction@*/ +#define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG +/*@notfunction@*/ +#define HOST_WIDE_INT long +#else +/*@notfunction@*/ +#define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_INT +/*@notfunction@*/ +#define HOST_WIDE_INT long +/* was int */ +#endif + +#endif + +#ifndef S_ISREG +/*@-macrounrecog@*/ +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +/*@=macrounrecog@*/ +#endif + +#ifndef S_ISDIR +/*@-macrounrecog@*/ +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +/*@=macrounrecog@*/ +#endif + +#ifndef INCLUDE_LEN_FUDGE +/*@constant int INCLUDE_LEN_FUDGE@*/ +#define INCLUDE_LEN_FUDGE 0 +#endif + +extern int cppReader_checkMacroName (cppReader *p_pfile, char *p_symname, + cstring p_usage); + +extern struct operation cppReader_parseNumber (cppReader *, char *, int); + diff --git a/src/Headers/cprim.h b/src/Headers/cprim.h new file mode 100644 index 0000000..0e39946 --- /dev/null +++ b/src/Headers/cprim.h @@ -0,0 +1,118 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** cprim.h +*/ + +# ifndef CPRIM_H +# define CPRIM_H + +/* +** These numbers are not enums, since we need to extend it with all other +** types. They index entries in cttable. +*/ + +immut_typedef int cprim; + +/*@constant int CTX_UNKNOWN;@*/ +# define CTX_UNKNOWN 0 + +/*@constant int CTX_VOID;@*/ +# define CTX_VOID 1 + +/*@constant int CTX_BOOL;@*/ +# define CTX_BOOL 2 + +/*@constant int CTX_UCHAR;@*/ +# define CTX_UCHAR 3 /* unsigned char */ + +/*@constant int CTX_CHAR;@*/ +# define CTX_CHAR 4 + +extern bool cprim_isUnsignedChar (/*@sef@*/ cprim p_c); +# define cprim_isUnsignedChar(c) ((c) == CTX_UCHAR) + +extern bool cprim_isSignedChar (/*@sef@*/ cprim p_c); +# define cprim_isSignedChar(c) ((c) == CTX_CHAR) + +extern bool cprim_isAnyChar (/*@sef@*/ cprim p_c); +# define cprim_isAnyChar(c) ((c) >= CTX_UCHAR && (c) <= CTX_CHAR) + +/* +** only a few combiniations of type qualifiers and base types are +** recognized in the ANSI standard. LCLint treats these as distinct +** types. +*/ + +/*@constant int CTX_INT;@*/ +# define CTX_INT 5 + +/*@constant int CTX_UINT;@*/ /* unsigned int */ +# define CTX_UINT 6 + + +/*@constant int CTX_SINT;@*/ /* short int */ +# define CTX_SINT 7 + +/*@constant int CTX_USINT;@*/ /* unsigned short int */ +# define CTX_USINT 8 + +/*@constant int CTX_LINT;@*/ /* long int */ +# define CTX_LINT 9 + +/*@constant int CTX_ULINT;@*/ /* unsigned long int */ +# define CTX_ULINT 10 + +/*@constant int CTX_LLINT;@*/ /* long long int (WG14/N843) */ +# define CTX_LLINT 11 + +/*@constant int CTX_ULLINT;@*/ /* unsigned long long int (WG14/N843) */ +# define CTX_ULLINT 12 + +/*@constant int CTX_ANYINTEGRAL;@*/ +# define CTX_ANYINTEGRAL 13 + +/*@constant int CTX_UNSIGNEDINTEGRAL;@*/ +# define CTX_UNSIGNEDINTEGRAL 14 + +/*@constant int CTX_SIGNEDINTEGRAL;@*/ +# define CTX_SIGNEDINTEGRAL 15 + +/*@constant int CTX_FLOAT;@*/ +# define CTX_FLOAT 16 + +/*@constant int CTX_DOUBLE;@*/ +# define CTX_DOUBLE 17 + +/*@constant int CTX_LDOUBLE;@*/ /* long double */ +# define CTX_LDOUBLE 18 + +extern bool cprim_isAnyInt (/*@sef@*/ cprim p_c); +extern bool cprim_isAnyReal (/*@sef@*/ cprim p_c); + +# define cprim_isAnyInt(c) ((c) >= CTX_INT && (c) <= CTX_SIGNEDINTEGRAL) +# define cprim_isAnyReal(c) ((c) >= CTX_FLOAT && (c) <= CTX_LDOUBLE) + +/*@constant int CTX_LAST;@*/ +# define CTX_LAST CTX_LDOUBLE + +/*@constant cprim cprim_int@*/ +# define cprim_int CTX_INT + +extern bool cprim_equal (cprim, cprim); +# define cprim_equal(p1,p2) ((p1) == (p2)) + +extern bool cprim_closeEnough(cprim, cprim); +extern /*@only@*/ cstring cprim_unparse(cprim); +extern cprim cprim_fromInt (int p_i); + +extern bool cprim_isInt(cprim p_c); + +# else +# error "Multiple include" +# endif + + diff --git a/src/Headers/cstring.h b/src/Headers/cstring.h new file mode 100644 index 0000000..f2a74f0 --- /dev/null +++ b/src/Headers/cstring.h @@ -0,0 +1,192 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** cstring.h +*/ + +# ifndef CSTRING_H +# define CSTRING_H + +/* does this cause problems on Solaris? linux? */ +/* sgi's don't like it */ +# ifndef IRIX +# ifdef NULL /* hack so works */ +# undef NULL +# endif +# endif + +/* typedefs in forwardTypes */ + +extern /*@notnull@*/ cstring cstring_create (int p_n) /*@*/ ; +extern /*@notnull@*/ cstring cstring_appendChar (/*@only@*/ cstring p_s1, char p_c); + +extern cstring cstring_concatLength (/*@only@*/ cstring p_s1, char *p_s2, int p_len) /*@*/ ; + +extern /*@notnull@*/ cstring cstring_prependChar (char p_c, /*@temp@*/ cstring p_s1); +extern /*@notnull@*/ cstring cstring_prependCharO (char p_c, /*@only@*/ cstring p_s1); +extern cstring cstring_downcase (cstring p_s) /*@*/ ; +extern cstring cstring_copy (cstring p_s) /*@*/ ; +extern cstring cstring_copyLength (char *p_s, int p_len) /*@*/ ; + +extern int cstring_toPosInt (cstring p_s) /*@*/ ; + +typedef enum { + CGE_SAME, /* no differences */ + CGE_DISTINCT, /* significant differences */ + CGE_CASE, /* case differences */ + CGE_LOOKALIKE /* lookalike differences */ + } cmpcode; + +extern cmpcode cstring_genericEqual (cstring p_s, cstring p_t, + int p_nchars, + bool p_caseinsensitive, + bool p_lookalike) /*@*/ ; + +# ifdef WIN32 +extern void cstring_replaceAll (cstring p_s, char p_old, char p_snew) /*@modifies p_s@*/ ; +# endif + +extern void cstring_replaceLit (/*@unique@*/ cstring p_s, char *p_old, char *p_snew); +extern char cstring_firstChar (cstring p_s); +extern char cstring_secondChar (cstring p_s); +extern char cstring_lastChar (cstring p_s) /*@*/ ; +extern char cstring_getChar (cstring p_s, int p_n); +extern void cstring_setChar (cstring p_s, int p_n, char p_c); + +# define cstring_secondChar(s) cstring_getChar (s, 2) + +extern /*@exposed@*/ /*@notnull@*/ char * + cstring_toCharsSafe (/*@temp@*/ /*@exposed@*/ /*@returned@*/ cstring p_s) + /*@*/ ; + +extern int cstring_length (cstring p_s) /*@*/ ; +extern bool cstring_contains (/*@unique@*/ cstring p_c, cstring p_sub) /*@*/ ; +extern bool cstring_containsChar (cstring p_c, char p_ch) /*@*/ ; +extern bool cstring_equal (cstring p_c1, cstring p_c2) /*@*/ ; +extern bool cstring_equalCaseInsensitive (cstring p_c1, cstring p_c2) /*@*/ ; +extern bool cstring_equalLen (cstring p_c1, cstring p_c2, int p_len) /*@*/ ; +extern bool cstring_equalLenCaseInsensitive (cstring p_c1, cstring p_c2, int p_len) /*@*/ ; +extern bool cstring_equalPrefix (cstring p_c1, char *p_c2) /*@*/ ; +extern bool cstring_equalCanonicalPrefix (cstring p_c1, char *p_c2) /*@*/ ; +extern bool cstring_equalLit (cstring p_c1, char *p_c2) /*@*/ ; +extern int cstring_compare (cstring p_c1, cstring p_c2) /*@*/ ; +extern int cstring_xcompare (cstring *p_c1, cstring *p_c2) /*@*/ ; + +# ifndef NOLCL +extern bool cstring_hasNonAlphaNumBar (cstring p_s) /*@*/ ; +# endif + +extern cstring cstring_elide (cstring p_s, int p_len) /*@*/ ; +extern cstring cstring_clip (/*@returned@*/ cstring p_s, int p_len) + /*@modifies p_s@*/ ; +extern void cstring_stripChars (cstring p_s, const char *p_clist) /*@modifies p_s@*/ ; + +extern /*@dependent@*/ cstring + cstring_bsearch (cstring p_key, + char **p_table, + int p_nentries); + +extern bool cstring_lessthan (cstring p_s1, cstring p_s2) /*@*/ ; +# define cstring_lessthan(s1, s2) (cstring_compare (s1, s2) < 0) + +# define cstring_equalLit(s, lit) \ + (mstring_equal (cstring_toCharsSafe (s), lit)) + +extern bool cstring_equalFree (/*@only@*/ cstring p_c1, /*@only@*/ cstring p_c2); + +/* really exposed! */ +extern cstring + cstring_fromChars (/*@returned@*/ /*@null@*/ + const /*@exposed@*/ /*@temp@*/ char *p_cp) /*@*/ ; + +extern cstring + cstring_fromCharsO (/*@null@*/ /*@only@*/ char *p_cp) /*@*/ ; +/*@-mustfree@*/ +# define cstring_fromCharsO(s) cstring_fromChars(s) +/*@=mustfree@*/ + +extern cstring cstring_fromCharsNew (/*@null@*/ char *p_s) /*@*/ ; +# define cstring_fromCharsNew(s) cstring_copy(cstring_fromChars(s)) + +# ifndef NOLCL +extern /*@exposed@*/ /*@notnull@*/ + char *cstring_toCharsSafeO (/*@only@*/ /*@exposed@*/ /*@returned@*/ cstring p_s); +/*@-mustfree@*/ +# define cstring_toCharsSafeO(s) cstring_toCharsSafe(s) +/*@=mustfree@*/ +# endif + +extern void cstring_free (/*@only@*/ cstring p_s); + +/*@constant null cstring cstring_undefined;@*/ +# define cstring_undefined ((cstring)NULL) + +extern /*@falsenull@*/ bool cstring_isDefined (cstring p_s) /*@*/ ; +extern /*@truenull@*/ bool cstring_isUndefined (cstring p_s) /*@*/ ; + +extern bool cstring_isEmpty (cstring p_s) /*@*/ ; +extern /*@falsenull@*/ bool cstring_isNonEmpty (cstring p_s) /*@*/ ; + +# define cstring_isDefined(s) ((s) != cstring_undefined) +# define cstring_isUndefined(s) (!cstring_isDefined(s)) + +# define cstring_isEmpty(s) (cstring_length(s) == 0) +# define cstring_isNonEmpty(s) (!cstring_isEmpty(s)) + +extern cstring cstring_makeLiteral (char *) /*@*/ ; +extern /*@observer@*/ /*@dependent@*/ cstring + cstring_makeLiteralTemp (char *) /*@*/ ; + +# define cstring_makeLiteral(s) (cstring_copy (cstring_fromChars (s))) +# define cstring_makeLiteralTemp(s) (cstring_fromChars (s)) + +extern cstring cstring_capitalize (cstring p_s) /*@*/ ; +extern cstring cstring_capitalizeFree (/*@only@*/ cstring p_s) /*@modifies p_s@*/ ; +extern cstring cstring_fill (cstring p_s, int p_n) /*@*/ ; +extern cstring cstring_prefix (cstring p_s, int p_n) /*@*/ ; +extern /*@observer@*/ cstring cstring_suffix (cstring p_s, int p_n) /*@*/ ; +extern cstring cstring_concat (cstring p_s, cstring p_t) /*@*/ ; + +extern cstring + cstring_concatFree (/*@only@*/ cstring p_s, /*@only@*/ cstring p_t) + /*@modifies p_s, p_t@*/ ; + +extern cstring + cstring_concatFree1 (/*@only@*/ cstring p_s, cstring p_t) + /*@modifies p_s@*/ ; + +# ifndef NOLCL +extern cstring + cstring_concatChars (/*@only@*/ cstring p_s, char *p_t) + /*@modifies p_s@*/ ; + +extern lsymbol cstring_toSymbol (/*@only@*/ cstring p_s) /*@*/ ; +# endif + +extern void cstring_markOwned (/*@owned@*/ cstring p_s) /*@modifies p_s@*/ ; + +extern cstring cstring_beforeChar (cstring p_s, char p_c) /*@*/ ; + +/*@iter cstring_chars (sef cstring s, yield char c);@*/ +# define cstring_chars(s, m_c) \ + if (cstring_isDefined (s)) \ + { char *m_current = (char *) (s); \ + char m_c; \ + for (; (m_c = *m_current) != '\0'; m_current++) { +# define end_cstring_chars }} + +extern /*@observer@*/ cstring cstring_advanceWhiteSpace (cstring) /*@*/ ; + +extern bool cstring_containsLit (/*@unique@*/ cstring p_c, char *p_sub) /*@*/ ; +# define cstring_containsLit(c,sub) \ + (cstring_contains (c, cstring_fromChars (sub))) + +# else +# error "Multiple include" +# endif + + + diff --git a/src/Headers/cstringList.h b/src/Headers/cstringList.h new file mode 100644 index 0000000..fd8469c --- /dev/null +++ b/src/Headers/cstringList.h @@ -0,0 +1,63 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef cstringList_H +# define cstringList_H + +abst_typedef /*@null@*/ struct _cstringList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_cstring *elements; +} *cstringList ; + +/*@constant null cstringList cstringList_undefined;@*/ +# define cstringList_undefined ((cstringList) NULL) + +extern /*@falsenull@*/ bool cstringList_isDefined (cstringList p_s) /*@*/ ; +# define cstringList_isDefined(s) ((s) != cstringList_undefined) + +extern int cstringList_size (/*@sef@*/ cstringList) /*@*/ ; +# define cstringList_size(s) (cstringList_isDefined (s) ? (s)->nelements : 0) + +extern /*@unused@*/ /*@falsenull@*/ bool cstringList_empty (/*@sef@*/ cstringList) /*@*/ ; +# define cstringList_empty(s) (cstringList_size(s) == 0) + +extern cstring cstringList_unparseSep (cstringList p_s, cstring p_sep) /*@*/ ; + +extern /*@unused@*/ /*@only@*/ cstringList cstringList_new (void) /*@*/ ; + +extern /*@only@*/ cstringList cstringList_single (/*@keep@*/ cstring p_el) /*@*/ ; + +extern cstringList + cstringList_add (/*@returned@*/ cstringList p_s, /*@keep@*/ cstring p_el) + /*@modifies p_s@*/ ; + +extern /*@unused@*/ void cstringList_alphabetize (cstringList p_s); +extern /*@unused@*/ /*@only@*/ cstring cstringList_unparseAbbrev (cstringList p_s) /*@*/ ; +extern /*@unused@*/ /*@only@*/ cstring cstringList_unparse (cstringList p_s) ; +extern void cstringList_free (/*@only@*/ cstringList p_s) ; + +extern /*@unused@*/ void cstringList_printSpaced (cstringList p_s, int p_indent, int p_gap, int p_linelen); + +/*@constant int cstringListBASESIZE;@*/ +# define cstringListBASESIZE MIDBASESIZE + +/*@iter cstringList_elements (sef cstringList x, yield exposed cstring el); @*/ +# define cstringList_elements(x, m_el) \ + { if (cstringList_isDefined (x)) { \ + int m_ind; cstring *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { cstring m_el = *(m_elements++); + +# define end_cstringList_elements }}} + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/cstringSList.h b/src/Headers/cstringSList.h new file mode 100644 index 0000000..358595a --- /dev/null +++ b/src/Headers/cstringSList.h @@ -0,0 +1,66 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef cstringSList_H +# define cstringSList_H + +typedef /*@observer@*/ cstring ob_cstring; + +abst_typedef /*@null@*/ struct _cstringSList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ ob_cstring *elements; +} *cstringSList ; + +/*@constant null cstringSList cstringSList_undefined;@*/ +# define cstringSList_undefined ((cstringSList) NULL) + +extern /*@falsenull@*/ bool cstringSList_isDefined (cstringSList p_s) /*@*/ ; +# define cstringSList_isDefined(s) ((s) != cstringSList_undefined) + +extern int cstringSList_size (/*@sef@*/ cstringSList) /*@*/ ; +# define cstringSList_size(s) (cstringSList_isDefined (s) ? (s)->nelements : 0) + +extern /*@falsenull@*/ bool cstringSList_empty (/*@sef@*/ cstringSList) /*@*/ ; +# define cstringSList_empty(s) (cstringSList_size(s) == 0) + +extern /*@unused@*/ cstring cstringSList_unparseSep (cstringSList p_s, cstring p_sep) /*@*/ ; + +extern /*@only@*/ cstringSList cstringSList_new (void) /*@*/ ; + +extern /*@unused@*/ /*@only@*/ cstringSList cstringSList_single (/*@exposed@*/ cstring p_el) /*@*/ ; + +extern cstringSList + cstringSList_add (/*@returned@*/ cstringSList p_s, /*@exposed@*/ cstring p_el) + /*@modifies p_s@*/ ; + +extern void cstringSList_alphabetize (cstringSList p_s); + +extern /*@only@*/ cstring cstringSList_unparseAbbrev (cstringSList p_s) /*@*/ ; +extern /*@unused@*/ /*@only@*/ cstring cstringSList_unparse (cstringSList p_s) ; +extern void cstringSList_free (/*@only@*/ cstringSList p_s) ; + +extern void cstringSList_printSpaced (cstringSList p_s, int p_indent, int p_gap, int p_linelen); + +/*@constant int cstringSListBASESIZE;@*/ +# define cstringSListBASESIZE MIDBASESIZE + +/*@iter cstringSList_elements (sef cstringSList x, yield exposed cstring el); @*/ +# define cstringSList_elements(x, m_el) \ + { if (cstringSList_isDefined (x)) { \ + int m_ind; cstring *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { cstring m_el = *(m_elements++); + +# define end_cstringSList_elements }}} + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/ctokens.h b/src/Headers/ctokens.h new file mode 100644 index 0000000..ada266f --- /dev/null +++ b/src/Headers/ctokens.h @@ -0,0 +1,8 @@ +# ifndef CTOKENS +# define CTOKENS + +# include "cgramtoks.h" + +# else +# error "Multiple include" +# endif CTOKENS diff --git a/src/Headers/ctypeList.h b/src/Headers/ctypeList.h new file mode 100644 index 0000000..59825d0 --- /dev/null +++ b/src/Headers/ctypeList.h @@ -0,0 +1,51 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef ctypeLIST_H +# define ctypeLIST_H + +/* +** there is a special ctypeList used to represent the () argument list +** this has nelements = -1 +** +** (that is, not void, so any number of arguments is okay.) +*/ + +abst_typedef /*@null@*/ struct _ctypeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ ctype *elements; +} *ctypeList ; + +extern int ctypeList_size (/*@sef@*/ ctypeList p_s) /*@*/ ; +# define ctypeList_size(s) (ctypeList_isDefined(s) ? (s)->nelements : 0) + +extern /*@only@*/ ctypeList ctypeList_new(void); +extern void ctypeList_addh (ctypeList p_s, ctype p_el) /*@modifies p_s@*/; + +extern /*@unused@*/ /*@only@*/ cstring ctypeList_unparse (ctypeList) /*@*/ ; +extern void ctypeList_free (/*@only@*/ /*@only@*/ ctypeList p_s) /*@modifies p_s@*/; + +extern /*@falsenull@*/ bool ctypeList_isDefined (/*@null@*/ ctypeList p_ct) /*@*/ ; +extern /*@unused@*/ /*@truenull@*/ bool + ctypeList_isUndefined (/*@null@*/ ctypeList p_ct) /*@*/ ; + +/*@constant null ctypeList ctypeList_undefined; @*/ +# define ctypeList_undefined ((ctypeList) NULL) + +# define ctypeList_isDefined(ct) ((ct) != ctypeList_undefined) +# define ctypeList_isUndefined(ct) ((ct) == ctypeList_undefined) + +/*@constant int ctypeListBASESIZE;@*/ +# define ctypeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/cvar.h b/src/Headers/cvar.h new file mode 100644 index 0000000..d390f47 --- /dev/null +++ b/src/Headers/cvar.h @@ -0,0 +1,15 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** cvar.h +*/ + +# ifndef CVAR_H +# define CVAR_H + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/declaratorInvNode.h b/src/Headers/declaratorInvNode.h new file mode 100644 index 0000000..4e14bea --- /dev/null +++ b/src/Headers/declaratorInvNode.h @@ -0,0 +1,17 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** declaratorInvNode.h +*/ + +typedef struct _declaratorInvNode { + struct _declaratorNode *declarator; + struct _abstBodyNode *body; +} *declaratorInvNode; + +extern void declaratorInvNode_free (/*@only@*/ /*@null@*/ declaratorInvNode p_x); +extern /*@only@*/ cstring declaratorInvNode_unparse (declaratorInvNode p_d); + diff --git a/src/Headers/declaratorInvNodeList.h b/src/Headers/declaratorInvNodeList.h new file mode 100644 index 0000000..aa636aa --- /dev/null +++ b/src/Headers/declaratorInvNodeList.h @@ -0,0 +1,47 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef DECLARATORINVNODELIST_H +# define DECLARATORINVNODELIST_H + +typedef /*@only@*/ declaratorInvNode o_declaratorInvNode; + +abst_typedef struct _declaratorInvNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_declaratorInvNode *elements; +} *declaratorInvNodeList ; + +/*@iter declaratorInvNodeList_elements (sef declaratorInvNodeList x, yield exposed declaratorInvNode el); @*/ +# define declaratorInvNodeList_elements(x, m_el) \ + { int m_ind; declaratorInvNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { declaratorInvNode m_el = *(m_elements++); + +# define end_declaratorInvNodeList_elements }} + +extern int declaratorInvNodeList_size (declaratorInvNodeList); +# define declaratorInvNodeList_size(d) ((d)->nelements) + +extern /*@only@*/ declaratorInvNodeList declaratorInvNodeList_new(void); + +extern declaratorInvNodeList + declaratorInvNodeList_add (/*@returned@*/ declaratorInvNodeList p_s, + /*@only@*/ declaratorInvNode p_el); + +extern /*@only@*/ cstring declaratorInvNodeList_unparse (declaratorInvNodeList p_s) ; +extern void declaratorInvNodeList_free (/*@only@*/ declaratorInvNodeList p_s) ; + +/*@constant int declaratorInvNodeListBASESIZE;@*/ +# define declaratorInvNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/declaratorNode.h b/src/Headers/declaratorNode.h new file mode 100644 index 0000000..e189e7f --- /dev/null +++ b/src/Headers/declaratorNode.h @@ -0,0 +1,17 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** declaratorNode.h +*/ + +typedef struct _declaratorNode { + ltoken id; + /*@null@*/ typeExpr type; + bool isRedecl; +} *declaratorNode; + +extern /*@only@*/ cstring declaratorNode_unparse(declaratorNode p_x); +extern void declaratorNode_free (/*@null@*/ /*@only@*/ declaratorNode p_x); diff --git a/src/Headers/declaratorNodeList.h b/src/Headers/declaratorNodeList.h new file mode 100644 index 0000000..74b8a5c --- /dev/null +++ b/src/Headers/declaratorNodeList.h @@ -0,0 +1,45 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef DECLARATORNODELIST_H +# define DECLARATORNODELIST_H + +typedef /*@only@*/ declaratorNode o_declaratorNode; + +abst_typedef struct _declaratorNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_declaratorNode *elements; +} *declaratorNodeList ; + +/*@iter declaratorNodeList_elements (sef declaratorNodeList x, yield exposed declaratorNode el); @*/ +# define declaratorNodeList_elements(x, m_el) \ + { int m_ind; declaratorNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { declaratorNode m_el = *(m_elements++); + +# define end_declaratorNodeList_elements }} + + +extern /*@only@*/ declaratorNodeList declaratorNodeList_new(void); +extern declaratorNodeList + declaratorNodeList_add (/*@returned@*/ declaratorNodeList p_s, + /*@only@*/ declaratorNode p_el); + +extern /*@only@*/ cstring declaratorNodeList_unparse (declaratorNodeList p_s) ; +extern void declaratorNodeList_free (/*@only@*/ declaratorNodeList p_s) ; +extern declaratorNodeList declaratorNodeList_copy (declaratorNodeList p_s) ; + +/*@constant int declaratorNodeListBASESIZE;@*/ +# define declaratorNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/dmalloc.h b/src/Headers/dmalloc.h new file mode 100644 index 0000000..c60c040 --- /dev/null +++ b/src/Headers/dmalloc.h @@ -0,0 +1,448 @@ +/* + * defines for the dmalloc library + * + * Copyright 1995 by Gray Watson + * + * This file is part of the dmalloc package. + * + * Permission to use, copy, modify, and distribute this software for any + * NON-COMMERCIAL purpose and without fee is hereby granted, provided + * that the above copyright notice and this permission notice appear + * in all copies, and that the name of Gray Watson not be used in + * advertising or publicity pertaining to distribution of the document + * or software without specific, written prior permission. + * + * Gray Watson makes no representations about the suitability of the + * software described herein for any purpose. It is provided "as is" + * without express or implied warranty. + * + * The author may be contacted at gray.watson@letters.com + * + * $Id$ + */ + +#ifndef __DMALLOC_H__ +#define __DMALLOC_H__ + +/* this is inserted into dmalloc.h */ +/* used to handle the const operator */ +/* const is available */ + +/* NOTE: start of $Id$ */ + +/* + * NOTE: some archetectures have malloc, realloc, etc. using size_t or + * an unsigned long instead of the traditional unsigned int. You may + * have to edit this by hand due to the difficulties I am having + * getting it to auto configure. Finding the definition of size_t in + * the /usr/include files may be a good guess. YEACH!! + * + * Uncomment the include file and set to the correct file which + * defines the size type, if necessary. + */ +#define DMALLOC_SIZE unsigned long +/* #include */ + +/* this defines what type the standard void memory-pointer is */ +#if defined(__STDC__) && __STDC__ == 1 +#define DMALLOC_PNT void * +#define DMALLOC_FREE_RET void +#else +#define DMALLOC_PNT void * +#define DMALLOC_FREE_RET void +#endif + +/* + * malloc function return codes + */ +#define CALLOC_ERROR 0L /* error from calloc */ +#define MALLOC_ERROR 0L /* error from malloc */ +#define REALLOC_ERROR 0L /* error from realloc */ + +/* NOTE: this if for non- __STDC__ systems only */ +#define FREE_ERROR 0 /* error from free */ +#define FREE_NOERROR 1 /* no error from free */ + +#define DMALLOC_VERIFY_ERROR 0 /* checks failed, error */ +#define DMALLOC_VERIFY_NOERROR 1 /* checks passed, no error */ + +/* + * default values if _malloc_file and _malloc_line are not set + */ +#define DMALLOC_DEFAULT_FILE 0L +#define DMALLOC_DEFAULT_LINE 0 +#define DMALLOC_UNKNOWN_FILE "unknown" + +/* + * alloc macros to improve memory usage readibility... + */ +#undef ALLOC +#define ALLOC(type, count) \ + (type *)malloc((DMALLOC_SIZE)(sizeof(type) * (count))) + +#undef MALLOC +#define MALLOC(size) \ + (char *)malloc((DMALLOC_SIZE)(size)) + +/* NOTICE: the arguments are REVERSED from normal calloc() */ +#undef CALLOC +#define CALLOC(type, count) \ + (type *)calloc((DMALLOC_SIZE)(count), (DMALLOC_SIZE)sizeof(type)) + +#undef REALLOC +#define REALLOC(ptr, type, count) \ + (type *)realloc((char *)(ptr), (DMALLOC_SIZE)(sizeof(type) * (count))) + +#undef REMALLOC +#define REMALLOC(ptr, size) \ + (char *)realloc((char *)(ptr), (DMALLOC_SIZE)(size)) + +#undef FREE +#define FREE(ptr) \ + free((char *)(ptr)) + +/*<<<<<<<<<< The below prototypes are auto-generated by fillproto */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* logfile for dumping dmalloc info, DMALLOC_LOGFILE env var overrides this */ +extern char *dmalloc_logpath; + +/* internal dmalloc error number for reference purposes only */ +extern int dmalloc_errno; + +/* address to look for. when discovered call dmalloc_error() */ +extern DMALLOC_PNT dmalloc_address; + +/* + * argument to dmalloc_address, if 0 then never call dmalloc_error() + * else call it after seeing dmalloc_address for this many times. + */ +extern int dmalloc_address_count; + +/* + * shutdown memory-allocation module, provide statistics if necessary + */ +extern void dmalloc_shutdown(void); + +/* + * allocate and return a SIZE block of bytes. returns 0L on error. + */ +extern DMALLOC_PNT malloc(DMALLOC_SIZE size); + +/* + * allocate and return a block of bytes able to hold NUM_ELEMENTS of elements + * of SIZE bytes and zero the block. returns 0L on error. + */ +extern DMALLOC_PNT calloc(DMALLOC_SIZE num_elements, DMALLOC_SIZE size); + +/* + * resizes OLD_PNT to SIZE bytes and return the new space after either copying + * all of OLD_PNT to the new area or truncating. returns 0L on error. + */ +extern DMALLOC_PNT realloc(DMALLOC_PNT old_pnt, DMALLOC_SIZE new_size); + +/* + * release PNT in the heap, returning FREE_ERROR, FREE_NOERROR or void + * depending on whether STDC is defined by your compiler. + */ +extern DMALLOC_FREE_RET free(DMALLOC_PNT pnt); + +/* + * same as free(PNT) + */ +extern DMALLOC_FREE_RET cfree(DMALLOC_PNT pnt); + +/* + * log the heap structure plus information on the blocks if necessary. + */ +extern void dmalloc_log_heap_map(void); + +/* + * dump dmalloc statistics to logfile + */ +extern void dmalloc_log_stats(void); + +/* + * dump unfreed-memory info to logfile + */ +extern void dmalloc_log_unfreed(void); + +/* + * verify pointer PNT, if PNT is 0 then check the entire heap. + * returns MALLOC_VERIFY_ERROR or MALLOC_VERIFY_NOERROR + */ +extern int dmalloc_verify(const DMALLOC_PNT pnt); + +/* + * same as dmalloc_verify + */ +extern int _malloc_verify(const DMALLOC_PNT pnt); + +/* + * set the global debug functionality flags to DEBUG (0 to disable). + * NOTE: after this module has started up, you cannot set certain flags + * such as fence-post or free-space checking. + */ +extern void dmalloc_debug(const int debug); + +/* + * returns the current debug functionality flags. this allows you to + * save a dmalloc library state to be restored later. + */ +extern int dmalloc_debug_current(void); + +/* + * examine pointer PNT and returns SIZE, and FILE / LINE info on it, + * or return-address RET_ADDR if any of the pointers are not 0L. + * if FILE returns 0L then RET_ATTR may have a value and vice versa. + * returns NOERROR or ERROR depending on whether PNT is good or not + */ +extern int dmalloc_examine(const DMALLOC_PNT pnt, DMALLOC_SIZE * size, + char ** file, unsigned int * line, + DMALLOC_PNT * ret_attr); + +/* + * dmalloc version of strerror to return the string version of ERRNUM + * returns the string for MALLOC_BAD_ERRNO if ERRNUM is out-of-range. + */ +extern char *dmalloc_strerror(const int errnum); + +#ifdef __cplusplus +} +#endif + +/*<<<<<<<<<< This is end of the auto-generated output from fillproto. */ + +/* + * alloc macros to provide for memory FILE/LINE debugging information. + */ + +#ifndef DMALLOC_DISABLE + +#undef calloc +#define calloc(count, size) \ + _calloc_leap(__FILE__, __LINE__, count, size) +#undef free +#define free(ptr) \ + _free_leap(__FILE__, __LINE__, ptr) +#undef malloc +#define malloc(size) \ + _malloc_leap(__FILE__, __LINE__, size) +#undef realloc +#define realloc(ptr, size) \ + _realloc_leap(__FILE__, __LINE__, ptr, size) + +#undef xcalloc +#define xcalloc(count, size) \ + _xcalloc_leap(__FILE__, __LINE__, count, size) +#undef xfree +#define xfree(ptr) \ + _xfree_leap(__FILE__, __LINE__, ptr) +#undef xmalloc +#define xmalloc(size) \ + _xmalloc_leap(__FILE__, __LINE__, size) +#undef xrealloc +#define xrealloc(ptr, size) \ + _xrealloc_leap(__FILE__, __LINE__, ptr, size) +#undef xstrdup +#define xstrdup(str) \ + _xstrdup_leap(__FILE__, __LINE__, str) + +#ifdef DMALLOC_FUNC_CHECK + +/* + * do debugging on the following functions. this may cause compilation or + * other problems depending on your architecture. + */ +#undef bcmp +#define bcmp(b1, b2, len) _dmalloc_bcmp(b1, b2, len) +#undef bcopy +#define bcopy(from, to, len) _dmalloc_bcopy(from, to, len) + +#undef memcmp +#define memcmp(b1, b2, len) _dmalloc_memcmp(b1, b2, len) +#undef memcpy +#define memcpy(to, from, len) _dmalloc_memcpy(to, from, len) +#undef memset +#define memset(buf, ch, len) _dmalloc_memset(buf, ch, len) + +#undef index +#define index(str, ch) _dmalloc_index(str, ch) +#undef rindex +#define rindex(str, ch) _dmalloc_rindex(str, ch) + +#undef strcat +#define strcat(to, from) _dmalloc_strcat(to, from) +#undef strcmp +#define strcmp(s1, s2) _dmalloc_strcmp(s1, s2) +#undef strlen +#define strlen(str) _dmalloc_strlen(str) +#undef strtok +#define strtok(str, sep) _dmalloc_strtok(str, sep) + +#undef bzero +#define bzero(buf, len) _dmalloc_bzero(buf, len) + +#undef memccpy +#define memccpy(s1, s2, ch, len) _dmalloc_memccpy(s1, s2, ch, len) +#undef memchr +#define memchr(s1, ch, len) _dmalloc_memchr(s1, ch, len) + +#undef strchr +#define strchr(str, ch) _dmalloc_strchr(str, ch) +#undef strrchr +#define strrchr(str, ch) _dmalloc_strrchr(str, ch) + +#undef strcpy +#define strcpy(to, from) _dmalloc_strcpy(to, from) +#undef strncpy +#define strncpy(to, from, len) _dmalloc_strncpy(to, from, len) +#undef strcasecmp +#define strcasecmp(s1, s2) _dmalloc_strcasecmp(s1, s2) +#undef strncasecmp +#define strncasecmp(s1, s2, len) _dmalloc_strncasecmp(s1, s2, len) +#undef strspn +#define strspn(str, list) _dmalloc_strspn(str, list) +#undef strcspn +#define strcspn(str, list) _dmalloc_strcspn(str, list) +#undef strncat +#define strncat(to, from, len) _dmalloc_strncat(to, from, len) +#undef strncmp +#define strncmp(s1, s2, len) _dmalloc_strncmp(s1, s2, len) +#undef strpbrk +#define strpbrk(str, list) _dmalloc_strpbrk(str, list) +#undef strstr +#define strstr(str, pat) _dmalloc_strstr(str, pat) + +/* + * feel free to add your favorite functions here and to arg_check.[ch] + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * copied in from arg_check.h with IMPORT -> extern, all comments removed + */ +extern int _dmalloc_bcmp(const void * b1, const void * b2, + const DMALLOC_SIZE len); +extern void _dmalloc_bcopy(const char * from, char * to, + const DMALLOC_SIZE len); +extern int _dmalloc_memcmp(const void * b1, const void * b2, + const DMALLOC_SIZE len); +extern char *_dmalloc_memcpy(char * to, const char * from, + const DMALLOC_SIZE len); +extern char *_dmalloc_memset(void * buf, const char ch, + const DMALLOC_SIZE len); +extern char *_dmalloc_index(const char * str, const char ch); +extern char *_dmalloc_rindex(const char * str, const char ch); +extern char *_dmalloc_strcat(char * to, const char * from); +extern int _dmalloc_strcmp(const char * s1, const char * s2); +extern DMALLOC_SIZE _dmalloc_strlen(const char * str); +extern char *_dmalloc_strtok(char * str, const char * sep); +extern void _dmalloc_bzero(void * buf, const DMALLOC_SIZE len); +extern char *_dmalloc_memccpy(char * s1, const char * s2, const char ch, + const DMALLOC_SIZE len); +extern char *_dmalloc_memchr(const char * s1, const char ch, + const DMALLOC_SIZE len); +extern char *_dmalloc_strchr(const char * str, const char ch); +extern char *_dmalloc_strrchr(const char * str, const char ch); +extern char *_dmalloc_strcpy(char * to, const char * from); +extern char *_dmalloc_strncpy(char * to, const char * from, + const DMALLOC_SIZE len); +extern int _dmalloc_strcasecmp(const char * s1, const char * s2); +extern int _dmalloc_strncasecmp(const char * s1, const char * s2, + const DMALLOC_SIZE len); +extern int _dmalloc_strspn(const char * str, const char * list); +extern int _dmalloc_strcspn(const char * str, const char * list); +extern char *_dmalloc_strncat(char * to, const char * from, + const DMALLOC_SIZE len); +extern int _dmalloc_strncmp(const char * s1, const char * s2, + const DMALLOC_SIZE len); +extern char *_dmalloc_strpbrk(const char * str, const char * list); +extern char *_dmalloc_strstr(const char * str, const char * pat); + +#ifdef __cplusplus +} +#endif + +#endif /* DMALLOC_FUNC_CHECK */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * copied directly from malloc_lp.h with IMPORT -> extern, routines trimmed + */ +/* to inform the dmalloc library from which file the call comes from */ +extern char *_dmalloc_file; + +/* to inform the library from which line-number the call comes from */ +extern unsigned int _dmalloc_line; + +/* + * leap routine to calloc + */ +extern DMALLOC_PNT _calloc_leap(const char * file, const int line, + DMALLOC_SIZE elen, DMALLOC_SIZE size); + +/* + * leap routine to free + */ +extern DMALLOC_FREE_RET _free_leap(const char * file, const int line, + DMALLOC_PNT pnt); + +/* + * leap routine to malloc + */ +extern DMALLOC_PNT _malloc_leap(const char * file, const int line, + DMALLOC_SIZE size); + +/* + * leap routine to realloc + */ +extern DMALLOC_PNT _realloc_leap(const char * file, const int line, + DMALLOC_PNT oldp, DMALLOC_SIZE new_size); + +/* + * leap routine to calloc with error checking + */ +extern DMALLOC_PNT _xcalloc_leap(const char * file, const int line, + DMALLOC_SIZE elen, DMALLOC_SIZE size); + +/* + * leap routine to free + */ +extern DMALLOC_FREE_RET _xfree_leap(const char * file, const int line, + DMALLOC_PNT pnt); + +/* + * leap routine to malloc with error checking + */ +extern DMALLOC_PNT _xmalloc_leap(const char * file, const int line, + DMALLOC_SIZE size); + +/* + * leap routine to realloc with error checking + */ +extern DMALLOC_PNT _xrealloc_leap(const char * file, const int line, + DMALLOC_PNT oldp, DMALLOC_SIZE new_size); + +/* + * leap routine for strdup with error checking + */ +extern char *_xstrdup_leap(const char * file, const int line, + const char * str); + +#ifdef __cplusplus +} +#endif + +#endif /* ! DMALLOC_DISABLE */ + +#endif /* ! __DMALLOC_H__ */ diff --git a/src/Headers/ekind.h b/src/Headers/ekind.h new file mode 100644 index 0000000..041ae43 --- /dev/null +++ b/src/Headers/ekind.h @@ -0,0 +1,58 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef EKIND_H +# define EKIND_H + +/* need to maintain compatibility with libraries */ + +immut_typedef enum { + KINVALID = -1, + KDATATYPE = 0, /* must dump datatypes first, so ctypes are ok */ + KCONST, KENUMCONST, + KVAR, KFCN, KITER, KENDITER, + KSTRUCTTAG, KUNIONTAG, KENUMTAG, + KELIPSMARKER + } ekind; + +/*@constant ekind KELAST;@*/ +# define KELAST KELIPSMARKER + +extern bool ekind_equal (ekind, ekind) /*@*/ ; +# define ekind_equal(e1, e2) ((e1) == (e2)) + +extern ekind ekind_fromInt (int p_i) /*@*/ ; +extern int ekind_toInt (ekind p_k) /*@*/ ; + +extern bool ekind_isFunction (ekind p_k) /*@*/ ; +# define ekind_isFunction(k) ((k) == KFCN) + +extern /*@unused@*/ bool ekind_isVariable (ekind p_k) /*@*/ ; +# define ekind_isVariable(k) ((k) == KVAR) + +extern bool ekind_isElipsis (ekind p_k) /*@*/ ; +# define ekind_isElipsis(k) ((k) == KELIPSMARKER) + +extern bool ekind_isConst (ekind p_k) /*@*/ ; +# define ekind_isConst(k) ((k) == KCONST) + +extern bool ekind_isEnumConst (ekind p_k) /*@*/ ; +# define ekind_isEnumConst(k) ((k) == KENUMCONST) + +# define ekind_toInt(k) ((int)(k)) + +/*@constant ekind ekind_variable; @*/ +# define ekind_variable ((ekind)KVAR) + +/*@constant ekind ekind_function; @*/ +# define ekind_function ((ekind)KFCN) + +extern /*@observer@*/ cstring ekind_capName (ekind p_k) /*@*/ ; +extern /*@observer@*/ cstring ekind_unparse (ekind p_k) /*@*/ ; +extern /*@observer@*/ cstring ekind_unparseLong (ekind p_k) /*@*/ ; + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/enumNameList.h b/src/Headers/enumNameList.h new file mode 100644 index 0000000..8947605 --- /dev/null +++ b/src/Headers/enumNameList.h @@ -0,0 +1,64 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef enumNameLIST_H +# define enumNameLIST_H + +typedef cstring enumName ; + +# ifndef NOLCL +extern /*@only@*/ enumName enumName_create (/*@only@*/ cstring p_s) /*@*/ ; +# define enumName_create(s) (s) +# endif + +typedef /*@only@*/ enumName o_enumName; + +abst_typedef struct _enumNameList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_enumName *elements; +} *enumNameList ; + +/*@iter enumNameList_elements (sef enumNameList x, yield exposed enumName el); @*/ +# define enumNameList_elements(x, m_el) \ + { int m_ind; enumName *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { enumName m_el = *(m_elements++); + +# define end_enumNameList_elements }} + +extern int enumNameList_size (enumNameList); + +# define enumNameList_size(s) ((s)->nelements) + +extern /*@only@*/ enumNameList enumNameList_new(void); +extern bool enumNameList_member (enumNameList p_s, cstring p_m); +extern enumNameList enumNameList_push (/*@returned@*/ enumNameList p_s, /*@only@*/ enumName p_el); +extern void enumNameList_addh (enumNameList p_s, /*@keep@*/ enumName p_el) + /*@modifies p_s@*/; + +extern /*@only@*/ cstring enumNameList_unparse (enumNameList p_s) /*@*/ ; +extern void enumNameList_free (/*@only@*/ enumNameList p_s) ; + +extern bool enumNameList_match (enumNameList p_e1, enumNameList p_e2) /*@*/ ; +extern /*@only@*/ enumNameList enumNameList_single (/*@keep@*/ enumName p_t) /*@*/ ; +extern /*@only@*/ enumNameList + enumNameList_subtract (enumNameList p_source, enumNameList p_del) /*@*/ ; +extern /*@only@*/ enumNameList enumNameList_copy (enumNameList p_s) /*@*/ ; +extern /*@only@*/ enumNameList enumNameList_undump(char **p_s); +extern /*@only@*/ cstring enumNameList_dump (enumNameList p_s); +extern /*@only@*/ cstring enumNameList_unparseBrief (enumNameList p_s); + +/*@constant int enumNameListBASESIZE;@*/ +# define enumNameListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/enumNameSList.h b/src/Headers/enumNameSList.h new file mode 100644 index 0000000..8688b6b --- /dev/null +++ b/src/Headers/enumNameSList.h @@ -0,0 +1,39 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef enumNameSLIST_H +# define enumNameSLIST_H + +abst_typedef enumNameList enumNameSList; + +extern int enumNameSList_size (enumNameSList) /*@*/ ; +# define enumNameSList_size(s) enumNameList_size(s) + +extern /*@only@*/ enumNameSList enumNameSList_subtract (enumNameList, enumNameSList); +# define enumNameSList_subtract(s,t) enumNameList_subtract(s,t) + +extern /*@only@*/ enumNameSList enumNameSList_new(void); +# define enumNameSList_new() enumNameList_new() + +extern bool enumNameSList_member (enumNameSList p_s, cstring p_m); +# define enumNameSList_member(s,m) enumNameList_member(s,m) + +extern void enumNameSList_addh (enumNameSList p_s, /*@dependent@*/ enumName p_el) ; +/*@-dependenttrans@*/ +# define enumNameSList_addh(s,el) enumNameList_addh(s, el) +/*@=dependenttrans@*/ + +extern void enumNameSList_free (/*@only@*/ enumNameSList p_s); + +extern /*@only@*/ cstring enumNameSList_unparse (enumNameSList p_s) /*@*/ ; +# define enumNameSList_unparse(s) enumNameList_unparse(s) + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/enumSpecNode.h b/src/Headers/enumSpecNode.h new file mode 100644 index 0000000..0a5f0e7 --- /dev/null +++ b/src/Headers/enumSpecNode.h @@ -0,0 +1,16 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _enumSpecNode { + ltoken tok; + ltoken opttagid; + /*@owned@*/ ltokenList enums; + sort sort; +} *enumSpecNode; + +extern /*@unused@*/ /*@only@*/ + cstring enumSpecNode_unparse(/*@null@*/ enumSpecNode p_n) /*@*/ ; + diff --git a/src/Headers/exportNode.h b/src/Headers/exportNode.h new file mode 100644 index 0000000..9162392 --- /dev/null +++ b/src/Headers/exportNode.h @@ -0,0 +1,26 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef enum +{ + XPK_CONST, XPK_VAR, XPK_TYPE, + XPK_FCN, XPK_CLAIM, XPK_ITER +} exportKind; + +typedef struct _exportNode { + exportKind kind; + union { + constDeclarationNode constdeclaration; + varDeclarationNode vardeclaration; + typeNode type; + fcnNode fcn; + claimNode claim; + iterNode iter; + } content; +} *exportNode; + +extern /*@unused@*/ /*@only@*/ cstring exportNode_unparse (exportNode p_n); + diff --git a/src/Headers/exposedNode.h b/src/Headers/exposedNode.h new file mode 100644 index 0000000..daa6845 --- /dev/null +++ b/src/Headers/exposedNode.h @@ -0,0 +1,14 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _exposedNode { + ltoken tok; + lclTypeSpecNode type; + declaratorInvNodeList decls; +} *exposedNode; + +extern /*@unused@*/ /*@only@*/ cstring exposedNode_unparse (exposedNode p_n); + diff --git a/src/Headers/exprChecks.h b/src/Headers/exprChecks.h new file mode 100644 index 0000000..15b019a --- /dev/null +++ b/src/Headers/exprChecks.h @@ -0,0 +1,30 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** exprChecks.h +*/ + +extern bool anyAbstract (ctype p_c1, /*@sef@*/ ctype p_c2); +# define anyAbstract(c1, c2) \ + (ctype_isRealAbstract(c1) || ctype_isRealAbstract(c2)) + +extern void exprNode_checkAllMods (sRefSet p_mods, uentry p_ue); +extern void exprNode_checkCallModifyVal (sRef p_s, exprNodeList p_args, exprNode p_f, exprNode p_err); +extern void exprChecks_checkEmptyMacroBody (void); +extern void exprChecks_checkExport (uentry p_e); +extern void exprNode_checkFunction (uentry p_ue, /*@only@*/ exprNode p_body); +extern void exprNode_checkFunctionBody (exprNode p_body); +extern void exprNode_checkIterBody (/*@only@*/ exprNode p_body); +extern void exprNode_checkIterEnd (/*@only@*/ exprNode p_body); +extern void exprNode_checkMacroBody (/*@only@*/ exprNode p_e); +extern void exprNode_checkModify (exprNode p_e, exprNode p_err); +extern void exprNode_checkModifyVal (exprNode p_e, exprNode p_err); +extern void exprChecks_checkNullReturn (fileloc p_loc); +extern void exprNode_checkPred (cstring p_c, exprNode p_e); +extern void exprNode_checkReturn (exprNode p_e); +extern void exprNode_checkStatement (exprNode p_e); +extern void exprChecks_checkUsedGlobs (globSet p_decl, globSet p_used); + diff --git a/src/Headers/exprNode.h b/src/Headers/exprNode.h new file mode 100644 index 0000000..05e2af8 --- /dev/null +++ b/src/Headers/exprNode.h @@ -0,0 +1,353 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** exprNode.h +*/ + +# ifndef EXPRNODE_H +# define EXPRNODE_H + +/* +** expression Nodes: +** +** ctype typ --- type of expression +** +** union _val +** { long ival; +** char cval; +** double fval; +** cstring sval; +** } *val --- value, if known. if unknown, val = (_val *)0 +** +** storeRef sref --- storage referred to by expression, of storeRef_null +** +** cstring etext --- to get nice error messages, punt for now! +*/ + +/* in exprNode_type: typedef struct _exprNode *exprNode; */ + +typedef enum +{ + XPR_PARENS, XPR_ASSIGN, XPR_CALL, XPR_EMPTY, XPR_VAR, + XPR_OP, XPR_POSTOP, XPR_PREOP, XPR_SIZEOFT, XPR_SIZEOF, XPR_ALIGNOFT, XPR_ALIGNOF, + XPR_OFFSETOF, XPR_CAST, XPR_FETCH, XPR_VAARG, XPR_ITER, + XPR_FOR, XPR_FORPRED, XPR_GOTO, XPR_CONTINUE, XPR_BREAK, + XPR_RETURN, XPR_NULLRETURN, XPR_COMMA, XPR_COND, XPR_IF, XPR_IFELSE, + XPR_DOWHILE, XPR_WHILE, XPR_STMT, XPR_STMTLIST, XPR_SWITCH, + XPR_INIT, XPR_FACCESS, XPR_ARROW, XPR_CONST, XPR_STRINGLITERAL, + XPR_NUMLIT, XPR_BODY, XPR_NODE, XPR_ITERCALL, XPR_TOK, + XPR_WHILEPRED, XPR_CASE, XPR_FTCASE, XPR_DEFAULT, XPR_FTDEFAULT, + XPR_BLOCK, XPR_INITBLOCK, XPR_LABEL +} exprKind; + +typedef struct _exprOffsetof +{ + /*@only@*/ qtype q; + /*@only@*/ cstringList field; +} *exprOffsetof; + +typedef struct _exprPair +{ + /*@only@*/ exprNode a; + /*@only@*/ exprNode b; +} *exprPair; + +typedef struct _exprTriple +{ + /*@only@*/ exprNode pred; + /*@only@*/ exprNode tbranch; + /*@only@*/ exprNode fbranch; +} *exprTriple; + +typedef struct _exprIter +{ + /*@dependent@*/ /*@observer@*/ uentry sname; + /*@only@*/ exprNodeList args; + /*@only@*/ exprNode body; + /*@dependent@*/ /*@observer@*/ uentry ename; +} *exprIter; + +typedef struct _exprCall +{ + /*@only@*/ exprNode fcn; + /*@only@*/ exprNodeList args; +} *exprCall; + +typedef struct _exprIterCall +{ + /*@dependent@*/ /*@exposed@*/ uentry iter; + /*@only@*/ exprNodeList args; +} *exprIterCall; + +typedef struct _exprOp +{ + /*@only@*/ exprNode a; + /*@only@*/ exprNode b; + lltok op; +} *exprOp; + +typedef struct _exprField +{ + /*@only@*/ exprNode rec; + /*@only@*/ cstring field; +} *exprField; + +typedef struct _exprUop +{ + /*@only@*/ exprNode a; + lltok op; +} *exprUop; + +typedef struct _exprCast +{ + /*@only@*/ exprNode exp; + lltok tok; + qtype q; +} *exprCast; + +typedef struct _exprInit +{ + /*@only@*/ exprNode exp; + idDecl id; +} *exprInit; + +typedef /*@null@*/ union _exprData +{ + cstring literal; + cstring id; + lltok *tok; + qtype qt; /* sizeof(type) */ + /* use for any 2-operator (comma, arrayFetch, case, stmt) */ + exprPair pair; + exprOp op; /* pair + operator */ + exprUop uop; + exprInit init; + exprIter iter; + exprCall call; + exprIterCall itercall; + exprCast cast; + exprNode single; + exprField field; + exprTriple triple; /* ifelse, ternary op, for pred */ + exprOffsetof offset; +} *exprData; + +/*@constant null exprData exprData_undefined; @*/ +# define exprData_undefined ((exprData) NULL) + +struct _exprNode +{ + bool isJumpPoint BOOLBITS; /* expr can be reached non-sequentially */ + bool canBreak BOOLBITS; /* expr can break (has break, continue) */ + bool mustBreak BOOLBITS; + + ctype typ; + exitkind exitCode; + + multiVal val; + /*@exposed@*/ sRef sref; + sRefSet uses; /* sRef's used by this expression */ + sRefSet sets; /* sRef's set by this expression */ + sRefSet msets; /* sRef's possibly set (implicit out params, etc.) */ + + guardSet guards; + exprKind kind; + + fileloc loc; + /*@relnull@*/ exprData edata; + cstring etext; +} ; + +/*@constant null exprNode exprNode_undefined; @*/ +# define exprNode_undefined ((exprNode)NULL) + +extern /*@falsenull@*/ bool exprNode_isDefined (exprNode p_e) /*@*/ ; +extern /*@unused@*/ /*@truenull@*/ bool exprNode_isUndefined (exprNode p_e) /*@*/ ; +extern /*@truenull@*/ bool exprNode_isError (exprNode p_e) /*@*/ ; + +# define exprNode_isDefined(e) ((e) != exprNode_undefined) +# define exprNode_isUndefined(e) ((e) == exprNode_undefined) +# define exprNode_isError(e) ((e) == exprNode_undefined) + +extern /*@dependent@*/ /*@exposed@*/ guardSet + exprNode_getGuards (/*@sef@*/ exprNode p_e) /*@*/ ; +# define exprNode_getGuards(e) \ + (exprNode_isDefined(e) ? (e)->guards : guardSet_undefined) + +extern ctype exprNode_getType (/*@sef@*/ exprNode p_e) /*@*/ ; +# define exprNode_getType(e) \ + (exprNode_isDefined(e) ? (e)->typ : ctype_unknown) + +extern /*@unused@*/ /*@falsenull@*/ bool exprNode_isInParens (/*@sef@*/ exprNode p_e) /*@*/ ; +# define exprNode_isInParens(e) \ + (exprNode_isDefined(e) && (e)->kind == XPR_PARENS) + +extern bool exprNode_isStringLiteral (/*@sef@*/ exprNode p_e); +# define exprNode_isStringLiteral(e) \ + (exprNode_isDefined(e) && (e)->kind == XPR_STRINGLITERAL) + +extern /*@unused@*/ bool exprNode_knownIntValue (/*@sef@*/ exprNode p_e) /*@*/ ; +# define exprNode_knownIntValue(e) \ + (exprNode_isDefined(e) && multiVal_isInt (exprNode_getValue (e))) + +extern /*@unused@*/ bool exprNode_knownStringValue (/*@sef@*/ exprNode p_e) /*@*/ ; +# define exprNode_knownStringValue(e) \ + (exprNode_isDefined(e) && multiVal_isString (exprNode_getValue (e))) + +extern bool exprNode_hasValue (/*@sef@*/ exprNode p_e) /*@*/ ; +# define exprNode_hasValue(e) \ + (exprNode_isDefined(e) && multiVal_isDefined (exprNode_getValue (e))) + +extern /*@exposed@*/ multiVal exprNode_getValue (exprNode p_e) /*@*/ ; + +extern /*@observer@*/ cstring exprNode_unparseFirst (exprNode p_e) /*@*/ ; +extern /*@observer@*/ guardSet exprNode_getForGuards (exprNode p_pred) /*@*/ ; +extern bool exprNode_isNullValue (exprNode p_e) /*@*/ ; +extern /*@exposed@*/ sRef exprNode_getSref (exprNode p_e) /*@*/ ; +extern /*@observer@*/ uentry exprNode_getUentry (exprNode p_e) + /*@globals internalState@*/ ; +extern void exprNode_produceGuards (exprNode p_pred) /*@modifies p_pred@*/ ; +extern /*@observer@*/ fileloc exprNode_loc (exprNode p_e) /*@*/ ; +extern exprNode + exprNode_charLiteral (char p_c, cstring p_text, /*@only@*/ fileloc p_loc) /*@*/ ; +extern /*@observer@*/ exprNode exprNode_makeMustExit (void) /*@*/ ; +extern exprNode + exprNode_cond (/*@keep@*/ exprNode p_pred, /*@keep@*/ exprNode p_ifclause, + /*@keep@*/ exprNode p_elseclause) /*@*/ ; +extern exprNode exprNode_makeError(void) /*@*/ ; + +extern exprNode exprNode_makeInitBlock (lltok p_brace, /*@only@*/ exprNodeList p_inits) /*@*/ ; + +extern exprNode exprNode_functionCall (/*@only@*/ exprNode p_f, + /*@only@*/ exprNodeList p_args) /*@*/ ; +extern /*@notnull@*/ exprNode + exprNode_fromIdentifier (/*@observer@*/ uentry p_c) /*@globals internalState@*/ ; +extern exprNode exprNode_fromUIO (cstring p_c) /*@globals internalState@*/ ; +extern exprNode exprNode_fieldAccess (/*@only@*/ exprNode p_s, /*@only@*/ cstring p_f) /*@*/ ; +extern exprNode exprNode_arrowAccess (/*@only@*/ exprNode p_s, /*@only@*/ cstring p_f) /*@*/ ; +extern exprNode exprNode_postOp (/*@only@*/ exprNode p_e, /*@only@*/ lltok p_op) + /*@modifies p_e@*/ ; +extern exprNode exprNode_preOp (/*@only@*/ exprNode p_e, /*@only@*/ lltok p_op) /*@*/ ; +extern exprNode exprNode_addParens (/*@only@*/ lltok p_lpar, /*@only@*/ exprNode p_e) /*@*/ ; +extern exprNode exprNode_offsetof (/*@only@*/ qtype p_qt, /*@only@*/ cstringList p_s) /*@*/ ; +extern exprNode exprNode_sizeofType (/*@only@*/ qtype p_qt) /*@*/ ; +extern exprNode exprNode_sizeofExpr (/*@only@*/ exprNode p_e) /*@*/ ; +extern exprNode exprNode_alignofType (/*@only@*/ qtype p_qt) /*@*/ ; +extern exprNode exprNode_alignofExpr (/*@only@*/ exprNode p_e) /*@*/ ; +extern exprNode + exprNode_op (/*@only@*/ exprNode p_e1, /*@keep@*/ exprNode p_e2, /*@only@*/ lltok p_op) /*@*/ ; +extern exprNode + exprNode_assign (/*@only@*/ exprNode p_e1, /*@only@*/ exprNode p_e2, /*@only@*/ lltok p_op) ; +extern exprNode + exprNode_arrayFetch (/*@only@*/ exprNode p_e1, /*@only@*/ exprNode p_e2) + /*@modifies p_e1, p_e2@*/ ; + +extern void exprNode_free (/*@only@*/ exprNode p_e) ; +extern exprNode + exprNode_vaArg (/*@only@*/ lltok p_tok, /*@only@*/ exprNode p_arg, /*@only@*/ qtype p_qt) + /*@globals internalState@*/ ; + +extern exprNode + exprNode_stringLiteral (/*@only@*/ cstring p_t, /*@only@*/ fileloc p_loc) /*@*/ ; +extern exprNode exprNode_comma (/*@only@*/ exprNode p_e1, /*@only@*/ exprNode p_e2) /*@*/ ; +extern exprNode exprNode_labelMarker (/*@only@*/ cstring p_label); +extern exprNode + exprNode_notReached (/*@returned@*/ exprNode p_stmt); + +extern +exprNode exprNode_caseMarker (/*@only@*/ exprNode p_test, bool p_fallThrough) /*@*/ ; + +extern exprNode exprNode_concat (/*@only@*/ exprNode p_e1, /*@only@*/ exprNode p_e2); +extern exprNode exprNode_createTok (/*@only@*/ lltok p_t) /*@*/ ; +extern exprNode exprNode_statement (/*@only@*/ exprNode p_e); +extern exprNode exprNode_makeBlock (/*@only@*/ exprNode p_e); +extern exprNode exprNode_if (/*@only@*/ exprNode p_pred, /*@only@*/ exprNode p_tclause); +extern exprNode + exprNode_ifelse (/*@only@*/ exprNode p_pred, /*@only@*/ exprNode p_tclause, + /*@only@*/ exprNode p_eclause); +extern exprNode exprNode_switch (/*@only@*/ exprNode p_e, /*@only@*/ exprNode p_s); +extern exprNode exprNode_while (/*@keep@*/ exprNode p_t, /*@keep@*/ exprNode p_b); +extern exprNode exprNode_doWhile (/*@only@*/ exprNode p_b, /*@only@*/ exprNode p_t); +extern /*@notnull@*/ /*@only@*/ exprNode exprNode_goto (/*@only@*/ cstring p_label); +extern exprNode exprNode_continue (/*@only@*/ lltok p_l, int p_qcontinue); +extern exprNode exprNode_break (/*@only@*/ lltok p_l, int p_bqual); +extern exprNode exprNode_nullReturn (/*@only@*/ lltok p_t); +extern exprNode exprNode_return (/*@only@*/ exprNode p_e); +extern /*@dependent@*/ /*@observer@*/ cstring + exprNode_unparse (exprNode p_e) /*@*/ ; + +extern bool exprNode_isCharLit (exprNode p_e) /*@*/ ; +extern bool exprNode_isNumLit (exprNode p_e) /*@*/ ; + +extern exprNode + exprNode_makeInitialization (/*@only@*/ idDecl p_t, /*@only@*/ exprNode p_e); +extern bool exprNode_matchType (ctype p_expected, exprNode p_e); + +extern /*@notnull@*/ /*@only@*/ exprNode + exprNode_defaultMarker (/*@only@*/ lltok p_def, bool p_fallThrough); + +extern exprNode + exprNode_iter (/*@observer@*/ uentry p_name, /*@only@*/ exprNodeList p_alist, + /*@only@*/ exprNode p_body, /*@observer@*/ uentry p_end); +extern exprNode exprNode_iterId (/*@observer@*/ uentry p_c); +extern exprNode exprNode_iterExpr (/*@returned@*/ exprNode p_e); +extern exprNode exprNode_iterNewId (/*@only@*/ cstring p_s); +extern exprNode + exprNode_iterStart (/*@observer@*/ uentry p_name, /*@only@*/ exprNodeList p_alist); +extern exprNode + exprNode_numLiteral (ctype p_c, /*@temp@*/ cstring p_t, + /*@only@*/ fileloc p_loc, long p_val); +extern void exprNode_initMod (void) /*@modifies internalState@*/ ; +extern exprNode exprNode_for (/*@keep@*/ exprNode p_inc, /*@keep@*/ exprNode p_body); +extern exprNode + exprNode_forPred (/*@only@*/ exprNode p_init, + /*@only@*/ exprNode p_test, /*@only@*/ exprNode p_inc); +extern exprNode + exprNode_floatLiteral (double p_d, ctype p_ct, + cstring p_text, /*@only@*/ fileloc p_loc); +extern /*@notnull@*/ exprNode exprNode_createId (/*@observer@*/ uentry p_c); +extern exprNode exprNode_cast (/*@only@*/ lltok p_tok, /*@only@*/ exprNode p_e, /*@only@*/ qtype p_q); +extern bool exprNode_matchLiteral (ctype p_expected, exprNode p_e); +extern void exprNode_checkUseParam (exprNode p_current); +extern void exprNode_checkSet (exprNode p_e, sRef p_s); +extern void exprNode_checkMSet (exprNode p_e, sRef p_s); +extern exprNode exprNode_checkExpr (/*@returned@*/ exprNode p_e); +extern bool exprNode_mustEscape (exprNode p_e); +extern bool exprNode_errorEscape (exprNode p_e); +extern bool exprNode_mayEscape (exprNode p_e); +extern exprNode exprNode_whilePred (/*@only@*/ exprNode p_test); +extern exprNode + exprNode_updateLocation (/*@returned@*/ exprNode p_e, /*@temp@*/ fileloc p_loc); +extern void exprNode_freeShallow (/*@only@*/ exprNode p_e); +extern void exprNode_destroyMod (void) /*@modifies internalState@*/ ; +extern bool exprNode_isAssign (exprNode p_e) /*@*/ ; + +/*@-exportlocal@*/ +extern bool exprNode_isDefaultMarker (exprNode p_e) /*@*/ ; +extern bool exprNode_isCaseMarker (exprNode p_e) /*@*/ ; +extern bool exprNode_isLabelMarker (exprNode p_e) /*@*/ ; +/*@=exportlocal@*/ + +# else +# error "Multiple include" +# endif + + + + + + + + + + + + + + + + + diff --git a/src/Headers/exprNodeList.h b/src/Headers/exprNodeList.h new file mode 100644 index 0000000..a596f3b --- /dev/null +++ b/src/Headers/exprNodeList.h @@ -0,0 +1,60 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef exprNodeList_H +# define exprNodeList_H + +typedef /*@only@*/ exprNode o_exprNode; + +abst_typedef struct _exprNodeList +{ + int nelements; + int nspace; + int current; + /*@reldef@*/ /*@relnull@*/ o_exprNode *elements; +} *exprNodeList; + +/*@iter exprNodeList_elements (sef exprNodeList s, yield exposed exprNode el); @*/ +# define exprNodeList_elements(x, m_el) \ + { int m_ind; exprNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { exprNode m_el = *(m_elements++); + +# define end_exprNodeList_elements }} + +extern int exprNodeList_size (exprNodeList p_s) /*@*/ ; +# define exprNodeList_size(s) ((s)->nelements) + +extern bool exprNodeList_isEmpty (exprNodeList p_s) /*@*/ ; +# define exprNodeList_isEmpty(s) (exprNodeList_size(s) == 0) + +extern /*@only@*/ exprNodeList exprNodeList_new(void); +extern /*@exposed@*/ exprNode exprNodeList_nth (exprNodeList p_args, int p_n) /*@*/ ; +extern exprNodeList exprNodeList_push (/*@returned@*/ exprNodeList p_args, + /*@only@*/ exprNode p_e) ; +extern /*@only@*/ exprNodeList exprNodeList_singleton (/*@only@*/ exprNode p_e) ; + +extern void exprNodeList_addh (exprNodeList p_s, /*@only@*/ exprNode p_el) ; + +extern void exprNodeList_reset (exprNodeList p_s) ; +extern void exprNodeList_advance (exprNodeList p_s) ; /* was "list_pointToNext" */ + +extern /*@only@*/ cstring exprNodeList_unparse (exprNodeList p_s) /*@*/ ; +extern void exprNodeList_free (/*@only@*/ exprNodeList p_s) ; +extern void exprNodeList_freeShallow (/*@only@*/ exprNodeList p_s); + +extern /*@observer@*/ exprNode exprNodeList_head (exprNodeList p_s) ; +extern /*@observer@*/ exprNode exprNodeList_current (exprNodeList p_s) /*@*/ ; + +extern /*@exposed@*/ exprNode exprNodeList_getN (exprNodeList p_s, int p_n) /*@*/ ; + +/*@constant int exprNodeListBASESIZE;@*/ +# define exprNodeListBASESIZE SMALLBASESIZE + +# endif + + + + diff --git a/src/Headers/exprNodeSList.h b/src/Headers/exprNodeSList.h new file mode 100644 index 0000000..154efd0 --- /dev/null +++ b/src/Headers/exprNodeSList.h @@ -0,0 +1,50 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef exprNodeSList_H +# define exprNodeSList_H + +/* +** like exprNodeList, except elements are dependent. +*/ + +typedef /*@dependent@*/ exprNode d_exprNode; + +abst_typedef struct _exprNodeSList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ d_exprNode *elements; +} *exprNodeSList; + +/*@iter exprNodeSList_elements (sef exprNodeSList x, yield exposed exprNode el); @*/ +# define exprNodeSList_elements(x, m_el) \ + { int m_ind; exprNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { exprNode m_el = *(m_elements++); + +# define end_exprNodeSList_elements }} + +extern /*@only@*/ exprNodeSList exprNodeSList_new(void); + +extern /*@only@*/ exprNodeSList exprNodeSList_singleton (/*@exposed@*/ /*@dependent@*/ exprNode p_e) ; + +extern /*@unused@*/ void + exprNodeSList_addh (exprNodeSList p_s, /*@exposed@*/ /*@dependent@*/ exprNode p_el); + +extern /*@only@*/ /*@unused@*/ cstring exprNodeSList_unparse (exprNodeSList p_s); +extern void exprNodeSList_free (/*@only@*/ exprNodeSList p_s) ; + +extern exprNodeSList + exprNodeSList_append (/*@returned@*/ exprNodeSList p_s1, /*@only@*/ exprNodeSList p_s2) ; + +/*@constant int exprNodeSListBASESIZE;@*/ +# define exprNodeSListBASESIZE SMALLBASESIZE + +# endif + + + + diff --git a/src/Headers/fcnNode.h b/src/Headers/fcnNode.h new file mode 100644 index 0000000..0cf7d80 --- /dev/null +++ b/src/Headers/fcnNode.h @@ -0,0 +1,23 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _fcnNode { + ltoken name; + /*@null@*/ lclTypeSpecNode typespec; + declaratorNode declarator; + globalList globals; + varDeclarationNodeList inits; + letDeclNodeList lets; + /*@null@*/ lclPredicateNode checks; + /*@null@*/ lclPredicateNode require; + /*@null@*/ modifyNode modify; + /*@null@*/ lclPredicateNode ensures; + /*@null@*/ lclPredicateNode claim; + qual special; +} *fcnNode; + +extern void fcnNode_free (/*@null@*/ /*@only@*/ fcnNode p_f); +extern /*@only@*/ cstring fcnNode_unparse (/*@null@*/ fcnNode p_f); diff --git a/src/Headers/fcnNodeList.h b/src/Headers/fcnNodeList.h new file mode 100644 index 0000000..489c894 --- /dev/null +++ b/src/Headers/fcnNodeList.h @@ -0,0 +1,60 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +# ifndef FCNNODELIST_H +# define FCNNODELIST_H + +typedef /*@only@*/ fcnNode o_fcnNode; + +abst_typedef /*@null@*/ struct _fcnNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_fcnNode *elements; +} *fcnNodeList; + +/*@iter fcnNodeList_elements (sef fcnNodeList x, yield exposed fcnNode el); @*/ +# define fcnNodeList_elements(x, m_el) \ + if (fcnNodeList_isDefined (x)) \ + { int m_ind; fcnNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { fcnNode m_el = *(m_elements++); + +# define end_fcnNodeList_elements }} + +/*@constant null fcnNodeList fcnNodeList_undefined; @*/ +# define fcnNodeList_undefined ((fcnNodeList)0) + +extern /*@falsenull@*/ bool fcnNodeList_isDefined (fcnNodeList p_f); +# define fcnNodeList_isDefined(f) ((f) != fcnNodeList_undefined) + +extern /*@unused@*/ /*@truenull@*/ bool + fcnNodeList_isUndefined (fcnNodeList p_f); +# define fcnNodeList_isUndefined(f) ((f) == fcnNodeList_undefined) + +extern int fcnNodeList_size (/*@sef@*/ fcnNodeList p_f); +extern bool fcnNodeList_isEmpty (/*@sef@*/ fcnNodeList p_f); + +# define fcnNodeList_size(s) (fcnNodeList_isDefined(s) ? (s)->nelements : 0) +# define fcnNodeList_isEmpty(s) (fcnNodeList_size(s) == 0) + +extern /*@only@*/ fcnNodeList fcnNodeList_new(void); +extern fcnNodeList fcnNodeList_add (/*@returned@*/ fcnNodeList p_s, /*@keep@*/ fcnNode p_el) ; + + +extern /*@unused@*/ /*@only@*/ cstring fcnNodeList_unparse (fcnNodeList p_s) ; +extern void fcnNodeList_free (/*@null@*/ /*@only@*/ fcnNodeList p_s) ; + +/*@constant int fcnNodeListBASESIZE;@*/ +# define fcnNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/fileId.h b/src/Headers/fileId.h new file mode 100644 index 0000000..ee37c52 --- /dev/null +++ b/src/Headers/fileId.h @@ -0,0 +1,35 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** fileId.h +*/ + +# ifndef fileId_H +# define fileId_H + +immut_typedef int fileId; + +/*@constant fileId fileId_invalid; @*/ +# define fileId_invalid -1 + +extern bool fileId_isValid (fileId) /*@*/ ; +# define fileId_isValid(f) ((f) > fileId_invalid) + +extern bool fileId_isInvalid (fileId) /*@*/ ; +# define fileId_isInvalid(f) ((f) == fileId_invalid) + +extern bool fileId_equal (fileId p_t1, fileId p_t2) /*@*/ ; +# define fileId_equal(t1,t2) ((t1) == (t2)) + +/* fileId_baseEqual moved to fileTable.h */ + +extern /*@unused@*/ int + fileId_compare (/*@sef@*/ fileId p_t1, /*@sef@*/ fileId p_t2) /*@*/ ; +# define fileId_compare(t1,t2) (int_compare (t1, t2)) + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/fileIdList.h b/src/Headers/fileIdList.h new file mode 100644 index 0000000..b1db483 --- /dev/null +++ b/src/Headers/fileIdList.h @@ -0,0 +1,51 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** fileIdList.h +*/ + +# ifndef FILEIDLIST_H +# define FILEIDLIST_H + +/*@access ctype fileId ctypeList@*/ +/*@+allmacros@*/ + +abst_typedef /*@null@*/ ctypeList fileIdList; + +extern /*@falsenull@*/ bool fileIdList_isDefined (fileIdList p_f); +# define fileIdList_isDefined(f) (ctypeList_isDefined (f)) + +/*@iter fileIdList_elements (sef fileIdList x, yield fileId el); @*/ +# define fileIdList_elements(x, m_el) \ + if (fileIdList_isDefined (x)) \ + { int m_ind; fileId *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { fileId m_el = *(m_elements++); + +# define end_fileIdList_elements }} + +extern fileIdList fileIdList_create (void); +# define fileIdList_create() ctypeList_new() + +extern bool fileIdList_isEmpty (/*@sef@*/ fileIdList p_f) /*@*/ ; + +extern void fileIdList_add (fileIdList p_f, fileId p_fid) /*@modifies p_f@*/; +# define fileIdList_add(f, el) ctypeList_addh((ctypeList)(f), (ctype)(el)) + +extern int fileIdList_size (/*@sef@*/ fileIdList p_f); +# define fileIdList_size(ft) ctypeList_size((ctypeList)(ft)) + +extern void fileIdList_free (/*@only@*/ fileIdList p_f) /*@modifies p_f@*/; +# define fileIdList_free(ft) ctypeList_free((ctypeList)(ft)) + +# define fileIdList_isEmpty(f) (fileIdList_size (f) == 0) +/*@noaccess ctype fileId ctypeList@*/ + +# else +# error "Multiple include" +# endif + + diff --git a/src/Headers/fileTable.h b/src/Headers/fileTable.h new file mode 100644 index 0000000..effa44c --- /dev/null +++ b/src/Headers/fileTable.h @@ -0,0 +1,118 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** fileTable.h +*/ + +# ifndef FILETABLE_H +# define FILETABLE_H + +/*@constant int FTBASESIZE; @*/ +# define FTBASESIZE 64 + +/* moved to fileloc.h +** typedef int fileId; +*/ + +typedef enum { FILE_NORMAL, FILE_LSLTEMP, FILE_NODELETE, + FILE_HEADER, FILE_MACROS } fileType; + +typedef struct _ftentry +{ + bool ftemp BOOLBITS; + bool fsystem BOOLBITS; + bool fspecial BOOLBITS; + cstring fname; + cstring basename; + fileType ftype; + fileId fder; +} *ftentry; + +typedef /*@only@*/ ftentry o_ftentry; + +abst_typedef /*@null@*/ struct _fileTable +{ + int nentries; + int nspace; + hashTable htable; + /*@reldef@*/ /*@only@*/ o_ftentry *elements; +} *fileTable ; + +/*@constant null fileTable fileTable_undefined; @*/ +# define fileTable_undefined ((fileTable) NULL) + +extern /*@unused@*/ /*@truenull@*/ bool + fileTable_isUndefined (/*@null@*/ fileTable p_f) /*@*/ ; +extern /*@unused@*/ /*@falsenull@*/ bool + fileTable_isDefined (/*@null@*/ fileTable p_f) /*@*/ ; + +# define fileTable_isUndefined(ft) ((ft) == fileTable_undefined) +# define fileTable_isDefined(ft) ((ft) != fileTable_undefined) +extern /*@observer@*/ cstring fileTable_getName (fileTable p_ft, fileId p_fid) /*@*/ ; +extern /*@observer@*/ cstring fileTable_getNameBase (fileTable p_ft, fileId p_fid) ; +extern fileId fileTable_addFile (fileTable p_ft, cstring p_name) + /*@modifies p_ft@*/ ; +extern fileId fileTable_addHeaderFile (fileTable p_ft, cstring p_name) + /*@modifies p_ft@*/ ; +extern fileId fileTable_addLibraryFile (fileTable p_ft, cstring p_name) + /*@modifies p_ft@*/ ; + +# ifndef NOLCL +extern fileId fileTable_addLCLFile (fileTable p_ft, cstring p_name) + /*@modifies p_ft@*/ ; + +extern fileId fileTable_addltemp (fileTable p_ft); + +# endif + +extern /*@notnull@*/ /*@only@*/ fileTable fileTable_create (void) /*@*/ ; +extern fileId fileTable_lookup (fileTable p_ft, cstring p_s) /*@*/ ; +extern fileId fileTable_addCTempFile (fileTable p_ft, fileId p_fid) + /*@modifies p_ft@*/ ; +extern fileId fileTable_addFileOnly (fileTable p_ft, /*@only@*/ cstring p_name) + /*@modifies p_ft@*/ ; + +# ifndef NOLCL +extern fileId fileTable_addImportFile (fileTable p_ft, cstring p_name) + /*@modifies p_ft@*/ ; +# endif + +extern fileId fileTable_addMacrosFile (fileTable p_ft) + /*@modifies p_ft@*/ ; +extern /*@observer@*/ cstring fileTable_getRootName (fileTable p_ft, fileId p_fid) /*@*/ ; +extern bool fileTable_isHeader (fileTable p_ft, fileId p_fid) /*@*/ ; +extern bool fileId_isHeader (fileId p_f) /*@*/ ; +# define fileId_isHeader(f) (fileTable_isHeader (context_fileTable(), f)) + +extern bool fileTable_sameBase (fileTable p_ft, fileId p_f1, fileId p_f2); +extern void fileTable_cleanup (fileTable p_ft) /*@modifies fileSystem@*/; +extern fileId fileTable_lookupBase (fileTable p_ft, cstring p_base) /*@modifies p_ft@*/ ; +extern void fileTable_printTemps (fileTable p_ft) /*@modifies g_msgstream@*/ ; +extern /*@unused@*/ /*@only@*/ cstring fileTable_unparse (fileTable p_ft) /*@*/ ; +extern bool fileTable_exists (fileTable p_ft, cstring p_s) /*@*/ ; +extern void fileTable_free (/*@only@*/ fileTable p_f); +extern bool fileTable_isSpecialFile (fileTable p_ft, fileId p_fid) /*@*/ ; +extern bool fileTable_isSystemFile (fileTable p_ft, fileId p_fid) /*@*/ ; + +/*@-czechfcns@*/ +extern /*@observer@*/ cstring fileName (fileId p_fid) /*@*/ ; +extern /*@observer@*/ cstring fileNameBase (fileId p_fid) /*@*/ ; +extern /*@observer@*/ cstring rootFileName (fileId p_fid) /*@*/ ; +/*@=czechfcns@*/ + +# define fileName(fid) (fileTable_getName(context_fileTable(), fid)) +# define fileNameBase(fid) (fileTable_getNameBase(context_fileTable(), fid)) +# define rootFileName(fid) (fileTable_getRootName(context_fileTable(), fid)) + +extern void fileTable_noDelete (fileTable, cstring); +extern bool fileId_baseEqual (/*@sef@*/ fileId p_t1, /*@sef@*/ fileId p_t2) /*@*/ ; +# define fileId_baseEqual(t1,t2) \ + (fileId_equal (t1, t2) || fileTable_sameBase (context_fileTable (), t1, t2)) + +# else +# error "Multiple include" +#endif + diff --git a/src/Headers/fileloc.h b/src/Headers/fileloc.h new file mode 100644 index 0000000..590353c --- /dev/null +++ b/src/Headers/fileloc.h @@ -0,0 +1,186 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** fileloc.h +*/ + +# ifndef FILELOC_H +# define FILELOC_H + +# include "fileId.h" + +typedef enum +{ + FL_NORMAL, FL_SPEC, FL_LIB, FL_STDLIB, FL_STDHDR, FL_IMPORT, FL_BUILTIN, + FL_PREPROC, FL_RC, FL_EXTERNAL +} flkind; + +struct __fileloc +{ + flkind kind; + fileId fid; + int lineno; + int column; +} ; + +/* typedef in forwardTypes */ +typedef /*@only@*/ fileloc o_fileloc; + +extern fileloc fileloc_update (/*@only@*/ fileloc p_old, fileloc p_fnew) + /*@modifies p_old@*/ ; + +extern fileloc fileloc_create (fileId p_fid, int p_line, int p_col) /*@*/ ; +extern bool fileloc_isSystemFile (fileloc p_f1) /*@*/ ; + +# ifndef NOLCL +extern fileloc fileloc_createSpec (fileId p_fid, int p_line, int p_col) /*@*/ ; +# endif + +extern fileloc fileloc_createLib (cstring p_ln) /*@*/ ; +extern fileloc fileloc_createRc (cstring p_name) /*@*/ ; +extern fileloc fileloc_decColumn (fileloc p_f, int p_x) /*@*/ ; +extern void fileloc_subColumn (fileloc p_f, int p_x) /*@modifies p_f@*/ ; +extern fileloc fileloc_getBuiltin (void) /*@*/ ; +extern /*@observer@*/ fileloc fileloc_observeBuiltin (void) /*@*/ ; +extern fileloc fileloc_createBuiltin (void) /*@*/ ; + +# ifndef NOLCL +extern fileloc fileloc_createImport (cstring p_fname, int p_lineno) /*@*/ ; +# endif + +extern bool fileloc_isSpecialFile (fileloc p_f) /*@*/ ; +extern bool fileloc_sameBaseFile (fileloc p_f1, fileloc p_f2) /*@*/ ; +extern /*@observer@*/ cstring fileloc_filename (fileloc p_f) /*@*/ ; +extern int fileloc_column (fileloc p_f) /*@*/ ; +extern cstring fileloc_unparse (fileloc p_f) /*@*/ ; +extern cstring fileloc_unparseRaw (cstring p_fname, int p_lineno) /*@*/ ; +extern cstring fileloc_unparseRawCol (cstring p_fname, int p_lineno, int p_col) /*@*/ ; +extern bool fileloc_sameFile (fileloc p_f1, fileloc p_f2) /*@*/ ; +extern void fileloc_free (/*@only@*/ fileloc p_f); +extern void fileloc_reallyFree (/*@only@*/ fileloc p_f); +extern int fileloc_lineno (fileloc p_f) /*@*/ ; +extern bool fileloc_equal (fileloc p_f1, fileloc p_f2) /*@*/ ; +extern bool fileloc_lessthan (fileloc p_f1, fileloc p_f2) /*@*/ ; +extern int fileloc_compare (fileloc p_f1, fileloc p_f2) /*@*/ ; +extern /*@observer@*/ cstring fileloc_getBase (fileloc p_f) /*@*/ ; +extern bool fileloc_isHeader (fileloc p_f) /*@*/ ; +extern bool fileloc_isSpec (fileloc p_f) /*@*/ ; +extern bool fileloc_isRealSpec (fileloc p_f) /*@*/ ; +extern fileloc fileloc_copy (fileloc p_f) /*@*/ ; +extern cstring fileloc_unparseDirect (fileloc p_fl) /*@*/ ; +extern bool fileloc_notAfter (fileloc p_f1, fileloc p_f2) /*@*/ ; +extern bool fileloc_almostSameFile (fileloc p_f1, fileloc p_f2) /*@*/ ; +extern fileloc fileloc_noColumn (fileloc p_f) /*@*/ ; +extern /*@observer@*/ fileloc fileloc_getExternal (void) /*@*/ ; +extern fileloc fileloc_createExternal (void) /*@*/ ; + +extern bool fileloc_isExternal (/*@sef@*/ fileloc p_f) /*@*/; +# define fileloc_isExternal(f) \ + (fileloc_isDefined(f) && ((f)->kind == FL_EXTERNAL)) + +extern /*@falsenull@*/ bool fileloc_isDefined (/*@null@*/ fileloc p_f) /*@*/ ; +extern /*@truenull@*/ bool fileloc_isUndefined (/*@null@*/ fileloc p_f) /*@*/ ; +extern bool fileloc_isInvalid (/*@sef@*/ /*@null@*/ fileloc p_f) /*@*/ ; + +/*@constant null fileloc fileloc_undefined; @*/ +# define fileloc_undefined ((fileloc)0) +# define fileloc_isDefined(f) ((f) != fileloc_undefined) +# define fileloc_isUndefined(f) ((f) == fileloc_undefined) +# define fileloc_isInvalid(f) (!(fileloc_isValid(f))) + +extern bool fileloc_isLib (fileloc p_f) /*@*/ ; +extern bool fileloc_isRealLib (fileloc p_f) /*@*/ ; + +# ifndef NOLCL +extern fileloc fileloc_fromTok (ltoken p_t) /*@*/ ; +# endif + +/*@constant int UNKNOWN_LINE; @*/ +# define UNKNOWN_LINE (0) + +/*@constant int UNKNOWN_COLUMN; @*/ +# define UNKNOWN_COLUMN (0) + +extern /*@unused@*/ bool fileloc_linenoDefined (/*@sef@*/ fileloc p_f) /*@*/ ; +extern /*@unused@*/ bool fileloc_columnDefined (/*@sef@*/ fileloc p_f) /*@*/ ; + +# define fileloc_linenoDefined(f) \ + (fileloc_isValid (f) && (f)->lineno != UNKNOWN_LINE) + +# define fileloc_columnDefined(f) \ + (fileloc_isValid (f) && (f)->column != UNKNOWN_COLUMN) + +# ifndef NOLCL +extern void fileloc_setColumnUndefined (/*@sef@*/ fileloc p_f) /*@modifies p_f@*/; +# define fileloc_setColumnUndefined(f) \ + (fileloc_isDefined(f) ? (f)->column = UNKNOWN_COLUMN : UNKNOWN_COLUMN) +# endif + +extern /*@falsenull@*/ bool fileloc_isValid (/*@sef@*/ fileloc p_f); +# define fileloc_isValid(f) \ + (fileloc_isDefined(f) && ((f)->lineno >= 0)) + +extern bool fileloc_isImport (/*@sef@*/ fileloc p_fl); +# define fileloc_isImport(fl) (fileloc_isDefined(fl) && (fl)->kind == FL_IMPORT) + +extern bool fileloc_isPreproc (/*@sef@*/ fileloc p_fl); +# define fileloc_isPreproc(fl) (fileloc_isDefined(fl) && (fl)->kind == FL_PREPROC) + +extern void fileloc_setLineno (/*@sef@*/ fileloc p_f, int p_i) /*@modifies p_f@*/ ; +# define fileloc_setLineno(fl, i) \ + (fileloc_isDefined(fl) ? ((fl)->lineno = (i), (fl)->column = 1) : (i)) + +extern void fileloc_nextLine (/*@sef@*/ fileloc p_f) /*@modifies p_f@*/ ; +# define fileloc_nextLine(fl) \ + (fileloc_isDefined(fl) ? ((fl)->lineno++, (fl)->column = 1) : 0) + +extern void fileloc_addLine (/*@sef@*/ fileloc p_f, int p_i) /*@modifies p_f@*/ ; +# define fileloc_addLine(fl, i) \ + (fileloc_isDefined(fl) ? ((fl)->lineno += (i), (fl)->column = 1) : (i)) + +extern fileId fileloc_fileId (/*@sef@*/ fileloc p_fl) /*@*/ ; +# define fileloc_fileId(fl) \ + (fileloc_isDefined (fl) ? (fl)->fid : fileId_invalid) + +extern void fileloc_setColumn (/*@sef@*/ fileloc p_fl, int p_i) /*@modifies p_fl@*/ ; +# define fileloc_setColumn(fl, i) \ + (fileloc_isDefined (fl) ? ((fl)->column = (i)) : (i)) + +extern void fileloc_addColumn (/*@sef@*/ fileloc p_fl, int p_i) /*@modifies p_fl@*/ ; +# define fileloc_addColumn(fl, i) \ + (fileloc_isDefined (fl) ? ((fl)->column += (i)) : (i)) + +extern void fileloc_incColumn (/*@sef@*/ fileloc p_fl) /*@modifies p_fl@*/ ; +# define fileloc_incColumn(fl) \ + (fileloc_isDefined (fl) ? ((fl)->column++) : 0) + +extern bool fileloc_isBuiltin (/*@sef@*/ fileloc p_fl) /*@*/ ; +# define fileloc_isBuiltin(fl) \ + (fileloc_isDefined (fl) && ((fl)->kind == FL_BUILTIN)) + +extern fileloc fileloc_updateFileId (/*@only@*/ fileloc p_old, fileId p_s) /*@*/ ; +extern fileloc fileloc_makePreproc (fileloc p_loc) /*@*/ ; +extern fileloc fileloc_makePreprocPrevious (fileloc p_loc) /*@*/ ; + +# ifndef NOLCL +extern bool fileloc_isStandardLibrary (fileloc p_f) /*@*/ ; +# endif + +extern bool fileloc_isStandardLib (fileloc p_f) /*@*/ ; +extern cstring fileloc_unparseFilename (fileloc p_f) /*@*/ ; +extern bool fileloc_withinLines (fileloc p_f1, fileloc p_f2, int p_n) /*@*/ ; +extern bool fileloc_isUser (fileloc p_f) /*@*/ ; +extern bool fileloc_sameModule (fileloc p_f1, fileloc p_f2) /*@*/ ; + +# else +# error "Multiple include" +# endif + + + + + + diff --git a/src/Headers/filelocList.h b/src/Headers/filelocList.h new file mode 100644 index 0000000..e4e1efa --- /dev/null +++ b/src/Headers/filelocList.h @@ -0,0 +1,67 @@ +/* +** filelocList.h (from slist_templace.h) +*/ + +# ifndef filelocLIST_H +# define filelocLIST_H + +abst_typedef /*@null@*/ struct _filelocList +{ + int nelements; + int free; + /*@reldef@*/ /*@relnull@*/ o_fileloc *elements; +} *filelocList ; + +extern /*@unused@*/ /*@truenull@*/ bool + filelocList_isUndefined (filelocList p_f) /*@*/ ; +extern /*@falsenull@*/ bool filelocList_isDefined (filelocList p_f); + +/*@constant null filelocList filelocList_undefined; @*/ +# define filelocList_undefined (NULL) +# define filelocList_isDefined(f) ((f) != filelocList_undefined) +# define filelocList_isUndefined(f) ((f) == filelocList_undefined) + +/*@iter filelocList_elements (sef filelocList x, yield exposed fileloc el); @*/ +# define filelocList_elements(x, m_el) \ + { if (filelocList_isDefined (x)) { \ + int m_ind; fileloc *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { fileloc m_el = *(m_elements++); + +# define end_filelocList_elements }}} + +extern int filelocList_realSize (filelocList p_s) /*@*/ ; + +extern int filelocList_size (/*@sef@*/ filelocList p_s) /*@*/ ; +# define filelocList_size(s) (filelocList_isDefined (s) ? (s)->nelements : 0) + +extern bool filelocList_isEmpty (/*@sef@*/ filelocList p_s); +# define filelocList_isEmpty(s) (filelocList_size(s) == 0) + +extern filelocList + filelocList_append (/*@returned@*/ filelocList p_s, /*@only@*/ filelocList p_t); +extern /*@only@*/ filelocList filelocList_new (void) /*@*/ ; +extern filelocList + filelocList_add (/*@returned@*/ filelocList p_s, /*@only@*/ fileloc p_el) + /*@modifies p_s@*/ ; + +extern filelocList + filelocList_addDifferentFile (/*@returned@*/ filelocList p_s, + fileloc p_where, fileloc p_loc) + /*@modifies p_s@*/ ; + +extern filelocList filelocList_addUndefined (/*@returned@*/ filelocList p_s) + /*@modifies p_s@*/ ; + +extern /*@only@*/ cstring filelocList_unparseUses (filelocList p_s); +extern /*@unused@*/ /*@only@*/ cstring filelocList_unparse (filelocList p_s) ; +extern void filelocList_free (/*@only@*/ filelocList p_s) ; + +/*@constant int filelocListBASESIZE;@*/ +# define filelocListBASESIZE MIDBASESIZE + +# endif + + + + diff --git a/src/Headers/filelocStack.h b/src/Headers/filelocStack.h new file mode 100644 index 0000000..60cc667 --- /dev/null +++ b/src/Headers/filelocStack.h @@ -0,0 +1,46 @@ +/* +** filelocStack.h (from slist_templace.h) +*/ + +# ifndef FILELOCSTACK_H +# define FILELOCSTACK_H + +abst_typedef /*@null@*/ struct _filelocStack +{ + int nelements; + int free; + /*@reldef@*/ /*@relnull@*/ o_fileloc *elements; +} *filelocStack ; + +/*@constant null filelocStack filelocStack_undefined; @*/ +# define filelocStack_undefined (NULL) + +extern /*@falsenull@*/ bool filelocStack_isDefined (filelocStack p_f) /*@*/ ; +# define filelocStack_isDefined(f) ((f) != filelocStack_undefined) + +extern int filelocStack_size (/*@sef@*/ filelocStack p_s) /*@*/ ; +# define filelocStack_size(s) (filelocStack_isDefined (s) ? (s)->nelements : 0) + +extern int filelocStack_includeDepth (filelocStack p_s); +extern void filelocStack_printIncludes (filelocStack p_s) /*@modifies g_msgstream@*/ ; + +extern void filelocStack_clear (filelocStack p_s) /*@modifies p_s@*/ ; + +extern /*@only@*/ filelocStack filelocStack_new (void) /*@*/ ; +extern /*@observer@*/ fileloc filelocStack_nextTop (filelocStack p_s) /*@*/ ; + +extern bool + filelocStack_popPushFile (filelocStack p_s, /*@only@*/ fileloc p_el) + /*@modifies p_s@*/ ; + +extern /*@unused@*/ /*@only@*/ cstring filelocStack_unparse (filelocStack p_s) /*@*/ ; +extern void filelocStack_free (/*@only@*/ filelocStack p_s) ; + +/*@constant int filelocStackBASESIZE;@*/ +# define filelocStackBASESIZE MIDBASESIZE + +# endif + + + + diff --git a/src/Headers/flagMarker.h b/src/Headers/flagMarker.h new file mode 100644 index 0000000..f21d72d --- /dev/null +++ b/src/Headers/flagMarker.h @@ -0,0 +1,83 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** invariant: line1 <= line2 +** if line1 == line2, col1 <= col2. +*/ + +# ifndef FLAGMARKER_H +# define FLAGMARKER_H + +typedef enum +{ + FMK_LOCALSET, + FMK_IGNOREON, + FMK_IGNORECOUNT, + FMK_IGNOREOFF, + FMK_SUPPRESS +} flagMarkerKind ; + +typedef struct _flagMarker +{ + flagMarkerKind kind; + flagcode code; + + /*@reldef@*/ union { + ynm set; + int nerrors; + } info; + + fileloc loc; +} *flagMarker ; + +extern bool flagMarker_isLocalSet (flagMarker p_c) /*@*/ ; +# define flagMarker_isLocalSet(c) ((c)->kind == FMK_LOCALSET) + +extern bool flagMarker_isSuppress (flagMarker p_c) /*@*/ ; +# define flagMarker_isSuppress(c) ((c)->kind == FMK_SUPPRESS) + +extern bool flagMarker_isIgnoreOn (flagMarker p_c) /*@*/ ; +# define flagMarker_isIgnoreOn(c) ((c)->kind == FMK_IGNOREON) + +extern bool flagMarker_isIgnoreOff (flagMarker p_c) /*@*/ ; +# define flagMarker_isIgnoreOff(c) ((c)->kind == FMK_IGNOREOFF) + +extern bool flagMarker_isIgnoreCount (flagMarker p_c) /*@*/ ; +# define flagMarker_isIgnoreCount(c) ((c)->kind == FMK_IGNORECOUNT) + +extern flagMarker + flagMarker_createLocalSet (flagcode p_code, ynm p_set, fileloc p_loc) /*@*/ ; + +extern flagMarker + flagMarker_createIgnoreOn (fileloc p_loc) /*@*/ ; + +extern flagMarker + flagMarker_createIgnoreOff (fileloc p_loc) /*@*/ ; + +extern flagMarker + flagMarker_createIgnoreCount (int p_count, fileloc p_loc) /*@*/ ; + +extern flagMarker + flagMarker_createSuppress (flagcode p_code, fileloc p_loc) /*@*/ ; + +extern void flagMarker_free (/*@only@*/ flagMarker p_c) ; + +extern bool flagMarker_sameFile (flagMarker p_c, fileloc p_loc) /*@*/ ; +extern /*@only@*/ cstring flagMarker_unparse (flagMarker p_c) /*@*/ ; + +extern bool flagMarker_beforeMarker (flagMarker p_c, fileloc p_loc) /*@*/ ; + +extern ynm flagMarker_getSet (flagMarker p_f) /*@*/ ; +extern flagcode flagMarker_getCode (flagMarker p_f) /*@*/ ; +extern int flagMarker_getCount (flagMarker p_f) /*@*/ ; + +extern /*@observer@*/ fileloc flagMarker_getLoc (flagMarker p_f) /*@*/ ; + +# define flagMarker_getLoc(f) ((f)->loc) + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/flagMarkerList.h b/src/Headers/flagMarkerList.h new file mode 100644 index 0000000..8bb24ab --- /dev/null +++ b/src/Headers/flagMarkerList.h @@ -0,0 +1,49 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** flagMarkerList.h +*/ + +# ifndef flagMarkerList_H +# define flagMarkerList_H + +typedef /*@only@*/ flagMarker o_flagMarker; + +abst_typedef struct _flagMarkerList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_flagMarker *elements; +} *flagMarkerList ; + +extern /*@only@*/ flagMarkerList flagMarkerList_new (void) /*@*/ ; + +extern /*@unused@*/ /*@only@*/ cstring + flagMarkerList_unparse (flagMarkerList p_s) /*@*/ ; +extern void flagMarkerList_free (/*@only@*/ flagMarkerList p_s) ; + +extern void flagMarkerList_add (flagMarkerList p_s, /*@only@*/ flagMarker p_fm) + /*@modifies p_s@*/ ; + +extern ynm + flagMarkerList_suppressError (flagMarkerList p_s, flagcode p_code, fileloc p_loc) /*@*/ ; + +extern void flagMarkerList_checkSuppressCounts (flagMarkerList p_s) + /*@modifies g_msgstream@*/ ; + +extern bool + flagMarkerList_inIgnore (flagMarkerList p_s, fileloc p_loc) /*@*/ ; + +/*@constant int flagMarkerListBASESIZE;@*/ +# define flagMarkerListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/flag_codes.gen b/src/Headers/flag_codes.gen new file mode 100644 index 0000000..3f6dda7 --- /dev/null +++ b/src/Headers/flag_codes.gen @@ -0,0 +1,395 @@ + FLG_ABSTRACTBOOL, + FLG_LIKELYBOOL, + FLG_IMPABSTRACT, + FLG_ACCESSALL, + FLG_ACCESSMODULE, + FLG_ACCESSFILE, + FLG_ACCESSCZECH, + FLG_ACCESSSLOVAK, + FLG_ACCESSCZECHOSLOVAK, + FLG_ABSTRACT, + FLG_MUTREP, + FLG_GLOBALIAS, + FLG_CHECKSTRICTGLOBALIAS, + FLG_CHECKEDGLOBALIAS, + FLG_CHECKMODGLOBALIAS, + FLG_UNCHECKEDGLOBALIAS, + FLG_ALIASUNIQUE, + FLG_MAYALIASUNIQUE, + FLG_MUSTNOTALIAS, + FLG_RETALIAS, + FLG_NOPARAMS, + FLG_OLDSTYLE, + FLG_GNUEXTENSIONS, + FLG_USEVARARGS, + FLG_WARNPOSIX, + FLG_EXITARG, + FLG_EVALORDER, + FLG_EVALORDERUNCON, + FLG_BOOLFALSE, + FLG_BOOLTYPE, + FLG_BOOLTRUE, + FLG_NOACCESS, + FLG_NOCOMMENTS, + FLG_UNRECOGCOMMENTS, + FLG_CONTINUECOMMENT, + FLG_NESTCOMMENT, + FLG_TMPCOMMENTS, + FLG_LINTCOMMENTS, + FLG_WARNLINTCOMMENTS, + FLG_DECLUNDEF, + FLG_SPECUNDEF, + FLG_SPECUNDECL, + FLG_LOOPEXEC, + FLG_CONTROL, + FLG_INFLOOPS, + FLG_INFLOOPSUNCON, + FLG_DEEPBREAK, + FLG_LOOPLOOPBREAK, + FLG_SWITCHLOOPBREAK, + FLG_LOOPSWITCHBREAK, + FLG_SWITCHSWITCHBREAK, + FLG_LOOPLOOPCONTINUE, + FLG_UNREACHABLE, + FLG_WHILEEMPTY, + FLG_WHILEBLOCK, + FLG_FOREMPTY, + FLG_FORBLOCK, + FLG_IFEMPTY, + FLG_IFBLOCK, + FLG_ALLEMPTY, + FLG_ALLBLOCK, + FLG_ELSEIFCOMPLETE, + FLG_NORETURN, + FLG_CASEBREAK, + FLG_MISSCASE, + FLG_FIRSTCASE, + FLG_GRAMMAR, + FLG_NOPP, + FLG_SHADOW, + FLG_INCONDEFSLIB, + FLG_WARNOVERLOAD, + FLG_NESTEDEXTERN, + FLG_REDECL, + FLG_REDEF, + FLG_INCONDEFS, + FLG_IMPTYPE, + FLG_MATCHFIELDS, + FLG_USEDEF, + FLG_IMPOUTS, + FLG_TMPDIR, + FLG_LARCHPATH, + FLG_LCLIMPORTDIR, + FLG_SYSTEMDIRS, + FLG_SKIPANSIHEADERS, + FLG_SKIPPOSIXHEADERS, + FLG_SYSTEMDIRERRORS, + FLG_SYSTEMDIREXPAND, + FLG_INCLUDEPATH, + FLG_SPECPATH, + FLG_QUIET, + FLG_USESTDERR, + FLG_SHOWSUMMARY, + FLG_SHOWSCAN, + FLG_STATS, + FLG_TIMEDIST, + FLG_SHOWUSES, + FLG_NOEFFECT, + FLG_NOEFFECTUNCON, + FLG_EXPORTANY, + FLG_EXPORTFCN, + FLG_EXPORTMACRO, + FLG_EXPORTTYPE, + FLG_EXPORTVAR, + FLG_EXPORTCONST, + FLG_EXPORTITER, + FLG_REPEXPOSE, + FLG_RETEXPOSE, + FLG_ASSIGNEXPOSE, + FLG_CASTEXPOSE, + FLG_LINELEN, + FLG_SHOWCOL, + FLG_PARENFILEFORMAT, + FLG_SHOWFUNC, + FLG_SHOWALLCONJS, + FLG_IMPCONJ, + FLG_EXPECT, + FLG_LCLEXPECT, + FLG_PARTIAL, + FLG_GLOBALS, + FLG_USEALLGLOBS, + FLG_INTERNALGLOBS, + FLG_INTERNALGLOBSNOGLOBS, + FLG_WARNMISSINGGLOBALS, + FLG_WARNMISSINGGLOBALSNOGLOBS, + FLG_GLOBUNSPEC, + FLG_ALLGLOBALS, + FLG_CHECKSTRICTGLOBALS, + FLG_IMPCHECKEDSPECGLOBALS, + FLG_IMPCHECKMODSPECGLOBALS, + FLG_IMPCHECKEDSTRICTSPECGLOBALS, + FLG_IMPCHECKEDGLOBALS, + FLG_IMPCHECKMODGLOBALS, + FLG_IMPCHECKEDSTRICTGLOBALS, + FLG_IMPCHECKEDSTATICS, + FLG_IMPCHECKMODSTATICS, + FLG_IMPCHECKMODINTERNALS, + FLG_IMPCHECKEDSTRICTSTATICS, + FLG_MODGLOBS, + FLG_MODGLOBSUNSPEC, + FLG_MODSTRICTGLOBSUNSPEC, + FLG_MODGLOBSUNCHECKED, + FLG_KEEP, + FLG_DOLH, + FLG_DOLCS, + FLG_SINGLEINCLUDE, + FLG_NEVERINCLUDE, + FLG_SKIPSYSHEADERS, + FLG_WARNFLAGS, + FLG_WARNUNIXLIB, + FLG_BADFLAG, + FLG_FORCEHINTS, + FLG_HELP, + FLG_HINTS, + FLG_RETVAL, + FLG_RETVALOTHER, + FLG_RETVALBOOL, + FLG_RETVALINT, + FLG_OPTF, + FLG_INIT, + FLG_NOF, + FLG_NEEDSPEC, + FLG_NEWDECL, + FLG_ITER, + FLG_HASYIELD, + FLG_DUMP, + FLG_MERGE, + FLG_NOLIB, + FLG_ANSILIB, + FLG_STRICTLIB, + FLG_UNIXLIB, + FLG_UNIXSTRICTLIB, + FLG_POSIXLIB, + FLG_POSIXSTRICTLIB, + FLG_WHICHLIB, + FLG_COMMENTCHAR, + FLG_ALLMACROS, + FLG_LIBMACROS, + FLG_SPECMACROS, + FLG_FCNMACROS, + FLG_CONSTMACROS, + FLG_MACROMATCHNAME, + FLG_MACRONEXTLINE, + FLG_MACROSTMT, + FLG_MACROEMPTY, + FLG_MACROPARAMS, + FLG_MACROASSIGN, + FLG_SEFPARAMS, + FLG_SEFUNSPEC, + FLG_MACROPARENS, + FLG_MACRODECL, + FLG_MACROFCNDECL, + FLG_MACROCONSTDECL, + FLG_MACROREDEF, + FLG_MACROUNDEF, + FLG_RETSTACK, + FLG_USERELEASED, + FLG_STRICTUSERELEASED, + FLG_COMPDEF, + FLG_COMPMEMPASS, + FLG_MUSTDEFINE, + FLG_UNIONDEF, + FLG_MEMIMPLICIT, + FLG_PARAMIMPTEMP, + FLG_ALLIMPONLY, + FLG_CODEIMPONLY, + FLG_SPECALLIMPONLY, + FLG_GLOBIMPONLY, + FLG_RETIMPONLY, + FLG_STRUCTIMPONLY, + FLG_SPECGLOBIMPONLY, + FLG_SPECRETIMPONLY, + FLG_SPECSTRUCTIMPONLY, + FLG_DEPARRAYS, + FLG_COMPDESTROY, + FLG_STRICTDESTROY, + FLG_MUSTFREE, + FLG_BRANCHSTATE, + FLG_STRICTBRANCHSTATE, + FLG_MEMCHECKS, + FLG_MEMTRANS, + FLG_EXPOSETRANS, + FLG_OBSERVERTRANS, + FLG_DEPENDENTTRANS, + FLG_NEWREFTRANS, + FLG_ONLYTRANS, + FLG_ONLYUNQGLOBALTRANS, + FLG_OWNEDTRANS, + FLG_FRESHTRANS, + FLG_SHAREDTRANS, + FLG_TEMPTRANS, + FLG_KEPTTRANS, + FLG_KEEPTRANS, + FLG_IMMEDIATETRANS, + FLG_REFCOUNTTRANS, + FLG_STATICTRANS, + FLG_UNKNOWNTRANS, + FLG_STATICINITTRANS, + FLG_UNKNOWNINITTRANS, + FLG_READONLYSTRINGS, + FLG_READONLYTRANS, + FLG_PASSUNKNOWN, + FLG_MODIFIES, + FLG_MUSTMOD, + FLG_MODOBSERVER, + FLG_MODOBSERVERUNCON, + FLG_MODINTERNALSTRICT, + FLG_MODFILESYSTEM, + FLG_MODUNSPEC, + FLG_MODNOMODS, + FLG_MODUNCON, + FLG_MODUNCONNOMODS, + FLG_GLOBALSIMPMODIFIESNOTHING, + FLG_MODIFIESIMPNOGLOBALS, + FLG_NAMECHECKS, + FLG_CZECH, + FLG_CZECHFUNCTIONS, + FLG_CZECHVARS, + FLG_CZECHMACROS, + FLG_CZECHCONSTANTS, + FLG_CZECHTYPES, + FLG_SLOVAK, + FLG_SLOVAKFUNCTIONS, + FLG_SLOVAKMACROS, + FLG_SLOVAKVARS, + FLG_SLOVAKCONSTANTS, + FLG_SLOVAKTYPES, + FLG_CZECHOSLOVAK, + FLG_CZECHOSLOVAKFUNCTIONS, + FLG_CZECHOSLOVAKMACROS, + FLG_CZECHOSLOVAKVARS, + FLG_CZECHOSLOVAKCONSTANTS, + FLG_CZECHOSLOVAKTYPES, + FLG_ANSIRESERVED, + FLG_CPPNAMES, + FLG_ANSIRESERVEDLOCAL, + FLG_DISTINCTEXTERNALNAMES, + FLG_EXTERNALNAMELEN, + FLG_EXTERNALNAMECASEINSENSITIVE, + FLG_DISTINCTINTERNALNAMES, + FLG_INTERNALNAMELEN, + FLG_INTERNALNAMECASEINSENSITIVE, + FLG_INTERNALNAMELOOKALIKE, + FLG_MACROVARPREFIX, + FLG_MACROVARPREFIXEXCLUDE, + FLG_TAGPREFIX, + FLG_TAGPREFIXEXCLUDE, + FLG_ENUMPREFIX, + FLG_ENUMPREFIXEXCLUDE, + FLG_FILESTATICPREFIX, + FLG_FILESTATICPREFIXEXCLUDE, + FLG_GLOBPREFIX, + FLG_GLOBPREFIXEXCLUDE, + FLG_TYPEPREFIX, + FLG_TYPEPREFIXEXCLUDE, + FLG_EXTERNALPREFIX, + FLG_EXTERNALPREFIXEXCLUDE, + FLG_LOCALPREFIX, + FLG_LOCALPREFIXEXCLUDE, + FLG_UNCHECKEDMACROPREFIX, + FLG_UNCHECKEDMACROPREFIXEXCLUDE, + FLG_CONSTPREFIX, + FLG_CONSTPREFIXEXCLUDE, + FLG_ITERPREFIX, + FLG_ITERPREFIXEXCLUDE, + FLG_DECLPARAMPREFIX, + FLG_DECLPARAMNAME, + FLG_DECLPARAMMATCH, + FLG_DECLPARAMPREFIXEXCLUDE, + FLG_CONTROLNESTDEPTH, + FLG_STRINGLITERALLEN, + FLG_NUMSTRUCTFIELDS, + FLG_NUMENUMMEMBERS, + FLG_INCLUDENEST, + FLG_ANSILIMITS, + FLG_NAME, + FLG_SPECIAL, + FLG_NULL, + FLG_NULLDEREF, + FLG_FCNDEREF, + FLG_NULLPASS, + FLG_NULLRET, + FLG_NULLSTATE, + FLG_NULLASSIGN, + FLG_BOOLCOMPARE, + FLG_REALCOMPARE, + FLG_POINTERARITH, + FLG_NULLPOINTERARITH, + FLG_PTRNUMCOMPARE, + FLG_STRICTOPS, + FLG_BITWISEOPS, + FLG_SHIFTSIGNED, + FLG_BOOLOPS, + FLG_PTRNEGATE, + FLG_SIZEOFTYPE, + FLG_SIZEOFFORMALARRAY, + FLG_FIXEDFORMALARRAY, + FLG_INCOMPLETETYPE, + FLG_FORMALARRAY, + FLG_PREDASSIGN, + FLG_PREDBOOL, + FLG_PREDBOOLINT, + FLG_PREDBOOLOTHERS, + FLG_PREDBOOLPTR, + FLG_DEFINE, + FLG_UNDEFINE, + FLG_GLOBSTATE, + FLG_SUPCOUNTS, + FLG_LIMIT, + FLG_SYNTAX, + FLG_TRYTORECOVER, + FLG_PREPROC, + FLG_TYPE, + FLG_FULLINITBLOCK, + FLG_ENUMMEMBERS, + FLG_MAINTYPE, + FLG_FORMATTYPE, + FLG_FORMATCODE, + FLG_FORWARDDECL, + FLG_ABSTVOIDP, + FLG_CASTFCNPTR, + FLG_CHARINDEX, + FLG_ENUMINDEX, + FLG_BOOLINT, + FLG_CHARINT, + FLG_ENUMINT, + FLG_FLOATDOUBLE, + FLG_IGNOREQUALS, + FLG_DUPLICATEQUALS, + FLG_IGNORESIGNS, + FLG_NUMLITERAL, + FLG_CHARINTLITERAL, + FLG_RELAXQUALS, + FLG_RELAXTYPES, + FLG_CHARUNSIGNEDCHAR, + FLG_MATCHANYINTEGRAL, + FLG_LONGUNSIGNEDINTEGRAL, + FLG_LONGINTEGRAL, + FLG_LONGUNSIGNEDUNSIGNEDINTEGRAL, + FLG_LONGSIGNEDINTEGRAL, + FLG_ZEROPTR, + FLG_REPEATUNRECOG, + FLG_SYSTEMUNRECOG, + FLG_UNRECOG, + FLG_TOPUNUSED, + FLG_EXPORTLOCAL, + FLG_EXPORTHEADER, + FLG_EXPORTHEADERVAR, + FLG_FIELDUNUSED, + FLG_ENUMMEMUNUSED, + FLG_CONSTUNUSED, + FLG_FUNCUNUSED, + FLG_PARAMUNUSED, + FLG_TYPEUNUSED, + FLG_VARUNUSED, + FLG_UNUSEDSPECIAL, diff --git a/src/Headers/flag_codes.h b/src/Headers/flag_codes.h new file mode 100644 index 0000000..188cdf1 --- /dev/null +++ b/src/Headers/flag_codes.h @@ -0,0 +1,43 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** flag_codes.h +*/ + +# ifndef FLAGCODES_H +# define FLAGCODES_H + +/* +** attempt to keep order consistent with that in flags.c +*/ + +typedef enum +{ + SKIP_FLAG = -2, + INVALID_FLAG = -1, +# include "flag_codes.gen" + LAST_FLAG +} flagcode; + +/*@constant flagcode NUMFLAGS; @*/ +# define NUMFLAGS (LAST_FLAG) + +/*@constant int NUMVALUEFLAGS; @*/ +# define NUMVALUEFLAGS 12 + +/*@constant int NUMSTRINGFLAGS; @*/ +# define NUMSTRINGFLAGS 21 + +/*@iter allFlagCodes (yield flagcode f); @*/ +# define allFlagCodes(m_code) \ + { /*@+enumint@*/ flagcode m_code; for (m_code = 0; m_code < NUMFLAGS; m_code++) \ + /*@=enumint@*/ { + +# define end_allFlagCodes }} + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/flags.h b/src/Headers/flags.h new file mode 100644 index 0000000..3d8df02 --- /dev/null +++ b/src/Headers/flags.h @@ -0,0 +1,105 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef FLAGS_H +# define FLAGS_H + + +typedef enum +{ + FK_ABSTRACT, FK_ANSI, FK_BEHAVIOR, + FK_COMMENTS, FK_COMPLETE, FK_CONTROL, FK_DEBUG, FK_DECL, + FK_DEF, FK_DIRECT, FK_DISPLAY, FK_EFFECT, FK_EXPORT, + FK_EXPOSURE, FK_FORMAT, FK_GLOBAL, FK_GLOBALS, FK_HEADERS, + FK_HELP, FK_IGNORERET, FK_INIT, FK_ITER, FK_LIBS, FK_LIMITS, + FK_MACROS, FK_MEMORY, FK_MODIFIES, FK_NAMES, FK_NONE, + FK_NULL, FK_OPS, FK_PRED, FK_PREPROC, FK_SECRET, + FK_SUPPRESS, FK_SYNTAX, FK_TYPE, FK_TYPEEQ, FK_NUMBERS, + FK_POINTER, FK_UNRECOG, FK_USE, FK_BOOL, FK_ALIAS, + FK_PROTOS, FK_SPEC, + FK_IMPLICIT, FK_FILES, FK_ERRORS, FK_UNSPEC, + FK_SPEED, FK_PARAMS, FK_DEAD, + FK_LEAK, FK_ARRAY, FK_OBSOLETE, FK_PREFIX +} flagkind; + +extern void listAllCategories (void); +extern void printAlphaFlags (void); +extern void printAllFlags (bool p_desc, bool p_full); + +extern void flagcode_recordError (flagcode p_f); +extern void flagcode_recordSuppressed (flagcode p_f); +extern int flagcode_numReported (flagcode p_f); +extern bool flagcode_isNamePrefixFlag (flagcode p_f); + +extern /*@only@*/ cstring describeFlag (cstring p_flagname); +extern flagcode identifyFlag (cstring p_s); +extern void setValueFlag (flagcode p_opt, cstring p_arg); +extern void setStringFlag (flagcode p_opt, /*@only@*/ cstring p_arg); + +extern /*@observer@*/ cstring flagcode_name (flagcode p_code) /*@*/ ; +extern int flagcode_valueIndex (flagcode p_f) /*@*/ ; +extern int flagcode_stringIndex (flagcode p_f) /*@*/ ; +extern /*@observer@*/ cstring flagcode_unparse (flagcode p_f) /*@*/ ; +# define flagcode_unparse flagcode_name + +extern /*@observer@*/ cstring flagcodeHint (flagcode p_f); + +extern flagkind identifyCategory (cstring p_s) /*@*/ ; +extern void printCategory (flagkind p_kind) /*@modifies g_msgstream@*/ ; + +extern bool flagcode_isInvalid (flagcode p_f); +# define flagcode_isInvalid(f) ((f) == INVALID_FLAG) + +extern bool flagcode_isSkip (flagcode p_f); +# define flagcode_isSkip(f) ((f) == SKIP_FLAG) + +extern bool flagcode_isValid (flagcode p_f); +# define flagcode_isValid(f) ((f) != INVALID_FLAG) + +extern bool flagcode_isPassThrough (/*@sef@*/ flagcode p_f); +# define flagcode_isPassThrough(f) ((f) == FLG_DEFINE || (f) == FLG_UNDEFINE) + +extern bool flagcode_isLibraryFlag (/*@sef@*/ flagcode p_f); +# define flagcode_isLibraryFlag(f) \ + ((f) == FLG_POSIXLIB || (f) == FLG_POSIXSTRICTLIB \ + || (f) == FLG_UNIXLIB || (f) == FLG_UNIXSTRICTLIB \ + || (f) == FLG_STRICTLIB || (f) == FLG_NOLIB \ + || (f) == FLG_ANSILIB) + +extern bool flagcode_hasValue (flagcode p_f); +extern bool flagcode_hasString (flagcode p_f); +extern bool flagcode_hasArgument (flagcode p_f); + +/*@constant observer cstring DEFAULT_MODE;@*/ +# define DEFAULT_MODE (cstring_makeLiteralTemp ("standard")) + +extern void flags_initMod (void); + +extern bool isMode (cstring p_s); +extern /*@only@*/ cstring describeModes (void); +extern void summarizeErrors (void); + +extern bool flagcode_isNameChecksFlag (flagcode p_f); +extern bool flagcode_isIdemFlag (flagcode p_f); +extern bool flagcode_isModeFlag (flagcode p_f); +extern bool flagcode_isSpecialFlag (flagcode p_f); +extern bool flagcode_isGlobalFlag (flagcode p_f); + +# else +# error "Multiple include" +# endif + + + + + + + + + + + + + diff --git a/src/Headers/forwardTypes.h b/src/Headers/forwardTypes.h new file mode 100644 index 0000000..1da3ef0 --- /dev/null +++ b/src/Headers/forwardTypes.h @@ -0,0 +1,44 @@ +# ifndef FORWARDTYPES_H +# define FORWARDTYPES_H + +# ifndef NOLCL +# include "lclForwardTypes.h" +# endif + +abst_typedef /*@dependent@*/ /*@null@*/ struct _sRef *sRef; +abst_typedef /*@null@*/ struct _uentry *uentry; +immut_typedef int typeIdSet; +typedef /*@only@*/ uentry o_uentry; +abst_typedef /*@null@*/ struct _idDecl *idDecl; +abst_typedef /*@null@*/ struct _usymtab *usymtab; +abst_typedef /*@null@*/ struct _exprNode *exprNode; +abst_typedef /*@null@*/ struct _guardSet *guardSet; +abst_typedef /*@null@*/ struct _sRefSet *sRefSet; +abst_typedef /*@null@*/ struct _aliasTable *aliasTable; +abst_typedef /*@null@*/ struct __fileloc *fileloc; + +/*@-cppnames@*/ +typedef int bool; +/*@=cppnames@*/ + +abst_typedef /*@null@*/ char *cstring; +typedef /*@only@*/ cstring o_cstring; + +immut_typedef int ctype; + +/* sRef -> bool */ +typedef bool (*sRefTest) (sRef); + +/* sRef, fileloc -> void, modifies sRef */ +typedef void (*sRefMod) (sRef, fileloc); + +/* sRef -> void */ +typedef void (*sRefShower) (sRef); + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/general.h b/src/Headers/general.h new file mode 100644 index 0000000..39cf84f --- /dev/null +++ b/src/Headers/general.h @@ -0,0 +1,102 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +# ifndef GENERAL_H +# define GENERAL_H + +/* sgi's don't let you undef NULL */ +# ifndef IRIX +# ifdef NULL +# undef NULL +# endif +# endif + +# include "forwardTypes.h" + +# ifdef USEDMALLOC +# define sfree(x) do { if (x != NULL) free(x); } while (FALSE) +# else +extern void sfree (/*@out@*/ /*@only@*/ /*@null@*/ void *p_x) /*@modifies *p_x@*/; +# endif + +# include "misc.h" +# include "cstring.h" +# include "bool.h" + +# define getStringWord(s) (cstring_fromChars(getWord(s))) + +extern /*@out@*/ /*@only@*/ void *dimalloc (size_t p_size, char *p_name, int p_line); +extern /*@only@*/ void *dicalloc (size_t p_num, size_t p_size, char *p_name, int p_line); +extern /*@notnull@*/ /*@out@*/ /*@only@*/ void * + direalloc (/*@returned@*/ /*@only@*/ /*@out@*/ /*@null@*/ void *p_x, + size_t p_size, char *p_name, int p_line); + +extern /*@only@*/ void * + drealloc (/*@special@*/ /*@null@*/ /*@sef@*/ void *p_x, + /*@sef@*/ size_t p_size) + /*@releases p_x@*/ + /*@modifies *p_x@*/ ; + +extern /*@out@*/ /*@only@*/ void *dmalloc (/*@sef@*/ size_t p_size) /*@*/ ; + +# ifdef USEDMALLOC +# define dmalloc(s) (malloc(s)) +# define drealloc(s,l) (realloc(s,l)) +# else +# define dmalloc(s) (dimalloc(s, __FILE__, __LINE__)) +# define drealloc(s,l) (direalloc(s, l, __FILE__, __LINE__)) +# endif + +# include "system_constants.h" + +# ifdef USEGC +# include +# define NOFREE +# define free(s) ; /* nothing */ +# else +# endif + +# ifdef USEDMALLOC +# include "dmalloc.h" +# endif + +/* +** no file except general.c should use primitive +** memory operations: +*/ + +/*@-exportlocal@*/ +# ifndef USEDMALLOC +# undef malloc +# undef realloc +# undef calloc +# define malloc(s) (dimalloc(s, __FILE__, __LINE__)) +# define calloc(n, s) (dicalloc(n, s, __FILE__, __LINE__)) +# define realloc(v, s) (direalloc(v, s, __FILE__, __LINE__)) +# endif +/*@=exportlocal@*/ + +# ifndef NULL +# define NULL 0 +# endif + +extern void sfreeEventually (/*@owned@*/ /*@null@*/ void *p_x) + /*@modifies internalState@*/; + +typedef /*@dependent@*/ char *d_char; + +/*@constant int NOT_FOUND;@*/ +# define NOT_FOUND (-23) + +# else +# error "Multiple include" +# endif + + + + + + diff --git a/src/Headers/globSet.h b/src/Headers/globSet.h new file mode 100644 index 0000000..3364d85 --- /dev/null +++ b/src/Headers/globSet.h @@ -0,0 +1,58 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** globSet.h +** +** based on set_template.h +*/ + +# ifndef globSet_H +# define globSet_H + +abst_typedef sRefSet globSet; + +/*@iter globSet_allElements (sef globSet s, yield exposed sRef el); @*/ +# define globSet_allElements(x, m_el) sRefSet_allElements(x, m_el) +# define end_globSet_allElements end_sRefSet_allElements + +extern int globSet_size (/*@sef@*/ globSet p_s); +# define globSet_size(s) (sRefSet_size (s)) + +extern bool globSet_isEmpty (/*@sef@*/ globSet p_s); +# define globSet_isEmpty(s) (globSet_size (s) == 0) + +extern /*@only@*/ globSet globSet_new (void) /*@*/ ; +extern globSet globSet_insert (/*@returned@*/ globSet p_s, sRef p_el) + /*@modifies p_s@*/ ; +extern bool globSet_member (globSet p_s, sRef p_el) /*@*/ ; +extern /*@exposed@*/ sRef globSet_lookup (globSet p_s, sRef p_el) /*@*/ ; +extern void globSet_free (/*@only@*/ /*@only@*/ globSet p_s); +extern /*@only@*/ cstring globSet_unparse (globSet p_ll) /*@*/ ; +extern /*@only@*/ cstring globSet_dump (globSet) /*@*/ ; +extern /*@only@*/ globSet globSet_undump (char **p_s) /*@modifies *p_s@*/ ; +extern globSet + globSet_copy (/*@returned@*/ globSet p_s1, /*@exposed@*/ globSet p_s2) + /*@modifies p_s1@*/ ; + +extern /*@only@*/ globSet globSet_newCopy (globSet p_s) /*@*/ ; +extern bool globSet_hasStatic (globSet p_s) /*@*/ ; + +extern int globSet_compare (globSet p_l1, globSet p_l2); +extern void globSet_clear (globSet p_g); + +/*@constant null globSet globSet_undefined;@*/ +# define globSet_undefined sRefSet_undefined + +extern /*@falsenull@*/ bool globSet_isDefined (/*@null@*/ globSet p_s) /*@*/ ; +extern /*@truenull@*/ bool globSet_isUndefined (/*@null@*/ globSet p_s) /*@*/ ; + +# define globSet_isDefined(s) (sRefSet_isDefined (s)) +# define globSet_isUndefined(s) (sRefSet_isUndefined (s)) + +# else +# error "Multiple include" +# endif + diff --git a/src/Headers/globalList.h b/src/Headers/globalList.h new file mode 100644 index 0000000..5db6f16 --- /dev/null +++ b/src/Headers/globalList.h @@ -0,0 +1,12 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +typedef varDeclarationNodeList globalList ; + +extern /*@unused@*/ cstring globalList_unparse (globalList p_s); +extern void globalList_free (/*@only@*/ globalList p_s); + +# define globalList_free(s) (varDeclarationNodeList_free (s)) +# define globalList_unparse(s) (varDeclarationNodeList_unparse(s)) diff --git a/src/Headers/globals.h b/src/Headers/globals.h new file mode 100644 index 0000000..c2a7572 --- /dev/null +++ b/src/Headers/globals.h @@ -0,0 +1,123 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef GLOBALS_H +# define GLOBALS_H + +extern /*@owned@*/ fileloc g_currentloc; + +/* stream for error messages */ +extern FILE *g_msgstream; + +/*@-ansireserved@*/ +/* This macro is defined by flex. */ +/*@constant external int ECHO@*/ +/*@=ansireserved@*/ + +/*@-redecl@*/ +/*@-incondefs@*/ +/*@-namechecks@*/ +extern /*@dependent@*/ FILE *yyin; +extern /*@dependent@*/ FILE *yyout; +extern int yyleng; +/*@=incondefs@*/ + +# ifdef WIN32 +extern int yywrap (void) /*@*/ ; +# endif + +extern int yydebug; +/*@=redecl@*/ +/*@=namechecks@*/ + +extern /*@observer@*/ cstring g_codeFile; +extern int g_codeLine; + +extern /*@observer@*/ cstring g_prevCodeFile; +extern int g_prevCodeLine; + +extern /*@observer@*/ char *g_localSpecPath; + +# ifndef NOLCL +extern /*@only@*/ cstring g_currentSpec; +extern /*@null@*/ /*@only@*/ char *g_currentSpecName; +# endif + +extern void setCodePoint (void); +# define setCodePoint() \ + (g_prevCodeFile = g_codeFile, g_prevCodeLine = g_codeLine, \ + g_codeFile = cstring_makeLiteralTemp (__FILE__), g_codeLine = __LINE__) + +extern void printCodePoint (void); + +extern fileId currentFile (void) /*@globals g_currentloc; @*/ ; +# define currentFile() (fileloc_fileId (g_currentloc)) + +extern int currentColumn (void) /*@globals g_currentloc; @*/ ; +# define currentColumn() (fileloc_column(g_currentloc)) + +extern void incColumn (void) + /*@globals fileloc g_currentloc; @*/ + /*@modifies g_currentloc@*/ ; +# define incColumn() (fileloc_incColumn(g_currentloc)) + +extern void decColumn (void) + /*@globals fileloc g_currentloc; @*/ + /*@modifies g_currentloc@*/ ; +# define decColumn() (fileloc_addColumn(g_currentloc, -1)) + +extern void incLine (void) + /*@globals fileloc g_currentloc; @*/ + /*@modifies g_currentloc; @*/ ; +# define incLine() (fileloc_nextLine(g_currentloc)) + +extern void decLine (void) + /*@globals fileloc g_currentloc; @*/ + /*@modifies g_currentloc; @*/ ; +# define decLine() (fileloc_addLine (g_currentloc, -1)) + +extern void beginLine (void) + /*@globals fileloc g_currentloc; @*/ + /*@modifies g_currentloc; @*/ ; +# define beginLine() (fileloc_setColumn(g_currentloc, 1)) + +extern void addColumn (int p_n) + /*@globals fileloc g_currentloc; @*/ + /*@modifies g_currentloc; @*/ ; +# define addColumn(n) (fileloc_addColumn(g_currentloc, n)) + +extern void setLine (int p_n) + /*@globals fileloc g_currentloc; @*/ + /*@modifies g_currentloc; @*/ ; +# define setLine(n) (fileloc_setLineno(g_currentloc, n)) + +extern void setColumn (int p_n) + /*@globals fileloc g_currentloc; @*/ + /*@modifies g_currentloc; @*/ ; +# define setColumn(n) (fileloc_setColumn(g_currentloc, n)) + +# ifndef NOLCL +extern void setSpecFileId (fileId p_s) + /*@globals fileloc g_currentloc; @*/ + /*@modifies g_currentloc; @*/ ; +# define setSpecFileId(s) \ + (fileloc_reallyFree (g_currentloc), g_currentloc = fileloc_createSpec (s, 1, 1)) +# endif + +extern void setFileLine (fileId p_s, int p_line) + /*@globals fileloc g_currentloc; @*/ + /*@modifies g_currentloc; @*/ ; +# define setFileLine(s, line) \ + (context_setFilename(s, line)) + +# else +# error "Multiple include" +# endif + + + + + + diff --git a/src/Headers/gram.h b/src/Headers/gram.h new file mode 100644 index 0000000..2b397d4 --- /dev/null +++ b/src/Headers/gram.h @@ -0,0 +1,9 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +# include "llgrammar.h" + + diff --git a/src/Headers/guardSet.h b/src/Headers/guardSet.h new file mode 100644 index 0000000..9678cde --- /dev/null +++ b/src/Headers/guardSet.h @@ -0,0 +1,61 @@ +/* +** guardSet.h +*/ + +# ifndef GUARDSET_H +# define GUARDSET_H + +/* +** guardSet is usually empty, so allow NULL to represent this. +*/ + +/* in forwardTypes: typedef struct _guardSet *guardSet; */ + +/*@null@*/ struct _guardSet +{ + /*@only@*/ sRefSet tguard; /* guarded on true branch */ + /*@only@*/ sRefSet fguard; /* guarded on false branch */ +} ; + +/*@constant null guardSet guardSet_undefined;@*/ +# define guardSet_undefined ((guardSet)NULL) + +extern /*@falsenull@*/ /*@unused@*/ bool + guardSet_isDefined (guardSet p_g) /*@*/ ; +# define guardSet_isDefined(g) ((g) != guardSet_undefined) + +extern /*@falsenull@*/ bool guardSet_isEmpty (guardSet p_g); + +extern /*@only@*/ guardSet guardSet_new (void); +extern guardSet guardSet_addTrueGuard (/*@returned@*/ guardSet p_g, sRef p_s); +extern guardSet guardSet_addFalseGuard (/*@returned@*/ guardSet p_g, sRef p_s); +extern guardSet guardSet_or (/*@returned@*/ /*@unique@*/ guardSet p_s, guardSet p_t); +extern guardSet guardSet_and (/*@returned@*/ /*@unique@*/ guardSet p_s, guardSet p_t); +extern void guardSet_delete (guardSet p_g, sRef p_s) /*@modifies p_g@*/ ; +extern /*@only@*/ cstring guardSet_unparse (guardSet p_g); +extern void guardSet_free (/*@only@*/ /*@only@*/ guardSet p_g); +extern /*@dependent@*/ /*@exposed@*/ sRefSet + guardSet_getTrueGuards (guardSet p_g) /*@*/ ; +extern /*@dependent@*/ /*@exposed@*/ sRefSet + guardSet_getFalseGuards (guardSet p_g) /*@*/ ; +extern guardSet guardSet_union (/*@only@*/ guardSet p_s, guardSet p_t) + /*@modifies p_s@*/ ; +extern /*@only@*/ guardSet guardSet_invert (/*@temp@*/ guardSet p_g) /*@*/ ; +extern /*@only@*/ guardSet guardSet_copy (/*@temp@*/ guardSet p_g) /*@*/ ; +extern bool guardSet_isGuarded (guardSet p_g, sRef p_s) /*@*/ ; +extern bool guardSet_isProbableNull (guardSet p_g, sRef p_s) /*@*/ ; + +extern guardSet + guardSet_levelUnion (/*@only@*/ guardSet p_s, + guardSet p_t, int p_lexlevel) + /*@modifies p_s@*/ ; +extern guardSet + guardSet_levelUnionFree (/*@returned@*/ /*@unique@*/ guardSet p_s, + /*@only@*/ guardSet p_t, int p_lexlevel) + /*@modifies p_t, p_s@*/ ; + +extern void guardSet_flip (guardSet p_g); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/handle.h b/src/Headers/handle.h new file mode 100644 index 0000000..5ad3ebf --- /dev/null +++ b/src/Headers/handle.h @@ -0,0 +1,7 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +typedef long unsigned Handle; + diff --git a/src/Headers/hashTable.h b/src/Headers/hashTable.h new file mode 100644 index 0000000..bf50fce --- /dev/null +++ b/src/Headers/hashTable.h @@ -0,0 +1,68 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** hashTable.h +*/ + +# ifndef HTABLE_H +# define HTABLE_H + +/*@constant int HBUCKET_BASESIZE; @*/ +# define HBUCKET_BASESIZE 2 + +/*@constant int HBUCKET_DNE; @*/ +# define HBUCKET_DNE NOT_FOUND + +typedef struct _hashTable *hashTable ; + +typedef struct _hentry +{ + /*@dependent@*/ cstring key; + int val; +} hentry; + +typedef /*@null@*/ struct _hbucket +{ + int size; + int nspace; + /*@only@*/ hentry *entries; +} *hbucket; + +typedef /*@only@*/ hbucket o_hbucket; + +struct _hashTable +{ + int size; + int nentries; + /*@only@*/ o_hbucket *buckets; +} ; + + +extern /*@only@*/ hashTable hashTable_create(int p_size); +extern void hashTable_insert (hashTable p_h, cstring p_key, int p_value); +extern int hashTable_lookup (hashTable p_h, cstring p_key); +extern /*@unused@*/ /*@only@*/ cstring hashTable_stats(hashTable p_h); +extern void hashTable_free (/*@only@*/ hashTable p_h); +extern void hashTable_remove (hashTable p_h, cstring p_key) /*@modifies p_h@*/ ; +extern void + hashTable_replaceKey (hashTable p_h, cstring p_oldkey, /*@dependent@*/ cstring p_newkey); + +# else +# error "Multiple include" +# endif + + + + + + + + + + + + + diff --git a/src/Headers/herald.h b/src/Headers/herald.h new file mode 100644 index 0000000..c63bb59 --- /dev/null +++ b/src/Headers/herald.h @@ -0,0 +1,7 @@ +/* herald.h - created automatically by gmake updateversion */ +/*@constant observer char *LCL_VERSION;@*/ +# define LCL_VERSION "LCLint 2.5m --- 20 May 2000" +/*@constant observer char *LCL_PARSE_VERSION;@*/ +# define LCL_PARSE_VERSION "LCLint 2.5m" +/*@constant observer char *LCL_COMPILE;@*/ +# define LCL_COMPILE "Compiled using gcc -DSTDC_HEADERS=1 on FreeBSD shankly.cs.virginia.edu 3.2-RELEASE FreeBSD 3.2-RELEASE #0: Tue May 18 04:05:08 GMT 1999 jkh@cathair:/usr/src/sys/compile/GENERIC i386 by evans" diff --git a/src/Headers/herald.last b/src/Headers/herald.last new file mode 100644 index 0000000..d20494e --- /dev/null +++ b/src/Headers/herald.last @@ -0,0 +1,7 @@ +/* herald.h - created automatically by gmake updateversion */ +/*@constant observer char *LCL_VERSION;@*/ +# define LCL_VERSION "LCLint 2.5m --- 20 May 2000" +/*@constant observer char *LCL_PARSE_VERSION;@*/ +# define LCL_PARSE_VERSION "LCLint 2.5m" +/*@constant observer char *LCL_COMPILE;@*/ +# define LCL_COMPILE "Compiled using gcc on FreeBSD shankly.cs.virginia.edu 3.2-RELEASE FreeBSD 3.2-RELEASE #0: Tue May 18 04:05:08 GMT 1999 jkh@cathair:/usr/src/sys/compile/GENERIC i386 by evans" diff --git a/src/Headers/idDecl.h b/src/Headers/idDecl.h new file mode 100644 index 0000000..287f755 --- /dev/null +++ b/src/Headers/idDecl.h @@ -0,0 +1,48 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** idDecl.h +*/ + +# ifndef idDecl_H +# define idDecl_H + +struct _idDecl +{ + cstring id; + qtype typ; +} ; + +/*@constant null idDecl idDecl_undefined; @*/ +# define idDecl_undefined ((idDecl) NULL) + +extern /*@falsenull@*/ bool idDecl_isDefined (idDecl p_t) /*@*/ ; +# define idDecl_isDefined(t) ((t) != idDecl_undefined) + +extern void idDecl_free (/*@only@*/ idDecl p_t); +extern /*@only@*/ idDecl + idDecl_create (/*@only@*/ cstring p_s, /*@only@*/ qtype p_t); +extern /*@only@*/ cstring idDecl_unparse (idDecl p_d); +extern /*@exposed@*/ qtype idDecl_getTyp (idDecl p_d); +extern void idDecl_setTyp (idDecl p_d, /*@only@*/ qtype p_c); +extern idDecl idDecl_expectFunction (/*@returned@*/ idDecl p_d); +extern idDecl idDecl_replaceCtype (/*@returned@*/ idDecl p_d, ctype p_c); +extern idDecl idDecl_fixBase (/*@returned@*/ idDecl p_t, qtype p_b); +extern idDecl idDecl_fixParamBase (/*@returned@*/ idDecl p_t, qtype p_b); +extern ctype idDecl_getCtype (idDecl p_d) /*@*/ ; +extern /*@exposed@*/ qualList idDecl_getQuals (idDecl p_d) /*@*/ ; + +extern /*@dependent@*/ /*@observer@*/ cstring idDecl_getName (idDecl p_t) /*@*/ ; +extern /*@observer@*/ cstring idDecl_observeId (idDecl p_d) /*@*/ ; +extern void idDecl_addQual (idDecl p_d, qual p_q); + +# define idDecl_getName(t) idDecl_observeId(t) + +# else +# error "Multiple include" +# endif + + diff --git a/src/Headers/idDeclList.h b/src/Headers/idDeclList.h new file mode 100644 index 0000000..c07608c --- /dev/null +++ b/src/Headers/idDeclList.h @@ -0,0 +1,41 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef idDeclLIST_H +# define idDeclLIST_H + +typedef /*@only@*/ idDecl o_idDecl; + +abst_typedef struct _idDeclList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_idDecl *elements; +} *idDeclList ; + +/*@iter idDeclList_elements (sef idDeclList x, yield exposed idDecl el); @*/ +# define idDeclList_elements(x, m_el) \ + { int m_ind; idDecl *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { idDecl m_el = *(m_elements++); + +# define end_idDeclList_elements }} + +extern /*@only@*/ idDeclList idDeclList_singleton (/*@only@*/ idDecl p_e) ; +extern idDeclList idDeclList_add (/*@returned@*/ idDeclList p_s, /*@only@*/ idDecl p_el) ; + +extern /*@unused@*/ /*@only@*/ cstring idDeclList_unparse (idDeclList p_s) ; +extern void idDeclList_free (/*@only@*/ idDeclList p_s) ; + +/*@constant int idDeclListBASESIZE;@*/ +# define idDeclListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/importNode.h b/src/Headers/importNode.h new file mode 100644 index 0000000..07997b0 --- /dev/null +++ b/src/Headers/importNode.h @@ -0,0 +1,24 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** importNode.h +** +** needs "ltoken_type.h" +*/ + +typedef enum { IMPPLAIN, IMPBRACKET, IMPQUOTE } impkind ; + +typedef struct _importNode +{ + impkind kind; + ltoken val; +} *importNode ; + +extern void importNode_free (/*@only@*/ /*@null@*/ importNode p_x); + +extern /*@only@*/ importNode importNode_makePlain (/*@only@*/ ltoken p_t); +extern /*@only@*/ importNode importNode_makeBracketed (/*@only@*/ ltoken p_t); +extern /*@only@*/ importNode importNode_makeQuoted (/*@only@*/ ltoken p_t); diff --git a/src/Headers/importNodeList.h b/src/Headers/importNodeList.h new file mode 100644 index 0000000..fd6cc59 --- /dev/null +++ b/src/Headers/importNodeList.h @@ -0,0 +1,42 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef IMPORTNODELIST_H +# define IMPORTNODELIST_H + +typedef /*@only@*/ importNode o_importNode; + +abst_typedef struct _importNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_importNode *elements; +} *importNodeList ; + +/*@iter importNodeList_elements (sef importNodeList x, yield exposed importNode el); @*/ +# define importNodeList_elements(x, m_el) \ + { int m_ind; importNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { importNode m_el = *(m_elements++); + +# define end_importNodeList_elements }} + +extern /*@only@*/ importNodeList importNodeList_new (void); +extern importNodeList + importNodeList_add (/*@returned@*/ importNodeList p_s, /*@only@*/ importNode p_el) ; + +extern /*@only@*/ cstring importNodeList_unparse (importNodeList p_s) ; +extern void importNodeList_free (/*@only@*/ importNodeList p_s) ; + +/*@constant int importNodeListBASESIZE;@*/ +# define importNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/imports.h b/src/Headers/imports.h new file mode 100644 index 0000000..4df9ab1 --- /dev/null +++ b/src/Headers/imports.h @@ -0,0 +1,9 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +extern void processImport (lsymbol p_importSymbol, ltoken p_tok, impkind p_kind); +extern void outputLCSFile (char *p_path, char *p_msg, char *p_specname); +extern void importCTrait (void); diff --git a/src/Headers/initDeclNode.h b/src/Headers/initDeclNode.h new file mode 100644 index 0000000..b9ac2d5 --- /dev/null +++ b/src/Headers/initDeclNode.h @@ -0,0 +1,14 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _initDeclNode { + declaratorNode declarator; + /*@null@*/ struct _termNode *value; +} *initDeclNode; + +extern bool initDeclNode_isRedeclaration (initDeclNode p_d); + +extern void initDeclNode_free (/*@only@*/ /*@null@*/ initDeclNode p_x); diff --git a/src/Headers/initDeclNodeList.h b/src/Headers/initDeclNodeList.h new file mode 100644 index 0000000..2b4bad8 --- /dev/null +++ b/src/Headers/initDeclNodeList.h @@ -0,0 +1,44 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +# ifndef INITDECLNODELIST_H +# define INITDECLNODELIST_H + +typedef /*@only@*/ initDeclNode o_initDeclNode; + +abst_typedef struct _initDeclNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_initDeclNode *elements; +} *initDeclNodeList ; + +/*@iter initDeclNodeList_elements (sef initDeclNodeList x, yield exposed initDeclNode el); @*/ +# define initDeclNodeList_elements(x, m_el) \ + { int m_ind; initDeclNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { initDeclNode m_el = *(m_elements++); + +# define end_initDeclNodeList_elements }} + +extern /*@only@*/ initDeclNodeList initDeclNodeList_new(void); +extern initDeclNodeList + initDeclNodeList_add (/*@returned@*/ initDeclNodeList p_s, + /*@only@*/ initDeclNode p_el) ; + +extern /*@only@*/ cstring initDeclNodeList_unparse (initDeclNodeList p_s) ; +extern void initDeclNodeList_free (/*@only@*/ initDeclNodeList p_s) ; + +/*@constant int initDeclNodeListBASESIZE;@*/ +# define initDeclNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/intSet.h b/src/Headers/intSet.h new file mode 100644 index 0000000..c8a12fd --- /dev/null +++ b/src/Headers/intSet.h @@ -0,0 +1,54 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** intSet.h +** +** based on set_template.h +*/ + +# ifndef intSET_H +# define intSET_H + +abst_typedef struct _intSet +{ + int entries; + int nspace; + /*@reldef@*/ /*@relnull@*/ int *elements; +} *intSet; + +/*@iter intSet_elements (sef intSet s, yield int el)@*/ +# define intSet_elements(x, m_el) \ + { int m_ind; for (m_ind = 0 ; m_ind < (x)->entries; m_ind++) \ + { int m_el = (x)->elements[m_ind]; + +# define end_intSet_elements }} + +extern /*@only@*/ intSet intSet_new (void); + +extern bool intSet_isEmpty (intSet p_s); +# define intSet_isEmpty(s) ((s)->entries == 0) + +extern int intSet_size (intSet p_s); +# define intSet_size(s) ((s)->entries) + +extern bool intSet_insert (intSet p_s, int p_el); +extern /*@unused@*/ bool intSet_member (intSet p_s, int p_el); +extern /*@only@*/ /*@unused@*/ cstring intSet_unparse (intSet p_s); +extern void intSet_free (/*@only@*/ intSet p_s); + +# ifndef NOLCL +extern /*@only@*/ cstring intSet_unparseText (intSet p_s); +# endif + +/*@constant int intSetBASESIZE;@*/ +# define intSetBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + diff --git a/src/Headers/interfaceNode.h b/src/Headers/interfaceNode.h new file mode 100644 index 0000000..9220ab1 --- /dev/null +++ b/src/Headers/interfaceNode.h @@ -0,0 +1,27 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef enum { + INF_IMPORTS, INF_USES, + INF_EXPORT, INF_PRIVATE +} interfaceNodeKind; + +typedef struct _interfaceNode { + interfaceNodeKind kind; /* which kind of interface node */ + union { + /* evs 8 Sept 1993 */ + importNodeList imports; /* a list of simpleId or TYPEDEF_NAME */ + traitRefNodeList uses; /* a list of traitRef */ + exportNode export; + privateNode private; + } content; /* can be empty */ + /* the list that made up is chained thru next */ +} *interfaceNode; + +extern /*@unused@*/ cstring interfaceNode_unparse (interfaceNode p_x); +extern void interfaceNode_free (/*@null@*/ /*@only@*/ interfaceNode p_x); + + diff --git a/src/Headers/interfaceNodeList.h b/src/Headers/interfaceNodeList.h new file mode 100644 index 0000000..b5c60d0 --- /dev/null +++ b/src/Headers/interfaceNodeList.h @@ -0,0 +1,52 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef interfaceNodeLIST_H +# define interfaceNodeLIST_H + +typedef /*@only@*/ interfaceNode o_interfaceNode; + +abst_typedef struct _interfaceNodeList +{ + int nelements; + int nspacehigh; + int nspacelow; + /*@dependent@*/ /*@reldef@*/ /*@relnull@*/ o_interfaceNode *elements; + /*@only@*/ /*@reldef@*/ /*@relnull@*/ o_interfaceNode *elementsroot; +} *interfaceNodeList ; + +/*@iter interfaceNodeList_elements (sef interfaceNodeList x, yield exposed interfaceNode el); @*/ +# define interfaceNodeList_elements(x, m_el) \ + { int m_ind; interfaceNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { interfaceNode m_el = *(m_elements++); + +# define end_interfaceNodeList_elements }} + +extern /*@only@*/ interfaceNodeList interfaceNodeList_new(void); + +extern interfaceNodeList + interfaceNodeList_addh (/*@returned@*/ interfaceNodeList p_s, /*@only@*/ interfaceNode p_el); +extern void interfaceNodeList_addl (interfaceNodeList p_s, /*@keep@*/ interfaceNode p_el) ; + +extern void interfaceNodeList_free (/*@only@*/ interfaceNodeList p_s) ; + +/*@constant int interfaceNodeListGROWLOW;@*/ +# define interfaceNodeListGROWLOW 4 /* addl used in abstract.c */ + +/*@constant int interfaceNodeListGROWHI;@*/ +# define interfaceNodeListGROWHI 4 + +/*@constant int interfaceNodeListBASESIZE;@*/ +# define interfaceNodeListBASESIZE \ + (interfaceNodeListGROWLOW + interfaceNodeListGROWHI) + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/iterNode.h b/src/Headers/iterNode.h new file mode 100644 index 0000000..17d0ad8 --- /dev/null +++ b/src/Headers/iterNode.h @@ -0,0 +1,13 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _iterNode { + ltoken name; + paramNodeList params; +} *iterNode; + +extern /*@unused@*/ /*@only@*/ cstring + iterNode_unparse (/*@null@*/ iterNode p_i) /*@*/ ; diff --git a/src/Headers/lclForwardTypes.h b/src/Headers/lclForwardTypes.h new file mode 100644 index 0000000..321a23b --- /dev/null +++ b/src/Headers/lclForwardTypes.h @@ -0,0 +1,15 @@ +# ifndef LCL_FORWARDTYPES_H +# define LCL_FORWARDTYPES_H + +typedef struct _termNode *termNode; +typedef /*@null@*/ struct _lclTypeSpecNode *lclTypeSpecNode; +abst_typedef struct _termNodeList *termNodeList; +typedef unsigned int sort; +typedef long unsigned lsymbol; +typedef struct _typeExpr *typeExpr; +abst_typedef /*@null@*/ struct _ltoken *ltoken; +typedef unsigned int ltokenCode; + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/lclMisc.h b/src/Headers/lclMisc.h new file mode 100644 index 0000000..7b64163 --- /dev/null +++ b/src/Headers/lclMisc.h @@ -0,0 +1,10 @@ +# ifndef LCLMISC_H +# define LCLMISC_H + +typedef unsigned int bits; +typedef long unsigned Handle; + +extern char *FormatInt (int p_i) /*@*/ ; +extern bool firstWord (char *p_s, char *p_w); + +# endif diff --git a/src/Headers/lclPredicateNode.h b/src/Headers/lclPredicateNode.h new file mode 100644 index 0000000..0c9c0d5 --- /dev/null +++ b/src/Headers/lclPredicateNode.h @@ -0,0 +1,19 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef enum +{ + LPD_PLAIN, LPD_CHECKS, LPD_REQUIRES, LPD_ENSURES, + LPD_INTRACLAIM, LPD_CONSTRAINT, LPD_INITIALLY + } lclPredicateKind; + +typedef struct _lclPredicateNode { + ltoken tok; /* for debugging */ + lclPredicateKind kind; + struct _termNode *predicate; +} *lclPredicateNode; + + diff --git a/src/Headers/lclTypeSpecNode.h b/src/Headers/lclTypeSpecNode.h new file mode 100644 index 0000000..9012a89 --- /dev/null +++ b/src/Headers/lclTypeSpecNode.h @@ -0,0 +1,52 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef enum +{ + LTS_TYPE, LTS_STRUCTUNION, + LTS_ENUM, LTS_CONJ +} lclTypeSpecKind; + +typedef lclTypeSpecNode lcltsp; + +typedef struct _lclconj +{ + lcltsp a; + lcltsp b; +} *lclconj; + +struct _lclTypeSpecNode { + lclTypeSpecKind kind; + qualList quals; + union { + /*@null@*/ CTypesNode type; + /*@null@*/ strOrUnionNode structorunion; + /*@null@*/ enumSpecNode enumspec; + lclconj conj; + } content; + int pointers; +} ; + +/*@constant null lclTypeSpecNode lclTypeSpecNode_undefined; @*/ +# define lclTypeSpecNode_undefined ((lclTypeSpecNode) 0) + +extern /*@falsenull@*/ bool lclTypeSpecNode_isDefined (lclTypeSpecNode p_x) /*@*/ ; +# define lclTypeSpecNode_isDefined(x) ((x) != lclTypeSpecNode_undefined) + +extern /*@null@*/ /*@only@*/ lclTypeSpecNode + lclTypeSpecNode_copy (/*@null@*/ lclTypeSpecNode p_n) /*@*/ ; + +extern /*@only@*/ cstring + lclTypeSpecNode_unparse (/*@null@*/ lclTypeSpecNode p_n) /*@*/ ; + +extern /*@only@*/ cstring + lclTypeSpecNode_unparseComments (/*@null@*/ lclTypeSpecNode p_typespec) /*@*/ ; + + + + + + diff --git a/src/Headers/lcl_constants.h b/src/Headers/lcl_constants.h new file mode 100644 index 0000000..033d9b0 --- /dev/null +++ b/src/Headers/lcl_constants.h @@ -0,0 +1,82 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef LCL_CONSTANTS_H +# define LCL_CONSTANTS_H + +/* lclsyntable */ + +/*@constant unsigned long int INITSYNTABLE; @*/ +# define INITSYNTABLE 1024 + +/*@constant double DELTASYNTABLE; @*/ +# define DELTASYNTABLE 2.0 + +/* syntable */ + +/*@constant int SYNTABLE_BASESIZE; @*/ +# define SYNTABLE_BASESIZE 256 + +/* lcltokentable */ +/*@constant unsigned long int INITTOKENTABLE; @*/ +# define INITTOKENTABLE 1024 + +/*@constant double DELTATOKENTABLE; @*/ +# define DELTATOKENTABLE 2.0 + +/* string2sym */ + +/*@constant int INITCHARSTRING; @*/ +# define INITCHARSTRING 8192 + +/*@constant int DELTACHARSTRING; @*/ +# define DELTACHARSTRING 2 + +/*@constant int INITSTRINGENTRY; @*/ +# define INITSTRINGENTRY 1024 + +/*@constant int DELTASTRINGENTRY; @*/ +# define DELTASTRINGENTRY 2 + +/*@constant int HASHSIZE; @*/ +# define HASHSIZE 1024 + +/*@constant int HASHMASK; @*/ +# define HASHMASK (HASHSIZE-1) /* HASHSIZE must be 2^n */ + +/*@constant observer char *INITFILENAME; @*/ +# define INITFILENAME "lclinit.lci" + +/*@constant observer char *IO_SUFFIX; @*/ +# define IO_SUFFIX ".lcs" + +/*@constant observer char *LCL_SUFFIX; @*/ +# define LCL_SUFFIX ".lcl" + +/*@constant observer char *LCLINIT_SUFFIX; @*/ +# define LCLINIT_SUFFIX ".lci" + +/*@constant observer char *LH_SUFFIX; @*/ +# define LH_SUFFIX ".lh" + +/*@constant observer char *CTRAITSYMSNAME; @*/ +# define CTRAITSYMSNAME "CTrait.syms" + +/*@constant observer char *CTRAITSPECNAME; @*/ +# define CTRAITSPECNAME "CTrait.lsl" + +/*@constant observer char *CTRAITFILENAMEN; @*/ +# define CTRAITFILENAMEN "CTrait" + + +# else +# error "Multiple include" +# endif + + + + + + diff --git a/src/Headers/lclctypes.h b/src/Headers/lclctypes.h new file mode 100644 index 0000000..7057841 --- /dev/null +++ b/src/Headers/lclctypes.h @@ -0,0 +1,47 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef LCLCTYPESX_H +# define LCLCTYPESX_H + +/* +** TypeSpecification is an enum defined for each of the valid C type. +*/ + +typedef enum +{ + TS_UNKNOWN, TS_VOID, TS_CHAR, TS_INT, + TS_SIGNED, TS_UNSIGNED, TS_SHORT, TS_LONG, + TS_FLOAT, TS_DOUBLE, TS_ENUM, TS_STRUCT, + TS_UNION, TS_TYPEDEF + } TypeSpecification; + +/* +** TypeSpec is an enum for each of the valid combinations of type specifiers. +*/ + +typedef enum { + TYS_NONE, + TYS_VOID, + TYS_CHAR, TYS_SCHAR, TYS_UCHAR, + TYS_SSINT, TYS_USINT, + TYS_INT, TYS_SINT, TYS_UINT, + TYS_SLINT, TYS_ULINT, + TYS_FLOAT, TYS_DOUBLE, TYS_LDOUBLE, + TYS_ENUM, TYS_STRUCT, TYS_UNION, + TYS_TYPENAME + } TypeSpec; + +typedef bits lclctype; + +extern lclctype fixBits(TypeSpecification p_attr, lclctype p_spec); +# define fixBits(attr, spec) ((unsigned)(1<<(attr) | (spec))) + +extern lsymbol lclctype_toSort(lclctype p_t); +extern lsymbol lclctype_toSortDebug(lclctype p_t); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/lclinit.h b/src/Headers/lclinit.h new file mode 100644 index 0000000..37bd8b9 --- /dev/null +++ b/src/Headers/lclinit.h @@ -0,0 +1,18 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +/* +** LSLInitRuleCode defined in lslinit.h +*/ + +typedef LSLInitRuleCode LCLInitRuleCode; + +extern void LCLProcessInitFile(void); + +extern void LCLProcessInitFileInit(void); +extern void LCLProcessInitFileReset(void); +extern void LCLProcessInitFileCleanup(void); + diff --git a/src/Headers/lclintMacros.nf b/src/Headers/lclintMacros.nf new file mode 100644 index 0000000..82011bf --- /dev/null +++ b/src/Headers/lclintMacros.nf @@ -0,0 +1,134 @@ +/* ;-*-C-*-; +** Copyright (c) Massachusetts Institute of Technology 1994, 1995. +** All Rights Reserved. +** Unpublished rights reserved under the copyright laws of +** the United States. +** +** THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED +** OR IMPLIED. ANY USE IS AT YOUR OWN RISK. +** +** This code is distributed freely and may be used freely under the +** following conditions: +** +** 1. This notice may not be removed or altered. +** +** 2. This code may not be re-distributed or modified +** without permission from MIT (contact +** lclint-request@larch.lcs.mit.edu.) +** +** Modification and re-distribution are encouraged, +** but we want to keep track of changes and +** distribution sites. +*/ + +# ifndef LCLINTMACROS_H +# define LCLINTMACROS_H + + +/* +** This file contains notfunction macros (hence, the .nf extension to +** prevent it being skipped when +neverinclude is used.) +*/ + +#ifndef PARAMS +#ifdef __STDC +/*@notfunction@*/ +#define PARAMS(P) P +#else +/*@notfunction@*/ +#define PARAMS(P) () +#endif +#endif /* !PARAMS */ + +/*@notfunction@*/ +# define BADEXIT \ + /*@notreached@*/ do { llassertprint(FALSE, ("Reached dead code!")); \ + exit(EXIT_FAILURE); } while (FALSE) + +/*@notfunction@*/ +# define BADBRANCH \ + /*@notreached@*/ BADBRANCHCONT + +/*@notfunction@*/ +# define BADBRANCHCONT \ + do { llassertprint (FALSE, ("Bad branch taken!")); } while (FALSE) + +/*@notfunction@*/ +# define BADDEFAULT \ + default: llassertprint (FALSE, ("Unexpected default case reached!")); \ + exit (EXIT_FAILURE); + +/*@-namechecks@*/ +/*@notfunction@*/ +# define llassertprint(tst,p) \ + do { \ + if (!(tst)) { \ + llbug (message("%q:%d: llassert failed: " #tst ": %q", \ + cstring_makeLiteral (__FILE__), __LINE__,\ + /*@-mustfree@*/ message p) /*@=mustfree@*/ ); \ + }} while (FALSE) + +/*@notfunction@*/ +# define llassertprintret(tst,p,r) \ + do { if (!(tst)) \ + { llbug (message("%q:%d: %q", cstring_makeLiteral (__FILE__), __LINE__, message p)); \ + /*@-unreachable@*/ return (r); /*@=unreachable@*/ \ + } } while (FALSE) + +/*@notfunction@*/ +# define abst_typedef typedef /*@abstract@*/ + +/*@notfunction@*/ +# define immut_typedef typedef /*@abstract@*/ /*@immutable@*/ + +/*@=namechecks@*/ + +/* +** SunOS4 can't handle bit fields correctly. +*/ + +# ifdef SYSSunOS +/*@notfunction@*/ +# define BOOLBITS +# else +/*@notfunction@*/ +# define BOOLBITS : 1 +# endif + +/* +** some stupid proprocessors replace the s in %s...had +** to change s to arg. +*/ + +/*@notfunction@*/ +# define NOALIAS(s,t) (/*@ignore@*/ (s == NULL) || (s != t) /*@end@*/) + +/*@notfunction@*/ +# define TPRINTF(arg) \ + do { /*@-mustfree@*/ /*@-null@*/ (void) fflush (stderr); (void) fflush (stdout); \ + printf ("%s:%d [%s]: >> ", __FILE__, __LINE__, cstring_toCharsSafe (fileloc_unparse(g_currentloc))); \ + (void)printf arg; printf("\n"); /*@=mustfree@*/ /*@=null@*/ (void) fflush (stdout); \ + } while (FALSE) + +# if DEBUGPRINT +/*@notfunction@*/ +# define DPRINTF(s) /*@access cstring@*/ TPRINTF(s) /*@noaccess cstring@*/ +# else +/*@notfunction@*/ +# define DPRINTF(s) +# endif + +/*@notfunction@*/ +# define INTCOMPARERETURN(x,y) \ + do { if ((x) > (y)) { return 1; } \ + else { if ((x) < (y)) { return -1; }}} while (FALSE); + +/*@notfunction@*/ +# define COMPARERETURN(z) \ + do { if (z != 0) { return z; } } while (FALSE); + +# else +# error "Multiple include" +# endif + + diff --git a/src/Headers/lcllib.h b/src/Headers/lcllib.h new file mode 100644 index 0000000..9fc403e --- /dev/null +++ b/src/Headers/lcllib.h @@ -0,0 +1,16 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef LCLLIB_H +# define LCLLIB_H + +extern void dumpState (cstring p_cfname); +extern void loadState (cstring p_cfname); +extern bool loadStandardState (void); +extern bool lcllib_isSkipHeader (cstring p_sname); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/lclscan.h b/src/Headers/lclscan.h new file mode 100644 index 0000000..55d48e3 --- /dev/null +++ b/src/Headers/lclscan.h @@ -0,0 +1,31 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** lclscan.h +*/ + +# ifndef LCLSCAN_H +# define LCLSCAN_H + +extern ltokenCode yllex (void) /*@modifies internalState@*/ ; + +extern bool g_inTypeDef; + +extern /*@dependent@*/ /*@exposed@*/ ltoken LCLScanNextToken(void) + /*@modifies internalState@*/ ; +extern void LCLScanFreshToken(/*@only@*/ ltoken p_tok) + /*@modifies internalState@*/ ; + +extern /*@exposed@*/ tsource *LCLScanSource(void) /*@*/ ; +extern void LCLScanInit(void) /*@modifies internalState@*/ ; +extern void LCLScanReset(tsource *p_s) /*@modifies internalState@*/ ; +extern void LCLScanCleanup(void) /*@modifies internalState@*/ ; + +# else +# error "Multiple include" +# endif + + diff --git a/src/Headers/lclscanline.h b/src/Headers/lclscanline.h new file mode 100644 index 0000000..bc86491 --- /dev/null +++ b/src/Headers/lclscanline.h @@ -0,0 +1,55 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** scanline.h +** +** The header files +** lsl.h +** string.h +** scan.h +** must be included prior to including +** scanline.h +** +** MODIFICATION HISTORY: +** +** X0.1-1 GAF 90.11.08 Created from LSL version +** X0.1-2 JPW 91.05.03 Add LSLReportCommentTokens. +** X0.1-3 JPW 91.06.26 Update copyright notice. +** 3.2 ymtan 92.11.14 conditionalize defn of types, needed for +** merging scanline.h and lclscanline.h +** Hence added SLASHCHAR (from LSL's scanline.h). +** 2.4 ymtan 93.03.16 -- adapted original for release 2.4 +** Version Who yy.mm.dd -- did what? +*/ + +# ifndef LCLSCANLINE_H +# define LCLSCANLINE_H + +extern void LCLScanLine (char *p_line) /*@modifies internalState, p_line@*/ ; +/*@exposed@*/ ltoken LCLScanEofToken (void) /*@*/ ; +extern void LCLReportEolTokens (bool p_setting) /*@modifies internalState@*/ ; + +extern void LCLScanLineInit(void) /*@modifies internalState@*/ ; +extern void LCLScanLineReset(void) /*@modifies internalState@*/ ; +extern void LCLScanLineCleanup(void) /*@modifies internalState@*/ ; + +extern charCode LCLScanCharClass (char p_c) /*@*/ ; +extern bool LCLIsEndComment(char p_c) /*@*/ ; + +extern void LCLSetCharClass (char p_c, charCode p_cod) + /*@modifies internalState@*/ ; + +extern void LCLSetEndCommentChar(char p_c, bool p_flag) + /*@modifies internalState@*/ ; + +# else +# error "Multiple include" +# endif + + + + + diff --git a/src/Headers/lclsyntable.h b/src/Headers/lclsyntable.h new file mode 100644 index 0000000..68e2014 --- /dev/null +++ b/src/Headers/lclsyntable.h @@ -0,0 +1,16 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** syntable.h +*/ + +extern void LCLAddSyn(lsymbol, lsymbol); +extern /*@exposed@*/ ltoken LCLGetTokenForSyn(lsymbol); +extern bool LCLIsSyn(lsymbol); + +extern void LCLSynTableInit(void); +extern void LCLSynTableReset(void); +extern void LCLSynTableCleanup(void); diff --git a/src/Headers/lcltokentable.h b/src/Headers/lcltokentable.h new file mode 100644 index 0000000..75c9159 --- /dev/null +++ b/src/Headers/lcltokentable.h @@ -0,0 +1,20 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** tokentable.h +*/ + +extern /*@exposed@*/ ltoken + LCLInsertToken (ltokenCode, lsymbol, lsymbol, bool) + /*@modifies internalState@*/ ; +extern void LCLUpdateToken (ltokenCode, lsymbol, bool) /*@modifies internalState@*/ ; +extern void LCLSetTokenHasSyn(lsymbol, bool) /*@modifies internalState@*/ ; +extern /*@exposed@*/ ltoken LCLGetToken (lsymbol) /*@*/ ; +extern /*@exposed@*/ ltoken LCLReserveToken (ltokenCode, char *) + /*@modifies internalState@*/ ; + +extern void LCLTokenTableInit(void); +extern void LCLTokenTableCleanup(void); diff --git a/src/Headers/lctype.h b/src/Headers/lctype.h new file mode 100644 index 0000000..e0137da --- /dev/null +++ b/src/Headers/lctype.h @@ -0,0 +1,356 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** lctype.h +** +** renamed from ctype.h to avoid confusion with standard +** header file +*/ + +# ifndef CTYPE_H +# define CTYPE_H + +/* +** since this is the header file for the ctype module, we need +** to use an access comment to provide access to the representation. +*/ + +/* in forwardTypes: typedef int ctype; */ + +typedef enum +{ + CT_UNKNOWN, + CT_PRIM, + CT_USER, + CT_ABST, + CT_ENUM, + CT_PTR, + CT_ARRAY, + CT_FIXEDARRAY, + CT_FCN, + CT_STRUCT, + CT_UNION, + CT_ENUMLIST, /* bogus type for keeping unnamed enums around */ + CT_BOOL, /* since booleans aren't really prim's but we don't + want them to be user or abst, they are a separate type */ + CT_CONJ, /* conjunction */ + CT_EXPFCN + } ctuid ; + +/*@access ctype@*/ + +/* hack alert! */ + +/*@constant int CTK_ELIPS;@*/ +# define CTK_ELIPS -23 + +/*@constant int CTK_MISSINGPARAMS;@*/ +# define CTK_MISSINGPARAMS -37 + +/*@constant int CT_FIRST;@*/ +# define CT_FIRST 0 + +/*@constant int CTK_PREDEFINED;@*/ +# define CTK_PREDEFINED (CTX_LAST + 1) + +/*@constant int CTK_PREDEFINED2;@*/ +# define CTK_PREDEFINED2 (CTK_PREDEFINED + CTK_PREDEFINED) + +/*@constant int LAST_PREDEFINED;@*/ +# define LAST_PREDEFINED (CTK_PREDEFINED + CTK_PREDEFINED2) + +/*@constant int CTP_VOID;@*/ +# define CTP_VOID (CTX_VOID + CTK_PREDEFINED) + +/*@constant int CTP_CHAR;@*/ +# define CTP_CHAR (CTX_CHAR + CTK_PREDEFINED) + +/*@constant int CTK_BASESIZE;@*/ +# define CTK_BASESIZE BIGBASESIZE + +typedef enum +{ + CTK_UNKNOWN = -3, + CTK_INVALID = -2, + CTK_DNE = -1, + CTK_PLAIN = 0, /* these must be in order */ + CTK_PTR = 1, + CTK_ARRAY = 2, + CTK_COMPLEX = 3 + } ctkind ; + +extern int ctkind_toInt (ctkind p_x); +# define ctkind_toInt(x) ((int)(x)) + +/* +** ctypes are integer indexes into ctype table +** +** the most common ctypes are hard wired (see cprim.h) +*/ + +/*@constant ctype ctype_undefined; @*/ +# define ctype_undefined ((ctype) CTK_INVALID) + +/*@constant ctype ctype_dne; @*/ +# define ctype_dne ((ctype) CTK_DNE) + +/*@constant ctype ctype_unknown; @*/ +# define ctype_unknown CTX_UNKNOWN + +/*@constant ctype ctype_void; @*/ +# define ctype_void CTX_VOID + +/*@constant ctype ctype_char; @*/ +# define ctype_char CTX_CHAR + +/*@constant ctype ctype_uchar; @*/ +# define ctype_uchar CTX_UCHAR + +/*@constant ctype ctype_double; @*/ +# define ctype_double CTX_DOUBLE + +/*@constant ctype ctype_ldouble; @*/ +# define ctype_ldouble CTX_LDOUBLE + +/*@constant ctype ctype_float; @*/ +# define ctype_float CTX_FLOAT + +/*@constant ctype ctype_int; @*/ +# define ctype_int CTX_INT + +/*@constant ctype ctype_uint; @*/ +# define ctype_uint CTX_UINT + +/*@constant ctype ctype_sint; @*/ +# define ctype_sint CTX_SINT + +/*@constant ctype ctype_lint; @*/ +# define ctype_lint CTX_LINT + +/*@constant ctype ctype_usint; @*/ +# define ctype_usint CTX_USINT + +/*@constant ctype ctype_ulint; @*/ +# define ctype_ulint CTX_ULINT + +/*@constant ctype ctype_llint; @*/ +# define ctype_llint CTX_LLINT + +/*@constant ctype ctype_ullint; @*/ +# define ctype_ullint CTX_ULLINT + +/*@constant ctype ctype_bool; @*/ +# define ctype_bool CTX_BOOL + +/*@constant ctype ctype_string; @*/ +# define ctype_string CTP_CHAR + +/*@constant ctype ctype_anyintegral @*/ +# define ctype_anyintegral CTX_ANYINTEGRAL + +/*@constant ctype ctype_unsignedintegral @*/ +# define ctype_unsignedintegral CTX_UNSIGNEDINTEGRAL + +/*@constant ctype ctype_signedintegral @*/ +# define ctype_signedintegral CTX_SIGNEDINTEGRAL + +/*@constant ctype ctype_voidPointer; @*/ +# define ctype_voidPointer CTP_VOID + +extern ctype ctype_forceRealType (ctype p_c); +extern bool ctype_forceMatch (ctype p_c1, ctype p_c2); +extern bool ctype_genMatch (ctype p_c1, ctype p_c2, bool p_force, bool p_arg, bool p_def); + +extern bool ctype_isSimple (ctype p_c) /*@*/ ; +extern bool ctype_isAbstract (ctype p_c) /*@*/ ; +extern bool ctype_isArray (ctype p_c) /*@*/ ; +extern bool ctype_isFixedArray (ctype p_c) /*@*/ ; +extern bool ctype_isIncompleteArray (ctype p_c) /*@*/ ; +extern bool ctype_isArrayPtr (ctype p_c) /*@*/ ; +extern bool ctype_isBool (ctype p_c) /*@*/ ; +extern bool ctype_isChar (ctype p_c) /*@*/ ; +extern bool ctype_isUnsignedChar (ctype p_c) /*@*/ ; +extern bool ctype_isSignedChar (ctype p_c) /*@*/ ; +extern bool ctype_isString (ctype p_c) /*@*/ ; +extern bool ctype_isConj (ctype p_c) /*@*/ ; +extern bool ctype_isDirectBool (ctype p_c) /*@*/ ; +extern bool ctype_isDirectInt(ctype p_c) /*@*/ ; +extern bool ctype_isEnum(ctype p_c) /*@*/ ; +extern bool ctype_isExpFcn (ctype p_c) /*@*/ ; +extern bool ctype_isFirstVoid (ctype p_c) /*@*/ ; +extern bool ctype_isForceRealBool (ctype *p_c) /*@*/ ; +extern bool ctype_isForceRealInt (ctype *p_c) /*@*/ ; +extern bool ctype_isForceRealNumeric (ctype *p_c) /*@*/ ; +extern bool ctype_isFunction (ctype p_c) /*@*/ ; +extern bool ctype_isArbitraryIntegral (ctype p_c) /*@*/ ; +extern bool ctype_isUnsignedIntegral (ctype p_c) /*@*/ ; +extern bool ctype_isSignedIntegral (ctype p_c) /*@*/ ; +extern bool ctype_isInt (ctype p_c) /*@*/ ; +extern bool ctype_isRegularInt (ctype p_c) /*@*/ ; +extern bool ctype_isMutable (ctype p_t) /*@*/ ; +extern bool ctype_isNumeric (ctype p_c) /*@*/ ; +extern bool ctype_isPointer (ctype p_c) /*@*/ ; +extern bool ctype_isReal (ctype p_c) /*@*/ ; +extern /*@unused@*/ bool ctype_isFloat (ctype p_c) /*@*/ ; +extern bool ctype_isDouble (ctype p_c) /*@*/ ; +extern bool ctype_isSigned (ctype p_c) /*@*/ ; +extern bool ctype_isUnsigned (ctype p_c) /*@*/ ; +extern bool ctype_isRealAP (ctype p_c) /*@*/ ; +extern bool ctype_isRealAbstract(ctype p_c) /*@*/ ; +extern bool ctype_isRealArray (ctype p_c) /*@*/ ; +extern bool ctype_isRealBool (ctype p_c) /*@*/ ; +extern bool ctype_isRealFunction (ctype p_c) /*@*/ ; +extern bool ctype_isRealInt (ctype p_c) /*@*/ ; +extern bool ctype_isRealNumeric (ctype p_c) /*@*/ ; +extern bool ctype_isRealPointer (ctype p_c) /*@*/ ; +extern bool ctype_isRealSU (ctype p_c) /*@*/ ; +extern bool ctype_isRealVoid (ctype p_c) /*@*/ ; +extern bool ctype_isStruct (ctype p_c) /*@*/ ; +extern bool ctype_isStructorUnion(ctype p_c) /*@*/ ; +extern bool ctype_isUA (ctype p_c) /*@*/ ; +extern bool ctype_isUnion (ctype p_c) /*@*/ ; +extern bool ctype_isUserBool (ctype p_ct) /*@*/ ; +extern bool ctype_isVoid (ctype p_c) /*@*/ ; +extern bool ctype_isVoidPointer (ctype p_c) /*@*/ ; + +extern bool ctype_isVisiblySharable (ctype p_t) /*@*/ ; +extern bool ctype_match (ctype p_c1, ctype p_c2) /*@*/ ; +extern bool ctype_matchArg (ctype p_c1, ctype p_c2) /*@*/ ; +extern bool ctype_sameName (ctype p_c1, ctype p_c2) /*@*/ ; + +extern /*@only@*/ cstring ctype_dump (ctype p_c) /*@*/ ; +extern /*@observer@*/ cstring ctype_enumTag (ctype p_c) /*@*/ ; +extern /*@observer@*/ cstring ctype_unparse (ctype p_c) /*@*/ ; +extern /*@observer@*/ cstring ctype_unparseDeep (ctype p_c) /*@*/ ; +extern /*@unused@*/ /*@observer@*/ cstring ctype_unparseSafe (ctype p_c) /*@*/ ; + +extern ctkind ctkind_fromInt (int p_i) /*@*/ ; + +extern bool ctype_matchDef (ctype p_c1, ctype p_c2) /*@*/ ; +extern ctype ctype_undump (char **p_c); +extern ctype ctype_adjustPointers(int p_np, ctype p_c); +extern ctype ctype_baseArrayPtr (ctype p_c) /*@*/ ; +extern ctype ctype_combine (ctype p_dominant, ctype p_modifier) ; + +extern ctype ctype_createAbstract (typeId p_u) /*@*/ ; +extern ctype + ctype_createEnum (/*@keep@*/ cstring p_tag, /*@keep@*/ enumNameList p_el); +extern ctype ctype_createForwardStruct (/*@only@*/ cstring p_n) /*@*/ ; +extern ctype ctype_createForwardUnion (/*@only@*/ cstring p_n) /*@*/ ; +extern ctype ctype_createStruct (/*@only@*/ cstring p_n, /*@only@*/ uentryList p_f); +extern ctype ctype_createUnion (/*@only@*/ cstring p_n, /*@only@*/ uentryList p_f); + +extern ctype ctype_createUnnamedStruct (/*@only@*/ uentryList p_f) ; +extern ctype ctype_createUnnamedUnion (/*@only@*/ uentryList p_f) ; +extern ctype ctype_createUser (typeId p_u) ; + +extern bool ctype_isUser (ctype p_c) /*@*/ ; +extern ctype ctype_expectFunction(ctype p_c) ; + +extern ctype ctype_fixArrayPtr (ctype p_c); + +extern ctype ctype_getBaseType (ctype p_c) /*@*/ ; + +extern ctype ctype_makeArray (ctype p_c); +extern ctype ctype_makeFixedArray (ctype p_c, long p_size); +extern ctype ctype_makeConj (ctype p_c1, ctype p_c2); +extern ctype ctype_makeParamsFunction (ctype p_base, /*@only@*/ uentryList p_p); +extern ctype ctype_makeFunction (ctype p_base, /*@only@*/ uentryList p_p) /*@*/ ; +extern ctype ctype_makeNFParamsFunction (ctype p_base, /*@only@*/ uentryList p_p) /*@*/ ; +extern ctype ctype_makePointer (ctype p_c); +extern ctype ctype_makeRealFunction (ctype p_base, /*@dependent@*/ uentryList p_p); + +extern ctype ctype_newBase (ctype p_c, ctype p_p) /*@*/ ; +extern ctype ctype_realType (ctype p_c) /*@*/ ; +extern ctype ctype_realishType (ctype p_c) /*@*/ ; +extern ctype ctype_removePointers (ctype p_c) /*@*/ ; +extern ctype ctype_resolve (ctype p_c) /*@*/ ; +extern ctype ctype_resolveNumerics (ctype p_c1, ctype p_c2) /*@*/ ; +extern ctype ctype_returnValue (ctype p_c) /*@*/ ; + +extern bool ctype_isRefCounted (ctype p_t) /*@*/ ; +extern /*@observer@*/ uentryList ctype_argsFunction (ctype p_c) /*@*/ ; +extern /*@observer@*/ uentryList ctype_getParams (ctype p_c) /*@*/ ; +# define ctype_getParams(c) ctype_argsFunction(c) + +extern /*@observer@*/ enumNameList ctype_elist (ctype p_c) /*@*/ ; +extern /*@observer@*/ uentryList ctype_getFields (ctype p_c) /*@*/ ; + +/* +** could do some run-time checks... +*/ + +extern cprim ctype_toCprim (ctype p_c) /*@*/ ; +/*@access cprim@*/ +# define ctype_toCprim(c) ((cprim) (c)) +/*@noaccess cprim@*/ + +extern int ctype_compare (ctype p_c1, ctype p_c2) /*@*/ ; +extern /*@unused@*/ int ctype_count (void); + +extern ctype ctype_makeExplicitConj (ctype p_c1, ctype p_c2); + +extern typeId ctype_typeId (ctype p_c); + +extern ctype ctype_fromQual (qual p_q); +extern bool ctype_isAnyFloat (ctype p_c); +extern bool ctype_isStackAllocated (ctype p_c); + +/*@constant ctype ctype_missingParamsMarker; @*/ +# define ctype_missingParamsMarker ((ctype)CTK_MISSINGPARAMS) + +extern bool ctype_isMissingParamsMarker (ctype p_ct) /*@*/ ; +# define ctype_isMissingParamsMarker(ct) ((ct) == ctype_missingParamsMarker) + +extern bool ctype_equal (ctype p_c1, ctype p_c2); +# define ctype_equal(c1,c2) ((c1) == (c2)) + +extern bool ctype_almostEqual (ctype p_c1, ctype p_c2); + +/*@constant ctype ctype_elipsMarker; @*/ +# define ctype_elipsMarker ((ctype) CTK_ELIPS) + +extern bool ctype_isElips (ctype p_ct) /*@*/; +# define ctype_isElips(ct) ((ct) == ctype_elipsMarker) + +extern bool ctype_isAP (ctype p_c) /*@*/ ; +# define ctype_isAP(c) ctype_isArrayPtr(c) + +extern bool ctype_isDefined (ctype p_c) /*@*/ ; +# define ctype_isDefined(c) ((c) != ctype_undefined) + +extern bool ctype_isKnown (ctype p_c) /*@*/ ; +# define ctype_isKnown(c) ((c) != CTX_UNKNOWN) + +extern bool ctype_isSU (ctype p_c) /*@*/ ; +# define ctype_isSU(c) ctype_isStructorUnion(c) + +extern bool ctype_isUndefined (ctype p_c) /*@*/ ; +# define ctype_isUndefined(c) ((c) == ctype_undefined) + +extern bool ctype_isUnknown (ctype p_c) /*@*/; +# define ctype_isUnknown(c) ((c) == CTX_UNKNOWN) + +extern bool ctype_isBogus (/*@sef@*/ ctype p_c) /*@*/ ; +# define ctype_isBogus(c) (ctype_isUndefined(c) || ctype_isUnknown(c)) + +extern cstring + ctype_unparseDeclaration (ctype p_c, /*@only@*/ cstring p_name); + +extern bool ctype_sameAltTypes (ctype p_c1, ctype p_c2) /*@*/ ; + +extern void ctype_dumpTable (FILE *p_f); +extern void ctype_loadTable (FILE *p_f); +extern void ctype_destroyMod (void); +extern void ctype_initTable (void); +extern /*@only@*/ cstring ctype_unparseTable (void); +extern /*@unused@*/ void ctype_printTable (void); + +extern ctype ctype_widest (ctype, ctype) /*@*/ ; + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/letDeclNode.h b/src/Headers/letDeclNode.h new file mode 100644 index 0000000..0eacfa2 --- /dev/null +++ b/src/Headers/letDeclNode.h @@ -0,0 +1,14 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _letDeclNode { + ltoken varid; + /*@null@*/ lclTypeSpecNode sortspec; + struct _termNode *term; + sort sort; +} *letDeclNode; + +extern void letDeclNode_free (/*@only@*/ /*@null@*/ letDeclNode p_x); diff --git a/src/Headers/letDeclNodeList.h b/src/Headers/letDeclNodeList.h new file mode 100644 index 0000000..6092bfb --- /dev/null +++ b/src/Headers/letDeclNodeList.h @@ -0,0 +1,42 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef LETDECLNODELIST_H +# define LETDECLNODELIST_H + +typedef /*@only@*/ letDeclNode o_letDeclNode; + +abst_typedef struct _letDeclNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_letDeclNode *elements; +} *letDeclNodeList ; + +/*@iter letDeclNodeList_elements (sef letDeclNodeList x, yield exposed letDeclNode el); @*/ +# define letDeclNodeList_elements(x, m_el) \ + { int m_ind; letDeclNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { letDeclNode m_el = *(m_elements++); + +# define end_letDeclNodeList_elements }} + +extern /*@only@*/ letDeclNodeList letDeclNodeList_new(void); +extern letDeclNodeList + letDeclNodeList_add (/*@returned@*/ letDeclNodeList p_s, /*@only@*/ letDeclNode p_el); + +extern /*@only@*/ cstring letDeclNodeList_unparse (letDeclNodeList p_s) ; +extern void letDeclNodeList_free (/*@only@*/ letDeclNodeList p_s) ; + +/*@constant int letDeclNodeListBASESIZE;@*/ +# define letDeclNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/lh.h b/src/Headers/lh.h new file mode 100644 index 0000000..5adcca1 --- /dev/null +++ b/src/Headers/lh.h @@ -0,0 +1,23 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** lh.h +*/ + +extern void lhCleanup (void) /*@modifies internalState, fileSystem@*/ ; +extern void lhIncludeBool (void) /*@modifies internalState@*/ ; +extern void lhInit (tsource *p_f) /*@modifies internalState, fileSystem@*/ ; +extern void lhOutLine (/*@only@*/ cstring p_s) /*@modifies internalState@*/ ; +extern void lhExternals (interfaceNodeList p_x) /*@modifies internalState@*/ ; + +extern cstring + lhVarDecl (lclTypeSpecNode p_lclTypeSpec, initDeclNodeList p_initDecls, + qualifierKind p_qualifier); +extern cstring lhType (typeNode) ; +extern cstring + lhFunction (lclTypeSpecNode p_lclTypeSpec, declaratorNode p_declarator); +extern void lhForwardStruct (ltoken p_t) /*@modifies internalState@*/ ; +extern void lhForwardUnion (ltoken p_t) /*@modifies internalState@*/ ; diff --git a/src/Headers/limwr.h b/src/Headers/limwr.h new file mode 100644 index 0000000..9f00098 --- /dev/null +++ b/src/Headers/limwr.h @@ -0,0 +1,20 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +typedef struct limwr_t { + int (*puts) (/* struct limwr_t *self, char *s, int slen */); + unsigned (*tell) (/* struct limwr_t *self */); + int (*seek) (/* struct limwr_t *self, unsigned n */); + void (*close) (/* struct limwr_t *self */); +} *limwr_t; + +mail() +{ + liwmr_t y; + int i; + + i = (y->puts)(); + + i = (y->close)(); diff --git a/src/Headers/llbasic.h b/src/Headers/llbasic.h new file mode 100644 index 0000000..115626e --- /dev/null +++ b/src/Headers/llbasic.h @@ -0,0 +1,23 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +# ifndef LLBASIC_H +# define LLBASIC_H + +# include "basic.h" + +# ifndef NOLCL +# include "llglobals.h" +# endif + +# else +# error "Multiple include" +# endif + + + + + diff --git a/src/Headers/llerror.h b/src/Headers/llerror.h new file mode 100644 index 0000000..3985390 --- /dev/null +++ b/src/Headers/llerror.h @@ -0,0 +1,239 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +# ifndef LLERROR_H +# define LLERROR_H + +extern bool /*@alt void@*/ check (bool p_x); +# define check(p_x) doCheck (p_x, cstring_fromChars (#p_x), cstring_makeLiteralTemp (__FILE__), __LINE__) + +extern bool doCheck (bool p_x, cstring p_pred, cstring p_file, int p_line); + +extern /*@falseexit@*/ void llassert (/*@sef@*/ bool p_test); +# define llassert(tst) \ + do { if (!(tst)) { \ + if (context_getFlag (FLG_TRYTORECOVER)) checkParseError (); \ + lldiagmsg (message ("%s:%d: at source point", \ + cstring_makeLiteralTemp (__FILE__), __LINE__)); \ + llbuglit ("llassert failed: " #tst); \ + }} while (FALSE) + +extern /*@falseexit@*/ void llassertfatal (/*@sef@*/ bool p_test); +# define llassertfatal(tst) \ + do { if (!(tst)) \ + llfatalbug (message("%s:%d: fatal llassert failed: " #tst, \ + cstring_makeLiteralTemp (__FILE__), __LINE__)); \ + } while (FALSE) + +/* +** llassertprint and llassertprintret are in lclintMacros.nf +*/ + +extern void llmsg (/*@only@*/ cstring p_s) /*@modifies g_msgstream@*/ ; +extern void lldiagmsg (/*@only@*/ cstring p_s) /*@modifies stderr@*/ ; +extern void llmsgplain (/*@only@*/ cstring p_s) /*@modifies g_msgstream@*/ ; +extern void llhint (/*@only@*/ cstring p_s) + /*@globals g_currentloc, g_msgstream;@*/ + /*@modifies g_msgstream@*/ ; +extern /*@exits@*/ void llfatalbug (/*@only@*/ cstring p_s) + /*@globals g_currentloc@*/ + /*@modifies stderr@*/ ; +extern void llgloberror (/*@only@*/ cstring p_s) /*@modifies g_msgstream@*/ ; +extern bool llgenerror (flagcode p_o, /*@only@*/ cstring p_s, fileloc p_fl) /*@modifies g_msgstream@*/ ; +extern bool llgenhinterror (flagcode p_o, /*@only@*/ cstring p_s, /*@only@*/ cstring p_hint, + fileloc p_fl) /*@modifies g_msgstream@*/ ; +extern void llerror (flagcode p_o, /*@only@*/ cstring p_s) + /*@globals g_msgstream, g_currentloc@*/ + /*@modifies g_msgstream@*/ ; +extern void llgenmsg (/*@only@*/ cstring p_s, fileloc p_fl) /*@modifies g_msgstream@*/ ; +extern /*@exits@*/ void llfatalerror (/*@only@*/ cstring p_s) /*@modifies g_msgstream@*/ ; +extern /*@exits@*/ void llfatalerrorLoc (/*@only@*/ cstring p_s) + /*@globals g_currentloc@*/ + /*@modifies stderr@*/ ; +extern void llparseerror (/*@only@*/ cstring p_s) + /*@globals g_msgstream, g_currentloc@*/ + /*@modifies g_msgstream@*/ ; + +# ifndef NOLCL +extern /*@exits@*/ void lclplainfatalerror (/*@only@*/ cstring p_msg) /*@modifies g_msgstream@*/ ; +extern /*@exits@*/ void lclfatalbug (/*@temp@*/ char *p_msg) /*@modifies g_msgstream@*/ ; +extern int lclNumberErrors (void) /*@*/ ; +extern bool lclHadNewError (void) /*@modifies internalState@*/ ; +extern /*@exits@*/ void lclfatalerror (ltoken p_t, /*@only@*/ cstring p_msg); +extern void lclerror (ltoken p_t, /*@only@*/ cstring p_msg); + +extern void lclbug (/*@only@*/ cstring p_s); +extern void lclplainerror (/*@only@*/ cstring p_msg); +extern bool lclHadError (void); +extern void lclRedeclarationError (ltoken p_id); +# endif + +extern void flagWarning (/*@observer@*/ cstring p_s) /*@modifies g_msgstream@*/ ; + +extern /*@exits@*/ void llbugaux (cstring p_file, int p_line, /*@only@*/ cstring p_s) + /*@globals g_msgstream, g_currentloc@*/ + /*@modifies *g_msgstream@*/ ; + +extern /*@exits@*/ void llbug (/*@only@*/ cstring p_s) + /*@globals g_msgstream, g_currentloc@*/ + /*@modifies *g_msgstream@*/ ; + + /* doesn't really exit, but don't mind errors if it doesn't */ +# define llbug(s) llbugaux (cstring_makeLiteralTemp (__FILE__), __LINE__, s) + +extern void llquietbugaux (/*@only@*/ cstring p_s, cstring, int) /*@modifies *g_msgstream@*/ ; +extern void llquietbug (/*@only@*/ cstring) /*@modifies *g_msgstream@*/ ; +# define llquietbug(s) llquietbugaux (s, cstring_makeLiteralTemp (__FILE__), __LINE__) + +extern void llcontbug (/*@only@*/ cstring p_s) /*@modifies *g_msgstream@*/ ; + /* doesn't really exit, but don't mind errors if it doesn't */ +# define llcontbug(s) (llbug (s)) + +extern void cleanupMessages (void) + /*@globals g_msgstream, g_currentloc;@*/ + /*@modifies g_msgstream, internalState@*/ ; + +/* +** Report error iff f1 and f2 are set. +*/ + +extern bool +optgenerror2 (flagcode p_f1, flagcode p_f2, /*@only@*/ cstring p_s, fileloc p_loc) + /*@modifies *g_msgstream, internalState@*/ ; + +/* +** Report error if f1 is set and f2 is not set. +*/ + +extern bool +optgenerror2n (flagcode p_f1, flagcode p_f2, /*@only@*/ cstring p_s, fileloc p_loc) + /*@modifies *g_msgstream, internalState@*/ ; + +extern bool lloptgenerror (flagcode p_o, /*@only@*/ cstring p_s, fileloc p_loc) + /*@modifies *g_msgstream, internalState@*/ ; + +extern bool llnoptgenerror (flagcode p_o, /*@only@*/ cstring p_s, fileloc p_loc) + /*@modifies *g_msgstream, internalState@*/ ; + +extern bool llgenformattypeerror (ctype p_t1, exprNode p_e1, + ctype p_t2, exprNode p_e2, + /*@only@*/ cstring p_s, fileloc p_fl) + /*@modifies *g_msgstream, internalState@*/ ; + +extern bool llgentypeerror (ctype p_t1, exprNode p_e1, + ctype p_t2, exprNode p_e2, + /*@only@*/ cstring p_s, + fileloc p_fl) + /*@modifies *g_msgstream, internalState@*/ ; + +extern bool gentypeerror (/*@sef@*/ ctype p_t1, + /*@sef@*/ exprNode p_e1, + /*@sef@*/ ctype p_t2, + /*@sef@*/ exprNode p_e2, + /*@sef@*/ /*@only@*/ cstring p_s, + /*@sef@*/ fileloc p_loc) + /*@modifies *g_msgstream, internalState@*/ ; + +/*@-branchstate@*/ /* sef only s is freed on one branch */ +#define gentypeerror(t1, e1, t2, e2, s, loc) \ + (context_suppressFlagMsg (FLG_TYPE,loc) \ + ? (flagcode_recordSuppressed (FLG_TYPE), FALSE) \ + : llgentypeerror (t1, e1, t2, e2, s, loc)) +/*@=branchstate@*/ + +/* +** These are macros to save evaluating s (which may be some expensive +** message generation function). +*/ + +extern bool + optgenerror (/*@sef@*/ flagcode p_o, /*@sef@*/ /*@only@*/ cstring p_s, + /*@sef@*/ fileloc p_loc) + /*@modifies *g_msgstream, internalState@*/ ; + +/*@-branchstate@*/ /* sef only s is freed on one branch */ +#define optgenerror(o,s,loc) \ + (context_suppressFlagMsg(o,loc) ? (flagcode_recordSuppressed(o), FALSE) \ + : lloptgenerror (o, s, loc)) +/*@=branchstate@*/ + +extern void + voptgenerror (/*@sef@*/ flagcode p_o, /*@sef@*/ /*@only@*/ cstring p_s, + /*@sef@*/ fileloc p_loc) + /*@modifies *g_msgstream, internalState@*/ ; +#define voptgenerror(o, s, loc) ((void) optgenerror(o,s,loc)) + +extern void + voptgenerror2 (/*@sef@*/ flagcode p_f1, /*@sef@*/ flagcode p_f2, + /*@sef@*/ /*@only@*/ cstring p_s, /*@sef@*/ fileloc p_loc); +#define voptgenerror2(f1, f2, s, loc) ((void) optgenerror2 (f1, f2, s, loc)) + +extern void + voptgenerror2n (/*@sef@*/ flagcode p_f1, /*@sef@*/ flagcode p_f2, + /*@sef@*/ /*@only@*/ cstring p_s, /*@sef@*/ fileloc p_loc); +#define voptgenerror2n(f1, f2, s, loc) ((void) optgenerror2n (f1, f2, s, loc)) + +extern void noptgenerror (/*@sef@*/ flagcode p_code, + /*@sef@*/ /*@only@*/ cstring p_s, + /*@sef@*/ fileloc p_loc); +/*@-branchstate@*/ /* sef only s is freed on one branch */ +#define noptgenerror(o,s,loc) \ + (context_suppressNotFlagMsg (o, loc) \ + ? (flagcode_recordSuppressed(o), FALSE) \ + : llnoptgenerror (o, s, loc)) +/*@=branchstate@*/ + +extern void + vnoptgenerror (/*@sef@*/ flagcode p_code, /*@sef@*/ /*@only@*/ cstring p_msg, + /*@sef@*/ fileloc p_loc); +# define vnoptgenerror(o, s, loc) ((void) noptgenerror(o, s, loc)) + +extern void + vgenhinterror (flagcode p_code, /*@only@*/ cstring p_mst, + /*@only@*/ cstring p_hint, /*@sef@*/ fileloc p_loc); +# define vgenhinterror(o, s, h, loc) \ + ((void) llgenhinterror(o, s, h, loc)) + +extern void llforceerror (flagcode p_code, /*@only@*/ cstring p_s, fileloc p_fl) /*@modifies g_msgstream@*/ ; + +extern void llerrorlit (flagcode p_o, char *p_s); +extern void llgenindentmsg (/*@only@*/ cstring p_s, fileloc p_fl) /*@modifies g_msgstream@*/ ; + +extern /*@exits@*/ void llbugexitlit (char *p_s); +extern void llbuglit (char *p_s); +extern void llcontbuglit (char *p_s); + +# define llerror(o, s) ((void) llgenerror (o, s, g_currentloc)) +# define llerrorlit(o, s) ((void) llerror (o, cstring_makeLiteral (s))) +# define llbuglit(s) (llbug (cstring_makeLiteral (s))) +# define llcontbuglit(s) (llbug (cstring_makeLiteral (s))) +# define llbugexitlit(s) (llbug (cstring_makeLiteral (s))) + +extern void checkParseError (void); + +extern void llmsglit (char *p_s); +# define llmsglit(s) (llmsg (cstring_makeLiteral (s))) + +extern void ppllerror (/*@only@*/ cstring p_s); +extern void genppllerrorhint (flagcode p_code, /*@only@*/ cstring p_s, + /*@only@*/ cstring p_hint); +extern void genppllerror (flagcode p_code, /*@only@*/ cstring p_s); +extern /*@unused@*/ void pplldiagmsg (/*@only@*/ cstring p_s); +extern void loadllmsg (/*@only@*/ cstring p_s); + +extern void llgenindentmsgnoloc (/*@only@*/ cstring p_s); + +extern /*@observer@*/ cstring lldecodeerror (int) /*@*/ ; + +extern void prepareMessage (void) /*@modifies internalState, g_msgstream@*/ ; +extern void closeMessage (void) /*@modifies internalState, g_msgstream@*/ ; + +extern void llflush (void) /*@modifies systemState@*/ ; + +# else +# error "Multiple include" +# endif + diff --git a/src/Headers/llglobals.h b/src/Headers/llglobals.h new file mode 100644 index 0000000..64afd46 --- /dev/null +++ b/src/Headers/llglobals.h @@ -0,0 +1,18 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef LLGLOBALS_H +# define LLGLOBALS_H + +# ifdef NOLCL +# error "Bad include" +# endif + +extern /*@only@*/ lsymbolSet g_currentImports; +extern /*@only@*/ symtable g_symtab; + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/llgrammar.h b/src/Headers/llgrammar.h new file mode 100644 index 0000000..470a009 --- /dev/null +++ b/src/Headers/llgrammar.h @@ -0,0 +1,12 @@ +# ifndef LLGRAMMAR_H +# define LLGRAMMAR_H + +# include "llgrammar_gen.h" + +/*@-redecl@*/ +extern void ylerror (char *p_s) /*@modifies *g_msgstream@*/ ; +/*@=redecl@*/ + +# else +# error "Multiple includes" +# endif diff --git a/src/Headers/llgrammar2.h b/src/Headers/llgrammar2.h new file mode 100644 index 0000000..ff76109 --- /dev/null +++ b/src/Headers/llgrammar2.h @@ -0,0 +1,8 @@ +# ifndef LLGRAMMAR2_H +# define LLGRAMMAR2_H + +# include "llgrammar_gen2.h" + +# else +# error "Multiple includes" +# endif diff --git a/src/Headers/llgrammar_gen.h b/src/Headers/llgrammar_gen.h new file mode 100644 index 0000000..842c367 --- /dev/null +++ b/src/Headers/llgrammar_gen.h @@ -0,0 +1,289 @@ +/* +** Inserted at beginning of c files generated by bison +** REMEMBER: Change bison.reset too. +*/ + +/*@-allmacros@*/ +/*@+boolint@*/ +/*@+charint@*/ +/*@-macroparams@*/ +/*@-macroundef@*/ +/*@-unreachable@*/ +/*@-macrospec@*/ +/*@-varuse@*/ +/*@+ignorequals@*/ +/*@-macrostmt@*/ +/*@-noeffect@*/ +/*@-shadow@*/ +/*@-exitarg@*/ +/*@-macroredef@*/ +/*@-uniondef@*/ +/*@-compdef@*/ +/*@-matchfields@*/ +/*@-exportlocal@*/ +/*@-evalorderuncon@*/ +/*@-exportheader@*/ +/*@-typeuse@*/ +/*@-redecl@*/ +/*@-redef@*/ +/*@-noparams@*/ +/*@-ansireserved@*/ +/*@-fielduse@*/ +/*@-ifblock@*/ +/*@-elseifcomplete@*/ +/*@-whileblock@*/ +/*@-forblock@*/ +/*@-branchstate@*/ +/*@-readonlytrans@*/ +/*@-namechecks@*/ +/*@-usedef@*/ +/*@-systemunrecog@*/ +/*@-dependenttrans@*/ +/*@-unqualifiedtrans@*/ +/*@-nullassign@*/ + +/* < end of bison.head > */ + +typedef union +{ + ltoken ltok; /* a leaf is also an ltoken */ + qual typequal; + unsigned int count; + /*@only@*/ ltokenList ltokenList; + /*@only@*/ abstDeclaratorNode abstDecl; + /*@only@*/ declaratorNode declare; + /*@only@*/ declaratorNodeList declarelist; + /*@only@*/ typeExpr typeexpr; + /*@only@*/ arrayQualNode array; + /*@only@*/ quantifierNode quantifier; + /*@only@*/ quantifierNodeList quantifiers; + /*@only@*/ varNode var; + /*@only@*/ varNodeList vars; + /*@only@*/ storeRefNode storeref; + /*@only@*/ storeRefNodeList storereflist; + /*@only@*/ termNode term; + /*@only@*/ termNodeList termlist; + /*@only@*/ programNode program; + /*@only@*/ stmtNode stmt; + /*@only@*/ claimNode claim; + /*@only@*/ typeNode type; + /*@only@*/ iterNode iter; + /*@only@*/ fcnNode fcn; + /*@only@*/ fcnNodeList fcns; + /*@only@*/ letDeclNode letdecl; + /*@only@*/ letDeclNodeList letdecls; + /*@only@*/ lclPredicateNode lclpredicate; + /*@only@*/ modifyNode modify; + /*@only@*/ paramNode param; + /*@only@*/ paramNodeList paramlist; + /*@only@*/ declaratorInvNodeList declaratorinvs; + /*@only@*/ declaratorInvNode declaratorinv; + /*@only@*/ abstBodyNode abstbody; + /*@only@*/ abstractNode abstract; + /*@only@*/ exposedNode exposed; + /* taggedUnionNode taggedunion; */ + /*@only@*/ globalList globals; + /*@only@*/ constDeclarationNode constdeclaration; + /*@only@*/ varDeclarationNode vardeclaration; + /*@only@*/ varDeclarationNodeList vardeclarationlist; + /*@only@*/ initDeclNodeList initdecls; + /*@only@*/ initDeclNode initdecl; + /*@only@*/ stDeclNodeList structdecls; + /*@only@*/ stDeclNode structdecl; + /*@only@*/ strOrUnionNode structorunion; + /*@only@*/ enumSpecNode enumspec; + /*@only@*/ lclTypeSpecNode lcltypespec; + /*@only@*/ typeNameNode typname; + /*@only@*/ opFormNode opform; + /*@only@*/ sigNode signature; + /*@only@*/ nameNode name; + /*@only@*/ typeNameNodeList namelist; + /*@only@*/ replaceNode replace; + /*@only@*/ replaceNodeList replacelist; + /*@only@*/ renamingNode renaming; + /*@only@*/ traitRefNode traitref; + /*@only@*/ traitRefNodeList traitreflist; + /*@only@*/ importNode import; + /*@only@*/ importNodeList importlist; + /*@only@*/ interfaceNode iface; + /*@only@*/ interfaceNodeList interfacelist; + /*@only@*/ CTypesNode ctypes; +} YYSTYPE; +#define simpleOp 258 +#define PREFIX_OP 259 +#define POSTFIX_OP 260 +#define LLT_MULOP 261 +#define LLT_SEMI 262 +#define LLT_VERTICALBAR 263 +#define ITERATION_OP 264 +#define LLT_LPAR 265 +#define LLT_LBRACKET 266 +#define selectSym 267 +#define LLT_IF_THEN_ELSE 268 +#define logicalOp 269 +#define eqSepSym 270 +#define equationSym 271 +#define commentSym 272 +#define LLT_WHITESPACE 273 +#define LLT_EOL 274 +#define LLT_TYPEDEF_NAME 275 +#define quantifierSym 276 +#define openSym 277 +#define closeSym 278 +#define sepSym 279 +#define simpleId 280 +#define mapSym 281 +#define markerSym 282 +#define preSym 283 +#define postSym 284 +#define anySym 285 +#define LLT_COLON 286 +#define LLT_COMMA 287 +#define LLT_EQUALS 288 +#define LLT_LBRACE 289 +#define LLT_RBRACE 290 +#define LLT_RBRACKET 291 +#define LLT_RPAR 292 +#define LLT_QUOTE 293 +#define eqOp 294 +#define LLT_CCHAR 295 +#define LLT_CFLOAT 296 +#define LLT_CINTEGER 297 +#define LLT_LCSTRING 298 +#define LLT_ALL 299 +#define LLT_ANYTHING 300 +#define LLT_BE 301 +#define LLT_BODY 302 +#define LLT_CLAIMS 303 +#define LLT_CHECKS 304 +#define LLT_CONSTANT 305 +#define LLT_ELSE 306 +#define LLT_ENSURES 307 +#define LLT_FOR 308 +#define LLT_FRESH 309 +#define LLT_IF 310 +#define LLT_IMMUTABLE 311 +#define LLT_IMPORTS 312 +#define LLT_CONSTRAINT 313 +#define LLT_ISSUB 314 +#define LLT_LET 315 +#define LLT_MODIFIES 316 +#define LLT_MUTABLE 317 +#define LLT_NOTHING 318 +#define LLT_INTERNAL 319 +#define LLT_FILESYS 320 +#define LLT_OBJ 321 +#define LLT_OUT 322 +#define LLT_SEF 323 +#define LLT_ONLY 324 +#define LLT_PARTIAL 325 +#define LLT_OWNED 326 +#define LLT_DEPENDENT 327 +#define LLT_KEEP 328 +#define LLT_KEPT 329 +#define LLT_TEMP 330 +#define LLT_SHARED 331 +#define LLT_UNIQUE 332 +#define LLT_UNUSED 333 +#define LLT_EXITS 334 +#define LLT_MAYEXIT 335 +#define LLT_NEVEREXIT 336 +#define LLT_TRUEEXIT 337 +#define LLT_FALSEEXIT 338 +#define LLT_UNDEF 339 +#define LLT_KILLED 340 +#define LLT_CHECKMOD 341 +#define LLT_CHECKED 342 +#define LLT_UNCHECKED 343 +#define LLT_CHECKEDSTRICT 344 +#define LLT_TRUENULL 345 +#define LLT_FALSENULL 346 +#define LLT_LNULL 347 +#define LLT_LNOTNULL 348 +#define LLT_RETURNED 349 +#define LLT_OBSERVER 350 +#define LLT_EXPOSED 351 +#define LLT_REFCOUNTED 352 +#define LLT_REFS 353 +#define LLT_RELNULL 354 +#define LLT_RELDEF 355 +#define LLT_KILLREF 356 +#define LLT_TEMPREF 357 +#define LLT_NEWREF 358 +#define LLT_PRIVATE 359 +#define LLT_REQUIRES 360 +#define LLT_RESULT 361 +#define LLT_SIZEOF 362 +#define LLT_SPEC 363 +#define LLT_TAGGEDUNION 364 +#define LLT_THEN 365 +#define LLT_TYPE 366 +#define LLT_TYPEDEF 367 +#define LLT_UNCHANGED 368 +#define LLT_USES 369 +#define LLT_CHAR 370 +#define LLT_CONST 371 +#define LLT_DOUBLE 372 +#define LLT_ENUM 373 +#define LLT_FLOAT 374 +#define LLT_INT 375 +#define LLT_ITER 376 +#define LLT_YIELD 377 +#define LLT_LONG 378 +#define LLT_SHORT 379 +#define LLT_SIGNED 380 +#define LLT_UNKNOWN 381 +#define LLT_STRUCT 382 +#define LLT_TELIPSIS 383 +#define LLT_UNION 384 +#define LLT_UNSIGNED 385 +#define LLT_VOID 386 +#define LLT_VOLATILE 387 +#define LLT_PRINTFLIKE 388 +#define LLT_SCANFLIKE 389 +#define LLT_MESSAGELIKE 390 + + +extern YYSTYPE yllval; +/* +** Resets all flags in bison.head +*/ + + +/*@=allmacros@*/ +/*@=boolint@*/ +/*@=charint@*/ +/*@=macroparams@*/ +/*@=macroundef@*/ +/*@=unreachable@*/ +/*@=macrospec@*/ +/*@=varuse@*/ +/*@=ignorequals@*/ +/*@=macrostmt@*/ +/*@=noeffect@*/ +/*@=shadow@*/ +/*@=exitarg@*/ +/*@=macroredef@*/ +/*@=uniondef@*/ +/*@=compdef@*/ +/*@=matchfields@*/ +/*@=exportlocal@*/ +/*@=evalorderuncon@*/ +/*@=exportheader@*/ +/*@=typeuse@*/ +/*@=redecl@*/ +/*@=redef@*/ +/*@=noparams@*/ +/*@=ansireserved@*/ +/*@=fielduse@*/ +/*@=ifblock@*/ +/*@=elseifcomplete@*/ +/*@=whileblock@*/ +/*@=forblock@*/ +/*@=branchstate@*/ +/*@=readonlytrans@*/ +/*@=namechecks@*/ +/*@=usedef@*/ +/*@=systemunrecog@*/ +/*@=dependenttrans@*/ +/*@=unqualifiedtrans@*/ diff --git a/src/Headers/llgrammar_gen2.h b/src/Headers/llgrammar_gen2.h new file mode 100644 index 0000000..842c367 --- /dev/null +++ b/src/Headers/llgrammar_gen2.h @@ -0,0 +1,289 @@ +/* +** Inserted at beginning of c files generated by bison +** REMEMBER: Change bison.reset too. +*/ + +/*@-allmacros@*/ +/*@+boolint@*/ +/*@+charint@*/ +/*@-macroparams@*/ +/*@-macroundef@*/ +/*@-unreachable@*/ +/*@-macrospec@*/ +/*@-varuse@*/ +/*@+ignorequals@*/ +/*@-macrostmt@*/ +/*@-noeffect@*/ +/*@-shadow@*/ +/*@-exitarg@*/ +/*@-macroredef@*/ +/*@-uniondef@*/ +/*@-compdef@*/ +/*@-matchfields@*/ +/*@-exportlocal@*/ +/*@-evalorderuncon@*/ +/*@-exportheader@*/ +/*@-typeuse@*/ +/*@-redecl@*/ +/*@-redef@*/ +/*@-noparams@*/ +/*@-ansireserved@*/ +/*@-fielduse@*/ +/*@-ifblock@*/ +/*@-elseifcomplete@*/ +/*@-whileblock@*/ +/*@-forblock@*/ +/*@-branchstate@*/ +/*@-readonlytrans@*/ +/*@-namechecks@*/ +/*@-usedef@*/ +/*@-systemunrecog@*/ +/*@-dependenttrans@*/ +/*@-unqualifiedtrans@*/ +/*@-nullassign@*/ + +/* < end of bison.head > */ + +typedef union +{ + ltoken ltok; /* a leaf is also an ltoken */ + qual typequal; + unsigned int count; + /*@only@*/ ltokenList ltokenList; + /*@only@*/ abstDeclaratorNode abstDecl; + /*@only@*/ declaratorNode declare; + /*@only@*/ declaratorNodeList declarelist; + /*@only@*/ typeExpr typeexpr; + /*@only@*/ arrayQualNode array; + /*@only@*/ quantifierNode quantifier; + /*@only@*/ quantifierNodeList quantifiers; + /*@only@*/ varNode var; + /*@only@*/ varNodeList vars; + /*@only@*/ storeRefNode storeref; + /*@only@*/ storeRefNodeList storereflist; + /*@only@*/ termNode term; + /*@only@*/ termNodeList termlist; + /*@only@*/ programNode program; + /*@only@*/ stmtNode stmt; + /*@only@*/ claimNode claim; + /*@only@*/ typeNode type; + /*@only@*/ iterNode iter; + /*@only@*/ fcnNode fcn; + /*@only@*/ fcnNodeList fcns; + /*@only@*/ letDeclNode letdecl; + /*@only@*/ letDeclNodeList letdecls; + /*@only@*/ lclPredicateNode lclpredicate; + /*@only@*/ modifyNode modify; + /*@only@*/ paramNode param; + /*@only@*/ paramNodeList paramlist; + /*@only@*/ declaratorInvNodeList declaratorinvs; + /*@only@*/ declaratorInvNode declaratorinv; + /*@only@*/ abstBodyNode abstbody; + /*@only@*/ abstractNode abstract; + /*@only@*/ exposedNode exposed; + /* taggedUnionNode taggedunion; */ + /*@only@*/ globalList globals; + /*@only@*/ constDeclarationNode constdeclaration; + /*@only@*/ varDeclarationNode vardeclaration; + /*@only@*/ varDeclarationNodeList vardeclarationlist; + /*@only@*/ initDeclNodeList initdecls; + /*@only@*/ initDeclNode initdecl; + /*@only@*/ stDeclNodeList structdecls; + /*@only@*/ stDeclNode structdecl; + /*@only@*/ strOrUnionNode structorunion; + /*@only@*/ enumSpecNode enumspec; + /*@only@*/ lclTypeSpecNode lcltypespec; + /*@only@*/ typeNameNode typname; + /*@only@*/ opFormNode opform; + /*@only@*/ sigNode signature; + /*@only@*/ nameNode name; + /*@only@*/ typeNameNodeList namelist; + /*@only@*/ replaceNode replace; + /*@only@*/ replaceNodeList replacelist; + /*@only@*/ renamingNode renaming; + /*@only@*/ traitRefNode traitref; + /*@only@*/ traitRefNodeList traitreflist; + /*@only@*/ importNode import; + /*@only@*/ importNodeList importlist; + /*@only@*/ interfaceNode iface; + /*@only@*/ interfaceNodeList interfacelist; + /*@only@*/ CTypesNode ctypes; +} YYSTYPE; +#define simpleOp 258 +#define PREFIX_OP 259 +#define POSTFIX_OP 260 +#define LLT_MULOP 261 +#define LLT_SEMI 262 +#define LLT_VERTICALBAR 263 +#define ITERATION_OP 264 +#define LLT_LPAR 265 +#define LLT_LBRACKET 266 +#define selectSym 267 +#define LLT_IF_THEN_ELSE 268 +#define logicalOp 269 +#define eqSepSym 270 +#define equationSym 271 +#define commentSym 272 +#define LLT_WHITESPACE 273 +#define LLT_EOL 274 +#define LLT_TYPEDEF_NAME 275 +#define quantifierSym 276 +#define openSym 277 +#define closeSym 278 +#define sepSym 279 +#define simpleId 280 +#define mapSym 281 +#define markerSym 282 +#define preSym 283 +#define postSym 284 +#define anySym 285 +#define LLT_COLON 286 +#define LLT_COMMA 287 +#define LLT_EQUALS 288 +#define LLT_LBRACE 289 +#define LLT_RBRACE 290 +#define LLT_RBRACKET 291 +#define LLT_RPAR 292 +#define LLT_QUOTE 293 +#define eqOp 294 +#define LLT_CCHAR 295 +#define LLT_CFLOAT 296 +#define LLT_CINTEGER 297 +#define LLT_LCSTRING 298 +#define LLT_ALL 299 +#define LLT_ANYTHING 300 +#define LLT_BE 301 +#define LLT_BODY 302 +#define LLT_CLAIMS 303 +#define LLT_CHECKS 304 +#define LLT_CONSTANT 305 +#define LLT_ELSE 306 +#define LLT_ENSURES 307 +#define LLT_FOR 308 +#define LLT_FRESH 309 +#define LLT_IF 310 +#define LLT_IMMUTABLE 311 +#define LLT_IMPORTS 312 +#define LLT_CONSTRAINT 313 +#define LLT_ISSUB 314 +#define LLT_LET 315 +#define LLT_MODIFIES 316 +#define LLT_MUTABLE 317 +#define LLT_NOTHING 318 +#define LLT_INTERNAL 319 +#define LLT_FILESYS 320 +#define LLT_OBJ 321 +#define LLT_OUT 322 +#define LLT_SEF 323 +#define LLT_ONLY 324 +#define LLT_PARTIAL 325 +#define LLT_OWNED 326 +#define LLT_DEPENDENT 327 +#define LLT_KEEP 328 +#define LLT_KEPT 329 +#define LLT_TEMP 330 +#define LLT_SHARED 331 +#define LLT_UNIQUE 332 +#define LLT_UNUSED 333 +#define LLT_EXITS 334 +#define LLT_MAYEXIT 335 +#define LLT_NEVEREXIT 336 +#define LLT_TRUEEXIT 337 +#define LLT_FALSEEXIT 338 +#define LLT_UNDEF 339 +#define LLT_KILLED 340 +#define LLT_CHECKMOD 341 +#define LLT_CHECKED 342 +#define LLT_UNCHECKED 343 +#define LLT_CHECKEDSTRICT 344 +#define LLT_TRUENULL 345 +#define LLT_FALSENULL 346 +#define LLT_LNULL 347 +#define LLT_LNOTNULL 348 +#define LLT_RETURNED 349 +#define LLT_OBSERVER 350 +#define LLT_EXPOSED 351 +#define LLT_REFCOUNTED 352 +#define LLT_REFS 353 +#define LLT_RELNULL 354 +#define LLT_RELDEF 355 +#define LLT_KILLREF 356 +#define LLT_TEMPREF 357 +#define LLT_NEWREF 358 +#define LLT_PRIVATE 359 +#define LLT_REQUIRES 360 +#define LLT_RESULT 361 +#define LLT_SIZEOF 362 +#define LLT_SPEC 363 +#define LLT_TAGGEDUNION 364 +#define LLT_THEN 365 +#define LLT_TYPE 366 +#define LLT_TYPEDEF 367 +#define LLT_UNCHANGED 368 +#define LLT_USES 369 +#define LLT_CHAR 370 +#define LLT_CONST 371 +#define LLT_DOUBLE 372 +#define LLT_ENUM 373 +#define LLT_FLOAT 374 +#define LLT_INT 375 +#define LLT_ITER 376 +#define LLT_YIELD 377 +#define LLT_LONG 378 +#define LLT_SHORT 379 +#define LLT_SIGNED 380 +#define LLT_UNKNOWN 381 +#define LLT_STRUCT 382 +#define LLT_TELIPSIS 383 +#define LLT_UNION 384 +#define LLT_UNSIGNED 385 +#define LLT_VOID 386 +#define LLT_VOLATILE 387 +#define LLT_PRINTFLIKE 388 +#define LLT_SCANFLIKE 389 +#define LLT_MESSAGELIKE 390 + + +extern YYSTYPE yllval; +/* +** Resets all flags in bison.head +*/ + + +/*@=allmacros@*/ +/*@=boolint@*/ +/*@=charint@*/ +/*@=macroparams@*/ +/*@=macroundef@*/ +/*@=unreachable@*/ +/*@=macrospec@*/ +/*@=varuse@*/ +/*@=ignorequals@*/ +/*@=macrostmt@*/ +/*@=noeffect@*/ +/*@=shadow@*/ +/*@=exitarg@*/ +/*@=macroredef@*/ +/*@=uniondef@*/ +/*@=compdef@*/ +/*@=matchfields@*/ +/*@=exportlocal@*/ +/*@=evalorderuncon@*/ +/*@=exportheader@*/ +/*@=typeuse@*/ +/*@=redecl@*/ +/*@=redef@*/ +/*@=noparams@*/ +/*@=ansireserved@*/ +/*@=fielduse@*/ +/*@=ifblock@*/ +/*@=elseifcomplete@*/ +/*@=whileblock@*/ +/*@=forblock@*/ +/*@=branchstate@*/ +/*@=readonlytrans@*/ +/*@=namechecks@*/ +/*@=usedef@*/ +/*@=systemunrecog@*/ +/*@=dependenttrans@*/ +/*@=unqualifiedtrans@*/ diff --git a/src/Headers/llmain.h b/src/Headers/llmain.h new file mode 100644 index 0000000..ed27200 --- /dev/null +++ b/src/Headers/llmain.h @@ -0,0 +1,54 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef LLMAIN_H +# define LLMAIN_H + +extern int main (int p_argc, char *p_argv[]) +# ifdef NOLCL + /*@globals killed undef g_currentloc, + killed undef yyin, + undef g_msgstream, + @*/ + /*@modifies g_currentloc, fileSystem, internalState, yyin; + @*/ +# else + /*@globals killed undef g_currentloc, + killed g_localSpecPath, + killed undef g_currentSpec, + killed undef g_currentSpecName, + killed undef g_currentloc, + killed undef yyin, + undef g_msgstream; + @*/ + /*@modifies g_currentloc, + g_localSpecPath, g_currentSpec, g_currentSpecName, + yyin, internalState, fileSystem; + @*/ +# endif + ; + +extern /*@exits@*/ void llexit (int p_status); +extern void showHerald (void); + +/*@-redecl@*/ +extern int yyparse (void); +extern void yyrestart (FILE *p_f); + +# ifndef NOLCL +extern int ylparse (void); +extern int lslparse (void); +# endif + +/*@=redecl@*/ + +/*@-incondefs@*/ /*@-redecl@*/ +extern /*@dependent@*/ FILE *yyin; +/*@=incondefs@*/ /*@=redecl@*/ + + +# endif + + diff --git a/src/Headers/lltok.h b/src/Headers/lltok.h new file mode 100644 index 0000000..960ebcf --- /dev/null +++ b/src/Headers/lltok.h @@ -0,0 +1,34 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** lltok.h +*/ + +# ifndef LLTOK_H +# define LLTOK_H + +typedef struct _lltok +{ + int tok; + fileloc loc; +} lltok; + +extern lltok lltok_create (int p_tok, /*@only@*/ fileloc p_loc) /*@modifies nothing@*/ ; +extern /*@observer@*/ cstring lltok_unparse (lltok p_tok) /*@*/ ; + +extern void lltok_release (/*@special@*/ lltok p_t) /*@releases p_t.loc@*/ ; + +extern /*@dependent@*/ /*@exposed@*/ fileloc lltok_getLoc (lltok p_t) /*@*/ ; +extern int lltok_getTok (lltok p_t) /*@*/ ; + +# define lltok_getTok(t) ((t).tok) +# define lltok_getLoc(t) ((t).loc) + +extern bool lltok_isSemi (lltok p_tok); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/local_constants-os2.h b/src/Headers/local_constants-os2.h new file mode 100644 index 0000000..2e66757 --- /dev/null +++ b/src/Headers/local_constants-os2.h @@ -0,0 +1,15 @@ +/* + * This is local_constants.h from Mike Smith's Win32 port of lclint. + * Modified by Herbert 04/19/97: + * added conditional 'OS2' to conditional 'MSDOS' + */ + +/*@constant observer char *SYSTEM_LIBDIR; @*/ +# define SYSTEM_LIBDIR "/usr/include" + +/*@constant observer char *DEFAULT_LARCHPATH; @*/ +# define DEFAULT_LARCHPATH ".;/usr/lib/lclint/lib" + +/*@constant observer char *DEFAULT_LCLIMPORTDIR; @*/ +# define DEFAULT_LCLIMPORTDIR "/usr/lib/lclint/imports" + diff --git a/src/Headers/local_constants.h b/src/Headers/local_constants.h new file mode 100644 index 0000000..865afaa --- /dev/null +++ b/src/Headers/local_constants.h @@ -0,0 +1,7 @@ +/* local_constants.h - created automatically by gmake localconstants */ +/*@constant observer char *SYSTEM_LIBDIR;@*/ +# define SYSTEM_LIBDIR "/usr/include" +/*@constant observer char *DEFAULT_LARCHPATH;@*/ +# define DEFAULT_LARCHPATH ".:/a/apollo.cs.Virginia.EDU/af10/evans/lclint-build/lclint-2.5m/lib" +/*@constant observer char *DEFAULT_LCLIMPORTDIR;@*/ +# define DEFAULT_LCLIMPORTDIR "/a/apollo.cs.Virginia.EDU/af10/evans/lclint-build/lclint-2.5m/imports" diff --git a/src/Headers/local_constants.last b/src/Headers/local_constants.last new file mode 100644 index 0000000..75e573b --- /dev/null +++ b/src/Headers/local_constants.last @@ -0,0 +1,9 @@ +/* local_constants.h - created automatically by gmake localconstants */ +/*@constant observer char *DEFAULT_CPPCMD;@*/ +# define DEFAULT_CPPCMD +/*@constant observer char *SYSTEM_LIBDIR;@*/ +# define SYSTEM_LIBDIR +/*@constant observer char *DEFAULT_LARCHPATH;@*/ +# define DEFAULT_LARCHPATH +/*@constant observer char *DEFAULT_LCLIMPORTDIR;@*/ +# define DEFAULT_LCLIMPORTDIR diff --git a/src/Headers/lslOp.h b/src/Headers/lslOp.h new file mode 100644 index 0000000..bb5a0c0 --- /dev/null +++ b/src/Headers/lslOp.h @@ -0,0 +1,15 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _lslOp { + /*@null@*/ /*@only@*/ nameNode name; + /*@dependent@*/ sigNode signature; /* optional */ +} *lslOp; + +typedef /*@only@*/ lslOp o_lslOp; + +extern void lslOp_free (/*@only@*/ lslOp p_x); +extern /*@only@*/ lslOp lslOp_copy (lslOp); diff --git a/src/Headers/lslOpList.h b/src/Headers/lslOpList.h new file mode 100644 index 0000000..007fc4d --- /dev/null +++ b/src/Headers/lslOpList.h @@ -0,0 +1,32 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef lslOpLIST_H +# define lslOpLIST_H + +typedef /*@exposed@*/ lslOp e_lslOp; + +abst_typedef struct _lslOpList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@only@*/ /*@relnull@*/ e_lslOp *elements; +} *lslOpList ; + +extern /*@only@*/ lslOpList lslOpList_new(void); +extern void lslOpList_add (lslOpList p_s, /*@exposed@*/ lslOp p_el) ; + +extern /*@unused@*/ /*@only@*/ cstring lslOpList_unparse (lslOpList p_s) ; +extern void lslOpList_free (/*@only@*/ lslOpList p_s) ; + +/*@constant int lslOpListBASESIZE;@*/ +# define lslOpListBASESIZE SMALLBASESIZE +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/lslOpSet.h b/src/Headers/lslOpSet.h new file mode 100644 index 0000000..7c86388 --- /dev/null +++ b/src/Headers/lslOpSet.h @@ -0,0 +1,55 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** lslOpSet.h +** +** based on set_template.h +*/ + +# ifndef lslOpSET_H +# define lslOpSET_H + +abst_typedef /*@null@*/ struct _lslOpSet +{ + int entries; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_lslOp *elements; +} *lslOpSet ; + +/*@iter lslOpSet_elements (sef lslOpSet s, yield exposed lslOp el); @*/ +# define lslOpSet_elements(x, m_el) \ + { if (lslOpSet_isDefined (x)) { int m_ind; \ + for (m_ind = 0 ; m_ind < (x)->entries; m_ind++) \ + { lslOp m_el = (x)->elements[m_ind]; + +# define end_lslOpSet_elements }}} + +/*@constant null lslOpSet lslOpSet_undefined;@*/ +# define lslOpSet_undefined ((lslOpSet) NULL) + +extern /*@falsenull@*/ bool lslOpSet_isDefined (lslOpSet p_s) /*@*/ ; +# define lslOpSet_isDefined(s) ((s) != lslOpSet_undefined) + +extern /*@unused@*/ int + lslOpSet_size (/*@sef@*/ lslOpSet p_s) /*@*/ ; + +# define lslOpSet_size(s) \ + (lslOpSet_isDefined(s) ? (s)->entries : 0) + +extern /*@only@*/ lslOpSet lslOpSet_new (void) /*@*/ ; +extern bool lslOpSet_insert (lslOpSet p_s, /*@only@*/ lslOp p_el) + /*@modifies p_s@*/ ; + +extern /*@unused@*/ /*@only@*/ cstring lslOpSet_unparse (lslOpSet p_s) /*@*/ ; +extern void lslOpSet_free (/*@only@*/ lslOpSet p_s); +extern /*@only@*/ lslOpSet lslOpSet_copy (lslOpSet p_s) /*@*/ ; + +/*@constant int lslOpSetBASESIZE;@*/ +# define lslOpSetBASESIZE MIDBASESIZE + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/lslinit.h b/src/Headers/lslinit.h new file mode 100644 index 0000000..7ba10fc --- /dev/null +++ b/src/Headers/lslinit.h @@ -0,0 +1,197 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** lslinit.h +*/ + +typedef enum { + /* initFile: */ + INITFILE1, /* initLines EOF */ + + + + /* initLines: */ + INITLINES1, /* */ + INITLINES2, /* initLine */ + INITLINES3, /* initLines initLine */ + + /* initLine: */ + INITLINE1, /* EOL */ + INITLINE2, /* classification EOL */ + + /* classification: */ + CLASSIFICATION1, /* charClass */ + CLASSIFICATION2, /* tokenClass */ + CLASSIFICATION3, /* synClass */ + + /* charClass: */ + CHARCLASS1, /* ENDCOMMENTCHAR endCommentChars */ + CHARCLASS2, /* IDCHAR idChars */ + CHARCLASS3, /* OPCHAR opChars */ + CHARCLASS4, /* CHC_EXTENSION extensionChar */ + CHARCLASS5, /* SINGLECHAR singChars */ + CHARCLASS6, /* WHITECHAR whiteChars */ + + + /* endCommentChars: */ + LRC_ENDCOMMENT1, /* endCommentChar */ + LRC_ENDCOMMENT2, /* endCommentChars endCommentChar */ + + /* idChars: */ + IDCHARS1, /* idChar */ + IDCHARS2, /* idChars idChar */ + + /* opChars */ + OPCHARS1, /* opChar */ + OPCHARS2, /* opChars opChar */ + + /* ExtensionChar */ + LRC_EXTENSIONCHAR1, /* singleChar */ + + /* singChars */ + SINGCHARS1, /* singChar */ + SINGCHARS2, /* singChars singChar */ + + /* whiteChars */ + WHITECHARS1, /* whiteChar */ + WHITECHARS2, /* whiteChars whiteChar */ + + + /* endCommentChar */ + LRC_ENDCOMMENTCHAR1, /* commentChar */ + + /* idChar */ + IDCHAR1, /* singleChar */ + + /* opChar */ + OPCHAR1, /* singleChar */ + + /* singChar */ + SINGCHAR1, /* singleChar */ + + /* whiteChar */ + WHITECHAR1, /* singleChar */ + + /* tokenClass: */ + TOKENCLASS1, /* QUANTIFIERSYM quantifierSymToks */ + TOKENCLASS2, /* LOGICALOP logicalOpToks */ + TOKENCLASS3, /* EQOP eqOpToks */ + TOKENCLASS4, /* EQUATIONSYM equationSymToks */ + TOKENCLASS5, /* EQSEPSYM eqSepSymToks */ + TOKENCLASS6, /* SELECTSYM selectSymToks */ + TOKENCLASS7, /* OPENSYM openSymToks */ + TOKENCLASS8, /* SEPSYM sepSymToks */ + TOKENCLASS9, /* CLOSESYM closeSymToks */ + TOKENCLASS10, /* SIMPLEID simpleIdToks */ + TOKENCLASS11, /* MAPSYM mapSymToks */ + TOKENCLASS12, /* MARKERSYM markerSymToks */ + TOKENCLASS13, /* COMMENTSYM commentSymToks */ + + /* quantifierSymToks */ + QUANTIFIERSYMTOKS1,/* quantifierSymTok */ + QUANTIFIERSYMTOKS2,/* quantifierSymToks quantifierSymTok */ + + /* logicalOpToks */ + LOGICALOPTOKS1, /* logicalOpTok */ + LOGICALOPTOKS2, /* logicalOpToks logicalOpTok */ + + /* eqOpToks */ + LRC_EQOPTOKS1, /* eqOpTok */ + LRC_EQOPTOKS2, /* eqOpToks eqOpTok */ + + /* equationSymToks */ + LRC_EQUATIONSYMTOKS1, /* equationSymTok */ + LRC_EQUATIONSYMTOKS2, /* equationSymToks equationSymTok */ + + /* eqSepSymToks */ + LRC_EQSEPSYMTOKS1, /* eqSepSymTok */ + LRC_EQSEPSYMTOKS2, /* eqSepSymToks eqSepSymTok */ + + /* selectSymToks */ + SELECTSYMTOKS1, /* selectSymTok */ + SELECTSYMTOKS2, /* selectSymToks selectSymTok */ + + /* openSymToks */ + OPENSYMTOKS1, /* openSymTok */ + OPENSYMTOKS2, /* openSymToks openSymTok */ + + /* sepSymToks */ + SEPSYMTOKS1, /* sepSymTok */ + SEPSYMTOKS2, /* sepSymToks sepSymTok */ + + /* closeSymToks */ + CLOSESYMTOKS1, /* closeSymTok */ + CLOSESYMTOKS2, /* closeSymToks closeSymTok */ + + /* simpleIdToks */ + SIMPLEIDTOKS1, /* simpleIdTok */ + SIMPLEIDTOKS2, /* simpleIdToks simpleIdTok */ + + /* mapSymToks */ + MAPSYMTOKS1, /* mapSymTok */ + MAPSYMTOKS2, /* mapSymToks mapSymTok */ + + /* markerSymToks */ + MARKERSYMTOKS1, /* markerSymTok */ + MARKERSYMTOKS2, /* markerSymToks markerSymTok */ + + /* commentSymToks */ + COMMENTSYMTOKS1, /* commentSymTok */ + COMMENTSYMTOKS2, /* commentSymToks commentSymTok */ + + /* quantifierSymTok */ + QUANTIFIERSYMTOK1, /* token */ + + /* logicalOpTok */ + LOGICALOPTOK1, /* token */ + + /* eqOpTok */ + LRC_EQOPTOK1, /* token */ + + /* equationSymTok */ + LRC_EQUATIONSYMTOK1, /* token */ + + /* eqSepSymTok */ + LRC_EQSEPSYMTOK1, /* token */ + + /* selectSymTok */ + SELECTSYMTOK1, /* token */ + + /* openSymTok */ + OPENSYMTOK1, /* token */ + + /* sepSymTok */ + SEPSYMTOK1, /* token */ + + /* closeSymTok */ + CLOSESYMTOK1, /* token */ + + /* simpleIdTok */ + SIMPLEIDTOK1, /* token */ + + /* mapSymTok */ + MAPSYMTOK1, /* token */ + + /* markerSymTok */ + MARKERSYMTOK1, /* token */ + + /* commentSymTok */ + COMMENTSYMTOK1, /* token */ + + /* synClass: */ + SYNCLASS1, /* SYNONYM oldToken newToken */ + + /* oldToken: */ + OLDTOKEN1, /* token */ + + /* newToken: */ + NEWTOKEN1 /* token */ + +} LSLInitRuleCode; + +extern void LSLProcessInitFile (void); +extern void LSLProcessInitFileInit (void); + diff --git a/src/Headers/lslparse.h b/src/Headers/lslparse.h new file mode 100644 index 0000000..1c378fe --- /dev/null +++ b/src/Headers/lslparse.h @@ -0,0 +1,21 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** lslparse.h +*/ + +extern /*@dependent@*/ /*@null@*/ lslOp g_importedlslOp; +extern bool g_lslParsingTraits; + +/*@-namechecks@*/ +extern int lsldebug; /* defined by bison (not a bool) */ +/*@=namechecks@*/ + +extern lsymbol processTraitSortId (lsymbol p_sortid); +extern int parseSignatures (cstring p_infile); +extern /*@only@*/ lslOp parseOpLine (char *p_fname, char *p_line); +extern void readlsignatures (interfaceNode p_n); +extern void callLSL (char *p_specfile, /*@only@*/ char *p_text); diff --git a/src/Headers/lsymbol.h b/src/Headers/lsymbol.h new file mode 100644 index 0000000..915d8bb --- /dev/null +++ b/src/Headers/lsymbol.h @@ -0,0 +1,39 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +# ifndef LSYMBOL_H +# define LSYMBOL_H + +/* +** Offset entries by 1, so 0 is available. +*/ + +/*@constant null lsymbol lsymbol_undefined; @*/ +# define lsymbol_undefined ((lsymbol) 0) + +extern bool lsymbol_isDefined (lsymbol p_s); +# define lsymbol_isDefined(s) ((s) != lsymbol_undefined) + +extern bool lsymbol_isUndefined (lsymbol p_s); +# define lsymbol_isUndefined(s) ((s) == lsymbol_undefined) + +extern lsymbol lsymbol_fromChars (/*@temp@*/ char *) /*@*/ ; +extern lsymbol lsymbol_fromString (/*@temp@*/ cstring p_s) /*@*/ ; +extern /*@exposed@*/ /*@null@*/ char *lsymbol_toChars (lsymbol) /*@*/ ; +extern /*@exposed@*/ char *lsymbol_toCharsSafe (lsymbol) /*@*/ ; +extern /*@observer@*/ cstring lsymbol_toString(lsymbol) /*@*/ ; + +extern bool lsymbol_equal (lsymbol p_s1, lsymbol p_s2) /*@*/ ; +# define lsymbol_equal(s1, s2) ((s1) == (s2)) + +extern /*@unused@*/ void lsymbol_printStats (void); + +extern void lsymbol_initMod (void) /*@modifies internalState@*/ ; +extern void lsymbol_destroyMod (void) /*@modifies internalState@*/ ; + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/lsymbolList.h b/src/Headers/lsymbolList.h new file mode 100644 index 0000000..ab493e5 --- /dev/null +++ b/src/Headers/lsymbolList.h @@ -0,0 +1,39 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +# ifndef LSYMBOLLIST_H +# define LSYMBOLLIST_H + +abst_typedef struct _lsymbolList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ lsymbol *elements; +} *lsymbolList ; + +/*@iter lsymbolList_elements (sef lsymbolList x, yield lsymbol el); @*/ +# define lsymbolList_elements(x, m_el) \ + { int m_ind; lsymbol *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { lsymbol m_el = *(m_elements++); + +# define end_lsymbolList_elements }} + +extern /*@only@*/ lsymbolList lsymbolList_new(void); +extern void lsymbolList_addh (lsymbolList p_s, lsymbol p_el) ; + +extern void lsymbolList_free (/*@only@*/ lsymbolList p_s) ; + +/*@constant int lsymbolListBASESIZE;@*/ +# define lsymbolListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/lsymbolSet.h b/src/Headers/lsymbolSet.h new file mode 100644 index 0000000..69ac3e8 --- /dev/null +++ b/src/Headers/lsymbolSet.h @@ -0,0 +1,48 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** lsymbolSet.h +** +** based on set_template.h +*/ + +# ifndef LSYMBOLSET_H +# define LSYMBOLSET_H + +abst_typedef /*@null@*/ struct _lsymbolSet +{ + int entries; + int nspace; + /*@reldef@*/ /*@relnull@*/ lsymbol *elements; +} *lsymbolSet ; + +/*@constant null lsymbolSet lsymbolSet_undefined; @*/ +# define lsymbolSet_undefined (NULL) + +extern /*@falsenull@*/ bool lsymbolSet_isDefined (lsymbolSet p_l) /*@*/ ; +# define lsymbolSet_isDefined(l) ((l) != lsymbolSet_undefined) + +/*@iter lsymbolSet_elements (sef lsymbolSet s, yield lsymbol el); @*/ +# define lsymbolSet_elements(x, m_el) \ + if (lsymbolSet_isDefined (x)) \ + { int m_ind; \ + for (m_ind = 0 ; m_ind < (x)->entries; m_ind++) \ + { lsymbol m_el = (x)->elements[m_ind]; + +# define end_lsymbolSet_elements }} + +extern /*@only@*/ lsymbolSet lsymbolSet_new(void) /*@*/ ; +extern bool lsymbolSet_insert (lsymbolSet p_s, lsymbol p_el) /*@modifies p_s@*/ ; +extern bool lsymbolSet_member (lsymbolSet p_s, lsymbol p_el) /*@*/ ; +extern /*@unused@*/ /*@only@*/ cstring lsymbolSet_unparse (lsymbolSet p_s) /*@*/ ; +extern void lsymbolSet_free (/*@only@*/ lsymbolSet p_s); + +/*@constant int lsymbolSetBASESIZE;@*/ +# define lsymbolSetBASESIZE MIDBASESIZE + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/ltoken.h b/src/Headers/ltoken.h new file mode 100644 index 0000000..4f5cf99 --- /dev/null +++ b/src/Headers/ltoken.h @@ -0,0 +1,216 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** ltoken.h +*/ + +# ifdef NOLCL +# error "Bad include" +# endif + +# ifndef LTOKEN_H +# define LTOKEN_H + +/* SimpleId codes */ +typedef enum { + SID_VAR, /* VarId */ + SID_TYPE, /* TypeId */ + SID_OP, /* OpId */ + SID_SORT /* sortId */ +} SimpleIdCode; + +struct _ltoken { + unsigned int code; + unsigned int col: 8; + unsigned int line: 16; + + + /* if idtype is SID_SORT, then text field keeps the sort */ + + lsymbol text; /* string handle */ + lsymbol fname; /* source handle */ + lsymbol rawText; /* original text */ + bool defined: 1; /* token predefined */ + bool hasSyn: 1; /* synonym exists */ + + /* just for simpleId: for distinguish simpleId into varId, fcnId, TypeId, ... */ + /*@reldef@*/ SimpleIdCode idtype; + + /* quick and dirty: just for ctypes */ + /*@reldef@*/ unsigned int intfield; +} ; + +typedef /*@only@*/ ltoken o_ltoken; + +/*@constant null ltoken ltoken_undefined; @*/ +# define ltoken_undefined ((ltoken)NULL) + +extern /*@falsenull@*/ bool ltoken_isValid (ltoken p_tok); +# define ltoken_isValid(t) ((t) != ltoken_undefined) + +extern /*@truenull@*/ bool ltoken_isUndefined (ltoken p_tok); +# define ltoken_isUndefined(t) ((t) == ltoken_undefined) + +extern bool ltoken_isStateDefined (/*@sef@*/ ltoken p_tok) /*@*/ ; +# define ltoken_isStateDefined(t) \ + (ltoken_isValid (t) && (t)->defined) + +extern void ltoken_setDefined (/*@sef@*/ ltoken p_tok, bool p_def); +# define ltoken_setDefined(t, def) \ + (ltoken_isValid (t) ? (t)->defined = (def) : (def)) + +extern ltoken + ltoken_createType (unsigned int p_code, SimpleIdCode p_idtype, lsymbol p_text) /*@*/ ; + +extern ltoken ltoken_create (unsigned int p_code, lsymbol p_text) /*@*/ ; + +extern void ltoken_setIntField (/*@sef@*/ ltoken p_tok, unsigned int p_i); +# define ltoken_setIntField(tok,i) \ + (ltoken_isValid (tok) ? (tok)->intfield = (i) : (i)) + +extern unsigned int ltoken_getLine (/*@sef@*/ ltoken p_tok); +# define ltoken_getLine(tok) \ + (ltoken_isValid (tok) ? (tok)->line : 0) + +extern void ltoken_setLine (/*@sef@*/ ltoken p_tok, unsigned int p_line); +# define ltoken_setLine(tok, ln) \ + (ltoken_isValid (tok) ? (tok)->line = (ln) : (ln)) + +extern unsigned int ltoken_getCol (/*@sef@*/ ltoken p_tok); +# define ltoken_getCol(tok) \ + (ltoken_isValid (tok) ? (tok)->col : 0) + +extern void ltoken_setCol (/*@sef@*/ ltoken p_tok, unsigned int p_col) + /*@modifies p_tok@*/ ; +# define ltoken_setCol(tok, c) \ + (ltoken_isValid (tok) ? (tok)->col = (c) : (c)) + +extern unsigned int ltoken_getCode (/*@sef@*/ ltoken p_tok) /*@*/ ; +# define ltoken_getCode(tok) \ + (ltoken_isValid (tok) ? (tok)->code : NOTTOKEN) + +extern unsigned int ltoken_getIntField (/*@sef@*/ ltoken p_tok) /*@*/ ; +# define ltoken_getIntField(tok) \ + (ltoken_isValid (tok) ? (tok)->intfield : 0) + +extern lsymbol ltoken_getText (/*@sef@*/ ltoken p_tok) /*@*/; +# define ltoken_getText(tok) \ + (ltoken_isValid (tok) ? (tok)->text : lsymbol_undefined) + +extern /*@exposed@*/ char *ltoken_getTextChars (/*@sef@*/ ltoken p_tok) /*@*/ ; +# define ltoken_getTextChars(tok) \ + (lsymbol_toCharsSafe (ltoken_getText (tok))) + +extern bool ltoken_hasSyn (/*@sef@*/ ltoken p_tok) /*@*/ ; +# define ltoken_hasSyn(tok) \ + (ltoken_isValid (tok) ? (tok)->hasSyn : FALSE) + + +extern bool ltoken_wasSyn (/*@sef@*/ ltoken p_tok); +# define ltoken_wasSyn(tok) \ + (ltoken_isValid (tok) ? lsymbol_isDefined ((tok)->rawText) : FALSE) + +/*@-namechecks@*/ +extern /*@dependent@*/ ltoken ltoken_forall; +extern /*@dependent@*/ ltoken ltoken_exists; +extern /*@dependent@*/ ltoken ltoken_true; +extern /*@dependent@*/ ltoken ltoken_false; +extern /*@dependent@*/ ltoken ltoken_not; +extern /*@dependent@*/ ltoken ltoken_and; +extern /*@dependent@*/ ltoken ltoken_or; +extern /*@dependent@*/ ltoken ltoken_implies; +extern /*@dependent@*/ ltoken ltoken_eq; +extern /*@dependent@*/ ltoken ltoken_neq; +extern /*@dependent@*/ ltoken ltoken_equals; +extern /*@dependent@*/ ltoken ltoken_eqsep; +extern /*@dependent@*/ ltoken ltoken_select; +extern /*@dependent@*/ ltoken ltoken_open; +extern /*@dependent@*/ ltoken ltoken_sep; +extern /*@dependent@*/ ltoken ltoken_close; +extern /*@dependent@*/ ltoken ltoken_id; +extern /*@dependent@*/ ltoken ltoken_arrow; +extern /*@dependent@*/ ltoken ltoken_marker; +extern /*@dependent@*/ ltoken ltoken_pre; +extern /*@dependent@*/ ltoken ltoken_post; +extern /*@dependent@*/ ltoken ltoken_comment; +extern /*@dependent@*/ ltoken ltoken_compose; +extern /*@dependent@*/ ltoken ltoken_if; +extern /*@dependent@*/ ltoken ltoken_any; +extern /*@dependent@*/ ltoken ltoken_result; +extern /*@dependent@*/ ltoken ltoken_typename; +extern /*@dependent@*/ ltoken ltoken_bool; +extern /*@dependent@*/ ltoken ltoken_farrow; +extern /*@dependent@*/ ltoken ltoken_lbracked; +extern /*@dependent@*/ ltoken ltoken_rbracket; +/*@=namechecks@*/ + +extern cstring ltoken_unparseCodeName (ltoken p_tok) /*@*/ ; + +extern /*@observer@*/ cstring ltoken_unparse (ltoken p_s); + +extern void ltoken_setCode (/*@sef@*/ ltoken p_s, unsigned int p_code); +# define ltoken_setCode(s,c) (ltoken_isValid (s) ? (s)->code = (c) : (c)) + +extern void ltoken_setRawText (/*@sef@*/ ltoken p_s, lsymbol p_t); +# define ltoken_setRawText(s,t) (ltoken_isValid (s) ? (s)->rawText = (t) : (t)) + +extern void ltoken_setIdType (/*@sef@*/ ltoken p_s, SimpleIdCode p_idtype); +# define ltoken_setIdType(s,i) (ltoken_isValid (s) ? (s)->idtype = (i) : (i)) + +extern void ltoken_setText (/*@sef@*/ ltoken p_s, lsymbol p_text); +# define ltoken_setText(s,t) (ltoken_isValid (s) ? (s)->text = (t) : (t)) + +extern lsymbol ltoken_getRawText (ltoken) /*@*/ ; + +/* defined in abstract.c */ +extern bool ltoken_similar (ltoken p_t1, ltoken p_t2) /*@*/ ; + +extern /*@observer@*/ char *ltoken_getRawTextChars (ltoken p_s) /*@*/ ; +# define ltoken_getRawTextChars(s) \ + (lsymbol_toCharsSafe (ltoken_getRawText (s))) + +extern /*@observer@*/ cstring ltoken_getRawString (ltoken p_s) /*@*/ ; +# define ltoken_getRawString(s) \ + (lsymbol_toString (ltoken_getRawText (s))) + +extern ltoken ltoken_copy (ltoken) /*@*/ ; + +extern /*@observer@*/ cstring ltoken_fileName (/*@sef@*/ ltoken p_s); +# define ltoken_fileName(s) \ + (ltoken_isValid(s) ? lsymbol_toString ((s)->fname) : cstring_undefined) + +extern void ltoken_setFileName (/*@sef@*/ ltoken p_tok, char *p_fname); +# define ltoken_setFileName(tok,f) \ + (ltoken_isValid(tok) ? (tok)->fname = lsymbol_fromChars (f) : (f, lsymbol_undefined)) + +extern bool ltoken_isChar (ltoken p_tok); +# define ltoken_isChar(t) \ + (cstring_length (ltoken_unparse (t)) == 1) + +extern void ltoken_setHasSyn (/*@sef@*/ ltoken p_tok, bool p_def); +# define ltoken_setHasSyn(tok, def) \ + (ltoken_isValid(tok) ? (tok)->hasSyn = (def) : (def)) + +extern void ltoken_free (/*@only@*/ ltoken); + +extern ltoken ltoken_createFull (unsigned int p_code, lsymbol p_text, + cstring p_file, unsigned int p_line, + unsigned int p_col) /*@*/ ; + +extern ltoken ltoken_createRaw (unsigned int p_code, lsymbol p_text) /*@*/ ; +extern cstring ltoken_unparseLoc (ltoken p_t) /*@*/ ; + +extern void ltoken_markOwned (/*@owned@*/ ltoken); +extern bool ltoken_isSingleChar (char) /*@*/ ; + +# else +# error "Multiple include" +# endif + + + + + diff --git a/src/Headers/ltokenList.h b/src/Headers/ltokenList.h new file mode 100644 index 0000000..9fd8037 --- /dev/null +++ b/src/Headers/ltokenList.h @@ -0,0 +1,77 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef LTOKENLIST_H +# define LTOKENLIST_H + +abst_typedef /*@null@*/ struct _ltokenList +{ + int nelements; + int nspace; + int current; + /*@reldef@*/ /*@relnull@*/ o_ltoken *elements; +} *ltokenList ; + +/*@iter ltokenList_elements (sef ltokenList x, yield exposed ltoken el); @*/ +# define ltokenList_elements(x, m_el) \ + { if (ltokenList_isDefined(x)) { \ + int m_ind; ltoken *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { ltoken m_el; m_el = *m_elements; m_elements++; + +# define end_ltokenList_elements }}} + +/* +** ltokenList_elements is split up to avoid compiler bugs +** and incompatibilities in older C compilers. This has caused problems +** on both RS/AIX and SGI IRIX machines. +*/ + +/*@constant null ltokenList ltokenList_undefined;@*/ +# define ltokenList_undefined NULL + +extern /*@falsenull@*/ bool ltokenList_isDefined (ltokenList p_s) /*@*/ ; +# define ltokenList_isDefined(s) ((s) != ltokenList_undefined) + +extern /*@truenull@*/ bool ltokenList_isUndefined (ltokenList p_s) /*@*/ ; +# define ltokenList_isUndefined(s) ((s) == ltokenList_undefined) + +extern int ltokenList_size (/*@sef@*/ ltokenList p_s) /*@*/ ; +extern bool ltokenList_empty (/*@sef@*/ ltokenList p_s) /*@*/ ; +extern /*@unused@*/ bool ltokenList_isEmpty (/*@sef@*/ ltokenList p_s) /*@*/ ; + +# define ltokenList_size(s) (ltokenList_isUndefined(s) ? 0 : (s)->nelements) +# define ltokenList_empty(s) (ltokenList_isUndefined(s) || ltokenList_size(s) == 0) +# define ltokenList_isEmpty(s) (ltokenList_empty(s)) + +extern /*@only@*/ /*@notnull@*/ ltokenList ltokenList_new (void) /*@*/ ; +extern void ltokenList_addh (ltokenList p_s, /*@only@*/ ltoken p_el) /*@modifies p_s@*/ ; + +extern void ltokenList_reset (ltokenList p_s) /*@modifies p_s@*/ ; +extern void ltokenList_advance (ltokenList p_s) /*@modifies p_s@*/ ; + +extern /*@only@*/ cstring ltokenList_unparse (ltokenList p_s) /*@*/ ; +extern void ltokenList_free (/*@only@*/ ltokenList p_s) ; + +extern /*@observer@*/ ltoken ltokenList_head (ltokenList p_s) /*@*/ ; +extern /*@observer@*/ ltoken ltokenList_current (ltokenList p_s) /*@*/ ; + +extern /*@only@*/ ltokenList ltokenList_copy (ltokenList p_s) /*@*/ ; +extern /*@only@*/ /*@notnull@*/ ltokenList ltokenList_singleton (/*@only@*/ ltoken p_l); +extern ltokenList ltokenList_push (/*@returned@*/ ltokenList p_s, /*@only@*/ ltoken p_el); +extern bool ltokenList_equal (ltokenList p_s1, ltokenList p_s2) /*@*/ ; +extern bool ltokenList_isFinished (ltokenList p_s) /*@*/ ; +extern void ltokenList_removeCurrent (ltokenList p_s) /*@modifies p_s@*/ ; + +/*@constant int ltokenListBASESIZE;@*/ +# define ltokenListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/macrocache.h b/src/Headers/macrocache.h new file mode 100644 index 0000000..e85b419 --- /dev/null +++ b/src/Headers/macrocache.h @@ -0,0 +1,50 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** macrocache.h +*/ + +# ifndef MACROCACHE_H +# define MACROCACHE_H + +typedef struct _mce +{ + fileloc fl; + cstring def; + bool defined; + bool scomment; +} *mce; + +typedef /*@only@*/ mce o_mce; + +typedef struct _mcelist +{ + int nspace; + int entries; + /*@reldef@*/ /*@only@*/ o_mce *contents; +} *macrocache; + +extern void + macrocache_processUndefinedElements (macrocache p_m) ; /* modifies externalState */ + +extern /*@observer@*/ fileloc + macrocache_processFileElements (macrocache p_m, cstring p_base) ; + +extern /*@only@*/ /*@unused@*/ cstring macrocache_unparse (macrocache p_m) /*@*/ ; +extern /*@only@*/ macrocache macrocache_create (void) /*@*/ ; + +extern void + macrocache_addEntry (macrocache p_s, /*@only@*/ fileloc p_fl, /*@only@*/ cstring p_def); + +extern void + macrocache_addComment (macrocache p_s, /*@only@*/ fileloc p_fl, /*@only@*/ cstring p_def); + +extern void macrocache_free (/*@only@*/ macrocache p_s); +extern void macrocache_finalize (void) /*@modifies internalState@*/ ; + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/mapping.h b/src/Headers/mapping.h new file mode 100644 index 0000000..1e78dc1 --- /dev/null +++ b/src/Headers/mapping.h @@ -0,0 +1,33 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** mapping.h +*/ + +# ifndef MAPPING_H +# define MAPPING_H + +typedef struct _mappair { + lsymbol domain, range; + /*@null@*/ struct _mappair *next; +} mappair; + +typedef /*@relnull@*/ /*@only@*/ mappair *o_mappair; + +typedef struct { + unsigned int count; + /*@relnull@*/ /*@only@*/ o_mappair *buckets; +} mapping; + + +extern /*@only@*/ mapping *mapping_create (void); +extern lsymbol mapping_find (mapping *p_t, lsymbol p_domain); +extern void mapping_bind (mapping *p_t, lsymbol p_domain, lsymbol p_range); +extern void mapping_free (/*@only@*/ mapping *p_m); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/message.h b/src/Headers/message.h new file mode 100644 index 0000000..3ed7f70 --- /dev/null +++ b/src/Headers/message.h @@ -0,0 +1,22 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef MESSAGE_H +# define MESSAGE_H + +# if USEVARARGS +/*@-usevarargs@*/ /* suppress error about varargs.h */ +# include +/*@=usevarargs@*/ +extern cstring message (); +# else +# include +/*@messagelike@*/ +extern /*@only@*/ cstring message(/*@temp@*/ char *p_fmt, ...) /*@*/ ; +# endif + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/messageLog.h b/src/Headers/messageLog.h new file mode 100644 index 0000000..ce869bb --- /dev/null +++ b/src/Headers/messageLog.h @@ -0,0 +1,51 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** messageLog.h (from slist_templace.h) +*/ + +# ifndef messageLog_H +# define messageLog_H + +typedef struct _msgentry +{ + fileloc loc; + cstring msg; +} *msgentry ; + +typedef /*@only@*/ msgentry o_msgentry; + +abst_typedef /*@null@*/ struct _messageLog +{ + int nelements; + int nspace; + /*@reldef@*/ /*@only@*/ o_msgentry *elements; +} *messageLog ; + +/*@constant null messageLog messageLog_undefined; @*/ +# define messageLog_undefined ((messageLog)0) + +extern /*@unused@*/ /*@falsenull@*/ bool + messageLog_isDefined (messageLog p_s) /*@*/ ; +# define messageLog_isDefined(c) ((c) != messageLog_undefined) + +extern /*@only@*/ messageLog messageLog_new (void) /*@*/ ; +extern bool messageLog_add (messageLog p_s, fileloc p_fl, cstring p_mess) + /*@modifies p_s@*/ ; + +extern /*@only@*/ /*@unused@*/ cstring messageLog_unparse (messageLog p_s) /*@*/ ; +extern void messageLog_free (/*@only@*/ messageLog p_s) ; + +/*@constant int messageLogBASESIZE; @*/ +# define messageLogBASESIZE MIDBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/misc.h b/src/Headers/misc.h new file mode 100644 index 0000000..7231b59 --- /dev/null +++ b/src/Headers/misc.h @@ -0,0 +1,126 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** misc.h +** +** (general.c) +*/ + +# ifndef MISC_H +# define MISC_H + +# ifndef NOLCL +# include "lclMisc.h" +# endif + +extern void assertSet (/*@special@*/ /*@sef@*/ /*@unused@*/ void *p_x) + /*@sets p_x, *p_x@*/ ; +# define assertSet(x) ; + +extern bool isLCLfile (cstring p_s) /*@*/ ; +extern bool isCext(char *p_ext) /*@*/ ; +extern char *addExtension(char *p_s, const char *p_suffix); + +extern char *removeExtension (char *p_s, const char *p_suffix) /*@*/ ; + +# ifndef NOLCL +extern char *removePath (char *p_s) /*@*/ ; +# endif + +extern char *removePathFree (/*@only@*/ char *p_s) /*@*/ ; +extern char *removeAnyExtension (char *p_s) /*@*/ ; + +extern int getInt (char **p_s) /*@modifies *p_s@*/ ; +extern char loadChar (char **p_s) /*@modifies *p_s@*/ ; +extern double getDouble (char **p_s) /*@modifies *p_s@*/ ; +extern void docheckChar (char ** p_s, char p_c, char *p_file, int p_line) + /*@modifies *p_s;@*/; + +extern bool optCheckChar (char **p_s, char p_c) /*@modifies *p_s;@*/ ; +extern void checkChar (char **p_s, char p_c) /*@modifies *p_s;@*/ ; +# define checkChar(s,c) (docheckChar (s, c, __FILE__, __LINE__)) +extern /*@only@*/ /*@null@*/ char *getWord (char **p_s) /*@modifies *p_s@*/ ; +extern cstring getStringWord (char **p_s) /*@modifies *p_s@*/ ; + +/*@-czechfcns@*/ +extern int size_toInt (size_t p_x) /*@*/ ; +extern long size_toLong (size_t p_x) /*@*/ ; +extern size_t size_fromInt (int p_x) /*@*/ ; +extern int longUnsigned_toInt (long unsigned int p_x) /*@*/ ; +extern int long_toInt (long p_x) /*@*/ ; +extern long unsigned longUnsigned_fromInt (int p_x) /*@*/ ; +/*@=czechfcns@*/ + +/* string functions */ + +typedef /*@concrete@*/ char *mstring; +typedef /*@observer@*/ char *ob_mstring; +typedef /*@observer@*/ /*@null@*/ char *bn_mstring; + +extern /*@unused@*/ /*@notnull@*/ /*@observer@*/ char * + mstring_safePrint (/*@returned@*/ /*@null@*/ mstring p_s) /*@*/ ; +extern char *mstring_spaces (int p_n) /*@*/ ; +extern char *mstring_concat (const char *p_s1, const char *p_s2) /*@*/ ; +extern char *mstring_concatFree (/*@only@*/ char *p_s1, /*@only@*/ char *p_s2) /*@modifies *p_s1, *p_s2*/ ; +extern char *mstring_concatFree1 (/*@only@*/ char *p_s1, const char *p_s2); +extern char *mstring_append (/*@only@*/ char *p_s1, char p_c); +extern char *mstring_copy (/*@null@*/ char *p_s1) /*@*/ ; +extern bool mstring_equalPrefix (const char *p_c1, const char *p_c2) /*@*/ ; +extern bool mstring_equal (/*@null@*/ const char *p_s1, /*@null@*/ const char *p_s2) /*@*/ ; + +extern int mstring_length (/*@sef@*/ /*@null@*/ char *p_s) /*@*/ ; +# define mstring_length(s) \ + (((s) != NULL) ? size_toInt (strlen (s)) : 0) + +extern /*@falsenull@*/ bool mstring_isDefined (/*@sef@*/ /*@null@*/ char *p_s) /*@*/ ; +# define mstring_isDefined(s) ((s) != NULL) + +extern /*@truenull@*/ bool mstring_isEmpty (/*@sef@*/ /*@null@*/ char *p_s) /*@*/ ; +# define mstring_isEmpty(s) (mstring_length(s) == 0) + +extern void mstring_markFree (/*@owned@*/ char *p_s) /*@modifies *p_s;@*/ ; + +extern /*@notnull@*/ /*@only@*/ char *mstring_create (int p_n) /*@*/ ; +extern /*@notnull@*/ /*@only@*/ char *mstring_createEmpty (void) /*@*/ ; + +extern void mstring_free (/*@out@*/ /*@only@*/ /*@null@*/ char *p_s); +# define mstring_free(s) sfree(s) + +# define mstring_createEmpty() mstring_create(0) + +extern int int_compare (/*@sef@*/ int p_x, /*@sef@*/ int p_y) /*@*/ ; +# define int_compare(x,y) (((x) > (y)) ? 1 : (((x) < (y)) ? -1 : 0)) + +/*@-macroparams@*/ +/*@-macrofcndecl@*/ /* works for lots of types */ +# define generic_compare(x,y) (((x) > (y)) ? 1 : (((x) < (y)) ? -1 : 0)) +/*@=macrofcndecl@*/ +/*@=macroparams@*/ + +/*@notfunction@*/ +# define GET(s) ((s *)smalloc(sizeof(s))) + +extern bool isHeaderFile (cstring) /*@*/ ; + +extern void fputline (FILE *p_out, char *p_s) /*@modifies p_out@*/; + +extern int int_log (int p_x) /*@*/ ; + +extern char char_fromInt (int p_x) /*@*/ ; + +extern /*@observer@*/ /*@null@*/ char * + filenameExtension (/*@returned@*/ char *p_s) /*@*/ ; + +extern /*@exposed@*/ char *removePreDirs (char *p_s); +extern void checkUngetc (int p_c, FILE *p_f) /*@modifies *p_f@*/ ; + +/* These are defined by the bison library (?) */ +extern /*@external@*/ int isatty (int); +extern /*@external@*/ int yywrap (void); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/modifyNode.h b/src/Headers/modifyNode.h new file mode 100644 index 0000000..8e9bce0 --- /dev/null +++ b/src/Headers/modifyNode.h @@ -0,0 +1,26 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +typedef struct _modifyNode { + ltoken tok; + bool modifiesNothing; + bool hasStoreRefList; + /* if hasStoreRefList is FALSE, then it's either NOTHING or ANYTHING */ + /* evs - this is a really kludgy way of doing this... */ + /*@reldef@*/ storeRefNodeList list; +} *modifyNode; + +extern /*@unused@*/ /*@only@*/ cstring modifyNode_unparse (/*@null@*/ modifyNode p_m); + + + + + + + + + + + diff --git a/src/Headers/multiVal.h b/src/Headers/multiVal.h new file mode 100644 index 0000000..735b05e --- /dev/null +++ b/src/Headers/multiVal.h @@ -0,0 +1,64 @@ +/* +** multiVal.h +*/ + +# ifndef MULTIVAL_H +# define MULTIVAL_H + +typedef enum { MVLONG, MVCHAR, MVDOUBLE, MVSTRING } mvkind; + +typedef /*@null@*/ struct _multiVal +{ + mvkind kind; + union _mval + { + long int ival; + char cval; + double fval; + /*@only@*/ cstring sval; + } value; +} *multiVal; + +extern /*@falsenull@*/ bool multiVal_isDefined (multiVal p_m) /*@*/ ; +extern /*@truenull@*/ bool multiVal_isUndefined (multiVal p_m) /*@*/ ; +extern /*@truenull@*/ bool multiVal_isUnknown (multiVal p_m) /*@*/ ; + +/*@constant null multiVal multiVal_undefined; @*/ +# define multiVal_undefined (multiVal)NULL +# define multiVal_isDefined(m) ((m) != multiVal_undefined) +# define multiVal_isUndefined(m) ((m) == multiVal_undefined) +# define multiVal_isUnknown(m) ((m) == multiVal_undefined) + +extern /*@observer@*/ /*@dependent@*/ cstring multiVal_forceString (multiVal p_m) /*@*/ ; +extern /*@unused@*/ double multiVal_forceDouble (multiVal p_m) /*@*/ ; +extern char multiVal_forceChar (multiVal p_m) /*@*/ ; +extern long multiVal_forceInt (multiVal p_m) /*@*/ ; + +extern /*@only@*/ multiVal multiVal_makeString (/*@only@*/ cstring p_s) /*@*/ ; +extern /*@only@*/ multiVal multiVal_makeDouble (double p_x) /*@*/ ; +extern /*@only@*/ multiVal multiVal_makeChar (char p_x) /*@*/ ; +extern /*@only@*/ multiVal multiVal_makeInt (long p_x) /*@*/ ; +extern /*@only@*/ multiVal multiVal_unknown (void) /*@*/ ; + +extern /*@only@*/ multiVal multiVal_copy (multiVal p_m) /*@*/ ; +extern void multiVal_free (/*@only@*/ multiVal p_m); + +extern multiVal multiVal_invert (multiVal p_m) /*@*/ ; + +extern /*@falsenull@*/ bool multiVal_isInt (multiVal p_m) /*@*/ ; +extern /*@falsenull@*/ bool multiVal_isChar (multiVal p_m) /*@*/ ; +extern /*@falsenull@*/ bool multiVal_isDouble (multiVal p_m) /*@*/ ; +extern /*@falsenull@*/ bool multiVal_isString (multiVal p_m) /*@*/ ; + +extern /*@only@*/ multiVal multiVal_undump (char **p_s) /*@modifies *p_s;@*/ ; +extern /*@only@*/ cstring multiVal_dump (multiVal p_m) /*@*/ ; + +extern /*@only@*/ cstring multiVal_unparse (multiVal p_m) /*@*/ ; +extern int multiVal_compare (multiVal p_m1, multiVal p_m2) /*@*/ ; + +extern bool multiVal_equiv (multiVal p_m1, multiVal p_m2) /*@*/ ; +# define multiVal_equiv(m1,m2) ((multiVal_compare(m1, m2)) == 0) + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/nameChecks.h b/src/Headers/nameChecks.h new file mode 100644 index 0000000..9246279 --- /dev/null +++ b/src/Headers/nameChecks.h @@ -0,0 +1,19 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +# ifndef NAMECHECKS_H +# define NAMECHECKS_H + +extern bool checkCppName (cstring p_name, fileloc p_loc) /*@modifies g_msgstream@*/ ; +extern void checkGlobalName (uentry p_ue); +extern void checkLocalName (uentry p_ue); +extern void checkPrefix (uentry p_ue); +extern bool checkAnsiName (cstring p_name, fileloc p_loc); +extern void checkParamNames (uentry p_ue) /*@modifies g_msgstream@*/ ; + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/nameNode.h b/src/Headers/nameNode.h new file mode 100644 index 0000000..5dbc0db --- /dev/null +++ b/src/Headers/nameNode.h @@ -0,0 +1,18 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _nameNode { + bool isOpId; /* TRUE means is opId */ + union { + ltoken opid; + /*@null@*/ opFormNode opform; + } content; +} *nameNode; + +extern void nameNode_free (/*@null@*/ /*@only@*/ nameNode p_n); +extern /*@only@*/ /*@null@*/ nameNode nameNode_copy (/*@null@*/ nameNode p_n) /*@*/ ; +extern /*@only@*/ cstring nameNode_unparse (/*@null@*/ nameNode p_n) /*@*/ ; +extern /*@only@*/ nameNode nameNode_copySafe (nameNode p_n) /*@*/ ; diff --git a/src/Headers/opFormNode.h b/src/Headers/opFormNode.h new file mode 100644 index 0000000..b83c9ad --- /dev/null +++ b/src/Headers/opFormNode.h @@ -0,0 +1,31 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef enum { + OPF_IF, OPF_ANYOP, OPF_MANYOP, OPF_ANYOPM, OPF_MANYOPM, + OPF_MIDDLE, OPF_MMIDDLE, OPF_MIDDLEM, OPF_MMIDDLEM, + OPF_BMIDDLE, OPF_BMMIDDLE, + OPF_BMIDDLEM, OPF_BMMIDDLEM, + OPF_SELECT, OPF_MAP, + OPF_MSELECT, OPF_MMAP + } opFormKind; + +typedef union { + int middle; + ltoken anyop; + ltoken id; +} opFormUnion; + +typedef struct _opFormNode { + ltoken tok; /* keeps the openSym token */ + opFormKind kind; + opFormUnion content; + unsigned int key; + ltoken close; /* keeps the closeSym token */ +} *opFormNode; + +extern /*@unused@*/ /*@only@*/ cstring + opFormNode_unparse (/*@null@*/ opFormNode p_n) /*@*/ ; diff --git a/src/Headers/osd.h b/src/Headers/osd.h new file mode 100644 index 0000000..3a604f6 --- /dev/null +++ b/src/Headers/osd.h @@ -0,0 +1,98 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** osd.h +*/ + +# ifndef OSD_H +# define OSD_H + +/* Macro to substitute for ## because VAX C currently doesn't allow it. */ +# ifdef __STDC__ + /* Use an intermediate paste macro so PASTE macro arguments will get */ + /* evaluated. Therefore, PASTE(PASTE(a,b),c) will work. */ +/*@notfunction@*/ +# define IPASTE(L,R) L ## R +/*@notfunction@*/ +# define PASTE(L,R) IPASTE(L,R) +# else +/*@notfunction@*/ +# define PASTE(L,R ) L/**/R +# endif + +/* Macro to substitute for # because VAX C currently doesn't allow it. */ +# ifdef __STDC__ +/*@notfunction@*/ +# define ISTR(x) # x +/*@notfunction@*/ +# define STR(x) ISTR(x) +# else +/*@notfunction@*/ +# define ISTR(x) "x" +/*@notfunction@*/ +# define STR(x) ISTR(x) +# endif + +/* +** MAXPATHLEN defines the longest permissable path length. +** Is defined in in MIPS/Ultrix, but it not defined on the VAX. +** Define here so available on both systems. +*/ + +/*@constant int MAXPATHLEN; @*/ +# define MAXPATHLEN 1024 + +typedef enum { + OSD_FILEFOUND, + OSD_FILENOTFOUND, + OSD_PATHTOOLONG } filestatus; + +extern /*@only@*/ char *LSLRootName (char *p_filespec) /*@*/ ; + +extern filestatus + osd_getPath (char *p_path, char *p_file, /*@out@*/ char **p_returnPath) + /*@modifies *p_returnPath@*/ ; + +extern filestatus + osd_getExePath (char *p_path, char *p_file, /*@out@*/ char **p_returnPath) + /*@modifies *p_returnPath@*/ ; + +extern bool osd_fileExists (char *p_filespec) /*@*/ ; +extern /*@observer@*/ char * + osd_getEnvironment (char *p_env, /*@returned@*/ char *p_def) /*@*/ ; + +extern filestatus osd_findOnLarchPath (char *p_file, /*@out@*/ char **p_returnPath) + /*@modifies *p_returnPath@*/ ; + +extern /*@observer@*/ /*@null@*/ char *osd_getHomeDir (void) /*@*/ ; + +extern /*@observer@*/ /*@null@*/ char *osd_getEnvironmentVariable (char *) ; + +# ifndef NOLCL +/*@constant int CALL_SUCCESS@*/ +# define CALL_SUCCESS 0 + +extern int osd_system (const char *p_cmd) /*@modifies fileSystem@*/ ; +# endif + +extern int osd_unlink (const char *) /*@modifies fileSystem@*/ ; +extern cstring osd_fixDefine (char *); +extern bool osd_fileIsReadable (char *); + +extern bool osd_isConnectChar (char) /*@*/ ; + +# ifdef WIN32 +extern int osd_getPid (void) ; +# else +extern int /*pid_t*/ osd_getPid (void) ; +# endif + +# else +# error "Multiple include" +# endif + + + diff --git a/src/Headers/pairNode.h b/src/Headers/pairNode.h new file mode 100644 index 0000000..15d6731 --- /dev/null +++ b/src/Headers/pairNode.h @@ -0,0 +1,17 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** pairNode.h +** +** needs sort_type.h, ltoken_type.h +*/ + +typedef struct _pairNode { + sort sort; + ltoken tok; /* enable error message to pinpoint location */ +} *pairNode; + +extern void pairNode_free (/*@only@*/ /*@null@*/ pairNode p_x); diff --git a/src/Headers/pairNodeList.h b/src/Headers/pairNodeList.h new file mode 100644 index 0000000..5368e2e --- /dev/null +++ b/src/Headers/pairNodeList.h @@ -0,0 +1,49 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef PAIRNODELIST_H +# define PAIRNODELIST_H + +typedef /*@only@*/ pairNode o_pairNode; + +abst_typedef /*@null@*/ struct _pairNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_pairNode *elements; +} *pairNodeList ; + +/*@iter pairNodeList_elements (sef pairNodeList x, yield exposed pairNode el); @*/ +# define pairNodeList_elements(x, m_el) \ + if (pairNodeList_isDefined (x)) \ + { int m_ind; pairNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { pairNode m_el = *(m_elements++); + +# define end_pairNodeList_elements }} + +extern /*@falsenull@*/ bool pairNodeList_isDefined (pairNodeList p_p) /*@*/ ; + +/*@constant null pairNodeList pairNodeList_undefined; @*/ +# define pairNodeList_undefined ((pairNodeList)0) +# define pairNodeList_isDefined(p) ((p) != pairNodeList_undefined) + +extern /*@only@*/ pairNodeList pairNodeList_new(void) /*@*/ ; +extern void pairNodeList_addh (pairNodeList p_s, /*@keep@*/ pairNode p_el) + /*@modifies p_s@*/ ; + +extern /*@only@*/ cstring pairNodeList_unparse (pairNodeList p_s) /*@*/ ; +extern void pairNodeList_free (/*@only@*/ pairNodeList p_s) ; + +/*@constant int pairNodeListBASESIZE;@*/ +# define pairNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/paramNode.h b/src/Headers/paramNode.h new file mode 100644 index 0000000..a33030a --- /dev/null +++ b/src/Headers/paramNode.h @@ -0,0 +1,38 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** paramNode.h +*/ + +# ifndef PARAMNODEH +# define PARAMNODEH + +typedef enum _paramtype { PNORMAL, PYIELD, PELIPSIS } paramkind ; +/* add PREF later? PYIELD is for iterators only (~ POUT) */ + +typedef struct _paramNode { + /*@null@*/ lclTypeSpecNode type; + /*@null@*/ struct _typeExpr *paramdecl; + paramkind kind; +} *paramNode; + +extern void paramNode_free (/*@only@*/ /*@null@*/ paramNode p_x); + +extern /*@null@*/ paramNode paramNode_copy (/*@null@*/ paramNode p_p); +extern /*@only@*/ cstring paramNode_unparse (paramNode p_x); +extern /*@only@*/ cstring paramNode_unparseComments (paramNode p_x); + +extern bool paramNode_isElipsis (paramNode p_p); +extern bool paramNode_isYield (paramNode p_p); + +# define paramNode_isElipsis(p) ((p)->kind == PELIPSIS) +# define paramNode_isYield(p) ((p)->kind == PYIELD) + +# else +# error "Multiple include" +# endif + + diff --git a/src/Headers/paramNodeList.h b/src/Headers/paramNodeList.h new file mode 100644 index 0000000..953d5b6 --- /dev/null +++ b/src/Headers/paramNodeList.h @@ -0,0 +1,65 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef paramNodeLIST_H +# define paramNodeLIST_H + +typedef /*@null@*/ /*@only@*/ paramNode o_paramNode; + +abst_typedef /*@null@*/ struct _paramNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_paramNode *elements; +} *paramNodeList ; + +/*@iter paramNodeList_elements (sef paramNodeList x, yield exposed paramNode el); @*/ +# define paramNodeList_elements(x, m_el) \ + if (paramNodeList_isDefined (x)) \ + { int m_ind; paramNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { paramNode m_el = *(m_elements++); + +# define end_paramNodeList_elements }} + +extern int paramNodeList_size (/*@sef@*/ paramNodeList); + +# define paramNodeList_size(s) (paramNodeList_isDefined (s) ? (s)->nelements : 0) + +extern bool paramNodeList_empty (/*@sef@*/ paramNodeList p_s); +# define paramNodeList_empty(s) (paramNodeList_size(s) == 0) + +extern /*@only@*/ paramNodeList paramNodeList_single (/*@keep@*/ paramNode p_p); + +extern /*@falsenull@*/ bool paramNodeList_isDefined (paramNodeList p_s) /*@*/ ; +# define paramNodeList_isDefined(s) ((s) != (paramNodeList)0) +extern /*@only@*/ paramNodeList paramNodeList_new (void); + +extern paramNodeList + paramNodeList_add (/*@returned@*/ paramNodeList p_s, /*@null@*/ /*@only@*/ paramNode p_el) ; + +extern /*@only@*/ cstring paramNodeList_unparse (paramNodeList p_s) ; +extern void paramNodeList_free (/*@only@*/ /*@only@*/ paramNodeList p_s) ; + +extern /*@only@*/ paramNodeList paramNodeList_copy (paramNodeList p_s) ; +extern /*@only@*/ cstring paramNodeList_unparseComments (paramNodeList p_s); + +/*@constant int paramNodeListBASESIZE;@*/ +# define paramNodeListBASESIZE SMALLBASESIZE + +/*@constant null paramNodeList paramNodeList_undefined; @*/ +# define paramNodeList_undefined ((paramNodeList) 0) + +extern /*@truenull@*/ bool paramNodeList_isNull (/*@null@*/ paramNodeList p_p); + +# define paramNodeList_isNull(p) ((p) == paramNodeList_undefined) + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/portab.h b/src/Headers/portab.h new file mode 100644 index 0000000..00b4c0d --- /dev/null +++ b/src/Headers/portab.h @@ -0,0 +1,88 @@ +/* +** Copyright (c) Massachusetts Institute of Technology 1994, 1995, 1996. +** See ../LICENSE for license information. +*/ + +# ifndef PORTAB_H +# define PORTAB_H + +/* +** Win32 convention? +*/ + +/*@constant observer char *INCLUDE_VAR@*/ +# define INCLUDE_VAR "include" + +#if defined (VMS) +/* Connection string inserted between directory and filename to make a */ +/* full path name. */ + +# define CONNECTSTR ":" +# define CONNECTCHAR ':' + + +/* Directory separator character for search list. */ +/*@constant static char SEPCHAR; @*/ +# define SEPCHAR ':' + +# elif defined(MSDOS) || defined(OS2) || defined(WIN32) + +/* Connection string inserted between directory and filename to make a */ +/* full path name. */ + +/*@constant observer char *CONNECTSTR@*/ +# define CONNECTSTR "\\" + +/*@constant char CONNECTCHAR@*/ +# define CONNECTCHAR '\\' + +# define HASALTCONNECTCHAR + +/*@constant char ALTCONNECTCHAR@*/ +# define ALTCONNECTCHAR '/' + +/* Directory separator character for search list. */ + +/*@constant char SEPCHAR; @*/ +# define SEPCHAR ';' + +#else +/* Connection string inserted between directory and filename to make a */ +/* full path name. */ + +/*@constant observer char *CONNECTSTR@*/ +# define CONNECTSTR "/" + +/*@constant char CONNECTCHAR; @*/ +# define CONNECTCHAR '/' + +/* Directory separator character for search list. */ +/*@constant char SEPCHAR; @*/ +# define SEPCHAR ':' + +#endif + + +# ifdef P_tmpdir + +# if defined(OS2) && defined(__IBMC__) +/*@constant observer char *DEFAULT_TMPDIR; @*/ +# define DEFAULT_TMPDIR "." +# else +/*@constant observer char *DEFAULT_TMPDIR; @*/ +# define DEFAULT_TMPDIR P_tmpdir +# endif +# else +# ifdef WIN32 +/*@constant observer char *DEFAULT_TMPDIR; @*/ +# define DEFAULT_TMPDIR "\\WINDOWS\\TEMP\\" +# else +/*@constant observer char *DEFAULT_TMPDIR; @*/ +# define DEFAULT_TMPDIR "/tmp/" +# endif /* WIN32 */ + +# endif /* P_tmpdir */ + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/pp.h b/src/Headers/pp.h new file mode 100644 index 0000000..80e1c0a --- /dev/null +++ b/src/Headers/pp.h @@ -0,0 +1,7 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# define DUMMY3 8 +# define DUMMY4 12 diff --git a/src/Headers/privateNode.h b/src/Headers/privateNode.h new file mode 100644 index 0000000..e7d8ead --- /dev/null +++ b/src/Headers/privateNode.h @@ -0,0 +1,22 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef enum { + PRIV_CONST, PRIV_VAR, + PRIV_TYPE, PRIV_FUNCTION + } privateKind; + +typedef struct _privateNode { + privateKind kind; + union { + constDeclarationNode constdeclaration; + varDeclarationNode vardeclaration; + typeNode type; + fcnNode fcn; + } content; +} *privateNode; + +extern /*@unused@*/ /*@only@*/ cstring privateNode_unparse(privateNode p_n); diff --git a/src/Headers/programNode.h b/src/Headers/programNode.h new file mode 100644 index 0000000..160c059 --- /dev/null +++ b/src/Headers/programNode.h @@ -0,0 +1,23 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +typedef enum +{ + ACT_SELF, ACT_ITER, ACT_ALTERNATE, + ACT_SEQUENCE + } actionKind; + +typedef struct _programNode { + int wrapped; /* number of balanced parentheses around this program node */ + actionKind kind; + union { + struct _stmtNode *self; + struct _programNodeList *args; + } content; +} *programNode; + +extern void programNode_free (/*@only@*/ /*@null@*/ programNode p_x); +extern /*@only@*/ cstring programNode_unparse (programNode p_p); + diff --git a/src/Headers/programNodeList.h b/src/Headers/programNodeList.h new file mode 100644 index 0000000..2ba94f8 --- /dev/null +++ b/src/Headers/programNodeList.h @@ -0,0 +1,42 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef PROGRAMNODELIST_H +# define PROGRAMNODELIST_H + +typedef /*@only@*/ programNode o_programNode; + +abst_typedef struct _programNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_programNode *elements; +} *programNodeList ; + +/*@iter programNodeList_elements (sef programNodeList x, yield exposed programNode el); @*/ +# define programNodeList_elements(x, m_el) \ + { int m_ind; programNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { programNode m_el = *(m_elements++); + +# define end_programNodeList_elements }} + +extern /*@only@*/ programNodeList programNodeList_new(void); + +extern void programNodeList_addh (programNodeList p_s, /*@keep@*/ programNode p_el) ; + +extern /*@only@*/ cstring programNodeList_unparse (programNodeList p_s) ; +extern void programNodeList_free (/*@only@*/ programNodeList p_s) ; + +/*@constant int programNodeListBASESIZE;@*/ +# define programNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/qtype.h b/src/Headers/qtype.h new file mode 100644 index 0000000..eefceea --- /dev/null +++ b/src/Headers/qtype.h @@ -0,0 +1,62 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** qtype.h +** +** Qualified types: a type qualifier list, and a ctype. +*/ + +# ifndef QTYPEH +# define QTYPEH + +abst_typedef /*@null@*/ struct _qtype +{ + ctype type; + qualList quals; +} *qtype; + +/*@constant null qtype qtype_undefined;@*/ +# define qtype_undefined ((qtype) NULL) + +extern /*@truenull@*/ bool qtype_isUndefined (qtype p_q); +# define qtype_isUndefined(q) ((q) == qtype_undefined) + +extern /*@falsenull@*/ bool qtype_isDefined (qtype p_q); +# define qtype_isDefined(q) ((q) != qtype_undefined) + +extern ctype qtype_getType (/*@sef@*/ qtype p_q); +# define qtype_getType(q) \ + (qtype_isDefined(q) ? (q)->type : ctype_unknown) + +extern /*@exposed@*/ qualList qtype_getQuals (/*@sef@*/ qtype p_q); +# define qtype_getQuals(q) \ + (qtype_isDefined(q) ? (q)->quals : qualList_undefined) + +extern void qtype_setType (/*@sef@*/ qtype p_q, ctype p_c); +# define qtype_setType(q, c) (qtype_isDefined(q) ? (q)->type = (c) : (c)) + +# ifndef NOLCL +extern qtype qtype_addQualList (/*@returned@*/ qtype p_qt, qualList p_ql); +extern qtype qtype_mergeImplicitAlt (/*@returned@*/ qtype p_q1, /*@only@*/ qtype p_q2); +extern /*@only@*/ qtype qtype_copy (qtype p_q); +# endif + +extern /*@notnull@*/ qtype qtype_create (ctype p_c) /*@*/ ; +extern /*@only@*/ qtype qtype_unknown(void) /*@*/ ; +extern qtype qtype_addQual (/*@returned@*/ qtype p_qt, qual p_q); +extern qtype qtype_combine (/*@returned@*/ qtype p_q1, ctype p_ct); +extern qtype qtype_mergeAlt (/*@returned@*/ qtype p_q1, /*@only@*/ qtype p_q2); + +extern qtype qtype_resolve (/*@returned@*/ qtype p_q); +extern void qtype_adjustPointers (int p_n, /*@returned@*/ qtype p_q); +extern /*@only@*/ cstring qtype_unparse (qtype p_q) /*@*/ ; +extern qtype qtype_newBase (/*@returned@*/ qtype p_q, ctype p_ct); +extern qtype qtype_newQbase (/*@returned@*/ qtype p_q1, qtype p_q2); +extern void qtype_free (/*@only@*/ qtype p_q); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/qual.h b/src/Headers/qual.h new file mode 100644 index 0000000..25f7f92 --- /dev/null +++ b/src/Headers/qual.h @@ -0,0 +1,367 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** qual.h +** +** representation of type qualifiers +*/ + +# ifndef QUALH +# define QUALH + +/* +** just use tokens to represent type qualifiers +** (tokens are defined in cgrammar.y) +*/ + +typedef enum _quals { + QU_UNKNOWN, + QU_CONST, QU_VOLATILE, QU_INLINE, + QU_EXTERN, QU_STATIC, QU_AUTO, QU_REGISTER, + QU_SHORT, QU_LONG, QU_SIGNED, QU_UNSIGNED, + QU_OUT, QU_IN, + QU_ONLY, QU_IMPONLY, + QU_TEMP, QU_SHARED, QU_KEEP, QU_KEPT, QU_PARTIAL, QU_SPECIAL, + QU_NULL, QU_RELNULL, + QU_EXPOSED, QU_RETURNED, QU_OBSERVER, QU_UNIQUE, + QU_OWNED, QU_DEPENDENT, QU_RELDEF, + QU_YIELD, + QU_NEVEREXIT, QU_EXITS, QU_MAYEXIT, QU_TRUEEXIT, QU_FALSEEXIT, + QU_UNUSED, QU_EXTERNAL, QU_SEF, + QU_NOTNULL, + QU_ABSTRACT, QU_CONCRETE, + QU_MUTABLE, QU_IMMUTABLE, + QU_REFCOUNTED, QU_REFS, QU_NEWREF, QU_KILLREF, QU_TEMPREF, + QU_TRUENULL, QU_FALSENULL, + QU_CHECKED, QU_UNCHECKED, QU_CHECKEDSTRICT, QU_CHECKMOD, + QU_UNDEF, QU_KILLED, + QU_PRINTFLIKE, QU_SCANFLIKE, QU_MESSAGELIKE, + QU_LAST +} qual ; + +/* +** qualifiers correspond to tokens in the grammar: +** +** standard C qualifiers: +** QCONST QVOLATILE QINLINE QEXTERN QSTATIC QAUTO QREGISTER +** QSHORT QLONG QSIGNED QUNSIGNED +** augmented LCL qualifiers: +** QOUT QONLY QTEMP QSHARED QUNIQUE QYIELD +** QEXITS QMAYEXIT +*/ + +extern qual qual_fromInt (int p_q) /*@*/ ; +extern /*@observer@*/ cstring qual_unparse (qual p_q) /*@*/ ; + +extern bool qual_equal (qual p_q1, qual p_q2) /*@*/ ; +# define qual_equal(q1,q2) ((q1) == (q2)) + +extern bool qual_isUnknown (qual) /*@*/ ; +extern bool qual_isTrueNull (qual) /*@*/ ; +extern bool qual_isFalseNull (qual) /*@*/ ; +extern bool qual_isOwned (qual) /*@*/ ; +extern bool qual_isDependent (qual) /*@*/ ; +extern bool qual_isRefCounted (qual) /*@*/ ; +extern bool qual_isRefs (qual) /*@*/ ; +extern bool qual_isNewRef (qual) /*@*/ ; +extern bool qual_isKillRef (qual) /*@*/ ; +extern bool qual_isTempRef (qual) /*@*/ ; +extern bool qual_isLong (qual) /*@*/ ; +extern bool qual_isShort (qual) /*@*/ ; +extern bool qual_isSigned (qual) /*@*/ ; +extern bool qual_isUnsigned (qual) /*@*/ ; +extern bool qual_isUnique (qual) /*@*/ ; +extern bool qual_isExits (qual) /*@*/ ; +extern bool qual_isMayExit (qual) /*@*/ ; +extern bool qual_isNeverExit (qual) /*@*/ ; +extern bool qual_isTrueExit (qual) /*@*/ ; +extern bool qual_isFalseExit (qual) /*@*/ ; +extern bool qual_isConst (qual) /*@*/ ; +extern bool qual_isVolatile (qual) /*@*/ ; +extern bool qual_isInline (qual) /*@*/ ; +extern bool qual_isExtern (qual) /*@*/ ; +extern bool qual_isStatic (qual) /*@*/ ; +extern bool qual_isAuto (qual) /*@*/ ; +extern bool qual_isRegister (qual) /*@*/ ; +extern bool qual_isOut (qual) /*@*/ ; +extern bool qual_isIn (qual) /*@*/ ; +extern bool qual_isYield (qual) /*@*/ ; +extern bool qual_isOnly (qual) /*@*/ ; +extern bool qual_isImpOnly (qual) /*@*/ ; +extern bool qual_isPartial (qual) /*@*/ ; +extern bool qual_isSpecial (qual) /*@*/ ; +extern bool qual_isKeep (qual) /*@*/ ; +extern bool qual_isKept (qual) /*@*/ ; +extern bool qual_isTemp (qual) /*@*/ ; +extern bool qual_isShared (qual) /*@*/ ; +extern bool qual_isRelDef (qual) /*@*/ ; +extern bool qual_isChecked (qual) /*@*/ ; +extern bool qual_isCheckMod (qual) /*@*/ ; +extern bool qual_isCheckedStrict (qual) /*@*/ ; +extern bool qual_isUnchecked (qual) /*@*/ ; +extern bool qual_isNull (qual) /*@*/ ; +extern bool qual_isRelNull (qual) /*@*/ ; +extern bool qual_isNotNull (qual) /*@*/ ; +extern bool qual_isReturned (qual) /*@*/ ; +extern bool qual_isExposed (qual) /*@*/ ; +extern bool qual_isObserver (qual) /*@*/ ; +extern bool qual_isUnused (qual) /*@*/ ; +extern bool qual_isExternal (qual) /*@*/ ; +extern bool qual_isSef (qual) /*@*/ ; +extern bool qual_isAbstract (qual) /*@*/ ; +extern bool qual_isConcrete (qual) /*@*/ ; +extern bool qual_isMutable (qual) /*@*/ ; +extern bool qual_isImmutable (qual) /*@*/ ; +extern bool qual_isNullPred (/*@sef@*/ qual) /*@*/ ; +extern bool qual_isRefQual (/*@sef@*/ qual) /*@*/ ; +extern bool qual_isUndef (/*@sef@*/ qual) /*@*/ ; +extern bool qual_isKilled (/*@sef@*/ qual) /*@*/ ; +extern /*@unused@*/ bool qual_isTypeQual (/*@sef@*/ qual) /*@*/ ; +extern /*@unused@*/ bool qual_isControlQual (/*@sef@*/ qual) /*@*/ ; +extern /*@unused@*/ bool qual_isStorageClass (/*@sef@*/ qual) /*@*/ ; +extern bool qual_isCQual (/*@sef@*/ qual) /*@*/ ; +extern bool qual_isAllocQual (/*@sef@*/ qual) /*@*/ ; +extern bool qual_isGlobalQual (/*@sef@*/ qual) /*@*/ ; +extern bool qual_isImplied (/*@sef@*/ qual) /*@*/ ; +extern bool qual_isExQual (/*@sef@*/ qual) /*@*/ ; +extern bool qual_isAliasQual (/*@sef@*/ qual) /*@*/ ; + +# define qual_isUnknown(q) ((q) == QU_UNKNOWN) +# define qual_isTrueNull(q) ((q) == QU_TRUENULL) +# define qual_isFalseNull(q) ((q) == QU_FALSENULL) +# define qual_isOwned(q) ((q) == QU_OWNED) +# define qual_isDependent(q) ((q) == QU_DEPENDENT) +# define qual_isRefCounted(q) ((q) == QU_REFCOUNTED) +# define qual_isRefs(q) ((q) == QU_REFS) +# define qual_isNewRef(q) ((q) == QU_NEWREF) +# define qual_isKillRef(q) ((q) == QU_KILLREF) +# define qual_isTempRef(q) ((q) == QU_TEMPREF) +# define qual_isLong(q) ((q) == QU_LONG) +# define qual_isShort(q) ((q) == QU_SHORT) +# define qual_isSigned(q) ((q) == QU_SIGNED) +# define qual_isUnsigned(q) ((q) == QU_UNSIGNED) +# define qual_isUnique(q) ((q) == QU_UNIQUE) +# define qual_isExits(q) ((q) == QU_EXITS) +# define qual_isMayExit(q) ((q) == QU_MAYEXIT) +# define qual_isNeverExit(q) ((q) == QU_NEVEREXIT) +# define qual_isTrueExit(q) ((q) == QU_TRUEEXIT) +# define qual_isFalseExit(q) ((q) == QU_FALSEEXIT) +# define qual_isConst(q) ((q) == QU_CONST) +# define qual_isVolatile(q) ((q) == QU_VOLATILE) +# define qual_isInline(q) ((q) == QU_INLINE) +# define qual_isExtern(q) ((q) == QU_EXTERN) +# define qual_isStatic(q) ((q) == QU_STATIC) +# define qual_isAuto(q) ((q) == QU_AUTO) +# define qual_isRegister(q) ((q) == QU_REGISTER) +# define qual_isOut(q) ((q) == QU_OUT) +# define qual_isIn(q) ((q) == QU_IN) +# define qual_isYield(q) ((q) == QU_YIELD) +# define qual_isOnly(q) ((q) == QU_ONLY) +# define qual_isImpOnly(q) ((q) == QU_IMPONLY) +# define qual_isPartial(q) ((q) == QU_PARTIAL) +# define qual_isSpecial(q) ((q) == QU_SPECIAL) +# define qual_isKeep(q) ((q) == QU_KEEP) +# define qual_isKept(q) ((q) == QU_KEPT) +# define qual_isTemp(q) ((q) == QU_TEMP) +# define qual_isShared(q) ((q) == QU_SHARED) +# define qual_isRelDef(q) ((q) == QU_RELDEF) +# define qual_isNull(q) ((q) == QU_NULL) +# define qual_isRelNull(q) ((q) == QU_RELNULL) +# define qual_isNotNull(q) ((q) == QU_NOTNULL) +# define qual_isReturned(q) ((q) == QU_RETURNED) +# define qual_isExposed(q) ((q) == QU_EXPOSED) +# define qual_isObserver(q) ((q) == QU_OBSERVER) +# define qual_isUnused(q) ((q) == QU_UNUSED) +# define qual_isExternal(q) ((q) == QU_EXTERNAL) +# define qual_isSef(q) ((q) == QU_SEF) +# define qual_isAbstract(q) ((q) == QU_ABSTRACT) +# define qual_isConcrete(q) ((q) == QU_CONCRETE) +# define qual_isMutable(q) ((q) == QU_MUTABLE) +# define qual_isImmutable(q) ((q) == QU_IMMUTABLE) +# define qual_isChecked(q) ((q) == QU_CHECKED) +# define qual_isCheckMod(q) ((q) == QU_CHECKMOD) +# define qual_isCheckedStrict(q) ((q) == QU_CHECKEDSTRICT) +# define qual_isUnchecked(q) ((q) == QU_UNCHECKED) +# define qual_isUndef(q) ((q) == QU_UNDEF) +# define qual_isKilled(q) ((q) == QU_KILLED) + +extern qual qual_createTrueNull (void) /*@*/ ; +extern qual qual_createFalseNull (void) /*@*/ ; +extern qual qual_createRefCounted (void) /*@*/ ; +extern qual qual_createRefs (void) /*@*/ ; +extern qual qual_createNewRef (void) /*@*/ ; +extern qual qual_createKillRef (void) /*@*/ ; +extern qual qual_createTempRef (void) /*@*/ ; +extern qual qual_createNotNull (void) /*@*/ ; +extern qual qual_createAbstract (void) /*@*/ ; +extern qual qual_createConcrete (void) /*@*/ ; +extern qual qual_createMutable (void) /*@*/ ; +extern qual qual_createImmutable (void) /*@*/ ; +extern qual qual_createShort (void) /*@*/ ; +extern qual qual_createLong (void) /*@*/ ; +extern qual qual_createSigned (void) /*@*/ ; +extern qual qual_createUnsigned (void) /*@*/ ; +extern qual qual_createUnique (void) /*@*/ ; +extern qual qual_createMayExit (void) /*@*/ ; +extern qual qual_createExits (void) /*@*/ ; +extern qual qual_createNeverExit (void) /*@*/ ; +extern qual qual_createFalseExit (void) /*@*/ ; +extern qual qual_createTrueExit (void) /*@*/ ; +extern qual qual_createConst (void) /*@*/ ; +extern qual qual_createVolatile (void) /*@*/ ; +extern qual qual_createInline (void) /*@*/ ; +extern qual qual_createExtern (void) /*@*/ ; +extern qual qual_createStatic (void) /*@*/ ; +extern qual qual_createAuto (void) /*@*/ ; +extern qual qual_createRegister (void) /*@*/ ; +extern qual qual_createOut (void) /*@*/ ; +extern qual qual_createIn (void) /*@*/ ; +extern qual qual_createYield (void) /*@*/ ; +extern qual qual_createOnly (void) /*@*/ ; +extern qual qual_createOwned (void) /*@*/ ; +extern qual qual_createDependent (void) /*@*/ ; +extern qual qual_createRelDef (void) /*@*/ ; +extern qual qual_createImpOnly (void) /*@*/ ; +extern qual qual_createPartial (void) /*@*/ ; +extern qual qual_createSpecial (void) /*@*/ ; +extern qual qual_createKeep (void) /*@*/ ; +extern qual qual_createKept (void) /*@*/ ; +extern qual qual_createTemp (void) /*@*/ ; +extern qual qual_createShared (void) /*@*/ ; +extern qual qual_createNull (void) /*@*/ ; +extern qual qual_createRelNull (void) /*@*/ ; +extern qual qual_createReturned (void) /*@*/ ; +extern qual qual_createExposed (void) /*@*/ ; +extern qual qual_createObserver (void) /*@*/ ; +extern qual qual_createUnused (void) /*@*/ ; +extern qual qual_createExternal (void) /*@*/ ; +extern qual qual_createSef (void) /*@*/ ; +extern qual qual_createChecked (void) /*@*/ ; +extern qual qual_createCheckMod (void) /*@*/ ; +extern qual qual_createUnchecked (void) /*@*/ ; +extern qual qual_createCheckedStrict (void) /*@*/ ; +extern qual qual_createUndef (void) /*@*/ ; +extern qual qual_createKilled (void) /*@*/ ; + +# ifndef NOLCL +extern qual qual_createUnknown (void) /*@*/ ; +# define qual_createUnknown() (QU_UNKNOWN) + +extern qual qual_createPrintfLike (void) /*@*/ ; +extern qual qual_createScanfLike (void) /*@*/ ; +extern qual qual_createMessageLike (void) /*@*/ ; + +# define qual_createPrintfLike() (QU_PRINTFLIKE) +# define qual_createScanfLike() (QU_SCANFLIKE) +# define qual_createMessageLike() (QU_MESSAGELIKE) +# endif + +# define qual_createTrueNull() (QU_TRUENULL) +# define qual_createFalseNull() (QU_FALSENULL) +# define qual_createRefCounted() (QU_REFCOUNTED) +# define qual_createRefs() (QU_REFS) +# define qual_createNewRef() (QU_NEWREF) +# define qual_createKillRef() (QU_KILLREF) +# define qual_createTempRef() (QU_TEMPREF) +# define qual_createNotNull() (QU_NOTNULL) +# define qual_createAbstract() (QU_ABSTRACT) +# define qual_createConcrete() (QU_CONCRETE) +# define qual_createMutable() (QU_MUTABLE) +# define qual_createImmutable() (QU_IMMUTABLE) +# define qual_createShort() (QU_SHORT) +# define qual_createLong() (QU_LONG) +# define qual_createSigned() (QU_SIGNED) +# define qual_createUnsigned() (QU_UNSIGNED) +# define qual_createUnique() (QU_UNIQUE) +# define qual_createMayExit() (QU_MAYEXIT) +# define qual_createExits() (QU_EXITS) +# define qual_createNeverExit() (QU_NEVEREXIT) +# define qual_createTrueExit() (QU_TRUEEXIT) +# define qual_createFalseExit() (QU_FALSEEXIT) +# define qual_createConst() (QU_CONST) +# define qual_createVolatile() (QU_VOLATILE) +# define qual_createInline() (QU_INLINE) +# define qual_createExtern() (QU_EXTERN) +# define qual_createStatic() (QU_STATIC) +# define qual_createAuto() (QU_AUTO) +# define qual_createRegister() (QU_REGISTER) +# define qual_createOut() (QU_OUT) +# define qual_createIn() (QU_IN) +# define qual_createYield() (QU_YIELD) +# define qual_createOnly() (QU_ONLY) +# define qual_createOwned() (QU_OWNED) +# define qual_createDependent() (QU_DEPENDENT) +# define qual_createRelDef() (QU_RELDEF) +# define qual_createImpOnly() (QU_IMPONLY) +# define qual_createPartial() (QU_PARTIAL) +# define qual_createSpecial() (QU_SPECIAL) +# define qual_createKeep() (QU_KEEP) +# define qual_createKept() (QU_KEPT) +# define qual_createTemp() (QU_TEMP) +# define qual_createShared() (QU_SHARED) +# define qual_createNull() (QU_NULL) +# define qual_createRelNull() (QU_RELNULL) +# define qual_createReturned() (QU_RETURNED) +# define qual_createExposed() (QU_EXPOSED) +# define qual_createObserver() (QU_OBSERVER) +# define qual_createUnused() (QU_UNUSED) +# define qual_createExternal() (QU_EXTERNAL) +# define qual_createSef() (QU_SEF) +# define qual_createChecked() (QU_CHECKED) +# define qual_createCheckMod() (QU_CHECKMOD) +# define qual_createCheckedStrict() (QU_CHECKEDSTRICT) +# define qual_createUnchecked() (QU_UNCHECKED) +# define qual_createUndef() (QU_UNDEF) +# define qual_createKilled() (QU_KILLED) + +extern bool qual_isGlobCheck (/*@sef@*/ qual p_q) /*@*/ ; +# define qual_isGlobCheck(q) \ + (qual_isChecked (q) || qual_isCheckMod (q) \ + || qual_isUnchecked (q) || qual_isCheckedStrict (q)) + +# define qual_isNullPred(q) \ + (qual_isTrueNull (q) || qual_isFalseNull (q)) + +# define qual_isRefQual(q) \ + (qual_isRefCounted(q) || qual_isRefs(q) || qual_isNewRef (q) || \ + qual_isKillRef (q) || qual_isTempRef (q)) + +# define qual_isTypeQual(q) \ + (qual_isAbstract(q) || qual_isMutable(q) || qual_isImmutable(q)) + +# define qual_isControlQual(q) (qual_isExits(q) || qual_isMayExit (q)) +# define qual_isStorageClass(q) (qual_isExtern(q) || qual_isStatic(q)) +# define qual_isCQual(q) \ + (qual_isAuto(q) || qual_isRegister(q) || qual_isInline(q) \ + || qual_isConst(q) || qual_isVolatile(q) || qual_isShort(q) \ + || qual_isLong (q) || qual_isSigned (q) || qual_isUnsigned (q)) + +# define qual_isAllocQual(q) \ + (qual_isOut (q) || qual_isIn (q) || qual_isSpecial (q) \ + || qual_isPartial (q) || qual_isRelDef (q)) + +# define qual_isGlobalQual(q) \ + (qual_isUndef(q) || qual_isKilled (q)) + +# define qual_isImplied(q) (qual_isImpOnly(q)) + +# define qual_isExQual(q) (qual_isExposed (q) || qual_isObserver (q)) + +# define qual_isAliasQual(q) \ + (qual_isOnly(q) || qual_isImpOnly(q) || qual_isTemp(q) \ + || qual_isOwned (q) || qual_isShared (q) || qual_isUnique (q) \ + || qual_isDependent (q) || qual_isKeep (q) || qual_isKept (q)) + +extern bool qual_isExitQual (/*@sef@*/ qual p_q) /*@*/ ; +# define qual_isExitQual(q) \ + (qual_isExits (q) || qual_isNeverExit (q) || qual_isMayExit (q) \ + || qual_isTrueExit (q) || qual_isFalseExit (q)) + +# else +# error "Multiple include" +# endif + + diff --git a/src/Headers/qualList.h b/src/Headers/qualList.h new file mode 100644 index 0000000..51f7f36 --- /dev/null +++ b/src/Headers/qualList.h @@ -0,0 +1,66 @@ +/* +** qualList.h (from slist_templace.h) +*/ + +# ifndef QUALLIST_H +# define QUALLIST_H + +abst_typedef /*@null@*/ struct _qualList +{ + int nelements; + int free; + /*@reldef@*/ /*@relnull@*/ qual *elements; +} *qualList ; + +extern /*@falsenull@*/ bool qualList_isDefined (qualList p_s); +extern /*@unused@*/ /*@truenull@*/ bool qualList_isUndefined (qualList p_s); + +/*@constant null qualList qualList_undefined; @*/ +# define qualList_undefined ((qualList) NULL) + +# define qualList_isDefined(q) ((q) != qualList_undefined) +# define qualList_isUndefined(q) ((q) == qualList_undefined) + +/*@iter qualList_elements (sef qualList x, yield qual el); @*/ +# define qualList_elements(x, m_el) \ + { if (qualList_isDefined(x)) { \ + int m_ind; qual *m_elements = &((x)->elements[0]); \ + for (m_ind = 0; m_ind < (x)->nelements; m_ind++) \ + { qual m_el = *(m_elements++); + +# define end_qualList_elements }}} + +extern int qualList_size (/*@sef@*/ qualList p_s); +# define qualList_size(s) (qualList_isDefined(s) ? (s)->nelements : 0) + +extern bool qualList_isEmpty (/*@sef@*/ qualList p_s); +# define qualList_isEmpty(s) (qualList_size(s) == 0) + +extern qualList qualList_new (void) /*@*/ ; +extern qualList qualList_add (/*@returned@*/ qualList p_s, qual p_el) + /*@modifies p_s@*/; + +extern /*@only@*/ cstring qualList_unparse (qualList p_s) /*@*/ ; +extern void qualList_free (/*@only@*/ qualList p_s) ; +extern qualList qualList_appendList (/*@returned@*/ qualList p_s, qualList p_t); + +# ifndef NOLCL +extern qualList qualList_copy (qualList p_s); +extern /*@only@*/ cstring qualList_toCComments (qualList p_s); +# endif + +extern void qualList_clear (qualList p_q); + +/*@constant int qualListBASESIZE;@*/ +# define qualListBASESIZE 8 + +extern bool qualList_hasAliasQualifier (qualList p_s); +extern bool qualList_hasExposureQualifier (qualList p_s); + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/quantifiedTermNode.h b/src/Headers/quantifiedTermNode.h new file mode 100644 index 0000000..a361cd1 --- /dev/null +++ b/src/Headers/quantifiedTermNode.h @@ -0,0 +1,13 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _quantifiedTermNode { + quantifierNodeList quantifiers; + ltoken open; /* for ease of debugging */ + struct _termNode *body; + ltoken close; /* for ease of debugging */ +} *quantifiedTermNode; + diff --git a/src/Headers/quantifierNode.h b/src/Headers/quantifierNode.h new file mode 100644 index 0000000..e16b83e --- /dev/null +++ b/src/Headers/quantifierNode.h @@ -0,0 +1,14 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _quantifierNode { + ltoken quant; + varNodeList vars; + bool isForall; +} *quantifierNode; + +extern quantifierNode quantifierNode_copy (quantifierNode p_x); +extern void quantifierNode_free (/*@null@*/ /*@only@*/ quantifierNode p_x); diff --git a/src/Headers/quantifierNodeList.h b/src/Headers/quantifierNodeList.h new file mode 100644 index 0000000..3679d14 --- /dev/null +++ b/src/Headers/quantifierNodeList.h @@ -0,0 +1,45 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef QUANTIFIERNODELIST_H +# define QUANTIFIERNODELIST_H + +typedef /*@only@*/ quantifierNode o_quantifierNode; + +abst_typedef struct _quantifierNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_quantifierNode *elements; +} *quantifierNodeList ; + +/*@iter quantifierNodeList_elements (sef quantifierNodeList x, yield exposed quantifierNode el); @*/ +# define quantifierNodeList_elements(x, m_el) \ + { int m_ind; quantifierNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { quantifierNode m_el = *(m_elements++); + +# define end_quantifierNodeList_elements }} + +extern /*@only@*/ quantifierNodeList quantifierNodeList_new(void); + +extern quantifierNodeList + quantifierNodeList_add (/*@returned@*/ quantifierNodeList p_s, /*@only@*/ quantifierNode p_el); + +extern /*@only@*/ cstring quantifierNodeList_unparse (quantifierNodeList p_s) ; +extern /*@unused@*/ void quantifierNodeList_free (/*@only@*/ quantifierNodeList p_s) ; + +extern /*@only@*/ quantifierNodeList quantifierNodeList_copy (quantifierNodeList p_s) ; + +/*@constant int quantifierNodeListBASESIZE;@*/ +# define quantifierNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/renamingNode.h b/src/Headers/renamingNode.h new file mode 100644 index 0000000..58e26ab --- /dev/null +++ b/src/Headers/renamingNode.h @@ -0,0 +1,20 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _nameAndReplaceNode { + typeNameNodeList namelist; /* the positional arguments */ + replaceNodeList replacelist; /* the rest of replace renamings */ +} *nameAndReplaceNode; + +typedef struct _renamingNode { + bool is_replace; /* TRUE means replace, false means name */ + union { + replaceNodeList replace; + nameAndReplaceNode name; + } content; +} *renamingNode; + +extern /*@only@*/ cstring renamingNode_unparse (/*@null@*/ renamingNode p_x); diff --git a/src/Headers/replaceNode.h b/src/Headers/replaceNode.h new file mode 100644 index 0000000..4557019 --- /dev/null +++ b/src/Headers/replaceNode.h @@ -0,0 +1,21 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +typedef struct _replaceNode { + ltoken tok; + typeNameNode typename; + bool isCType; /* TRUE means it is a CType */ + union { + struct { + /*@null@*/ nameNode name; + /*@null@*/ sigNode signature; + } renamesortname; + ltoken ctype; + } content; +} *replaceNode; + +extern void replaceNode_free (/*@only@*/ /*@null@*/ replaceNode p_x); +extern /*@only@*/ cstring replaceNode_unparse (/*@null@*/ replaceNode p_x); + diff --git a/src/Headers/replaceNodeList.h b/src/Headers/replaceNodeList.h new file mode 100644 index 0000000..b88cf76 --- /dev/null +++ b/src/Headers/replaceNodeList.h @@ -0,0 +1,50 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef replaceNodeLIST_H +# define replaceNodeLIST_H + +typedef /*@only@*/ replaceNode o_replaceNode; + +abst_typedef struct _replaceNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_replaceNode *elements; +} *replaceNodeList ; + +/*@iter replaceNodeList_elements (sef replaceNodeList x, yield exposed replaceNode el); @*/ +# define replaceNodeList_elements(x, m_el) \ + { int m_ind; replaceNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { replaceNode m_el = *(m_elements++); + +# define end_replaceNodeList_elements }} + +extern int replaceNodeList_size (replaceNodeList); + +# define replaceNodeList_size(s) ((s)->nelements) + +extern bool replaceNodeList_isDefined (replaceNodeList); +# define replaceNodeList_isDefined(s) ((s) != (replaceNodeList)0) + +extern /*@only@*/ replaceNodeList replaceNodeList_new(void); + +extern replaceNodeList + replaceNodeList_add (/*@returned@*/ replaceNodeList p_s, /*@only@*/ replaceNode p_el) ; + +extern /*@only@*/ cstring replaceNodeList_unparse (replaceNodeList p_s) ; +extern void replaceNodeList_free (/*@only@*/ replaceNodeList p_s) ; + +/*@constant int replaceNodeListBASESIZE;@*/ +# define replaceNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/reservedNames.nf b/src/Headers/reservedNames.nf new file mode 100644 index 0000000..2e6a683 --- /dev/null +++ b/src/Headers/reservedNames.nf @@ -0,0 +1,201 @@ + "BUFSIZ", + "CHAR_BIT", + "CHAR_MAX", + "CHAR_MIN", + "CLOCKS_PER_SEC", + "DBL_DIG", + "DBL_EPSILON", + "DBL_MANT_DIG", + "DBL_MAX", + "DBL_MAX_10_EXP", + "DBL_MAX_EXP", + "DBL_MIN", + "DBL_MIN_10_EXP", + "DBL_MIN_EXP", + "EXIT_FAILURE", + "EXIT_SUCCESS", + "FILE", + "FILENAME_MAX", + "FLT_DIG", + "FLT_EPSILON", + "FLT_MANT_DIG", + "FLT_MAX", + "FLT_MAX_10_EXP", + "FLT_MAX_EXP", + "FLT_MIN", + "FLT_MIN_10_EXP", + "FLT_MIN_EXP", + "FLT_RADIX", + "FLT_ROUNDS", + "FOPEN_MAX", + "HUGE_VAL", + "INT_MAX", + "INT_MIN", + "LDBL_DIG", + "LDBL_EPSILON", + "LDBL_MANT_DIG", + "LDBL_MAX", + "LDBL_MAX_10_EXP", + "LDBL_MAX_EXP", + "LDBL_MIN", + "LDBL_MIN_10_EXP", + "LDBL_MIN_EXP", + "LONG_MAX", + "LONG_MIN", + "L_tmpnam", + "MB_CUR_MAX", + "MB_LEN_MAX", + "NDEBUG", + "NULL", + "RAND_MAX", + "SCHAR_MAX", + "SCHAR_MIN", + "SEEK_CUR", + "SEEK_END", + "SEEK_SET", + "SHRT_MAX", + "SHRT_MIN", + "SIGABRT", + "SIGFPE", + "SIGILL", + "SIGINT", + "SIGSEGV", + "SIGTERM", + "SIG_DFL", + "SIG_ERR", + "SIG_IGN", + "TMP_MAX", + "UCHAR_MAX", + "UINT_MAX", + "ULONG_MAX", + "USHRT_MAX", + "abort", + "abs", + "asctime", + "assert", + "atexit", + "atof", + "atoi", + "atol", + "bsearch", + "calloc", + "clearerr", + "clock", + "clock_t", + "ctime", + "currency_symbol", + "decimal_point", +/* "defined", */ + "difftime", + "div", + "div_t", + "errno", + "exit", + "fclose", + "feof", + "ferror", + "fflush", + "fgetc", + "fgetpos", + "fgets", + "fopen", + "fpos_t", + "fprintf", + "fputc", + "fputs", + "frac_digits", + "fread", + "free", + "freopen", + "fscanf", + "fseek", + "fsetpos", + "ftell", + "fwrite", + "getc", + "getchar", + "getenv", + "gets", + "gmtime", + "grouping", + "int_curr_symbol", + "int_frac_digits", + "jmp_buf", + "labs", + "lconv", + "ldiv", + "ldiv_t", + "localeconv", + "localtime", + "longjmp", + "malloc", + "mblen", + "mbstowcs", + "mbtowc", + "mktime", + "mon_decimal_point", + "mon_grouping", + "mon_thousands_sep", + "n_cs_precedes", + "n_sep_by_space", + "n_sign_posn", + "negative_sign", + "offsetof", + "p_cs_precedes", + "p_sep_by_space", + "p_sign_posn", + "perror", + "positive_sign", + "printf", + "ptrdiff_t", + "putc", + "putchar", + "puts", + "qsort", + "raise", + "rand", + "realloc", + "remove", + "rename", + "rewind", + "scanf", + "setbuf", + "setjmp", + "setlocale", + "setvbuf", + "sig_atomic_t", + "signal", + "size_t", + "sprintf", + "srand", + "sscanf", + "stderr", + "stdin", + "stdout", + "system", + "thousands_sep", + "time", + "time_t", + "tm", + "tm_hour", + "tm_isdst", + "tm_mday", + "tm_min", + "tm_mon", + "tm_sec", + "tm_wday", + "tm_yday", + "tm_year", + "tmpfile", + "tmpnam", + "ungetc", + "va_arg", + "va_end", + "va_list", + "va_start", + "vfprintf", + "vprintf", + "vsprintf", + "wchar_t", + "wcstombs", + "wctomb", diff --git a/src/Headers/sHerald.h b/src/Headers/sHerald.h new file mode 100644 index 0000000..4fac145 --- /dev/null +++ b/src/Headers/sHerald.h @@ -0,0 +1,4 @@ +/*@constant observer char *SANITIZE_VERSION;@*/ +# define SANITIZE_VERSION "Sanitizer 0.1+ --- Fri Dec 12 19:51:34 EST 1997" +/*@constant observer char *SANITIZE_COMPILE;@*/ +# define SANITIZE_COMPILE "Compiled using gcc -O5 on Linux spd.lcs.mit.edu 2.0.32 #4 Sun Nov 16 22:17:18 EST 1997 i586 unknown by evs" diff --git a/src/Headers/sRef.h b/src/Headers/sRef.h new file mode 100644 index 0000000..cfc2d71 --- /dev/null +++ b/src/Headers/sRef.h @@ -0,0 +1,598 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** storeRef.h +*/ + +# ifndef STOREREF_H +# define STOREREF_H + +/* +** note: forwardTypes defines sRef +*/ + +/* +** kinds of storage references +*/ + +typedef enum { + SR_NOTHING, + SR_INTERNAL, + SR_SPECSTATE, + SR_SYSTEM +} speckind; + +typedef enum { + SK_PARAM, + SK_ARRAYFETCH, + SK_FIELD, + SK_PTR, + SK_ADR, + SK_CONST, + SK_CVAR, + SK_UNCONSTRAINED, + SK_OBJECT, + SK_CONJ, + SK_EXTERNAL, + SK_DERIVED, + SK_NEW, + SK_TYPE, + SK_RESULT, + SK_SPECIAL, + SK_UNKNOWN +} skind; + +typedef struct _cref +{ + int lexlevel; + usymId index; +} *cref; + +typedef struct _ainfo +{ + /*@exposed@*/ /*@notnull@*/ sRef arr; + bool indknown; + int ind; +} *ainfo; + +typedef struct _fldinfo +{ + /*@exposed@*/ /*@notnull@*/ sRef rec; + /*@observer@*/ cstring field; +} *fldinfo ; + +typedef struct _cjinfo +{ + /*@exposed@*/ /*@notnull@*/ sRef a; + /*@exposed@*/ /*@notnull@*/ sRef b; +} *cjinfo ; + +typedef union _sinfo +{ + /*@only@*/ cref cvar; + int paramno; + /*@only@*/ ainfo arrayfetch; + /*@only@*/ fldinfo field; + ctype object; + /*@observer@*/ cstring fname; /* unconstrained, new */ + /*@exposed@*/ /*@notnull@*/ sRef ref; + /*@only@*/ cjinfo conj; + speckind spec; +} *sinfo; + +typedef /*@null@*/ struct _alinfo +{ + /*@only@*/ fileloc loc; + /*@observer@*/ sRef ref; + /*@observer@*/ uentry ue; +} *alinfo; + +struct _sRef +{ + /* does it need to be inside parens (macros) */ + bool safe BOOLBITS; + + /* has it been modified */ + bool modified BOOLBITS; + + skind kind; + ctype type; + + sstate defstate; + nstate nullstate; + + alkind aliaskind; + alkind oaliaskind; + + exkind expkind; /* exposed, observer, normal */ + exkind oexpkind; + + /* where it becomes observer/exposed */ + /*@null@*/ /*@only@*/ alinfo expinfo; + + /* where it changed alias kind */ + /*@null@*/ /*@only@*/ alinfo aliasinfo; + + /* where it is defined/allocated */ + /*@null@*/ /*@only@*/ alinfo definfo; + + /* where it changes null state */ + /*@null@*/ /*@only@*/ alinfo nullinfo; + + /*@only@*/ /*@relnull@*/ sinfo info; + + /* stores fields for structs, elements for arrays, derefs for pointers */ + /*@only@*/ sRefSet deriv; +} ; + +extern bool sRef_perhapsNull (sRef p_s); +extern bool sRef_possiblyNull (sRef p_s); +extern bool sRef_definitelyNull (sRef p_s); + +extern void sRef_setNullError (sRef p_s); +extern void sRef_setNullUnknown (sRef p_s, fileloc p_loc); +extern void sRef_setNotNull (sRef p_s, fileloc p_loc); +extern void sRef_setNullState (sRef p_s, nstate p_n, fileloc p_loc); +extern void sRef_setNullStateInnerComplete (sRef p_s, nstate p_n, fileloc p_loc); +extern void sRef_setPosNull (sRef p_s, fileloc p_loc); +extern void sRef_setDefNull (sRef p_s, fileloc p_loc); + +extern /*@truenull@*/ bool sRef_isInvalid (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isValid (sRef p_s) /*@*/ ; + +/*@constant null sRef sRef_undefined; @*/ +# define sRef_undefined ((sRef) NULL) +# define sRef_isInvalid(s) ((s) == NULL) +# define sRef_isValid(s) ((s) != NULL) + +extern bool sRef_isRecursiveField (sRef p_s) /*@*/ ; +extern void sRef_copyRealDerivedComplete (sRef p_s1, sRef p_s2) /*@modifies p_s1@*/ ; +extern nstate sRef_getNullState (/*@sef@*/ sRef p_s) /*@*/ ; +extern bool sRef_isNotNull (sRef p_s) /*@*/ ; + +# define sRef_getNullState(s) (sRef_isValid(s) ? (s)->nullstate : NS_UNKNOWN) +extern bool sRef_isDefinitelyNull (sRef p_s) /*@*/ ; + +extern /*@falsenull@*/ bool sRef_isLocalVar (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isNSLocalVar (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isRealLocalVar (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isLocalParamVar (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isKnown (/*@sef@*/ sRef p_s) /*@*/ ; + +extern bool sRef_hasLastReference (sRef p_s) /*@*/ ; +# define sRef_hasLastReference(s) (sRef_hasAliasInfoRef (s)) + +# define sRef_isKnown(s) (sRef_isValid(s) && (s)->kind != SK_UNKNOWN) + +extern bool sRef_isMeaningful (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isMeaningful(s) (sRef_isValid(s) && sRef_isKnown(s) \ + && (s)->kind != SK_NEW && (s)->kind != SK_TYPE) +extern bool sRef_isNew (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isNew(s) (sRef_isValid(s) && (s)->kind == SK_NEW) + +extern bool sRef_isType (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isType(s) (sRef_isValid(s) && (s)->kind == SK_TYPE) + +extern bool sRef_isSafe (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isSafe(s) (sRef_isValid(s) && (s)->safe) + +extern bool sRef_isUnsafe (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isUnsafe(s) (sRef_isValid(s) && !(s)->safe) + +extern void sRef_clearAliasKind (/*@sef@*/ sRef p_s) /*@modifies p_s@*/ ; +# define sRef_clearAliasKind(s) (sRef_isValid(s) ? (s)->aliaskind = AK_UNKNOWN : AK_ERROR) + +extern bool sRef_stateKnown (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_stateKnown(s) (sRef_isValid(s) && (s)->defstate != SS_UNKNOWN) + +extern alkind sRef_getAliasKind (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_getAliasKind(s) (sRef_isValid(s) ? (s)->aliaskind : AK_ERROR) + +extern alkind sRef_getOrigAliasKind (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_getOrigAliasKind(s) (sRef_isValid(s) ? (s)->oaliaskind : AK_ERROR) + +extern /*@falsenull@*/ bool sRef_isConj (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isConj(s) (sRef_isValid(s) && (s)->kind == SK_CONJ) + +extern /*@exposed@*/ sRef sRef_buildArrow (sRef p_s, /*@dependent@*/ cstring p_f); +extern /*@exposed@*/ sRef sRef_makeArrow (sRef p_s, /*@dependent@*/ cstring p_f); + +extern bool sRef_isAllocIndexRef (sRef p_s) /*@*/ ; +extern void sRef_setAliasKind (sRef p_s, alkind p_kind, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setPdefined (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; + +extern /*@unused@*/ bool sRef_hasDerived (sRef p_s) /*@*/ ; +extern void sRef_clearDerived (sRef p_s); +extern void sRef_clearDerivedComplete (sRef p_s); +extern /*@exposed@*/ sRef sRef_getBaseSafe (sRef p_s); + +extern /*@observer@*/ sRefSet sRef_derivedFields (/*@dependent@*/ sRef p_rec) /*@*/ ; +extern bool sRef_sameName (sRef p_s1, sRef p_s2) /*@*/ ; +extern bool sRef_isDirectParam (sRef p_s) /*@*/ ; +extern /*@exposed@*/ sRef sRef_makeAnyArrayFetch (/*@exposed@*/ sRef p_arr); +extern bool sRef_isUnknownArrayFetch (sRef p_s) /*@*/ ; + +extern void sRef_setPartialDefinedComplete (sRef p_s, fileloc p_loc); +extern bool sRef_isMacroParamRef (sRef p_s) /*@*/ ; + +extern void sRef_destroyMod (void) /*@modifies internalState@*/ ; + +extern bool sRef_deepPred (bool (p_predf) (sRef), sRef p_s); + +extern bool sRef_aliasCompleteSimplePred (bool (p_predf) (sRef), sRef p_s); + +extern void sRef_clearExKindComplete (sRef p_s, fileloc p_loc); + +extern /*@falsenull@*/ bool sRef_isKindSpecial (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isKindSpecial(s) (sRef_isValid (s) && (s)->kind == SK_SPECIAL) + +extern /*@observer@*/ cstring sRef_nullMessage (sRef p_s) /*@*/ ; + +extern bool sRef_isSystemState (sRef p_s) /*@*/ ; +extern bool sRef_isInternalState (sRef p_s) /*@*/ ; +extern bool sRef_isResult (sRef p_s) /*@*/ ; +extern bool sRef_isSpecInternalState (sRef p_s) /*@*/ ; +extern bool sRef_isSpecState (sRef p_s) /*@*/ ; +extern bool sRef_isNothing (sRef p_s) /*@*/ ; + +extern bool sRef_isGlobal (sRef p_s) /*@*/ ; +extern bool sRef_isReference (sRef p_s) /*@*/ ; + +extern ctype sRef_deriveType (sRef p_s, uentryList p_cl) /*@*/ ; +extern ctype sRef_getType (sRef p_s) /*@*/ ; + +extern /*@falsenull@*/ bool sRef_isAddress (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isArrayFetch (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isConst (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isCvar (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isField (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isParam (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isPointer (sRef p_s) /*@*/ ; + +extern void sRef_setType (sRef p_s, ctype p_t); +extern void sRef_setTypeFull (sRef p_s, ctype p_t); +extern void sRef_mergeNullState (sRef p_s, nstate p_n); +extern void sRef_setLastReference (sRef p_s, sRef p_ref, fileloc p_loc); +extern bool sRef_canModify (sRef p_s, sRefSet p_sl) /*@modifies p_s@*/ ; +extern bool sRef_canModifyVal (sRef p_s, sRefSet p_sl) /*@modifies p_s@*/ ; +extern bool sRef_isIReference (sRef p_s) /*@*/ ; +extern bool sRef_isIndexKnown (sRef p_arr) /*@*/ ; +extern bool sRef_isModified (sRef p_s) /*@*/ ; + +extern bool sRef_isExternallyVisible (sRef p_s) /*@*/ ; +extern int sRef_compare (sRef p_s1, sRef p_s2) /*@*/ ; +extern bool sRef_realSame (sRef p_s1, sRef p_s2) /*@*/ ; +extern bool sRef_same (sRef p_s1, sRef p_s2) /*@*/ ; +extern bool sRef_similar (sRef p_s1, sRef p_s2) /*@*/ ; +extern /*@observer@*/ cstring sRef_getField (sRef p_s) /*@*/ ; +extern /*@only@*/ cstring sRef_unparse (sRef p_s) /*@*/ ; +extern /*@observer@*/ cstring sRef_stateVerb (sRef p_s) /*@*/ ; +extern /*@observer@*/ cstring sRef_stateAltVerb (sRef p_s) /*@*/ ; +extern /*@only@*/ cstring sRef_unparseOpt (sRef p_s) /*@*/ ; +extern /*@only@*/ cstring sRef_unparseDebug (sRef p_s) /*@*/ ; +extern void sRef_killComplete (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern int sRef_getIndex (sRef p_arr) /*@*/ ; +extern /*@dependent@*/ sRef sRef_fixOuterRef (/*@returned@*/ sRef p_s); +extern void sRef_setDefinedComplete (sRef p_s, fileloc p_loc); +extern void sRef_setDefinedNCComplete (sRef p_s, fileloc p_loc); +extern int sRef_getParam (sRef p_s) /*@*/ ; +extern int sRef_lexLevel (sRef p_s) /*@*/ ; +extern void sRef_setOrigAliasKind (sRef p_s, alkind p_kind); +extern /*@exposed@*/ sRef + sRef_fixBase (/*@returned@*/ sRef p_s, /*@returned@*/ sRef p_base) + /*@modifies p_s, p_base@*/ ; + +extern void sRef_showNotReallyDefined (sRef p_s) /*@modifies g_msgstream@*/ ; + +extern void sRef_enterFunctionScope (void); +extern void sRef_setGlobalScope (void); +extern void sRef_exitFunctionScope (void); +extern void sRef_clearGlobalScopeSafe (void); +extern void sRef_setGlobalScopeSafe (void); + +extern /*@notnull@*/ /*@exposed@*/ sRef + sRef_buildArrayFetch (/*@exposed@*/ sRef p_arr); +extern /*@notnull@*/ /*@exposed@*/ sRef sRef_buildArrayFetchKnown (/*@exposed@*/ sRef p_arr, int p_i); +extern /*@exposed@*/ sRef + sRef_buildField (sRef p_rec, /*@dependent@*/ cstring p_f) + /*@modifies p_rec@*/ ; +extern /*@exposed@*/ sRef sRef_buildPointer (/*@exposed@*/ sRef p_t) + /*@modifies p_t@*/ ; + +extern /*@exposed@*/ sRef sRef_makeAddress (/*@exposed@*/ sRef p_t); +extern /*@notnull@*/ /*@dependent@*/ sRef sRef_makeUnconstrained (/*@exposed@*/ cstring) /*@*/ ; + +extern /*@falsenull@*/ bool sRef_isUnconstrained (sRef p_s) /*@*/ ; + +extern /*@observer@*/ cstring sRef_unconstrainedName (sRef p_s) /*@*/ ; + +extern /*@notnull@*/ /*@exposed@*/ sRef sRef_makeArrayFetch (sRef p_arr) /*@*/ ; +extern /*@notnull@*/ /*@exposed@*/ sRef + sRef_makeArrayFetchKnown (sRef p_arr, int p_i); +extern /*@notnull@*/ /*@dependent@*/ sRef + sRef_makeConj (/*@exposed@*/ /*@returned@*/ sRef p_a, /*@exposed@*/ sRef p_b); +extern /*@notnull@*/ /*@dependent@*/ sRef + sRef_makeCvar (int p_level, usymId p_index, ctype p_ct); +extern /*@notnull@*/ /*@dependent@*/ sRef + sRef_makeConst (ctype p_ct); +extern /*@exposed@*/ sRef + sRef_makeField (sRef p_rec, /*@dependent@*/ cstring p_f); +extern /*@notnull@*/ /*@dependent@*/ sRef + sRef_makeGlobal (usymId p_l, ctype p_ct); +extern /*@exposed@*/ sRef + sRef_makeNCField (sRef p_rec, /*@dependent@*/ cstring p_f) /*@*/ ; +extern void sRef_maybeKill (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern /*@unused@*/ /*@notnull@*/ /*@dependent@*/ sRef + sRef_makeObject (ctype p_o) /*@*/ ; +extern /*@notnull@*/ /*@dependent@*/ sRef sRef_makeType (ctype p_ct) /*@*/ ; +extern /*@notnull@*/ /*@dependent@*/ sRef sRef_makeParam (int p_l, ctype p_ct) /*@*/ ; +extern /*@exposed@*/ sRef sRef_makePointer (sRef p_s) /*@modifies p_s@*/ ; +extern void sRef_makeSafe (sRef p_s) /*@modifies p_s@*/ ; +extern void sRef_makeUnsafe (sRef p_s) /*@modifies p_s@*/ ; +extern sRef sRef_makeUnknown (void) /*@*/ ; + +extern sRef sRef_makeNothing (void) /*@*/ ; +extern sRef sRef_makeInternalState (void) /*@*/ ; +extern sRef sRef_makeSpecState (void) /*@*/ ; +extern sRef sRef_makeSystemState (void) /*@*/ ; + +extern /*@notnull@*/ sRef sRef_makeResult (void) /*@*/ ; +extern /*@exposed@*/ sRef + sRef_fixResultType (/*@returned@*/ sRef p_s, ctype p_typ, uentry p_ue) + /*@modifies p_s@*/; + +extern void sRef_setParamNo (sRef p_s, int p_l) /*@modifies p_s;@*/; + +extern /*@notnull@*/ sRef + sRef_makeNew (ctype p_ct, sRef p_t, /*@exposed@*/ cstring p_name); + +extern usymId sRef_getScopeIndex (sRef p_s) /*@*/ ; +extern /*@exposed@*/ uentry sRef_getBaseUentry (sRef p_s); + +extern /*@exposed@*/ sRef + sRef_fixBaseParam (/*@returned@*/ sRef p_s, exprNodeList p_args) + /*@modifies p_s@*/ ; + +extern bool sRef_isUnionField (sRef p_s); +extern void sRef_setModified (sRef p_s); + +extern void sRef_resetState (sRef p_s); +extern void sRef_resetStateComplete (sRef p_s); + +extern void sRef_storeState (sRef p_s); +extern /*@exposed@*/ sRef sRef_getBase (sRef p_s) /*@*/ ; +extern /*@exposed@*/ sRef sRef_getRootBase (sRef p_s) /*@*/ ; + +extern /*@observer@*/ uentry sRef_getUentry (sRef p_s); + +extern cstring sRef_dump (sRef p_s) /*@*/ ; +extern cstring sRef_dumpGlobal (sRef p_s) /*@*/ ; +extern /*@exposed@*/ sRef sRef_undump (char **p_c) /*@modifies *p_c@*/ ; +extern /*@exposed@*/ sRef sRef_undumpGlobal (char **p_c) /*@modifies *p_c@*/ ; + +extern /*@only@*/ sRef sRef_saveCopy (sRef p_s); +extern /*@dependent@*/ sRef sRef_copy (sRef p_s); + +extern cstring sRef_unparseState (sRef p_s) /*@*/ ; +extern ynm sRef_isWriteable (sRef p_s) /*@*/ ; +extern ynm sRef_isReadable (sRef p_s) /*@*/ ; +extern bool sRef_isStrictReadable (sRef p_s) /*@*/ ; +extern bool sRef_hasNoStorage (sRef p_s) /*@*/ ; +extern void sRef_showExpInfo (sRef p_s) /*@modifies g_msgstream*/ ; +extern void sRef_setDefined (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setUndefined (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setOnly (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setDependent (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setOwned (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setKept (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setKeptComplete (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setFresh (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setShared (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_showAliasInfo (sRef p_s) /*@modifies g_msgstream@*/ ; +extern void sRef_showNullInfo (sRef p_s) /*@modifies g_msgstream@*/ ; +extern void sRef_showStateInfo (sRef p_s) /*@modifies g_msgstream@*/ ; +extern void sRef_setStateFromType (sRef p_s, ctype p_ct) /*@modifies p_s@*/ ; +extern void sRef_kill (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setAllocated (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setAllocatedShallowComplete (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setAllocatedComplete (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; +extern /*@only@*/ cstring sRef_unparseKindNamePlain (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isRealGlobal(sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isFileStatic (sRef p_s) /*@*/ ; + +extern int sRef_getScope (sRef p_s) /*@*/ ; +extern /*@observer@*/ cstring sRef_getScopeName (sRef p_s) /*@*/ ; + +/* must be real function (passed as function param) */ +extern /*@falsenull@*/ bool sRef_isDead (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isDeadStorage (sRef p_s) /*@*/ ; +extern bool sRef_isStateLive (sRef p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRef_isPossiblyDead (sRef p_s) /*@*/ ; +extern /*@truenull@*/ bool sRef_isStateUndefined (sRef p_s) /*@*/ ; +extern bool sRef_isUnuseable (sRef p_s) /*@*/ ; + +extern /*@exposed@*/ sRef sRef_constructDeref (sRef p_t) + /*@modifies p_t@*/ ; + +extern /*@exposed@*/ sRef sRef_constructDeadDeref (sRef p_t) + /*@modifies p_t@*/ ; + +extern bool sRef_isJustAllocated (sRef p_s) /*@*/ ; + +extern /*@falsenull@*/ bool sRef_isAllocated (sRef p_s) /*@*/ ; + +extern bool sRef_isUndefGlob (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isUndefGlob(s) \ + ((sRef_isValid(s)) \ + && ((s)->defstate == SS_UNDEFGLOB || (s)->defstate == SS_UNDEFKILLED)) + +extern bool sRef_isKilledGlob (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isKilledGlob(s) \ + ((sRef_isValid(s)) \ + && ((s)->defstate == SS_KILLED || (s)->defstate == SS_UNDEFKILLED)) + +extern bool sRef_isRelDef (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isRelDef(s) \ + ((sRef_isValid(s)) && ((s)->defstate == SS_RELDEF)) + +extern bool sRef_isPartial (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isPartial(s) \ + ((sRef_isValid(s)) && ((s)->defstate == SS_PARTIAL)) + +extern bool sRef_isStateSpecial (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isStateSpecial(s) \ + ((sRef_isValid(s)) && ((s)->defstate == SS_SPECIAL)) + +extern bool sRef_isStateDefined (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isStateDefined(s) \ + ((sRef_isValid(s)) && (((s)->defstate == SS_DEFINED) \ + || (s)->defstate == SS_RELDEF)) + +extern bool sRef_isAnyDefined (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isAnyDefined(s) ((sRef_isValid(s)) && \ + (((s)->defstate == SS_DEFINED) \ + || ((s)->defstate == SS_RELDEF) \ + || ((s)->defstate == SS_PARTIAL))) + +extern /*@falsenull@*/ bool sRef_isPdefined (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isPdefined(s) \ + ((sRef_isValid(s)) && ((s)->defstate == SS_PDEFINED)) + +extern bool sRef_isReallyDefined (sRef p_s) /*@*/ ; + +extern bool sRef_isStateUnknown (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isStateUnknown(s) \ + ((sRef_isValid(s)) && ((s)->defstate == SS_UNKNOWN)) + +extern /*@falsenull@*/ bool sRef_isRefCounted (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isRefCounted(s) \ + ((sRef_isValid(s)) && ((s)->aliaskind == AK_REFCOUNTED)) + +extern /*@falsenull@*/ bool sRef_isNewRef (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isNewRef(s) \ + ((sRef_isValid(s)) && ((s)->aliaskind == AK_NEWREF)) + +extern /*@falsenull@*/ bool sRef_isKillRef (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isKillRef(s) \ + ((sRef_isValid(s)) && ((s)->aliaskind == AK_KILLREF)) + +extern bool sRef_isOnly (sRef p_s) /*@*/ ; +extern bool sRef_isDependent (sRef p_s) /*@*/ ; +extern bool sRef_isOwned (/*@sef@*/ sRef p_s) /*@*/ ; +extern bool sRef_isKeep (/*@sef@*/ sRef p_s) /*@*/ ; + +extern bool sRef_isKept (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isKept(s) \ + ((sRef_isValid(s)) && ((s)->aliaskind == AK_KEPT)) + +extern /*@unused@*/ bool sRef_isTemp (sRef p_s) /*@*/ ; + +extern bool sRef_isStack (sRef p_s) /*@*/ ; +extern bool sRef_isLocalState (sRef p_s) /*@*/ ; +extern bool sRef_isUnique (sRef p_s) /*@*/ ; +extern bool sRef_isShared (sRef p_s) /*@*/ ; +extern bool sRef_isExposed (sRef p_s) /*@*/ ; +extern bool sRef_isObserver (sRef p_s) /*@*/ ; +extern bool sRef_isFresh (sRef p_s) /*@*/ ; + +extern bool sRef_isRefsField (/*@sef@*/ sRef p_s) /*@*/ ; +# define sRef_isRefsField(s) \ + ((sRef_isValid(s)) && ((s)->aliaskind == AK_REFS)) + +extern void sRef_protectDerivs (void) /*@modifies internalState@*/ ; +extern void sRef_clearProtectDerivs (void) /*@modifies internalState@*/ ; + +extern exkind sRef_getExKind (sRef p_s) /*@*/ ; +extern exkind sRef_getOrigExKind (sRef p_s) /*@*/ ; +extern void sRef_setExKind (sRef p_s, exkind p_exp, fileloc p_loc) /*@modifies p_s@*/ ; +extern void sRef_setExposed (sRef p_s, fileloc p_loc) /*@modifies p_s@*/; + +extern bool sRef_isAnyParam (sRef p_s) /*@*/ ; +extern /*@observer@*/ sRef sRef_getAliasInfoRef (/*@exposed@*/ sRef p_s) /*@*/ ; +extern bool sRef_hasAliasInfoRef (sRef p_s) /*@*/ ; + +extern /*@exposed@*/ sRef sRef_constructPointer (sRef p_t) /*@modifies p_t*/ ; +extern bool sRef_isAliasCheckedGlobal (sRef p_s) /*@*/ ; +extern bool sRef_includedBy (sRef p_small, sRef p_big) /*@*/ ; +extern /*@dependent@*/ /*@exposed@*/ sRef sRef_makeExternal (/*@exposed@*/ sRef p_t) /*@*/ ; +extern bool sRef_similarRelaxed (sRef p_s1, sRef p_s2) /*@*/ ; +extern /*@only@*/ cstring sRef_unparseKindName (sRef p_s) /*@*/ ; +extern void sRef_copyState (sRef p_s1, sRef p_s2) /*@modifies p_s1@*/ ; +extern /*@unused@*/ bool sRef_isObject (sRef p_s) /*@*/ ; +extern bool sRef_isNotUndefined (sRef p_s) /*@*/ ; +extern bool sRef_isExternal (sRef p_s) /*@*/ ; +extern cstring sRef_unparseDeep (sRef p_s) /*@*/ ; +extern cstring sRef_unparseFull (sRef p_s) /*@*/ ; +extern /*@observer@*/ cstring sRef_unparseScope (sRef p_s) /*@*/ ; +extern void sRef_mergeState (sRef p_res, sRef p_other, clause p_cl, fileloc p_loc) + /*@modifies p_res, p_other@*/ ; +extern void sRef_mergeOptState (sRef p_res, sRef p_other, clause p_cl, fileloc p_loc) + /*@modifies p_res, p_other@*/ ; +extern void sRef_mergeStateQuiet (sRef p_res, sRef p_other) + /*@modifies p_res@*/ ; +extern void sRef_mergeStateQuietReverse (sRef p_res, sRef p_other) + /*@modifies p_res@*/ ; +extern void sRef_setStateFromUentry (sRef p_s, uentry p_ue) + /*@modifies p_s@*/ ; +extern bool sRef_isStackAllocated (sRef p_s) /*@*/ ; +extern bool sRef_modInFunction (void) /*@*/ ; +extern void sRef_clearAliasState (sRef p_s, fileloc p_loc) + /*@modifies p_s@*/ ; +extern void sRef_setPartial (sRef p_s, fileloc p_loc) + /*@modifies p_s@*/ ; +extern void sRef_setDerivNullState (sRef p_set, sRef p_guide, nstate p_ns) + /*@modifies p_set@*/ ; + +extern void sRef_clearGlobalScope (void) /*@modifies internalState@*/ ; + +extern sRef sRef_makeDerived (/*@exposed@*/ sRef p_t); + +extern sstate sRef_getDefState (sRef p_s) /*@*/ ; +extern void sRef_setDefState (sRef p_s, sstate p_defstate, fileloc p_loc); +extern void sRef_showRefLost (sRef p_s); +extern void sRef_showRefKilled (sRef p_s); +extern /*@exposed@*/ sRef sRef_updateSref (sRef p_s); + +extern void sRef_aliasCheckPred (bool (p_predf) (sRef, exprNode, sRef, exprNode), + /*@null@*/ bool (p_checkAliases) (sRef), + sRef p_s, exprNode p_e, exprNode p_err); +extern bool sRef_aliasCheckSimplePred (sRefTest p_predf, sRef p_s); + +extern void sRef_showStateInconsistent (sRef p_s); + +extern void sRef_setDependentComplete (sRef p_s, fileloc p_loc); + +extern void sRef_setAliasKindComplete (sRef p_s, alkind p_kind, fileloc p_loc); + +extern bool sRef_isThroughArrayFetch (sRef p_s) /*@*/ ; + +extern /*@exposed@*/ /*@notnull@*/ sRef sRef_getConjA (sRef p_s) /*@*/ ; +extern /*@exposed@*/ /*@notnull@*/ sRef sRef_getConjB (sRef p_s) /*@*/ ; + +extern /*@only@*/ cstring sRef_unparsePreOpt (sRef p_s) /*@*/ ; + +extern bool sRef_hasName (sRef p_s) /*@*/ ; + +extern void sRef_free (/*@only@*/ sRef p_s); + +extern void sRef_setObserver (sRef p_s, fileloc p_loc) /*@modifies p_s@*/ ; + +# else +# error "Multiple include" +# endif + + + + + + + + + + + + + diff --git a/src/Headers/sRefSet.h b/src/Headers/sRefSet.h new file mode 100644 index 0000000..285f178 --- /dev/null +++ b/src/Headers/sRefSet.h @@ -0,0 +1,124 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** sRefSet.h +** +** based on set_template.h +*/ + +# ifndef sRefSET_H +# define sRefSET_H + +struct _sRefSet +{ + int entries; + int nspace; + /*@reldef@*/ /*@relnull@*/ sRef *elements; +} ; + +/* in forwardTypes: typedef _sRefSet *sRefSet; */ + +/* +** realElements --- only non-objects +*/ + +/*@iter sRefSet_realElements (sef sRefSet s, yield exposed sRef el)@*/ +# define sRefSet_realElements(x, m_el) \ + { int m_ind; if (sRefSet_isDefined (x)) \ + { for (m_ind = 0 ; m_ind < (x)->entries; m_ind++) \ + { sRef m_el = (x)->elements[m_ind]; if (!(sRef_isExternal(m_el))) { +# define end_sRefSet_realElements }}}} + +/*@iter sRefSet_elements (sef sRefSet s, yield exposed sRef el)@*/ +# define sRefSet_elements(s,m_el) sRefSet_allElements (s, m_el) +# define end_sRefSet_elements end_sRefSet_allElements + +/*@iter sRefSet_allElements (sef sRefSet s, yield exposed sRef el)@*/ +# define sRefSet_allElements(x, m_el) \ + { int m_ind; if (sRefSet_isDefined (x)) { \ + for (m_ind = 0 ; m_ind < (x)->entries; m_ind++) \ + { sRef m_el = (x)->elements[m_ind]; + +# define end_sRefSet_allElements }}} + +/*@constant int sRefSetBASESIZE;@*/ +# define sRefSetBASESIZE SMALLBASESIZE + +/*@constant null sRefSet sRefSet_undefined;@*/ +# define sRefSet_undefined ((sRefSet) 0) + +extern /*@truenull@*/ bool sRefSet_isUndefined (sRefSet p_s) /*@*/ ; +extern /*@truenull@*/ bool sRefSet_isEmpty (/*@sef@*/ sRefSet p_s) /*@*/ ; +extern /*@falsenull@*/ bool sRefSet_isDefined (sRefSet p_s) /*@*/ ; + +# define sRefSet_isUndefined(s) ((s) == sRefSet_undefined) +# define sRefSet_isDefined(s) ((s) != sRefSet_undefined) + +# define sRefSet_isEmpty(s) \ + ((s) == sRefSet_undefined || ((s)->entries == 0)) + +extern bool sRefSet_equal (sRefSet p_s1, sRefSet p_s2) /*@*/ ; +extern bool sRefSet_hasRealElement (sRefSet p_s) /*@*/ ; +extern bool sRefSet_hasUnconstrained (sRefSet p_s) /*@*/ ; +extern cstring sRefSet_unparsePlain (sRefSet p_s) /*@*/ ; +extern cstring sRefSet_unparseUnconstrained (sRefSet p_s) /*@*/ ; +extern cstring sRefSet_unparseUnconstrainedPlain (sRefSet p_s) /*@*/ ; +extern void sRefSet_fixSrefs (sRefSet p_s); +extern bool sRefSet_delete (sRefSet p_s, sRef p_el); +extern /*@exposed@*/ sRef sRefSet_lookupMember (sRefSet p_s, sRef p_el); +extern bool sRefSet_isSameMember (sRefSet p_s, sRef p_el) /*@*/ ; +extern bool sRefSet_isSameNameMember (sRefSet p_s, sRef p_el) /*@*/ ; +extern /*@only@*/ sRefSet sRefSet_newCopy (/*@exposed@*/ /*@temp@*/ sRefSet p_s); +extern /*@only@*/ sRefSet sRefSet_newDeepCopy (sRefSet p_s); +extern int sRefSet_size(sRefSet p_s) /*@*/ ; +extern sRefSet sRefSet_union (/*@returned@*/ sRefSet p_s1, /*@exposed@*/ sRefSet p_s2); +extern sRefSet sRefSet_unionFree (/*@returned@*/ sRefSet p_s1, /*@only@*/ sRefSet p_s2); +extern /*@only@*/ sRefSet sRefSet_new (void) /*@*/ ; +extern /*@only@*/ sRefSet sRefSet_single (/*@exposed@*/ sRef); +extern sRefSet sRefSet_insert (/*@returned@*/ sRefSet p_s, /*@exposed@*/ sRef p_el); +extern bool sRefSet_member (sRefSet p_s, sRef p_el) /*@*/ ; +extern /*@only@*/ cstring sRefSet_unparse (sRefSet p_s) /*@*/ ; +extern void sRefSet_free (/*@only@*/ sRefSet p_s) /*@modifies p_s@*/; +extern void sRefSet_clear (sRefSet p_s) /*@modifies p_s@*/; +extern /*@only@*/ sRefSet sRefSet_addIndirection (sRefSet p_s) /*@*/ ; +extern /*@only@*/ sRefSet sRefSet_removeIndirection (sRefSet p_s) /*@*/ ; +extern sRefSet + sRefSet_copy (/*@returned@*/ sRefSet p_s1, /*@exposed@*/ sRefSet p_s2) + /*@modifies p_s1@*/ ; +extern void sRefSet_levelPrune (sRefSet p_s, int p_lexlevel) + /*@modifies p_s@*/ ; +extern void sRefSet_clearStatics (sRefSet p_s) + /*@modifies p_s@*/ ; +extern sRefSet sRefSet_levelUnion (/*@returned@*/ sRefSet p_sr, sRefSet p_s, int p_lexlevel); +extern /*@only@*/ sRefSet sRefSet_intersect (sRefSet p_s1, sRefSet p_s2); +extern /*@only@*/ sRefSet sRefSet_fetchKnown (sRefSet p_s, int p_i); +extern /*@only@*/ sRefSet sRefSet_fetchUnknown (sRefSet p_s); +extern /*@only@*/ sRefSet sRefSet_accessField (sRefSet p_s, /*@observer@*/ cstring p_f); +extern /*@only@*/ sRefSet sRefSet_realNewUnion (sRefSet p_s1, sRefSet p_s2); +extern /*@only@*/ cstring sRefSet_unparseDebug (sRefSet p_s) /*@*/ ; +extern /*@unused@*/ cstring sRefSet_unparseFull (sRefSet p_s) /*@*/ ; +# define sRefSet_unparseFull(s) sRefSet_unparseDebug(s) +extern int sRefSet_compare (sRefSet p_s1, sRefSet p_s2) /*@*/ ; +extern bool sRefSet_modifyMember (sRefSet p_s, sRef p_m) /*@modifies p_m@*/ ; +extern /*@only@*/ sRefSet sRefSet_undump (char **p_s) /*@modifies *p_s@*/ ; +extern /*@only@*/ cstring sRefSet_dump (sRefSet p_sl) /*@*/ ; +extern bool sRefSet_deleteBase (sRefSet p_s, sRef p_base) /*@modifies p_s@*/ ; +extern /*@exposed@*/ sRef sRefSet_choose (sRefSet p_s) /*@*/ ; +extern sRef sRefSet_mergeIntoOne (sRefSet p_s) /*@*/ ; +extern /*@only@*/ sRefSet + sRefSet_levelCopy (/*@exposed@*/ sRefSet p_s, int p_lexlevel) /*@*/ ; +extern sRefSet + sRefSet_unionExcept (/*@returned@*/ sRefSet p_s1, sRefSet p_s2, sRef p_ex) + /*@modifies p_s1@*/ ; + +extern bool sRefSet_hasStatic (sRefSet p_s) /*@*/ ; + +# else +# error "Multiple include" +# endif + + + diff --git a/src/Headers/sRefSetList.h b/src/Headers/sRefSetList.h new file mode 100644 index 0000000..018e8e5 --- /dev/null +++ b/src/Headers/sRefSetList.h @@ -0,0 +1,52 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +# ifndef sRefSetLIST_H +# define sRefSetLIST_H + +typedef /*@dependent@*/ sRefSet d_sRefSet; + +abst_typedef /*@null@*/ struct _sRefSetList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ d_sRefSet *elements; +} *sRefSetList ; + +/*@iter sRefSetList_elements (sef sRefSetList x, yield exposed sRefSet el); @*/ +# define sRefSetList_elements(x, m_el) \ + { if (sRefSetList_isDefined (x)) { \ + int m_ind; sRefSet *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { sRefSet m_el = *(m_elements++); + +# define end_sRefSetList_elements }}} + +/*@constant null sRefSetList sRefSetList_undefined; @*/ +# define sRefSetList_undefined ((sRefSetList) NULL) + +extern /*@falsenull@*/ bool sRefSetList_isDefined (sRefSetList p_s); +# define sRefSetList_isDefined(s) ((s) != sRefSetList_undefined) + +extern /*@unused@*/ /*@truenull@*/ bool sRefSetList_isUndefined (sRefSetList p_s); +# define sRefSetList_isUndefined(s) ((s) == sRefSetList_undefined) + +extern sRefSetList + sRefSetList_add (/*@returned@*/ sRefSetList p_s, /*@exposed@*/ sRefSet p_el) + /*@modifies p_s@*/ ; + +extern void sRefSetList_free (/*@only@*/ sRefSetList p_s); +extern void sRefSetList_clear (sRefSetList p_s); + +/*@constant int sRefSetListBASESIZE;@*/ +# define sRefSetListBASESIZE MIDBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/sRefSetStack.h b/src/Headers/sRefSetStack.h new file mode 100644 index 0000000..4a18b66 --- /dev/null +++ b/src/Headers/sRefSetStack.h @@ -0,0 +1,51 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** sRefSetStack.h +*/ + +# ifndef sRefSetStack_H +# define sRefSetStack_H + +typedef struct _sRefSetStack *sRefSetStack ; + +typedef struct _sRefSetStack +{ + sRefSet elements; + sRefSet allElements; + sRefSetStack thisbranch; + sRefSetStack lastbranch; + sRefSetStack parent; + int lexlevel; +} _sRefSetStack ; + +extern sRefSetStack sRefSetStack_new(void); + +extern void sRefSetStack_push (sRefSetStack s, sRef el) ; +extern sRefSetStack sRefSetStack_pop (sRefSetStack s) ; +extern sRefSet sRefSetStack_top (sRefSetStack s) ; + +extern cstring sRefSetStack_unparse (sRefSetStack s) ; +extern void sRefSetStack_free (/*@only@*/ sRefSetStack s) ; +extern sRefSetStack sRefSetStack_init (void); + +extern sRefSetStack sRefSetStack_branch (sRefSetStack s); +extern sRefSetStack sRefSetStack_trueBranch (sRefSetStack s); +extern sRefSetStack sRefSetStack_altBranch (sRefSetStack s); +extern sRefSetStack sRefSetStack_popBranches (sRefSetStack alt); +extern sRefSetStack sRefSetStack_popTrueBranch (sRefSetStack s); + +# define sRefSetStackBASESIZE MIDBASESIZE +# define sRefSetStackNULL ((sRefSetStack)0) +# define sRefSetStack_undefined (sRefSetStackNULL) + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/sRefTable.h b/src/Headers/sRefTable.h new file mode 100644 index 0000000..43beeb2 --- /dev/null +++ b/src/Headers/sRefTable.h @@ -0,0 +1,53 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** sRefTable.h +** +** based on sRefSet.h +*/ + +# ifndef sRefTABLE_H +# define sRefTABLE_H + +typedef /*@owned@*/ sRef ow_sRef; + +abst_typedef /*@null@*/ struct _sRefTable +{ + int entries; + int nspace; + /*@reldef@*/ /*@relnull@*/ ow_sRef *elements; +} *sRefTable; + +/*@constant int sRefTableBASESIZE; @*/ +# define sRefTableBASESIZE HUGEBASESIZE + +/*@constant null sRefTable sRefTable_undefined; @*/ +# define sRefTable_undefined ((sRefTable) NULL) + +extern /*@truenull@*/ bool sRefTable_isNull (sRefTable p_s) /*@*/ ; +extern /*@truenull@*/ bool sRefTable_isEmpty (/*@sef@*/ sRefTable p_s) /*@*/ ; +extern /*@unused@*/ /*@falsenull@*/ bool + sRefTable_isDefined (sRefTable p_s) /*@*/ ; + +# define sRefTable_isNull(s) ((s) == sRefTable_undefined) +# define sRefTable_isDefined(s) ((!sRefTable_isNull(s))) + +# define sRefTable_isEmpty(s) ((s) == sRefTable_undefined || ((s)->entries == 0)) + +extern /*@unused@*/ /*@only@*/ cstring sRefTable_unparse (sRefTable p_s) /*@*/ ; +extern void sRefTable_free (/*@only@*/ sRefTable p_s) /*@modifies p_s@*/; +extern void sRefTable_clear (sRefTable p_s) /*@modifies p_s@*/ ; +extern sRefTable + sRefTable_add (/*@returned@*/ sRefTable p_s, + /*@special@*/ /*@owned@*/ sRef p_el) + /*@modifies p_s@*/ ; + +# else +# error "Multiple include" +# endif + + + diff --git a/src/Headers/scan.h b/src/Headers/scan.h new file mode 100644 index 0000000..483e1fb --- /dev/null +++ b/src/Headers/scan.h @@ -0,0 +1,25 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** scan.h +*/ + +/*@-redecl@*/ /*@-type@*/ /*@-incondefs@*/ +extern unsigned int lsllex (YYSTYPE *p_lval); +/*@=redecl@*/ /*@=type@*/ /*@=incondefs@*/ + +extern ltoken LSLScanNextToken(void) /*@modifies internalState@*/ ; +extern void LSLScanFreshToken(ltoken p_tok) /*@modifies internalState@*/ ; +extern /*@exposed@*/ tsource *LSLScanSource (void) /*@*/ ; +extern void LSLScanInit (void) /*@modifies internalState@*/ ; +extern void LSLScanReset (tsource *p_s) /*@modifies internalState@*/ ; +extern void LSLScanCleanup (void) /*@modifies internalState@*/ ; + + + + + + diff --git a/src/Headers/scanline.h b/src/Headers/scanline.h new file mode 100644 index 0000000..20b950e --- /dev/null +++ b/src/Headers/scanline.h @@ -0,0 +1,58 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** scanline.h +*/ + +# ifndef SCANLINE_H +# define SCANLINE_H + +/*@constant int LASTCHAR; @*/ +# define LASTCHAR 255 + +/*@constant char CHAREXTENDER; @*/ +# define CHAREXTENDER '\\' + +typedef enum { + CHC_NULL, + IDCHAR, + OPCHAR, + SLASHCHAR, + WHITECHAR, + CHC_EXTENSION, + SINGLECHAR, + PERMCHAR +} charCode; + +typedef struct { + charCode code; + bool endCommentChar; +} charClassData; + +extern void lscanLine (char *); +extern ltoken LSLScanEofToken (void); +extern void LSLReportEolTokens (bool p_setting); + +extern void lscanLineInit (void); +extern void lscanLineReset (void); +extern void lscanLineCleanup (void); + +/* +** The following function prototypes are for use by lslinit.c, which +** customizes subsequent actions of scanline.c. +*/ + +extern charCode lscanCharClass (char p_c); +extern bool LSLIsEndComment (char p_c); +extern void lsetCharClass (char p_c, charCode p_cod); +extern void lsetEndCommentChar (char p_c, bool p_flag); + +/*@constant int MAXLINE;@*/ +# define MAXLINE 1000 + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/sgrammar.h b/src/Headers/sgrammar.h new file mode 100644 index 0000000..921f4cf --- /dev/null +++ b/src/Headers/sgrammar.h @@ -0,0 +1,39 @@ +/* +** Copyright (c) Massachusetts Institute of Technology 1994-1998. +** All Rights Reserved. +** Unpublished rights reserved under the copyright laws of +** the United States. +** +** THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED +** OR IMPLIED. ANY USE IS AT YOUR OWN RISK. +** +** This code is distributed freely and may be used freely under the +** following conditions: +** +** 1. This notice may not be removed or altered. +** +** 2. Works derived from this code are not distributed for +** commercial gain without explicit permission from MIT +** (for permission contact lclint-request@sds.lcs.mit.edu). +*/ +/* +** sgrammar.h +*/ + +extern bool g_expectingTypeName ; +extern /*@dependent@*/ /*@observer@*/ uentry coerceId(ctype p_c); +extern /*@observer@*/ uentry coerceIterId(ctype p_c); +extern /*@observer@*/ cstring LastIdentifier(void); + +/* #ifndef NCGRAM2 +** # include "cgrammar_tokens.h" +** #endif +*/ + + + + + + + + diff --git a/src/Headers/sgrammar_tokens.h b/src/Headers/sgrammar_tokens.h new file mode 100644 index 0000000..2f4f7ea --- /dev/null +++ b/src/Headers/sgrammar_tokens.h @@ -0,0 +1,290 @@ +/* +** Inserted at beginning of c files generated by bison +** REMEMBER: Change bison.reset too. +*/ + +/*@-allmacros@*/ +/*@+boolint@*/ +/*@+charint@*/ +/*@-macroparams@*/ +/*@-macroundef@*/ +/*@-unreachable@*/ +/*@-macrospec@*/ +/*@-varuse@*/ +/*@+ignorequals@*/ +/*@-macrostmt@*/ +/*@-noeffect@*/ +/*@-shadow@*/ +/*@-exitarg@*/ +/*@-macroredef@*/ +/*@-uniondef@*/ +/*@-compdef@*/ +/*@-matchfields@*/ +/*@-exportlocal@*/ +/*@-evalorderuncon@*/ +/*@-exportheader@*/ +/*@-typeuse@*/ +/*@-redecl@*/ +/*@-redef@*/ +/*@-noparams@*/ +/*@-ansireserved@*/ +/*@-fielduse@*/ +/*@-ifblock@*/ +/*@-elseifcomplete@*/ +/*@-whileblock@*/ +/*@-forblock@*/ +/*@-branchstate@*/ +/*@-readonlytrans@*/ +/*@-namechecks@*/ +/*@-usedef@*/ +/*@-systemunrecog@*/ +/*@-dependenttrans@*/ +/*@-unqualifiedtrans@*/ +/*@-nullassign@*/ + +/* < end of bison.head > */ + +typedef union +{ + lltok tok; + int count; + specialClauseKind sck; + qual typequal; + qualList tquallist; + ctype ctyp; + sRef sr; + /*@only@*/ qtype qtyp; + /*@only@*/ cstring cname; + /*@only@*/ idDecl ntyp; + /*@only@*/ idDeclList ntyplist; + /*@only@*/ uentryList flist; + /*@owned@*/ uentryList entrylist; + /*@observer@*/ /*@dependent@*/ uentry entry; + /*@only@*/ uentry oentry; + /*@only@*/ exprNode expr; + /*@only@*/ enumNameList enumnamelist; + /*@only@*/ exprNodeList alist; + /*@only@*/ sRefSet srset; +} YYSTYPE; +#define BADTOK 258 +#define SKIPTOK 259 +#define CTOK_ELIPSIS 260 +#define CASE 261 +#define DEFAULT 262 +#define CIF 263 +#define CELSE 264 +#define SWITCH 265 +#define WHILE 266 +#define DO 267 +#define CFOR 268 +#define GOTO 269 +#define CONTINUE 270 +#define BREAK 271 +#define RETURN 272 +#define TSEMI 273 +#define TLBRACE 274 +#define TRBRACE 275 +#define TCOMMA 276 +#define TCOLON 277 +#define TASSIGN 278 +#define TLPAREN 279 +#define TRPAREN 280 +#define TLSQBR 281 +#define TRSQBR 282 +#define TDOT 283 +#define TAMPERSAND 284 +#define TEXCL 285 +#define TTILDE 286 +#define TMINUS 287 +#define TPLUS 288 +#define TMULT 289 +#define TDIV 290 +#define TPERCENT 291 +#define TLT 292 +#define TGT 293 +#define TCIRC 294 +#define TBAR 295 +#define TQUEST 296 +#define CSIZEOF 297 +#define ARROW_OP 298 +#define CTYPEDEF 299 +#define COFFSETOF 300 +#define INC_OP 301 +#define DEC_OP 302 +#define LEFT_OP 303 +#define RIGHT_OP 304 +#define LE_OP 305 +#define GE_OP 306 +#define EQ_OP 307 +#define NE_OP 308 +#define AND_OP 309 +#define OR_OP 310 +#define MUL_ASSIGN 311 +#define DIV_ASSIGN 312 +#define MOD_ASSIGN 313 +#define ADD_ASSIGN 314 +#define SUB_ASSIGN 315 +#define LEFT_ASSIGN 316 +#define RIGHT_ASSIGN 317 +#define AND_ASSIGN 318 +#define XOR_ASSIGN 319 +#define OR_ASSIGN 320 +#define CSTRUCT 321 +#define CUNION 322 +#define CENUM 323 +#define VA_ARG 324 +#define VA_DCL 325 +#define QGLOBALS 326 +#define QMODIFIES 327 +#define QNOMODS 328 +#define QCONSTANT 329 +#define QITER 330 +#define QDEFINES 331 +#define QUSES 332 +#define QALLOCATES 333 +#define QSETS 334 +#define QRELEASES 335 +#define QPRECLAUSE 336 +#define QPOSTCLAUSE 337 +#define QALT 338 +#define QUNDEF 339 +#define QKILLED 340 +#define QENDMACRO 341 +#define LLMACRO 342 +#define LLMACROITER 343 +#define LLMACROEND 344 +#define TENDMACRO 345 +#define QSWITCHBREAK 346 +#define QLOOPBREAK 347 +#define QINNERBREAK 348 +#define QSAFEBREAK 349 +#define QINNERCONTINUE 350 +#define QFALLTHROUGH 351 +#define QLINTNOTREACHED 352 +#define QLINTFALLTHROUGH 353 +#define QLINTFALLTHRU 354 +#define QARGSUSED 355 +#define QPRINTFLIKE 356 +#define QLINTPRINTFLIKE 357 +#define QSCANFLIKE 358 +#define QMESSAGELIKE 359 +#define QNOTREACHED 360 +#define QCONST 361 +#define QVOLATILE 362 +#define QINLINE 363 +#define QEXTENSION 364 +#define QEXTERN 365 +#define QSTATIC 366 +#define QAUTO 367 +#define QREGISTER 368 +#define QOUT 369 +#define QIN 370 +#define QYIELD 371 +#define QONLY 372 +#define QTEMP 373 +#define QSHARED 374 +#define QREF 375 +#define QUNIQUE 376 +#define QCHECKED 377 +#define QUNCHECKED 378 +#define QCHECKEDSTRICT 379 +#define QCHECKMOD 380 +#define QKEEP 381 +#define QKEPT 382 +#define QPARTIAL 383 +#define QSPECIAL 384 +#define QOWNED 385 +#define QDEPENDENT 386 +#define QRETURNED 387 +#define QEXPOSED 388 +#define QNULL 389 +#define QOBSERVER 390 +#define QISNULL 391 +#define QEXITS 392 +#define QMAYEXIT 393 +#define QNEVEREXIT 394 +#define QTRUEEXIT 395 +#define QFALSEEXIT 396 +#define QLONG 397 +#define QSIGNED 398 +#define QUNSIGNED 399 +#define QSHORT 400 +#define QUNUSED 401 +#define QSEF 402 +#define QNOTNULL 403 +#define QRELNULL 404 +#define QABSTRACT 405 +#define QCONCRETE 406 +#define QMUTABLE 407 +#define QIMMUTABLE 408 +#define QTRUENULL 409 +#define QFALSENULL 410 +#define QEXTERNAL 411 +#define QREFCOUNTED 412 +#define QREFS 413 +#define QNEWREF 414 +#define QTEMPREF 415 +#define QKILLREF 416 +#define QRELDEF 417 +#define CGCHAR 418 +#define CBOOL 419 +#define CINT 420 +#define CGFLOAT 421 +#define CDOUBLE 422 +#define CVOID 423 +#define QANYTYPE 424 +#define QINTEGRALTYPE 425 +#define QUNSIGNEDINTEGRALTYPE 426 +#define QSIGNEDINTEGRALTYPE 427 +#define IDENTIFIER 428 +#define NEW_IDENTIFIER 429 +#define CCONSTANT 430 +#define ITER_NAME 431 +#define ITER_ENDNAME 432 +#define TYPE_NAME 433 +#define TYPE_NAME_OR_ID 434 + + +extern YYSTYPE yylval; +/* +** Resets all flags in bison.head +*/ + + +/*@=allmacros@*/ +/*@=boolint@*/ +/*@=charint@*/ +/*@=macroparams@*/ +/*@=macroundef@*/ +/*@=unreachable@*/ +/*@=macrospec@*/ +/*@=varuse@*/ +/*@=ignorequals@*/ +/*@=macrostmt@*/ +/*@=noeffect@*/ +/*@=shadow@*/ +/*@=exitarg@*/ +/*@=macroredef@*/ +/*@=uniondef@*/ +/*@=compdef@*/ +/*@=matchfields@*/ +/*@=exportlocal@*/ +/*@=evalorderuncon@*/ +/*@=exportheader@*/ +/*@=typeuse@*/ +/*@=redecl@*/ +/*@=redef@*/ +/*@=noparams@*/ +/*@=ansireserved@*/ +/*@=fielduse@*/ +/*@=ifblock@*/ +/*@=elseifcomplete@*/ +/*@=whileblock@*/ +/*@=forblock@*/ +/*@=branchstate@*/ +/*@=readonlytrans@*/ +/*@=namechecks@*/ +/*@=usedef@*/ +/*@=systemunrecog@*/ +/*@=dependenttrans@*/ +/*@=unqualifiedtrans@*/ diff --git a/src/Headers/shift.h b/src/Headers/shift.h new file mode 100644 index 0000000..f58bf22 --- /dev/null +++ b/src/Headers/shift.h @@ -0,0 +1,15 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** shift.h +*/ + +extern void LSLGenShift (ltoken p_tok); +extern void LSLGenShiftOnly (/*@only@*/ ltoken p_tok); + +extern /*@only@*/ ltoken LSLGenTopPopShiftStack(void); + +extern void LSLGenInit(bool p_LSLParse); diff --git a/src/Headers/sigNode.h b/src/Headers/sigNode.h new file mode 100644 index 0000000..166a5e7 --- /dev/null +++ b/src/Headers/sigNode.h @@ -0,0 +1,18 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +typedef struct _sigNode { + ltoken tok; + ltokenList domain; + ltoken range; + unsigned int key; +} *sigNode; + +extern /*@only@*/ cstring sigNode_unparse (/*@null@*/ sigNode p_n) /*@*/ ; +extern void sigNode_free (/*@only@*/ /*@null@*/ sigNode p_x); +extern /*@only@*/ sigNode sigNode_copy (sigNode p_s) /*@*/ ; +extern void sigNode_markOwned (/*@owned@*/ sigNode p_n); + diff --git a/src/Headers/sigNodeSet.h b/src/Headers/sigNodeSet.h new file mode 100644 index 0000000..08fe060 --- /dev/null +++ b/src/Headers/sigNodeSet.h @@ -0,0 +1,64 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** sigNodeSet.h +** +** based on set_template.h +*/ + +# ifndef SIGNODESET_H +# define SIGNODESET_H + +typedef /*@owned@*/ sigNode o_sigNode; + +abst_typedef /*@null@*/ struct _sigNodeSet +{ + int entries; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_sigNode *elements; +} *sigNodeSet ; + +/*@iter sigNodeSet_elements (sef sigNodeSet s, yield exposed sigNode el); @*/ +# define sigNodeSet_elements(x, m_el) \ + { if (sigNodeSet_isDefined (x)) { \ + int m_ind; \ + for (m_ind = 0 ; m_ind < (x)->entries; m_ind++) \ + { sigNode m_el = (x)->elements[m_ind]; + +# define end_sigNodeSet_elements }}} + +/*@constant null sigNodeSet sigNodeSet_undefined; @*/ +# define sigNodeSet_undefined ((sigNodeSet) 0) + +extern /*@falsenull@*/ bool sigNodeSet_isDefined (sigNodeSet p_s) /*@*/ ; +# define sigNodeSet_isDefined(s) \ + ((s) != sigNodeSet_undefined) + +extern /*@truenull@*/ bool sigNodeSet_isUndefined (sigNodeSet p_s) /*@*/ ; +# define sigNodeSet_isUndefined(s) \ + ((s) == sigNodeSet_undefined) + +extern bool sigNodeSet_isEmpty (/*@sef@*/ sigNodeSet p_s) /*@*/ ; +# define sigNodeSet_isEmpty(s) \ + (sigNodeSet_isUndefined(s) || (s)->entries == 0) + +extern int sigNodeSet_size (/*@sef@*/ sigNodeSet p_s) /*@*/ ; +# define sigNodeSet_size(s) (sigNodeSet_isDefined (s) ? (s)->entries : 0) + +extern /*@only@*/ sigNodeSet sigNodeSet_new(void) /*@*/ ; +extern /*@only@*/ sigNodeSet sigNodeSet_singleton (/*@owned@*/ sigNode p_el) /*@*/ ; +extern bool sigNodeSet_insert (sigNodeSet p_s, /*@owned@*/ sigNode p_el) /*@modifies p_s@*/ ; +extern /*@only@*/ cstring sigNodeSet_unparse (sigNodeSet p_s) /*@*/ ; +extern /*@only@*/ cstring sigNodeSet_unparsePossibleAritys (sigNodeSet p_s) /*@*/ ; +extern void sigNodeSet_free (/*@only@*/ sigNodeSet p_s); +extern /*@only@*/ cstring sigNodeSet_unparseSomeSigs (sigNodeSet p_s) /*@*/ ; + +/*@constant int sigNodeSetBASESIZE;@*/ +# define sigNodeSetBASESIZE MIDBASESIZE + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/signNode.h b/src/Headers/signNode.h new file mode 100644 index 0000000..3814352 --- /dev/null +++ b/src/Headers/signNode.h @@ -0,0 +1,14 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +typedef struct _signNode { + ltoken tok; + sortList domain; + sort range; + unsigned int key; +} *signNode; + +extern /*@only@*/ cstring signNode_unparse (signNode p_sn) /*@*/ ; +extern void signNode_free (/*@only@*/ signNode p_sn); diff --git a/src/Headers/signature.h b/src/Headers/signature.h new file mode 100644 index 0000000..ce12aea --- /dev/null +++ b/src/Headers/signature.h @@ -0,0 +1,23 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** signature.h +*/ + +# ifndef SIGNATURE_H +# define SIGNATURE_H + +# include "code.h" + +# ifndef OSD_H +# include "osd.h" +# endif + +extern void PrintToken(ltoken p_tok); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/signature2.h b/src/Headers/signature2.h new file mode 100644 index 0000000..ff07304 --- /dev/null +++ b/src/Headers/signature2.h @@ -0,0 +1,8 @@ +# ifndef SIGNATURE2_H +# define SIGNATURE2_H + +# include "signature_gen.h" + +# else +# error "Multiple includes" +# endif diff --git a/src/Headers/signature_gen.h b/src/Headers/signature_gen.h new file mode 100644 index 0000000..6d4fda9 --- /dev/null +++ b/src/Headers/signature_gen.h @@ -0,0 +1,102 @@ +/* +** Inserted at beginning of c files generated by bison +** REMEMBER: Change bison.reset too. +*/ + +/*@-allmacros@*/ +/*@+boolint@*/ +/*@+charint@*/ +/*@-macroparams@*/ +/*@-macroundef@*/ +/*@-unreachable@*/ +/*@-macrospec@*/ +/*@-varuse@*/ +/*@+ignorequals@*/ +/*@-macrostmt@*/ +/*@-noeffect@*/ +/*@-shadow@*/ +/*@-exitarg@*/ +/*@-macroredef@*/ +/*@-uniondef@*/ +/*@-compdef@*/ +/*@-matchfields@*/ +/*@-exportlocal@*/ +/*@-evalorderuncon@*/ +/*@-exportheader@*/ +/*@-typeuse@*/ +/*@-redecl@*/ +/*@-redef@*/ +/*@-noparams@*/ +/*@-ansireserved@*/ +/*@-fielduse@*/ +/*@-ifblock@*/ +/*@-elseifcomplete@*/ +/*@-whileblock@*/ +/*@-forblock@*/ +/*@-branchstate@*/ +/*@-readonlytrans@*/ +/*@-namechecks@*/ +/*@-usedef@*/ +/*@-systemunrecog@*/ +/*@-dependenttrans@*/ +/*@-unqualifiedtrans@*/ +/*@-nullassign@*/ + +/* < end of bison.head > */ + +typedef union { + ltoken ltok; /* a leaf is also an ltoken */ + unsigned int count; + /*@only@*/ ltokenList ltokenList; + /*@only@*/ opFormNode opform; + /*@owned@*/ sigNode signature; + /*@only@*/ nameNode name; + /*@owned@*/ lslOp operator; + /*@only@*/ lslOpList operators; +} YYSTYPE; +#define LST_SIMPLEID 257 +#define LST_LOGICALOP 258 +#define LST_EQOP 259 +#define LST_SIMPLEOP 260 +#define LST_MAPSYM 261 +#define LST_FIELDMAPSYM 262 +#define LST_MARKERSYM 263 +#define LST_ifTOKEN 264 +#define LST_thenTOKEN 265 +#define LST_elseTOKEN 266 +#define LST_LBRACKET 267 +#define LST_RBRACKET 268 +#define LST_SELECTSYM 269 +#define LST_SEPSYM 270 +#define LST_OPENSYM 271 +#define LST_CLOSESYM 272 +#define LST_COLON 273 +#define LST_COMMA 274 +#define LST_EOL 275 +#define LST_COMMENTSYM 276 +#define LST_WHITESPACE 277 +#define LST_QUANTIFIERSYM 278 +#define LST_EQUATIONSYM 279 +#define LST_EQSEPSYM 280 +#define LST_COMPOSESYM 281 +#define LST_LPAR 282 +#define LST_RPAR 283 +#define LST_assertsTOKEN 284 +#define LST_assumesTOKEN 285 +#define LST_byTOKEN 286 +#define LST_convertsTOKEN 287 +#define LST_enumerationTOKEN 288 +#define LST_equationsTOKEN 289 +#define LST_exemptingTOKEN 290 +#define LST_forTOKEN 291 +#define LST_generatedTOKEN 292 +#define LST_impliesTOKEN 293 +#define LST_includesTOKEN 294 +#define LST_introducesTOKEN 295 +#define LST_ofTOKEN 296 +#define LST_partitionedTOKEN 297 +#define LST_traitTOKEN 298 +#define LST_tupleTOKEN 299 +#define LST_unionTOKEN 300 +#define LST_BADTOKEN 301 + diff --git a/src/Headers/sort.h b/src/Headers/sort.h new file mode 100644 index 0000000..a55ed35 --- /dev/null +++ b/src/Headers/sort.h @@ -0,0 +1,177 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** sort.h +*/ + +# ifndef sort_H +# define sort_H + +/*@constant observer char *BEGINSORTTABLE;@*/ +# define BEGINSORTTABLE "%LCLSortTable" + +/*@constant observer char *SORTTABLEEND;@*/ +# define SORTTABLEEND "%LCLSortTableEnd" + +typedef enum { + SRT_FIRST, + SRT_NONE, + SRT_HOF, + SRT_PRIM, + SRT_SYN, + SRT_PTR, + SRT_OBJ, + SRT_ARRAY, + SRT_VECTOR, + SRT_STRUCT, + SRT_TUPLE, + SRT_UNION, + SRT_UNIONVAL, + SRT_ENUM, + SRT_LAST +} sortKind; + +typedef struct _smemberInfo { + lsymbol name; + sort sort; + /*@reldef@*/ lsymbol sortname; /* useful for sort_imports (yuk!) */ + /*@null@*/ /*@dependent@*/ struct _smemberInfo *next; +} smemberInfo; + +/*@constant null smemberInfo *smemberInfo_undefined; @*/ +# define smemberInfo_undefined ((smemberInfo *)NULL) + +typedef struct _sortNode +{ + sortKind kind; + + /* Handle for this sort in the table of known sorts */ + sort handle; + + /* + ** if SRT_PRIM then name is gotten from LSL traits. + ** elseif SRT_SYN then it is derived from a user-given typdef name, add _. + ** elseif SRT_NONE then may contain "_error". + ** elseif keeps the name of this sort (unique) + */ + + lsymbol name; + + /* + ** if {STRUCT, UNION, ENUM} and name field is non-nil + ** then it is the tag name. Kept to make printing and + ** debugging easier, for now. + */ + + /*@reldef@*/ lsymbol tag; + /*@reldef@*/ bool realtag; + + /* + ** if SRT_SYN then keeps handle for synonym sort, + ** elseif {OBJ, PTR, ARRAY, VECTOR} then keeps the element sort. + ** elseif {TUPLE, UNIONVAL} then keeps the baseSort which is a + ** record or union sort. + */ + + sort baseSort; + + /* + ** Only for VECTOR sort, gives its array sort, + ** not used otherwise. + */ + + /*@reldef@*/ sort objSort; + + /* First member of struct, union, or enum */ + /*@null@*/ smemberInfo *members; + + bool export; /* TRUE if sort is exported by this spec */ + bool mutable; /* TRUE if sort represents a mutable sort */ + bool abstract; /* TRUE if sort represents an LCL abstract type */ + bool imported; /* TRUE if sort was imported */ +} sortNode; + +extern cstring sort_unparse (sort p_s) /*@*/ ; +extern /*@exposed@*/ cstring sort_unparseName (sort p_s) /*@*/ ; +extern sort sort_makeSort (ltoken p_t, lsymbol p_n) /*@*/ ; +extern sort sort_makeSyn (ltoken p_t, sort p_s, lsymbol p_n) /*@*/ ; +extern sort sort_makeFormal (sort p_insort) /*@*/ ; +extern sort sort_makeGlobal (sort p_insort) /*@*/ ; +extern sort sort_makePtr (ltoken p_t, sort p_baseSort) /*@*/ ; +extern sort sort_makePtrN (sort p_s, int p_pointers) /*@*/ ; +extern sort sort_makeVal (sort p_sor) /*@*/ ; +extern sort sort_makeObj (sort p_sor) /*@*/ ; + +extern void sort_destroyMod (void) /*@modifies internalState@*/ ; + +extern sort sort_makeArr (ltoken p_t, sort p_baseSort) /*@*/ ; +extern sort sort_makeVec (ltoken p_t, sort p_arraySort) /*@*/ ; +extern sort sort_makeMutable (ltoken p_t, lsymbol p_name) /*@*/ ; +extern sort sort_makeImmutable (ltoken p_t, lsymbol p_name) /*@*/ ; + +extern sort sort_makeStr (ltoken p_opttagid) /*@*/ ; +extern sort sort_makeUnion (ltoken p_opttagid) /*@*/ ; +extern sort sort_makeEnum (ltoken p_opttagid) /*@*/ ; + +extern bool + sort_updateStr (sort p_strSort, /*@null@*/ /*@only@*/ smemberInfo *p_info) + /*@modifies internalState@*/ ; +extern bool + sort_updateUnion (sort p_unionSort, /*@null@*/ /*@only@*/ smemberInfo *p_info) + /*@modifies internalState@*/ ; +extern bool + sort_updateEnum (sort p_enumSort, /*@null@*/ /*@only@*/ smemberInfo *p_info) + /*@modifies internalState@*/ ; + +extern sort sort_makeTuple (ltoken p_t, sort p_strSort) /*@modifies internalState@*/ ; +extern sort sort_makeUnionVal (ltoken p_t, sort p_unionSort) /*@modifies internalState@*/ ; + +extern lsymbol sort_getLsymbol (sort p_sor) /*@*/ ; +extern /*@observer@*/ char *sort_getName (sort p_s) /*@*/ ; +extern /*@observer@*/ sortNode sort_lookup (sort p_sor) /*@*/ ; +extern /*@observer@*/ sortNode sort_quietLookup (sort p_sor) /*@*/ ; +extern sort sort_lookupName (lsymbol p_name) /*@*/ ; +extern void sort_dump(FILE *p_f, bool p_lco) /*@modifies p_f@*/ ; +extern void sort_init(void) /*@modifies internalState@*/ ; + +extern bool sort_compatible(sort p_s1, sort p_s2) /*@*/ ; +extern bool sort_compatible_modulo_cstring(sort p_s1, sort p_s2) /*@*/ ; +extern sort sort_getUnderlying (sort p_s) /*@*/ ; +extern bool sort_mutable (sort p_s) /*@*/ ; +extern sort sort_makeNoSort(void) /*@modifies internalState@*/ ; + +extern sort sort_makeHOFSort(sort p_base) /*@*/ ; +extern bool sort_isHOFSortKind(sort p_s) /*@*/ ; +extern bool sort_isNoSort(sort p_s) /*@*/ ; +extern bool sort_isValidSort(sort p_s) /*@*/ ; +extern bool sort_setExporting (bool p_flag) /*@modifies internalState@*/ ; + +# define sort_isNoSort(s) ((s) == 0) +/* assume NOSORTHANDLE is #define to 0 in sort.c */ + +extern /*@unused@*/ void sort_printStats(void) /*@modifies g_msgstream@*/ ; + +extern bool sort_equal (sort *p_s1, sort *p_s2) /*@*/ ; +extern sort sort_fromLsymbol (lsymbol p_sortid) /*@modifies internalState@*/ ; + +extern void sort_import(tsource *p_imported, ltoken p_tok, mapping *p_map) + /*@modifies *p_imported, internalState@*/ ; + +/*@-namechecks@*/ +extern sort sort_bool; +extern sort sort_capBool; +extern sort sort_int; +extern sort sort_char; +extern sort sort_cstring; +extern sort sort_float; +extern sort sort_double; +/*@=namechecks@*/ + +# else +# error "Multiple include" +# endif + + diff --git a/src/Headers/sortList.h b/src/Headers/sortList.h new file mode 100644 index 0000000..79f4704 --- /dev/null +++ b/src/Headers/sortList.h @@ -0,0 +1,37 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ + +# ifndef SORTLIST_H +# define SORTLIST_H + +abst_typedef struct _sortList +{ + int nelements; + int nspace; + int current; + /*@reldef@*/ /*@relnull@*/ sort *elements; +} *sortList ; + +extern /*@only@*/ sortList sortList_new (void); +extern void sortList_addh (sortList p_s, sort p_el) ; + +extern void sortList_reset (sortList p_s) ; +extern void sortList_advance (sortList p_s) ; /* was "list_pointToNext" */ + +extern /*@only@*/ cstring sortList_unparse (sortList p_s) ; +extern void sortList_free (/*@only@*/ sortList p_s) ; + +extern sort sortList_current (sortList p_s) ; + +/*@constant int sortListBASESIZE;@*/ +# define sortListBASESIZE SMALLBASESIZE +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/sortSet.h b/src/Headers/sortSet.h new file mode 100644 index 0000000..bc040b9 --- /dev/null +++ b/src/Headers/sortSet.h @@ -0,0 +1,54 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +** +*/ +/* +** sortSet.h +** +** based on set_template.h +*/ + +# ifndef SORTSET_H +# define SORTSET_H + +abst_typedef /*@null@*/ struct _sortSet +{ + int entries; + int nspace; + /*@reldef@*/ /*@relnull@*/ sort *elements; +} *sortSet ; + +/*@iter sortSet_elements(sef sortSet s, yield sort el); @*/ +# define sortSet_elements(x, m_el) \ + if (sortSet_isDefined (x)) { int m_ind; \ + for (m_ind = 0 ; m_ind < (x)->entries; m_ind++) \ + { sort m_el = (x)->elements[m_ind]; + +# define end_sortSet_elements }} + +/*@constant null sortSet sortSet_undefined; @*/ +# define sortSet_undefined ((sortSet) NULL) +extern /*@falsenull@*/ bool sortSet_isDefined (sortSet p_s) /*@*/ ; +# define sortSet_isDefined(s) ((s) != sortSet_undefined) + +extern int sortSet_size (/*@sef@*/ sortSet p_s); +# define sortSet_size(s) (sortSet_isDefined (s) ? (s)->entries : 0) + +extern /*@only@*/ sortSet sortSet_new(void); +extern bool sortSet_insert (sortSet p_s, sort p_el); +extern bool sortSet_member (sortSet p_s, sort p_el); +extern /*@only@*/ cstring sortSet_unparse (sortSet p_s); +extern /*@only@*/ cstring sortSet_unparseClean (sortSet p_s); +extern /*@only@*/ cstring sortSet_unparseOr (sortSet p_s); +extern void sortSet_free (/*@only@*/ sortSet p_s); +extern sort sortSet_choose (sortSet p_s); +extern /*@only@*/ sortSet sortSet_copy (sortSet p_s); + +/*@constant int sortSetBASESIZE;@*/ +# define sortSetBASESIZE MIDBASESIZE + +# else +# error "Multiple include" +# endif + diff --git a/src/Headers/sortSetList.h b/src/Headers/sortSetList.h new file mode 100644 index 0000000..d9d081e --- /dev/null +++ b/src/Headers/sortSetList.h @@ -0,0 +1,51 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +# ifndef sortSetLIST_H +# define sortSetLIST_H + +typedef /*@dependent@*/ sortSet o_sortSet; + +abst_typedef struct _sortSetList +{ + int nelements; + int free; + int current; + /*@reldef@*/ /*@only@*/ /*@relnull@*/ o_sortSet *elements; +} *sortSetList ; + +/*@iter sortSetList_elements (sef sortSetList x, yield exposed sortSet el); @*/ +# define sortSetList_elements(x, m_el) \ + { int m_ind; sortSet *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { sortSet m_el = *(m_elements++); + +# define end_sortSetList_elements }} + +extern int sortSetList_size (sortSetList); + +# define sortSetList_size(s) ((s)->nelements) + +extern /*@only@*/ sortSetList sortSetList_new(void); +extern void sortSetList_addh (sortSetList p_s, /*@dependent@*/ /*@exposed@*/ sortSet p_el) ; + +extern void sortSetList_reset (sortSetList p_s) ; +extern void sortSetList_advance (sortSetList p_s) ; /* was "list_pointToNext" */ + +extern /*@unused@*/ /*@only@*/ cstring sortSetList_unparse (sortSetList p_s) ; +extern void sortSetList_free (/*@only@*/ sortSetList p_s) ; + +extern /*@observer@*/ sortSet sortSetList_head (sortSetList p_s) ; +extern /*@observer@*/ sortSet sortSetList_current (sortSetList p_s) ; + +/*@constant int sortSetListBASESIZE;@*/ +# define sortSetListBASESIZE (8) + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/source.h b/src/Headers/source.h new file mode 100644 index 0000000..d422db8 --- /dev/null +++ b/src/Headers/source.h @@ -0,0 +1,59 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +/* +** source.h +*/ + +# ifndef TSOURCE_H +# define TSOURCE_H + +/*@constant int STUBMAXRECORDSIZE; @*/ +# define STUBMAXRECORDSIZE 800 + +typedef struct { + char *name; + /*@dependent@*/ /*@null@*/ FILE *file; + char buffer[STUBMAXRECORDSIZE+1]; + unsigned int lineNo; + bool echo, fromString; + /*@owned@*/ /*@null@*/ char *stringSource; + /*@null@*/ /*@dependent@*/ char *stringSourceTail; +} tsource; /* renamed from "source" to avoid cc parse bug on lex.yy.c */ + +extern void tsource_free (/*@null@*/ /*@only@*/ tsource *p_s); +extern bool tsource_close (tsource *p_s) + /*@modifies *p_s, fileSystem@*/ ; +extern tsource * + tsource_create (/*@temp@*/ char *p_name, char *p_suffix, bool p_echo) /*@*/ ; +extern tsource *tsource_fromString (char *p_name, char *p_str) /*@*/ ; +extern /*@dependent@*/ /*@null@*/ char *tsource_nextLine(tsource *p_s) + /*@modifies *p_s@*/ ; +extern bool tsource_open (tsource *p_s) /*@modifies p_s, fileSystem@*/ ; +extern bool tsource_getPath (char *p_path, tsource *p_s) + /*@modifies *p_s@*/ ; + +# ifndef NOLCL +extern /*@observer@*/ char *tsource_fileName (tsource *p_s) /*@*/ ; +# define tsource_fileName(pS) ((pS)->name) + +extern bool tsource_isOpen (/*@sef@*/ tsource *p_s) /*@*/ ; +# define tsource_isOpen(pS) ((pS)->file != 0 || (pS)->fromString) + +extern unsigned int tsource_thisLineNumber(tsource *p_s) /*@*/ ; +# define tsource_thisLineNumber(pS) ((pS)->lineNo) + +extern char *specFullName (char *p_specfile, /*@out@*/ char **p_inpath) + /*@modifies *p_inpath@*/ ; + +# endif + +# else +# error "Multiple include" +# endif + + + + + diff --git a/src/Headers/specialClauses.h b/src/Headers/specialClauses.h new file mode 100644 index 0000000..3d38f8e --- /dev/null +++ b/src/Headers/specialClauses.h @@ -0,0 +1,160 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +/* +** specialClauses.h +*/ + +# ifndef SPECIALCLAUSES_H +# define SPECIALCLAUSES_H + +typedef enum +{ + SP_USES, + SP_DEFINES, + SP_ALLOCATES, + SP_RELEASES, + SP_SETS, + SP_ISNULL, + SP_ISNOTNULL, + SP_ISONLY, + SP_ISSHARED, + SP_ISDEPENDENT, + SP_ISOWNED, + SP_ISOBSERVER, + SP_ISEXPOSED +} specialClauseKind ; + +typedef enum +{ + TK_BEFORE, + TK_AFTER, + TK_BOTH +} stateConstraint; + +abst_typedef struct +{ + stateConstraint state; + specialClauseKind kind; + sRefSet refs; +} *specialClause ; + +typedef /*@only@*/ specialClause o_specialClause; + +extern /*@unused@*/ cstring specialClause_unparse (specialClause p_s) /*@*/ ; + +extern /*@null@*/ sRefMod + specialClause_getEffectFunction (specialClause p_cl) /*@*/ ; + +extern /*@null@*/ sRefMod + specialClause_getReturnEffectFunction (specialClause p_cl) /*@*/ ; + +extern /*@null@*/ sRefMod + specialClause_getEntryFunction (specialClause p_cl) /*@*/ ; + +extern bool specialClause_isBefore (specialClause p_cl) /*@*/ ; +extern bool specialClause_isAfter (specialClause p_cl) /*@*/ ; + +extern /*@observer@*/ sRefSet specialClause_getRefs (specialClause p_cl) /*@*/ ; +# define specialClause_getRefs(cl) ((cl)->refs) + +abst_typedef /*@null@*/ struct +{ + int nelements; + int nspace; + /*@relnull@*/ /*@reldef@*/ o_specialClause *elements; +} *specialClauses ; + +/*@iter specialClauses_elements (sef specialClauses x, yield exposed specialClause el); @*/ +# define specialClauses_elements(x, m_el) \ + { if (!specialClauses_isUndefined(x)) \ + { int m_ind; specialClause *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { specialClause m_el = *(m_elements++); + +# define end_specialClauses_elements }}} + +/*@iter specialClauses_preElements (sef specialClauses x, yield exposed specialClause el); @*/ +# define specialClauses_preElements(x, m_el) \ + { if (!specialClauses_isUndefined(x)) \ + { int m_ind; specialClause *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { specialClause m_el = *(m_elements++); if (specialClause_isBefore (m_el)) { \ + +# define end_specialClauses_preElements }}}} + +/*@iter specialClauses_postElements (sef specialClauses x, yield exposed specialClause el); @*/ +# define specialClauses_postElements(x, m_el) \ + { if (!specialClauses_isUndefined(x)) \ + { int m_ind; specialClause *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { specialClause m_el = *(m_elements++); if (specialClause_isAfter (m_el)) { \ + +# define end_specialClauses_postElements }}}} + +extern void specialClauses_checkAll (uentry p_ue) + /*@modifies p_ue, g_msgstream@*/ ; + +extern flagcode specialClause_preErrorCode (specialClause p_cl) /*@*/ ; +extern /*@observer@*/ cstring + specialClause_preErrorString (specialClause p_cl, sRef p_sr) /*@*/ ; + +extern flagcode specialClause_postErrorCode (specialClause p_cl) /*@*/ ; +extern /*@observer@*/ cstring + specialClause_postErrorString (specialClause p_cl, sRef p_sr) /*@*/ ; + +extern sRefTest specialClause_getPreTestFunction (specialClause p_cl) /*@*/ ; + +extern sRefTest specialClause_getPostTestFunction (specialClause p_cl) /*@*/ ; +extern sRefShower specialClause_getPostTestShower (specialClause p_cl) /*@*/ ; + +extern specialClause + specialClause_create (stateConstraint p_st, specialClauseKind p_k, /*@only@*/ sRefSet p_s) + /*@*/ ; + +extern specialClause specialClause_createDefines (/*@only@*/ sRefSet p_s) /*@*/ ; +extern specialClause specialClause_createUses (/*@only@*/ sRefSet p_s) /*@*/ ; +extern specialClause specialClause_createAllocates (/*@only@*/ sRefSet p_s) /*@*/ ; +extern specialClause specialClause_createReleases (/*@only@*/ sRefSet p_s) /*@*/ ; +extern specialClause specialClause_createSets (/*@only@*/ sRefSet p_s) /*@*/ ; + +/*@constant null specialClauses specialClauses_undefined@*/ +# define specialClauses_undefined ((specialClauses) 0) + +extern /*@falsenull@*/ bool specialClauses_isDefined (specialClauses p_s) /*@*/ ; +# define specialClauses_isDefined(s) ((s) != specialClauses_undefined) + +extern /*@truenull@*/ bool specialClauses_isUndefined (specialClauses p_s) /*@*/ ; +# define specialClauses_isUndefined(s) ((s) == specialClauses_undefined) + +extern /*@unused@*/ int + specialClauses_size (/*@sef@*/ specialClauses p_s) /*@*/ ; +# define specialClauses_size(s) (specialClauses_isDefined (s) ? (s)->nelements : 0) + +extern cstring specialClause_unparseKind (specialClause p_s) /*@*/ ; + +extern specialClauses + specialClauses_add (/*@returned@*/ specialClauses p_s, + /*@only@*/ specialClause p_el) + /*@modifies p_s@*/ ; + +extern /*@unused@*/ cstring specialClauses_unparse (specialClauses p_s) /*@*/ ; +extern void specialClauses_free (/*@only@*/ specialClauses p_s) ; + +extern /*@only@*/ specialClauses specialClauses_copy (specialClauses p_s) /*@*/ ; + +extern cstring specialClauses_dump (specialClauses p_s) /*@*/ ; +extern specialClauses specialClauses_undump (char **p_s) /*@modifies *p_s@*/ ; + +/*@constant int specialClausesBASESIZE;@*/ +# define specialClausesBASESIZE MIDBASESIZE + +extern void specialClauses_checkEqual (uentry p_old, uentry p_unew) + /*@modifies g_msgstream@*/ ; + +# else +# error "Multiple include" +# endif + + diff --git a/src/Headers/stDeclNode.h b/src/Headers/stDeclNode.h new file mode 100644 index 0000000..fa0371f --- /dev/null +++ b/src/Headers/stDeclNode.h @@ -0,0 +1,12 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +typedef struct _stDeclNode { + lclTypeSpecNode lcltypespec; + declaratorNodeList declarators; +} *stDeclNode; + +extern void stDeclNode_free (/*@only@*/ /*@null@*/ stDeclNode p_x); +extern stDeclNode stDeclNode_copy (stDeclNode p_x); diff --git a/src/Headers/stDeclNodeList.h b/src/Headers/stDeclNodeList.h new file mode 100644 index 0000000..551da99 --- /dev/null +++ b/src/Headers/stDeclNodeList.h @@ -0,0 +1,48 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +# ifndef STRUCTDECLNODELIST_H +# define STRUCTDECLNODELIST_H + +typedef /*@only@*/ stDeclNode o_stDeclNode; + +abst_typedef struct _stDeclNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_stDeclNode *elements; +} *stDeclNodeList ; + +/*@iter stDeclNodeList_elements (sef stDeclNodeList x, yield exposed stDeclNode el); @*/ +# define stDeclNodeList_elements(x, m_el) \ + { int m_ind; stDeclNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { stDeclNode m_el = *(m_elements++); + +# define end_stDeclNodeList_elements }} + +extern int stDeclNodeList_size (stDeclNodeList); + +# define stDeclNodeList_size(s) ((s)->nelements) + +extern /*@only@*/ stDeclNodeList stDeclNodeList_new(void); +extern stDeclNodeList + stDeclNodeList_add (/*@returned@*/ stDeclNodeList p_s, /*@only@*/ stDeclNode p_el); + +extern /*@only@*/ cstring stDeclNodeList_unparse (stDeclNodeList p_s) ; +extern void stDeclNodeList_free (/*@only@*/ stDeclNodeList p_s) ; + +extern /*@only@*/ stDeclNodeList stDeclNodeList_copy (stDeclNodeList p_s) ; + +/*@constant int stDeclNodeListBASESIZE;@*/ +# define stDeclNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/stmtNode.h b/src/Headers/stmtNode.h new file mode 100644 index 0000000..9220af5 --- /dev/null +++ b/src/Headers/stmtNode.h @@ -0,0 +1,12 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +typedef struct _stmtNode { + ltoken lhs; + ltoken operator; + termNodeList args; +} *stmtNode; + +extern /*@unused@*/ /*@notnull@*/ /*@only@*/ cstring stmtNode_unparse (stmtNode p_x); diff --git a/src/Headers/storeRefNode.h b/src/Headers/storeRefNode.h new file mode 100644 index 0000000..7d7152f --- /dev/null +++ b/src/Headers/storeRefNode.h @@ -0,0 +1,33 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +typedef enum { + SRN_TERM, SRN_TYPE, SRN_OBJ, SRN_SPECIAL + } storeRefNodeKind; + +typedef struct _storeRefNode { + storeRefNodeKind kind; + union { + struct _termNode *term; /* for SRN_TERM */ + lclTypeSpecNode type; /* for SRN_OBJ and SRN_TYPE */ + sRef ref; /* for SRN_SPECIAL */ + } content; +} *storeRefNode; + +extern storeRefNode storeRefNode_copy (storeRefNode p_x); + +extern bool storeRefNode_isTerm (storeRefNode p_x); +# define storeRefNode_isTerm(x) ((x)->kind == SRN_TERM) + +extern bool storeRefNode_isObj (storeRefNode p_x); +# define storeRefNode_isObj(x) ((x)->kind == SRN_OBJ) + +extern bool storeRefNode_isType (storeRefNode p_x); +# define storeRefNode_isType(x) ((x)->kind == SRN_TYPE) + +extern bool storeRefNode_isSpecial (storeRefNode p_x); +# define storeRefNode_isSpecial(x) ((x)->kind == SRN_SPECIAL) + +extern void storeRefNode_free (/*@only@*/ /*@null@*/ storeRefNode p_x); diff --git a/src/Headers/storeRefNodeList.h b/src/Headers/storeRefNodeList.h new file mode 100644 index 0000000..f45ea4c --- /dev/null +++ b/src/Headers/storeRefNodeList.h @@ -0,0 +1,42 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +# ifndef STOREREFNODELIST_H +# define STOREREFNODELIST_H + +typedef /*@only@*/ storeRefNode o_storeRefNode; + +abst_typedef struct _storeRefNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_storeRefNode *elements; +} *storeRefNodeList ; + +/*@iter storeRefNodeList_elements (sef storeRefNodeList x, yield exposed storeRefNode el); @*/ +# define storeRefNodeList_elements(x, m_el) \ + { int m_ind; storeRefNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { storeRefNode m_el = *(m_elements++); + +# define end_storeRefNodeList_elements }} + +extern /*@only@*/ storeRefNodeList storeRefNodeList_new(void); +extern storeRefNodeList + storeRefNodeList_add (/*@returned@*/ storeRefNodeList p_s, /*@only@*/ storeRefNode p_el); + +extern /*@only@*/ cstring storeRefNodeList_unparse (storeRefNodeList p_s) ; +extern void storeRefNodeList_free (/*@only@*/ storeRefNodeList p_s) ; + +extern /*@only@*/ storeRefNodeList storeRefNodeList_copy (storeRefNodeList p_s) ; +/*@constant int storeRefNodeListBASESIZE;@*/ +# define storeRefNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/strOrUnionNode.h b/src/Headers/strOrUnionNode.h new file mode 100644 index 0000000..90b3cd9 --- /dev/null +++ b/src/Headers/strOrUnionNode.h @@ -0,0 +1,17 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +typedef enum {SU_STRUCT, SU_UNION} suKind; + +typedef struct _strOrUnionNode { + suKind kind; + ltoken tok; /* also encodes if it's struct or union */ + ltoken opttagid; + sort sort; + /*@owned@*/ stDeclNodeList structdecls; +} *strOrUnionNode; + +extern /*@unused@*/ cstring + strOrUnionNode_unparse (/*@null@*/ strOrUnionNode p_n); diff --git a/src/Headers/structNames.h b/src/Headers/structNames.h new file mode 100644 index 0000000..43d4d4a --- /dev/null +++ b/src/Headers/structNames.h @@ -0,0 +1,18 @@ +# ifndef STRUCTNAMES +# define STRUCTNAMES + +extern /*@only@*/ cstring makeStruct(cstring p_s); +extern /*@only@*/ cstring makeUnion(cstring p_s); +extern /*@only@*/ cstring makeEnum(cstring p_s); +extern /*@only@*/ cstring makeParam (cstring p_s); + +extern void setTagNo (unsigned int p_n); +extern bool isFakeTag (cstring p_s); + +extern /*@only@*/ cstring fakeTag (void); +extern /*@only@*/ cstring fixTagName (cstring p_s); +extern /*@observer@*/ cstring fixParamName (cstring p_s); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/symtable.h b/src/Headers/symtable.h new file mode 100644 index 0000000..b6e6508 --- /dev/null +++ b/src/Headers/symtable.h @@ -0,0 +1,196 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +/* +** symtable.h +*/ + +# ifndef SYMTABLE_H +# define SYMTABLE_H + +/* There are 3 separate namespaces being maintained in this symbol +table: (N1) for C objects, functions, typedef names and enumeration +constants. (N2) for C tags. (N3) for LSL operators. I re-use the +old linked list to represent N1 since it is here and it is convenient +for representing scopes. Two more new hashtables are added to store +N2 and N3, each keyed on the lsymbol of the identifier. */ + +/*@constant observer char *BEGINSYMTABLE;@*/ +# define BEGINSYMTABLE "%LCLSymbolTable" + +/*@constant observer char *SYMTABLEEND;@*/ +# define SYMTABLEEND "%LCLSymbolTableEnd" + +typedef long unsigned symbolKey; + +typedef struct _fctInfo { + ltoken id; + bool export; /* all HOF maps to one sort kind: SRT_HOF */ + /*@only@*/ signNode signature; /* in terms of sorts, no HOF */ + /*@only@*/ pairNodeList globals; /* list of (sort globalnameSym) */ +} *fctInfo; + +typedef struct _typeInfo { + ltoken id; + sort basedOn; + bool abstract; /* TRUE means LCL abstract type */ + bool modifiable; /* TRUE indicates the abstract type is mutable */ + bool export; /* if TRUE, export it from this module */ +} *typeInfo; + +typedef enum +{ + VRK_CONST, /* an LCL constant */ + VRK_ENUM, /* an enumeration constant, + a special kind of LCL constant */ + VRK_VAR, /* an LCL variable */ + VRK_PRIVATE,/* a variable private to current function/module */ + /* function private overrides module private, usual scoping + rules */ + VRK_GLOBAL, /* in globals of a function */ + VRK_LET, /* local let variable in a function decl */ + VRK_PARAM, /* formal parameters of a function/claim */ + VRK_QUANT /* bound by a quantifier */ + } varKind; + +typedef struct _varInfo { + ltoken id; + sort sort; + varKind kind; + bool export; /* if TRUE, export it from this module */ +} *varInfo; + +/* The same lsymbol can originate from different files: + an LCL file or an LSL file. Each occurrence in an LCL file appears + as one of {opId, anyOp, logicalOp, simpleOp, eqOp, MULOP} ltoken. + Each occurrence in an LSL file appears as an lslOp AST. */ + +typedef struct _opInfo { + /*@only@*/ nameNode name; + /*@only@*/ sigNodeSet signatures; +} *opInfo; + +typedef struct _tagInfo { + ltoken id; + tagKind kind; + bool imported; + sort sort; + /*@reldef@*/ union + { + /*@null@*/ /*@dependent@*/ ltokenList enums; + /*@null@*/ stDeclNodeList decls; + } content; +} *tagInfo; + +typedef enum { + IK_SORT, IK_OP, IK_TAG + } infoKind; + +typedef struct { + infoKind kind; + union { + tagInfo tag; + sort sort; + opInfo op;} content; +} htData; + +typedef enum { + SPE_GLOBAL, SPE_FCN, SPE_QUANT, SPE_CLAIM, + SPE_ABSTRACT, SPE_INVALID + } scopeKind; + +typedef struct _scopeInfo { + scopeKind kind; +} *scopeInfo; + +/* +** A simple hash table implementation: Given a key K and a +** pointer P to a piece of data, associate K with P. +** +** Assumes that K is unsigned int, and data supports +** 3 operations: +** data_key: htData * -> unsigned int +*/ + +typedef struct _htEntry { + /*@only@*/ htData *data; + /*@only@*/ struct _htEntry *next; +} htEntry; + +/* Each bucket is a linked list of entries */ + +typedef htEntry bucket; +typedef /*@relnull@*/ /*@only@*/ bucket *o_bucket; + +typedef struct { + unsigned int count; + unsigned int size; + /*@relnull@*/ /*@only@*/ o_bucket *buckets; +} symHashTable; + +/* Local to implementation */ + +typedef struct _symtableStruct *symtable; + +extern /*@falsenull@*/ bool typeInfo_exists(/*@null@*/ typeInfo p_ti); +# define typeInfo_exists(ti) ((ti) != NULL) + +extern /*@falsenull@*/ bool varInfo_exists(/*@null@*/ varInfo p_vi); +# define varInfo_exists(vi) ((vi) != NULL) + +extern /*@falsenull@*/ bool tagInfo_exists(/*@null@*/ tagInfo p_oi); +# define tagInfo_exists(ti) ((ti) != NULL) + +extern /*@falsenull@*/ bool opInfo_exists(/*@null@*/ opInfo p_oi); +# define opInfo_exists(oi) ((oi) != NULL) + +extern /*@only@*/ symtable symtable_new (void) /*@*/ ; +extern void symtable_enterScope (symtable p_stable, /*@keep@*/ scopeInfo p_si); +extern void symtable_exitScope(symtable p_stable); + +extern bool symtable_enterFct (symtable p_stable, /*@only@*/ fctInfo p_fi); +extern void symtable_enterType (symtable p_stable, /*@only@*/ typeInfo p_ti); + +/* not only --- it is copied! */ +extern bool symtable_enterVar (symtable p_stable, /*@temp@*/ varInfo p_vi); +extern void symtable_enterOp (symtable p_st, + /*@only@*/ /*@notnull@*/ nameNode p_n, + /*@owned@*/ sigNode p_oi); +extern bool symtable_enterTag (symtable p_st, /*@only@*/ tagInfo p_ti); +extern bool symtable_enterTagForce(symtable p_st, /*@only@*/ tagInfo p_ti); + +extern bool symtable_exists(symtable p_stable, lsymbol p_i); + +extern /*@observer@*/ /*@null@*/ typeInfo symtable_typeInfo(symtable p_stable, lsymbol p_i); +extern /*@observer@*/ /*@null@*/ varInfo symtable_varInfo(symtable p_stable, lsymbol p_i); +extern /*@observer@*/ /*@null@*/ varInfo symtable_varInfoInScope(symtable p_stable, lsymbol p_id); +extern /*@observer@*/ /*@null@*/ opInfo symtable_opInfo(symtable p_st, + /*@notnull@*/ nameNode p_n); +extern /*@observer@*/ /*@null@*/ tagInfo symtable_tagInfo(symtable p_st, lsymbol p_i); + +extern void symtable_export(symtable p_stable, bool p_yesNo); +extern void symtable_dump(symtable p_stable, FILE *p_f, bool p_lco); + +extern void symtable_import(tsource *p_imported, ltoken p_tok, mapping *p_map); + +extern /*@unused@*/ void symtable_printStats (symtable p_s); + +extern lsymbol lsymbol_sortFromType (symtable, lsymbol); +extern cstring tagKind_unparse (tagKind p_k); +extern lsymbol lsymbol_translateSort (mapping *p_m, lsymbol p_s); +extern void varInfo_free (/*@only@*/ varInfo p_v); + +extern /*@only@*/ lslOpSet + symtable_opsWithLegalDomain (symtable p_tab, /*@temp@*/ /*@null@*/ nameNode p_n, + sortSetList p_argSorts, sort p_qual); +extern /*@observer@*/ sigNodeSet + symtable_possibleOps (symtable p_tab, nameNode p_n); +extern bool symtable_opExistsWithArity(symtable p_tab, nameNode p_n, int p_arity); + +extern void symtable_free (/*@only@*/ symtable p_stable); + +# else +# error "Multiple include" +# endif + diff --git a/src/Headers/syntable.h b/src/Headers/syntable.h new file mode 100644 index 0000000..a6bf754 --- /dev/null +++ b/src/Headers/syntable.h @@ -0,0 +1,15 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +/* +** syntable.h +*/ + +extern void LSLAddSyn(lsymbol, lsymbol) /*@modifies internalState@*/ ; +extern /*@exposed@*/ ltoken LSLGetTokenForSyn(lsymbol) + /*@globals internalState@*/ ; +extern bool LSLIsSyn(lsymbol) /*@globals internalState@*/ ; +extern void lsynTableInit (void) /*@modifies internalState@*/ ; +extern void lsynTableReset (void) /*@modifies internalState@*/ ; +extern void lsynTableCleanup (void) /*@modifies internalState@*/ ; diff --git a/src/Headers/system_constants.h b/src/Headers/system_constants.h new file mode 100644 index 0000000..05b58b8 --- /dev/null +++ b/src/Headers/system_constants.h @@ -0,0 +1,135 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +# ifndef SYSTEM_CONSTANTS_H +# define SYSTEM_CONSTANTS_H + +# ifndef NOLCL +# include "lcl_constants.h" +# endif + +/* exit codes */ + +/*@constant int LLSUCCESS; @*/ +# define LLSUCCESS EXIT_SUCCESS + +/*@constant int LLFAILURE; @*/ +# define LLFAILURE EXIT_FAILURE + +/*@constant int LLGIVEUP; @*/ +# define LLGIVEUP EXIT_FAILURE + +/*@constant int LLINTERRUPT; @*/ +# define LLINTERRUPT EXIT_FAILURE + +/*@constant int DEFAULTMAXMODS; @*/ +# define DEFAULTMAXMODS 32 + +/* +** number of parse errors before quiting +*/ + +/*@constant int GIVEUPPARSE; @*/ +# define GIVEUPPARSE 5 + +/* +** how many recursive searches to do before bailing! +*/ + +/*@constant int MAXDEPTH; @*/ +# define MAXDEPTH 10 + +/* +** This limits the number of recursive calls to aliasTable_canAliasAux. +** It is necessary in the presence on recursive nested data structures. +** Note that we don't want to simply detect recursion and quit, since +** aliasing may be apparent only at the deeper level. It would be better +** to do something in the alias table to confirm that there are no aliases +** recorded below a given depth, but in practice this is much easier! +*/ + +/*@constant int ALIASSEARCHLIMIT; @*/ +# define ALIASSEARCHLIMIT 8 + +/* +** This one's compilcated. You probably don't want to change +** it. +** +** lclint maintains a table of ctype's (its representation of +** C types) and represents types internally as an index into +** this table. This greatly improves performance of type +** checking and saves memory. For simple derived types, it +** is easy to find if the type is already in the table. For +** more complicated types (e.g., functions and structures), +** we check if a type is already in the table by looking +** backwards for matches. The last DEFAULT_OPTLEVEL types +** entered into the table are checked. Increasing this value +** may improve memory performance, but cost in execution time. +** +*/ + +/*@constant int DEFAULT_OPTLEVEL; @*/ +# define DEFAULT_OPTLEVEL 15 + +/* +** There are many *List and *Set types used by lclint (all +** generated automatically using a template and script). +** For each, the BASESIZE is the number of entries the +** structure grows by each time it runs out of space. +** Depending on expected usage, each List/Set defines +** its BASESIZE to one of these three values. +*/ + +/*@constant int SMALLBASESIZE; @*/ +# define SMALLBASESIZE 4 + +/*@constant int MIDBASESIZE; @*/ +# define MIDBASESIZE 8 + +/*@constant int LARGEBASESIZE; @*/ +# define LARGEBASESIZE 16 + +/*@constant int BIGBASESIZE; @*/ +# define BIGBASESIZE 256 + +/*@constant int HUGEBASESIZE; @*/ +# define HUGEBASESIZE 512 + +/* +** Size of hash table for file names. +*/ + +/*@constant int FTHASHSIZE; @*/ +# define FTHASHSIZE 273 + +/* +** BASESIZE for C environment frames. +*/ + +/*@constant int CBASESIZE; @*/ +# define CBASESIZE 4 + +/* +** The global environment (across files) is stored in +** a hash table. +*/ + +/*@constant int CGLOBBASESIZE; @*/ +# define CGLOBBASESIZE 1024 + +/*@constant int CGLOBHASHSIZE; @*/ +# define CGLOBHASHSIZE 1795 + +/*@constant int LLHASHSIZE; @*/ +# define LLHASHSIZE 1279 + +# else +# error "Multiple include" +# endif + + + + + + diff --git a/src/Headers/taggedUnionNode.h b/src/Headers/taggedUnionNode.h new file mode 100644 index 0000000..8e4ac34 --- /dev/null +++ b/src/Headers/taggedUnionNode.h @@ -0,0 +1,12 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +typedef struct _taggedUnionNode { + stDeclNodeList structdecls; + declaratorNode declarator; +} *taggedUnionNode; + +extern /*@unused@*/ /*@only@*/ cstring + taggedUnionNode_unparse (taggedUnionNode p_n) /*@*/ ; diff --git a/src/Headers/termNode.h b/src/Headers/termNode.h new file mode 100644 index 0000000..251ebb7 --- /dev/null +++ b/src/Headers/termNode.h @@ -0,0 +1,31 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +struct _termNode +{ + int wrapped; /* the number of matched parentheses around this term */ + termKIND kind; + sort sort; + /*@reldef@*/ sort given; /* if term has a given sort */ + sortSet possibleSorts; + bool error_reported; /* to prevent multiple sort checking error messages */ + lslOpSet possibleOps; /* only for TRM_ZEROARY and TRM_APPLICATION */ + /* should make a union but skip this for now */ + /*@null@*/ struct _nameNode *name; + termNodeList args; /* in order */ + /*@reldef@*/ ltoken literal; /* for TRM_LITERAL, TRM_UNCHANGEDALL, + TRM_SIZEOF, LCLvariableKIND, + TRM_CONST, TRM_ZEROARY */ + /*@reldef@*/ storeRefNodeList unchanged; /* only for TRM_UNCHANGEDOTHERS */ + /*@reldef@*/ quantifiedTermNode quantified; /* only for TRM_QUANTIFIER */ + /*@reldef@*/ lclTypeSpecNode sizeofField; /* only for TRM_SIZEOF */ +} ; + +extern /*@falsenull@*/ bool termNode_isDefined (/*@null@*/ termNode p_t) /*@*/ ; +# define termNode_isDefined(t) ((t) != NULL) + +extern termNode termNode_copySafe (termNode p_t) /*@*/ ; +extern cstring termNode_unparse (/*@null@*/ termNode p_n) /*@*/ ; +extern void termNode_free (/*@only@*/ /*@null@*/ termNode p_t); diff --git a/src/Headers/termNodeList.h b/src/Headers/termNodeList.h new file mode 100644 index 0000000..4574248 --- /dev/null +++ b/src/Headers/termNodeList.h @@ -0,0 +1,81 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +# ifndef termNodeLIST_H +# define termNodeLIST_H + +typedef /*@only@*/ termNode o_termNode; + +struct _termNodeList +{ + int nelements; + int nspacehigh; + int nspacelow; + int current; + /*@dependent@*/ /*@reldef@*/ /*@relnull@*/ o_termNode *elements; + /*@only@*/ /*@reldef@*/ /*@relnull@*/ o_termNode *elementsroot; +} ; + +/*@iter termNodeList_elements (sef termNodeList x, yield exposed termNode el); @*/ +# define termNodeList_elements(x, m_el) \ + { int m_ind; termNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { termNode m_el = *(m_elements++); + +# define end_termNodeList_elements }} + +extern int termNodeList_size (/*@sef@*/ termNodeList); +# define termNodeList_size(s) (termNodeList_isDefined (s) ? (s)->nelements : 0) + +extern bool termNodeList_empty (/*@sef@*/ termNodeList); +# define termNodeList_empty(s) (termNodeList_size(s) == 0) + +extern /*@falsenull@*/ bool termNodeList_isDefined (termNodeList p_t); +# define termNodeList_isDefined(s) ((s) != (termNodeList) 0) + +extern /*@only@*/ termNodeList termNodeList_new(void); +extern termNodeList termNodeList_push (/*@returned@*/ termNodeList p_s, + /*@keep@*/ termNode p_el) ; + +extern void termNodeList_addh (termNodeList p_s, /*@keep@*/ termNode p_el) ; +extern void termNodeList_addl (termNodeList p_s, /*@keep@*/ termNode p_el) ; + +extern void termNodeList_reset (termNodeList p_s) + /*@modifies p_s@*/ ; +extern void termNodeList_finish (termNodeList p_s) + /*@modifies p_s@*/ ; +extern void termNodeList_advance (termNodeList p_s) + /*@modifies p_s@*/ ; + +extern /*@exposed@*/ termNode termNodeList_getN (termNodeList p_s, int p_n) /*@*/ ; + +extern /*@only@*/ cstring termNodeList_unparse (termNodeList p_s) ; +extern /*@only@*/ cstring termNodeList_unparseTail (termNodeList p_s); +extern /*@only@*/ cstring termNodeList_unparseToCurrent (termNodeList p_s); +extern /*@only@*/ cstring termNodeList_unparseSecondToCurrent (termNodeList p_s); + +extern void termNodeList_free (/*@only@*/ termNodeList p_s) ; + +extern /*@exposed@*/ termNode termNodeList_head (termNodeList p_s) ; +extern /*@exposed@*/ termNode termNodeList_current (termNodeList p_s) ; + +extern /*@only@*/ termNodeList termNodeList_copy (termNodeList p_s) ; + +/*@constant int termNodeListGROWLOW;@*/ +# define termNodeListGROWLOW 4 /* addl used in abstract.c */ + +/*@constant int termNodeListGROWHI;@*/ +# define termNodeListGROWHI 4 + +/*@constant int termNodeListBASESIZE;@*/ +# define termNodeListBASESIZE (termNodeListGROWLOW + termNodeListGROWHI) + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/tmpname.h b/src/Headers/tmpname.h new file mode 100644 index 0000000..46dc019 --- /dev/null +++ b/src/Headers/tmpname.h @@ -0,0 +1 @@ +extern cstring makeTempName (cstring dir, cstring pfx, cstring sfx); diff --git a/src/Headers/tokentable.h b/src/Headers/tokentable.h new file mode 100644 index 0000000..065b79f --- /dev/null +++ b/src/Headers/tokentable.h @@ -0,0 +1,22 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +/* +** tokentable.h +*/ + +extern /*@exposed@*/ ltoken + LSLInsertToken(ltokenCode, lsymbol, lsymbol, bool) + /*@modifies internalState@*/ ; +extern void LSLUpdateToken(ltokenCode, lsymbol, bool) + /*@modifies internalState@*/ ; +extern /*@exposed@*/ ltoken LSLGetToken(lsymbol) /*@*/ ; +extern /*@exposed@*/ ltoken LSLReserveToken(ltokenCode, char *) + /*@modifies internalState@*/ ; + +extern void LSLSetTokenHasSyn (lsymbol p_sym, bool p_syn) + /*@modifies internalState@*/ ; + +extern void ltokenTableInit(void) /*@modifies internalState@*/ ; +extern void ltokenTableCleanup(void) /*@modifies internalState@*/ ; diff --git a/src/Headers/traitRefNode.h b/src/Headers/traitRefNode.h new file mode 100644 index 0000000..a7ae092 --- /dev/null +++ b/src/Headers/traitRefNode.h @@ -0,0 +1,11 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +typedef struct _traitRefNode { + ltokenList traitid; /* a list of traitId ltoken's */ + /*@null@*/ renamingNode rename; /* a list of renamings */ +} *traitRefNode; + +extern void traitRefNode_free (/*@only@*/ /*@null@*/ traitRefNode p_x); diff --git a/src/Headers/traitRefNodeList.h b/src/Headers/traitRefNodeList.h new file mode 100644 index 0000000..b77e684 --- /dev/null +++ b/src/Headers/traitRefNodeList.h @@ -0,0 +1,41 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +# ifndef traitRefNodeLIST_H +# define traitRefNodeLIST_H + +typedef /*@only@*/ traitRefNode o_traitRefNode; + +abst_typedef struct _traitRefNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_traitRefNode *elements; +} *traitRefNodeList ; + +/*@iter traitRefNodeList_elements (sef traitRefNodeList x, yield exposed traitRefNode el); @*/ +# define traitRefNodeList_elements(x, m_el) \ + { int m_ind; traitRefNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { traitRefNode m_el = *(m_elements++); + +# define end_traitRefNodeList_elements }} + +extern /*@only@*/ traitRefNodeList traitRefNodeList_new(void); +extern traitRefNodeList + traitRefNodeList_add (/*@returned@*/ traitRefNodeList p_s, /*@only@*/ traitRefNode p_el); + +extern /*@only@*/ cstring traitRefNodeList_unparse (traitRefNodeList p_s) ; +extern void traitRefNodeList_free (/*@only@*/ traitRefNodeList p_s) ; + +/*@constant int traitRefNodeListBASESIZE;@*/ +# define traitRefNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/typeExpr.h b/src/Headers/typeExpr.h new file mode 100644 index 0000000..bcf8b6d --- /dev/null +++ b/src/Headers/typeExpr.h @@ -0,0 +1,43 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +/* +** typeExpr.h +*/ + +typedef enum +{ + TEXPR_BASE, TEXPR_PTR, TEXPR_ARRAY, TEXPR_FCN + } typeExprKind; + +struct _typeExpr +{ + int wrapped; /* number of balanced parentheses around this program node */ + typeExprKind kind; /* different kinds of type constructors */ + union { + ltoken base; + /*@null@*/ typeExpr pointer; + struct { + /*@null@*/ typeExpr elementtype; + /*@null@*/ termNode size; + } array; + struct { + /*@null@*/ typeExpr returntype; /* not really ... return-part maybe */ + paramNodeList args; + } function; + } content; + sort sort; +} ; + +extern void typeExpr_free (/*@only@*/ /*@null@*/ typeExpr p_x); +extern /*@only@*/ cstring typeExpr_unparse (/*@null@*/ typeExpr p_x); +extern /*@only@*/ cstring typeExpr_unparseNoBase (/*@null@*/ typeExpr p_x); + +/* like a declaratorNode but without varId */ +typedef typeExpr abstDeclaratorNode; + +extern void abstDeclaratorNode_free (/*@only@*/ /*@null@*/ abstDeclaratorNode p_x); +# define abstDeclaratorNode_free(x) typeExpr_free(x); + + diff --git a/src/Headers/typeIdSet.h b/src/Headers/typeIdSet.h new file mode 100644 index 0000000..cca2900 --- /dev/null +++ b/src/Headers/typeIdSet.h @@ -0,0 +1,61 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +/* +** typeIdSet.h +** +** based on set_template.h +*/ + +# ifndef typeIdSET_H +# define typeIdSET_H + +/* in forwardTypes.h: immut_typedef int typeIdSet; */ + +extern typeIdSet typeIdSet_emptySet (void) + /*@modifies internalState@*/ ; + +extern bool typeIdSet_member (typeIdSet p_t, typeId p_el) /*@*/ ; +extern bool typeIdSet_isEmpty (/*@sef@*/ typeIdSet p_t) /*@*/ ; + +extern typeIdSet typeIdSet_single (typeId p_t) + /*@modifies internalState@*/ ; + +extern typeIdSet typeIdSet_singleOpt (typeId p_t) + /*@modifies internalState@*/ ; + +extern typeIdSet typeIdSet_insert (typeIdSet p_t, typeId p_el) + /*@modifies internalState@*/ ; + +extern typeIdSet typeIdSet_removeFresh (typeIdSet p_t, typeId p_el) + /*@modifies internalState@*/ ; + +extern cstring typeIdSet_unparse (typeIdSet p_t) /*@*/ ; + +extern typeIdSet typeIdSet_subtract (typeIdSet p_s, typeIdSet p_t) + /*@modifies internalState*/ ; + +extern int typeIdSet_compare (typeIdSet p_t1, typeIdSet p_t2); +extern cstring typeIdSet_dump (typeIdSet p_t); +extern typeIdSet typeIdSet_undump (char **p_s) + /*@modifies internalState, *p_s@*/ ; +extern typeIdSet typeIdSet_union (typeIdSet p_t1, typeIdSet p_t2) /*@*/ ; + +extern void typeIdSet_initMod (void) /*@modifies internalState@*/ ; +extern void typeIdSet_destroyMod (void) /*@modifies internalState@*/ ; + +extern void typeIdSet_dumpTable (FILE *p_fout) /*@modifies *p_fout@*/ ; +extern void + typeIdSet_loadTable (FILE *p_fin) /*@modifies *p_fin, internalState@*/ ; + +/*@constant typeIdSet typeIdSet_undefined;@*/ +# define typeIdSet_undefined 0 + +/*@constant typeIdSet typeIdSet_empty;@*/ +# define typeIdSet_empty 0 + +# else +# error "Multiple include" +# endif + diff --git a/src/Headers/typeNameNode.h b/src/Headers/typeNameNode.h new file mode 100644 index 0000000..bc7d118 --- /dev/null +++ b/src/Headers/typeNameNode.h @@ -0,0 +1,13 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +typedef struct _typeNameNode { + bool isTypeName; + /*@null@*/ typeNamePack typename; + /*@null@*/ struct _opFormNode *opform; +} *typeNameNode; + +extern void typeNameNode_free (/*@only@*/ /*@null@*/ typeNameNode p_n); +extern /*@only@*/ cstring typeNameNode_unparse (/*@null@*/ typeNameNode p_n); diff --git a/src/Headers/typeNameNodeList.h b/src/Headers/typeNameNodeList.h new file mode 100644 index 0000000..9f7f759 --- /dev/null +++ b/src/Headers/typeNameNodeList.h @@ -0,0 +1,49 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +# ifndef TYPENAMENODELIST_H +# define TYPENAMENODELIST_H + +typedef /*@only@*/ typeNameNode o_typeNameNode; + +abst_typedef struct _typeNameNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_typeNameNode *elements; +} *typeNameNodeList ; + +/*@iter typeNameNodeList_elements (sef typeNameNodeList x, yield exposed typeNameNode el); @*/ +# define typeNameNodeList_elements(x, m_el) \ + { int m_ind; typeNameNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { typeNameNode m_el = *(m_elements++); + +# define end_typeNameNodeList_elements }} + +extern int typeNameNodeList_size (typeNameNodeList); +# define typeNameNodeList_size(s) ((s)->nelements) + +extern bool typeNameNodeList_empty (typeNameNodeList); +# define typeNameNodeList_empty(s) (typeNameNodeList_size(s) == 0) + +extern /*@only@*/ typeNameNodeList typeNameNodeList_new(void); + +extern typeNameNodeList + typeNameNodeList_add (/*@returned@*/ typeNameNodeList p_s, /*@only@*/ typeNameNode p_el) ; + +extern /*@only@*/ cstring typeNameNodeList_unparse (typeNameNodeList p_s) ; +extern void typeNameNodeList_free (/*@only@*/ typeNameNodeList p_s) ; + +/*@constant int typeNameNodeListBASESIZE;@*/ +# define typeNameNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/typeNamePack.h b/src/Headers/typeNamePack.h new file mode 100644 index 0000000..3030f41 --- /dev/null +++ b/src/Headers/typeNamePack.h @@ -0,0 +1,11 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +typedef struct _typeNamePack { + bool isObj; + lclTypeSpecNode type; + abstDeclaratorNode abst; +} *typeNamePack; + diff --git a/src/Headers/typeNode.h b/src/Headers/typeNode.h new file mode 100644 index 0000000..9ff18d0 --- /dev/null +++ b/src/Headers/typeNode.h @@ -0,0 +1,23 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +# ifndef TYPENODE_H +# define TYPENODE_H + +typedef struct _typeNode { + typeKind kind; + union { + abstractNode abstract; + exposedNode exposed; + taggedUnionNode taggedunion; + } content; +} *typeNode; + +extern /*@unused@*/ /*@only@*/ cstring + typeNode_unparse (/*@null@*/ typeNode p_t) /*@*/ ; + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/uentry.h b/src/Headers/uentry.h new file mode 100644 index 0000000..22a8f3d --- /dev/null +++ b/src/Headers/uentry.h @@ -0,0 +1,583 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +# ifndef UENTRY_H +# define UENTRY_H +# define CENTRY_H + +/* +** universal symbol table entry +** (combines old llentry, centry, and ttentry) +*/ + +/* +** vkind --- need to fix value for consistency in dump files +*/ + +typedef struct _ucinfo +{ + /*@only@*/ multiVal val; + typeIdSet access; +} *ucinfo; + +typedef enum +{ + VKSPEC = 0, VKNORMAL, + VKPARAM, VKYIELDPARAM, VKREFYIELDPARAM, + VKRETPARAM, VKREFPARAM, + VKSEFPARAM, VKREFSEFPARAM, + VKSEFRETPARAM, VKREFSEFRETPARAM, + VKEXPMACRO +} vkind; + +/*@constant vkind VKFIRST;@*/ +# define VKFIRST VKSPEC + +/*@constant vkind VKLAST;@*/ +# define VKLAST VKEXPMACRO + +typedef enum +{ + CH_UNKNOWN, + CH_UNCHECKED, + CH_CHECKED, + CH_CHECKMOD, + CH_CHECKEDSTRICT +} chkind; + +typedef struct _uvinfo +{ + vkind kind; /* kind (parameter, specified) */ + chkind checked; /* how is it checked */ + sstate defstate; + nstate nullstate; +} *uvinfo ; + +typedef struct _udinfo +{ + ynm abs; + ynm mut; + ctype type; +} *udinfo ; + +/* information for specified functions */ + +typedef enum +{ + SPC_NONE, + SPC_PRINTFLIKE, + SPC_SCANFLIKE, + SPC_MESSAGELIKE, + SPC_LAST +} specCode; + +typedef struct _ufinfo +{ + qual nullPred; + specCode specialCode; + exitkind exitCode; + typeIdSet access; /* access types */ + + /*@owned@*/ globSet globs; /* globals list */ + /*@owned@*/ sRefSet mods; /* modifies */ + + specialClauses specclauses; + + /*@dependent@*/ uentryList defparams; + bool hasGlobs BOOLBITS; + bool hasMods BOOLBITS; +} *ufinfo ; + +typedef struct _uiinfo +{ + typeIdSet access; + /*@owned@*/ globSet globs; /* globals list */ + /*@owned@*/ sRefSet mods; /* modifies */ +} *uiinfo ; + +typedef struct _ueinfo +{ + typeIdSet access; +} *ueinfo ; + +typedef union _uinfo +{ + ucinfo uconst; + uvinfo var; + udinfo datatype; + ufinfo fcn; + uiinfo iter; + ueinfo enditer; +} *uinfo ; + +struct _uentry +{ + ekind ukind; + cstring uname; + ctype utype; + + fileloc whereSpecified; + fileloc whereDefined; + fileloc whereDeclared; + + /* meaning of sref is different for: + ** variables current state + ** functions state of return value + ** types state of datatype + */ + /*@exposed@*/ /*@null@*/ sRef sref; + + /* Location list is complete only if showalluses is set. */ + filelocList uses; + + bool used BOOLBITS; + bool lset BOOLBITS; /* set in local table */ + bool isPrivate BOOLBITS; /* specification only */ + bool hasNameError BOOLBITS; + + storageClassCode storageclass; + /*@relnull@*/ uinfo info; /* null for KELIPSMARKER, KINVALID */ +} ; + +/* +** There is no uentry_isDefined to avoid confusion with +** uentry_isCodeDefined (which was previously called +** uentry_isDefined. +*/ + +extern /*@truenull@*/ bool uentry_isUndefined (/*@special@*/ uentry p_e) + /*@*/ ; +extern /*@truenull@*/ bool uentry_isInvalid (/*@special@*/ uentry p_e) + /*@*/ ; +extern /*@falsenull@*/ bool uentry_isValid (/*@special@*/ uentry p_e) + /*@*/ ; + +/*@constant null uentry uentry_undefined; @*/ +# define uentry_undefined ((uentry) NULL) + +# define uentry_isUndefined(e) ((e) == uentry_undefined) +# define uentry_isValid(e) ((e) != uentry_undefined) +# define uentry_isInvalid(e) ((e) == uentry_undefined) + +extern int uentry_compareStrict (uentry p_v1, uentry p_v2); + +/*@constant int PARAMUNKNOWN; @*/ +# define PARAMUNKNOWN -1 + +extern bool uentry_isMaybeAbstract (uentry p_e) /*@*/ ; +extern void uentry_setAbstract (uentry p_e) /*@modifies p_e@*/ ; +extern void uentry_setConcrete (uentry p_e) /*@modifies p_e@*/ ; +extern void uentry_setHasNameError (uentry p_ue) /*@modifies p_ue@*/ ; + +extern /*@falsenull@*/ bool uentry_isLset (/*@sef@*/ uentry p_e); +# define uentry_isLset(e) \ + (uentry_isValid(e) && (e)->lset) + +extern /*@falsenull@*/ bool uentry_isUsed (/*@sef@*/ uentry p_e); +# define uentry_isUsed(e) (uentry_isValid(e) && (e)->used) + +extern /*@unused@*/ /*@falsenull@*/ bool + uentry_isAbstractType (uentry p_e) /*@*/ ; +# define uentry_isAbstractType(e) (uentry_isAbstractDatatype(e)) + +extern /*@falsenull@*/ bool uentry_isConstant (/*@sef@*/ uentry p_e) /*@*/ ; +# define uentry_isConstant(e) \ + (uentry_isValid(e) && ekind_isConst ((e)->ukind)) + +extern /*@falsenull@*/ bool uentry_isEitherConstant (/*@sef@*/ uentry p_e) /*@*/ ; +# define uentry_isEitherConstant(e) \ + (uentry_isValid(e) && (ekind_isConst ((e)->ukind) || ekind_isEnumConst ((e)->ukind))) + +extern /*@falsenull@*/ bool uentry_isEnumConstant (/*@sef@*/ uentry p_e) /*@*/ ; +# define uentry_isEnumConstant(e) \ + (uentry_isValid(e) && ekind_isEnumConst ((e)->ukind)) + +extern /*@falsenull@*/ bool uentry_isExternal (/*@sef@*/ uentry p_e) /*@*/ ; +# define uentry_isExternal(c) \ + (uentry_isValid(c) && fileloc_isExternal (uentry_whereDefined (c))) + +extern /*@falsenull@*/ bool uentry_isExtern (/*@sef@*/ uentry p_e) /*@*/ ; +# define uentry_isExtern(c) \ + (uentry_isValid(c) && (c)->storageclass == SCEXTERN) + +extern bool uentry_isForward (uentry p_e) /*@*/ ; + +extern /*@falsenull@*/ bool uentry_isFunction (/*@sef@*/ uentry p_e) /*@*/ ; +# define uentry_isFunction(e) \ + (uentry_isValid(e) && ekind_isFunction ((e)->ukind)) + +extern /*@falsenull@*/ bool uentry_isPriv (/*@sef@*/ uentry p_e) /*@*/ ; +# define uentry_isPriv(e) \ + (uentry_isValid(e) && (e)->isPrivate) + +extern /*@falsenull@*/ bool uentry_isFileStatic (uentry p_ue) /*@*/ ; +extern /*@falsenull@*/ bool uentry_isExported (uentry p_ue) /*@*/ ; + +extern /*@falsenull@*/ bool uentry_isStatic (/*@sef@*/ uentry p_e) /*@*/ ; +# define uentry_isStatic(c) \ + (uentry_isValid(c) && (c)->storageclass == SCSTATIC) + +extern void uentry_setLset (/*@sef@*/ uentry p_e); +# define uentry_setLset(e) \ + (uentry_isValid(e) ? (e)->lset = TRUE : TRUE) + +extern bool uentry_isSpecialFunction (uentry p_ue) /*@*/ ; +extern bool uentry_isMessageLike (uentry p_ue) /*@*/ ; +extern bool uentry_isScanfLike (uentry p_ue) /*@*/ ; +extern bool uentry_isPrintfLike (uentry p_ue) /*@*/ ; + +extern void uentry_setMessageLike (uentry p_ue) /*@modifies p_ue@*/ ; +extern void uentry_setScanfLike (uentry p_ue) /*@modifies p_ue@*/ ; +extern void uentry_setPrintfLike (uentry p_ue) /*@modifies p_ue@*/ ; + +extern void uentry_checkName (uentry p_ue) /*@modifies g_msgstream, p_ue@*/ ; + +extern bool uentry_sameObject (uentry p_e1, uentry p_e2); +# define uentry_sameObject(e1,e2) ((e1) == (e2)) + +extern void uentry_addAccessType (uentry p_ue, typeId p_tid) /*@modifies p_ue@*/ ; + +extern void uentry_showWhereAny (uentry p_spec) + /*@modifies g_msgstream@*/ ; + +extern void uentry_checkParams (uentry p_ue); +extern void uentry_mergeUses (uentry p_res, uentry p_other); +extern void uentry_setExtern (uentry p_c); +extern void uentry_setUsed (uentry p_e, fileloc p_loc); +extern void uentry_setDefState (uentry p_ue, sstate p_defstate); + +extern void uentry_setNotUsed (/*@sef@*/ uentry p_e); +# define uentry_setNotUsed(e) \ + (uentry_isValid (e) ? (e)->used = FALSE : FALSE) + +extern bool uentry_wasUsed (/*@sef@*/ uentry p_e); +# define uentry_wasUsed(e) \ + (uentry_isValid (e) ? (e)->used : TRUE) + +extern void uentry_mergeConstantValue (uentry p_ue, /*@only@*/ multiVal p_m); + +extern /*@observer@*/ fileloc uentry_whereEarliest (uentry p_e) /*@*/ ; +extern /*@observer@*/ cstring uentry_rawName (uentry p_e) /*@*/ ; +extern /*@observer@*/ fileloc uentry_whereDeclared (uentry p_e) /*@*/ ; +extern bool uentry_equiv (uentry p_p1, uentry p_p2) /*@*/ ; +extern /*@falsenull@*/ bool uentry_hasName (uentry p_e) /*@*/ ; +extern /*@falsenull@*/ bool uentry_hasRealName (uentry p_e) /*@*/ ; +extern /*@falsenull@*/ bool uentry_isAbstractDatatype (uentry p_e) /*@*/ ; +extern /*@falsenull@*/ bool uentry_isAnyTag (/*@special@*/ uentry p_ue) + /*@uses p_ue->ukind@*/ + /*@*/ ; +extern /*@falsenull@*/ bool uentry_isDatatype (uentry p_e) /*@*/ ; + +extern /*@falsenull@*/ bool uentry_isCodeDefined (uentry p_e) /*@*/ ; + +extern /*@falsenull@*/ bool uentry_isDeclared (/*@special@*/ uentry p_e) + /*@uses p_e->whereDeclared@*/ /*@*/ ; + +extern /*@observer@*/ cstring uentry_ekindName (uentry p_ue) /*@*/ ; +extern void uentry_showWhereDefined (uentry p_spec); +extern /*@falsenull@*/ bool uentry_isEndIter (uentry p_e) /*@*/ ; +extern /*@falsenull@*/ bool uentry_isEnumTag (/*@special@*/ uentry p_ue) + /*@uses p_ue->ukind@*/ /*@*/ ; +extern /*@falsenull@*/ bool uentry_isFakeTag (uentry p_e) /*@*/ ; +extern /*@falsenull@*/ bool uentry_isIter (uentry p_e) /*@*/ ; +extern /*@falsenull@*/ bool uentry_isMutableDatatype (uentry p_e) /*@*/ ; +extern /*@falsenull@*/ bool uentry_isParam (uentry p_u) /*@*/ ; +extern /*@falsenull@*/ bool uentry_isExpandedMacro (uentry p_u) /*@*/ ; +extern /*@falsenull@*/ bool uentry_isSefParam (uentry p_u) /*@*/ ; +extern /*@falsenull@*/ bool uentry_isAnyParam (/*@special@*/ uentry p_u) + /*@uses p_u->ukind, p_u->info@*/ + /*@*/ ; + +extern /*@falsenull@*/ bool uentry_isRealFunction (uentry p_e) /*@*/ ; +extern /*@falsenull@*/ bool uentry_isSpecified (uentry p_e) /*@*/ ; + +extern /*@falsenull@*/ bool uentry_isStructTag (/*@special@*/ uentry p_ue) + /*@uses p_ue->ukind@*/ /*@*/ ; +extern /*@falsenull@*/ bool uentry_isUnionTag (/*@special@*/ uentry p_ue) + /*@uses p_ue->ukind@*/ /*@*/ ; + +extern /*@falsenull@*/ bool uentry_isVar (/*@special@*/ uentry p_e) + /*@uses p_e->ukind@*/ + /*@*/ ; + +extern /*@falsenull@*/ bool uentry_isVariable (/*@special@*/ uentry p_e) + /*@uses p_e->ukind@*/ + /*@*/ ; + +extern cstring uentry_dump (uentry p_v) ; +extern cstring uentry_dumpParam (uentry p_v); +extern cstring uentry_getName (/*@special@*/ uentry p_e) + /*@uses p_e->ukind, p_e->info, p_e->uname@*/ + /*@*/ ; + +extern cstring uentry_unparse (uentry p_v) /*@*/ ; +extern cstring uentry_unparseAbbrev (uentry p_v) /*@*/ ; +extern cstring uentry_unparseFull (uentry p_v) /*@*/ ; +extern void uentry_setMutable (uentry p_e) /*@modifies p_e@*/ ; +extern ctype uentry_getAbstractType (uentry p_e) /*@*/ ; +extern ctype uentry_getRealType (uentry p_e) /*@globals internalState@*/ ; +extern ctype uentry_getType (uentry p_e) /*@*/ ; +extern ekind uentry_getKind (uentry p_e) /*@*/ ; +extern /*@observer@*/ fileloc uentry_whereDefined (uentry p_e) /*@*/ ; +extern /*@observer@*/ fileloc uentry_whereSpecified (uentry p_e) /*@*/ ; +extern int uentry_compare (uentry p_u1, uentry p_u2); +extern /*@exposed@*/ sRef uentry_getSref (/*@temp@*/ uentry p_e) /*@*/ ; +extern /*@observer@*/ sRefSet uentry_getMods (uentry p_l) /*@*/ ; +extern typeIdSet uentry_accessType (uentry p_e) /*@*/ ; +extern /*@observer@*/ fileloc uentry_whereEither (uentry p_e) /*@*/ ; +extern /*@notnull@*/ uentry uentry_makeExpandedMacro (cstring p_s, + /*@temp@*/ fileloc p_f) + /*@*/ ; + +extern void uentry_checkMatchParam (uentry p_u1, uentry p_u2, int p_paramno, exprNode p_e) /*@modifies g_msgstream@*/ ; + +extern /*@observer@*/ specialClauses uentry_getSpecialClauses (uentry p_ue) /*@*/ ; + +extern void uentry_showWhereLastExtra (uentry p_spec, /*@only@*/ cstring p_extra) + /*@modifies g_msgstream@*/ ; + +# ifndef NOLCL +extern void uentry_setRefCounted (uentry p_e); + +extern /*@notnull@*/ /*@only@*/ uentry uentry_makeUnnamedVariable (ctype p_t); + +extern /*@notnull@*/ uentry + uentry_makeUnspecFunction (cstring p_n, ctype p_t, typeIdSet p_access, + /*@keep@*/ fileloc p_f); + +extern /*@notnull@*/ uentry + uentry_makePrivFunction2 (cstring p_n, ctype p_t, + typeIdSet p_access, + /*@only@*/ globSet p_globs, + /*@only@*/ sRefSet p_mods, /*@keep@*/ fileloc p_f); + +extern /*@notnull@*/ uentry + uentry_makeSpecEnumConstant (cstring p_n, ctype p_t, /*@keep@*/ fileloc p_loc) /*@*/ ; + +extern /*@notnull@*/ uentry + uentry_makeEnumTag (cstring p_n, ctype p_t, /*@only@*/ fileloc p_loc) /*@*/ ; + +extern /*@notnull@*/ uentry + uentry_makeTypeListFunction (cstring p_n, typeIdSet p_access, /*@only@*/ fileloc p_f) + /*@*/ ; + +extern /*@notnull@*/ uentry + uentry_makeSpecFunction (cstring p_n, ctype p_t, + typeIdSet p_access, /*@only@*/ globSet p_globs, + /*@only@*/ sRefSet p_mods, /*@keep@*/ fileloc p_f); +# endif + +extern /*@notnull@*/ uentry + uentry_makeEnumConstant (cstring p_n, ctype p_t) /*@*/ ; + +extern /*@notnull@*/ uentry + uentry_makeEnumInitializedConstant (cstring p_n, ctype p_t, exprNode p_expr) /*@*/ ; + +extern /*@notnull@*/ /*@only@*/ uentry + uentry_makeConstant (/*@temp@*/ cstring p_n, ctype p_t, /*@keep@*/ fileloc p_f) + /*@*/ ; +extern /*@notnull@*/ /*@only@*/ uentry + uentry_makeConstantAux (/*@temp@*/ cstring p_n, ctype p_t, + /*@keep@*/ fileloc p_f, bool p_priv, + /*@only@*/ multiVal p_m) /*@*/ ; +extern /*@notnull@*/ /*@only@*/ uentry + uentry_makeDatatype (/*@temp@*/ cstring p_n, ctype p_t, ynm p_mut, ynm p_abs, + /*@only@*/ fileloc p_f) /*@*/ ; +extern /*@notnull@*/ /*@only@*/ uentry + uentry_makeDatatypeAux (/*@temp@*/ cstring p_n, ctype p_t, ynm p_mut, + ynm p_abs, /*@keep@*/ fileloc p_f, bool p_priv) /*@*/ ; +extern /*@notnull@*/ uentry uentry_makeElipsisMarker (void) /*@*/ ; + +extern void uentry_makeVarFunction (/*@temp@*/ uentry p_ue) /*@modifies p_ue@*/ ; + +extern bool uentry_isElipsisMarker (/*@sef@*/ uentry p_u) /*@*/ ; +# define uentry_isElipsisMarker(u) \ + (uentry_isValid(u) && ekind_isElipsis ((u)->ukind)) + +extern /*@notnull@*/ uentry + uentry_makeEndIter (cstring p_n, /*@only@*/ fileloc p_f) /*@*/ ; +extern /*@notnull@*/ uentry + uentry_makeEnumTagLoc (cstring p_n, ctype p_t) /*@*/ ; +extern /*@notnull@*/ uentry + uentry_makeForwardFunction (cstring p_n, typeId p_access, /*@temp@*/ fileloc p_f) /*@*/ ; + +extern /*@notnull@*/ uentry + uentry_makeFunction (cstring p_n, ctype p_t, + typeId p_access, + /*@only@*/ globSet p_globs, /*@only@*/ sRefSet p_mods, + /*@only@*/ fileloc p_f); + +extern /*@notnull@*/ uentry + uentry_makeIter (cstring p_n, ctype p_ct, /*@only@*/ fileloc p_f) /*@*/ ; +extern /*@notnull@*/ uentry + uentry_makeParam (idDecl p_t, int p_i) /*@*/ ; + +extern /*@notnull@*/ uentry + uentry_makeStructTag (cstring p_n, ctype p_t, /*@only@*/ fileloc p_loc); +extern /*@notnull@*/ uentry + uentry_makeStructTagLoc (cstring p_n, ctype p_t); +extern /*@notnull@*/ uentry + uentry_makeUnionTag (cstring p_n, ctype p_t, /*@only@*/ fileloc p_loc); +extern /*@notnull@*/ uentry + uentry_makeUnionTagLoc (cstring p_n, ctype p_t); +extern /*@notnull@*/ uentry + uentry_makeVariable (cstring p_n, ctype p_t, /*@keep@*/ fileloc p_f, bool p_isPriv); +extern /*@notnull@*/ /*@only@*/ uentry + uentry_makeVariableLoc (cstring p_n, ctype p_t); + +# ifndef NOLCL +extern /*@notnull@*/ /*@only@*/ + uentry uentry_makeVariableParam (cstring p_n, ctype p_t); +# endif + +extern /*@notnull@*/ /*@only@*/ + uentry uentry_makeVariableSrefParam (cstring p_n, ctype p_t, + sRef p_s); +extern /*@notnull@*/ /*@only@*/ + uentry uentry_makeIdFunction (idDecl p_id); +extern /*@notnull@*/ /*@only@*/ + uentry uentry_makeIdDatatype (idDecl p_id); +extern /*@notnull@*/ /*@only@*/ + uentry uentry_makeBoolDatatype (ynm p_abs); +extern void uentry_mergeDefinition (uentry p_old, /*@only@*/ uentry p_unew); +extern void uentry_mergeEntries (uentry p_spec, /*@only@*/ uentry p_def); +extern uentry uentry_nameCopy (/*@only@*/ cstring p_name, uentry p_e); +extern uentry uentry_undump (ekind p_kind, fileloc p_loc, char **p_s); +extern /*@observer@*/ uentryList uentry_getParams (uentry p_l) /*@*/ ; +extern void uentry_resetParams (uentry p_ue, /*@only@*/ uentryList p_pn) + /*@modifies p_ue@*/ ; +extern /*@observer@*/ globSet uentry_getGlobs (uentry p_l) /*@*/ ; +extern qual uentry_nullPred (uentry p_u); +extern void uentry_free (/*@only@*/ /*@only@*/ uentry p_e); +extern void uentry_setDatatype (uentry p_e, usymId p_uid); + +extern void uentry_setDefined (/*@special@*/ uentry p_e, fileloc p_f) + /*@uses p_e->whereDefined, p_e->ukind, p_e->uname, p_e->info@*/ + /*@modifies p_e@*/ ; + +extern void uentry_checkDecl (void); +extern void uentry_clearDecl (void); +extern void uentry_setDeclared (uentry p_e, fileloc p_f); +extern void uentry_setDeclaredOnly (uentry p_e, /*@only@*/ fileloc p_f); +extern void uentry_setDeclaredForceOnly (uentry p_e, /*@only@*/ fileloc p_f); +extern void uentry_setFunctionDefined (uentry p_e, fileloc p_loc); +extern void uentry_setName (uentry p_e, /*@only@*/ cstring p_n); +extern void uentry_setParam (uentry p_e); +extern void uentry_setSref (uentry p_e, /*@exposed@*/ sRef p_s); +extern void uentry_setStatic (uentry p_c); + +extern void uentry_setModifies (uentry p_ue, /*@owned@*/ sRefSet p_sr) + /*@modifies p_ue, p_sr@*/; + +extern void uentry_setSpecialClauses (uentry p_ue, /*@only@*/ specialClauses p_clauses) + /*@modifies p_ue@*/ ; + +extern void uentry_setType (uentry p_e, ctype p_t); + +extern /*@unused@*/ /*@observer@*/ cstring uentry_checkedName (uentry p_ue); +extern void uentry_showWhereLastPlain (uentry p_spec) /*@modifies g_msgstream@*/ ; + +extern void + uentry_showWhereSpecifiedExtra (uentry p_spec, /*@only@*/ cstring p_s) + /*@modifies g_msgstream@*/ ; + +extern void uentry_showWhereSpecified (uentry p_spec) /*@modifies g_msgstream@*/ ; +extern void uentry_showWhereLast (uentry p_spec) /*@modifies g_msgstream@*/ ; +extern void uentry_showWhereDeclared (uentry p_spec) /*@modifies g_msgstream@*/ ; + +extern /*@notnull@*/ /*@only@*/ uentry uentry_makeIdVariable (idDecl p_t) /*@*/ ; +extern uentry uentry_copy (uentry p_e) /*@*/ ; +extern void uentry_freeComplete (/*@only@*/ uentry p_e) ; +extern void uentry_clearDefined (uentry p_e) /*@modifies p_e@*/; +extern /*@observer@*/ cstring uentry_specDeclName (uentry p_u) /*@*/ ; + +extern void + uentry_mergeState (uentry p_res, uentry p_other, fileloc p_loc, + bool p_mustReturn, bool p_flip, bool p_opt, + clause p_cl) /*@modifies p_res, p_other@*/ ; + +extern void uentry_setState (uentry p_res, uentry p_other) + /*@modifies p_res, p_other@*/ ; + +extern void uentry_setRefParam (uentry p_e) /*@modifies p_e@*/ ; + +extern void uentry_setDeclaredForce (uentry p_e, fileloc p_f) /*@modifies p_e@*/; +extern bool uentry_isNonLocal (uentry p_ue) /*@*/ ; +extern bool uentry_isGlobal (uentry p_ue) /*@*/; +extern bool uentry_isRefParam (uentry p_u) /*@*/ ; +extern bool uentry_hasGlobs (uentry p_ue) /*@*/ ; +extern bool uentry_hasMods (uentry p_ue) /*@*/ ; + +extern bool uentry_hasSpecialClauses (uentry p_ue) /*@*/ ; +extern exitkind uentry_getExitCode (uentry p_ue) /*@*/ ; + +extern void uentry_checkYieldParam (uentry p_old, uentry p_unew); +extern bool uentry_isOnly (uentry p_ue) /*@*/ ; +extern bool uentry_isUnique (uentry p_ue) /*@*/ ; +extern void uentry_reflectQualifiers (uentry p_ue, qualList p_q) /*@modifies p_ue@*/; +extern bool uentry_isOut (uentry p_u) /*@*/ ; +extern bool uentry_isPartial (uentry p_u) /*@*/ ; +extern bool uentry_isStateSpecial (uentry p_u) /*@*/ ; +extern bool uentry_possiblyNull (uentry p_u) /*@*/ ; +extern ctype uentry_getForceRealType (uentry p_e) /*@globals internalState@*/ ; +extern alkind uentry_getAliasKind (uentry p_u) /*@*/ ; +extern exkind uentry_getExpKind (uentry p_u) /*@*/ ; +extern /*@observer@*/ multiVal uentry_getConstantValue (uentry p_e) /*@*/ ; +extern void uentry_fixupSref (uentry p_ue) /*@modifies p_ue@*/ ; +extern void uentry_setGlobals (uentry p_ue, /*@owned@*/ globSet p_globs) /*@modifies p_ue@*/ ; +extern bool uentry_isYield (uentry p_ue) /*@*/ ; +extern /*@notnull@*/ uentry uentry_makeIdConstant (idDecl p_t) /*@*/ ; +extern /*@observer@*/ cstring uentry_getRealName (uentry p_e) /*@*/ ; +extern int uentry_xcomparealpha (uentry *p_p1, uentry *p_p2) /*@*/ ; +extern int uentry_xcompareuses (uentry *p_p1, uentry *p_p2) /*@*/ ; +extern /*@observer@*/ cstring uentry_specOrDefName (uentry p_u) /*@*/ ; +extern void uentry_copyState (uentry p_res, uentry p_other); +extern bool uentry_sameKind (uentry p_u1, uentry p_u2); +extern /*@exposed@*/ sRef uentry_returnedRef (uentry p_u, exprNodeList p_args); +extern bool uentry_isReturned (uentry p_u); +extern bool uentry_isRefCountedDatatype (uentry p_e); +extern sstate uentry_getDefState (uentry p_u); +extern /*@unused@*/ void uentry_markFree (/*@owned@*/ uentry p_u); +extern /*@dependent@*/ sRef uentry_getOrigSref (uentry p_e); +extern void uentry_destroyMod (void) /*@modifies internalState@*/; +extern void uentry_showDefSpecInfo (uentry p_ce, fileloc p_fwhere); +extern void uentry_markOwned (/*@owned@*/ uentry p_u); + +extern /*@observer@*/ fileloc uentry_whereLast (uentry p_e) /*@*/ ; +extern void uentry_setParamNo (uentry p_ue, int p_pno) /*@modifies p_ue@*/; + +extern /*@observer@*/ filelocList uentry_getUses (/*@sef@*/ uentry p_e) /*@*/ ; +# define uentry_getUses(u) (uentry_isValid (u) ? (u)->uses : filelocList_undefined) + +extern bool uentry_isCheckedUnknown (uentry p_ue) /*@*/ ; +extern bool uentry_isCheckedModify (uentry p_ue) /*@*/ ; +extern bool uentry_isUnchecked (uentry p_ue) /*@*/ ; +extern bool uentry_isChecked (uentry p_ue) /*@*/ ; +extern bool uentry_isCheckMod (uentry p_ue) /*@*/ ; +extern bool uentry_isCheckedStrict (uentry p_ue) /*@*/ ; +extern void uentry_setUnchecked (uentry p_ue) /*@modifies p_ue@*/ ; +extern void uentry_setChecked (uentry p_ue) /*@modifies p_ue@*/ ; +extern void uentry_setCheckMod (uentry p_ue) /*@modifies p_ue@*/ ; +extern void uentry_setCheckedStrict (uentry p_ue) /*@modifies p_ue@*/ ; + +extern bool uentry_hasAccessType (uentry p_e); + +extern /*@exposed@*/ uentry uentry_makeUnrecognized (cstring p_c, /*@keep@*/ fileloc p_loc); + +# ifdef DOANNOTS +typedef enum { AN_UNKNOWN, AN_FCNRETURN, AN_FCNPARAM, AN_SUFIELD, AN_TDEFN, AN_GSVAR, + AN_CONST, AN_LAST + } ancontext; + +extern void initAnnots (); +extern void printAnnots (void); +extern void uentry_tallyAnnots (uentry u, ancontext kind); +# endif /* DOANNOTS */ + +# else +# error "Multiple include" +# endif + + + diff --git a/src/Headers/uentryList.h b/src/Headers/uentryList.h new file mode 100644 index 0000000..b6a1a48 --- /dev/null +++ b/src/Headers/uentryList.h @@ -0,0 +1,105 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +/* +** uentryList.h (from slist_templace.h) +*/ + +# ifndef uentryLIST_H +# define uentryLIST_H + +abst_typedef /*@null@*/ struct _uentryList *uentryList ; + +struct _uentryList +{ + int nelements; + int nspace; + int current; + /*@reldef@*/ /*@relnull@*/ o_uentry *elements; +} ; + +/*@iter uentryList_elements (sef uentryList x, yield exposed uentry el); @*/ +# define uentryList_elements(x, m_el) \ + { if (!uentryList_isUndefined(x) && !uentryList_isVoid(x))\ + { int m_ind; uentry *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { uentry m_el = *(m_elements++); + +# define end_uentryList_elements }}} + +extern void uentryList_clear (uentryList p_s) /*@modifies p_s@*/ ; +extern int uentryList_size (uentryList p_s) /*@*/ ; +extern /*@only@*/ uentryList uentryList_makeMissingParams (void); + +/*@constant null uentryList uentryList_missingParams; @*/ +# define uentryList_missingParams uentryList_undefined + +# define uentryList_makeMissingParams() uentryList_missingParams + +extern /*@truenull@*/ bool uentryList_isMissingParams (uentryList p_s) /*@*/ ; +extern /*@truenull@*/ bool uentryList_isUndefined (uentryList p_s) /*@*/ ; +extern /*@unused@*/ /*@truenull@*/ bool uentryList_isEmpty (uentryList p_s) /*@*/ ; +extern /*@unused@*/ /*@falsenull@*/ bool uentryList_isDefined (uentryList p_s) /*@*/ ; + +# define uentryList_isEmpty(s) (uentryList_size(s) == 0) + +/*@constant null uentryList uentryList_undefined; @*/ +# define uentryList_undefined ((uentryList)0) + +# define uentryList_isUndefined(c) ((c) == uentryList_undefined) +# define uentryList_isDefined(c) ((c) != uentryList_undefined) + +extern /*@notnull@*/ /*@only@*/ uentryList uentryList_new(void); +extern uentryList uentryList_add (/*@returned@*/ uentryList p_s, /*@keep@*/ uentry p_el) /*@modifies p_s@*/ ; +extern /*@only@*/ uentryList uentryList_single (/*@keep@*/ uentry p_el) /*@*/ ; +extern /*@exposed@*/ uentry uentryList_getN (uentryList p_p, int p_n) /*@*/ ; + +extern /*@unused@*/ cstring uentryList_unparseFull (uentryList p_s) /*@*/ ; +extern cstring uentryList_unparse (uentryList p_s) /*@*/ ; +extern cstring uentryList_unparseAbbrev (uentryList p_p) /*@*/ ; +extern cstring uentryList_unparseParams (uentryList p_s) /*@*/ ; + +extern void uentryList_free (/*@only@*/ uentryList p_s) ; +extern bool uentryList_isVoid (uentryList p_cl) /*@*/ ; +extern /*@only@*/ uentryList uentryList_copy (uentryList p_s) /*@*/ ; +extern void uentryList_fixMissingNames (uentryList p_cl) /*@modifies p_cl@*/ ; + +extern int uentryList_compareStrict (uentryList p_s, uentryList p_t) /*@*/ ; +extern int uentryList_compareParams (uentryList p_s, uentryList p_t) /*@*/ ; +extern int uentryList_compareFields (uentryList p_s, uentryList p_t) /*@*/ ; +extern cstring uentryList_dumpParams (uentryList p_s) /*@*/ ; +extern uentryList uentryList_undump (char **p_s) /*@modifies *p_s@*/ ; + +extern bool uentryList_hasReturned (uentryList p_ul) /*@*/ ; +extern void uentryList_advanceSafe (uentryList p_s) /*@modifies p_s@*/; +extern bool uentryList_isFinished (uentryList p_s) /*@*/ ; +extern void uentryList_reset (uentryList p_s) /*@modifies p_s@*/ ; +extern /*@exposed@*/ uentry uentryList_current (uentryList p_s) /*@*/ ; +extern int uentryList_lookupRealName (uentryList p_s, cstring p_name) /*@*/ ; +extern /*@exposed@*/ uentry + uentryList_lookupField (uentryList p_f, cstring p_name) /*@*/ ; +extern uentryList uentryList_mergeFields (/*@only@*/ uentryList p_f1, /*@only@*/ uentryList p_f2); +extern void uentryList_showFieldDifference (uentryList p_p1, uentryList p_p2); +extern /*@only@*/ uentryList uentryList_undumpFields (char **p_s, fileloc p_loc); +extern /*@only@*/ cstring uentryList_dumpFields (uentryList p_s); +extern void uentryList_fixImpParams (uentryList p_cl); +extern bool uentryList_sameObject (uentryList, uentryList); +extern bool uentryList_matchFields (uentryList p_p1, uentryList p_p2); +extern bool uentryList_matchParams (uentryList p_p1, uentryList p_p2, bool p_force, bool p_arg); + +# define uentryList_sameObject(s,t) ((s) == (t)) + +/*@constant int PRINTBREADTH;@*/ +# define PRINTBREADTH 3 + +/*@constant int uentryListBASESIZE;@*/ +# define uentryListBASESIZE MIDBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/usymId.h b/src/Headers/usymId.h new file mode 100644 index 0000000..9832d89 --- /dev/null +++ b/src/Headers/usymId.h @@ -0,0 +1,18 @@ +# ifndef USYMID_H +# define USYMID_H + +typedef int usymId; +typedef usymId typeId; + +extern bool usymId_equal (usymId p_u1, usymId p_u2) /*@*/ ; +# define usymId_equal(u1,u2) ((u1) == (u2)) + +/*@constant usymId USYMIDINVALID;@*/ +# define USYMIDINVALID -17 + +/*@constant typeId typeId_invalid;@*/ +# define typeId_invalid USYMIDINVALID + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/usymIdSet.h b/src/Headers/usymIdSet.h new file mode 100644 index 0000000..2933c2a --- /dev/null +++ b/src/Headers/usymIdSet.h @@ -0,0 +1,66 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +/* +** usymIdSet.h +** +** based on set_template.h +*/ + +# ifndef USYMIDSET_H +# define USYMIDSET_H + +# include "usymId.h" + +abst_typedef /*@null@*/ struct _usymIdSet +{ + int entries; + int nspace; + /*@reldef@*/ /*@relnull@*/ usymId *elements; +} *usymIdSet ; + +extern usymIdSet usymIdSet_new(void); +extern bool usymIdSet_member (usymIdSet p_s, usymId p_el) /*@*/ ; +extern usymIdSet usymIdSet_subtract (usymIdSet p_s, usymIdSet p_t); +extern void usymIdSet_free (/*@only@*/ /*@only@*/ usymIdSet p_s); +extern /*@only@*/ cstring usymIdSet_unparse (usymIdSet p_ll); +extern /*@only@*/ cstring usymIdSet_dump (usymIdSet p_lset); +extern usymIdSet usymIdSet_undump (char **p_s); +extern /*@only@*/ usymIdSet usymIdSet_single (usymId p_t); + +extern int usymIdSet_compare (usymIdSet p_l1, usymIdSet p_l2); + +/*@constant int usymIdSetBASESIZE;@*/ +# define usymIdSetBASESIZE SMALLBASESIZE + +extern usymIdSet usymIdSet_newUnion (usymIdSet p_s1, usymIdSet p_s2) /*@*/ ; +extern usymIdSet usymIdSet_add (usymIdSet p_s, usymId p_el) /*@*/ ; + +extern /*@only@*/ usymIdSet + usymIdSet_removeFresh (/*@temp@*/ usymIdSet p_s, usymId p_el); + +/*@constant null usymIdSet usymIdSet_undefined; @*/ +# define usymIdSet_undefined ((usymIdSet) NULL) + +extern /*@falsenull@*/ bool usymIdSet_isDefined (usymIdSet p_s) /*@*/ ; +# define usymIdSet_isDefined(s) ((s) != usymIdSet_undefined) + +extern /*@truenull@*/ bool usymIdSet_isUndefined (usymIdSet p_s) /*@*/ ; +# define usymIdSet_isUndefined(s) ((s) == usymIdSet_undefined) + +/*@iter usymIdSet_elements (sef usymIdSet u, yield usymId el); @*/ +# define usymIdSet_elements(x, m_el) \ + { int m_ind; if (usymIdSet_isDefined (x)) { \ + for (m_ind = 0 ; m_ind < usymIdSet_size(x); m_ind++) \ + { usymId m_el = (x)->elements[m_ind]; + +# define end_usymIdSet_elements }}} + +extern int usymIdSet_size (/*@sef@*/ usymIdSet p_s); +# define usymIdSet_size(s) (usymIdSet_isUndefined(s) ? 0 : (s)->entries) + +# else +# error "Multiple include" +# endif + diff --git a/src/Headers/usymtab.h b/src/Headers/usymtab.h new file mode 100644 index 0000000..b6ef2ee --- /dev/null +++ b/src/Headers/usymtab.h @@ -0,0 +1,408 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +/* +** usymtab.h +*/ + +# ifndef USYMTAB_H +# define USYMTAB_H + +/*@constant null usymtab GLOBAL_ENV; @*/ +# define GLOBAL_ENV usymtab_undefined + +typedef enum { + US_GLOBAL, + US_NORMAL, + US_TBRANCH, US_FBRANCH, + US_CBRANCH, US_SWITCH +} uskind; + +typedef struct _refentry { int level; int index; } *refentry; +typedef /*@only@*/ refentry o_refentry; +typedef o_refentry *refTable; + +struct _usymtab +{ + uskind kind; + int nentries; + int nspace; + int lexlevel; + bool mustBreak; + exitkind exitCode; + /*@reldef@*/ /*@only@*/ o_uentry *entries; + /*@null@*/ /*@only@*/ hashTable htable; /* for the global environment */ + /*@null@*/ /*@only@*/ refTable reftable; /* for branched environments */ + /*@only@*/ guardSet guards; /* guarded references (not null) */ + aliasTable aliases; + /*@owned@*/ usymtab env; +} ; + +/* +** rep invariant: +** +** (left as exercise to reader) ;) +*/ + +extern void usymtab_printTypes (void) + /*@globals internalState@*/ + /*@modifies g_msgstream@*/ ; + +extern void usymtab_setMustBreak (void) /*@modifies internalState@*/ ; + +extern bool usymtab_inGlobalScope (void) /*@globals internalState@*/ ; +extern bool usymtab_inFunctionScope (void) /*@globals internalState@*/ ; +extern bool usymtab_inFileScope (void) /*@globals internalState@*/ ; +extern void usymtab_checkFinalScope (bool p_isReturn) + /*@globals internalState@*/ + /*@modifies *g_msgstream@*/ ; + +extern void usymtab_allUsed (void) + /*@globals internalState@*/ + /*@modifies *g_msgstream@*/ ; + +extern void usymtab_allDefined (void) + /*@globals internalState@*/ + /*@modifies *g_msgstream@*/ ; + +extern void usymtab_prepareDump (void) + /*@modifies internalState@*/ ; + +extern void usymtab_dump (FILE *p_fout) + /*@globals internalState@*/ + /*@modifies *p_fout@*/ ; + + +extern void usymtab_load (FILE *p_f) /*@modifies p_f, internalState@*/ ; + +extern /*@exposed@*/ /*@dependent@*/ uentry + usymtab_getRefQuiet (int p_level, usymId p_index) + /*@globals internalState@*/ ; + +extern void usymtab_printLocal (void) + /*@globals internalState@*/ + /*@modifies stdout@*/ ; + +extern /*@exposed@*/ /*@dependent@*/ uentry usymtab_getParam (int p_paramno) + /*@globals internalState@*/; +extern void usymtab_free (void) /*@modifies internalState@*/ ; +extern bool usymtab_inDeepScope (void) /*@globals internalState@*/ ; + +extern /*@exposed@*/ uentry usymtab_lookupExpose (cstring p_k) + /*@globals internalState@*/ ; +extern /*@observer@*/ uentry usymtab_lookup (cstring p_k) + /*@globals internalState@*/ ; +# define usymtab_lookup(s) (usymtab_lookupExpose (s)) + +extern /*@observer@*/ uentry usymtab_lookupGlob (cstring p_k) + /*@globals internalState@*/ ; +extern /*@exposed@*/ uentry usymtab_lookupExposeGlob (cstring p_k) + /*@globals internalState@*/ ; +extern /*@observer@*/ uentry usymtab_lookupUnionTag (cstring p_k) + /*@globals internalState@*/ ; +extern /*@observer@*/ uentry usymtab_lookupStructTag (cstring p_k) + /*@globals internalState@*/ ; +extern /*@observer@*/ uentry usymtab_lookupEither (cstring p_k) + /*@globals internalState@*/ ; + +# ifndef NOLCL +extern ctype usymtab_lookupType (cstring p_k) + /*@globals internalState@*/ ; +# endif + +extern bool usymtab_isProbableNull (sRef p_s) + /*@globals internalState@*/ ; +extern bool usymtab_isProbableDeepNull (sRef p_s) + /*@globals internalState@*/ ; + +# ifndef NOLCL +extern usymId usymtab_supExposedTypeEntry (/*@only@*/ uentry p_e, bool p_dodef) + /*@modifies internalState, p_e@*/ ; +# endif + +extern ctype usymtab_supTypeEntry (/*@only@*/ uentry p_e) + /*@modifies internalState, p_e@*/ ; + +extern /*@exposed@*/ uentry usymtab_supReturnTypeEntry (/*@only@*/ uentry p_e) + /*@modifies internalState@*/ ; + +extern /*@observer@*/ uentry usymtab_lookupSafe (cstring p_k) + /*@globals internalState@*/ ; + +extern /*@observer@*/ uentry usymtab_getGlobalEntry (usymId p_uid) + /*@globals internalState@*/ ; + +extern bool usymtab_exists (cstring p_k) + /*@globals internalState@*/ ; + +# ifndef NOLCL +extern bool usymtab_existsVar (cstring p_k) + /*@globals internalState@*/ ; +# endif + +extern bool usymtab_existsGlob (cstring p_k) + /*@globals internalState@*/ ; + +extern bool usymtab_existsType (cstring p_k) + /*@globals internalState@*/ ; + +# ifndef NOLCL +extern bool usymtab_existsEither (cstring p_k) + /*@globals internalState@*/ ; +# endif + +extern bool usymtab_existsTypeEither (cstring p_k) + /*@globals internalState@*/ ; + +extern usymId usymtab_getId (cstring p_k) /*@globals internalState@*/ ; +extern usymId usymtab_getTypeId (cstring p_k) /*@globals internalState@*/ ; + +extern void usymtab_supEntry (/*@only@*/ uentry p_e) + /*@modifies internalState, p_e@*/ ; + +# ifndef NOLCL +extern void usymtab_replaceEntry (/*@only@*/ uentry p_s) + /*@modifies internalState, p_s@*/ ; +# endif + +extern void usymtab_supEntrySref (/*@only@*/ uentry p_e) + /*@modifies internalState, p_e@*/ ; + +extern void usymtab_supGlobalEntry (/*@only@*/ uentry p_e) + /*@modifies internalState@*/ ; + +extern void usymtab_addGlobalEntry (/*@only@*/ uentry p_e) + /*@modifies internalState, p_e@*/ ; + +extern /*@exposed@*/ uentry + usymtab_supEntryReturn (/*@only@*/ uentry p_e) + /*@modifies internalState, p_e@*/ ; + +extern usymId usymtab_addEntry (/*@only@*/ uentry p_e) + /*@modifies internalState, p_e@*/ ; + +extern ctype usymtab_lookupAbstractType (cstring p_k) + /*@globals internalState@*/ ; +extern bool usymtab_matchForwardStruct (usymId p_u1, usymId p_u2) + /*@globals internalState@*/ ; + +extern bool usymtab_existsEnumTag (cstring p_k) + /*@globals internalState@*/ ; +extern bool usymtab_existsUnionTag (cstring p_k) + /*@globals internalState@*/ ; +extern bool usymtab_existsStructTag (cstring p_k) + /*@globals internalState@*/ ; + +extern usymId usymId_fromInt (int p_i) /*@*/ ; +# define usymId_fromInt(i) ((usymId)(i)) + +extern bool usymId_isInvalid (usymId p_u) /*@*/ ; +# define usymId_isInvalid(u) ((u) == USYMIDINVALID) + +extern bool usymId_isValid (usymId p_u) /*@*/ ; +# define usymId_isValid(u) ((u) != USYMIDINVALID) + +extern bool typeId_isInvalid (typeId p_u) /*@*/ ; +# define typeId_isInvalid(u) ((u) == typeId_invalid) + +extern bool typeId_isValid (typeId p_u) /*@*/ ; +# define typeId_isValid(u) ((u) != typeId_invalid) + +extern bool typeId_equal (typeId p_u1, typeId p_u2) /*@*/ ; +# define typeId_equal(u1,u2) ((u1) == (u2)) + +extern typeId typeId_fromInt (int p_i); +# define typeId_fromInt(i) ((typeId)(i)) + +/*@iter usymtab_entries (sef usymtab u, yield exposed uentry el); @*/ +# define usymtab_entries(x, m_i) \ + { int m_ind; \ + if (usymtab_isDefined (x)) \ + for (m_ind = 0; m_ind < (x)->nentries; m_ind++) \ + { uentry m_i = (x)->entries[m_ind]; + +# define end_usymtab_entries }} + +extern /*@unused@*/ void usymtab_displayAllUses (void) + /*@globals internalState@*/ + /*@modifies *g_msgstream@*/ ; + +extern /*@unused@*/ void usymtab_printOut (void) + /*@globals internalState@*/ + /*@modifies *g_msgstream@*/ ; + +extern /*@unused@*/ void usymtab_printAll (void) + /*@globals internalState@*/ + /*@modifies *g_msgstream@*/ ; + +extern void usymtab_enterScope (void) + /*@modifies internalState;@*/ ; +extern void usymtab_enterFunctionScope (uentry p_fcn) + /*@modifies internalState;@*/ ; +extern void usymtab_quietExitScope (fileloc p_loc) + /*@modifies internalState;@*/ ; +extern void usymtab_exitScope (exprNode p_expr) /*@modifies internalState@*/ ; +extern void usymtab_addGuards (guardSet p_guards) /*@modifies internalState@*/ ; +extern void usymtab_setExitCode (exitkind p_ex) /*@modifies internalState@*/ ; +extern void usymtab_exitFile (void) /*@modifies internalState@*/ ; +extern void usymtab_enterFile (void) /*@modifies internalState@*/ ; + +extern /*@observer@*/ uentry usymtab_lookupEnumTag (cstring p_k) + /*@globals internalState@*/ ; + +extern usymId usymtab_convertId (usymId p_uid) /*@globals internalState@*/ ; +extern void usymtab_initMod (void) /*@modifies internalState@*/ ; +extern void usymtab_initBool (void) /*@modifies internalState@*/ ; + +extern void usymtab_exportHeader (void) + /*@modifies internalState@*/ ; + +extern ctype usymtab_structFieldsType (uentryList p_f) + /*@globals internalState@*/ ; + +extern ctype usymtab_unionFieldsType (uentryList p_f) + /*@globals internalState@*/ ; + +extern ctype usymtab_enumEnumNameListType (enumNameList p_f) + /*@globals internalState@*/ ; + +extern /*@exposed@*/ uentry usymtab_getTypeEntrySafe (usymId p_uid) + /*@globals internalState@*/ ; + +extern void usymtab_popOrBranch (exprNode p_pred, exprNode p_expr) + /*@modifies internalState@*/ ; +extern void usymtab_popAndBranch (exprNode p_pred, exprNode p_expr) + /*@modifies internalState@*/ ; + +extern void usymtab_trueBranch (/*@only@*/ guardSet p_guards) + /*@modifies internalState@*/ ; +extern void usymtab_altBranch (/*@only@*/ guardSet p_guards) + /*@modifies internalState@*/ ; + +extern void usymtab_popTrueBranch (exprNode p_pred, exprNode p_expr, clause p_cl) + /*@modifies internalState@*/ ; +extern void + usymtab_popTrueExecBranch (exprNode p_pred, exprNode p_expr, clause p_cl) + /*@modifies internalState@*/ ; + +extern void + usymtab_popBranches (exprNode p_pred, exprNode p_tbranch, exprNode p_fbranch, + bool p_isOpt, clause p_cl) + /*@modifies internalState@*/ ; + +extern void usymtab_unguard (sRef p_s) /*@modifies internalState@*/ ; +extern bool usymtab_isGuarded (sRef p_s) /*@globals internalState@*/ ; +extern void usymtab_printGuards (void) /*@globals internalState@*/ /*@modifies *g_msgstream@*/ ; +extern void usymtab_quietPlainExitScope (void) /*@modifies internalState@*/ ; +extern void usymtab_printComplete (void) /*@globals internalState@*/ /*@modifies *stdout@*/ ; + +# ifndef NOLCL +extern bool usymtab_existsGlobEither (cstring p_k) /*@globals internalState@*/ ; +# endif + +extern bool usymtab_isBoolType (usymId p_uid) /*@globals internalState@*/ ; +extern /*@only@*/ cstring + usymtab_getTypeEntryName (usymId p_uid) + /*@globals internalState@*/ ; +extern /*@exposed@*/ uentry usymtab_getTypeEntry (usymId p_uid) + /*@globals internalState@*/ ; + +extern usymId + usymtab_supAbstractTypeEntry (/*@only@*/ uentry p_e, bool p_dodef) + /*@modifies internalState, p_e@*/ ; +extern ctype usymtab_supForwardTypeEntry (/*@only@*/ uentry p_e) + /*@modifies internalState, p_e@*/ ; + +extern /*@exposed@*/ uentry + usymtab_supGlobalEntryReturn (/*@only@*/ uentry p_e) + /*@modifies internalState, p_e@*/ ; + +extern /*@exposed@*/ uentry + usymtab_supEntrySrefReturn (/*@only@*/ uentry p_e) + /*@modifies internalState, p_e@*/ ; + +extern int uentry_directParamNo (uentry p_ue) + /*@globals internalState@*/ ; + +extern bool usymtab_newCase (exprNode p_pred, exprNode p_last) + /*@modifies internalState@*/ ; + +extern void usymtab_switchBranch (exprNode p_s) + /*@modifies internalState@*/ ; + +extern /*@only@*/ cstring usymtab_unparseStack (void) + /*@globals internalState@*/ ; +extern void usymtab_exitSwitch (exprNode p_sw, bool p_allpaths) + /*@modifies internalState@*/ ; + +extern /*@observer@*/ uentry usymtab_lookupGlobSafe (cstring p_k) + /*@globals internalState@*/ ; + +extern /*@only@*/ sRefSet usymtab_aliasedBy (sRef p_s) + /*@globals internalState@*/ ; + +extern /*@only@*/ sRefSet usymtab_canAlias (sRef p_s) + /*@globals internalState@*/ ; + +extern void usymtab_clearAlias (sRef p_s) + /*@modifies internalState, p_s@*/ ; + +extern void usymtab_addMustAlias (sRef p_s, sRef p_al) + /*@modifies internalState@*/ ; + +extern void usymtab_addForceMustAlias (sRef p_s, sRef p_al) + /*@modifies internalState@*/ ; + +extern /*@only@*/ cstring usymtab_unparseAliases (void) + /*@globals internalState@*/ ; + +extern /*@exposed@*/ uentry + usymtab_supReturnFileEntry (/*@only@*/ uentry p_e) + /*@modifies internalState@*/ ; + +extern bool usymtab_isAltProbablyDeepNull (sRef p_s) + /*@globals internalState@*/ ; + +extern bool usymtab_existsReal (cstring p_k) + /*@globals internalState@*/ ; + +extern /*@only@*/ sRefSet usymtab_allAliases (sRef p_s) + /*@globals internalState@*/ ; + +extern void usymtab_exportLocal (void) + /*@modifies internalState@*/ ; + +extern void usymtab_popCaseBranch (void) + /*@modifies internalState@*/ ; + +/* special scopes */ + +/*@constant int globScope;@*/ +# define globScope 0 /* global variables */ + +/*@constant int fileScope;@*/ +# define fileScope 1 /* file-level static variables */ + +/*@constant int paramsScope;@*/ +# define paramsScope 2 /* function parameters */ + +/*@constant int functionScope;@*/ +# define functionScope 3 + +extern /*@falsenull@*/ bool usymtab_isDefined (usymtab p_u) /*@*/ ; + +/*@constant null usymtab usymtab_undefined; @*/ +# define usymtab_undefined ((usymtab)NULL) +# define usymtab_isDefined(u) ((u) != usymtab_undefined) + +extern void usymtab_checkDistinctName (uentry p_e, int p_scope) + /*@globals internalState@*/ + /*@modifies *g_msgstream, p_e@*/ ; + +# else +# error "Multiple include" +# endif + + + diff --git a/src/Headers/usymtab_interface.h b/src/Headers/usymtab_interface.h new file mode 100644 index 0000000..929ac60 --- /dev/null +++ b/src/Headers/usymtab_interface.h @@ -0,0 +1,45 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +# ifndef USYMTAB_INTERFACE_H +# define USYMTAB_INTERFACE_H + +# ifdef NOLCL +# error "Bad include" +# endif + +extern void doDeclareConstant (constDeclarationNode, bool); +extern void doDeclareVar (varDeclarationNode, bool); +extern void doDeclareType (typeNode, bool); +extern void doDeclareFcn (fcnNode p_f, typeId p_tn, bool p_priv, bool p_spec); +extern void declareIter (iterNode p_iter); + +extern void declareConstant (constDeclarationNode); +extern void declareVar (varDeclarationNode); +extern void declareType (typeNode); +extern void declareFcn (fcnNode p_f, typeId p_t); + +extern void declarePrivConstant (constDeclarationNode); +extern void declarePrivVar (varDeclarationNode); +extern void declarePrivType (typeNode); +extern void declarePrivFcn (fcnNode p_f, typeId p_t); + +# define declareConstant(c) doDeclareConstant(c, FALSE) +# define declareVar(c) doDeclareVar(c, FALSE) +# define declareType(c) doDeclareType(c, FALSE) +# define declareFcn(f, t) doDeclareFcn(f, t, FALSE, TRUE) + +# define declarePrivConstant(c) doDeclareConstant(c, TRUE) +# define declarePrivVar(c) doDeclareVar(c, TRUE) +# define declarePrivType(c) doDeclareType(c, TRUE) +# define declarePrivFcn(f, t) doDeclareFcn(f, t, TRUE, TRUE) + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/varDeclarationNode.h b/src/Headers/varDeclarationNode.h new file mode 100644 index 0000000..8d54dce --- /dev/null +++ b/src/Headers/varDeclarationNode.h @@ -0,0 +1,26 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +# ifndef VARDECLNODE_H +# define VARDECLNODE_H + +typedef struct _varDeclarationNode { + bool isSpecial; + /*@reldef@*/ sRef sref; + bool isGlobal; /* global or varDeclaration */ + bool isPrivate; /* static variable, within a function defn */ + qualifierKind qualifier; /* QLF_NONE, QLF_CONST, or QLF_VOLATILE */ + lclTypeSpecNode type; + initDeclNodeList decls; +} *varDeclarationNode; + +extern void varDeclarationNode_free (/*@only@*/ /*@null@*/ varDeclarationNode p_x); +extern /*@unused@*/ /*@only@*/ cstring + varDeclarationNode_unparse (/*@null@*/ varDeclarationNode p_x) /*@*/; + +# else +# error "Multiple include" +# endif + diff --git a/src/Headers/varDeclarationNodeList.h b/src/Headers/varDeclarationNodeList.h new file mode 100644 index 0000000..b139aa1 --- /dev/null +++ b/src/Headers/varDeclarationNodeList.h @@ -0,0 +1,44 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +# ifndef VARDECLARATIONNODELIST_H +# define VARDECLARATIONNODELIST_H + +typedef /*@only@*/ varDeclarationNode o_varDeclarationNode; + +abst_typedef struct _varDeclarationNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_varDeclarationNode *elements; +} *varDeclarationNodeList ; + +/*@iter varDeclarationNodeList_elements (sef varDeclarationNodeList x, yield exposed varDeclarationNode el); @*/ +# define varDeclarationNodeList_elements(x, m_el) \ + { int m_ind; varDeclarationNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { varDeclarationNode m_el = *(m_elements++); + +# define end_varDeclarationNodeList_elements }} + +extern /*@only@*/ varDeclarationNodeList varDeclarationNodeList_new (void) /*@*/ ; +extern void + varDeclarationNodeList_addh (varDeclarationNodeList p_s, + /*@keep@*/ varDeclarationNode p_el) + /*@modifies p_s@*/ ; + +extern /*@only@*/ cstring varDeclarationNodeList_unparse (varDeclarationNodeList p_s) /*@*/ ; +extern void varDeclarationNodeList_free (/*@only@*/ varDeclarationNodeList p_s) ; + +/*@constant int varDeclarationNodeListBASESIZE;@*/ +# define varDeclarationNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/varKinds.h b/src/Headers/varKinds.h new file mode 100644 index 0000000..5c256ff --- /dev/null +++ b/src/Headers/varKinds.h @@ -0,0 +1,250 @@ +/* +** varKinds.h +*/ + +# ifndef VARKINDSH +# define VARKINDSH + +/* +** states of storage +*/ + +typedef enum { + SS_UNKNOWN, + SS_UNUSEABLE, /* cannot use (unallocated pointer reference) */ + SS_UNDEFINED, /* cannot use value (e.g., unbound variable) */ + SS_MUNDEFINED,/* maybe undefined */ + SS_ALLOCATED, /* allocated pointer */ + SS_PDEFINED, /* partially defined: must check reachable values */ + SS_DEFINED, /* completely defined: can use value and all reachable values */ + SS_PARTIAL, /* defined, but can be bashed without error (partial structure returned) */ + SS_DEAD, /* cannot use (after giving aways as only) + * same meaning as UNUSEABLE, except that we + * want to generate better error messages. */ + SS_HOFFA, /* "probably dead" */ + SS_FIXED, /* cannot modify */ + SS_RELDEF, /* a structure field that may or may not be defined (up to + * programmer to worry about it. */ + + SS_UNDEFGLOB, /* global only: undefined before call */ + SS_KILLED, /* global only: undefined after call */ + SS_UNDEFKILLED, /* global only: undefined before and after call */ + + SS_SPECIAL, /* marker for uses/defines/allocates/releases-specified */ + + SS_LAST +} sstate; + +typedef enum { + SCNONE, + SCEXTERN, + SCSTATIC +} storageClassCode ; + +typedef enum _nstate { + NS_ERROR = -1, /* error (suppress messages) */ + NS_UNKNOWN = 0, /* no annotation */ + NS_NOTNULL, /* definitely not null */ + NS_MNOTNULL, /* marked with notnull */ + + /* perhaps null */ + NS_RELNULL, /* relaxed null --- okay null for set, not null for checking */ + NS_CONSTNULL, /* null constant (for abstract types) */ + + /* don't change the order! */ /* possibly null */ + NS_POSNULL, /* possibly null */ + NS_DEFNULL, /* definitely null */ + NS_ABSNULL /* null from abstract type definition (concrete type unknown) */ +} nstate; + +extern bool nstate_isKnown (nstate p_n) /*@*/ ; +# define nstate_isKnown(n) ((n) != NS_UNKNOWN) + +/* +** aliasing states +*/ + +/* +** HEY STUPID! Don't switch around the order! +** +** These numbers are fixed into the library format. If the order +** changes, remember to remake all libraries! +*/ + +typedef enum { + AK_UNKNOWN = 0, /* AK_UNKNOWN must be first */ + AK_ERROR, + AK_ONLY, + AK_IMPONLY, + AK_KEEP, + AK_KEPT, + AK_TEMP, + AK_IMPTEMP, + AK_SHARED, + AK_UNIQUE, + AK_RETURNED, + AK_FRESH, /* local only storage (may be shared) */ + AK_STACK, /* allocated on local stack */ + AK_REFCOUNTED, + AK_REFS, + AK_KILLREF, + AK_NEWREF, + AK_OWNED, + AK_DEPENDENT, + AK_IMPDEPENDENT, + AK_STATIC, + AK_LOCAL /* AK_LOCAL must be last */ +} alkind; + +typedef enum { + XO_UNKNOWN, + XO_NORMAL, + XO_EXPOSED, + XO_OBSERVER +} exkind; + +extern bool sstate_isKnown (sstate p_s) /*@*/ ; +# define sstate_isKnown(s) ((s) != SS_UNKNOWN) + +extern bool sstate_isUnknown (sstate p_s) /*@*/ ; +# define sstate_isUnknown(s) ((s) == SS_UNKNOWN) + +extern bool exkind_isUnknown (exkind p_e) /*@*/ ; +# define exkind_isUnknown(e) ((e) == XO_UNKNOWN) + +extern bool exkind_isKnown (/*@sef@*/ exkind p_e) /*@*/ ; +# define exkind_isKnown(e) ((e) != XO_UNKNOWN && (e) != XO_NORMAL) + +extern bool alkind_isImplicit (/*@sef@*/ alkind p_a) /*@*/ ; +extern bool alkind_isDependent (/*@sef@*/ alkind p_a) /*@*/ ; +extern bool alkind_isOnly (/*@sef@*/ alkind p_a) /*@*/ ; +extern bool alkind_isTemp (/*@sef@*/ alkind p_a) /*@*/ ; + +# define alkind_isImplicit(a) (((a) == AK_IMPONLY || (a) == AK_IMPDEPENDENT \ + || (a) == AK_IMPTEMP)) +# define alkind_isDependent(a) (((a) == AK_DEPENDENT || (a) == AK_IMPDEPENDENT)) +# define alkind_isOnly(a) ((a) == AK_ONLY || (a) == AK_IMPONLY) +# define alkind_isTemp(a) (((a) == AK_TEMP || (a) == AK_IMPTEMP)) + +extern bool alkind_equal (alkind p_a1, alkind p_a2) /*@*/ ; + +extern bool alkind_isOwned (alkind p_a) /*@*/ ; +extern bool alkind_isStack (alkind p_a) /*@*/ ; +extern bool alkind_isStatic (alkind p_a) /*@*/ ; +extern bool alkind_isKeep (alkind p_a) /*@*/ ; +extern bool alkind_isKept (alkind p_a) /*@*/ ; +extern bool alkind_isUnique (alkind p_a) /*@*/ ; +extern bool alkind_isError (alkind p_a) /*@*/ ; +extern bool alkind_isFresh (alkind p_a) /*@*/ ; +extern bool alkind_isShared (alkind p_a) /*@*/ ; +extern bool alkind_isLocal (alkind p_a) /*@*/ ; +extern bool alkind_isKnown (alkind p_a) /*@*/ ; +extern bool alkind_isUnknown (alkind p_a) /*@*/ ; +extern bool alkind_isRefCounted (alkind p_a) /*@*/ ; +extern /*@unused@*/ bool alkind_isRefs (alkind p_a) /*@*/ ; +extern bool alkind_isNewRef (alkind p_a) /*@*/ ; +extern bool alkind_isKillRef (alkind p_a) /*@*/ ; + +# define alkind_isOwned(a) ((a) == AK_OWNED) +# define alkind_isStack(a) ((a) == AK_STACK) +# define alkind_isStatic(a) ((a) == AK_STATIC) +# define alkind_isKeep(a) ((a) == AK_KEEP) +# define alkind_isKept(a) ((a) == AK_KEPT) +# define alkind_isUnique(a) ((a) == AK_UNIQUE) +# define alkind_isError(a) ((a) == AK_ERROR) +# define alkind_isFresh(a) ((a) == AK_FRESH) +# define alkind_isShared(a) ((a) == AK_SHARED) +# define alkind_isLocal(a) ((a) == AK_LOCAL) +# define alkind_isKnown(a) ((a) != AK_UNKNOWN) +# define alkind_isUnknown(a) ((a) == AK_UNKNOWN) +# define alkind_isRefCounted(a) ((a) == AK_REFCOUNTED) +# define alkind_isRefs(a) ((a) == AK_REFS) +# define alkind_isNewRef(a) ((a) == AK_NEWREF) +# define alkind_isKillRef(a) ((a) == AK_KILLREF) + +extern /*@observer@*/ cstring sstate_unparse (sstate p_s) /*@*/ ; + +extern alkind alkind_fromQual (qual p_q) /*@*/ ; +extern alkind alkind_derive (alkind p_outer, alkind p_inner) /*@*/ ; +extern /*@observer@*/ cstring alkind_unparse (alkind p_a) /*@*/ ; +extern /*@observer@*/ cstring alkind_capName (alkind p_a) /*@*/ ; +extern alkind alkind_fromInt (int p_n) /*@*/ ; +extern nstate nstate_fromInt (int p_n) /*@*/ ; +extern /*@observer@*/ cstring nstate_unparse (nstate p_n) /*@*/ ; +extern int nstate_compare (nstate p_n1, nstate p_n2) /*@*/ ; +extern bool nstate_possiblyNull (nstate p_n) /*@*/ ; +extern bool nstate_perhapsNull (nstate p_n) /*@*/ ; +extern sstate sstate_fromInt (int p_n) /*@*/ ; +extern exkind exkind_fromInt (int p_n) /*@*/ ; +extern exkind exkind_fromQual (qual p_q) /*@*/ ; +extern /*@observer@*/ cstring exkind_unparse (exkind p_a) /*@*/ ; +extern /*@observer@*/ cstring exkind_capName (exkind p_a) /*@*/ ; +extern /*@observer@*/ cstring exkind_unparseError (exkind p_a) /*@*/ ; +extern sstate sstate_fromQual (qual p_q) /*@*/ ; +extern bool alkind_compatible (alkind p_a1, alkind p_a2) /*@*/ ; +extern alkind alkind_fixImplicit (alkind p_a) /*@*/ ; + +typedef enum _exitkind +{ + XK_ERROR, + XK_UNKNOWN, + XK_NEVERESCAPE, + XK_GOTO, + XK_MAYGOTO, + XK_MAYEXIT, + XK_MUSTEXIT, + XK_TRUEEXIT, + XK_FALSEEXIT, + XK_MUSTRETURN, + XK_MAYRETURN, + XK_MAYRETURNEXIT, + XK_MUSTRETURNEXIT /* must return or exit */ +} exitkind; + +/*@constant exitkind XK_LAST; @*/ +# define XK_LAST XK_MUSTRETURNEXIT + +extern exitkind exitkind_fromQual (qual p_q) /*@*/ ; +extern /*@unused@*/ bool exitkind_isMustExit (exitkind p_e) /*@*/ ; +# define exitkind_isMustExit(e) ((e) == XK_MUSTEXIT) + +extern bool exitkind_equal (exitkind p_e1, exitkind p_e2) /*@*/ ; +# define exitkind_equal(e1,e2) ((e1) == (e2)) + +extern bool exitkind_couldExit (exitkind p_e) /*@*/ ; +extern bool exitkind_couldEscape (exitkind p_e) /*@*/ ; +extern exitkind exitkind_fromInt (int p_x) /*@*/ ; +extern /*@observer@*/ cstring exitkind_unparse (exitkind p_k) /*@*/ ; + +extern bool exitkind_isKnown (exitkind p_e) /*@*/ ; +# define exitkind_isKnown(e) ((e) != XK_UNKNOWN) + +extern bool exitkind_isTrueExit (exitkind p_e) /*@*/ ; +# define exitkind_isTrueExit(e) \ + ((e) == XK_TRUEEXIT) + +extern bool exitkind_isConditionalExit (/*@sef@*/ exitkind p_e) /*@*/ ; +# define exitkind_isConditionalExit(e) \ + ((e) == XK_TRUEEXIT || (e) == XK_FALSEEXIT) + +extern bool exitkind_isError (/*@sef@*/ exitkind p_e) /*@*/ ; +# define exitkind_isError(e) ((e) == XK_ERROR) + +extern bool exitkind_mustExit (/*@sef@*/ exitkind p_e) /*@*/ ; +# define exitkind_mustExit(e) ((e) == XK_MUSTEXIT) + +extern bool exitkind_mustEscape (/*@sef@*/ exitkind p_e) /*@*/ ; +# define exitkind_mustEscape(e) \ + ((e) == XK_MUSTEXIT || (e) == XK_MUSTRETURN \ + || (e) == XK_MUSTRETURNEXIT || (e) == XK_GOTO) + +extern exitkind exitkind_makeConditional (exitkind p_k) /*@*/ ; +extern exitkind exitkind_combine (exitkind p_k1, exitkind p_k2) /*@*/ ; + +/* +** NOTE: combiners are in sRef +*/ + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/varNode.h b/src/Headers/varNode.h new file mode 100644 index 0000000..b6688d0 --- /dev/null +++ b/src/Headers/varNode.h @@ -0,0 +1,21 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +# ifndef VARNODE_H +# define VARNODE_H + +typedef struct _varNode { /* with sort, useful in quantified */ + ltoken varid; + bool isObj; + lclTypeSpecNode type; + sort sort; +} *varNode; + +extern varNode varNode_copy (varNode p_x); +extern void varNode_free (/*@only@*/ /*@null@*/ varNode p_x); + +# else +# error "Multiple include" +# endif diff --git a/src/Headers/varNodeList.h b/src/Headers/varNodeList.h new file mode 100644 index 0000000..9c789ed --- /dev/null +++ b/src/Headers/varNodeList.h @@ -0,0 +1,42 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +# ifndef VARNODELIST_H +# define VARNODELIST_H + +typedef /*@only@*/ varNode o_varNode; + +abst_typedef struct _varNodeList +{ + int nelements; + int nspace; + /*@reldef@*/ /*@relnull@*/ o_varNode *elements; +} *varNodeList; + +/*@iter varNodeList_elements (sef varNodeList x, yield exposed varNode el); @*/ +# define varNodeList_elements(x, m_el) \ + { int m_ind; varNode *m_elements = &((x)->elements[0]); \ + for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \ + { varNode m_el = *(m_elements++); + +# define end_varNodeList_elements }} + +extern /*@only@*/ varNodeList varNodeList_new(void); +extern varNodeList varNodeList_add (/*@returned@*/ varNodeList p_s, /*@only@*/ varNode p_el) ; + +extern varNodeList varNodeList_copy (varNodeList p_s); + +extern /*@only@*/ cstring varNodeList_unparse (varNodeList p_s) ; +extern void varNodeList_free (/*@only@*/ varNodeList p_s) ; + +/*@constant int varNodeListBASESIZE;@*/ +# define varNodeListBASESIZE SMALLBASESIZE + +# else +# error "Multiple include" +# endif + + + + diff --git a/src/Headers/version.h b/src/Headers/version.h new file mode 100644 index 0000000..319e832 --- /dev/null +++ b/src/Headers/version.h @@ -0,0 +1,23 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ +/* +** version.h +*/ + +# ifndef VERSION_H +# define VERSION_H + +/*@constant observer char *LCLINT_MAINTAINER; @*/ +# define LCLINT_MAINTAINER "lclint-bug@cs.virginia.edu" + +/*@constant observer char *CPP_VERSION;@*/ +# define CPP_VERSION "cygnus-2.7.2-970404" + +# else +# error "Multiple include" +# endif + + + diff --git a/src/Headers/ynm.h b/src/Headers/ynm.h new file mode 100644 index 0000000..d340949 --- /dev/null +++ b/src/Headers/ynm.h @@ -0,0 +1,37 @@ +/* +** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2000. +** See ../LICENSE for license information. +*/ + +# if !defined(YNM_H) +# define YNM_H + +typedef enum { NO, YES, MAYBE } ynm; + +extern /*@observer@*/ cstring ynm_unparse (/*@sef@*/ ynm p_b) /*@*/ ; +extern /*@observer@*/ cstring ynm_unparseCode (/*@sef@*/ ynm p_b) /*@*/ ; +extern bool ynm_toBoolStrict (ynm p_b) /*@*/ ; +extern bool ynm_toBoolRelaxed (ynm p_b) /*@*/ ; +extern ynm ynm_fromBool (bool p_b) /*@*/ ; +extern bool ynm_isOff (ynm p_b) /*@*/ ; +extern bool ynm_isOn (ynm p_b) /*@*/ ; +extern bool ynm_isMaybe (ynm p_b) /*@*/ ; +extern int ynm_compare (ynm p_x, ynm p_y) /*@*/ ; +extern ynm ynm_fromCodeChar (char p_c) /*@*/ ; + +# define ynm_unparse(b) \ + (cstring_makeLiteralTemp (((b) == NO) ? "no" : ((b) == YES) ? "yes" : "maybe")) +# define ynm_unparseCode(b) \ + (cstring_makeLiteralTemp (((b) == NO) ? "-" : ((b) == YES) ? "+" : "=")) + +# define ynm_toBoolStrict(y) ((y) == YES) +# define ynm_toBoolRelaxed(y) ((y) != NO) +# define ynm_fromBool(b) ((b) ? YES : NO) +# define ynm_isOff(y) ((y) == NO) +# define ynm_isOn(y) ((y) == YES) +# define ynm_isMaybe(y) ((y) == MAYBE) + +# else +# error "Multiple include" +# endif + diff --git a/src/LICENSE b/src/LICENSE new file mode 100644 index 0000000..5f7cb49 --- /dev/null +++ b/src/LICENSE @@ -0,0 +1 @@ +See ../LICENSE for licensing information. diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..5d7b111 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,307 @@ +################################################## +### +### Makefile for LCLint +### +### designed for use with gmake (GNU make) +### +### original version based on LCL Makefile +### completely revised December 1993 +### revised for 1.4a, November 1994 +### revised for 2.0, February 1996 +### revised for 2.2, August 1996 +### +### This file should not need to be edited. +### +### Compilers and tools set using the top-level Makefile override settings +### in this file when make is run from the top directory. +### +### Commands: +### +### make all +### builds a release version of lclint from scratch using optimizations +### +### make quick +### builds a local version of lclint (no optimizations) +### (does not remake files) +### +### make test +### runs the test suite +### (must have installed test suite from lclint.test.tar.Z) +### + +.SUFFIXES : .h .c .o .l .check +.PHONY : all dorerelease retest rerelease homeversion +.IGNORE : dorerelease retest rerelease + +### +### system information (compilers, flags, directories, etc.) +### + +include Makefile.sys + +### +### check files before compiling +### (can't be 1 unless you have lclint already!) +### + +CHECK = 0 + +### +### source files +### + +include Makefile.sources + +### +### top level +### + +all : dorelease + +quick: lclint + +lclint : $(OBJ) + @echo '// ' + @echo '// Linking:' + @echo '// ' + $(CC) -o lclint $(OBJ) $(LINKFLAGS) + +### +### grammars +### + +### +### -p xx flag to bison renames yyparse ==> xxparse, xxlex ==> xxlex +### this is probably NOT compatible with yacc. +### + +signature.c : signature.c.der signature.y +ifdef BISON + @$(BISON) $(YFLAGS) -p lsl signature.y + @$(CAT) bison.head signature.tab.c > signature.c + @$(MV) Headers/signature_gen.h Headers/signature_gen.bak + @$(CAT) bison.head signature.tab.h > Headers/signature_gen.h +else + $(CP) signature.c.der signature.c +endif + +cgrammar.c : cgrammar.c.der cgrammar.y +ifdef BISON + $(BISON) $(YFLAGS) cgrammar.y + @echo '// Expect 119 shift/reduce conflicts and 114 reduce/reduce conflicts.' + @echo '// (see cgrammar.y for explanation)' + @$(CAT) bison.head cgrammar.tab.c > cgrammar.c + @$(MV) Headers/cgrammar_tokens.h Headers/cgrammar_tokens.bak + @$(CAT) bison.head cgrammar.tab.h > Headers/cgrammar_tokens.h +else + $(CP) cgrammar.c.der cgrammar.c +endif + +### llgrammar2.h is necessary so +singleinclude may be used + +llgrammar.c : llgrammar.c.der llgrammar.y +ifdef BISON + $(BISON) $(YFLAGS) -p yl llgrammar.y + @echo '// Expect 2 shift/reduce conflicts.' + @$(CAT) bison.head llgrammar.tab.c > llgrammar.c + @$(MV) Headers/llgrammar_gen2.h Headers/llgrammar_gen2.bak + @$(CAT) bison.head llgrammar.tab.h > Headers/llgrammar_gen2.h + @$(MV) Headers/llgrammar_gen.h Headers/llgrammar_gen.bak + @$(CAT) bison.head llgrammar.tab.h > Headers/llgrammar_gen.h +else + $(CP) llgrammar.c.der llgrammar.c +endif + +cscanner.c : cscanner.c.der cscanner.l +ifdef FLEX + $(FLEX) $(LFLAGS) cscanner.l + $(CAT) flex.head lex.yy.c > cscanner.c +else + $(CP) cscanner.c.der cscanner.c +endif + +### +### compile without warnings +### + +signature.o : signature.c + $(CC) $(CPPFLAGS) -c $*.c + +cgrammar.o : cgrammar.c + $(CC) $(CPPFLAGS) -c $*.c + +llgrammar.o : llgrammar.c + $(CC) $(CPPFLAGS) -c $*.c + +cscanner.o : cscanner.c + $(CC) $(CPPFLAGS) -c $*.c + +### +### header files dependant on grammars +### + +Headers/signature2.h : signature.c +Headers/cgrammar2.h : cgrammar.c +Headers/llgrammar.h : llgrammar.c + +### +### defaults +### + +### Flags for checking a single file +SINGLEFLAGS = +neverinclude -supcounts +partial -showsummary -load lclint.lcd + +.c.check: lclint.lcd lclint + $(LCLINT) $(LINTFLAGS) $(SINGLEFLAGS) $*.c + +.c.o: +ifeq ($(CHECK), 1) + $(LCLINT) $(LINTFLAGS) $(SINGLEFLAGS) $*.c +endif + @echo '// Compiling '$*.c' / compiled: '`$(OFILES)`' (of 120 files)' + @$(CC) $(CFLAGS) -c $*.c + +### +### alternatives (tests, releases, backups, etc.) +### + +### -e option makes environment variables take precedence + +.PHONY : test quicktest opt up + +opt : +ifneq (,$(findstring csh, $(SHELL))) + setenv CC '$(CCOPT)' ; $(MAKE) -e lclint +else + CC="$(CCOPT)" ; export CC ; $(MAKE) -e lclint +endif + +updateversion: + @$(MV) Headers/herald.h Headers/herald.last + @echo '/* herald.h - created automatically by gmake updateversion */' > Headers/herald.h + @echo '/*@constant observer char *LCL_VERSION;@*/' >> Headers/herald.h + @echo '# define LCL_VERSION "LCLint '`cat $(VERSION_NUMBER)`' --- '`cat DATE`'"' \ + >> Headers/herald.h + @echo '/*@constant observer char *LCL_PARSE_VERSION;@*/' >> Headers/herald.h + @echo '# define LCL_PARSE_VERSION "LCLint '`cat $(VERSION_NUMBER)`'"' \ + >> Headers/herald.h + @echo '/*@constant observer char *LCL_COMPILE;@*/' >> Headers/herald.h + @echo '# define LCL_COMPILE "Compiled using '$(CC)' on '`uname -a`' by '`whoami`'"' >> Headers/herald.h + +localconstants: + @$(MV) Headers/local_constants.h Headers/local_constants.last + @echo '/* local_constants.h - created automatically by gmake localconstants */' \ + > Headers/local_constants.h +ifndef SYSTEM_LIBDIR + @echo '*** Fatal Error: SYSTEM_LIBDIR not defined.' +else + @echo '/*@constant observer char *SYSTEM_LIBDIR;@*/' >> Headers/local_constants.h + @echo '# define SYSTEM_LIBDIR $(SYSTEM_LIBDIR)' >> Headers/local_constants.h +ifndef DEFAULT_LARCHPATH + @echo '*** Fatal Error: DEFAULT_LARCHPATH not defined.' +else + @echo '/*@constant observer char *DEFAULT_LARCHPATH;@*/' >> Headers/local_constants.h + @echo '# define DEFAULT_LARCHPATH $(DEFAULT_LARCHPATH)' >> Headers/local_constants.h +ifndef DEFAULT_LCLIMPORTDIR + @echo '*** Fatal Error: DEFAULT_LARCHPATH not defined.' +else + @echo '/*@constant observer char *DEFAULT_LCLIMPORTDIR;@*/' >> Headers/local_constants.h + @echo '# define DEFAULT_LCLIMPORTDIR $(DEFAULT_LCLIMPORTDIR)' >> Headers/local_constants.h +endif +endif +endif + +dorelease: + @echo '// ' + @echo '// Making LCLint' + @echo '// Version '`cat $(VERSION_NUMBER)` + @echo '// ' + @echo '// Compiler: '$(CCOPT) +ifdef BISON + @echo '// Bison: '$(BISON) +else + @echo '// Use derived bison files' +endif +ifdef FLEX + @echo '// Flex: '$(FLEX) +else + @echo '// Use derived flex files' +endif + @echo '// Default cpp command: '$(DEFAULT_CPPCMD) + @echo '// System include directory: '$(SYSTEM_LIBDIR) + @echo '// Default Larch path: '$(DEFAULT_LARCHPATH) + @echo '// Default imports directory: '$(DEFAULT_LCLIMPORTDIR) + @echo '// ' + @echo '// Updating version information' + @$(MAKE) -e updateversion + @echo '// Updating local constants' + @$(MAKE) -e localconstants + @echo '// ' + @echo '// Compiling:' + @echo '// ' + @$(MAKE) -e opt + @echo '// Done Release '`cat $(VERSION_NUMBER)` + +### +### cleaning +### +### Standard entries to remove files from the directories +### up --- remove .o files and grammar derivatives +### tidy --- eliminate unwanted files +### clean --- delete derived files, except for spec-derived files +### pristine --- delete all derived files +### + +.PHONY .IGNORE : up tidy clean pristine + +pristine: clean + -$(RM) -f *.lcs *.lslo + +clean: tidy + -$(RM) core lclint + -$(RM) *.out *.output *.bib *.dvi *.idx *.log *.o *.toc + -$(RM) cgrammar.c cscanner.c + -$(RM) test* Headers/*~ Headers/#* + +tidy: + -$(RM) ,* .,* *.CKP *.BAK .emacs_[0-9]* core a.out *.*~ + +up: + -$(RM) cgrammar.c llgrammar.c signature.c cscanner.c + -$(RM) *.o + +### +### dependancies +### + +depend: + $(MAKEDEPEND) $(CINCLUDES) $(CFLAGS) -f Makefile.depend $(SRC) $(GRAMS) + +### +### analysing dependancies takes a long time and doesn't work terribly +### well, so the are NOT included here. NOTE carefully, this means if a +### header file is changed manual recompilation may be necessary. +### + +### include Makefile.depend + +### +### LCLint checking +### + +### +### A library is used for the specifications +### + +$(CHECKS): lclint.lcd + +### +### other flags are in .lclintrc file +### + +lint: + $(LCLINT) -f lclint.lclintrc $(CPPFLAGS) +singleinclude $(ALLSRC) -dump lclint + + + + diff --git a/src/Makefile.depend.real b/src/Makefile.depend.real new file mode 100644 index 0000000..d94a06f --- /dev/null +++ b/src/Makefile.depend.real @@ -0,0 +1,261 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. + +cstring.o: Headers/general.h +cstring.o: Headers/cstring.h +cstring.o: Headers/bool.h +fileloc.o: Headers/general.h +fileloc.o: Headers/cstring.h +fileloc.o: Headers/bool.h Headers/misc.h Headers/fileloc.h Headers/message.h +fileloc.o: Headers/globals.h Headers/context.h +fileloc.o: Headers/flag_codes.h Headers/coderegionList.h Headers/coderegion.h +fileloc.o: Headers/llbasic.h Headers/basic.h Headers/llerror.h +fileloc.o: Headers/LSLSymbol_type.h Headers/token.h Headers/LSLToken_type.h +fileloc.o: Headers/simp_message.h Headers/code.h Headers/source.h +fileloc.o: Headers/mapping.h Headers/sort.h Headers/Sort_type.h +fileloc.o: Headers/ctypes.h Headers/abstract.h Headers/leaf.h +fileloc.o: Headers/leafList.h Headers/importNode.h Headers/importNodeList.h +fileloc.o: Headers/SortList.h Headers/LSLSymbolList.h Headers/LSLSymbolSet.h +fileloc.o: Headers/SortSet.h Headers/pairNode.h Headers/pairNodeList.h +fileloc.o: Headers/paramNode.h Headers/paramNodeList.h +fileloc.o: Headers/declaratorInvNode.h Headers/declaratorInvNodeList.h +fileloc.o: Headers/typeExpr.h Headers/declaratorNode.h +fileloc.o: Headers/declaratorNodeList.h Headers/arrayQualNode.h +fileloc.o: Headers/varNode.h Headers/varNodeList.h Headers/quantifierNode.h +fileloc.o: Headers/quantifierNodeList.h Headers/storeRefNode.h +fileloc.o: Headers/storeRefNodeList.h Headers/modifyNode.h +fileloc.o: Headers/letDeclNode.h Headers/letDeclNodeList.h +fileloc.o: Headers/programNode.h Headers/programNodeList.h +fileloc.o: Headers/literalNode.h Headers/lclPredicateNode.h +fileloc.o: Headers/exposedNode.h Headers/constDeclNode.h +fileloc.o: Headers/constDeclNodeList.h Headers/CTypesNode.h +fileloc.o: Headers/constDeclarationNode.h Headers/initDeclNode.h +fileloc.o: Headers/initDeclNodeList.h Headers/varDeclarationNode.h +fileloc.o: Headers/varDeclarationNodeList.h Headers/globalList.h +fileloc.o: Headers/claimNode.h Headers/fcnNode.h Headers/fcnNodeList.h +fileloc.o: Headers/abstBodyNode.h Headers/abstractNode.h +fileloc.o: Headers/structDeclNode.h Headers/structDeclNodeList.h +fileloc.o: Headers/taggedUnionNode.h Headers/typeNode.h +fileloc.o: Headers/structOrUnionNode.h Headers/enumSpecNode.h +fileloc.o: Headers/lclTypeSpecNode.h Headers/typeNamePack.h +fileloc.o: Headers/typeNameNode.h Headers/typeNameNodeList.h +fileloc.o: Headers/opFormNode.h Headers/quantifiedTermNode.h +fileloc.o: Headers/signatureNode.h Headers/signatureNodeSet.h +fileloc.o: Headers/signNode.h Headers/nameNode.h Headers/LSLoperator.h +fileloc.o: Headers/LSLoperatorSet.h Headers/replaceNode.h +fileloc.o: Headers/replaceNodeList.h Headers/renamingNode.h +fileloc.o: Headers/traitRefNode.h Headers/traitRefNodeList.h +fileloc.o: Headers/exportNode.h Headers/privateNode.h Headers/interfaceNode.h +fileloc.o: Headers/interfaceNodeList.h Headers/termNode.h +fileloc.o: Headers/termNodeList.h Headers/stmtNode.h Headers/SortSetList.h +fileloc.o: Headers/LSLoperatorList.h Headers/string2sym.h Headers/symtable.h +fileloc.o: Headers/ctype.h Headers/ctbase.h Headers/cprim.h Headers/cprim.lh +fileloc.o: Headers/enumNameList.h Headers/typeTable.h Headers/indxmap.h +fileloc.o: Headers/typeTable.lh Headers/hashTable.h +fileloc.o: Headers/system_constants.h Headers/fieldlist.h Headers/paramlist.h +fileloc.o: Headers/typeId.h Headers/typeId.lh Headers/llsymtab.h +fileloc.o: Headers/llsymuid.h Headers/llsymtab.lh Headers/llentry.h +fileloc.o: Headers/typeUidSet.h Headers/sreflist.h Headers/sRef_type.h +fileloc.o: Headers/sRefSet.h Headers/ekind.h Headers/ekind.lh +fileloc.o: Headers/llsymuidSet.h Headers/paramlist.lh Headers/centry.h +fileloc.o: Headers/ctypeList.h Headers/centryList.h Headers/csymtab.h +fileloc.o: Headers/csymtab.lh Headers/storeRef.h Headers/clabstract.h +fileloc.o: Headers/argNode.h Headers/argNodeList.h Headers/lltok.h +fileloc.o: Headers/typeIdList.h Headers/udnodeList.h Headers/udnode.h +fileloc.o: Headers/exprNode.h Headers/sRefSetStack.h Headers/aliasTable.h +fileloc.o: Headers/aliasStack.h Headers/macrocache.h Headers/filenamemap.h +fileloc.o: Headers/boolStack.h Headers/pcpp.h Headers/filenameList.h +fileloc.o: Headers/version.h +filestack.o: Headers/basic.h Headers/general.h +filestack.o: Headers/cstring.h Headers/bool.h +filestack.o: Headers/llerror.h Headers/fileloc.h Headers/LSLSymbol_type.h +filestack.o: Headers/token.h Headers/LSLToken_type.h Headers/simp_message.h +filestack.o: Headers/filestack.h Headers/message.h +mapping.o: Headers/basic.h Headers/general.h +mapping.o: Headers/cstring.h +mapping.o: Headers/bool.h Headers/llerror.h +mapping.o: Headers/fileloc.h Headers/LSLSymbol_type.h Headers/token.h +mapping.o: Headers/LSLToken_type.h Headers/simp_message.h +mapping.o: Headers/mapping.h Headers/string2sym.h +message.o: Headers/basic.h Headers/general.h +message.o: Headers/cstring.h +message.o: Headers/bool.h Headers/llerror.h +message.o: Headers/fileloc.h Headers/LSLSymbol_type.h Headers/token.h +message.o: Headers/LSLToken_type.h Headers/simp_message.h +message.o: Headers/misc.h Headers/message.h +message.o: Headers/ctype.h Headers/ctbase.h Headers/cprim.h Headers/cprim.lh +message.o: Headers/enumNameList.h Headers/typeTable.h Headers/context.h +message.o: Headers/flag_codes.h Headers/coderegionList.h Headers/coderegion.h +message.o: Headers/llbasic.h Headers/code.h Headers/source.h +message.o: Headers/mapping.h Headers/sort.h Headers/Sort_type.h +message.o: Headers/ctypes.h Headers/abstract.h Headers/leaf.h +message.o: Headers/leafList.h Headers/importNode.h Headers/importNodeList.h +message.o: Headers/SortList.h Headers/LSLSymbolList.h Headers/LSLSymbolSet.h +message.o: Headers/SortSet.h Headers/pairNode.h Headers/pairNodeList.h +message.o: Headers/paramNode.h Headers/paramNodeList.h +message.o: Headers/declaratorInvNode.h Headers/declaratorInvNodeList.h +message.o: Headers/typeExpr.h Headers/declaratorNode.h +message.o: Headers/declaratorNodeList.h Headers/arrayQualNode.h +message.o: Headers/varNode.h Headers/varNodeList.h Headers/quantifierNode.h +message.o: Headers/quantifierNodeList.h Headers/storeRefNode.h +message.o: Headers/storeRefNodeList.h Headers/modifyNode.h +message.o: Headers/letDeclNode.h Headers/letDeclNodeList.h +message.o: Headers/programNode.h Headers/programNodeList.h +message.o: Headers/literalNode.h Headers/lclPredicateNode.h +message.o: Headers/exposedNode.h Headers/constDeclNode.h +message.o: Headers/constDeclNodeList.h Headers/CTypesNode.h +message.o: Headers/constDeclarationNode.h Headers/initDeclNode.h +message.o: Headers/initDeclNodeList.h Headers/varDeclarationNode.h +message.o: Headers/varDeclarationNodeList.h Headers/globalList.h +message.o: Headers/claimNode.h Headers/fcnNode.h Headers/fcnNodeList.h +message.o: Headers/abstBodyNode.h Headers/abstractNode.h +message.o: Headers/structDeclNode.h Headers/structDeclNodeList.h +message.o: Headers/taggedUnionNode.h Headers/typeNode.h +message.o: Headers/structOrUnionNode.h Headers/enumSpecNode.h +message.o: Headers/lclTypeSpecNode.h Headers/typeNamePack.h +message.o: Headers/typeNameNode.h Headers/typeNameNodeList.h +message.o: Headers/opFormNode.h Headers/quantifiedTermNode.h +message.o: Headers/signatureNode.h Headers/signatureNodeSet.h +message.o: Headers/signNode.h Headers/nameNode.h Headers/LSLoperator.h +message.o: Headers/LSLoperatorSet.h Headers/replaceNode.h +message.o: Headers/replaceNodeList.h Headers/renamingNode.h +message.o: Headers/traitRefNode.h Headers/traitRefNodeList.h +message.o: Headers/exportNode.h Headers/privateNode.h Headers/interfaceNode.h +message.o: Headers/interfaceNodeList.h Headers/termNode.h +message.o: Headers/termNodeList.h Headers/stmtNode.h Headers/SortSetList.h +message.o: Headers/LSLoperatorList.h Headers/string2sym.h Headers/symtable.h +message.o: Headers/llentry.h Headers/typeUidSet.h Headers/llsymtab.h +message.o: Headers/system_constants.h Headers/llsymuid.h Headers/typeId.h +message.o: Headers/typeId.lh Headers/llsymtab.lh Headers/hashTable.h +message.o: Headers/sreflist.h Headers/sRef_type.h Headers/sRefSet.h +message.o: Headers/ekind.h Headers/ekind.lh Headers/llsymuidSet.h +message.o: Headers/paramlist.h Headers/indxmap.h Headers/paramlist.lh +message.o: Headers/csymtab.h Headers/csymtab.lh Headers/centry.h +message.o: Headers/storeRef.h Headers/clabstract.h Headers/argNode.h +message.o: Headers/argNodeList.h Headers/ctypeList.h Headers/lltok.h +message.o: Headers/centryList.h Headers/typeIdList.h Headers/udnodeList.h +message.o: Headers/udnode.h Headers/exprNode.h Headers/fieldlist.h +message.o: Headers/sRefSetStack.h Headers/aliasTable.h Headers/aliasStack.h +message.o: Headers/macrocache.h Headers/filenamemap.h Headers/boolStack.h +message.o: Headers/typeTable.lh +filenamemap.o: Headers/basic.h Headers/general.h +filenamemap.o: Headers/cstring.h Headers/bool.h +filenamemap.o: Headers/llerror.h Headers/fileloc.h Headers/LSLSymbol_type.h +filenamemap.o: Headers/token.h Headers/LSLToken_type.h Headers/simp_message.h +filenamemap.o: Headers/globals.h Headers/context.h +filenamemap.o: Headers/flag_codes.h Headers/coderegionList.h +filenamemap.o: Headers/coderegion.h Headers/llbasic.h Headers/code.h +filenamemap.o: Headers/source.h Headers/mapping.h Headers/sort.h +filenamemap.o: Headers/Sort_type.h Headers/ctypes.h Headers/abstract.h +filenamemap.o: Headers/leaf.h Headers/leafList.h Headers/importNode.h +filenamemap.o: Headers/importNodeList.h Headers/SortList.h +filenamemap.o: Headers/LSLSymbolList.h Headers/LSLSymbolSet.h +filenamemap.o: Headers/SortSet.h Headers/pairNode.h Headers/pairNodeList.h +filenamemap.o: Headers/paramNode.h Headers/paramNodeList.h +filenamemap.o: Headers/declaratorInvNode.h Headers/declaratorInvNodeList.h +filenamemap.o: Headers/typeExpr.h Headers/declaratorNode.h +filenamemap.o: Headers/declaratorNodeList.h Headers/arrayQualNode.h +filenamemap.o: Headers/varNode.h Headers/varNodeList.h +filenamemap.o: Headers/quantifierNode.h Headers/quantifierNodeList.h +filenamemap.o: Headers/storeRefNode.h Headers/storeRefNodeList.h +filenamemap.o: Headers/modifyNode.h Headers/letDeclNode.h +filenamemap.o: Headers/letDeclNodeList.h Headers/programNode.h +filenamemap.o: Headers/programNodeList.h Headers/literalNode.h +filenamemap.o: Headers/lclPredicateNode.h Headers/exposedNode.h +filenamemap.o: Headers/constDeclNode.h Headers/constDeclNodeList.h +filenamemap.o: Headers/CTypesNode.h Headers/constDeclarationNode.h +filenamemap.o: Headers/initDeclNode.h Headers/initDeclNodeList.h +filenamemap.o: Headers/varDeclarationNode.h Headers/varDeclarationNodeList.h +filenamemap.o: Headers/globalList.h Headers/claimNode.h Headers/fcnNode.h +filenamemap.o: Headers/fcnNodeList.h Headers/abstBodyNode.h +filenamemap.o: Headers/abstractNode.h Headers/structDeclNode.h +filenamemap.o: Headers/structDeclNodeList.h Headers/taggedUnionNode.h +filenamemap.o: Headers/typeNode.h Headers/structOrUnionNode.h +filenamemap.o: Headers/enumSpecNode.h Headers/lclTypeSpecNode.h +filenamemap.o: Headers/typeNamePack.h Headers/typeNameNode.h +filenamemap.o: Headers/typeNameNodeList.h Headers/opFormNode.h +filenamemap.o: Headers/quantifiedTermNode.h Headers/signatureNode.h +filenamemap.o: Headers/signatureNodeSet.h Headers/signNode.h +filenamemap.o: Headers/nameNode.h Headers/LSLoperator.h +filenamemap.o: Headers/LSLoperatorSet.h Headers/replaceNode.h +filenamemap.o: Headers/replaceNodeList.h Headers/renamingNode.h +filenamemap.o: Headers/traitRefNode.h Headers/traitRefNodeList.h +filenamemap.o: Headers/exportNode.h Headers/privateNode.h +filenamemap.o: Headers/interfaceNode.h Headers/interfaceNodeList.h +filenamemap.o: Headers/termNode.h Headers/termNodeList.h Headers/stmtNode.h +filenamemap.o: Headers/SortSetList.h Headers/LSLoperatorList.h +filenamemap.o: Headers/string2sym.h Headers/symtable.h Headers/ctype.h +filenamemap.o: Headers/ctbase.h Headers/cprim.h Headers/cprim.lh +filenamemap.o: Headers/enumNameList.h Headers/typeTable.h Headers/indxmap.h +filenamemap.o: Headers/typeTable.lh Headers/hashTable.h +filenamemap.o: Headers/system_constants.h Headers/fieldlist.h +filenamemap.o: Headers/paramlist.h Headers/typeId.h Headers/typeId.lh +filenamemap.o: Headers/llsymtab.h Headers/llsymuid.h Headers/llsymtab.lh +filenamemap.o: Headers/llentry.h Headers/typeUidSet.h Headers/sreflist.h +filenamemap.o: Headers/sRef_type.h Headers/sRefSet.h Headers/ekind.h +filenamemap.o: Headers/ekind.lh Headers/llsymuidSet.h Headers/paramlist.lh +filenamemap.o: Headers/centry.h Headers/ctypeList.h Headers/centryList.h +filenamemap.o: Headers/csymtab.h Headers/csymtab.lh Headers/storeRef.h +filenamemap.o: Headers/clabstract.h Headers/argNode.h Headers/argNodeList.h +filenamemap.o: Headers/lltok.h Headers/typeIdList.h Headers/udnodeList.h +filenamemap.o: Headers/udnode.h Headers/exprNode.h Headers/sRefSetStack.h +filenamemap.o: Headers/aliasTable.h Headers/aliasStack.h Headers/macrocache.h +filenamemap.o: Headers/filenamemap.h Headers/boolStack.h Headers/message.h +hashTable.o: Headers/general.h +hashTable.o: Headers/cstring.h Headers/bool.h +hashTable.o: Headers/hashTable.h Headers/message.h +hashTable.o: Headers/256_random_numbers.h +llerror.o: Headers/basic.h Headers/general.h +llerror.o: Headers/cstring.h +llerror.o: Headers/bool.h Headers/llerror.h +llerror.o: Headers/fileloc.h Headers/LSLSymbol_type.h Headers/token.h +llerror.o: Headers/LSLToken_type.h Headers/simp_message.h +llerror.o: Headers/code.h Headers/string2sym.h +llerror.o: Headers/context.h Headers/flag_codes.h Headers/coderegionList.h +llerror.o: Headers/coderegion.h Headers/llbasic.h Headers/source.h +llerror.o: Headers/mapping.h Headers/sort.h Headers/Sort_type.h +llerror.o: Headers/ctypes.h Headers/abstract.h Headers/leaf.h +llerror.o: Headers/leafList.h Headers/importNode.h Headers/importNodeList.h +llerror.o: Headers/SortList.h Headers/LSLSymbolList.h Headers/LSLSymbolSet.h +llerror.o: Headers/SortSet.h Headers/pairNode.h Headers/pairNodeList.h +llerror.o: Headers/paramNode.h Headers/paramNodeList.h +llerror.o: Headers/declaratorInvNode.h Headers/declaratorInvNodeList.h +llerror.o: Headers/typeExpr.h Headers/declaratorNode.h +llerror.o: Headers/declaratorNodeList.h Headers/arrayQualNode.h +llerror.o: Headers/varNode.h Headers/varNodeList.h Headers/quantifierNode.h +llerror.o: Headers/quantifierNodeList.h Headers/storeRefNode.h +llerror.o: Headers/storeRefNodeList.h Headers/modifyNode.h +llerror.o: Headers/letDeclNode.h Headers/letDeclNodeList.h +llerror.o: Headers/programNode.h Headers/programNodeList.h +llerror.o: Headers/literalNode.h Headers/lclPredicateNode.h +llerror.o: Headers/exposedNode.h Headers/constDeclNode.h +llerror.o: Headers/constDeclNodeList.h Headers/CTypesNode.h +llerror.o: Headers/constDeclarationNode.h Headers/initDeclNode.h +llerror.o: Headers/initDeclNodeList.h Headers/varDeclarationNode.h +llerror.o: Headers/varDeclarationNodeList.h Headers/globalList.h +llerror.o: Headers/claimNode.h Headers/fcnNode.h Headers/fcnNodeList.h +llerror.o: Headers/abstBodyNode.h Headers/abstractNode.h +llerror.o: Headers/structDeclNode.h Headers/structDeclNodeList.h +llerror.o: Headers/taggedUnionNode.h Headers/typeNode.h +llerror.o: Headers/structOrUnionNode.h Headers/enumSpecNode.h +llerror.o: Headers/lclTypeSpecNode.h Headers/typeNamePack.h +llerror.o: Headers/typeNameNode.h Headers/typeNameNodeList.h +llerror.o: Headers/opFormNode.h Headers/quantifiedTermNode.h +llerror.o: Headers/signatureNode.h Headers/signatureNodeSet.h +llerror.o: Headers/signNode.h Headers/nameNode.h Headers/LSLoperator.h +llerror.o: Headers/LSLoperatorSet.h Headers/replaceNode.h +llerror.o: Headers/replaceNodeList.h Headers/renamingNode.h +llerror.o: Headers/traitRefNode.h Headers/traitRefNodeList.h +llerror.o: Headers/exportNode.h Headers/privateNode.h Headers/interfaceNode.h +llerror.o: Headers/interfaceNodeList.h Headers/termNode.h +llerror.o: Headers/termNodeList.h Headers/stmtNode.h Headers/SortSetList.h +llerror.o: Headers/LSLoperatorList.h Headers/symtable.h Headers/ctype.h +llerror.o: Headers/ctbase.h Headers/cprim.h Headers/cprim.lh +llerror.o: Headers/enumNameList.h Headers/typeTable.h Headers/indxmap.h +llerror.o: Headers/typeTable.lh Headers/hashTable.h +llerror.o: Headers/system_constants.h Headers/fieldlist.h Headers/paramlist.h +llerror.o: Headers/typeId.h Headers/typeId.lh Headers/llsymtab.h +llerror.o: Headers/llsymuid.h Headers/llsymtab.lh Headers/llentry.h +llerror.o: Headers/typeUidSet.h Headers/sreflist.h Headers/sRef_type.h +llerror.o: Headers/sRefSet.h Headers/ekind.h Headers/ekind.lh +llerror.o: Headers/llsymuidSet.h Headers/paramlist.lh Headers/centry.h +llerr \ No newline at end of file diff --git a/src/Makefile.mine b/src/Makefile.mine new file mode 100644 index 0000000..36d914c --- /dev/null +++ b/src/Makefile.mine @@ -0,0 +1,331 @@ +################################################## +### +### Makefile for LCLint +### +### designed for use with gmake (GNU make) +### +### original version based on LCL Makefile +### completely revised December 1993 +### revised for 1.4a, November 1994 +### revised for 2.0, February 1996 +### revised for 2.2, August 1996 +### +### This file should not need to be edited. +### +### Compilers and tools set using the top-level Makefile override settings +### in this file when make is run from the top directory. +### +### Commands: +### +### make all +### builds a release version of lclint from scratch using optimizations +### +### make quick +### builds a local version of lclint (no optimizations) +### (does not remake files) +### +### make test +### runs the test suite +### (must have installed test suite from lclint.test.tar.Z) +### + +.SUFFIXES : .h .c .o .l .check +.PHONY : all dorerelease retest rerelease homeversion test +.IGNORE : dorerelease retest rerelease + +### +### system information (compilers, flags, directories, etc.) +### + +include Makefile.sys + +### +### check files before compiling +### (can't be 1 unless you have lclint already!) +### + +CHECK = 0 +LCLINT = lclint + +### +### source files +### + +include Makefile.sources + +### +### top level +### + +all : quick + +release: + time ${MAKE} -e dorelease + +quick: lclint + +lclint : $(OBJ) + @echo '// ' + @echo '// Linking:' + @echo '// ' + $(CC) -o lclint $(OBJ) $(LINKFLAGS) + +### +### grammars +### + +### +### -p xx flag to bison renames yyparse ==> xxparse, xxlex ==> xxlex +### this is probably NOT compatible with yacc. +### + +signature.c : signature.c.der signature.y +ifdef BISON + @$(BISON) $(YFLAGS) -p lsl signature.y + @$(CAT) bison.head signature.tab.c bison.reset > signature.c + @$(MV) Headers/signature_gen.h Headers/signature_gen.bak + @$(CAT) bison.head signature.tab.h bison.reset > Headers/signature_gen.h +else + $(CP) signature.c.der signature.c +endif + +cgrammar.c : cgrammar.c.der cgrammar.y +ifdef BISON + $(BISON) $(YFLAGS) cgrammar.y + @echo '// Expect 119 shift/reduce conflicts and 114 reduce/reduce conflicts.' + @echo '// (see cgrammar.y for explanation)' + @$(CAT) bison.head cgrammar.tab.c bison.reset > cgrammar.c + @$(MV) Headers/cgrammar_tokens.h Headers/cgrammar_tokens.bak + @$(CAT) bison.head cgrammar.tab.h bison.reset > Headers/cgrammar_tokens.h +else + $(CP) cgrammar.c.der cgrammar.c +endif + +### llgrammar2.h is necessary so +singleinclude may be used + +llgrammar.c : llgrammar.c.der llgrammar.y +ifdef BISON + $(BISON) $(YFLAGS) -p yl llgrammar.y + @echo '// Expect 2 shift/reduce conflicts.' + @$(CAT) bison.head llgrammar.tab.c bison.reset > llgrammar.c + @$(MV) Headers/llgrammar_gen2.h Headers/llgrammar_gen2.bak + @$(CAT) bison.head llgrammar.tab.h bison.reset > Headers/llgrammar_gen2.h + @$(MV) Headers/llgrammar_gen.h Headers/llgrammar_gen.bak + @$(CAT) bison.head llgrammar.tab.h bison.reset > Headers/llgrammar_gen.h +else + $(CP) llgrammar.c.der llgrammar.c +endif + +cscanner.c : cscanner.c.der cscanner.l +ifdef FLEX + $(FLEX) $(LFLAGS) cscanner.l + $(CAT) flex.head lex.yy.c flex.reset > cscanner.c +else + $(CP) cscanner.c.der cscanner.c +endif + +### +### compile without warnings +### + +signature.o : signature.c + $(CC) $(CPPFLAGS) -c $*.c + +cgrammar.o : cgrammar.c + $(CC) $(CPPFLAGS) -c $*.c + +llgrammar.o : llgrammar.c + $(CC) $(CPPFLAGS) -c $*.c + +cscanner.o : cscanner.c + $(CC) $(CPPFLAGS) -c $*.c + +### +### header files dependant on grammars +### + +Headers/signature2.h : signature.c +Headers/cgrammar2.h : cgrammar.c +Headers/llgrammar.h : llgrammar.c + +### +### defaults +### + +### Flags for checking a single file +SINGLEFLAGS = +neverinclude -supcounts +partial -showsummary -load lclint.lcd + +.c.check: lclint.lcd lclint + $(LCLINT) $(LINTFLAGS) $(SINGLEFLAGS) $*.c + +.c.o: +ifeq ($(CHECK), 1) + $(LCLINT) $(LINTFLAGS) $(SINGLEFLAGS) $*.c +endif + @echo '// Compiling '$*.c' / compiled: '`$(OFILES)`' (of 120 files)' + @$(CC) $(CFLAGS) -c $*.c + +### +### alternatives (tests, releases, backups, etc.) +### + +### -e option makes environment variables take precedence + +.PHONY : test quicktest opt up tags + +tags: + etags ${SRC} Headers/*.h + +alltags: + etags ${SRC} *.l *.y Headers/*.h *.i *.def + +opt : +ifneq (,$(findstring csh, $(SHELL))) + setenv CC '$(CCOPT)' ; $(MAKE) -e lclint +else + CC="$(CCOPT)" ; export CC ; $(MAKE) -e lclint +endif + +updateversion: + @$(MV) Headers/herald.h Headers/herald.last + @echo '/* herald.h - created automatically by gmake updateversion */' > Headers/herald.h + @echo '/*@constant observer char *LCL_VERSION;@*/' >> Headers/herald.h + @echo '# define LCL_VERSION "LCLint '`cat $(VERSION_NUMBER)`' --- '`cat DATE`'"' \ + >> Headers/herald.h + @echo '/*@constant observer char *LCL_PARSE_VERSION;@*/' >> Headers/herald.h + @echo '# define LCL_PARSE_VERSION "LCLint '`cat $(VERSION_NUMBER)`'"' \ + >> Headers/herald.h + @echo '/*@constant observer char *LCL_COMPILE;@*/' >> Headers/herald.h + @echo '# define LCL_COMPILE "Compiled using '$(CC)' on '`uname -a`' by '`whoami`'"' >> Headers/herald.h + +localconstants: +ifdef SYSTEM_LIBDIR +ifdef DEFAULT_LARCHPATH +ifdef DEFAULT_LCLIMPORTDIR + @$(MV) Headers/local_constants.h Headers/local_constants.last + @echo '/* local_constants.h - created automatically by gmake localconstants */' \ + > Headers/local_constants.h + @echo '/*@constant observer char *SYSTEM_LIBDIR;@*/' >> Headers/local_constants.h + @echo '# define SYSTEM_LIBDIR "$(SYSTEM_LIBDIR)"' >> Headers/local_constants.h + @echo '/*@constant observer char *DEFAULT_LARCHPATH;@*/' >> Headers/local_constants.h + @echo '# define DEFAULT_LARCHPATH "$(DEFAULT_LARCHPATH)"' >> Headers/local_constants.h + @echo '/*@constant observer char *DEFAULT_LCLIMPORTDIR;@*/' >> Headers/local_constants.h + @echo '# define DEFAULT_LCLIMPORTDIR "$(DEFAULT_LCLIMPORTDIR)"' >> Headers/local_constants.h +else + @echo 'DEFAULT_LCLIMPORTDIR not defined. Not remaking local_constants.h.' +endif +else + @echo 'DEFAULT_LARCHPATH not defined. Not remaking local_constants.h.' +endif +else + @echo 'SYSTEM_LIBDIR not defined. Not remaking local_constants.h.' +endif + +dorelease: + @echo '// ' + @echo '// Making LCLint' + @echo '// Version '`cat $(VERSION_NUMBER)` + @echo '// ' + @echo '// Compiler: '$(CCOPT) +ifdef BISON + @echo '// Bison: '$(BISON) +else + @echo '// Use derived bison files' +endif +ifdef FLEX + @echo '// Flex: '$(FLEX) +else + @echo '// Use derived flex files' +endif + @echo '// Default cpp command: '$(DEFAULT_CPPCMD) + @echo '// System include directory: '$(SYSTEM_LIBDIR) + @echo '// Default Larch path: '$(DEFAULT_LARCHPATH) + @echo '// Default imports directory: '$(DEFAULT_LCLIMPORTDIR) + @echo '// ' + @echo '// Updating version information' + @$(MAKE) -e updateversion + @echo '// Updating local constants' + @$(MAKE) -e localconstants + @echo '// ' + @echo '// Compiling:' + @echo '// ' + @$(MAKE) -e opt + @echo '// Done Release '`cat $(VERSION_NUMBER)` + +flags: flags.def + grep "FLG_" flags.def > Headers/flag_codes.gen + +llmain.c: Headers/herald.h + +### +### cleaning +### +### Standard entries to remove files from the directories +### up --- remove .o files and grammar derivatives +### tidy --- eliminate unwanted files +### clean --- delete derived files, except for spec-derived files +### pristine --- delete all derived files +### + +.PHONY .IGNORE : up tidy clean pristine + +pristine: clean + -$(RM) -f *.lcs *.lslo + +remake: + ${MAKE} clean; ${MAKE} updateversion; ${MAKE} + +clean: tidy + -$(RM) core lclint + -$(RM) *.out *.output *.bib *.dvi *.idx *.log *.o *.toc + -$(RM) cgrammar.c cscanner.c + -$(RM) test* Headers/*~ Headers/#* + +tidy: + -$(RM) ,* .,* *.CKP *.BAK .emacs_[0-9]* core a.out *.*~ + +up: + -$(RM) cgrammar.c llgrammar.c signature.c cscanner.c + -$(RM) *.o + +### +### testing +### + +test: + cd ../test; ${MAKE} -e test + +### +### dependancies +### + +depend: + $(MAKEDEPEND) $(CINCLUDES) $(CFLAGS) -f Makefile.depend $(SRC) $(GRAMS) + +### +### analysing dependancies takes a long time and doesn't work terribly +### well, so the are NOT included here. NOTE carefully, this means if a +### header file is changed manual recompilation may be necessary. +### + +### include Makefile.depend + +### +### LCLint checking +### + +### +### A library is used for the specifications +### + +$(CHECKS): lclint.lcd + +### +### other flags are in .lclintrc file +### + +lint: + ${LCLINT} -f lclint.lclintrc $(CPPFLAGS) +singleinclude $(ALLSRC) -dump lclint + +ctype.c: ctbase.i +ctype.o: ctbase.i diff --git a/src/Makefile.nodepend b/src/Makefile.nodepend new file mode 100644 index 0000000..57dcf0d --- /dev/null +++ b/src/Makefile.nodepend @@ -0,0 +1,5 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. + +### +### gmake is TOO slow to load dependancies... +### diff --git a/src/Makefile.os2 b/src/Makefile.os2 new file mode 100644 index 0000000..e3c930a --- /dev/null +++ b/src/Makefile.os2 @@ -0,0 +1,187 @@ +################################################## +### +### Makefile for OS/2 version of LCLint +### +### designed for use with gmake (GNU make) +### +### based on David Evans' original makefile for Unix systems +### +### This file should not need to be edited. +### +### configuration is set by top-level makefile and written to file +### config.inc included by this file. +### +### Commands: +### +### make all +### builds a release version of lclint from scratch using optimizations +### + +O=.o +E= + + +include ../config.inc + +.SUFFIXES: +.SUFFIXES: $E $O .h .c .l .check + +### +### object files needed for building lclint: +### note that there is no dependency checking done! +### +OBJ=abstract$O aliasChecks$O aliasTable$O cgrammar$O checking$O \ + clabstract$O clause$O clauseStack$O context$O cprim$O cscanner$O \ + cstring$O cstringSList$O ctype$O ctypeList$O cvar$O \ + declaratorInvNodeList$O declaratorNodeList$O ekind$O enumNameList$O \ + enumNameSList$O exprChecks$O exprNode$O exprNodeList$O \ + exprNodeSList$O fcnNodeList$O fileIdList$O fileStack$O fileTable$O \ + fileloc$O filelocList$O filelocStack$O flagMarker$O flagMarkerList$O \ + flags$O general$O globSet$O globals$O guardSet$O hashTable$O \ + idDecl$O idDeclList$O importNodeList$O imports$O indxMap$O \ + initDeclNodeList$O intSet$O interfaceNodeList$O lclctypes$O lclinit$O \ + lcllib$O lclscan$O lclscanline$O lclsyntable$O lcltokentable$O \ + letDeclNodeList$O lh$O llerror$O llgrammar$O llmain$O lltok$O \ + lslOpList$O lslOpSet$O lslinit$O lslparse$O lsymbol$O lsymbolList$O \ + lsymbolSet$O ltoken$O ltokenList$O macrocache$O mapping$O message$O \ + messageLog$O multiVal$O nameChecks$O osd$O out$O pairNodeList$O \ + paramNodeList$O pcpp$O programNodeList$O qtype$O qual$O qualList$O \ + quantifierNodeList$O replaceNodeList$O sRef$O sRefSet$O sRefSetList$O \ + sRefTable$O scan$O scanline$O shift$O sigNodeSet$O signature$O \ + sort$O sortList$O sortSet$O sortSetList$O source$O specialClauses$O \ + stDeclNodeList$O storeRefNodeList$O structNames$O symtable$O \ + syntable$O termNodeList$O tokentable$O traitRefNodeList$O typeIdSet$O \ + typeNameNodeList$O uentry$O uentryList$O usymIdSet$O usymtab$O \ + usymtab_interface$O varDeclarationNodeList$O varKinds$O varNodeList$O \ + ynm$O + + +### +### main (and only) target: lclint with all optimizations. +### + +all : lclint$E +lclint$E : $(OBJ) + $(CC) $(OFLAG) $(OBJ) $(LINKFLAGS) + +### +### subtarget: local constants header file. +### + +localconstants: + cmd /c if exist Headers\local_constants.last del Headers\local_constants.last + cmd /c if exist Headers\local_constants.h ren Headers\local_constants.h local_constants.last + echo /* local_constants.h - created automatically by gmake localconstants */ > Headers\local_constants.h + echo /*@constant observer char *DEFAULT_CPPCMD;@*/ >> Headers\local_constants.h + echo # define DEFAULT_CPPCMD $(DEFAULT_CPPCMD) >> Headers\local_constants.h + echo /*@constant observer char *SYSTEM_LIBDIR;@*/ >> Headers\local_constants.h + echo # define SYSTEM_LIBDIR $(SYSTEM_LIBDIR) >> Headers\local_constants.h + echo /*@constant observer char *DEFAULT_LARCHPATH;@*/ >> Headers\local_constants.h + echo # define DEFAULT_LARCHPATH $(DEFAULT_LARCHPATH) >> Headers\local_constants.h + echo /*@constant observer char *DEFAULT_LCLIMPORTDIR;@*/ >> Headers\local_constants.h + echo # define DEFAULT_LCLIMPORTDIR $(DEFAULT_LCLIMPORTDIR) >> Headers\local_constants.h + +### +### grammars +### + +### +### -p xx flag to bison renames yyparse ==> xxparse, xxlex ==> xxlex +### this is probably NOT compatible with yacc. +### + +signature.c : signature.c.der signature.y +ifdef BISON + $(BISON) $(YFLAGS) -p lsl signature.y + $(CAT) bison.head signature.tab.c > signature.c + $(MV) Headers\signature_gen.h Headers\signature_gen.bak + $(CAT) bison.head signature.tab.h > Headers\signature_gen.h +else + (CP) signature.c.der signature.c +endif + +cgrammar.c : cgrammar.c.der cgrammar.y +ifdef BISON + $(BISON) $(YFLAGS) cgrammar.y + $(CAT) bison.head cgrammar.tab.c > cgrammar.c + $(MV) Headers\cgrammar_tokens.h Headers\cgrammar_tokens.bak + $(CAT) bison.head cgrammar.tab.h > Headers\cgrammar_tokens.h +else + $(CP) cgrammar.c.der cgrammar.c +endif + +### llgrammar2.h is necessary so +singleinclude may be used + +llgrammar.c : llgrammar.c.der llgrammar.y +ifdef BISON + $(BISON) $(YFLAGS) -p yl llgrammar.y + $(CAT) bison.head llgrammar.tab.c > llgrammar.c + $(MV) Headers\llgrammar_gen2.h Headers\llgrammar_gen2.bak + $(CAT) bison.head llgrammar.tab.h > Headers\llgrammar_gen2.h + $(MV) Headers\llgrammar_gen.h Headers\llgrammar_gen.bak + $(CAT) bison.head llgrammar.tab.h > Headers\llgrammar_gen.h +else + $(CP) llgrammar.c.der llgrammar.c +endif + +cscanner.c : cscanner.c.der cscanner.l +ifdef FLEX + $(FLEX) $(LFLAGS) -olex.yy.c cscanner.l + $(CAT) flex.head lex.yy.c > cscanner.c +else + $(CP) cscanner.c.der cscanner.c +endif + +### +### header files dependant on grammars +### + +Headers\signature2.h : signature.c +Headers\cgrammar2.h : cgrammar.c +Headers\llgrammar.h : llgrammar.c + +### +### defaults +### + +### Flags for checking a single file +SINGLEFLAGS = +neverinclude -supcounts +partial -showsummary -load lclint.lcd + +.c$O: + $(CC) $(CPPFLAGS) -c $*.c + +### +### cleaning +### +### Standard entries to remove files from the directories +### up --- remove .o files and grammar derivatives +### tidy --- eliminate unwanted files +### clean --- delete derived files, except for spec-derived files +### pristine --- delete all derived files +### + +pristine: clean + -$(RM) -f *.lcs *.lslo + +clean: tidy + -$(RM) core lclint + -$(RM) *.out *.output *.bib *.dvi *.idx *.log *$O *.toc + -$(RM) cgrammar.c cscanner.c + +tidy: + -$(RM) ,* .,* *.CKP *.BAK .emacs_[0-9]* core a.out *.*~ + +up: + -$(RM) cgrammar.c llgrammar.c signature.c cscanner.c + -$(RM) *$O + +### +### other flags are in .lclintrc file +### + +lint: + $(LCLINT) -f lclint.lclintrc $(CPPFLAGS) +singleinclude $(ALLSRC) -dump lclint + + + + diff --git a/src/Makefile.sources b/src/Makefile.sources new file mode 100644 index 0000000..2baf3fa --- /dev/null +++ b/src/Makefile.sources @@ -0,0 +1,82 @@ +### +### Makefile.sources +### + +SETSRC = globSet.c intSet.c typeIdSet.c guardSet.c usymIdSet.c sRefSet.c + +LISTSRC = clauseStack.c filelocStack.c \ + cstringList.c cstringSList.c sRefSetList.c ctypeList.c \ + enumNameList.c enumNameSList.c exprNodeList.c exprNodeSList.c \ + uentryList.c fileIdList.c filelocList.c qualList.c \ + flagMarkerList.c idDeclList.c + +CPPSRC = cppmain.c cpplib.c cppexp.c cpphash.c cpperror.c + +CSRC = uentry.c cprim.c macrocache.c qual.c qtype.c specialClauses.c \ + ctype.c cvar.c clabstract.c idDecl.c clause.c + +LCLINTSRC = exprNode.c exprChecks.c llmain.c + CHECKSRC = structNames.c aliasChecks.c varKinds.c nameChecks.c + + GLOBSRC = context.c globals.c flags.c general.c osd.c + +GRAMS = cgrammar.y cscanner.l llgrammar.y signature.y +GRAMSRC = cgrammar.c cscanner.c + +GENERALSRC = cstring.c fileloc.c message.c source.c \ + fileTable.c hashTable.c llerror.c messageLog.c \ + flagMarker.c aliasTable.c ynm.c sRefTable.c \ + ekind.c usymtab.c multiVal.c lltok.c sRef.c lcllib.c + +### +### These source files are relevant for LCL only. +### Not uses if NOLCL is set. +### + +LCLONLYSRC = usymtab_interface.c abstract.c ltoken.c lclscanline.c \ + lclsyntable.c lcltokentable.c sort.c symtable.c lclinit.c \ + shift.c lclscan.c lsymbol.c mapping.c + +LSLSRC = tokentable.c scan.c scanline.c lslparse.c \ + lh.c checking.c lclctypes.c imports.c lslinit.c syntable.c + +LCLGRAMS = llgrammar.y signature.y +LCLGRAMSSRC = llgrammar.c signature.c + +LCLSETSRC = lsymbolSet.c sigNodeSet.c lslOpSet.c sortSet.c + +LCLLISTSRC = initDeclNodeList.c sortList.c declaratorInvNodeList.c \ + interfaceNodeList.c sortSetList.c declaratorNodeList.c \ + letDeclNodeList.c stDeclNodeList.c lslOpList.c storeRefNodeList.c \ + lsymbolList.c termNodeList.c ltokenList.c traitRefNodeList.c \ + pairNodeList.c typeNameNodeList.c fcnNodeList.c paramNodeList.c \ + programNodeList.c varDeclarationNodeList.c varNodeList.c \ + quantifierNodeList.c replaceNodeList.c importNodeList.c + +ifeq ($(NOLCL), 1) +LCLSRC = +else +LCLSRC = $(LCLSETSRC) $(LCLLISTSRC) $(LSLSRC) $(CMNSRC) $(LCLONLYSRC) $(LCLGRAMSSRC) +endif + +COMMONSRC = $(CPPSRC) $(CSRC) $(CHECKSRC) $(GENERALSRC) $(GLOBSRC) \ + $(IFACESRC) $(LISTSRC) $(SETSRC) $(LCLSRC) $(LCLGRAMSRC) + +SRC = $(COMMONSRC) $(LCLINTSRC) +ALLSRC = $(SRC) $(GRAMSRC) + +## all except cscanner.c +ALMOSTALLSRC = llgrammar.c cgrammar.c signature.c $(SRC) +OBJ = $(subst .c,.o,$(ALLSRC)) + +CHECKS = $(subst .c,.check,$(SRC)) + +ALLHEADERS = + +SANITIZERSRC = $(COMMONSRC) cscanner.c sgrammar.c sNode.c sChecks.c sMain.c +SANITIZEROBJ = $(subst .c,.o,$(SANITIZERSRC)) + + + + + diff --git a/src/Makefile.sys b/src/Makefile.sys new file mode 100644 index 0000000..a2f7af6 --- /dev/null +++ b/src/Makefile.sys @@ -0,0 +1,80 @@ +### +### If I was smarter, I'd figure out how to get configure to fill in the +### variables here instead of using environment variables to override +### them. The way I do it is pretty lame.... +### + +################################################ +### +### Generic system dependant Makefile +### edit this file to build a new system +### +################################################ + +### File Counts + +WC = wc +LS = ls +OFILES = $(LS) *.o | $(WC) -l +SFILES = $(LS) *.c | $(WC) -l + +### +### Compiler and compiler flags +### +### NOTE: CC is set in top level Makefile +### + +CC = gcc +CCOPT = gcc -O2 + +### +### CPPFLAGS also used by lclint --- it should only include -I, -D and +### -U flags +### + +CPPFLAGS = -I$(HEADERDIR) -DUNIX -DNOSTDLIB=0 -DUGS=1 +### -DUGS=1 is needed for AIX (should be set by configure) + +### lex library (overrode by configure environment variable) +LINKFLAGS = -ll + +ifeq ($(CC), gcc) + CFLAGS = $(CPPFLAGS) -Wpointer-arith -Wcast-qual -Wcomment -Wswitch -Wunused -Wreturn-type -ansi -pedantic +else + CFLAGS = $(CPPFLAGS) +endif + +DEBUGFLAGS = -DYYDEBUG=1 -DYYIMPURE=1 # don't change this + +### bison flags + +YFLAGS = -v -t -d + +### +### controls lclint checking (uncomment this line to have +### lclint check each source file before compiling) +### +### CHECK = TRUE +### + +### SHELL = /bin/csh + +LCLINT = lclint + +HEADERDIR = Headers + +### standard commands + +RM = rm -f +MV = mv -f +CP = cp +CAT = cat + +MAKEDEPEND = makedepend +LASTBACKUP = lastbackup +VERSION_NUMBER = lastversion + + + + + diff --git a/src/Makefile.sys-mine b/src/Makefile.sys-mine new file mode 100644 index 0000000..edf29c7 --- /dev/null +++ b/src/Makefile.sys-mine @@ -0,0 +1,92 @@ +################################################ +### +### Generic system dependant Makefile +### edit this file to build a new system +### +################################################ + +### File Counts + +WC = wc +LS = ls +OFILES = $(LS) *.o | $(WC) -l +SFILES = $(LS) *.c | $(WC) -l + +## on mamba +#BISON = /usr/local/bin/bison +#FLEX = /usr/local/bin/flex + +BISON = /usr/bin/bison +FLEX = /usr/bin/flex + +# ${HOME}/bison-1.28/bin/bison + + +### +### Compiler and compiler flags +### +### NOTE: CC is set in top level Makefile +### + +CC = /usr/local/bin/gcc -O3 -Wall +CCOPT = /usr/local/bin/gcc -O3 +# -O4 doesn't work with bison 1.25 + +### +### CPPFLAGS also used by lclint --- it should only include -I, -D and +### -U flags +### + +CPPFLAGS = -I$(HEADERDIR) -DUNIX -DNOSTDLIB=0 -DUGS=1 +### -DUGS=1 is needed for AIX (should be set by configure) + +### lex library + +LINKFLAGS = -lfl + + +ifeq ($(CC), gcc) + CFLAGS = $(CPPFLAGS) -Wpointer-arith -Wcast-qual -Wcomment -Wswitch -Wunused -Wreturn-type -ansi -pedantic +else + CFLAGS = $(CPPFLAGS) +endif + +DEBUGFLAGS = -DYYDEBUG=1 -DYYIMPURE=1 # don't change this + +### bison flags + +YFLAGS = -v -t -d --debug + +### +### controls lclint checking (uncomment this line to have +### lclint check each source file before compiling) +### +### CHECK = TRUE +### + +### SHELL = /bin/csh + +LCLINT = lclint + +HEADERDIR = Headers + +### standard commands + +RM = rm -f +MV = mv -f +CP = cp +CAT = cat + +MAKEDEPEND = makedepend +LASTBACKUP = lastbackup +VERSION_NUMBER = lastversion + + +### +### Defaults (overrode by environment varialbles for local build) +### + +SYSTEM_LIBDIR = /usr/include +DEFAULT_LARCHPATH = /usr/local/lclint-2.5m/lib +DEFAULT_LCLIMPORTDIR = /usr/local/lclint-2.5m/imports + diff --git a/src/abstract.c b/src/abstract.c new file mode 100644 index 0000000..dc4d135 --- /dev/null +++ b/src/abstract.c @@ -0,0 +1,6407 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** abstract.c +** +** Module for building abstract syntax trees for LCL. +** +** This module is too close to the surface syntax of LCL. +** Suffices for now. +** +** AUTHOR: +** Yang Meng Tan, +** Massachusetts Institute of Technology +*/ + +# include "lclintMacros.nf" +# include "llbasic.h" +# include "lslparse.h" +# include "llgrammar.h" /* need simpleOp, MULOP and logicalOp in makeInfixTermNode */ +# include "lclscan.h" +# include "lh.h" +# include "imports.h" + +static lsymbol lsymbol_Bool; +static lsymbol lsymbol_bool; +static lsymbol lsymbol_TRUE; +static lsymbol lsymbol_FALSE; + +static void lclPredicateNode_free (/*@only@*/ /*@null@*/ lclPredicateNode p_x) ; +static void exposedNode_free (/*@only@*/ /*@null@*/ exposedNode p_x) ; +static void CTypesNode_free (/*@null@*/ /*@only@*/ CTypesNode p_x); +static /*@null@*/ CTypesNode CTypesNode_copy (/*@null@*/ CTypesNode p_x) /*@*/ ; +static void + constDeclarationNode_free (/*@only@*/ /*@null@*/ constDeclarationNode p_x); +static void claimNode_free (/*@only@*/ /*@null@*/ claimNode p_x); +static void iterNode_free (/*@only@*/ /*@null@*/ iterNode p_x); +static void abstBodyNode_free (/*@only@*/ /*@null@*/ abstBodyNode p_n); +static void abstractNode_free (/*@only@*/ /*@null@*/ abstractNode p_x); +static void taggedUnionNode_free (/*@only@*/ /*@null@*/ taggedUnionNode p_x); +static void typeNode_free (/*@only@*/ /*@null@*/ typeNode p_t); +static /*@null@*/ strOrUnionNode + strOrUnionNode_copy (/*@null@*/ strOrUnionNode p_n) /*@*/ ; +static void strOrUnionNode_free (/*@null@*/ /*@only@*/ strOrUnionNode p_n) + /*@modifies *p_n @*/ ; + +static void enumSpecNode_free (/*@null@*/ /*@only@*/ enumSpecNode p_x); +static /*@only@*/ /*@null@*/ enumSpecNode + enumSpecNode_copy (/*@null@*/ enumSpecNode p_x) /*@*/ ; +static /*@only@*/ lclTypeSpecNode + lclTypeSpecNode_copySafe (lclTypeSpecNode p_n) /*@*/ ; +static void lclTypeSpecNode_free (/*@null@*/ /*@only@*/ lclTypeSpecNode p_n); +static void typeNamePack_free (/*@only@*/ /*@null@*/ typeNamePack p_x); +static void opFormNode_free (/*@only@*/ /*@null@*/ opFormNode p_op); +static quantifiedTermNode quantifiedTermNode_copy (quantifiedTermNode p_q) /*@*/ ; +static void nameAndReplaceNode_free (/*@only@*/ /*@null@*/ nameAndReplaceNode p_x); +static void renamingNode_free (/*@only@*/ /*@null@*/ renamingNode p_x); +static void exportNode_free (/*@null@*/ /*@only@*/ exportNode p_x); +static void privateNode_free (/*@only@*/ /*@null@*/ privateNode p_x); +static /*@null@*/ termNode termNode_copy (/*@null@*/ termNode p_t) /*@*/ ; +static void + stmtNode_free (/*@only@*/ /*@null@*/ stmtNode p_x) /*@modifies *p_x@*/ ; +static /*@null@*/ typeExpr typeExpr_copy (/*@null@*/ typeExpr p_x) /*@*/ ; + +static lsymbol ConditionalSymbol; +static lsymbol equalSymbol; +static lsymbol eqSymbol; +static lclTypeSpecNode exposedType; + +static /*@only@*/ cstring abstDeclaratorNode_unparse (abstDeclaratorNode p_x); +static pairNodeList extractParams (/*@null@*/ typeExpr p_te); +static sort extractReturnSort (lclTypeSpecNode p_t, declaratorNode p_d); +static void checkAssociativity (termNode p_x, ltoken p_op); +static void LCLBootstrap (void); +static cstring printMiddle (int p_j); +static void paramNode_checkQualifiers (lclTypeSpecNode p_t, typeExpr p_d); + +void +resetImports (cstring current) +{ + lsymbolSet_free (g_currentImports); + + g_currentImports = lsymbolSet_new (); /* equal_symbol; */ + (void) lsymbolSet_insert (g_currentImports, + lsymbol_fromChars (cstring_toCharsSafe (current))); +} + +void +abstract_init () +{ + typeInfo ti = (typeInfo) dmalloc (sizeof (*ti)); + nameNode nn; + ltoken dom, range; + sigNode sign; + opFormNode opform; + ltokenList domain = ltokenList_new (); + ltokenList domain2; + + equalSymbol = lsymbol_fromChars ("="); + eqSymbol = lsymbol_fromChars ("\\eq"); + + /* + ** not: cstring_toCharsSafe (context_getBoolName ()) + ** we use the hard wired "bool" name. + */ + + lsymbol_bool = lsymbol_fromChars ("bool"); + lsymbol_Bool = lsymbol_fromChars ("Bool"); + + lsymbol_TRUE = lsymbol_fromChars ("TRUE"); + lsymbol_FALSE = lsymbol_fromChars ("FALSE"); + + ConditionalSymbol = lsymbol_fromChars ("if__then__else__"); + + /* generate operators for + ** __ \not, __ \implies __ , __ \and __, __ \or __ + */ + + range = ltoken_create (simpleId, lsymbol_bool); + dom = ltoken_create (simpleId, lsymbol_bool); + + ltokenList_addh (domain, ltoken_copy (dom)); + + domain2 = ltokenList_copy (domain); /* moved this here (before release) */ + + sign = makesigNode (ltoken_undefined, domain, ltoken_copy (range)); + + opform = makeOpFormNode (ltoken_undefined, OPF_ANYOPM, + opFormUnion_createAnyOp (ltoken_not), + ltoken_undefined); + nn = makeNameNodeForm (opform); + symtable_enterOp (g_symtab, nn, sign); + + ltokenList_addh (domain2, dom); + + sign = makesigNode (ltoken_undefined, domain2, range); + + opform = makeOpFormNode (ltoken_undefined, OPF_MANYOPM, + opFormUnion_createAnyOp (ltoken_and), + ltoken_undefined); + + nn = makeNameNodeForm (opform); + symtable_enterOp (g_symtab, nn, sigNode_copy (sign)); + + opform = makeOpFormNode (ltoken_undefined, OPF_MANYOPM, + opFormUnion_createAnyOp (ltoken_or), + ltoken_undefined); + + nn = makeNameNodeForm (opform); + symtable_enterOp (g_symtab, nn, sigNode_copy (sign)); + + opform = makeOpFormNode (ltoken_undefined, OPF_MANYOPM, + opFormUnion_createAnyOp (ltoken_implies), + ltoken_undefined); + nn = makeNameNodeForm (opform); + symtable_enterOp (g_symtab, nn, sign); + + /* from lclscanline.c's init procedure */ + /* comment out so we can add in lclinit.lci: synonym double float */ + /* ReserveToken (FLOAT, "float"); */ + /* But we need to make the scanner parse "float" not as a simpleId, but + as a TYPEDEF_NAME. This is done later in abstract_init */ + + ti->id = ltoken_createType (LLT_TYPEDEF_NAME, SID_TYPE, lsymbol_fromChars ("float")); + + ti->modifiable = FALSE; + ti->abstract = FALSE; + ti->export = FALSE; /* this is implicit, not exported */ + ti->basedOn = sort_float; + symtable_enterType (g_symtab, ti); +} + +void +declareForwardType (declaratorNode declare) +{ + typeInfo ti = (typeInfo) dmalloc (sizeof (*ti)); + sort tsort, handle; + lsymbol typedefname; + + typedefname = ltoken_getText (declare->id); + ti->id = ltoken_copy (declare->id); + + ltoken_setCode (ti->id, LLT_TYPEDEF_NAME); + ltoken_setIdType (ti->id, SID_TYPE); + + ti->modifiable = FALSE; + ti->abstract = FALSE; + tsort = lclTypeSpecNode2sort (exposedType); + handle = typeExpr2ptrSort (tsort, declare->type); + ti->basedOn = sort_makeSyn (declare->id, handle, typedefname); + ti->export = FALSE; + + symtable_enterType (g_symtab, ti); +} + +void LCLBuiltins (void) +{ + typeInfo ti = (typeInfo) dmalloc (sizeof (*ti)); + varInfo vi = (varInfo) dmalloc (sizeof (*vi)); + + /* immutable type bool; + uses CTrait; + constant bool FALSE = false; + constant bool TRUE = true; */ + + /* the following defines the builtin LSL sorts and operators */ + LCLBootstrap (); + + /* now LCL builtin proper */ + /* do "immutable type bool;" */ + + ti->id = ltoken_copy (ltoken_bool); + + ltoken_setCode (ti->id, LLT_TYPEDEF_NAME); + ltoken_setIdType (ti->id, SID_TYPE); + + ti->modifiable = FALSE; + ti->abstract = TRUE; + ti->basedOn = sort_bool; + ti->export = FALSE; /* this wasn't set (detected by lclint) */ + symtable_enterType (g_symtab, ti); + + /* do "constant bool FALSE = false;" */ + vi->id = ltoken_createType (simpleId, SID_VAR, lsymbol_fromChars ("FALSE")); + + vi->kind = VRK_CONST; + vi->sort = sort_bool; + vi->export = TRUE; + + (void) symtable_enterVar (g_symtab, vi); + + /* do "constant bool TRUE = true;" */ + /* vi->id = ltoken_copy (vi->id); */ + ltoken_setText (vi->id, lsymbol_fromChars ("TRUE")); + (void) symtable_enterVar (g_symtab, vi); + + varInfo_free (vi); + + importCTrait (); +} + +static void +LCLBootstrap (void) +{ + nameNode nn1, nn2; + ltoken range; + sigNode sign; + sort s; + + /* + ** Minimal we need to bootstrap is to provide the sort + ** "bool" and 2 bool constants "true" and "false". + ** sort_init should already have been called, and hence + ** the bool and Bool sorts defined. + */ + + s = sort_makeImmutable (ltoken_undefined, lsymbol_bool); + range = ltoken_create (simpleId, lsymbol_bool); + sign = makesigNode (ltoken_undefined, ltokenList_new (), range); + + nn1 = (nameNode) dmalloc (sizeof (*nn1)); + nn1->isOpId = TRUE; + + nn1->content.opid = ltoken_create (simpleId, lsymbol_fromChars ("true")); + + symtable_enterOp (g_symtab, nn1, sign); + + nn2 = (nameNode) dmalloc (sizeof (*nn2)); + nn2->isOpId = TRUE; + nn2->content.opid = ltoken_create (simpleId, lsymbol_fromChars ("false")); + + symtable_enterOp (g_symtab, nn2, sigNode_copy (sign)); +} + +interfaceNodeList +consInterfaceNode (/*@only@*/ interfaceNode n, /*@returned@*/ interfaceNodeList ns) +{ + /* n is never empty, but ns may be empty */ + interfaceNodeList_addl (ns, n); + return (ns); +} + +/*@only@*/ interfaceNode +makeInterfaceNodeImports (/*@only@*/ importNodeList x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + lsymbol importSymbol; + + i->kind = INF_IMPORTS; + i->content.imports = x; /* an importNodeList */ + + importNodeList_elements (x, imp) + { + importSymbol = ltoken_getRawText (imp->val); + + if (lsymbolSet_member (g_currentImports, importSymbol)) + { + lclerror (imp->val, + message ("Circular imports: %s", + cstring_fromChars (lsymbol_toChars (importSymbol)))); + } + else + { + processImport (importSymbol, imp->val, imp->kind); + } + } end_importNodeList_elements; + + lhOutLine (cstring_undefined); + return (i); +} + +/*@only@*/ interfaceNode +makeInterfaceNodeUses (/*@only@*/ traitRefNodeList x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + + i->kind = INF_USES; + i->content.uses = x; + /* read in LSL traits */ + + return (i); +} + +/*@only@*/ interfaceNode +interfaceNode_makeConst (/*@only@*/ constDeclarationNode x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + exportNode e = (exportNode) dmalloc (sizeof (*e)); + + e->kind = XPK_CONST; + e->content.constdeclaration = x; + i->kind = INF_EXPORT; + i->content.export = e; + + return (i); +} + +/*@only@*/ interfaceNode +interfaceNode_makeVar (/*@only@*/ varDeclarationNode x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + exportNode e = (exportNode) dmalloc (sizeof (*e)); + + e->kind = XPK_VAR; + e->content.vardeclaration = x; + i->kind = INF_EXPORT; + i->content.export = e; + + if (context_msgLh ()) + { + lhOutLine (lhVarDecl (x->type, x->decls, x->qualifier)); + } + + return (i); +} + +/*@only@*/ interfaceNode +interfaceNode_makeType (/*@only@*/ typeNode x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + exportNode e = (exportNode) dmalloc (sizeof (*e)); + e->kind = XPK_TYPE; + e->content.type = x; + i->kind = INF_EXPORT; + i->content.export = e; + + if (context_msgLh ()) + { + + lhOutLine (lhType (x)); + } + + return (i); +} + +/*@only@*/ interfaceNode +interfaceNode_makeFcn (/*@only@*/ fcnNode x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + exportNode e = (exportNode) dmalloc (sizeof (*e)); + + e->kind = XPK_FCN; + e->content.fcn = x; + i->kind = INF_EXPORT; + i->content.export = e; + + if (context_msgLh ()) + { + llassert (x->typespec != NULL); + llassert (x->declarator != NULL); + + lhOutLine (lhFunction (x->typespec, x->declarator)); + } + + return (i); +} + +/*@only@*/ interfaceNode +interfaceNode_makeClaim (/*@only@*/ claimNode x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + exportNode e = (exportNode) dmalloc (sizeof (*e)); + + e->kind = XPK_CLAIM; + e->content.claim = x; + i->kind = INF_EXPORT; + i->content.export = e; + return (i); +} + +/*@only@*/ interfaceNode +interfaceNode_makeIter (/*@only@*/ iterNode x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + exportNode e = (exportNode) dmalloc (sizeof (*e)); + + e->kind = XPK_ITER; + e->content.iter = x; + i->kind = INF_EXPORT; + i->content.export = e; + return (i); +} + +/*@only@*/ interfaceNode +interfaceNode_makePrivConst (/*@only@*/ constDeclarationNode x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + privateNode e = (privateNode) dmalloc (sizeof (*e)); + + e->kind = PRIV_CONST; + e->content.constdeclaration = x; + i->kind = INF_PRIVATE; + i->content.private = e; + return (i); +} + +/*@only@*/ interfaceNode +interfaceNode_makePrivVar (/*@only@*/ varDeclarationNode x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + privateNode e = (privateNode) dmalloc (sizeof (*e)); + + e->kind = PRIV_VAR; + e->content.vardeclaration = x; + i->kind = INF_PRIVATE; + i->content.private = e; + return (i); +} + +/*@only@*/ interfaceNode +interfaceNode_makePrivType (/*@only@*/ typeNode x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + privateNode e = (privateNode) dmalloc (sizeof (*e)); + + e->kind = PRIV_TYPE; + e->content.type = x; + i->kind = INF_PRIVATE; + i->content.private = e; + return (i); +} + +/*@only@*/ interfaceNode +interfaceNode_makePrivFcn (/*@only@*/ fcnNode x) +{ + interfaceNode i = (interfaceNode) dmalloc (sizeof (*i)); + privateNode e = (privateNode) dmalloc (sizeof (*e)); + + /* + ** bug detected by lclint enum checking + ** e->kind = XPK_FCN; + */ + + e->kind = PRIV_FUNCTION; + e->content.fcn = x; + i->kind = INF_PRIVATE; + i->content.private = e; + return (i); +} + +/*@only@*/ cstring +exportNode_unparse (exportNode n) +{ + if (n != (exportNode) 0) + { + switch (n->kind) + { + case XPK_CONST: + return (message + ("%q\n", + constDeclarationNode_unparse (n->content.constdeclaration))); + case XPK_VAR: + return (message + ("%q\n", + varDeclarationNode_unparse (n->content.vardeclaration))); + case XPK_TYPE: + return (message ("%q\n", typeNode_unparse (n->content.type))); + case XPK_FCN: + return (fcnNode_unparse (n->content.fcn)); + case XPK_CLAIM: + return (claimNode_unparse (n->content.claim)); + case XPK_ITER: + return (iterNode_unparse (n->content.iter)); + default: + llfatalbug (message ("exportNode_unparse: unknown kind: %d", (int) n->kind)); + } + } + return cstring_undefined; +} + +/*@only@*/ cstring +privateNode_unparse (privateNode n) +{ + if (n != (privateNode) 0) + { + switch (n->kind) + { + case PRIV_CONST: + return (constDeclarationNode_unparse (n->content.constdeclaration)); + case PRIV_VAR: + return (varDeclarationNode_unparse (n->content.vardeclaration)); + case PRIV_TYPE: + return (typeNode_unparse (n->content.type)); + case PRIV_FUNCTION: + return (fcnNode_unparse (n->content.fcn)); + default: + llfatalbug (message ("privateNode_unparse: unknown kind: %d", + (int) n->kind)); + } + } + return cstring_undefined; +} + +void lclPredicateNode_free (/*@null@*/ /*@only@*/ lclPredicateNode x) +{ + if (x != NULL) + { + termNode_free (x->predicate); + ltoken_free (x->tok); + sfree (x); + } +} + +static /*@only@*/ cstring +lclPredicateNode_unparse (/*@null@*/ lclPredicateNode p) /*@*/ +{ + if (p != (lclPredicateNode) 0) + { + cstring st = cstring_undefined; + + switch (p->kind) + { + case LPD_REQUIRES: + st = cstring_makeLiteral (" requires "); + break; + case LPD_CHECKS: + st = cstring_makeLiteral (" checks "); + break; + case LPD_ENSURES: + st = cstring_makeLiteral (" ensures "); + break; + case LPD_INTRACLAIM: + st = cstring_makeLiteral (" claims "); + break; + case LPD_CONSTRAINT: + st = cstring_makeLiteral ("constraint "); + break; + case LPD_INITIALLY: + st = cstring_makeLiteral ("initially "); + break; + case LPD_PLAIN: + break; + default: + llfatalbug (message ("lclPredicateNode_unparse: unknown kind: %d", + (int) p->kind)); + } + return (message ("%q%q;\n", st, termNode_unparse (p->predicate))); + } + return cstring_undefined; +} + +bool +ltoken_similar (ltoken t1, ltoken t2) +{ + lsymbol sym1 = ltoken_getText (t1); + lsymbol sym2 = ltoken_getText (t2); + + if (sym1 == sym2) + { + return TRUE; + } + + if ((sym1 == eqSymbol && sym2 == equalSymbol) || + (sym2 == eqSymbol && sym1 == equalSymbol)) + { + return TRUE; + } + + if ((sym1 == lsymbol_bool && sym2 == lsymbol_Bool) || + (sym2 == lsymbol_bool && sym1 == lsymbol_Bool)) + { + return TRUE; + } + + return FALSE; +} + +/*@only@*/ cstring +iterNode_unparse (/*@null@*/ iterNode i) +{ + if (i != (iterNode) 0) + { + return (message ("iter %s %q", ltoken_unparse (i->name), + paramNodeList_unparse (i->params))); + } + return cstring_undefined; +} + + +/*@only@*/ cstring +fcnNode_unparse (/*@null@*/ fcnNode f) +{ + if (f != (fcnNode) 0) + { + return (message ("%q %q%q{\n%q%q%q%q%q%q}\n", + lclTypeSpecNode_unparse (f->typespec), + declaratorNode_unparse (f->declarator), + varDeclarationNodeList_unparse (f->globals), + varDeclarationNodeList_unparse (f->inits), + letDeclNodeList_unparse (f->lets), + lclPredicateNode_unparse (f->require), + modifyNode_unparse (f->modify), + lclPredicateNode_unparse (f->ensures), + lclPredicateNode_unparse (f->claim))); + } + return cstring_undefined; +} + +/*@only@*/ cstring +varDeclarationNode_unparse (/*@null@*/ varDeclarationNode x) +{ + if (x != (varDeclarationNode) 0) + { + cstring st; + + if (x->isSpecial) + { + return (sRef_unparse (x->sref)); + } + else + { + switch (x->qualifier) + { + case QLF_NONE: + st = cstring_undefined; + break; + case QLF_CONST: + st = cstring_makeLiteral ("const "); + break; + case QLF_VOLATILE: + st = cstring_makeLiteral ("volatile "); + break; + BADDEFAULT; + } + + st = message ("%q%q %q", st, lclTypeSpecNode_unparse (x->type), + initDeclNodeList_unparse (x->decls)); + return (st); + } + } + + return cstring_undefined; +} + +/*@only@*/ cstring +typeNode_unparse (/*@null@*/ typeNode t) +{ + if (t != (typeNode) 0) + { + switch (t->kind) + { + case TK_ABSTRACT: + return (abstractNode_unparse (t->content.abstract)); + case TK_EXPOSED: + return (exposedNode_unparse (t->content.exposed)); + case TK_UNION: + return (taggedUnionNode_unparse (t->content.taggedunion)); + default: + llfatalbug (message ("typeNode_unparse: unknown kind: %d", (int)t->kind)); + } + } + return cstring_undefined; +} + +/*@only@*/ cstring +constDeclarationNode_unparse (/*@null@*/ constDeclarationNode x) +{ + if (x != (constDeclarationNode) 0) + { + return (message ("constant %q %q", lclTypeSpecNode_unparse (x->type), + initDeclNodeList_unparse (x->decls))); + } + + return cstring_undefined; +} + +/*@only@*/ storeRefNode +makeStoreRefNodeTerm (/*@only@*/ termNode t) +{ + storeRefNode x = (storeRefNode) dmalloc (sizeof (*x)); + + x->kind = SRN_TERM; + x->content.term = t; + return (x); +} + +/*@only@*/ storeRefNode +makeStoreRefNodeType (/*@only@*/ lclTypeSpecNode t, bool isObj) +{ + storeRefNode x = (storeRefNode) dmalloc (sizeof (*x)); + + x->kind = isObj ? SRN_OBJ : SRN_TYPE; + x->content.type = t; + return (x); +} + +storeRefNode +makeStoreRefNodeInternal (void) +{ + storeRefNode x = (storeRefNode) dmalloc (sizeof (*x)); + + x->kind = SRN_SPECIAL; + x->content.ref = sRef_makeInternalState (); + return (x); +} + +storeRefNode +makeStoreRefNodeSystem (void) +{ + storeRefNode x = (storeRefNode) dmalloc (sizeof (*x)); + + x->kind = SRN_SPECIAL; + x->content.ref = sRef_makeSystemState (); + return (x); +} + +/*@only@*/ modifyNode +makeModifyNodeSpecial (/*@only@*/ ltoken t, bool modifiesNothing) +{ + modifyNode x = (modifyNode) dmalloc (sizeof (*x)); + + x->tok = t; + x->modifiesNothing = modifiesNothing; + x->hasStoreRefList = FALSE; + return (x); +} + +/*@only@*/ modifyNode +makeModifyNodeRef (/*@only@*/ ltoken t, /*@only@*/ storeRefNodeList y) +{ + modifyNode x = (modifyNode) dmalloc (sizeof (*x)); + sort sort; + + x->tok = t; + x->hasStoreRefList = TRUE; + x->modifiesNothing = FALSE; + x->list = y; + /* check that all storeRef's are modifiable */ + + storeRefNodeList_elements (y, sr) + { + if (storeRefNode_isTerm (sr)) + { + sort = sr->content.term->sort; + + if (!sort_mutable (sort) && sort_isValidSort (sort)) + { + ltoken errtok = termNode_errorToken (sr->content.term); + lclerror (errtok, + message ("Term denoting immutable object used in modifies list: %q", + termNode_unparse (sr->content.term))); + } + } + else + { + if (!storeRefNode_isSpecial (sr)) + { + sort = lclTypeSpecNode2sort (sr->content.type); + + if (storeRefNode_isObj (sr)) + { + sort = sort_makeObj (sort); + } + + if (!sort_mutable (sort)) + { + ltoken errtok = lclTypeSpecNode_errorToken (sr->content.type); + lclerror (errtok, + message ("Immutable type used in modifies list: %q", + sort_unparse (sort))); + } + } + } + } end_storeRefNodeList_elements; + return (x); +} + +/*@observer@*/ ltoken +termNode_errorToken (/*@null@*/ termNode n) +{ + if (n != (termNode) 0) + { + switch (n->kind) + { + case TRM_LITERAL: + case TRM_UNCHANGEDALL: + case TRM_UNCHANGEDOTHERS: + case TRM_SIZEOF: + case TRM_CONST: + case TRM_VAR: + case TRM_ZEROARY: /* also the default kind, when no in symbol table */ + return n->literal; + case TRM_QUANTIFIER: + return n->quantified->open; + case TRM_APPLICATION: + if (n->name != NULL) + { + if (n->name->isOpId) + { + return n->name->content.opid; + } + else + { + llassert (n->name->content.opform != NULL); + return n->name->content.opform->tok; + } + } + else + { + return ltoken_undefined; + } + } + } + return ltoken_undefined; +} + +/*@observer@*/ ltoken +nameNode_errorToken (/*@null@*/ nameNode nn) +{ + if (nn != (nameNode) 0) + { + if (nn->isOpId) + { + return nn->content.opid; + } + else + { + if (nn->content.opform != NULL) + { + return nn->content.opform->tok; + } + } + } + + return ltoken_undefined; +} + +/*@observer@*/ ltoken +lclTypeSpecNode_errorToken (/*@null@*/ lclTypeSpecNode t) +{ + if (t != (lclTypeSpecNode) 0) + { + switch (t->kind) + { + case LTS_TYPE: + { + llassert (t->content.type != NULL); + + if (ltokenList_empty (t->content.type->ctypes)) + break; + else + return (ltokenList_head (t->content.type->ctypes)); + } + case LTS_STRUCTUNION: + llassert (t->content.structorunion != NULL); + return t->content.structorunion->tok; + case LTS_ENUM: + llassert (t->content.enumspec != NULL); + return t->content.enumspec->tok; + case LTS_CONJ: + return (lclTypeSpecNode_errorToken (t->content.conj->a)); + } + } + + return ltoken_undefined; +} + +static bool +sort_member_modulo_cstring (sort s, /*@null@*/ termNode t) +{ + + if (t != (termNode) 0) + { + if (t->kind == TRM_LITERAL) + { /* allow multiple types */ + sortNode sn; + + sortSet_elements (t->possibleSorts, el) + { + if (sort_compatible_modulo_cstring (s, el)) + { + return TRUE; + } + } end_sortSet_elements; + + sn = sort_lookup (s); + + if (sn.kind == SRT_PTR) + { + char *lit = lsymbol_toChars (ltoken_getText (t->literal)); + + if (lit != NULL) + { + long val = 0; + + if (sscanf (lit, "%ld", &val) == 1) + { + if (val == 0) return TRUE; + } + } + } + + return FALSE; + } + else + { + return sort_compatible_modulo_cstring (s, t->sort); + } + } + return FALSE; +} + +/*@only@*/ letDeclNode + makeLetDeclNode (ltoken varid, /*@only@*/ /*@null@*/ lclTypeSpecNode t, + /*@only@*/ termNode term) +{ + letDeclNode x = (letDeclNode) dmalloc (sizeof (*x)); + varInfo vi = (varInfo) dmalloc (sizeof (*vi)); + ltoken errtok; + sort s, termsort; + + if (t != (lclTypeSpecNode) 0) + { + /* check varid has the same sort as term */ + s = lclTypeSpecNode2sort (t); + termsort = term->sort; + /* should keep the arguments in order */ + if (!sort_member_modulo_cstring (s, term) && + !term->error_reported) + { + errtok = termNode_errorToken (term); + + /* errorShowPoint (tsource_thisLine (lclsource), ltoken_getCol (errtok)); */ + /* sprintf (ERRMSG, "expect `%s' type but given term has `%s' type", + sort_unparse (s), sort_unparse (termsort)); */ + + lclerror (errtok, + message ("Let declaration expects type %q", sort_unparse (s))); + /* evs --- don't know how to generated this message or what it means? */ + } + } + else + { + s = term->sort; + } + /* assign variable its type and sort, store in symbol table */ + vi->id = ltoken_copy (varid); + vi->kind = VRK_LET; + vi->sort = s; + vi->export = TRUE; + + (void) symtable_enterVar (g_symtab, vi); + varInfo_free (vi); + + x->varid = varid; + x->sortspec = t; + x->term = term; + x->sort = sort_makeNoSort (); + + return (x); +} + +/*@only@*/ programNode +makeProgramNodeAction (/*@only@*/ programNodeList x, actionKind k) +{ + programNode n = (programNode) dmalloc (sizeof (*n)); + n->wrapped = 0; + n->kind = k; + n->content.args = x; + return (n); +} + +/*@only@*/ programNode +makeProgramNode (/*@only@*/ stmtNode x) +{ + programNode n = (programNode) dmalloc (sizeof (*n)); + + n->wrapped = 0; + n->kind = ACT_SELF; + n->content.self = x; + return (n); +} + +/*@only@*/ typeNode +makeAbstractTypeNode (/*@only@*/ abstractNode x) +{ + typeNode n = (typeNode) dmalloc (sizeof (*n)); + + n->kind = TK_ABSTRACT; + n->content.abstract = x; + + return (n); +} + +/*@only@*/ typeNode +makeExposedTypeNode (/*@only@*/ exposedNode x) +{ + typeNode n = (typeNode) dmalloc (sizeof (*n)); + + n->kind = TK_EXPOSED; + n->content.exposed = x; + return (n); +} + +/* +** evs added 8 Sept 1993 +*/ + +/*@only@*/ importNode +importNode_makePlain (/*@only@*/ ltoken t) +{ + importNode imp = (importNode) dmalloc (sizeof (*imp)); + + imp->kind = IMPPLAIN; + imp->val = t; + return (imp); +} + +/*@only@*/ importNode +importNode_makeBracketed (/*@only@*/ ltoken t) +{ + importNode imp = (importNode) dmalloc (sizeof (*imp)); + + imp->kind = IMPBRACKET; + imp->val = t; + return (imp); +} + +static cstring extractQuote (/*@only@*/ cstring s) +{ + int len = cstring_length (s); + char *sc = cstring_toCharsSafe (s); + cstring t; + + llassert (len > 1); + *(sc + len - 1) = '\0'; + t = cstring_fromChars (mstring_copy (sc + 1)); + cstring_free (s); + return (t); +} + +/*@only@*/ importNode +importNode_makeQuoted (/*@only@*/ ltoken t) +{ + importNode imp = (importNode) dmalloc (sizeof (*imp)); + cstring q = extractQuote (cstring_copy (ltoken_getRawString (t))); + + imp->kind = IMPQUOTE; + + ltoken_setRawText (t, lsymbol_fromChars (cstring_toCharsSafe (q))); + + imp->val = t; + + cstring_free (q); + return (imp); +} + +/* +** check that is it '<' and '>' +** should probably be in a different file? +*/ + +static void cylerror (/*@only@*/ char *s) +{ + ylerror(s); + sfree (s); +} + +void +checkBrackets (ltoken lb, ltoken rb) +{ + /* no attempt at error recovery...not really necessary */ + cstring tname; + + tname = ltoken_getRawString (lb); + + if (!cstring_equalLit (tname, "<")) + { + cylerror (cstring_toCharsSafeO (message ("Invalid import token: %s", tname))); + } + + tname = ltoken_getRawString (rb); + + if (!cstring_equalLit (tname, ">")) + { + cylerror (cstring_toCharsSafeO (message ("Invalid import token: %s", tname))); + } +} + +/*@only@*/ traitRefNode +makeTraitRefNode (/*@only@*/ ltokenList fl, /*@only@*/ renamingNode r) +{ + traitRefNode n = (traitRefNode) dmalloc (sizeof (*n)); + + n->traitid = fl; + n->rename = r; + return (n); +} + +/* +** printLeaves: no commas +*/ + +static /*@only@*/ cstring +printLeaves (ltokenList f) +{ + bool firstone = TRUE; + cstring s = cstring_undefined; + + ltokenList_elements (f, i) + { + if (firstone) + { + s = cstring_copy (ltoken_unparse (i)); + firstone = FALSE; + } + else + { + s = message ("%q %s", s, ltoken_unparse (i)); + } + } end_ltokenList_elements; + + return s; +} + + +/*@only@*/ cstring +printLeaves2 (ltokenList f) +{ + return (ltokenList_unparse (f)); +} + +/*@only@*/ cstring +printRawLeaves2 (ltokenList f) +{ + bool first = TRUE; + cstring s = cstring_undefined; + + ltokenList_elements (f, i) + { + if (first) + { + s = message ("%s", ltoken_getRawString (i)); + first = FALSE; + } + else + s = message ("%q, %s", s, ltoken_getRawString (i)); + } end_ltokenList_elements; + + return s; +} + +/*@only@*/ renamingNode +makeRenamingNode (/*@only@*/ typeNameNodeList n, /*@only@*/ replaceNodeList r) +{ + renamingNode ren = (renamingNode) dmalloc (sizeof (*ren)); + + if (typeNameNodeList_empty (n)) + { + ren->is_replace = TRUE; + ren->content.replace = r; + typeNameNodeList_free (n); + } + else + { + nameAndReplaceNode nr = (nameAndReplaceNode) dmalloc (sizeof (*nr)); + nr->replacelist = r; + nr->namelist = n; + ren->is_replace = FALSE; + ren->content.name = nr; + } + + return (ren); +} + +/*@only@*/ cstring +renamingNode_unparse (/*@null@*/ renamingNode x) +{ + if (x != (renamingNode) 0) + { + if (x->is_replace) + { + return (replaceNodeList_unparse (x->content.replace)); + } + else + { + return (message ("%q%q", typeNameNodeList_unparse (x->content.name->namelist), + replaceNodeList_unparse (x->content.name->replacelist))); + } + } + return cstring_undefined; +} + +/*@only@*/ replaceNode +makeReplaceNameNode (ltoken t, typeNameNode tn, nameNode nn) +{ + replaceNode r = (replaceNode) dmalloc (sizeof (*r)); + + r->tok = t; + r->isCType = FALSE; + r->typename = tn; + r->content.renamesortname.name = nn; + r->content.renamesortname.signature = (sigNode)NULL; + + return (r); +} + +/*@only@*/ replaceNode +makeReplaceNode (ltoken t, typeNameNode tn, + bool is_ctype, ltoken ct, + nameNode nn, sigNode sn) +{ + replaceNode r = (replaceNode) dmalloc (sizeof (*r)); + + r->tok = t; + r->isCType = is_ctype; + r->typename = tn; + + if (is_ctype) + { + r->content.ctype = ct; + sigNode_free (sn); + nameNode_free (nn); + } + else + { + r->content.renamesortname.name = nn; + r->content.renamesortname.signature = sn; + ltoken_free (ct); + } + + return (r); +} + +/*@only@*/ cstring +replaceNode_unparse (/*@null@*/ replaceNode x) +{ + if (x != (replaceNode) 0) + { + cstring st; + + st = message ("%q for ", typeNameNode_unparse (x->typename)); + + if (x->isCType) + { + st = message ("%q%s", st, ltoken_getRawString (x->content.ctype)); + } + else + { + st = message ("%q%q%q", st, nameNode_unparse (x->content.renamesortname.name), + sigNode_unparse (x->content.renamesortname.signature)); + } + return st; + } + return cstring_undefined; +} + +/*@only@*/ nameNode +makeNameNodeForm (/*@only@*/ /*@null@*/ opFormNode opform) +{ + nameNode nn = (nameNode) dmalloc (sizeof (*nn)); + + nn->isOpId = FALSE; + nn->content.opform = opform; + + return (nn); +} + +/*@only@*/ nameNode +makeNameNodeId (/*@only@*/ ltoken opid) +{ + nameNode nn = (nameNode) dmalloc (sizeof (*nn)); + + /* + ** current LSL -syms output bug produces "if_then_else_" rather + ** than 6 separate tokens + */ + + if (ltoken_getText (opid) == ConditionalSymbol) + { + opFormNode opform = makeOpFormNode (ltoken_undefined, OPF_IF, + opFormUnion_createMiddle (0), + ltoken_undefined); + nn->isOpId = FALSE; + nn->content.opform = opform; + ltoken_free (opid); + } + else + { + nn->isOpId = TRUE; + nn->content.opid = opid; + } + + return (nn); +} + +/*@only@*/ cstring +nameNode_unparse (/*@null@*/ nameNode n) +{ + if (n != (nameNode) 0) + { + if (n->isOpId) + { + return (cstring_copy (ltoken_getRawString (n->content.opid))); /*!!!*/ + } + else + { + return (opFormNode_unparse (n->content.opform)); + } + } + return cstring_undefined; +} + +/*@only@*/ sigNode +makesigNode (ltoken t, /*@only@*/ ltokenList domain, ltoken range) +{ + sigNode s = (sigNode) dmalloc (sizeof (*s)); + unsigned int key; + + /* + ** Assign a hash key here to speed up lookup of operators. + */ + + s->tok = t; + s->domain = domain; + s->range = range; + key = MASH (0, ltoken_getText (range)); + + ltokenList_elements (domain, id) + { + lsymbol sym = ltoken_getText (id); + key = MASH (key, sym); + } end_ltokenList_elements; + + s->key = key; + return (s); +} + +cstring sigNode_unparse (/*@null@*/ sigNode n) +{ + if (n != (sigNode) 0) + { + return (message (":%q -> %s", printLeaves2 (n->domain), + ltoken_unparse (n->range))); + } + + return cstring_undefined; +} + +void sigNode_markOwned (sigNode n) +{ + sfreeEventually (n); +} + +/*@only@*/ cstring +sigNode_unparseText (/*@null@*/ sigNode n) +{ + if (n != (sigNode) 0) + { + return (message ("%q -> %s", printLeaves2 (n->domain), + ltoken_unparse (n->range))); + } + return cstring_undefined; +} + +static unsigned int + opFormNode2key (opFormNode op, opFormKind k) +{ + unsigned int key; + + switch (k) + { + case OPF_IF: + /* OPF_IF is the first enum, so it's 0 */ + + /*@-type@*/ + key = MASH (k, k + 1); + /*@=type@*/ + + break; + case OPF_ANYOP: + case OPF_MANYOP: + case OPF_ANYOPM: + case OPF_MANYOPM: + { /* treat eq and = the same */ + lsymbol sym = ltoken_getText (op->content.anyop); + + if (sym == equalSymbol) + { + key = MASH (k, eqSymbol); + } + else + { + key = MASH (k, ltoken_getText (op->content.anyop)); + } + break; + } + case OPF_MIDDLE: + case OPF_MMIDDLE: + case OPF_MIDDLEM: + case OPF_MMIDDLEM: + case OPF_BMIDDLE: + case OPF_BMMIDDLE: + case OPF_BMIDDLEM: + case OPF_BMMIDDLEM: + key = MASH (k, op->content.middle); + key = MASH (key, ltoken_getRawText (op->tok)); + break; + case OPF_SELECT: + case OPF_MAP: + case OPF_MSELECT: + case OPF_MMAP: + key = MASH (k, ltoken_getRawText (op->content.id)); + break; + default: + key = 0; + } + + return key; +} + +/*@only@*/ opFormNode +makeOpFormNode (ltoken t, opFormKind k, opFormUnion u, + ltoken close) +{ + opFormNode n = (opFormNode) dmalloc (sizeof (*n)); + unsigned int key = 0; + + /* + ** Assign a hash key here to speed up lookup of operators. + */ + + n->tok = t; + n->close = close; + n->kind = k; + + + switch (k) + { + case OPF_IF: + n->content.middle = 0; + /* OPF_IF is the first enum, so it's 0 */ + key = MASH /*@+enumint@*/ (k, k + 1) /*@=enumint@*/; + break; + case OPF_ANYOP: + case OPF_MANYOP: + case OPF_ANYOPM: + case OPF_MANYOPM: + { /* treat eq and = the same */ + lsymbol sym = ltoken_getText (u.anyop); + + if (sym == equalSymbol) + { + key = MASH (k, eqSymbol); + } + else + { + key = MASH (k, ltoken_getText (u.anyop)); + } + + n->content = u; + break; + } + case OPF_MIDDLE: + case OPF_MMIDDLE: + case OPF_MIDDLEM: + case OPF_MMIDDLEM: + case OPF_BMIDDLE: + case OPF_BMMIDDLE: + case OPF_BMIDDLEM: + case OPF_BMMIDDLEM: + n->content = u; + key = MASH (k, u.middle); + key = MASH (key, ltoken_getRawText (t)); + break; + case OPF_SELECT: + case OPF_MAP: + case OPF_MSELECT: + case OPF_MMAP: + key = MASH (k, ltoken_getRawText (u.id)); + n->content = u; + break; + default: + { + llbug (message ("makeOpFormNode: unknown opFormKind: %d", (int) k)); + } + } + n->key = key; + return (n); +} + +static cstring printMiddle (int j) +{ + int i; + char *s = mstring_createEmpty (); + + for (i = j; i >= 1; i--) + { + s = mstring_concatFree1 (s, "__"); + + if (i != 1) + { + s = mstring_concatFree1 (s, ", "); + } + } + + return cstring_fromCharsO (s); +} + +/*@only@*/ cstring +opFormNode_unparse (/*@null@*/ opFormNode n) +{ + if (n != (opFormNode) 0) + { + switch (n->kind) + { + case OPF_IF: + return (cstring_makeLiteral ("if __ then __ else __ ")); + case OPF_ANYOP: + return (cstring_copy (ltoken_getRawString (n->content.anyop))); + case OPF_MANYOP: + return (message ("__ %s", ltoken_getRawString (n->content.anyop))); + case OPF_ANYOPM: + return (message ("%s __ ", ltoken_getRawString (n->content.anyop))); + case OPF_MANYOPM: + return (message ("__ %s __ ", ltoken_getRawString (n->content.anyop))); + case OPF_MIDDLE: + return (message ("%s %q %s", + ltoken_getRawString (n->tok), + printMiddle (n->content.middle), + ltoken_getRawString (n->close))); + case OPF_MMIDDLE: + return (message ("__ %s %q %s", + ltoken_getRawString (n->tok), + printMiddle (n->content.middle), + ltoken_getRawString (n->close))); + case OPF_MIDDLEM: + return (message ("%s %q %s __", + ltoken_getRawString (n->tok), + printMiddle (n->content.middle), + ltoken_getRawString (n->close))); + case OPF_MMIDDLEM: + return (message ("__ %s%q %s __", + ltoken_getRawString (n->tok), + printMiddle (n->content.middle), + ltoken_getRawString (n->close))); + case OPF_BMIDDLE: + return (message ("[%q]", printMiddle (n->content.middle))); + case OPF_BMMIDDLE: + return (message ("__ [%q]", printMiddle (n->content.middle))); + case OPF_BMIDDLEM: + return (message ("[%q] __", printMiddle (n->content.middle))); + case OPF_BMMIDDLEM: + return (message ("__ [%q] __", printMiddle (n->content.middle))); + case OPF_SELECT: + return (message (" \\select %s", ltoken_getRawString (n->content.id))); + case OPF_MAP: + return (message (" \\field_arrow%s", ltoken_getRawString (n->content.id))); + case OPF_MSELECT: + return (message ("__ \\select %s", ltoken_getRawString (n->content.id))); + case OPF_MMAP: + return (message ("__ \\field_arrow %s", ltoken_getRawString (n->content.id))); + default: + llfatalbug (message ("opFormNodeUnparse: unknown kind: %d", + (int) n->kind)); + } + } + return cstring_undefined; +} + +/*@only@*/ typeNameNode +makeTypeNameNode (bool isObj, lclTypeSpecNode t, abstDeclaratorNode n) +{ + typeNameNode tn = (typeNameNode) dmalloc (sizeof (*tn)); + typeNamePack p = (typeNamePack) dmalloc (sizeof (*p)); + + tn->isTypeName = TRUE; + p->isObj = isObj; + p->type = t; + p->abst = n; + tn->opform = (opFormNode) 0; + tn->typename = p; + return (tn); +} + +/*@only@*/ typeNameNode +makeTypeNameNodeOp (opFormNode n) +{ + typeNameNode t = (typeNameNode) dmalloc (sizeof (*t)); + t->typename = (typeNamePack) 0; + t->opform = n; + t->isTypeName = FALSE; + return (t); +} + +/*@only@*/ cstring +typeNameNode_unparse (/*@null@*/ typeNameNode n) +{ + if (n != (typeNameNode) 0) + { + if (n->isTypeName) + { + cstring st = cstring_undefined; + typeNamePack p = n->typename; + + llassert (p != NULL); + + if (p->isObj) + st = cstring_makeLiteral ("obj "); + + return (message ("%q%q%q", st, lclTypeSpecNode_unparse (p->type), + abstDeclaratorNode_unparse (p->abst))); + + } + else + return (opFormNode_unparse (n->opform)); + } + return cstring_undefined; +} + +/*@only@*/ lclTypeSpecNode +makeLclTypeSpecNodeConj (/*@null@*/ lclTypeSpecNode a, /*@null@*/ lclTypeSpecNode b) +{ + lclTypeSpecNode n = (lclTypeSpecNode) dmalloc (sizeof (*n)); + + n->kind = LTS_CONJ; + n->pointers = 0; + n->quals = qualList_new (); + n->content.conj = (lclconj) dmalloc (sizeof (*n->content.conj)); + n->content.conj->a = a; + n->content.conj->b = b; + + return (n); +} + +/*@only@*/ lclTypeSpecNode +makeLclTypeSpecNodeType (/*@null@*/ CTypesNode x) +{ + lclTypeSpecNode n = (lclTypeSpecNode) dmalloc (sizeof (*n)); + + n->kind = LTS_TYPE; + n->pointers = 0; + n->content.type = x; + n->quals = qualList_new (); + return (n); +} + +/*@only@*/ lclTypeSpecNode +makeLclTypeSpecNodeSU (/*@null@*/ strOrUnionNode x) +{ + lclTypeSpecNode n = (lclTypeSpecNode) dmalloc (sizeof (*n)); + + n->kind = LTS_STRUCTUNION; + n->pointers = 0; + n->content.structorunion = x; + n->quals = qualList_new (); + return (n); +} + +/*@only@*/ lclTypeSpecNode +makeLclTypeSpecNodeEnum (/*@null@*/ enumSpecNode x) +{ + lclTypeSpecNode n = (lclTypeSpecNode) dmalloc (sizeof (*n)); + + n->quals = qualList_new (); + n->kind = LTS_ENUM; + n->pointers = 0; + n->content.enumspec = x; + return (n); +} + +lclTypeSpecNode +lclTypeSpecNode_addQual (lclTypeSpecNode n, qual q) +{ + llassert (lclTypeSpecNode_isDefined (n)); + n->quals = qualList_add (n->quals, q); + return n; +} + +/*@only@*/ cstring +lclTypeSpecNode_unparse (/*@null@*/ lclTypeSpecNode n) +{ + if (n != (lclTypeSpecNode) 0) + { + switch (n->kind) + { + case LTS_TYPE: + llassert (n->content.type != NULL); + return (printLeaves (n->content.type->ctypes)); + case LTS_STRUCTUNION: + return (strOrUnionNode_unparse (n->content.structorunion)); + case LTS_ENUM: + return (enumSpecNode_unparse (n->content.enumspec)); + case LTS_CONJ: + return (lclTypeSpecNode_unparse (n->content.conj->a)); + default: + llfatalbug (message ("lclTypeSpecNode_unparse: unknown lclTypeSpec kind: %d", + (int) n->kind)); + } + } + return cstring_undefined; +} + +/*@only@*/ enumSpecNode +makeEnumSpecNode (ltoken t, ltoken optTagId, + /*@owned@*/ ltokenList enums) +{ + enumSpecNode n = (enumSpecNode) dmalloc (sizeof (*n)); + tagInfo ti; + smemberInfo *top = smemberInfo_undefined; + + n->tok = t; + n->opttagid = ltoken_copy (optTagId); + n->enums = enums; + + /* generate sort for this LCL type */ + n->sort = sort_makeEnum (optTagId); + + if (!ltoken_isUndefined (optTagId)) + { + /* First, check to see if tag is already defined */ + ti = symtable_tagInfo (g_symtab, ltoken_getText (optTagId)); + + if (tagInfo_exists (ti)) + { + if (ti->kind == TAG_ENUM) + { + /* 23 Sep 1995 --- had been noting here...is this right? */ + + ti->content.enums = enums; + ti->sort = n->sort; + ti->imported = context_inImport (); + } + else + { + lclerror (optTagId, + message ("Tag %s previously defined as %q, redefined as enum", + ltoken_getRawString (optTagId), + tagKind_unparse (ti->kind))); + + /* evs --- shouldn't they be in different name spaces? */ + } + + ltoken_free (optTagId); + } + else + { + ti = (tagInfo) dmalloc (sizeof (*ti)); + + ti->kind = TAG_ENUM; + ti->id = optTagId; + ti->content.enums = enums; + ti->sort = n->sort; + ti->imported = context_inImport (); + /* First, store tag info in symbol table */ + (void) symtable_enterTag (g_symtab, ti); + } + } + + /* check that enumeration constants are unique */ + + ltokenList_reset (enums); + + while (!ltokenList_isFinished (enums)) + { + ltoken c = ltokenList_current (enums); + smemberInfo *ei = (smemberInfo *) dmalloc (sizeof (*ei)); + + ei->name = ltoken_getText (c); + ei->next = top; + ei->sort = n->sort; + top = ei; + + if (!varInfo_exists (symtable_varInfo (g_symtab, ltoken_getText (c)))) + { /* put info into symbol table */ + varInfo vi = (varInfo) dmalloc (sizeof (*vi)); + + vi->id = ltoken_copy (c); + vi->kind = VRK_ENUM; + vi->sort = n->sort; + vi->export = TRUE; + + (void) symtable_enterVar (g_symtab, vi); + varInfo_free (vi); + } + else + { + lclerror (c, message ("Enumerated value redeclared: %s", + ltoken_getRawString (c))); + ltokenList_removeCurrent (enums); + } + ltokenList_advance (enums); + /*@-branchstate@*/ + } + /*@=branchstate@*/ + + (void) sort_updateEnum (n->sort, top); + return (n); +} + +/*@only@*/ enumSpecNode +makeEnumSpecNode2 (ltoken t, ltoken tagid) +{ + /* a reference, not a definition */ + enumSpecNode n = (enumSpecNode) dmalloc (sizeof (*n)); + tagInfo ti = symtable_tagInfo (g_symtab, ltoken_getText (tagid)); + + n->tok = t; + n->opttagid = tagid; + n->enums = ltokenList_new (); + + if (tagInfo_exists (ti)) + { + if (ti->kind == TAG_ENUM) + { + n->sort = ti->sort; + } + else + { + n->sort = sort_makeNoSort (); + lclerror (tagid, message ("Tag %s defined as %q, used as enum", + ltoken_getRawString (tagid), + tagKind_unparse (ti->kind))); + } + } + else + { + n->sort = sort_makeNoSort (); + lclerror (t, message ("Undefined type: enum %s", + ltoken_getRawString (tagid))); + } + + return (n); +} + +/*@only@*/ cstring +enumSpecNode_unparse (/*@null@*/ enumSpecNode n) +{ + if (n != (enumSpecNode) 0) + { + cstring s = cstring_makeLiteral ("enum "); + + if (!ltoken_isUndefined (n->opttagid)) + { + s = message ("%q%s ", s, ltoken_getRawString (n->opttagid)); + } + + s = message ("%q{%q}", s, printLeaves2 (n->enums)); + return s; + } + return cstring_undefined; +} + +/*@only@*/ strOrUnionNode +makestrOrUnionNode (ltoken str, suKind k, ltoken opttagid, + /*@only@*/ stDeclNodeList x) +{ + strOrUnionNode n = (strOrUnionNode) dmalloc (sizeof (*n)); + lsymbolSet set = lsymbolSet_new (); + declaratorNodeList declarators; + sort fieldsort, tsort1, tsort2; + smemberInfo *mi, *top = smemberInfo_undefined; + bool doTag = FALSE; + bool isStruct = (k == SU_STRUCT); + tagInfo t; + + + n->kind = k; + n->tok = str; + n->opttagid = ltoken_copy (opttagid); + n->structdecls = x; + n->sort = isStruct ? sort_makeStr (opttagid) : sort_makeUnion (opttagid); + + if (!ltoken_isUndefined (opttagid)) + { + /* First, check to see if tag is already defined */ + t = symtable_tagInfo (g_symtab, ltoken_getText (opttagid)); + + if (tagInfo_exists (t)) + { + if ((t->kind == TAG_FWDUNION && k == SU_UNION) || + (t->kind == TAG_FWDSTRUCT && k == SU_STRUCT)) + { + /* to allow self-recursive types and forward tag declarations */ + t->content.decls = stDeclNodeList_copy (x); /* update tag info */ + t->sort = n->sort; + } + else + { + lclerror (opttagid, + message ("Tag %s previously defined as %q, used as %q", + ltoken_getRawString (opttagid), + tagKind_unparse (t->kind), + cstring_makeLiteral (isStruct ? "struct" : "union"))); + } + } + else + { + doTag = TRUE; + } + } + else + { + doTag = TRUE; + } + + if (doTag && !ltoken_isUndefined (opttagid)) + { + t = (tagInfo) dmalloc (sizeof (*t)); + + /* can either override prev defn or use prev defn */ + /* override it so as to detect more errors */ + + t->kind = (k == SU_STRUCT) ? TAG_STRUCT : TAG_UNION; + t->id = opttagid; + t->content.decls = stDeclNodeList_copy (x); + t->sort = n->sort; + t->imported = FALSE; + + /* Next, update tag info in symbol table */ + (void) symtable_enterTagForce (g_symtab, t); + } + + /* check no duplicate field names */ + + stDeclNodeList_elements (x, i) + { + fieldsort = lclTypeSpecNode2sort (i->lcltypespec); + + /* need the locations, not values */ + /* fieldsort = sort_makeObj (fieldsort); */ + /* 2/19/93, was + fieldsort = sort_makeGlobal (fieldsort); */ + + declarators = i->declarators; + + declaratorNodeList_elements (declarators, decl) + { + lsymbol fieldname; + mi = (smemberInfo *) dmalloc (sizeof (*mi)); + /* need to make dynamic copies */ + fieldname = ltoken_getText (decl->id); + + /* 2/19/93, added */ + tsort1 = typeExpr2ptrSort (fieldsort, decl->type); + tsort2 = sort_makeGlobal (tsort1); + + mi->name = fieldname; + mi->sort = tsort2; /* fieldsort; */ + mi->next = top; + top = mi; + + if (lsymbolSet_member (set, fieldname)) + { + lclerror (decl->id, + message ("Field name reused: %s", + ltoken_getRawString (decl->id))); + } + else + { + (void) lsymbolSet_insert (set, fieldname); + } + /*@-branchstate@*/ + } end_declaratorNodeList_elements; + /*@=branchstate@*/ + } end_stDeclNodeList_elements; + + if (k == SU_STRUCT) + { + (void) sort_updateStr (n->sort, top); + } + else + { + (void) sort_updateUnion (n->sort, top); + } + + /* We shall keep the info with both tags and types if any + of them are present. */ + + lsymbolSet_free (set); + + return (n); +} + +/*@only@*/ strOrUnionNode +makeForwardstrOrUnionNode (ltoken str, suKind k, + ltoken tagid) +{ + strOrUnionNode n = (strOrUnionNode) dmalloc (sizeof (*n)); + sort sort = sort_makeNoSort (); + tagInfo t; + + /* a reference, not a definition */ + + n->kind = k; + n->tok = str; + n->opttagid = tagid; + n->structdecls = stDeclNodeList_new (); + + /* get sort for this LCL type */ + t = symtable_tagInfo (g_symtab, ltoken_getText (tagid)); + + if (tagInfo_exists (t)) + { + sort = t->sort; + + if (!(((t->kind == TAG_STRUCT || t->kind == TAG_FWDSTRUCT) && k == SU_STRUCT) + || ((t->kind == TAG_UNION || t->kind == TAG_FWDUNION) && k == SU_UNION))) + { + lclerror (tagid, + message ("Tag %s previously defined as %q, used as %q", + ltoken_getRawString (tagid), + tagKind_unparse (t->kind), + cstring_makeLiteral ((k == SU_STRUCT) ? "struct" : "union"))); + } + } + else + { + /* + ** changed from error: 31 Mar 1994 + ** + ** lclerror (str, message ("Undefined type: %s %s", s, ltoken_getRawString (tagid)); + ** + */ + + /* forward struct's and union's are ok... */ + + if (k == SU_STRUCT) + { + (void) checkAndEnterTag (TAG_FWDSTRUCT, ltoken_copy (tagid)); + lhForwardStruct (tagid); + sort = sort_makeStr (tagid); + } + else + { + (void) checkAndEnterTag (TAG_FWDUNION, ltoken_copy (tagid)); + lhForwardUnion (tagid); + sort = sort_makeUnion (tagid); + } + } + + n->sort = sort; + return (n); +} + +/*@only@*/ cstring +strOrUnionNode_unparse (/*@null@*/ strOrUnionNode n) +{ + if (n != (strOrUnionNode) 0) + { + cstring s; + switch (n->kind) + { + case SU_STRUCT: + s = cstring_makeLiteral ("struct "); + break; + case SU_UNION: + s = cstring_makeLiteral ("union "); + break; + BADDEFAULT + } + + if (!ltoken_isUndefined (n->opttagid)) + { + s = message ("%q%s ", s, ltoken_getRawString (n->opttagid)); + } + s = message ("%q{%q}", s, stDeclNodeList_unparse (n->structdecls)); + return s; + } + return cstring_undefined; +} + +/*@only@*/ stDeclNode +makestDeclNode (lclTypeSpecNode s, + declaratorNodeList x) +{ + stDeclNode n = (stDeclNode) dmalloc (sizeof (*n)); + + n->lcltypespec = s; + n->declarators = x; + return n; +} + +/*@only@*/ typeExpr +makeFunctionNode (typeExpr x, paramNodeList p) +{ + typeExpr y = (typeExpr) dmalloc (sizeof (*y)); + + y->wrapped = 0; + y->kind = TEXPR_FCN; + y->content.function.returntype = x; + y->content.function.args = p; + y->sort = sort_makeNoSort (); + + return (y); +} + +static /*@observer@*/ ltoken + extractDeclarator (/*@null@*/ typeExpr t) +{ + if (t != (typeExpr) 0) + { + switch (t->kind) + { + case TEXPR_BASE: + return t->content.base; + case TEXPR_PTR: + return (extractDeclarator (t->content.pointer)); + case TEXPR_ARRAY: + return (extractDeclarator (t->content.array.elementtype)); + case TEXPR_FCN: + return (extractDeclarator (t->content.function.returntype)); + } + } + + return ltoken_undefined; +} + +/*@only@*/ typeExpr +makeTypeExpr (ltoken t) +{ + typeExpr x = (typeExpr) dmalloc (sizeof (*x)); + + + x->wrapped = 0; + x->kind = TEXPR_BASE; + x->content.base = t; + x->sort = sort_makeNoSort (); + + return (x); +} + + +/*@only@*/ declaratorNode +makeDeclaratorNode (typeExpr t) +{ + declaratorNode x = (declaratorNode) dmalloc (sizeof (*x)); + + x->id = ltoken_copy (extractDeclarator (t)); + x->type = t; + x->isRedecl = FALSE; + + return (x); +} + +static /*@only@*/ declaratorNode +makeUnknownDeclaratorNode (/*@only@*/ ltoken t) +{ + declaratorNode x = (declaratorNode) dmalloc (sizeof (*x)); + + x->id = t; + x->type = (typeExpr) 0; + x->isRedecl = FALSE; + + return (x); +} + +static /*@only@*/ cstring +printTypeExpr2 (/*@null@*/ typeExpr x) +{ + paramNodeList params; + + if (x != (typeExpr) 0) + { + cstring s; /* print out types in reverse order */ + + switch (x->kind) + { + case TEXPR_BASE: + return (message ("%s ", ltoken_getRawString (x->content.base))); + case TEXPR_PTR: + return (message ("%qptr to ", printTypeExpr2 (x->content.pointer))); + case TEXPR_ARRAY: + return (message ("array[%q] of %q", + termNode_unparse (x->content.array.size), + printTypeExpr2 (x->content.array.elementtype))); + case TEXPR_FCN: + s = printTypeExpr2 (x->content.function.returntype); + params = x->content.function.args; + if (!paramNodeList_empty (params)) + { + s = message ("%qfcn with args: (%q)", s, + paramNodeList_unparse (x->content.function.args)); + } + else + s = message ("%qfcn with no args", s); + return s; + default: + llfatalbug (message ("printTypeExpr2: unknown typeExprKind: %d", (int) x->kind)); + } + } + return cstring_undefined; +} + +/*@only@*/ cstring +declaratorNode_unparse (declaratorNode x) +{ + return (typeExpr_unparse (x->type)); +} + +/*@only@*/ declaratorNode + declaratorNode_copy (declaratorNode x) +{ + declaratorNode ret = (declaratorNode) dmalloc (sizeof (*ret)); + + ret->type = typeExpr_copy (x->type); + ret->id = ltoken_copy (x->id); + ret->isRedecl = x->isRedecl; + + return (ret); +} + +static /*@null@*/ typeExpr typeExpr_copy (/*@null@*/ typeExpr x) +{ + if (x == NULL) + { + return NULL; + } + else + { + typeExpr ret = (typeExpr) dmalloc (sizeof (*ret)); + + ret->wrapped = x->wrapped; + ret->kind = x->kind; + + switch (ret->kind) + { + case TEXPR_BASE: + ret->content.base = ltoken_copy (x->content.base); + break; + case TEXPR_PTR: + ret->content.pointer = typeExpr_copy (x->content.pointer); + break; + case TEXPR_ARRAY: + ret->content.array.elementtype = typeExpr_copy (x->content.array.elementtype); + ret->content.array.size = termNode_copy (x->content.array.size); + break; + case TEXPR_FCN: + ret->content.function.returntype = typeExpr_copy (x->content.function.returntype); + ret->content.function.args = paramNodeList_copy (x->content.function.args); + break; + } + + ret->sort = x->sort; + return ret; + } +} + +static /*@only@*/ cstring + typeExpr_unparseCode (/*@null@*/ typeExpr x) +{ + /* print out types in order of appearance in source */ + cstring s = cstring_undefined; + + if (x != (typeExpr) 0) + { + switch (x->kind) + { + case TEXPR_BASE: + return (cstring_copy (ltoken_getRawString (x->content.base))); + case TEXPR_PTR: + return (typeExpr_unparseCode (x->content.pointer)); + case TEXPR_ARRAY: + return (typeExpr_unparseCode (x->content.array.elementtype)); + case TEXPR_FCN: + return (typeExpr_unparseCode (x->content.function.returntype)); + } + } + return s; +} + +void typeExpr_free (/*@only@*/ /*@null@*/ typeExpr x) +{ + if (x != (typeExpr) 0) + { + switch (x->kind) + { + case TEXPR_BASE: + break; + case TEXPR_PTR: + typeExpr_free (x->content.pointer); + break; + case TEXPR_ARRAY: + typeExpr_free (x->content.array.elementtype); + termNode_free (x->content.array.size); + break; + case TEXPR_FCN: + typeExpr_free (x->content.function.returntype); + paramNodeList_free (x->content.function.args); + break; + /*@-branchstate@*/ + } + /*@=branchstate@*/ + + sfree (x); + } +} + + +/*@only@*/ cstring +declaratorNode_unparseCode (declaratorNode x) +{ + return (typeExpr_unparseCode (x->type)); +} + +/*@only@*/ cstring +typeExpr_unparse (/*@null@*/ typeExpr x) +{ + cstring s = cstring_undefined; /* print out types in order of appearance in source */ + paramNodeList params; + int i; + + if (x != (typeExpr) 0) + { + cstring front = cstring_undefined; + cstring back = cstring_undefined; + + llassert (x->wrapped < 100); + + for (i = x->wrapped; i >= 1; i--) + { + front = cstring_appendChar (front, '('); + back = cstring_appendChar (back, ')'); + } + + switch (x->kind) + { + case TEXPR_BASE: + s = message ("%q%s", s, ltoken_getRawString (x->content.base)); + break; + case TEXPR_PTR: + s = message ("%q*%q", s, typeExpr_unparse (x->content.pointer)); + break; + case TEXPR_ARRAY: + s = message ("%q%q[%q]", s, + typeExpr_unparse (x->content.array.elementtype), + termNode_unparse (x->content.array.size)); + break; + case TEXPR_FCN: + s = message ("%q%q (", s, + typeExpr_unparse (x->content.function.returntype)); + params = x->content.function.args; + + if (!paramNodeList_empty (params)) + { + s = message ("%q%q", s, + paramNodeList_unparse (x->content.function.args)); + } + + s = message ("%q)", s); + break; + } + s = message ("%q%q%q", front, s, back); + } + else + { + s = cstring_makeLiteral ("?"); + } + + return s; +} + +/*@only@*/ cstring +typeExpr_unparseNoBase (/*@null@*/ typeExpr x) +{ + cstring s = cstring_undefined; /* print out types in order of appearance in source */ + paramNodeList params; + int i; + + if (x != (typeExpr) 0) + { + cstring front = cstring_undefined; + cstring back = cstring_undefined; + + llassert (x->wrapped < 100); + + for (i = x->wrapped; i >= 1; i--) + { + front = cstring_appendChar (front, '('); + back = cstring_appendChar (back, ')'); + } + + switch (x->kind) + { + case TEXPR_BASE: + s = message ("%q /* %s */", s, ltoken_getRawString (x->content.base)); + break; + case TEXPR_PTR: + s = message ("%q*%q", s, typeExpr_unparseNoBase (x->content.pointer)); + break; + case TEXPR_ARRAY: + s = message ("%q%q[%q]", s, + typeExpr_unparseNoBase (x->content.array.elementtype), + termNode_unparse (x->content.array.size)); + break; + case TEXPR_FCN: + s = message ("%q%q (", s, + typeExpr_unparseNoBase (x->content.function.returntype)); + params = x->content.function.args; + + if (!paramNodeList_empty (params)) + { + s = message ("%q%q", s, + paramNodeList_unparse (x->content.function.args)); + } + + s = message ("%q)", s); + break; + } + s = message ("%q%q%q", front, s, back); + } + else + { + s = cstring_makeLiteral ("?"); + } + + return s; +} + +cstring +typeExpr_name (/*@null@*/ typeExpr x) +{ + if (x != (typeExpr) 0) + { + switch (x->kind) + { + case TEXPR_BASE: + return (cstring_copy (ltoken_getRawString (x->content.base))); + case TEXPR_PTR: + return (typeExpr_name (x->content.pointer)); + case TEXPR_ARRAY: + return (typeExpr_name (x->content.array.elementtype)); + case TEXPR_FCN: + return (typeExpr_name (x->content.function.returntype)); + } + } + + /* evs --- 14 Mar 1995 + ** not a bug: its okay to have empty parameter names + ** llbug ("typeExpr_name: null"); + */ + + return cstring_undefined; +} + +/*@only@*/ typeExpr + makePointerNode (ltoken star, /*@only@*/ /*@returned@*/ typeExpr x) +{ + if (x != (typeExpr)0 && (x->kind == TEXPR_FCN && (x->wrapped == 0))) + { + x->content.function.returntype = makePointerNode (star, x->content.function.returntype); + return x; + } + else + { + typeExpr y = (typeExpr) dmalloc (sizeof (*y)); + + y->wrapped = 0; + y->kind = TEXPR_PTR; + y->content.pointer = x; + y->sort = sort_makeNoSort (); + ltoken_free (star); + + return y; + } +} + +typeExpr makeArrayNode (/*@returned@*/ typeExpr x, + /*@only@*/ arrayQualNode a) +{ + if (x != (typeExpr)0 && (x->kind == TEXPR_FCN && (x->wrapped == 0))) + { + /* + ** Spurious errors reported here, because of referencing + ** in makeArrayNode. + */ + + /*@i3@*/ x->content.function.returntype = makeArrayNode (x, a); + /*@i1@*/ return x; + } + else + { + typeExpr y = (typeExpr) dmalloc (sizeof (*y)); + y->wrapped = 0; + y->kind = TEXPR_ARRAY; + + if (a == (arrayQualNode) 0) + { + y->content.array.size = (termNode) 0; + } + else + { + y->content.array.size = a->term; + ltoken_free (a->tok); + sfree (a); + } + + y->content.array.elementtype = x; + y->sort = sort_makeNoSort (); + + return (y); + } +} + +/*@only@*/ constDeclarationNode +makeConstDeclarationNode (lclTypeSpecNode t, initDeclNodeList decls) +{ + constDeclarationNode n = (constDeclarationNode) dmalloc (sizeof (*n)); + sort s, s2, initValueSort; + ltoken varid, errtok; + termNode initValue; + + s = lclTypeSpecNode2sort (t); + + initDeclNodeList_elements (decls, init) + { + declaratorNode vdnode = init->declarator; + varInfo vi = (varInfo) dmalloc (sizeof (*vi)); + + varid = ltoken_copy (vdnode->id); + s2 = typeExpr2ptrSort (s, vdnode->type); + initValue = init->value; + + if (termNode_isDefined (initValue) && !initValue->error_reported) + { + initValueSort = initValue->sort; + + /* should keep the arguments in order */ + if (!sort_member_modulo_cstring (s2, initValue) + && !initValue->error_reported) + { + errtok = termNode_errorToken (initValue); + + lclerror + (errtok, + message ("Constant %s declared type %q, initialized to %q: %q", + ltoken_unparse (varid), + sort_unparse (s2), + sort_unparse (initValueSort), + termNode_unparse (initValue))); + } + } + + vi->id = varid; + vi->kind = VRK_CONST; + vi->sort = s2; + vi->export = TRUE; + + (void) symtable_enterVar (g_symtab, vi); + varInfo_free (vi); + + } end_initDeclNodeList_elements; + + n->type = t; + n->decls = decls; + + return n; +} + +varDeclarationNode makeInternalStateNode (void) +{ + varDeclarationNode n = (varDeclarationNode) dmalloc (sizeof (*n)); + + n->isSpecial = TRUE; + n->sref = sRef_makeInternalState (); + + /*@-compdef@*/ return n; /*@=compdef@*/ +} + +varDeclarationNode makeFileSystemNode (void) +{ + varDeclarationNode n = (varDeclarationNode) dmalloc (sizeof (*n)); + + n->isSpecial = TRUE; + n->sref = sRef_makeSystemState (); + + /*@-compdef@*/ return n; /*@=compdef@*/ +} + +/*@only@*/ varDeclarationNode +makeVarDeclarationNode (lclTypeSpecNode t, initDeclNodeList x, + bool isGlobal, bool isPrivate) +{ + varDeclarationNode n = (varDeclarationNode) dmalloc (sizeof (*n)); + sort s, s2, initValueSort; + ltoken varid, errtok; + termNode initValue; + declaratorNode vdnode; + + n->isSpecial = FALSE; + n->qualifier = QLF_NONE; + n->isGlobal = isGlobal; + n->isPrivate = isPrivate; + n->decls = x; + + s = lclTypeSpecNode2sort (t); + + /* t is an lclTypeSpec, its sort may not be assigned yet */ + + initDeclNodeList_elements (x, init) + { + vdnode = init->declarator; + varid = vdnode->id; + s2 = typeExpr2ptrSort (s, vdnode->type); + initValue = init->value; + + if (termNode_isDefined (initValue) && !initValue->error_reported) + { + initValueSort = initValue->sort; + /* should keep the arguments in order */ + if (!sort_member_modulo_cstring (s2, initValue) + && !initValue->error_reported) + { + errtok = termNode_errorToken (initValue); + + lclerror (errtok, + message ("Variable %s declared type %q, initialized to %q", + ltoken_unparse (varid), + sort_unparse (s2), + sort_unparse (initValueSort))); + } + } + + /* + ** If global, check that it has been declared already, don't push + ** onto symbol table yet (wrong scope, done in enteringFcnScope + */ + + if (isGlobal) + { + varInfo vi = symtable_varInfo (g_symtab, ltoken_getText (varid)); + + if (!varInfo_exists (vi)) + { + lclerror (varid, + message ("Undeclared global variable: %s", + ltoken_getRawString (varid))); + } + else + { + if (vi->kind == VRK_CONST) + { + lclerror (varid, + message ("Constant used in global list: %s", + ltoken_getRawString (varid))); + } + } + } + else + { + varInfo vi = (varInfo) dmalloc (sizeof (*vi)); + + vi->id = ltoken_copy (varid); + if (isPrivate) + { + vi->kind = VRK_PRIVATE; + /* check that initValue is not empty */ + if (initValue == (termNode) 0) + { + lclerror (varid, + message ("Private variable must have initialization: %s", + ltoken_getRawString (varid))); + } + } + else + { + vi->kind = VRK_VAR; + } + + vi->sort = sort_makeGlobal (s2); + vi->export = TRUE; + + vdnode->isRedecl = symtable_enterVar (g_symtab, vi); + varInfo_free (vi); + } + } end_initDeclNodeList_elements; + + n->type = t; + + return n; +} + +/*@only@*/ initDeclNode +makeInitDeclNode (declaratorNode d, termNode x) +{ + initDeclNode n = (initDeclNode) dmalloc (sizeof (*n)); + + n->declarator = d; + n->value = x; + return n; +} + +/*@only@*/ abstractNode +makeAbstractNode (ltoken t, ltoken name, + bool isMutable, bool isRefCounted, abstBodyNode a) +{ + abstractNode n = (abstractNode) dmalloc (sizeof (*n)); + sort handle; + typeInfo ti = (typeInfo) dmalloc (sizeof (*ti)); + + n->tok = t; + n->isMutable = isMutable; + n->name = name; + n->body = a; + n->isRefCounted = isRefCounted; + + if (isMutable) + handle = sort_makeMutable (name, ltoken_getText (name)); + else + handle = sort_makeImmutable (name, ltoken_getText (name)); + n->sort = handle; + + ti->id = ltoken_createType (ltoken_getCode (ltoken_typename), SID_TYPE, + ltoken_getText (name)); + ti->modifiable = isMutable; + ti->abstract = TRUE; + ti->basedOn = handle; + ti->export = TRUE; + + symtable_enterType (g_symtab, ti); + + + return n; +} + +/*@only@*/ cstring +abstractNode_unparse (abstractNode n) +{ + if (n != (abstractNode) 0) + { + cstring s; + + if (n->isMutable) + s = cstring_makeLiteral ("mutable"); + else + s = cstring_makeLiteral ("immutable"); + + return (message ("%q type %s%q;", s, ltoken_getRawString (n->name), + abstBodyNode_unparse (n->body))); + } + return cstring_undefined; +} + +void +setExposedType (lclTypeSpecNode s) +{ + exposedType = s; +} + +/*@only@*/ exposedNode +makeExposedNode (ltoken t, lclTypeSpecNode s, + declaratorInvNodeList d) +{ + exposedNode n = (exposedNode) dmalloc (sizeof (*n)); + + n->tok = t; + n->type = s; + n->decls = d; + + return n; +} + +/*@only@*/ cstring +exposedNode_unparse (exposedNode n) +{ + if (n != (exposedNode) 0) + { + return (message ("typedef %q %q;", + lclTypeSpecNode_unparse (n->type), + declaratorInvNodeList_unparse (n->decls))); + } + return cstring_undefined; +} + +/*@only@*/ declaratorInvNode +makeDeclaratorInvNode (declaratorNode d, abstBodyNode b) +{ + declaratorInvNode n = (declaratorInvNode) dmalloc (sizeof (*n)); + n->declarator = d; + n->body = b; + + return (n); +} + +/*@only@*/ cstring +declaratorInvNode_unparse (declaratorInvNode d) +{ + return (message ("%q%q", declaratorNode_unparse (d->declarator), + abstBodyNode_unparseExposed (d->body))); +} + +/*@only@*/ cstring +abstBodyNode_unparse (abstBodyNode n) +{ + if (n != (abstBodyNode) 0) + { + return (lclPredicateNode_unparse (n->typeinv)); + } + return cstring_undefined; +} + +/*@only@*/ cstring +abstBodyNode_unparseExposed (abstBodyNode n) +{ + if (n != (abstBodyNode) 0) + { + return (message ("%q", lclPredicateNode_unparse (n->typeinv))); + } + return cstring_undefined; +} + +/*@only@*/ cstring +taggedUnionNode_unparse (taggedUnionNode n) +{ + if (n != (taggedUnionNode) 0) + { + return (message ("tagged union {%q}%q;\n", + stDeclNodeList_unparse (n->structdecls), + declaratorNode_unparse (n->declarator))); + } + return cstring_undefined; +} + +static /*@observer@*/ paramNodeList + typeExpr_toParamNodeList (/*@null@*/ typeExpr te) +{ + if (te != (typeExpr) 0) + { + switch (te->kind) + { + case TEXPR_FCN: + return te->content.function.args; + case TEXPR_PTR: + return typeExpr_toParamNodeList (te->content.pointer); + case TEXPR_ARRAY: + /* return typeExpr_toParamNodeList (te->content.array.elementtype); */ + case TEXPR_BASE: + return paramNodeList_undefined; + } + } + return paramNodeList_undefined; +} + +/*@only@*/ fcnNode + fcnNode_fromDeclarator (/*@only@*/ /*@null@*/ lclTypeSpecNode t, + /*@only@*/ declaratorNode d) +{ + return (makeFcnNode (QU_UNKNOWN, t, d, + varDeclarationNodeList_new (), + varDeclarationNodeList_new (), + letDeclNodeList_new (), + (lclPredicateNode) 0, + (lclPredicateNode) 0, + (modifyNode) 0, + (lclPredicateNode) 0, + (lclPredicateNode) 0)); +} + +/*@only@*/ iterNode +makeIterNode (ltoken id, paramNodeList p) +{ + iterNode x = (iterNode) dmalloc (sizeof (*x)); + bool hasYield = FALSE; + + x->name = id; + x->params = p; + + /* check there is at least one yield param */ + + paramNodeList_elements (p, pe) + { + if (paramNode_isYield (pe)) + { + hasYield = TRUE; + break; + } + } end_paramNodeList_elements + + if (!hasYield) + { + lclerror (id, message ("Iterator has no yield parameters: %s", + ltoken_getRawString (id))); + } + + return (x); +} + +/*@only@*/ fcnNode +makeFcnNode (qual specQual, + /*@null@*/ lclTypeSpecNode t, + declaratorNode d, + /*@null@*/ globalList g, + /*@null@*/ varDeclarationNodeList privateinits, + /*@null@*/ letDeclNodeList lets, + /*@null@*/ lclPredicateNode checks, + /*@null@*/ lclPredicateNode requires, + /*@null@*/ modifyNode m, + /*@null@*/ lclPredicateNode ensures, + /*@null@*/ lclPredicateNode claims) +{ + fcnNode x = (fcnNode) dmalloc (sizeof (*x)); + + if (d->type != (typeExpr)0 && (d->type)->kind != TEXPR_FCN) + { + lclerror (d->id, cstring_makeLiteral + ("Attempt to specify function without parameter list")); + d->type = makeFunctionNode (d->type, paramNodeList_new ()); + } + + + x->special = specQual; + x->typespec = t; + x->declarator = d; + x->globals = g; + x->inits = privateinits; + x->lets = lets; + x->checks = checks; + x->require = requires; + x->modify = m; + x->ensures = ensures; + x->claim = claims; + + /* extract info to fill in x->name =; x->signature =; */ + x->name = ltoken_copy (d->id); + + return (x); +} + +/*@only@*/ claimNode +makeClaimNode (ltoken id, paramNodeList p, + globalList g, letDeclNodeList lets, lclPredicateNode requires, + programNode b, lclPredicateNode ensures) +{ + claimNode x = (claimNode) dmalloc (sizeof (*x)); + + + x->name = id; + x->params = p; + x->globals = g; + x->lets = lets; + x->require = requires; + x->body = b; + x->ensures = ensures; + return (x); +} + +/*@only@*/ lclPredicateNode +makeIntraClaimNode (ltoken t, lclPredicateNode n) +{ + ltoken_free (n->tok); + n->tok = t; + n->kind = LPD_INTRACLAIM; + return (n); +} + +/*@only@*/ lclPredicateNode +makeRequiresNode (ltoken t, lclPredicateNode n) +{ + ltoken_free (n->tok); + n->tok = t; + n->kind = LPD_REQUIRES; + return (n); +} + +/*@only@*/ lclPredicateNode +makeChecksNode (ltoken t, lclPredicateNode n) +{ + ltoken_free (n->tok); + n->tok = t; + n->kind = LPD_CHECKS; + return (n); +} + +/*@only@*/ lclPredicateNode +makeEnsuresNode (ltoken t, lclPredicateNode n) +{ + ltoken_free (n->tok); + n->tok = t; + n->kind = LPD_ENSURES; + return (n); +} + +/*@only@*/ lclPredicateNode +makeLclPredicateNode (ltoken t, termNode n, + lclPredicateKind k) +{ + lclPredicateNode x = (lclPredicateNode) dmalloc (sizeof (*x)); + + x->tok = t; + x->predicate = n; + x->kind = k; + return (x); +} + +/*@only@*/ quantifierNode +makeQuantifierNode (varNodeList v, ltoken quant) +{ + quantifierNode x = (quantifierNode) dmalloc (sizeof (*x)); + + x->quant = quant; + x->vars = v; + x->isForall = cstring_equalLit (ltoken_unparse (quant), "\forall"); + + return (x); +} + +/*@only@*/ arrayQualNode +makeArrayQualNode (ltoken t, termNode term) +{ + arrayQualNode x = (arrayQualNode) dmalloc (sizeof (*x)); + + x->tok = t; + x->term = term; + return (x); +} + +/*@only@*/ varNode +makeVarNode (/*@only@*/ ltoken varid, bool isObj, lclTypeSpecNode t) +{ + varNode x = (varNode) dmalloc (sizeof (*x)); + varInfo vi = (varInfo) dmalloc (sizeof (*vi)); + sort sort; + + vi->id = ltoken_copy (varid); + sort = lclTypeSpecNode2sort (t); + + /* 9/3/93, The following is needed because we want value sorts to be + the default, object sort is generated only if there is "obj" qualifier. + There are 2 cases: (1) for immutable types (including C primitive types), + we need to generate the object sort if qualifier is present; (2) for + array, struct and union types, they are already in their object sorts. + */ + + sort = sort_makeVal (sort); /* both cases are now value sorts */ + + if (isObj) + { + sort = sort_makeObj (sort); + } + + + vi->sort = sort; + vi->kind = VRK_QUANT; + vi->export = TRUE; + + (void) symtable_enterVar (g_symtab, vi); + varInfo_free (vi); + + x->varid = varid; + x->isObj = isObj; + x->type = t; + x->sort = sort_makeNoSort (); + + return (x); +} + +/*@only@*/ abstBodyNode +makeAbstBodyNode (ltoken t, fcnNodeList f) +{ + abstBodyNode x = (abstBodyNode) dmalloc (sizeof (*x)); + + x->tok = t; + x->typeinv = (lclPredicateNode)0; + x->fcns = f; + return (x); +} + +/*@only@*/ abstBodyNode +makeExposedBodyNode (ltoken t, lclPredicateNode inv) +{ + abstBodyNode x = (abstBodyNode) dmalloc (sizeof (*x)); + + x->tok = t; + x->typeinv = inv; + x->fcns = fcnNodeList_undefined; + return (x); +} + +/*@only@*/ abstBodyNode +makeAbstBodyNode2 (ltoken t, ltokenList ops) +{ + abstBodyNode x = (abstBodyNode) dmalloc (sizeof (*x)); + + x->tok = t; + x->typeinv = (lclPredicateNode) 0; + + x->fcns = fcnNodeList_new (); + + ltokenList_elements (ops, op) + { + x->fcns = fcnNodeList_add + (x->fcns, + fcnNode_fromDeclarator (lclTypeSpecNode_undefined, + makeUnknownDeclaratorNode (ltoken_copy (op)))); + } end_ltokenList_elements; + + ltokenList_free (ops); + + return (x); +} + +/*@only@*/ stmtNode + makeStmtNode (ltoken varId, ltoken fcnId, /*@only@*/ termNodeList v) +{ + stmtNode n = (stmtNode) dmalloc (sizeof (*n)); + + n->lhs = varId; + n->operator = fcnId; + n->args = v; + return (n); +} + +/* printDeclarators -> declaratorNodeList_unparse */ + +static cstring abstDeclaratorNode_unparse (abstDeclaratorNode x) +{ + return (typeExpr_unparse ((typeExpr) x)); +} + +/*@only@*/ paramNode +makeParamNode (lclTypeSpecNode t, typeExpr d) +{ + paramNode x = (paramNode) dmalloc (sizeof (*x)); + + paramNode_checkQualifiers (t, d); + + x->type = t; + x->paramdecl = d; + x->kind = PNORMAL; /*< forgot this! >*/ + + return (x); +} + +/*@only@*/ paramNode +paramNode_elipsis (void) +{ + paramNode x = (paramNode) dmalloc (sizeof (*x)); + + x->type = (lclTypeSpecNode) 0; + x->paramdecl = (typeExpr) 0; + x->kind = PELIPSIS; + + return (x); +} + +static /*@observer@*/ ltoken typeExpr_getTok (typeExpr d) +{ + while (d != (typeExpr)0) + { + if (d->kind == TEXPR_BASE) + { + return (d->content.base); + } + else + { + if (d->kind == TEXPR_PTR) + { + d = d->content.pointer; + } + else if (d->kind == TEXPR_ARRAY) + { + d = d->content.array.elementtype; + } + else if (d->kind == TEXPR_FCN) + { + d = d->content.function.returntype; + } + else + { + BADBRANCH; + } + } + } + + llfatalerror (cstring_makeLiteral ("typeExpr_getTok: unreachable code")); + BADEXIT; +} + +void +paramNode_checkQualifiers (lclTypeSpecNode t, typeExpr d) +{ + bool isPointer = FALSE; + bool isUser = FALSE; + bool hasAlloc = FALSE; + bool hasAlias = FALSE; + + llassert (lclTypeSpecNode_isDefined (t)); + + if (t->pointers == 0 + && (d != (typeExpr)0 && d->kind != TEXPR_PTR) && d->kind != TEXPR_ARRAY) + { + if (t->kind == LTS_TYPE) + { + sortNode sn; + + llassert (t->content.type != NULL); + + sn = sort_quietLookup (sort_getUnderlying ((t->content.type)->sort)); + + if (sn.kind == SRT_PTR || sn.kind == SRT_ARRAY + || sn.kind == SRT_HOF || sn.kind == SRT_NONE) + { + isPointer = TRUE; + } + } + } + else + { + isPointer = TRUE; + } + + if (d != (typeExpr)0 && d->kind != TEXPR_BASE) + { + if (t->kind == LTS_TYPE) + { + sortNode sn; + + llassert (t->content.type != NULL); + sn = sort_quietLookup (sort_getUnderlying ((t->content.type)->sort)); + + if (sn.kind == SRT_PTR || sn.kind == SRT_ARRAY + || sn.kind == SRT_HOF || sn.kind == SRT_NONE) + { + isUser = TRUE; + } + } + } + else + { + isPointer = TRUE; + } + + if (d != (typeExpr)NULL) + { + qualList_elements (t->quals, q) + { + if (qual_isAllocQual (q)) + { + if (hasAlloc) + { + ltoken tok = typeExpr_getTok (d); + lclerror (tok, message ("Parameter declared with multiple allocation " + "qualifiers: %q", typeExpr_unparse (d))); + } + hasAlloc = TRUE; + + if (!isPointer) + { + ltoken tok = typeExpr_getTok (d); + lclerror (tok, message ("Non-pointer declared as %s parameter: %q", + qual_unparse (q), + typeExpr_unparse (d))); + } + } + if (qual_isAliasQual (q)) + { + if (hasAlias) + { + ltoken tok = typeExpr_getTok (d); + lclerror (tok, message ("Parameter declared with multiple alias qualifiers: %q", + typeExpr_unparse (d))); + } + hasAlias = TRUE; + + if (!(isPointer || isUser)) + { + ltoken tok = typeExpr_getTok (d); + lclerror (tok, message ("Unsharable type declared as %s parameter: %q", + qual_unparse (q), + typeExpr_unparse (d))); + } + } + } end_qualList_elements; + } +} + +/*@only@*/ cstring +paramNode_unparse (paramNode x) +{ + if (x != (paramNode) 0) + { + if (x->kind == PELIPSIS) + { + return (cstring_makeLiteral ("...")); + } + + if (x->paramdecl != (typeExpr) 0) + { /* handle (void) */ + return (message ("%q %q", lclTypeSpecNode_unparse (x->type), + typeExpr_unparse (x->paramdecl))); + } + else + { + return (lclTypeSpecNode_unparse (x->type)); + } + } + return cstring_undefined; +} + +static cstring +lclTypeSpecNode_unparseAltComments (/*@null@*/ lclTypeSpecNode typespec) /*@*/ +{ + if (typespec != (lclTypeSpecNode) 0) + { + cstring s = qualList_toCComments (typespec->quals); + + switch (typespec->kind) + { + case LTS_TYPE: + { + llassert (typespec->content.type != NULL); + + return (cstring_concatFree + (s, printLeaves (typespec->content.type->ctypes))); + } + case LTS_ENUM: + { + bool first = TRUE; + enumSpecNode n = typespec->content.enumspec; + + s = cstring_concatFree (s, cstring_makeLiteral ("enum")); + llassert (n != NULL); + + if (!ltoken_isUndefined (n->opttagid)) + { + s = message ("%q %s", s, ltoken_unparse (n->opttagid)); + } + s = message ("%q {", s); + + ltokenList_elements (n->enums, e) + { + if (first) + { + first = FALSE; + s = message ("%q%s", s, ltoken_getRawString (e)); + } + else + s = message ("%q, %s", s, ltoken_getRawString (e)); + } end_ltokenList_elements; + + return (message ("%q}", s)); + } + case LTS_STRUCTUNION: + { + strOrUnionNode n = typespec->content.structorunion; + stDeclNodeList decls; + + llassert (n != NULL); + + switch (n->kind) + { + case SU_STRUCT: + s = cstring_concatFree (s, cstring_makeLiteral ("struct ")); + /*@switchbreak@*/ break; + case SU_UNION: + s = cstring_concatFree (s, cstring_makeLiteral ("union ")); + /*@switchbreak@*/ break; + } + + if (!ltoken_isUndefined (n->opttagid)) + { + if (stDeclNodeList_size (n->structdecls) == 0) + { + return (message ("%q%s", s, ltoken_unparse (n->opttagid))); + } + + s = message ("%q%s {\n\2\1", s, ltoken_unparse (n->opttagid)); + } + else + { + s = message ("%q{\n\2\1", s); + } + + decls = n->structdecls; + + stDeclNodeList_elements (decls, f) + { + s = message ("%q%q\1%q;\n\1", s, + lclTypeSpecNode_unparseAltComments (f->lcltypespec), + declaratorNodeList_unparse (f->declarators)); + } end_stDeclNodeList_elements; + + return (message ("%q\3}", s)); + } + case LTS_CONJ: + { + cstring_free (s); + + return + (message + ("%q, %q", + lclTypeSpecNode_unparseAltComments (typespec->content.conj->a), + lclTypeSpecNode_unparseAltComments (typespec->content.conj->b))); + } + BADDEFAULT; + } + } + else + { + llcontbuglit ("lclTypeSpecNode_unparseComments: null typespec"); + + return cstring_undefined; + } + + BADEXIT; +} + +cstring lclTypeSpecNode_unparseComments (/*@null@*/ lclTypeSpecNode typespec) +{ + if (typespec != (lclTypeSpecNode) 0) + { + cstring s = qualList_toCComments (typespec->quals); + + switch (typespec->kind) + { + case LTS_TYPE: + { + llassert (typespec->content.type != NULL); + + return (cstring_concatFree + (s, printLeaves (typespec->content.type->ctypes))); + } + case LTS_ENUM: + { + bool first = TRUE; + enumSpecNode n = typespec->content.enumspec; + + s = cstring_concatFree (s, cstring_makeLiteral ("enum")); + llassert (n != NULL); + + if (!ltoken_isUndefined (n->opttagid)) + { + s = message ("%q %s", s, ltoken_unparse (n->opttagid)); + } + s = message ("%q {", s); + + ltokenList_elements (n->enums, e) + { + if (first) + { + first = FALSE; + s = message ("%q%s", s, ltoken_getRawString (e)); + } + else + s = message ("%q, %s", s, ltoken_getRawString (e)); + } end_ltokenList_elements; + + return (message ("%q}", s)); + } + case LTS_STRUCTUNION: + { + strOrUnionNode n = typespec->content.structorunion; + stDeclNodeList decls; + + llassert (n != NULL); + + switch (n->kind) + { + case SU_STRUCT: + s = cstring_concatFree (s, cstring_makeLiteral ("struct ")); + /*@switchbreak@*/ break; + case SU_UNION: + s = cstring_concatFree (s, cstring_makeLiteral ("union ")); + /*@switchbreak@*/ break; + } + + if (!ltoken_isUndefined (n->opttagid)) + { + if (stDeclNodeList_size (n->structdecls) == 0) + { + return (message ("%q%s", s, ltoken_unparse (n->opttagid))); + } + + s = message ("%q%s {\n\2\1", s, ltoken_unparse (n->opttagid)); + } + else + { + s = message ("%q{\n\2\1", s); + } + + decls = n->structdecls; + + stDeclNodeList_elements (decls, f) + { + s = message ("%q%q\1%q;\n\1", s, + lclTypeSpecNode_unparseComments (f->lcltypespec), + declaratorNodeList_unparse (f->declarators)); + } end_stDeclNodeList_elements; + + return (message ("%q\3}", s)); + } + case LTS_CONJ: + { + cstring_free (s); + + return + (message + ("%q /*@alt %q@*/", + lclTypeSpecNode_unparseComments (typespec->content.conj->a), + lclTypeSpecNode_unparseAltComments (typespec->content.conj->b))); + } + BADDEFAULT; + } + } + else + { + llcontbuglit ("lclTypeSpecNode_unparseComments: null typespec"); + + return cstring_undefined; + } + + BADEXIT; +} + +/*@only@*/ cstring +paramNode_unparseComments (paramNode x) +{ + if (x != (paramNode) 0) + { + if (x->kind == PELIPSIS) + { + return (cstring_makeLiteral ("...")); + } + + if (x->paramdecl != (typeExpr) 0) + { /* handle (void) */ + return (message ("%q %q", + lclTypeSpecNode_unparseComments (x->type), + typeExpr_unparseNoBase (x->paramdecl))); + } + else + { + return (lclTypeSpecNode_unparseComments (x->type)); + } + } + return cstring_undefined; +} + +/*@only@*/ termNode +makeIfTermNode (ltoken ift, termNode ifn, ltoken thent, + termNode thenn, ltoken elset, + termNode elsen) +{ + termNode t = (termNode) dmalloc (sizeof (*t)); + opFormNode opform = makeOpFormNode (ift, OPF_IF, opFormUnion_createMiddle (0), + ltoken_undefined); + nameNode nn = makeNameNodeForm (opform); + termNodeList args = termNodeList_new (); + + t->error_reported = FALSE; + t->wrapped = 0; + termNodeList_addh (args, ifn); + termNodeList_addh (args, thenn); + termNodeList_addh (args, elsen); + t->name = nn; + t->args = args; + t->kind = TRM_APPLICATION; + t->sort = sort_makeNoSort (); + t->given = t->sort; + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + + ltoken_free (thent); + ltoken_free (elset); + + return (t); +} + +static /*@observer@*/ ltoken + nameNode2anyOp (nameNode n) +{ + if (n != (nameNode) 0) + { + opFormNode opnode = n->content.opform; + opFormKind kind; + + llassert (opnode != NULL); + + kind = opnode->kind; + + if (kind == OPF_MANYOPM || kind == OPF_ANYOP || + kind == OPF_MANYOP || kind == OPF_ANYOPM) + { + opFormUnion u; + + u = opnode->content; + return u.anyop; + } + } + return ltoken_undefined; +} + +/*@only@*/ termNode +makeInfixTermNode (termNode x, ltoken op, termNode y) +{ + termNode t = (termNode) dmalloc (sizeof (*t)); + opFormNode opform; + nameNode nn; + termNodeList args = termNodeList_new (); + + checkAssociativity (x, op); + + opform = makeOpFormNode (op, OPF_MANYOPM, + opFormUnion_createAnyOp (op), + ltoken_undefined); + + nn = makeNameNodeForm (opform); + + t->error_reported = FALSE; + t->wrapped = 0; + termNodeList_addh (args, x); + termNodeList_addh (args, y); + t->name = nn; + t->args = args; + t->kind = TRM_APPLICATION; + t->sort = sort_makeNoSort (); + t->given = t->sort; + t->possibleSorts = sortSet_new (); /* sort_equal */ + t->possibleOps = lslOpSet_new (); + return (t); +} + +/*@only@*/ quantifiedTermNode + quantifiedTermNode_copy (quantifiedTermNode q) +{ + quantifiedTermNode ret = (quantifiedTermNode) dmalloc (sizeof (*ret)); + + ret->quantifiers = quantifierNodeList_copy (q->quantifiers); + ret->open = ltoken_copy (q->open); + ret->close = ltoken_copy (q->close); + ret->body = termNode_copySafe (q->body); + + return (ret); +} + +/*@only@*/ termNode +makeQuantifiedTermNode (quantifierNodeList qn, ltoken open, + termNode t, ltoken close) +{ + sort sort; + termNode n = (termNode) dmalloc (sizeof (*n)); + quantifiedTermNode q = (quantifiedTermNode) dmalloc (sizeof (*q)); + + n->name = NULL; /*> missing this --- detected by lclint <*/ + n->error_reported = FALSE; + n->wrapped = 0; + n->error_reported = FALSE; + n->kind = TRM_QUANTIFIER; + n->possibleSorts = sortSet_new (); + n->possibleOps = lslOpSet_new (); + n->kind = TRM_UNCHANGEDALL; + n->args = termNodeList_new (); /*< forgot this >*/ + + termNodeList_free (t->args); + t->args = termNodeList_new (); + + sort = sort_bool; + n->sort = sort; + (void) sortSet_insert (n->possibleSorts, sort); + + q->quantifiers = qn; + q->open = open; + q->close = close; + q->body = t; + + n->quantified = q; + return (n); +} + +/*@only@*/ termNode +makePostfixTermNode (/*@returned@*/ /*@only@*/ termNode secondary, ltokenList postfixops) +{ + termNode top = secondary; + + ltokenList_elements (postfixops, op) + { + top = makePostfixTermNode2 (top, ltoken_copy (op)); + /*@i@*/ } end_ltokenList_elements; + + ltokenList_free (postfixops); + + return (top); /* dep as only? */ +} + +/* +** secondary is returned in the args list +*/ + +/*@only@*/ termNode +makePostfixTermNode2 (/*@returned@*/ /*@only@*/ termNode secondary, + /*@only@*/ ltoken postfixop) +{ + termNode t = (termNode) dmalloc (sizeof (*t)); + + opFormNode opform = makeOpFormNode (postfixop, + OPF_MANYOP, opFormUnion_createAnyOp (postfixop), + ltoken_undefined); + nameNode nn = makeNameNodeForm (opform); + termNodeList args = termNodeList_new (); + + t->error_reported = FALSE; + t->wrapped = 0; + termNodeList_addh (args, secondary); + t->name = nn; + t->args = args; + t->kind = TRM_APPLICATION; + t->sort = sort_makeNoSort (); + t->given = t->sort; + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + return t; +} + +/*@only@*/ termNode +makePrefixTermNode (ltoken op, termNode arg) +{ + termNode t = (termNode) dmalloc (sizeof (*t)); + termNodeList args = termNodeList_new (); + opFormNode opform = makeOpFormNode (op, OPF_ANYOPM, opFormUnion_createAnyOp (op), + ltoken_undefined); + nameNode nn = makeNameNodeForm (opform); + + t->error_reported = FALSE; + t->wrapped = 0; + t->name = nn; + termNodeList_addh (args, arg); + t->args = args; + t->kind = TRM_APPLICATION; + t->sort = sort_makeNoSort (); + t->given = t->sort; + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + return t; +} + +/*@only@*/ termNode +makeOpCallTermNode (ltoken op, ltoken open, + termNodeList args, ltoken close) +{ + /* like prefixTerm, but with opId LPAR termNodeList RPAR */ + termNode t = (termNode) dmalloc (sizeof (*t)); + nameNode nn = makeNameNodeId (op); + + t->error_reported = FALSE; + t->wrapped = 0; + t->name = nn; + t->args = args; + t->kind = TRM_APPLICATION; + t->sort = sort_makeNoSort (); + t->given = t->sort; + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + + ltoken_free (open); + ltoken_free (close); + + return t; +} + +/*@exposed@*/ termNode +CollapseInfixTermNode (/*@returned@*/ termNode secondary, termNodeList infix) +{ + termNode left = secondary; + + termNodeList_elements (infix, node) + { + termNodeList_addl (node->args, termNode_copySafe (left)); + left = node; + /* computePossibleSorts (left); */ + } end_termNodeList_elements; + + return (left); +} + +static void +checkAssociativity (termNode x, ltoken op) +{ + ltoken lastOpToken; + + if (x->wrapped == 0 && /* no parentheses */ + x->kind == TRM_APPLICATION && x->name != (nameNode) 0 && + (!x->name->isOpId)) + { + lastOpToken = nameNode2anyOp (x->name); + + if ((ltoken_getCode (lastOpToken) == logicalOp && + ltoken_getCode (op) == logicalOp) || + ((ltoken_getCode (lastOpToken) == simpleOp || + ltoken_getCode (lastOpToken) == LLT_MULOP) && + (ltoken_getCode (op) == simpleOp || + ltoken_getCode (op) == LLT_MULOP))) + if (ltoken_getText (lastOpToken) != ltoken_getText (op)) + { + lclerror (op, + message + ("Parentheses needed to specify associativity of %s and %s", + cstring_fromChars (lsymbol_toChars (ltoken_getText (lastOpToken))), + cstring_fromChars (lsymbol_toChars (ltoken_getText (op))))); + } + } +} + +termNodeList +pushInfixOpPartNode (/*@returned@*/ termNodeList x, ltoken op, + /*@only@*/ termNode secondary) +{ + termNode lastLeftTerm; + termNodeList args = termNodeList_new (); + termNode t = (termNode) dmalloc (sizeof (*t)); + opFormNode opform; + nameNode nn; + + termNodeList_addh (args, secondary); + + if (!termNodeList_empty (x)) + { + termNodeList_reset (x); + lastLeftTerm = termNodeList_current (x); + checkAssociativity (lastLeftTerm, op); + } + + opform = makeOpFormNode (op, OPF_MANYOPM, + opFormUnion_createAnyOp (op), ltoken_undefined); + + nn = makeNameNodeForm (opform); + + t->error_reported = FALSE; + t->wrapped = 0; + t->name = nn; + t->kind = TRM_APPLICATION; + t->args = args; + t->sort = sort_makeNoSort (); + t->given = t->sort; + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + termNodeList_addh (x, t); + /* don't compute sort yet, do it in CollapseInfixTermNode */ + return (x); +} + +termNode +updateMatchedNode (/*@only@*/ termNode left, /*@returned@*/ termNode t, + /*@only@*/ termNode right) +{ + opFormNode op; + + if ((t == (termNode) 0) || (t->name == NULL) || t->name->isOpId) + { + llbugexitlit ("updateMatchedNode: expect opForm in nameNode"); + } + + op = t->name->content.opform; + llassert (op != NULL); + + if (left == (termNode) 0) + { + if (right == (termNode) 0) + { + /* op->kind is not changed */ + termNode_free (right); + } + else + { + op->kind = OPF_MIDDLEM; + op->key = opFormNode2key (op, OPF_MIDDLEM); + termNodeList_addh (t->args, right); + } + } + else + { + termNodeList_addl (t->args, left); + if (right == (termNode) 0) + { + op->kind = OPF_MMIDDLE; + op->key = opFormNode2key (op, OPF_MMIDDLE); + } + else + { + op->kind = OPF_MMIDDLEM; + op->key = opFormNode2key (op, OPF_MMIDDLEM); + termNodeList_addh (t->args, right); + } + } + return t; +} + +/*@only@*/ termNode + updateSqBracketedNode (/*@only@*/ termNode left, + /*@only@*/ /*@returned@*/ termNode t, + /*@only@*/ termNode right) +{ + opFormNode op; + + if ((t == (termNode) 0) || (t->name == NULL) || (t->name->isOpId)) + { + llbugexitlit ("updateSqBracketededNode: expect opForm in nameNode"); + } + + op = t->name->content.opform; + llassert (op != NULL); + + if (left == (termNode) 0) + { + if (right == (termNode) 0) + { + /* op->kind is not changed */ + } + else + { + op->kind = OPF_BMIDDLEM; + op->key = opFormNode2key (op, OPF_BMIDDLEM); + termNodeList_addh (t->args, right); + } + } + else + { + termNodeList_addl (t->args, left); + + if (right == (termNode) 0) + { + op->kind = OPF_BMMIDDLE; + op->key = opFormNode2key (op, OPF_BMMIDDLE); + } + else + { + op->kind = OPF_BMMIDDLEM; + op->key = opFormNode2key (op, OPF_BMMIDDLEM); + termNodeList_addh (t->args, right); + } + } + return t; +} + +/*@only@*/ termNode +makeSqBracketedNode (ltoken lbracket, + termNodeList args, ltoken rbracket) +{ + termNode t = (termNode) dmalloc (sizeof (*t)); + int size; + opFormNode opform; + nameNode nn; + + t->error_reported = FALSE; + t->wrapped = 0; + + size = termNodeList_size (args); + opform = makeOpFormNode (lbracket, OPF_BMIDDLE, opFormUnion_createMiddle (size), + rbracket); + nn = makeNameNodeForm (opform); + t->name = nn; + t->kind = TRM_APPLICATION; + t->args = args; + t->sort = sort_makeNoSort (); + t->given = t->sort; + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + /* do sort checking later, not here, incomplete parse */ + return (t); +} + +/*@only@*/ termNode +makeMatchedNode (ltoken open, termNodeList args, ltoken close) +{ + /* matched : open args close */ + termNode t = (termNode) dmalloc (sizeof (*t)); + int size; + opFormNode opform; + nameNode nn; + + t->error_reported = FALSE; + t->wrapped = 0; + + size = termNodeList_size (args); + opform = makeOpFormNode (open, OPF_MIDDLE, opFormUnion_createMiddle (size), close); + nn = makeNameNodeForm (opform); + t->name = nn; + t->kind = TRM_APPLICATION; + t->args = args; + t->sort = sort_makeNoSort (); + t->given = t->sort; + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + /* do sort checking later, not here, incomplete parse */ + return (t); +} + +/*@only@*/ termNode +makeSimpleTermNode (ltoken varid) +{ + sort theSort = sort_makeNoSort (); + lsymbol sym; + opInfo oi; + varInfo vi; + termNode n = (termNode) dmalloc (sizeof (*n)); + + n->error_reported = FALSE; + n->wrapped = 0; + n->name = (nameNode) 0; + n->given = theSort; + n->args = termNodeList_new (); + n->possibleSorts = sortSet_new (); + n->possibleOps = lslOpSet_new (); + + sym = ltoken_getText (varid); + + /* lookup current scope */ + vi = symtable_varInfoInScope (g_symtab, sym); + + if (varInfo_exists (vi)) + { + theSort = vi->sort; + n->kind = TRM_VAR; + n->sort = theSort; + n->literal = varid; + (void) sortSet_insert (n->possibleSorts, theSort); + } + else + { /* need to handle LCL constants */ + vi = symtable_varInfo (g_symtab, sym); + + if (varInfo_exists (vi) && vi->kind == VRK_CONST) + { + theSort = vi->sort; + n->kind = TRM_CONST; + n->sort = theSort; + n->literal = varid; + (void) sortSet_insert (n->possibleSorts, theSort); + } + else + { /* and LSL operators (true, false, new, nil, etc) */ + nameNode nn = makeNameNodeId (ltoken_copy (varid)); + oi = symtable_opInfo (g_symtab, nn); + + if (opInfo_exists (oi) && (oi->name->isOpId) && + !sigNodeSet_isEmpty (oi->signatures)) + { + sigNodeSet_elements (oi->signatures, x) + { + if (ltokenList_empty (x->domain)) + /* yes, it really is empty, not not empty */ + { + lslOp op = (lslOp) dmalloc (sizeof (*op)); + + op->name = nameNode_copy (nn); + op->signature = x; + (void) sortSet_insert (n->possibleSorts, sigNode_rangeSort (x)); + (void) lslOpSet_insert (n->possibleOps, op); + } + } end_sigNodeSet_elements; + } + + nameNode_free (nn); + + if (sortSet_size (n->possibleSorts) == 0) + { + lclerror + (varid, + message ("Unrecognized identifier (constant, variable or operator): %s", + ltoken_getRawString (varid))); + + } + + n->sort = sort_makeNoSort (); + n->literal = varid; + n->kind = TRM_ZEROARY; + } + } + + return (n); +} + +/*@only@*/ termNode +makeSelectTermNode (termNode pri, ltoken select, /*@dependent@*/ ltoken id) +{ + termNode t = (termNode) dmalloc (sizeof (*t)); + opFormNode opform = makeOpFormNode (select, + OPF_MSELECT, opFormUnion_createAnyOp (id), + ltoken_undefined); + nameNode nn = makeNameNodeForm (opform); + termNodeList args = termNodeList_new (); + + t->error_reported = FALSE; + t->wrapped = 0; + t->name = nn; + t->kind = TRM_APPLICATION; + termNodeList_addh (args, pri); + t->args = args; + t->kind = TRM_APPLICATION; + t->sort = sort_makeNoSort (); + t->given = t->sort; + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + + return t; +} + +/*@only@*/ termNode +makeMapTermNode (termNode pri, ltoken map, /*@dependent@*/ ltoken id) +{ + termNode t = (termNode) dmalloc (sizeof (*t)); + opFormNode opform = makeOpFormNode (map, OPF_MMAP, opFormUnion_createAnyOp (id), + ltoken_undefined); + nameNode nn = makeNameNodeForm (opform); + termNodeList args = termNodeList_new (); + + t->error_reported = FALSE; + t->wrapped = 0; + t->kind = TRM_APPLICATION; + t->name = nn; + termNodeList_addh (args, pri); + t->args = args; + t->kind = TRM_APPLICATION; + t->sort = sort_makeNoSort (); + t->given = t->sort; + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + return t; +} + +/*@only@*/ termNode +makeLiteralTermNode (ltoken tok, sort s) +{ + nameNode nn = makeNameNodeId (ltoken_copy (tok)); + opInfo oi = symtable_opInfo (g_symtab, nn); + lslOp op = (lslOp) dmalloc (sizeof (*op)); + termNode n = (termNode) dmalloc (sizeof (*n)); + sigNode sign; + ltoken range; + + n->name = nn; + n->error_reported = FALSE; + n->wrapped = 0; + n->kind = TRM_LITERAL; + n->literal = tok; + n->given = sort_makeNoSort (); + n->sort = n->given; + n->args = termNodeList_new (); + n->possibleSorts = sortSet_new (); + n->possibleOps = lslOpSet_new (); + + /* look up signatures for this operator too */ + + range = ltoken_create (simpleId, sort_getLsymbol (s)); + sign = makesigNode (ltoken_undefined, ltokenList_new (), + ltoken_copy (range)); + + if (opInfo_exists (oi) && (oi->name->isOpId) + && (sigNodeSet_size (oi->signatures) > 0)) + { + sigNodeSet_elements (oi->signatures, x) + { + if (ltokenList_empty (x->domain)) + { + lslOp opn = (lslOp) dmalloc (sizeof (*opn)); + sort sort; + + opn->name = nameNode_copy (nn); + opn->signature = x; + sort = sigNode_rangeSort (x); + (void) sortSet_insert (n->possibleSorts, sort); + (void) lslOpSet_insert (n->possibleOps, opn); + } + } end_sigNodeSet_elements; + } + + /* insert into literal term */ + (void) sortSet_insert (n->possibleSorts, s); + + op->name = nameNode_copy (nn); + op->signature = sign; + (void) lslOpSet_insert (n->possibleOps, op); + + /* enter the literal as an operator into the operator table */ + /* 8/9/93. C's char constant 'c' syntax conflicts + with LSL's lslinit.lsi table. Throw out, because it's not + needed anyway. */ + /* symtable_enterOp (g_symtab, nn, sign); */ + + if (s == sort_int) + { + sigNode osign; + lslOp opn = (lslOp) dmalloc (sizeof (*opn)); + + /* if it is a C int, we should overload it as double too because + C allows you to say "x > 2". */ + + (void) sortSet_insert (n->possibleSorts, sort_double); + + ltoken_setText (range, lsymbol_fromChars ("double")); + osign = makesigNode (ltoken_undefined, ltokenList_new (), range); + opn->name = nameNode_copy (nn); + opn->signature = osign; + (void) lslOpSet_insert (n->possibleOps, opn); + + symtable_enterOp (g_symtab, nameNode_copySafe (nn), sigNode_copy (osign)); + } + else + { + ltoken_free (range); + } + + /* future: could overload cstrings to be both char_Vec as well as + char_ObjPtr */ + + /*@-mustfree@*/ + return n; +} /*@=mustfree@*/ + +/*@only@*/ termNode +makeUnchangedTermNode1 (ltoken op, /*@unused@*/ ltoken all) +{ + termNode t = (termNode) dmalloc (sizeof (*t)); + + t->error_reported = FALSE; + t->wrapped = 0; + t->kind = TRM_UNCHANGEDALL; + t->sort = sort_bool; + t->literal = op; + t->given = sort_makeNoSort (); + t->name = NULL; /*< missing this >*/ + t->args = termNodeList_new (); + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + (void) sortSet_insert (t->possibleSorts, t->sort); + + ltoken_free (all); + + return t; +} + +/*@only@*/ termNode +makeUnchangedTermNode2 (ltoken op, storeRefNodeList x) +{ + termNode t = (termNode) dmalloc (sizeof (*t)); + ltoken errtok; + sort sort; + + t->name = NULL; /*< missing this >*/ + t->error_reported = FALSE; + t->wrapped = 0; + t->kind = TRM_UNCHANGEDOTHERS; + t->sort = sort_bool; + t->literal = op; + t->unchanged = x; + t->given = sort_makeNoSort (); + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + t->args = termNodeList_new (); + + (void) sortSet_insert (t->possibleSorts, t->sort); + /* check storeRefNode's are mutable, uses sort of term */ + + storeRefNodeList_elements (x, sto) + { + if (storeRefNode_isTerm (sto)) + { + sort = sto->content.term->sort; + if (!sort_mutable (sort)) + { + errtok = termNode_errorToken (sto->content.term); + lclerror (errtok, + message ("Term denoting immutable object used in unchanged list: %q", + termNode_unparse (sto->content.term))); + } + } + else + { + if (storeRefNode_isType (sto)) + { + lclTypeSpecNode type = sto->content.type; + sort = lclTypeSpecNode2sort (type); + if (!sort_mutable (sort)) + { + errtok = lclTypeSpecNode_errorToken (type); + lclerror (errtok, message ("Immutable type used in unchanged list: %q", + sort_unparse (sort))); + } + } + } + } end_storeRefNodeList_elements; + + return t; +} + +/*@only@*/ termNode + makeSizeofTermNode (ltoken op, lclTypeSpecNode type) +{ + termNode t = (termNode) dmalloc (sizeof (*t)); + + t->name = NULL; /*< missing this >*/ + t->error_reported = FALSE; + t->wrapped = 0; + t->kind = TRM_SIZEOF; + t->sort = sort_int; + t->literal = op; + t->sizeofField = type; + t->given = sort_makeNoSort (); + t->possibleSorts = sortSet_new (); + t->possibleOps = lslOpSet_new (); + t->args = termNodeList_new (); + + (void) sortSet_insert (t->possibleSorts, t->sort); + /* nothing to check */ + return (t); +} + +/*@only@*/ cstring +claimNode_unparse (claimNode c) +{ + if (c != (claimNode) 0) + { + cstring s = message ("claims (%q)%q{\n%q", + paramNodeList_unparse (c->params), + varDeclarationNodeList_unparse (c->globals), + lclPredicateNode_unparse (c->require)); + + if (c->body != NULL) + { + s = message ("%qbody {%q}\n", s, programNode_unparse (c->body)); + } + s = message ("%q%q}\n", s, lclPredicateNode_unparse (c->ensures)); + return s; + } + return cstring_undefined; +} + +static void +WrongArity (ltoken tok, int expect, int size) +{ + lclerror (tok, message ("Expecting %d arguments but given %d", expect, size)); +} + +static cstring +printTermNode2 (/*@null@*/ opFormNode op, termNodeList args, sort sort) +{ + if (op != (opFormNode) 0) + { + cstring s = cstring_undefined; + cstring sortText; + cstring sortSpace; + + if (sort != sort_makeNoSort ()) + { + sortText = message (": %s", cstring_fromChars (lsymbol_toChars (sort_getLsymbol (sort)))); + sortSpace = cstring_makeLiteral (" "); + } + else + { + sortText = cstring_undefined; + sortSpace = cstring_undefined; + } + + switch (op->kind) + { + case OPF_IF: + { + int size = termNodeList_size (args); + + if (size == 3) + { + s = message ("if %q then %q else %q\n", + termNode_unparse (termNodeList_getN (args, 0)), + termNode_unparse (termNodeList_getN (args, 1)), + termNode_unparse (termNodeList_getN (args, 2))); + } + else + { + WrongArity (op->tok, 3, size); + s = cstring_makeLiteral ("if __ then __ else __"); + } + s = message ("%q%s", s, sortText); + break; + } + case OPF_ANYOP: + { /* ymtan ? */ + s = message ("%s %s", + ltoken_getRawString (op->content.anyop), + sortText); + break; + } + case OPF_MANYOP: + { + int size = termNodeList_size (args); + + if (size == 1) + { + s = message ("%q ", termNode_unparse (termNodeList_head (args))); + } + else + { + WrongArity (op->content.anyop, 1, size); + s = cstring_makeLiteral ("__ "); + } + s = message ("%q%s%s", s, ltoken_getRawString (op->content.anyop), + sortText); + break; + } + case OPF_ANYOPM: + { + int size = termNodeList_size (args); + + s = message ("%s ", ltoken_getRawString (op->content.anyop)); + + if (size == 1) + { + s = message ("%q%q", s, termNode_unparse (termNodeList_head (args))); + } + else + { + WrongArity (op->content.anyop, 1, size); + s = message ("%q__", s); + } + s = message ("%q%s", s, sortText); + break; + } + case OPF_MANYOPM: + { + int size = termNodeList_size (args); + + if (size == 2) + { + s = message ("%q %s %q", + termNode_unparse (termNodeList_getN (args, 0)), + ltoken_getRawString (op->content.anyop), + termNode_unparse (termNodeList_getN (args, 1))); + } + else + { + WrongArity (op->content.anyop, 2, size); + s = message ("__ %s __", ltoken_getRawString (op->content.anyop)); + } + s = message ("%q%s", s, sortText); + break; + } + case OPF_MIDDLE: + { + int size = termNodeList_size (args); + int expect = op->content.middle; + + /* ymtan ? use { or openSym token ? */ + + if (size == expect) + { + s = message ("{%q}", termNodeList_unparse (args)); + } + else + { + WrongArity (op->tok, expect, size); + s = cstring_makeLiteral ("{ * }"); + } + + s = message ("%q%s", s, sortText); + break; /*** <<<--- bug detected by LCLint ***/ + } + case OPF_MMIDDLE: + { + int size = termNodeList_size (args); + int expect = op->content.middle + 1; + + if (size == expect) + { + s = message ("%q{%q}", + termNode_unparse (termNodeList_head (args)), + termNodeList_unparseTail (args)); + } + else + { + WrongArity (op->tok, expect, size); + s = cstring_makeLiteral ("__ { * }"); + } + + s = message ("%q%s", s, sortText); + break; + } + case OPF_MIDDLEM: + { + int size = termNodeList_size (args); + int expect = op->content.middle + 1; + + if (size == expect) + { + termNodeList_finish (args); + + s = message ("{%q}%s%s%q", + termNodeList_unparseToCurrent (args), + sortText, sortSpace, + termNode_unparse (termNodeList_current (args))); + } + else + { + WrongArity (op->tok, expect, size); + + s = message ("{ * }%s __", sortText); + + /* used to put in extra space! evs 94-01-05 */ + } + break; + } + case OPF_MMIDDLEM: + { + int size = termNodeList_size (args); + int expect = op->content.middle + 2; + + if (size == expect) + { + termNodeList_finish (args); + + s = message ("%q {%q} %s%s%q", + termNode_unparse (termNodeList_head (args)), + termNodeList_unparseSecondToCurrent (args), + sortText, sortSpace, + termNode_unparse (termNodeList_current (args))); + } + else + { + WrongArity (op->tok, expect, size); + s = message ("__ { * } %s __", sortText); + + /* also had extra space? */ + } + break; + } + case OPF_BMIDDLE: + { + int size = termNodeList_size (args); + int expect = op->content.middle; + + if (size == expect) + { + s = message ("[%q]", termNodeList_unparse (args)); + } + else + { + WrongArity (op->tok, expect, size); + s = cstring_makeLiteral ("[ * ]"); + } + s = message ("%q%s", s, sortText); + break; + } + case OPF_BMMIDDLE: + { + int size = termNodeList_size (args); + int expect = op->content.middle + 1; + + if (size == expect) + { + s = message ("%q[%q]", + termNode_unparse (termNodeList_head (args)), + termNodeList_unparseTail (args)); + } + else + { + WrongArity (op->tok, expect, size); + s = cstring_makeLiteral ("__ [ * ]"); + } + + s = message ("%q%s", s, sortText); + break; + } + case OPF_BMMIDDLEM: + { + int size = termNodeList_size (args); + int expect = op->content.middle + 1; + + if (size == expect) + { + s = message ("%q[%q] __", + termNode_unparse (termNodeList_head (args)), + termNodeList_unparseTail (args)); + } + else + { + WrongArity (op->tok, expect, size); + s = cstring_makeLiteral ("__ [ * ] __"); + } + s = message ("%q%s", s, sortText); + break; + } + case OPF_BMIDDLEM: + { + int size = termNodeList_size (args); + int expect = op->content.middle + 1; + + if (size == expect) + { + termNodeList_finish (args); + + s = message ("[%q]%s%s%q", + termNodeList_unparseToCurrent (args), + sortText, sortSpace, + termNode_unparse (termNodeList_current (args))); + } + else + { + WrongArity (op->tok, expect, size); + s = cstring_makeLiteral ("[ * ] __"); + } + + break; + } + case OPF_SELECT: + { /* ymtan constant, check args ? */ + s = cstring_prependChar ('.', ltoken_getRawString (op->content.id)); + break; + } + case OPF_MAP: + s = cstring_concat (cstring_makeLiteralTemp ("->"), + ltoken_getRawString (op->content.id)); + break; + case OPF_MSELECT: + { + int size = termNodeList_size (args); + + if (size == 1) + { + s = message ("%q.%s", termNode_unparse (termNodeList_head (args)), + ltoken_getRawString (op->content.id)); + } + else + { + WrongArity (op->content.id, 1, size); + s = cstring_concat (cstring_makeLiteralTemp ("__."), + ltoken_getRawString (op->content.id)); + } + break; + } + case OPF_MMAP: + { + int size = termNodeList_size (args); + + if (size == 1) + { + s = message ("%q->%s", termNode_unparse (termNodeList_head (args)), + ltoken_getRawString (op->content.id)); + } + else + { + WrongArity (op->content.id, 1, size); + s = cstring_concat (cstring_makeLiteralTemp ("__->"), + ltoken_getRawString (op->content.id)); + } + break; + } + } + + cstring_free (sortSpace); + cstring_free (sortText); + return s; + } + return cstring_undefined; +} + +/*@only@*/ cstring +termNode_unparse (/*@null@*/ termNode n) +{ + cstring s = cstring_undefined; + cstring back = cstring_undefined; + cstring front = cstring_undefined; + int count; + + if (n != (termNode) 0) + { + for (count = n->wrapped; count > 0; count--) + { + front = cstring_appendChar (front, '('); + back = cstring_appendChar (back, ')'); + } + + switch (n->kind) + { + case TRM_LITERAL: + case TRM_CONST: + case TRM_VAR: + case TRM_ZEROARY: + s = cstring_copy (ltoken_getRawString (n->literal)); + break; + case TRM_APPLICATION: + { + nameNode nn = n->name; + if (nn != (nameNode) 0) + { + if (nn->isOpId) + { + s = message ("%s (%q) ", + ltoken_getRawString (nn->content.opid), + termNodeList_unparse (n->args)); + /* must we handle n->given ? skip for now */ + } + else + { + s = message ("%q ", printTermNode2 (nn->content.opform, n->args, n->given)); + } + } + else + { + llfatalbug + (message ("termNode_unparse: expect non-empty nameNode: TRM_APPLICATION: %q", + nameNode_unparse (nn))); + } + break; + } + case TRM_UNCHANGEDALL: + s = cstring_makeLiteral ("unchanged (all)"); + break; + case TRM_UNCHANGEDOTHERS: + s = message ("unchanged (%q)", storeRefNodeList_unparse (n->unchanged)); + break; + case TRM_SIZEOF: + s = message ("sizeof (%q)", lclTypeSpecNode_unparse (n->sizeofField)); + break; + case TRM_QUANTIFIER: + { + quantifiedTermNode x = n->quantified; + s = message ("%q%s%q%s", + quantifierNodeList_unparse (x->quantifiers), + ltoken_getRawString (x->open), + termNode_unparse (x->body), + ltoken_getRawString (x->close)); + break; + } + } + } + return (message ("%q%q%q", front, s, back)); +} + +static void modifyNode_free (/*@null@*/ /*@only@*/ modifyNode m) +{ + if (m != (modifyNode) 0) + { + + if (m->hasStoreRefList) + { + storeRefNodeList_free (m->list); + /*@-branchstate@*/ + } + /*@=branchstate@*/ + + ltoken_free (m->tok); + sfree (m); + } +} + +/*@only@*/ cstring +modifyNode_unparse (/*@null@*/ modifyNode m) +{ + if (m != (modifyNode) 0) + { + if (m->hasStoreRefList) + { + return (message (" modifies %q; \n", storeRefNodeList_unparse (m->list))); + } + else + { + if (m->modifiesNothing) + { + return (cstring_makeLiteral ("modifies nothing; \n")); + } + else + { + return (cstring_makeLiteral ("modifies anything; \n")); + } + } + } + return cstring_undefined; +} + +/*@only@*/ cstring +programNode_unparse (programNode p) +{ + if (p != (programNode) 0) + { + cstring s = cstring_undefined; + int count; + + switch (p->kind) + { + case ACT_SELF: + { + cstring back = cstring_undefined; + + for (count = p->wrapped; count > 0; count--) + { + s = cstring_appendChar (s, '('); + back = cstring_appendChar (back, ')'); + } + s = message ("%q%q%q", s, stmtNode_unparse (p->content.self), back); + break; + } + case ACT_ITER: + s = message ("*(%q)", programNodeList_unparse (p->content.args)); + break; + case ACT_ALTERNATE: + s = message ("|(%q)", programNodeList_unparse (p->content.args)); + break; + case ACT_SEQUENCE: + s = programNodeList_unparse (p->content.args); + break; + } + + return s; + } + return cstring_undefined; +} + +/*@only@*/ cstring +stmtNode_unparse (stmtNode x) +{ + cstring s = cstring_undefined; + + if (x != (stmtNode) 0) + { + if (ltoken_isValid (x->lhs)) + { + s = cstring_concat (ltoken_getRawString (x->lhs), + cstring_makeLiteralTemp (" = ")); + } + + s = message ("%q%s (%q)", s, + ltoken_getRawString (x->operator), + termNodeList_unparse (x->args)); + } + + return s; +} + +/*@only@*/ lslOp + makelslOpNode (/*@only@*/ /*@null@*/ nameNode name, + /*@dependent@*/ sigNode s) +{ + lslOp x = (lslOp) dmalloc (sizeof (*x)); + + x->name = name; + x->signature = s; + + /* enter operator info into symtab */ + /* if not, they may need to be renamed in LCL imports */ + + if (g_lslParsingTraits) + { + if (name != NULL) + { + symtable_enterOp (g_symtab, nameNode_copySafe (name), sigNode_copy (s)); + } + } + else + { + /* nameNode_free (name); */ /* YIKES! */ + } + + return x; +} + +/*@only@*/ cstring +lslOp_unparse (lslOp x) +{ + char *s = mstring_createEmpty (); + + if (x != (lslOp) 0) + { + s = mstring_concatFree (s, cstring_toCharsSafe (nameNode_unparse (x->name))); + + if (x->signature != (sigNode) 0) + { + s = mstring_concatFree (s, cstring_toCharsSafe (sigNode_unparse (x->signature))); + } + } + + return cstring_fromCharsO (s); +} + +static bool +sameOpFormNode (/*@null@*/ opFormNode n1, /*@null@*/ opFormNode n2) +{ + if (n1 == n2) + return TRUE; + + if (n1 == 0) + return FALSE; + + if (n2 == 0) + return FALSE; + + if (n1->kind == n2->kind) + { + switch (n1->kind) + { + case OPF_IF: + return TRUE; + case OPF_ANYOP: + case OPF_MANYOP: + case OPF_ANYOPM: + return (ltoken_similar (n1->content.anyop, n2->content.anyop)); + case OPF_MANYOPM: + { + /* want to treat eq and = the same */ + return ltoken_similar (n1->content.anyop, n2->content.anyop); + } + case OPF_MIDDLE: + case OPF_MMIDDLE: + case OPF_MIDDLEM: + case OPF_MMIDDLEM: + /* need to check the rawText of openSym and closeSym */ + if ((int) n1->content.middle == (int) n2->content.middle) + { + if (lsymbol_equal (ltoken_getRawText (n1->tok), + ltoken_getRawText (n2->tok)) && + lsymbol_equal (ltoken_getRawText (n1->close), + ltoken_getRawText (n2->close))) + return TRUE; + } + return FALSE; + case OPF_BMIDDLE: + case OPF_BMMIDDLE: + case OPF_BMIDDLEM: + case OPF_BMMIDDLEM: + return ((int) n1->content.middle == (int) n2->content.middle); + case OPF_SELECT: + case OPF_MAP: + case OPF_MSELECT: + case OPF_MMAP: + return (ltoken_similar (n1->content.id, n2->content.id)); + } + } + return FALSE; +} + +bool +sameNameNode (/*@null@*/ nameNode n1, /*@null@*/ nameNode n2) +{ + if (n1 == n2) + return TRUE; + if (n1 != (nameNode) 0 && n2 != (nameNode) 0) + { + if (bool_equal (n1->isOpId, n2->isOpId)) + { + if (n1->isOpId) + return (ltoken_similar (n1->content.opid, n2->content.opid)); + else + return sameOpFormNode (n1->content.opform, + n2->content.opform); + } + } + return FALSE; +} + +void CTypesNode_free (/*@only@*/ /*@null@*/ CTypesNode x) +{ + if (x != NULL) + { + ltokenList_free (x->ctypes); + sfree (x); + } +} + +/*@null@*/ CTypesNode CTypesNode_copy (/*@null@*/ CTypesNode x) +{ + if (x != NULL) + { + CTypesNode newnode = (CTypesNode) dmalloc (sizeof (*newnode)); + newnode->intfield = x->intfield; + newnode->ctypes = ltokenList_copy (x->ctypes); + newnode->sort = x->sort; + + return newnode; + } + else + { + return NULL; + } +} + +/*@only@*/ CTypesNode + makeCTypesNode (/*@only@*/ CTypesNode ctypes, ltoken ct) +{ + /*@only@*/ CTypesNode newnode; + lsymbol sortname; + bits sortbits; + + if (ctypes == (CTypesNode) NULL) + { + newnode = (CTypesNode) dmalloc (sizeof (*newnode)); + newnode->intfield = 0; + newnode->ctypes = ltokenList_new (); + newnode->sort = sort_makeNoSort (); + } + else + { + newnode = ctypes; + } + + if ((ltoken_getIntField (ct) & newnode->intfield) != 0) + { + lclerror (ct, + message + ("Duplicate type specifier ignored: %s", + cstring_fromChars + (lsymbol_toChars + (lclctype_toSortDebug (ltoken_getIntField (ct)))))); + + /* evs --- don't know how to generator this error */ + + /* Use previous value, to keep things consistent */ + ltoken_free (ct); + return newnode; + } + + sortbits = newnode->intfield | ltoken_getIntField (ct); + sortname = lclctype_toSort (sortbits); + + if (sortname == lsymbol_fromChars ("error")) + { + lclerror (ct, cstring_makeLiteral ("Invalid combination of type specifiers")); + } + else + { + newnode->intfield = sortbits; + } + + ltokenList_addh (newnode->ctypes, ct); + + /* + ** Sorts are assigned after CTypesNode is created during parsing, + ** see bison grammar. + */ + + return newnode; +} + +/*@only@*/ CTypesNode +makeTypeSpecifier (ltoken typedefname) +{ + CTypesNode newnode = (CTypesNode) dmalloc (sizeof (*newnode)); + typeInfo ti = symtable_typeInfo (g_symtab, ltoken_getText (typedefname)); + + newnode->intfield = 0; + newnode->ctypes = ltokenList_singleton (ltoken_copy (typedefname)); + + /* if we see "bool" include bool.h header file */ + + if (ltoken_getText (typedefname) == lsymbol_bool) + { + lhIncludeBool (); + } + + if (typeInfo_exists (ti)) + { + /* must we be concern about whether this type is exported by module? + No. Because all typedef's are exported. No hiding supported. */ + /* Later, may want to keep types around too */ + /* 3/2/93, use underlying sort */ + newnode->sort = sort_getUnderlying (ti->basedOn); + } + else + { + lclerror (typedefname, message ("Unrecognized type: %s", + ltoken_getRawString (typedefname))); + /* evs --- Don't know how to get this message */ + + newnode->sort = sort_makeNoSort (); + } + + ltoken_free (typedefname); + return newnode; +} + +bool sigNode_equal (sigNode n1, sigNode n2) +{ + /* n1 and n2 are never 0 */ + + return ((n1 == n2) || + (n1->key == n2->key && + ltoken_similar (n1->range, n2->range) && + ltokenList_equal (n1->domain, n2->domain))); +} + +sort +typeExpr2ptrSort (sort base, /*@null@*/ typeExpr t) +{ + if (t != (typeExpr) 0) + { + switch (t->kind) + { + case TEXPR_BASE: + return base; + case TEXPR_PTR: + return typeExpr2ptrSort (sort_makePtr (ltoken_undefined, base), + t->content.pointer); + case TEXPR_ARRAY: + return typeExpr2ptrSort (sort_makeArr (ltoken_undefined, base), + t->content.array.elementtype); + case TEXPR_FCN: + /* map all hof types to some sort of SRT_HOF */ + return sort_makeHOFSort (base); + } + } + return base; +} + +static sort +typeExpr2returnSort (sort base, /*@null@*/ typeExpr t) +{ + if (t != (typeExpr) 0) + { + switch (t->kind) + { + case TEXPR_BASE: + return base; + case TEXPR_PTR: + return typeExpr2returnSort (sort_makePtr (ltoken_undefined, base), + t->content.pointer); + case TEXPR_ARRAY: + return typeExpr2returnSort (sort_makeArr (ltoken_undefined, base), + t->content.array.elementtype); + case TEXPR_FCN: + return typeExpr2returnSort (base, t->content.function.returntype); + } + } + return base; +} + +sort +lclTypeSpecNode2sort (lclTypeSpecNode type) +{ + if (type != (lclTypeSpecNode) 0) + { + switch (type->kind) + { + case LTS_TYPE: + llassert (type->content.type != NULL); + return sort_makePtrN (type->content.type->sort, type->pointers); + case LTS_STRUCTUNION: + llassert (type->content.structorunion != NULL); + return sort_makePtrN (type->content.structorunion->sort, + type->pointers); + case LTS_ENUM: + llassert (type->content.enumspec != NULL); + return sort_makePtrN (type->content.enumspec->sort, + type->pointers); + case LTS_CONJ: + return (lclTypeSpecNode2sort (type->content.conj->a)); + } + } + return (sort_makeNoSort ()); +} + +lsymbol +checkAndEnterTag (tagKind k, ltoken opttagid) +{ + /* should be tagKind, instead of int */ + tagInfo t; + sort sort = sort_makeNoSort (); + + if (!ltoken_isUndefined (opttagid)) + { + switch (k) + { + case TAG_FWDSTRUCT: + case TAG_STRUCT: + sort = sort_makeStr (opttagid); + break; + case TAG_FWDUNION: + case TAG_UNION: + sort = sort_makeUnion (opttagid); + break; + case TAG_ENUM: + sort = sort_makeEnum (opttagid); + break; + } + + /* see if it is already in symbol table */ + t = symtable_tagInfo (g_symtab, ltoken_getText (opttagid)); + + if (tagInfo_exists (t)) + { + if (t->kind == TAG_FWDUNION || t->kind == TAG_FWDSTRUCT) + { + /* this is fine, for mutually recursive types */ + } + else + { /* this is not good, complain later */ + cstring s; + + switch (k) + { + case TAG_ENUM: + s = cstring_makeLiteral ("Enum"); + break; + case TAG_STRUCT: + case TAG_FWDSTRUCT: + s = cstring_makeLiteral ("Struct"); + break; + case TAG_UNION: + case TAG_FWDUNION: + s = cstring_makeLiteral ("Union"); + break; + } + + t->sort = sort; + t->kind = k; + lclerror (opttagid, + message ("Tag redefined: %q %s", s, + ltoken_getRawString (opttagid))); + + } + + ltoken_free (opttagid); + } + else + { + tagInfo newnode = (tagInfo) dmalloc (sizeof (*newnode)); + + newnode->sort = sort; + newnode->kind = k; + newnode->id = opttagid; + newnode->imported = FALSE; + newnode->content.decls = stDeclNodeList_new (); + + (void) symtable_enterTag (g_symtab, newnode); + } + } + + return sort_getLsymbol (sort); +} + +static sort +extractReturnSort (lclTypeSpecNode t, declaratorNode d) +{ + sort sort; + sort = lclTypeSpecNode2sort (t); + sort = typeExpr2returnSort (sort, d->type); + return sort; +} + +void +signNode_free (/*@only@*/ signNode sn) +{ + sortList_free (sn->domain); + ltoken_free (sn->tok); + sfree (sn); +} + +/*@only@*/ cstring +signNode_unparse (signNode sn) +{ + cstring s = cstring_undefined; + + if (sn != (signNode) 0) + { + s = message (": %q -> %s", sortList_unparse (sn->domain), + sort_unparseName (sn->range)); + } + return s; +} + +static /*@only@*/ pairNodeList + globalList_toPairNodeList (globalList g) +{ + /* expect list to be globals, drop private ones */ + pairNodeList result = pairNodeList_new (); + pairNode p; + declaratorNode vdnode; + lclTypeSpecNode type; + sort sort; + lsymbol sym; + initDeclNodeList decls; + + varDeclarationNodeList_elements (g, x) + { + if (x->isSpecial) + { + ; + } + else + { + if (x->isGlobal && !x->isPrivate) + { + type = x->type; + decls = x->decls; + + initDeclNodeList_elements (decls, init) + { + p = (pairNode) dmalloc (sizeof (*p)); + + vdnode = init->declarator; + sym = ltoken_getText (vdnode->id); + /* 2/21/93, not sure if it should be extractReturnSort, + or some call to typeExpr2ptrSort */ + sort = extractReturnSort (type, vdnode); + p->sort = sort_makeGlobal (sort); + /* if (!sort_isArrayKind (sort)) p->sort = sort_makeObj (sort); + else p->sort = sort; */ + /* p->name = sym; */ + p->tok = ltoken_copy (vdnode->id); + pairNodeList_addh (result, p); + } end_initDeclNodeList_elements; + } + } + } end_varDeclarationNodeList_elements; + return result; +} + +void +enteringFcnScope (lclTypeSpecNode t, declaratorNode d, globalList g) +{ + scopeInfo si = (scopeInfo) dmalloc (sizeof (*si)); + varInfo vi = (varInfo) dmalloc (sizeof (*vi)); + sort returnSort; + ltoken result = ltoken_copy (ltoken_id); + pairNodeList paramPairs, globals; + fctInfo fi = (fctInfo) dmalloc (sizeof (*fi)); + signNode sign = (signNode) dmalloc (sizeof (*sign)); + sortList domain = sortList_new (); + unsigned int key; + + paramPairs = extractParams (d->type); + returnSort = extractReturnSort (t, d); + globals = globalList_toPairNodeList (g); + + sign->tok = ltoken_undefined; + sign->range = returnSort; + + key = MASH (0, sort_getLsymbol (returnSort)); + + pairNodeList_elements (paramPairs, p) + { + sortList_addh (domain, p->sort); + key = MASH (key, sort_getLsymbol (p->sort)); + } end_pairNodeList_elements; + + sign->domain = domain; + sign->key = key; + + /* push fcn onto symbol table stack first */ + fi->id = ltoken_copy (d->id); + fi->export = TRUE; + fi->signature = sign; + fi->globals = globals; + + (void) symtable_enterFct (g_symtab, fi); + + /* push new fcn scope */ + si->kind = SPE_FCN; + symtable_enterScope (g_symtab, si); + + /* add "result" with return type to current scope */ + ltoken_setText (result, lsymbol_fromChars ("result")); + + vi->id = result; + vi->sort = sort_makeFormal (returnSort); /* make appropriate values */ + vi->kind = VRK_PARAM; + vi->export = TRUE; + + (void) symtable_enterVar (g_symtab, vi); + + /* + ** evs - 4 Mar 1995 + ** pust globals first (they are in outer scope) + */ + + /* push onto symbol table the global variables declared in this function, + together with their respective sorts */ + + pairNodeList_elements (globals, gl) + { + ltoken_free (vi->id); + vi->id = ltoken_copy (gl->tok); + vi->kind = VRK_GLOBAL; + vi->sort = gl->sort; + (void) symtable_enterVar (g_symtab, vi); + } end_pairNodeList_elements; + + /* + ** could enter a new scope; instead, warn when variable shadows global + ** that is used + */ + + /* + ** push onto symbol table the formal parameters of this function, + ** together with their respective sorts + */ + + pairNodeList_elements (paramPairs, pair) + { + ltoken_free (vi->id); + vi->id = ltoken_copy (pair->tok); + vi->sort = pair->sort; + vi->kind = VRK_PARAM; + (void) symtable_enterVar (g_symtab, vi); + } end_pairNodeList_elements; + + pairNodeList_free (paramPairs); + varInfo_free (vi); +} + +void +enteringClaimScope (paramNodeList params, globalList g) +{ + scopeInfo si = (scopeInfo) dmalloc (sizeof (*si)); + pairNodeList globals; + lclTypeSpecNode paramtype; + typeExpr paramdecl; + sort sort; + + globals = globalList_toPairNodeList (g); + /* push new claim scope */ + si->kind = SPE_CLAIM; + + symtable_enterScope (g_symtab, si); + + /* push onto symbol table the formal parameters of this function, + together with their respective sorts */ + + paramNodeList_elements (params, param) + { + paramdecl = param->paramdecl; + paramtype = param->type; + if (paramdecl != (typeExpr) 0 && paramtype != (lclTypeSpecNode) 0) + { + varInfo vi = (varInfo) dmalloc (sizeof (*vi)); + + sort = lclTypeSpecNode2sort (paramtype); + sort = sort_makeFormal (sort); + vi->sort = typeExpr2ptrSort (sort, paramdecl); + vi->id = ltoken_copy (extractDeclarator (paramdecl)); + vi->kind = VRK_PARAM; + vi->export = TRUE; + + (void) symtable_enterVar (g_symtab, vi); + varInfo_free (vi); + } + } end_paramNodeList_elements; + + /* push onto symbol table the global variables declared in this function, + together with their respective sorts */ + + pairNodeList_elements (globals, g2) + { + varInfo vi = (varInfo) dmalloc (sizeof (*vi)); + + vi->id = ltoken_copy (g2->tok); + vi->kind = VRK_GLOBAL; + vi->sort = g2->sort; + vi->export = TRUE; + + /* should catch duplicates in formals */ + (void) symtable_enterVar (g_symtab, vi); + varInfo_free (vi); + } end_pairNodeList_elements; + + pairNodeList_free (globals); + /* should not free it here! ltoken_free (claimId); @*/ +} + +static /*@only@*/ pairNodeList + extractParams (/*@null@*/ typeExpr te) +{ + /* extract the parameters from a function header declarator's typeExpr */ + sort sort; + typeExpr paramdecl; + paramNodeList params; + lclTypeSpecNode paramtype; + pairNodeList head = pairNodeList_new (); + pairNode pair; + + if (te != (typeExpr) 0) + { + params = typeExpr_toParamNodeList (te); + if (paramNodeList_isDefined (params)) + { + paramNodeList_elements (params, param) + { + paramdecl = param->paramdecl; + paramtype = param->type; + if (paramdecl != (typeExpr) 0 && paramtype != (lclTypeSpecNode) 0) + { + pair = (pairNode) dmalloc (sizeof (*pair)); + sort = lclTypeSpecNode2sort (paramtype); + /* 2/17/93, was sort_makeVal (sort) */ + sort = sort_makeFormal (sort); + pair->sort = typeExpr2ptrSort (sort, paramdecl); + /* pair->name = ltoken_getText (extractDeclarator (paramdecl)); */ + pair->tok = ltoken_copy (extractDeclarator (paramdecl)); + pairNodeList_addh (head, pair); + } + } end_paramNodeList_elements; + } + } + return head; +} + +sort +sigNode_rangeSort (sigNode sig) +{ + if (sig == (sigNode) 0) + { + return sort_makeNoSort (); + } + else + { + return sort_fromLsymbol (ltoken_getText (sig->range)); + } +} + +/*@only@*/ sortList + sigNode_domain (sigNode sig) +{ + sortList domain = sortList_new (); + + if (sig == (sigNode) 0) + { + ; + } + else + { + ltokenList dom = sig->domain; + + ltokenList_elements (dom, tok) + { + sortList_addh (domain, sort_fromLsymbol (ltoken_getText (tok))); + } end_ltokenList_elements; + } + + return domain; +} + +opFormUnion +opFormUnion_createAnyOp (/*@temp@*/ ltoken t) +{ + opFormUnion u; + + /* do not distinguish between .anyop and .id */ + u.anyop = t; + return u; +} + +opFormUnion +opFormUnion_createMiddle (int middle) +{ + opFormUnion u; + + u.middle = middle; + return u; +} + +paramNode +markYieldParamNode (paramNode p) +{ + p->kind = PYIELD; + + llassert (p->type != NULL); + p->type->quals = qualList_add (p->type->quals, qual_createYield ()); + + return (p); +} + +/*@only@*/ lclTypeSpecNode + lclTypeSpecNode_copySafe (lclTypeSpecNode n) +{ + lclTypeSpecNode ret = lclTypeSpecNode_copy (n); + + llassert (ret != NULL); + return ret; +} + +/*@null@*/ /*@only@*/ lclTypeSpecNode + lclTypeSpecNode_copy (/*@null@*/ lclTypeSpecNode n) +{ + if (n != NULL) + { + switch (n->kind) + { + case LTS_CONJ: + return (makeLclTypeSpecNodeConj (lclTypeSpecNode_copy (n->content.conj->a), + lclTypeSpecNode_copy (n->content.conj->b))); + case LTS_TYPE: + return (makeLclTypeSpecNodeType (CTypesNode_copy (n->content.type))); + case LTS_STRUCTUNION: + return (makeLclTypeSpecNodeSU (strOrUnionNode_copy (n->content.structorunion))); + case LTS_ENUM: + return (makeLclTypeSpecNodeEnum (enumSpecNode_copy (n->content.enumspec))); + } + } + + return NULL; +} + +void lclTypeSpecNode_free (/*@null@*/ /*@only@*/ lclTypeSpecNode n) +{ + if (n != NULL) + { + switch (n->kind) + { + case LTS_CONJ: + lclTypeSpecNode_free (n->content.conj->a); + lclTypeSpecNode_free (n->content.conj->b); + break; + case LTS_TYPE: + CTypesNode_free (n->content.type); + break; + case LTS_STRUCTUNION: + strOrUnionNode_free (n->content.structorunion); + break; + case LTS_ENUM: + enumSpecNode_free (n->content.enumspec); + break; + } + + qualList_free (n->quals); + sfree (n); + } +} + +static /*@null@*/ opFormNode opFormNode_copy (/*@null@*/ opFormNode op) +{ + if (op != NULL) + { + opFormNode ret = (opFormNode) dmalloc (sizeof (*ret)); + + ret->tok = ltoken_copy (op->tok); + ret->kind = op->kind; + ret->content = op->content; + ret->key = op->key; + ret->close = ltoken_copy (op->close); + + return ret; + } + else + { + return NULL; + } +} + +void opFormNode_free (/*@null@*/ opFormNode op) +{ + sfree (op); +} + +void nameNode_free (nameNode n) +{ + + if (n != NULL) + { + if (!n->isOpId) + { + opFormNode_free (n->content.opform); + } + + sfree (n); + } +} + +bool +lslOp_equal (lslOp x, lslOp y) +{ + return ((x == y) || + ((x != 0) && (y != 0) && + sameNameNode (x->name, y->name) && + sigNode_equal (x->signature, y->signature))); +} + +void lslOp_free (lslOp x) +{ + nameNode_free (x->name); + sfree (x); +} + +void sigNode_free (sigNode x) +{ + if (x != NULL) + { + ltokenList_free (x->domain); + ltoken_free (x->tok); + ltoken_free (x->range); + sfree (x); + } +} + +void declaratorNode_free (/*@null@*/ /*@only@*/ declaratorNode x) +{ + if (x != NULL) + { + typeExpr_free (x->type); + ltoken_free (x->id); + sfree (x); + } +} + +void abstBodyNode_free (/*@null@*/ /*@only@*/ abstBodyNode n) +{ + if (n != NULL) + { + lclPredicateNode_free (n->typeinv); + fcnNodeList_free (n->fcns); + ltoken_free (n->tok); + sfree (n); + } +} + +void fcnNode_free (/*@null@*/ /*@only@*/ fcnNode f) +{ + if (f != NULL) + { + lclTypeSpecNode_free (f->typespec); + declaratorNode_free (f->declarator); + globalList_free (f->globals); + varDeclarationNodeList_free (f->inits); + letDeclNodeList_free (f->lets); + lclPredicateNode_free (f->checks); + lclPredicateNode_free (f->require); + lclPredicateNode_free (f->claim); + lclPredicateNode_free (f->ensures); + modifyNode_free (f->modify); + ltoken_free (f->name); + sfree (f); + } +} + +void declaratorInvNode_free (/*@null@*/ /*@only@*/ declaratorInvNode x) +{ + if (x != NULL) + { + declaratorNode_free (x->declarator); + abstBodyNode_free (x->body); + sfree (x); + } +} + +/*@only@*/ lslOp lslOp_copy (lslOp x) +{ + return (makelslOpNode (nameNode_copy (x->name), x->signature)); +} + +sigNode sigNode_copy (sigNode s) +{ + llassert (s != NULL); + return (makesigNode (ltoken_copy (s->tok), + ltokenList_copy (s->domain), + ltoken_copy (s->range))); +} + +/*@null@*/ nameNode nameNode_copy (/*@null@*/ nameNode n) +{ + if (n == NULL) return NULL; + return nameNode_copySafe (n); +} + +nameNode nameNode_copySafe (nameNode n) +{ + if (n->isOpId) + { + return (makeNameNodeId (ltoken_copy (n->content.opid))); + } + else + { + /* error should be detected by lclint: forgot to copy opform! */ + return (makeNameNodeForm (opFormNode_copy (n->content.opform))); + } +} + +bool initDeclNode_isRedeclaration (initDeclNode d) +{ + return (d->declarator->isRedecl); +} + +void termNode_free (/*@only@*/ /*@null@*/ termNode t) +{ + sfree (t); +} + +/*@only@*/ termNode termNode_copySafe (termNode t) +{ + termNode ret = termNode_copy (t); + + llassert (ret != NULL); + return ret; +} + +/*@null@*/ /*@only@*/ termNode termNode_copy (/*@null@*/ termNode t) +{ + if (t != NULL) + { + termNode ret = (termNode) dmalloc (sizeof (*ret)); + + ret->wrapped = t->wrapped; + ret->kind = t->kind; + ret->sort = t->sort; + ret->given = t->given; + ret->possibleSorts = sortSet_copy (t->possibleSorts); + ret->error_reported = t->error_reported; + ret->possibleOps = lslOpSet_copy (t->possibleOps); + ret->name = nameNode_copy (t->name); + ret->args = termNodeList_copy (t->args); + + if (t->kind == TRM_LITERAL + || t->kind == TRM_SIZEOF + || t->kind == TRM_VAR + || t->kind == TRM_CONST + || t->kind == TRM_ZEROARY) + { + ret->literal = ltoken_copy (t->literal); + } + + if (t->kind == TRM_UNCHANGEDOTHERS) + { + ret->unchanged = storeRefNodeList_copy (t->unchanged); + } + + if (t->kind == TRM_QUANTIFIER) + { + ret->quantified = quantifiedTermNode_copy (t->quantified); + } + + if (t->kind == TRM_SIZEOF) + { + ret->sizeofField = lclTypeSpecNode_copySafe (t->sizeofField); + } + + return ret; + } + else + { + + return NULL; + } +} + +void importNode_free (/*@only@*/ /*@null@*/ importNode x) +{ + sfree (x); +} + +void initDeclNode_free (/*@only@*/ /*@null@*/ initDeclNode x) +{ + if (x != NULL) + { + declaratorNode_free (x->declarator); + termNode_free (x->value); + sfree (x); + } +} + +void letDeclNode_free (/*@only@*/ /*@null@*/ letDeclNode x) +{ + if (x != NULL) + { + lclTypeSpecNode_free (x->sortspec); + termNode_free (x->term); + ltoken_free (x->varid); + sfree (x); + } +} + +void pairNode_free (/*@only@*/ /*@null@*/ pairNode x) +{ + sfree (x); +} + +/*@null@*/ paramNode paramNode_copy (/*@null@*/ paramNode p) +{ + if (p != NULL) + { + paramNode ret = (paramNode) dmalloc (sizeof (*ret)); + + ret->type = lclTypeSpecNode_copy (p->type); + ret->paramdecl = typeExpr_copy (p->paramdecl); + ret->kind = p->kind; + return ret; + } + + return NULL; +} + +void paramNode_free (/*@only@*/ /*@null@*/ paramNode x) +{ + if (x != NULL) + { + lclTypeSpecNode_free (x->type); + typeExpr_free (x->paramdecl); + sfree (x); + } +} + +void programNode_free (/*@only@*/ /*@null@*/ programNode x) +{ + if (x != NULL) + { + switch (x->kind) + { + case ACT_SELF: stmtNode_free (x->content.self); break; + case ACT_ITER: + case ACT_ALTERNATE: + case ACT_SEQUENCE: programNodeList_free (x->content.args); break; + BADDEFAULT; + } + sfree (x); + } +} + +quantifierNode quantifierNode_copy (quantifierNode x) +{ + quantifierNode ret = (quantifierNode) dmalloc (sizeof (*ret)); + + ret->quant = ltoken_copy (x->quant); + ret->vars = varNodeList_copy (x->vars); + ret->isForall = x->isForall; + + return ret; +} + +void quantifierNode_free (/*@null@*/ /*@only@*/ quantifierNode x) +{ + if (x != NULL) + { + varNodeList_free (x->vars); + ltoken_free (x->quant); + sfree (x); + } +} + +void replaceNode_free (/*@only@*/ /*@null@*/ replaceNode x) +{ + if (x != NULL) + { + if (x->isCType) + { + ; + } + else + { + nameNode_free (x->content.renamesortname.name); + sigNode_free (x->content.renamesortname.signature); + } + + typeNameNode_free (x->typename); + ltoken_free (x->tok); + sfree (x); + } +} + +storeRefNode storeRefNode_copy (storeRefNode x) +{ + storeRefNode ret = (storeRefNode) dmalloc (sizeof (*ret)); + + ret->kind = x->kind; + + switch (x->kind) + { + case SRN_TERM: + ret->content.term = termNode_copySafe (x->content.term); + break; + case SRN_OBJ: case SRN_TYPE: + ret->content.type = lclTypeSpecNode_copy (x->content.type); + break; + case SRN_SPECIAL: + ret->content.ref = sRef_copy (x->content.ref); + break; + } + + return ret; +} + +void storeRefNode_free (/*@only@*/ /*@null@*/ storeRefNode x) +{ + if (x != NULL) + { + if (storeRefNode_isTerm (x)) + { + termNode_free (x->content.term); + } + else if (storeRefNode_isType (x) || storeRefNode_isObj (x)) + { + lclTypeSpecNode_free (x->content.type); + } + else + { + /* nothing to free */ + } + + sfree (x); + } +} + +stDeclNode stDeclNode_copy (stDeclNode x) +{ + stDeclNode ret = (stDeclNode) dmalloc (sizeof (*ret)); + + ret->lcltypespec = lclTypeSpecNode_copySafe (x->lcltypespec); + ret->declarators = declaratorNodeList_copy (x->declarators); + + return ret; +} + +void stDeclNode_free (/*@only@*/ /*@null@*/ stDeclNode x) +{ + if (x != NULL) + { + lclTypeSpecNode_free (x->lcltypespec); + declaratorNodeList_free (x->declarators); + sfree (x); + } +} + +void traitRefNode_free (/*@only@*/ /*@null@*/ traitRefNode x) +{ + if (x != NULL) + { + ltokenList_free (x->traitid); + renamingNode_free (x->rename); + sfree (x); + } +} + +void typeNameNode_free (/*@only@*/ /*@null@*/ typeNameNode n) +{ + if (n != NULL) + { + typeNamePack_free (n->typename); + opFormNode_free (n->opform); + sfree (n); + } +} + +void varDeclarationNode_free (/*@only@*/ /*@null@*/ varDeclarationNode x) +{ + if (x != NULL) + { + if (x->isSpecial) + { + ; + } + else + { + lclTypeSpecNode_free (x->type); + initDeclNodeList_free (x->decls); + sfree (x); + } + } +} + +varNode varNode_copy (varNode x) +{ + varNode ret = (varNode) dmalloc (sizeof (*ret)); + + ret->varid = ltoken_copy (x->varid); + ret->isObj = x->isObj; + ret->type = lclTypeSpecNode_copySafe (x->type); + ret->sort = x->sort; + + return ret; +} + +void varNode_free (/*@only@*/ /*@null@*/ varNode x) +{ + if (x != NULL) + { + lclTypeSpecNode_free (x->type); + ltoken_free (x->varid); + sfree (x); + } +} + +void stmtNode_free (/*@only@*/ /*@null@*/ stmtNode x) +{ + if (x != NULL) + { + ltoken_free (x->lhs); + termNodeList_free (x->args); + ltoken_free (x->operator); + sfree (x); + } +} + +void renamingNode_free (/*@only@*/ /*@null@*/ renamingNode x) +{ + if (x != NULL) + { + if (x->is_replace) + { + replaceNodeList_free (x->content.replace); + } + else + { + nameAndReplaceNode_free (x->content.name); + } + + sfree (x); + } +} + +void nameAndReplaceNode_free (/*@only@*/ /*@null@*/ nameAndReplaceNode x) +{ + if (x != NULL) + { + typeNameNodeList_free (x->namelist); + replaceNodeList_free (x->replacelist); + sfree (x); + } +} + +void typeNamePack_free (/*@only@*/ /*@null@*/ typeNamePack x) +{ + if (x != NULL) + { + lclTypeSpecNode_free (x->type); + abstDeclaratorNode_free (x->abst); + sfree (x); + } +} + +cstring interfaceNode_unparse (interfaceNode x) +{ + if (x != NULL) + { + switch (x->kind) + { + case INF_IMPORTS: + return (message ("[imports] %q", importNodeList_unparse (x->content.imports))); + case INF_USES: + return (message ("[uses] %q", traitRefNodeList_unparse (x->content.uses))); + case INF_EXPORT: + return (message ("[export] %q", exportNode_unparse (x->content.export))); + case INF_PRIVATE: + return (message ("[private] %q", privateNode_unparse (x->content.private))); + } + + BADBRANCH; + } + else + { + return (cstring_makeLiteral ("")); + } +} + +void interfaceNode_free (/*@null@*/ /*@only@*/ interfaceNode x) +{ + if (x != NULL) + { + + switch (x->kind) + { + case INF_IMPORTS: importNodeList_free (x->content.imports); break; + case INF_USES: traitRefNodeList_free (x->content.uses); break; + case INF_EXPORT: exportNode_free (x->content.export); break; + case INF_PRIVATE: privateNode_free (x->content.private); break; + } + sfree (x); + } +} + +void exportNode_free (/*@null@*/ /*@only@*/ exportNode x) +{ + if (x != NULL) + { + switch (x->kind) + { + case XPK_CONST: constDeclarationNode_free (x->content.constdeclaration); break; + case XPK_VAR: varDeclarationNode_free (x->content.vardeclaration); break; + case XPK_TYPE: typeNode_free (x->content.type); break; + case XPK_FCN: fcnNode_free (x->content.fcn); break; + case XPK_CLAIM: claimNode_free (x->content.claim); break; + case XPK_ITER: iterNode_free (x->content.iter); break; + } + + sfree (x); + } +} + +void privateNode_free (/*@null@*/ /*@only@*/ privateNode x) +{ + if (x != NULL) + { + switch (x->kind) + { + case PRIV_CONST: + constDeclarationNode_free (x->content.constdeclaration); break; + case PRIV_VAR: + varDeclarationNode_free (x->content.vardeclaration); break; + case PRIV_TYPE: + typeNode_free (x->content.type); break; + case PRIV_FUNCTION: + fcnNode_free (x->content.fcn); break; + } + + sfree (x); + } +} + +void constDeclarationNode_free (/*@only@*/ /*@null@*/ constDeclarationNode x) +{ + if (x != NULL) + { + lclTypeSpecNode_free (x->type); + initDeclNodeList_free (x->decls); + sfree (x); + } +} + +void typeNode_free (/*@only@*/ /*@null@*/ typeNode t) +{ + if (t != NULL) + { + switch (t->kind) + { + case TK_ABSTRACT: abstractNode_free (t->content.abstract); break; + case TK_EXPOSED: exposedNode_free (t->content.exposed); break; + case TK_UNION: taggedUnionNode_free (t->content.taggedunion); break; + } + + sfree (t); + } +} + +void claimNode_free (/*@only@*/ /*@null@*/ claimNode x) +{ + if (x != NULL) + { + paramNodeList_free (x->params); + globalList_free (x->globals); + letDeclNodeList_free (x->lets); + lclPredicateNode_free (x->require); + programNode_free (x->body); + lclPredicateNode_free (x->ensures); + ltoken_free (x->name); + sfree (x); + } +} + +void iterNode_free (/*@only@*/ /*@null@*/ iterNode x) +{ + if (x != NULL) + { + paramNodeList_free (x->params); + ltoken_free (x->name); + sfree (x); + } +} + +void abstractNode_free (/*@only@*/ /*@null@*/ abstractNode x) +{ + if (x != NULL) + { + abstBodyNode_free (x->body); + ltoken_free (x->tok); + ltoken_free (x->name); + sfree (x); + } +} + +void exposedNode_free (/*@only@*/ /*@null@*/ exposedNode x) +{ + if (x != NULL) + { + lclTypeSpecNode_free (x->type); + declaratorInvNodeList_free (x->decls); + ltoken_free (x->tok); + sfree (x); + } +} + +void taggedUnionNode_free (/*@only@*/ /*@null@*/ taggedUnionNode x) +{ + if (x != NULL) + { + stDeclNodeList_free (x->structdecls); + declaratorNode_free (x->declarator); + sfree (x); + } +} + +/*@only@*/ /*@null@*/ strOrUnionNode + strOrUnionNode_copy (/*@null@*/ strOrUnionNode n) +{ + if (n != NULL) + { + strOrUnionNode ret = (strOrUnionNode) dmalloc (sizeof (*ret)); + + ret->kind = n->kind; + ret->tok = ltoken_copy (n->tok); + ret->opttagid = ltoken_copy (n->opttagid); + ret->sort = n->sort; + ret->structdecls = stDeclNodeList_copy (n->structdecls); + + return ret; + } + else + { + return NULL; + } +} + +void strOrUnionNode_free (/*@null@*/ /*@only@*/ strOrUnionNode n) +{ + if (n != NULL) + { + stDeclNodeList_free (n->structdecls); + ltoken_free (n->tok); + ltoken_free (n->opttagid); + sfree (n); + } +} + +void enumSpecNode_free (/*@null@*/ /*@only@*/ enumSpecNode x) +{ + if (x != NULL) + { + ltokenList_free (x->enums); + ltoken_free (x->tok); + ltoken_free (x->opttagid); + sfree (x); + } +} + +/*@only@*/ /*@null@*/ enumSpecNode enumSpecNode_copy (/*@null@*/ enumSpecNode x) +{ + if (x != NULL) + { + enumSpecNode ret = (enumSpecNode) dmalloc (sizeof (*ret)); + + ret->tok = ltoken_copy (x->tok); + ret->opttagid = ltoken_copy (x->opttagid); + ret->enums = ltokenList_copy (x->enums); + ret->sort = x->sort; + + return ret; + } + else + { + return NULL; + } +} + +void lsymbol_setbool (lsymbol s) +{ + lsymbol_bool = s; +} + +lsymbol lsymbol_getbool () +{ + return lsymbol_bool; +} + +lsymbol lsymbol_getBool () +{ + return lsymbol_Bool; +} + +lsymbol lsymbol_getFALSE () +{ + return lsymbol_FALSE; +} + +lsymbol lsymbol_getTRUE () +{ + return lsymbol_TRUE; +} + + diff --git a/src/aliasChecks.c b/src/aliasChecks.c new file mode 100644 index 0000000..4711f85 --- /dev/null +++ b/src/aliasChecks.c @@ -0,0 +1,3728 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** aliasChecks.c +*/ + +# include "lclintMacros.nf" +# include "basic.h" +# include "aliasChecks.h" + +static void checkStructTransfer (exprNode p_lhs, sRef p_slhs, exprNode p_rhs, sRef p_srhs, + fileloc p_loc, transferKind p_tt); +static void checkLeaveTrans (uentry p_actual, transferKind p_transferType); +static void checkTransfer (exprNode p_fexp, sRef p_fref, + exprNode p_texp, sRef p_tref, + fileloc p_loc, transferKind p_transferType); +static void checkGlobTrans (uentry p_glob, transferKind p_type); + +static ynm + checkCompletelyDefined (exprNode p_fexp, sRef p_fref, + exprNode p_texp, sRef p_tref, + bool p_topLevel, bool p_inUnion, bool p_directUnion, + fileloc p_loc, transferKind p_transferType, int p_depth, + bool p_report); + +static /*@exposed@*/ sRef dependentReference (sRef p_sr); +static bool canLoseLocalReference (sRef p_sr, fileloc p_loc) ; + +/* +** returns the most specific alkind +*/ + +alkind alkind_resolve (alkind a1, alkind a2) +{ + if (a1 == AK_UNKNOWN || a1 == AK_ERROR) return a2; + if (a2 == AK_UNKNOWN || a2 == AK_ERROR || a2 == AK_LOCAL) return a1; + if (a1 == AK_LOCAL) return a2; + return a1; +} + +/* +** tref <- fref +** +** transferType: +** FCNRETURN return fref; tref is return type +** GLOBASSIGN tref = fref; +** FCNPASS call (fref) ; tref is the argument type +** +*/ + +static /*@only@*/ cstring +transferErrorMessage (transferKind transferType, alkind tkind) /*@*/ +{ + switch (transferType) + { + case TT_FCNRETURN: + return (message ("returned as %s", alkind_unparse (tkind))); + case TT_DOASSIGN: + return (message ("assigned to %s", alkind_unparse (tkind))); + case TT_FIELDASSIGN: + return (message ("assigned to %s", alkind_unparse (tkind))); + case TT_GLOBINIT: + return (message ("used as initial value for %s", + alkind_unparse (tkind))); + case TT_FCNPASS: + return (message ("passed as %s param", alkind_unparse (tkind))); + BADDEFAULT; + } + BADEXIT; +} + +static cstring +transferErrorExpMessage (transferKind transferType, exkind tkind) /*@*/ +{ + if (exkind_isUnknown (tkind)) + { + switch (transferType) + { + case TT_FCNRETURN: + return (cstring_makeLiteral ("returned without qualification")); + case TT_FIELDASSIGN: + case TT_DOASSIGN: + return (cstring_makeLiteral ("assigned to unqualified reference")); + case TT_FCNPASS: + return (cstring_makeLiteral ("passed without qualification")); + case TT_GLOBINIT: + return (cstring_makeLiteral ("used as initial value for unqualified storage")); + BADDEFAULT; + } + } + else + { + switch (transferType) + { + case TT_FCNRETURN: + return (message ("returned as %s", exkind_unparse (tkind))); + case TT_FIELDASSIGN: + case TT_DOASSIGN: + return (message ("assigned to %s", exkind_unparse (tkind))); + case TT_FCNPASS: + return (message ("passed as %s param", exkind_unparse (tkind))); + BADDEFAULT; + } + } + + BADEXIT; +} + +static /*@observer@*/ cstring +transferNullMessage (transferKind transferType) /*@*/ +{ + switch (transferType) + { + case TT_FCNRETURN: + return (cstring_makeLiteralTemp ("returned as non-null")); + case TT_DOASSIGN: + case TT_FIELDASSIGN: + return (cstring_makeLiteralTemp ("assigned to non-null")); + case TT_GLOBINIT: + return (cstring_makeLiteralTemp ("initialized to non-null")); + case TT_FCNPASS: + return (cstring_makeLiteralTemp ("passed as non-null param")); + BADDEFAULT; + } + BADEXIT; +} + +static /*@dependent@*/ exprNode atFunction = exprNode_undefined; +static int atArgNo = 0; +static int atNumArgs = 0; + +static cstring generateText (exprNode e1, exprNode e2, + sRef tref, transferKind tt) + /*@*/ +{ + if (tt == TT_DOASSIGN || tt == TT_GLOBINIT) + { + return (message ("%s = %s", exprNode_unparse (e2), + exprNode_unparse (e1))); + } + else if (tt == TT_FIELDASSIGN) + { + return (message ("%s = %s (field %q)", + exprNode_unparse (e2), + exprNode_unparse (e1), + sRef_unparse (tref))); + } + else if (tt == TT_FCNPASS) + { + return (message ("%s (%s%s%s)", + exprNode_unparse (atFunction), + (atArgNo == 1 ? cstring_undefined + : cstring_makeLiteralTemp ("..., ")), + exprNode_unparse (e1), + (atArgNo == atNumArgs ? cstring_undefined + : cstring_makeLiteralTemp (", ...")))); + } + else + { + return (cstring_copy (exprNode_unparse (e1))); + } +} + +static /*@observer@*/ cstring +transferType_unparse (transferKind transferType) /*@*/ +{ + switch (transferType) + { + case TT_FCNRETURN: + return (cstring_makeLiteralTemp ("Returned")); + case TT_DOASSIGN: + case TT_FIELDASSIGN: + return (cstring_makeLiteralTemp ("Assigned")); + case TT_FCNPASS: + return (cstring_makeLiteralTemp ("Passed")); + case TT_GLOBINIT: + return (cstring_makeLiteralTemp ("Initialized")); + case TT_GLOBRETURN: + return (cstring_makeLiteralTemp ("GLOB RETURN!")); + case TT_GLOBPASS: + return (cstring_makeLiteralTemp ("GLOB PASS!")); + case TT_PARAMRETURN: + return (cstring_makeLiteralTemp ("PARAM RETURN!")); + case TT_LEAVETRANS: + return (cstring_makeLiteralTemp ("LEAVE TRANS!")); + BADDEFAULT; + } + BADEXIT; +} + +static /*@observer@*/ cstring udError (sRef s) +{ + if (sRef_isDead (s)) + { + return cstring_makeLiteralTemp ("released"); + } + else if (sRef_isAllocated (s)) + { + return cstring_makeLiteralTemp ("allocated but not defined"); + } + else + { + return cstring_makeLiteralTemp ("undefined"); + } +} + +static /*@only@*/ +cstring defExpl (sRef s) /*@*/ +{ + sRef rb = sRef_getRootBase (s); + + if (sRef_sameName (rb, s)) + { + if (sRef_isAllocated (s)) + { + return cstring_makeLiteral (" (allocated only)"); + } + return cstring_undefined; + } + else + { + return (message (" (%q is %s)", sRef_unparse (s), udError (s))); + } +} + +/* +** returns TRUE if fref is completely defined. +** if !report, returns TRUE unless error is at the deep level. +*/ + +static ynm + checkCompletelyDefined (exprNode fexp, sRef fref, + exprNode texp, sRef tref, + bool topLevel, bool inUnion, bool directUnion, + fileloc loc, transferKind transferType, + int depth, bool report) +{ + ctype ct; + alkind fkind = sRef_getAliasKind (fref); + alkind tkind = sRef_getAliasKind (tref); + + if (depth > MAXDEPTH) + { + llquietbug + (message + ("Check definition limit exceeded, checking %q. " + "This either means there is a variable with at least " + "%d indirections apparent in the program text, or " + "there is a bug in LCLint.", + sRef_unparse (fref), + MAXDEPTH)); + + return YES; + } + + if (!sRef_isKnown (fref)) + { + return YES; + } + + if (alkind_isStack (fkind)) + { + ctype rt = ctype_realType (sRef_getType (tref)); + + if (ctype_isMutable (rt) && !ctype_isSU (rt)) + { + if (transferType == TT_PARAMRETURN) + { + if (optgenerror + (FLG_RETSTACK, + message + ("Stack-allocated storage %qreachable from parameter %q", + sRef_unparseOpt (fref), + sRef_unparse (sRef_getRootBase (fref))), + loc)) + { + sRef_showAliasInfo (fref); + } + } + else if (transferType == TT_GLOBRETURN) + { + if (optgenerror + (FLG_RETSTACK, + message + ("Stack-allocated storage %qreachable from global %q", + sRef_unparseOpt (fref), + sRef_unparse (sRef_getRootBase (fref))), + loc)) + { + sRef_showAliasInfo (fref); + } + } + else if (transferType == TT_FCNRETURN) + { + if (optgenerror + (FLG_RETSTACK, + message + ("Stack-allocated storage %qreachable from return value: %s", + sRef_unparseOpt (fref), + exprNode_unparse (fexp)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + else + { + /* no error */ + } + } + } + + if (!topLevel) + { + if ((sRef_isObserver (fref) && !sRef_isObserver (tref)) + || (sRef_isExposed (fref) && !(sRef_isObserver (tref) + || sRef_isExposed (tref)))) + { + flagcode code = (sRef_isObserver (fref) + ? FLG_OBSERVERTRANS : FLG_EXPOSETRANS); + + if (!sRef_isStateLive (fref)) + { + ; /* no error (will be a definition error) */ + } + else if (transferType == TT_DOASSIGN + || transferType == TT_FIELDASSIGN + || transferType == TT_GLOBINIT + || transferType == TT_FCNPASS) + { + ; /* no error */ + } + else if (transferType == TT_PARAMRETURN) + { + if (optgenerror + (code, + message + ("%s storage %qreachable from %s parameter", + exkind_capName (sRef_getExKind (fref)), + sRef_unparseOpt (fref), + exkind_unparseError (sRef_getExKind (tref))), + loc)) + { + sRef_showExpInfo (fref); + sRef_setExKind (fref, XO_UNKNOWN, loc); + } + } + else if (transferType == TT_LEAVETRANS) + { + ; + } + else if (transferType == TT_GLOBINIT) + { + if (optgenerror + (code, + message + ("%s storage %qreachable from %s initial value", + exkind_capName (sRef_getExKind (fref)), + sRef_unparseOpt (fref), + exkind_unparseError (sRef_getExKind (tref))), + loc)) + { + sRef_showExpInfo (fref); + sRef_setExKind (fref, XO_UNKNOWN, loc); + } + } + else if (transferType == TT_GLOBRETURN) + { + if (optgenerror + (code, + message + ("%s storage %qreachable from %s global", + exkind_capName (sRef_getExKind (fref)), + sRef_unparseOpt (fref), + exkind_unparseError (sRef_getExKind (tref))), + loc)) + { + sRef_showExpInfo (fref); + sRef_setExKind (fref, XO_UNKNOWN, loc); + } + } + else if (transferType == TT_FCNRETURN) + { + if (optgenerror + (code, + message + ("%s storage %qreachable from %s return value", + exkind_capName (sRef_getExKind (fref)), + sRef_unparseOpt (fref), + exkind_unparseError (sRef_getExKind (tref))), + loc)) + { + sRef_showExpInfo (fref); + sRef_setExKind (fref, XO_UNKNOWN, loc); + } + } + else + { + llcontbug (message ("Transfer type: %s", + transferType_unparse (transferType))); + + if (optgenerror + (code, + message + ("%s storage %qreachable from %s return value", + exkind_capName (sRef_getExKind (fref)), + sRef_unparseOpt (fref), + exkind_unparseError (sRef_getExKind (tref))), + loc)) + { + sRef_showExpInfo (fref); + sRef_setExKind (fref, XO_UNKNOWN, loc); + } + } + + } + + if (!alkind_compatible (fkind, tkind)) + { + if (fkind == AK_UNKNOWN && !sRef_isStateLive (fref)) + { + ; /* no error (will be a definition error) */ + } + else if (transferType == TT_DOASSIGN) + { + ; /* no error */ + } + else if (transferType == TT_FCNPASS) + { + if (alkind_isKnown (sRef_getAliasKind (tref))) + { + if (optgenerror + (FLG_COMPMEMPASS, + message + ("Storage %qreachable from passed parameter " + "is %s (should be %s): %s", + sRef_unparseOpt (fref), + alkind_unparse (sRef_getAliasKind (fref)), + alkind_unparse (sRef_getAliasKind (tref)), + exprNode_unparse (fexp)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + } + else if (transferType == TT_PARAMRETURN) + { + bool noerror = FALSE; + + if (alkind_isDependent (sRef_getAliasKind (fref))) + { + if (canLoseLocalReference (fref, loc)) + { + noerror = TRUE; + } + } + + if (!noerror + && optgenerror + (FLG_COMPMEMPASS, + message + ("Storage %qreachable from parameter is %s (should be %s)", + sRef_unparseOpt (fref), + alkind_unparse (sRef_getAliasKind (fref)), + alkind_unparse (sRef_getAliasKind (tref))), + loc)) + { + sRef_showAliasInfo (fref); + } + } + else if (transferType == TT_LEAVETRANS) + { + if (optgenerror + (FLG_COMPMEMPASS, + message + ("Storage %qreachable from temporary reference is %s " + "at scope exit (should be %s)", + sRef_unparseOpt (fref), + alkind_unparse (sRef_getAliasKind (fref)), + alkind_unparse (sRef_getAliasKind (tref))), + loc)) + { + sRef_showAliasInfo (fref); + } + } + else if (transferType == TT_GLOBRETURN) + { + if (optgenerror + (FLG_COMPMEMPASS, + message + ("Storage %qreachable from global is %s (should be %s)", + sRef_unparseOpt (fref), + alkind_unparse (sRef_getAliasKind (fref)), + alkind_unparse (sRef_getAliasKind (tref))), + loc)) + { + sRef_showAliasInfo (fref); + } + } + else if (transferType == TT_FCNRETURN) + { + if (optgenerror + (FLG_COMPMEMPASS, + message + ("Storage %qreachable from return value is %s (should be %s)", + sRef_unparseOpt (fref), + alkind_unparse (sRef_getAliasKind (fref)), + alkind_unparse (sRef_getAliasKind (tref))), + loc)) + { + sRef_showAliasInfo (fref); + } + } + else if (transferType == TT_GLOBINIT) + { + if (optgenerror + (FLG_COMPMEMPASS, + message + ("Storage %qreachable from initial value is %s (should be %s)", + sRef_unparseOpt (fref), + alkind_unparse (sRef_getAliasKind (fref)), + alkind_unparse (sRef_getAliasKind (tref))), + loc)) + { + sRef_showAliasInfo (fref); + } + } + else + { + llcontbug (message ("Transfer type: %s", + transferType_unparse (transferType))); + + if (optgenerror + (FLG_COMPMEMPASS, + message + ("Storage %qreachable from return value is %s (should be %s)", + sRef_unparseOpt (fref), + alkind_unparse (sRef_getAliasKind (fref)), + alkind_unparse (sRef_getAliasKind (tref))), + loc)) + { + sRef_showAliasInfo (fref); + } + } + } + + if (sRef_isDead (fref)) + { + if (directUnion) + { + return NO; + } + + if (transferType == TT_PARAMRETURN) + { + if (optgenerror + (FLG_USERELEASED, + message + ("Released storage %q reachable from parameter at return point", + sRef_unparse (fref)), + loc)) + { + sRef_showStateInfo (fref); + return YES; + } + } + else if (transferType == TT_LEAVETRANS) + { + if (optgenerror + (FLG_USERELEASED, + message ("Released storage %q reachable from temporary " + "reference at scope exit", + sRef_unparse (fref)), + loc)) + { + sRef_showStateInfo (fref); + return YES; + } + } + else if (transferType == TT_GLOBRETURN) + { + if (optgenerror + (FLG_GLOBSTATE, + message ("Released storage %q reachable from global", + sRef_unparse (fref)), + loc)) + { + sRef_showStateInfo (fref); + return YES; + } + } + else if (transferType == TT_FCNPASS) + { + if (optgenerror + (FLG_USERELEASED, + message ("Released storage %q reachable from passed parameter", + sRef_unparse (fref)), + loc)) + { + sRef_showStateInfo (fref); + return YES; + } + } + else + { + if (optgenerror + (FLG_USERELEASED, + message ("Released storage %q reachable from parameter", + sRef_unparse (fref)), + loc)) + { + sRef_showStateInfo (fref); + return YES; + } + } + } + } + + if (!topLevel + && sRef_possiblyNull (fref) + && !sRef_perhapsNull (tref) + && ctype_isRealPointer (sRef_getType (tref)) + && !usymtab_isGuarded (fref)) + { + if (transferType == TT_FCNRETURN) + { + if (optgenerror + (FLG_NULLRET, + message ("%q storage %qderivable from return value: %s", + cstring_capitalize (sRef_nullMessage (fref)), + sRef_unparseOpt (fref), + exprNode_unparse (fexp)), + loc)) + { + sRef_showNullInfo (fref); + sRef_setNullError (fref); + } + } + else if (transferType == TT_GLOBRETURN || transferType == TT_PARAMRETURN) + { + if (optgenerror + (FLG_NULLSTATE, + message + ("Function returns with %s storage derivable from %q %q", + sRef_nullMessage (fref), + cstring_makeLiteral ((transferType == TT_GLOBRETURN) + ? "global" : "parameter"), + sRef_unparse (fref)), + loc)) + { + sRef_showNullInfo (fref); + sRef_setNullError (fref); + } + } + else if (transferType == TT_GLOBPASS) + { + if (optgenerror + (FLG_NULLPASS, + message ("Function called with %s storage " + "derivable from global %q", + sRef_nullMessage (fref), + sRef_unparse (fref)), + loc)) + { + sRef_showNullInfo (fref); + sRef_setNullError (fref); + } + } + else if (transferType == TT_FCNPASS) + { + if (optgenerror + (FLG_NULLSTATE, + message ("%q storage %qderivable from parameter %q", + cstring_capitalize (sRef_nullMessage (fref)), + sRef_unparseOpt (fref), + generateText (fexp, exprNode_undefined, + sRef_undefined, TT_FCNPASS)), + loc)) + { + sRef_showNullInfo (fref); + sRef_setNullError (fref); + } + } + else + { + llassert (transferType == TT_DOASSIGN + || transferType == TT_GLOBINIT + || transferType == TT_LEAVETRANS); + } + } + + if (sRef_isRelDef (tref) + || sRef_isPartial (tref) + || sRef_isAllocated (tref) + || sRef_isStateSpecial (tref)) + { + /* should check fref is allocated? */ + return YES; + } + + ct = ctype_realType (sRef_getType (fref)); + + if (!(sRef_isAnyDefined (fref) + || sRef_isPdefined (fref) + || sRef_isAllocated (fref) + || sRef_isStateUnknown (fref))) + { + if (transferType == TT_GLOBRETURN) + { + if (report + && optgenerror + (FLG_COMPDEF, + message ("Function returns with global %q not " + "completely defined%q", + sRef_unparse (sRef_getRootBase (fref)), + defExpl (fref)), + loc)) + { + sRef_showStateInfo (fref); + sRef_setDefined (fref, loc); + } + } + else if (transferType == TT_GLOBPASS) + { + if (report && + optgenerror + (FLG_COMPDEF, + message + ("Function called with global %q not completely defined%q", + sRef_unparse (sRef_getRootBase (fref)), + defExpl (fref)), + loc)) + { + sRef_showStateInfo (fref); + sRef_setDefined (fref, loc); + } + } + else if (transferType == TT_PARAMRETURN) + { + if (report && !topLevel + && optgenerror + (FLG_COMPDEF, + message ("Function returns storage %q reachable from parameter not " + "completely defined%q", + sRef_unparse (sRef_getRootBase (fref)), + defExpl (fref)), + loc)) + { + sRef_showStateInfo (fref); + sRef_setDefined (fref, loc); + } + } + else if (transferType == TT_LEAVETRANS) + { + if (report && !topLevel + && optgenerror + (FLG_COMPDEF, + message ("Scope exits with storage %q reachable from " + "temporary reference not completely defined%q", + sRef_unparse (sRef_getRootBase (fref)), + defExpl (fref)), + loc)) + { + sRef_showStateInfo (fref); + sRef_setDefined (fref, loc); + } + } + else + { + if (transferType != TT_DOASSIGN + && (!(sRef_isNew (fref) || sRef_isType (fref)))) + { + if (report) + { + if (sRef_isDead (fref)) + { + if (optgenerror + (FLG_USERELEASED, + message ("%s storage %qwas released: %q", + transferType_unparse (transferType), + sRef_unparseOpt (fref), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showStateInfo (fref); + } + } + else + { + if (optgenerror + (FLG_COMPDEF, + message + ("%s storage %qnot completely defined%q: %q", + transferType_unparse (transferType), + sRef_unparseOpt (sRef_getRootBase (fref)), + defExpl (fref), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef rb = sRef_getRootBase (fref); + sRef_showStateInfo (fref); + sRef_setDefinedComplete (rb, loc); + } + } + } + } + else + { + + if (sRef_isAllocated (fref) && sRef_isValid (tref) + && (transferType == TT_DOASSIGN)) + { + sRef_setAllocatedComplete (tref, loc); + } + return YES; + } + } + + return NO; + } + + if (ctype_isUnknown (ct)) + { + return YES; + } + else if (ctype_isPointer (ct)) + { + ctype tct = ctype_realType (sRef_getType (tref)); + + if (sRef_isStateUnknown (fref)) + { + return NO; + } + else + { + if (ctype_isAP (tct) || ctype_isUnknown (tct)) + { + sRef fptr = sRef_constructDeref (fref); + sRef tptr = sRef_constructDeref (tref); + + return (checkCompletelyDefined (fexp, fptr, texp, tptr, + FALSE, inUnion, FALSE, loc, + transferType, depth + 1, report)); + } + else + { + return YES; + } + } + } + else if (ctype_isArray (ct)) + { + return YES; + } + else if (ctype_isStruct (ct)) + { + ctype tct = ctype_realType (sRef_getType (tref)); + + if (ctype_match (ct, tct)) + { + bool isOk = TRUE; + bool hasOneDefined = FALSE; + cstringSList badFields = cstringSList_undefined; + + if (sRef_isStateUnknown (fref) || sRef_isAllocated (tref)) + { + return YES; + } + + if (sRef_isPdefined (fref) || sRef_isAnyDefined (fref)) + { + sRefSet_realElements (sRef_derivedFields (fref), sr) + { + bool thisField; + + hasOneDefined = TRUE; + + if (sRef_isField (sr)) + { + cstring fieldname = sRef_getField (sr); + sRef fldref = sRef_makeField (tref, fieldname); + bool shouldCheck = !sRef_isRecursiveField (fldref); + + if (shouldCheck) + { + thisField = + ynm_toBoolRelaxed + (checkCompletelyDefined (fexp, sr, texp, fldref, + FALSE, inUnion, FALSE, loc, + transferType, depth + 1, + FALSE)); + } + else + { + thisField = TRUE; + } + + if (!thisField) + { + isOk = FALSE; + badFields = cstringSList_add (badFields, + sRef_getField (sr)); + } + } + } end_sRefSet_realElements; + } + else if (sRef_isAllocated (fref)) + { + /* + ** for structures, each field must be completely defined + */ + + uentryList fields = ctype_getFields (ct); + + uentryList_elements (fields, ue) + { + bool thisField; + cstring name = uentry_getRealName (ue); + sRef ffield = sRef_makeField (fref, name); + sRef tfield = sRef_makeField (tref, name); + bool shouldCheck = !sRef_isRecursiveField (tfield); + + if (!shouldCheck) + { + thisField = TRUE; + } + else + { + thisField = ynm_toBoolRelaxed + (checkCompletelyDefined (fexp, ffield, texp, tfield, + FALSE, inUnion, FALSE, + loc, transferType, + depth + 1, FALSE)); + } + + if (!thisField) + { + isOk = FALSE; + badFields = cstringSList_add (badFields, uentry_rawName (ue)); + } + else + { + hasOneDefined = TRUE; + } + } end_uentryList_elements; + } + else + { + ; + } + + if (!isOk && (!inUnion || hasOneDefined)) + { + if (transferType == TT_GLOBRETURN) + { + if (optgenerror + (FLG_COMPDEF, + message ("Global storage %q contains %d undefined field%p " + "when call returns: %q", + sRef_unparse (fref), + cstringSList_size (badFields), + cstringSList_unparseAbbrev (badFields)), + loc)) + { + sRef_setDefined (fref, loc); + } + } + else if (transferType == TT_GLOBPASS) + { + if (optgenerror + (FLG_COMPDEF, + message ("Global storage %q contains %d undefined field%p " + "before call: %q", + sRef_unparse (fref), + cstringSList_size (badFields), + cstringSList_unparseAbbrev (badFields)), + loc)) + { + sRef_setDefined (fref, loc); + } + } + else if (transferType == TT_PARAMRETURN) + { + if (optgenerror + (FLG_COMPDEF, + message ("Storage %qreachable from parameter " + "contains %d undefined field%p: %q", + sRef_unparseOpt (fref), + cstringSList_size (badFields), + cstringSList_unparseAbbrev (badFields)), + loc)) + { + sRef_setDefined (fref, loc); + } + } + else if (transferType == TT_LEAVETRANS) + { + /* no error */ + } + else + { + if (optgenerror + (FLG_COMPDEF, + message ("%s storage %qcontains %d undefined field%p: %q", + transferType_unparse (transferType), + sRef_unparseOpt (fref), + cstringSList_size (badFields), + cstringSList_unparseAbbrev (badFields)), + loc)) + { + sRef_setDefined (fref, loc); + } + } + } + + cstringSList_free (badFields); + + if (inUnion) + { + if (directUnion) + { + return (ynm_fromBool (hasOneDefined)); + } + else + { + return (MAYBE); + } + } + else + { + return (ynm_fromBool (!report || isOk)); + } + } + else + { + return YES; + } + } + else if (ctype_isUnion (ct)) + { + if (sRef_isStateUnknown (fref) || sRef_isAllocated (tref)) + { + return YES; + } + else + { + ctype tct = ctype_realType (sRef_getType (tref)); + + if (ctype_isKnown (tct) && ctype_match (ct, tct)) + { + cstringSList goodFields = cstringSList_new (); + bool isOk = FALSE; + int nelements = sRefSet_size (sRef_derivedFields (fref)); + + /* + ** for unions, at least one field must be completely defined + */ + + if (sRef_isPdefined (fref) || sRef_isAnyDefined (fref)) + { + isOk = TRUE; + } + + sRefSet_realElements (sRef_derivedFields (fref), sr) + { + bool thisField; + + if (sRef_isField (sr)) + { + sRef fldref = sRef_makeField (tref, sRef_getField (sr)); + + thisField = ynm_toBoolStrict + (checkCompletelyDefined + (fexp, sr, texp, fldref, FALSE, inUnion, + (nelements > 1 ? TRUE : FALSE), + loc, transferType, depth + 1, FALSE)); + + if (thisField) + { + goodFields = cstringSList_add + (goodFields, sRef_getField (sr)); + } + } + } end_sRefSet_realElements; + + if (cstringSList_empty (goodFields) + && !isOk + && context_getFlag (FLG_UNIONDEF)) + { + if (!inUnion) + { + if (transferType == TT_PARAMRETURN) + { + voptgenerror + (FLG_UNIONDEF, + message ("Union %q reachable from parameter has " + "no defined field", + sRef_unparse (fref)), + loc); + } + else if (transferType == TT_LEAVETRANS) + { + voptgenerror + (FLG_UNIONDEF, + message ("Union %q has no defined field at scope exit", + sRef_unparse (fref)), + loc); + } + else if (transferType == TT_DOASSIGN + || transferType == TT_FIELDASSIGN + || transferType == TT_GLOBINIT) + { + ; /* no error */ + } + else + { + voptgenerror + (FLG_UNIONDEF, + message ("%s union %q has no defined field", + transferType_unparse (transferType), + sRef_unparse (fref)), + loc); + } + } + isOk = FALSE; + } + + cstringSList_free (goodFields); + return ynm_fromBool (!report || isOk); + } + } + } + else + { + ; + } + + return YES; +} + +/* +** fref is being free'd +*/ + +typedef enum { + DSC_GLOB, DSC_LOCAL, DSC_PARAM, DSC_STRUCT + } dscCode; + +static /*@observer@*/ cstring dscCode_unparse (dscCode desc) /*@*/ +{ + switch (desc) + { + case DSC_GLOB: + return cstring_makeLiteralTemp ("killed global"); + case DSC_LOCAL: + return cstring_makeLiteralTemp ("variable declared in this scope"); + case DSC_PARAM: + return cstring_makeLiteralTemp ("released storage"); + case DSC_STRUCT: + return cstring_makeLiteralTemp ("released structure parameter"); + } + + BADEXIT; +} + +static bool + checkCompletelyDestroyed (exprNode p_fexp, sRef p_fref, bool p_topLevel, + fileloc p_loc, int p_depth, dscCode p_desc); + +bool checkGlobalDestroyed (sRef fref, fileloc loc) +{ + return (checkCompletelyDestroyed (exprNode_undefined, fref, TRUE, + loc, 0, DSC_GLOB)); +} + +void checkLocalDestroyed (sRef fref, fileloc loc) +{ + if (sRef_isObserver (fref) || sRef_isExposed (fref) + || sRef_isPartial (fref)) + { + ; + } + else + { + (void) checkCompletelyDestroyed (exprNode_undefined, fref, TRUE, + loc, 0, DSC_LOCAL); + } +} + +void checkStructDestroyed (sRef fref, fileloc loc) +{ + if (sRef_isObserver (fref) || sRef_isExposed (fref) + || sRef_isPartial (fref)) + { + ; + } + else + { + (void) checkCompletelyDestroyed (exprNode_undefined, fref, TRUE, loc, 0, DSC_STRUCT); + } +} + +static bool + checkCompletelyDestroyed (exprNode fexp, sRef fref, bool topLevel, + fileloc loc, int depth, + dscCode desc) +{ + ctype ct; + + if (depth > MAXDEPTH) + { + llquietbug (message ("checkCompletelyDestroyed: too deep: %s / %q", + exprNode_unparse (fexp), + sRef_unparseFull (fref))); + return TRUE; + } + + if (!sRef_isKnown (fref)) return TRUE; + if (usymtab_isProbableNull (fref)) return TRUE; + if (!context_getFlag (FLG_COMPDESTROY)) return TRUE; + if (!context_getFlag (FLG_MUSTFREE)) return TRUE; + + ct = ctype_realType (sRef_getType (fref)); + + if (!topLevel) + { + bool error = FALSE; + + if (sRef_isFresh (fref) || sRef_isOnly (fref)) + { + error = TRUE; + + if (sRef_isDead (fref) + || sRef_isUnuseable (fref) + || sRef_definitelyNull (fref) + || sRef_isObserver (fref) + || sRef_isExposed (fref)) + { + error = FALSE; + } + } + + if (error) + { + if (sRef_isPossiblyDead (fref) || sRef_isRelDef (fref)) + { + if (exprNode_isDefined (fexp)) + { + voptgenerror2 + (FLG_COMPDESTROY, FLG_STRICTDESTROY, + message ("Only storage %q (type %s) derived from %s " + "may not have been released: %s", + sRef_unparse (fref), + ctype_unparse (sRef_getType (fref)), + dscCode_unparse (desc), + exprNode_unparse (fexp)), + loc); + } + else + { + voptgenerror2 + (FLG_COMPDESTROY, FLG_STRICTDESTROY, + message + ("Only storage %q (type %s) derived from %s " + "may not have been released", + sRef_unparse (fref), + ctype_unparse (sRef_getType (fref)), + dscCode_unparse (desc)), + loc); + } + + sRef_kill (fref, loc); /* prevent further errors */ + } + else + { + if (sRef_isStateUndefined (fref)) + { + return TRUE; + } + else + { + if (exprNode_isDefined (fexp)) + { + voptgenerror + (FLG_COMPDESTROY, + message ("Only storage %q (type %s) derived from %s " + "is not released (memory leak): %s", + sRef_unparse (fref), + ctype_unparse (sRef_getType (fref)), + dscCode_unparse (desc), + exprNode_unparse (fexp)), + loc); + } + else + { + voptgenerror + (FLG_COMPDESTROY, + message ("Only storage %q (type %s) derived from %s " + "is not released (memory leak)", + sRef_unparse (fref), + ctype_unparse (sRef_getType (fref)), + dscCode_unparse (desc)), + loc); + } + } + } + + return FALSE; + } + + if (sRef_isAnyDefined (fref) || sRef_isDead (fref) + || (sRef_isPdefined (fref) + && sRefSet_isEmpty (sRef_derivedFields (fref)))) + { + return TRUE; + } + } + + if (ctype_isPointer (ct)) + { + sRef fptr = sRef_constructDeadDeref (fref); + bool res = checkCompletelyDestroyed (fexp, fptr, FALSE, loc, + depth + 1, desc); + + return res; + } + else if (ctype_isArray (ct)) + { + if ((sRef_isStateUnknown (fref) || sRef_isAllocated (fref)) + && !sRef_hasDerived (fref)) + { + /* + ** Bogosity necessary to prevent infinite depth. + */ + + return FALSE; + } + else + { + sRef farr = sRef_constructDeadDeref (fref); + + return (checkCompletelyDestroyed (fexp, farr, FALSE, loc, + depth + 1, desc)); + } + } + else if (ctype_isStruct (ct)) + { + /* + ** for structures, each field must be completely destroyed + */ + + bool isOk = TRUE; + uentryList fields = ctype_getFields (ct); + + if (depth >= MAXDEPTH) + { + llquietbug (message ("checkCompletelyDestroyed (fields): too deep: %s / %q", + exprNode_unparse (fexp), + sRef_unparseFull (fref))); + + return TRUE; + } + else + { + uentryList_elements (fields, ue) + { + sRef field = sRef_makeField (fref, uentry_rawName (ue)); + + /* + ** note order of && operands --- want to report multiple errors + */ + + isOk = (checkCompletelyDestroyed (fexp, field, FALSE, loc, + depth + 1, desc) + && isOk); + } end_uentryList_elements; + } + + return isOk; + } + else + { + return TRUE; + } +} + +void +checkReturnTransfer (exprNode fexp, uentry rval) +{ + sRef uref = uentry_getSref (rval); + sRef rref = sRef_makeNew (sRef_getType (uref), uref, cstring_undefined); + + if (sRef_isStateSpecial (rref)) + { + uentry fcn = context_getHeader (); + sRef fref = exprNode_getSref (fexp); + specialClauses clauses = uentry_getSpecialClauses (fcn); + + specialClauses_postElements (clauses, cl) + { + sRefSet refs = specialClause_getRefs (cl); + sRefTest tst = specialClause_getPostTestFunction (cl); + sRefMod modf = specialClause_getReturnEffectFunction (cl); + + sRefSet_elements (refs, el) + { + sRef base = sRef_getRootBase (el); + + if (sRef_isResult (base)) + { + sRef sr = sRef_fixBase (el, fref); + + if (tst != NULL && !(tst (sr))) + { + if (optgenerror + (specialClause_postErrorCode (cl), + message ("%s storage %q corresponds to " + "storage listed in %q clause: %s", + specialClause_postErrorString (cl, sr), + sRef_unparse (sr), + specialClause_unparseKind (cl), + exprNode_unparse (fexp)), + exprNode_loc (fexp))) + { + sRefShower ss = specialClause_getPostTestShower (cl); + + if (ss != NULL) + { + ss (sr); + } + } + } + + if (modf != NULL) + { + modf (sr, exprNode_loc (fexp)); + } + } + else + { + /* + ** Non-results are checked in exit scope. + */ + } + } end_sRefSet_elements ; + } end_specialClauses_postElements ; + + (void) checkTransfer (fexp, fref, + exprNode_undefined, rref, + exprNode_loc (fexp), TT_FCNRETURN); + } + else + { + if (ctype_isRealSU (exprNode_getType (fexp))) + { + sRef fref = exprNode_getSref (fexp); + + checkStructTransfer (exprNode_undefined, rref, + fexp, fref, + exprNode_loc (fexp), + TT_FCNRETURN); + } + else + { + (void) checkTransfer (fexp, exprNode_getSref (fexp), + exprNode_undefined, rref, + exprNode_loc (fexp), TT_FCNRETURN); + } + } +} + +static void + checkPassSpecialClauses (uentry ue, exprNode fexp, sRef fref, int argno) +{ + specialClauses clauses = uentry_getSpecialClauses (ue); + + DPRINTF (("Check pass special: %s / %s", + exprNode_unparse (fexp), sRef_unparseFull (fref))); + + specialClauses_preElements (clauses, cl) + { + sRefSet refs = specialClause_getRefs (cl); + sRefTest tst = specialClause_getPreTestFunction (cl); + sRefMod modf = specialClause_getEffectFunction (cl); + + sRefSet_elements (refs, el) + { + sRef base = sRef_getRootBase (el); + + if (sRef_isResult (base)) + { + ; /* nothing to check before */ + } + else if (sRef_isParam (base)) + { + if (sRef_getParam (base) == argno - 1) + { + sRef sb; + + DPRINTF (("Fix base: %s / %s", + sRef_unparseFull (el), + sRef_unparseFull (fref))); + + sb = sRef_fixBase (el, fref); + + if (tst != NULL && !(tst(sb))) + { + voptgenerror + (specialClause_preErrorCode (cl), + message ("%s storage %qcorresponds to " + "storage listed in %q clause of " + "called function: %s", + specialClause_preErrorString (cl, sb), + sRef_unparseOpt (sb), + specialClause_unparseKind (cl), + exprNode_unparse (fexp)), + exprNode_loc (fexp)); + } + + if (modf != NULL) + { + DPRINTF (("Fixing: %s", sRef_unparseFull (sb))); + modf (sb, exprNode_loc (fexp)); + DPRINTF (("==> %s", sRef_unparseFull (sb))); + } + } + } + else + { + BADBRANCH; + } + } end_sRefSet_elements ; + } end_specialClauses_preElements ; + + DPRINTF (("After: %s", sRef_unparseFull (fref))); +} + +/* +** should not modify arg +*/ + +void +checkPassTransfer (exprNode fexp, uentry arg, bool isSpec, + /*@dependent@*/ exprNode fcn, int argno, int totargs) +{ + sRef tref = uentry_getSref (arg); + sRef fref = exprNode_getSref (fexp); + bool isOut = FALSE; + bool isPartial = FALSE; + bool isImpOut = FALSE; + ctype ct = uentry_getType (arg); + + DPRINTF (("Check pass: %s -> %s", + sRef_unparseFull (fref), + sRef_unparseFull (tref))); + + atFunction = fcn; + atArgNo = argno; + atNumArgs = totargs; + + if (ctype_isElips (ct)) + { + ct = ctype_unknown; + } + + if (!ctype_isElips (ct) && + (ctype_isVoidPointer (ct) && uentry_isOut (arg) && sRef_isOnly (tref))) + { + if (ctype_isRealAP (ct)) + { + if (sRef_aliasCheckSimplePred (sRef_isDead, fref)) + { + if (optgenerror + (FLG_USERELEASED, + message ("Dead storage %qpassed as out parameter: %s", + sRef_unparseOpt (fref), + exprNode_unparse (fexp)), + exprNode_loc (fexp))) + { + if (sRef_isDead (fref)) + { + sRef_showStateInfo (fref); + } + } + + sRef_setAllocated (fref, exprNode_loc (fexp)); + } + else if (context_getFlag (FLG_STRICTUSERELEASED) + && sRef_aliasCheckSimplePred (sRef_isPossiblyDead, fref)) + { + if (optgenerror2 + (FLG_USERELEASED, FLG_STRICTUSERELEASED, + message ("Possibly dead storage %qpassed as out parameter: %s", + sRef_unparseOpt (fref), + exprNode_unparse (fexp)), + exprNode_loc (fexp))) + { + if (sRef_isPossiblyDead (fref)) + { + sRef_showStateInfo (fref); + } + } + + sRef_setAllocated (fref, exprNode_loc (fexp)); + } + else if (sRef_aliasCheckSimplePred (sRef_isStateUndefined, fref) + || sRef_aliasCheckSimplePred (sRef_isUnuseable, fref)) + { + voptgenerror + (FLG_USEDEF, + message ("Unallocated storage %qpassed as out parameter: %s", + sRef_unparseOpt (fref), + exprNode_unparse (fexp)), + exprNode_loc (fexp)); + + sRef_setAllocated (fref, exprNode_loc (fexp)); + } + else + { + ; + } + } + + (void) checkCompletelyDestroyed (fexp, fref, TRUE, exprNode_loc (fexp), + 0, DSC_PARAM); + + /* make it defined now, so checkTransfer is okay */ + sRef_setDefined (fref, exprNode_loc (fexp)); + } + else if (uentry_isOut (arg)) + { + if (ctype_isRealAP (ct) + && (sRef_isStateUndefined (fref) || sRef_isUnuseable (fref))) + { + voptgenerror + (FLG_USEDEF, + message ("Unallocated storage %qpassed as out parameter: %s", + sRef_unparseOpt (fref), + exprNode_unparse (fexp)), + exprNode_loc (fexp)); + sRef_setAllocated (fref, exprNode_loc (fexp)); + } + isOut = TRUE; + } + else if (uentry_isPartial (arg)) + { + if (ctype_isRealAP (ct) + && (sRef_isStateUndefined (fref) || sRef_isUnuseable (fref))) + { + voptgenerror + (FLG_USEDEF, + message ("Unallocated storage %qpassed as partial parameter: %s", + sRef_unparseOpt (fref), + exprNode_unparse (fexp)), + exprNode_loc (fexp)); + sRef_setAllocated (fref, exprNode_loc (fexp)); + } + isPartial = TRUE; + } + else if (uentry_isStateSpecial (arg)) + { + uentry ue = exprNode_getUentry (fcn); + + if (ctype_isRealAP (ct) + && (sRef_isStateUndefined (fref) || sRef_isUnuseable (fref))) + { + voptgenerror + (FLG_USEDEF, + message ("Unallocated storage %qpassed as special parameter: %s", + sRef_unparseOpt (fref), + exprNode_unparse (fexp)), + exprNode_loc (fexp)); + sRef_setAllocated (fref, exprNode_loc (fexp)); + } + + if (uentry_hasSpecialClauses (ue)) + { + checkPassSpecialClauses (ue, fexp, fref, argno); + } + + return; /* ??? */ + } + else if (sRef_isStateDefined (tref)) + { + exprNode_checkUseParam (fexp); + } + else + { + if (isSpec || (!context_getFlag (FLG_IMPOUTS))) + { + exprNode_checkUseParam (fexp); + } + else + { + if (!sRef_isMacroParamRef (fref) + && (ctype_isRealAP (ct))) + { + if (sRef_isAddress (fref)) + { + if (sRef_isStateUndefined (fref) || sRef_isUnuseable (fref)) + { + voptgenerror + (FLG_USEDEF, + message + ("Unallocated address %qpassed as implicit " + "out parameter: %s", + sRef_unparseOpt (fref), + exprNode_unparse (fexp)), + exprNode_loc (fexp)); + sRef_setAllocated (fref, exprNode_loc (fexp)); + } + } + + /* yes, I really mean this! */ + tref = sRef_copy (tref); + sRef_setAllocated (tref, exprNode_loc (fexp)); + + isOut = TRUE; + isImpOut = TRUE; + } + else + { + exprNode_checkUseParam (fexp); + } + } + } + + if (sRef_isNew (fref)) + { + alkind tkind = sRef_getAliasKind (tref); + + if ((sRef_isFresh (fref) || sRef_isOnly (fref)) + && !alkind_isOnly (tkind) + && !alkind_isKeep (tkind) + && !alkind_isOwned (tkind) + && !alkind_isError (tkind) + && !uentry_isReturned (arg)) + + { + voptgenerror + (FLG_MUSTFREE, + message ("New fresh storage %qpassed as %s (not released): %s", + sRef_unparseOpt (fref), + alkind_unparse (sRef_getAliasKind (tref)), + exprNode_unparse (fexp)), + exprNode_loc (fexp)); + } + else + { + if (sRef_isNewRef (fref) && !sRef_isKillRef (tref)) + { + alkind ak = sRef_getAliasKind (tref); + + if (!alkind_isError (ak)) + { + voptgenerror + (FLG_MUSTFREE, + message ("New reference %qpassed as %s (not released): %s", + sRef_unparseOpt (fref), + alkind_unparse (sRef_getAliasKind (tref)), + exprNode_unparse (fexp)), + exprNode_loc (fexp)); + } + } + } + } + + (void) checkTransfer (fexp, exprNode_getSref (fexp), + exprNode_undefined, tref, + exprNode_loc (fexp), TT_FCNPASS); + + setCodePoint (); + fref = exprNode_getSref (fexp); + + if (isOut && !sRef_isDead (fref) && !sRef_isPossiblyDead (fref)) + { + sRef base; + + if (ctype_isRealAP (sRef_getType (fref))) + { + base = sRef_makePointer (fref); + } + else + { + base = fref; + } + + if (isImpOut) + { + exprNode_checkMSet (fexp, base); + } + else + { + exprNode_checkSet (fexp, base); + } + + if (sRef_isValid (base)) + { + setCodePoint (); + + sRef_clearDerived (base); + sRef_setDefined (base, exprNode_loc (fexp)); + usymtab_clearAlias (base); + sRef_setNullUnknown (base, exprNode_loc (fexp)); + } + } + + if (isPartial) + { + if (sRef_isValid (fref)) + { + sRef_setPartial (fref, exprNode_loc (fexp)); + } + } + + atFunction = exprNode_undefined; + atArgNo = 0; + atNumArgs = 0; + + /* need to fixup here: derived refs could be bogus */ + /* (better to change sRef to not add derivs for "protected" ref) */ + + uentry_fixupSref (arg); + + setCodePoint (); + + DPRINTF (("Check pass: ==> %s", + sRef_unparseFull (fref))); +} + +void +checkGlobReturn (uentry glob) +{ + sRef_protectDerivs (); + checkGlobTrans (glob, TT_GLOBRETURN); + sRef_clearProtectDerivs (); +} + +void checkParamReturn (uentry actual) +{ + checkLeaveTrans (actual, TT_PARAMRETURN); +} + +void checkLoseRef (uentry actual) +{ + checkLeaveTrans (actual, TT_LEAVETRANS); +} + +static void +checkLeaveTrans (uentry actual, transferKind transferType) +{ + sRef aref = uentry_getSref (actual); + sRef origref = uentry_getOrigSref (actual); + + if (transferType == TT_PARAMRETURN + && (sRef_isKeep (origref) || sRef_isOnly (origref) + || sRef_isOwned (origref))) + { + /* caller cannot use, nothing to check */ + } + else + { + if (sRef_isNSLocalVar (origref)) + { + ; + } + else + { + (void) checkCompletelyDefined (exprNode_undefined, aref, + exprNode_undefined, origref, + TRUE, FALSE, FALSE, + g_currentloc, transferType, + 0, TRUE); + } + } +} + +static void +checkGlobTrans (uentry glob, transferKind type) +{ + sRef eref = uentry_getOrigSref (glob); + + (void) checkCompletelyDefined (exprNode_undefined, uentry_getSref (glob), + exprNode_undefined, eref, + TRUE, FALSE, FALSE, + g_currentloc, type, 0, TRUE); +} + +/* +** For lhs of assignment, alias kind is set from basic type. +** Yoikes! +*/ + +static void +fixAssignLhs (sRef s) +{ + sRef_resetStateComplete (s); +} + +static void checkStructTransfer (exprNode lhs, sRef slhs, exprNode rhs, sRef srhs, + fileloc loc, + transferKind tt) +{ + ctype st = ctype_realType (sRef_getType (srhs)); + + if (ctype_isSU (st) && ctype_isRealSU (sRef_getType (slhs)) + && ctype_match (sRef_getType (slhs), st)) + { + if (tt == TT_DOASSIGN && sRef_isStateDefined (srhs)) + { + sRef_setDefinedComplete (slhs, loc); + } + + if (sRef_isDependent (slhs) + || sRef_isObserver (slhs) + || sRef_isExposed (slhs)) + { + ; + } + else + { + if (sRef_isLocalVar (slhs) + && sRef_isGlobal (sRef_getRootBase (srhs))) + { + sRef_setDependent (slhs, exprNode_loc (lhs)); + } + else + { + if (ctype_isUnion (st)) + { + sRef_setDefState (slhs, sRef_getDefState (srhs), + exprNode_loc (lhs)); + + sRefSet_realElements (sRef_derivedFields (srhs), sr) + { + if (sRef_isField (sr)) + { + cstring fieldname = sRef_getField (sr); + sRef lfld = sRef_makeField (slhs, fieldname); + + (void) checkTransfer (rhs, sr, lhs, lfld, + exprNode_loc (lhs), tt); + } + } end_sRefSet_realElements ; + } + else + { + uentryList fields = ctype_getFields (st); + + uentryList_elements (fields, field) + { + sRef rfld = sRef_makeField (srhs, uentry_rawName (field)); + sRef lfld = sRef_makeField (slhs, uentry_rawName (field)); + (void) checkTransfer (rhs, rfld, lhs, lfld, exprNode_loc (lhs), tt); + } end_uentryList_elements ; + } + + if (sRef_isOnly (srhs)) + { + sRef_setKeptComplete (srhs, loc); + } + } + } + } +} + +void +checkInitTransfer (exprNode lhs, exprNode rhs) +{ + sRef slhs = exprNode_getSref (lhs); + + if (sRef_isGlobal (slhs) || (!sRef_isCvar (slhs))) + { + (void) checkTransfer (rhs, exprNode_getSref (rhs), + lhs, slhs, exprNode_loc (rhs), TT_GLOBINIT); + } + else + { + checkAssignTransfer (lhs, rhs); + } +} + +void +checkAssignTransfer (exprNode lhs, exprNode rhs) +{ + sRef slhs = exprNode_getSref (lhs); + sRef srhs = exprNode_getSref (rhs); + sRef base = sRef_getBaseSafe (slhs); + nstate ns; + + DPRINTF (("Check assign: %s = %s", exprNode_unparse (lhs), + exprNode_unparse (rhs))); + DPRINTF (("lhs: %s", sRef_unparseFull (slhs))); + DPRINTF (("rhs: %s", sRef_unparseFull (srhs))); + + if (ctype_isRealSU (sRef_getType (srhs))) + { + checkStructTransfer (lhs, slhs, rhs, srhs, exprNode_loc (lhs), TT_FIELDASSIGN); + } + else + { + (void) checkTransfer (rhs, srhs, lhs, slhs, + exprNode_loc (lhs), TT_DOASSIGN); + } + + if (sRef_isConst (srhs) && sRef_isLocalState (srhs)) + { + /* constants can match anything (e.g., NULL) */ + sRef_setAliasKind (slhs, AK_ERROR, fileloc_undefined); + } + + if (sRef_isValid (base) && sRef_isStateDefined (base)) + { + sRef_setPdefined (base, g_currentloc); + } + + if (sRef_isPartial (srhs)) + { + sRef_setPartial (slhs, exprNode_loc (rhs)); + } + + + ns = sRef_getNullState (srhs); + + if (nstate_possiblyNull (ns)) + { + if (usymtab_isGuarded (srhs)) + { + ns = NS_NOTNULL; + } + } + + sRef_setNullStateInnerComplete (slhs, ns, exprNode_loc (rhs)); + + if (sRef_isExposed (srhs) || sRef_isObserver (srhs)) + { + sRef_setExKind (slhs, sRef_getExKind (srhs), exprNode_loc (rhs)); + } + + DPRINTF (("Done transfer: %s", sRef_unparseFull (slhs))); +} + +static void +checkTransferNullAux (sRef fref, exprNode fexp, /*@unused@*/ bool ffix, + sRef tref, exprNode texp, /*@unused@*/ bool tfix, + fileloc loc, transferKind transferType) +{ + alkind tkind = sRef_getAliasKind (tref); + ctype ttyp = ctype_realType (sRef_getType (tref)); + + if (ctype_isUnknown (ttyp)) + { + ttyp = exprNode_getType (texp); + + if (ctype_isUnknown (ttyp)) + { + ttyp = exprNode_getType (fexp); + + if (ctype_isUnknown (ttyp)) + { + ttyp = sRef_getType (fref); + } + } + } + + if (ctype_isFunction (ttyp) && (transferType == TT_FCNRETURN)) + { + ttyp = ctype_returnValue (ttyp); + } + + /* + ** check for null (don't need to check aliases??) + */ + + if (sRef_possiblyNull (fref) + && !usymtab_isGuarded (fref) + && ctype_isRealAP (ttyp)) + { + if (!alkind_isLocal (tkind) && !alkind_isFresh (tkind) + && !sRef_perhapsNull (tref) + && !(transferType == TT_DOASSIGN)) + { + if (transferType == TT_GLOBINIT) + { + if (optgenerror + (FLG_NULLASSIGN, + message ("%s %q initialized to %s value: %q", + sRef_getScopeName (tref), + sRef_unparse (tref), + sRef_nullMessage (fref), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showNullInfo (fref); + sRef_setNullError (tref); + } + } + else + { + if (optgenerror + ((transferType == TT_FCNPASS) ? FLG_NULLPASS : FLG_NULLRET, + message ("%q storage %q%s: %q", + cstring_capitalize (sRef_nullMessage (fref)), + sRef_unparseOpt (fref), + transferNullMessage (transferType), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showNullInfo (fref); + sRef_setNullError (fref); + } + } + } + else + { + ; + } + } +} + + +static void +checkTransferAssignAux (sRef fref, exprNode fexp, /*@unused@*/ bool ffix, + sRef tref, exprNode texp, bool tfix, + fileloc loc, transferKind transferType) +{ + alkind tkind = sRef_getAliasKind (tref); + + /* + ** Assignment to same --- no errors, or state changes. + ** This can happen when returned params are used. + */ + + if (sRef_sameName (fref, tref)) + { + sRef_copyState (tref, fref); + return; + } + + if ((alkind_isOnly (tkind) || alkind_isFresh (tkind) + || alkind_isNewRef (tkind) || alkind_isOwned (tkind)) + && !(sRef_isDead (tref) + || sRef_isStateUndefined (tref) + || sRef_isUnuseable (tref) + || sRef_isPartial (tref) + || sRef_definitelyNull (tref) + || sRef_isStackAllocated (tref) + || sRef_isAllocIndexRef (tref)) + && !(sRef_same (fref, tref)) /* okay to assign to self (returned params) */ + && !(usymtab_isProbableNull (tref))) + { + if (context_getFlag (FLG_MUSTFREE)) + { + if (canLoseReference (tref, loc)) + { + ; /* no error */ + } + else + { + if (sRef_hasLastReference (tref)) + { + if (optgenerror + (FLG_MUSTFREE, + message ("Last reference %q to %s storage %qnot released " + "before assignment: %q", + sRef_unparse (tref), + alkind_unparse (tkind), + sRef_unparseOpt (sRef_getAliasInfoRef (tref)), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showRefLost (tref); + } + } + else + { + if (context_inGlobalScope ()) + { + /* no errors for static initializations */ + } + else + { + /* + ** don't report this error for a[i], since it could + ** be a new element. + */ + + if (alkind_isNewRef (tkind)) + { + if (optgenerror + (FLG_MUSTFREE, + message + ("%q %qnot released before assignment: %q", + cstring_makeLiteral + (alkind_isKillRef (sRef_getOrigAliasKind (tref)) + ? "Kill reference parameter" : "New reference"), + sRef_unparseOpt (tref), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (tref); + sRef_setAliasKind (tref, AK_ERROR, loc); + } + } + else if + (!(sRef_isUnknownArrayFetch (tref) + && !context_getFlag (FLG_STRICTDESTROY)) + && !sRef_isUnionField (tref) + && !sRef_isRelDef (tref) + && optgenerror + (FLG_MUSTFREE, + message + ("%s storage %qnot released before assignment: %q", + alkind_capName (tkind), + sRef_unparseOpt (tref), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (tref); + } + else + { + ; + } + } + } + } + } + } + + fixAssignLhs (tref); + + if (sRef_isRefCounted (tref)) /* tkind might not be correct now */ + { + if (sRef_isNewRef (fref)) + { + sRef_setAliasKind (tref, AK_NEWREF, loc); + } + else if (sRef_isConst (fref)) + { + /* for now, constants are not ref counted */ + sRef_setAliasKind (tref, AK_ERROR, loc); + } + else + { + ; + } + + if (!sRef_isNSLocalVar (tref) + && sRef_isRefCounted (fref) + && sRef_isStateDefined (fref)) + { + voptgenerror + (FLG_NEWREFTRANS, + message ("New reference %qto reference counted storage: %q", + sRef_unparseOpt (tref), + generateText (fexp, texp, tref, transferType)), + loc); + } + } + + /* + ** Not for structures and unions, since assignments copy. + */ + + if (sRef_isStack (fref) + && !ctype_isSU (ctype_realType (sRef_getType (fref)))) + { + sRef_setAliasKindComplete (tref, AK_STACK, loc); + } + + if (sRef_isNSLocalVar (tref) + && !sRef_isOwned (tref) /*< should only apply to static >*/ + && ctype_isMutable (sRef_getType (tref))) + { + if (sRef_isOnly (fref) && sRef_isNew (fref)) + { + if (!tfix) + { + sRef_setFresh (tref, loc); + } + } + } +} + +/* +** requires sRef_isOnly (fref) +*/ + +static void +checkOnlyTransferAux (sRef fref, exprNode fexp, bool ffix, + sRef tref, exprNode texp, /*@unused@*/ bool tfix, + fileloc loc, transferKind transferType) +{ + alkind tkind = sRef_getAliasKind (tref); + + if (sRef_isExposed (tref) || sRef_isObserver (tref)) + { + if (transferType == TT_FCNRETURN && sRef_isNew (fref) + && !alkind_isError (tkind)) + { + if (optgenerror + (FLG_ONLYTRANS, + message ("Only storage %q%q (will not be released): %q", + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + + /* no errors for exposed transfers (is this good enough?) */ + } + else if (alkind_isOnly (tkind) || alkind_isKeep (tkind) || alkind_isOwned (tkind)) + { + ; /* okay */ + } + else if ((transferType == TT_FCNPASS) + && (alkind_isUnknown (tkind) + || alkind_isTemp (tkind) || alkind_isUnique (tkind))) + { + if (sRef_isFresh (fref) + && alkind_isUnknown (tkind) && !context_getFlag (FLG_PASSUNKNOWN)) + { + if (!ffix) sRef_setAliasKind (fref, AK_UNKNOWN, loc); + } + } + else if (alkind_isLocal (tkind) + || alkind_isFresh (tkind) || alkind_isUnknown (tkind)) + { + if ((transferType == TT_DOASSIGN) + && sRef_isNew (fref) + && sRef_isOnly (fref)) + { + bool error = FALSE; + + if (alkind_isUnknown (tkind) + && sRef_isGlobal (sRef_getRootBase (tref))) + { + if (optgenerror + (FLG_ONLYUNQGLOBALTRANS, + message ("Only storage %q%q: %q", + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + sRef_setAliasKind (tref, AK_ERROR, loc); + error = TRUE; + } + } + + if (!error && !ffix) + { + sRef_setFresh (tref, loc); + } + } + else + { + if (alkind_isLocal (tkind)) + { + if (sRef_sameName (tref, fref)) + { + ; /* don't set this --- corresponds to return transfer */ + } + else + { + /* + ** Don't set local to dependent. Error will + ** be detected through aliasing. Except for + ** arrays. + */ + + if (!tfix && sRef_isThroughArrayFetch (fref) + && context_getFlag (FLG_DEPARRAYS)) + { + sRef_setDependent (tref, loc); + } + } + } + else + { + if (optgenerror + (FLG_ONLYTRANS, + message ("Only storage %q%q: %q", + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + } + } + else + { + if (alkind_isError (tkind) + || (alkind_isUnknown (tkind) && !context_getFlag (FLG_MEMIMPLICIT))) + { + flagcode_recordSuppressed (FLG_ONLYTRANS); + } + else + { + if ((alkind_isKept (tkind) || alkind_isStack (tkind) + || alkind_isDependent (tkind)) + && sRef_isNSLocalVar (tref)) + { + ; /* okay */ + } + else + { + if (optgenerror + (FLG_ONLYTRANS, + message ("Only storage %q%q: %q", + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + } + + if (transferType == TT_DOASSIGN) + { + /* + ** alias kind unknown to suppress future messages + */ + + if (!ffix && sRef_isNSLocalVar (sRef_getRootBase (fref))) + { + sRef_clearAliasKind (fref); + } + } + } +} + +/* +** ??? same as checkOnly ? +*/ + +static void +checkOwnedTransferAux (sRef fref, exprNode fexp, bool ffix, + sRef tref, exprNode texp, bool tfix, + fileloc loc, transferKind transferType) +{ + alkind tkind = sRef_getAliasKind (tref); + + if (sRef_isExposed (tref) || sRef_isObserver (tref)) + { + if (transferType == TT_FCNRETURN && sRef_isNew (fref)) + { + if (optgenerror + (FLG_OWNEDTRANS, + message ("Owned storage %q%q (will not be released): %q", + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + } + else if (alkind_isOnly (tkind) || alkind_isKeep (tkind) + || alkind_isDependent (tkind) + || alkind_isOwned (tkind)) + { + /* okay */ + } + else if (alkind_isLocal (tkind) + || alkind_isFresh (tkind) || alkind_isUnknown (tkind)) + { + if ((transferType == TT_DOASSIGN) + && sRef_isNew (fref) && sRef_isOnly (fref)) + { + if (!tfix) + { + sRef_setFresh (tref, loc); + } + } + else + { + } + } + else if ((transferType == TT_FCNPASS) + && (alkind_isUnknown (tkind) + || alkind_isTemp (tkind) || alkind_isUnique (tkind))) + { + if (sRef_isFresh (fref) + && alkind_isUnknown (tkind) && !context_getFlag (FLG_PASSUNKNOWN)) + { + if (!ffix) { sRef_clearAliasKind (fref); } + } + } + else + { + if (alkind_isUnknown (tkind) && !context_getFlag (FLG_MEMIMPLICIT)) + { + flagcode_recordSuppressed (FLG_OWNEDTRANS); + } + else + { + if (alkind_isKept (tkind) && sRef_isNSLocalVar (tref)) + { + ; /* okay */ + } + else + { + voptgenerror + (FLG_OWNEDTRANS, + message ("Owned storage %q%q: %q", + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc); + } + } + + if (transferType == TT_DOASSIGN) + { + /* + ** alias kind unknown to suppress future messages + */ + + if (!ffix) { sRef_clearAliasKind (fref); } + } + } +} + +static void +checkFreshTransferAux (sRef fref, exprNode fexp, bool ffix, + sRef tref, exprNode texp, /*@unused@*/ bool tfix, + fileloc loc, transferKind transferType) +{ + alkind tkind = sRef_getAliasKind (tref); + + /* + ** error to return fresh as non-only + */ + + if (transferType == TT_FCNRETURN + && !(alkind_isOnly (tkind) || alkind_isNewRef (tkind))) + { + if (alkind_isUnknown (tkind) && !context_getFlag (FLG_MEMIMPLICIT)) + { + flagcode_recordSuppressed (FLG_NEWREFTRANS); + } + else + { + if (alkind_isError (tkind)) + { + if (!ffix) + { + sRef_killComplete (fref, loc); + } + } + else if (alkind_isRefCounted (tkind)) + { + if (optgenerror + (FLG_NEWREFTRANS, + message + ("New reference returned without newref qualifier: %q", + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + sRef_killComplete (fref, loc); + } + } + else + { + if (optgenerror + (FLG_FRESHTRANS, + message ("Fresh storage %q (should be only): %q", + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + sRef_killComplete (fref, loc); + } + } + } + } + + /* + ** Okay to assign fresh to only, shared or unqualified. + ** + ** should generate other errors? + */ + + if (alkind_isOnly (tkind)) + { + if (transferType == TT_DOASSIGN && !sRef_isGlobal (tref)) + { + if (!ffix) + { + if (!sRef_isNSLocalVar (tref)) + { + sRef_setKeptComplete (fref, loc); + } + } + } + else + { + if (sRef_isConst (fref)) + { + ; + } + else + { + if (!ffix) + { + sRef_killComplete (fref, loc); + } + } + } + } + else if (alkind_isOwned (tkind)) + { + if (!ffix) + { + sRef_setDependentComplete (fref, loc); + } + } + else if (alkind_isRefCounted (tkind) + && (transferType == TT_FCNRETURN) && sRef_isFresh (fref)) + { + if (!ffix) + { + sRef_killComplete (fref, loc); + } + } + else if (alkind_isKeep (tkind)) + { + if (!ffix) + { + if (!sRef_isNSLocalVar (tref)) + { + sRef_setKeptComplete (fref, loc); + } + } + } + else if (alkind_isShared (tkind)) + { + if (!ffix) { sRef_setShared (fref, loc); } + } + else if (alkind_isLocal (tkind) || alkind_isUnknown (tkind)) + { + if (transferType == TT_DOASSIGN || transferType == TT_FCNRETURN) + { + /* + ** local shares fresh. Make it owned/dependent. + */ + + if (!tfix) + { + sRef_setOwned (tref, loc); + } + + if (!ffix && !tfix) + { + sRef_setDependentComplete (fref, loc); + } + + /* NO! sRef_clearAliasKind (fref); */ + } + else + { + if (context_getFlag (FLG_PASSUNKNOWN)) + { + sRef_clearAliasKind (fref); + } + } + } + else + { + ; + } +} + +static void +checkTransferExposure (sRef fref, exprNode fexp, /*@unused@*/ bool ffix, + sRef tref, exprNode texp, bool tfix, + fileloc loc, + transferKind transferType) +{ + alkind fkind = sRef_getAliasKind (fref); + alkind tkind = sRef_getAliasKind (tref); + exkind tekind = sRef_getExKind (tref); + + if (sRef_isObserver (fref) && ctype_isMutable (sRef_getType (fref))) + { + /* + ** observer -> exposed or observer + */ + + /* + ** observer -> temp is okay [NO! really? only in function calls] + */ + + if (sRef_isExposed (tref) || sRef_isObserver (tref) + || alkind_isLocal (tkind)) + { + /* okay */ + + if ((transferType == TT_DOASSIGN) && alkind_isLocal (tkind)) + { + if (!tfix) { sRef_setAliasKindComplete (tref, fkind, loc); } + } + } + else + { + if (transferType == TT_FCNRETURN + || transferType == TT_DOASSIGN + || transferType == TT_FIELDASSIGN + || transferType == TT_GLOBINIT) + { + bool hasError = FALSE; + + if (exprNode_isStringLiteral (fexp) + && transferType == TT_GLOBINIT) + { + hasError = optgenerror + (FLG_READONLYTRANS, + message ("Read-only string literal storage %q%q: %q", + sRef_unparseOpt (fref), + transferErrorExpMessage (transferType, tekind), + generateText (fexp, texp, tref, transferType)), + loc); + + sRef_setAliasKind (fref, AK_ERROR, fileloc_undefined); + } + else + { + if ((transferType == TT_DOASSIGN + || transferType == TT_FIELDASSIGN) + && (sRef_isNSLocalVar (tref) + || (exprNode_isStringLiteral (fexp) + && ctype_isRealArray (exprNode_getType (texp))))) + { + ; /* No error for local assignment or assignment + to static array (copies string). */ + } + else + { + if (exprNode_isStringLiteral (fexp)) + { + hasError = optgenerror + (FLG_READONLYTRANS, + message + ("Read-only string literal storage %q%q: %q", + sRef_unparseOpt (fref), + transferErrorExpMessage (transferType, tekind), + generateText (fexp, texp, tref, transferType)), + loc); + + } + + if (!hasError) + { + hasError = optgenerror + (FLG_OBSERVERTRANS, + message + ("Observer storage %q%q: %q", + sRef_unparseOpt (fref), + transferErrorExpMessage (transferType, tekind), + generateText (fexp, texp, tref, transferType)), + loc); + } + } + } + + if (hasError) + { + if (transferType != TT_GLOBINIT) + { + sRef_showExpInfo (fref); + sRef_setAliasKind (tref, AK_ERROR, loc); + } + } + else + { + if (transferType == TT_DOASSIGN && !tfix) + { + DPRINTF (("Setting unknown!")); + /* sRef_setAliasKind (tref, AK_ERROR, loc); */ + } + } + } + else /* TT_FCNPASS */ + { + llassert (transferType == TT_FCNPASS); + + if (alkind_isTemp (tkind) + || alkind_isDependent (tkind) + || alkind_isRefCounted (tkind)) + { + ; /* okay */ + } + else + { + if (!alkind_isError (tkind)) + { + if (optgenerror + (FLG_OBSERVERTRANS, + message ("Observer storage %q%q: %q", + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showExpInfo (fref); + sRef_clearAliasState (fref, loc); + } + } + } + } + } + } + else if (sRef_isExposed (fref) && ctype_isMutable (sRef_getType (fref))) + { + if (transferType == TT_FCNRETURN) + { + if (!(sRef_isExposed (tref) || sRef_isObserver (tref) + || sRef_isParam (fref))) + { + if (optgenerror + (FLG_EXPOSETRANS, + message ("Exposed storage %q%q: %q", + sRef_unparseOpt (fref), + transferErrorExpMessage (transferType, tekind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showExpInfo (fref); + } + } + } + else if (transferType == TT_FCNPASS) + { + if (!(sRef_isExposed (tref) + || sRef_isObserver (tref) + || (alkind_isUnknown (tkind) + || alkind_isDependent (tkind) + || alkind_isTemp (tkind) + || alkind_isKillRef (tkind) + || alkind_isRefCounted (tkind)))) + { + if (alkind_isUnique (tkind) || alkind_isError (tkind)) + { + } + else + { + if (optgenerror + (FLG_EXPOSETRANS, + message ("Exposed storage %q%q: %q", + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showExpInfo (fref); + sRef_clearAliasState (fref, loc); + } + } + + } + else + { + ; + } + } + else if (transferType == TT_DOASSIGN) + { + if (!(sRef_isExposed (tref) + || !sRef_isCvar (tref) + || (alkind_isUnknown (tkind) + || alkind_isDependent (tkind) + || alkind_isRefCounted (tkind) + || alkind_isNewRef (tkind) + || alkind_isFresh (tkind) + || alkind_isLocal (tkind)))) + { + if (optgenerror + (FLG_EXPOSETRANS, + message ("Exposed storage %q%q: %q", + sRef_unparseOpt (fref), + transferErrorExpMessage (transferType, tekind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showExpInfo (fref); + } + } + if (!tfix) { sRef_setExposed (tref, loc); } + } + else + { + llassert (transferType == TT_GLOBPASS + || transferType == TT_GLOBRETURN + || transferType == TT_PARAMRETURN + || transferType == TT_LEAVETRANS + || transferType == TT_GLOBINIT); + } + } + else + { + ; + } +} + +/* +** returns TRUE if there is no error reported +** +** if fixt, don't change tref (except if error reported.) +** if fixf, don't change fref (except if error reported.) +*/ + +static void +checkTransferAux (exprNode fexp, sRef fref, bool ffix, + exprNode texp, sRef tref, bool tfix, + fileloc loc, transferKind transferType) +{ + alkind fkind; + alkind tkind; + bool isassign = (transferType == TT_DOASSIGN); + bool isfieldassign = (transferType == TT_FIELDASSIGN); + bool iseitherassign = isassign || (transferType == TT_FIELDASSIGN); + bool isfcnpass = (transferType == TT_FCNPASS); + bool isfcnreturn = (transferType == TT_FCNRETURN); + + setCodePoint (); + + if (!ffix && !tfix) + { + setCodePoint (); + checkTransferNullAux (fref, fexp, ffix, tref, texp, tfix, + loc, transferType); + } + + if (isassign) + { + setCodePoint (); + checkTransferAssignAux (fref, fexp, ffix, tref, texp, tfix, + loc, transferType); + } + + /* + ** Check for definition + */ + + /* + ** errors passing out params already detected in checkAnyCall + */ + + if (!ffix && !tfix) + { + bool defok = TRUE; + + if (!iseitherassign + || (!sRef_isNSLocalVar (tref) + && (sRef_isAnyDefined (tref) || !sRef_stateKnown (tref)))) + { + setCodePoint (); + + if (!ynm_toBoolRelaxed + (checkCompletelyDefined (fexp, fref, texp, tref, + TRUE, FALSE, FALSE, + loc, transferType, 0, TRUE))) + { + defok = FALSE; + } + } + + setCodePoint (); + + if (defok && iseitherassign) + { + sRef_setDefState (tref, sRef_getDefState (fref), loc); + } + } + + + /* + ** check exposure + */ + + setCodePoint (); + checkTransferExposure (fref, fexp, ffix, tref, texp, tfix, + loc, transferType); + + fkind = sRef_getAliasKind (fref); + tkind = sRef_getAliasKind (tref); + + /* + ** check aliasing + */ + + if (alkind_isOnly (fkind)) + { + setCodePoint (); + checkOnlyTransferAux (fref, fexp, ffix, + tref, texp, tfix, + loc, transferType); + } + else if (alkind_isFresh (fkind)) + { + setCodePoint (); + checkFreshTransferAux (fref, fexp, ffix, + tref, texp, tfix, + loc, transferType); + } + else if (alkind_isOwned (fkind)) + { + setCodePoint (); + checkOwnedTransferAux (fref, fexp, ffix, + tref, texp, tfix, + loc, transferType); + } + else if (alkind_isDependent (fkind)) + { + setCodePoint (); + if (isfcnreturn && + (sRef_isExposed (tref) || sRef_isObserver (tref))) + { + ; /* okay */ + } + else if ((alkind_isOnly (tkind) || alkind_isKeep (tkind) + || alkind_isOwned (tkind)) + || (!isfcnpass && alkind_isTemp (tkind))) + { + bool error = TRUE; + + if (sRef_isLocalVar (fref)) + { + sRef depRef = dependentReference (fref); + + if (sRef_isValid (depRef) && sRef_isLocalVar (depRef)) + { + error = FALSE; + sRef_kill (depRef, loc); + sRef_kill (fref, loc); + } + + } + + if (isfieldassign) + { + error = FALSE; + } + + if (canLoseLocalReference (fref, loc)) + { + ; + } + else + { + if (error && + (optgenerror + (FLG_DEPENDENTTRANS, + message ("%s storage %q%q: %q", + alkind_capName (fkind), + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc))) + { + DPRINTF (("Here: %s / %s", + sRef_unparseFull (fref), + sRef_unparseFull (tref))); + + sRef_showAliasInfo (fref); + } + } + } + else + { + if (isassign && (alkind_isFresh (tkind) || alkind_isLocal (tkind))) + { + if (!tfix && !ffix) + { + sRef_setDependent (tref, loc); + } + } + } + } + else if (alkind_isShared (fkind)) + { + setCodePoint (); + /* + ** xxx <- shared + */ + + if (alkind_isOnly (tkind) + || (!isfcnpass + && (!(sRef_isObserver (tref) || sRef_isExposed (tref)) + && alkind_isTemp (tkind)))) + { + if (optgenerror + (FLG_SHAREDTRANS, + message ("%s storage %q%q: %q", + alkind_capName (fkind), + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + else + { + if (alkind_isFresh (tkind) || alkind_isLocal (tkind)) + { + sRef_setShared (tref, loc); + } + } + } + else if (alkind_isKeep (fkind)) + { + setCodePoint (); + + if (alkind_isKeep (tkind) + || alkind_isLocal (tkind) + || (isfcnreturn && sRef_isExposed (tref)) + || (iseitherassign + && (alkind_isOnly (tkind) || alkind_isOwned (tkind)))) + { + sRef_setKept (fref, loc); + } + else if (isfcnpass + && (alkind_isTemp (tkind) || alkind_isOwned (tkind))) + { + ; + } + else + { + if (!alkind_isError (tkind)) + { + if (optgenerror + (FLG_KEEPTRANS, + message ("%s storage %q: %q", + alkind_capName (fkind), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + } + } + else if (alkind_isTemp (fkind) || alkind_isKept (fkind)) + { + /* + ** xxx <- temp + */ + + if (alkind_isOnly (tkind) + || alkind_isShared (tkind) + || (alkind_isTemp (fkind) + && !isfcnreturn && alkind_isDependent (tkind)) + || alkind_isOwned (tkind) + || alkind_isKeep (tkind)) + { + if (!exprNode_isNullValue (fexp) + && (ctype_isMutable (exprNode_getType (fexp)) + || (ctype_isArray (exprNode_getType (fexp)) + && sRef_isParam (fref))) + && (!iseitherassign || sRef_isReference (tref))) + { + if (sRef_isThroughArrayFetch (fref)) + { + if (optgenerror2 + (alkind_isTemp (fkind) ? FLG_TEMPTRANS : FLG_KEPTTRANS, + FLG_STRICTUSERELEASED, + message ("%s storage %q%q: %q", + alkind_capName (fkind), + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + else + { + if (optgenerror + (alkind_isTemp (fkind) ? FLG_TEMPTRANS : FLG_KEPTTRANS, + message ("%s storage %q%q: %q", + alkind_capName (fkind), + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + } + } + } + else if (alkind_isRefCounted (fkind) || alkind_isKillRef (fkind)) + { + if (alkind_isNewRef (tkind)) + { + /* + ** check that the refs field has been modified + */ + + if (!sRef_isConst (fref)) + { + voptgenerror + (FLG_REFCOUNTTRANS, + message ("Reference counted storage returned without modifying " + "reference count: %s", + exprNode_unparse (fexp)), + loc); + } + } + else if (iseitherassign) + { + if (alkind_isRefCounted (fkind)) + { + if (!sRef_isLocalVar (tref)) + { + vgenhinterror + (FLG_REFCOUNTTRANS, + message + ("Assignment to non-local from reference counted storage: %s", + exprNode_unparse (fexp)), + cstring_makeLiteral + ("Reference counted storage should call a function returning " + "a newref instead of direct assignments."), + loc); + } + else + { + ; + } + } + } + else /* fcnpass */ + { + if (alkind_isRefCounted (tkind) || alkind_isTemp (tkind)) + { + /* okay --- no change in state */ + } + else if (alkind_isKillRef (tkind)) + { + if (!ffix && !tfix && !(transferType == TT_FCNRETURN)) + { + sRef_killComplete (fref, loc); + } + } + else + { + if (!alkind_isError (tkind)) + { + voptgenerror + (FLG_REFCOUNTTRANS, + message ("Reference counted storage %q: %q", + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc); + } + } + } + } + else + { + ; + } + + setCodePoint (); + + if (alkind_isOnly (tkind) || alkind_isKeep (tkind)) + { + if (sRef_isAddress (fref)) + { + voptgenerror + (FLG_IMMEDIATETRANS, + message ("Immediate address %q %q: %q", + sRef_unparse (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc); + + sRef_setAliasKind (fref, AK_ERROR, loc); + } + else + { + if ((alkind_isUnknown (fkind) || alkind_isStatic (fkind)) + && !sRef_isDefinitelyNull (fref) + && (!ffix && !tfix) + && (!exprNode_isNullValue (fexp))) + { + flagcode errkind = alkind_isStatic (fkind) + ? FLG_STATICTRANS : FLG_UNKNOWNTRANS; + + if (transferType == TT_GLOBINIT) + { + if (errkind == FLG_STATICTRANS) + { + errkind = FLG_STATICINITTRANS; + } + else + { + errkind = FLG_UNKNOWNINITTRANS; + } + } + + if (optgenerror + (errkind, + message ("%s storage %s %q: %q", + alkind_capName (fkind), + exprNode_unparse (fexp), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + } + + /* don't kill shared to suppress future messages */ + if (!alkind_isShared (fkind)) + { + if (isassign) + { + if (!ffix) + { + /*< yuk! should do this in aliasaux >*/ + + if (!sRef_isNSLocalVar (tref) && !sRef_sameName (fref, tref)) + { + if (!tfix) + { + sRef_setKeptComplete (fref, loc); + } + else + { + sRef_setKept (fref, loc); + } + } + } + } + else + { + if (!ffix) + { + if (!tfix) + { + if (alkind_isKeep (tkind)) + { + sRef_setKeptComplete (fref, loc); + } + else + { + sRef_killComplete (fref, loc); + } + } + else + { + if (alkind_isKeep (tkind)) + { + sRef_setKept (fref, loc); + } + else + { + sRef_kill (fref, loc); + } + } + } + } + } + } + else if (alkind_isOwned (tkind)) + { + /* don't kill shared to suppress future messages */ + if (!alkind_isShared (fkind)) + { + if (!isassign + || !sRef_sameName (fref, tref)) /* result of return parameter */ + { + if (!ffix) + { + if (!tfix) + { + sRef_setDependentComplete (fref, loc); + } + else + { + sRef_setDependent (fref, loc); + } + } + } + } + } + else if (alkind_isShared (tkind)) + { + if (alkind_isFresh (fkind) || alkind_isLocal (fkind)) + { + if (!ffix) + { + sRef_setShared (fref, loc); + } + } + } + else if (alkind_isUnknown (tkind) && context_getFlag (FLG_MEMIMPLICIT)) + { + if (alkind_isDependent (fkind)) + { + if (!exprNode_isNullValue (fexp) + && ctype_isMutable (exprNode_getType (fexp)) + && (!iseitherassign || sRef_isReference (tref))) + { + if (canLoseReference (fref, loc)) + { + ; + } + else + { + if (optgenerror + (FLG_DEPENDENTTRANS, + message ("%s storage %q%q: %q", + alkind_capName (fkind), + sRef_unparseOpt (fref), + transferErrorMessage (transferType, tkind), + generateText (fexp, texp, tref, transferType)), + loc)) + { + DPRINTF (("Here: %s / %s", sRef_unparseFull (fref), + sRef_unparseFull (tref))); + sRef_showAliasInfo (fref); + } + } + } + } + } + else if (alkind_isNewRef (tkind)) + { + if (!ffix && !tfix) + { + sRef_killComplete (fref, loc); + } + } + else if (alkind_isKillRef (tkind)) + { + if (transferType == TT_FCNRETURN) + { + if (sRef_isNewRef (fref)) + { + if (optgenerror + (FLG_REFCOUNTTRANS, + message ("New reference returned as temp reference: %q", + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + } + else + { + if (sRef_isNewRef (fref)) + { + sRef_killComplete (fref, loc); + } + else + { + if (sRef_isRefCounted (fref) + && sRef_isCvar (fref) + && !sRef_isLocalVar (fref)) + { + if (optgenerror + (FLG_REFCOUNTTRANS, + message + ("External reference counted storage released: %q", + generateText (fexp, texp, tref, transferType)), + loc)) + { + sRef_showAliasInfo (fref); + } + } + } + } + + } + else + { + ; + } + + setCodePoint (); +} + +/* +** assigns fexp := tref or passes fexp as a parameter, or returns fexp. +** +** For assignments, sets alias and definition state accordingly. +*/ + +static void +checkTransfer (exprNode fexp, sRef fref, exprNode texp, sRef tref, + fileloc loc, transferKind transferType) +{ + setCodePoint (); + + if (context_inProtectVars ()) + { + return; + } + + /* + ** for local references, we need to check + ** the transfer for all possible aliases. + */ + + if (sRef_isLocalVar (tref) && transferType != TT_DOASSIGN) + { + sRefSet alias = usymtab_allAliases (tref); + + sRefSet_realElements (alias, atref) + { + sRef abase = sRef_getRootBase (atref); + + if (sRef_isKnown (atref) + && !sRef_isLocalVar (abase) + && !sRef_isExternal (abase)) + { + atref = sRef_updateSref (atref); + + if (sRef_hasName (atref)) + { + if (!sRef_isNew (atref) + && !sRef_sameName (tref, atref)) + { + context_setAliasAnnote (atref, tref); + } + + checkTransferAux (fexp, fref, TRUE, + texp, atref, FALSE, + loc, transferType); + + context_clearAliasAnnote (); + } + } + } end_sRefSet_realElements; + + sRefSet_free (alias); + } + + + if (sRef_isLocalVar (fref)) + { + sRefSet alias = usymtab_allAliases (fref); + + sRefSet_realElements (alias, afref) + { + sRef abase = sRef_getRootBase (afref); + + if (sRef_isKnown (afref) + && !sRef_isLocalVar (abase) + && !sRef_isExternal (abase)) + { + afref = sRef_updateSref (afref); + + if (sRef_hasName (afref)) + { + if (!sRef_isNew (afref) + && !sRef_sameName (afref, fref)) + { + context_setAliasAnnote (afref, fref); + } + + checkTransferAux (fexp, afref, FALSE, + texp, tref, TRUE, + loc, transferType); + + context_clearAliasAnnote (); + } + } + } end_sRefSet_realElements; + + sRefSet_free (alias); + } + + setCodePoint (); + + checkTransferAux (fexp, fref, FALSE, texp, tref, FALSE, + loc, transferType); + + setCodePoint (); +} + +static /*@exposed@*/ sRef + dependentReference (sRef sr) +{ + sRefSet ab = usymtab_aliasedBy (sr); /* yes, really mean aliasedBy */ + + /* + ** If there is a local variable that aliases sr, then there is no + ** error. Make the local an only. + */ + + if (!sRefSet_isEmpty (ab)) + { + sRef res = sRef_undefined; + + /* + ** make one an only, others alias it + */ + + + sRefSet_realElements (ab, current) + { + if (sRef_isOwned (current)) + { + res = current; + break; + } + } end_sRefSet_realElements; + + sRefSet_free (ab); + return res; + } + + return sRef_undefined; +} + +bool canLoseReference (sRef sr, fileloc loc) +{ + bool gotone = FALSE; + sRefSet ab = usymtab_aliasedBy (sr); /* yes, really mean aliasedBy */ + + + /* + ** if there is a local variable that aliases sr, then there is no + ** error. Make the local an only. + */ + + if (!sRefSet_isEmpty (ab)) + { + /* + ** make one an only, others alias it + */ + + + sRefSet_realElements (ab, current) + { + sRef_setLastReference (current, sr, loc); + gotone = TRUE; + break; + } end_sRefSet_realElements; + + sRefSet_free (ab); + } + + return gotone; +} + +bool canLoseLocalReference (sRef sr, fileloc loc) +{ + bool gotone = FALSE; + sRefSet ab = usymtab_aliasedBy (sr); /* yes, really mean aliasedBy */ + + + /* + ** if there is a local variable that aliases sr, then there is no + ** error. Make the local an only. + */ + + if (!sRefSet_isEmpty (ab)) + { + /* + ** make one an only, others alias it + */ + + + sRefSet_realElements (ab, current) + { + if (sRef_isRealLocalVar (sRef_getRootBase (current))) + { + sRef_setLastReference (current, sr, loc); + gotone = TRUE; + break; + } + } end_sRefSet_realElements; + + sRefSet_free (ab); + } + + return gotone; +} + + diff --git a/src/aliasTable.c b/src/aliasTable.c new file mode 100644 index 0000000..14bf663 --- /dev/null +++ b/src/aliasTable.c @@ -0,0 +1,824 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** aliasTable.c +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +/*@constant int ATINVALID; @*/ +# define ATINVALID -1 + +static sRefSet + aliasTable_canAliasAux (aliasTable p_s, sRef p_sr, int p_lim) /*@*/ ; +static sRefSet + aliasTable_aliasedByLimit (aliasTable p_s, sRef p_sr, int p_lim) /*@*/ ; +static sRefSet + aliasTable_aliasedByAux (aliasTable p_s, sRef p_sr, int p_lim) /*@*/ ; + +aliasTable +aliasTable_new () +{ + return (aliasTable_undefined); +} + +static /*@only@*/ /*@notnull@*/ aliasTable +aliasTable_newEmpty (void) +{ + aliasTable s = (aliasTable) dmalloc (sizeof (*s)); + + s->nelements = 0; + s->nspace = aliasTableBASESIZE; + s->keys = (sRef *) dmalloc (sizeof (*s->keys) * aliasTableBASESIZE); + s->values = (sRefSet *) dmalloc (sizeof (*s->values) * aliasTableBASESIZE); + + return (s); +} + +static void +aliasTable_grow (/*@notnull@*/ aliasTable s) +{ + int i; + o_sRefSet *oldvalues = s->values; + sRef *oldkeys = s->keys; + + s->nspace += aliasTableBASESIZE; + + s->values = (sRefSet *) dmalloc (sizeof (*s->values) + * (s->nelements + s->nspace)); + s->keys = (sRef *) dmalloc (sizeof (*s->keys) * (s->nelements + aliasTableBASESIZE)); + + if (s->keys == (sRef *) 0 || s->values == (sRefSet *)0) + { + llfatalerror (cstring_makeLiteral ("aliasTable_grow: out of memory!")); + } + + for (i = 0; i < s->nelements; i++) + { + s->values[i] = oldvalues[i]; + s->keys[i] = oldkeys[i]; + } + + sfree (oldvalues); + sfree (oldkeys); +} + +static int aliasTable_lookupRefs (/*@notnull@*/ aliasTable s, sRef sr) +{ + int i; + + + for (i = 0; i < aliasTable_size (s); i++) + { + if (sRef_same (sr, s->keys[i])) + { + return i; + } + } + + return ATINVALID; +} + +/* +** sr aliases al (and anything al aliases!) +*/ + +aliasTable +aliasTable_addMustAlias (/*@returned@*/ aliasTable s, + /*@exposed@*/ sRef sr, + sRef al) +{ + int ind; + sRefSet ss; + + llassert (NOALIAS (sr, al)); + + if (aliasTable_isUndefined (s)) + { + s = aliasTable_newEmpty (); + ind = ATINVALID; + } + else + { + ind = aliasTable_lookupRefs (s, sr); + } + + ss = aliasTable_canAlias (s, al); + + + if (ind == ATINVALID) + { + if (s->nspace <= 0) { + aliasTable_grow (s); + } + + s->nspace--; + s->keys[s->nelements] = sr; + s->values[s->nelements] = sRefSet_single (al); + ind = s->nelements; + s->nelements++; + } + else + { + s->values[ind] = sRefSet_insert (s->values[ind], al); + } + + s->values[ind] = sRefSet_unionExcept (s->values[ind], ss, s->keys[ind]); + + sRefSet_free (ss); + return s; +} + +static aliasTable + aliasTable_addSet (/*@returned@*/ aliasTable s, + /*@exposed@*/ sRef key, /*@only@*/ sRefSet value) +{ + if (!sRefSet_isEmpty (value)) + { + if (aliasTable_isUndefined (s)) + { + s = aliasTable_newEmpty (); + } + else + { + if (s->nspace <= 0) + { + aliasTable_grow (s); + } + } + + s->nspace--; + s->keys[s->nelements] = key; + s->values[s->nelements] = value; + s->nelements++; + } + else + { + sRefSet_free (value); + } + + return s; +} + +/* +** When aliases are cleared: +** +** o remove all entries for sr +** o replace all aliases for things which alias sr with sr's aliases +** +** Clear aliases for sr; if sr is a direct param reference, clear its aliases too. +*/ + +static void aliasTable_clearAliasesAux (/*@notnull@*/ aliasTable p_s, sRef p_sr) + /*@modifies p_s@*/ ; + +void aliasTable_clearAliases (aliasTable s, sRef sr) +{ + if (aliasTable_isUndefined (s)) + { + return; + } + else + { + sRef rb = sRef_getRootBase (sr); + + + if (!sRef_isCvar (sr) && sRef_isLocalVar (rb)) + { + int ind = aliasTable_lookupRefs (s, rb); + + if (ind != ATINVALID) + { + sRefSet al = s->values[ind]; + + + sRefSet_realElements (al, el) + { + + if (sRef_isParam (el)) + { + if (sRef_sameName (el, rb)) + { + sRef fb = sRef_fixBase (sr, el); + + aliasTable_clearAliasesAux (s, fb); + } + } + } end_sRefSet_realElements ; + } + } + + aliasTable_clearAliasesAux (s, sr); + } +} + +static +void aliasTable_clearAliasesAux (/*@notnull@*/ aliasTable s, sRef sr) +{ + int i; + + for (i = 0; i < s->nelements; i++) + { + sRef key = s->keys[i]; + + if (sRef_includedBy (key, sr)) + { + sRefSet_clear (s->values[i]); + } + else + { + (void) sRefSet_deleteBase (s->values[i], sr); + } + } +} + +/* +** returns set of all sRefs that must alias sr (but are different from sr) +*/ + +static /*@only@*/ sRefSet aliasTable_aliasedByAux (aliasTable s, sRef sr, int lim) +{ + static bool hadWarning = FALSE; + sRefSet res = sRefSet_undefined; + int i; + + llassert (!sRef_isConj (sr)); + + + if (aliasTable_isUndefined (s) || lim >= ALIASSEARCHLIMIT) + { + if (lim >= ALIASSEARCHLIMIT && !hadWarning) + { + llquietbug + (message ("Alias search limit exceeded, checking %q. " + "This either means there is a variable with at least " + "%d indirections, or there is a bug in LCLint.", + sRef_unparse (sr), + ALIASSEARCHLIMIT)); + + hadWarning = TRUE; + } + + return sRefSet_undefined; + } + else + { + sRefSet abl; + + if (sRef_isPointer (sr)) + { + abl = aliasTable_aliasedByLimit (s, sRef_getBase (sr), lim); + res = sRefSet_addIndirection (abl); + } + else if (sRef_isAddress (sr)) + { + abl = aliasTable_aliasedByLimit (s, sRef_getBase (sr), lim); + res = sRefSet_removeIndirection (abl); + } + else if (sRef_isField (sr)) + { + abl = aliasTable_aliasedByLimit (s, sRef_getBase (sr), lim); + res = sRefSet_accessField (abl, sRef_getField (sr)); + } + else if (sRef_isArrayFetch (sr)) + { + abl = aliasTable_aliasedByLimit (s, sRef_getBase (sr), lim); + + if (sRef_isIndexKnown (sr)) + { + int idx = sRef_getIndex (sr); + + res = sRefSet_fetchKnown (abl, idx); + } + else + { + res = sRefSet_fetchUnknown (abl); + } + } + else + { + abl = sRefSet_undefined; + } + + sRefSet_free (abl); + } + + for (i = 0; i < s->nelements; i++) + { + sRef elem = s->keys[i]; + + if (!sRef_same (sr, elem)) /* was sameName */ + { + + sRefSet_realElements (s->values[i], current) + { + + if (sRef_similar (sr, current)) + { + res = sRefSet_insert (res, sRef_fixOuterRef (elem)); + /*@innerbreak@*/ break; + } + } end_sRefSet_realElements; + } + } + + return res; +} + +static /*@only@*/ sRefSet aliasTable_aliasedByLimit (aliasTable s, sRef sr, int lim) +{ + sRefSet res; + + + if (sRef_isConj (sr)) + { + res = sRefSet_unionFree (aliasTable_aliasedByLimit (s, sRef_getConjA (sr), lim), + aliasTable_aliasedByLimit (s, sRef_getConjB (sr), lim)); + } + else + { + res = aliasTable_aliasedByAux (s, sr, lim + 1); + } + + return res; +} + +/*@only@*/ sRefSet aliasTable_aliasedBy (aliasTable s, sRef sr) +{ + if (sRef_isConj (sr)) + { + return (sRefSet_unionFree (aliasTable_aliasedBy (s, sRef_getConjA (sr)), + aliasTable_aliasedBy (s, sRef_getConjB (sr)))); + } + + return (aliasTable_aliasedByAux (s, sr, 0)); +} + +/*@only@*/ sRefSet aliasTable_canAlias (aliasTable s, sRef sr) +{ + sRefSet res; + + + if (sRef_isConj (sr)) + { + res = sRefSet_unionFree (aliasTable_canAlias (s, sRef_getConjA (sr)), + aliasTable_canAlias (s, sRef_getConjB (sr))); + } + else + { + res = aliasTable_canAliasAux (s, sr, 0); + } + + return res; +} + +/* +** need to limit the depth of aliasing searches +*/ + +static /*@only@*/ sRefSet aliasTable_canAliasLimit (aliasTable s, sRef sr, int lim) +{ + sRefSet res; + + if (sRef_isConj (sr)) + { + sRefSet a = aliasTable_canAliasLimit (s, sRef_getConjA (sr), lim); + sRefSet b = aliasTable_canAliasLimit (s, sRef_getConjB (sr), lim); + + res = sRefSet_unionFree (a, b); + } + else + { + res = aliasTable_canAliasAux (s, sr, lim + 1); + } + + return res; +} + +static /*@only@*/ sRefSet + aliasTable_canAliasAux (aliasTable s, sRef sr, int lim) +{ + static bool hadWarning = FALSE; + llassert (!sRef_isConj (sr)); + + + if (aliasTable_isUndefined (s) || lim >= ALIASSEARCHLIMIT) + { + if (lim >= ALIASSEARCHLIMIT && !hadWarning) + { + llquietbug + (message ("Alias search limit exceeded, checking %q. " + "This either means there is a variable with at least " + "%d indirections, or there is a bug in LCLint.", + sRef_unparse (sr), + ALIASSEARCHLIMIT)); + + hadWarning = TRUE; + } + + return sRefSet_undefined; + } + else + { + int ind = aliasTable_lookupRefs (s, sr); + + if (sRef_isPointer (sr) || sRef_isAddress (sr) || sRef_isField (sr) + || sRef_isArrayFetch (sr)) + { + sRef base = sRef_getBase (sr); + sRefSet tmp = aliasTable_canAliasLimit (s, base, lim); + sRefSet ret; + + if (sRef_isPointer (sr)) + { + ret = sRefSet_addIndirection (tmp); + } + else if (sRef_isAddress (sr)) + { + ret = sRefSet_removeIndirection (tmp); + } + else if (sRef_isField (sr)) + { + ret = sRefSet_accessField (tmp, sRef_getField (sr)); + } + else if (sRef_isArrayFetch (sr)) + { + if (sRef_isIndexKnown (sr)) + { + ret = sRefSet_fetchKnown (tmp, sRef_getIndex (sr)); + } + else + { + ret = sRefSet_fetchUnknown (tmp); + } + } + else + { + BADBRANCH; + } + + if (ind != ATINVALID) + { + ret = sRefSet_union (ret, s->values[ind]); + } + + sRefSet_free (tmp); + return ret; + } + + if (ind == ATINVALID) return sRefSet_undefined; + + return sRefSet_newCopy (s->values[ind]); + } +} + +aliasTable aliasTable_copy (aliasTable s) +{ + if (aliasTable_isEmpty (s)) + { + return aliasTable_undefined; + } + else + { + aliasTable t = (aliasTable) dmalloc (sizeof (*s)); + int i; + + t->nelements = s->nelements; + t->nspace = 0; + t->keys = (sRef *) dmalloc (sizeof (*s->keys) * s->nelements); + t->values = (sRefSet *) dmalloc (sizeof (*s->values) * t->nelements); + + for (i = 0; i < s->nelements; i++) + { + t->keys[i] = s->keys[i]; + t->values[i] = sRefSet_newCopy (s->values[i]); + } + + return t; + } +} + +static void +aliasTable_levelPrune (aliasTable s, int lexlevel) +{ + + + if (aliasTable_isEmpty (s)) + { + return; + } + else + { + int i; + int backcount = s->nelements - 1; + + for (i = 0; i <= backcount; i++) + { + sRef key = s->keys[i]; + + if (sRef_lexLevel (key) > lexlevel) + { + int j; + for (j = backcount; j > i; j--) + { + backcount--; + s->nelements--; + s->nspace++; + + if (sRef_lexLevel (s->keys[j]) <= lexlevel) + { + s->keys[i] = s->keys[j]; + s->values[i] = s->values[j]; + sRefSet_levelPrune (s->values[i], lexlevel); + /*@innerbreak@*/ break; + } + } + if (backcount == i) + s->nelements--; + } + else + { + sRefSet_levelPrune (s->values[i], lexlevel); + } + } + } +} + +/* +** levelUnionSeq +** +** like level union, but know that t2 was executed after t1. So if +** t1 has x -> { a, b } and t2 has x -> { a }, then result has x -> { a }. +** +** NOTE: t2 is "only". +*/ + +aliasTable aliasTable_levelUnionSeq (/*@returned@*/ aliasTable t1, + /*@only@*/ aliasTable t2, int level) +{ + if (aliasTable_isUndefined (t2)) + { + return t1; + } + + if (aliasTable_isUndefined (t1)) + { + t1 = aliasTable_newEmpty (); + } + else + { + aliasTable_levelPrune (t1, level); + } + + aliasTable_elements (t2, key, value) + { + if (sRef_lexLevel (key) <= level) + { + int ind = aliasTable_lookupRefs (t1, key); + + sRefSet_levelPrune (value, level); + + if (ind == ATINVALID) + { + /* okay, t2 is killed */ + /*@-exposetrans@*/ /*@-dependenttrans@*/ + t1 = aliasTable_addSet (t1, key, value); + /*@=exposetrans@*/ /*@=dependenttrans@*/ + } + else + { + sRefSet_free (t1->values[ind]); + + /*@-dependenttrans@*/ /* okay, t2 is killed */ + t1->values[ind] = value; + /*@=dependenttrans@*/ + } + } + else + { + /*@-exposetrans@*/ /*@-dependenttrans@*/ + sRefSet_free (value); + /*@=exposetrans@*/ /*@=dependenttrans@*/ + } + + } end_aliasTable_elements; + + sfree (t2->keys); + sfree (t2->values); + sfree (t2); + + return t1; +} + +aliasTable +aliasTable_levelUnion (/*@returned@*/ aliasTable t1, aliasTable t2, int level) +{ + if (aliasTable_isUndefined (t1)) + { + if (aliasTable_isUndefined (t2)) + { + return t1; + } + else + { + t1 = aliasTable_newEmpty (); + } + } + else + { + aliasTable_levelPrune (t1, level); + } + + aliasTable_elements (t2, key, cvalue) + { + sRefSet value = sRefSet_newCopy (cvalue); + + if (sRef_lexLevel (key) <= level) + { + sRefSet_levelPrune (value, level); + + if (sRefSet_size (value) > 0) + { + int ind = aliasTable_lookupRefs (t1, key); + + if (ind == ATINVALID) + { + t1 = aliasTable_addSet (t1, key, value); + } + else + { + t1->values[ind] = sRefSet_union (t1->values[ind], value); + sRefSet_free (value); + } + } + else + { + sRefSet_free (value); + } + } + else + { + sRefSet_free (value); + } + } end_aliasTable_elements; + + return t1; +} + +aliasTable aliasTable_levelUnionNew (aliasTable t1, aliasTable t2, int level) +{ + aliasTable ret = aliasTable_levelUnion (aliasTable_copy (t1), t2, level); + + return ret; +} + +/*@only@*/ cstring +aliasTable_unparse (aliasTable s) +{ + cstring st = cstring_undefined; + + if (aliasTable_isUndefined (s)) return (cstring_makeLiteral ("")); + + aliasTable_elements (s, key, value) + { + st = message ("%q\t%q -> %q\n", st, sRef_unparse (key), + sRefSet_unparse (value)); + } end_aliasTable_elements; + + return st; +} + +/* +** bogus! +*/ + +void +aliasTable_fixSrefs (aliasTable s) +{ + int i; + + if (aliasTable_isUndefined (s)) return; + + for (i = 0; i < s->nelements; i++) + { + sRef old = s->keys[i]; + + if (sRef_isLocalVar (old)) + { + s->keys[i] = uentry_getSref (sRef_getUentry (old)); + } + + sRefSet_fixSrefs (s->values[i]); + } +} + +void +aliasTable_free (/*@only@*/ aliasTable s) +{ + int i; + + if (aliasTable_isUndefined (s)) return; + + for (i = 0; i < s->nelements; i++) + { + sRefSet_free (s->values[i]); + } + + sfree (s->values); + sfree (s->keys); + sfree (s); +} + +void +aliasTable_checkGlobs (aliasTable t) +{ + aliasTable_elements (t, key, value) + { + sRef root = sRef_getRootBase (key); + + if (sRef_isAliasCheckedGlobal (root)) + { + sRefSet_realElements (value, sr) + { + root = sRef_getRootBase (sr); + + if (((sRef_isAliasCheckedGlobal (root) + && !(sRef_similar (root, key))) + || sRef_isAnyParam (root)) + && !sRef_isExposed (root)) + { + if (sRef_isAliasCheckedGlobal (key)) + { + if (!(sRef_isShared (key) + && sRef_isShared (root))) + { + voptgenerror + (FLG_GLOBALIAS, + message + ("Function returns with %q variable %q aliasing %q %q", + cstring_makeLiteral (sRef_isRealGlobal (key) + ? "global" : "file static"), + sRef_unparse (key), + cstring_makeLiteral (sRef_isAnyParam (root) + ? "parameter" : "global"), + sRef_unparse (sr)), + g_currentloc); + } + } + + } + } end_sRefSet_realElements; + } + else if (sRef_isAnyParam (key) || sRef_isAnyParam (root)) + { + sRefSet_realElements (value, sr) + { + root = sRef_getRootBase (sr); + + if (sRef_isAliasCheckedGlobal (root) + && !sRef_isExposed (root) + && !sRef_isDead (key) + && !sRef_isShared (root)) + { + voptgenerror + (FLG_GLOBALIAS, + message ("Function returns with parameter %q aliasing %q %q", + sRef_unparse (key), + cstring_makeLiteral (sRef_isRealGlobal (root) + ? "global" : "file static"), + sRef_unparse (sr)), + g_currentloc); + } + } end_sRefSet_realElements; + } + else + { + ; + } + } end_aliasTable_elements; +} + + + diff --git a/src/bison.head b/src/bison.head new file mode 100644 index 0000000..ada233e --- /dev/null +++ b/src/bison.head @@ -0,0 +1,46 @@ +/* +** Inserted at beginning of c files generated by bison +** REMEMBER: Change bison.reset too. +*/ + +/*@-allmacros@*/ +/*@+boolint@*/ +/*@+charint@*/ +/*@-macroparams@*/ +/*@-macroundef@*/ +/*@-unreachable@*/ +/*@-macrospec@*/ +/*@-varuse@*/ +/*@+ignorequals@*/ +/*@-macrostmt@*/ +/*@-noeffect@*/ +/*@-shadow@*/ +/*@-exitarg@*/ +/*@-macroredef@*/ +/*@-uniondef@*/ +/*@-compdef@*/ +/*@-matchfields@*/ +/*@-exportlocal@*/ +/*@-evalorderuncon@*/ +/*@-exportheader@*/ +/*@-typeuse@*/ +/*@-redecl@*/ +/*@-redef@*/ +/*@-noparams@*/ +/*@-ansireserved@*/ +/*@-fielduse@*/ +/*@-ifblock@*/ +/*@-elseifcomplete@*/ +/*@-whileblock@*/ +/*@-forblock@*/ +/*@-branchstate@*/ +/*@-readonlytrans@*/ +/*@-namechecks@*/ +/*@-usedef@*/ +/*@-systemunrecog@*/ +/*@-dependenttrans@*/ +/*@-unqualifiedtrans@*/ +/*@-nullassign@*/ + +/* < end of bison.head > */ + diff --git a/src/bison.reset b/src/bison.reset new file mode 100644 index 0000000..9f91586 --- /dev/null +++ b/src/bison.reset @@ -0,0 +1,42 @@ +/* +** Resets all flags in bison.head +*/ + + +/*@=allmacros@*/ +/*@=boolint@*/ +/*@=charint@*/ +/*@=macroparams@*/ +/*@=macroundef@*/ +/*@=unreachable@*/ +/*@=macrospec@*/ +/*@=varuse@*/ +/*@=ignorequals@*/ +/*@=macrostmt@*/ +/*@=noeffect@*/ +/*@=shadow@*/ +/*@=exitarg@*/ +/*@=macroredef@*/ +/*@=uniondef@*/ +/*@=compdef@*/ +/*@=matchfields@*/ +/*@=exportlocal@*/ +/*@=evalorderuncon@*/ +/*@=exportheader@*/ +/*@=typeuse@*/ +/*@=redecl@*/ +/*@=redef@*/ +/*@=noparams@*/ +/*@=ansireserved@*/ +/*@=fielduse@*/ +/*@=ifblock@*/ +/*@=elseifcomplete@*/ +/*@=whileblock@*/ +/*@=forblock@*/ +/*@=branchstate@*/ +/*@=readonlytrans@*/ +/*@=namechecks@*/ +/*@=usedef@*/ +/*@=systemunrecog@*/ +/*@=dependenttrans@*/ +/*@=unqualifiedtrans@*/ diff --git a/src/cgrammar.c.der b/src/cgrammar.c.der new file mode 100644 index 0000000..d2240a5 --- /dev/null +++ b/src/cgrammar.c.der @@ -0,0 +1,5482 @@ +/* +** Inserted at beginning of c files generated by bison +** REMEMBER: Change bison.reset too. +*/ + +/*@-allmacros@*/ +/*@+boolint@*/ +/*@+charint@*/ +/*@-macroparams@*/ +/*@-macroundef@*/ +/*@-unreachable@*/ +/*@-macrospec@*/ +/*@-varuse@*/ +/*@+ignorequals@*/ +/*@-macrostmt@*/ +/*@-noeffect@*/ +/*@-shadow@*/ +/*@-exitarg@*/ +/*@-macroredef@*/ +/*@-uniondef@*/ +/*@-compdef@*/ +/*@-matchfields@*/ +/*@-exportlocal@*/ +/*@-evalorderuncon@*/ +/*@-exportheader@*/ +/*@-typeuse@*/ +/*@-redecl@*/ +/*@-redef@*/ +/*@-noparams@*/ +/*@-ansireserved@*/ +/*@-fielduse@*/ +/*@-ifblock@*/ +/*@-elseifcomplete@*/ +/*@-whileblock@*/ +/*@-forblock@*/ +/*@-branchstate@*/ +/*@-readonlytrans@*/ +/*@-namechecks@*/ +/*@-usedef@*/ +/*@-systemunrecog@*/ +/*@-dependenttrans@*/ +/*@-unqualifiedtrans@*/ +/*@-nullassign@*/ + +/* < end of bison.head > */ + + +/* A Bison parser, made from cgrammar.y + by GNU Bison version 1.25 + */ + +#define YYBISON 1 /* Identify Bison output. */ + +#define BADTOK 258 +#define SKIPTOK 259 +#define CTOK_ELIPSIS 260 +#define CASE 261 +#define DEFAULT 262 +#define CIF 263 +#define CELSE 264 +#define SWITCH 265 +#define WHILE 266 +#define DO 267 +#define CFOR 268 +#define GOTO 269 +#define CONTINUE 270 +#define BREAK 271 +#define RETURN 272 +#define TSEMI 273 +#define TLBRACE 274 +#define TRBRACE 275 +#define TCOMMA 276 +#define TCOLON 277 +#define TASSIGN 278 +#define TLPAREN 279 +#define TRPAREN 280 +#define TLSQBR 281 +#define TRSQBR 282 +#define TDOT 283 +#define TAMPERSAND 284 +#define TEXCL 285 +#define TTILDE 286 +#define TMINUS 287 +#define TPLUS 288 +#define TMULT 289 +#define TDIV 290 +#define TPERCENT 291 +#define TLT 292 +#define TGT 293 +#define TCIRC 294 +#define TBAR 295 +#define TQUEST 296 +#define CSIZEOF 297 +#define CALIGNOF 298 +#define ARROW_OP 299 +#define CTYPEDEF 300 +#define COFFSETOF 301 +#define INC_OP 302 +#define DEC_OP 303 +#define LEFT_OP 304 +#define RIGHT_OP 305 +#define LE_OP 306 +#define GE_OP 307 +#define EQ_OP 308 +#define NE_OP 309 +#define AND_OP 310 +#define OR_OP 311 +#define MUL_ASSIGN 312 +#define DIV_ASSIGN 313 +#define MOD_ASSIGN 314 +#define ADD_ASSIGN 315 +#define SUB_ASSIGN 316 +#define LEFT_ASSIGN 317 +#define RIGHT_ASSIGN 318 +#define AND_ASSIGN 319 +#define XOR_ASSIGN 320 +#define OR_ASSIGN 321 +#define CSTRUCT 322 +#define CUNION 323 +#define CENUM 324 +#define VA_ARG 325 +#define VA_DCL 326 +#define QGLOBALS 327 +#define QMODIFIES 328 +#define QNOMODS 329 +#define QCONSTANT 330 +#define QFUNCTION 331 +#define QITER 332 +#define QDEFINES 333 +#define QUSES 334 +#define QALLOCATES 335 +#define QSETS 336 +#define QRELEASES 337 +#define QPRECLAUSE 338 +#define QPOSTCLAUSE 339 +#define QALT 340 +#define QUNDEF 341 +#define QKILLED 342 +#define QENDMACRO 343 +#define LLMACRO 344 +#define LLMACROITER 345 +#define LLMACROEND 346 +#define TENDMACRO 347 +#define QSWITCHBREAK 348 +#define QLOOPBREAK 349 +#define QINNERBREAK 350 +#define QSAFEBREAK 351 +#define QINNERCONTINUE 352 +#define QFALLTHROUGH 353 +#define QLINTNOTREACHED 354 +#define QLINTFALLTHROUGH 355 +#define QLINTFALLTHRU 356 +#define QARGSUSED 357 +#define QPRINTFLIKE 358 +#define QLINTPRINTFLIKE 359 +#define QSCANFLIKE 360 +#define QMESSAGELIKE 361 +#define QNOTREACHED 362 +#define QCONST 363 +#define QVOLATILE 364 +#define QINLINE 365 +#define QEXTENSION 366 +#define QEXTERN 367 +#define QSTATIC 368 +#define QAUTO 369 +#define QREGISTER 370 +#define QOUT 371 +#define QIN 372 +#define QYIELD 373 +#define QONLY 374 +#define QTEMP 375 +#define QSHARED 376 +#define QREF 377 +#define QUNIQUE 378 +#define QCHECKED 379 +#define QUNCHECKED 380 +#define QCHECKEDSTRICT 381 +#define QCHECKMOD 382 +#define QKEEP 383 +#define QKEPT 384 +#define QPARTIAL 385 +#define QSPECIAL 386 +#define QOWNED 387 +#define QDEPENDENT 388 +#define QRETURNED 389 +#define QEXPOSED 390 +#define QNULL 391 +#define QOBSERVER 392 +#define QISNULL 393 +#define QEXITS 394 +#define QMAYEXIT 395 +#define QNEVEREXIT 396 +#define QTRUEEXIT 397 +#define QFALSEEXIT 398 +#define QLONG 399 +#define QSIGNED 400 +#define QUNSIGNED 401 +#define QSHORT 402 +#define QUNUSED 403 +#define QSEF 404 +#define QNOTNULL 405 +#define QRELNULL 406 +#define QABSTRACT 407 +#define QCONCRETE 408 +#define QMUTABLE 409 +#define QIMMUTABLE 410 +#define QTRUENULL 411 +#define QFALSENULL 412 +#define QEXTERNAL 413 +#define QREFCOUNTED 414 +#define QREFS 415 +#define QNEWREF 416 +#define QTEMPREF 417 +#define QKILLREF 418 +#define QRELDEF 419 +#define CGCHAR 420 +#define CBOOL 421 +#define CINT 422 +#define CGFLOAT 423 +#define CDOUBLE 424 +#define CVOID 425 +#define QANYTYPE 426 +#define QINTEGRALTYPE 427 +#define QUNSIGNEDINTEGRALTYPE 428 +#define QSIGNEDINTEGRALTYPE 429 +#define IDENTIFIER 430 +#define NEW_IDENTIFIER 431 +#define TYPE_NAME_OR_ID 432 +#define CCONSTANT 433 +#define ITER_NAME 434 +#define ITER_ENDNAME 435 +#define TYPE_NAME 436 + +#line 19 "cgrammar.y" + +/* +** +** cgrammar.y +** +** Yacc/Bison grammar for extended ANSI C used by LCLint. +** +** original grammar by Nate Osgood --- +** hacrat@catfish.lcs.mit.edu Mon Jun 14 13:06:32 1993 +** +** changes for LCLint --- handle typedef names correctly +** fix struct/union parsing bug (empty struct is accepted) +** add productions to handle macros --- require +** error correction --- main source of conflicts in grammar. +** need to process initializations sequentially, L->R +** +** production names are cryptic, so more productions fit on one line +** +** conflicts: 87 shift/reduce, 18 reduce/reduce +** most of these are due to handling macros +** a few are due to handling type expressions +*/ + +/*@=allmacros@*/ + +extern int yylex (); +extern void swallowMacro (void); + +# include "lclintMacros.nf" +# include "basic.h" +# include "cgrammar.h" +# include "exprChecks.h" + +/*@-allmacros@*/ +/*@-matchfields@*/ + +# define SHOWCSYM FALSE +void yyerror (char *s); + +/* +** This is necessary, or else when the bison-generated code #include's malloc.h, +** there will be a parse error. +** +** Unfortunately, it means the error checking on malloc, etc. is lost for allocations +** in bison-generated files under Win32. +*/ + +# ifdef WIN32 +# undef malloc +# undef calloc +# undef realloc +# endif + + +#line 74 "cgrammar.y" +typedef union +{ + lltok tok; + int count; + specialClauseKind sck; + qual typequal; + qualList tquallist; + ctype ctyp; + sRef sr; + /*@only@*/ qtype qtyp; + /*@only@*/ cstring cname; + /*@only@*/ idDecl ntyp; + /*@only@*/ idDeclList ntyplist; + /*@only@*/ uentryList flist; + /*@owned@*/ uentryList entrylist; + /*@observer@*/ /*@dependent@*/ uentry entry; + /*@only@*/ uentry oentry; + /*@only@*/ exprNode expr; + /*@only@*/ enumNameList enumnamelist; + /*@only@*/ exprNodeList alist; + /*@only@*/ sRefSet srset; + /*@only@*/ cstringList cstringlist; +} YYSTYPE; +#ifndef YYDEBUG +#define YYDEBUG 1 +#endif + +#include + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif + + + +#define YYFINAL 1158 +#define YYFLAG -32768 +#define YYNTBASE 182 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 436 ? yytranslate[x] : 409) + +static const short yytranslate[] = { 0, + 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, 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, 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, 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, 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, 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, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181 +}; + +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 1, 3, 5, 8, 11, 13, 15, 17, 19, + 21, 23, 32, 44, 45, 51, 53, 57, 59, 62, + 64, 71, 75, 82, 83, 90, 91, 99, 101, 108, + 112, 119, 120, 127, 128, 136, 137, 138, 149, 153, + 157, 161, 164, 166, 167, 170, 171, 174, 176, 179, + 181, 184, 186, 189, 191, 195, 198, 200, 202, 204, + 206, 208, 210, 212, 213, 216, 217, 224, 225, 232, + 234, 236, 237, 238, 244, 245, 251, 253, 255, 256, + 258, 259, 260, 264, 265, 269, 271, 273, 275, 277, + 279, 281, 283, 285, 287, 289, 291, 293, 295, 297, + 299, 301, 303, 304, 312, 313, 322, 324, 328, 329, + 333, 334, 338, 341, 345, 348, 351, 353, 355, 357, + 361, 366, 369, 373, 377, 381, 383, 385, 387, 391, + 393, 395, 399, 404, 407, 411, 415, 419, 421, 425, + 427, 429, 431, 435, 437, 439, 441, 446, 450, 455, + 462, 468, 474, 477, 480, 482, 486, 488, 491, 494, + 497, 500, 503, 506, 509, 512, 514, 516, 520, 522, + 532, 533, 537, 542, 545, 550, 553, 555, 560, 562, + 566, 570, 574, 576, 580, 584, 586, 590, 594, 596, + 600, 604, 608, 612, 614, 618, 622, 624, 628, 630, + 634, 636, 640, 642, 643, 648, 650, 651, 656, 658, + 659, 660, 668, 670, 674, 678, 682, 686, 690, 694, + 698, 702, 706, 710, 714, 716, 720, 721, 723, 725, + 727, 729, 731, 735, 736, 746, 747, 759, 762, 763, + 770, 771, 779, 784, 789, 790, 791, 794, 796, 801, + 802, 807, 809, 813, 818, 820, 824, 826, 828, 830, + 832, 834, 837, 840, 843, 846, 849, 852, 855, 858, + 861, 864, 867, 870, 873, 876, 879, 882, 885, 888, + 891, 894, 897, 900, 903, 906, 909, 912, 915, 918, + 921, 924, 927, 930, 933, 936, 939, 942, 945, 948, + 951, 954, 957, 960, 963, 966, 969, 971, 973, 975, + 977, 980, 983, 986, 989, 992, 995, 998, 1001, 1004, + 1007, 1010, 1013, 1016, 1019, 1023, 1025, 1030, 1032, 1036, + 1039, 1042, 1045, 1046, 1048, 1049, 1050, 1062, 1063, 1064, + 1076, 1083, 1090, 1091, 1092, 1103, 1104, 1105, 1116, 1122, + 1128, 1133, 1138, 1139, 1141, 1143, 1146, 1152, 1156, 1159, + 1164, 1166, 1170, 1175, 1182, 1183, 1192, 1197, 1199, 1203, + 1206, 1208, 1213, 1215, 1217, 1220, 1223, 1225, 1228, 1230, + 1233, 1235, 1237, 1239, 1242, 1244, 1247, 1250, 1254, 1256, + 1260, 1262, 1266, 1268, 1270, 1274, 1275, 1278, 1279, 1284, + 1289, 1291, 1293, 1296, 1298, 1300, 1303, 1304, 1306, 1312, + 1315, 1319, 1323, 1328, 1332, 1337, 1342, 1348, 1350, 1352, + 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368, 1370, 1372, + 1375, 1378, 1386, 1393, 1396, 1397, 1398, 1409, 1410, 1417, + 1419, 1421, 1423, 1425, 1428, 1430, 1432, 1434, 1436, 1438, + 1440, 1442, 1446, 1448, 1451, 1454, 1457, 1459, 1461, 1463, + 1465, 1467, 1469, 1471, 1473, 1475, 1477, 1481, 1483, 1485, + 1488, 1491, 1492, 1497, 1498, 1504, 1505, 1509, 1510, 1515, + 1519, 1522, 1526, 1527, 1528, 1529, 1530, 1531, 1533, 1536, + 1539, 1543, 1546, 1550, 1554, 1559, 1562, 1565, 1569, 1573, + 1578, 1580, 1583, 1585, 1588, 1590, 1593, 1595, 1598, 1600, + 1603, 1605, 1610, 1613, 1614, 1620, 1621, 1628, 1633, 1638, + 1639, 1640, 1651, 1653, 1654, 1659, 1661, 1663, 1665, 1667, + 1669, 1673, 1675, 1680, 1684, 1689, 1696, 1702, 1708, 1711, + 1714, 1716, 1719, 1722, 1725, 1728, 1731, 1734, 1737, 1740, + 1742, 1744, 1749, 1751, 1755, 1759, 1763, 1765, 1769, 1773, + 1775, 1779, 1783, 1785, 1789, 1793, 1797, 1801, 1803, 1807, + 1811, 1813, 1817, 1819, 1823, 1825, 1829, 1831, 1835, 1837, + 1841, 1843, 1844, 1845, 1853, 1855, 1859, 1863, 1867, 1871, + 1875, 1879, 1883, 1887, 1891, 1895, 1899, 1901, 1902, 1904, + 1907, 1915, 1918, 1921, 1929, 1936, 1939, 1943, 1946, 1950, + 1953, 1957, 1961, 1965, 1969, 1972, 1976, 1977, 1979, 1981, + 1983, 1985, 1987, 1989, 1991, 1993 +}; + +static const short yyrhs[] = { -1, + 183, 0, 184, 0, 183, 184, 0, 236, 405, 0, + 185, 0, 186, 0, 196, 0, 199, 0, 273, 0, + 1, 0, 75, 293, 306, 316, 306, 405, 281, 88, + 0, 75, 293, 306, 316, 306, 23, 281, 286, 285, + 405, 88, 0, 0, 76, 187, 188, 405, 88, 0, + 189, 0, 293, 306, 189, 0, 193, 0, 320, 193, + 0, 407, 0, 281, 24, 306, 316, 281, 25, 0, + 190, 26, 27, 0, 190, 26, 281, 272, 27, 306, + 0, 0, 190, 282, 24, 25, 191, 201, 0, 0, + 190, 282, 24, 317, 25, 192, 201, 0, 407, 0, + 281, 24, 306, 189, 281, 25, 0, 193, 26, 27, + 0, 193, 26, 281, 272, 27, 306, 0, 0, 193, + 282, 24, 25, 194, 203, 0, 0, 193, 282, 24, + 317, 25, 195, 203, 0, 0, 0, 77, 407, 24, + 317, 25, 197, 203, 198, 405, 88, 0, 89, 346, + 92, 0, 90, 333, 92, 0, 91, 334, 92, 0, + 89, 92, 0, 232, 0, 0, 202, 205, 0, 0, + 204, 206, 0, 213, 0, 207, 213, 0, 216, 0, + 207, 216, 0, 229, 0, 229, 207, 0, 209, 0, + 208, 21, 209, 0, 212, 210, 0, 406, 0, 176, + 0, 86, 0, 87, 0, 116, 0, 117, 0, 130, + 0, 0, 211, 212, 0, 0, 72, 214, 366, 405, + 88, 219, 0, 0, 72, 215, 208, 405, 88, 219, + 0, 74, 0, 220, 0, 0, 0, 72, 217, 366, + 405, 219, 0, 0, 72, 218, 208, 405, 219, 0, + 74, 0, 222, 0, 0, 220, 0, 0, 0, 73, + 221, 237, 0, 0, 73, 223, 238, 0, 78, 0, + 79, 0, 80, 0, 81, 0, 82, 0, 88, 0, + 88, 0, 83, 0, 84, 0, 119, 0, 137, 0, + 135, 0, 133, 0, 132, 0, 121, 0, 138, 0, + 150, 0, 0, 224, 306, 230, 243, 405, 226, 281, + 0, 0, 227, 306, 228, 231, 243, 405, 225, 281, + 0, 316, 0, 293, 306, 316, 0, 0, 19, 234, + 362, 0, 0, 366, 235, 355, 0, 200, 233, 0, + 241, 405, 88, 0, 405, 88, 0, 241, 405, 0, + 405, 0, 406, 0, 176, 0, 239, 26, 27, 0, + 239, 26, 240, 27, 0, 34, 239, 0, 24, 239, + 25, 0, 239, 28, 407, 0, 239, 44, 407, 0, + 239, 0, 178, 0, 239, 0, 241, 21, 239, 0, + 406, 0, 176, 0, 242, 26, 27, 0, 242, 26, + 240, 27, 0, 34, 242, 0, 24, 242, 25, 0, + 242, 28, 407, 0, 242, 44, 407, 0, 242, 0, + 243, 21, 242, 0, 406, 0, 176, 0, 178, 0, + 24, 270, 25, 0, 177, 0, 111, 0, 244, 0, + 245, 26, 270, 27, 0, 245, 24, 25, 0, 245, + 24, 246, 25, 0, 70, 24, 269, 21, 328, 25, + 0, 245, 306, 28, 407, 281, 0, 245, 306, 44, + 407, 281, 0, 245, 47, 0, 245, 48, 0, 269, + 0, 246, 21, 269, 0, 245, 0, 47, 247, 0, + 48, 247, 0, 29, 253, 0, 34, 253, 0, 33, + 253, 0, 32, 253, 0, 31, 253, 0, 30, 253, + 0, 250, 0, 249, 0, 248, 28, 407, 0, 407, + 0, 46, 281, 24, 328, 306, 21, 248, 25, 281, + 0, 0, 281, 251, 252, 0, 42, 24, 328, 25, + 0, 42, 247, 0, 43, 24, 328, 25, 0, 43, + 247, 0, 247, 0, 24, 328, 25, 253, 0, 253, + 0, 254, 34, 253, 0, 254, 35, 253, 0, 254, + 36, 253, 0, 254, 0, 255, 33, 254, 0, 255, + 32, 254, 0, 255, 0, 256, 49, 255, 0, 256, + 50, 255, 0, 256, 0, 257, 37, 256, 0, 257, + 38, 256, 0, 257, 51, 256, 0, 257, 52, 256, + 0, 257, 0, 258, 53, 257, 0, 258, 54, 257, + 0, 258, 0, 259, 29, 258, 0, 259, 0, 260, + 39, 259, 0, 260, 0, 261, 40, 260, 0, 261, + 0, 0, 262, 55, 263, 261, 0, 262, 0, 0, + 264, 56, 265, 262, 0, 264, 0, 0, 0, 264, + 41, 267, 270, 22, 268, 266, 0, 266, 0, 247, + 23, 269, 0, 247, 57, 269, 0, 247, 58, 269, + 0, 247, 59, 269, 0, 247, 60, 269, 0, 247, + 61, 269, 0, 247, 62, 269, 0, 247, 63, 269, + 0, 247, 64, 269, 0, 247, 65, 269, 0, 247, + 66, 269, 0, 269, 0, 270, 21, 269, 0, 0, + 270, 0, 266, 0, 274, 0, 71, 0, 279, 0, + 293, 281, 18, 0, 0, 293, 306, 316, 306, 275, + 281, 285, 18, 281, 0, 0, 293, 306, 316, 306, + 23, 276, 281, 286, 285, 18, 281, 0, 316, 306, + 0, 0, 316, 306, 23, 278, 281, 286, 0, 0, + 45, 293, 280, 306, 283, 281, 18, 0, 45, 293, + 281, 18, 0, 45, 283, 281, 18, 0, 0, 0, + 284, 281, 0, 277, 0, 283, 21, 306, 277, 0, + 0, 285, 21, 306, 277, 0, 269, 0, 19, 287, + 20, 0, 19, 287, 21, 20, 0, 286, 0, 287, + 21, 286, 0, 112, 0, 110, 0, 113, 0, 114, + 0, 115, 0, 108, 281, 0, 109, 281, 0, 116, + 281, 0, 117, 281, 0, 130, 281, 0, 131, 281, + 0, 132, 281, 0, 133, 281, 0, 118, 281, 0, + 120, 281, 0, 119, 281, 0, 128, 281, 0, 129, + 281, 0, 121, 281, 0, 123, 281, 0, 139, 281, + 0, 140, 281, 0, 142, 281, 0, 143, 281, 0, + 141, 281, 0, 136, 281, 0, 151, 281, 0, 134, + 281, 0, 135, 281, 0, 137, 281, 0, 124, 281, + 0, 127, 281, 0, 125, 281, 0, 126, 281, 0, + 156, 281, 0, 157, 281, 0, 148, 281, 0, 158, + 281, 0, 149, 281, 0, 152, 281, 0, 153, 281, + 0, 154, 281, 0, 155, 281, 0, 150, 281, 0, + 159, 281, 0, 160, 281, 0, 163, 281, 0, 164, + 281, 0, 161, 281, 0, 162, 281, 0, 147, 0, + 144, 0, 145, 0, 146, 0, 165, 306, 0, 167, + 306, 0, 166, 306, 0, 168, 306, 0, 169, 306, + 0, 170, 306, 0, 171, 306, 0, 172, 306, 0, + 173, 306, 0, 174, 306, 0, 408, 306, 0, 297, + 306, 0, 311, 306, 0, 290, 306, 0, 281, 293, + 281, 0, 295, 0, 295, 85, 294, 88, 0, 328, + 0, 328, 21, 294, 0, 288, 296, 0, 289, 296, + 0, 291, 296, 0, 0, 293, 0, 0, 0, 306, + 67, 407, 281, 19, 298, 359, 307, 360, 299, 20, + 0, 0, 0, 306, 68, 407, 281, 19, 300, 359, + 307, 360, 301, 20, 0, 306, 67, 407, 281, 19, + 20, 0, 306, 68, 407, 281, 19, 20, 0, 0, + 0, 306, 67, 281, 19, 302, 359, 307, 360, 303, + 20, 0, 0, 0, 306, 68, 281, 19, 304, 359, + 307, 360, 305, 20, 0, 306, 67, 281, 19, 20, + 0, 306, 68, 281, 19, 20, 0, 306, 67, 407, + 306, 0, 306, 68, 407, 306, 0, 0, 308, 0, + 199, 0, 307, 308, 0, 293, 306, 309, 281, 18, + 0, 293, 281, 18, 0, 310, 306, 0, 309, 21, + 310, 306, 0, 316, 0, 22, 281, 272, 0, 316, + 22, 281, 272, 0, 306, 69, 19, 313, 20, 281, + 0, 0, 306, 69, 407, 19, 312, 313, 20, 281, + 0, 306, 69, 407, 281, 0, 314, 0, 313, 21, + 314, 0, 313, 21, 0, 407, 0, 407, 23, 281, + 272, 0, 190, 0, 330, 0, 320, 181, 0, 320, + 315, 0, 190, 0, 320, 190, 0, 323, 0, 306, + 321, 0, 108, 0, 109, 0, 318, 0, 319, 318, + 0, 34, 0, 34, 319, 0, 34, 320, 0, 34, + 319, 320, 0, 322, 0, 322, 21, 5, 0, 407, + 0, 322, 21, 407, 0, 5, 0, 324, 0, 324, + 21, 5, 0, 0, 325, 327, 0, 0, 324, 21, + 326, 327, 0, 281, 293, 315, 281, 0, 407, 0, + 292, 0, 292, 329, 0, 320, 0, 331, 0, 320, + 331, 0, 0, 331, 0, 281, 24, 306, 329, 25, + 0, 26, 27, 0, 26, 272, 27, 0, 331, 26, + 27, 0, 331, 26, 272, 27, 0, 281, 24, 25, + 0, 281, 24, 323, 25, 0, 331, 281, 24, 25, + 0, 331, 281, 24, 323, 25, 0, 348, 0, 349, + 0, 352, 0, 355, 0, 368, 0, 371, 0, 402, + 0, 376, 0, 404, 0, 335, 0, 333, 0, 342, + 0, 335, 342, 0, 375, 335, 0, 401, 347, 11, + 24, 270, 25, 18, 0, 401, 347, 11, 24, 270, + 25, 0, 337, 342, 0, 0, 0, 13, 24, 271, + 18, 271, 18, 338, 271, 339, 25, 0, 0, 179, + 357, 24, 341, 379, 25, 0, 180, 0, 348, 0, + 349, 0, 352, 0, 344, 366, 0, 344, 0, 345, + 0, 368, 0, 343, 0, 336, 0, 340, 0, 404, + 0, 24, 342, 25, 0, 1, 0, 370, 342, 0, + 357, 19, 0, 361, 20, 0, 347, 0, 365, 0, + 348, 0, 349, 0, 352, 0, 356, 0, 369, 0, + 371, 0, 376, 0, 403, 0, 24, 347, 25, 0, + 404, 0, 1, 0, 407, 22, 0, 107, 332, 0, + 0, 6, 272, 350, 22, 0, 0, 98, 6, 272, + 351, 22, 0, 0, 7, 353, 22, 0, 0, 98, + 7, 354, 22, 0, 24, 355, 25, 0, 357, 363, + 0, 357, 364, 358, 0, 0, 0, 0, 0, 0, + 20, 0, 107, 20, 0, 367, 20, 0, 367, 107, + 20, 0, 366, 20, 0, 366, 107, 20, 0, 366, + 367, 20, 0, 366, 367, 107, 20, 0, 19, 362, + 0, 19, 20, 0, 19, 365, 20, 0, 19, 366, + 20, 0, 19, 366, 367, 20, 0, 347, 0, 365, + 347, 0, 273, 0, 366, 273, 0, 332, 0, 367, + 332, 0, 18, 0, 270, 18, 0, 18, 0, 270, + 18, 0, 270, 0, 8, 24, 270, 25, 0, 370, + 332, 0, 0, 370, 332, 9, 372, 332, 0, 0, + 10, 24, 270, 373, 25, 332, 0, 11, 24, 270, + 25, 0, 11, 24, 270, 25, 0, 0, 0, 179, + 377, 357, 24, 378, 379, 25, 355, 400, 358, 0, + 381, 0, 0, 379, 380, 21, 381, 0, 399, 0, + 406, 0, 177, 0, 176, 0, 178, 0, 24, 270, + 25, 0, 382, 0, 245, 26, 270, 27, 0, 245, + 24, 25, 0, 245, 24, 246, 25, 0, 70, 24, + 269, 21, 328, 25, 0, 245, 306, 28, 407, 281, + 0, 245, 306, 44, 407, 281, 0, 245, 47, 0, + 245, 48, 0, 383, 0, 47, 247, 0, 48, 247, + 0, 29, 253, 0, 34, 253, 0, 33, 253, 0, + 32, 253, 0, 31, 253, 0, 30, 253, 0, 250, + 0, 384, 0, 24, 328, 25, 253, 0, 385, 0, + 254, 34, 253, 0, 254, 35, 253, 0, 254, 36, + 253, 0, 386, 0, 255, 33, 254, 0, 255, 32, + 254, 0, 387, 0, 256, 49, 255, 0, 256, 50, + 255, 0, 388, 0, 257, 37, 256, 0, 257, 38, + 256, 0, 257, 51, 256, 0, 257, 52, 256, 0, + 389, 0, 258, 53, 257, 0, 258, 54, 257, 0, + 390, 0, 259, 29, 258, 0, 391, 0, 260, 39, + 259, 0, 392, 0, 261, 40, 260, 0, 393, 0, + 262, 55, 261, 0, 394, 0, 264, 56, 262, 0, + 395, 0, 0, 0, 264, 41, 397, 270, 22, 398, + 266, 0, 396, 0, 247, 23, 269, 0, 247, 57, + 269, 0, 247, 58, 269, 0, 247, 59, 269, 0, + 247, 60, 269, 0, 247, 61, 269, 0, 247, 62, + 269, 0, 247, 63, 269, 0, 247, 64, 269, 0, + 247, 65, 269, 0, 247, 66, 269, 0, 180, 0, + 0, 12, 0, 374, 332, 0, 401, 332, 11, 24, + 270, 25, 18, 0, 337, 332, 0, 374, 347, 0, + 401, 347, 11, 24, 270, 25, 18, 0, 401, 347, + 11, 24, 270, 25, 0, 337, 347, 0, 14, 407, + 18, 0, 15, 18, 0, 97, 15, 18, 0, 16, + 18, 0, 93, 16, 18, 0, 94, 16, 18, 0, + 95, 16, 18, 0, 96, 16, 18, 0, 17, 18, + 0, 17, 270, 18, 0, 0, 18, 0, 175, 0, + 176, 0, 179, 0, 180, 0, 406, 0, 177, 0, + 181, 0, 177, 0 +}; + +#endif + +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 232, 233, 236, 237, 240, 241, 242, 243, 244, 245, + 246, 249, 251, 255, 255, 260, 266, 270, 271, 275, + 276, 278, 280, 296, 300, 307, 311, 317, 318, 320, + 322, 338, 342, 349, 353, 359, 361, 361, 365, 366, + 367, 368, 371, 374, 375, 378, 379, 382, 383, 386, + 387, 390, 391, 394, 395, 398, 401, 402, 405, 406, + 407, 408, 409, 412, 413, 416, 416, 419, 419, 422, + 426, 427, 430, 430, 433, 433, 436, 440, 441, 444, + 445, 448, 454, 461, 467, 474, 475, 476, 477, 478, + 481, 484, 487, 488, 491, 492, 493, 494, 495, 496, + 497, 498, 501, 507, 514, 520, 529, 535, 539, 541, + 545, 548, 555, 563, 564, 567, 568, 571, 572, 573, + 574, 575, 576, 577, 578, 582, 583, 587, 588, 591, + 593, 595, 596, 597, 598, 599, 601, 605, 609, 621, + 622, 623, 624, 625, 626, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 640, 641, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 657, 658, 661, + 665, 666, 669, 670, 671, 672, 675, 676, 680, 681, + 682, 683, 686, 687, 688, 691, 692, 693, 696, 697, + 698, 699, 700, 703, 704, 705, 708, 709, 712, 713, + 717, 718, 721, 722, 727, 733, 734, 740, 746, 747, + 747, 749, 752, 753, 754, 755, 756, 757, 758, 759, + 760, 761, 762, 763, 766, 767, 770, 771, 774, 779, + 780, 781, 784, 797, 801, 802, 805, 810, 811, 811, + 816, 817, 818, 819, 822, 825, 828, 831, 832, 835, + 836, 839, 840, 841, 845, 847, 856, 857, 858, 859, + 860, 863, 864, 865, 866, 867, 868, 869, 870, 871, + 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, + 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, + 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, + 902, 903, 904, 905, 906, 907, 910, 911, 912, 913, + 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, + 926, 927, 928, 929, 932, 936, 937, 941, 942, 946, + 947, 948, 951, 952, 955, 957, 959, 960, 962, 964, + 965, 967, 969, 971, 973, 974, 976, 978, 979, 981, + 983, 984, 987, 990, 991, 992, 995, 997, 1001, 1003, + 1007, 1008, 1009, 1013, 1015, 1015, 1017, 1020, 1022, 1024, + 1027, 1032, 1039, 1040, 1041, 1048, 1052, 1053, 1057, 1058, + 1061, 1062, 1065, 1066, 1069, 1070, 1071, 1072, 1075, 1076, + 1079, 1080, 1083, 1084, 1085, 1088, 1088, 1089, 1090, 1093, + 1105, 1121, 1122, 1125, 1126, 1127, 1130, 1131, 1134, 1136, + 1137, 1138, 1139, 1140, 1142, 1144, 1146, 1152, 1153, 1154, + 1155, 1156, 1157, 1158, 1159, 1160, 1163, 1166, 1169, 1170, + 1174, 1176, 1178, 1180, 1184, 1185, 1187, 1191, 1193, 1195, + 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, + 1208, 1209, 1210, 1213, 1219, 1222, 1225, 1226, 1229, 1230, + 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1242, + 1243, 1249, 1250, 1251, 1252, 1255, 1256, 1257, 1258, 1261, + 1262, 1266, 1269, 1272, 1275, 1278, 1281, 1284, 1285, 1286, + 1287, 1289, 1290, 1292, 1294, 1301, 1305, 1307, 1309, 1311, + 1315, 1316, 1319, 1320, 1323, 1324, 1327, 1328, 1331, 1332, + 1333, 1336, 1344, 1349, 1350, 1354, 1355, 1358, 1363, 1366, + 1367, 1368, 1376, 1377, 1377, 1381, 1382, 1383, 1394, 1401, + 1402, 1405, 1406, 1407, 1408, 1409, 1411, 1412, 1413, 1414, + 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, + 1429, 1430, 1433, 1434, 1435, 1436, 1439, 1440, 1441, 1444, + 1445, 1446, 1449, 1450, 1451, 1452, 1453, 1456, 1457, 1458, + 1461, 1462, 1465, 1466, 1470, 1471, 1474, 1475, 1478, 1479, + 1482, 1483, 1484, 1485, 1488, 1489, 1490, 1491, 1492, 1493, + 1494, 1495, 1496, 1497, 1498, 1499, 1502, 1503, 1506, 1509, + 1511, 1513, 1517, 1518, 1520, 1522, 1525, 1526, 1527, 1529, + 1530, 1531, 1532, 1533, 1534, 1535, 1538, 1539, 1542, 1545, + 1546, 1547, 1548, 1549, 1552, 1553 +}; +#endif + + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const yytname[] = { "$","error","$undefined.","BADTOK", +"SKIPTOK","CTOK_ELIPSIS","CASE","DEFAULT","CIF","CELSE","SWITCH","WHILE","DO", +"CFOR","GOTO","CONTINUE","BREAK","RETURN","TSEMI","TLBRACE","TRBRACE","TCOMMA", +"TCOLON","TASSIGN","TLPAREN","TRPAREN","TLSQBR","TRSQBR","TDOT","TAMPERSAND", +"TEXCL","TTILDE","TMINUS","TPLUS","TMULT","TDIV","TPERCENT","TLT","TGT","TCIRC", +"TBAR","TQUEST","CSIZEOF","CALIGNOF","ARROW_OP","CTYPEDEF","COFFSETOF","INC_OP", +"DEC_OP","LEFT_OP","RIGHT_OP","LE_OP","GE_OP","EQ_OP","NE_OP","AND_OP","OR_OP", +"MUL_ASSIGN","DIV_ASSIGN","MOD_ASSIGN","ADD_ASSIGN","SUB_ASSIGN","LEFT_ASSIGN", +"RIGHT_ASSIGN","AND_ASSIGN","XOR_ASSIGN","OR_ASSIGN","CSTRUCT","CUNION","CENUM", +"VA_ARG","VA_DCL","QGLOBALS","QMODIFIES","QNOMODS","QCONSTANT","QFUNCTION","QITER", +"QDEFINES","QUSES","QALLOCATES","QSETS","QRELEASES","QPRECLAUSE","QPOSTCLAUSE", +"QALT","QUNDEF","QKILLED","QENDMACRO","LLMACRO","LLMACROITER","LLMACROEND","TENDMACRO", +"QSWITCHBREAK","QLOOPBREAK","QINNERBREAK","QSAFEBREAK","QINNERCONTINUE","QFALLTHROUGH", +"QLINTNOTREACHED","QLINTFALLTHROUGH","QLINTFALLTHRU","QARGSUSED","QPRINTFLIKE", +"QLINTPRINTFLIKE","QSCANFLIKE","QMESSAGELIKE","QNOTREACHED","QCONST","QVOLATILE", +"QINLINE","QEXTENSION","QEXTERN","QSTATIC","QAUTO","QREGISTER","QOUT","QIN", +"QYIELD","QONLY","QTEMP","QSHARED","QREF","QUNIQUE","QCHECKED","QUNCHECKED", +"QCHECKEDSTRICT","QCHECKMOD","QKEEP","QKEPT","QPARTIAL","QSPECIAL","QOWNED", +"QDEPENDENT","QRETURNED","QEXPOSED","QNULL","QOBSERVER","QISNULL","QEXITS","QMAYEXIT", +"QNEVEREXIT","QTRUEEXIT","QFALSEEXIT","QLONG","QSIGNED","QUNSIGNED","QSHORT", +"QUNUSED","QSEF","QNOTNULL","QRELNULL","QABSTRACT","QCONCRETE","QMUTABLE","QIMMUTABLE", +"QTRUENULL","QFALSENULL","QEXTERNAL","QREFCOUNTED","QREFS","QNEWREF","QTEMPREF", +"QKILLREF","QRELDEF","CGCHAR","CBOOL","CINT","CGFLOAT","CDOUBLE","CVOID","QANYTYPE", +"QINTEGRALTYPE","QUNSIGNEDINTEGRALTYPE","QSIGNEDINTEGRALTYPE","IDENTIFIER","NEW_IDENTIFIER", +"TYPE_NAME_OR_ID","CCONSTANT","ITER_NAME","ITER_ENDNAME","TYPE_NAME","file", +"externalDefs","externalDef","constantDecl","fcnDecl","@1","plainFcn","plainNamedDecl", +"namedDeclBase","@2","@3","plainNamedDeclBase","@4","@5","iterDecl","@6","@7", +"macroDef","fcnDefHdr","optGlobMods","@8","optPlainGlobMods","@9","optGlobModsRest", +"optPlainGlobModsRest","specialClauses","globIdList","globIdListExpr","globId", +"globQual","optGlobQuals","optGlobModsAux","@10","@11","optPlainGlobModsAux", +"@12","@13","optMods","fcnMods","@14","fcnPlainMods","@15","specialTag","endStateTag", +"endSpecialTag","stateSpecialClause","specialClauseType","specialClause","@16", +"@17","fcnDefHdrAux","fcnBody","@18","@19","fcnDef","locModifies","locPlainModifies", +"modListExpr","mExpr","modList","specClauseListExpr","specClauseList","primaryExpr", +"postfixExpr","argumentExprList","unaryExpr","fieldDesignator","offsetofExpr", +"sizeofExpr","@20","sizeofExprAux","castExpr","timesExpr","plusExpr","shiftExpr", +"relationalExpr","equalityExpr","bitandExpr","xorExpr","bitorExpr","andExpr", +"@21","orExpr","@22","conditionalExpr","@23","@24","assignExpr","expr","optExpr", +"constantExpr","initializer","instanceDecl","@25","@26","namedInitializer","@27", +"typeDecl","@28","IsType","PushType","namedInitializerList","namedInitializerListAux", +"optDeclarators","init","initList","storageSpecifier","typeQualifier","typeModifier", +"typeSpecifier","completeType","completeTypeSpecifier","altType","completeTypeSpecifierAux", +"optCompleteType","suSpc","@29","@30","@31","@32","@33","@34","@35","@36","NotType", +"structDeclList","structDecl","structNamedDeclList","structNamedDecl","enumSpc", +"@37","enumeratorList","enumerator","optNamedDecl","namedDecl","genericParamList", +"innerMods","innerModsList","pointers","paramIdList","idList","paramTypeList", +"paramList","@38","@39","paramDecl","typeExpression","abstractDecl","optAbstractDeclBase", +"abstractDeclBase","stmt","iterBody","endBody","iterDefStmtList","iterDefIterationStmt", +"forPred","@40","@41","partialIterStmt","@42","iterDefStmt","iterSelectionStmt", +"openScope","closeScope","macroBody","stmtErr","labeledStmt","caseStmt","@43", +"@44","defaultStmt","@45","@46","compoundStmt","compoundStmtErr","CreateInnerScope", +"DeleteInnerScope","CreateStructInnerScope","DeleteStructInnerScope","DeleteInnerScopeSafe", +"compoundStmtRest","compoundStmtAux","compoundStmtAuxErr","stmtListErr","initializerList", +"stmtList","expressionStmt","expressionStmtErr","ifPred","selectionStmt","@47", +"@48","whilePred","iterWhilePred","iterStmt","@49","@50","iterArgList","@51", +"iterArgExpr","primaryIterExpr","postfixIterExpr","unaryIterExpr","castIterExpr", +"timesIterExpr","plusIterExpr","shiftIterExpr","relationalIterExpr","equalityIterExpr", +"bitandIterExpr","xorIterExpr","bitorIterExpr","andIterExpr","orIterExpr","conditionalIterExpr", +"@52","@53","assignIterExpr","endIter","doHeader","iterationStmt","iterationStmtErr", +"jumpStmt","optSemi","id","newId","typeName", NULL +}; +#endif + +static const short yyr1[] = { 0, + 182, 182, 183, 183, 184, 184, 184, 184, 184, 184, + 184, 185, 185, 187, 186, 188, 188, 189, 189, 190, + 190, 190, 190, 191, 190, 192, 190, 193, 193, 193, + 193, 194, 193, 195, 193, 197, 198, 196, 199, 199, + 199, 199, 200, 202, 201, 204, 203, 205, 205, 206, + 206, 207, 207, 208, 208, 209, 210, 210, 211, 211, + 211, 211, 211, 212, 212, 214, 213, 215, 213, 213, + 213, 213, 217, 216, 218, 216, 216, 216, 216, 219, + 219, 221, 220, 223, 222, 224, 224, 224, 224, 224, + 225, 226, 227, 227, 228, 228, 228, 228, 228, 228, + 228, 228, 230, 229, 231, 229, 232, 232, 234, 233, + 235, 233, 236, 237, 237, 238, 238, 239, 239, 239, + 239, 239, 239, 239, 239, 240, 240, 241, 241, 242, + 242, 242, 242, 242, 242, 242, 242, 243, 243, 244, + 244, 244, 244, 244, 244, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 246, 246, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 248, 248, 249, + 251, 250, 252, 252, 252, 252, 253, 253, 254, 254, + 254, 254, 255, 255, 255, 256, 256, 256, 257, 257, + 257, 257, 257, 258, 258, 258, 259, 259, 260, 260, + 261, 261, 262, 263, 262, 264, 265, 264, 266, 267, + 268, 266, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 270, 270, 271, 271, 272, 273, + 273, 273, 274, 275, 274, 276, 274, 277, 278, 277, + 280, 279, 279, 279, 281, 282, 283, 284, 284, 285, + 285, 286, 286, 286, 287, 287, 288, 288, 288, 288, + 288, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 290, 290, 290, 290, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 292, 293, 293, 294, 294, 295, + 295, 295, 296, 296, 298, 299, 297, 300, 301, 297, + 297, 297, 302, 303, 297, 304, 305, 297, 297, 297, + 297, 297, 306, 307, 307, 307, 308, 308, 309, 309, + 310, 310, 310, 311, 312, 311, 311, 313, 313, 313, + 314, 314, 315, 315, 315, 315, 316, 316, 317, 317, + 318, 318, 319, 319, 320, 320, 320, 320, 321, 321, + 322, 322, 323, 323, 323, 325, 324, 326, 324, 327, + 327, 328, 328, 329, 329, 329, 330, 330, 331, 331, + 331, 331, 331, 331, 331, 331, 331, 332, 332, 332, + 332, 332, 332, 332, 332, 332, 333, 334, 335, 335, + 336, 336, 336, 336, 338, 339, 337, 341, 340, 340, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 343, 344, 345, 346, 346, 347, 347, + 347, 347, 347, 347, 347, 347, 347, 347, 347, 348, + 348, 350, 349, 351, 349, 353, 352, 354, 352, 355, + 355, 356, 357, 358, 359, 360, 361, 362, 362, 362, + 362, 362, 362, 362, 362, 363, 364, 364, 364, 364, + 365, 365, 366, 366, 367, 367, 368, 368, 369, 369, + 369, 370, 371, 372, 371, 373, 371, 374, 375, 377, + 378, 376, 379, 380, 379, 381, 381, 381, 381, 382, + 382, 383, 383, 383, 383, 383, 383, 383, 383, 383, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 385, 385, 386, 386, 386, 386, 387, 387, 387, 388, + 388, 388, 389, 389, 389, 389, 389, 390, 390, 390, + 391, 391, 392, 392, 393, 393, 394, 394, 395, 395, + 396, 397, 398, 396, 399, 399, 399, 399, 399, 399, + 399, 399, 399, 399, 399, 399, 400, 400, 401, 402, + 402, 402, 403, 403, 403, 403, 404, 404, 404, 404, + 404, 404, 404, 404, 404, 404, 405, 405, 406, 407, + 407, 407, 407, 407, 408, 408 +}; + +static const short yyr2[] = { 0, + 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, + 1, 8, 11, 0, 5, 1, 3, 1, 2, 1, + 6, 3, 6, 0, 6, 0, 7, 1, 6, 3, + 6, 0, 6, 0, 7, 0, 0, 10, 3, 3, + 3, 2, 1, 0, 2, 0, 2, 1, 2, 1, + 2, 1, 2, 1, 3, 2, 1, 1, 1, 1, + 1, 1, 1, 0, 2, 0, 6, 0, 6, 1, + 1, 0, 0, 5, 0, 5, 1, 1, 0, 1, + 0, 0, 3, 0, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 7, 0, 8, 1, 3, 0, 3, + 0, 3, 2, 3, 2, 2, 1, 1, 1, 3, + 4, 2, 3, 3, 3, 1, 1, 1, 3, 1, + 1, 3, 4, 2, 3, 3, 3, 1, 3, 1, + 1, 1, 3, 1, 1, 1, 4, 3, 4, 6, + 5, 5, 2, 2, 1, 3, 1, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 1, 3, 1, 9, + 0, 3, 4, 2, 4, 2, 1, 4, 1, 3, + 3, 3, 1, 3, 3, 1, 3, 3, 1, 3, + 3, 3, 3, 1, 3, 3, 1, 3, 1, 3, + 1, 3, 1, 0, 4, 1, 0, 4, 1, 0, + 0, 7, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 1, 3, 0, 1, 1, 1, + 1, 1, 3, 0, 9, 0, 11, 2, 0, 6, + 0, 7, 4, 4, 0, 0, 2, 1, 4, 0, + 4, 1, 3, 4, 1, 3, 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, 2, 2, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 1, 4, 1, 3, 2, + 2, 2, 0, 1, 0, 0, 11, 0, 0, 11, + 6, 6, 0, 0, 10, 0, 0, 10, 5, 5, + 4, 4, 0, 1, 1, 2, 5, 3, 2, 4, + 1, 3, 4, 6, 0, 8, 4, 1, 3, 2, + 1, 4, 1, 1, 2, 2, 1, 2, 1, 2, + 1, 1, 1, 2, 1, 2, 2, 3, 1, 3, + 1, 3, 1, 1, 3, 0, 2, 0, 4, 4, + 1, 1, 2, 1, 1, 2, 0, 1, 5, 2, + 3, 3, 4, 3, 4, 4, 5, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 7, 6, 2, 0, 0, 10, 0, 6, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, + 2, 0, 4, 0, 5, 0, 3, 0, 4, 3, + 2, 3, 0, 0, 0, 0, 0, 1, 2, 2, + 3, 2, 3, 3, 4, 2, 2, 3, 3, 4, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 4, 2, 0, 5, 0, 6, 4, 4, 0, + 0, 10, 1, 0, 4, 1, 1, 1, 1, 1, + 3, 1, 4, 3, 4, 6, 5, 5, 2, 2, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, + 1, 4, 1, 3, 3, 3, 1, 3, 3, 1, + 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, + 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, + 1, 0, 0, 7, 1, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 1, 0, 1, 2, + 7, 2, 2, 7, 6, 2, 3, 2, 3, 2, + 3, 3, 3, 3, 2, 3, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1 +}; + +static const short yydefact[] = { 0, + 11, 385, 353, 231, 353, 14, 0, 0, 0, 0, + 245, 245, 258, 257, 259, 260, 261, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 308, 309, 310, 307, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 353, 353, 353, 353, 353, 353, + 353, 353, 353, 353, 619, 620, 624, 621, 622, 625, + 0, 3, 6, 7, 377, 8, 9, 353, 43, 617, + 10, 230, 232, 0, 333, 333, 353, 333, 353, 326, + 353, 0, 353, 107, 245, 623, 20, 353, 381, 382, + 383, 386, 387, 248, 245, 245, 241, 353, 626, 353, + 353, 624, 0, 469, 245, 476, 0, 0, 0, 599, + 0, 0, 0, 0, 245, 509, 0, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 0, 42, 0, 0, + 0, 0, 0, 0, 245, 145, 141, 144, 142, 520, + 146, 157, 177, 167, 166, 179, 183, 186, 189, 194, + 197, 199, 201, 203, 206, 209, 213, 225, 511, 171, + 0, 0, 501, 459, 460, 461, 462, 0, 0, 463, + 245, 464, 0, 465, 0, 466, 468, 140, 0, 453, + 0, 507, 0, 483, 440, 0, 0, 0, 449, 0, + 450, 429, 448, 445, 446, 441, 442, 443, 0, 0, + 447, 0, 0, 0, 451, 428, 0, 262, 263, 264, + 265, 270, 272, 271, 275, 276, 287, 289, 290, 288, + 273, 274, 266, 267, 268, 269, 284, 285, 282, 286, + 277, 278, 281, 279, 280, 293, 295, 300, 283, 296, + 297, 298, 299, 291, 292, 294, 301, 302, 305, 306, + 303, 304, 311, 313, 312, 314, 315, 316, 317, 318, + 319, 320, 4, 245, 0, 109, 113, 503, 353, 353, + 618, 5, 353, 334, 330, 331, 324, 332, 0, 245, + 245, 322, 245, 245, 0, 323, 378, 321, 384, 388, + 353, 0, 247, 353, 0, 238, 245, 617, 16, 18, + 0, 353, 245, 28, 396, 245, 141, 144, 177, 229, + 472, 140, 0, 245, 245, 245, 245, 0, 608, 610, + 615, 0, 0, 353, 402, 0, 0, 160, 165, 164, + 163, 162, 161, 0, 245, 158, 159, 245, 0, 0, + 0, 0, 0, 245, 478, 245, 471, 245, 418, 419, + 420, 421, 0, 422, 423, 245, 425, 245, 424, 426, + 483, 245, 245, 153, 154, 0, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 204, 210, 207, 510, 245, 0, 606, + 39, 0, 484, 502, 513, 603, 0, 470, 245, 0, + 0, 0, 508, 40, 430, 434, 444, 455, 456, 454, + 0, 0, 41, 22, 245, 396, 353, 245, 483, 504, + 245, 233, 108, 353, 0, 328, 0, 353, 0, 353, + 0, 245, 245, 244, 245, 243, 239, 353, 0, 245, + 0, 353, 245, 19, 393, 0, 0, 379, 394, 245, + 0, 0, 477, 0, 516, 0, 228, 0, 607, 616, + 143, 245, 245, 0, 404, 403, 405, 245, 467, 245, + 0, 611, 612, 613, 614, 609, 474, 0, 0, 602, + 353, 481, 600, 0, 0, 148, 0, 155, 0, 0, + 0, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 180, 181, 182, 185, 184, 187, 188, 190, + 191, 192, 193, 195, 196, 198, 200, 202, 245, 245, + 245, 226, 245, 245, 172, 497, 144, 501, 0, 353, + 482, 514, 0, 0, 452, 438, 0, 0, 24, 0, + 488, 245, 505, 110, 353, 245, 353, 483, 112, 245, + 234, 327, 245, 343, 0, 351, 346, 0, 352, 0, + 368, 371, 365, 367, 249, 245, 245, 617, 15, 30, + 245, 396, 245, 17, 380, 389, 391, 36, 398, 353, + 397, 401, 473, 512, 0, 518, 245, 325, 410, 0, + 396, 406, 245, 0, 178, 353, 245, 0, 479, 480, + 496, 0, 521, 245, 149, 147, 245, 245, 205, 0, + 208, 245, 174, 245, 176, 498, 499, 245, 245, 245, + 519, 245, 245, 353, 44, 26, 489, 492, 245, 245, + 490, 245, 506, 0, 236, 245, 329, 349, 485, 335, + 350, 485, 338, 245, 370, 245, 0, 0, 245, 245, + 245, 0, 32, 0, 245, 0, 46, 395, 245, 407, + 245, 0, 411, 414, 245, 0, 412, 0, 396, 0, + 0, 475, 245, 245, 156, 151, 152, 211, 0, 0, + 500, 515, 0, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 0, 141, 144, 142, 157, 177, 166, 183, + 186, 189, 194, 197, 199, 201, 203, 206, 0, 524, + 523, 532, 541, 551, 553, 557, 560, 563, 568, 571, + 573, 575, 577, 579, 581, 585, 526, 140, 0, 23, + 25, 72, 44, 493, 494, 245, 491, 21, 245, 250, + 353, 341, 485, 353, 342, 485, 364, 369, 245, 0, + 242, 245, 252, 240, 245, 0, 353, 46, 34, 0, + 390, 392, 37, 79, 399, 373, 0, 245, 407, 374, + 408, 517, 435, 0, 415, 413, 416, 0, 0, 150, + 0, 524, 245, 173, 175, 605, 0, 0, 160, 165, + 164, 163, 162, 161, 158, 159, 245, 245, 245, 153, + 154, 0, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 204, + 582, 207, 439, 0, 433, 66, 82, 70, 86, 87, + 88, 89, 90, 93, 94, 45, 72, 48, 71, 353, + 353, 52, 27, 495, 245, 0, 355, 353, 353, 354, + 353, 353, 353, 372, 245, 255, 0, 250, 12, 31, + 33, 46, 29, 617, 73, 84, 77, 47, 79, 50, + 78, 396, 400, 375, 376, 245, 409, 417, 0, 169, + 0, 483, 212, 604, 143, 245, 0, 148, 0, 0, + 0, 0, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 180, 181, 182, 185, 184, 187, 188, + 190, 191, 192, 193, 195, 196, 198, 200, 202, 578, + 245, 580, 245, 432, 353, 64, 617, 49, 103, 0, + 53, 250, 245, 353, 0, 245, 356, 344, 353, 347, + 353, 366, 253, 245, 617, 35, 0, 353, 64, 617, + 51, 245, 436, 245, 0, 601, 598, 178, 245, 149, + 147, 245, 245, 0, 525, 353, 59, 60, 61, 62, + 63, 617, 54, 64, 0, 0, 0, 119, 83, 128, + 617, 0, 118, 0, 95, 100, 99, 98, 97, 96, + 101, 102, 105, 0, 235, 245, 358, 245, 245, 353, + 361, 0, 336, 0, 339, 254, 256, 0, 38, 617, + 617, 85, 617, 117, 245, 0, 170, 168, 597, 484, + 0, 151, 152, 583, 0, 64, 0, 65, 58, 56, + 57, 0, 122, 0, 0, 0, 0, 0, 115, 0, + 0, 131, 138, 617, 130, 0, 245, 251, 245, 245, + 0, 359, 245, 345, 0, 348, 0, 13, 81, 81, + 116, 437, 522, 150, 245, 81, 55, 81, 123, 120, + 127, 126, 0, 124, 125, 129, 114, 0, 134, 0, + 0, 0, 0, 0, 617, 237, 362, 353, 357, 245, + 337, 340, 74, 80, 76, 584, 67, 69, 121, 135, + 132, 0, 136, 137, 139, 92, 245, 0, 360, 363, + 133, 104, 91, 245, 106, 0, 0, 0 +}; + +static const short yydefgoto[] = { 1156, + 81, 82, 83, 84, 121, 318, 319, 85, 655, 763, + 320, 788, 902, 86, 687, 904, 887, 88, 761, 762, + 793, 794, 876, 908, 877, 1012, 1013, 1070, 1014, 1015, + 878, 965, 966, 910, 988, 989, 1133, 1134, 967, 911, + 990, 880, 1154, 1147, 881, 1033, 882, 1024, 1086, 89, + 287, 447, 449, 90, 1019, 1052, 1020, 1113, 1021, 1083, + 1084, 161, 162, 517, 163, 919, 164, 165, 419, 555, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 549, 176, 551, 177, 550, 813, 178, 206, 488, 331, + 288, 92, 666, 769, 114, 597, 93, 314, 180, 285, + 115, 116, 886, 784, 897, 95, 96, 97, 98, 345, + 289, 455, 100, 295, 101, 773, 1095, 776, 1097, 669, + 1042, 672, 1044, 102, 889, 890, 1039, 1040, 103, 677, + 590, 591, 798, 118, 477, 111, 112, 105, 605, 606, + 478, 479, 480, 689, 611, 346, 804, 800, 497, 367, + 207, 227, 208, 209, 368, 916, 1056, 211, 652, 212, + 213, 214, 215, 182, 424, 369, 370, 482, 628, 371, + 333, 508, 372, 187, 373, 561, 771, 978, 220, 574, + 512, 423, 189, 575, 576, 374, 190, 191, 375, 649, + 615, 376, 223, 377, 381, 704, 740, 864, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 961, 1105, 757, 1060, 378, 379, + 196, 380, 292, 332, 199, 108 +}; + +static const short yypact[] = { 2004, +-32768, 118, 5457,-32768, 6254,-32768, 781, 2949, 3313, 3313, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 460,-32768,-32768,-32768, + 2186,-32768,-32768,-32768, 350,-32768,-32768, 5201,-32768, 123, +-32768,-32768,-32768, 145, 6095, 6095,-32768, 6095, 176, 51, +-32768, 557,-32768,-32768, 781,-32768,-32768,-32768,-32768,-32768, +-32768, 118,-32768,-32768, 183,-32768, 176,-32768,-32768,-32768, + 5457,-32768, 208,-32768, 5072,-32768, 264, 271, 330,-32768, + 345, 781, 257, 366, 1104,-32768, 2544, 5072, 5072, 5072, + 5072, 5072, 5072,-32768, 5611, 5611, 382,-32768, 400, 429, + 436, 441, 451, 326, 4659,-32768, 483, 496,-32768, 501, +-32768, 502, 884,-32768,-32768,-32768, 747, 601, 724, 650, + 807, 498, 459, 492, 485, 121,-32768,-32768, 313,-32768, + 3452, 477, 482,-32768,-32768,-32768,-32768, 533, 3088,-32768, + 4659,-32768, 3452,-32768, 3452,-32768,-32768, 569, 584,-32768, + 577,-32768, 2725, 501, 596, 338, 576, 3131,-32768, 3313, +-32768,-32768,-32768, 5854,-32768,-32768,-32768,-32768, 656, 657, +-32768, 3313, 3313, 3452,-32768,-32768, 592,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 664, 673,-32768,-32768,-32768, 176, 5045, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 690, 559, +-32768,-32768, 781, 781, 76,-32768, 350,-32768,-32768,-32768, +-32768, 695,-32768,-32768, 697, 680, 559, 123,-32768, 373, + 693,-32768, 781,-32768, 91, 5072,-32768,-32768,-32768,-32768, +-32768,-32768, 711, 5072, 5072, 5072, 1907, 735,-32768,-32768, +-32768, 469, 443, 5724, 186, 718, 741,-32768,-32768,-32768, +-32768,-32768,-32768, 737, 5072,-32768,-32768, 5072, 768, 770, + 777, 784, 802, 5072,-32768, 1933,-32768, 4659,-32768,-32768, +-32768,-32768, 812,-32768,-32768, 4659,-32768, 4659,-32768,-32768, +-32768, 3481, 5072,-32768,-32768, 106, 5072, 5072, 5072, 5072, + 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, + 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, + 5072, 5072, 5072,-32768,-32768,-32768,-32768, 5072, 842,-32768, +-32768, 2363,-32768,-32768, 828,-32768, 840,-32768, 5072, 629, + 814, 830,-32768,-32768,-32768,-32768, 5854,-32768,-32768,-32768, + 2906, 847,-32768,-32768, 5072, 97, 3554, 559, 851,-32768, + 559,-32768, 284, 6254, 778, 856, 868, 878, 886, 878, + 781, 900, 559,-32768, 559,-32768,-32768,-32768, 806, 905, + 929,-32768, 559, 373,-32768, 781, 912,-32768, 919, 781, + 98, 940,-32768, 446, 946, 512, 946, 951,-32768,-32768, +-32768,-32768, 1472, 948, 404,-32768, 450, 5072,-32768,-32768, + 954,-32768,-32768,-32768,-32768,-32768,-32768, 955, 957,-32768, + 3554,-32768,-32768, 975, 969,-32768, 537,-32768, 371, 781, + 781,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768, 747, 747, 601, 601, 724, + 724, 724, 724, 650, 650, 807, 498, 459, 5072, 5072, + 5072,-32768, 5622, 5642,-32768,-32768, 5387,-32768, 3270, 3730, +-32768,-32768, 974, 561,-32768,-32768, 977, 984,-32768, 989, +-32768, 4082,-32768,-32768, 3906, 4125,-32768, 851,-32768,-32768, + 965,-32768,-32768, 1006, 1022,-32768, 1011, 1028,-32768, 882, +-32768, 1000,-32768,-32768,-32768, 183,-32768, 137,-32768,-32768, + 5072, 171, 559,-32768,-32768, 1044,-32768,-32768, 1070, 6254, +-32768,-32768,-32768,-32768, 1052,-32768, 1907,-32768,-32768, 1061, + 723, 450, 4217, 1056,-32768,-32768,-32768, 1067,-32768,-32768, +-32768, 1071,-32768, 5072,-32768,-32768,-32768,-32768, 492, 888, + 485, 5072,-32768, 5072,-32768,-32768,-32768, 4260, 4659, 5072, +-32768, 5653, 5072,-32768,-32768,-32768,-32768,-32768, 4303, 4438, +-32768, 4481,-32768, 1069,-32768,-32768,-32768,-32768,-32768, 1076, +-32768,-32768, 1077,-32768, 781,-32768, 781, 1087, 3366,-32768, +-32768, 1081,-32768, 1084,-32768, 103,-32768,-32768, 781, 736, + 4659, 1092,-32768,-32768, 309, 1086,-32768, 1085, 126, 1093, + 1088,-32768, 5072, 5653,-32768,-32768,-32768,-32768, 1094, 1095, +-32768,-32768, 563, 5072, 5072, 5072, 5072, 5072, 5072, 5072, + 5611, 5611, 1097, 587, 631, 634, 761, 1125, 642, 783, + 963, 1003, 726, 1015, 1089, 1078, 1083, 1074, 201, 1099, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768, 684, 685,-32768, +-32768, 1157,-32768,-32768,-32768, 4616,-32768,-32768,-32768,-32768, + 6184,-32768,-32768, 6184,-32768,-32768,-32768,-32768, 5072, 1051, +-32768, 3366,-32768,-32768, 3366, 1037,-32768,-32768,-32768, 1105, +-32768,-32768,-32768, 1306,-32768, 350, 1107,-32768, 692,-32768, + 450,-32768,-32768, 1114,-32768,-32768,-32768, 1115, 781,-32768, + 704, 1124, 5072,-32768,-32768, 1135, 719, 1130, 720, 725, + 779, 817, 819, 825, 831, 857, 5072, 4395, 5072, 875, + 913, 139, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, + 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, + 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, +-32768, 5072,-32768, 1111, 1138, 72,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 987,-32768,-32768,-32768, +-32768, 845,-32768,-32768, 3366, 478,-32768, 176, 5271,-32768, + 6184, 5271, 6184,-32768,-32768,-32768, 1053,-32768,-32768,-32768, +-32768,-32768,-32768, 123, 138,-32768,-32768,-32768, 990,-32768, +-32768, 636,-32768,-32768,-32768, 4916,-32768,-32768, 514,-32768, + 1139, 851,-32768,-32768, 938, 5072, 1140, 964, 966, 390, + 781, 781,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 985, 988, 991, 543, 983, 212, 456, + 354, 360, 393, 522, 398, 811, 132, 408, 260, 492, + 5072, 485, 5653,-32768, 5984, 62, 122,-32768,-32768, 833, +-32768,-32768,-32768,-32768, 1141, 327,-32768,-32768, 5271,-32768, + 5271,-32768,-32768, 3227, 571,-32768, 1072, 5984, 62, 122, +-32768, 617,-32768,-32768, 781,-32768, 992, 999,-32768, 1004, + 1007,-32768,-32768, 1062,-32768, 4889,-32768,-32768,-32768,-32768, +-32768, 628,-32768, 62, 916, 60, 60,-32768,-32768, 266, + 665, 1079,-32768, 140,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 709,-32768, 559,-32768,-32768, 1143,-32768, + 1146, 1149,-32768, 1150,-32768,-32768,-32768, 1090,-32768, 4732, + 628,-32768, 665,-32768, 579, 1148,-32768,-32768,-32768,-32768, + 1151, 1012, 1023,-32768, 1091, 62, 1108,-32768,-32768,-32768, +-32768, 117, 266, 381, 781, 781, 60, 1109,-32768, 140, + 140,-32768, 336, 750,-32768, 140,-32768,-32768, 5072, 327, + 1153,-32768,-32768,-32768, 1155,-32768, 1161,-32768, 1119, 1119, +-32768,-32768,-32768, 1025, 5072, 1119,-32768, 1119,-32768,-32768, +-32768, 266, 1166,-32768,-32768, 266,-32768, 457, 336, 445, + 781, 781, 140, 1112, 750,-32768,-32768,-32768,-32768, 5072, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, 1168,-32768,-32768, 336,-32768,-32768, 1113,-32768,-32768, +-32768,-32768,-32768,-32768,-32768, 1177, 1199,-32768 +}; + +static const short yypgoto[] = {-32768, +-32768, 1123,-32768,-32768,-32768,-32768, -388, -100,-32768,-32768, + 883,-32768,-32768,-32768,-32768,-32768, 112,-32768, 447,-32768, + -679,-32768,-32768,-32768, -693, 219, 147,-32768,-32768, 203, + 341,-32768,-32768, 310,-32768,-32768, -918, -659,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, -890, 100, 232, -942, + 141,-32768, -586, 397, 961,-32768,-32768, -580,-32768,-32768, + 581, -334, -333, -332, -331, -346, -365, -315, -532, -538, +-32768, -572,-32768, -115,-32768,-32768, 1073, 1068, -534, -358, + 1,-32768,-32768,-32768, -461,-32768,-32768,-32768, 0, -274, + 767,-32768, -765, -694,-32768,-32768,-32768,-32768,-32768,-32768, + 165, 651,-32768, 414,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 756, -674, -782,-32768, 143,-32768,-32768, + 565, 568, 452, 8, -401, 1132,-32768, 42,-32768,-32768, + -552,-32768,-32768,-32768, 556, -287, 907,-32768, -488, 467, + 1240,-32768, 1030,-32768, 392,-32768,-32768,-32768,-32768, -97, +-32768,-32768,-32768,-32768, 172, 1133, 1411,-32768,-32768, 1435, +-32768,-32768, -357,-32768, 1336, 194, -568, -806,-32768, 745, +-32768,-32768, 836, -84, -306, 6,-32768, 119, 69,-32768, +-32768, 251,-32768, 476,-32768,-32768, 555,-32768, 297,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1556,-32768, +-32768, 1646, -120, 231, 90,-32768 +}; + + +#define YYLAST 6435 + + +static const short yytable[] = { 94, + 91, 595, 94, 290, 307, 507, 622, 104, 509, 330, + 228, 229, 641, 456, 221, 221, 639, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 113, 570, 471, 547, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 546, 727, 536, 537, 696, 538, + 539, 729, 540, 541, 542, 543, 192, 544, 545, 739, + 94, 91, 692, 1016, 604, 980, 568, 896, 104, 107, + 898, 579, 107, 1017, 461, 475, 123, 548, 299, 892, + 909, 475, 879, 774, 94, 431, 977, 791, 901, 977, + 435, 87, 436, 738, 312, 313, 315, 727, 418, 737, + 321, 569, 491, 729, 440, 1072, 1073, 222, 222, 437, + 475, 739, 985, 520, 620, 301, 344, 1118, 1119, 291, + 291, 1109, 1074, 354, 1075, 1016, 808, 1007, 1008, 521, + 807, 2, -572, 310, 291, 1017, -572, -68, -68, 680, + 1076, 415, 323, 1080, 99, 738, 931, 117, 293, 120, + 107, 737, 1043, 1081, 1045, 475, 416, 1009, 1010, 183, + 1145, 1135, 932, 1112, 409, 410, 1116, 1137, 971, 1138, + 972, 1011, 87, -245, 107, 683, 977, 469, 977, 471, + 684, 801, 344, 311, 891, 192, 1034, 893, 221, -245, + 324, 493, 626, 221, 685, 221, 979, 879, 981, 2, + 509, 338, 986, -75, -75, 109, 110, 221, 221, 1112, + 106, 325, -561, 106, 75, 1018, -561, 106, 198, 198, + 198, 861, 682, 401, 402, 99, -68, -68, 330, 192, + 75, 76, 122, 648, 78, 79, 862, 192, 193, 294, + 294, 192, 294, 192, 698, -353, -353, -353, 660, -353, + -353, -353, -353, -353, 339, -353, -353, 75, 76, 122, + -576, 78, 79, 445, -576, 322, 735, 334, 299, 1047, + 450, 1074, 192, 1075, 335, 456, 75, 1018, 412, 94, + 454, -353, 457, 459, -353, 734, -353, 453, 347, 1076, + 801, 106, -75, -75, 75, 1082, 94, 730, 731, 732, + 733, 222, 321, 962, 468, 344, 222, 960, 222, 330, + 417, 364, 365, 418, 493, 106, 736, 560, 735, 701, + 222, 222, 2, 435, 494, -353, -353, -353, 1038, -353, + -353, 106, 420, 336, 709, 433, 710, 734, 418, 696, + 2, 1120, 106, 1121, 426, 344, 427, 198, 337, 730, + 731, 732, 733, -246, -564, 284, 727, 330, -564, 1122, + -565, 993, 729, 340, -565, 198, 495, 193, 736, 107, + 739, 418, 458, 460, 462, 442, -246, 636, 470, 181, + 210, 210, 403, 404, 1016, 358, 107, 1110, 403, 404, + 418, 198, 324, -566, 1017, 359, 1001, -566, -569, 198, + 894, 198, -569, 198, 738, 198, 818, -245, -574, 493, + 737, 193, -574, 198, 405, 406, 411, 450, 198, 193, + 198, 403, 404, 193, 360, 193, 221, 94, 407, 408, + 94, 361, 198, 198, 198, 577, 362, 585, 580, 588, + 417, 594, 94, 418, 94, 363, 418, 491, 1016, 601, + 614, 1141, 321, -245, 193, 623, -562, 681, 1017, 610, + -562, 1140, 1120, 194, 1121, 330, 490, 401, 402, 418, + 192, 618, 958, -626, 494, 973, 624, 412, 974, 454, + 1122, 75, 76, 122, -620, 78, 79, 330, 492, 296, + 957, 298, 947, 948, 323, 949, 950, -624, 951, 952, + 953, 954, -621, 955, 956, 382, 411, 383, 181, -353, + 106, 413, 418, 106, 106, 106, 616, 107, 994, 414, + 107, 995, -567, 959, -626, -353, -567, 106, 384, 385, + 592, 422, 107, 106, 107, 75, 1018, 634, 1111, 222, + 450, 635, 324, -559, 997, 607, 622, -559, 421, 612, + 403, 404, 181, -457, 1088, 450, 398, 399, 400, 664, + 181, 418, 454, 418, 181, 651, 181, 816, 291, 796, + -623, 974, 2, 558, 210, 678, 679, 735, 198, 210, + 429, 210, 321, -404, 493, 428, 198, -529, 198, 637, + 638, -529, 194, 210, 210, 181, 734, -622, 492, 75, + 1018, 624, 1111, 303, 304, 305, 454, 192, 730, 731, + 732, 733, 401, 402, -626, -626, 706, 707, -626, -626, + 475, 344, 493, 344, 323, 291, 433, 736, 1066, 418, + 2, -528, 198, 491, -530, -528, 194, 425, -530, -353, + 694, -353, -550, 330, 194, 770, -550, 434, 194, -353, + 194, 198, 193, 777, 438, 779, 439, 198, 106, 785, + 786, 106, 291, 443, 790, 1077, 405, 406, 610, 797, + 444, 106, 324, 106, 494, 106, 446, 923, 796, 194, + 407, 408, 467, 106, -527, 418, 106, 452, -527, 865, + 106, 1061, 464, 344, 466, -245, 472, 493, 348, 349, + 350, 351, 352, 353, 418, 2, 1087, 475, 921, 974, + 1127, 799, 483, 75, 76, 122, 495, 78, 79, 418, + -544, 198, 498, 925, -544, -549, -353, 694, -353, -549, + 106, 106, 489, 75, 76, 122, -353, 78, 79, -245, + 500, 493, 851, 852, 592, 499, 592, 291, 885, 2, + 1123, 1150, 403, 404, 690, 792, 853, 854, 612, 107, + 398, 399, 400, 987, 828, 502, 829, 503, -353, 198, + 198, 75, 76, 122, 504, 78, 79, 913, 797, -548, + 624, 505, 198, -548, -353, 198, 198, 830, 831, 193, + -353, -353, -353, 181, -353, -353, 844, 845, 846, 506, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 511, -570, 210, 106, 510, -570, 562, -547, 565, -546, + 799, -547, 513, -546, 514, -545, 1022, 405, 406, -545, + 563, -542, 297, 566, 300, -542, 302, 567, 306, 409, + 410, 407, 408, 308, 1048, 582, 75, 76, 122, 1054, + 78, 79, 914, 316, 578, 317, 583, -543, 198, 198, + 1006, -543, 758, 553, 554, 1065, 584, 975, 107, 198, + 198, 1067, 198, 599, 982, -539, -245, 194, 920, -539, + 1078, 674, 675, 1050, 587, 106, 387, 106, 418, 708, + 75, 76, 122, 573, 78, 79, 106, 386, 593, 106, + 106, 198, 869, 870, 871, 872, 873, 874, 875, 1099, + 1100, 600, 1101, -540, 758, 888, 608, -540, 888, 609, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 181, 1025, 602, 1026, 307, 75, 76, 122, -531, 78, + 79, 613, -531, 1124, 1027, 1028, 418, 1029, 617, 1030, + 1031, 621, 1035, 330, 627, 94, 629, 573, 533, 534, + 535, 630, 1032, 1041, -534, 632, 634, 665, -534, 1136, + 1000, 797, 633, 1057, 847, 848, 198, 650, 454, 580, + 653, 1062, 1063, -558, 1148, -554, 450, -558, -555, -554, + 654, -556, -555, 656, 330, -556, 398, 399, 400, -552, + 1002, 1003, 676, -552, -535, 668, 573, -533, -535, 106, + 671, -533, -537, 1055, 194, 94, -537, 1089, 1091, 106, + 670, 573, 663, -538, 448, -536, 673, -538, 451, -536, + 450, 849, 850, 888, 797, 888, 888, 888, 866, 867, + 868, 905, 906, 907, 686, 107, 463, 855, 856, 465, + 895, 675, 983, 984, 688, 179, 691, 473, 625, 699, + 476, 107, 418, 1064, 1058, 329, 1126, 693, 702, 94, + 75, 1069, 1130, 768, 703, 772, 775, 1041, 329, 329, + 329, 329, 329, 329, 781, 356, 357, 787, 789, 803, + 805, 806, 810, 809, 663, 712, 858, 857, 814, 815, + 827, 341, 859, 863, 899, 107, 663, 326, 860, 903, + 912, 963, 138, 139, 140, 141, 142, 143, 917, 918, + 184, 216, 216, 888, 107, 888, 1152, 833, 922, 144, + 145, 146, 924, 1155, 926, 964, 996, 802, 1037, 1049, + 999, 106, 106, 1090, 1114, 1115, 1079, 1093, 1094, 1096, + 1129, 1059, 1102, 147, 1131, 1104, 1157, 1098, 1106, 107, + 1132, 834, 835, 836, 837, 838, 839, 840, 841, 842, + 843, 867, 1139, 758, 1151, 1108, 1117, 1023, 1158, 1146, + 1153, 476, 342, 283, 343, 474, 106, 1051, 581, 883, + 1143, 1144, 1107, 586, 156, 589, 1068, 968, 991, 1142, + 1023, 1053, 106, 598, 929, 106, 1125, 603, 866, 867, + 868, 596, 1128, 667, 869, 870, 871, 872, 873, 874, + 875, 780, 778, 309, 795, 1071, 1023, 1023, 179, 226, + 915, 496, 441, 1103, 1085, 631, 179, 559, 812, 1005, + 179, 0, 179, 0, 0, 0, 106, 0, 0, 184, + 430, 0, 0, 0, 0, 0, 0, 0, 75, 327, + 328, 159, 0, 0, 0, 106, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 819, 820, 821, 822, 823, + 824, 0, 0, 0, 1023, 106, 106, 1023, 0, 0, + 1085, 1085, 0, 184, 0, 0, 1085, 0, 0, 0, + 106, 184, 0, 0, 329, 184, 0, 184, 0, 0, + 0, 0, 581, 0, 0, 216, 0, 0, 0, 0, + 216, 0, 216, 188, 219, 219, 0, 0, 0, 0, + 1023, 106, 106, 1085, 216, 216, 184, 476, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 329, 0, 0, 695, 905, 906, 907, + 0, 700, 0, 869, 870, 871, 872, 873, 874, 875, + 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, + 0, 484, 485, 486, 487, 329, 0, 0, 0, 760, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 217, + 217, 0, 481, 0, 944, 945, 946, 0, 0, 0, + 501, 0, 0, 481, 0, 0, 0, 0, 0, 0, + 0, 0, 186, 218, 218, 0, 0, 0, 0, 0, + 519, 0, 0, 329, 518, 0, 0, 0, 329, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 832, 0, 0, 0, 0, 0, 0, 179, + 552, 0, 0, 0, 0, 326, 564, 0, 619, 0, + 138, 139, 140, 141, 142, 143, 998, 0, 0, 329, + 0, 329, 0, 643, 645, 0, 188, 144, 145, 146, + 0, 0, 0, 0, 188, 0, 0, 0, 188, 0, + 188, 0, 0, 0, 0, 0, 0, 0, 219, 432, + 0, 147, 900, 219, 0, 219, 0, 185, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 219, 219, 188, + 0, 329, 0, 195, 224, 224, 0, 0, 0, 0, + 0, 186, 0, 216, 0, 0, 0, 0, 0, 0, + 0, 0, 156, 329, 0, 0, 0, 0, 0, 0, + 0, 185, 0, 0, 0, 0, 0, 0, 0, 185, + 0, 0, 0, 185, 0, 185, 0, 0, 0, 0, + 0, 0, 728, 217, 0, 186, 0, 640, 217, 0, + 217, 0, 0, 186, 0, 0, 179, 186, 0, 186, + 0, 0, 217, 217, 185, 969, 970, 218, 0, 0, + 0, 0, 218, 976, 218, 0, 75, 327, 328, 159, + 0, 0, 0, 197, 225, 225, 218, 218, 186, 0, + 0, 0, 0, 0, 728, 0, 0, 992, 0, 0, + 0, 0, 0, 0, 0, 329, 329, 329, 329, 329, + 329, 825, 826, 0, 487, 0, 0, 0, 0, 0, + 0, 184, 195, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 705, 0, 0, 481, + 0, 481, 0, 0, 0, 0, 515, 713, 0, 0, + 759, 0, 0, 0, 0, 0, 0, 0, 0, 1036, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 329, + 0, 0, 0, 0, 195, 0, 0, 0, 195, 0, + 195, 783, 0, 0, 0, 0, 0, 188, 224, 0, + 0, 0, 0, 224, 0, 224, 0, 0, 0, 0, + 811, 0, 0, 329, 0, 0, 219, 224, 224, 195, + 0, 817, 197, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1092, 0, 0, 0, 0, + 0, 0, 0, 0, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, + 329, 0, 329, 0, 0, 0, 197, 0, 0, 0, + 0, 0, 185, 0, 197, 0, 0, 0, 197, 0, + 197, 0, 0, 0, 0, 0, 0, 0, 225, 0, + 0, 217, 0, 225, 783, 225, 186, 783, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 225, 225, 197, + 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, + 0, 0, 0, 1149, 0, 0, 329, 0, 0, 0, + 0, 0, 0, 0, 188, 0, 930, 0, 0, 927, + 518, 0, 0, 0, 0, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 0, 0, 0, 0, + 0, 0, 0, 728, -227, 0, 0, 0, 0, 0, + 326, 0, 0, 0, 0, 138, 139, 140, 141, 142, + 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -483, 144, 145, 146, 0, 366, 783, 0, 0, + 0, 138, 139, 140, 141, 142, 143, 0, 0, 185, + 0, 0, 0, 0, 0, 0, 147, 195, 144, 145, + 146, 0, 0, 487, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 186, 0, 0, 224, 0, 0, 0, + 0, 0, 147, -1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 156, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -245, 1004, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 156, 0, 0, 0, 0, 3, 329, + 0, 0, 0, 0, 0, 0, 783, 0, 0, 0, + 0, 0, 0, 0, 0, 329, 0, 197, 0, 0, + -353, -353, -353, 0, 4, 0, 0, 0, 5, 6, + 7, 75, 327, 328, 159, 0, 225, 0, 0, 0, + 329, 0, 8, 9, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 75, 327, 328, + 159, 11, 12, 13, 195, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 0, 78, 79, 80, -2, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 197, 0, 0, 0, 0, -245, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -353, -353, -353, 0, 4, 0, 0, 0, + 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 9, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 12, 13, 0, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 0, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 124, 78, 79, 80, 0, 125, 126, + 127, 0, 128, 129, 130, 131, 132, 133, 134, 135, + 136, -483, 556, 0, 0, 0, 137, 0, 0, 0, + 0, 138, 139, 140, 141, 142, 143, 0, 0, 0, + 0, 0, 0, 0, -245, -245, 0, 3, 144, 145, + 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -353, + -353, -353, 147, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 149, 150, 151, 152, 153, + 154, 0, 0, 0, 0, 0, 0, 0, 0, 155, + 11, 12, 13, 156, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 0, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 0, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 157, 557, + 159, 160, 79, 80, 124, 0, 0, 0, 0, 125, + 126, 127, 0, 128, 129, 130, 131, 132, 133, 134, + 135, 136, -483, 0, 0, 0, 0, 137, 0, 0, + 0, 0, 138, 139, 140, 141, 142, 143, 0, 0, + 0, 0, 0, 0, 0, -245, -245, 0, 0, 144, + 145, 146, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -245, -245, -245, 147, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 149, 150, 151, 152, + 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, + 155, -245, -245, -245, 156, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, 0, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, 0, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, 75, 157, + 158, 159, 160, 79, -245, 200, 0, 0, 0, 0, + 125, 126, 127, 0, 0, 201, 130, 131, 132, 133, + 134, 135, 202, -483, -487, 0, 0, 0, 203, 0, + 0, 0, 0, 138, 139, 140, 141, 142, 143, 0, + 0, 0, 0, 0, 0, 0, -245, -245, 0, 0, + 144, 145, 146, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -245, -245, -245, 147, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 149, 150, 151, + 152, 153, 154, 0, 0, 0, 0, 0, 0, 0, + 0, 155, -245, -245, -245, 156, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, 0, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, 0, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, 75, + 157, 158, 159, 204, 205, -245, 200, 0, 0, 0, + 0, 125, 126, 127, 0, 0, 201, 130, 131, 132, + 133, 134, 135, 202, -431, -431, 0, 0, 0, 203, + -431, 0, 0, 0, 138, 139, 140, 141, 142, 143, + 0, 0, 0, 0, 0, 0, 0, -245, -245, 124, + 0, 144, 145, 146, 125, 126, 127, 0, 128, 129, + 130, 131, 132, 133, 134, 135, 136, -483, 0, 0, + 0, 0, 137, 0, 0, 147, 0, 138, 139, 140, + 141, 142, 143, 0, 0, 0, 0, 0, 0, 0, + -245, -245, 0, 0, 144, 145, 146, -431, 149, 150, + 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, + 0, 0, 155, 0, 0, 0, 156, 0, 147, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 149, 150, 151, 152, 153, 154, 0, 0, 0, + 0, 0, 0, 0, 0, 155, 0, 0, 0, 156, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 75, 157, 158, 159, 204, 205, 0, 0, 124, 0, + 0, 0, 0, 125, 126, 127, 0, 128, 129, 130, + 131, 132, 133, 134, 135, 136, -483, 0, 0, 0, + 0, 137, 0, 0, 0, 0, 138, 139, 140, 141, + 142, 143, 0, 75, 157, 158, 159, 160, 79, -245, + -245, 200, 0, 144, 145, 146, 125, 126, 127, 0, + 0, 201, 130, 131, 132, 133, 134, 135, 202, -483, + -487, 0, 0, 0, 203, 0, 0, 147, 0, 138, + 139, 140, 141, 142, 143, 0, 0, 0, 0, 0, + 0, 0, -245, -245, 0, 0, 144, 145, 146, -458, + 149, 150, 151, 152, 153, 154, 0, 0, 0, 0, + 0, 0, 0, 0, 155, 0, 0, 0, 156, 0, + 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -427, 149, 150, 151, 152, 153, 154, 0, + 0, 0, 0, 0, 0, 0, 0, 155, 0, 0, + 0, 156, 0, 0, 0, 782, 1046, 0, 0, 0, + 326, 0, 0, 0, 0, 138, 139, 140, 141, 142, + 143, 0, 75, 157, 158, 159, 160, 79, 0, 0, + 124, 0, 144, 145, 146, 125, 126, 127, 0, 128, + 129, 130, 131, 132, 133, 134, 135, 136, -483, 646, + 0, 0, 0, 137, 0, 0, 147, 0, 138, 139, + 140, 141, 142, 143, 0, 75, 157, 158, 159, 204, + 205, -245, -245, 200, 0, 144, 145, 146, 125, 126, + 127, 0, 0, 201, 130, 131, 132, 133, 134, 135, + 202, -483, -487, 0, 0, 0, 203, 156, 0, 147, + 0, 138, 139, 140, 141, 142, 143, 0, 0, 0, + 0, 0, 0, 0, -245, -245, 0, 0, 144, 145, + 146, 0, 149, 150, 151, 152, 153, 154, 0, 0, + 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, + 156, 0, 147, 0, 782, 0, 0, 0, 0, 326, + 0, 0, 0, 0, 138, 139, 140, 141, 142, 143, + 0, 75, 327, 328, 159, 149, 150, 151, 152, 153, + 154, 144, 145, 146, 0, 0, 0, 0, 0, 155, + 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, + 0, 0, 0, 0, 75, 157, 158, 159, 160, 79, + 0, 0, 124, 0, 0, 0, 0, 125, 126, 127, + 0, 128, 129, 130, 131, 132, 133, 134, 135, 136, + -483, 0, 0, 0, 0, 137, 156, 0, 0, 0, + 138, 139, 140, 141, 142, 143, 0, 75, 157, 158, + 159, 204, 205, -245, -245, 0, 0, 144, 145, 146, + 0, 0, 0, 0, 326, 516, 0, 0, 0, 138, + 139, 140, 141, 142, 143, 0, 0, 0, 0, 0, + 0, 147, 0, 0, 0, 0, 144, 145, 146, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 75, 327, 328, 159, 149, 150, 151, 152, 153, 154, + 147, 0, 0, 0, 0, 0, 0, 0, 155, 125, + 126, 127, 156, 128, 129, 130, 131, 132, 133, 134, + 135, 202, -483, 571, 0, 0, 0, 366, 0, 0, + 0, 0, 138, 139, 140, 141, 142, 143, 0, 0, + 0, 156, 0, 0, 0, -245, -245, 0, 3, 144, + 145, 146, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 147, 4, 0, 75, 157, 158, 159, + 160, 79, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 149, 150, 151, 152, + 153, 154, 0, 0, 0, 75, 327, 328, 159, 0, + 572, 11, 12, 13, 156, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 157, + 557, 159, 160, 79, 80, 125, 126, 127, 0, 128, + 129, 130, 131, 132, 133, 134, 135, 202, -483, 647, + 0, 0, 0, 366, 0, 0, 0, 0, 138, 139, + 140, 141, 142, 143, 0, 0, 0, 0, 0, 0, + 0, -245, -245, 0, 3, 144, 145, 146, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 149, 150, 151, 152, 153, 154, 0, 0, + 0, 0, 0, 0, 0, 0, 155, 11, 12, 13, + 156, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 0, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 157, 557, 159, 160, 79, + 80, 125, 126, 127, 0, 128, 129, 130, 131, 132, + 133, 134, 135, 202, -483, 658, 0, 0, 0, 366, + 0, 0, 0, 0, 138, 139, 140, 141, 142, 143, + 0, 0, 0, 0, 0, 0, 0, -245, -245, 0, + 3, 144, 145, 146, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 147, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 149, 150, + 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, + 0, 0, 659, 11, 12, 13, 156, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 0, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 157, 557, 159, 160, 79, 80, 125, 126, 127, + 0, 128, 129, 130, 131, 132, 133, 134, 135, 202, + -483, 657, 0, 0, 0, 366, 0, 0, 0, 0, + 138, 139, 140, 141, 142, 143, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 144, 145, 146, + 125, 126, 127, 0, 128, 129, 130, 131, 132, 133, + 134, 135, 202, -483, 661, 0, 0, 0, 366, 0, + 0, 147, 0, 138, 139, 140, 141, 142, 143, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 144, 145, 146, 0, 149, 150, 151, 152, 153, 154, + 0, 0, 0, 0, 0, 0, 0, 0, 155, 0, + 0, 0, 156, 0, 147, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 149, 150, 151, + 152, 153, 154, 0, 0, 0, 0, 0, 0, 0, + 0, 662, 0, 0, 0, 156, 0, 0, 0, 0, + 326, 0, 0, 697, 0, 138, 139, 140, 141, 142, + 143, 0, 0, 0, 0, 0, 75, 157, 158, 159, + 160, 79, 144, 145, 146, 125, 126, 127, 0, 128, + 129, 130, 131, 132, 133, 134, 135, 202, -483, 711, + 0, 0, 0, 366, 0, 0, 147, 0, 138, 139, + 140, 141, 142, 143, 0, 0, 0, 0, 0, 75, + 157, 158, 159, 160, 79, 144, 145, 146, 125, 126, + 127, 0, 128, 129, 130, 131, 132, 133, 134, 135, + 202, -483, 764, 0, 0, 0, 366, 156, 0, 147, + 0, 138, 139, 140, 141, 142, 143, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 144, 145, + 146, 0, 149, 150, 151, 152, 153, 154, 0, 0, + 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, + 156, 0, 147, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 75, 327, 328, 159, 149, 150, 151, 152, 153, + 154, 0, 0, 0, 0, 0, 0, 0, 0, 155, + 0, 0, 0, 156, 0, 0, 0, 0, 326, 928, + 0, 0, 0, 138, 139, 140, 141, 142, 143, 0, + 0, 0, 0, 0, 75, 157, 158, 159, 160, 79, + 144, 145, 146, 125, 126, 127, 0, 128, 129, 130, + 131, 132, 133, 134, 135, 202, -483, 765, 0, 0, + 0, 366, 0, 0, 147, 0, 138, 139, 140, 141, + 142, 143, 0, 0, 0, 0, 0, 75, 157, 158, + 159, 160, 79, 144, 145, 146, 125, 126, 127, 0, + 128, 129, 130, 131, 132, 133, 134, 135, 202, -483, + 767, 0, 0, 0, 366, 156, 0, 147, 0, 138, + 139, 140, 141, 142, 143, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 144, 145, 146, 0, + 149, 150, 151, 152, 153, 154, 0, 0, 0, 0, + 0, 0, 0, 0, 766, 0, 0, 0, 156, 0, + 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, + 327, 328, 159, 149, 150, 151, 152, 153, 154, 0, + 0, 0, 0, 0, 0, 0, 0, 155, 0, 0, + 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 75, 157, 158, 159, 160, 79, 0, 0, + 0, 125, 126, 127, 0, 128, 129, 130, 131, 132, + 133, 134, 135, 202, -483, 884, 0, 0, 0, 366, + 0, 0, 0, 0, 138, 139, 140, 141, 142, 143, + 0, 0, 0, 0, 0, 75, 157, 158, 159, 160, + 79, 144, 145, 146, 125, 126, 127, 0, 128, 129, + 130, 131, 132, 133, 134, 135, 202, -483, 0, 0, + 0, 0, 366, 0, 0, 147, 0, 138, 139, 140, + 141, 142, 143, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 144, 145, 146, 0, 149, 150, + 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, + 0, 0, 155, 0, 0, 0, 156, 0, 147, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, + 0, 149, 150, 151, 152, 153, 154, 0, 0, 0, + 0, 0, 0, 0, 0, 155, 0, 0, 0, 156, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 75, 157, 158, 159, 160, 79, 0, 0, -353, -353, + -353, 0, 4, 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, 75, 157, 158, 159, 160, 79, 11, + 12, 13, 0, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 0, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 0, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 291, 0, 119, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 326, + -227, 0, 0, 0, 138, 139, 140, 141, 142, 143, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 144, 145, 146, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -617, 0, 0, 0, + 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 12, 13, 0, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 156, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, -111, 0, 119, 0, 0, -111, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 75, 327, 328, 159, 0, 326, 0, 0, 0, 0, + 138, 139, 140, 141, 142, 143, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 144, 145, 146, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 12, 13, 0, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 0, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 156, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 286, + 0, 119, 0, 0, 0, 80, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 75, 327, 328, 159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, + 13, 0, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 0, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 0, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 0, 0, 119, 11, 12, + 13, 80, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 0, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, -624, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 0, 0, 119, 0, 0, + 0, 80, 0, -626, -626, -626, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -626, 0, 0, 0, 0, 0, 0, 0, 0, + -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, -626, -626, -626, 0, -626, -626, + -626, -626, -626, -626, -626, -626, -626, -626, 0, -626, + -626, -626, -626, -626, -626, -626, -626, -626, -626, -626, + -626, -626, -626, -626, 0, -626, -626, -626, -626, -626, + -626, -626, -626, -626, -626, -626, -626, -626, -626, -626, + -626, -626, -626, -626, -626, -626, -626, -626, -626, -626, + -626, -626, -626, -626, -626, -626, -626, -626, -626, -626, + -626, 0, 0, 0, 11, 12, 13, -626, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 0, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 355, 78, 79, 80, 0, 138, + 139, 140, 141, 142, 143, 642, 0, 0, 0, 0, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 0, + 0, 0, 0, 0, 0, 644, 0, 144, 145, 146, + 138, 139, 140, 141, 142, 143, 714, 0, 0, 0, + 147, 715, 716, 717, 718, 719, 720, 144, 145, 146, + 0, 147, 0, 0, 0, 0, 0, 0, 144, 721, + 722, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 156, 723, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 156, 0, -171, -171, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 75, 327, 328, 159, 0, + 0, 0, 0, 0, 0, 0, 75, 327, 328, 159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 75, 327, 328, 159, + 0, 0, 0, 0, 0, 0, 0, 75, 724, 725, + 726, 11, 12, 13, 0, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 3, 0, + 119, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -353, -353, -353, 0, 4, 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, 11, 12, 13, 0, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 3, 0, + 119, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 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, 11, 12, 13, 0, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 0, 0, + 119, -353, -353, -353, 80, 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, 0, 11, 12, 13, 0, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 0, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 0, + 0, 119, 8, 9, 10, 80, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 12, 13, 0, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 0, 0, + 119, 11, 12, 13, 80, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 0, 0, + 119, 0, 0, 0, 80 +}; + +static const short yycheck[] = { 0, + 0, 463, 3, 88, 105, 364, 495, 0, 366, 125, + 11, 12, 551, 301, 9, 10, 549, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 2, 446, 320, 412, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 411, 652, 401, 402, 621, 403, + 404, 652, 405, 406, 407, 408, 8, 409, 410, 652, + 81, 81, 617, 24, 473, 892, 445, 782, 81, 0, + 785, 449, 3, 34, 19, 5, 7, 413, 99, 774, + 794, 5, 762, 672, 105, 203, 889, 5, 788, 892, + 208, 0, 210, 652, 115, 116, 117, 704, 21, 652, + 121, 25, 25, 704, 222, 1016, 1017, 9, 10, 214, + 5, 704, 898, 28, 493, 85, 137, 1080, 1081, 18, + 18, 25, 26, 144, 28, 24, 699, 86, 87, 44, + 25, 34, 21, 112, 18, 34, 25, 86, 87, 23, + 44, 41, 121, 24, 0, 704, 28, 3, 24, 5, + 81, 704, 979, 34, 981, 5, 56, 116, 117, 8, + 1123, 1100, 44, 1074, 53, 54, 1077, 1106, 882, 1108, + 885, 130, 81, 18, 105, 25, 979, 318, 981, 474, + 602, 690, 203, 21, 773, 137, 972, 776, 203, 24, + 121, 26, 500, 208, 603, 210, 891, 877, 893, 34, + 578, 132, 902, 86, 87, 108, 109, 222, 223, 1120, + 0, 24, 21, 3, 175, 176, 25, 7, 8, 9, + 10, 41, 601, 32, 33, 81, 175, 176, 364, 181, + 175, 176, 177, 560, 179, 180, 56, 189, 8, 95, + 96, 193, 98, 195, 623, 175, 176, 177, 575, 179, + 180, 175, 176, 177, 18, 179, 180, 175, 176, 177, + 21, 179, 180, 284, 25, 121, 652, 24, 289, 984, + 290, 26, 224, 28, 24, 583, 175, 176, 39, 300, + 301, 18, 303, 304, 21, 652, 23, 300, 137, 44, + 799, 81, 175, 176, 175, 176, 317, 652, 652, 652, + 652, 203, 323, 862, 317, 326, 208, 860, 210, 445, + 18, 6, 7, 21, 26, 105, 652, 422, 704, 627, + 222, 223, 34, 441, 345, 175, 176, 177, 22, 179, + 180, 121, 181, 24, 642, 18, 644, 704, 21, 912, + 34, 26, 132, 28, 193, 366, 195, 137, 24, 704, + 704, 704, 704, 24, 21, 26, 963, 493, 25, 44, + 21, 916, 963, 18, 25, 155, 345, 137, 704, 300, + 963, 21, 303, 304, 305, 224, 24, 27, 26, 8, + 9, 10, 49, 50, 24, 24, 317, 27, 49, 50, + 21, 181, 323, 21, 34, 16, 27, 25, 21, 189, + 779, 191, 25, 193, 963, 195, 714, 24, 21, 26, + 963, 181, 25, 203, 37, 38, 29, 437, 208, 189, + 210, 49, 50, 193, 16, 195, 441, 448, 51, 52, + 451, 16, 222, 223, 224, 448, 16, 458, 451, 460, + 18, 462, 463, 21, 465, 15, 21, 25, 24, 470, + 25, 27, 473, 24, 224, 26, 21, 598, 34, 480, + 25, 25, 26, 8, 28, 601, 18, 32, 33, 21, + 422, 492, 858, 34, 495, 18, 497, 39, 21, 500, + 44, 175, 176, 177, 22, 179, 180, 623, 344, 96, + 857, 98, 847, 848, 473, 849, 850, 22, 851, 852, + 853, 854, 22, 855, 856, 24, 29, 26, 137, 28, + 300, 40, 21, 303, 304, 305, 25, 448, 25, 55, + 451, 28, 21, 859, 85, 44, 25, 317, 47, 48, + 461, 19, 463, 323, 465, 175, 176, 21, 178, 441, + 560, 25, 473, 21, 922, 476, 1055, 25, 92, 480, + 49, 50, 181, 92, 1036, 575, 34, 35, 36, 580, + 189, 21, 583, 21, 193, 25, 195, 25, 18, 690, + 22, 21, 34, 422, 203, 596, 597, 963, 368, 208, + 24, 210, 603, 25, 26, 22, 376, 21, 378, 520, + 521, 25, 137, 222, 223, 224, 963, 22, 454, 175, + 176, 622, 178, 67, 68, 69, 627, 559, 963, 963, + 963, 963, 32, 33, 175, 176, 637, 638, 179, 180, + 5, 642, 26, 644, 603, 18, 18, 963, 21, 21, + 34, 21, 422, 25, 21, 25, 181, 191, 25, 24, + 25, 26, 21, 779, 189, 666, 25, 92, 193, 34, + 195, 441, 422, 674, 19, 676, 20, 447, 448, 680, + 681, 451, 18, 92, 685, 21, 37, 38, 689, 690, + 27, 461, 603, 463, 695, 465, 24, 813, 799, 224, + 51, 52, 23, 473, 21, 21, 476, 18, 25, 25, + 480, 999, 18, 714, 18, 24, 24, 26, 138, 139, + 140, 141, 142, 143, 21, 34, 18, 5, 25, 21, + 1089, 690, 22, 175, 176, 177, 695, 179, 180, 21, + 21, 511, 25, 25, 25, 21, 24, 25, 26, 25, + 520, 521, 18, 175, 176, 177, 34, 179, 180, 24, + 24, 26, 37, 38, 675, 25, 677, 18, 769, 34, + 21, 1130, 49, 50, 610, 686, 51, 52, 689, 690, + 34, 35, 36, 904, 24, 18, 26, 18, 28, 559, + 560, 175, 176, 177, 18, 179, 180, 798, 799, 21, + 801, 18, 572, 25, 44, 575, 576, 47, 48, 559, + 175, 176, 177, 422, 179, 180, 34, 35, 36, 18, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 19, 21, 441, 603, 368, 25, 9, 21, 25, 21, + 799, 25, 376, 25, 378, 21, 967, 37, 38, 25, + 11, 21, 97, 24, 99, 25, 101, 11, 103, 53, + 54, 51, 52, 108, 985, 88, 175, 176, 177, 990, + 179, 180, 181, 118, 24, 120, 21, 21, 648, 649, + 965, 25, 652, 42, 43, 1006, 19, 888, 799, 659, + 660, 1012, 662, 88, 895, 21, 19, 422, 809, 25, + 1021, 20, 21, 988, 19, 675, 23, 677, 21, 22, + 175, 176, 177, 447, 179, 180, 686, 162, 19, 689, + 690, 691, 78, 79, 80, 81, 82, 83, 84, 1050, + 1051, 27, 1053, 21, 704, 771, 25, 25, 774, 21, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 559, 119, 24, 121, 1055, 175, 176, 177, 21, 179, + 180, 22, 25, 1084, 132, 133, 21, 135, 18, 137, + 138, 24, 973, 1089, 21, 976, 22, 511, 398, 399, + 400, 25, 150, 976, 21, 11, 21, 23, 25, 1105, + 25, 992, 24, 994, 32, 33, 766, 24, 999, 992, + 24, 1002, 1003, 21, 1125, 21, 1006, 25, 21, 25, + 27, 21, 25, 25, 1130, 25, 34, 35, 36, 21, + 931, 932, 23, 25, 21, 20, 560, 21, 25, 799, + 20, 25, 21, 992, 559, 1036, 25, 1038, 1039, 809, + 19, 575, 576, 21, 289, 21, 19, 25, 293, 25, + 1050, 49, 50, 889, 1055, 891, 892, 893, 72, 73, + 74, 72, 73, 74, 21, 976, 311, 53, 54, 314, + 20, 21, 20, 21, 5, 8, 25, 322, 498, 24, + 325, 992, 21, 22, 995, 125, 1087, 27, 22, 1090, + 175, 176, 1093, 25, 24, 20, 20, 1090, 138, 139, + 140, 141, 142, 143, 18, 145, 146, 27, 25, 18, + 25, 27, 25, 21, 648, 649, 39, 29, 25, 25, + 24, 18, 40, 25, 88, 1036, 660, 24, 55, 25, + 24, 21, 29, 30, 31, 32, 33, 34, 25, 25, + 8, 9, 10, 979, 1055, 981, 1147, 23, 25, 46, + 47, 48, 18, 1154, 25, 18, 18, 691, 18, 88, + 21, 931, 932, 21, 1075, 1076, 88, 22, 20, 20, + 18, 180, 25, 70, 20, 25, 0, 88, 88, 1090, + 20, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 73, 27, 963, 27, 88, 88, 967, 0, 88, + 88, 446, 135, 81, 137, 323, 976, 989, 453, 763, + 1121, 1122, 1066, 458, 111, 460, 1014, 877, 909, 1120, + 990, 990, 992, 468, 828, 995, 1086, 472, 72, 73, + 74, 465, 1090, 583, 78, 79, 80, 81, 82, 83, + 84, 677, 675, 112, 689, 1015, 1016, 1017, 181, 10, + 799, 345, 223, 1060, 1024, 511, 189, 422, 704, 963, + 193, -1, 195, -1, -1, -1, 1036, -1, -1, 137, + 203, -1, -1, -1, -1, -1, -1, -1, 175, 176, + 177, 178, -1, -1, -1, 1055, -1, -1, -1, -1, + -1, 224, -1, -1, -1, 715, 716, 717, 718, 719, + 720, -1, -1, -1, 1074, 1075, 1076, 1077, -1, -1, + 1080, 1081, -1, 181, -1, -1, 1086, -1, -1, -1, + 1090, 189, -1, -1, 364, 193, -1, 195, -1, -1, + -1, -1, 577, -1, -1, 203, -1, -1, -1, -1, + 208, -1, 210, 8, 9, 10, -1, -1, -1, -1, + 1120, 1121, 1122, 1123, 222, 223, 224, 602, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, -1, 621, 72, 73, 74, + -1, 626, -1, 78, 79, 80, 81, 82, 83, 84, + -1, -1, -1, 326, -1, -1, -1, -1, -1, -1, + -1, 334, 335, 336, 337, 445, -1, -1, -1, 654, + -1, -1, -1, -1, -1, -1, -1, -1, 8, 9, + 10, -1, 355, -1, 844, 845, 846, -1, -1, -1, + 358, -1, -1, 366, -1, -1, -1, -1, -1, -1, + -1, -1, 8, 9, 10, -1, -1, -1, -1, -1, + 383, -1, -1, 493, 382, -1, -1, -1, 498, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + -1, -1, 137, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 727, -1, -1, -1, -1, -1, -1, 422, + 418, -1, -1, -1, -1, 24, 429, -1, 27, -1, + 29, 30, 31, 32, 33, 34, 926, -1, -1, 549, + -1, 551, -1, 553, 554, -1, 181, 46, 47, 48, + -1, -1, -1, -1, 189, -1, -1, -1, 193, -1, + 195, -1, -1, -1, -1, -1, -1, -1, 203, 204, + -1, 70, 787, 208, -1, 210, -1, 137, -1, -1, + -1, -1, -1, -1, 422, -1, -1, 222, 223, 224, + -1, 601, -1, 8, 9, 10, -1, -1, -1, -1, + -1, 137, -1, 441, -1, -1, -1, -1, -1, -1, + -1, -1, 111, 623, -1, -1, -1, -1, -1, -1, + -1, 181, -1, -1, -1, -1, -1, -1, -1, 189, + -1, -1, -1, 193, -1, 195, -1, -1, -1, -1, + -1, -1, 652, 203, -1, 181, -1, 550, 208, -1, + 210, -1, -1, 189, -1, -1, 559, 193, -1, 195, + -1, -1, 222, 223, 224, 880, 881, 203, -1, -1, + -1, -1, 208, 888, 210, -1, 175, 176, 177, 178, + -1, -1, -1, 8, 9, 10, 222, 223, 224, -1, + -1, -1, -1, -1, 704, -1, -1, 912, -1, -1, + -1, -1, -1, -1, -1, 715, 716, 717, 718, 719, + 720, 721, 722, -1, 617, -1, -1, -1, -1, -1, + -1, 559, 137, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 634, -1, -1, 642, + -1, 644, -1, -1, -1, -1, 381, 650, -1, -1, + 653, -1, -1, -1, -1, -1, -1, -1, -1, 974, + -1, -1, -1, -1, -1, -1, 181, -1, -1, 779, + -1, -1, -1, -1, 189, -1, -1, -1, 193, -1, + 195, 679, -1, -1, -1, -1, -1, 422, 203, -1, + -1, -1, -1, 208, -1, 210, -1, -1, -1, -1, + 703, -1, -1, 813, -1, -1, 441, 222, 223, 224, + -1, 714, 137, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1040, -1, -1, -1, -1, + -1, -1, -1, -1, 844, 845, 846, 847, 848, 849, + 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, -1, 862, -1, -1, -1, 181, -1, -1, -1, + -1, -1, 422, -1, 189, -1, -1, -1, 193, -1, + 195, -1, -1, -1, -1, -1, -1, -1, 203, -1, + -1, 441, -1, 208, 782, 210, 422, 785, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 222, 223, 224, + -1, -1, -1, -1, -1, 441, -1, -1, -1, -1, + -1, -1, -1, 1128, -1, -1, 926, -1, -1, -1, + -1, -1, -1, -1, 559, -1, 829, -1, -1, 827, + 828, -1, -1, -1, -1, 833, 834, 835, 836, 837, + 838, 839, 840, 841, 842, 843, -1, -1, -1, -1, + -1, -1, -1, 963, 18, -1, -1, -1, -1, -1, + 24, -1, -1, -1, -1, 29, 30, 31, 32, 33, + 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 19, 46, 47, 48, -1, 24, 885, -1, -1, + -1, 29, 30, 31, 32, 33, 34, -1, -1, 559, + -1, -1, -1, -1, -1, -1, 70, 422, 46, 47, + 48, -1, -1, 916, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 559, -1, -1, 441, -1, -1, -1, + -1, -1, 70, 0, 1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 111, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 24, 961, -1, + -1, -1, -1, -1, -1, -1, -1, 34, -1, -1, + -1, -1, -1, 111, -1, -1, -1, -1, 45, 1089, + -1, -1, -1, -1, -1, -1, 984, -1, -1, -1, + -1, -1, -1, -1, -1, 1105, -1, 422, -1, -1, + 67, 68, 69, -1, 71, -1, -1, -1, 75, 76, + 77, 175, 176, 177, 178, -1, 441, -1, -1, -1, + 1130, -1, 89, 90, 91, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 175, 176, 177, + 178, 108, 109, 110, 559, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, -1, 179, 180, 181, 0, 1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 559, -1, -1, -1, -1, 24, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 67, 68, 69, -1, 71, -1, -1, -1, + 75, 76, 77, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 89, 90, 91, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 108, 109, 110, -1, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, -1, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, -1, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 1, 179, 180, 181, -1, 6, 7, + 8, -1, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, -1, -1, -1, 24, -1, -1, -1, + -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, + -1, -1, -1, -1, 42, 43, -1, 45, 46, 47, + 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, + 68, 69, 70, 71, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 93, 94, 95, 96, 97, + 98, -1, -1, -1, -1, -1, -1, -1, -1, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, -1, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + -1, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 1, -1, -1, -1, -1, 6, + 7, 8, -1, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, -1, -1, -1, -1, 24, -1, -1, + -1, -1, 29, 30, 31, 32, 33, 34, -1, -1, + -1, -1, -1, -1, -1, 42, 43, -1, -1, 46, + 47, 48, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 67, 68, 69, 70, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 93, 94, 95, 96, + 97, 98, -1, -1, -1, -1, -1, -1, -1, -1, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 1, -1, -1, -1, -1, + 6, 7, 8, -1, -1, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, -1, -1, -1, 24, -1, + -1, -1, -1, 29, 30, 31, 32, 33, 34, -1, + -1, -1, -1, -1, -1, -1, 42, 43, -1, -1, + 46, 47, 48, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 67, 68, 69, 70, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, -1, + -1, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, -1, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, -1, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 1, -1, -1, -1, + -1, 6, 7, 8, -1, -1, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, -1, -1, -1, 24, + 25, -1, -1, -1, 29, 30, 31, 32, 33, 34, + -1, -1, -1, -1, -1, -1, -1, 42, 43, 1, + -1, 46, 47, 48, 6, 7, 8, -1, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, -1, -1, + -1, -1, 24, -1, -1, 70, -1, 29, 30, 31, + 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, + 42, 43, -1, -1, 46, 47, 48, 92, 93, 94, + 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, + -1, -1, 107, -1, -1, -1, 111, -1, 70, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 92, 93, 94, 95, 96, 97, 98, -1, -1, -1, + -1, -1, -1, -1, -1, 107, -1, -1, -1, 111, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 175, 176, 177, 178, 179, 180, -1, -1, 1, -1, + -1, -1, -1, 6, 7, 8, -1, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, -1, -1, -1, + -1, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, -1, 175, 176, 177, 178, 179, 180, 42, + 43, 1, -1, 46, 47, 48, 6, 7, 8, -1, + -1, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, -1, -1, -1, 24, -1, -1, 70, -1, 29, + 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, + -1, -1, 42, 43, -1, -1, 46, 47, 48, 92, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, -1, 107, -1, -1, -1, 111, -1, + 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 92, 93, 94, 95, 96, 97, 98, -1, + -1, -1, -1, -1, -1, -1, -1, 107, -1, -1, + -1, 111, -1, -1, -1, 19, 20, -1, -1, -1, + 24, -1, -1, -1, -1, 29, 30, 31, 32, 33, + 34, -1, 175, 176, 177, 178, 179, 180, -1, -1, + 1, -1, 46, 47, 48, 6, 7, 8, -1, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + -1, -1, -1, 24, -1, -1, 70, -1, 29, 30, + 31, 32, 33, 34, -1, 175, 176, 177, 178, 179, + 180, 42, 43, 1, -1, 46, 47, 48, 6, 7, + 8, -1, -1, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, -1, -1, -1, 24, 111, -1, 70, + -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, + -1, -1, -1, -1, 42, 43, -1, -1, 46, 47, + 48, -1, 93, 94, 95, 96, 97, 98, -1, -1, + -1, -1, -1, -1, -1, -1, 107, -1, -1, -1, + 111, -1, 70, -1, 19, -1, -1, -1, -1, 24, + -1, -1, -1, -1, 29, 30, 31, 32, 33, 34, + -1, 175, 176, 177, 178, 93, 94, 95, 96, 97, + 98, 46, 47, 48, -1, -1, -1, -1, -1, 107, + -1, -1, -1, 111, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 70, -1, -1, -1, -1, + -1, -1, -1, -1, 175, 176, 177, 178, 179, 180, + -1, -1, 1, -1, -1, -1, -1, 6, 7, 8, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, -1, -1, -1, -1, 24, 111, -1, -1, -1, + 29, 30, 31, 32, 33, 34, -1, 175, 176, 177, + 178, 179, 180, 42, 43, -1, -1, 46, 47, 48, + -1, -1, -1, -1, 24, 25, -1, -1, -1, 29, + 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, + -1, 70, -1, -1, -1, -1, 46, 47, 48, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 175, 176, 177, 178, 93, 94, 95, 96, 97, 98, + 70, -1, -1, -1, -1, -1, -1, -1, 107, 6, + 7, 8, 111, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, -1, -1, -1, 24, -1, -1, + -1, -1, 29, 30, 31, 32, 33, 34, -1, -1, + -1, 111, -1, -1, -1, 42, 43, -1, 45, 46, + 47, 48, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 70, 71, -1, 175, 176, 177, 178, + 179, 180, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 93, 94, 95, 96, + 97, 98, -1, -1, -1, 175, 176, 177, 178, -1, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 6, 7, 8, -1, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + -1, -1, -1, 24, -1, -1, -1, -1, 29, 30, + 31, 32, 33, 34, -1, -1, -1, -1, -1, -1, + -1, 42, 43, -1, 45, 46, 47, 48, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, + 71, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 93, 94, 95, 96, 97, 98, -1, -1, + -1, -1, -1, -1, -1, -1, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, -1, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, -1, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 6, 7, 8, -1, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, -1, -1, -1, 24, + -1, -1, -1, -1, 29, 30, 31, 32, 33, 34, + -1, -1, -1, -1, -1, -1, -1, 42, 43, -1, + 45, 46, 47, 48, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 70, 71, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 93, 94, + 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, + -1, -1, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, -1, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, -1, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 6, 7, 8, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, -1, -1, -1, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 46, 47, 48, + 6, 7, 8, -1, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, -1, -1, -1, 24, -1, + -1, 70, -1, 29, 30, 31, 32, 33, 34, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 46, 47, 48, -1, 93, 94, 95, 96, 97, 98, + -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, + -1, -1, 111, -1, 70, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, -1, + -1, 107, -1, -1, -1, 111, -1, -1, -1, -1, + 24, -1, -1, 27, -1, 29, 30, 31, 32, 33, + 34, -1, -1, -1, -1, -1, 175, 176, 177, 178, + 179, 180, 46, 47, 48, 6, 7, 8, -1, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + -1, -1, -1, 24, -1, -1, 70, -1, 29, 30, + 31, 32, 33, 34, -1, -1, -1, -1, -1, 175, + 176, 177, 178, 179, 180, 46, 47, 48, 6, 7, + 8, -1, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, -1, -1, -1, 24, 111, -1, 70, + -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 46, 47, + 48, -1, 93, 94, 95, 96, 97, 98, -1, -1, + -1, -1, -1, -1, -1, -1, 107, -1, -1, -1, + 111, -1, 70, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 175, 176, 177, 178, 93, 94, 95, 96, 97, + 98, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, 111, -1, -1, -1, -1, 24, 25, + -1, -1, -1, 29, 30, 31, 32, 33, 34, -1, + -1, -1, -1, -1, 175, 176, 177, 178, 179, 180, + 46, 47, 48, 6, 7, 8, -1, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, + -1, 24, -1, -1, 70, -1, 29, 30, 31, 32, + 33, 34, -1, -1, -1, -1, -1, 175, 176, 177, + 178, 179, 180, 46, 47, 48, 6, 7, 8, -1, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, -1, -1, -1, 24, 111, -1, 70, -1, 29, + 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 46, 47, 48, -1, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, -1, 107, -1, -1, -1, 111, -1, + 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 175, + 176, 177, 178, 93, 94, 95, 96, 97, 98, -1, + -1, -1, -1, -1, -1, -1, -1, 107, -1, -1, + -1, 111, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 175, 176, 177, 178, 179, 180, -1, -1, + -1, 6, 7, 8, -1, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, -1, -1, -1, 24, + -1, -1, -1, -1, 29, 30, 31, 32, 33, 34, + -1, -1, -1, -1, -1, 175, 176, 177, 178, 179, + 180, 46, 47, 48, 6, 7, 8, -1, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, -1, -1, + -1, -1, 24, -1, -1, 70, -1, 29, 30, 31, + 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 46, 47, 48, -1, 93, 94, + 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, + -1, -1, 107, -1, -1, -1, 111, -1, 70, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, + -1, 93, 94, 95, 96, 97, 98, -1, -1, -1, + -1, -1, -1, -1, -1, 107, -1, -1, -1, 111, + -1, -1, -1, -1, -1, -1, 45, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 175, 176, 177, 178, 179, 180, -1, -1, 67, 68, + 69, -1, 71, -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, 175, 176, 177, 178, 179, 180, 108, + 109, 110, -1, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, -1, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, -1, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 18, -1, 177, -1, + -1, -1, 181, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 45, -1, -1, -1, -1, -1, 24, + 25, -1, -1, -1, 29, 30, 31, 32, 33, 34, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, + -1, 46, 47, 48, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, 70, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 108, 109, 110, -1, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + -1, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 111, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 19, -1, 177, -1, -1, 24, 181, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, + 175, 176, 177, 178, -1, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 71, -1, 46, 47, 48, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 108, 109, 110, -1, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, -1, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 111, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 19, + -1, 177, -1, -1, -1, 181, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 45, 175, 176, 177, 178, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 71, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 108, 109, + 110, -1, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, -1, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, -1, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, -1, -1, 177, 108, 109, + 110, 181, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, -1, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 22, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, -1, -1, 177, -1, -1, + -1, 181, -1, 67, 68, 69, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, + 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 34, -1, -1, -1, 108, 109, 110, -1, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, -1, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, -1, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, -1, -1, -1, 108, 109, 110, 181, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, -1, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, -1, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 24, 179, 180, 181, -1, 29, + 30, 31, 32, 33, 34, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, 46, 47, 48, -1, + -1, -1, -1, -1, -1, 24, -1, 46, 47, 48, + 29, 30, 31, 32, 33, 34, 24, -1, -1, -1, + 70, 29, 30, 31, 32, 33, 34, 46, 47, 48, + -1, 70, -1, -1, -1, -1, -1, -1, 46, 47, + 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 111, 70, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 111, -1, 42, 43, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 175, 176, 177, 178, -1, + -1, -1, -1, -1, -1, -1, 175, 176, 177, 178, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 175, 176, 177, 178, + -1, -1, -1, -1, -1, -1, -1, 175, 176, 177, + 178, 108, 109, 110, -1, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 45, -1, + 177, -1, -1, -1, 181, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 67, 68, 69, -1, 71, -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, 108, 109, 110, -1, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 45, -1, + 177, -1, -1, -1, 181, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 71, -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, 108, 109, 110, -1, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, -1, -1, + 177, 67, 68, 69, 181, -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, 108, 109, 110, -1, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, -1, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, -1, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, -1, + -1, 177, 89, 90, 91, 181, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 108, 109, 110, -1, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, -1, -1, + 177, 108, 109, 110, 181, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, -1, -1, + 177, -1, -1, -1, 181 +}; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/usr/share/misc/bison.simple" + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +#ifndef alloca +#ifdef __GNUC__ +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) +#include +#else /* not sparc */ +#if defined (MSDOS) && !defined (__TURBOC__) +#include +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +#include + #pragma alloca +#else /* not MSDOS, __TURBOC__, or _AIX */ +#ifdef __hpux +#ifdef __cplusplus +extern "C" { +void *alloca (unsigned int); +}; +#else /* not __cplusplus */ +void *alloca (); +#endif /* not __cplusplus */ +#endif /* __hpux */ +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc. */ +#endif /* not GNU C. */ +#endif /* alloca not defined. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT return(0) +#define YYABORT return(1) +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ +#define YYFAIL goto yyerrlab +#define YYRECOVERING() (!!yyerrstatus) +#define YYBACKUP(token, value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYPURE +#define YYLEX yylex() +#endif + +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYPURE + +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ + +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ +#endif + +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ + +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ + +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +int yyparse (void); +#endif + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (to, from, count) + char *to; + char *from; + int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#else /* __cplusplus */ + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (char *to, char *from, int count) +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#endif +#endif + +#line 196 "/usr/share/misc/bison.simple" + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ + +int +yyparse(YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else +#define YYPOPSTACK (yyvsp--, yyssp--) +#endif + + int yystacksize = YYINITDEPTH; + +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int yylen; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss - 1; + yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif + +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + + /* Get the current used size of the three stacks, in elements. */ + int size = yyssp - yyss + 1; + +#ifdef yyoverflow + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif +#else /* no yyoverflow */ + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + return 2; + } + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; + yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp)); + yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp)); +#endif +#endif /* no yyoverflow */ + + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif + + goto yybackup; + yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif + } + else + { + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; + goto yynewstate; + +/* Do the default action for the current state. */ +yydefault: + + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + +/* Do a reduction. yyn is the number of a rule to reduce with. */ +yyreduce: + yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (yydebug) + { + int i; + + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + + + switch (yyn) { + +case 5: +#line 240 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 6: +#line 241 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 7: +#line 242 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 8: +#line 243 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 9: +#line 244 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 10: +#line 245 "cgrammar.y" +{ uentry_checkDecl (); exprNode_free (yyvsp[0].expr); ; + break;} +case 11: +#line 246 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 12: +#line 250 "cgrammar.y" +{ checkConstant (yyvsp[-6].qtyp, yyvsp[-4].ntyp); ; + break;} +case 13: +#line 252 "cgrammar.y" +{ checkValueConstant (yyvsp[-9].qtyp, yyvsp[-7].ntyp, yyvsp[-3].expr) ; ; + break;} +case 14: +#line 255 "cgrammar.y" +{ context_enterFunctionDecl (); ; + break;} +case 15: +#line 256 "cgrammar.y" +{ declareStaticFunction (yyvsp[-2].ntyp); context_quietExitFunction (); + context_exitFunctionDecl (); ; + break;} +case 16: +#line 261 "cgrammar.y" +{ + qtype qint = qtype_create (ctype_int); + yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, qint); + qtype_free (qint); + ; + break;} +case 17: +#line 267 "cgrammar.y" +{ yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, yyvsp[-2].qtyp); ; + break;} +case 19: +#line 272 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; qtype_adjustPointers (yyvsp[-1].count, idDecl_getTyp (yyval.ntyp)); ; + break;} +case 20: +#line 275 "cgrammar.y" +{ yyval.ntyp = idDecl_create (yyvsp[0].cname, qtype_unknown ()); ; + break;} +case 21: +#line 277 "cgrammar.y" +{ yyval.ntyp = idDecl_expectFunction (yyvsp[-2].ntyp); ; + break;} +case 22: +#line 279 "cgrammar.y" +{ yyval.ntyp = idDecl_replaceCtype (yyvsp[-2].ntyp, ctype_makeArray (idDecl_getCtype (yyvsp[-2].ntyp))); ; + break;} +case 23: +#line 281 "cgrammar.y" +{ + int value; + + if (exprNode_hasValue (yyvsp[-2].expr) + && multiVal_isInt (exprNode_getValue (yyvsp[-2].expr))) + { + value = (int) multiVal_forceInt (exprNode_getValue (yyvsp[-2].expr)); + } + else + { + value = 0; + } + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ctype_makeFixedArray (idDecl_getCtype (yyvsp[-5].ntyp), value)); + ; + break;} +case 24: +#line 297 "cgrammar.y" +{ setCurrentParams (uentryList_missingParams); + ; + break;} +case 25: +#line 300 "cgrammar.y" +{ /* need to support globals and modifies here! */ + ctype ct = ctype_makeFunction (idDecl_getCtype (yyvsp[-5].ntyp), + uentryList_makeMissingParams ()); + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ct); + context_popLoc (); + ; + break;} +case 26: +#line 308 "cgrammar.y" +{ setCurrentParams (yyvsp[-1].entrylist); + ; + break;} +case 27: +#line 311 "cgrammar.y" +{ clearCurrentParams (); + yyval.ntyp = idDecl_replaceCtype (yyvsp[-6].ntyp, ctype_makeFunction (idDecl_getCtype (yyvsp[-6].ntyp), yyvsp[-3].entrylist)); + context_popLoc (); + ; + break;} +case 28: +#line 317 "cgrammar.y" +{ yyval.ntyp = idDecl_create (yyvsp[0].cname, qtype_unknown ()); ; + break;} +case 29: +#line 319 "cgrammar.y" +{ yyval.ntyp = idDecl_expectFunction (yyvsp[-2].ntyp); ; + break;} +case 30: +#line 321 "cgrammar.y" +{ yyval.ntyp = idDecl_replaceCtype (yyvsp[-2].ntyp, ctype_makeArray (idDecl_getCtype (yyvsp[-2].ntyp))); ; + break;} +case 31: +#line 323 "cgrammar.y" +{ + int value; + + if (exprNode_hasValue (yyvsp[-2].expr) + && multiVal_isInt (exprNode_getValue (yyvsp[-2].expr))) + { + value = (int) multiVal_forceInt (exprNode_getValue (yyvsp[-2].expr)); + } + else + { + value = 0; + } + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ctype_makeFixedArray (idDecl_getCtype (yyvsp[-5].ntyp), value)); + ; + break;} +case 32: +#line 339 "cgrammar.y" +{ setCurrentParams (uentryList_missingParams); + ; + break;} +case 33: +#line 342 "cgrammar.y" +{ /* need to support globals and modifies here! */ + ctype ct = ctype_makeFunction (idDecl_getCtype (yyvsp[-5].ntyp), + uentryList_makeMissingParams ()); + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ct); + context_popLoc (); + ; + break;} +case 34: +#line 350 "cgrammar.y" +{ setCurrentParams (yyvsp[-1].entrylist); + ; + break;} +case 35: +#line 353 "cgrammar.y" +{ clearCurrentParams (); + yyval.ntyp = idDecl_replaceCtype (yyvsp[-6].ntyp, ctype_makeFunction (idDecl_getCtype (yyvsp[-6].ntyp), yyvsp[-3].entrylist)); + context_popLoc (); + ; + break;} +case 36: +#line 360 "cgrammar.y" +{ setCurrentParams (yyvsp[-1].entrylist); ; + break;} +case 37: +#line 361 "cgrammar.y" +{ clearCurrentParams (); ; + break;} +case 38: +#line 362 "cgrammar.y" +{ declareCIter (yyvsp[-8].cname, yyvsp[-6].entrylist); ; + break;} +case 39: +#line 365 "cgrammar.y" +{ exprNode_checkMacroBody (yyvsp[-1].expr); ; + break;} +case 40: +#line 366 "cgrammar.y" +{ exprNode_checkIterBody (yyvsp[-1].expr); ; + break;} +case 41: +#line 367 "cgrammar.y" +{ exprNode_checkIterEnd (yyvsp[-1].expr); ; + break;} +case 42: +#line 368 "cgrammar.y" +{ exprChecks_checkEmptyMacroBody (); ; + break;} +case 43: +#line 371 "cgrammar.y" +{ declareFunction (yyvsp[0].ntyp); ; + break;} +case 44: +#line 374 "cgrammar.y" +{ setProcessingGlobMods (); ; + break;} +case 45: +#line 375 "cgrammar.y" +{ clearProcessingGlobMods (); ; + break;} +case 46: +#line 378 "cgrammar.y" +{ setProcessingGlobMods (); ; + break;} +case 47: +#line 379 "cgrammar.y" +{ clearProcessingGlobMods (); ; + break;} +case 54: +#line 394 "cgrammar.y" +{ ; ; + break;} +case 55: +#line 395 "cgrammar.y" +{ ; ; + break;} +case 56: +#line 398 "cgrammar.y" +{ globListAdd (yyvsp[0].sr, yyvsp[-1].tquallist); ; + break;} +case 57: +#line 401 "cgrammar.y" +{ yyval.sr = uentry_getSref (yyvsp[0].entry); ; + break;} +case 58: +#line 402 "cgrammar.y" +{ yyval.sr = globListUnrecognized (yyvsp[0].cname); ; + break;} +case 59: +#line 405 "cgrammar.y" +{ yyval.typequal = qual_createUndef (); ; + break;} +case 60: +#line 406 "cgrammar.y" +{ yyval.typequal = qual_createKilled (); ; + break;} +case 61: +#line 407 "cgrammar.y" +{ yyval.typequal = qual_createOut (); ; + break;} +case 62: +#line 408 "cgrammar.y" +{ yyval.typequal = qual_createIn (); ; + break;} +case 63: +#line 409 "cgrammar.y" +{ yyval.typequal = qual_createPartial (); ; + break;} +case 64: +#line 412 "cgrammar.y" +{ yyval.tquallist = qualList_undefined; ; + break;} +case 65: +#line 413 "cgrammar.y" +{ yyval.tquallist = qualList_add (yyvsp[0].tquallist, yyvsp[-1].typequal); ; + break;} +case 66: +#line 416 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 67: +#line 418 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 68: +#line 419 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 69: +#line 421 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 70: +#line 423 "cgrammar.y" +{ setFunctionNoGlobals (); + setFunctionModifies (sRefSet_single (sRef_makeNothing ())); + ; + break;} +case 73: +#line 430 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 74: +#line 432 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 75: +#line 433 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 76: +#line 435 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 77: +#line 437 "cgrammar.y" +{ setFunctionNoGlobals (); + setFunctionModifies (sRefSet_single (sRef_makeNothing ())); + ; + break;} +case 82: +#line 449 "cgrammar.y" +{ + context_setProtectVars (); enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 83: +#line 454 "cgrammar.y" +{ + setFunctionModifies (yyvsp[0].srset); exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 84: +#line 462 "cgrammar.y" +{ + context_setProtectVars (); enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 85: +#line 467 "cgrammar.y" +{ + setFunctionModifies (yyvsp[0].srset); exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 95: +#line 491 "cgrammar.y" +{ yyval.sck = SP_ISONLY; ; + break;} +case 96: +#line 492 "cgrammar.y" +{ yyval.sck = SP_ISOBSERVER; ; + break;} +case 97: +#line 493 "cgrammar.y" +{ yyval.sck = SP_ISEXPOSED; ; + break;} +case 98: +#line 494 "cgrammar.y" +{ yyval.sck = SP_ISDEPENDENT; ; + break;} +case 99: +#line 495 "cgrammar.y" +{ yyval.sck = SP_ISOWNED; ; + break;} +case 100: +#line 496 "cgrammar.y" +{ yyval.sck = SP_ISSHARED; ; + break;} +case 101: +#line 497 "cgrammar.y" +{ yyval.sck = SP_ISNULL; ; + break;} +case 102: +#line 498 "cgrammar.y" +{ yyval.sck = SP_ISNOTNULL; ; + break;} +case 103: +#line 502 "cgrammar.y" +{ + context_setProtectVars (); + enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 104: +#line 508 "cgrammar.y" +{ + setFunctionSpecialClause (yyvsp[-6].tok, yyvsp[-3].srset, yyvsp[-1].tok); + exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 105: +#line 515 "cgrammar.y" +{ + context_setProtectVars (); + enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 106: +#line 521 "cgrammar.y" +{ + setFunctionStateSpecialClause (yyvsp[-7].tok, yyvsp[-5].sck, yyvsp[-3].srset, yyvsp[-1].tok); + exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 107: +#line 530 "cgrammar.y" +{ + qtype qint = qtype_create (ctype_int); + yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, qint); + qtype_free (qint); + ; + break;} +case 108: +#line 536 "cgrammar.y" +{ yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, yyvsp[-2].qtyp); ; + break;} +case 109: +#line 539 "cgrammar.y" +{ checkDoneParams (); context_enterInnerContext (); ; + break;} +case 110: +#line 541 "cgrammar.y" +{ + exprNode_checkFunctionBody (yyvsp[0].expr); yyval.expr = yyvsp[0].expr; + context_exitInner (yyvsp[0].expr); + ; + break;} +case 111: +#line 546 "cgrammar.y" +{ doneParams (); context_enterInnerContext (); ; + break;} +case 112: +#line 548 "cgrammar.y" +{ + context_exitInner (yyvsp[0].expr); + exprNode_checkFunctionBody (yyvsp[0].expr); + yyval.expr = yyvsp[0].expr; /* old style */ + ; + break;} +case 113: +#line 556 "cgrammar.y" +{ + context_setFunctionDefined (exprNode_loc (yyvsp[0].expr)); + exprNode_checkFunction (context_getHeader (), yyvsp[0].expr); + context_exitFunction (); + ; + break;} +case 114: +#line 563 "cgrammar.y" +{ yyval.srset = yyvsp[-2].srset; ; + break;} +case 115: +#line 564 "cgrammar.y" +{ yyval.srset = sRefSet_new (); ; + break;} +case 116: +#line 567 "cgrammar.y" +{ yyval.srset = yyvsp[-1].srset; ; + break;} +case 117: +#line 568 "cgrammar.y" +{ yyval.srset = sRefSet_new (); ; + break;} +case 118: +#line 571 "cgrammar.y" +{ yyval.sr = uentry_getSref (yyvsp[0].entry); checkModifiesId (yyvsp[0].entry); ; + break;} +case 119: +#line 572 "cgrammar.y" +{ yyval.sr = fixModifiesId (yyvsp[0].cname); ; + break;} +case 120: +#line 573 "cgrammar.y" +{ yyval.sr = modListArrayFetch (yyvsp[-2].sr, sRef_undefined); ; + break;} +case 121: +#line 574 "cgrammar.y" +{ yyval.sr = modListArrayFetch (yyvsp[-3].sr, yyvsp[-1].sr); ; + break;} +case 122: +#line 575 "cgrammar.y" +{ yyval.sr = modListPointer (yyvsp[0].sr); ; + break;} +case 123: +#line 576 "cgrammar.y" +{ yyval.sr = yyvsp[-1].sr; ; + break;} +case 124: +#line 577 "cgrammar.y" +{ yyval.sr = modListFieldAccess (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 125: +#line 578 "cgrammar.y" +{ yyval.sr = modListArrowAccess (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 126: +#line 582 "cgrammar.y" +{ yyval.sr = yyvsp[0].sr; ; + break;} +case 127: +#line 583 "cgrammar.y" +{ yyval.sr = sRef_makeUnknown (); /* sRef_makeConstant ($1); ? */ ; + break;} +case 128: +#line 587 "cgrammar.y" +{ yyval.srset = sRefSet_single (yyvsp[0].sr); ; + break;} +case 129: +#line 588 "cgrammar.y" +{ yyval.srset = sRefSet_insert (yyvsp[-2].srset, yyvsp[0].sr); ; + break;} +case 130: +#line 592 "cgrammar.y" +{ yyval.sr = checkSpecClausesId (yyvsp[0].entry); ; + break;} +case 131: +#line 594 "cgrammar.y" +{ yyval.sr = fixSpecClausesId (yyvsp[0].cname); ; + break;} +case 132: +#line 595 "cgrammar.y" +{ yyval.sr = sRef_makeAnyArrayFetch (yyvsp[-2].sr); ; + break;} +case 133: +#line 596 "cgrammar.y" +{ yyval.sr = sRef_makeAnyArrayFetch (yyvsp[-3].sr); ; + break;} +case 134: +#line 597 "cgrammar.y" +{ yyval.sr = sRef_constructPointer (yyvsp[0].sr); ; + break;} +case 135: +#line 598 "cgrammar.y" +{ yyval.sr = yyvsp[-1].sr; ; + break;} +case 136: +#line 599 "cgrammar.y" +{ cstring_markOwned (yyvsp[0].cname); + yyval.sr = sRef_buildField (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 137: +#line 601 "cgrammar.y" +{ cstring_markOwned (yyvsp[0].cname); + yyval.sr = sRef_makeArrow (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 138: +#line 606 "cgrammar.y" +{ if (sRef_isValid (yyvsp[0].sr)) { yyval.srset = sRefSet_single (yyvsp[0].sr); } + else { yyval.srset = sRefSet_undefined; } + ; + break;} +case 139: +#line 610 "cgrammar.y" +{ if (sRef_isValid (yyvsp[0].sr)) + { + yyval.srset = sRefSet_insert (yyvsp[-2].srset, yyvsp[0].sr); + } + else + { + yyval.srset = yyvsp[-2].srset; + } + ; + break;} +case 140: +#line 621 "cgrammar.y" +{ yyval.expr = exprNode_fromIdentifier (yyvsp[0].entry); ; + break;} +case 141: +#line 622 "cgrammar.y" +{ yyval.expr = exprNode_fromUIO (yyvsp[0].cname); ; + break;} +case 143: +#line 624 "cgrammar.y" +{ yyval.expr = exprNode_addParens (yyvsp[-2].tok, yyvsp[-1].expr); ; + break;} +case 144: +#line 625 "cgrammar.y" +{ yyval.expr = exprNode_fromIdentifier (coerceId (yyvsp[0].cname)); ; + break;} +case 145: +#line 626 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 147: +#line 630 "cgrammar.y" +{ yyval.expr = exprNode_arrayFetch (yyvsp[-3].expr, yyvsp[-1].expr); ; + break;} +case 148: +#line 631 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-2].expr, exprNodeList_new ()); ; + break;} +case 149: +#line 632 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-3].expr, yyvsp[-1].alist); ; + break;} +case 150: +#line 633 "cgrammar.y" +{ yyval.expr = exprNode_vaArg (yyvsp[-5].tok, yyvsp[-3].expr, yyvsp[-1].qtyp); ; + break;} +case 151: +#line 634 "cgrammar.y" +{ yyval.expr = exprNode_fieldAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 152: +#line 635 "cgrammar.y" +{ yyval.expr = exprNode_arrowAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 153: +#line 636 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 154: +#line 637 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 155: +#line 640 "cgrammar.y" +{ yyval.alist = exprNodeList_singleton (yyvsp[0].expr); ; + break;} +case 156: +#line 641 "cgrammar.y" +{ yyval.alist = exprNodeList_push (yyvsp[-2].alist, yyvsp[0].expr); ; + break;} +case 158: +#line 645 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 159: +#line 646 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 160: +#line 647 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 161: +#line 648 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 162: +#line 649 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 163: +#line 650 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 164: +#line 651 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 165: +#line 652 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 166: +#line 653 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 167: +#line 654 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 168: +#line 657 "cgrammar.y" +{ yyval.cstringlist = cstringList_add (yyvsp[-2].cstringlist, yyvsp[0].cname); ; + break;} +case 169: +#line 658 "cgrammar.y" +{ yyval.cstringlist = cstringList_single (yyvsp[0].cname); ; + break;} +case 170: +#line 662 "cgrammar.y" +{ yyval.expr = exprNode_offsetof (yyvsp[-5].qtyp, yyvsp[-2].cstringlist); ; + break;} +case 171: +#line 665 "cgrammar.y" +{ context_setProtectVars (); ; + break;} +case 172: +#line 666 "cgrammar.y" +{ context_sizeofReleaseVars (); yyval.expr = yyvsp[0].expr; ; + break;} +case 173: +#line 669 "cgrammar.y" +{ yyval.expr = exprNode_sizeofType (yyvsp[-1].qtyp); ; + break;} +case 174: +#line 670 "cgrammar.y" +{ yyval.expr = exprNode_sizeofExpr (yyvsp[0].expr); ; + break;} +case 175: +#line 671 "cgrammar.y" +{ yyval.expr = exprNode_alignofType (yyvsp[-1].qtyp); ; + break;} +case 176: +#line 672 "cgrammar.y" +{ yyval.expr = exprNode_alignofExpr (yyvsp[0].expr); ; + break;} +case 178: +#line 677 "cgrammar.y" +{ yyval.expr = exprNode_cast (yyvsp[-3].tok, yyvsp[0].expr, yyvsp[-2].qtyp); ; + break;} +case 180: +#line 681 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 181: +#line 682 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 182: +#line 683 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 184: +#line 687 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 185: +#line 688 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 187: +#line 692 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 188: +#line 693 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 190: +#line 697 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 191: +#line 698 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 192: +#line 699 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 193: +#line 700 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 195: +#line 704 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 196: +#line 705 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 198: +#line 709 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 200: +#line 713 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 202: +#line 718 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 204: +#line 723 "cgrammar.y" +{ exprNode_produceGuards (yyvsp[-1].expr); + context_enterAndClause (yyvsp[-1].expr); + ; + break;} +case 205: +#line 727 "cgrammar.y" +{ + yyval.expr = exprNode_op (yyvsp[-3].expr, yyvsp[0].expr, yyvsp[-2].tok); + context_exitAndClause (yyval.expr, yyvsp[0].expr); + ; + break;} +case 207: +#line 735 "cgrammar.y" +{ + exprNode_produceGuards (yyvsp[-1].expr); + context_enterOrClause (yyvsp[-1].expr); + ; + break;} +case 208: +#line 740 "cgrammar.y" +{ + yyval.expr = exprNode_op (yyvsp[-3].expr, yyvsp[0].expr, yyvsp[-2].tok); + context_exitOrClause (yyval.expr, yyvsp[0].expr); + ; + break;} +case 210: +#line 747 "cgrammar.y" +{ exprNode_produceGuards (yyvsp[-1].expr); context_enterTrueClause (yyvsp[-1].expr); ; + break;} +case 211: +#line 748 "cgrammar.y" +{ context_enterFalseClause (yyvsp[-4].expr); ; + break;} +case 212: +#line 749 "cgrammar.y" +{ yyval.expr = exprNode_cond (yyvsp[-6].expr, yyvsp[-3].expr, yyvsp[0].expr); context_exitClause (yyvsp[-6].expr, yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 214: +#line 753 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 215: +#line 754 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 216: +#line 755 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 217: +#line 756 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 218: +#line 757 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 219: +#line 758 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 220: +#line 759 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 221: +#line 760 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 222: +#line 761 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 223: +#line 762 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 224: +#line 763 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 226: +#line 767 "cgrammar.y" +{ yyval.expr = exprNode_comma (yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 227: +#line 770 "cgrammar.y" +{ yyval.expr = exprNode_undefined; ; + break;} +case 230: +#line 779 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 231: +#line 780 "cgrammar.y" +{ doVaDcl (); yyval.expr = exprNode_makeError (); ; + break;} +case 232: +#line 781 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 233: +#line 784 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 234: +#line 798 "cgrammar.y" +{ + setProcessingVars (yyvsp[-3].qtyp); + processNamedDecl (yyvsp[-1].ntyp); ; + break;} +case 235: +#line 801 "cgrammar.y" +{ unsetProcessingVars (); yyval.expr = yyvsp[-2].expr; ; + break;} +case 236: +#line 803 "cgrammar.y" +{ setProcessingVars (yyvsp[-4].qtyp); processNamedDecl (yyvsp[-2].ntyp); + ; + break;} +case 237: +#line 806 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-2].expr, exprNode_makeInitialization (yyvsp[-8].ntyp, yyvsp[-3].expr)); + unsetProcessingVars (); + ; + break;} +case 238: +#line 810 "cgrammar.y" +{ processNamedDecl (yyvsp[-1].ntyp); yyval.expr = exprNode_makeError (); ; + break;} +case 239: +#line 811 "cgrammar.y" +{ processNamedDecl (yyvsp[-2].ntyp); ; + break;} +case 240: +#line 812 "cgrammar.y" +{ yyval.expr = exprNode_makeInitialization (yyvsp[-5].ntyp, yyvsp[0].expr); ; + break;} +case 241: +#line 816 "cgrammar.y" +{ setProcessingTypedef (yyvsp[0].qtyp); ; + break;} +case 242: +#line 817 "cgrammar.y" +{ unsetProcessingTypedef (); ; + break;} +case 243: +#line 818 "cgrammar.y" +{ /* in the ANSI grammar, semantics unclear */ ; + break;} +case 244: +#line 819 "cgrammar.y" +{ /* in the ANSI grammar, semantics unclear */ ; + break;} +case 245: +#line 822 "cgrammar.y" +{ g_expectingTypeName = TRUE; ; + break;} +case 246: +#line 825 "cgrammar.y" +{ g_expectingTypeName = TRUE; context_pushLoc (); ; + break;} +case 247: +#line 828 "cgrammar.y" +{ ; ; + break;} +case 248: +#line 831 "cgrammar.y" +{ ; ; + break;} +case 249: +#line 832 "cgrammar.y" +{ ; ; + break;} +case 250: +#line 835 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 251: +#line 836 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 253: +#line 840 "cgrammar.y" +{ yyval.expr = exprNode_makeInitBlock (yyvsp[-2].tok, yyvsp[-1].alist); ; + break;} +case 254: +#line 841 "cgrammar.y" +{ yyval.expr = exprNode_makeInitBlock (yyvsp[-3].tok, yyvsp[-2].alist); ; + break;} +case 255: +#line 846 "cgrammar.y" +{ yyval.alist = exprNodeList_singleton (yyvsp[0].expr); ; + break;} +case 256: +#line 848 "cgrammar.y" +{ yyval.alist = exprNodeList_push (yyvsp[-2].alist, yyvsp[0].expr); ; + break;} +case 257: +#line 856 "cgrammar.y" +{ setStorageClass (SCEXTERN); yyval.typequal = qual_createExtern (); ; + break;} +case 258: +#line 857 "cgrammar.y" +{ yyval.typequal = qual_createInline (); ; + break;} +case 259: +#line 858 "cgrammar.y" +{ setStorageClass (SCSTATIC); yyval.typequal = qual_createStatic (); ; + break;} +case 260: +#line 859 "cgrammar.y" +{ yyval.typequal = qual_createAuto (); ; + break;} +case 261: +#line 860 "cgrammar.y" +{ yyval.typequal = qual_createRegister (); ; + break;} +case 262: +#line 863 "cgrammar.y" +{ yyval.typequal = qual_createConst (); ; + break;} +case 263: +#line 864 "cgrammar.y" +{ yyval.typequal = qual_createVolatile (); ; + break;} +case 264: +#line 865 "cgrammar.y" +{ yyval.typequal = qual_createOut (); ; + break;} +case 265: +#line 866 "cgrammar.y" +{ yyval.typequal = qual_createIn (); ; + break;} +case 266: +#line 867 "cgrammar.y" +{ yyval.typequal = qual_createPartial (); ; + break;} +case 267: +#line 868 "cgrammar.y" +{ yyval.typequal = qual_createSpecial (); ; + break;} +case 268: +#line 869 "cgrammar.y" +{ yyval.typequal = qual_createOwned (); ; + break;} +case 269: +#line 870 "cgrammar.y" +{ yyval.typequal = qual_createDependent (); ; + break;} +case 270: +#line 871 "cgrammar.y" +{ yyval.typequal = qual_createYield (); ; + break;} +case 271: +#line 872 "cgrammar.y" +{ yyval.typequal = qual_createTemp (); ; + break;} +case 272: +#line 873 "cgrammar.y" +{ yyval.typequal = qual_createOnly (); ; + break;} +case 273: +#line 874 "cgrammar.y" +{ yyval.typequal = qual_createKeep (); ; + break;} +case 274: +#line 875 "cgrammar.y" +{ yyval.typequal = qual_createKept (); ; + break;} +case 275: +#line 876 "cgrammar.y" +{ yyval.typequal = qual_createShared (); ; + break;} +case 276: +#line 877 "cgrammar.y" +{ yyval.typequal = qual_createUnique (); ; + break;} +case 277: +#line 878 "cgrammar.y" +{ yyval.typequal = qual_createExits (); ; + break;} +case 278: +#line 879 "cgrammar.y" +{ yyval.typequal = qual_createMayExit (); ; + break;} +case 279: +#line 880 "cgrammar.y" +{ yyval.typequal = qual_createTrueExit (); ; + break;} +case 280: +#line 881 "cgrammar.y" +{ yyval.typequal = qual_createFalseExit (); ; + break;} +case 281: +#line 882 "cgrammar.y" +{ yyval.typequal = qual_createNeverExit (); ; + break;} +case 282: +#line 883 "cgrammar.y" +{ yyval.typequal = qual_createNull (); ; + break;} +case 283: +#line 884 "cgrammar.y" +{ yyval.typequal = qual_createRelNull (); ; + break;} +case 284: +#line 885 "cgrammar.y" +{ yyval.typequal = qual_createReturned (); ; + break;} +case 285: +#line 886 "cgrammar.y" +{ yyval.typequal = qual_createExposed (); ; + break;} +case 286: +#line 887 "cgrammar.y" +{ yyval.typequal = qual_createObserver (); ; + break;} +case 287: +#line 888 "cgrammar.y" +{ yyval.typequal = qual_createChecked (); ; + break;} +case 288: +#line 889 "cgrammar.y" +{ yyval.typequal = qual_createCheckMod (); ; + break;} +case 289: +#line 890 "cgrammar.y" +{ yyval.typequal = qual_createUnchecked (); ; + break;} +case 290: +#line 891 "cgrammar.y" +{ yyval.typequal = qual_createCheckedStrict (); ; + break;} +case 291: +#line 892 "cgrammar.y" +{ yyval.typequal = qual_createTrueNull (); ; + break;} +case 292: +#line 893 "cgrammar.y" +{ yyval.typequal = qual_createFalseNull (); ; + break;} +case 293: +#line 894 "cgrammar.y" +{ yyval.typequal = qual_createUnused (); ; + break;} +case 294: +#line 895 "cgrammar.y" +{ yyval.typequal = qual_createExternal (); ; + break;} +case 295: +#line 896 "cgrammar.y" +{ yyval.typequal = qual_createSef (); ; + break;} +case 296: +#line 897 "cgrammar.y" +{ yyval.typequal = qual_createAbstract (); ; + break;} +case 297: +#line 898 "cgrammar.y" +{ yyval.typequal = qual_createConcrete (); ; + break;} +case 298: +#line 899 "cgrammar.y" +{ yyval.typequal = qual_createMutable (); ; + break;} +case 299: +#line 900 "cgrammar.y" +{ yyval.typequal = qual_createImmutable (); ; + break;} +case 300: +#line 901 "cgrammar.y" +{ yyval.typequal = qual_createNotNull (); ; + break;} +case 301: +#line 902 "cgrammar.y" +{ yyval.typequal = qual_createRefCounted (); ; + break;} +case 302: +#line 903 "cgrammar.y" +{ yyval.typequal = qual_createRefs (); ; + break;} +case 303: +#line 904 "cgrammar.y" +{ yyval.typequal = qual_createKillRef (); ; + break;} +case 304: +#line 905 "cgrammar.y" +{ yyval.typequal = qual_createRelDef (); ; + break;} +case 305: +#line 906 "cgrammar.y" +{ yyval.typequal = qual_createNewRef (); ; + break;} +case 306: +#line 907 "cgrammar.y" +{ yyval.typequal = qual_createTempRef (); ; + break;} +case 307: +#line 910 "cgrammar.y" +{ yyval.typequal = qual_createShort (); ; + break;} +case 308: +#line 911 "cgrammar.y" +{ yyval.typequal = qual_createLong (); ; + break;} +case 309: +#line 912 "cgrammar.y" +{ yyval.typequal = qual_createSigned (); ; + break;} +case 310: +#line 913 "cgrammar.y" +{ yyval.typequal = qual_createUnsigned (); ; + break;} +case 317: +#line 922 "cgrammar.y" +{ yyval.ctyp = ctype_unknown; ; + break;} +case 318: +#line 923 "cgrammar.y" +{ yyval.ctyp = ctype_anyintegral; ; + break;} +case 319: +#line 924 "cgrammar.y" +{ yyval.ctyp = ctype_unsignedintegral; ; + break;} +case 320: +#line 925 "cgrammar.y" +{ yyval.ctyp = ctype_signedintegral; ; + break;} +case 324: +#line 929 "cgrammar.y" +{ yyval.ctyp = ctype_fromQual (yyvsp[-1].typequal); ; + break;} +case 325: +#line 933 "cgrammar.y" +{ yyval.qtyp = qtype_resolve (yyvsp[-1].qtyp); ; + break;} +case 326: +#line 936 "cgrammar.y" +{ yyval.qtyp = yyvsp[0].qtyp; ; + break;} +case 327: +#line 938 "cgrammar.y" +{ yyval.qtyp = qtype_mergeAlt (yyvsp[-3].qtyp, yyvsp[-1].qtyp); ; + break;} +case 329: +#line 943 "cgrammar.y" +{ yyval.qtyp = qtype_mergeAlt (yyvsp[-2].qtyp, yyvsp[0].qtyp); ; + break;} +case 330: +#line 946 "cgrammar.y" +{ yyval.qtyp = qtype_addQual (yyvsp[0].qtyp, yyvsp[-1].typequal); ; + break;} +case 331: +#line 947 "cgrammar.y" +{ yyval.qtyp = qtype_addQual (yyvsp[0].qtyp, yyvsp[-1].typequal); ; + break;} +case 332: +#line 948 "cgrammar.y" +{ yyval.qtyp = qtype_combine (yyvsp[0].qtyp, yyvsp[-1].ctyp); ; + break;} +case 333: +#line 951 "cgrammar.y" +{ yyval.qtyp = qtype_unknown (); ; + break;} +case 334: +#line 952 "cgrammar.y" +{ yyval.qtyp = yyvsp[0].qtyp; ; + break;} +case 335: +#line 955 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 336: +#line 957 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 337: +#line 959 "cgrammar.y" +{ yyval.ctyp = declareStruct (yyvsp[-8].cname, yyvsp[-3].flist); ; + break;} +case 338: +#line 960 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 339: +#line 962 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 340: +#line 964 "cgrammar.y" +{ yyval.ctyp = declareUnion (yyvsp[-8].cname, yyvsp[-3].flist); ; + break;} +case 341: +#line 966 "cgrammar.y" +{ yyval.ctyp = declareStruct (yyvsp[-3].cname, uentryList_new ()); ; + break;} +case 342: +#line 968 "cgrammar.y" +{ yyval.ctyp = declareUnion (yyvsp[-3].cname, uentryList_new ()); ; + break;} +case 343: +#line 969 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 344: +#line 971 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 345: +#line 973 "cgrammar.y" +{ yyval.ctyp = declareUnnamedStruct (yyvsp[-3].flist); ; + break;} +case 346: +#line 974 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 347: +#line 976 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 348: +#line 978 "cgrammar.y" +{ yyval.ctyp = declareUnnamedUnion (yyvsp[-3].flist); ; + break;} +case 349: +#line 980 "cgrammar.y" +{ yyval.ctyp = ctype_createUnnamedStruct (uentryList_new ()); ; + break;} +case 350: +#line 982 "cgrammar.y" +{ yyval.ctyp = ctype_createUnnamedUnion (uentryList_new ()); ; + break;} +case 351: +#line 983 "cgrammar.y" +{ yyval.ctyp = handleStruct (yyvsp[-1].cname); ; + break;} +case 352: +#line 984 "cgrammar.y" +{ yyval.ctyp = handleUnion (yyvsp[-1].cname); ; + break;} +case 353: +#line 987 "cgrammar.y" +{ g_expectingTypeName = FALSE; ; + break;} +case 355: +#line 991 "cgrammar.y" +{ yyval.flist = uentryList_undefined; /* bogus! */ ; + break;} +case 356: +#line 992 "cgrammar.y" +{ yyval.flist = uentryList_mergeFields (yyvsp[-1].flist, yyvsp[0].flist); ; + break;} +case 357: +#line 996 "cgrammar.y" +{ yyval.flist = fixUentryList (yyvsp[-2].ntyplist, yyvsp[-4].qtyp); ; + break;} +case 358: +#line 998 "cgrammar.y" +{ yyval.flist = fixUnnamedDecl (yyvsp[-2].qtyp); ; + break;} +case 359: +#line 1002 "cgrammar.y" +{ yyval.ntyplist = idDeclList_singleton (yyvsp[-1].ntyp); ; + break;} +case 360: +#line 1004 "cgrammar.y" +{ yyval.ntyplist = idDeclList_add (yyvsp[-3].ntyplist, yyvsp[-1].ntyp); ; + break;} +case 361: +#line 1007 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; ; + break;} +case 362: +#line 1008 "cgrammar.y" +{ yyval.ntyp = idDecl_undefined; ; + break;} +case 363: +#line 1009 "cgrammar.y" +{ yyval.ntyp = yyvsp[-3].ntyp; ; + break;} +case 364: +#line 1014 "cgrammar.y" +{ yyval.ctyp = declareUnnamedEnum (yyvsp[-2].enumnamelist); ; + break;} +case 365: +#line 1015 "cgrammar.y" +{ context_pushLoc (); ; + break;} +case 366: +#line 1016 "cgrammar.y" +{ context_popLoc (); yyval.ctyp = declareEnum (yyvsp[-5].cname, yyvsp[-2].enumnamelist); ; + break;} +case 367: +#line 1017 "cgrammar.y" +{ yyval.ctyp = handleEnum (yyvsp[-1].cname); ; + break;} +case 368: +#line 1021 "cgrammar.y" +{ yyval.enumnamelist = enumNameList_single (yyvsp[0].cname); ; + break;} +case 369: +#line 1023 "cgrammar.y" +{ yyval.enumnamelist = enumNameList_push (yyvsp[-2].enumnamelist, yyvsp[0].cname); ; + break;} +case 371: +#line 1028 "cgrammar.y" +{ uentry ue = uentry_makeEnumConstant (yyvsp[0].cname, ctype_unknown); + usymtab_supGlobalEntry (ue); + yyval.cname = yyvsp[0].cname; + ; + break;} +case 372: +#line 1033 "cgrammar.y" +{ uentry ue = uentry_makeEnumInitializedConstant (yyvsp[-3].cname, ctype_unknown, yyvsp[0].expr); + usymtab_supGlobalEntry (ue); + yyval.cname = yyvsp[-3].cname; + ; + break;} +case 374: +#line 1040 "cgrammar.y" +{ yyval.ntyp = idDecl_create (cstring_undefined, qtype_create (yyvsp[0].ctyp)); ; + break;} +case 375: +#line 1042 "cgrammar.y" +{ + qtype qt = qtype_unknown (); + + qtype_adjustPointers (yyvsp[-1].count, qt); + yyval.ntyp = idDecl_create (cstring_copy (LastIdentifier ()), qt); + ; + break;} +case 376: +#line 1049 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; qtype_adjustPointers (yyvsp[-1].count, idDecl_getTyp (yyval.ntyp)); ; + break;} +case 378: +#line 1054 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; qtype_adjustPointers (yyvsp[-1].count, idDecl_getTyp (yyval.ntyp)); ; + break;} +case 379: +#line 1057 "cgrammar.y" +{ yyval.entrylist = handleParamTypeList (yyvsp[0].entrylist); ; + break;} +case 380: +#line 1058 "cgrammar.y" +{ yyval.entrylist = handleParamIdList (yyvsp[0].entrylist); ; + break;} +case 381: +#line 1061 "cgrammar.y" +{ /* ignored for now */; ; + break;} +case 382: +#line 1062 "cgrammar.y" +{ ; ; + break;} +case 383: +#line 1065 "cgrammar.y" +{ ; ; + break;} +case 384: +#line 1066 "cgrammar.y" +{ ; ; + break;} +case 385: +#line 1069 "cgrammar.y" +{ yyval.count = 1; ; + break;} +case 386: +#line 1070 "cgrammar.y" +{ yyval.count = 1; ; + break;} +case 387: +#line 1071 "cgrammar.y" +{ yyval.count = 1 + yyvsp[0].count; ; + break;} +case 388: +#line 1072 "cgrammar.y" +{ yyval.count = 1 + yyvsp[0].count; ; + break;} +case 390: +#line 1076 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-2].entrylist, uentry_makeElipsisMarker ()); ; + break;} +case 391: +#line 1079 "cgrammar.y" +{ yyval.entrylist = uentryList_single (uentry_makeVariableLoc (yyvsp[0].cname, ctype_int)); ; + break;} +case 392: +#line 1080 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-2].entrylist, uentry_makeVariableLoc (yyvsp[0].cname, ctype_int)); ; + break;} +case 393: +#line 1083 "cgrammar.y" +{ yyval.entrylist = uentryList_single (uentry_makeElipsisMarker ()); ; + break;} +case 395: +#line 1085 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-2].entrylist, uentry_makeElipsisMarker ()); ; + break;} +case 396: +#line 1088 "cgrammar.y" +{ storeLoc (); ; + break;} +case 397: +#line 1088 "cgrammar.y" +{ yyval.entrylist = uentryList_single (yyvsp[0].oentry); ; + break;} +case 398: +#line 1089 "cgrammar.y" +{ storeLoc (); ; + break;} +case 399: +#line 1090 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-3].entrylist, yyvsp[0].oentry); ; + break;} +case 400: +#line 1094 "cgrammar.y" +{ + if (isFlipOldStyle ()) + { + llparseerror (cstring_makeLiteral ("Inconsistent function parameter syntax (mixing old and new style declaration)")); + } + else + { + setNewStyle (); + } + yyval.oentry = makeCurrentParam (idDecl_fixParamBase (yyvsp[-1].ntyp, yyvsp[-2].qtyp)); + ; + break;} +case 401: +#line 1106 "cgrammar.y" +{ + idDecl tparam = idDecl_create (yyvsp[0].cname, qtype_unknown ()); + + if (isNewStyle ()) + { + llparseerror (message ("Inconsistent function parameter syntax: %q", + idDecl_unparse (tparam))); + } + + setFlipOldStyle (); + yyval.oentry = makeCurrentParam (tparam); + idDecl_free (tparam); + ; + break;} +case 403: +#line 1122 "cgrammar.y" +{ yyval.qtyp = qtype_newBase (yyvsp[-1].qtyp, yyvsp[0].ctyp); ; + break;} +case 404: +#line 1125 "cgrammar.y" +{ yyval.ctyp = ctype_adjustPointers (yyvsp[0].count, ctype_unknown); ; + break;} +case 406: +#line 1127 "cgrammar.y" +{ yyval.ctyp = ctype_adjustPointers (yyvsp[-1].count, yyvsp[0].ctyp); ; + break;} +case 407: +#line 1130 "cgrammar.y" +{ yyval.ctyp = ctype_unknown; ; + break;} +case 409: +#line 1135 "cgrammar.y" +{ yyval.ctyp = ctype_expectFunction (yyvsp[-1].ctyp); ; + break;} +case 410: +#line 1136 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (ctype_unknown); ; + break;} +case 411: +#line 1137 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (ctype_unknown); ; + break;} +case 412: +#line 1138 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (yyvsp[-2].ctyp); ; + break;} +case 413: +#line 1139 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (yyvsp[-3].ctyp); ; + break;} +case 414: +#line 1141 "cgrammar.y" +{ yyval.ctyp = ctype_makeFunction (ctype_unknown, uentryList_makeMissingParams ()); ; + break;} +case 415: +#line 1143 "cgrammar.y" +{ yyval.ctyp = ctype_makeParamsFunction (ctype_unknown, yyvsp[-1].entrylist); ; + break;} +case 416: +#line 1145 "cgrammar.y" +{ yyval.ctyp = ctype_makeFunction (yyvsp[-3].ctyp, uentryList_makeMissingParams ()); ; + break;} +case 417: +#line 1147 "cgrammar.y" +{ yyval.ctyp = ctype_makeParamsFunction (yyvsp[-4].ctyp, yyvsp[-1].entrylist); ; + break;} +case 427: +#line 1163 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 430: +#line 1171 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 431: +#line 1175 "cgrammar.y" +{ yyval.expr = exprNode_while (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 432: +#line 1177 "cgrammar.y" +{ yyval.expr = exprNode_doWhile (yyvsp[-5].expr, yyvsp[-2].expr); ; + break;} +case 433: +#line 1179 "cgrammar.y" +{ yyval.expr = exprNode_doWhile (yyvsp[-4].expr, yyvsp[-1].expr); ; + break;} +case 434: +#line 1181 "cgrammar.y" +{ yyval.expr = exprNode_for (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 435: +#line 1185 "cgrammar.y" +{ context_setProtectVars (); ; + break;} +case 436: +#line 1185 "cgrammar.y" +{ context_sizeofReleaseVars (); ; + break;} +case 437: +#line 1187 "cgrammar.y" +{ yyval.expr = exprNode_forPred (yyvsp[-7].expr, yyvsp[-5].expr, yyvsp[-2].expr); + context_enterForClause (yyvsp[-5].expr); ; + break;} +case 438: +#line 1192 "cgrammar.y" +{ setProcessingIterVars (yyvsp[-2].entry); ; + break;} +case 439: +#line 1194 "cgrammar.y" +{ yyval.expr = exprNode_iterStart (yyvsp[-5].entry, yyvsp[-1].alist); ; + break;} +case 440: +#line 1195 "cgrammar.y" +{ yyval.expr = exprNode_createId (yyvsp[0].entry); ; + break;} +case 444: +#line 1201 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 452: +#line 1209 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; ; + break;} +case 453: +#line 1210 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 454: +#line 1214 "cgrammar.y" +{ /* don't: context_exitTrueClause ($1, $2); */ + yyval.expr = exprNode_if (yyvsp[-1].expr, yyvsp[0].expr); + ; + break;} +case 455: +#line 1219 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 456: +#line 1222 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 467: +#line 1237 "cgrammar.y" +{ yyval.expr = exprNode_addParens (yyvsp[-2].tok, yyvsp[-1].expr); ; + break;} +case 469: +#line 1239 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 470: +#line 1242 "cgrammar.y" +{ yyval.expr = exprNode_labelMarker (yyvsp[-1].cname); ; + break;} +case 471: +#line 1243 "cgrammar.y" +{ yyval.expr = exprNode_notReached (yyvsp[0].expr); ; + break;} +case 472: +#line 1249 "cgrammar.y" +{ context_enterCaseClause (yyvsp[0].expr); ; + break;} +case 473: +#line 1250 "cgrammar.y" +{ yyval.expr = exprNode_caseMarker (yyvsp[-2].expr, FALSE); ; + break;} +case 474: +#line 1251 "cgrammar.y" +{ context_enterCaseClause (yyvsp[0].expr); ; + break;} +case 475: +#line 1252 "cgrammar.y" +{ yyval.expr = exprNode_caseMarker (yyvsp[-2].expr, TRUE); ; + break;} +case 476: +#line 1255 "cgrammar.y" +{ context_enterCaseClause (exprNode_undefined); ; + break;} +case 477: +#line 1256 "cgrammar.y" +{ yyval.expr = exprNode_defaultMarker (yyvsp[-2].tok, FALSE); ; + break;} +case 478: +#line 1257 "cgrammar.y" +{ context_enterCaseClause (exprNode_undefined); ; + break;} +case 479: +#line 1258 "cgrammar.y" +{ yyval.expr = exprNode_defaultMarker (yyvsp[-2].tok, TRUE); ; + break;} +case 480: +#line 1261 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; ; + break;} +case 481: +#line 1263 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; context_exitInner (yyvsp[0].expr); ; + break;} +case 482: +#line 1266 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; ; + break;} +case 483: +#line 1269 "cgrammar.y" +{ context_enterInnerContext (); ; + break;} +case 484: +#line 1272 "cgrammar.y" +{ context_exitInnerPlain (); ; + break;} +case 485: +#line 1275 "cgrammar.y" +{ context_enterStructInnerContext (); ; + break;} +case 486: +#line 1278 "cgrammar.y" +{ context_exitStructInnerContext (); ; + break;} +case 487: +#line 1281 "cgrammar.y" +{ context_exitInnerSafe (); ; + break;} +case 488: +#line 1284 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 489: +#line 1285 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_createTok (yyvsp[0].tok)); ; + break;} +case 490: +#line 1286 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 491: +#line 1288 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_updateLocation (yyvsp[-2].expr, lltok_getLoc (yyvsp[0].tok))); ; + break;} +case 492: +#line 1289 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 493: +#line 1291 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_updateLocation (yyvsp[-2].expr, lltok_getLoc (yyvsp[0].tok))); ; + break;} +case 494: +#line 1293 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (exprNode_concat (yyvsp[-2].expr, yyvsp[-1].expr), lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 495: +#line 1295 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_updateLocation (exprNode_concat (yyvsp[-3].expr, yyvsp[-2].expr), + lltok_getLoc (yyvsp[-1].tok))); + ; + break;} +case 496: +#line 1302 "cgrammar.y" +{ yyval.expr = exprNode_makeBlock (yyvsp[0].expr); ; + break;} +case 497: +#line 1306 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 498: +#line 1308 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 499: +#line 1310 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 500: +#line 1312 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (exprNode_concat (yyvsp[-2].expr, yyvsp[-1].expr), lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 502: +#line 1316 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 503: +#line 1319 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 504: +#line 1320 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 505: +#line 1323 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 506: +#line 1324 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 507: +#line 1327 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 508: +#line 1328 "cgrammar.y" +{ yyval.expr = exprNode_statement (yyvsp[-1].expr); ; + break;} +case 509: +#line 1331 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 510: +#line 1332 "cgrammar.y" +{ yyval.expr = exprNode_statement (yyvsp[-1].expr); ; + break;} +case 511: +#line 1333 "cgrammar.y" +{ yyval.expr = exprNode_checkExpr (yyvsp[0].expr); ; + break;} +case 512: +#line 1337 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; exprNode_produceGuards (yyvsp[-1].expr); context_enterTrueClause (yyvsp[-1].expr); ; + break;} +case 513: +#line 1345 "cgrammar.y" +{ + context_exitTrueClause (yyvsp[-1].expr, yyvsp[0].expr); + yyval.expr = exprNode_if (yyvsp[-1].expr, yyvsp[0].expr); + ; + break;} +case 514: +#line 1349 "cgrammar.y" +{ context_enterFalseClause (yyvsp[-2].expr); ; + break;} +case 515: +#line 1350 "cgrammar.y" +{ + context_exitClause (yyvsp[-4].expr, yyvsp[-3].expr, yyvsp[0].expr); + yyval.expr = exprNode_ifelse (yyvsp[-4].expr, yyvsp[-3].expr, yyvsp[0].expr); + ; + break;} +case 516: +#line 1354 "cgrammar.y" +{ context_enterSwitch (yyvsp[0].expr); ; + break;} +case 517: +#line 1355 "cgrammar.y" +{ yyval.expr = exprNode_switch (yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 518: +#line 1359 "cgrammar.y" +{ yyval.expr = exprNode_whilePred (yyvsp[-1].expr); context_enterWhileClause (yyvsp[-1].expr); ; + break;} +case 519: +#line 1363 "cgrammar.y" +{ yyval.expr = exprNode_whilePred(yyvsp[-1].expr); ; + break;} +case 520: +#line 1366 "cgrammar.y" +{ context_enterIterClause (); ; + break;} +case 521: +#line 1367 "cgrammar.y" +{ setProcessingIterVars (yyvsp[-3].entry); ; + break;} +case 522: +#line 1370 "cgrammar.y" +{ + yyval.expr = exprNode_iter (yyvsp[-9].entry, yyvsp[-4].alist, yyvsp[-2].expr, yyvsp[-1].entry); + + ; + break;} +case 523: +#line 1376 "cgrammar.y" +{ yyval.alist = exprNodeList_singleton (yyvsp[0].expr); ; + break;} +case 524: +#line 1377 "cgrammar.y" +{ nextIterParam (); ; + break;} +case 525: +#line 1378 "cgrammar.y" +{ yyval.alist = exprNodeList_push (yyvsp[-3].alist, yyvsp[0].expr); ; + break;} +case 526: +#line 1381 "cgrammar.y" +{ yyval.expr = exprNode_iterExpr (yyvsp[0].expr); ; + break;} +case 527: +#line 1382 "cgrammar.y" +{ yyval.expr = exprNode_iterId (yyvsp[0].entry); ; + break;} +case 528: +#line 1383 "cgrammar.y" +{ uentry ue = coerceIterId (yyvsp[0].cname); + + if (uentry_isValid (ue)) + { + yyval.expr = exprNode_iterId (ue); + } + else + { + yyval.expr = exprNode_iterNewId (cstring_copy (LastIdentifier ())); + } + ; + break;} +case 529: +#line 1394 "cgrammar.y" +{ yyval.expr = exprNode_iterNewId (yyvsp[0].cname); ; + break;} +case 531: +#line 1402 "cgrammar.y" +{ yyval.expr = exprNode_addParens (yyvsp[-2].tok, yyvsp[-1].expr); ; + break;} +case 533: +#line 1406 "cgrammar.y" +{ yyval.expr = exprNode_arrayFetch (yyvsp[-3].expr, yyvsp[-1].expr); ; + break;} +case 534: +#line 1407 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-2].expr, exprNodeList_new ()); ; + break;} +case 535: +#line 1408 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-3].expr, yyvsp[-1].alist); ; + break;} +case 536: +#line 1410 "cgrammar.y" +{ yyval.expr = exprNode_vaArg (yyvsp[-5].tok, yyvsp[-3].expr, yyvsp[-1].qtyp); ; + break;} +case 537: +#line 1411 "cgrammar.y" +{ yyval.expr = exprNode_fieldAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 538: +#line 1412 "cgrammar.y" +{ yyval.expr = exprNode_arrowAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 539: +#line 1413 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 540: +#line 1414 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 542: +#line 1418 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 543: +#line 1419 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 544: +#line 1420 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 545: +#line 1421 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 546: +#line 1422 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 547: +#line 1423 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 548: +#line 1424 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 549: +#line 1425 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 550: +#line 1426 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 552: +#line 1430 "cgrammar.y" +{ yyval.expr = exprNode_cast (yyvsp[-3].tok, yyvsp[0].expr, yyvsp[-2].qtyp); ; + break;} +case 554: +#line 1434 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 555: +#line 1435 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 556: +#line 1436 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 558: +#line 1440 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 559: +#line 1441 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 561: +#line 1445 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 562: +#line 1446 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 564: +#line 1450 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 565: +#line 1451 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 566: +#line 1452 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 567: +#line 1453 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 569: +#line 1457 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 570: +#line 1458 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 572: +#line 1462 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 574: +#line 1466 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 576: +#line 1471 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 578: +#line 1475 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 580: +#line 1479 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 582: +#line 1483 "cgrammar.y" +{ context_enterTrueClause (yyvsp[-1].expr); ; + break;} +case 583: +#line 1484 "cgrammar.y" +{ context_enterFalseClause (yyvsp[-4].expr); ; + break;} +case 584: +#line 1485 "cgrammar.y" +{ yyval.expr = exprNode_cond (yyvsp[-6].expr, yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 586: +#line 1489 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 587: +#line 1490 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 588: +#line 1491 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 589: +#line 1492 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 590: +#line 1493 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 591: +#line 1494 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 592: +#line 1495 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 593: +#line 1496 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 594: +#line 1497 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 595: +#line 1498 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 596: +#line 1499 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 597: +#line 1502 "cgrammar.y" +{ yyval.entry = yyvsp[0].entry; ; + break;} +case 598: +#line 1503 "cgrammar.y" +{ yyval.entry = uentry_undefined; ; + break;} +case 599: +#line 1506 "cgrammar.y" +{ context_enterDoWhileClause (); yyval.tok = yyvsp[0].tok; ; + break;} +case 600: +#line 1510 "cgrammar.y" +{ yyval.expr = exprNode_while (yyvsp[-1].expr, yyvsp[0].expr); context_exitWhileClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 601: +#line 1512 "cgrammar.y" +{ yyval.expr = exprNode_statement (exprNode_doWhile (yyvsp[-5].expr, yyvsp[-2].expr)); ; + break;} +case 602: +#line 1514 "cgrammar.y" +{ yyval.expr = exprNode_for (yyvsp[-1].expr, yyvsp[0].expr); context_exitForClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 603: +#line 1517 "cgrammar.y" +{ yyval.expr = exprNode_while (yyvsp[-1].expr, yyvsp[0].expr); context_exitWhileClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 604: +#line 1519 "cgrammar.y" +{ yyval.expr = exprNode_statement (exprNode_doWhile (yyvsp[-5].expr, yyvsp[-2].expr)); ; + break;} +case 605: +#line 1521 "cgrammar.y" +{ yyval.expr = exprNode_doWhile (yyvsp[-4].expr, yyvsp[-1].expr); ; + break;} +case 606: +#line 1522 "cgrammar.y" +{ yyval.expr = exprNode_for (yyvsp[-1].expr, yyvsp[0].expr); context_exitForClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 607: +#line 1525 "cgrammar.y" +{ yyval.expr = exprNode_goto (yyvsp[-1].cname); ; + break;} +case 608: +#line 1526 "cgrammar.y" +{ yyval.expr = exprNode_continue (yyvsp[-1].tok, BADTOK); ; + break;} +case 609: +#line 1528 "cgrammar.y" +{ yyval.expr = exprNode_continue (yyvsp[-2].tok, QINNERCONTINUE); ; + break;} +case 610: +#line 1529 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, BADTOK); ; + break;} +case 611: +#line 1530 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QSWITCHBREAK); ; + break;} +case 612: +#line 1531 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QLOOPBREAK); ; + break;} +case 613: +#line 1532 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QINNERBREAK); ; + break;} +case 614: +#line 1533 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QSAFEBREAK); ; + break;} +case 615: +#line 1534 "cgrammar.y" +{ yyval.expr = exprNode_nullReturn (yyvsp[-1].tok); ; + break;} +case 616: +#line 1535 "cgrammar.y" +{ yyval.expr = exprNode_return (yyvsp[-1].expr); ; + break;} +case 618: +#line 1539 "cgrammar.y" +{ ; ; + break;} +case 621: +#line 1546 "cgrammar.y" +{ yyval.cname = uentry_getName (yyvsp[0].entry); ; + break;} +case 622: +#line 1547 "cgrammar.y" +{ yyval.cname = uentry_getName (yyvsp[0].entry); ; + break;} +case 623: +#line 1548 "cgrammar.y" +{ yyval.cname = uentry_getName (yyvsp[0].entry); ; + break;} +case 624: +#line 1549 "cgrammar.y" +{ yyval.cname = yyvsp[0].cname; ; + break;} +case 626: +#line 1553 "cgrammar.y" +{ yyval.ctyp = ctype_unknown; ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 498 "/usr/share/misc/bison.simple" + + yyvsp -= yylen; + yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; + +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTBASE]; + + goto yynewstate; + +yyerrlab: /* here on detecting error */ + + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++yynerrs; + +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + free(msg); + } + else + yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("parse error"); + } + + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ + + if (yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif + + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token + after shifting the error token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto yyerrhandle; + +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif + +yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; + + if (yyn == YYFINAL) + YYACCEPT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + yystate = yyn; + goto yynewstate; +} +#line 1555 "cgrammar.y" + + +/*@-redecl@*/ +extern char *yytext; +/*@=redecl@*/ + +# include "bison.reset" + +void yyerror (/*@unused@*/ char *s) +{ + static bool givehint = FALSE; + + if (context_inIterDef ()) + { + llerror (FLG_SYNTAX, message ("Iter syntax not parseable: %s", + context_inFunctionName ())); + } + else if (context_inIterEnd ()) + { + llerror (FLG_SYNTAX, message ("Iter finalizer syntax not parseable: %s", + context_inFunctionName ())); + } + else if (context_inMacro ()) + { + llerror (FLG_SYNTAX, message ("Macro syntax not parseable: %s", + context_inFunctionName ())); + + if (context_inMacroUnknown ()) + { + if (!givehint) + { + llhint (cstring_makeLiteral + ("Precede macro definition with /*@notfunction@*/ " + "to suppress checking and force expansion")); + givehint = TRUE; + } + } + + swallowMacro (); + } + else + { + llparseerror (cstring_undefined); + } +} + + + + + + + + + + + + + diff --git a/src/cgrammar.mod b/src/cgrammar.mod new file mode 100644 index 0000000..cf581e1 --- /dev/null +++ b/src/cgrammar.mod @@ -0,0 +1,5477 @@ +/* +** Inserted at beginning of c files generated by bison +** REMEMBER: Change bison.reset too. +*/ + +/*@-allmacros@*/ +/*@+boolint@*/ +/*@+charint@*/ +/*@-macroparams@*/ +/*@-macroundef@*/ +/*@-unreachable@*/ +/*@-macrospec@*/ +/*@-varuse@*/ +/*@+ignorequals@*/ +/*@-macrostmt@*/ +/*@-noeffect@*/ +/*@-shadow@*/ +/*@-exitarg@*/ +/*@-macroredef@*/ +/*@-uniondef@*/ +/*@-compdef@*/ +/*@-matchfields@*/ +/*@-exportlocal@*/ +/*@-evalorderuncon@*/ +/*@-exportheader@*/ +/*@-typeuse@*/ +/*@-redecl@*/ +/*@-redef@*/ +/*@-noparams@*/ +/*@-ansireserved@*/ +/*@-fielduse@*/ +/*@-ifblock@*/ +/*@-elseifcomplete@*/ +/*@-whileblock@*/ +/*@-forblock@*/ +/*@-branchstate@*/ +/*@-readonlytrans@*/ +/*@-namechecks@*/ +/*@-usedef@*/ +/*@-systemunrecog@*/ +/*@-dependenttrans@*/ +/*@-unqualifiedtrans@*/ +/*@-nullassign@*/ + +/* < end of bison.head > */ + + +/* A Bison parser, made from cgrammar.y + by GNU Bison version 1.28 */ + +#define YYBISON 1 /* Identify Bison output. */ + +#define BADTOK 257 +#define SKIPTOK 258 +#define CTOK_ELIPSIS 259 +#define CASE 260 +#define DEFAULT 261 +#define CIF 262 +#define CELSE 263 +#define SWITCH 264 +#define WHILE 265 +#define DO 266 +#define CFOR 267 +#define GOTO 268 +#define CONTINUE 269 +#define BREAK 270 +#define RETURN 271 +#define TSEMI 272 +#define TLBRACE 273 +#define TRBRACE 274 +#define TCOMMA 275 +#define TCOLON 276 +#define TASSIGN 277 +#define TLPAREN 278 +#define TRPAREN 279 +#define TLSQBR 280 +#define TRSQBR 281 +#define TDOT 282 +#define TAMPERSAND 283 +#define TEXCL 284 +#define TTILDE 285 +#define TMINUS 286 +#define TPLUS 287 +#define TMULT 288 +#define TDIV 289 +#define TPERCENT 290 +#define TLT 291 +#define TGT 292 +#define TCIRC 293 +#define TBAR 294 +#define TQUEST 295 +#define CSIZEOF 296 +#define ARROW_OP 297 +#define CTYPEDEF 298 +#define COFFSETOF 299 +#define INC_OP 300 +#define DEC_OP 301 +#define LEFT_OP 302 +#define RIGHT_OP 303 +#define LE_OP 304 +#define GE_OP 305 +#define EQ_OP 306 +#define NE_OP 307 +#define AND_OP 308 +#define OR_OP 309 +#define MUL_ASSIGN 310 +#define DIV_ASSIGN 311 +#define MOD_ASSIGN 312 +#define ADD_ASSIGN 313 +#define SUB_ASSIGN 314 +#define LEFT_ASSIGN 315 +#define RIGHT_ASSIGN 316 +#define AND_ASSIGN 317 +#define XOR_ASSIGN 318 +#define OR_ASSIGN 319 +#define CSTRUCT 320 +#define CUNION 321 +#define CENUM 322 +#define VA_ARG 323 +#define VA_DCL 324 +#define QGLOBALS 325 +#define QMODIFIES 326 +#define QNOMODS 327 +#define QCONSTANT 328 +#define QFUNCTION 329 +#define QITER 330 +#define QDEFINES 331 +#define QUSES 332 +#define QALLOCATES 333 +#define QSETS 334 +#define QRELEASES 335 +#define QPRECLAUSE 336 +#define QPOSTCLAUSE 337 +#define QALT 338 +#define QUNDEF 339 +#define QKILLED 340 +#define QENDMACRO 341 +#define LLMACRO 342 +#define LLMACROITER 343 +#define LLMACROEND 344 +#define TENDMACRO 345 +#define QSWITCHBREAK 346 +#define QLOOPBREAK 347 +#define QINNERBREAK 348 +#define QSAFEBREAK 349 +#define QINNERCONTINUE 350 +#define QFALLTHROUGH 351 +#define QLINTNOTREACHED 352 +#define QLINTFALLTHROUGH 353 +#define QLINTFALLTHRU 354 +#define QARGSUSED 355 +#define QPRINTFLIKE 356 +#define QLINTPRINTFLIKE 357 +#define QSCANFLIKE 358 +#define QMESSAGELIKE 359 +#define QNOTREACHED 360 +#define QCONST 361 +#define QVOLATILE 362 +#define QINLINE 363 +#define QEXTENSION 364 +#define QEXTERN 365 +#define QSTATIC 366 +#define QAUTO 367 +#define QREGISTER 368 +#define QOUT 369 +#define QIN 370 +#define QYIELD 371 +#define QONLY 372 +#define QTEMP 373 +#define QSHARED 374 +#define QREF 375 +#define QUNIQUE 376 +#define QCHECKED 377 +#define QUNCHECKED 378 +#define QCHECKEDSTRICT 379 +#define QCHECKMOD 380 +#define QKEEP 381 +#define QKEPT 382 +#define QPARTIAL 383 +#define QSPECIAL 384 +#define QOWNED 385 +#define QDEPENDENT 386 +#define QRETURNED 387 +#define QEXPOSED 388 +#define QNULL 389 +#define QOBSERVER 390 +#define QISNULL 391 +#define QEXITS 392 +#define QMAYEXIT 393 +#define QNEVEREXIT 394 +#define QTRUEEXIT 395 +#define QFALSEEXIT 396 +#define QLONG 397 +#define QSIGNED 398 +#define QUNSIGNED 399 +#define QSHORT 400 +#define QUNUSED 401 +#define QSEF 402 +#define QNOTNULL 403 +#define QRELNULL 404 +#define QABSTRACT 405 +#define QCONCRETE 406 +#define QMUTABLE 407 +#define QIMMUTABLE 408 +#define QTRUENULL 409 +#define QFALSENULL 410 +#define QEXTERNAL 411 +#define QREFCOUNTED 412 +#define QREFS 413 +#define QNEWREF 414 +#define QTEMPREF 415 +#define QKILLREF 416 +#define QRELDEF 417 +#define CGCHAR 418 +#define CBOOL 419 +#define CINT 420 +#define CGFLOAT 421 +#define CDOUBLE 422 +#define CVOID 423 +#define QANYTYPE 424 +#define QINTEGRALTYPE 425 +#define QUNSIGNEDINTEGRALTYPE 426 +#define QSIGNEDINTEGRALTYPE 427 +#define IDENTIFIER 428 +#define NEW_IDENTIFIER 429 +#define CCONSTANT 430 +#define ITER_NAME 431 +#define ITER_ENDNAME 432 +#define TYPE_NAME 433 +#define TYPE_NAME_OR_ID 434 + +#line 19 "cgrammar.y" + +/* +** +** cgrammar.y +** +** Yacc/Bison grammar for extended ANSI C used by LCLint. +** +** original grammar by Nate Osgood --- +** hacrat@catfish.lcs.mit.edu Mon Jun 14 13:06:32 1993 +** +** changes for LCLint --- handle typedef names correctly +** fix struct/union parsing bug (empty struct is accepted) +** add productions to handle macros --- require +** error correction --- main source of conflicts in grammar. +** need to process initializations sequentially, L->R +** +** production names are cryptic, so more productions fit on one line +** +** conflicts: 87 shift/reduce, 18 reduce/reduce +** most of these are due to handling macros +** a few are due to handling type expressions +*/ + +/*@=allmacros@*/ + +extern int yylex (); +extern void swallowMacro (void); + +# include "lclintMacros.nf" +# include "basic.h" +# include "cgrammar.h" +# include "exprChecks.h" + +/*@-allmacros@*/ +/*@-matchfields@*/ + +# define SHOWCSYM FALSE +void yyerror (char *s); + +#line 59 "cgrammar.y" +typedef union +{ + lltok tok; + int count; + specialClauseKind sck; + qual typequal; + qualList tquallist; + ctype ctyp; + sRef sr; + /*@only@*/ qtype qtyp; + /*@only@*/ cstring cname; + /*@only@*/ idDecl ntyp; + /*@only@*/ idDeclList ntyplist; + /*@only@*/ uentryList flist; + /*@owned@*/ uentryList entrylist; + /*@observer@*/ /*@dependent@*/ uentry entry; + /*@only@*/ uentry oentry; + /*@only@*/ exprNode expr; + /*@only@*/ enumNameList enumnamelist; + /*@only@*/ exprNodeList alist; + /*@only@*/ sRefSet srset; +} YYSTYPE; +#ifndef YYDEBUG +#define YYDEBUG 1 +#endif + +#include + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif + + + +#define YYFINAL 1150 +#define YYFLAG -32768 +#define YYNTBASE 181 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 434 ? yytranslate[x] : 407) + +static const short yytranslate[] = { 0, + 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, 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, 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, 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, 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, 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, 1, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180 +}; + +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 1, 3, 5, 8, 11, 13, 15, 17, 19, + 21, 23, 32, 44, 45, 51, 53, 57, 59, 62, + 64, 71, 75, 82, 83, 90, 91, 99, 101, 108, + 112, 119, 120, 127, 128, 136, 137, 138, 149, 153, + 157, 161, 164, 166, 167, 170, 171, 174, 176, 179, + 181, 184, 186, 189, 191, 195, 198, 200, 202, 204, + 206, 208, 210, 212, 213, 216, 217, 224, 225, 232, + 234, 236, 237, 238, 244, 245, 251, 253, 255, 256, + 258, 259, 260, 264, 265, 269, 271, 273, 275, 277, + 279, 281, 283, 285, 287, 289, 291, 293, 295, 297, + 299, 301, 303, 304, 312, 313, 322, 324, 328, 329, + 333, 334, 338, 341, 345, 348, 351, 353, 355, 357, + 361, 366, 369, 373, 377, 381, 383, 385, 387, 391, + 393, 395, 399, 404, 407, 411, 415, 419, 421, 425, + 427, 429, 431, 435, 437, 439, 441, 446, 450, 455, + 462, 468, 474, 477, 480, 482, 486, 488, 491, 494, + 497, 500, 503, 506, 509, 512, 514, 516, 526, 527, + 531, 536, 539, 541, 546, 548, 552, 556, 560, 562, + 566, 570, 572, 576, 580, 582, 586, 590, 594, 598, + 600, 604, 608, 610, 614, 616, 620, 622, 626, 628, + 629, 634, 636, 637, 642, 644, 645, 646, 654, 656, + 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, + 700, 702, 706, 707, 709, 711, 713, 715, 717, 721, + 722, 732, 733, 745, 748, 749, 756, 757, 765, 770, + 775, 776, 777, 780, 782, 787, 788, 793, 795, 799, + 804, 806, 810, 812, 814, 816, 818, 820, 823, 826, + 829, 832, 835, 838, 841, 844, 847, 850, 853, 856, + 859, 862, 865, 868, 871, 874, 877, 880, 883, 886, + 889, 892, 895, 898, 901, 904, 907, 910, 913, 916, + 919, 922, 925, 928, 931, 934, 937, 940, 943, 946, + 949, 952, 955, 957, 959, 961, 963, 966, 969, 972, + 975, 978, 981, 984, 987, 990, 993, 996, 999, 1002, + 1005, 1009, 1011, 1016, 1018, 1022, 1025, 1028, 1031, 1032, + 1034, 1035, 1036, 1048, 1049, 1050, 1062, 1069, 1076, 1077, + 1078, 1089, 1090, 1091, 1102, 1108, 1114, 1119, 1124, 1125, + 1127, 1129, 1132, 1138, 1142, 1145, 1150, 1152, 1155, 1159, + 1166, 1167, 1176, 1181, 1183, 1187, 1190, 1192, 1197, 1199, + 1201, 1204, 1207, 1209, 1212, 1214, 1217, 1219, 1221, 1223, + 1226, 1228, 1231, 1234, 1238, 1240, 1244, 1246, 1250, 1252, + 1254, 1258, 1259, 1262, 1263, 1268, 1273, 1275, 1277, 1280, + 1282, 1284, 1287, 1288, 1290, 1296, 1299, 1303, 1307, 1312, + 1316, 1321, 1326, 1332, 1334, 1336, 1338, 1340, 1342, 1344, + 1346, 1348, 1350, 1352, 1354, 1356, 1359, 1362, 1370, 1377, + 1380, 1381, 1382, 1393, 1394, 1401, 1403, 1405, 1407, 1409, + 1412, 1414, 1416, 1418, 1420, 1422, 1424, 1426, 1430, 1432, + 1435, 1438, 1441, 1443, 1445, 1447, 1449, 1451, 1453, 1455, + 1457, 1459, 1461, 1465, 1467, 1469, 1473, 1476, 1477, 1483, + 1484, 1491, 1492, 1497, 1498, 1504, 1508, 1511, 1515, 1516, + 1517, 1518, 1519, 1520, 1522, 1525, 1528, 1532, 1535, 1539, + 1543, 1548, 1551, 1554, 1558, 1562, 1567, 1569, 1572, 1574, + 1577, 1579, 1582, 1584, 1587, 1589, 1592, 1594, 1599, 1602, + 1603, 1609, 1610, 1617, 1622, 1627, 1628, 1629, 1640, 1642, + 1643, 1648, 1650, 1652, 1654, 1656, 1658, 1662, 1664, 1669, + 1673, 1678, 1685, 1691, 1697, 1700, 1703, 1705, 1708, 1711, + 1714, 1717, 1720, 1723, 1726, 1729, 1731, 1733, 1738, 1740, + 1744, 1748, 1752, 1754, 1758, 1762, 1764, 1768, 1772, 1774, + 1778, 1782, 1786, 1790, 1792, 1796, 1800, 1802, 1806, 1808, + 1812, 1814, 1818, 1820, 1824, 1826, 1830, 1832, 1833, 1834, + 1842, 1844, 1848, 1852, 1856, 1860, 1864, 1868, 1872, 1876, + 1880, 1884, 1888, 1890, 1891, 1893, 1896, 1904, 1907, 1910, + 1918, 1925, 1928, 1932, 1935, 1939, 1942, 1946, 1950, 1954, + 1958, 1961, 1965, 1966, 1968, 1970, 1972, 1974, 1976, 1978, + 1980 +}; + +static const short yyrhs[] = { -1, + 182, 0, 183, 0, 182, 183, 0, 235, 403, 0, + 184, 0, 185, 0, 195, 0, 198, 0, 271, 0, + 1, 0, 74, 291, 304, 314, 304, 403, 279, 87, + 0, 74, 291, 304, 314, 304, 23, 279, 284, 283, + 403, 87, 0, 0, 75, 186, 187, 403, 87, 0, + 188, 0, 291, 304, 188, 0, 192, 0, 318, 192, + 0, 405, 0, 279, 24, 304, 314, 279, 25, 0, + 189, 26, 27, 0, 189, 26, 279, 270, 27, 304, + 0, 0, 189, 280, 24, 25, 190, 200, 0, 0, + 189, 280, 24, 315, 25, 191, 200, 0, 405, 0, + 279, 24, 304, 188, 279, 25, 0, 192, 26, 27, + 0, 192, 26, 279, 270, 27, 304, 0, 0, 192, + 280, 24, 25, 193, 202, 0, 0, 192, 280, 24, + 315, 25, 194, 202, 0, 0, 0, 76, 405, 24, + 315, 25, 196, 202, 197, 403, 87, 0, 88, 344, + 91, 0, 89, 331, 91, 0, 90, 332, 91, 0, + 88, 91, 0, 231, 0, 0, 201, 204, 0, 0, + 203, 205, 0, 212, 0, 206, 212, 0, 215, 0, + 206, 215, 0, 228, 0, 228, 206, 0, 208, 0, + 207, 21, 208, 0, 211, 209, 0, 404, 0, 175, + 0, 85, 0, 86, 0, 115, 0, 116, 0, 129, + 0, 0, 210, 211, 0, 0, 71, 213, 364, 403, + 87, 218, 0, 0, 71, 214, 207, 403, 87, 218, + 0, 73, 0, 219, 0, 0, 0, 71, 216, 364, + 403, 218, 0, 0, 71, 217, 207, 403, 218, 0, + 73, 0, 221, 0, 0, 219, 0, 0, 0, 72, + 220, 236, 0, 0, 72, 222, 237, 0, 77, 0, + 78, 0, 79, 0, 80, 0, 81, 0, 87, 0, + 87, 0, 82, 0, 83, 0, 118, 0, 136, 0, + 134, 0, 132, 0, 131, 0, 120, 0, 137, 0, + 149, 0, 0, 223, 304, 229, 242, 403, 225, 279, + 0, 0, 226, 304, 227, 230, 242, 403, 224, 279, + 0, 314, 0, 291, 304, 314, 0, 0, 19, 233, + 360, 0, 0, 364, 234, 353, 0, 199, 232, 0, + 240, 403, 87, 0, 403, 87, 0, 240, 403, 0, + 403, 0, 404, 0, 175, 0, 238, 26, 27, 0, + 238, 26, 239, 27, 0, 34, 238, 0, 24, 238, + 25, 0, 238, 28, 405, 0, 238, 43, 405, 0, + 238, 0, 176, 0, 238, 0, 240, 21, 238, 0, + 404, 0, 175, 0, 241, 26, 27, 0, 241, 26, + 239, 27, 0, 34, 241, 0, 24, 241, 25, 0, + 241, 28, 405, 0, 241, 43, 405, 0, 241, 0, + 242, 21, 241, 0, 404, 0, 175, 0, 176, 0, + 24, 268, 25, 0, 180, 0, 110, 0, 243, 0, + 244, 26, 268, 27, 0, 244, 24, 25, 0, 244, + 24, 245, 25, 0, 69, 24, 267, 21, 326, 25, + 0, 244, 304, 28, 405, 279, 0, 244, 304, 43, + 405, 279, 0, 244, 46, 0, 244, 47, 0, 267, + 0, 245, 21, 267, 0, 244, 0, 46, 246, 0, + 47, 246, 0, 29, 251, 0, 34, 251, 0, 33, + 251, 0, 32, 251, 0, 31, 251, 0, 30, 251, + 0, 248, 0, 247, 0, 45, 279, 24, 326, 304, + 21, 405, 25, 279, 0, 0, 279, 249, 250, 0, + 42, 24, 326, 25, 0, 42, 246, 0, 246, 0, + 24, 326, 25, 251, 0, 251, 0, 252, 34, 251, + 0, 252, 35, 251, 0, 252, 36, 251, 0, 252, + 0, 253, 33, 252, 0, 253, 32, 252, 0, 253, + 0, 254, 48, 253, 0, 254, 49, 253, 0, 254, + 0, 255, 37, 254, 0, 255, 38, 254, 0, 255, + 50, 254, 0, 255, 51, 254, 0, 255, 0, 256, + 52, 255, 0, 256, 53, 255, 0, 256, 0, 257, + 29, 256, 0, 257, 0, 258, 39, 257, 0, 258, + 0, 259, 40, 258, 0, 259, 0, 0, 260, 54, + 261, 259, 0, 260, 0, 0, 262, 55, 263, 260, + 0, 262, 0, 0, 0, 262, 41, 265, 268, 22, + 266, 264, 0, 264, 0, 246, 23, 267, 0, 246, + 56, 267, 0, 246, 57, 267, 0, 246, 58, 267, + 0, 246, 59, 267, 0, 246, 60, 267, 0, 246, + 61, 267, 0, 246, 62, 267, 0, 246, 63, 267, + 0, 246, 64, 267, 0, 246, 65, 267, 0, 267, + 0, 268, 21, 267, 0, 0, 268, 0, 264, 0, + 272, 0, 70, 0, 277, 0, 291, 279, 18, 0, + 0, 291, 304, 314, 304, 273, 279, 283, 18, 279, + 0, 0, 291, 304, 314, 304, 23, 274, 279, 284, + 283, 18, 279, 0, 314, 304, 0, 0, 314, 304, + 23, 276, 279, 284, 0, 0, 44, 291, 278, 304, + 281, 279, 18, 0, 44, 291, 279, 18, 0, 44, + 281, 279, 18, 0, 0, 0, 282, 279, 0, 275, + 0, 281, 21, 304, 275, 0, 0, 283, 21, 304, + 275, 0, 267, 0, 19, 285, 20, 0, 19, 285, + 21, 20, 0, 284, 0, 285, 21, 284, 0, 111, + 0, 109, 0, 112, 0, 113, 0, 114, 0, 107, + 279, 0, 108, 279, 0, 115, 279, 0, 116, 279, + 0, 129, 279, 0, 130, 279, 0, 131, 279, 0, + 132, 279, 0, 117, 279, 0, 119, 279, 0, 118, + 279, 0, 127, 279, 0, 128, 279, 0, 120, 279, + 0, 122, 279, 0, 138, 279, 0, 139, 279, 0, + 141, 279, 0, 142, 279, 0, 140, 279, 0, 135, + 279, 0, 150, 279, 0, 133, 279, 0, 134, 279, + 0, 136, 279, 0, 123, 279, 0, 126, 279, 0, + 124, 279, 0, 125, 279, 0, 155, 279, 0, 156, + 279, 0, 147, 279, 0, 157, 279, 0, 148, 279, + 0, 151, 279, 0, 152, 279, 0, 153, 279, 0, + 154, 279, 0, 149, 279, 0, 158, 279, 0, 159, + 279, 0, 162, 279, 0, 163, 279, 0, 160, 279, + 0, 161, 279, 0, 146, 0, 143, 0, 144, 0, + 145, 0, 164, 304, 0, 166, 304, 0, 165, 304, + 0, 167, 304, 0, 168, 304, 0, 169, 304, 0, + 170, 304, 0, 171, 304, 0, 172, 304, 0, 173, + 304, 0, 406, 304, 0, 295, 304, 0, 309, 304, + 0, 288, 304, 0, 279, 291, 279, 0, 293, 0, + 293, 84, 292, 87, 0, 326, 0, 326, 21, 292, + 0, 286, 294, 0, 287, 294, 0, 289, 294, 0, + 0, 291, 0, 0, 0, 304, 66, 405, 279, 19, + 296, 357, 305, 358, 297, 20, 0, 0, 0, 304, + 67, 405, 279, 19, 298, 357, 305, 358, 299, 20, + 0, 304, 66, 405, 279, 19, 20, 0, 304, 67, + 405, 279, 19, 20, 0, 0, 0, 304, 66, 279, + 19, 300, 357, 305, 358, 301, 20, 0, 0, 0, + 304, 67, 279, 19, 302, 357, 305, 358, 303, 20, + 0, 304, 66, 279, 19, 20, 0, 304, 67, 279, + 19, 20, 0, 304, 66, 405, 304, 0, 304, 67, + 405, 304, 0, 0, 306, 0, 198, 0, 305, 306, + 0, 291, 304, 307, 279, 18, 0, 291, 279, 18, + 0, 308, 304, 0, 307, 21, 308, 304, 0, 314, + 0, 22, 270, 0, 314, 22, 270, 0, 304, 68, + 19, 311, 20, 279, 0, 0, 304, 68, 405, 19, + 310, 311, 20, 279, 0, 304, 68, 405, 279, 0, + 312, 0, 311, 21, 312, 0, 311, 21, 0, 405, + 0, 405, 23, 279, 270, 0, 189, 0, 328, 0, + 318, 179, 0, 318, 313, 0, 189, 0, 318, 189, + 0, 321, 0, 304, 319, 0, 107, 0, 108, 0, + 316, 0, 317, 316, 0, 34, 0, 34, 317, 0, + 34, 318, 0, 34, 317, 318, 0, 320, 0, 320, + 21, 5, 0, 405, 0, 320, 21, 405, 0, 5, + 0, 322, 0, 322, 21, 5, 0, 0, 323, 325, + 0, 0, 322, 21, 324, 325, 0, 279, 291, 313, + 279, 0, 405, 0, 290, 0, 290, 327, 0, 318, + 0, 329, 0, 318, 329, 0, 0, 329, 0, 279, + 24, 304, 327, 25, 0, 26, 27, 0, 26, 270, + 27, 0, 329, 26, 27, 0, 329, 26, 270, 27, + 0, 279, 24, 25, 0, 279, 24, 321, 25, 0, + 329, 279, 24, 25, 0, 329, 279, 24, 321, 25, + 0, 346, 0, 347, 0, 350, 0, 353, 0, 366, + 0, 369, 0, 400, 0, 374, 0, 402, 0, 333, + 0, 331, 0, 340, 0, 333, 340, 0, 373, 333, + 0, 399, 345, 11, 24, 268, 25, 18, 0, 399, + 345, 11, 24, 268, 25, 0, 335, 340, 0, 0, + 0, 13, 24, 269, 18, 269, 18, 336, 269, 337, + 25, 0, 0, 177, 355, 24, 339, 377, 25, 0, + 178, 0, 346, 0, 347, 0, 350, 0, 342, 364, + 0, 342, 0, 343, 0, 366, 0, 341, 0, 334, + 0, 338, 0, 402, 0, 24, 340, 25, 0, 1, + 0, 368, 340, 0, 355, 19, 0, 359, 20, 0, + 345, 0, 363, 0, 346, 0, 347, 0, 350, 0, + 354, 0, 367, 0, 369, 0, 374, 0, 401, 0, + 24, 345, 25, 0, 402, 0, 1, 0, 405, 22, + 330, 0, 106, 330, 0, 0, 6, 270, 348, 22, + 330, 0, 0, 97, 6, 270, 349, 22, 330, 0, + 0, 7, 351, 22, 330, 0, 0, 97, 7, 352, + 22, 330, 0, 24, 353, 25, 0, 355, 361, 0, + 355, 362, 356, 0, 0, 0, 0, 0, 0, 20, + 0, 106, 20, 0, 365, 20, 0, 365, 106, 20, + 0, 364, 20, 0, 364, 106, 20, 0, 364, 365, + 20, 0, 364, 365, 106, 20, 0, 19, 360, 0, + 19, 20, 0, 19, 363, 20, 0, 19, 364, 20, + 0, 19, 364, 365, 20, 0, 345, 0, 363, 345, + 0, 271, 0, 364, 271, 0, 330, 0, 365, 330, + 0, 18, 0, 268, 18, 0, 18, 0, 268, 18, + 0, 268, 0, 8, 24, 268, 25, 0, 368, 330, + 0, 0, 368, 330, 9, 370, 330, 0, 0, 10, + 24, 268, 371, 25, 330, 0, 11, 24, 268, 25, + 0, 11, 24, 268, 25, 0, 0, 0, 177, 375, + 355, 24, 376, 377, 25, 353, 398, 356, 0, 379, + 0, 0, 377, 378, 21, 379, 0, 397, 0, 404, + 0, 180, 0, 175, 0, 176, 0, 24, 268, 25, + 0, 380, 0, 244, 26, 268, 27, 0, 244, 24, + 25, 0, 244, 24, 245, 25, 0, 69, 24, 267, + 21, 326, 25, 0, 244, 304, 28, 405, 279, 0, + 244, 304, 43, 405, 279, 0, 244, 46, 0, 244, + 47, 0, 381, 0, 46, 246, 0, 47, 246, 0, + 29, 251, 0, 34, 251, 0, 33, 251, 0, 32, + 251, 0, 31, 251, 0, 30, 251, 0, 248, 0, + 382, 0, 24, 326, 25, 251, 0, 383, 0, 252, + 34, 251, 0, 252, 35, 251, 0, 252, 36, 251, + 0, 384, 0, 253, 33, 252, 0, 253, 32, 252, + 0, 385, 0, 254, 48, 253, 0, 254, 49, 253, + 0, 386, 0, 255, 37, 254, 0, 255, 38, 254, + 0, 255, 50, 254, 0, 255, 51, 254, 0, 387, + 0, 256, 52, 255, 0, 256, 53, 255, 0, 388, + 0, 257, 29, 256, 0, 389, 0, 258, 39, 257, + 0, 390, 0, 259, 40, 258, 0, 391, 0, 260, + 54, 259, 0, 392, 0, 262, 55, 260, 0, 393, + 0, 0, 0, 262, 41, 395, 268, 22, 396, 264, + 0, 394, 0, 246, 23, 267, 0, 246, 56, 267, + 0, 246, 57, 267, 0, 246, 58, 267, 0, 246, + 59, 267, 0, 246, 60, 267, 0, 246, 61, 267, + 0, 246, 62, 267, 0, 246, 63, 267, 0, 246, + 64, 267, 0, 246, 65, 267, 0, 178, 0, 0, + 12, 0, 372, 330, 0, 399, 330, 11, 24, 268, + 25, 18, 0, 335, 330, 0, 372, 345, 0, 399, + 345, 11, 24, 268, 25, 18, 0, 399, 345, 11, + 24, 268, 25, 0, 335, 345, 0, 14, 405, 18, + 0, 15, 18, 0, 96, 15, 18, 0, 16, 18, + 0, 92, 16, 18, 0, 93, 16, 18, 0, 94, + 16, 18, 0, 95, 16, 18, 0, 17, 18, 0, + 17, 268, 18, 0, 0, 18, 0, 174, 0, 175, + 0, 177, 0, 178, 0, 174, 0, 179, 0, 180, + 0 +}; + +#endif + +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 215, 216, 219, 220, 223, 224, 225, 226, 227, 228, + 229, 232, 234, 238, 238, 243, 249, 253, 254, 258, + 259, 261, 263, 279, 283, 290, 294, 300, 301, 303, + 305, 321, 325, 332, 336, 342, 344, 344, 348, 349, + 350, 351, 354, 357, 358, 361, 362, 365, 366, 369, + 370, 373, 374, 377, 378, 381, 384, 385, 388, 389, + 390, 391, 392, 395, 396, 399, 399, 402, 402, 405, + 409, 410, 413, 413, 416, 416, 419, 423, 424, 427, + 428, 431, 437, 444, 450, 457, 458, 459, 460, 461, + 464, 467, 470, 471, 474, 475, 476, 477, 478, 479, + 480, 481, 484, 490, 497, 503, 512, 518, 522, 524, + 528, 531, 538, 546, 547, 550, 551, 554, 555, 556, + 557, 558, 559, 560, 561, 565, 566, 570, 571, 574, + 576, 578, 579, 580, 581, 582, 584, 588, 592, 604, + 605, 606, 607, 608, 609, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 623, 624, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 640, 644, 645, + 648, 649, 652, 653, 657, 658, 659, 660, 663, 664, + 665, 668, 669, 670, 673, 674, 675, 676, 677, 680, + 681, 682, 685, 686, 689, 690, 694, 695, 698, 699, + 704, 710, 711, 717, 723, 724, 724, 726, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 743, 744, 747, 748, 751, 756, 757, 758, 761, 774, + 778, 779, 782, 787, 788, 788, 793, 794, 795, 796, + 799, 802, 805, 808, 809, 812, 813, 816, 817, 818, + 822, 824, 833, 834, 835, 836, 837, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, + 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, + 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, + 883, 884, 887, 888, 889, 890, 893, 894, 895, 896, + 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, + 909, 913, 914, 918, 919, 923, 924, 925, 928, 929, + 932, 934, 936, 937, 939, 941, 942, 944, 946, 948, + 950, 951, 953, 955, 956, 958, 960, 961, 964, 967, + 968, 969, 972, 974, 978, 980, 984, 985, 986, 989, + 991, 991, 993, 996, 998, 1000, 1003, 1008, 1015, 1016, + 1017, 1024, 1028, 1029, 1033, 1034, 1037, 1038, 1041, 1042, + 1045, 1046, 1047, 1048, 1051, 1052, 1055, 1056, 1059, 1060, + 1061, 1064, 1064, 1065, 1066, 1069, 1081, 1097, 1098, 1101, + 1102, 1103, 1106, 1107, 1110, 1112, 1113, 1114, 1115, 1116, + 1118, 1120, 1122, 1128, 1129, 1130, 1131, 1132, 1133, 1134, + 1135, 1136, 1139, 1142, 1145, 1146, 1150, 1152, 1154, 1156, + 1160, 1161, 1163, 1167, 1169, 1171, 1174, 1175, 1176, 1177, + 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1189, + 1195, 1198, 1201, 1202, 1205, 1206, 1207, 1208, 1209, 1210, + 1211, 1212, 1213, 1214, 1215, 1218, 1219, 1225, 1226, 1227, + 1228, 1231, 1232, 1233, 1234, 1237, 1238, 1242, 1245, 1248, + 1251, 1254, 1257, 1260, 1261, 1262, 1263, 1265, 1266, 1268, + 1270, 1277, 1281, 1283, 1285, 1287, 1291, 1292, 1295, 1296, + 1299, 1300, 1303, 1304, 1307, 1308, 1309, 1312, 1320, 1325, + 1326, 1330, 1331, 1334, 1339, 1342, 1343, 1344, 1352, 1353, + 1353, 1357, 1358, 1359, 1370, 1377, 1378, 1381, 1382, 1383, + 1384, 1385, 1387, 1388, 1389, 1390, 1393, 1394, 1395, 1396, + 1397, 1398, 1399, 1400, 1401, 1402, 1405, 1406, 1409, 1410, + 1411, 1412, 1415, 1416, 1417, 1420, 1421, 1422, 1425, 1426, + 1427, 1428, 1429, 1432, 1433, 1434, 1437, 1438, 1441, 1442, + 1446, 1447, 1450, 1451, 1454, 1455, 1458, 1459, 1460, 1461, + 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, + 1474, 1475, 1478, 1479, 1482, 1485, 1487, 1489, 1493, 1494, + 1496, 1498, 1501, 1502, 1503, 1505, 1506, 1507, 1508, 1509, + 1510, 1511, 1514, 1515, 1518, 1521, 1522, 1523, 1524, 1527, + 1528 +}; +#endif + + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const yytname[] = { "$","error","$undefined.","BADTOK", +"SKIPTOK","CTOK_ELIPSIS","CASE","DEFAULT","CIF","CELSE","SWITCH","WHILE","DO", +"CFOR","GOTO","CONTINUE","BREAK","RETURN","TSEMI","TLBRACE","TRBRACE","TCOMMA", +"TCOLON","TASSIGN","TLPAREN","TRPAREN","TLSQBR","TRSQBR","TDOT","TAMPERSAND", +"TEXCL","TTILDE","TMINUS","TPLUS","TMULT","TDIV","TPERCENT","TLT","TGT","TCIRC", +"TBAR","TQUEST","CSIZEOF","ARROW_OP","CTYPEDEF","COFFSETOF","INC_OP","DEC_OP", +"LEFT_OP","RIGHT_OP","LE_OP","GE_OP","EQ_OP","NE_OP","AND_OP","OR_OP","MUL_ASSIGN", +"DIV_ASSIGN","MOD_ASSIGN","ADD_ASSIGN","SUB_ASSIGN","LEFT_ASSIGN","RIGHT_ASSIGN", +"AND_ASSIGN","XOR_ASSIGN","OR_ASSIGN","CSTRUCT","CUNION","CENUM","VA_ARG","VA_DCL", +"QGLOBALS","QMODIFIES","QNOMODS","QCONSTANT","QFUNCTION","QITER","QDEFINES", +"QUSES","QALLOCATES","QSETS","QRELEASES","QPRECLAUSE","QPOSTCLAUSE","QALT","QUNDEF", +"QKILLED","QENDMACRO","LLMACRO","LLMACROITER","LLMACROEND","TENDMACRO","QSWITCHBREAK", +"QLOOPBREAK","QINNERBREAK","QSAFEBREAK","QINNERCONTINUE","QFALLTHROUGH","QLINTNOTREACHED", +"QLINTFALLTHROUGH","QLINTFALLTHRU","QARGSUSED","QPRINTFLIKE","QLINTPRINTFLIKE", +"QSCANFLIKE","QMESSAGELIKE","QNOTREACHED","QCONST","QVOLATILE","QINLINE","QEXTENSION", +"QEXTERN","QSTATIC","QAUTO","QREGISTER","QOUT","QIN","QYIELD","QONLY","QTEMP", +"QSHARED","QREF","QUNIQUE","QCHECKED","QUNCHECKED","QCHECKEDSTRICT","QCHECKMOD", +"QKEEP","QKEPT","QPARTIAL","QSPECIAL","QOWNED","QDEPENDENT","QRETURNED","QEXPOSED", +"QNULL","QOBSERVER","QISNULL","QEXITS","QMAYEXIT","QNEVEREXIT","QTRUEEXIT","QFALSEEXIT", +"QLONG","QSIGNED","QUNSIGNED","QSHORT","QUNUSED","QSEF","QNOTNULL","QRELNULL", +"QABSTRACT","QCONCRETE","QMUTABLE","QIMMUTABLE","QTRUENULL","QFALSENULL","QEXTERNAL", +"QREFCOUNTED","QREFS","QNEWREF","QTEMPREF","QKILLREF","QRELDEF","CGCHAR","CBOOL", +"CINT","CGFLOAT","CDOUBLE","CVOID","QANYTYPE","QINTEGRALTYPE","QUNSIGNEDINTEGRALTYPE", +"QSIGNEDINTEGRALTYPE","IDENTIFIER","NEW_IDENTIFIER","CCONSTANT","ITER_NAME", +"ITER_ENDNAME","TYPE_NAME","TYPE_NAME_OR_ID","file","externalDefs","externalDef", +"constantDecl","fcnDecl","@1","plainFcn","plainNamedDecl","namedDeclBase","@2", +"@3","plainNamedDeclBase","@4","@5","iterDecl","@6","@7","macroDef","fcnDefHdr", +"optGlobMods","@8","optPlainGlobMods","@9","optGlobModsRest","optPlainGlobModsRest", +"specialClauses","globIdList","globIdListExpr","globId","globQual","optGlobQuals", +"optGlobModsAux","@10","@11","optPlainGlobModsAux","@12","@13","optMods","fcnMods", +"@14","fcnPlainMods","@15","specialTag","endStateTag","endSpecialTag","stateSpecialClause", +"specialClauseType","specialClause","@16","@17","fcnDefHdrAux","fcnBody","@18", +"@19","fcnDef","locModifies","locPlainModifies","modListExpr","mExpr","modList", +"specClauseListExpr","specClauseList","primaryExpr","postfixExpr","argumentExprList", +"unaryExpr","offsetofExpr","sizeofExpr","@20","sizeofExprAux","castExpr","timesExpr", +"plusExpr","shiftExpr","relationalExpr","equalityExpr","bitandExpr","xorExpr", +"bitorExpr","andExpr","@21","orExpr","@22","conditionalExpr","@23","@24","assignExpr", +"expr","optExpr","constantExpr","initializer","instanceDecl","@25","@26","namedInitializer", +"@27","typeDecl","@28","IsType","PushType","namedInitializerList","namedInitializerListAux", +"optDeclarators","init","initList","storageSpecifier","typeQualifier","typeModifier", +"typeSpecifier","completeType","completeTypeSpecifier","altType","completeTypeSpecifierAux", +"optCompleteType","suSpc","@29","@30","@31","@32","@33","@34","@35","@36","NotType", +"structDeclList","structDecl","structNamedDeclList","structNamedDecl","enumSpc", +"@37","enumeratorList","enumerator","optNamedDecl","namedDecl","genericParamList", +"innerMods","innerModsList","pointers","paramIdList","idList","paramTypeList", +"paramList","@38","@39","paramDecl","typeExpression","abstractDecl","optAbstractDeclBase", +"abstractDeclBase","stmt","iterBody","endBody","iterDefStmtList","iterDefIterationStmt", +"forPred","@40","@41","partialIterStmt","@42","iterDefStmt","iterSelectionStmt", +"openScope","closeScope","macroBody","stmtErr","labeledStmt","caseStmt","@43", +"@44","defaultStmt","@45","@46","compoundStmt","compoundStmtErr","CreateInnerScope", +"DeleteInnerScope","CreateStructInnerScope","DeleteStructInnerScope","DeleteInnerScopeSafe", +"compoundStmtRest","compoundStmtAux","compoundStmtAuxErr","stmtListErr","initializerList", +"stmtList","expressionStmt","expressionStmtErr","ifPred","selectionStmt","@47", +"@48","whilePred","iterWhilePred","iterStmt","@49","@50","iterArgList","@51", +"iterArgExpr","primaryIterExpr","postfixIterExpr","unaryIterExpr","castIterExpr", +"timesIterExpr","plusIterExpr","shiftIterExpr","relationalIterExpr","equalityIterExpr", +"bitandIterExpr","xorIterExpr","bitorIterExpr","andIterExpr","orIterExpr","conditionalIterExpr", +"@52","@53","assignIterExpr","endIter","doHeader","iterationStmt","iterationStmtErr", +"jumpStmt","optSemi","id","newId","typeName", NULL +}; +#endif + +static const short yyr1[] = { 0, + 181, 181, 182, 182, 183, 183, 183, 183, 183, 183, + 183, 184, 184, 186, 185, 187, 187, 188, 188, 189, + 189, 189, 189, 190, 189, 191, 189, 192, 192, 192, + 192, 193, 192, 194, 192, 196, 197, 195, 198, 198, + 198, 198, 199, 201, 200, 203, 202, 204, 204, 205, + 205, 206, 206, 207, 207, 208, 209, 209, 210, 210, + 210, 210, 210, 211, 211, 213, 212, 214, 212, 212, + 212, 212, 216, 215, 217, 215, 215, 215, 215, 218, + 218, 220, 219, 222, 221, 223, 223, 223, 223, 223, + 224, 225, 226, 226, 227, 227, 227, 227, 227, 227, + 227, 227, 229, 228, 230, 228, 231, 231, 233, 232, + 234, 232, 235, 236, 236, 237, 237, 238, 238, 238, + 238, 238, 238, 238, 238, 239, 239, 240, 240, 241, + 241, 241, 241, 241, 241, 241, 241, 242, 242, 243, + 243, 243, 243, 243, 243, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 245, 245, 246, 246, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 247, 249, 248, + 250, 250, 251, 251, 252, 252, 252, 252, 253, 253, + 253, 254, 254, 254, 255, 255, 255, 255, 255, 256, + 256, 256, 257, 257, 258, 258, 259, 259, 260, 261, + 260, 262, 263, 262, 264, 265, 266, 264, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 268, 268, 269, 269, 270, 271, 271, 271, 272, 273, + 272, 274, 272, 275, 276, 275, 278, 277, 277, 277, + 279, 280, 281, 282, 282, 283, 283, 284, 284, 284, + 285, 285, 286, 286, 286, 286, 286, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, + 287, 287, 288, 288, 288, 288, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 290, 291, 291, 292, 292, 293, 293, 293, 294, 294, + 296, 297, 295, 298, 299, 295, 295, 295, 300, 301, + 295, 302, 303, 295, 295, 295, 295, 295, 304, 305, + 305, 305, 306, 306, 307, 307, 308, 308, 308, 309, + 310, 309, 309, 311, 311, 311, 312, 312, 313, 313, + 313, 313, 314, 314, 315, 315, 316, 316, 317, 317, + 318, 318, 318, 318, 319, 319, 320, 320, 321, 321, + 321, 323, 322, 324, 322, 325, 325, 326, 326, 327, + 327, 327, 328, 328, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 330, 330, 330, 330, 330, 330, 330, + 330, 330, 331, 332, 333, 333, 334, 334, 334, 334, + 336, 337, 335, 339, 338, 338, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 341, + 342, 343, 344, 344, 345, 345, 345, 345, 345, 345, + 345, 345, 345, 345, 345, 346, 346, 348, 347, 349, + 347, 351, 350, 352, 350, 353, 353, 354, 355, 356, + 357, 358, 359, 360, 360, 360, 360, 360, 360, 360, + 360, 361, 362, 362, 362, 362, 363, 363, 364, 364, + 365, 365, 366, 366, 367, 367, 367, 368, 369, 370, + 369, 371, 369, 372, 373, 375, 376, 374, 377, 378, + 377, 379, 379, 379, 379, 380, 380, 381, 381, 381, + 381, 381, 381, 381, 381, 381, 382, 382, 382, 382, + 382, 382, 382, 382, 382, 382, 383, 383, 384, 384, + 384, 384, 385, 385, 385, 386, 386, 386, 387, 387, + 387, 387, 387, 388, 388, 388, 389, 389, 390, 390, + 391, 391, 392, 392, 393, 393, 394, 395, 396, 394, + 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, + 397, 397, 398, 398, 399, 400, 400, 400, 401, 401, + 401, 401, 402, 402, 402, 402, 402, 402, 402, 402, + 402, 402, 403, 403, 404, 405, 405, 405, 405, 406, + 406 +}; + +static const short yyr2[] = { 0, + 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, + 1, 8, 11, 0, 5, 1, 3, 1, 2, 1, + 6, 3, 6, 0, 6, 0, 7, 1, 6, 3, + 6, 0, 6, 0, 7, 0, 0, 10, 3, 3, + 3, 2, 1, 0, 2, 0, 2, 1, 2, 1, + 2, 1, 2, 1, 3, 2, 1, 1, 1, 1, + 1, 1, 1, 0, 2, 0, 6, 0, 6, 1, + 1, 0, 0, 5, 0, 5, 1, 1, 0, 1, + 0, 0, 3, 0, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 7, 0, 8, 1, 3, 0, 3, + 0, 3, 2, 3, 2, 2, 1, 1, 1, 3, + 4, 2, 3, 3, 3, 1, 1, 1, 3, 1, + 1, 3, 4, 2, 3, 3, 3, 1, 3, 1, + 1, 1, 3, 1, 1, 1, 4, 3, 4, 6, + 5, 5, 2, 2, 1, 3, 1, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 1, 9, 0, 3, + 4, 2, 1, 4, 1, 3, 3, 3, 1, 3, + 3, 1, 3, 3, 1, 3, 3, 3, 3, 1, + 3, 3, 1, 3, 1, 3, 1, 3, 1, 0, + 4, 1, 0, 4, 1, 0, 0, 7, 1, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 1, 3, 0, 1, 1, 1, 1, 1, 3, 0, + 9, 0, 11, 2, 0, 6, 0, 7, 4, 4, + 0, 0, 2, 1, 4, 0, 4, 1, 3, 4, + 1, 3, 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, + 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 1, 4, 1, 3, 2, 2, 2, 0, 1, + 0, 0, 11, 0, 0, 11, 6, 6, 0, 0, + 10, 0, 0, 10, 5, 5, 4, 4, 0, 1, + 1, 2, 5, 3, 2, 4, 1, 2, 3, 6, + 0, 8, 4, 1, 3, 2, 1, 4, 1, 1, + 2, 2, 1, 2, 1, 2, 1, 1, 1, 2, + 1, 2, 2, 3, 1, 3, 1, 3, 1, 1, + 3, 0, 2, 0, 4, 4, 1, 1, 2, 1, + 1, 2, 0, 1, 5, 2, 3, 3, 4, 3, + 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 7, 6, 2, + 0, 0, 10, 0, 6, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 1, 1, 3, 2, 0, 5, 0, + 6, 0, 4, 0, 5, 3, 2, 3, 0, 0, + 0, 0, 0, 1, 2, 2, 3, 2, 3, 3, + 4, 2, 2, 3, 3, 4, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 4, 2, 0, + 5, 0, 6, 4, 4, 0, 0, 10, 1, 0, + 4, 1, 1, 1, 1, 1, 3, 1, 4, 3, + 4, 6, 5, 5, 2, 2, 1, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 1, 4, 1, 3, + 3, 3, 1, 3, 3, 1, 3, 3, 1, 3, + 3, 3, 3, 1, 3, 3, 1, 3, 1, 3, + 1, 3, 1, 3, 1, 3, 1, 0, 0, 7, + 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 1, 0, 1, 2, 7, 2, 2, 7, + 6, 2, 3, 2, 3, 2, 3, 3, 3, 3, + 2, 3, 0, 1, 1, 1, 1, 1, 1, 1, + 1 +}; + +static const short yydefact[] = { 0, + 11, 381, 349, 227, 349, 14, 0, 0, 0, 0, + 241, 241, 254, 253, 255, 256, 257, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 304, 305, 306, 303, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 619, 616, 617, 618, 620, 621, + 0, 3, 6, 7, 373, 8, 9, 349, 43, 613, + 10, 226, 228, 0, 329, 329, 349, 329, 349, 322, + 349, 0, 349, 107, 241, 20, 349, 377, 378, 379, + 382, 383, 244, 241, 241, 237, 349, 349, 349, 0, + 465, 241, 472, 0, 0, 0, 595, 0, 0, 0, + 0, 241, 505, 0, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 0, 42, 0, 0, 0, 0, 0, + 0, 241, 145, 615, 141, 142, 516, 144, 146, 157, + 173, 167, 166, 175, 179, 182, 185, 190, 193, 195, + 197, 199, 202, 205, 209, 221, 507, 169, 0, 0, + 497, 455, 456, 457, 458, 0, 0, 459, 241, 460, + 0, 461, 0, 462, 464, 140, 0, 449, 0, 503, + 0, 479, 436, 0, 0, 0, 445, 0, 446, 425, + 444, 441, 442, 437, 438, 439, 0, 0, 443, 0, + 0, 0, 447, 424, 0, 258, 259, 260, 261, 266, + 268, 267, 271, 272, 283, 285, 286, 284, 269, 270, + 262, 263, 264, 265, 280, 281, 278, 282, 273, 274, + 277, 275, 276, 289, 291, 296, 279, 292, 293, 294, + 295, 287, 288, 290, 297, 298, 301, 302, 299, 300, + 307, 309, 308, 310, 311, 312, 313, 314, 315, 316, + 4, 241, 0, 109, 113, 499, 349, 349, 614, 5, + 349, 330, 326, 327, 320, 328, 0, 241, 241, 318, + 241, 241, 0, 319, 374, 317, 380, 384, 349, 0, + 243, 349, 0, 234, 241, 613, 16, 18, 0, 349, + 241, 28, 392, 241, 615, 141, 173, 225, 468, 0, + 241, 241, 241, 223, 0, 604, 606, 611, 0, 0, + 349, 398, 0, 0, 160, 165, 164, 163, 162, 161, + 0, 241, 158, 159, 241, 0, 0, 0, 0, 0, + 241, 474, 241, 467, 241, 414, 415, 416, 417, 0, + 418, 419, 241, 421, 241, 420, 422, 479, 241, 241, + 153, 154, 0, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 200, 206, 203, 506, 241, 0, 602, 39, 0, 480, + 498, 509, 599, 0, 241, 241, 0, 0, 0, 504, + 40, 426, 430, 440, 451, 452, 450, 0, 0, 41, + 22, 241, 392, 349, 241, 479, 500, 241, 229, 108, + 349, 0, 324, 0, 349, 0, 349, 0, 241, 241, + 240, 241, 239, 235, 349, 0, 241, 0, 349, 241, + 19, 389, 0, 0, 375, 390, 241, 0, 0, 241, + 0, 512, 0, 224, 0, 603, 612, 143, 241, 241, + 0, 400, 399, 401, 241, 463, 241, 0, 607, 608, + 609, 610, 605, 470, 0, 0, 598, 349, 477, 596, + 0, 0, 148, 0, 155, 0, 0, 0, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 176, + 177, 178, 181, 180, 183, 184, 186, 187, 188, 189, + 191, 192, 194, 196, 198, 241, 241, 241, 222, 241, + 170, 493, 144, 497, 0, 349, 478, 510, 0, 466, + 0, 448, 434, 0, 0, 24, 0, 484, 241, 501, + 110, 349, 241, 349, 479, 112, 241, 230, 323, 241, + 339, 0, 347, 342, 0, 348, 0, 364, 367, 361, + 363, 245, 241, 241, 613, 15, 30, 241, 392, 241, + 17, 376, 385, 387, 36, 394, 349, 393, 397, 241, + 473, 508, 0, 514, 223, 321, 406, 0, 392, 402, + 241, 0, 174, 349, 241, 0, 241, 476, 492, 0, + 517, 241, 149, 147, 241, 241, 201, 0, 204, 241, + 172, 494, 495, 241, 241, 241, 515, 241, 241, 349, + 44, 26, 485, 488, 241, 241, 486, 241, 502, 0, + 232, 241, 325, 345, 481, 331, 346, 481, 334, 241, + 366, 241, 0, 0, 241, 241, 241, 0, 32, 0, + 241, 0, 46, 391, 241, 403, 469, 241, 0, 407, + 410, 241, 0, 408, 0, 392, 0, 0, 241, 475, + 241, 241, 156, 151, 152, 207, 0, 496, 511, 0, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, + 141, 142, 144, 157, 173, 166, 179, 182, 185, 190, + 193, 195, 197, 199, 202, 0, 520, 519, 528, 537, + 547, 549, 553, 556, 559, 564, 567, 569, 571, 573, + 575, 577, 581, 522, 140, 0, 23, 25, 72, 44, + 489, 490, 241, 487, 21, 241, 246, 349, 337, 481, + 349, 338, 481, 360, 365, 241, 0, 238, 241, 248, + 236, 241, 0, 349, 46, 34, 0, 386, 388, 37, + 79, 395, 369, 0, 241, 403, 370, 404, 513, 431, + 0, 411, 409, 412, 0, 0, 150, 471, 0, 520, + 241, 171, 601, 0, 0, 160, 165, 164, 163, 162, + 161, 158, 159, 241, 241, 241, 153, 154, 0, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 200, 578, 203, 435, + 0, 429, 66, 82, 70, 86, 87, 88, 89, 90, + 93, 94, 45, 72, 48, 71, 349, 349, 52, 27, + 491, 241, 0, 351, 349, 349, 350, 349, 349, 349, + 368, 241, 251, 0, 246, 12, 31, 33, 46, 29, + 613, 73, 84, 77, 47, 79, 50, 78, 392, 396, + 371, 372, 223, 405, 413, 0, 0, 479, 208, 600, + 143, 241, 0, 148, 0, 0, 0, 0, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 176, + 177, 178, 181, 180, 183, 184, 186, 187, 188, 189, + 191, 192, 194, 196, 198, 574, 241, 576, 241, 428, + 349, 64, 613, 49, 103, 0, 53, 246, 241, 349, + 0, 241, 352, 340, 349, 343, 349, 362, 249, 241, + 613, 35, 0, 349, 64, 613, 51, 241, 432, 241, + 597, 594, 174, 241, 149, 147, 241, 241, 0, 521, + 349, 59, 60, 61, 62, 63, 613, 54, 64, 0, + 0, 0, 119, 83, 128, 613, 0, 118, 0, 95, + 100, 99, 98, 97, 96, 101, 102, 105, 0, 231, + 241, 354, 241, 241, 349, 357, 0, 332, 0, 335, + 250, 252, 0, 38, 613, 613, 85, 613, 117, 241, + 0, 168, 593, 480, 0, 151, 152, 579, 0, 64, + 0, 65, 58, 56, 57, 0, 122, 0, 0, 0, + 0, 0, 115, 0, 0, 131, 138, 613, 130, 0, + 241, 247, 358, 241, 0, 355, 241, 341, 0, 344, + 0, 13, 81, 81, 116, 433, 518, 150, 241, 81, + 55, 81, 123, 120, 127, 126, 0, 124, 125, 129, + 114, 0, 134, 0, 0, 0, 0, 0, 613, 233, + 349, 353, 359, 333, 336, 74, 80, 76, 580, 67, + 69, 121, 135, 132, 0, 136, 137, 139, 92, 241, + 0, 356, 133, 104, 91, 241, 106, 0, 0, 0 +}; + +static const short yydefgoto[] = { 1148, + 81, 82, 83, 84, 119, 316, 317, 85, 651, 760, + 318, 785, 899, 86, 683, 901, 884, 88, 758, 759, + 790, 791, 873, 905, 874, 1007, 1008, 1064, 1009, 1010, + 875, 961, 962, 907, 984, 985, 1126, 1127, 963, 908, + 986, 877, 1146, 1140, 878, 1028, 879, 1019, 1080, 89, + 285, 444, 446, 90, 1014, 1047, 1015, 1107, 1016, 1077, + 1078, 159, 160, 514, 161, 162, 163, 416, 551, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 546, + 174, 548, 175, 547, 811, 176, 204, 485, 329, 286, + 92, 662, 766, 113, 594, 93, 312, 178, 283, 114, + 115, 883, 781, 894, 95, 96, 97, 98, 342, 287, + 452, 100, 293, 101, 770, 1089, 773, 1091, 665, 1037, + 668, 1039, 102, 886, 887, 1034, 1035, 103, 673, 587, + 588, 795, 117, 474, 110, 111, 105, 602, 603, 475, + 476, 477, 685, 608, 343, 801, 797, 494, 364, 205, + 225, 206, 207, 365, 913, 1051, 209, 648, 210, 211, + 212, 213, 180, 421, 366, 367, 479, 626, 368, 330, + 505, 369, 185, 370, 557, 768, 974, 218, 571, 509, + 420, 187, 572, 573, 371, 188, 189, 372, 645, 613, + 373, 221, 374, 378, 702, 737, 861, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 957, 1099, 754, 1054, 375, 376, 194, + 377, 290, 196, 197, 107 +}; + +static const short yypact[] = { 1812, +-32768, 148, 5048,-32768, 6116,-32768, 432, 2708, 3070, 3070, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, + 1993,-32768,-32768,-32768, 236,-32768,-32768, 4898,-32768, 67, +-32768,-32768,-32768, 71, 5848, 5848,-32768, 5848, 89, 104, +-32768, 1025,-32768,-32768, 432,-32768,-32768,-32768,-32768,-32768, + 148,-32768,-32768, 178,-32768, 89,-32768,-32768, 5048, 183, +-32768, 5313,-32768, 221, 281, 290,-32768, 299, 432, 177, + 311, 755,-32768, 2348, 5313, 5313, 5313, 5313, 5313, 5313, +-32768, 5338, 5338, 362,-32768, 376, 388, 416, 422, 434, + 171, 4350,-32768, 436, 444,-32768, 464,-32768,-32768, 734, + 844,-32768,-32768,-32768, 1072, 197, 248, 637, 315, 472, + 470, 481, 483, 210,-32768,-32768, 132,-32768, 3112, 459, + 485,-32768,-32768,-32768,-32768, 525, 2750,-32768, 4350,-32768, + 3112,-32768, 3112,-32768,-32768,-32768, 539,-32768, 566,-32768, + 2528, 464, 562, 405, 517, 2889,-32768, 3070,-32768,-32768, +-32768, 5610,-32768,-32768,-32768,-32768, 597, 621,-32768, 3070, + 3070, 3112,-32768,-32768, 558,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, 629, 640,-32768,-32768,-32768, 89, 4743,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 665, 381,-32768,-32768, + 432, 432, 223,-32768, 236,-32768,-32768,-32768,-32768, 671, +-32768,-32768, 700, 701, 381, 67,-32768, 656, 703,-32768, + 432,-32768, 169, 5313,-32768,-32768,-32768,-32768,-32768, 712, + 5313, 5313, 5313, 5200, 719,-32768,-32768,-32768, 453, 506, + 5480, 491, 720, 726,-32768,-32768,-32768,-32768,-32768,-32768, + 735, 5313,-32768,-32768, 5313, 753, 786, 791, 794, 797, + 5313,-32768, 1381,-32768, 4350,-32768,-32768,-32768,-32768, 810, +-32768,-32768, 4350,-32768, 4350,-32768,-32768,-32768, 5219, 5313, +-32768,-32768, 112, 5313, 5313, 5313, 5313, 5313, 5313, 5313, + 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, + 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, +-32768,-32768,-32768,-32768, 5313, 776,-32768,-32768, 2168,-32768, +-32768, 831,-32768, 852, 4350, 5313, 603, 833, 853,-32768, +-32768,-32768,-32768, 5610,-32768,-32768,-32768, 1684, 861,-32768, +-32768, 5313, 253, 3249, 381, 862,-32768, 381,-32768, 530, + 6116, 808, 905, 908, 915, 917, 915, 432, 926, 381, +-32768, 381,-32768,-32768,-32768, 877, 919, 924,-32768, 381, + 656,-32768, 432, 946,-32768, 952, 432, 393, 954, 4350, + 642, 963, 648, 963, 968,-32768,-32768,-32768,-32768, 5244, + 967, 686,-32768, 691, 5313,-32768,-32768, 971,-32768,-32768, +-32768,-32768,-32768,-32768, 989, 976,-32768, 3249,-32768,-32768, + 1008, 1009,-32768, 670,-32768, 115, 432, 432,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768, 1072, 1072, 197, 197, 248, 248, 248, 248, + 637, 637, 315, 472, 470, 5313, 5313, 5313,-32768, 5381, +-32768,-32768, 5956,-32768, 2931, 3424,-32768,-32768, 1012,-32768, + 727,-32768,-32768, 1028, 998,-32768, 1013,-32768, 3774,-32768, +-32768, 3599, 3816,-32768, 862,-32768,-32768, 1049,-32768,-32768, + 1035, 1052,-32768, 1062, 1064,-32768, 358,-32768, 1067,-32768, +-32768,-32768, 178,-32768, 327,-32768,-32768, 5313, 259, 381, +-32768,-32768, 1077,-32768,-32768, 1080, 6116,-32768,-32768, 4350, +-32768,-32768, 1079,-32768, 5200,-32768,-32768, 1070, 704, 691, + 5269, 1088,-32768,-32768,-32768, 1095, 4350,-32768,-32768, 1098, +-32768, 5313,-32768,-32768,-32768,-32768, 481, 451, 483, 5313, +-32768,-32768,-32768, 3952, 4350, 5313,-32768, 5406, 5313,-32768, +-32768,-32768,-32768,-32768, 3994, 4130,-32768, 4172,-32768, 1101, +-32768,-32768,-32768,-32768,-32768, 1081,-32768,-32768, 1082,-32768, + 432,-32768, 432, 1109, 4770,-32768,-32768, 1102,-32768, 1103, +-32768, 305,-32768,-32768, 432, 548,-32768, 4350, 1112,-32768, +-32768, 103, 1106,-32768, 1107, 107, 1114, 1108, 4350,-32768, + 5313, 5406,-32768,-32768,-32768,-32768, 1116,-32768,-32768, 740, + 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5338, 5338, 1119, + 747, 772, 778, 847, 1282, 806, 1075, 668, 799, 795, + 730, 1110, 1105, 1111, 1091, 275, 1125,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 809, 814,-32768,-32768, 1076,-32768, +-32768,-32768, 4308,-32768,-32768,-32768,-32768, 6042,-32768,-32768, + 6042,-32768,-32768,-32768,-32768, 5313, 840,-32768, 4770,-32768, +-32768, 4770, 1074,-32768,-32768,-32768, 1137,-32768,-32768,-32768, + 1142,-32768, 236, 1140,-32768, 325,-32768, 691,-32768,-32768, + 1157,-32768,-32768,-32768, 1160, 432,-32768,-32768, 817, 1161, + 5313,-32768, 1147, 845, 1162, 857, 858, 859, 866, 912, + 935, 937, 938, 5313, 5294, 5313, 960, 962, 117, 5313, + 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, + 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, 5313, + 5313, 5313, 5313, 5313, 5313, 5313, 5313,-32768, 5313,-32768, + 1168, 1173, 95,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 1043,-32768,-32768,-32768,-32768, 997,-32768, +-32768, 4770, 477,-32768, 89, 4972,-32768, 6042, 4972, 6042, +-32768,-32768,-32768, 848,-32768,-32768,-32768,-32768,-32768,-32768, + 67, 105,-32768,-32768,-32768, 1048,-32768,-32768, 266,-32768, +-32768,-32768, 5200,-32768,-32768, 1167, 1175, 862,-32768,-32768, + 979, 5313, 1174, 982, 987, 191, 432, 432,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 999, + 1001, 1014, 907, 1007, 443, 594, 76, 521, 617, 742, + 609, 669, 570, 749, 313, 481, 5313, 483, 5406,-32768, + 5740, 502, 120,-32768,-32768, 674,-32768,-32768,-32768,-32768, + 1178, 62,-32768,-32768, 4972,-32768, 4972,-32768,-32768, 920, + 542,-32768, 1113, 5740, 502, 120,-32768, 57,-32768,-32768, +-32768, 1019, 1023,-32768, 1024, 1026,-32768,-32768, 867,-32768, + 4586,-32768,-32768,-32768,-32768,-32768, 550,-32768, 502, 723, + 74, 74,-32768,-32768, 382, 560, 1117,-32768, 93,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 571,-32768, + 381,-32768, 5313, 1177,-32768, 1179, 1183,-32768, 1185,-32768, +-32768,-32768, 1120,-32768, 4430, 550,-32768, 560,-32768, 310, + 1181,-32768,-32768,-32768, 1184, 1032, 1039,-32768, 1121, 502, + 1123,-32768,-32768,-32768,-32768, 283, 382, 186, 432, 432, + 74, 1139,-32768, 93, 93,-32768, 396, 580,-32768, 93, +-32768,-32768,-32768, 62, 1217,-32768, 5313,-32768, 1216,-32768, + 1218,-32768, 1165, 1165,-32768,-32768,-32768, 1041, 5313, 1165, +-32768, 1165,-32768,-32768,-32768, 382, 1213,-32768,-32768, 382, +-32768, 486, 396, 331, 432, 432, 93, 1154, 580,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768, 1215,-32768,-32768, 396,-32768,-32768, + 1156,-32768,-32768,-32768,-32768,-32768,-32768, 1244, 1245,-32768 +}; + +static const short yypgoto[] = {-32768, +-32768, 1169,-32768,-32768,-32768,-32768, -453, -103,-32768,-32768, + 925,-32768,-32768,-32768,-32768,-32768, 80,-32768, 488,-32768, + -707,-32768,-32768,-32768, -703, 267, 196,-32768,-32768, 245, + 384,-32768,-32768, 353,-32768,-32768, -648, -689,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, -860, 146, 277, -858, + 184,-32768, -602, 442, 515,-32768, -556,-32768,-32768, 137, + -326, -311, -246, -330, -363, -362, -395, -530, -469,-32768, + -554,-32768, -78,-32768,-32768, 787, 836, -607, -355, 1, +-32768,-32768,-32768, -456,-32768,-32768,-32768, 0, -244, 811, +-32768, -782, -676,-32768,-32768,-32768,-32768,-32768,-32768, 128, + 690,-32768, 644,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768, 97, -669, -512,-32768, 188,-32768,-32768, 601, + 607, 487, 5, -374, 1176,-32768, 11,-32768,-32768, -553, +-32768,-32768,-32768, 600, -292, 947,-32768, -483, 1022, 1278, +-32768, 1069,-32768, 1060,-32768,-32768,-32768,-32768, -97,-32768, +-32768,-32768,-32768, 317, 1078, 1115,-32768,-32768, 1267,-32768, +-32768, -353,-32768, 635, 238, -529, -714,-32768, 785,-32768, +-32768, 876, -23, -446, 111,-32768, 174, 59,-32768,-32768, + 194,-32768, 220,-32768,-32768, 595,-32768, 337,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1321,-32768,-32768, + 1367, -302, -255, 68,-32768 +}; + + +#define YYLAST 6296 + + +static const short yytable[] = { 94, + 91, 305, 94, 592, 104, 504, 453, 689, 620, 506, + 226, 227, 112, 466, 545, 637, 601, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 328, 543, 724, 544, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 288, 693, 190, 106, 567, 876, + 106, 533, 534, 468, 120, 541, 542, 898, 639, 87, + 94, 91, 490, 1033, 289, 104, 565, 906, 535, 536, + 2, 726, 576, 736, 291, 2, -560, 1011, 297, 724, + -560, 889, 893, 428, 94, 895, -241, 1012, 432, 644, + 433, 472, 981, 310, 311, 313, 1074, 734, 319, 219, + 219, 308, 437, 400, 401, 656, 1075, 99, 490, 321, + 116, 804, 118, 341, 618, 415, 2, 289, 771, 517, + 351, 634, 805, 1011, 927, 726, 681, 736, 106, 414, + 1066, 1067, 415, 1012, 518, 537, 538, 539, 540, 928, + 87, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 734, 106, 472, 976, 967, 361, 362, 735, -68, + -68, 2, 220, 220, 876, 1029, 322, 299, 434, -75, + -75, 982, 190, 295, 336, 298, 335, 300, 309, 304, + 341, 191, 798, 306, 624, 968, 323, 1106, 99, 1011, + 1110, 415, 1104, 314, 315, 1112, 1113, 996, 975, 1012, + 977, 506, 292, 292, 680, 292, 468, 192, 398, 399, + 75, 76, 735, 77, 78, 75, 76, 190, 77, 78, + 888, 458, 678, 890, 331, 190, 320, 325, 1013, 190, + 412, 190, 733, 1106, 108, 109, 383, 472, 1138, -242, + 1038, 282, 1040, 472, 413, 695, 325, 1076, -68, -68, + 472, 345, 346, 347, 348, 349, 350, 566, -75, -75, + 190, 442, 328, 679, 731, 732, 297, 453, 447, -349, + 691, -349, 677, 325, 1013, 400, 401, 94, 451, -349, + 454, 456, 450, 1042, 332, 989, 733, 1103, 1068, 788, + 1069, 219, 798, 333, 94, 858, 219, 730, 219, 465, + 319, 727, 334, 341, 181, 1070, 956, 191, 337, 859, + 219, 219, 698, -572, -400, 490, 728, -572, 731, 732, + 432, 491, -349, -349, 289, -349, -349, 707, -241, 676, + 490, 409, 492, 192, 1011, 693, 724, 1134, 2, 325, + 1013, 1105, 341, 328, 1012, 106, 406, 407, 455, 457, + 459, 730, 191, 973, 220, 727, 973, 670, 671, 220, + 191, 220, 106, 445, 191, 355, 191, 448, 322, 958, + 728, 356, 755, 220, 220, 556, 75, 76, 192, 77, + 78, 729, 726, 357, 736, 460, 192, 1068, 462, 1069, + 192, 328, 192, 415, 2, 191, 470, 488, 815, 473, + 891, 1114, 430, 1115, 1070, 415, -349, -349, 734, -349, + -349, 358, -349, -349, 447, -349, -349, 359, 1116, -349, + -349, 192, -349, -349, 94, 1128, 755, 94, 360, 574, + 344, 1130, 577, 1131, 582, 729, 585, -619, 591, 94, + 955, 94, 973, -557, 973, -616, 598, -557, 489, 319, + 487, 415, 706, 415, 398, 399, 607, 190, 75, 76, + 321, 77, 78, 75, 76, -617, 77, 78, 616, 735, + 953, 491, 954, 622, 969, 417, 451, 970, 75, 76, + 408, 77, 78, 911, 325, 1013, 1105, 423, 409, 424, + 1133, 1114, 106, 1115, -241, 106, 490, 943, 944, 328, + 410, 951, 952, 414, 2, 589, 415, 106, 1116, 106, + 488, 530, 531, 532, 945, 946, 411, 322, 439, 473, + 604, -561, 328, 419, 609, -561, 578, -349, 219, 418, + -349, 583, -349, 586, 75, 76, 447, 77, 78, 289, + 425, 595, 970, 733, 992, 600, 620, 289, 400, 401, + 1060, -241, 447, 490, 1082, -453, 660, 289, 489, 451, + 1071, 2, 793, -618, 635, 636, 1002, 1003, 1081, 426, + -568, 970, 674, 675, -568, 731, 732, 289, 983, 319, + 1117, 947, 948, 949, 950, 75, 76, 431, 77, 78, + 321, 220, 191, 190, -558, 435, 1004, 1005, -558, 622, + 430, 406, 407, 415, 451, 398, 399, 488, 730, -565, + 1006, 623, 727, -565, 704, 705, 327, -562, 192, 341, + 436, -562, 186, 217, 217, 402, 403, 728, 440, 327, + 327, 327, 327, 327, 327, 441, 353, 354, 404, 405, + 1017, 767, 415, 443, 400, 401, 612, 322, 415, 774, + 578, 776, 614, 402, 403, 782, 783, 1083, 1043, -242, + 787, 467, 449, 1049, 607, 794, 404, 405, 461, -566, + 632, 491, 793, -566, 633, 473, 796, 328, 1059, 844, + 845, 1055, 492, 755, 1061, 402, 403, 1018, 472, -241, + 341, 490, 729, 1072, -241, 692, 621, 463, 404, 405, + 697, 75, 76, 464, 77, 78, 469, -349, 691, -349, + 1018, 1123, 919, 480, 686, 554, 486, -349, 589, 294, + 589, 296, 1093, 1094, 495, 1095, 757, 415, 191, 789, + 496, 647, 609, 106, 1065, 1018, 1018, 379, 497, 380, + 415, -349, -563, 1079, 813, 882, -563, -525, 186, -570, + 499, -525, 338, -570, 192, 1118, -349, 408, 324, 381, + 382, 852, 853, 135, 136, 137, 138, 139, 140, 400, + 401, 1020, -526, 1021, 910, 794, -526, 622, -524, 141, + 142, 143, -524, 500, 1022, 1023, 796, 1024, 501, 1025, + 1026, 502, 1018, 186, 503, 1018, 1141, 550, 1079, 1079, + 829, 186, 1027, 144, 1079, 186, -546, 186, 508, -523, + -546, 848, 849, -523, 415, 217, 429, 415, 862, 558, + 217, 917, 217, 177, 850, 851, 846, 847, 816, 817, + 818, 819, 820, 821, 217, 217, 186, 562, 1018, 892, + 671, 1079, 559, 106, 153, 415, 384, 979, 980, 921, + 825, 564, 826, 916, -349, 327, 563, -540, -545, -544, + 897, -540, -545, -544, 971, 575, -543, 415, 1058, -349, + -543, 978, 827, 828, 579, 885, 325, 1063, 885, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 327, + 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, + 327, 327, 327, 327, 327, 580, 581, -555, 325, 326, + 156, -555, -542, -241, 158, 584, -542, 1001, 779, 1041, + 395, 396, 397, 324, 590, 597, 305, 599, 135, 136, + 137, 138, 139, 140, 328, -541, 327, -538, -539, -541, + 1045, -538, -539, 596, 141, 142, 143, 339, 1030, 340, + 605, 94, 606, 965, 966, 610, 1036, 940, 941, 942, + -535, 972, -536, 415, -535, 615, -536, 794, 144, 1052, + 619, 625, 577, 451, 997, 998, 1056, 1057, 1050, -527, + 628, 447, -530, -527, 327, 988, -530, 632, 328, 327, + 627, 995, 512, 885, 177, 885, 885, 885, 630, -550, + 1129, -551, 177, -550, 650, -551, 177, -554, 177, 153, + 94, -554, 631, 1085, -552, 646, 427, 652, -552, 106, + 395, 396, 397, -548, -531, 447, -529, -548, -531, 794, + -529, 649, -533, 186, 664, 106, -533, 177, 993, -534, + 327, -532, 327, -534, 641, -532, 1031, 179, 208, 208, + 666, 661, 217, 866, 867, 868, 869, 870, 871, 872, + 1120, 667, 669, 94, 684, 182, 214, 214, 1036, 672, + 301, 302, 303, 325, 326, 156, 690, 682, 106, 158, + 769, 772, 885, 688, 885, 395, 396, 397, 841, 842, + 843, 696, 327, 863, 864, 865, 699, 106, 902, 903, + 904, 701, 183, 215, 215, 765, 778, 786, 784, 800, + 802, 1086, 807, 803, 806, 327, 1108, 1109, 854, 1144, + 812, 498, 824, 855, 857, 1147, 863, 864, 865, 860, + 856, 106, 866, 867, 868, 869, 870, 871, 872, 478, + 896, 900, 725, 909, 920, 515, 481, 482, 483, 484, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 914, 1136, 1137, 915, 918, 922, 478, 959, 186, + 960, 990, 991, 179, 994, 1032, 1053, 1084, 478, 1044, + 1087, 549, 1088, 1073, 1090, 1096, 1092, 1100, 1098, 1102, + 422, 182, 902, 903, 904, 516, 725, 1142, 866, 867, + 868, 869, 870, 871, 872, 1111, 327, 327, 327, 327, + 327, 327, 822, 823, 1122, 1124, 864, 1125, 179, 1132, + 1139, 1143, 1145, 1149, 1150, 471, 179, 880, 183, 281, + 179, 1046, 179, 1062, 177, 1101, 182, 964, 987, 1135, + 208, 561, 1048, 1119, 182, 208, 925, 208, 182, 663, + 182, 1121, 593, 777, 184, 216, 216, 775, 214, 208, + 208, 179, 912, 214, 792, 214, 307, 224, 493, 438, + 327, 1097, 629, 183, 555, 1000, 810, 214, 214, 182, + 0, 183, 0, 0, 830, 183, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, + 215, 0, 215, 0, 0, 327, 0, 0, 193, 222, + 222, 0, 0, 0, 215, 215, 183, 831, 832, 833, + 834, 835, 836, 837, 838, 839, 840, 0, 0, 0, + 0, 0, 0, 0, 0, 327, 327, 327, 327, 327, + 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, + 327, 327, 0, 327, 195, 223, 223, 0, 0, 0, + 0, 0, 638, 0, 0, 0, 507, 0, 0, 0, + 177, 0, 0, 0, 510, 0, 511, 0, 0, -479, + 184, 0, 0, 0, 363, 0, 0, 0, 0, 135, + 136, 137, 138, 139, 140, 0, 0, 0, 703, 0, + 0, 0, 0, 0, 0, 141, 142, 143, 0, 0, + 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, + 0, 0, 0, 0, 0, 184, 560, 0, 0, 144, + 484, 0, 0, 184, 193, 0, 0, 184, 0, 184, + 0, 780, 0, 0, 0, 570, 0, 216, 0, 0, + 0, 0, 216, 725, 216, 478, 0, 0, 179, 0, + 0, 710, 0, 0, 756, 0, 216, 216, 184, 0, + 153, 0, 0, 0, 0, 0, 182, 208, 0, 193, + 195, 611, 0, 0, 0, 0, 0, 193, 0, 0, + 0, 193, 0, 193, 0, 214, 0, 0, 0, 0, + 0, 222, 0, 0, 0, 0, 222, 0, 222, 570, + 0, 0, 0, 183, 0, 0, 809, 0, 0, 0, + 222, 222, 193, 0, 0, 195, 814, 327, 0, 0, + 0, 0, 215, 195, 325, 326, 156, 195, 0, 195, + 158, 0, 0, 0, 0, 780, 0, 223, 780, 0, + 0, 0, 223, 0, 223, 0, 0, 570, 0, 0, + 0, 0, 0, 0, 0, 0, 223, 223, 195, 0, + 0, 0, 0, 570, 659, 0, 0, 0, 0, 0, + 0, 327, 0, 0, 0, 0, 0, 0, 0, 0, + 923, 515, 0, 327, 179, 0, 929, 930, 931, 932, + 933, 934, 935, 936, 937, 938, 939, 0, 0, 0, + 0, 687, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 700, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 926, 0, 0, 0, 659, 709, 0, 780, 183, + 0, 0, 0, 0, 0, 0, 0, 659, 0, 0, + 0, 0, 0, 0, 198, 184, 0, 0, 0, 122, + 123, 124, 0, 0, 199, 127, 128, 129, 130, 131, + 132, 200, -427, -427, 216, 0, 0, 201, -427, 799, + 0, 0, 135, 136, 137, 138, 139, 140, 0, 0, + 808, 0, 0, 0, 0, -241, 0, 0, 141, 142, + 143, 0, 0, 0, 0, 0, 0, 0, 0, 193, + 0, 0, 0, 0, 0, 0, 0, 0, 484, 0, + 0, 0, 144, 0, 0, 0, 0, 0, 222, 0, + 0, 0, 0, 0, 0, 0, 780, 0, 0, 0, + 0, 0, 0, 0, -427, 146, 147, 148, 149, 150, + 151, 0, 0, 0, 0, 195, 0, 0, 0, 152, + 0, 0, 999, 153, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 223, 0, 0, 0, 0, 0, + 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -241, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 154, 155, 156, + 202, 203, 0, 158, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 193, 0, -349, -349, -349, + 0, 4, 0, 0, 0, 5, 6, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, + 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, + 13, 195, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 0, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 0, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 0, 77, 78, + 79, 80, -2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -241, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -349, -349, + -349, 0, 4, 0, 0, 0, 5, 6, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 12, 13, 0, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 0, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 0, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 121, 77, + 78, 79, 80, 122, 123, 124, 0, 125, 126, 127, + 128, 129, 130, 131, 132, 133, -479, 552, 0, 0, + 0, 134, 0, 0, 0, 0, 135, 136, 137, 138, + 139, 140, 0, 0, 0, 0, 0, 0, 0, -241, + 0, 3, 141, 142, 143, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -349, -349, -349, 144, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, + 147, 148, 149, 150, 151, 0, 0, 0, 0, 0, + 0, 0, 0, 152, 11, 12, 13, 153, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 0, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 154, 155, 156, 157, 78, 79, 553, 121, 0, + 0, 0, 0, 122, 123, 124, 0, 125, 126, 127, + 128, 129, 130, 131, 132, 133, -479, 0, 0, 0, + 0, 134, 0, 0, 0, 0, 135, 136, 137, 138, + 139, 140, 0, 0, 0, 0, 0, 0, 0, -241, + 0, 0, 141, 142, 143, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -241, -241, -241, 144, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, + 147, 148, 149, 150, 151, 0, 0, 0, 0, 0, + 0, 0, 0, 152, -241, -241, -241, 153, -241, -241, + -241, -241, -241, -241, -241, -241, -241, -241, 0, -241, + -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, + -241, -241, -241, -241, 0, -241, -241, -241, -241, -241, + -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, + -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, + -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, + -241, 154, 155, 156, 157, 78, -241, 158, 198, 0, + 0, 0, 0, 122, 123, 124, 0, 0, 199, 127, + 128, 129, 130, 131, 132, 200, -479, -483, 0, 0, + 0, 201, 0, 0, 0, 0, 135, 136, 137, 138, + 139, 140, 0, 0, 0, 0, 0, 0, 0, -241, + 0, 0, 141, 142, 143, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -241, -241, -241, 144, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, + 147, 148, 149, 150, 151, 0, 0, 0, 0, 0, + 0, 0, 0, 152, -241, -241, -241, 153, -241, -241, + -241, -241, -241, -241, -241, -241, -241, -241, 0, -241, + -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, + -241, -241, -241, -241, 0, -241, -241, -241, -241, -241, + -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, + -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, + -241, -241, -241, -241, -241, -241, -241, -241, -241, -241, + -241, 154, 155, 156, 202, 203, -241, 158, 121, 0, + 0, 0, 0, 122, 123, 124, 0, 125, 126, 127, + 128, 129, 130, 131, 132, 133, -479, 0, 0, 0, + 0, 134, 0, 0, 0, 0, 135, 136, 137, 138, + 139, 140, 0, 0, 0, 0, 0, 0, 0, -241, + 121, 0, 141, 142, 143, 122, 123, 124, 0, 125, + 126, 127, 128, 129, 130, 131, 132, 133, -479, 0, + 0, 0, 0, 134, 0, 0, 144, 0, 135, 136, + 137, 138, 139, 140, 0, 0, 0, 0, 0, 0, + 0, -241, 0, 0, 141, 142, 143, 0, 145, 146, + 147, 148, 149, 150, 151, 0, 0, 0, 0, 0, + 0, 0, 0, 152, 0, 0, 0, 153, 144, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -454, 146, 147, 148, 149, 150, 151, 0, 0, 0, + 0, 0, 0, 0, 0, 152, 0, 0, 0, 153, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 154, 155, 156, 157, 78, 0, 158, 0, 198, + 0, 0, 0, 0, 122, 123, 124, 0, 0, 199, + 127, 128, 129, 130, 131, 132, 200, -479, -483, 0, + 0, 0, 201, 0, 0, 0, 0, 135, 136, 137, + 138, 139, 140, 154, 155, 156, 157, 78, 0, 158, + -241, 121, 0, 141, 142, 143, 122, 123, 124, 0, + 125, 126, 127, 128, 129, 130, 131, 132, 133, -479, + 642, 0, 0, 0, 134, 0, 0, 144, 0, 135, + 136, 137, 138, 139, 140, 0, 0, 0, 0, 0, + 0, 0, -241, 0, 0, 141, 142, 143, 0, -423, + 146, 147, 148, 149, 150, 151, 0, 0, 0, 0, + 0, 0, 0, 0, 152, 0, 0, 0, 153, 144, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 146, 147, 148, 149, 150, 151, 0, 0, + 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, + 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 154, 155, 156, 202, 203, 0, 158, 0, + 198, 0, 0, 0, 0, 122, 123, 124, 0, 0, + 199, 127, 128, 129, 130, 131, 132, 200, -479, -483, + 0, 0, 0, 201, 0, 0, 0, 0, 135, 136, + 137, 138, 139, 140, 154, 155, 156, 157, 78, 0, + 158, -241, 121, 0, 141, 142, 143, 122, 123, 124, + 0, 125, 126, 127, 128, 129, 130, 131, 132, 133, + -479, 0, 0, 0, 0, 134, 0, 0, 144, 0, + 135, 136, 137, 138, 139, 140, 0, 0, 0, 0, + 0, 0, 0, -241, 0, 0, 141, 142, 143, 0, + 0, 146, 147, 148, 149, 150, 151, 0, 0, 0, + 0, 0, 0, 0, 0, 152, 0, 0, 0, 153, + 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 146, 147, 148, 149, 150, 151, 0, + 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, + 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 154, 155, 156, 202, 203, 0, 158, + 0, 0, 0, 0, 122, 123, 124, 0, 125, 126, + 127, 128, 129, 130, 131, 132, 200, -479, 568, 0, + 0, 0, 363, 0, 0, 0, 0, 135, 136, 137, + 138, 139, 140, 0, 0, 154, 155, 156, 157, 78, + -241, 158, 3, 141, 142, 143, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 144, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 146, 147, 148, 149, 150, 151, 0, 0, 0, 0, + 0, 0, 0, 0, 569, 11, 12, 13, 153, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 0, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 154, 155, 156, 157, 78, 79, 553, 122, + 123, 124, 0, 125, 126, 127, 128, 129, 130, 131, + 132, 200, -479, 643, 0, 0, 0, 363, 0, 0, + 0, 0, 135, 136, 137, 138, 139, 140, 0, 0, + 0, 0, 0, 0, 0, -241, 0, 3, 141, 142, + 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 144, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 146, 147, 148, 149, 150, + 151, 0, 0, 0, 0, 0, 0, 0, 0, 152, + 11, 12, 13, 153, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 0, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 0, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 154, 155, 156, + 157, 78, 79, 553, 122, 123, 124, 0, 125, 126, + 127, 128, 129, 130, 131, 132, 200, -479, 654, 0, + 0, 0, 363, 0, 0, 0, 0, 135, 136, 137, + 138, 139, 140, 0, 0, 0, 0, 0, 0, 0, + -241, 0, 3, 141, 142, 143, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 144, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 146, 147, 148, 149, 150, 151, 0, 0, 0, 0, + 0, 0, 0, 0, 655, 11, 12, 13, 153, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 0, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 154, 155, 156, 157, 78, 79, 553, 122, + 123, 124, 0, 125, 126, 127, 128, 129, 130, 131, + 132, 200, -479, 653, 0, 0, 0, 363, 0, 0, + 0, 0, 135, 136, 137, 138, 139, 140, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 141, 142, + 143, 122, 123, 124, 0, 125, 126, 127, 128, 129, + 130, 131, 132, 200, -479, 657, 0, 0, 0, 363, + 0, 0, 144, 0, 135, 136, 137, 138, 139, 140, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 141, 142, 143, 0, 0, 146, 147, 148, 149, 150, + 151, 0, 0, 0, 0, 0, 0, 0, 0, 152, + 0, 0, 0, 153, 144, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 146, 147, 148, + 149, 150, 151, 0, 0, 0, 0, 0, 0, 0, + 0, 658, 0, 0, 0, 153, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 154, 155, 156, + 157, 78, 0, 158, 0, 0, 0, 122, 123, 124, + 0, 125, 126, 127, 128, 129, 130, 131, 132, 200, + -479, 708, 0, 0, 0, 363, 0, 0, 0, 0, + 135, 136, 137, 138, 139, 140, 0, 0, 0, 154, + 155, 156, 157, 78, 0, 158, 141, 142, 143, 122, + 123, 124, 0, 125, 126, 127, 128, 129, 130, 131, + 132, 200, -479, 761, 0, 0, 0, 363, 0, 0, + 144, 0, 135, 136, 137, 138, 139, 140, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 141, 142, + 143, 0, 0, 146, 147, 148, 149, 150, 151, 0, + 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, + 0, 153, 144, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 146, 147, 148, 149, 150, + 151, 0, 0, 0, 0, 0, 0, 0, 0, 152, + 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 154, 155, 156, 157, 78, + 0, 158, 0, 0, 0, 122, 123, 124, 0, 125, + 126, 127, 128, 129, 130, 131, 132, 200, -479, 762, + 0, 0, 0, 363, 0, 0, 0, 0, 135, 136, + 137, 138, 139, 140, 0, 0, 0, 154, 155, 156, + 157, 78, 0, 158, 141, 142, 143, 122, 123, 124, + 0, 125, 126, 127, 128, 129, 130, 131, 132, 200, + -479, 764, 0, 0, 0, 363, 0, 0, 144, 0, + 135, 136, 137, 138, 139, 140, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 141, 142, 143, 0, + 0, 146, 147, 148, 149, 150, 151, 0, 0, 0, + 0, 0, 0, 0, 0, 763, 0, 0, 0, 153, + 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 146, 147, 148, 149, 150, 151, 0, + 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, + 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 154, 155, 156, 157, 78, 0, 158, + 0, 0, 0, 122, 123, 124, 0, 125, 126, 127, + 128, 129, 130, 131, 132, 200, -479, 881, 0, 0, + 0, 363, 0, 0, 0, 0, 135, 136, 137, 138, + 139, 140, 0, 0, 0, 154, 155, 156, 157, 78, + 0, 158, 141, 142, 143, 122, 123, 124, 0, 125, + 126, 127, 128, 129, 130, 131, 132, 200, -479, 0, + 0, 0, 0, 363, 0, 0, 144, 0, 135, 136, + 137, 138, 139, 140, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 141, 142, 143, 0, 0, 146, + 147, 148, 149, 150, 151, 0, 0, 0, 0, 0, + 0, 0, 0, 152, 0, 0, 0, 153, 144, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 146, 147, 148, 149, 150, 151, 289, 0, 0, + 0, 0, 0, 0, 0, 152, 0, 0, 0, 153, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 154, 155, 156, 157, 78, 0, 158, 0, 0, + 0, 0, 0, 0, 0, -349, -349, -349, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 154, 155, 156, 157, 78, 0, 158, + 0, 0, 0, 0, 0, 0, 11, 12, 13, 0, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 0, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 289, 0, 0, 0, 0, 79, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 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, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -613, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 12, 13, 0, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 0, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 0, + 0, -111, 0, 0, 79, 80, -111, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 779, 0, + 0, 0, 0, 324, 0, 0, 0, 0, 135, 136, + 137, 138, 139, 140, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 141, 142, 143, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 144, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 12, 13, 0, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 0, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 153, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 284, 0, 0, 0, + 0, 79, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 325, 326, 156, 0, 0, 0, 158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -482, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 11, 12, 13, 0, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 0, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, -241, 0, 0, 0, 0, 79, 80, 11, 12, + 13, 2, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 0, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 0, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 0, 0, 0, 0, 0, + 79, 80, 0, 0, 11, 12, 13, 0, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 0, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 324, 77, 78, 79, 80, 135, 136, + 137, 138, 139, 140, 0, 0, 0, 0, 0, 0, + 0, -241, 324, 513, 141, 142, 143, 135, 136, 137, + 138, 139, 140, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 141, 142, 143, 0, 324, 144, 0, + 617, 0, 135, 136, 137, 138, 139, 140, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 144, 141, 142, + 143, 0, 324, 0, 0, 694, 0, 135, 136, 137, + 138, 139, 140, 0, 0, 0, 0, 0, 0, 153, + 0, 0, 144, 141, 142, 143, 0, 324, 924, 0, + 0, 0, 135, 136, 137, 138, 139, 140, 153, 0, + 0, 0, 0, 0, 0, 0, 324, 144, 141, 142, + 143, 135, 136, 137, 138, 139, 140, 0, 0, 0, + 0, 0, 0, 153, 0, 0, 0, 141, 142, 143, + 0, 352, 144, 0, 0, 0, 135, 136, 137, 138, + 139, 140, 0, 325, 326, 156, 0, 0, 153, 158, + 0, 144, 141, 142, 143, 0, 0, 0, 0, 0, + 0, 0, 325, 326, 156, 0, 0, 0, 158, 0, + 0, 0, 0, 153, 640, 0, 144, 0, 0, 135, + 136, 137, 138, 139, 140, 0, 0, 325, 326, 156, + 0, 0, 153, 158, 0, 141, 142, 143, 0, 711, + 0, 0, 0, 0, 712, 713, 714, 715, 716, 717, + 0, 0, 325, 326, 156, 0, 0, 153, 158, 144, + 141, 718, 719, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 325, 326, 156, + 0, 0, 0, 158, 720, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 325, 326, 156, 0, + 153, 0, 158, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 325, 326, 156, 0, 153, 0, 158, 0, 0, + 0, -169, 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, 325, 326, 156, 0, 0, 0, + 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 325, + 721, 722, 0, 0, 0, 723, 11, 12, 13, 0, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 0, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 3, 0, 0, 0, 0, 79, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -349, -349, -349, 0, 4, + 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, 11, 12, 13, 0, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 0, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 3, 0, 0, 0, 0, 79, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 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, 11, 12, 13, 0, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 0, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, -349, -349, -349, 0, 0, 79, 80, + 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, 11, 12, 13, 0, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 0, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, -621, -621, -621, 0, 0, 79, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -621, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -621, -621, -621, 0, -621, -621, -621, -621, + -621, -621, -621, -621, -621, -621, 0, -621, -621, -621, + -621, -621, -621, -621, -621, -621, -621, -621, -621, -621, + -621, -621, 0, -621, -621, -621, -621, -621, -621, -621, + -621, -621, -621, -621, -621, -621, -621, -621, -621, -621, + -621, -621, -621, -621, -621, -621, -621, -621, -621, -621, + -621, -621, -621, -621, -621, -621, -621, -621, -621, 8, + 9, 10, 0, 0, -621, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, + 13, 0, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 0, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 0, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 0, 0, 0, 0, 0, + 79, 80, 11, 12, 13, 0, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 0, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 0, + 0, 0, 0, 0, 79, 80 +}; + +static const short yycheck[] = { 0, + 0, 105, 3, 460, 0, 361, 299, 615, 492, 363, + 11, 12, 2, 316, 410, 546, 470, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 122, 408, 648, 409, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 88, 619, 8, 0, 443, 759, + 3, 398, 399, 318, 7, 406, 407, 785, 548, 0, + 81, 81, 26, 22, 18, 81, 442, 791, 400, 401, + 34, 648, 446, 648, 24, 34, 21, 24, 99, 702, + 25, 771, 779, 201, 105, 782, 18, 34, 206, 556, + 208, 5, 895, 114, 115, 116, 24, 648, 119, 9, + 10, 111, 220, 48, 49, 572, 34, 0, 26, 119, + 3, 25, 5, 134, 490, 21, 34, 18, 668, 28, + 141, 27, 696, 24, 28, 702, 600, 702, 81, 18, + 1011, 1012, 21, 34, 43, 402, 403, 404, 405, 43, + 81, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 702, 105, 5, 889, 879, 6, 7, 648, 85, + 86, 34, 9, 10, 874, 968, 119, 84, 212, 85, + 86, 899, 134, 97, 18, 99, 129, 101, 21, 103, + 201, 8, 686, 107, 497, 882, 24, 1068, 81, 24, + 1071, 21, 27, 117, 118, 1074, 1075, 27, 888, 34, + 890, 575, 95, 96, 599, 98, 471, 8, 32, 33, + 174, 175, 702, 177, 178, 174, 175, 179, 177, 178, + 770, 19, 598, 773, 24, 187, 119, 174, 175, 191, + 41, 193, 648, 1114, 107, 108, 160, 5, 1117, 24, + 975, 26, 977, 5, 55, 621, 174, 175, 174, 175, + 5, 135, 136, 137, 138, 139, 140, 25, 174, 175, + 222, 282, 361, 25, 648, 648, 287, 580, 288, 24, + 25, 26, 595, 174, 175, 48, 49, 298, 299, 34, + 301, 302, 298, 980, 24, 913, 702, 25, 26, 5, + 28, 201, 796, 24, 315, 41, 206, 648, 208, 315, + 321, 648, 24, 324, 8, 43, 857, 134, 18, 55, + 220, 221, 625, 21, 25, 26, 648, 25, 702, 702, + 438, 342, 174, 175, 18, 177, 178, 640, 24, 23, + 26, 39, 342, 134, 24, 909, 959, 27, 34, 174, + 175, 176, 363, 442, 34, 298, 52, 53, 301, 302, + 303, 702, 179, 886, 201, 702, 889, 20, 21, 206, + 187, 208, 315, 287, 191, 24, 193, 291, 321, 859, + 702, 16, 648, 220, 221, 419, 174, 175, 179, 177, + 178, 648, 959, 16, 959, 309, 187, 26, 312, 28, + 191, 490, 193, 21, 34, 222, 320, 25, 711, 323, + 776, 26, 18, 28, 43, 21, 174, 175, 959, 177, + 178, 16, 174, 175, 434, 177, 178, 16, 43, 174, + 175, 222, 177, 178, 445, 1094, 702, 448, 15, 445, + 134, 1100, 448, 1102, 455, 702, 457, 22, 459, 460, + 856, 462, 975, 21, 977, 22, 467, 25, 341, 470, + 18, 21, 22, 21, 32, 33, 477, 419, 174, 175, + 470, 177, 178, 174, 175, 22, 177, 178, 489, 959, + 854, 492, 855, 494, 18, 179, 497, 21, 174, 175, + 29, 177, 178, 179, 174, 175, 176, 191, 39, 193, + 25, 26, 445, 28, 24, 448, 26, 844, 845, 598, + 40, 852, 853, 18, 34, 458, 21, 460, 43, 462, + 25, 395, 396, 397, 846, 847, 54, 470, 222, 443, + 473, 21, 621, 19, 477, 25, 450, 18, 438, 91, + 21, 455, 23, 457, 174, 175, 556, 177, 178, 18, + 22, 465, 21, 959, 918, 469, 1050, 18, 48, 49, + 21, 24, 572, 26, 1031, 91, 577, 18, 451, 580, + 21, 34, 686, 22, 517, 518, 85, 86, 18, 24, + 21, 21, 593, 594, 25, 959, 959, 18, 901, 600, + 21, 848, 849, 850, 851, 174, 175, 91, 177, 178, + 600, 438, 419, 555, 21, 19, 115, 116, 25, 620, + 18, 52, 53, 21, 625, 32, 33, 25, 959, 21, + 129, 495, 959, 25, 635, 636, 122, 21, 419, 640, + 20, 25, 8, 9, 10, 37, 38, 959, 91, 135, + 136, 137, 138, 139, 140, 27, 142, 143, 50, 51, + 963, 662, 21, 24, 48, 49, 25, 600, 21, 670, + 574, 672, 25, 37, 38, 676, 677, 1033, 981, 24, + 681, 26, 18, 986, 685, 686, 50, 51, 18, 21, + 21, 692, 796, 25, 25, 599, 686, 776, 1001, 32, + 33, 994, 692, 959, 1007, 37, 38, 963, 5, 24, + 711, 26, 959, 1016, 24, 619, 26, 18, 50, 51, + 624, 174, 175, 23, 177, 178, 24, 24, 25, 26, + 986, 1087, 811, 22, 607, 419, 18, 34, 671, 96, + 673, 98, 1045, 1046, 25, 1048, 650, 21, 555, 682, + 25, 25, 685, 686, 1010, 1011, 1012, 24, 24, 26, + 21, 28, 21, 1019, 25, 766, 25, 21, 134, 21, + 18, 25, 18, 25, 555, 1078, 43, 29, 24, 46, + 47, 52, 53, 29, 30, 31, 32, 33, 34, 48, + 49, 118, 21, 120, 795, 796, 25, 798, 21, 45, + 46, 47, 25, 18, 131, 132, 796, 134, 18, 136, + 137, 18, 1068, 179, 18, 1071, 1119, 42, 1074, 1075, + 724, 187, 149, 69, 1080, 191, 21, 193, 19, 21, + 25, 37, 38, 25, 21, 201, 202, 21, 25, 9, + 206, 25, 208, 8, 50, 51, 48, 49, 712, 713, + 714, 715, 716, 717, 220, 221, 222, 25, 1114, 20, + 21, 1117, 11, 796, 110, 21, 23, 20, 21, 25, + 24, 11, 26, 806, 28, 361, 24, 21, 21, 21, + 784, 25, 25, 25, 885, 24, 21, 21, 22, 43, + 25, 892, 46, 47, 87, 768, 174, 175, 771, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 21, 19, 21, 174, 175, + 176, 25, 21, 19, 180, 19, 25, 961, 19, 20, + 34, 35, 36, 24, 19, 27, 1050, 24, 29, 30, + 31, 32, 33, 34, 1033, 21, 442, 21, 21, 25, + 984, 25, 25, 87, 45, 46, 47, 132, 969, 134, + 25, 972, 21, 877, 878, 22, 972, 841, 842, 843, + 21, 885, 21, 21, 25, 18, 25, 988, 69, 990, + 24, 21, 988, 994, 927, 928, 997, 998, 988, 21, + 25, 1001, 21, 25, 490, 909, 25, 21, 1087, 495, + 22, 25, 378, 886, 179, 888, 889, 890, 11, 21, + 1099, 21, 187, 25, 27, 25, 191, 21, 193, 110, + 1031, 25, 24, 1034, 21, 24, 201, 25, 25, 972, + 34, 35, 36, 21, 21, 1045, 21, 25, 25, 1050, + 25, 24, 21, 419, 20, 988, 25, 222, 922, 21, + 546, 21, 548, 25, 550, 25, 970, 8, 9, 10, + 19, 23, 438, 77, 78, 79, 80, 81, 82, 83, + 1081, 20, 19, 1084, 5, 8, 9, 10, 1084, 23, + 66, 67, 68, 174, 175, 176, 27, 21, 1031, 180, + 20, 20, 975, 25, 977, 34, 35, 36, 34, 35, + 36, 24, 598, 71, 72, 73, 22, 1050, 71, 72, + 73, 24, 8, 9, 10, 25, 18, 25, 27, 18, + 25, 1035, 25, 27, 21, 621, 1069, 1070, 29, 1140, + 25, 355, 24, 39, 54, 1146, 71, 72, 73, 25, + 40, 1084, 77, 78, 79, 80, 81, 82, 83, 324, + 87, 25, 648, 24, 18, 379, 331, 332, 333, 334, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 25, 1115, 1116, 25, 25, 25, 352, 21, 555, + 18, 25, 18, 134, 21, 18, 178, 21, 363, 87, + 22, 415, 20, 87, 20, 25, 87, 87, 25, 87, + 189, 134, 71, 72, 73, 380, 702, 1121, 77, 78, + 79, 80, 81, 82, 83, 87, 712, 713, 714, 715, + 716, 717, 718, 719, 18, 20, 72, 20, 179, 27, + 87, 27, 87, 0, 0, 321, 187, 760, 134, 81, + 191, 985, 193, 1009, 419, 1060, 179, 874, 906, 1114, + 201, 426, 986, 1080, 187, 206, 825, 208, 191, 580, + 193, 1084, 462, 673, 8, 9, 10, 671, 201, 220, + 221, 222, 796, 206, 685, 208, 111, 10, 342, 221, + 776, 1054, 508, 179, 419, 959, 702, 220, 221, 222, + -1, 187, -1, -1, 23, 191, -1, 193, -1, -1, + -1, -1, -1, -1, -1, 201, -1, -1, -1, -1, + 206, -1, 208, -1, -1, 811, -1, -1, 8, 9, + 10, -1, -1, -1, 220, 221, 222, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, -1, -1, -1, + -1, -1, -1, -1, -1, 841, 842, 843, 844, 845, + 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, + 856, 857, -1, 859, 8, 9, 10, -1, -1, -1, + -1, -1, 547, -1, -1, -1, 365, -1, -1, -1, + 555, -1, -1, -1, 373, -1, 375, -1, -1, 19, + 134, -1, -1, -1, 24, -1, -1, -1, -1, 29, + 30, 31, 32, 33, 34, -1, -1, -1, 632, -1, + -1, -1, -1, -1, -1, 45, 46, 47, -1, -1, + -1, -1, -1, -1, -1, -1, 922, -1, -1, -1, + -1, -1, -1, -1, -1, 179, 425, -1, -1, 69, + 615, -1, -1, 187, 134, -1, -1, 191, -1, 193, + -1, 675, -1, -1, -1, 444, -1, 201, -1, -1, + -1, -1, 206, 959, 208, 640, -1, -1, 419, -1, + -1, 646, -1, -1, 649, -1, 220, 221, 222, -1, + 110, -1, -1, -1, -1, -1, 419, 438, -1, 179, + 134, 480, -1, -1, -1, -1, -1, 187, -1, -1, + -1, 191, -1, 193, -1, 438, -1, -1, -1, -1, + -1, 201, -1, -1, -1, -1, 206, -1, 208, 508, + -1, -1, -1, 419, -1, -1, 701, -1, -1, -1, + 220, 221, 222, -1, -1, 179, 711, 1033, -1, -1, + -1, -1, 438, 187, 174, 175, 176, 191, -1, 193, + 180, -1, -1, -1, -1, 779, -1, 201, 782, -1, + -1, -1, 206, -1, 208, -1, -1, 556, -1, -1, + -1, -1, -1, -1, -1, -1, 220, 221, 222, -1, + -1, -1, -1, 572, 573, -1, -1, -1, -1, -1, + -1, 1087, -1, -1, -1, -1, -1, -1, -1, -1, + 824, 825, -1, 1099, 555, -1, 830, 831, 832, 833, + 834, 835, 836, 837, 838, 839, 840, -1, -1, -1, + -1, 610, 555, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 627, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 826, -1, -1, -1, 644, 645, -1, 882, 555, + -1, -1, -1, -1, -1, -1, -1, 656, -1, -1, + -1, -1, -1, -1, 1, 419, -1, -1, -1, 6, + 7, 8, -1, -1, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 438, -1, -1, 24, 25, 688, + -1, -1, 29, 30, 31, 32, 33, 34, -1, -1, + 699, -1, -1, -1, -1, 42, -1, -1, 45, 46, + 47, -1, -1, -1, -1, -1, -1, -1, -1, 419, + -1, -1, -1, -1, -1, -1, -1, -1, 913, -1, + -1, -1, 69, -1, -1, -1, -1, -1, 438, -1, + -1, -1, -1, -1, -1, -1, 980, -1, -1, -1, + -1, -1, -1, -1, 91, 92, 93, 94, 95, 96, + 97, -1, -1, -1, -1, 419, -1, -1, -1, 106, + -1, -1, 957, 110, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 438, -1, -1, -1, -1, -1, + -1, 0, 1, -1, -1, -1, -1, -1, -1, -1, + -1, 555, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 34, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 44, -1, 174, 175, 176, + 177, 178, -1, 180, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 555, -1, 66, 67, 68, + -1, 70, -1, -1, -1, 74, 75, 76, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + 89, 90, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 107, 108, + 109, 555, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, -1, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, -1, 177, 178, + 179, 180, 0, 1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 34, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 44, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 66, 67, + 68, -1, 70, -1, -1, -1, 74, 75, 76, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, 89, 90, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + 108, 109, -1, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, -1, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 1, 177, + 178, 179, 180, 6, 7, 8, -1, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, + -1, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, -1, -1, -1, -1, -1, -1, -1, 42, + -1, 44, 45, 46, 47, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 66, 67, 68, 69, 70, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 92, + 93, 94, 95, 96, 97, -1, -1, -1, -1, -1, + -1, -1, -1, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, -1, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, -1, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 1, -1, + -1, -1, -1, 6, 7, 8, -1, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, -1, -1, -1, + -1, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, -1, -1, -1, -1, -1, -1, -1, 42, + -1, -1, 45, 46, 47, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 66, 67, 68, 69, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 92, + 93, 94, 95, 96, 97, -1, -1, -1, -1, -1, + -1, -1, -1, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, -1, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, -1, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 1, -1, + -1, -1, -1, 6, 7, 8, -1, -1, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, + -1, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, -1, -1, -1, -1, -1, -1, -1, 42, + -1, -1, 45, 46, 47, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 66, 67, 68, 69, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 92, + 93, 94, 95, 96, 97, -1, -1, -1, -1, -1, + -1, -1, -1, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, -1, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, -1, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 1, -1, + -1, -1, -1, 6, 7, 8, -1, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, -1, -1, -1, + -1, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, -1, -1, -1, -1, -1, -1, -1, 42, + 1, -1, 45, 46, 47, 6, 7, 8, -1, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, -1, + -1, -1, -1, 24, -1, -1, 69, -1, 29, 30, + 31, 32, 33, 34, -1, -1, -1, -1, -1, -1, + -1, 42, -1, -1, 45, 46, 47, -1, 91, 92, + 93, 94, 95, 96, 97, -1, -1, -1, -1, -1, + -1, -1, -1, 106, -1, -1, -1, 110, 69, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 91, 92, 93, 94, 95, 96, 97, -1, -1, -1, + -1, -1, -1, -1, -1, 106, -1, -1, -1, 110, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 174, 175, 176, 177, 178, -1, 180, -1, 1, + -1, -1, -1, -1, 6, 7, 8, -1, -1, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, + -1, -1, 24, -1, -1, -1, -1, 29, 30, 31, + 32, 33, 34, 174, 175, 176, 177, 178, -1, 180, + 42, 1, -1, 45, 46, 47, 6, 7, 8, -1, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, -1, -1, -1, 24, -1, -1, 69, -1, 29, + 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 91, + 92, 93, 94, 95, 96, 97, -1, -1, -1, -1, + -1, -1, -1, -1, 106, -1, -1, -1, 110, 69, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 92, 93, 94, 95, 96, 97, -1, -1, + -1, -1, -1, -1, -1, -1, 106, -1, -1, -1, + 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 174, 175, 176, 177, 178, -1, 180, -1, + 1, -1, -1, -1, -1, 6, 7, 8, -1, -1, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + -1, -1, -1, 24, -1, -1, -1, -1, 29, 30, + 31, 32, 33, 34, 174, 175, 176, 177, 178, -1, + 180, 42, 1, -1, 45, 46, 47, 6, 7, 8, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, -1, -1, -1, -1, 24, -1, -1, 69, -1, + 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, + -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, + -1, 92, 93, 94, 95, 96, 97, -1, -1, -1, + -1, -1, -1, -1, -1, 106, -1, -1, -1, 110, + 69, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 92, 93, 94, 95, 96, 97, -1, + -1, -1, -1, -1, -1, -1, -1, 106, -1, -1, + -1, 110, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 174, 175, 176, 177, 178, -1, 180, + -1, -1, -1, -1, 6, 7, 8, -1, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, + -1, -1, 24, -1, -1, -1, -1, 29, 30, 31, + 32, 33, 34, -1, -1, 174, 175, 176, 177, 178, + 42, 180, 44, 45, 46, 47, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 69, 70, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 92, 93, 94, 95, 96, 97, -1, -1, -1, -1, + -1, -1, -1, -1, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, -1, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, -1, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 6, + 7, 8, -1, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, -1, -1, -1, 24, -1, -1, + -1, -1, 29, 30, 31, 32, 33, 34, -1, -1, + -1, -1, -1, -1, -1, 42, -1, 44, 45, 46, + 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 69, 70, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 92, 93, 94, 95, 96, + 97, -1, -1, -1, -1, -1, -1, -1, -1, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, -1, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + -1, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 6, 7, 8, -1, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, + -1, -1, 24, -1, -1, -1, -1, 29, 30, 31, + 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, + 42, -1, 44, 45, 46, 47, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 69, 70, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 92, 93, 94, 95, 96, 97, -1, -1, -1, -1, + -1, -1, -1, -1, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, -1, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, -1, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 6, + 7, 8, -1, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, -1, -1, -1, 24, -1, -1, + -1, -1, 29, 30, 31, 32, 33, 34, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, + 47, 6, 7, 8, -1, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, -1, -1, -1, 24, + -1, -1, 69, -1, 29, 30, 31, 32, 33, 34, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 45, 46, 47, -1, -1, 92, 93, 94, 95, 96, + 97, -1, -1, -1, -1, -1, -1, -1, -1, 106, + -1, -1, -1, 110, 69, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 92, 93, 94, + 95, 96, 97, -1, -1, -1, -1, -1, -1, -1, + -1, 106, -1, -1, -1, 110, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 174, 175, 176, + 177, 178, -1, 180, -1, -1, -1, 6, 7, 8, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, -1, -1, -1, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, -1, -1, -1, 174, + 175, 176, 177, 178, -1, 180, 45, 46, 47, 6, + 7, 8, -1, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, -1, -1, -1, 24, -1, -1, + 69, -1, 29, 30, 31, 32, 33, 34, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, + 47, -1, -1, 92, 93, 94, 95, 96, 97, -1, + -1, -1, -1, -1, -1, -1, -1, 106, -1, -1, + -1, 110, 69, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 92, 93, 94, 95, 96, + 97, -1, -1, -1, -1, -1, -1, -1, -1, 106, + -1, -1, -1, 110, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 174, 175, 176, 177, 178, + -1, 180, -1, -1, -1, 6, 7, 8, -1, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + -1, -1, -1, 24, -1, -1, -1, -1, 29, 30, + 31, 32, 33, 34, -1, -1, -1, 174, 175, 176, + 177, 178, -1, 180, 45, 46, 47, 6, 7, 8, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, -1, -1, -1, 24, -1, -1, 69, -1, + 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 45, 46, 47, -1, + -1, 92, 93, 94, 95, 96, 97, -1, -1, -1, + -1, -1, -1, -1, -1, 106, -1, -1, -1, 110, + 69, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 92, 93, 94, 95, 96, 97, -1, + -1, -1, -1, -1, -1, -1, -1, 106, -1, -1, + -1, 110, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 174, 175, 176, 177, 178, -1, 180, + -1, -1, -1, 6, 7, 8, -1, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, + -1, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, -1, -1, -1, 174, 175, 176, 177, 178, + -1, 180, 45, 46, 47, 6, 7, 8, -1, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, -1, + -1, -1, -1, 24, -1, -1, 69, -1, 29, 30, + 31, 32, 33, 34, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 45, 46, 47, -1, -1, 92, + 93, 94, 95, 96, 97, -1, -1, -1, -1, -1, + -1, -1, -1, 106, -1, -1, -1, 110, 69, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 92, 93, 94, 95, 96, 97, 18, -1, -1, + -1, -1, -1, -1, -1, 106, -1, -1, -1, 110, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, + -1, 174, 175, 176, 177, 178, -1, 180, -1, -1, + -1, -1, -1, -1, -1, 66, 67, 68, -1, 70, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 174, 175, 176, 177, 178, -1, 180, + -1, -1, -1, -1, -1, -1, 107, 108, 109, -1, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + -1, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, -1, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 18, -1, -1, -1, -1, 179, 180, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, + -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, 70, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 87, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 107, 108, 109, -1, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, -1, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, -1, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, -1, + -1, 19, -1, -1, 179, 180, 24, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 44, -1, 19, -1, + -1, -1, -1, 24, -1, -1, -1, -1, 29, 30, + 31, 32, 33, 34, -1, -1, -1, -1, -1, -1, + -1, -1, 70, -1, 45, 46, 47, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 69, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + 108, 109, -1, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 110, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 19, -1, -1, -1, + -1, 179, 180, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 44, -1, 174, 175, 176, -1, -1, -1, 180, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 70, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 107, 108, 109, -1, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, -1, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, -1, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 24, -1, -1, -1, -1, 179, 180, 107, 108, + 109, 34, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, -1, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, -1, -1, -1, -1, -1, + 179, 180, -1, -1, 107, 108, 109, -1, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, -1, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, -1, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 24, 177, 178, 179, 180, 29, 30, + 31, 32, 33, 34, -1, -1, -1, -1, -1, -1, + -1, 42, 24, 25, 45, 46, 47, 29, 30, 31, + 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 45, 46, 47, -1, 24, 69, -1, + 27, -1, 29, 30, 31, 32, 33, 34, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 69, 45, 46, + 47, -1, 24, -1, -1, 27, -1, 29, 30, 31, + 32, 33, 34, -1, -1, -1, -1, -1, -1, 110, + -1, -1, 69, 45, 46, 47, -1, 24, 25, -1, + -1, -1, 29, 30, 31, 32, 33, 34, 110, -1, + -1, -1, -1, -1, -1, -1, 24, 69, 45, 46, + 47, 29, 30, 31, 32, 33, 34, -1, -1, -1, + -1, -1, -1, 110, -1, -1, -1, 45, 46, 47, + -1, 24, 69, -1, -1, -1, 29, 30, 31, 32, + 33, 34, -1, 174, 175, 176, -1, -1, 110, 180, + -1, 69, 45, 46, 47, -1, -1, -1, -1, -1, + -1, -1, 174, 175, 176, -1, -1, -1, 180, -1, + -1, -1, -1, 110, 24, -1, 69, -1, -1, 29, + 30, 31, 32, 33, 34, -1, -1, 174, 175, 176, + -1, -1, 110, 180, -1, 45, 46, 47, -1, 24, + -1, -1, -1, -1, 29, 30, 31, 32, 33, 34, + -1, -1, 174, 175, 176, -1, -1, 110, 180, 69, + 45, 46, 47, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 174, 175, 176, + -1, -1, -1, 180, 69, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 174, 175, 176, -1, + 110, -1, 180, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 174, 175, 176, -1, 110, -1, 180, -1, -1, + -1, 42, -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, 174, 175, 176, -1, -1, -1, + 180, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 174, + 175, 176, -1, -1, -1, 180, 107, 108, 109, -1, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + -1, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, -1, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 44, -1, -1, -1, -1, 179, 180, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 66, 67, 68, -1, 70, + -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, 107, 108, 109, -1, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + -1, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, -1, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 44, -1, -1, -1, -1, 179, 180, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, + -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, 107, 108, 109, -1, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + -1, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, -1, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 66, 67, 68, -1, -1, 179, 180, + -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, 107, 108, 109, -1, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, -1, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, -1, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 66, 67, 68, -1, -1, 179, 180, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 107, 108, 109, -1, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, -1, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, -1, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 88, + 89, 90, -1, -1, 179, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 107, 108, + 109, -1, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, -1, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, -1, -1, -1, -1, -1, + 179, 180, 107, 108, 109, -1, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, -1, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, -1, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, -1, + -1, -1, -1, -1, 179, 180 +}; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/af9/evans/bison-1.28/share/bison.simple" +/* This file comes from bison-1.28. */ + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +#ifndef YYSTACK_USE_ALLOCA +#ifdef alloca +#define YYSTACK_USE_ALLOCA +#else /* alloca not defined */ +#ifdef __GNUC__ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) +#define YYSTACK_USE_ALLOCA +#include +#else /* not sparc */ +/* We think this test detects Watcom and Microsoft C. */ +/* This used to test MSDOS, but that is a bad idea + since that symbol is in the user namespace. */ +#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) +#if 0 /* No need for malloc.h, which pollutes the namespace; + instead, just don't use alloca. */ +#include +#endif +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +/* I don't know what this was needed for, but it pollutes the namespace. + So I turned it off. rms, 2 May 1997. */ +/* #include */ + #pragma alloca +#define YYSTACK_USE_ALLOCA +#else /* not MSDOS, or __TURBOC__, or _AIX */ +#if 0 +#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, + and on HPUX 10. Eventually we can turn this on. */ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#endif /* __hpux */ +#endif +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc */ +#endif /* not GNU C */ +#endif /* alloca not defined */ +#endif /* YYSTACK_USE_ALLOCA not defined */ + +#ifdef YYSTACK_USE_ALLOCA +#define YYSTACK_ALLOC alloca +#else +#define YYSTACK_ALLOC malloc +#endif + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ +#define YYFAIL goto yyerrlab +#define YYRECOVERING() (!!yyerrstatus) +#define YYBACKUP(token, value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYPURE +#define YYLEX yylex() +#endif + +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYPURE + +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ + +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ +#endif + +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ + +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ + +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif + +/* Define __yy_memcpy. Note that the size argument + should be passed with type unsigned int, because that is what the non-GCC + definitions require. With GCC, __builtin_memcpy takes an arg + of type size_t, but it can handle unsigned int. */ + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (to, from, count) + char *to; + char *from; + unsigned int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#else /* __cplusplus */ + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (char *to, char *from, unsigned int count) +{ + register char *t = to; + register char *f = from; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#endif +#endif + +#line 217 "/af9/evans/bison-1.28/share/bison.simple" + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +#ifdef YYPARSE_PARAM +int yyparse (void *); +#else +int yyparse (void); +#endif +#endif + +int +yyparse(YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else +#define YYPOPSTACK (yyvsp--, yyssp--) +#endif + + int yystacksize = YYINITDEPTH; + int yyfree_stacks = 0; + +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int yylen; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss - 1; + yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif + +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + + /* Get the current used size of the three stacks, in elements. */ + int size = yyssp - yyss + 1; + +#ifdef yyoverflow + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif +#else /* no yyoverflow */ + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + if (yyfree_stacks) + { + sfree (yyss); + sfree (yyvs); +#ifdef YYLSP_NEEDED + sfree (yyls); +#endif + } + return 2; + } + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; +#ifndef YYSTACK_USE_ALLOCA + yyfree_stacks = 1; +#endif + yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, + size * (unsigned int) sizeof (*yyssp)); + yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, + size * (unsigned int) sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, + size * (unsigned int) sizeof (*yylsp)); +#endif +#endif /* no yyoverflow */ + + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif + + goto yybackup; + yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif + } + else + { + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; + goto yynewstate; + +/* Do the default action for the current state. */ +yydefault: + + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + +/* Do a reduction. yyn is the number of a rule to reduce with. */ +yyreduce: + yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (yydebug) + { + int i; + + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + + + switch (yyn) { + +case 5: +#line 223 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 6: +#line 224 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 7: +#line 225 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 8: +#line 226 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 9: +#line 227 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 10: +#line 228 "cgrammar.y" +{ uentry_checkDecl (); exprNode_free (yyvsp[0].expr); ; + break;} +case 11: +#line 229 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 12: +#line 233 "cgrammar.y" +{ checkConstant (yyvsp[-6].qtyp, yyvsp[-4].ntyp); ; + break;} +case 13: +#line 235 "cgrammar.y" +{ checkValueConstant (yyvsp[-9].qtyp, yyvsp[-7].ntyp, yyvsp[-3].expr) ; ; + break;} +case 14: +#line 238 "cgrammar.y" +{ context_enterFunctionDecl (); ; + break;} +case 15: +#line 239 "cgrammar.y" +{ declareStaticFunction (yyvsp[-2].ntyp); context_quietExitFunction (); + context_exitFunctionDecl (); ; + break;} +case 16: +#line 244 "cgrammar.y" +{ + qtype qint = qtype_create (ctype_int); + yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, qint); + qtype_free (qint); + ; + break;} +case 17: +#line 250 "cgrammar.y" +{ yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, yyvsp[-2].qtyp); ; + break;} +case 19: +#line 255 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; qtype_adjustPointers (yyvsp[-1].count, idDecl_getTyp (yyval.ntyp)); ; + break;} +case 20: +#line 258 "cgrammar.y" +{ yyval.ntyp = idDecl_create (yyvsp[0].cname, qtype_unknown ()); ; + break;} +case 21: +#line 260 "cgrammar.y" +{ yyval.ntyp = idDecl_expectFunction (yyvsp[-2].ntyp); ; + break;} +case 22: +#line 262 "cgrammar.y" +{ yyval.ntyp = idDecl_replaceCtype (yyvsp[-2].ntyp, ctype_makeArray (idDecl_getCtype (yyvsp[-2].ntyp))); ; + break;} +case 23: +#line 264 "cgrammar.y" +{ + int value; + + if (exprNode_hasValue (yyvsp[-2].expr) + && multiVal_isInt (exprNode_getValue (yyvsp[-2].expr))) + { + value = (int) multiVal_forceInt (exprNode_getValue (yyvsp[-2].expr)); + } + else + { + value = 0; + } + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ctype_makeFixedArray (idDecl_getCtype (yyvsp[-5].ntyp), value)); + ; + break;} +case 24: +#line 280 "cgrammar.y" +{ setCurrentParams (uentryList_missingParams); + ; + break;} +case 25: +#line 283 "cgrammar.y" +{ /* need to support globals and modifies here! */ + ctype ct = ctype_makeFunction (idDecl_getCtype (yyvsp[-5].ntyp), + uentryList_makeMissingParams ()); + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ct); + context_popLoc (); + ; + break;} +case 26: +#line 291 "cgrammar.y" +{ setCurrentParams (yyvsp[-1].entrylist); + ; + break;} +case 27: +#line 294 "cgrammar.y" +{ clearCurrentParams (); + yyval.ntyp = idDecl_replaceCtype (yyvsp[-6].ntyp, ctype_makeFunction (idDecl_getCtype (yyvsp[-6].ntyp), yyvsp[-3].entrylist)); + context_popLoc (); + ; + break;} +case 28: +#line 300 "cgrammar.y" +{ yyval.ntyp = idDecl_create (yyvsp[0].cname, qtype_unknown ()); ; + break;} +case 29: +#line 302 "cgrammar.y" +{ yyval.ntyp = idDecl_expectFunction (yyvsp[-2].ntyp); ; + break;} +case 30: +#line 304 "cgrammar.y" +{ yyval.ntyp = idDecl_replaceCtype (yyvsp[-2].ntyp, ctype_makeArray (idDecl_getCtype (yyvsp[-2].ntyp))); ; + break;} +case 31: +#line 306 "cgrammar.y" +{ + int value; + + if (exprNode_hasValue (yyvsp[-2].expr) + && multiVal_isInt (exprNode_getValue (yyvsp[-2].expr))) + { + value = (int) multiVal_forceInt (exprNode_getValue (yyvsp[-2].expr)); + } + else + { + value = 0; + } + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ctype_makeFixedArray (idDecl_getCtype (yyvsp[-5].ntyp), value)); + ; + break;} +case 32: +#line 322 "cgrammar.y" +{ setCurrentParams (uentryList_missingParams); + ; + break;} +case 33: +#line 325 "cgrammar.y" +{ /* need to support globals and modifies here! */ + ctype ct = ctype_makeFunction (idDecl_getCtype (yyvsp[-5].ntyp), + uentryList_makeMissingParams ()); + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ct); + context_popLoc (); + ; + break;} +case 34: +#line 333 "cgrammar.y" +{ setCurrentParams (yyvsp[-1].entrylist); + ; + break;} +case 35: +#line 336 "cgrammar.y" +{ clearCurrentParams (); + yyval.ntyp = idDecl_replaceCtype (yyvsp[-6].ntyp, ctype_makeFunction (idDecl_getCtype (yyvsp[-6].ntyp), yyvsp[-3].entrylist)); + context_popLoc (); + ; + break;} +case 36: +#line 343 "cgrammar.y" +{ setCurrentParams (yyvsp[-1].entrylist); ; + break;} +case 37: +#line 344 "cgrammar.y" +{ clearCurrentParams (); ; + break;} +case 38: +#line 345 "cgrammar.y" +{ declareCIter (yyvsp[-8].cname, yyvsp[-6].entrylist); ; + break;} +case 39: +#line 348 "cgrammar.y" +{ exprNode_checkMacroBody (yyvsp[-1].expr); ; + break;} +case 40: +#line 349 "cgrammar.y" +{ exprNode_checkIterBody (yyvsp[-1].expr); ; + break;} +case 41: +#line 350 "cgrammar.y" +{ exprNode_checkIterEnd (yyvsp[-1].expr); ; + break;} +case 42: +#line 351 "cgrammar.y" +{ exprChecks_checkEmptyMacroBody (); ; + break;} +case 43: +#line 354 "cgrammar.y" +{ declareFunction (yyvsp[0].ntyp); ; + break;} +case 44: +#line 357 "cgrammar.y" +{ setProcessingGlobMods (); ; + break;} +case 45: +#line 358 "cgrammar.y" +{ clearProcessingGlobMods (); ; + break;} +case 46: +#line 361 "cgrammar.y" +{ setProcessingGlobMods (); ; + break;} +case 47: +#line 362 "cgrammar.y" +{ clearProcessingGlobMods (); ; + break;} +case 54: +#line 377 "cgrammar.y" +{ ; ; + break;} +case 55: +#line 378 "cgrammar.y" +{ ; ; + break;} +case 56: +#line 381 "cgrammar.y" +{ globListAdd (yyvsp[0].sr, yyvsp[-1].tquallist); ; + break;} +case 57: +#line 384 "cgrammar.y" +{ yyval.sr = uentry_getSref (yyvsp[0].entry); ; + break;} +case 58: +#line 385 "cgrammar.y" +{ yyval.sr = globListUnrecognized (yyvsp[0].cname); ; + break;} +case 59: +#line 388 "cgrammar.y" +{ yyval.typequal = qual_createUndef (); ; + break;} +case 60: +#line 389 "cgrammar.y" +{ yyval.typequal = qual_createKilled (); ; + break;} +case 61: +#line 390 "cgrammar.y" +{ yyval.typequal = qual_createOut (); ; + break;} +case 62: +#line 391 "cgrammar.y" +{ yyval.typequal = qual_createIn (); ; + break;} +case 63: +#line 392 "cgrammar.y" +{ yyval.typequal = qual_createPartial (); ; + break;} +case 64: +#line 395 "cgrammar.y" +{ yyval.tquallist = qualList_undefined; ; + break;} +case 65: +#line 396 "cgrammar.y" +{ yyval.tquallist = qualList_add (yyvsp[0].tquallist, yyvsp[-1].typequal); ; + break;} +case 66: +#line 399 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 67: +#line 401 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 68: +#line 402 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 69: +#line 404 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 70: +#line 406 "cgrammar.y" +{ setFunctionNoGlobals (); + setFunctionModifies (sRefSet_single (sRef_makeNothing ())); + ; + break;} +case 73: +#line 413 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 74: +#line 415 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 75: +#line 416 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 76: +#line 418 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 77: +#line 420 "cgrammar.y" +{ setFunctionNoGlobals (); + setFunctionModifies (sRefSet_single (sRef_makeNothing ())); + ; + break;} +case 82: +#line 432 "cgrammar.y" +{ + context_setProtectVars (); enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 83: +#line 437 "cgrammar.y" +{ + setFunctionModifies (yyvsp[0].srset); exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 84: +#line 445 "cgrammar.y" +{ + context_setProtectVars (); enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 85: +#line 450 "cgrammar.y" +{ + setFunctionModifies (yyvsp[0].srset); exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 95: +#line 474 "cgrammar.y" +{ yyval.sck = SP_ISONLY; ; + break;} +case 96: +#line 475 "cgrammar.y" +{ yyval.sck = SP_ISOBSERVER; ; + break;} +case 97: +#line 476 "cgrammar.y" +{ yyval.sck = SP_ISEXPOSED; ; + break;} +case 98: +#line 477 "cgrammar.y" +{ yyval.sck = SP_ISDEPENDENT; ; + break;} +case 99: +#line 478 "cgrammar.y" +{ yyval.sck = SP_ISOWNED; ; + break;} +case 100: +#line 479 "cgrammar.y" +{ yyval.sck = SP_ISSHARED; ; + break;} +case 101: +#line 480 "cgrammar.y" +{ yyval.sck = SP_ISNULL; ; + break;} +case 102: +#line 481 "cgrammar.y" +{ yyval.sck = SP_ISNOTNULL; ; + break;} +case 103: +#line 485 "cgrammar.y" +{ + context_setProtectVars (); + enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 104: +#line 491 "cgrammar.y" +{ + setFunctionSpecialClause (yyvsp[-6].tok, yyvsp[-3].srset, yyvsp[-1].tok); + exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 105: +#line 498 "cgrammar.y" +{ + context_setProtectVars (); + enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 106: +#line 504 "cgrammar.y" +{ + setFunctionStateSpecialClause (yyvsp[-7].tok, yyvsp[-5].sck, yyvsp[-3].srset, yyvsp[-1].tok); + exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 107: +#line 513 "cgrammar.y" +{ + qtype qint = qtype_create (ctype_int); + yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, qint); + qtype_free (qint); + ; + break;} +case 108: +#line 519 "cgrammar.y" +{ yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, yyvsp[-2].qtyp); ; + break;} +case 109: +#line 522 "cgrammar.y" +{ checkDoneParams (); context_enterInnerContext (); ; + break;} +case 110: +#line 524 "cgrammar.y" +{ + exprNode_checkFunctionBody (yyvsp[0].expr); yyval.expr = yyvsp[0].expr; + context_exitInner (yyvsp[0].expr); + ; + break;} +case 111: +#line 529 "cgrammar.y" +{ doneParams (); context_enterInnerContext (); ; + break;} +case 112: +#line 531 "cgrammar.y" +{ + context_exitInner (yyvsp[0].expr); + exprNode_checkFunctionBody (yyvsp[0].expr); + yyval.expr = yyvsp[0].expr; /* old style */ + ; + break;} +case 113: +#line 539 "cgrammar.y" +{ + context_setFunctionDefined (exprNode_loc (yyvsp[0].expr)); + exprNode_checkFunction (context_getHeader (), yyvsp[0].expr); + context_exitFunction (); + ; + break;} +case 114: +#line 546 "cgrammar.y" +{ yyval.srset = yyvsp[-2].srset; ; + break;} +case 115: +#line 547 "cgrammar.y" +{ yyval.srset = sRefSet_new (); ; + break;} +case 116: +#line 550 "cgrammar.y" +{ yyval.srset = yyvsp[-1].srset; ; + break;} +case 117: +#line 551 "cgrammar.y" +{ yyval.srset = sRefSet_new (); ; + break;} +case 118: +#line 554 "cgrammar.y" +{ yyval.sr = uentry_getSref (yyvsp[0].entry); checkModifiesId (yyvsp[0].entry); ; + break;} +case 119: +#line 555 "cgrammar.y" +{ yyval.sr = fixModifiesId (yyvsp[0].cname); ; + break;} +case 120: +#line 556 "cgrammar.y" +{ yyval.sr = modListArrayFetch (yyvsp[-2].sr, sRef_undefined); ; + break;} +case 121: +#line 557 "cgrammar.y" +{ yyval.sr = modListArrayFetch (yyvsp[-3].sr, yyvsp[-1].sr); ; + break;} +case 122: +#line 558 "cgrammar.y" +{ yyval.sr = modListPointer (yyvsp[0].sr); ; + break;} +case 123: +#line 559 "cgrammar.y" +{ yyval.sr = yyvsp[-1].sr; ; + break;} +case 124: +#line 560 "cgrammar.y" +{ yyval.sr = modListFieldAccess (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 125: +#line 561 "cgrammar.y" +{ yyval.sr = modListArrowAccess (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 126: +#line 565 "cgrammar.y" +{ yyval.sr = yyvsp[0].sr; ; + break;} +case 127: +#line 566 "cgrammar.y" +{ yyval.sr = sRef_makeUnknown (); /* sRef_makeConstant ($1); ? */ ; + break;} +case 128: +#line 570 "cgrammar.y" +{ yyval.srset = sRefSet_single (yyvsp[0].sr); ; + break;} +case 129: +#line 571 "cgrammar.y" +{ yyval.srset = sRefSet_insert (yyvsp[-2].srset, yyvsp[0].sr); ; + break;} +case 130: +#line 575 "cgrammar.y" +{ yyval.sr = checkSpecClausesId (yyvsp[0].entry); ; + break;} +case 131: +#line 577 "cgrammar.y" +{ yyval.sr = fixSpecClausesId (yyvsp[0].cname); ; + break;} +case 132: +#line 578 "cgrammar.y" +{ yyval.sr = sRef_makeAnyArrayFetch (yyvsp[-2].sr); ; + break;} +case 133: +#line 579 "cgrammar.y" +{ yyval.sr = sRef_makeAnyArrayFetch (yyvsp[-3].sr); ; + break;} +case 134: +#line 580 "cgrammar.y" +{ yyval.sr = sRef_constructPointer (yyvsp[0].sr); ; + break;} +case 135: +#line 581 "cgrammar.y" +{ yyval.sr = yyvsp[-1].sr; ; + break;} +case 136: +#line 582 "cgrammar.y" +{ cstring_markOwned (yyvsp[0].cname); + yyval.sr = sRef_buildField (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 137: +#line 584 "cgrammar.y" +{ cstring_markOwned (yyvsp[0].cname); + yyval.sr = sRef_makeArrow (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 138: +#line 589 "cgrammar.y" +{ if (sRef_isValid (yyvsp[0].sr)) { yyval.srset = sRefSet_single (yyvsp[0].sr); } + else { yyval.srset = sRefSet_undefined; } + ; + break;} +case 139: +#line 593 "cgrammar.y" +{ if (sRef_isValid (yyvsp[0].sr)) + { + yyval.srset = sRefSet_insert (yyvsp[-2].srset, yyvsp[0].sr); + } + else + { + yyval.srset = yyvsp[-2].srset; + } + ; + break;} +case 140: +#line 604 "cgrammar.y" +{ yyval.expr = exprNode_fromIdentifier (yyvsp[0].entry); ; + break;} +case 141: +#line 605 "cgrammar.y" +{ yyval.expr = exprNode_fromUIO (yyvsp[0].cname); ; + break;} +case 143: +#line 607 "cgrammar.y" +{ yyval.expr = exprNode_addParens (yyvsp[-2].tok, yyvsp[-1].expr); ; + break;} +case 144: +#line 608 "cgrammar.y" +{ yyval.expr = exprNode_fromIdentifier (coerceId (yyvsp[0].ctyp)); ; + break;} +case 145: +#line 609 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 147: +#line 613 "cgrammar.y" +{ yyval.expr = exprNode_arrayFetch (yyvsp[-3].expr, yyvsp[-1].expr); ; + break;} +case 148: +#line 614 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-2].expr, exprNodeList_new ()); ; + break;} +case 149: +#line 615 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-3].expr, yyvsp[-1].alist); ; + break;} +case 150: +#line 616 "cgrammar.y" +{ yyval.expr = exprNode_vaArg (yyvsp[-5].tok, yyvsp[-3].expr, yyvsp[-1].qtyp); ; + break;} +case 151: +#line 617 "cgrammar.y" +{ yyval.expr = exprNode_fieldAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 152: +#line 618 "cgrammar.y" +{ yyval.expr = exprNode_arrowAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 153: +#line 619 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 154: +#line 620 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 155: +#line 623 "cgrammar.y" +{ yyval.alist = exprNodeList_singleton (yyvsp[0].expr); ; + break;} +case 156: +#line 624 "cgrammar.y" +{ yyval.alist = exprNodeList_push (yyvsp[-2].alist, yyvsp[0].expr); ; + break;} +case 158: +#line 628 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 159: +#line 629 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 160: +#line 630 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 161: +#line 631 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 162: +#line 632 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 163: +#line 633 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 164: +#line 634 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 165: +#line 635 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 166: +#line 636 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 167: +#line 637 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 168: +#line 641 "cgrammar.y" +{ yyval.expr = exprNode_offsetof (yyvsp[-5].qtyp, yyvsp[-2].cname); ; + break;} +case 169: +#line 644 "cgrammar.y" +{ context_setProtectVars (); ; + break;} +case 170: +#line 645 "cgrammar.y" +{ context_sizeofReleaseVars (); yyval.expr = yyvsp[0].expr; ; + break;} +case 171: +#line 648 "cgrammar.y" +{ yyval.expr = exprNode_sizeofType (yyvsp[-1].qtyp); ; + break;} +case 172: +#line 649 "cgrammar.y" +{ yyval.expr = exprNode_sizeofExpr (yyvsp[0].expr); ; + break;} +case 174: +#line 654 "cgrammar.y" +{ yyval.expr = exprNode_cast (yyvsp[-3].tok, yyvsp[0].expr, yyvsp[-2].qtyp); ; + break;} +case 176: +#line 658 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 177: +#line 659 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 178: +#line 660 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 180: +#line 664 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 181: +#line 665 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 183: +#line 669 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 184: +#line 670 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 186: +#line 674 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 187: +#line 675 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 188: +#line 676 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 189: +#line 677 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 191: +#line 681 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 192: +#line 682 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 194: +#line 686 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 196: +#line 690 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 198: +#line 695 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 200: +#line 700 "cgrammar.y" +{ exprNode_produceGuards (yyvsp[-1].expr); + context_enterAndClause (yyvsp[-1].expr); + ; + break;} +case 201: +#line 704 "cgrammar.y" +{ + yyval.expr = exprNode_op (yyvsp[-3].expr, yyvsp[0].expr, yyvsp[-2].tok); + context_exitAndClause (yyval.expr, yyvsp[0].expr); + ; + break;} +case 203: +#line 712 "cgrammar.y" +{ + exprNode_produceGuards (yyvsp[-1].expr); + context_enterOrClause (yyvsp[-1].expr); + ; + break;} +case 204: +#line 717 "cgrammar.y" +{ + yyval.expr = exprNode_op (yyvsp[-3].expr, yyvsp[0].expr, yyvsp[-2].tok); + context_exitOrClause (yyval.expr, yyvsp[0].expr); + ; + break;} +case 206: +#line 724 "cgrammar.y" +{ exprNode_produceGuards (yyvsp[-1].expr); context_enterTrueClause (yyvsp[-1].expr); ; + break;} +case 207: +#line 725 "cgrammar.y" +{ context_enterFalseClause (yyvsp[-4].expr); ; + break;} +case 208: +#line 726 "cgrammar.y" +{ yyval.expr = exprNode_cond (yyvsp[-6].expr, yyvsp[-3].expr, yyvsp[0].expr); context_exitClause (yyvsp[-6].expr, yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 210: +#line 730 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 211: +#line 731 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 212: +#line 732 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 213: +#line 733 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 214: +#line 734 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 215: +#line 735 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 216: +#line 736 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 217: +#line 737 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 218: +#line 738 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 219: +#line 739 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 220: +#line 740 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 222: +#line 744 "cgrammar.y" +{ yyval.expr = exprNode_comma (yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 223: +#line 747 "cgrammar.y" +{ yyval.expr = exprNode_undefined; ; + break;} +case 226: +#line 756 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 227: +#line 757 "cgrammar.y" +{ doVaDcl (); yyval.expr = exprNode_makeError (); ; + break;} +case 228: +#line 758 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 229: +#line 761 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 230: +#line 775 "cgrammar.y" +{ + setProcessingVars (yyvsp[-3].qtyp); + processNamedDecl (yyvsp[-1].ntyp); ; + break;} +case 231: +#line 778 "cgrammar.y" +{ unsetProcessingVars (); yyval.expr = yyvsp[-2].expr; ; + break;} +case 232: +#line 780 "cgrammar.y" +{ setProcessingVars (yyvsp[-4].qtyp); processNamedDecl (yyvsp[-2].ntyp); + ; + break;} +case 233: +#line 783 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-2].expr, exprNode_makeInitialization (yyvsp[-8].ntyp, yyvsp[-3].expr)); + unsetProcessingVars (); + ; + break;} +case 234: +#line 787 "cgrammar.y" +{ processNamedDecl (yyvsp[-1].ntyp); yyval.expr = exprNode_makeError (); ; + break;} +case 235: +#line 788 "cgrammar.y" +{ processNamedDecl (yyvsp[-2].ntyp); ; + break;} +case 236: +#line 789 "cgrammar.y" +{ yyval.expr = exprNode_makeInitialization (yyvsp[-5].ntyp, yyvsp[0].expr); ; + break;} +case 237: +#line 793 "cgrammar.y" +{ setProcessingTypedef (yyvsp[0].qtyp); ; + break;} +case 238: +#line 794 "cgrammar.y" +{ unsetProcessingTypedef (); ; + break;} +case 239: +#line 795 "cgrammar.y" +{ /* in the ANSI grammar, semantics unclear */ ; + break;} +case 240: +#line 796 "cgrammar.y" +{ /* in the ANSI grammar, semantics unclear */ ; + break;} +case 241: +#line 799 "cgrammar.y" +{ g_expectingTypeName = TRUE; ; + break;} +case 242: +#line 802 "cgrammar.y" +{ g_expectingTypeName = TRUE; context_pushLoc (); ; + break;} +case 243: +#line 805 "cgrammar.y" +{ ; ; + break;} +case 244: +#line 808 "cgrammar.y" +{ ; ; + break;} +case 245: +#line 809 "cgrammar.y" +{ ; ; + break;} +case 246: +#line 812 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 247: +#line 813 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 249: +#line 817 "cgrammar.y" +{ yyval.expr = exprNode_makeInitBlock (yyvsp[-2].tok, yyvsp[-1].alist); ; + break;} +case 250: +#line 818 "cgrammar.y" +{ yyval.expr = exprNode_makeInitBlock (yyvsp[-3].tok, yyvsp[-2].alist); ; + break;} +case 251: +#line 823 "cgrammar.y" +{ yyval.alist = exprNodeList_singleton (yyvsp[0].expr); ; + break;} +case 252: +#line 825 "cgrammar.y" +{ yyval.alist = exprNodeList_push (yyvsp[-2].alist, yyvsp[0].expr); ; + break;} +case 253: +#line 833 "cgrammar.y" +{ setStorageClass (SCEXTERN); yyval.typequal = qual_createExtern (); ; + break;} +case 254: +#line 834 "cgrammar.y" +{ yyval.typequal = qual_createInline (); ; + break;} +case 255: +#line 835 "cgrammar.y" +{ setStorageClass (SCSTATIC); yyval.typequal = qual_createStatic (); ; + break;} +case 256: +#line 836 "cgrammar.y" +{ yyval.typequal = qual_createAuto (); ; + break;} +case 257: +#line 837 "cgrammar.y" +{ yyval.typequal = qual_createRegister (); ; + break;} +case 258: +#line 840 "cgrammar.y" +{ yyval.typequal = qual_createConst (); ; + break;} +case 259: +#line 841 "cgrammar.y" +{ yyval.typequal = qual_createVolatile (); ; + break;} +case 260: +#line 842 "cgrammar.y" +{ yyval.typequal = qual_createOut (); ; + break;} +case 261: +#line 843 "cgrammar.y" +{ yyval.typequal = qual_createIn (); ; + break;} +case 262: +#line 844 "cgrammar.y" +{ yyval.typequal = qual_createPartial (); ; + break;} +case 263: +#line 845 "cgrammar.y" +{ yyval.typequal = qual_createSpecial (); ; + break;} +case 264: +#line 846 "cgrammar.y" +{ yyval.typequal = qual_createOwned (); ; + break;} +case 265: +#line 847 "cgrammar.y" +{ yyval.typequal = qual_createDependent (); ; + break;} +case 266: +#line 848 "cgrammar.y" +{ yyval.typequal = qual_createYield (); ; + break;} +case 267: +#line 849 "cgrammar.y" +{ yyval.typequal = qual_createTemp (); ; + break;} +case 268: +#line 850 "cgrammar.y" +{ yyval.typequal = qual_createOnly (); ; + break;} +case 269: +#line 851 "cgrammar.y" +{ yyval.typequal = qual_createKeep (); ; + break;} +case 270: +#line 852 "cgrammar.y" +{ yyval.typequal = qual_createKept (); ; + break;} +case 271: +#line 853 "cgrammar.y" +{ yyval.typequal = qual_createShared (); ; + break;} +case 272: +#line 854 "cgrammar.y" +{ yyval.typequal = qual_createUnique (); ; + break;} +case 273: +#line 855 "cgrammar.y" +{ yyval.typequal = qual_createExits (); ; + break;} +case 274: +#line 856 "cgrammar.y" +{ yyval.typequal = qual_createMayExit (); ; + break;} +case 275: +#line 857 "cgrammar.y" +{ yyval.typequal = qual_createTrueExit (); ; + break;} +case 276: +#line 858 "cgrammar.y" +{ yyval.typequal = qual_createFalseExit (); ; + break;} +case 277: +#line 859 "cgrammar.y" +{ yyval.typequal = qual_createNeverExit (); ; + break;} +case 278: +#line 860 "cgrammar.y" +{ yyval.typequal = qual_createNull (); ; + break;} +case 279: +#line 861 "cgrammar.y" +{ yyval.typequal = qual_createRelNull (); ; + break;} +case 280: +#line 862 "cgrammar.y" +{ yyval.typequal = qual_createReturned (); ; + break;} +case 281: +#line 863 "cgrammar.y" +{ yyval.typequal = qual_createExposed (); ; + break;} +case 282: +#line 864 "cgrammar.y" +{ yyval.typequal = qual_createObserver (); ; + break;} +case 283: +#line 865 "cgrammar.y" +{ yyval.typequal = qual_createChecked (); ; + break;} +case 284: +#line 866 "cgrammar.y" +{ yyval.typequal = qual_createCheckMod (); ; + break;} +case 285: +#line 867 "cgrammar.y" +{ yyval.typequal = qual_createUnchecked (); ; + break;} +case 286: +#line 868 "cgrammar.y" +{ yyval.typequal = qual_createCheckedStrict (); ; + break;} +case 287: +#line 869 "cgrammar.y" +{ yyval.typequal = qual_createTrueNull (); ; + break;} +case 288: +#line 870 "cgrammar.y" +{ yyval.typequal = qual_createFalseNull (); ; + break;} +case 289: +#line 871 "cgrammar.y" +{ yyval.typequal = qual_createUnused (); ; + break;} +case 290: +#line 872 "cgrammar.y" +{ yyval.typequal = qual_createExternal (); ; + break;} +case 291: +#line 873 "cgrammar.y" +{ yyval.typequal = qual_createSef (); ; + break;} +case 292: +#line 874 "cgrammar.y" +{ yyval.typequal = qual_createAbstract (); ; + break;} +case 293: +#line 875 "cgrammar.y" +{ yyval.typequal = qual_createConcrete (); ; + break;} +case 294: +#line 876 "cgrammar.y" +{ yyval.typequal = qual_createMutable (); ; + break;} +case 295: +#line 877 "cgrammar.y" +{ yyval.typequal = qual_createImmutable (); ; + break;} +case 296: +#line 878 "cgrammar.y" +{ yyval.typequal = qual_createNotNull (); ; + break;} +case 297: +#line 879 "cgrammar.y" +{ yyval.typequal = qual_createRefCounted (); ; + break;} +case 298: +#line 880 "cgrammar.y" +{ yyval.typequal = qual_createRefs (); ; + break;} +case 299: +#line 881 "cgrammar.y" +{ yyval.typequal = qual_createKillRef (); ; + break;} +case 300: +#line 882 "cgrammar.y" +{ yyval.typequal = qual_createRelDef (); ; + break;} +case 301: +#line 883 "cgrammar.y" +{ yyval.typequal = qual_createNewRef (); ; + break;} +case 302: +#line 884 "cgrammar.y" +{ yyval.typequal = qual_createTempRef (); ; + break;} +case 303: +#line 887 "cgrammar.y" +{ yyval.typequal = qual_createShort (); ; + break;} +case 304: +#line 888 "cgrammar.y" +{ yyval.typequal = qual_createLong (); ; + break;} +case 305: +#line 889 "cgrammar.y" +{ yyval.typequal = qual_createSigned (); ; + break;} +case 306: +#line 890 "cgrammar.y" +{ yyval.typequal = qual_createUnsigned (); ; + break;} +case 313: +#line 899 "cgrammar.y" +{ yyval.ctyp = ctype_unknown; ; + break;} +case 314: +#line 900 "cgrammar.y" +{ yyval.ctyp = ctype_anyintegral; ; + break;} +case 315: +#line 901 "cgrammar.y" +{ yyval.ctyp = ctype_unsignedintegral; ; + break;} +case 316: +#line 902 "cgrammar.y" +{ yyval.ctyp = ctype_signedintegral; ; + break;} +case 320: +#line 906 "cgrammar.y" +{ yyval.ctyp = ctype_fromQual (yyvsp[-1].typequal); ; + break;} +case 321: +#line 910 "cgrammar.y" +{ yyval.qtyp = qtype_resolve (yyvsp[-1].qtyp); ; + break;} +case 322: +#line 913 "cgrammar.y" +{ yyval.qtyp = yyvsp[0].qtyp; ; + break;} +case 323: +#line 915 "cgrammar.y" +{ yyval.qtyp = qtype_mergeAlt (yyvsp[-3].qtyp, yyvsp[-1].qtyp); ; + break;} +case 325: +#line 920 "cgrammar.y" +{ yyval.qtyp = qtype_mergeAlt (yyvsp[-2].qtyp, yyvsp[0].qtyp); ; + break;} +case 326: +#line 923 "cgrammar.y" +{ yyval.qtyp = qtype_addQual (yyvsp[0].qtyp, yyvsp[-1].typequal); ; + break;} +case 327: +#line 924 "cgrammar.y" +{ yyval.qtyp = qtype_addQual (yyvsp[0].qtyp, yyvsp[-1].typequal); ; + break;} +case 328: +#line 925 "cgrammar.y" +{ yyval.qtyp = qtype_combine (yyvsp[0].qtyp, yyvsp[-1].ctyp); ; + break;} +case 329: +#line 928 "cgrammar.y" +{ yyval.qtyp = qtype_unknown (); ; + break;} +case 330: +#line 929 "cgrammar.y" +{ yyval.qtyp = yyvsp[0].qtyp; ; + break;} +case 331: +#line 932 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 332: +#line 934 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 333: +#line 936 "cgrammar.y" +{ yyval.ctyp = declareStruct (yyvsp[-8].cname, yyvsp[-3].flist); ; + break;} +case 334: +#line 937 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 335: +#line 939 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 336: +#line 941 "cgrammar.y" +{ yyval.ctyp = declareUnion (yyvsp[-8].cname, yyvsp[-3].flist); ; + break;} +case 337: +#line 943 "cgrammar.y" +{ yyval.ctyp = declareStruct (yyvsp[-3].cname, uentryList_new ()); ; + break;} +case 338: +#line 945 "cgrammar.y" +{ yyval.ctyp = declareUnion (yyvsp[-3].cname, uentryList_new ()); ; + break;} +case 339: +#line 946 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 340: +#line 948 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 341: +#line 950 "cgrammar.y" +{ yyval.ctyp = declareUnnamedStruct (yyvsp[-3].flist); ; + break;} +case 342: +#line 951 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 343: +#line 953 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 344: +#line 955 "cgrammar.y" +{ yyval.ctyp = declareUnnamedUnion (yyvsp[-3].flist); ; + break;} +case 345: +#line 957 "cgrammar.y" +{ yyval.ctyp = ctype_createUnnamedStruct (uentryList_new ()); ; + break;} +case 346: +#line 959 "cgrammar.y" +{ yyval.ctyp = ctype_createUnnamedUnion (uentryList_new ()); ; + break;} +case 347: +#line 960 "cgrammar.y" +{ yyval.ctyp = handleStruct (yyvsp[-1].cname); ; + break;} +case 348: +#line 961 "cgrammar.y" +{ yyval.ctyp = handleUnion (yyvsp[-1].cname); ; + break;} +case 349: +#line 964 "cgrammar.y" +{ g_expectingTypeName = FALSE; ; + break;} +case 351: +#line 968 "cgrammar.y" +{ yyval.flist = uentryList_undefined; /* bogus! */ ; + break;} +case 352: +#line 969 "cgrammar.y" +{ yyval.flist = uentryList_mergeFields (yyvsp[-1].flist, yyvsp[0].flist); ; + break;} +case 353: +#line 973 "cgrammar.y" +{ yyval.flist = fixUentryList (yyvsp[-2].ntyplist, yyvsp[-4].qtyp); ; + break;} +case 354: +#line 975 "cgrammar.y" +{ yyval.flist = fixUnnamedDecl (yyvsp[-2].qtyp); ; + break;} +case 355: +#line 979 "cgrammar.y" +{ yyval.ntyplist = idDeclList_singleton (yyvsp[-1].ntyp); ; + break;} +case 356: +#line 981 "cgrammar.y" +{ yyval.ntyplist = idDeclList_add (yyvsp[-3].ntyplist, yyvsp[-1].ntyp); ; + break;} +case 357: +#line 984 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; ; + break;} +case 358: +#line 985 "cgrammar.y" +{ yyval.ntyp = idDecl_undefined; ; + break;} +case 359: +#line 986 "cgrammar.y" +{ yyval.ntyp = yyvsp[-2].ntyp; ; + break;} +case 360: +#line 990 "cgrammar.y" +{ yyval.ctyp = declareUnnamedEnum (yyvsp[-2].enumnamelist); ; + break;} +case 361: +#line 991 "cgrammar.y" +{ context_pushLoc (); ; + break;} +case 362: +#line 992 "cgrammar.y" +{ context_popLoc (); yyval.ctyp = declareEnum (yyvsp[-5].cname, yyvsp[-2].enumnamelist); ; + break;} +case 363: +#line 993 "cgrammar.y" +{ yyval.ctyp = handleEnum (yyvsp[-1].cname); ; + break;} +case 364: +#line 997 "cgrammar.y" +{ yyval.enumnamelist = enumNameList_single (yyvsp[0].cname); ; + break;} +case 365: +#line 999 "cgrammar.y" +{ yyval.enumnamelist = enumNameList_push (yyvsp[-2].enumnamelist, yyvsp[0].cname); ; + break;} +case 367: +#line 1004 "cgrammar.y" +{ uentry ue = uentry_makeEnumConstant (yyvsp[0].cname, ctype_unknown); + usymtab_supGlobalEntry (ue); + yyval.cname = yyvsp[0].cname; + ; + break;} +case 368: +#line 1009 "cgrammar.y" +{ uentry ue = uentry_makeEnumConstant (yyvsp[-3].cname, ctype_unknown); + usymtab_supGlobalEntry (ue); + yyval.cname = yyvsp[-3].cname; + ; + break;} +case 370: +#line 1016 "cgrammar.y" +{ yyval.ntyp = idDecl_create (cstring_undefined, qtype_create (yyvsp[0].ctyp)); ; + break;} +case 371: +#line 1018 "cgrammar.y" +{ + qtype qt = qtype_unknown (); + + qtype_adjustPointers (yyvsp[-1].count, qt); + yyval.ntyp = idDecl_create (cstring_copy (LastIdentifier ()), qt); + ; + break;} +case 372: +#line 1025 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; qtype_adjustPointers (yyvsp[-1].count, idDecl_getTyp (yyval.ntyp)); ; + break;} +case 374: +#line 1030 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; qtype_adjustPointers (yyvsp[-1].count, idDecl_getTyp (yyval.ntyp)); ; + break;} +case 375: +#line 1033 "cgrammar.y" +{ yyval.entrylist = handleParamTypeList (yyvsp[0].entrylist); ; + break;} +case 376: +#line 1034 "cgrammar.y" +{ yyval.entrylist = handleParamIdList (yyvsp[0].entrylist); ; + break;} +case 377: +#line 1037 "cgrammar.y" +{ /* ignored for now */; ; + break;} +case 378: +#line 1038 "cgrammar.y" +{ ; ; + break;} +case 379: +#line 1041 "cgrammar.y" +{ ; ; + break;} +case 380: +#line 1042 "cgrammar.y" +{ ; ; + break;} +case 381: +#line 1045 "cgrammar.y" +{ yyval.count = 1; ; + break;} +case 382: +#line 1046 "cgrammar.y" +{ yyval.count = 1; ; + break;} +case 383: +#line 1047 "cgrammar.y" +{ yyval.count = 1 + yyvsp[0].count; ; + break;} +case 384: +#line 1048 "cgrammar.y" +{ yyval.count = 1 + yyvsp[0].count; ; + break;} +case 386: +#line 1052 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-2].entrylist, uentry_makeElipsisMarker ()); ; + break;} +case 387: +#line 1055 "cgrammar.y" +{ yyval.entrylist = uentryList_single (uentry_makeVariableLoc (yyvsp[0].cname, ctype_int)); ; + break;} +case 388: +#line 1056 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-2].entrylist, uentry_makeVariableLoc (yyvsp[0].cname, ctype_int)); ; + break;} +case 389: +#line 1059 "cgrammar.y" +{ yyval.entrylist = uentryList_single (uentry_makeElipsisMarker ()); ; + break;} +case 391: +#line 1061 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-2].entrylist, uentry_makeElipsisMarker ()); ; + break;} +case 392: +#line 1064 "cgrammar.y" +{ storeLoc (); ; + break;} +case 393: +#line 1064 "cgrammar.y" +{ yyval.entrylist = uentryList_single (yyvsp[0].oentry); ; + break;} +case 394: +#line 1065 "cgrammar.y" +{ storeLoc (); ; + break;} +case 395: +#line 1066 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-3].entrylist, yyvsp[0].oentry); ; + break;} +case 396: +#line 1070 "cgrammar.y" +{ + if (isFlipOldStyle ()) + { + llparseerror (cstring_makeLiteral ("Inconsistent function parameter syntax (mixing old and new style declaration)")); + } + else + { + setNewStyle (); + } + yyval.oentry = makeCurrentParam (idDecl_fixParamBase (yyvsp[-1].ntyp, yyvsp[-2].qtyp)); + ; + break;} +case 397: +#line 1082 "cgrammar.y" +{ + idDecl tparam = idDecl_create (yyvsp[0].cname, qtype_unknown ()); + + if (isNewStyle ()) + { + llparseerror (message ("Inconsistent function parameter syntax: %q", + idDecl_unparse (tparam))); + } + + setFlipOldStyle (); + yyval.oentry = makeCurrentParam (tparam); + idDecl_free (tparam); + ; + break;} +case 399: +#line 1098 "cgrammar.y" +{ yyval.qtyp = qtype_newBase (yyvsp[-1].qtyp, yyvsp[0].ctyp); ; + break;} +case 400: +#line 1101 "cgrammar.y" +{ yyval.ctyp = ctype_adjustPointers (yyvsp[0].count, ctype_unknown); ; + break;} +case 402: +#line 1103 "cgrammar.y" +{ yyval.ctyp = ctype_adjustPointers (yyvsp[-1].count, yyvsp[0].ctyp); ; + break;} +case 403: +#line 1106 "cgrammar.y" +{ yyval.ctyp = ctype_unknown; ; + break;} +case 405: +#line 1111 "cgrammar.y" +{ yyval.ctyp = ctype_expectFunction (yyvsp[-1].ctyp); ; + break;} +case 406: +#line 1112 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (ctype_unknown); ; + break;} +case 407: +#line 1113 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (ctype_unknown); ; + break;} +case 408: +#line 1114 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (yyvsp[-2].ctyp); ; + break;} +case 409: +#line 1115 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (yyvsp[-3].ctyp); ; + break;} +case 410: +#line 1117 "cgrammar.y" +{ yyval.ctyp = ctype_makeFunction (ctype_unknown, uentryList_makeMissingParams ()); ; + break;} +case 411: +#line 1119 "cgrammar.y" +{ yyval.ctyp = ctype_makeParamsFunction (ctype_unknown, yyvsp[-1].entrylist); ; + break;} +case 412: +#line 1121 "cgrammar.y" +{ yyval.ctyp = ctype_makeFunction (yyvsp[-3].ctyp, uentryList_makeMissingParams ()); ; + break;} +case 413: +#line 1123 "cgrammar.y" +{ yyval.ctyp = ctype_makeParamsFunction (yyvsp[-4].ctyp, yyvsp[-1].entrylist); ; + break;} +case 423: +#line 1139 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 426: +#line 1147 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 427: +#line 1151 "cgrammar.y" +{ yyval.expr = exprNode_while (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 428: +#line 1153 "cgrammar.y" +{ yyval.expr = exprNode_doWhile (yyvsp[-5].expr, yyvsp[-2].expr); ; + break;} +case 429: +#line 1155 "cgrammar.y" +{ yyval.expr = exprNode_doWhile (yyvsp[-4].expr, yyvsp[-1].expr); ; + break;} +case 430: +#line 1157 "cgrammar.y" +{ yyval.expr = exprNode_for (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 431: +#line 1161 "cgrammar.y" +{ context_setProtectVars (); ; + break;} +case 432: +#line 1161 "cgrammar.y" +{ context_sizeofReleaseVars (); ; + break;} +case 433: +#line 1163 "cgrammar.y" +{ yyval.expr = exprNode_forPred (yyvsp[-7].expr, yyvsp[-5].expr, yyvsp[-2].expr); + context_enterForClause (yyvsp[-5].expr); ; + break;} +case 434: +#line 1168 "cgrammar.y" +{ setProcessingIterVars (yyvsp[-2].entry); ; + break;} +case 435: +#line 1170 "cgrammar.y" +{ yyval.expr = exprNode_iterStart (yyvsp[-5].entry, yyvsp[-1].alist); ; + break;} +case 436: +#line 1171 "cgrammar.y" +{ yyval.expr = exprNode_createId (yyvsp[0].entry); ; + break;} +case 440: +#line 1177 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 448: +#line 1185 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; ; + break;} +case 449: +#line 1186 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 450: +#line 1190 "cgrammar.y" +{ /* don't: context_exitTrueClause ($1, $2); */ + yyval.expr = exprNode_if (yyvsp[-1].expr, yyvsp[0].expr); + ; + break;} +case 451: +#line 1195 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 452: +#line 1198 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 463: +#line 1213 "cgrammar.y" +{ yyval.expr = exprNode_addParens (yyvsp[-2].tok, yyvsp[-1].expr); ; + break;} +case 465: +#line 1215 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 466: +#line 1218 "cgrammar.y" +{ yyval.expr = exprNode_labelStatement (yyvsp[-2].cname, yyvsp[0].expr); ; + break;} +case 467: +#line 1219 "cgrammar.y" +{ yyval.expr = exprNode_notReached (yyvsp[0].expr); ; + break;} +case 468: +#line 1225 "cgrammar.y" +{ context_enterCaseClause (yyvsp[0].expr); ; + break;} +case 469: +#line 1226 "cgrammar.y" +{ yyval.expr = exprNode_caseStatement (yyvsp[-3].expr, yyvsp[0].expr, FALSE); ; + break;} +case 470: +#line 1227 "cgrammar.y" +{ context_enterCaseClause (yyvsp[0].expr); ; + break;} +case 471: +#line 1228 "cgrammar.y" +{ yyval.expr = exprNode_caseStatement (yyvsp[-3].expr, yyvsp[0].expr, TRUE); ; + break;} +case 472: +#line 1231 "cgrammar.y" +{ context_enterCaseClause (exprNode_undefined); ; + break;} +case 473: +#line 1232 "cgrammar.y" +{ yyval.expr = exprNode_defaultStatement (yyvsp[-3].tok, yyvsp[0].expr, FALSE); ; + break;} +case 474: +#line 1233 "cgrammar.y" +{ context_enterCaseClause (exprNode_undefined); ; + break;} +case 475: +#line 1234 "cgrammar.y" +{ yyval.expr = exprNode_defaultStatement (yyvsp[-3].tok, yyvsp[0].expr, TRUE); ; + break;} +case 476: +#line 1237 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; ; + break;} +case 477: +#line 1239 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; context_exitInner (yyvsp[0].expr); ; + break;} +case 478: +#line 1242 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; ; + break;} +case 479: +#line 1245 "cgrammar.y" +{ context_enterInnerContext (); ; + break;} +case 480: +#line 1248 "cgrammar.y" +{ context_exitInnerPlain (); ; + break;} +case 481: +#line 1251 "cgrammar.y" +{ context_enterStructInnerContext (); ; + break;} +case 482: +#line 1254 "cgrammar.y" +{ context_exitStructInnerContext (); ; + break;} +case 483: +#line 1257 "cgrammar.y" +{ context_exitInnerSafe (); ; + break;} +case 484: +#line 1260 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 485: +#line 1261 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_createTok (yyvsp[0].tok)); ; + break;} +case 486: +#line 1262 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 487: +#line 1264 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_updateLocation (yyvsp[-2].expr, lltok_getLoc (yyvsp[0].tok))); ; + break;} +case 488: +#line 1265 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 489: +#line 1267 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_updateLocation (yyvsp[-2].expr, lltok_getLoc (yyvsp[0].tok))); ; + break;} +case 490: +#line 1269 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (exprNode_concat (yyvsp[-2].expr, yyvsp[-1].expr), lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 491: +#line 1271 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_updateLocation (exprNode_concat (yyvsp[-3].expr, yyvsp[-2].expr), + lltok_getLoc (yyvsp[-1].tok))); + ; + break;} +case 492: +#line 1278 "cgrammar.y" +{ yyval.expr = exprNode_makeBlock (yyvsp[0].expr); ; + break;} +case 493: +#line 1282 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 494: +#line 1284 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 495: +#line 1286 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 496: +#line 1288 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (exprNode_concat (yyvsp[-2].expr, yyvsp[-1].expr), lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 498: +#line 1292 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 499: +#line 1295 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 500: +#line 1296 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 501: +#line 1299 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 502: +#line 1300 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 503: +#line 1303 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 504: +#line 1304 "cgrammar.y" +{ yyval.expr = exprNode_statement (yyvsp[-1].expr); ; + break;} +case 505: +#line 1307 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 506: +#line 1308 "cgrammar.y" +{ yyval.expr = exprNode_statement (yyvsp[-1].expr); ; + break;} +case 507: +#line 1309 "cgrammar.y" +{ yyval.expr = exprNode_checkExpr (yyvsp[0].expr); ; + break;} +case 508: +#line 1313 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; exprNode_produceGuards (yyvsp[-1].expr); context_enterTrueClause (yyvsp[-1].expr); ; + break;} +case 509: +#line 1321 "cgrammar.y" +{ + context_exitTrueClause (yyvsp[-1].expr, yyvsp[0].expr); + yyval.expr = exprNode_if (yyvsp[-1].expr, yyvsp[0].expr); + ; + break;} +case 510: +#line 1325 "cgrammar.y" +{ context_enterFalseClause (yyvsp[-2].expr); ; + break;} +case 511: +#line 1326 "cgrammar.y" +{ + context_exitClause (yyvsp[-4].expr, yyvsp[-3].expr, yyvsp[0].expr); + yyval.expr = exprNode_ifelse (yyvsp[-4].expr, yyvsp[-3].expr, yyvsp[0].expr); + ; + break;} +case 512: +#line 1330 "cgrammar.y" +{ context_enterSwitch (yyvsp[0].expr); ; + break;} +case 513: +#line 1331 "cgrammar.y" +{ yyval.expr = exprNode_switch (yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 514: +#line 1335 "cgrammar.y" +{ yyval.expr = exprNode_whilePred (yyvsp[-1].expr); context_enterWhileClause (yyvsp[-1].expr); ; + break;} +case 515: +#line 1339 "cgrammar.y" +{ yyval.expr = exprNode_whilePred(yyvsp[-1].expr); ; + break;} +case 516: +#line 1342 "cgrammar.y" +{ context_enterIterClause (); ; + break;} +case 517: +#line 1343 "cgrammar.y" +{ setProcessingIterVars (yyvsp[-3].entry); ; + break;} +case 518: +#line 1346 "cgrammar.y" +{ + yyval.expr = exprNode_iter (yyvsp[-9].entry, yyvsp[-4].alist, yyvsp[-2].expr, yyvsp[-1].entry); + + ; + break;} +case 519: +#line 1352 "cgrammar.y" +{ yyval.alist = exprNodeList_singleton (yyvsp[0].expr); ; + break;} +case 520: +#line 1353 "cgrammar.y" +{ nextIterParam (); ; + break;} +case 521: +#line 1354 "cgrammar.y" +{ yyval.alist = exprNodeList_push (yyvsp[-3].alist, yyvsp[0].expr); ; + break;} +case 522: +#line 1357 "cgrammar.y" +{ yyval.expr = exprNode_iterExpr (yyvsp[0].expr); ; + break;} +case 523: +#line 1358 "cgrammar.y" +{ yyval.expr = exprNode_iterId (yyvsp[0].entry); ; + break;} +case 524: +#line 1359 "cgrammar.y" +{ uentry ue = coerceIterId (yyvsp[0].ctyp); + + if (uentry_isValid (ue)) + { + yyval.expr = exprNode_iterId (ue); + } + else + { + yyval.expr = exprNode_iterNewId (cstring_copy (LastIdentifier ())); + } + ; + break;} +case 525: +#line 1370 "cgrammar.y" +{ yyval.expr = exprNode_iterNewId (yyvsp[0].cname); ; + break;} +case 527: +#line 1378 "cgrammar.y" +{ yyval.expr = exprNode_addParens (yyvsp[-2].tok, yyvsp[-1].expr); ; + break;} +case 529: +#line 1382 "cgrammar.y" +{ yyval.expr = exprNode_arrayFetch (yyvsp[-3].expr, yyvsp[-1].expr); ; + break;} +case 530: +#line 1383 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-2].expr, exprNodeList_new ()); ; + break;} +case 531: +#line 1384 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-3].expr, yyvsp[-1].alist); ; + break;} +case 532: +#line 1386 "cgrammar.y" +{ yyval.expr = exprNode_vaArg (yyvsp[-5].tok, yyvsp[-3].expr, yyvsp[-1].qtyp); ; + break;} +case 533: +#line 1387 "cgrammar.y" +{ yyval.expr = exprNode_fieldAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 534: +#line 1388 "cgrammar.y" +{ yyval.expr = exprNode_arrowAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 535: +#line 1389 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 536: +#line 1390 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 538: +#line 1394 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 539: +#line 1395 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 540: +#line 1396 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 541: +#line 1397 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 542: +#line 1398 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 543: +#line 1399 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 544: +#line 1400 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 545: +#line 1401 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 546: +#line 1402 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 548: +#line 1406 "cgrammar.y" +{ yyval.expr = exprNode_cast (yyvsp[-3].tok, yyvsp[0].expr, yyvsp[-2].qtyp); ; + break;} +case 550: +#line 1410 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 551: +#line 1411 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 552: +#line 1412 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 554: +#line 1416 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 555: +#line 1417 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 557: +#line 1421 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 558: +#line 1422 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 560: +#line 1426 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 561: +#line 1427 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 562: +#line 1428 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 563: +#line 1429 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 565: +#line 1433 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 566: +#line 1434 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 568: +#line 1438 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 570: +#line 1442 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 572: +#line 1447 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 574: +#line 1451 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 576: +#line 1455 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 578: +#line 1459 "cgrammar.y" +{ context_enterTrueClause (yyvsp[-1].expr); ; + break;} +case 579: +#line 1460 "cgrammar.y" +{ context_enterFalseClause (yyvsp[-4].expr); ; + break;} +case 580: +#line 1461 "cgrammar.y" +{ yyval.expr = exprNode_cond (yyvsp[-6].expr, yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 582: +#line 1465 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 583: +#line 1466 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 584: +#line 1467 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 585: +#line 1468 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 586: +#line 1469 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 587: +#line 1470 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 588: +#line 1471 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 589: +#line 1472 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 590: +#line 1473 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 591: +#line 1474 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 592: +#line 1475 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 593: +#line 1478 "cgrammar.y" +{ yyval.entry = yyvsp[0].entry; ; + break;} +case 594: +#line 1479 "cgrammar.y" +{ yyval.entry = uentry_undefined; ; + break;} +case 595: +#line 1482 "cgrammar.y" +{ context_enterDoWhileClause (); yyval.tok = yyvsp[0].tok; ; + break;} +case 596: +#line 1486 "cgrammar.y" +{ yyval.expr = exprNode_while (yyvsp[-1].expr, yyvsp[0].expr); context_exitWhileClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 597: +#line 1488 "cgrammar.y" +{ yyval.expr = exprNode_statement (exprNode_doWhile (yyvsp[-5].expr, yyvsp[-2].expr)); ; + break;} +case 598: +#line 1490 "cgrammar.y" +{ yyval.expr = exprNode_for (yyvsp[-1].expr, yyvsp[0].expr); context_exitForClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 599: +#line 1493 "cgrammar.y" +{ yyval.expr = exprNode_while (yyvsp[-1].expr, yyvsp[0].expr); context_exitWhileClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 600: +#line 1495 "cgrammar.y" +{ yyval.expr = exprNode_statement (exprNode_doWhile (yyvsp[-5].expr, yyvsp[-2].expr)); ; + break;} +case 601: +#line 1497 "cgrammar.y" +{ yyval.expr = exprNode_doWhile (yyvsp[-4].expr, yyvsp[-1].expr); ; + break;} +case 602: +#line 1498 "cgrammar.y" +{ yyval.expr = exprNode_for (yyvsp[-1].expr, yyvsp[0].expr); context_exitForClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 603: +#line 1501 "cgrammar.y" +{ yyval.expr = exprNode_goto (yyvsp[-1].cname); ; + break;} +case 604: +#line 1502 "cgrammar.y" +{ yyval.expr = exprNode_continue (yyvsp[-1].tok, BADTOK); ; + break;} +case 605: +#line 1504 "cgrammar.y" +{ yyval.expr = exprNode_continue (yyvsp[-2].tok, QINNERCONTINUE); ; + break;} +case 606: +#line 1505 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, BADTOK); ; + break;} +case 607: +#line 1506 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QSWITCHBREAK); ; + break;} +case 608: +#line 1507 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QLOOPBREAK); ; + break;} +case 609: +#line 1508 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QINNERBREAK); ; + break;} +case 610: +#line 1509 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QSAFEBREAK); ; + break;} +case 611: +#line 1510 "cgrammar.y" +{ yyval.expr = exprNode_nullReturn (yyvsp[-1].tok); ; + break;} +case 612: +#line 1511 "cgrammar.y" +{ yyval.expr = exprNode_return (yyvsp[-1].expr); ; + break;} +case 614: +#line 1515 "cgrammar.y" +{ ; ; + break;} +case 617: +#line 1522 "cgrammar.y" +{ yyval.cname = uentry_getName (yyvsp[0].entry); ; + break;} +case 618: +#line 1523 "cgrammar.y" +{ yyval.cname = uentry_getName (yyvsp[0].entry); ; + break;} +case 619: +#line 1524 "cgrammar.y" +{ yyval.cname = uentry_getName (yyvsp[0].entry); ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 543 "/af9/evans/bison-1.28/share/bison.simple" + + yyvsp -= yylen; + yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; + +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTBASE]; + + goto yynewstate; + +yyerrlab: /* here on detecting error */ + + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++yynerrs; + +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + sfree(msg); + } + else + yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("parse error"); + } + + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ + + if (yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif + + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token + after shifting the error token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto yyerrhandle; + +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif + +yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; + + if (yyn == YYFINAL) + YYACCEPT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + yystate = yyn; + goto yynewstate; + + yyacceptlab: + /* YYACCEPT comes here. */ + if (yyfree_stacks) + { + sfree (yyss); + sfree (yyvs); +#ifdef YYLSP_NEEDED + sfree (yyls); +#endif + } + return 0; + + yyabortlab: + /* YYABORT comes here. */ + if (yyfree_stacks) + { + sfree (yyss); + sfree (yyvs); +#ifdef YYLSP_NEEDED + sfree (yyls); +#endif + } + return 1; +} +#line 1530 "cgrammar.y" + + +/*@-redecl@*/ +extern char *yytext; +/*@=redecl@*/ + +# include "bison.reset" + +void yyerror (/*@unused@*/ char *s) +{ + static bool givehint = FALSE; + + if (context_inIterDef ()) + { + llerror (FLG_SYNTAX, message ("Iter syntax not parseable: %s", + context_inFunctionName ())); + } + else if (context_inIterEnd ()) + { + llerror (FLG_SYNTAX, message ("Iter finalizer syntax not parseable: %s", + context_inFunctionName ())); + } + else if (context_inMacro ()) + { + llerror (FLG_SYNTAX, message ("Macro syntax not parseable: %s", + context_inFunctionName ())); + + if (context_inMacroUnknown ()) + { + if (!givehint) + { + llhint (cstring_makeLiteral + ("Precede macro definition with /*@notfunction@*/ " + "to suppress checking and force expansion")); + givehint = TRUE; + } + } + + swallowMacro (); + } + else + { + llparseerror (cstring_undefined); + } +} + + + + + + + + + + + + + diff --git a/src/cgrammar.tab.c b/src/cgrammar.tab.c new file mode 100644 index 0000000..647957a --- /dev/null +++ b/src/cgrammar.tab.c @@ -0,0 +1,5436 @@ + +/* A Bison parser, made from cgrammar.y + by GNU Bison version 1.25 + */ + +#define YYBISON 1 /* Identify Bison output. */ + +#define BADTOK 258 +#define SKIPTOK 259 +#define CTOK_ELIPSIS 260 +#define CASE 261 +#define DEFAULT 262 +#define CIF 263 +#define CELSE 264 +#define SWITCH 265 +#define WHILE 266 +#define DO 267 +#define CFOR 268 +#define GOTO 269 +#define CONTINUE 270 +#define BREAK 271 +#define RETURN 272 +#define TSEMI 273 +#define TLBRACE 274 +#define TRBRACE 275 +#define TCOMMA 276 +#define TCOLON 277 +#define TASSIGN 278 +#define TLPAREN 279 +#define TRPAREN 280 +#define TLSQBR 281 +#define TRSQBR 282 +#define TDOT 283 +#define TAMPERSAND 284 +#define TEXCL 285 +#define TTILDE 286 +#define TMINUS 287 +#define TPLUS 288 +#define TMULT 289 +#define TDIV 290 +#define TPERCENT 291 +#define TLT 292 +#define TGT 293 +#define TCIRC 294 +#define TBAR 295 +#define TQUEST 296 +#define CSIZEOF 297 +#define CALIGNOF 298 +#define ARROW_OP 299 +#define CTYPEDEF 300 +#define COFFSETOF 301 +#define INC_OP 302 +#define DEC_OP 303 +#define LEFT_OP 304 +#define RIGHT_OP 305 +#define LE_OP 306 +#define GE_OP 307 +#define EQ_OP 308 +#define NE_OP 309 +#define AND_OP 310 +#define OR_OP 311 +#define MUL_ASSIGN 312 +#define DIV_ASSIGN 313 +#define MOD_ASSIGN 314 +#define ADD_ASSIGN 315 +#define SUB_ASSIGN 316 +#define LEFT_ASSIGN 317 +#define RIGHT_ASSIGN 318 +#define AND_ASSIGN 319 +#define XOR_ASSIGN 320 +#define OR_ASSIGN 321 +#define CSTRUCT 322 +#define CUNION 323 +#define CENUM 324 +#define VA_ARG 325 +#define VA_DCL 326 +#define QGLOBALS 327 +#define QMODIFIES 328 +#define QNOMODS 329 +#define QCONSTANT 330 +#define QFUNCTION 331 +#define QITER 332 +#define QDEFINES 333 +#define QUSES 334 +#define QALLOCATES 335 +#define QSETS 336 +#define QRELEASES 337 +#define QPRECLAUSE 338 +#define QPOSTCLAUSE 339 +#define QALT 340 +#define QUNDEF 341 +#define QKILLED 342 +#define QENDMACRO 343 +#define LLMACRO 344 +#define LLMACROITER 345 +#define LLMACROEND 346 +#define TENDMACRO 347 +#define QSWITCHBREAK 348 +#define QLOOPBREAK 349 +#define QINNERBREAK 350 +#define QSAFEBREAK 351 +#define QINNERCONTINUE 352 +#define QFALLTHROUGH 353 +#define QLINTNOTREACHED 354 +#define QLINTFALLTHROUGH 355 +#define QLINTFALLTHRU 356 +#define QARGSUSED 357 +#define QPRINTFLIKE 358 +#define QLINTPRINTFLIKE 359 +#define QSCANFLIKE 360 +#define QMESSAGELIKE 361 +#define QNOTREACHED 362 +#define QCONST 363 +#define QVOLATILE 364 +#define QINLINE 365 +#define QEXTENSION 366 +#define QEXTERN 367 +#define QSTATIC 368 +#define QAUTO 369 +#define QREGISTER 370 +#define QOUT 371 +#define QIN 372 +#define QYIELD 373 +#define QONLY 374 +#define QTEMP 375 +#define QSHARED 376 +#define QREF 377 +#define QUNIQUE 378 +#define QCHECKED 379 +#define QUNCHECKED 380 +#define QCHECKEDSTRICT 381 +#define QCHECKMOD 382 +#define QKEEP 383 +#define QKEPT 384 +#define QPARTIAL 385 +#define QSPECIAL 386 +#define QOWNED 387 +#define QDEPENDENT 388 +#define QRETURNED 389 +#define QEXPOSED 390 +#define QNULL 391 +#define QOBSERVER 392 +#define QISNULL 393 +#define QEXITS 394 +#define QMAYEXIT 395 +#define QNEVEREXIT 396 +#define QTRUEEXIT 397 +#define QFALSEEXIT 398 +#define QLONG 399 +#define QSIGNED 400 +#define QUNSIGNED 401 +#define QSHORT 402 +#define QUNUSED 403 +#define QSEF 404 +#define QNOTNULL 405 +#define QRELNULL 406 +#define QABSTRACT 407 +#define QCONCRETE 408 +#define QMUTABLE 409 +#define QIMMUTABLE 410 +#define QTRUENULL 411 +#define QFALSENULL 412 +#define QEXTERNAL 413 +#define QREFCOUNTED 414 +#define QREFS 415 +#define QNEWREF 416 +#define QTEMPREF 417 +#define QKILLREF 418 +#define QRELDEF 419 +#define CGCHAR 420 +#define CBOOL 421 +#define CINT 422 +#define CGFLOAT 423 +#define CDOUBLE 424 +#define CVOID 425 +#define QANYTYPE 426 +#define QINTEGRALTYPE 427 +#define QUNSIGNEDINTEGRALTYPE 428 +#define QSIGNEDINTEGRALTYPE 429 +#define IDENTIFIER 430 +#define NEW_IDENTIFIER 431 +#define TYPE_NAME_OR_ID 432 +#define CCONSTANT 433 +#define ITER_NAME 434 +#define ITER_ENDNAME 435 +#define TYPE_NAME 436 + +#line 19 "cgrammar.y" + +/* +** +** cgrammar.y +** +** Yacc/Bison grammar for extended ANSI C used by LCLint. +** +** original grammar by Nate Osgood --- +** hacrat@catfish.lcs.mit.edu Mon Jun 14 13:06:32 1993 +** +** changes for LCLint --- handle typedef names correctly +** fix struct/union parsing bug (empty struct is accepted) +** add productions to handle macros --- require +** error correction --- main source of conflicts in grammar. +** need to process initializations sequentially, L->R +** +** production names are cryptic, so more productions fit on one line +** +** conflicts: 87 shift/reduce, 18 reduce/reduce +** most of these are due to handling macros +** a few are due to handling type expressions +*/ + +/*@=allmacros@*/ + +extern int yylex (); +extern void swallowMacro (void); + +# include "lclintMacros.nf" +# include "basic.h" +# include "cgrammar.h" +# include "exprChecks.h" + +/*@-allmacros@*/ +/*@-matchfields@*/ + +# define SHOWCSYM FALSE +void yyerror (char *s); + +/* +** This is necessary, or else when the bison-generated code #include's malloc.h, +** there will be a parse error. +** +** Unfortunately, it means the error checking on malloc, etc. is lost for allocations +** in bison-generated files under Win32. +*/ + +# ifdef WIN32 +# undef malloc +# undef calloc +# undef realloc +# endif + + +#line 74 "cgrammar.y" +typedef union +{ + lltok tok; + int count; + specialClauseKind sck; + qual typequal; + qualList tquallist; + ctype ctyp; + sRef sr; + /*@only@*/ qtype qtyp; + /*@only@*/ cstring cname; + /*@only@*/ idDecl ntyp; + /*@only@*/ idDeclList ntyplist; + /*@only@*/ uentryList flist; + /*@owned@*/ uentryList entrylist; + /*@observer@*/ /*@dependent@*/ uentry entry; + /*@only@*/ uentry oentry; + /*@only@*/ exprNode expr; + /*@only@*/ enumNameList enumnamelist; + /*@only@*/ exprNodeList alist; + /*@only@*/ sRefSet srset; + /*@only@*/ cstringList cstringlist; +} YYSTYPE; +#ifndef YYDEBUG +#define YYDEBUG 1 +#endif + +#include + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif + + + +#define YYFINAL 1158 +#define YYFLAG -32768 +#define YYNTBASE 182 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 436 ? yytranslate[x] : 409) + +static const short yytranslate[] = { 0, + 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, 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, 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, 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, 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, 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, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181 +}; + +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 1, 3, 5, 8, 11, 13, 15, 17, 19, + 21, 23, 32, 44, 45, 51, 53, 57, 59, 62, + 64, 71, 75, 82, 83, 90, 91, 99, 101, 108, + 112, 119, 120, 127, 128, 136, 137, 138, 149, 153, + 157, 161, 164, 166, 167, 170, 171, 174, 176, 179, + 181, 184, 186, 189, 191, 195, 198, 200, 202, 204, + 206, 208, 210, 212, 213, 216, 217, 224, 225, 232, + 234, 236, 237, 238, 244, 245, 251, 253, 255, 256, + 258, 259, 260, 264, 265, 269, 271, 273, 275, 277, + 279, 281, 283, 285, 287, 289, 291, 293, 295, 297, + 299, 301, 303, 304, 312, 313, 322, 324, 328, 329, + 333, 334, 338, 341, 345, 348, 351, 353, 355, 357, + 361, 366, 369, 373, 377, 381, 383, 385, 387, 391, + 393, 395, 399, 404, 407, 411, 415, 419, 421, 425, + 427, 429, 431, 435, 437, 439, 441, 446, 450, 455, + 462, 468, 474, 477, 480, 482, 486, 488, 491, 494, + 497, 500, 503, 506, 509, 512, 514, 516, 520, 522, + 532, 533, 537, 542, 545, 550, 553, 555, 560, 562, + 566, 570, 574, 576, 580, 584, 586, 590, 594, 596, + 600, 604, 608, 612, 614, 618, 622, 624, 628, 630, + 634, 636, 640, 642, 643, 648, 650, 651, 656, 658, + 659, 660, 668, 670, 674, 678, 682, 686, 690, 694, + 698, 702, 706, 710, 714, 716, 720, 721, 723, 725, + 727, 729, 731, 735, 736, 746, 747, 759, 762, 763, + 770, 771, 779, 784, 789, 790, 791, 794, 796, 801, + 802, 807, 809, 813, 818, 820, 824, 826, 828, 830, + 832, 834, 837, 840, 843, 846, 849, 852, 855, 858, + 861, 864, 867, 870, 873, 876, 879, 882, 885, 888, + 891, 894, 897, 900, 903, 906, 909, 912, 915, 918, + 921, 924, 927, 930, 933, 936, 939, 942, 945, 948, + 951, 954, 957, 960, 963, 966, 969, 971, 973, 975, + 977, 980, 983, 986, 989, 992, 995, 998, 1001, 1004, + 1007, 1010, 1013, 1016, 1019, 1023, 1025, 1030, 1032, 1036, + 1039, 1042, 1045, 1046, 1048, 1049, 1050, 1062, 1063, 1064, + 1076, 1083, 1090, 1091, 1092, 1103, 1104, 1105, 1116, 1122, + 1128, 1133, 1138, 1139, 1141, 1143, 1146, 1152, 1156, 1159, + 1164, 1166, 1170, 1175, 1182, 1183, 1192, 1197, 1199, 1203, + 1206, 1208, 1213, 1215, 1217, 1220, 1223, 1225, 1228, 1230, + 1233, 1235, 1237, 1239, 1242, 1244, 1247, 1250, 1254, 1256, + 1260, 1262, 1266, 1268, 1270, 1274, 1275, 1278, 1279, 1284, + 1289, 1291, 1293, 1296, 1298, 1300, 1303, 1304, 1306, 1312, + 1315, 1319, 1323, 1328, 1332, 1337, 1342, 1348, 1350, 1352, + 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368, 1370, 1372, + 1375, 1378, 1386, 1393, 1396, 1397, 1398, 1409, 1410, 1417, + 1419, 1421, 1423, 1425, 1428, 1430, 1432, 1434, 1436, 1438, + 1440, 1442, 1446, 1448, 1451, 1454, 1457, 1459, 1461, 1463, + 1465, 1467, 1469, 1471, 1473, 1475, 1477, 1481, 1483, 1485, + 1488, 1491, 1492, 1497, 1498, 1504, 1505, 1509, 1510, 1515, + 1519, 1522, 1526, 1527, 1528, 1529, 1530, 1531, 1533, 1536, + 1539, 1543, 1546, 1550, 1554, 1559, 1562, 1565, 1569, 1573, + 1578, 1580, 1583, 1585, 1588, 1590, 1593, 1595, 1598, 1600, + 1603, 1605, 1610, 1613, 1614, 1620, 1621, 1628, 1633, 1638, + 1639, 1640, 1651, 1653, 1654, 1659, 1661, 1663, 1665, 1667, + 1669, 1673, 1675, 1680, 1684, 1689, 1696, 1702, 1708, 1711, + 1714, 1716, 1719, 1722, 1725, 1728, 1731, 1734, 1737, 1740, + 1742, 1744, 1749, 1751, 1755, 1759, 1763, 1765, 1769, 1773, + 1775, 1779, 1783, 1785, 1789, 1793, 1797, 1801, 1803, 1807, + 1811, 1813, 1817, 1819, 1823, 1825, 1829, 1831, 1835, 1837, + 1841, 1843, 1844, 1845, 1853, 1855, 1859, 1863, 1867, 1871, + 1875, 1879, 1883, 1887, 1891, 1895, 1899, 1901, 1902, 1904, + 1907, 1915, 1918, 1921, 1929, 1936, 1939, 1943, 1946, 1950, + 1953, 1957, 1961, 1965, 1969, 1972, 1976, 1977, 1979, 1981, + 1983, 1985, 1987, 1989, 1991, 1993 +}; + +static const short yyrhs[] = { -1, + 183, 0, 184, 0, 183, 184, 0, 236, 405, 0, + 185, 0, 186, 0, 196, 0, 199, 0, 273, 0, + 1, 0, 75, 293, 306, 316, 306, 405, 281, 88, + 0, 75, 293, 306, 316, 306, 23, 281, 286, 285, + 405, 88, 0, 0, 76, 187, 188, 405, 88, 0, + 189, 0, 293, 306, 189, 0, 193, 0, 320, 193, + 0, 407, 0, 281, 24, 306, 316, 281, 25, 0, + 190, 26, 27, 0, 190, 26, 281, 272, 27, 306, + 0, 0, 190, 282, 24, 25, 191, 201, 0, 0, + 190, 282, 24, 317, 25, 192, 201, 0, 407, 0, + 281, 24, 306, 189, 281, 25, 0, 193, 26, 27, + 0, 193, 26, 281, 272, 27, 306, 0, 0, 193, + 282, 24, 25, 194, 203, 0, 0, 193, 282, 24, + 317, 25, 195, 203, 0, 0, 0, 77, 407, 24, + 317, 25, 197, 203, 198, 405, 88, 0, 89, 346, + 92, 0, 90, 333, 92, 0, 91, 334, 92, 0, + 89, 92, 0, 232, 0, 0, 202, 205, 0, 0, + 204, 206, 0, 213, 0, 207, 213, 0, 216, 0, + 207, 216, 0, 229, 0, 229, 207, 0, 209, 0, + 208, 21, 209, 0, 212, 210, 0, 406, 0, 176, + 0, 86, 0, 87, 0, 116, 0, 117, 0, 130, + 0, 0, 211, 212, 0, 0, 72, 214, 366, 405, + 88, 219, 0, 0, 72, 215, 208, 405, 88, 219, + 0, 74, 0, 220, 0, 0, 0, 72, 217, 366, + 405, 219, 0, 0, 72, 218, 208, 405, 219, 0, + 74, 0, 222, 0, 0, 220, 0, 0, 0, 73, + 221, 237, 0, 0, 73, 223, 238, 0, 78, 0, + 79, 0, 80, 0, 81, 0, 82, 0, 88, 0, + 88, 0, 83, 0, 84, 0, 119, 0, 137, 0, + 135, 0, 133, 0, 132, 0, 121, 0, 138, 0, + 150, 0, 0, 224, 306, 230, 243, 405, 226, 281, + 0, 0, 227, 306, 228, 231, 243, 405, 225, 281, + 0, 316, 0, 293, 306, 316, 0, 0, 19, 234, + 362, 0, 0, 366, 235, 355, 0, 200, 233, 0, + 241, 405, 88, 0, 405, 88, 0, 241, 405, 0, + 405, 0, 406, 0, 176, 0, 239, 26, 27, 0, + 239, 26, 240, 27, 0, 34, 239, 0, 24, 239, + 25, 0, 239, 28, 407, 0, 239, 44, 407, 0, + 239, 0, 178, 0, 239, 0, 241, 21, 239, 0, + 406, 0, 176, 0, 242, 26, 27, 0, 242, 26, + 240, 27, 0, 34, 242, 0, 24, 242, 25, 0, + 242, 28, 407, 0, 242, 44, 407, 0, 242, 0, + 243, 21, 242, 0, 406, 0, 176, 0, 178, 0, + 24, 270, 25, 0, 177, 0, 111, 0, 244, 0, + 245, 26, 270, 27, 0, 245, 24, 25, 0, 245, + 24, 246, 25, 0, 70, 24, 269, 21, 328, 25, + 0, 245, 306, 28, 407, 281, 0, 245, 306, 44, + 407, 281, 0, 245, 47, 0, 245, 48, 0, 269, + 0, 246, 21, 269, 0, 245, 0, 47, 247, 0, + 48, 247, 0, 29, 253, 0, 34, 253, 0, 33, + 253, 0, 32, 253, 0, 31, 253, 0, 30, 253, + 0, 250, 0, 249, 0, 248, 28, 407, 0, 407, + 0, 46, 281, 24, 328, 306, 21, 248, 25, 281, + 0, 0, 281, 251, 252, 0, 42, 24, 328, 25, + 0, 42, 247, 0, 43, 24, 328, 25, 0, 43, + 247, 0, 247, 0, 24, 328, 25, 253, 0, 253, + 0, 254, 34, 253, 0, 254, 35, 253, 0, 254, + 36, 253, 0, 254, 0, 255, 33, 254, 0, 255, + 32, 254, 0, 255, 0, 256, 49, 255, 0, 256, + 50, 255, 0, 256, 0, 257, 37, 256, 0, 257, + 38, 256, 0, 257, 51, 256, 0, 257, 52, 256, + 0, 257, 0, 258, 53, 257, 0, 258, 54, 257, + 0, 258, 0, 259, 29, 258, 0, 259, 0, 260, + 39, 259, 0, 260, 0, 261, 40, 260, 0, 261, + 0, 0, 262, 55, 263, 261, 0, 262, 0, 0, + 264, 56, 265, 262, 0, 264, 0, 0, 0, 264, + 41, 267, 270, 22, 268, 266, 0, 266, 0, 247, + 23, 269, 0, 247, 57, 269, 0, 247, 58, 269, + 0, 247, 59, 269, 0, 247, 60, 269, 0, 247, + 61, 269, 0, 247, 62, 269, 0, 247, 63, 269, + 0, 247, 64, 269, 0, 247, 65, 269, 0, 247, + 66, 269, 0, 269, 0, 270, 21, 269, 0, 0, + 270, 0, 266, 0, 274, 0, 71, 0, 279, 0, + 293, 281, 18, 0, 0, 293, 306, 316, 306, 275, + 281, 285, 18, 281, 0, 0, 293, 306, 316, 306, + 23, 276, 281, 286, 285, 18, 281, 0, 316, 306, + 0, 0, 316, 306, 23, 278, 281, 286, 0, 0, + 45, 293, 280, 306, 283, 281, 18, 0, 45, 293, + 281, 18, 0, 45, 283, 281, 18, 0, 0, 0, + 284, 281, 0, 277, 0, 283, 21, 306, 277, 0, + 0, 285, 21, 306, 277, 0, 269, 0, 19, 287, + 20, 0, 19, 287, 21, 20, 0, 286, 0, 287, + 21, 286, 0, 112, 0, 110, 0, 113, 0, 114, + 0, 115, 0, 108, 281, 0, 109, 281, 0, 116, + 281, 0, 117, 281, 0, 130, 281, 0, 131, 281, + 0, 132, 281, 0, 133, 281, 0, 118, 281, 0, + 120, 281, 0, 119, 281, 0, 128, 281, 0, 129, + 281, 0, 121, 281, 0, 123, 281, 0, 139, 281, + 0, 140, 281, 0, 142, 281, 0, 143, 281, 0, + 141, 281, 0, 136, 281, 0, 151, 281, 0, 134, + 281, 0, 135, 281, 0, 137, 281, 0, 124, 281, + 0, 127, 281, 0, 125, 281, 0, 126, 281, 0, + 156, 281, 0, 157, 281, 0, 148, 281, 0, 158, + 281, 0, 149, 281, 0, 152, 281, 0, 153, 281, + 0, 154, 281, 0, 155, 281, 0, 150, 281, 0, + 159, 281, 0, 160, 281, 0, 163, 281, 0, 164, + 281, 0, 161, 281, 0, 162, 281, 0, 147, 0, + 144, 0, 145, 0, 146, 0, 165, 306, 0, 167, + 306, 0, 166, 306, 0, 168, 306, 0, 169, 306, + 0, 170, 306, 0, 171, 306, 0, 172, 306, 0, + 173, 306, 0, 174, 306, 0, 408, 306, 0, 297, + 306, 0, 311, 306, 0, 290, 306, 0, 281, 293, + 281, 0, 295, 0, 295, 85, 294, 88, 0, 328, + 0, 328, 21, 294, 0, 288, 296, 0, 289, 296, + 0, 291, 296, 0, 0, 293, 0, 0, 0, 306, + 67, 407, 281, 19, 298, 359, 307, 360, 299, 20, + 0, 0, 0, 306, 68, 407, 281, 19, 300, 359, + 307, 360, 301, 20, 0, 306, 67, 407, 281, 19, + 20, 0, 306, 68, 407, 281, 19, 20, 0, 0, + 0, 306, 67, 281, 19, 302, 359, 307, 360, 303, + 20, 0, 0, 0, 306, 68, 281, 19, 304, 359, + 307, 360, 305, 20, 0, 306, 67, 281, 19, 20, + 0, 306, 68, 281, 19, 20, 0, 306, 67, 407, + 306, 0, 306, 68, 407, 306, 0, 0, 308, 0, + 199, 0, 307, 308, 0, 293, 306, 309, 281, 18, + 0, 293, 281, 18, 0, 310, 306, 0, 309, 21, + 310, 306, 0, 316, 0, 22, 281, 272, 0, 316, + 22, 281, 272, 0, 306, 69, 19, 313, 20, 281, + 0, 0, 306, 69, 407, 19, 312, 313, 20, 281, + 0, 306, 69, 407, 281, 0, 314, 0, 313, 21, + 314, 0, 313, 21, 0, 407, 0, 407, 23, 281, + 272, 0, 190, 0, 330, 0, 320, 181, 0, 320, + 315, 0, 190, 0, 320, 190, 0, 323, 0, 306, + 321, 0, 108, 0, 109, 0, 318, 0, 319, 318, + 0, 34, 0, 34, 319, 0, 34, 320, 0, 34, + 319, 320, 0, 322, 0, 322, 21, 5, 0, 407, + 0, 322, 21, 407, 0, 5, 0, 324, 0, 324, + 21, 5, 0, 0, 325, 327, 0, 0, 324, 21, + 326, 327, 0, 281, 293, 315, 281, 0, 407, 0, + 292, 0, 292, 329, 0, 320, 0, 331, 0, 320, + 331, 0, 0, 331, 0, 281, 24, 306, 329, 25, + 0, 26, 27, 0, 26, 272, 27, 0, 331, 26, + 27, 0, 331, 26, 272, 27, 0, 281, 24, 25, + 0, 281, 24, 323, 25, 0, 331, 281, 24, 25, + 0, 331, 281, 24, 323, 25, 0, 348, 0, 349, + 0, 352, 0, 355, 0, 368, 0, 371, 0, 402, + 0, 376, 0, 404, 0, 335, 0, 333, 0, 342, + 0, 335, 342, 0, 375, 335, 0, 401, 347, 11, + 24, 270, 25, 18, 0, 401, 347, 11, 24, 270, + 25, 0, 337, 342, 0, 0, 0, 13, 24, 271, + 18, 271, 18, 338, 271, 339, 25, 0, 0, 179, + 357, 24, 341, 379, 25, 0, 180, 0, 348, 0, + 349, 0, 352, 0, 344, 366, 0, 344, 0, 345, + 0, 368, 0, 343, 0, 336, 0, 340, 0, 404, + 0, 24, 342, 25, 0, 1, 0, 370, 342, 0, + 357, 19, 0, 361, 20, 0, 347, 0, 365, 0, + 348, 0, 349, 0, 352, 0, 356, 0, 369, 0, + 371, 0, 376, 0, 403, 0, 24, 347, 25, 0, + 404, 0, 1, 0, 407, 22, 0, 107, 332, 0, + 0, 6, 272, 350, 22, 0, 0, 98, 6, 272, + 351, 22, 0, 0, 7, 353, 22, 0, 0, 98, + 7, 354, 22, 0, 24, 355, 25, 0, 357, 363, + 0, 357, 364, 358, 0, 0, 0, 0, 0, 0, + 20, 0, 107, 20, 0, 367, 20, 0, 367, 107, + 20, 0, 366, 20, 0, 366, 107, 20, 0, 366, + 367, 20, 0, 366, 367, 107, 20, 0, 19, 362, + 0, 19, 20, 0, 19, 365, 20, 0, 19, 366, + 20, 0, 19, 366, 367, 20, 0, 347, 0, 365, + 347, 0, 273, 0, 366, 273, 0, 332, 0, 367, + 332, 0, 18, 0, 270, 18, 0, 18, 0, 270, + 18, 0, 270, 0, 8, 24, 270, 25, 0, 370, + 332, 0, 0, 370, 332, 9, 372, 332, 0, 0, + 10, 24, 270, 373, 25, 332, 0, 11, 24, 270, + 25, 0, 11, 24, 270, 25, 0, 0, 0, 179, + 377, 357, 24, 378, 379, 25, 355, 400, 358, 0, + 381, 0, 0, 379, 380, 21, 381, 0, 399, 0, + 406, 0, 177, 0, 176, 0, 178, 0, 24, 270, + 25, 0, 382, 0, 245, 26, 270, 27, 0, 245, + 24, 25, 0, 245, 24, 246, 25, 0, 70, 24, + 269, 21, 328, 25, 0, 245, 306, 28, 407, 281, + 0, 245, 306, 44, 407, 281, 0, 245, 47, 0, + 245, 48, 0, 383, 0, 47, 247, 0, 48, 247, + 0, 29, 253, 0, 34, 253, 0, 33, 253, 0, + 32, 253, 0, 31, 253, 0, 30, 253, 0, 250, + 0, 384, 0, 24, 328, 25, 253, 0, 385, 0, + 254, 34, 253, 0, 254, 35, 253, 0, 254, 36, + 253, 0, 386, 0, 255, 33, 254, 0, 255, 32, + 254, 0, 387, 0, 256, 49, 255, 0, 256, 50, + 255, 0, 388, 0, 257, 37, 256, 0, 257, 38, + 256, 0, 257, 51, 256, 0, 257, 52, 256, 0, + 389, 0, 258, 53, 257, 0, 258, 54, 257, 0, + 390, 0, 259, 29, 258, 0, 391, 0, 260, 39, + 259, 0, 392, 0, 261, 40, 260, 0, 393, 0, + 262, 55, 261, 0, 394, 0, 264, 56, 262, 0, + 395, 0, 0, 0, 264, 41, 397, 270, 22, 398, + 266, 0, 396, 0, 247, 23, 269, 0, 247, 57, + 269, 0, 247, 58, 269, 0, 247, 59, 269, 0, + 247, 60, 269, 0, 247, 61, 269, 0, 247, 62, + 269, 0, 247, 63, 269, 0, 247, 64, 269, 0, + 247, 65, 269, 0, 247, 66, 269, 0, 180, 0, + 0, 12, 0, 374, 332, 0, 401, 332, 11, 24, + 270, 25, 18, 0, 337, 332, 0, 374, 347, 0, + 401, 347, 11, 24, 270, 25, 18, 0, 401, 347, + 11, 24, 270, 25, 0, 337, 347, 0, 14, 407, + 18, 0, 15, 18, 0, 97, 15, 18, 0, 16, + 18, 0, 93, 16, 18, 0, 94, 16, 18, 0, + 95, 16, 18, 0, 96, 16, 18, 0, 17, 18, + 0, 17, 270, 18, 0, 0, 18, 0, 175, 0, + 176, 0, 179, 0, 180, 0, 406, 0, 177, 0, + 181, 0, 177, 0 +}; + +#endif + +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 232, 233, 236, 237, 240, 241, 242, 243, 244, 245, + 246, 249, 251, 255, 255, 260, 266, 270, 271, 275, + 276, 278, 280, 296, 300, 307, 311, 317, 318, 320, + 322, 338, 342, 349, 353, 359, 361, 361, 365, 366, + 367, 368, 371, 374, 375, 378, 379, 382, 383, 386, + 387, 390, 391, 394, 395, 398, 401, 402, 405, 406, + 407, 408, 409, 412, 413, 416, 416, 419, 419, 422, + 426, 427, 430, 430, 433, 433, 436, 440, 441, 444, + 445, 448, 454, 461, 467, 474, 475, 476, 477, 478, + 481, 484, 487, 488, 491, 492, 493, 494, 495, 496, + 497, 498, 501, 507, 514, 520, 529, 535, 539, 541, + 545, 548, 555, 563, 564, 567, 568, 571, 572, 573, + 574, 575, 576, 577, 578, 582, 583, 587, 588, 591, + 593, 595, 596, 597, 598, 599, 601, 605, 609, 621, + 622, 623, 624, 625, 626, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 640, 641, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 657, 658, 661, + 665, 666, 669, 670, 671, 672, 675, 676, 680, 681, + 682, 683, 686, 687, 688, 691, 692, 693, 696, 697, + 698, 699, 700, 703, 704, 705, 708, 709, 712, 713, + 717, 718, 721, 722, 727, 733, 734, 740, 746, 747, + 747, 749, 752, 753, 754, 755, 756, 757, 758, 759, + 760, 761, 762, 763, 766, 767, 770, 771, 774, 779, + 780, 781, 784, 797, 801, 802, 805, 810, 811, 811, + 816, 817, 818, 819, 822, 825, 828, 831, 832, 835, + 836, 839, 840, 841, 845, 847, 856, 857, 858, 859, + 860, 863, 864, 865, 866, 867, 868, 869, 870, 871, + 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, + 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, + 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, + 902, 903, 904, 905, 906, 907, 910, 911, 912, 913, + 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, + 926, 927, 928, 929, 932, 936, 937, 941, 942, 946, + 947, 948, 951, 952, 955, 957, 959, 960, 962, 964, + 965, 967, 969, 971, 973, 974, 976, 978, 979, 981, + 983, 984, 987, 990, 991, 992, 995, 997, 1001, 1003, + 1007, 1008, 1009, 1013, 1015, 1015, 1017, 1020, 1022, 1024, + 1027, 1032, 1039, 1040, 1041, 1048, 1052, 1053, 1057, 1058, + 1061, 1062, 1065, 1066, 1069, 1070, 1071, 1072, 1075, 1076, + 1079, 1080, 1083, 1084, 1085, 1088, 1088, 1089, 1090, 1093, + 1105, 1121, 1122, 1125, 1126, 1127, 1130, 1131, 1134, 1136, + 1137, 1138, 1139, 1140, 1142, 1144, 1146, 1152, 1153, 1154, + 1155, 1156, 1157, 1158, 1159, 1160, 1163, 1166, 1169, 1170, + 1174, 1176, 1178, 1180, 1184, 1185, 1187, 1191, 1193, 1195, + 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, + 1208, 1209, 1210, 1213, 1219, 1222, 1225, 1226, 1229, 1230, + 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1242, + 1243, 1249, 1250, 1251, 1252, 1255, 1256, 1257, 1258, 1261, + 1262, 1266, 1269, 1272, 1275, 1278, 1281, 1284, 1285, 1286, + 1287, 1289, 1290, 1292, 1294, 1301, 1305, 1307, 1309, 1311, + 1315, 1316, 1319, 1320, 1323, 1324, 1327, 1328, 1331, 1332, + 1333, 1336, 1344, 1349, 1350, 1354, 1355, 1358, 1363, 1366, + 1367, 1368, 1376, 1377, 1377, 1381, 1382, 1383, 1394, 1401, + 1402, 1405, 1406, 1407, 1408, 1409, 1411, 1412, 1413, 1414, + 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, + 1429, 1430, 1433, 1434, 1435, 1436, 1439, 1440, 1441, 1444, + 1445, 1446, 1449, 1450, 1451, 1452, 1453, 1456, 1457, 1458, + 1461, 1462, 1465, 1466, 1470, 1471, 1474, 1475, 1478, 1479, + 1482, 1483, 1484, 1485, 1488, 1489, 1490, 1491, 1492, 1493, + 1494, 1495, 1496, 1497, 1498, 1499, 1502, 1503, 1506, 1509, + 1511, 1513, 1517, 1518, 1520, 1522, 1525, 1526, 1527, 1529, + 1530, 1531, 1532, 1533, 1534, 1535, 1538, 1539, 1542, 1545, + 1546, 1547, 1548, 1549, 1552, 1553 +}; +#endif + + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const yytname[] = { "$","error","$undefined.","BADTOK", +"SKIPTOK","CTOK_ELIPSIS","CASE","DEFAULT","CIF","CELSE","SWITCH","WHILE","DO", +"CFOR","GOTO","CONTINUE","BREAK","RETURN","TSEMI","TLBRACE","TRBRACE","TCOMMA", +"TCOLON","TASSIGN","TLPAREN","TRPAREN","TLSQBR","TRSQBR","TDOT","TAMPERSAND", +"TEXCL","TTILDE","TMINUS","TPLUS","TMULT","TDIV","TPERCENT","TLT","TGT","TCIRC", +"TBAR","TQUEST","CSIZEOF","CALIGNOF","ARROW_OP","CTYPEDEF","COFFSETOF","INC_OP", +"DEC_OP","LEFT_OP","RIGHT_OP","LE_OP","GE_OP","EQ_OP","NE_OP","AND_OP","OR_OP", +"MUL_ASSIGN","DIV_ASSIGN","MOD_ASSIGN","ADD_ASSIGN","SUB_ASSIGN","LEFT_ASSIGN", +"RIGHT_ASSIGN","AND_ASSIGN","XOR_ASSIGN","OR_ASSIGN","CSTRUCT","CUNION","CENUM", +"VA_ARG","VA_DCL","QGLOBALS","QMODIFIES","QNOMODS","QCONSTANT","QFUNCTION","QITER", +"QDEFINES","QUSES","QALLOCATES","QSETS","QRELEASES","QPRECLAUSE","QPOSTCLAUSE", +"QALT","QUNDEF","QKILLED","QENDMACRO","LLMACRO","LLMACROITER","LLMACROEND","TENDMACRO", +"QSWITCHBREAK","QLOOPBREAK","QINNERBREAK","QSAFEBREAK","QINNERCONTINUE","QFALLTHROUGH", +"QLINTNOTREACHED","QLINTFALLTHROUGH","QLINTFALLTHRU","QARGSUSED","QPRINTFLIKE", +"QLINTPRINTFLIKE","QSCANFLIKE","QMESSAGELIKE","QNOTREACHED","QCONST","QVOLATILE", +"QINLINE","QEXTENSION","QEXTERN","QSTATIC","QAUTO","QREGISTER","QOUT","QIN", +"QYIELD","QONLY","QTEMP","QSHARED","QREF","QUNIQUE","QCHECKED","QUNCHECKED", +"QCHECKEDSTRICT","QCHECKMOD","QKEEP","QKEPT","QPARTIAL","QSPECIAL","QOWNED", +"QDEPENDENT","QRETURNED","QEXPOSED","QNULL","QOBSERVER","QISNULL","QEXITS","QMAYEXIT", +"QNEVEREXIT","QTRUEEXIT","QFALSEEXIT","QLONG","QSIGNED","QUNSIGNED","QSHORT", +"QUNUSED","QSEF","QNOTNULL","QRELNULL","QABSTRACT","QCONCRETE","QMUTABLE","QIMMUTABLE", +"QTRUENULL","QFALSENULL","QEXTERNAL","QREFCOUNTED","QREFS","QNEWREF","QTEMPREF", +"QKILLREF","QRELDEF","CGCHAR","CBOOL","CINT","CGFLOAT","CDOUBLE","CVOID","QANYTYPE", +"QINTEGRALTYPE","QUNSIGNEDINTEGRALTYPE","QSIGNEDINTEGRALTYPE","IDENTIFIER","NEW_IDENTIFIER", +"TYPE_NAME_OR_ID","CCONSTANT","ITER_NAME","ITER_ENDNAME","TYPE_NAME","file", +"externalDefs","externalDef","constantDecl","fcnDecl","@1","plainFcn","plainNamedDecl", +"namedDeclBase","@2","@3","plainNamedDeclBase","@4","@5","iterDecl","@6","@7", +"macroDef","fcnDefHdr","optGlobMods","@8","optPlainGlobMods","@9","optGlobModsRest", +"optPlainGlobModsRest","specialClauses","globIdList","globIdListExpr","globId", +"globQual","optGlobQuals","optGlobModsAux","@10","@11","optPlainGlobModsAux", +"@12","@13","optMods","fcnMods","@14","fcnPlainMods","@15","specialTag","endStateTag", +"endSpecialTag","stateSpecialClause","specialClauseType","specialClause","@16", +"@17","fcnDefHdrAux","fcnBody","@18","@19","fcnDef","locModifies","locPlainModifies", +"modListExpr","mExpr","modList","specClauseListExpr","specClauseList","primaryExpr", +"postfixExpr","argumentExprList","unaryExpr","fieldDesignator","offsetofExpr", +"sizeofExpr","@20","sizeofExprAux","castExpr","timesExpr","plusExpr","shiftExpr", +"relationalExpr","equalityExpr","bitandExpr","xorExpr","bitorExpr","andExpr", +"@21","orExpr","@22","conditionalExpr","@23","@24","assignExpr","expr","optExpr", +"constantExpr","initializer","instanceDecl","@25","@26","namedInitializer","@27", +"typeDecl","@28","IsType","PushType","namedInitializerList","namedInitializerListAux", +"optDeclarators","init","initList","storageSpecifier","typeQualifier","typeModifier", +"typeSpecifier","completeType","completeTypeSpecifier","altType","completeTypeSpecifierAux", +"optCompleteType","suSpc","@29","@30","@31","@32","@33","@34","@35","@36","NotType", +"structDeclList","structDecl","structNamedDeclList","structNamedDecl","enumSpc", +"@37","enumeratorList","enumerator","optNamedDecl","namedDecl","genericParamList", +"innerMods","innerModsList","pointers","paramIdList","idList","paramTypeList", +"paramList","@38","@39","paramDecl","typeExpression","abstractDecl","optAbstractDeclBase", +"abstractDeclBase","stmt","iterBody","endBody","iterDefStmtList","iterDefIterationStmt", +"forPred","@40","@41","partialIterStmt","@42","iterDefStmt","iterSelectionStmt", +"openScope","closeScope","macroBody","stmtErr","labeledStmt","caseStmt","@43", +"@44","defaultStmt","@45","@46","compoundStmt","compoundStmtErr","CreateInnerScope", +"DeleteInnerScope","CreateStructInnerScope","DeleteStructInnerScope","DeleteInnerScopeSafe", +"compoundStmtRest","compoundStmtAux","compoundStmtAuxErr","stmtListErr","initializerList", +"stmtList","expressionStmt","expressionStmtErr","ifPred","selectionStmt","@47", +"@48","whilePred","iterWhilePred","iterStmt","@49","@50","iterArgList","@51", +"iterArgExpr","primaryIterExpr","postfixIterExpr","unaryIterExpr","castIterExpr", +"timesIterExpr","plusIterExpr","shiftIterExpr","relationalIterExpr","equalityIterExpr", +"bitandIterExpr","xorIterExpr","bitorIterExpr","andIterExpr","orIterExpr","conditionalIterExpr", +"@52","@53","assignIterExpr","endIter","doHeader","iterationStmt","iterationStmtErr", +"jumpStmt","optSemi","id","newId","typeName", NULL +}; +#endif + +static const short yyr1[] = { 0, + 182, 182, 183, 183, 184, 184, 184, 184, 184, 184, + 184, 185, 185, 187, 186, 188, 188, 189, 189, 190, + 190, 190, 190, 191, 190, 192, 190, 193, 193, 193, + 193, 194, 193, 195, 193, 197, 198, 196, 199, 199, + 199, 199, 200, 202, 201, 204, 203, 205, 205, 206, + 206, 207, 207, 208, 208, 209, 210, 210, 211, 211, + 211, 211, 211, 212, 212, 214, 213, 215, 213, 213, + 213, 213, 217, 216, 218, 216, 216, 216, 216, 219, + 219, 221, 220, 223, 222, 224, 224, 224, 224, 224, + 225, 226, 227, 227, 228, 228, 228, 228, 228, 228, + 228, 228, 230, 229, 231, 229, 232, 232, 234, 233, + 235, 233, 236, 237, 237, 238, 238, 239, 239, 239, + 239, 239, 239, 239, 239, 240, 240, 241, 241, 242, + 242, 242, 242, 242, 242, 242, 242, 243, 243, 244, + 244, 244, 244, 244, 244, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 246, 246, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 248, 248, 249, + 251, 250, 252, 252, 252, 252, 253, 253, 254, 254, + 254, 254, 255, 255, 255, 256, 256, 256, 257, 257, + 257, 257, 257, 258, 258, 258, 259, 259, 260, 260, + 261, 261, 262, 263, 262, 264, 265, 264, 266, 267, + 268, 266, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 270, 270, 271, 271, 272, 273, + 273, 273, 274, 275, 274, 276, 274, 277, 278, 277, + 280, 279, 279, 279, 281, 282, 283, 284, 284, 285, + 285, 286, 286, 286, 287, 287, 288, 288, 288, 288, + 288, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 289, 289, 290, 290, 290, 290, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 292, 293, 293, 294, 294, 295, + 295, 295, 296, 296, 298, 299, 297, 300, 301, 297, + 297, 297, 302, 303, 297, 304, 305, 297, 297, 297, + 297, 297, 306, 307, 307, 307, 308, 308, 309, 309, + 310, 310, 310, 311, 312, 311, 311, 313, 313, 313, + 314, 314, 315, 315, 315, 315, 316, 316, 317, 317, + 318, 318, 319, 319, 320, 320, 320, 320, 321, 321, + 322, 322, 323, 323, 323, 325, 324, 326, 324, 327, + 327, 328, 328, 329, 329, 329, 330, 330, 331, 331, + 331, 331, 331, 331, 331, 331, 331, 332, 332, 332, + 332, 332, 332, 332, 332, 332, 333, 334, 335, 335, + 336, 336, 336, 336, 338, 339, 337, 341, 340, 340, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 343, 344, 345, 346, 346, 347, 347, + 347, 347, 347, 347, 347, 347, 347, 347, 347, 348, + 348, 350, 349, 351, 349, 353, 352, 354, 352, 355, + 355, 356, 357, 358, 359, 360, 361, 362, 362, 362, + 362, 362, 362, 362, 362, 363, 364, 364, 364, 364, + 365, 365, 366, 366, 367, 367, 368, 368, 369, 369, + 369, 370, 371, 372, 371, 373, 371, 374, 375, 377, + 378, 376, 379, 380, 379, 381, 381, 381, 381, 382, + 382, 383, 383, 383, 383, 383, 383, 383, 383, 383, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 385, 385, 386, 386, 386, 386, 387, 387, 387, 388, + 388, 388, 389, 389, 389, 389, 389, 390, 390, 390, + 391, 391, 392, 392, 393, 393, 394, 394, 395, 395, + 396, 397, 398, 396, 399, 399, 399, 399, 399, 399, + 399, 399, 399, 399, 399, 399, 400, 400, 401, 402, + 402, 402, 403, 403, 403, 403, 404, 404, 404, 404, + 404, 404, 404, 404, 404, 404, 405, 405, 406, 407, + 407, 407, 407, 407, 408, 408 +}; + +static const short yyr2[] = { 0, + 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, + 1, 8, 11, 0, 5, 1, 3, 1, 2, 1, + 6, 3, 6, 0, 6, 0, 7, 1, 6, 3, + 6, 0, 6, 0, 7, 0, 0, 10, 3, 3, + 3, 2, 1, 0, 2, 0, 2, 1, 2, 1, + 2, 1, 2, 1, 3, 2, 1, 1, 1, 1, + 1, 1, 1, 0, 2, 0, 6, 0, 6, 1, + 1, 0, 0, 5, 0, 5, 1, 1, 0, 1, + 0, 0, 3, 0, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 7, 0, 8, 1, 3, 0, 3, + 0, 3, 2, 3, 2, 2, 1, 1, 1, 3, + 4, 2, 3, 3, 3, 1, 1, 1, 3, 1, + 1, 3, 4, 2, 3, 3, 3, 1, 3, 1, + 1, 1, 3, 1, 1, 1, 4, 3, 4, 6, + 5, 5, 2, 2, 1, 3, 1, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 1, 3, 1, 9, + 0, 3, 4, 2, 4, 2, 1, 4, 1, 3, + 3, 3, 1, 3, 3, 1, 3, 3, 1, 3, + 3, 3, 3, 1, 3, 3, 1, 3, 1, 3, + 1, 3, 1, 0, 4, 1, 0, 4, 1, 0, + 0, 7, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 1, 3, 0, 1, 1, 1, + 1, 1, 3, 0, 9, 0, 11, 2, 0, 6, + 0, 7, 4, 4, 0, 0, 2, 1, 4, 0, + 4, 1, 3, 4, 1, 3, 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, 2, 2, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 1, 4, 1, 3, 2, + 2, 2, 0, 1, 0, 0, 11, 0, 0, 11, + 6, 6, 0, 0, 10, 0, 0, 10, 5, 5, + 4, 4, 0, 1, 1, 2, 5, 3, 2, 4, + 1, 3, 4, 6, 0, 8, 4, 1, 3, 2, + 1, 4, 1, 1, 2, 2, 1, 2, 1, 2, + 1, 1, 1, 2, 1, 2, 2, 3, 1, 3, + 1, 3, 1, 1, 3, 0, 2, 0, 4, 4, + 1, 1, 2, 1, 1, 2, 0, 1, 5, 2, + 3, 3, 4, 3, 4, 4, 5, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 7, 6, 2, 0, 0, 10, 0, 6, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, + 2, 0, 4, 0, 5, 0, 3, 0, 4, 3, + 2, 3, 0, 0, 0, 0, 0, 1, 2, 2, + 3, 2, 3, 3, 4, 2, 2, 3, 3, 4, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 4, 2, 0, 5, 0, 6, 4, 4, 0, + 0, 10, 1, 0, 4, 1, 1, 1, 1, 1, + 3, 1, 4, 3, 4, 6, 5, 5, 2, 2, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, + 1, 4, 1, 3, 3, 3, 1, 3, 3, 1, + 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, + 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, + 1, 0, 0, 7, 1, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 1, 0, 1, 2, + 7, 2, 2, 7, 6, 2, 3, 2, 3, 2, + 3, 3, 3, 3, 2, 3, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1 +}; + +static const short yydefact[] = { 0, + 11, 385, 353, 231, 353, 14, 0, 0, 0, 0, + 245, 245, 258, 257, 259, 260, 261, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 308, 309, 310, 307, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 353, 353, 353, 353, 353, 353, + 353, 353, 353, 353, 619, 620, 624, 621, 622, 625, + 0, 3, 6, 7, 377, 8, 9, 353, 43, 617, + 10, 230, 232, 0, 333, 333, 353, 333, 353, 326, + 353, 0, 353, 107, 245, 623, 20, 353, 381, 382, + 383, 386, 387, 248, 245, 245, 241, 353, 626, 353, + 353, 624, 0, 469, 245, 476, 0, 0, 0, 599, + 0, 0, 0, 0, 245, 509, 0, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 0, 42, 0, 0, + 0, 0, 0, 0, 245, 145, 141, 144, 142, 520, + 146, 157, 177, 167, 166, 179, 183, 186, 189, 194, + 197, 199, 201, 203, 206, 209, 213, 225, 511, 171, + 0, 0, 501, 459, 460, 461, 462, 0, 0, 463, + 245, 464, 0, 465, 0, 466, 468, 140, 0, 453, + 0, 507, 0, 483, 440, 0, 0, 0, 449, 0, + 450, 429, 448, 445, 446, 441, 442, 443, 0, 0, + 447, 0, 0, 0, 451, 428, 0, 262, 263, 264, + 265, 270, 272, 271, 275, 276, 287, 289, 290, 288, + 273, 274, 266, 267, 268, 269, 284, 285, 282, 286, + 277, 278, 281, 279, 280, 293, 295, 300, 283, 296, + 297, 298, 299, 291, 292, 294, 301, 302, 305, 306, + 303, 304, 311, 313, 312, 314, 315, 316, 317, 318, + 319, 320, 4, 245, 0, 109, 113, 503, 353, 353, + 618, 5, 353, 334, 330, 331, 324, 332, 0, 245, + 245, 322, 245, 245, 0, 323, 378, 321, 384, 388, + 353, 0, 247, 353, 0, 238, 245, 617, 16, 18, + 0, 353, 245, 28, 396, 245, 141, 144, 177, 229, + 472, 140, 0, 245, 245, 245, 245, 0, 608, 610, + 615, 0, 0, 353, 402, 0, 0, 160, 165, 164, + 163, 162, 161, 0, 245, 158, 159, 245, 0, 0, + 0, 0, 0, 245, 478, 245, 471, 245, 418, 419, + 420, 421, 0, 422, 423, 245, 425, 245, 424, 426, + 483, 245, 245, 153, 154, 0, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 204, 210, 207, 510, 245, 0, 606, + 39, 0, 484, 502, 513, 603, 0, 470, 245, 0, + 0, 0, 508, 40, 430, 434, 444, 455, 456, 454, + 0, 0, 41, 22, 245, 396, 353, 245, 483, 504, + 245, 233, 108, 353, 0, 328, 0, 353, 0, 353, + 0, 245, 245, 244, 245, 243, 239, 353, 0, 245, + 0, 353, 245, 19, 393, 0, 0, 379, 394, 245, + 0, 0, 477, 0, 516, 0, 228, 0, 607, 616, + 143, 245, 245, 0, 404, 403, 405, 245, 467, 245, + 0, 611, 612, 613, 614, 609, 474, 0, 0, 602, + 353, 481, 600, 0, 0, 148, 0, 155, 0, 0, + 0, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 180, 181, 182, 185, 184, 187, 188, 190, + 191, 192, 193, 195, 196, 198, 200, 202, 245, 245, + 245, 226, 245, 245, 172, 497, 144, 501, 0, 353, + 482, 514, 0, 0, 452, 438, 0, 0, 24, 0, + 488, 245, 505, 110, 353, 245, 353, 483, 112, 245, + 234, 327, 245, 343, 0, 351, 346, 0, 352, 0, + 368, 371, 365, 367, 249, 245, 245, 617, 15, 30, + 245, 396, 245, 17, 380, 389, 391, 36, 398, 353, + 397, 401, 473, 512, 0, 518, 245, 325, 410, 0, + 396, 406, 245, 0, 178, 353, 245, 0, 479, 480, + 496, 0, 521, 245, 149, 147, 245, 245, 205, 0, + 208, 245, 174, 245, 176, 498, 499, 245, 245, 245, + 519, 245, 245, 353, 44, 26, 489, 492, 245, 245, + 490, 245, 506, 0, 236, 245, 329, 349, 485, 335, + 350, 485, 338, 245, 370, 245, 0, 0, 245, 245, + 245, 0, 32, 0, 245, 0, 46, 395, 245, 407, + 245, 0, 411, 414, 245, 0, 412, 0, 396, 0, + 0, 475, 245, 245, 156, 151, 152, 211, 0, 0, + 500, 515, 0, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 0, 141, 144, 142, 157, 177, 166, 183, + 186, 189, 194, 197, 199, 201, 203, 206, 0, 524, + 523, 532, 541, 551, 553, 557, 560, 563, 568, 571, + 573, 575, 577, 579, 581, 585, 526, 140, 0, 23, + 25, 72, 44, 493, 494, 245, 491, 21, 245, 250, + 353, 341, 485, 353, 342, 485, 364, 369, 245, 0, + 242, 245, 252, 240, 245, 0, 353, 46, 34, 0, + 390, 392, 37, 79, 399, 373, 0, 245, 407, 374, + 408, 517, 435, 0, 415, 413, 416, 0, 0, 150, + 0, 524, 245, 173, 175, 605, 0, 0, 160, 165, + 164, 163, 162, 161, 158, 159, 245, 245, 245, 153, + 154, 0, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 204, + 582, 207, 439, 0, 433, 66, 82, 70, 86, 87, + 88, 89, 90, 93, 94, 45, 72, 48, 71, 353, + 353, 52, 27, 495, 245, 0, 355, 353, 353, 354, + 353, 353, 353, 372, 245, 255, 0, 250, 12, 31, + 33, 46, 29, 617, 73, 84, 77, 47, 79, 50, + 78, 396, 400, 375, 376, 245, 409, 417, 0, 169, + 0, 483, 212, 604, 143, 245, 0, 148, 0, 0, + 0, 0, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 180, 181, 182, 185, 184, 187, 188, + 190, 191, 192, 193, 195, 196, 198, 200, 202, 578, + 245, 580, 245, 432, 353, 64, 617, 49, 103, 0, + 53, 250, 245, 353, 0, 245, 356, 344, 353, 347, + 353, 366, 253, 245, 617, 35, 0, 353, 64, 617, + 51, 245, 436, 245, 0, 601, 598, 178, 245, 149, + 147, 245, 245, 0, 525, 353, 59, 60, 61, 62, + 63, 617, 54, 64, 0, 0, 0, 119, 83, 128, + 617, 0, 118, 0, 95, 100, 99, 98, 97, 96, + 101, 102, 105, 0, 235, 245, 358, 245, 245, 353, + 361, 0, 336, 0, 339, 254, 256, 0, 38, 617, + 617, 85, 617, 117, 245, 0, 170, 168, 597, 484, + 0, 151, 152, 583, 0, 64, 0, 65, 58, 56, + 57, 0, 122, 0, 0, 0, 0, 0, 115, 0, + 0, 131, 138, 617, 130, 0, 245, 251, 245, 245, + 0, 359, 245, 345, 0, 348, 0, 13, 81, 81, + 116, 437, 522, 150, 245, 81, 55, 81, 123, 120, + 127, 126, 0, 124, 125, 129, 114, 0, 134, 0, + 0, 0, 0, 0, 617, 237, 362, 353, 357, 245, + 337, 340, 74, 80, 76, 584, 67, 69, 121, 135, + 132, 0, 136, 137, 139, 92, 245, 0, 360, 363, + 133, 104, 91, 245, 106, 0, 0, 0 +}; + +static const short yydefgoto[] = { 1156, + 81, 82, 83, 84, 121, 318, 319, 85, 655, 763, + 320, 788, 902, 86, 687, 904, 887, 88, 761, 762, + 793, 794, 876, 908, 877, 1012, 1013, 1070, 1014, 1015, + 878, 965, 966, 910, 988, 989, 1133, 1134, 967, 911, + 990, 880, 1154, 1147, 881, 1033, 882, 1024, 1086, 89, + 287, 447, 449, 90, 1019, 1052, 1020, 1113, 1021, 1083, + 1084, 161, 162, 517, 163, 919, 164, 165, 419, 555, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 549, 176, 551, 177, 550, 813, 178, 206, 488, 331, + 288, 92, 666, 769, 114, 597, 93, 314, 180, 285, + 115, 116, 886, 784, 897, 95, 96, 97, 98, 345, + 289, 455, 100, 295, 101, 773, 1095, 776, 1097, 669, + 1042, 672, 1044, 102, 889, 890, 1039, 1040, 103, 677, + 590, 591, 798, 118, 477, 111, 112, 105, 605, 606, + 478, 479, 480, 689, 611, 346, 804, 800, 497, 367, + 207, 227, 208, 209, 368, 916, 1056, 211, 652, 212, + 213, 214, 215, 182, 424, 369, 370, 482, 628, 371, + 333, 508, 372, 187, 373, 561, 771, 978, 220, 574, + 512, 423, 189, 575, 576, 374, 190, 191, 375, 649, + 615, 376, 223, 377, 381, 704, 740, 864, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 961, 1105, 757, 1060, 378, 379, + 196, 380, 292, 332, 199, 108 +}; + +static const short yypact[] = { 2004, +-32768, 118, 5457,-32768, 6254,-32768, 781, 2949, 3313, 3313, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 460,-32768,-32768,-32768, + 2186,-32768,-32768,-32768, 350,-32768,-32768, 5201,-32768, 123, +-32768,-32768,-32768, 145, 6095, 6095,-32768, 6095, 176, 51, +-32768, 557,-32768,-32768, 781,-32768,-32768,-32768,-32768,-32768, +-32768, 118,-32768,-32768, 183,-32768, 176,-32768,-32768,-32768, + 5457,-32768, 208,-32768, 5072,-32768, 264, 271, 330,-32768, + 345, 781, 257, 366, 1104,-32768, 2544, 5072, 5072, 5072, + 5072, 5072, 5072,-32768, 5611, 5611, 382,-32768, 400, 429, + 436, 441, 451, 326, 4659,-32768, 483, 496,-32768, 501, +-32768, 502, 884,-32768,-32768,-32768, 747, 601, 724, 650, + 807, 498, 459, 492, 485, 121,-32768,-32768, 313,-32768, + 3452, 477, 482,-32768,-32768,-32768,-32768, 533, 3088,-32768, + 4659,-32768, 3452,-32768, 3452,-32768,-32768, 569, 584,-32768, + 577,-32768, 2725, 501, 596, 338, 576, 3131,-32768, 3313, +-32768,-32768,-32768, 5854,-32768,-32768,-32768,-32768, 656, 657, +-32768, 3313, 3313, 3452,-32768,-32768, 592,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 664, 673,-32768,-32768,-32768, 176, 5045, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 690, 559, +-32768,-32768, 781, 781, 76,-32768, 350,-32768,-32768,-32768, +-32768, 695,-32768,-32768, 697, 680, 559, 123,-32768, 373, + 693,-32768, 781,-32768, 91, 5072,-32768,-32768,-32768,-32768, +-32768,-32768, 711, 5072, 5072, 5072, 1907, 735,-32768,-32768, +-32768, 469, 443, 5724, 186, 718, 741,-32768,-32768,-32768, +-32768,-32768,-32768, 737, 5072,-32768,-32768, 5072, 768, 770, + 777, 784, 802, 5072,-32768, 1933,-32768, 4659,-32768,-32768, +-32768,-32768, 812,-32768,-32768, 4659,-32768, 4659,-32768,-32768, +-32768, 3481, 5072,-32768,-32768, 106, 5072, 5072, 5072, 5072, + 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, + 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, + 5072, 5072, 5072,-32768,-32768,-32768,-32768, 5072, 842,-32768, +-32768, 2363,-32768,-32768, 828,-32768, 840,-32768, 5072, 629, + 814, 830,-32768,-32768,-32768,-32768, 5854,-32768,-32768,-32768, + 2906, 847,-32768,-32768, 5072, 97, 3554, 559, 851,-32768, + 559,-32768, 284, 6254, 778, 856, 868, 878, 886, 878, + 781, 900, 559,-32768, 559,-32768,-32768,-32768, 806, 905, + 929,-32768, 559, 373,-32768, 781, 912,-32768, 919, 781, + 98, 940,-32768, 446, 946, 512, 946, 951,-32768,-32768, +-32768,-32768, 1472, 948, 404,-32768, 450, 5072,-32768,-32768, + 954,-32768,-32768,-32768,-32768,-32768,-32768, 955, 957,-32768, + 3554,-32768,-32768, 975, 969,-32768, 537,-32768, 371, 781, + 781,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768, 747, 747, 601, 601, 724, + 724, 724, 724, 650, 650, 807, 498, 459, 5072, 5072, + 5072,-32768, 5622, 5642,-32768,-32768, 5387,-32768, 3270, 3730, +-32768,-32768, 974, 561,-32768,-32768, 977, 984,-32768, 989, +-32768, 4082,-32768,-32768, 3906, 4125,-32768, 851,-32768,-32768, + 965,-32768,-32768, 1006, 1022,-32768, 1011, 1028,-32768, 882, +-32768, 1000,-32768,-32768,-32768, 183,-32768, 137,-32768,-32768, + 5072, 171, 559,-32768,-32768, 1044,-32768,-32768, 1070, 6254, +-32768,-32768,-32768,-32768, 1052,-32768, 1907,-32768,-32768, 1061, + 723, 450, 4217, 1056,-32768,-32768,-32768, 1067,-32768,-32768, +-32768, 1071,-32768, 5072,-32768,-32768,-32768,-32768, 492, 888, + 485, 5072,-32768, 5072,-32768,-32768,-32768, 4260, 4659, 5072, +-32768, 5653, 5072,-32768,-32768,-32768,-32768,-32768, 4303, 4438, +-32768, 4481,-32768, 1069,-32768,-32768,-32768,-32768,-32768, 1076, +-32768,-32768, 1077,-32768, 781,-32768, 781, 1087, 3366,-32768, +-32768, 1081,-32768, 1084,-32768, 103,-32768,-32768, 781, 736, + 4659, 1092,-32768,-32768, 309, 1086,-32768, 1085, 126, 1093, + 1088,-32768, 5072, 5653,-32768,-32768,-32768,-32768, 1094, 1095, +-32768,-32768, 563, 5072, 5072, 5072, 5072, 5072, 5072, 5072, + 5611, 5611, 1097, 587, 631, 634, 761, 1125, 642, 783, + 963, 1003, 726, 1015, 1089, 1078, 1083, 1074, 201, 1099, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768, 684, 685,-32768, +-32768, 1157,-32768,-32768,-32768, 4616,-32768,-32768,-32768,-32768, + 6184,-32768,-32768, 6184,-32768,-32768,-32768,-32768, 5072, 1051, +-32768, 3366,-32768,-32768, 3366, 1037,-32768,-32768,-32768, 1105, +-32768,-32768,-32768, 1306,-32768, 350, 1107,-32768, 692,-32768, + 450,-32768,-32768, 1114,-32768,-32768,-32768, 1115, 781,-32768, + 704, 1124, 5072,-32768,-32768, 1135, 719, 1130, 720, 725, + 779, 817, 819, 825, 831, 857, 5072, 4395, 5072, 875, + 913, 139, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, + 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, + 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, +-32768, 5072,-32768, 1111, 1138, 72,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, 987,-32768,-32768,-32768, +-32768, 845,-32768,-32768, 3366, 478,-32768, 176, 5271,-32768, + 6184, 5271, 6184,-32768,-32768,-32768, 1053,-32768,-32768,-32768, +-32768,-32768,-32768, 123, 138,-32768,-32768,-32768, 990,-32768, +-32768, 636,-32768,-32768,-32768, 4916,-32768,-32768, 514,-32768, + 1139, 851,-32768,-32768, 938, 5072, 1140, 964, 966, 390, + 781, 781,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 985, 988, 991, 543, 983, 212, 456, + 354, 360, 393, 522, 398, 811, 132, 408, 260, 492, + 5072, 485, 5653,-32768, 5984, 62, 122,-32768,-32768, 833, +-32768,-32768,-32768,-32768, 1141, 327,-32768,-32768, 5271,-32768, + 5271,-32768,-32768, 3227, 571,-32768, 1072, 5984, 62, 122, +-32768, 617,-32768,-32768, 781,-32768, 992, 999,-32768, 1004, + 1007,-32768,-32768, 1062,-32768, 4889,-32768,-32768,-32768,-32768, +-32768, 628,-32768, 62, 916, 60, 60,-32768,-32768, 266, + 665, 1079,-32768, 140,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 709,-32768, 559,-32768,-32768, 1143,-32768, + 1146, 1149,-32768, 1150,-32768,-32768,-32768, 1090,-32768, 4732, + 628,-32768, 665,-32768, 579, 1148,-32768,-32768,-32768,-32768, + 1151, 1012, 1023,-32768, 1091, 62, 1108,-32768,-32768,-32768, +-32768, 117, 266, 381, 781, 781, 60, 1109,-32768, 140, + 140,-32768, 336, 750,-32768, 140,-32768,-32768, 5072, 327, + 1153,-32768,-32768,-32768, 1155,-32768, 1161,-32768, 1119, 1119, +-32768,-32768,-32768, 1025, 5072, 1119,-32768, 1119,-32768,-32768, +-32768, 266, 1166,-32768,-32768, 266,-32768, 457, 336, 445, + 781, 781, 140, 1112, 750,-32768,-32768,-32768,-32768, 5072, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768, 1168,-32768,-32768, 336,-32768,-32768, 1113,-32768,-32768, +-32768,-32768,-32768,-32768,-32768, 1177, 1199,-32768 +}; + +static const short yypgoto[] = {-32768, +-32768, 1123,-32768,-32768,-32768,-32768, -388, -100,-32768,-32768, + 883,-32768,-32768,-32768,-32768,-32768, 112,-32768, 447,-32768, + -679,-32768,-32768,-32768, -693, 219, 147,-32768,-32768, 203, + 341,-32768,-32768, 310,-32768,-32768, -918, -659,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768, -890, 100, 232, -942, + 141,-32768, -586, 397, 961,-32768,-32768, -580,-32768,-32768, + 581, -334, -333, -332, -331, -346, -365, -315, -532, -538, +-32768, -572,-32768, -115,-32768,-32768, 1073, 1068, -534, -358, + 1,-32768,-32768,-32768, -461,-32768,-32768,-32768, 0, -274, + 767,-32768, -765, -694,-32768,-32768,-32768,-32768,-32768,-32768, + 165, 651,-32768, 414,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768, 756, -674, -782,-32768, 143,-32768,-32768, + 565, 568, 452, 8, -401, 1132,-32768, 42,-32768,-32768, + -552,-32768,-32768,-32768, 556, -287, 907,-32768, -488, 467, + 1240,-32768, 1030,-32768, 392,-32768,-32768,-32768,-32768, -97, +-32768,-32768,-32768,-32768, 172, 1133, 1411,-32768,-32768, 1435, +-32768,-32768, -357,-32768, 1336, 194, -568, -806,-32768, 745, +-32768,-32768, 836, -84, -306, 6,-32768, 119, 69,-32768, +-32768, 251,-32768, 476,-32768,-32768, 555,-32768, 297,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1556,-32768, +-32768, 1646, -120, 231, 90,-32768 +}; + + +#define YYLAST 6435 + + +static const short yytable[] = { 94, + 91, 595, 94, 290, 307, 507, 622, 104, 509, 330, + 228, 229, 641, 456, 221, 221, 639, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 113, 570, 471, 547, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 546, 727, 536, 537, 696, 538, + 539, 729, 540, 541, 542, 543, 192, 544, 545, 739, + 94, 91, 692, 1016, 604, 980, 568, 896, 104, 107, + 898, 579, 107, 1017, 461, 475, 123, 548, 299, 892, + 909, 475, 879, 774, 94, 431, 977, 791, 901, 977, + 435, 87, 436, 738, 312, 313, 315, 727, 418, 737, + 321, 569, 491, 729, 440, 1072, 1073, 222, 222, 437, + 475, 739, 985, 520, 620, 301, 344, 1118, 1119, 291, + 291, 1109, 1074, 354, 1075, 1016, 808, 1007, 1008, 521, + 807, 2, -572, 310, 291, 1017, -572, -68, -68, 680, + 1076, 415, 323, 1080, 99, 738, 931, 117, 293, 120, + 107, 737, 1043, 1081, 1045, 475, 416, 1009, 1010, 183, + 1145, 1135, 932, 1112, 409, 410, 1116, 1137, 971, 1138, + 972, 1011, 87, -245, 107, 683, 977, 469, 977, 471, + 684, 801, 344, 311, 891, 192, 1034, 893, 221, -245, + 324, 493, 626, 221, 685, 221, 979, 879, 981, 2, + 509, 338, 986, -75, -75, 109, 110, 221, 221, 1112, + 106, 325, -561, 106, 75, 1018, -561, 106, 198, 198, + 198, 861, 682, 401, 402, 99, -68, -68, 330, 192, + 75, 76, 122, 648, 78, 79, 862, 192, 193, 294, + 294, 192, 294, 192, 698, -353, -353, -353, 660, -353, + -353, -353, -353, -353, 339, -353, -353, 75, 76, 122, + -576, 78, 79, 445, -576, 322, 735, 334, 299, 1047, + 450, 1074, 192, 1075, 335, 456, 75, 1018, 412, 94, + 454, -353, 457, 459, -353, 734, -353, 453, 347, 1076, + 801, 106, -75, -75, 75, 1082, 94, 730, 731, 732, + 733, 222, 321, 962, 468, 344, 222, 960, 222, 330, + 417, 364, 365, 418, 493, 106, 736, 560, 735, 701, + 222, 222, 2, 435, 494, -353, -353, -353, 1038, -353, + -353, 106, 420, 336, 709, 433, 710, 734, 418, 696, + 2, 1120, 106, 1121, 426, 344, 427, 198, 337, 730, + 731, 732, 733, -246, -564, 284, 727, 330, -564, 1122, + -565, 993, 729, 340, -565, 198, 495, 193, 736, 107, + 739, 418, 458, 460, 462, 442, -246, 636, 470, 181, + 210, 210, 403, 404, 1016, 358, 107, 1110, 403, 404, + 418, 198, 324, -566, 1017, 359, 1001, -566, -569, 198, + 894, 198, -569, 198, 738, 198, 818, -245, -574, 493, + 737, 193, -574, 198, 405, 406, 411, 450, 198, 193, + 198, 403, 404, 193, 360, 193, 221, 94, 407, 408, + 94, 361, 198, 198, 198, 577, 362, 585, 580, 588, + 417, 594, 94, 418, 94, 363, 418, 491, 1016, 601, + 614, 1141, 321, -245, 193, 623, -562, 681, 1017, 610, + -562, 1140, 1120, 194, 1121, 330, 490, 401, 402, 418, + 192, 618, 958, -626, 494, 973, 624, 412, 974, 454, + 1122, 75, 76, 122, -620, 78, 79, 330, 492, 296, + 957, 298, 947, 948, 323, 949, 950, -624, 951, 952, + 953, 954, -621, 955, 956, 382, 411, 383, 181, -353, + 106, 413, 418, 106, 106, 106, 616, 107, 994, 414, + 107, 995, -567, 959, -626, -353, -567, 106, 384, 385, + 592, 422, 107, 106, 107, 75, 1018, 634, 1111, 222, + 450, 635, 324, -559, 997, 607, 622, -559, 421, 612, + 403, 404, 181, -457, 1088, 450, 398, 399, 400, 664, + 181, 418, 454, 418, 181, 651, 181, 816, 291, 796, + -623, 974, 2, 558, 210, 678, 679, 735, 198, 210, + 429, 210, 321, -404, 493, 428, 198, -529, 198, 637, + 638, -529, 194, 210, 210, 181, 734, -622, 492, 75, + 1018, 624, 1111, 303, 304, 305, 454, 192, 730, 731, + 732, 733, 401, 402, -626, -626, 706, 707, -626, -626, + 475, 344, 493, 344, 323, 291, 433, 736, 1066, 418, + 2, -528, 198, 491, -530, -528, 194, 425, -530, -353, + 694, -353, -550, 330, 194, 770, -550, 434, 194, -353, + 194, 198, 193, 777, 438, 779, 439, 198, 106, 785, + 786, 106, 291, 443, 790, 1077, 405, 406, 610, 797, + 444, 106, 324, 106, 494, 106, 446, 923, 796, 194, + 407, 408, 467, 106, -527, 418, 106, 452, -527, 865, + 106, 1061, 464, 344, 466, -245, 472, 493, 348, 349, + 350, 351, 352, 353, 418, 2, 1087, 475, 921, 974, + 1127, 799, 483, 75, 76, 122, 495, 78, 79, 418, + -544, 198, 498, 925, -544, -549, -353, 694, -353, -549, + 106, 106, 489, 75, 76, 122, -353, 78, 79, -245, + 500, 493, 851, 852, 592, 499, 592, 291, 885, 2, + 1123, 1150, 403, 404, 690, 792, 853, 854, 612, 107, + 398, 399, 400, 987, 828, 502, 829, 503, -353, 198, + 198, 75, 76, 122, 504, 78, 79, 913, 797, -548, + 624, 505, 198, -548, -353, 198, 198, 830, 831, 193, + -353, -353, -353, 181, -353, -353, 844, 845, 846, 506, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 511, -570, 210, 106, 510, -570, 562, -547, 565, -546, + 799, -547, 513, -546, 514, -545, 1022, 405, 406, -545, + 563, -542, 297, 566, 300, -542, 302, 567, 306, 409, + 410, 407, 408, 308, 1048, 582, 75, 76, 122, 1054, + 78, 79, 914, 316, 578, 317, 583, -543, 198, 198, + 1006, -543, 758, 553, 554, 1065, 584, 975, 107, 198, + 198, 1067, 198, 599, 982, -539, -245, 194, 920, -539, + 1078, 674, 675, 1050, 587, 106, 387, 106, 418, 708, + 75, 76, 122, 573, 78, 79, 106, 386, 593, 106, + 106, 198, 869, 870, 871, 872, 873, 874, 875, 1099, + 1100, 600, 1101, -540, 758, 888, 608, -540, 888, 609, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 181, 1025, 602, 1026, 307, 75, 76, 122, -531, 78, + 79, 613, -531, 1124, 1027, 1028, 418, 1029, 617, 1030, + 1031, 621, 1035, 330, 627, 94, 629, 573, 533, 534, + 535, 630, 1032, 1041, -534, 632, 634, 665, -534, 1136, + 1000, 797, 633, 1057, 847, 848, 198, 650, 454, 580, + 653, 1062, 1063, -558, 1148, -554, 450, -558, -555, -554, + 654, -556, -555, 656, 330, -556, 398, 399, 400, -552, + 1002, 1003, 676, -552, -535, 668, 573, -533, -535, 106, + 671, -533, -537, 1055, 194, 94, -537, 1089, 1091, 106, + 670, 573, 663, -538, 448, -536, 673, -538, 451, -536, + 450, 849, 850, 888, 797, 888, 888, 888, 866, 867, + 868, 905, 906, 907, 686, 107, 463, 855, 856, 465, + 895, 675, 983, 984, 688, 179, 691, 473, 625, 699, + 476, 107, 418, 1064, 1058, 329, 1126, 693, 702, 94, + 75, 1069, 1130, 768, 703, 772, 775, 1041, 329, 329, + 329, 329, 329, 329, 781, 356, 357, 787, 789, 803, + 805, 806, 810, 809, 663, 712, 858, 857, 814, 815, + 827, 341, 859, 863, 899, 107, 663, 326, 860, 903, + 912, 963, 138, 139, 140, 141, 142, 143, 917, 918, + 184, 216, 216, 888, 107, 888, 1152, 833, 922, 144, + 145, 146, 924, 1155, 926, 964, 996, 802, 1037, 1049, + 999, 106, 106, 1090, 1114, 1115, 1079, 1093, 1094, 1096, + 1129, 1059, 1102, 147, 1131, 1104, 1157, 1098, 1106, 107, + 1132, 834, 835, 836, 837, 838, 839, 840, 841, 842, + 843, 867, 1139, 758, 1151, 1108, 1117, 1023, 1158, 1146, + 1153, 476, 342, 283, 343, 474, 106, 1051, 581, 883, + 1143, 1144, 1107, 586, 156, 589, 1068, 968, 991, 1142, + 1023, 1053, 106, 598, 929, 106, 1125, 603, 866, 867, + 868, 596, 1128, 667, 869, 870, 871, 872, 873, 874, + 875, 780, 778, 309, 795, 1071, 1023, 1023, 179, 226, + 915, 496, 441, 1103, 1085, 631, 179, 559, 812, 1005, + 179, 0, 179, 0, 0, 0, 106, 0, 0, 184, + 430, 0, 0, 0, 0, 0, 0, 0, 75, 327, + 328, 159, 0, 0, 0, 106, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 819, 820, 821, 822, 823, + 824, 0, 0, 0, 1023, 106, 106, 1023, 0, 0, + 1085, 1085, 0, 184, 0, 0, 1085, 0, 0, 0, + 106, 184, 0, 0, 329, 184, 0, 184, 0, 0, + 0, 0, 581, 0, 0, 216, 0, 0, 0, 0, + 216, 0, 216, 188, 219, 219, 0, 0, 0, 0, + 1023, 106, 106, 1085, 216, 216, 184, 476, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 329, 0, 0, 695, 905, 906, 907, + 0, 700, 0, 869, 870, 871, 872, 873, 874, 875, + 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, + 0, 484, 485, 486, 487, 329, 0, 0, 0, 760, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 217, + 217, 0, 481, 0, 944, 945, 946, 0, 0, 0, + 501, 0, 0, 481, 0, 0, 0, 0, 0, 0, + 0, 0, 186, 218, 218, 0, 0, 0, 0, 0, + 519, 0, 0, 329, 518, 0, 0, 0, 329, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 832, 0, 0, 0, 0, 0, 0, 179, + 552, 0, 0, 0, 0, 326, 564, 0, 619, 0, + 138, 139, 140, 141, 142, 143, 998, 0, 0, 329, + 0, 329, 0, 643, 645, 0, 188, 144, 145, 146, + 0, 0, 0, 0, 188, 0, 0, 0, 188, 0, + 188, 0, 0, 0, 0, 0, 0, 0, 219, 432, + 0, 147, 900, 219, 0, 219, 0, 185, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 219, 219, 188, + 0, 329, 0, 195, 224, 224, 0, 0, 0, 0, + 0, 186, 0, 216, 0, 0, 0, 0, 0, 0, + 0, 0, 156, 329, 0, 0, 0, 0, 0, 0, + 0, 185, 0, 0, 0, 0, 0, 0, 0, 185, + 0, 0, 0, 185, 0, 185, 0, 0, 0, 0, + 0, 0, 728, 217, 0, 186, 0, 640, 217, 0, + 217, 0, 0, 186, 0, 0, 179, 186, 0, 186, + 0, 0, 217, 217, 185, 969, 970, 218, 0, 0, + 0, 0, 218, 976, 218, 0, 75, 327, 328, 159, + 0, 0, 0, 197, 225, 225, 218, 218, 186, 0, + 0, 0, 0, 0, 728, 0, 0, 992, 0, 0, + 0, 0, 0, 0, 0, 329, 329, 329, 329, 329, + 329, 825, 826, 0, 487, 0, 0, 0, 0, 0, + 0, 184, 195, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 705, 0, 0, 481, + 0, 481, 0, 0, 0, 0, 515, 713, 0, 0, + 759, 0, 0, 0, 0, 0, 0, 0, 0, 1036, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 329, + 0, 0, 0, 0, 195, 0, 0, 0, 195, 0, + 195, 783, 0, 0, 0, 0, 0, 188, 224, 0, + 0, 0, 0, 224, 0, 224, 0, 0, 0, 0, + 811, 0, 0, 329, 0, 0, 219, 224, 224, 195, + 0, 817, 197, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1092, 0, 0, 0, 0, + 0, 0, 0, 0, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, + 329, 0, 329, 0, 0, 0, 197, 0, 0, 0, + 0, 0, 185, 0, 197, 0, 0, 0, 197, 0, + 197, 0, 0, 0, 0, 0, 0, 0, 225, 0, + 0, 217, 0, 225, 783, 225, 186, 783, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 225, 225, 197, + 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, + 0, 0, 0, 1149, 0, 0, 329, 0, 0, 0, + 0, 0, 0, 0, 188, 0, 930, 0, 0, 927, + 518, 0, 0, 0, 0, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 0, 0, 0, 0, + 0, 0, 0, 728, -227, 0, 0, 0, 0, 0, + 326, 0, 0, 0, 0, 138, 139, 140, 141, 142, + 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -483, 144, 145, 146, 0, 366, 783, 0, 0, + 0, 138, 139, 140, 141, 142, 143, 0, 0, 185, + 0, 0, 0, 0, 0, 0, 147, 195, 144, 145, + 146, 0, 0, 487, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 186, 0, 0, 224, 0, 0, 0, + 0, 0, 147, -1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 156, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -245, 1004, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 156, 0, 0, 0, 0, 3, 329, + 0, 0, 0, 0, 0, 0, 783, 0, 0, 0, + 0, 0, 0, 0, 0, 329, 0, 197, 0, 0, + -353, -353, -353, 0, 4, 0, 0, 0, 5, 6, + 7, 75, 327, 328, 159, 0, 225, 0, 0, 0, + 329, 0, 8, 9, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 75, 327, 328, + 159, 11, 12, 13, 195, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 0, 78, 79, 80, -2, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 197, 0, 0, 0, 0, -245, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -353, -353, -353, 0, 4, 0, 0, 0, + 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 9, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 12, 13, 0, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 0, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 124, 78, 79, 80, 0, 125, 126, + 127, 0, 128, 129, 130, 131, 132, 133, 134, 135, + 136, -483, 556, 0, 0, 0, 137, 0, 0, 0, + 0, 138, 139, 140, 141, 142, 143, 0, 0, 0, + 0, 0, 0, 0, -245, -245, 0, 3, 144, 145, + 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -353, + -353, -353, 147, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 149, 150, 151, 152, 153, + 154, 0, 0, 0, 0, 0, 0, 0, 0, 155, + 11, 12, 13, 156, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 0, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 0, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 157, 557, + 159, 160, 79, 80, 124, 0, 0, 0, 0, 125, + 126, 127, 0, 128, 129, 130, 131, 132, 133, 134, + 135, 136, -483, 0, 0, 0, 0, 137, 0, 0, + 0, 0, 138, 139, 140, 141, 142, 143, 0, 0, + 0, 0, 0, 0, 0, -245, -245, 0, 0, 144, + 145, 146, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -245, -245, -245, 147, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 149, 150, 151, 152, + 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, + 155, -245, -245, -245, 156, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, 0, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, 0, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, 75, 157, + 158, 159, 160, 79, -245, 200, 0, 0, 0, 0, + 125, 126, 127, 0, 0, 201, 130, 131, 132, 133, + 134, 135, 202, -483, -487, 0, 0, 0, 203, 0, + 0, 0, 0, 138, 139, 140, 141, 142, 143, 0, + 0, 0, 0, 0, 0, 0, -245, -245, 0, 0, + 144, 145, 146, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -245, -245, -245, 147, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 149, 150, 151, + 152, 153, 154, 0, 0, 0, 0, 0, 0, 0, + 0, 155, -245, -245, -245, 156, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, 0, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, 0, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, -245, + -245, -245, -245, -245, -245, -245, -245, -245, -245, 75, + 157, 158, 159, 204, 205, -245, 200, 0, 0, 0, + 0, 125, 126, 127, 0, 0, 201, 130, 131, 132, + 133, 134, 135, 202, -431, -431, 0, 0, 0, 203, + -431, 0, 0, 0, 138, 139, 140, 141, 142, 143, + 0, 0, 0, 0, 0, 0, 0, -245, -245, 124, + 0, 144, 145, 146, 125, 126, 127, 0, 128, 129, + 130, 131, 132, 133, 134, 135, 136, -483, 0, 0, + 0, 0, 137, 0, 0, 147, 0, 138, 139, 140, + 141, 142, 143, 0, 0, 0, 0, 0, 0, 0, + -245, -245, 0, 0, 144, 145, 146, -431, 149, 150, + 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, + 0, 0, 155, 0, 0, 0, 156, 0, 147, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 149, 150, 151, 152, 153, 154, 0, 0, 0, + 0, 0, 0, 0, 0, 155, 0, 0, 0, 156, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 75, 157, 158, 159, 204, 205, 0, 0, 124, 0, + 0, 0, 0, 125, 126, 127, 0, 128, 129, 130, + 131, 132, 133, 134, 135, 136, -483, 0, 0, 0, + 0, 137, 0, 0, 0, 0, 138, 139, 140, 141, + 142, 143, 0, 75, 157, 158, 159, 160, 79, -245, + -245, 200, 0, 144, 145, 146, 125, 126, 127, 0, + 0, 201, 130, 131, 132, 133, 134, 135, 202, -483, + -487, 0, 0, 0, 203, 0, 0, 147, 0, 138, + 139, 140, 141, 142, 143, 0, 0, 0, 0, 0, + 0, 0, -245, -245, 0, 0, 144, 145, 146, -458, + 149, 150, 151, 152, 153, 154, 0, 0, 0, 0, + 0, 0, 0, 0, 155, 0, 0, 0, 156, 0, + 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -427, 149, 150, 151, 152, 153, 154, 0, + 0, 0, 0, 0, 0, 0, 0, 155, 0, 0, + 0, 156, 0, 0, 0, 782, 1046, 0, 0, 0, + 326, 0, 0, 0, 0, 138, 139, 140, 141, 142, + 143, 0, 75, 157, 158, 159, 160, 79, 0, 0, + 124, 0, 144, 145, 146, 125, 126, 127, 0, 128, + 129, 130, 131, 132, 133, 134, 135, 136, -483, 646, + 0, 0, 0, 137, 0, 0, 147, 0, 138, 139, + 140, 141, 142, 143, 0, 75, 157, 158, 159, 204, + 205, -245, -245, 200, 0, 144, 145, 146, 125, 126, + 127, 0, 0, 201, 130, 131, 132, 133, 134, 135, + 202, -483, -487, 0, 0, 0, 203, 156, 0, 147, + 0, 138, 139, 140, 141, 142, 143, 0, 0, 0, + 0, 0, 0, 0, -245, -245, 0, 0, 144, 145, + 146, 0, 149, 150, 151, 152, 153, 154, 0, 0, + 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, + 156, 0, 147, 0, 782, 0, 0, 0, 0, 326, + 0, 0, 0, 0, 138, 139, 140, 141, 142, 143, + 0, 75, 327, 328, 159, 149, 150, 151, 152, 153, + 154, 144, 145, 146, 0, 0, 0, 0, 0, 155, + 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, + 0, 0, 0, 0, 75, 157, 158, 159, 160, 79, + 0, 0, 124, 0, 0, 0, 0, 125, 126, 127, + 0, 128, 129, 130, 131, 132, 133, 134, 135, 136, + -483, 0, 0, 0, 0, 137, 156, 0, 0, 0, + 138, 139, 140, 141, 142, 143, 0, 75, 157, 158, + 159, 204, 205, -245, -245, 0, 0, 144, 145, 146, + 0, 0, 0, 0, 326, 516, 0, 0, 0, 138, + 139, 140, 141, 142, 143, 0, 0, 0, 0, 0, + 0, 147, 0, 0, 0, 0, 144, 145, 146, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 75, 327, 328, 159, 149, 150, 151, 152, 153, 154, + 147, 0, 0, 0, 0, 0, 0, 0, 155, 125, + 126, 127, 156, 128, 129, 130, 131, 132, 133, 134, + 135, 202, -483, 571, 0, 0, 0, 366, 0, 0, + 0, 0, 138, 139, 140, 141, 142, 143, 0, 0, + 0, 156, 0, 0, 0, -245, -245, 0, 3, 144, + 145, 146, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 147, 4, 0, 75, 157, 158, 159, + 160, 79, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 149, 150, 151, 152, + 153, 154, 0, 0, 0, 75, 327, 328, 159, 0, + 572, 11, 12, 13, 156, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 157, + 557, 159, 160, 79, 80, 125, 126, 127, 0, 128, + 129, 130, 131, 132, 133, 134, 135, 202, -483, 647, + 0, 0, 0, 366, 0, 0, 0, 0, 138, 139, + 140, 141, 142, 143, 0, 0, 0, 0, 0, 0, + 0, -245, -245, 0, 3, 144, 145, 146, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 149, 150, 151, 152, 153, 154, 0, 0, + 0, 0, 0, 0, 0, 0, 155, 11, 12, 13, + 156, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 0, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 0, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 157, 557, 159, 160, 79, + 80, 125, 126, 127, 0, 128, 129, 130, 131, 132, + 133, 134, 135, 202, -483, 658, 0, 0, 0, 366, + 0, 0, 0, 0, 138, 139, 140, 141, 142, 143, + 0, 0, 0, 0, 0, 0, 0, -245, -245, 0, + 3, 144, 145, 146, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 147, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 149, 150, + 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, + 0, 0, 659, 11, 12, 13, 156, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 0, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 157, 557, 159, 160, 79, 80, 125, 126, 127, + 0, 128, 129, 130, 131, 132, 133, 134, 135, 202, + -483, 657, 0, 0, 0, 366, 0, 0, 0, 0, + 138, 139, 140, 141, 142, 143, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 144, 145, 146, + 125, 126, 127, 0, 128, 129, 130, 131, 132, 133, + 134, 135, 202, -483, 661, 0, 0, 0, 366, 0, + 0, 147, 0, 138, 139, 140, 141, 142, 143, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 144, 145, 146, 0, 149, 150, 151, 152, 153, 154, + 0, 0, 0, 0, 0, 0, 0, 0, 155, 0, + 0, 0, 156, 0, 147, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 149, 150, 151, + 152, 153, 154, 0, 0, 0, 0, 0, 0, 0, + 0, 662, 0, 0, 0, 156, 0, 0, 0, 0, + 326, 0, 0, 697, 0, 138, 139, 140, 141, 142, + 143, 0, 0, 0, 0, 0, 75, 157, 158, 159, + 160, 79, 144, 145, 146, 125, 126, 127, 0, 128, + 129, 130, 131, 132, 133, 134, 135, 202, -483, 711, + 0, 0, 0, 366, 0, 0, 147, 0, 138, 139, + 140, 141, 142, 143, 0, 0, 0, 0, 0, 75, + 157, 158, 159, 160, 79, 144, 145, 146, 125, 126, + 127, 0, 128, 129, 130, 131, 132, 133, 134, 135, + 202, -483, 764, 0, 0, 0, 366, 156, 0, 147, + 0, 138, 139, 140, 141, 142, 143, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 144, 145, + 146, 0, 149, 150, 151, 152, 153, 154, 0, 0, + 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, + 156, 0, 147, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 75, 327, 328, 159, 149, 150, 151, 152, 153, + 154, 0, 0, 0, 0, 0, 0, 0, 0, 155, + 0, 0, 0, 156, 0, 0, 0, 0, 326, 928, + 0, 0, 0, 138, 139, 140, 141, 142, 143, 0, + 0, 0, 0, 0, 75, 157, 158, 159, 160, 79, + 144, 145, 146, 125, 126, 127, 0, 128, 129, 130, + 131, 132, 133, 134, 135, 202, -483, 765, 0, 0, + 0, 366, 0, 0, 147, 0, 138, 139, 140, 141, + 142, 143, 0, 0, 0, 0, 0, 75, 157, 158, + 159, 160, 79, 144, 145, 146, 125, 126, 127, 0, + 128, 129, 130, 131, 132, 133, 134, 135, 202, -483, + 767, 0, 0, 0, 366, 156, 0, 147, 0, 138, + 139, 140, 141, 142, 143, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 144, 145, 146, 0, + 149, 150, 151, 152, 153, 154, 0, 0, 0, 0, + 0, 0, 0, 0, 766, 0, 0, 0, 156, 0, + 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, + 327, 328, 159, 149, 150, 151, 152, 153, 154, 0, + 0, 0, 0, 0, 0, 0, 0, 155, 0, 0, + 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 75, 157, 158, 159, 160, 79, 0, 0, + 0, 125, 126, 127, 0, 128, 129, 130, 131, 132, + 133, 134, 135, 202, -483, 884, 0, 0, 0, 366, + 0, 0, 0, 0, 138, 139, 140, 141, 142, 143, + 0, 0, 0, 0, 0, 75, 157, 158, 159, 160, + 79, 144, 145, 146, 125, 126, 127, 0, 128, 129, + 130, 131, 132, 133, 134, 135, 202, -483, 0, 0, + 0, 0, 366, 0, 0, 147, 0, 138, 139, 140, + 141, 142, 143, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 144, 145, 146, 0, 149, 150, + 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, + 0, 0, 155, 0, 0, 0, 156, 0, 147, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, + 0, 149, 150, 151, 152, 153, 154, 0, 0, 0, + 0, 0, 0, 0, 0, 155, 0, 0, 0, 156, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 75, 157, 158, 159, 160, 79, 0, 0, -353, -353, + -353, 0, 4, 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, 75, 157, 158, 159, 160, 79, 11, + 12, 13, 0, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 0, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 0, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 291, 0, 119, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 326, + -227, 0, 0, 0, 138, 139, 140, 141, 142, 143, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 144, 145, 146, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -617, 0, 0, 0, + 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 12, 13, 0, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 156, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, -111, 0, 119, 0, 0, -111, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 75, 327, 328, 159, 0, 326, 0, 0, 0, 0, + 138, 139, 140, 141, 142, 143, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 144, 145, 146, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 12, 13, 0, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 0, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 156, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 286, + 0, 119, 0, 0, 0, 80, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 75, 327, 328, 159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -486, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, + 13, 0, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 0, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 0, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 0, 0, 119, 11, 12, + 13, 80, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 0, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, -624, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 0, 0, 119, 0, 0, + 0, 80, 0, -626, -626, -626, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -626, 0, 0, 0, 0, 0, 0, 0, 0, + -245, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, -626, -626, -626, 0, -626, -626, + -626, -626, -626, -626, -626, -626, -626, -626, 0, -626, + -626, -626, -626, -626, -626, -626, -626, -626, -626, -626, + -626, -626, -626, -626, 0, -626, -626, -626, -626, -626, + -626, -626, -626, -626, -626, -626, -626, -626, -626, -626, + -626, -626, -626, -626, -626, -626, -626, -626, -626, -626, + -626, -626, -626, -626, -626, -626, -626, -626, -626, -626, + -626, 0, 0, 0, 11, 12, 13, -626, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 0, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 355, 78, 79, 80, 0, 138, + 139, 140, 141, 142, 143, 642, 0, 0, 0, 0, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 0, + 0, 0, 0, 0, 0, 644, 0, 144, 145, 146, + 138, 139, 140, 141, 142, 143, 714, 0, 0, 0, + 147, 715, 716, 717, 718, 719, 720, 144, 145, 146, + 0, 147, 0, 0, 0, 0, 0, 0, 144, 721, + 722, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 156, 723, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 156, 0, -171, -171, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 75, 327, 328, 159, 0, + 0, 0, 0, 0, 0, 0, 75, 327, 328, 159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 75, 327, 328, 159, + 0, 0, 0, 0, 0, 0, 0, 75, 724, 725, + 726, 11, 12, 13, 0, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 3, 0, + 119, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -353, -353, -353, 0, 4, 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, 11, 12, 13, 0, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 3, 0, + 119, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 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, 11, 12, 13, 0, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 0, 0, + 119, -353, -353, -353, 80, 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, 0, 11, 12, 13, 0, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 0, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 0, + 0, 119, 8, 9, 10, 80, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 12, 13, 0, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 0, 0, + 119, 11, 12, 13, 80, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 0, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 0, 0, + 119, 0, 0, 0, 80 +}; + +static const short yycheck[] = { 0, + 0, 463, 3, 88, 105, 364, 495, 0, 366, 125, + 11, 12, 551, 301, 9, 10, 549, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 2, 446, 320, 412, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 411, 652, 401, 402, 621, 403, + 404, 652, 405, 406, 407, 408, 8, 409, 410, 652, + 81, 81, 617, 24, 473, 892, 445, 782, 81, 0, + 785, 449, 3, 34, 19, 5, 7, 413, 99, 774, + 794, 5, 762, 672, 105, 203, 889, 5, 788, 892, + 208, 0, 210, 652, 115, 116, 117, 704, 21, 652, + 121, 25, 25, 704, 222, 1016, 1017, 9, 10, 214, + 5, 704, 898, 28, 493, 85, 137, 1080, 1081, 18, + 18, 25, 26, 144, 28, 24, 699, 86, 87, 44, + 25, 34, 21, 112, 18, 34, 25, 86, 87, 23, + 44, 41, 121, 24, 0, 704, 28, 3, 24, 5, + 81, 704, 979, 34, 981, 5, 56, 116, 117, 8, + 1123, 1100, 44, 1074, 53, 54, 1077, 1106, 882, 1108, + 885, 130, 81, 18, 105, 25, 979, 318, 981, 474, + 602, 690, 203, 21, 773, 137, 972, 776, 203, 24, + 121, 26, 500, 208, 603, 210, 891, 877, 893, 34, + 578, 132, 902, 86, 87, 108, 109, 222, 223, 1120, + 0, 24, 21, 3, 175, 176, 25, 7, 8, 9, + 10, 41, 601, 32, 33, 81, 175, 176, 364, 181, + 175, 176, 177, 560, 179, 180, 56, 189, 8, 95, + 96, 193, 98, 195, 623, 175, 176, 177, 575, 179, + 180, 175, 176, 177, 18, 179, 180, 175, 176, 177, + 21, 179, 180, 284, 25, 121, 652, 24, 289, 984, + 290, 26, 224, 28, 24, 583, 175, 176, 39, 300, + 301, 18, 303, 304, 21, 652, 23, 300, 137, 44, + 799, 81, 175, 176, 175, 176, 317, 652, 652, 652, + 652, 203, 323, 862, 317, 326, 208, 860, 210, 445, + 18, 6, 7, 21, 26, 105, 652, 422, 704, 627, + 222, 223, 34, 441, 345, 175, 176, 177, 22, 179, + 180, 121, 181, 24, 642, 18, 644, 704, 21, 912, + 34, 26, 132, 28, 193, 366, 195, 137, 24, 704, + 704, 704, 704, 24, 21, 26, 963, 493, 25, 44, + 21, 916, 963, 18, 25, 155, 345, 137, 704, 300, + 963, 21, 303, 304, 305, 224, 24, 27, 26, 8, + 9, 10, 49, 50, 24, 24, 317, 27, 49, 50, + 21, 181, 323, 21, 34, 16, 27, 25, 21, 189, + 779, 191, 25, 193, 963, 195, 714, 24, 21, 26, + 963, 181, 25, 203, 37, 38, 29, 437, 208, 189, + 210, 49, 50, 193, 16, 195, 441, 448, 51, 52, + 451, 16, 222, 223, 224, 448, 16, 458, 451, 460, + 18, 462, 463, 21, 465, 15, 21, 25, 24, 470, + 25, 27, 473, 24, 224, 26, 21, 598, 34, 480, + 25, 25, 26, 8, 28, 601, 18, 32, 33, 21, + 422, 492, 858, 34, 495, 18, 497, 39, 21, 500, + 44, 175, 176, 177, 22, 179, 180, 623, 344, 96, + 857, 98, 847, 848, 473, 849, 850, 22, 851, 852, + 853, 854, 22, 855, 856, 24, 29, 26, 137, 28, + 300, 40, 21, 303, 304, 305, 25, 448, 25, 55, + 451, 28, 21, 859, 85, 44, 25, 317, 47, 48, + 461, 19, 463, 323, 465, 175, 176, 21, 178, 441, + 560, 25, 473, 21, 922, 476, 1055, 25, 92, 480, + 49, 50, 181, 92, 1036, 575, 34, 35, 36, 580, + 189, 21, 583, 21, 193, 25, 195, 25, 18, 690, + 22, 21, 34, 422, 203, 596, 597, 963, 368, 208, + 24, 210, 603, 25, 26, 22, 376, 21, 378, 520, + 521, 25, 137, 222, 223, 224, 963, 22, 454, 175, + 176, 622, 178, 67, 68, 69, 627, 559, 963, 963, + 963, 963, 32, 33, 175, 176, 637, 638, 179, 180, + 5, 642, 26, 644, 603, 18, 18, 963, 21, 21, + 34, 21, 422, 25, 21, 25, 181, 191, 25, 24, + 25, 26, 21, 779, 189, 666, 25, 92, 193, 34, + 195, 441, 422, 674, 19, 676, 20, 447, 448, 680, + 681, 451, 18, 92, 685, 21, 37, 38, 689, 690, + 27, 461, 603, 463, 695, 465, 24, 813, 799, 224, + 51, 52, 23, 473, 21, 21, 476, 18, 25, 25, + 480, 999, 18, 714, 18, 24, 24, 26, 138, 139, + 140, 141, 142, 143, 21, 34, 18, 5, 25, 21, + 1089, 690, 22, 175, 176, 177, 695, 179, 180, 21, + 21, 511, 25, 25, 25, 21, 24, 25, 26, 25, + 520, 521, 18, 175, 176, 177, 34, 179, 180, 24, + 24, 26, 37, 38, 675, 25, 677, 18, 769, 34, + 21, 1130, 49, 50, 610, 686, 51, 52, 689, 690, + 34, 35, 36, 904, 24, 18, 26, 18, 28, 559, + 560, 175, 176, 177, 18, 179, 180, 798, 799, 21, + 801, 18, 572, 25, 44, 575, 576, 47, 48, 559, + 175, 176, 177, 422, 179, 180, 34, 35, 36, 18, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 19, 21, 441, 603, 368, 25, 9, 21, 25, 21, + 799, 25, 376, 25, 378, 21, 967, 37, 38, 25, + 11, 21, 97, 24, 99, 25, 101, 11, 103, 53, + 54, 51, 52, 108, 985, 88, 175, 176, 177, 990, + 179, 180, 181, 118, 24, 120, 21, 21, 648, 649, + 965, 25, 652, 42, 43, 1006, 19, 888, 799, 659, + 660, 1012, 662, 88, 895, 21, 19, 422, 809, 25, + 1021, 20, 21, 988, 19, 675, 23, 677, 21, 22, + 175, 176, 177, 447, 179, 180, 686, 162, 19, 689, + 690, 691, 78, 79, 80, 81, 82, 83, 84, 1050, + 1051, 27, 1053, 21, 704, 771, 25, 25, 774, 21, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 559, 119, 24, 121, 1055, 175, 176, 177, 21, 179, + 180, 22, 25, 1084, 132, 133, 21, 135, 18, 137, + 138, 24, 973, 1089, 21, 976, 22, 511, 398, 399, + 400, 25, 150, 976, 21, 11, 21, 23, 25, 1105, + 25, 992, 24, 994, 32, 33, 766, 24, 999, 992, + 24, 1002, 1003, 21, 1125, 21, 1006, 25, 21, 25, + 27, 21, 25, 25, 1130, 25, 34, 35, 36, 21, + 931, 932, 23, 25, 21, 20, 560, 21, 25, 799, + 20, 25, 21, 992, 559, 1036, 25, 1038, 1039, 809, + 19, 575, 576, 21, 289, 21, 19, 25, 293, 25, + 1050, 49, 50, 889, 1055, 891, 892, 893, 72, 73, + 74, 72, 73, 74, 21, 976, 311, 53, 54, 314, + 20, 21, 20, 21, 5, 8, 25, 322, 498, 24, + 325, 992, 21, 22, 995, 125, 1087, 27, 22, 1090, + 175, 176, 1093, 25, 24, 20, 20, 1090, 138, 139, + 140, 141, 142, 143, 18, 145, 146, 27, 25, 18, + 25, 27, 25, 21, 648, 649, 39, 29, 25, 25, + 24, 18, 40, 25, 88, 1036, 660, 24, 55, 25, + 24, 21, 29, 30, 31, 32, 33, 34, 25, 25, + 8, 9, 10, 979, 1055, 981, 1147, 23, 25, 46, + 47, 48, 18, 1154, 25, 18, 18, 691, 18, 88, + 21, 931, 932, 21, 1075, 1076, 88, 22, 20, 20, + 18, 180, 25, 70, 20, 25, 0, 88, 88, 1090, + 20, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 73, 27, 963, 27, 88, 88, 967, 0, 88, + 88, 446, 135, 81, 137, 323, 976, 989, 453, 763, + 1121, 1122, 1066, 458, 111, 460, 1014, 877, 909, 1120, + 990, 990, 992, 468, 828, 995, 1086, 472, 72, 73, + 74, 465, 1090, 583, 78, 79, 80, 81, 82, 83, + 84, 677, 675, 112, 689, 1015, 1016, 1017, 181, 10, + 799, 345, 223, 1060, 1024, 511, 189, 422, 704, 963, + 193, -1, 195, -1, -1, -1, 1036, -1, -1, 137, + 203, -1, -1, -1, -1, -1, -1, -1, 175, 176, + 177, 178, -1, -1, -1, 1055, -1, -1, -1, -1, + -1, 224, -1, -1, -1, 715, 716, 717, 718, 719, + 720, -1, -1, -1, 1074, 1075, 1076, 1077, -1, -1, + 1080, 1081, -1, 181, -1, -1, 1086, -1, -1, -1, + 1090, 189, -1, -1, 364, 193, -1, 195, -1, -1, + -1, -1, 577, -1, -1, 203, -1, -1, -1, -1, + 208, -1, 210, 8, 9, 10, -1, -1, -1, -1, + 1120, 1121, 1122, 1123, 222, 223, 224, 602, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, -1, 621, 72, 73, 74, + -1, 626, -1, 78, 79, 80, 81, 82, 83, 84, + -1, -1, -1, 326, -1, -1, -1, -1, -1, -1, + -1, 334, 335, 336, 337, 445, -1, -1, -1, 654, + -1, -1, -1, -1, -1, -1, -1, -1, 8, 9, + 10, -1, 355, -1, 844, 845, 846, -1, -1, -1, + 358, -1, -1, 366, -1, -1, -1, -1, -1, -1, + -1, -1, 8, 9, 10, -1, -1, -1, -1, -1, + 383, -1, -1, 493, 382, -1, -1, -1, 498, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + -1, -1, 137, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 727, -1, -1, -1, -1, -1, -1, 422, + 418, -1, -1, -1, -1, 24, 429, -1, 27, -1, + 29, 30, 31, 32, 33, 34, 926, -1, -1, 549, + -1, 551, -1, 553, 554, -1, 181, 46, 47, 48, + -1, -1, -1, -1, 189, -1, -1, -1, 193, -1, + 195, -1, -1, -1, -1, -1, -1, -1, 203, 204, + -1, 70, 787, 208, -1, 210, -1, 137, -1, -1, + -1, -1, -1, -1, 422, -1, -1, 222, 223, 224, + -1, 601, -1, 8, 9, 10, -1, -1, -1, -1, + -1, 137, -1, 441, -1, -1, -1, -1, -1, -1, + -1, -1, 111, 623, -1, -1, -1, -1, -1, -1, + -1, 181, -1, -1, -1, -1, -1, -1, -1, 189, + -1, -1, -1, 193, -1, 195, -1, -1, -1, -1, + -1, -1, 652, 203, -1, 181, -1, 550, 208, -1, + 210, -1, -1, 189, -1, -1, 559, 193, -1, 195, + -1, -1, 222, 223, 224, 880, 881, 203, -1, -1, + -1, -1, 208, 888, 210, -1, 175, 176, 177, 178, + -1, -1, -1, 8, 9, 10, 222, 223, 224, -1, + -1, -1, -1, -1, 704, -1, -1, 912, -1, -1, + -1, -1, -1, -1, -1, 715, 716, 717, 718, 719, + 720, 721, 722, -1, 617, -1, -1, -1, -1, -1, + -1, 559, 137, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 634, -1, -1, 642, + -1, 644, -1, -1, -1, -1, 381, 650, -1, -1, + 653, -1, -1, -1, -1, -1, -1, -1, -1, 974, + -1, -1, -1, -1, -1, -1, 181, -1, -1, 779, + -1, -1, -1, -1, 189, -1, -1, -1, 193, -1, + 195, 679, -1, -1, -1, -1, -1, 422, 203, -1, + -1, -1, -1, 208, -1, 210, -1, -1, -1, -1, + 703, -1, -1, 813, -1, -1, 441, 222, 223, 224, + -1, 714, 137, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1040, -1, -1, -1, -1, + -1, -1, -1, -1, 844, 845, 846, 847, 848, 849, + 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, -1, 862, -1, -1, -1, 181, -1, -1, -1, + -1, -1, 422, -1, 189, -1, -1, -1, 193, -1, + 195, -1, -1, -1, -1, -1, -1, -1, 203, -1, + -1, 441, -1, 208, 782, 210, 422, 785, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 222, 223, 224, + -1, -1, -1, -1, -1, 441, -1, -1, -1, -1, + -1, -1, -1, 1128, -1, -1, 926, -1, -1, -1, + -1, -1, -1, -1, 559, -1, 829, -1, -1, 827, + 828, -1, -1, -1, -1, 833, 834, 835, 836, 837, + 838, 839, 840, 841, 842, 843, -1, -1, -1, -1, + -1, -1, -1, 963, 18, -1, -1, -1, -1, -1, + 24, -1, -1, -1, -1, 29, 30, 31, 32, 33, + 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 19, 46, 47, 48, -1, 24, 885, -1, -1, + -1, 29, 30, 31, 32, 33, 34, -1, -1, 559, + -1, -1, -1, -1, -1, -1, 70, 422, 46, 47, + 48, -1, -1, 916, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 559, -1, -1, 441, -1, -1, -1, + -1, -1, 70, 0, 1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 111, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 24, 961, -1, + -1, -1, -1, -1, -1, -1, -1, 34, -1, -1, + -1, -1, -1, 111, -1, -1, -1, -1, 45, 1089, + -1, -1, -1, -1, -1, -1, 984, -1, -1, -1, + -1, -1, -1, -1, -1, 1105, -1, 422, -1, -1, + 67, 68, 69, -1, 71, -1, -1, -1, 75, 76, + 77, 175, 176, 177, 178, -1, 441, -1, -1, -1, + 1130, -1, 89, 90, 91, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 175, 176, 177, + 178, 108, 109, 110, 559, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, -1, 179, 180, 181, 0, 1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 559, -1, -1, -1, -1, 24, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 67, 68, 69, -1, 71, -1, -1, -1, + 75, 76, 77, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 89, 90, 91, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 108, 109, 110, -1, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, -1, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, -1, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 1, 179, 180, 181, -1, 6, 7, + 8, -1, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, -1, -1, -1, 24, -1, -1, -1, + -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, + -1, -1, -1, -1, 42, 43, -1, 45, 46, 47, + 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, + 68, 69, 70, 71, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 93, 94, 95, 96, 97, + 98, -1, -1, -1, -1, -1, -1, -1, -1, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, -1, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + -1, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 1, -1, -1, -1, -1, 6, + 7, 8, -1, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, -1, -1, -1, -1, 24, -1, -1, + -1, -1, 29, 30, 31, 32, 33, 34, -1, -1, + -1, -1, -1, -1, -1, 42, 43, -1, -1, 46, + 47, 48, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 67, 68, 69, 70, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 93, 94, 95, 96, + 97, 98, -1, -1, -1, -1, -1, -1, -1, -1, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 1, -1, -1, -1, -1, + 6, 7, 8, -1, -1, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, -1, -1, -1, 24, -1, + -1, -1, -1, 29, 30, 31, 32, 33, 34, -1, + -1, -1, -1, -1, -1, -1, 42, 43, -1, -1, + 46, 47, 48, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 67, 68, 69, 70, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, -1, + -1, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, -1, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, -1, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 1, -1, -1, -1, + -1, 6, 7, 8, -1, -1, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, -1, -1, -1, 24, + 25, -1, -1, -1, 29, 30, 31, 32, 33, 34, + -1, -1, -1, -1, -1, -1, -1, 42, 43, 1, + -1, 46, 47, 48, 6, 7, 8, -1, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, -1, -1, + -1, -1, 24, -1, -1, 70, -1, 29, 30, 31, + 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, + 42, 43, -1, -1, 46, 47, 48, 92, 93, 94, + 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, + -1, -1, 107, -1, -1, -1, 111, -1, 70, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 92, 93, 94, 95, 96, 97, 98, -1, -1, -1, + -1, -1, -1, -1, -1, 107, -1, -1, -1, 111, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 175, 176, 177, 178, 179, 180, -1, -1, 1, -1, + -1, -1, -1, 6, 7, 8, -1, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, -1, -1, -1, + -1, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, -1, 175, 176, 177, 178, 179, 180, 42, + 43, 1, -1, 46, 47, 48, 6, 7, 8, -1, + -1, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, -1, -1, -1, 24, -1, -1, 70, -1, 29, + 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, + -1, -1, 42, 43, -1, -1, 46, 47, 48, 92, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, -1, 107, -1, -1, -1, 111, -1, + 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 92, 93, 94, 95, 96, 97, 98, -1, + -1, -1, -1, -1, -1, -1, -1, 107, -1, -1, + -1, 111, -1, -1, -1, 19, 20, -1, -1, -1, + 24, -1, -1, -1, -1, 29, 30, 31, 32, 33, + 34, -1, 175, 176, 177, 178, 179, 180, -1, -1, + 1, -1, 46, 47, 48, 6, 7, 8, -1, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + -1, -1, -1, 24, -1, -1, 70, -1, 29, 30, + 31, 32, 33, 34, -1, 175, 176, 177, 178, 179, + 180, 42, 43, 1, -1, 46, 47, 48, 6, 7, + 8, -1, -1, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, -1, -1, -1, 24, 111, -1, 70, + -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, + -1, -1, -1, -1, 42, 43, -1, -1, 46, 47, + 48, -1, 93, 94, 95, 96, 97, 98, -1, -1, + -1, -1, -1, -1, -1, -1, 107, -1, -1, -1, + 111, -1, 70, -1, 19, -1, -1, -1, -1, 24, + -1, -1, -1, -1, 29, 30, 31, 32, 33, 34, + -1, 175, 176, 177, 178, 93, 94, 95, 96, 97, + 98, 46, 47, 48, -1, -1, -1, -1, -1, 107, + -1, -1, -1, 111, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 70, -1, -1, -1, -1, + -1, -1, -1, -1, 175, 176, 177, 178, 179, 180, + -1, -1, 1, -1, -1, -1, -1, 6, 7, 8, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, -1, -1, -1, -1, 24, 111, -1, -1, -1, + 29, 30, 31, 32, 33, 34, -1, 175, 176, 177, + 178, 179, 180, 42, 43, -1, -1, 46, 47, 48, + -1, -1, -1, -1, 24, 25, -1, -1, -1, 29, + 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, + -1, 70, -1, -1, -1, -1, 46, 47, 48, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 175, 176, 177, 178, 93, 94, 95, 96, 97, 98, + 70, -1, -1, -1, -1, -1, -1, -1, 107, 6, + 7, 8, 111, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, -1, -1, -1, 24, -1, -1, + -1, -1, 29, 30, 31, 32, 33, 34, -1, -1, + -1, 111, -1, -1, -1, 42, 43, -1, 45, 46, + 47, 48, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 70, 71, -1, 175, 176, 177, 178, + 179, 180, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 93, 94, 95, 96, + 97, 98, -1, -1, -1, 175, 176, 177, 178, -1, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 6, 7, 8, -1, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + -1, -1, -1, 24, -1, -1, -1, -1, 29, 30, + 31, 32, 33, 34, -1, -1, -1, -1, -1, -1, + -1, 42, 43, -1, 45, 46, 47, 48, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, + 71, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 93, 94, 95, 96, 97, 98, -1, -1, + -1, -1, -1, -1, -1, -1, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, -1, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, -1, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, + 181, 6, 7, 8, -1, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, -1, -1, -1, 24, + -1, -1, -1, -1, 29, 30, 31, 32, 33, 34, + -1, -1, -1, -1, -1, -1, -1, 42, 43, -1, + 45, 46, 47, 48, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 70, 71, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 93, 94, + 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, + -1, -1, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, -1, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, -1, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 6, 7, 8, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, -1, -1, -1, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 46, 47, 48, + 6, 7, 8, -1, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, -1, -1, -1, 24, -1, + -1, 70, -1, 29, 30, 31, 32, 33, 34, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 46, 47, 48, -1, 93, 94, 95, 96, 97, 98, + -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, + -1, -1, 111, -1, 70, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, -1, + -1, 107, -1, -1, -1, 111, -1, -1, -1, -1, + 24, -1, -1, 27, -1, 29, 30, 31, 32, 33, + 34, -1, -1, -1, -1, -1, 175, 176, 177, 178, + 179, 180, 46, 47, 48, 6, 7, 8, -1, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + -1, -1, -1, 24, -1, -1, 70, -1, 29, 30, + 31, 32, 33, 34, -1, -1, -1, -1, -1, 175, + 176, 177, 178, 179, 180, 46, 47, 48, 6, 7, + 8, -1, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, -1, -1, -1, 24, 111, -1, 70, + -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 46, 47, + 48, -1, 93, 94, 95, 96, 97, 98, -1, -1, + -1, -1, -1, -1, -1, -1, 107, -1, -1, -1, + 111, -1, 70, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 175, 176, 177, 178, 93, 94, 95, 96, 97, + 98, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, 111, -1, -1, -1, -1, 24, 25, + -1, -1, -1, 29, 30, 31, 32, 33, 34, -1, + -1, -1, -1, -1, 175, 176, 177, 178, 179, 180, + 46, 47, 48, 6, 7, 8, -1, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, + -1, 24, -1, -1, 70, -1, 29, 30, 31, 32, + 33, 34, -1, -1, -1, -1, -1, 175, 176, 177, + 178, 179, 180, 46, 47, 48, 6, 7, 8, -1, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, -1, -1, -1, 24, 111, -1, 70, -1, 29, + 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 46, 47, 48, -1, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, -1, 107, -1, -1, -1, 111, -1, + 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 175, + 176, 177, 178, 93, 94, 95, 96, 97, 98, -1, + -1, -1, -1, -1, -1, -1, -1, 107, -1, -1, + -1, 111, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 175, 176, 177, 178, 179, 180, -1, -1, + -1, 6, 7, 8, -1, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, -1, -1, -1, 24, + -1, -1, -1, -1, 29, 30, 31, 32, 33, 34, + -1, -1, -1, -1, -1, 175, 176, 177, 178, 179, + 180, 46, 47, 48, 6, 7, 8, -1, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, -1, -1, + -1, -1, 24, -1, -1, 70, -1, 29, 30, 31, + 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 46, 47, 48, -1, 93, 94, + 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, + -1, -1, 107, -1, -1, -1, 111, -1, 70, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, + -1, 93, 94, 95, 96, 97, 98, -1, -1, -1, + -1, -1, -1, -1, -1, 107, -1, -1, -1, 111, + -1, -1, -1, -1, -1, -1, 45, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 175, 176, 177, 178, 179, 180, -1, -1, 67, 68, + 69, -1, 71, -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, 175, 176, 177, 178, 179, 180, 108, + 109, 110, -1, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, -1, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, -1, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 18, -1, 177, -1, + -1, -1, 181, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 45, -1, -1, -1, -1, -1, 24, + 25, -1, -1, -1, 29, 30, 31, 32, 33, 34, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, + -1, 46, 47, 48, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, 70, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 108, 109, 110, -1, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + -1, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 111, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 19, -1, 177, -1, -1, 24, 181, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, + 175, 176, 177, 178, -1, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 71, -1, 46, 47, 48, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 108, 109, 110, -1, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, -1, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 111, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 19, + -1, 177, -1, -1, -1, 181, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 45, 175, 176, 177, 178, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 71, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 108, 109, + 110, -1, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, -1, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, -1, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, -1, -1, 177, 108, 109, + 110, 181, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, -1, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 22, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, -1, -1, 177, -1, -1, + -1, 181, -1, 67, 68, 69, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, + 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 34, -1, -1, -1, 108, 109, 110, -1, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, -1, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, -1, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, -1, -1, -1, 108, 109, 110, 181, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, -1, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, -1, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 24, 179, 180, 181, -1, 29, + 30, 31, 32, 33, 34, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, 46, 47, 48, -1, + -1, -1, -1, -1, -1, 24, -1, 46, 47, 48, + 29, 30, 31, 32, 33, 34, 24, -1, -1, -1, + 70, 29, 30, 31, 32, 33, 34, 46, 47, 48, + -1, 70, -1, -1, -1, -1, -1, -1, 46, 47, + 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 111, 70, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 111, -1, 42, 43, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 175, 176, 177, 178, -1, + -1, -1, -1, -1, -1, -1, 175, 176, 177, 178, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 175, 176, 177, 178, + -1, -1, -1, -1, -1, -1, -1, 175, 176, 177, + 178, 108, 109, 110, -1, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 45, -1, + 177, -1, -1, -1, 181, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 67, 68, 69, -1, 71, -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, 108, 109, 110, -1, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 45, -1, + 177, -1, -1, -1, 181, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 71, -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, 108, 109, 110, -1, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, -1, -1, + 177, 67, 68, 69, 181, -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, 108, 109, 110, -1, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, -1, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, -1, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, -1, + -1, 177, 89, 90, 91, 181, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 108, 109, 110, -1, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, -1, -1, + 177, 108, 109, 110, 181, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, -1, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, -1, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, -1, -1, + 177, -1, -1, -1, 181 +}; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/usr/share/misc/bison.simple" + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +#ifndef alloca +#ifdef __GNUC__ +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) +#include +#else /* not sparc */ +#if defined (MSDOS) && !defined (__TURBOC__) +#include +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +#include + #pragma alloca +#else /* not MSDOS, __TURBOC__, or _AIX */ +#ifdef __hpux +#ifdef __cplusplus +extern "C" { +void *alloca (unsigned int); +}; +#else /* not __cplusplus */ +void *alloca (); +#endif /* not __cplusplus */ +#endif /* __hpux */ +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc. */ +#endif /* not GNU C. */ +#endif /* alloca not defined. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT return(0) +#define YYABORT return(1) +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ +#define YYFAIL goto yyerrlab +#define YYRECOVERING() (!!yyerrstatus) +#define YYBACKUP(token, value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYPURE +#define YYLEX yylex() +#endif + +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYPURE + +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ + +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ +#endif + +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ + +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ + +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +int yyparse (void); +#endif + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (to, from, count) + char *to; + char *from; + int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#else /* __cplusplus */ + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (char *to, char *from, int count) +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#endif +#endif + +#line 196 "/usr/share/misc/bison.simple" + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ + +int +yyparse(YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else +#define YYPOPSTACK (yyvsp--, yyssp--) +#endif + + int yystacksize = YYINITDEPTH; + +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int yylen; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss - 1; + yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif + +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + + /* Get the current used size of the three stacks, in elements. */ + int size = yyssp - yyss + 1; + +#ifdef yyoverflow + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif +#else /* no yyoverflow */ + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + return 2; + } + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; + yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp)); + yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp)); +#endif +#endif /* no yyoverflow */ + + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif + + goto yybackup; + yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif + } + else + { + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; + goto yynewstate; + +/* Do the default action for the current state. */ +yydefault: + + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + +/* Do a reduction. yyn is the number of a rule to reduce with. */ +yyreduce: + yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (yydebug) + { + int i; + + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + + + switch (yyn) { + +case 5: +#line 240 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 6: +#line 241 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 7: +#line 242 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 8: +#line 243 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 9: +#line 244 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 10: +#line 245 "cgrammar.y" +{ uentry_checkDecl (); exprNode_free (yyvsp[0].expr); ; + break;} +case 11: +#line 246 "cgrammar.y" +{ uentry_clearDecl (); ; + break;} +case 12: +#line 250 "cgrammar.y" +{ checkConstant (yyvsp[-6].qtyp, yyvsp[-4].ntyp); ; + break;} +case 13: +#line 252 "cgrammar.y" +{ checkValueConstant (yyvsp[-9].qtyp, yyvsp[-7].ntyp, yyvsp[-3].expr) ; ; + break;} +case 14: +#line 255 "cgrammar.y" +{ context_enterFunctionDecl (); ; + break;} +case 15: +#line 256 "cgrammar.y" +{ declareStaticFunction (yyvsp[-2].ntyp); context_quietExitFunction (); + context_exitFunctionDecl (); ; + break;} +case 16: +#line 261 "cgrammar.y" +{ + qtype qint = qtype_create (ctype_int); + yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, qint); + qtype_free (qint); + ; + break;} +case 17: +#line 267 "cgrammar.y" +{ yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, yyvsp[-2].qtyp); ; + break;} +case 19: +#line 272 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; qtype_adjustPointers (yyvsp[-1].count, idDecl_getTyp (yyval.ntyp)); ; + break;} +case 20: +#line 275 "cgrammar.y" +{ yyval.ntyp = idDecl_create (yyvsp[0].cname, qtype_unknown ()); ; + break;} +case 21: +#line 277 "cgrammar.y" +{ yyval.ntyp = idDecl_expectFunction (yyvsp[-2].ntyp); ; + break;} +case 22: +#line 279 "cgrammar.y" +{ yyval.ntyp = idDecl_replaceCtype (yyvsp[-2].ntyp, ctype_makeArray (idDecl_getCtype (yyvsp[-2].ntyp))); ; + break;} +case 23: +#line 281 "cgrammar.y" +{ + int value; + + if (exprNode_hasValue (yyvsp[-2].expr) + && multiVal_isInt (exprNode_getValue (yyvsp[-2].expr))) + { + value = (int) multiVal_forceInt (exprNode_getValue (yyvsp[-2].expr)); + } + else + { + value = 0; + } + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ctype_makeFixedArray (idDecl_getCtype (yyvsp[-5].ntyp), value)); + ; + break;} +case 24: +#line 297 "cgrammar.y" +{ setCurrentParams (uentryList_missingParams); + ; + break;} +case 25: +#line 300 "cgrammar.y" +{ /* need to support globals and modifies here! */ + ctype ct = ctype_makeFunction (idDecl_getCtype (yyvsp[-5].ntyp), + uentryList_makeMissingParams ()); + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ct); + context_popLoc (); + ; + break;} +case 26: +#line 308 "cgrammar.y" +{ setCurrentParams (yyvsp[-1].entrylist); + ; + break;} +case 27: +#line 311 "cgrammar.y" +{ clearCurrentParams (); + yyval.ntyp = idDecl_replaceCtype (yyvsp[-6].ntyp, ctype_makeFunction (idDecl_getCtype (yyvsp[-6].ntyp), yyvsp[-3].entrylist)); + context_popLoc (); + ; + break;} +case 28: +#line 317 "cgrammar.y" +{ yyval.ntyp = idDecl_create (yyvsp[0].cname, qtype_unknown ()); ; + break;} +case 29: +#line 319 "cgrammar.y" +{ yyval.ntyp = idDecl_expectFunction (yyvsp[-2].ntyp); ; + break;} +case 30: +#line 321 "cgrammar.y" +{ yyval.ntyp = idDecl_replaceCtype (yyvsp[-2].ntyp, ctype_makeArray (idDecl_getCtype (yyvsp[-2].ntyp))); ; + break;} +case 31: +#line 323 "cgrammar.y" +{ + int value; + + if (exprNode_hasValue (yyvsp[-2].expr) + && multiVal_isInt (exprNode_getValue (yyvsp[-2].expr))) + { + value = (int) multiVal_forceInt (exprNode_getValue (yyvsp[-2].expr)); + } + else + { + value = 0; + } + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ctype_makeFixedArray (idDecl_getCtype (yyvsp[-5].ntyp), value)); + ; + break;} +case 32: +#line 339 "cgrammar.y" +{ setCurrentParams (uentryList_missingParams); + ; + break;} +case 33: +#line 342 "cgrammar.y" +{ /* need to support globals and modifies here! */ + ctype ct = ctype_makeFunction (idDecl_getCtype (yyvsp[-5].ntyp), + uentryList_makeMissingParams ()); + + yyval.ntyp = idDecl_replaceCtype (yyvsp[-5].ntyp, ct); + context_popLoc (); + ; + break;} +case 34: +#line 350 "cgrammar.y" +{ setCurrentParams (yyvsp[-1].entrylist); + ; + break;} +case 35: +#line 353 "cgrammar.y" +{ clearCurrentParams (); + yyval.ntyp = idDecl_replaceCtype (yyvsp[-6].ntyp, ctype_makeFunction (idDecl_getCtype (yyvsp[-6].ntyp), yyvsp[-3].entrylist)); + context_popLoc (); + ; + break;} +case 36: +#line 360 "cgrammar.y" +{ setCurrentParams (yyvsp[-1].entrylist); ; + break;} +case 37: +#line 361 "cgrammar.y" +{ clearCurrentParams (); ; + break;} +case 38: +#line 362 "cgrammar.y" +{ declareCIter (yyvsp[-8].cname, yyvsp[-6].entrylist); ; + break;} +case 39: +#line 365 "cgrammar.y" +{ exprNode_checkMacroBody (yyvsp[-1].expr); ; + break;} +case 40: +#line 366 "cgrammar.y" +{ exprNode_checkIterBody (yyvsp[-1].expr); ; + break;} +case 41: +#line 367 "cgrammar.y" +{ exprNode_checkIterEnd (yyvsp[-1].expr); ; + break;} +case 42: +#line 368 "cgrammar.y" +{ exprChecks_checkEmptyMacroBody (); ; + break;} +case 43: +#line 371 "cgrammar.y" +{ declareFunction (yyvsp[0].ntyp); ; + break;} +case 44: +#line 374 "cgrammar.y" +{ setProcessingGlobMods (); ; + break;} +case 45: +#line 375 "cgrammar.y" +{ clearProcessingGlobMods (); ; + break;} +case 46: +#line 378 "cgrammar.y" +{ setProcessingGlobMods (); ; + break;} +case 47: +#line 379 "cgrammar.y" +{ clearProcessingGlobMods (); ; + break;} +case 54: +#line 394 "cgrammar.y" +{ ; ; + break;} +case 55: +#line 395 "cgrammar.y" +{ ; ; + break;} +case 56: +#line 398 "cgrammar.y" +{ globListAdd (yyvsp[0].sr, yyvsp[-1].tquallist); ; + break;} +case 57: +#line 401 "cgrammar.y" +{ yyval.sr = uentry_getSref (yyvsp[0].entry); ; + break;} +case 58: +#line 402 "cgrammar.y" +{ yyval.sr = globListUnrecognized (yyvsp[0].cname); ; + break;} +case 59: +#line 405 "cgrammar.y" +{ yyval.typequal = qual_createUndef (); ; + break;} +case 60: +#line 406 "cgrammar.y" +{ yyval.typequal = qual_createKilled (); ; + break;} +case 61: +#line 407 "cgrammar.y" +{ yyval.typequal = qual_createOut (); ; + break;} +case 62: +#line 408 "cgrammar.y" +{ yyval.typequal = qual_createIn (); ; + break;} +case 63: +#line 409 "cgrammar.y" +{ yyval.typequal = qual_createPartial (); ; + break;} +case 64: +#line 412 "cgrammar.y" +{ yyval.tquallist = qualList_undefined; ; + break;} +case 65: +#line 413 "cgrammar.y" +{ yyval.tquallist = qualList_add (yyvsp[0].tquallist, yyvsp[-1].typequal); ; + break;} +case 66: +#line 416 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 67: +#line 418 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 68: +#line 419 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 69: +#line 421 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 70: +#line 423 "cgrammar.y" +{ setFunctionNoGlobals (); + setFunctionModifies (sRefSet_single (sRef_makeNothing ())); + ; + break;} +case 73: +#line 430 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 74: +#line 432 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 75: +#line 433 "cgrammar.y" +{ setProcessingGlobalsList (); ; + break;} +case 76: +#line 435 "cgrammar.y" +{ unsetProcessingGlobals (); ; + break;} +case 77: +#line 437 "cgrammar.y" +{ setFunctionNoGlobals (); + setFunctionModifies (sRefSet_single (sRef_makeNothing ())); + ; + break;} +case 82: +#line 449 "cgrammar.y" +{ + context_setProtectVars (); enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 83: +#line 454 "cgrammar.y" +{ + setFunctionModifies (yyvsp[0].srset); exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 84: +#line 462 "cgrammar.y" +{ + context_setProtectVars (); enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 85: +#line 467 "cgrammar.y" +{ + setFunctionModifies (yyvsp[0].srset); exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 95: +#line 491 "cgrammar.y" +{ yyval.sck = SP_ISONLY; ; + break;} +case 96: +#line 492 "cgrammar.y" +{ yyval.sck = SP_ISOBSERVER; ; + break;} +case 97: +#line 493 "cgrammar.y" +{ yyval.sck = SP_ISEXPOSED; ; + break;} +case 98: +#line 494 "cgrammar.y" +{ yyval.sck = SP_ISDEPENDENT; ; + break;} +case 99: +#line 495 "cgrammar.y" +{ yyval.sck = SP_ISOWNED; ; + break;} +case 100: +#line 496 "cgrammar.y" +{ yyval.sck = SP_ISSHARED; ; + break;} +case 101: +#line 497 "cgrammar.y" +{ yyval.sck = SP_ISNULL; ; + break;} +case 102: +#line 498 "cgrammar.y" +{ yyval.sck = SP_ISNOTNULL; ; + break;} +case 103: +#line 502 "cgrammar.y" +{ + context_setProtectVars (); + enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 104: +#line 508 "cgrammar.y" +{ + setFunctionSpecialClause (yyvsp[-6].tok, yyvsp[-3].srset, yyvsp[-1].tok); + exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 105: +#line 515 "cgrammar.y" +{ + context_setProtectVars (); + enterParamsTemp (); + sRef_setGlobalScopeSafe (); + ; + break;} +case 106: +#line 521 "cgrammar.y" +{ + setFunctionStateSpecialClause (yyvsp[-7].tok, yyvsp[-5].sck, yyvsp[-3].srset, yyvsp[-1].tok); + exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + ; + break;} +case 107: +#line 530 "cgrammar.y" +{ + qtype qint = qtype_create (ctype_int); + yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, qint); + qtype_free (qint); + ; + break;} +case 108: +#line 536 "cgrammar.y" +{ yyval.ntyp = idDecl_fixBase (yyvsp[0].ntyp, yyvsp[-2].qtyp); ; + break;} +case 109: +#line 539 "cgrammar.y" +{ checkDoneParams (); context_enterInnerContext (); ; + break;} +case 110: +#line 541 "cgrammar.y" +{ + exprNode_checkFunctionBody (yyvsp[0].expr); yyval.expr = yyvsp[0].expr; + context_exitInner (yyvsp[0].expr); + ; + break;} +case 111: +#line 546 "cgrammar.y" +{ doneParams (); context_enterInnerContext (); ; + break;} +case 112: +#line 548 "cgrammar.y" +{ + context_exitInner (yyvsp[0].expr); + exprNode_checkFunctionBody (yyvsp[0].expr); + yyval.expr = yyvsp[0].expr; /* old style */ + ; + break;} +case 113: +#line 556 "cgrammar.y" +{ + context_setFunctionDefined (exprNode_loc (yyvsp[0].expr)); + exprNode_checkFunction (context_getHeader (), yyvsp[0].expr); + context_exitFunction (); + ; + break;} +case 114: +#line 563 "cgrammar.y" +{ yyval.srset = yyvsp[-2].srset; ; + break;} +case 115: +#line 564 "cgrammar.y" +{ yyval.srset = sRefSet_new (); ; + break;} +case 116: +#line 567 "cgrammar.y" +{ yyval.srset = yyvsp[-1].srset; ; + break;} +case 117: +#line 568 "cgrammar.y" +{ yyval.srset = sRefSet_new (); ; + break;} +case 118: +#line 571 "cgrammar.y" +{ yyval.sr = uentry_getSref (yyvsp[0].entry); checkModifiesId (yyvsp[0].entry); ; + break;} +case 119: +#line 572 "cgrammar.y" +{ yyval.sr = fixModifiesId (yyvsp[0].cname); ; + break;} +case 120: +#line 573 "cgrammar.y" +{ yyval.sr = modListArrayFetch (yyvsp[-2].sr, sRef_undefined); ; + break;} +case 121: +#line 574 "cgrammar.y" +{ yyval.sr = modListArrayFetch (yyvsp[-3].sr, yyvsp[-1].sr); ; + break;} +case 122: +#line 575 "cgrammar.y" +{ yyval.sr = modListPointer (yyvsp[0].sr); ; + break;} +case 123: +#line 576 "cgrammar.y" +{ yyval.sr = yyvsp[-1].sr; ; + break;} +case 124: +#line 577 "cgrammar.y" +{ yyval.sr = modListFieldAccess (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 125: +#line 578 "cgrammar.y" +{ yyval.sr = modListArrowAccess (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 126: +#line 582 "cgrammar.y" +{ yyval.sr = yyvsp[0].sr; ; + break;} +case 127: +#line 583 "cgrammar.y" +{ yyval.sr = sRef_makeUnknown (); /* sRef_makeConstant ($1); ? */ ; + break;} +case 128: +#line 587 "cgrammar.y" +{ yyval.srset = sRefSet_single (yyvsp[0].sr); ; + break;} +case 129: +#line 588 "cgrammar.y" +{ yyval.srset = sRefSet_insert (yyvsp[-2].srset, yyvsp[0].sr); ; + break;} +case 130: +#line 592 "cgrammar.y" +{ yyval.sr = checkSpecClausesId (yyvsp[0].entry); ; + break;} +case 131: +#line 594 "cgrammar.y" +{ yyval.sr = fixSpecClausesId (yyvsp[0].cname); ; + break;} +case 132: +#line 595 "cgrammar.y" +{ yyval.sr = sRef_makeAnyArrayFetch (yyvsp[-2].sr); ; + break;} +case 133: +#line 596 "cgrammar.y" +{ yyval.sr = sRef_makeAnyArrayFetch (yyvsp[-3].sr); ; + break;} +case 134: +#line 597 "cgrammar.y" +{ yyval.sr = sRef_constructPointer (yyvsp[0].sr); ; + break;} +case 135: +#line 598 "cgrammar.y" +{ yyval.sr = yyvsp[-1].sr; ; + break;} +case 136: +#line 599 "cgrammar.y" +{ cstring_markOwned (yyvsp[0].cname); + yyval.sr = sRef_buildField (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 137: +#line 601 "cgrammar.y" +{ cstring_markOwned (yyvsp[0].cname); + yyval.sr = sRef_makeArrow (yyvsp[-2].sr, yyvsp[0].cname); ; + break;} +case 138: +#line 606 "cgrammar.y" +{ if (sRef_isValid (yyvsp[0].sr)) { yyval.srset = sRefSet_single (yyvsp[0].sr); } + else { yyval.srset = sRefSet_undefined; } + ; + break;} +case 139: +#line 610 "cgrammar.y" +{ if (sRef_isValid (yyvsp[0].sr)) + { + yyval.srset = sRefSet_insert (yyvsp[-2].srset, yyvsp[0].sr); + } + else + { + yyval.srset = yyvsp[-2].srset; + } + ; + break;} +case 140: +#line 621 "cgrammar.y" +{ yyval.expr = exprNode_fromIdentifier (yyvsp[0].entry); ; + break;} +case 141: +#line 622 "cgrammar.y" +{ yyval.expr = exprNode_fromUIO (yyvsp[0].cname); ; + break;} +case 143: +#line 624 "cgrammar.y" +{ yyval.expr = exprNode_addParens (yyvsp[-2].tok, yyvsp[-1].expr); ; + break;} +case 144: +#line 625 "cgrammar.y" +{ yyval.expr = exprNode_fromIdentifier (coerceId (yyvsp[0].cname)); ; + break;} +case 145: +#line 626 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 147: +#line 630 "cgrammar.y" +{ yyval.expr = exprNode_arrayFetch (yyvsp[-3].expr, yyvsp[-1].expr); ; + break;} +case 148: +#line 631 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-2].expr, exprNodeList_new ()); ; + break;} +case 149: +#line 632 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-3].expr, yyvsp[-1].alist); ; + break;} +case 150: +#line 633 "cgrammar.y" +{ yyval.expr = exprNode_vaArg (yyvsp[-5].tok, yyvsp[-3].expr, yyvsp[-1].qtyp); ; + break;} +case 151: +#line 634 "cgrammar.y" +{ yyval.expr = exprNode_fieldAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 152: +#line 635 "cgrammar.y" +{ yyval.expr = exprNode_arrowAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 153: +#line 636 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 154: +#line 637 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 155: +#line 640 "cgrammar.y" +{ yyval.alist = exprNodeList_singleton (yyvsp[0].expr); ; + break;} +case 156: +#line 641 "cgrammar.y" +{ yyval.alist = exprNodeList_push (yyvsp[-2].alist, yyvsp[0].expr); ; + break;} +case 158: +#line 645 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 159: +#line 646 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 160: +#line 647 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 161: +#line 648 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 162: +#line 649 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 163: +#line 650 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 164: +#line 651 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 165: +#line 652 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 166: +#line 653 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 167: +#line 654 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 168: +#line 657 "cgrammar.y" +{ yyval.cstringlist = cstringList_add (yyvsp[-2].cstringlist, yyvsp[0].cname); ; + break;} +case 169: +#line 658 "cgrammar.y" +{ yyval.cstringlist = cstringList_single (yyvsp[0].cname); ; + break;} +case 170: +#line 662 "cgrammar.y" +{ yyval.expr = exprNode_offsetof (yyvsp[-5].qtyp, yyvsp[-2].cstringlist); ; + break;} +case 171: +#line 665 "cgrammar.y" +{ context_setProtectVars (); ; + break;} +case 172: +#line 666 "cgrammar.y" +{ context_sizeofReleaseVars (); yyval.expr = yyvsp[0].expr; ; + break;} +case 173: +#line 669 "cgrammar.y" +{ yyval.expr = exprNode_sizeofType (yyvsp[-1].qtyp); ; + break;} +case 174: +#line 670 "cgrammar.y" +{ yyval.expr = exprNode_sizeofExpr (yyvsp[0].expr); ; + break;} +case 175: +#line 671 "cgrammar.y" +{ yyval.expr = exprNode_alignofType (yyvsp[-1].qtyp); ; + break;} +case 176: +#line 672 "cgrammar.y" +{ yyval.expr = exprNode_alignofExpr (yyvsp[0].expr); ; + break;} +case 178: +#line 677 "cgrammar.y" +{ yyval.expr = exprNode_cast (yyvsp[-3].tok, yyvsp[0].expr, yyvsp[-2].qtyp); ; + break;} +case 180: +#line 681 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 181: +#line 682 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 182: +#line 683 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 184: +#line 687 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 185: +#line 688 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 187: +#line 692 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 188: +#line 693 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 190: +#line 697 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 191: +#line 698 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 192: +#line 699 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 193: +#line 700 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 195: +#line 704 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 196: +#line 705 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 198: +#line 709 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 200: +#line 713 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 202: +#line 718 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 204: +#line 723 "cgrammar.y" +{ exprNode_produceGuards (yyvsp[-1].expr); + context_enterAndClause (yyvsp[-1].expr); + ; + break;} +case 205: +#line 727 "cgrammar.y" +{ + yyval.expr = exprNode_op (yyvsp[-3].expr, yyvsp[0].expr, yyvsp[-2].tok); + context_exitAndClause (yyval.expr, yyvsp[0].expr); + ; + break;} +case 207: +#line 735 "cgrammar.y" +{ + exprNode_produceGuards (yyvsp[-1].expr); + context_enterOrClause (yyvsp[-1].expr); + ; + break;} +case 208: +#line 740 "cgrammar.y" +{ + yyval.expr = exprNode_op (yyvsp[-3].expr, yyvsp[0].expr, yyvsp[-2].tok); + context_exitOrClause (yyval.expr, yyvsp[0].expr); + ; + break;} +case 210: +#line 747 "cgrammar.y" +{ exprNode_produceGuards (yyvsp[-1].expr); context_enterTrueClause (yyvsp[-1].expr); ; + break;} +case 211: +#line 748 "cgrammar.y" +{ context_enterFalseClause (yyvsp[-4].expr); ; + break;} +case 212: +#line 749 "cgrammar.y" +{ yyval.expr = exprNode_cond (yyvsp[-6].expr, yyvsp[-3].expr, yyvsp[0].expr); context_exitClause (yyvsp[-6].expr, yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 214: +#line 753 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 215: +#line 754 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 216: +#line 755 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 217: +#line 756 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 218: +#line 757 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 219: +#line 758 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 220: +#line 759 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 221: +#line 760 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 222: +#line 761 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 223: +#line 762 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 224: +#line 763 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 226: +#line 767 "cgrammar.y" +{ yyval.expr = exprNode_comma (yyvsp[-2].expr, yyvsp[0].expr); ; + break;} +case 227: +#line 770 "cgrammar.y" +{ yyval.expr = exprNode_undefined; ; + break;} +case 230: +#line 779 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 231: +#line 780 "cgrammar.y" +{ doVaDcl (); yyval.expr = exprNode_makeError (); ; + break;} +case 232: +#line 781 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 233: +#line 784 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 234: +#line 798 "cgrammar.y" +{ + setProcessingVars (yyvsp[-3].qtyp); + processNamedDecl (yyvsp[-1].ntyp); ; + break;} +case 235: +#line 801 "cgrammar.y" +{ unsetProcessingVars (); yyval.expr = yyvsp[-2].expr; ; + break;} +case 236: +#line 803 "cgrammar.y" +{ setProcessingVars (yyvsp[-4].qtyp); processNamedDecl (yyvsp[-2].ntyp); + ; + break;} +case 237: +#line 806 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-2].expr, exprNode_makeInitialization (yyvsp[-8].ntyp, yyvsp[-3].expr)); + unsetProcessingVars (); + ; + break;} +case 238: +#line 810 "cgrammar.y" +{ processNamedDecl (yyvsp[-1].ntyp); yyval.expr = exprNode_makeError (); ; + break;} +case 239: +#line 811 "cgrammar.y" +{ processNamedDecl (yyvsp[-2].ntyp); ; + break;} +case 240: +#line 812 "cgrammar.y" +{ yyval.expr = exprNode_makeInitialization (yyvsp[-5].ntyp, yyvsp[0].expr); ; + break;} +case 241: +#line 816 "cgrammar.y" +{ setProcessingTypedef (yyvsp[0].qtyp); ; + break;} +case 242: +#line 817 "cgrammar.y" +{ unsetProcessingTypedef (); ; + break;} +case 243: +#line 818 "cgrammar.y" +{ /* in the ANSI grammar, semantics unclear */ ; + break;} +case 244: +#line 819 "cgrammar.y" +{ /* in the ANSI grammar, semantics unclear */ ; + break;} +case 245: +#line 822 "cgrammar.y" +{ g_expectingTypeName = TRUE; ; + break;} +case 246: +#line 825 "cgrammar.y" +{ g_expectingTypeName = TRUE; context_pushLoc (); ; + break;} +case 247: +#line 828 "cgrammar.y" +{ ; ; + break;} +case 248: +#line 831 "cgrammar.y" +{ ; ; + break;} +case 249: +#line 832 "cgrammar.y" +{ ; ; + break;} +case 250: +#line 835 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 251: +#line 836 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 253: +#line 840 "cgrammar.y" +{ yyval.expr = exprNode_makeInitBlock (yyvsp[-2].tok, yyvsp[-1].alist); ; + break;} +case 254: +#line 841 "cgrammar.y" +{ yyval.expr = exprNode_makeInitBlock (yyvsp[-3].tok, yyvsp[-2].alist); ; + break;} +case 255: +#line 846 "cgrammar.y" +{ yyval.alist = exprNodeList_singleton (yyvsp[0].expr); ; + break;} +case 256: +#line 848 "cgrammar.y" +{ yyval.alist = exprNodeList_push (yyvsp[-2].alist, yyvsp[0].expr); ; + break;} +case 257: +#line 856 "cgrammar.y" +{ setStorageClass (SCEXTERN); yyval.typequal = qual_createExtern (); ; + break;} +case 258: +#line 857 "cgrammar.y" +{ yyval.typequal = qual_createInline (); ; + break;} +case 259: +#line 858 "cgrammar.y" +{ setStorageClass (SCSTATIC); yyval.typequal = qual_createStatic (); ; + break;} +case 260: +#line 859 "cgrammar.y" +{ yyval.typequal = qual_createAuto (); ; + break;} +case 261: +#line 860 "cgrammar.y" +{ yyval.typequal = qual_createRegister (); ; + break;} +case 262: +#line 863 "cgrammar.y" +{ yyval.typequal = qual_createConst (); ; + break;} +case 263: +#line 864 "cgrammar.y" +{ yyval.typequal = qual_createVolatile (); ; + break;} +case 264: +#line 865 "cgrammar.y" +{ yyval.typequal = qual_createOut (); ; + break;} +case 265: +#line 866 "cgrammar.y" +{ yyval.typequal = qual_createIn (); ; + break;} +case 266: +#line 867 "cgrammar.y" +{ yyval.typequal = qual_createPartial (); ; + break;} +case 267: +#line 868 "cgrammar.y" +{ yyval.typequal = qual_createSpecial (); ; + break;} +case 268: +#line 869 "cgrammar.y" +{ yyval.typequal = qual_createOwned (); ; + break;} +case 269: +#line 870 "cgrammar.y" +{ yyval.typequal = qual_createDependent (); ; + break;} +case 270: +#line 871 "cgrammar.y" +{ yyval.typequal = qual_createYield (); ; + break;} +case 271: +#line 872 "cgrammar.y" +{ yyval.typequal = qual_createTemp (); ; + break;} +case 272: +#line 873 "cgrammar.y" +{ yyval.typequal = qual_createOnly (); ; + break;} +case 273: +#line 874 "cgrammar.y" +{ yyval.typequal = qual_createKeep (); ; + break;} +case 274: +#line 875 "cgrammar.y" +{ yyval.typequal = qual_createKept (); ; + break;} +case 275: +#line 876 "cgrammar.y" +{ yyval.typequal = qual_createShared (); ; + break;} +case 276: +#line 877 "cgrammar.y" +{ yyval.typequal = qual_createUnique (); ; + break;} +case 277: +#line 878 "cgrammar.y" +{ yyval.typequal = qual_createExits (); ; + break;} +case 278: +#line 879 "cgrammar.y" +{ yyval.typequal = qual_createMayExit (); ; + break;} +case 279: +#line 880 "cgrammar.y" +{ yyval.typequal = qual_createTrueExit (); ; + break;} +case 280: +#line 881 "cgrammar.y" +{ yyval.typequal = qual_createFalseExit (); ; + break;} +case 281: +#line 882 "cgrammar.y" +{ yyval.typequal = qual_createNeverExit (); ; + break;} +case 282: +#line 883 "cgrammar.y" +{ yyval.typequal = qual_createNull (); ; + break;} +case 283: +#line 884 "cgrammar.y" +{ yyval.typequal = qual_createRelNull (); ; + break;} +case 284: +#line 885 "cgrammar.y" +{ yyval.typequal = qual_createReturned (); ; + break;} +case 285: +#line 886 "cgrammar.y" +{ yyval.typequal = qual_createExposed (); ; + break;} +case 286: +#line 887 "cgrammar.y" +{ yyval.typequal = qual_createObserver (); ; + break;} +case 287: +#line 888 "cgrammar.y" +{ yyval.typequal = qual_createChecked (); ; + break;} +case 288: +#line 889 "cgrammar.y" +{ yyval.typequal = qual_createCheckMod (); ; + break;} +case 289: +#line 890 "cgrammar.y" +{ yyval.typequal = qual_createUnchecked (); ; + break;} +case 290: +#line 891 "cgrammar.y" +{ yyval.typequal = qual_createCheckedStrict (); ; + break;} +case 291: +#line 892 "cgrammar.y" +{ yyval.typequal = qual_createTrueNull (); ; + break;} +case 292: +#line 893 "cgrammar.y" +{ yyval.typequal = qual_createFalseNull (); ; + break;} +case 293: +#line 894 "cgrammar.y" +{ yyval.typequal = qual_createUnused (); ; + break;} +case 294: +#line 895 "cgrammar.y" +{ yyval.typequal = qual_createExternal (); ; + break;} +case 295: +#line 896 "cgrammar.y" +{ yyval.typequal = qual_createSef (); ; + break;} +case 296: +#line 897 "cgrammar.y" +{ yyval.typequal = qual_createAbstract (); ; + break;} +case 297: +#line 898 "cgrammar.y" +{ yyval.typequal = qual_createConcrete (); ; + break;} +case 298: +#line 899 "cgrammar.y" +{ yyval.typequal = qual_createMutable (); ; + break;} +case 299: +#line 900 "cgrammar.y" +{ yyval.typequal = qual_createImmutable (); ; + break;} +case 300: +#line 901 "cgrammar.y" +{ yyval.typequal = qual_createNotNull (); ; + break;} +case 301: +#line 902 "cgrammar.y" +{ yyval.typequal = qual_createRefCounted (); ; + break;} +case 302: +#line 903 "cgrammar.y" +{ yyval.typequal = qual_createRefs (); ; + break;} +case 303: +#line 904 "cgrammar.y" +{ yyval.typequal = qual_createKillRef (); ; + break;} +case 304: +#line 905 "cgrammar.y" +{ yyval.typequal = qual_createRelDef (); ; + break;} +case 305: +#line 906 "cgrammar.y" +{ yyval.typequal = qual_createNewRef (); ; + break;} +case 306: +#line 907 "cgrammar.y" +{ yyval.typequal = qual_createTempRef (); ; + break;} +case 307: +#line 910 "cgrammar.y" +{ yyval.typequal = qual_createShort (); ; + break;} +case 308: +#line 911 "cgrammar.y" +{ yyval.typequal = qual_createLong (); ; + break;} +case 309: +#line 912 "cgrammar.y" +{ yyval.typequal = qual_createSigned (); ; + break;} +case 310: +#line 913 "cgrammar.y" +{ yyval.typequal = qual_createUnsigned (); ; + break;} +case 317: +#line 922 "cgrammar.y" +{ yyval.ctyp = ctype_unknown; ; + break;} +case 318: +#line 923 "cgrammar.y" +{ yyval.ctyp = ctype_anyintegral; ; + break;} +case 319: +#line 924 "cgrammar.y" +{ yyval.ctyp = ctype_unsignedintegral; ; + break;} +case 320: +#line 925 "cgrammar.y" +{ yyval.ctyp = ctype_signedintegral; ; + break;} +case 324: +#line 929 "cgrammar.y" +{ yyval.ctyp = ctype_fromQual (yyvsp[-1].typequal); ; + break;} +case 325: +#line 933 "cgrammar.y" +{ yyval.qtyp = qtype_resolve (yyvsp[-1].qtyp); ; + break;} +case 326: +#line 936 "cgrammar.y" +{ yyval.qtyp = yyvsp[0].qtyp; ; + break;} +case 327: +#line 938 "cgrammar.y" +{ yyval.qtyp = qtype_mergeAlt (yyvsp[-3].qtyp, yyvsp[-1].qtyp); ; + break;} +case 329: +#line 943 "cgrammar.y" +{ yyval.qtyp = qtype_mergeAlt (yyvsp[-2].qtyp, yyvsp[0].qtyp); ; + break;} +case 330: +#line 946 "cgrammar.y" +{ yyval.qtyp = qtype_addQual (yyvsp[0].qtyp, yyvsp[-1].typequal); ; + break;} +case 331: +#line 947 "cgrammar.y" +{ yyval.qtyp = qtype_addQual (yyvsp[0].qtyp, yyvsp[-1].typequal); ; + break;} +case 332: +#line 948 "cgrammar.y" +{ yyval.qtyp = qtype_combine (yyvsp[0].qtyp, yyvsp[-1].ctyp); ; + break;} +case 333: +#line 951 "cgrammar.y" +{ yyval.qtyp = qtype_unknown (); ; + break;} +case 334: +#line 952 "cgrammar.y" +{ yyval.qtyp = yyvsp[0].qtyp; ; + break;} +case 335: +#line 955 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 336: +#line 957 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 337: +#line 959 "cgrammar.y" +{ yyval.ctyp = declareStruct (yyvsp[-8].cname, yyvsp[-3].flist); ; + break;} +case 338: +#line 960 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 339: +#line 962 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 340: +#line 964 "cgrammar.y" +{ yyval.ctyp = declareUnion (yyvsp[-8].cname, yyvsp[-3].flist); ; + break;} +case 341: +#line 966 "cgrammar.y" +{ yyval.ctyp = declareStruct (yyvsp[-3].cname, uentryList_new ()); ; + break;} +case 342: +#line 968 "cgrammar.y" +{ yyval.ctyp = declareUnion (yyvsp[-3].cname, uentryList_new ()); ; + break;} +case 343: +#line 969 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 344: +#line 971 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 345: +#line 973 "cgrammar.y" +{ yyval.ctyp = declareUnnamedStruct (yyvsp[-3].flist); ; + break;} +case 346: +#line 974 "cgrammar.y" +{ sRef_setGlobalScopeSafe (); ; + break;} +case 347: +#line 976 "cgrammar.y" +{ sRef_clearGlobalScopeSafe (); ; + break;} +case 348: +#line 978 "cgrammar.y" +{ yyval.ctyp = declareUnnamedUnion (yyvsp[-3].flist); ; + break;} +case 349: +#line 980 "cgrammar.y" +{ yyval.ctyp = ctype_createUnnamedStruct (uentryList_new ()); ; + break;} +case 350: +#line 982 "cgrammar.y" +{ yyval.ctyp = ctype_createUnnamedUnion (uentryList_new ()); ; + break;} +case 351: +#line 983 "cgrammar.y" +{ yyval.ctyp = handleStruct (yyvsp[-1].cname); ; + break;} +case 352: +#line 984 "cgrammar.y" +{ yyval.ctyp = handleUnion (yyvsp[-1].cname); ; + break;} +case 353: +#line 987 "cgrammar.y" +{ g_expectingTypeName = FALSE; ; + break;} +case 355: +#line 991 "cgrammar.y" +{ yyval.flist = uentryList_undefined; /* bogus! */ ; + break;} +case 356: +#line 992 "cgrammar.y" +{ yyval.flist = uentryList_mergeFields (yyvsp[-1].flist, yyvsp[0].flist); ; + break;} +case 357: +#line 996 "cgrammar.y" +{ yyval.flist = fixUentryList (yyvsp[-2].ntyplist, yyvsp[-4].qtyp); ; + break;} +case 358: +#line 998 "cgrammar.y" +{ yyval.flist = fixUnnamedDecl (yyvsp[-2].qtyp); ; + break;} +case 359: +#line 1002 "cgrammar.y" +{ yyval.ntyplist = idDeclList_singleton (yyvsp[-1].ntyp); ; + break;} +case 360: +#line 1004 "cgrammar.y" +{ yyval.ntyplist = idDeclList_add (yyvsp[-3].ntyplist, yyvsp[-1].ntyp); ; + break;} +case 361: +#line 1007 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; ; + break;} +case 362: +#line 1008 "cgrammar.y" +{ yyval.ntyp = idDecl_undefined; ; + break;} +case 363: +#line 1009 "cgrammar.y" +{ yyval.ntyp = yyvsp[-3].ntyp; ; + break;} +case 364: +#line 1014 "cgrammar.y" +{ yyval.ctyp = declareUnnamedEnum (yyvsp[-2].enumnamelist); ; + break;} +case 365: +#line 1015 "cgrammar.y" +{ context_pushLoc (); ; + break;} +case 366: +#line 1016 "cgrammar.y" +{ context_popLoc (); yyval.ctyp = declareEnum (yyvsp[-5].cname, yyvsp[-2].enumnamelist); ; + break;} +case 367: +#line 1017 "cgrammar.y" +{ yyval.ctyp = handleEnum (yyvsp[-1].cname); ; + break;} +case 368: +#line 1021 "cgrammar.y" +{ yyval.enumnamelist = enumNameList_single (yyvsp[0].cname); ; + break;} +case 369: +#line 1023 "cgrammar.y" +{ yyval.enumnamelist = enumNameList_push (yyvsp[-2].enumnamelist, yyvsp[0].cname); ; + break;} +case 371: +#line 1028 "cgrammar.y" +{ uentry ue = uentry_makeEnumConstant (yyvsp[0].cname, ctype_unknown); + usymtab_supGlobalEntry (ue); + yyval.cname = yyvsp[0].cname; + ; + break;} +case 372: +#line 1033 "cgrammar.y" +{ uentry ue = uentry_makeEnumInitializedConstant (yyvsp[-3].cname, ctype_unknown, yyvsp[0].expr); + usymtab_supGlobalEntry (ue); + yyval.cname = yyvsp[-3].cname; + ; + break;} +case 374: +#line 1040 "cgrammar.y" +{ yyval.ntyp = idDecl_create (cstring_undefined, qtype_create (yyvsp[0].ctyp)); ; + break;} +case 375: +#line 1042 "cgrammar.y" +{ + qtype qt = qtype_unknown (); + + qtype_adjustPointers (yyvsp[-1].count, qt); + yyval.ntyp = idDecl_create (cstring_copy (LastIdentifier ()), qt); + ; + break;} +case 376: +#line 1049 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; qtype_adjustPointers (yyvsp[-1].count, idDecl_getTyp (yyval.ntyp)); ; + break;} +case 378: +#line 1054 "cgrammar.y" +{ yyval.ntyp = yyvsp[0].ntyp; qtype_adjustPointers (yyvsp[-1].count, idDecl_getTyp (yyval.ntyp)); ; + break;} +case 379: +#line 1057 "cgrammar.y" +{ yyval.entrylist = handleParamTypeList (yyvsp[0].entrylist); ; + break;} +case 380: +#line 1058 "cgrammar.y" +{ yyval.entrylist = handleParamIdList (yyvsp[0].entrylist); ; + break;} +case 381: +#line 1061 "cgrammar.y" +{ /* ignored for now */; ; + break;} +case 382: +#line 1062 "cgrammar.y" +{ ; ; + break;} +case 383: +#line 1065 "cgrammar.y" +{ ; ; + break;} +case 384: +#line 1066 "cgrammar.y" +{ ; ; + break;} +case 385: +#line 1069 "cgrammar.y" +{ yyval.count = 1; ; + break;} +case 386: +#line 1070 "cgrammar.y" +{ yyval.count = 1; ; + break;} +case 387: +#line 1071 "cgrammar.y" +{ yyval.count = 1 + yyvsp[0].count; ; + break;} +case 388: +#line 1072 "cgrammar.y" +{ yyval.count = 1 + yyvsp[0].count; ; + break;} +case 390: +#line 1076 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-2].entrylist, uentry_makeElipsisMarker ()); ; + break;} +case 391: +#line 1079 "cgrammar.y" +{ yyval.entrylist = uentryList_single (uentry_makeVariableLoc (yyvsp[0].cname, ctype_int)); ; + break;} +case 392: +#line 1080 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-2].entrylist, uentry_makeVariableLoc (yyvsp[0].cname, ctype_int)); ; + break;} +case 393: +#line 1083 "cgrammar.y" +{ yyval.entrylist = uentryList_single (uentry_makeElipsisMarker ()); ; + break;} +case 395: +#line 1085 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-2].entrylist, uentry_makeElipsisMarker ()); ; + break;} +case 396: +#line 1088 "cgrammar.y" +{ storeLoc (); ; + break;} +case 397: +#line 1088 "cgrammar.y" +{ yyval.entrylist = uentryList_single (yyvsp[0].oentry); ; + break;} +case 398: +#line 1089 "cgrammar.y" +{ storeLoc (); ; + break;} +case 399: +#line 1090 "cgrammar.y" +{ yyval.entrylist = uentryList_add (yyvsp[-3].entrylist, yyvsp[0].oentry); ; + break;} +case 400: +#line 1094 "cgrammar.y" +{ + if (isFlipOldStyle ()) + { + llparseerror (cstring_makeLiteral ("Inconsistent function parameter syntax (mixing old and new style declaration)")); + } + else + { + setNewStyle (); + } + yyval.oentry = makeCurrentParam (idDecl_fixParamBase (yyvsp[-1].ntyp, yyvsp[-2].qtyp)); + ; + break;} +case 401: +#line 1106 "cgrammar.y" +{ + idDecl tparam = idDecl_create (yyvsp[0].cname, qtype_unknown ()); + + if (isNewStyle ()) + { + llparseerror (message ("Inconsistent function parameter syntax: %q", + idDecl_unparse (tparam))); + } + + setFlipOldStyle (); + yyval.oentry = makeCurrentParam (tparam); + idDecl_free (tparam); + ; + break;} +case 403: +#line 1122 "cgrammar.y" +{ yyval.qtyp = qtype_newBase (yyvsp[-1].qtyp, yyvsp[0].ctyp); ; + break;} +case 404: +#line 1125 "cgrammar.y" +{ yyval.ctyp = ctype_adjustPointers (yyvsp[0].count, ctype_unknown); ; + break;} +case 406: +#line 1127 "cgrammar.y" +{ yyval.ctyp = ctype_adjustPointers (yyvsp[-1].count, yyvsp[0].ctyp); ; + break;} +case 407: +#line 1130 "cgrammar.y" +{ yyval.ctyp = ctype_unknown; ; + break;} +case 409: +#line 1135 "cgrammar.y" +{ yyval.ctyp = ctype_expectFunction (yyvsp[-1].ctyp); ; + break;} +case 410: +#line 1136 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (ctype_unknown); ; + break;} +case 411: +#line 1137 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (ctype_unknown); ; + break;} +case 412: +#line 1138 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (yyvsp[-2].ctyp); ; + break;} +case 413: +#line 1139 "cgrammar.y" +{ yyval.ctyp = ctype_makeArray (yyvsp[-3].ctyp); ; + break;} +case 414: +#line 1141 "cgrammar.y" +{ yyval.ctyp = ctype_makeFunction (ctype_unknown, uentryList_makeMissingParams ()); ; + break;} +case 415: +#line 1143 "cgrammar.y" +{ yyval.ctyp = ctype_makeParamsFunction (ctype_unknown, yyvsp[-1].entrylist); ; + break;} +case 416: +#line 1145 "cgrammar.y" +{ yyval.ctyp = ctype_makeFunction (yyvsp[-3].ctyp, uentryList_makeMissingParams ()); ; + break;} +case 417: +#line 1147 "cgrammar.y" +{ yyval.ctyp = ctype_makeParamsFunction (yyvsp[-4].ctyp, yyvsp[-1].entrylist); ; + break;} +case 427: +#line 1163 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 430: +#line 1171 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 431: +#line 1175 "cgrammar.y" +{ yyval.expr = exprNode_while (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 432: +#line 1177 "cgrammar.y" +{ yyval.expr = exprNode_doWhile (yyvsp[-5].expr, yyvsp[-2].expr); ; + break;} +case 433: +#line 1179 "cgrammar.y" +{ yyval.expr = exprNode_doWhile (yyvsp[-4].expr, yyvsp[-1].expr); ; + break;} +case 434: +#line 1181 "cgrammar.y" +{ yyval.expr = exprNode_for (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 435: +#line 1185 "cgrammar.y" +{ context_setProtectVars (); ; + break;} +case 436: +#line 1185 "cgrammar.y" +{ context_sizeofReleaseVars (); ; + break;} +case 437: +#line 1187 "cgrammar.y" +{ yyval.expr = exprNode_forPred (yyvsp[-7].expr, yyvsp[-5].expr, yyvsp[-2].expr); + context_enterForClause (yyvsp[-5].expr); ; + break;} +case 438: +#line 1192 "cgrammar.y" +{ setProcessingIterVars (yyvsp[-2].entry); ; + break;} +case 439: +#line 1194 "cgrammar.y" +{ yyval.expr = exprNode_iterStart (yyvsp[-5].entry, yyvsp[-1].alist); ; + break;} +case 440: +#line 1195 "cgrammar.y" +{ yyval.expr = exprNode_createId (yyvsp[0].entry); ; + break;} +case 444: +#line 1201 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 452: +#line 1209 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; ; + break;} +case 453: +#line 1210 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 454: +#line 1214 "cgrammar.y" +{ /* don't: context_exitTrueClause ($1, $2); */ + yyval.expr = exprNode_if (yyvsp[-1].expr, yyvsp[0].expr); + ; + break;} +case 455: +#line 1219 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 456: +#line 1222 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 467: +#line 1237 "cgrammar.y" +{ yyval.expr = exprNode_addParens (yyvsp[-2].tok, yyvsp[-1].expr); ; + break;} +case 469: +#line 1239 "cgrammar.y" +{ yyval.expr = exprNode_makeError (); ; + break;} +case 470: +#line 1242 "cgrammar.y" +{ yyval.expr = exprNode_labelMarker (yyvsp[-1].cname); ; + break;} +case 471: +#line 1243 "cgrammar.y" +{ yyval.expr = exprNode_notReached (yyvsp[0].expr); ; + break;} +case 472: +#line 1249 "cgrammar.y" +{ context_enterCaseClause (yyvsp[0].expr); ; + break;} +case 473: +#line 1250 "cgrammar.y" +{ yyval.expr = exprNode_caseMarker (yyvsp[-2].expr, FALSE); ; + break;} +case 474: +#line 1251 "cgrammar.y" +{ context_enterCaseClause (yyvsp[0].expr); ; + break;} +case 475: +#line 1252 "cgrammar.y" +{ yyval.expr = exprNode_caseMarker (yyvsp[-2].expr, TRUE); ; + break;} +case 476: +#line 1255 "cgrammar.y" +{ context_enterCaseClause (exprNode_undefined); ; + break;} +case 477: +#line 1256 "cgrammar.y" +{ yyval.expr = exprNode_defaultMarker (yyvsp[-2].tok, FALSE); ; + break;} +case 478: +#line 1257 "cgrammar.y" +{ context_enterCaseClause (exprNode_undefined); ; + break;} +case 479: +#line 1258 "cgrammar.y" +{ yyval.expr = exprNode_defaultMarker (yyvsp[-2].tok, TRUE); ; + break;} +case 480: +#line 1261 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; ; + break;} +case 481: +#line 1263 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; context_exitInner (yyvsp[0].expr); ; + break;} +case 482: +#line 1266 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; ; + break;} +case 483: +#line 1269 "cgrammar.y" +{ context_enterInnerContext (); ; + break;} +case 484: +#line 1272 "cgrammar.y" +{ context_exitInnerPlain (); ; + break;} +case 485: +#line 1275 "cgrammar.y" +{ context_enterStructInnerContext (); ; + break;} +case 486: +#line 1278 "cgrammar.y" +{ context_exitStructInnerContext (); ; + break;} +case 487: +#line 1281 "cgrammar.y" +{ context_exitInnerSafe (); ; + break;} +case 488: +#line 1284 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 489: +#line 1285 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_createTok (yyvsp[0].tok)); ; + break;} +case 490: +#line 1286 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 491: +#line 1288 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_updateLocation (yyvsp[-2].expr, lltok_getLoc (yyvsp[0].tok))); ; + break;} +case 492: +#line 1289 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 493: +#line 1291 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_updateLocation (yyvsp[-2].expr, lltok_getLoc (yyvsp[0].tok))); ; + break;} +case 494: +#line 1293 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (exprNode_concat (yyvsp[-2].expr, yyvsp[-1].expr), lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 495: +#line 1295 "cgrammar.y" +{ yyval.expr = exprNode_notReached (exprNode_updateLocation (exprNode_concat (yyvsp[-3].expr, yyvsp[-2].expr), + lltok_getLoc (yyvsp[-1].tok))); + ; + break;} +case 496: +#line 1302 "cgrammar.y" +{ yyval.expr = exprNode_makeBlock (yyvsp[0].expr); ; + break;} +case 497: +#line 1306 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 498: +#line 1308 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 499: +#line 1310 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (yyvsp[-1].expr, lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 500: +#line 1312 "cgrammar.y" +{ yyval.expr = exprNode_updateLocation (exprNode_concat (yyvsp[-2].expr, yyvsp[-1].expr), lltok_getLoc (yyvsp[0].tok)); ; + break;} +case 502: +#line 1316 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 503: +#line 1319 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 504: +#line 1320 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 505: +#line 1323 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 506: +#line 1324 "cgrammar.y" +{ yyval.expr = exprNode_concat (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 507: +#line 1327 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 508: +#line 1328 "cgrammar.y" +{ yyval.expr = exprNode_statement (yyvsp[-1].expr); ; + break;} +case 509: +#line 1331 "cgrammar.y" +{ yyval.expr = exprNode_createTok (yyvsp[0].tok); ; + break;} +case 510: +#line 1332 "cgrammar.y" +{ yyval.expr = exprNode_statement (yyvsp[-1].expr); ; + break;} +case 511: +#line 1333 "cgrammar.y" +{ yyval.expr = exprNode_checkExpr (yyvsp[0].expr); ; + break;} +case 512: +#line 1337 "cgrammar.y" +{ yyval.expr = yyvsp[-1].expr; exprNode_produceGuards (yyvsp[-1].expr); context_enterTrueClause (yyvsp[-1].expr); ; + break;} +case 513: +#line 1345 "cgrammar.y" +{ + context_exitTrueClause (yyvsp[-1].expr, yyvsp[0].expr); + yyval.expr = exprNode_if (yyvsp[-1].expr, yyvsp[0].expr); + ; + break;} +case 514: +#line 1349 "cgrammar.y" +{ context_enterFalseClause (yyvsp[-2].expr); ; + break;} +case 515: +#line 1350 "cgrammar.y" +{ + context_exitClause (yyvsp[-4].expr, yyvsp[-3].expr, yyvsp[0].expr); + yyval.expr = exprNode_ifelse (yyvsp[-4].expr, yyvsp[-3].expr, yyvsp[0].expr); + ; + break;} +case 516: +#line 1354 "cgrammar.y" +{ context_enterSwitch (yyvsp[0].expr); ; + break;} +case 517: +#line 1355 "cgrammar.y" +{ yyval.expr = exprNode_switch (yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 518: +#line 1359 "cgrammar.y" +{ yyval.expr = exprNode_whilePred (yyvsp[-1].expr); context_enterWhileClause (yyvsp[-1].expr); ; + break;} +case 519: +#line 1363 "cgrammar.y" +{ yyval.expr = exprNode_whilePred(yyvsp[-1].expr); ; + break;} +case 520: +#line 1366 "cgrammar.y" +{ context_enterIterClause (); ; + break;} +case 521: +#line 1367 "cgrammar.y" +{ setProcessingIterVars (yyvsp[-3].entry); ; + break;} +case 522: +#line 1370 "cgrammar.y" +{ + yyval.expr = exprNode_iter (yyvsp[-9].entry, yyvsp[-4].alist, yyvsp[-2].expr, yyvsp[-1].entry); + + ; + break;} +case 523: +#line 1376 "cgrammar.y" +{ yyval.alist = exprNodeList_singleton (yyvsp[0].expr); ; + break;} +case 524: +#line 1377 "cgrammar.y" +{ nextIterParam (); ; + break;} +case 525: +#line 1378 "cgrammar.y" +{ yyval.alist = exprNodeList_push (yyvsp[-3].alist, yyvsp[0].expr); ; + break;} +case 526: +#line 1381 "cgrammar.y" +{ yyval.expr = exprNode_iterExpr (yyvsp[0].expr); ; + break;} +case 527: +#line 1382 "cgrammar.y" +{ yyval.expr = exprNode_iterId (yyvsp[0].entry); ; + break;} +case 528: +#line 1383 "cgrammar.y" +{ uentry ue = coerceIterId (yyvsp[0].cname); + + if (uentry_isValid (ue)) + { + yyval.expr = exprNode_iterId (ue); + } + else + { + yyval.expr = exprNode_iterNewId (cstring_copy (LastIdentifier ())); + } + ; + break;} +case 529: +#line 1394 "cgrammar.y" +{ yyval.expr = exprNode_iterNewId (yyvsp[0].cname); ; + break;} +case 531: +#line 1402 "cgrammar.y" +{ yyval.expr = exprNode_addParens (yyvsp[-2].tok, yyvsp[-1].expr); ; + break;} +case 533: +#line 1406 "cgrammar.y" +{ yyval.expr = exprNode_arrayFetch (yyvsp[-3].expr, yyvsp[-1].expr); ; + break;} +case 534: +#line 1407 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-2].expr, exprNodeList_new ()); ; + break;} +case 535: +#line 1408 "cgrammar.y" +{ yyval.expr = exprNode_functionCall (yyvsp[-3].expr, yyvsp[-1].alist); ; + break;} +case 536: +#line 1410 "cgrammar.y" +{ yyval.expr = exprNode_vaArg (yyvsp[-5].tok, yyvsp[-3].expr, yyvsp[-1].qtyp); ; + break;} +case 537: +#line 1411 "cgrammar.y" +{ yyval.expr = exprNode_fieldAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 538: +#line 1412 "cgrammar.y" +{ yyval.expr = exprNode_arrowAccess (yyvsp[-4].expr, yyvsp[-1].cname); ; + break;} +case 539: +#line 1413 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 540: +#line 1414 "cgrammar.y" +{ yyval.expr = exprNode_postOp (yyvsp[-1].expr, yyvsp[0].tok); ; + break;} +case 542: +#line 1418 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 543: +#line 1419 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 544: +#line 1420 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 545: +#line 1421 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 546: +#line 1422 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 547: +#line 1423 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 548: +#line 1424 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 549: +#line 1425 "cgrammar.y" +{ yyval.expr = exprNode_preOp (yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 550: +#line 1426 "cgrammar.y" +{ yyval.expr = yyvsp[0].expr; ; + break;} +case 552: +#line 1430 "cgrammar.y" +{ yyval.expr = exprNode_cast (yyvsp[-3].tok, yyvsp[0].expr, yyvsp[-2].qtyp); ; + break;} +case 554: +#line 1434 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 555: +#line 1435 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 556: +#line 1436 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 558: +#line 1440 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 559: +#line 1441 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 561: +#line 1445 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 562: +#line 1446 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 564: +#line 1450 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 565: +#line 1451 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 566: +#line 1452 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 567: +#line 1453 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 569: +#line 1457 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 570: +#line 1458 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 572: +#line 1462 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 574: +#line 1466 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 576: +#line 1471 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 578: +#line 1475 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 580: +#line 1479 "cgrammar.y" +{ yyval.expr = exprNode_op (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 582: +#line 1483 "cgrammar.y" +{ context_enterTrueClause (yyvsp[-1].expr); ; + break;} +case 583: +#line 1484 "cgrammar.y" +{ context_enterFalseClause (yyvsp[-4].expr); ; + break;} +case 584: +#line 1485 "cgrammar.y" +{ yyval.expr = exprNode_cond (yyvsp[-6].expr, yyvsp[-3].expr, yyvsp[0].expr); ; + break;} +case 586: +#line 1489 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 587: +#line 1490 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 588: +#line 1491 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 589: +#line 1492 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 590: +#line 1493 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 591: +#line 1494 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 592: +#line 1495 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 593: +#line 1496 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 594: +#line 1497 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 595: +#line 1498 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 596: +#line 1499 "cgrammar.y" +{ yyval.expr = exprNode_assign (yyvsp[-2].expr, yyvsp[0].expr, yyvsp[-1].tok); ; + break;} +case 597: +#line 1502 "cgrammar.y" +{ yyval.entry = yyvsp[0].entry; ; + break;} +case 598: +#line 1503 "cgrammar.y" +{ yyval.entry = uentry_undefined; ; + break;} +case 599: +#line 1506 "cgrammar.y" +{ context_enterDoWhileClause (); yyval.tok = yyvsp[0].tok; ; + break;} +case 600: +#line 1510 "cgrammar.y" +{ yyval.expr = exprNode_while (yyvsp[-1].expr, yyvsp[0].expr); context_exitWhileClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 601: +#line 1512 "cgrammar.y" +{ yyval.expr = exprNode_statement (exprNode_doWhile (yyvsp[-5].expr, yyvsp[-2].expr)); ; + break;} +case 602: +#line 1514 "cgrammar.y" +{ yyval.expr = exprNode_for (yyvsp[-1].expr, yyvsp[0].expr); context_exitForClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 603: +#line 1517 "cgrammar.y" +{ yyval.expr = exprNode_while (yyvsp[-1].expr, yyvsp[0].expr); context_exitWhileClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 604: +#line 1519 "cgrammar.y" +{ yyval.expr = exprNode_statement (exprNode_doWhile (yyvsp[-5].expr, yyvsp[-2].expr)); ; + break;} +case 605: +#line 1521 "cgrammar.y" +{ yyval.expr = exprNode_doWhile (yyvsp[-4].expr, yyvsp[-1].expr); ; + break;} +case 606: +#line 1522 "cgrammar.y" +{ yyval.expr = exprNode_for (yyvsp[-1].expr, yyvsp[0].expr); context_exitForClause (yyvsp[-1].expr, yyvsp[0].expr); ; + break;} +case 607: +#line 1525 "cgrammar.y" +{ yyval.expr = exprNode_goto (yyvsp[-1].cname); ; + break;} +case 608: +#line 1526 "cgrammar.y" +{ yyval.expr = exprNode_continue (yyvsp[-1].tok, BADTOK); ; + break;} +case 609: +#line 1528 "cgrammar.y" +{ yyval.expr = exprNode_continue (yyvsp[-2].tok, QINNERCONTINUE); ; + break;} +case 610: +#line 1529 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, BADTOK); ; + break;} +case 611: +#line 1530 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QSWITCHBREAK); ; + break;} +case 612: +#line 1531 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QLOOPBREAK); ; + break;} +case 613: +#line 1532 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QINNERBREAK); ; + break;} +case 614: +#line 1533 "cgrammar.y" +{ yyval.expr = exprNode_break (yyvsp[-1].tok, QSAFEBREAK); ; + break;} +case 615: +#line 1534 "cgrammar.y" +{ yyval.expr = exprNode_nullReturn (yyvsp[-1].tok); ; + break;} +case 616: +#line 1535 "cgrammar.y" +{ yyval.expr = exprNode_return (yyvsp[-1].expr); ; + break;} +case 618: +#line 1539 "cgrammar.y" +{ ; ; + break;} +case 621: +#line 1546 "cgrammar.y" +{ yyval.cname = uentry_getName (yyvsp[0].entry); ; + break;} +case 622: +#line 1547 "cgrammar.y" +{ yyval.cname = uentry_getName (yyvsp[0].entry); ; + break;} +case 623: +#line 1548 "cgrammar.y" +{ yyval.cname = uentry_getName (yyvsp[0].entry); ; + break;} +case 624: +#line 1549 "cgrammar.y" +{ yyval.cname = yyvsp[0].cname; ; + break;} +case 626: +#line 1553 "cgrammar.y" +{ yyval.ctyp = ctype_unknown; ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 498 "/usr/share/misc/bison.simple" + + yyvsp -= yylen; + yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; + +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTBASE]; + + goto yynewstate; + +yyerrlab: /* here on detecting error */ + + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++yynerrs; + +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + free(msg); + } + else + yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("parse error"); + } + + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ + + if (yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif + + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token + after shifting the error token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto yyerrhandle; + +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif + +yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; + + if (yyn == YYFINAL) + YYACCEPT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + yystate = yyn; + goto yynewstate; +} +#line 1555 "cgrammar.y" + + +/*@-redecl@*/ +extern char *yytext; +/*@=redecl@*/ + +# include "bison.reset" + +void yyerror (/*@unused@*/ char *s) +{ + static bool givehint = FALSE; + + if (context_inIterDef ()) + { + llerror (FLG_SYNTAX, message ("Iter syntax not parseable: %s", + context_inFunctionName ())); + } + else if (context_inIterEnd ()) + { + llerror (FLG_SYNTAX, message ("Iter finalizer syntax not parseable: %s", + context_inFunctionName ())); + } + else if (context_inMacro ()) + { + llerror (FLG_SYNTAX, message ("Macro syntax not parseable: %s", + context_inFunctionName ())); + + if (context_inMacroUnknown ()) + { + if (!givehint) + { + llhint (cstring_makeLiteral + ("Precede macro definition with /*@notfunction@*/ " + "to suppress checking and force expansion")); + givehint = TRUE; + } + } + + swallowMacro (); + } + else + { + llparseerror (cstring_undefined); + } +} + + + + + + + + + + + + + diff --git a/src/cgrammar.tab.h b/src/cgrammar.tab.h new file mode 100644 index 0000000..7a10c8a --- /dev/null +++ b/src/cgrammar.tab.h @@ -0,0 +1,205 @@ +typedef union +{ + lltok tok; + int count; + specialClauseKind sck; + qual typequal; + qualList tquallist; + ctype ctyp; + sRef sr; + /*@only@*/ qtype qtyp; + /*@only@*/ cstring cname; + /*@only@*/ idDecl ntyp; + /*@only@*/ idDeclList ntyplist; + /*@only@*/ uentryList flist; + /*@owned@*/ uentryList entrylist; + /*@observer@*/ /*@dependent@*/ uentry entry; + /*@only@*/ uentry oentry; + /*@only@*/ exprNode expr; + /*@only@*/ enumNameList enumnamelist; + /*@only@*/ exprNodeList alist; + /*@only@*/ sRefSet srset; + /*@only@*/ cstringList cstringlist; +} YYSTYPE; +#define BADTOK 258 +#define SKIPTOK 259 +#define CTOK_ELIPSIS 260 +#define CASE 261 +#define DEFAULT 262 +#define CIF 263 +#define CELSE 264 +#define SWITCH 265 +#define WHILE 266 +#define DO 267 +#define CFOR 268 +#define GOTO 269 +#define CONTINUE 270 +#define BREAK 271 +#define RETURN 272 +#define TSEMI 273 +#define TLBRACE 274 +#define TRBRACE 275 +#define TCOMMA 276 +#define TCOLON 277 +#define TASSIGN 278 +#define TLPAREN 279 +#define TRPAREN 280 +#define TLSQBR 281 +#define TRSQBR 282 +#define TDOT 283 +#define TAMPERSAND 284 +#define TEXCL 285 +#define TTILDE 286 +#define TMINUS 287 +#define TPLUS 288 +#define TMULT 289 +#define TDIV 290 +#define TPERCENT 291 +#define TLT 292 +#define TGT 293 +#define TCIRC 294 +#define TBAR 295 +#define TQUEST 296 +#define CSIZEOF 297 +#define CALIGNOF 298 +#define ARROW_OP 299 +#define CTYPEDEF 300 +#define COFFSETOF 301 +#define INC_OP 302 +#define DEC_OP 303 +#define LEFT_OP 304 +#define RIGHT_OP 305 +#define LE_OP 306 +#define GE_OP 307 +#define EQ_OP 308 +#define NE_OP 309 +#define AND_OP 310 +#define OR_OP 311 +#define MUL_ASSIGN 312 +#define DIV_ASSIGN 313 +#define MOD_ASSIGN 314 +#define ADD_ASSIGN 315 +#define SUB_ASSIGN 316 +#define LEFT_ASSIGN 317 +#define RIGHT_ASSIGN 318 +#define AND_ASSIGN 319 +#define XOR_ASSIGN 320 +#define OR_ASSIGN 321 +#define CSTRUCT 322 +#define CUNION 323 +#define CENUM 324 +#define VA_ARG 325 +#define VA_DCL 326 +#define QGLOBALS 327 +#define QMODIFIES 328 +#define QNOMODS 329 +#define QCONSTANT 330 +#define QFUNCTION 331 +#define QITER 332 +#define QDEFINES 333 +#define QUSES 334 +#define QALLOCATES 335 +#define QSETS 336 +#define QRELEASES 337 +#define QPRECLAUSE 338 +#define QPOSTCLAUSE 339 +#define QALT 340 +#define QUNDEF 341 +#define QKILLED 342 +#define QENDMACRO 343 +#define LLMACRO 344 +#define LLMACROITER 345 +#define LLMACROEND 346 +#define TENDMACRO 347 +#define QSWITCHBREAK 348 +#define QLOOPBREAK 349 +#define QINNERBREAK 350 +#define QSAFEBREAK 351 +#define QINNERCONTINUE 352 +#define QFALLTHROUGH 353 +#define QLINTNOTREACHED 354 +#define QLINTFALLTHROUGH 355 +#define QLINTFALLTHRU 356 +#define QARGSUSED 357 +#define QPRINTFLIKE 358 +#define QLINTPRINTFLIKE 359 +#define QSCANFLIKE 360 +#define QMESSAGELIKE 361 +#define QNOTREACHED 362 +#define QCONST 363 +#define QVOLATILE 364 +#define QINLINE 365 +#define QEXTENSION 366 +#define QEXTERN 367 +#define QSTATIC 368 +#define QAUTO 369 +#define QREGISTER 370 +#define QOUT 371 +#define QIN 372 +#define QYIELD 373 +#define QONLY 374 +#define QTEMP 375 +#define QSHARED 376 +#define QREF 377 +#define QUNIQUE 378 +#define QCHECKED 379 +#define QUNCHECKED 380 +#define QCHECKEDSTRICT 381 +#define QCHECKMOD 382 +#define QKEEP 383 +#define QKEPT 384 +#define QPARTIAL 385 +#define QSPECIAL 386 +#define QOWNED 387 +#define QDEPENDENT 388 +#define QRETURNED 389 +#define QEXPOSED 390 +#define QNULL 391 +#define QOBSERVER 392 +#define QISNULL 393 +#define QEXITS 394 +#define QMAYEXIT 395 +#define QNEVEREXIT 396 +#define QTRUEEXIT 397 +#define QFALSEEXIT 398 +#define QLONG 399 +#define QSIGNED 400 +#define QUNSIGNED 401 +#define QSHORT 402 +#define QUNUSED 403 +#define QSEF 404 +#define QNOTNULL 405 +#define QRELNULL 406 +#define QABSTRACT 407 +#define QCONCRETE 408 +#define QMUTABLE 409 +#define QIMMUTABLE 410 +#define QTRUENULL 411 +#define QFALSENULL 412 +#define QEXTERNAL 413 +#define QREFCOUNTED 414 +#define QREFS 415 +#define QNEWREF 416 +#define QTEMPREF 417 +#define QKILLREF 418 +#define QRELDEF 419 +#define CGCHAR 420 +#define CBOOL 421 +#define CINT 422 +#define CGFLOAT 423 +#define CDOUBLE 424 +#define CVOID 425 +#define QANYTYPE 426 +#define QINTEGRALTYPE 427 +#define QUNSIGNEDINTEGRALTYPE 428 +#define QSIGNEDINTEGRALTYPE 429 +#define IDENTIFIER 430 +#define NEW_IDENTIFIER 431 +#define TYPE_NAME_OR_ID 432 +#define CCONSTANT 433 +#define ITER_NAME 434 +#define ITER_ENDNAME 435 +#define TYPE_NAME 436 + + +extern YYSTYPE yylval; diff --git a/src/cgrammar.y b/src/cgrammar.y new file mode 100644 index 0000000..c059139 --- /dev/null +++ b/src/cgrammar.y @@ -0,0 +1,1612 @@ +/*;-*-C-*-; +** Copyright (c) Massachusetts Institute of Technology 1994-1998. +** All Rights Reserved. +** Unpublished rights reserved under the copyright laws of +** the United States. +** +** THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED +** OR IMPLIED. ANY USE IS AT YOUR OWN RISK. +** +** This code is distributed freely and may be used freely under the +** following conditions: +** +** 1. This notice may not be removed or altered. +** +** 2. Works derived from this code are not distributed for +** commercial gain without explicit permission from MIT +** (for permission contact lclint-request@sds.lcs.mit.edu). +*/ +%{ +/* +** +** cgrammar.y +** +** Yacc/Bison grammar for extended ANSI C used by LCLint. +** +** original grammar by Nate Osgood --- +** hacrat@catfish.lcs.mit.edu Mon Jun 14 13:06:32 1993 +** +** changes for LCLint --- handle typedef names correctly +** fix struct/union parsing bug (empty struct is accepted) +** add productions to handle macros --- require +** error correction --- main source of conflicts in grammar. +** need to process initializations sequentially, L->R +** +** production names are cryptic, so more productions fit on one line +** +** conflicts: 87 shift/reduce, 18 reduce/reduce +** most of these are due to handling macros +** a few are due to handling type expressions +*/ + +/*@=allmacros@*/ + +extern int yylex (); +extern void swallowMacro (void); + +# include "lclintMacros.nf" +# include "basic.h" +# include "cgrammar.h" +# include "exprChecks.h" + +/*@-allmacros@*/ +/*@-matchfields@*/ + +# define SHOWCSYM FALSE +void yyerror (char *s); + +/* +** This is necessary, or else when the bison-generated code #include's malloc.h, +** there will be a parse error. +** +** Unfortunately, it means the error checking on malloc, etc. is lost for allocations +** in bison-generated files under Win32. +*/ + +# ifdef WIN32 +# undef malloc +# undef calloc +# undef realloc +# endif + +%} + +%union +{ + lltok tok; + int count; + specialClauseKind sck; + qual typequal; + qualList tquallist; + ctype ctyp; + sRef sr; + /*@only@*/ qtype qtyp; + /*@only@*/ cstring cname; + /*@only@*/ idDecl ntyp; + /*@only@*/ idDeclList ntyplist; + /*@only@*/ uentryList flist; + /*@owned@*/ uentryList entrylist; + /*@observer@*/ /*@dependent@*/ uentry entry; + /*@only@*/ uentry oentry; + /*@only@*/ exprNode expr; + /*@only@*/ enumNameList enumnamelist; + /*@only@*/ exprNodeList alist; + /*@only@*/ sRefSet srset; + /*@only@*/ cstringList cstringlist; +} + +/* standard C tokens */ + +%token BADTOK SKIPTOK +%token CTOK_ELIPSIS CASE DEFAULT CIF CELSE SWITCH WHILE DO CFOR +%token GOTO CONTINUE BREAK RETURN +%token TSEMI TLBRACE TRBRACE TCOMMA TCOLON TASSIGN TLPAREN +%token TRPAREN TLSQBR TRSQBR TDOT TAMPERSAND TEXCL TTILDE +%token TMINUS TPLUS TMULT TDIV TPERCENT TLT TGT TCIRC TBAR TQUEST +%token CSIZEOF CALIGNOF ARROW_OP CTYPEDEF COFFSETOF +%token INC_OP DEC_OP LEFT_OP RIGHT_OP +%token LE_OP GE_OP EQ_OP NE_OP AND_OP OR_OP +%token MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN SUB_ASSIGN +%token LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN +%token CSTRUCT CUNION CENUM +%token VA_ARG VA_DCL +%token QGLOBALS +%token QMODIFIES +%token QNOMODS +%token QCONSTANT +%token QFUNCTION +%token QITER +%token QDEFINES +%token QUSES +%token QALLOCATES +%token QSETS +%token QRELEASES +%token QPRECLAUSE +%token QPOSTCLAUSE +%token QALT +%token QUNDEF QKILLED +%token QENDMACRO + +/* additional tokens introduced by lclint pre-processor. */ +%token LLMACRO LLMACROITER LLMACROEND TENDMACRO + +/* break comments: */ +%token QSWITCHBREAK QLOOPBREAK QINNERBREAK QSAFEBREAK +%token QINNERCONTINUE + +/* case fall-through marker: */ +%token QFALLTHROUGH + +/* used in scanner only */ +%token QLINTNOTREACHED +%token QLINTFALLTHROUGH +%token QLINTFALLTHRU +%token QARGSUSED +%token QPRINTFLIKE QLINTPRINTFLIKE QSCANFLIKE QMESSAGELIKE + +/* not-reached marker: (used like a label) */ +%token QNOTREACHED + +/* type qualifiers: */ +%token QCONST QVOLATILE QINLINE QEXTENSION QEXTERN QSTATIC QAUTO QREGISTER +%token QOUT QIN QYIELD QONLY QTEMP QSHARED QREF QUNIQUE +%token QCHECKED QUNCHECKED QCHECKEDSTRICT QCHECKMOD +%token QKEEP QKEPT QPARTIAL QSPECIAL QOWNED QDEPENDENT +%token QRETURNED QEXPOSED QNULL QOBSERVER QISNULL +%token QEXITS QMAYEXIT QNEVEREXIT QTRUEEXIT QFALSEEXIT +%token QLONG QSIGNED QUNSIGNED QSHORT QUNUSED QSEF QNOTNULL QRELNULL +%token QABSTRACT QCONCRETE QMUTABLE QIMMUTABLE +%token QTRUENULL QFALSENULL QEXTERNAL +%token QREFCOUNTED QREFS QNEWREF QTEMPREF QKILLREF QRELDEF +%token CGCHAR CBOOL CINT CGFLOAT CDOUBLE CVOID +%token QANYTYPE QINTEGRALTYPE QUNSIGNEDINTEGRALTYPE QSIGNEDINTEGRALTYPE + +/* identifiers, literals */ +%token IDENTIFIER +%token NEW_IDENTIFIER TYPE_NAME_OR_ID +%token CCONSTANT +%token ITER_NAME ITER_ENDNAME +%type endIter +%type globId +%token TYPE_NAME +%type enumerator newId /*@-varuse@*/ /* yacc declares yytranslate here */ +%type pointers /*@=varuse@*/ + +%type doHeader specialTag endSpecialTag stateSpecialClause endStateTag +%type specialClauseType + +/* type construction */ +%type abstractDecl abstractDeclBase optAbstractDeclBase +%type suSpc enumSpc typeName typeSpecifier + +%type namedDecl namedDeclBase optNamedDecl +%type plainNamedDecl plainNamedDeclBase +%type structNamedDecl +%type fcnDefHdrAux plainFcn + +%type paramDecl +%type id + +%type structNamedDeclList + +%type genericParamList paramTypeList paramList idList paramIdList +%type argumentExprList iterArgList +%type initList +%type structDeclList structDecl +%type locModifies locPlainModifies modList specClauseList +%type mExpr modListExpr specClauseListExpr +%type enumeratorList +%type fieldDesignator + +%type sizeofExpr sizeofExprAux offsetofExpr +%type openScope closeScope +%type instanceDecl namedInitializer optDeclarators +%type primaryExpr postfixExpr primaryIterExpr postfixIterExpr +%type unaryExpr castExpr timesExpr plusExpr +%type unaryIterExpr castIterExpr timesIterExpr plusIterExpr +%type shiftExpr relationalExpr equalityExpr bitandExpr +%type xorExpr bitorExpr andExpr +%type orExpr conditionalExpr assignExpr +%type shiftIterExpr relationalIterExpr equalityIterExpr bitandIterExpr +%type xorIterExpr bitorIterExpr andIterExpr +%type orIterExpr conditionalIterExpr assignIterExpr iterArgExpr +%type expr optExpr constantExpr +%type init macroBody iterBody endBody partialIterStmt iterSelectionStmt +%type stmt stmtList fcnBody iterStmt iterDefStmt iterDefStmtList +%type labeledStmt caseStmt defaultStmt +%type compoundStmt compoundStmtAux compoundStmtRest compoundStmtAuxErr +%type expressionStmt selectionStmt iterationStmt jumpStmt iterDefIterationStmt +%type stmtErr stmtListErr compoundStmtErr expressionStmtErr +%type iterationStmtErr initializerList initializer ifPred whilePred forPred iterWhilePred + +%type storageSpecifier typeQualifier typeModifier globQual +%type optGlobQuals +%type completeType completeTypeSpecifier optCompleteType +%type completeTypeSpecifierAux altType typeExpression + +%start file + +%% + +file + : + | externalDefs + +externalDefs + : externalDef + | externalDefs externalDef + +externalDef + : fcnDef optSemi { uentry_clearDecl (); } + | constantDecl { uentry_clearDecl (); } + | fcnDecl { uentry_clearDecl (); } + | iterDecl { uentry_clearDecl (); } + | macroDef { uentry_clearDecl (); } + | initializer { uentry_checkDecl (); exprNode_free ($1); } + | error { uentry_clearDecl (); } + +constantDecl + : QCONSTANT completeTypeSpecifier NotType namedDecl NotType optSemi IsType QENDMACRO + { checkConstant ($2, $4); } + | QCONSTANT completeTypeSpecifier NotType namedDecl NotType TASSIGN IsType init optDeclarators optSemi QENDMACRO + { checkValueConstant ($2, $4, $8) ; } + +fcnDecl + : QFUNCTION { context_enterFunctionDecl (); } plainFcn optSemi QENDMACRO + { declareStaticFunction ($3); context_quietExitFunction (); + context_exitFunctionDecl (); } + +plainFcn + : plainNamedDecl + { + qtype qint = qtype_create (ctype_int); + $$ = idDecl_fixBase ($1, qint); + qtype_free (qint); + } + | completeTypeSpecifier NotType plainNamedDecl + { $$ = idDecl_fixBase ($3, $1); } + +plainNamedDecl + : plainNamedDeclBase + | pointers plainNamedDeclBase + { $$ = $2; qtype_adjustPointers ($1, idDecl_getTyp ($$)); } + +namedDeclBase + : newId { $$ = idDecl_create ($1, qtype_unknown ()); } + | IsType TLPAREN NotType namedDecl IsType TRPAREN + { $$ = idDecl_expectFunction ($4); } + | namedDeclBase TLSQBR TRSQBR + { $$ = idDecl_replaceCtype ($1, ctype_makeArray (idDecl_getCtype ($1))); } + | namedDeclBase TLSQBR IsType constantExpr TRSQBR NotType + { + int value; + + if (exprNode_hasValue ($4) + && multiVal_isInt (exprNode_getValue ($4))) + { + value = (int) multiVal_forceInt (exprNode_getValue ($4)); + } + else + { + value = 0; + } + + $$ = idDecl_replaceCtype ($1, ctype_makeFixedArray (idDecl_getCtype ($1), value)); + } + | namedDeclBase PushType TLPAREN TRPAREN + { setCurrentParams (uentryList_missingParams); + } + optGlobMods + { /* need to support globals and modifies here! */ + ctype ct = ctype_makeFunction (idDecl_getCtype ($1), + uentryList_makeMissingParams ()); + + $$ = idDecl_replaceCtype ($1, ct); + context_popLoc (); + } + | namedDeclBase PushType TLPAREN genericParamList TRPAREN + { setCurrentParams ($4); + } + optGlobMods + { clearCurrentParams (); + $$ = idDecl_replaceCtype ($1, ctype_makeFunction (idDecl_getCtype ($1), $4)); + context_popLoc (); + } + +plainNamedDeclBase + : newId { $$ = idDecl_create ($1, qtype_unknown ()); } + | IsType TLPAREN NotType plainNamedDecl IsType TRPAREN + { $$ = idDecl_expectFunction ($4); } + | plainNamedDeclBase TLSQBR TRSQBR + { $$ = idDecl_replaceCtype ($1, ctype_makeArray (idDecl_getCtype ($1))); } + | plainNamedDeclBase TLSQBR IsType constantExpr TRSQBR NotType + { + int value; + + if (exprNode_hasValue ($4) + && multiVal_isInt (exprNode_getValue ($4))) + { + value = (int) multiVal_forceInt (exprNode_getValue ($4)); + } + else + { + value = 0; + } + + $$ = idDecl_replaceCtype ($1, ctype_makeFixedArray (idDecl_getCtype ($1), value)); + } + | plainNamedDeclBase PushType TLPAREN TRPAREN + { setCurrentParams (uentryList_missingParams); + } + optPlainGlobMods + { /* need to support globals and modifies here! */ + ctype ct = ctype_makeFunction (idDecl_getCtype ($1), + uentryList_makeMissingParams ()); + + $$ = idDecl_replaceCtype ($1, ct); + context_popLoc (); + } + | plainNamedDeclBase PushType TLPAREN genericParamList TRPAREN + { setCurrentParams ($4); + } + optPlainGlobMods + { clearCurrentParams (); + $$ = idDecl_replaceCtype ($1, ctype_makeFunction (idDecl_getCtype ($1), $4)); + context_popLoc (); + } + +iterDecl + : QITER newId TLPAREN genericParamList TRPAREN + { setCurrentParams ($4); } optPlainGlobMods + { clearCurrentParams (); } optSemi QENDMACRO + { declareCIter ($2, $4); } + +macroDef + : LLMACRO macroBody TENDMACRO { exprNode_checkMacroBody ($2); } + | LLMACROITER iterBody TENDMACRO { exprNode_checkIterBody ($2); } + | LLMACROEND endBody TENDMACRO { exprNode_checkIterEnd ($2); } + | LLMACRO TENDMACRO /* no stmt */ { exprChecks_checkEmptyMacroBody (); } + +fcnDefHdr + : fcnDefHdrAux { declareFunction ($1); } + +optGlobMods + : { setProcessingGlobMods (); } optGlobModsRest + { clearProcessingGlobMods (); } + +optPlainGlobMods + : { setProcessingGlobMods (); } optPlainGlobModsRest + { clearProcessingGlobMods (); } + +optGlobModsRest + : optGlobModsAux + | specialClauses optGlobModsAux + +optPlainGlobModsRest + : optPlainGlobModsAux + | specialClauses optPlainGlobModsAux + +specialClauses + : specialClause + | specialClause specialClauses + +globIdList + : globIdListExpr { ; } + | globIdList TCOMMA globIdListExpr { ; } + +globIdListExpr + : optGlobQuals globId { globListAdd ($2, $1); } + +globId + : id { $$ = uentry_getSref ($1); } + | NEW_IDENTIFIER { $$ = globListUnrecognized ($1); } + +globQual + : QUNDEF { $$ = qual_createUndef (); } + | QKILLED { $$ = qual_createKilled (); } + | QOUT { $$ = qual_createOut (); } + | QIN { $$ = qual_createIn (); } + | QPARTIAL { $$ = qual_createPartial (); } + +optGlobQuals + : /* empty */ { $$ = qualList_undefined; } + | globQual optGlobQuals { $$ = qualList_add ($2, $1); } + +optGlobModsAux + : QGLOBALS { setProcessingGlobalsList (); } initializerList optSemi + QENDMACRO optMods + { unsetProcessingGlobals (); } + | QGLOBALS { setProcessingGlobalsList (); } globIdList optSemi + QENDMACRO optMods + { unsetProcessingGlobals (); } + | QNOMODS + { setFunctionNoGlobals (); + setFunctionModifies (sRefSet_single (sRef_makeNothing ())); + } + | fcnMods + | /* empty */ + +optPlainGlobModsAux + : QGLOBALS { setProcessingGlobalsList (); } initializerList optSemi + optMods + { unsetProcessingGlobals (); } + | QGLOBALS { setProcessingGlobalsList (); } globIdList optSemi + optMods + { unsetProcessingGlobals (); } + | QNOMODS + { setFunctionNoGlobals (); + setFunctionModifies (sRefSet_single (sRef_makeNothing ())); + } + | fcnPlainMods + | /* empty */ + +optMods + : fcnMods + | /* empty */ + +fcnMods + : QMODIFIES + { + context_setProtectVars (); enterParamsTemp (); + sRef_setGlobalScopeSafe (); + } + locModifies + { + setFunctionModifies ($3); exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + } + +fcnPlainMods + : QMODIFIES + { + context_setProtectVars (); enterParamsTemp (); + sRef_setGlobalScopeSafe (); + } + locPlainModifies + { + setFunctionModifies ($3); exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + } + +specialTag + : QDEFINES + | QUSES + | QALLOCATES + | QSETS + | QRELEASES + +endStateTag + : QENDMACRO + +endSpecialTag + : QENDMACRO + +stateSpecialClause + : QPRECLAUSE + | QPOSTCLAUSE + +specialClauseType + : QONLY { $$ = SP_ISONLY; } + | QOBSERVER { $$ = SP_ISOBSERVER; } + | QEXPOSED { $$ = SP_ISEXPOSED; } + | QDEPENDENT { $$ = SP_ISDEPENDENT; } + | QOWNED { $$ = SP_ISOWNED; } + | QSHARED { $$ = SP_ISSHARED; } + | QISNULL { $$ = SP_ISNULL; } + | QNOTNULL { $$ = SP_ISNOTNULL; } + +specialClause + : specialTag NotType + { + context_setProtectVars (); + enterParamsTemp (); + sRef_setGlobalScopeSafe (); + } + specClauseList optSemi endSpecialTag IsType + { + setFunctionSpecialClause ($1, $4, $6); + exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + } + | stateSpecialClause NotType specialClauseType + { + context_setProtectVars (); + enterParamsTemp (); + sRef_setGlobalScopeSafe (); + } + specClauseList optSemi endStateTag IsType + { + setFunctionStateSpecialClause ($1, $3, $5, $7); + exitParamsTemp (); + sRef_clearGlobalScopeSafe (); + context_releaseVars (); + } + +fcnDefHdrAux + : namedDecl + { + qtype qint = qtype_create (ctype_int); + $$ = idDecl_fixBase ($1, qint); + qtype_free (qint); + } + | completeTypeSpecifier NotType namedDecl + { $$ = idDecl_fixBase ($3, $1); } + +fcnBody + : TLBRACE { checkDoneParams (); context_enterInnerContext (); } + compoundStmtRest + { + exprNode_checkFunctionBody ($3); $$ = $3; + context_exitInner ($3); + } + | initializerList + { doneParams (); context_enterInnerContext (); } + compoundStmt + { + context_exitInner ($3); + exprNode_checkFunctionBody ($3); + $$ = $3; /* old style */ + } + +fcnDef + : fcnDefHdr fcnBody + { + context_setFunctionDefined (exprNode_loc ($2)); + exprNode_checkFunction (context_getHeader (), $2); + context_exitFunction (); + } + +locModifies + : modList optSemi QENDMACRO { $$ = $1; } + | optSemi QENDMACRO { $$ = sRefSet_new (); } + +locPlainModifies + : modList optSemi { $$ = $1; } + | optSemi { $$ = sRefSet_new (); } + +modListExpr + : id { $$ = uentry_getSref ($1); checkModifiesId ($1); } + | NEW_IDENTIFIER { $$ = fixModifiesId ($1); } + | modListExpr TLSQBR TRSQBR { $$ = modListArrayFetch ($1, sRef_undefined); } + | modListExpr TLSQBR mExpr TRSQBR { $$ = modListArrayFetch ($1, $3); } + | TMULT modListExpr { $$ = modListPointer ($2); } + | TLPAREN modListExpr TRPAREN { $$ = $2; } + | modListExpr TDOT newId { $$ = modListFieldAccess ($1, $3); } + | modListExpr ARROW_OP newId { $$ = modListArrowAccess ($1, $3); } + + +mExpr + : modListExpr { $$ = $1; } + | CCONSTANT { $$ = sRef_makeUnknown (); /* sRef_makeConstant ($1); ? */ } + /* arithmetic? */ + +modList + : modListExpr { $$ = sRefSet_single ($1); } + | modList TCOMMA modListExpr { $$ = sRefSet_insert ($1, $3); } + +specClauseListExpr + : id + { $$ = checkSpecClausesId ($1); } + | NEW_IDENTIFIER + { $$ = fixSpecClausesId ($1); } + | specClauseListExpr TLSQBR TRSQBR { $$ = sRef_makeAnyArrayFetch ($1); } + | specClauseListExpr TLSQBR mExpr TRSQBR { $$ = sRef_makeAnyArrayFetch ($1); } + | TMULT specClauseListExpr { $$ = sRef_constructPointer ($2); } + | TLPAREN specClauseListExpr TRPAREN { $$ = $2; } + | specClauseListExpr TDOT newId { cstring_markOwned ($3); + $$ = sRef_buildField ($1, $3); } + | specClauseListExpr ARROW_OP newId { cstring_markOwned ($3); + $$ = sRef_makeArrow ($1, $3); } + +specClauseList + : specClauseListExpr + { if (sRef_isValid ($1)) { $$ = sRefSet_single ($1); } + else { $$ = sRefSet_undefined; } + } + | specClauseList TCOMMA specClauseListExpr + { if (sRef_isValid ($3)) + { + $$ = sRefSet_insert ($1, $3); + } + else + { + $$ = $1; + } + } + +primaryExpr + : id { $$ = exprNode_fromIdentifier ($1); } + | NEW_IDENTIFIER { $$ = exprNode_fromUIO ($1); } + | CCONSTANT + | TLPAREN expr TRPAREN { $$ = exprNode_addParens ($1, $2); } + | TYPE_NAME_OR_ID { $$ = exprNode_fromIdentifier (coerceId ($1)); } + | QEXTENSION { $$ = exprNode_makeError (); } + +postfixExpr + : primaryExpr + | postfixExpr TLSQBR expr TRSQBR { $$ = exprNode_arrayFetch ($1, $3); } + | postfixExpr TLPAREN TRPAREN { $$ = exprNode_functionCall ($1, exprNodeList_new ()); } + | postfixExpr TLPAREN argumentExprList TRPAREN { $$ = exprNode_functionCall ($1, $3); } + | VA_ARG TLPAREN assignExpr TCOMMA typeExpression TRPAREN { $$ = exprNode_vaArg ($1, $3, $5); } + | postfixExpr NotType TDOT newId IsType { $$ = exprNode_fieldAccess ($1, $4); } + | postfixExpr NotType ARROW_OP newId IsType { $$ = exprNode_arrowAccess ($1, $4); } + | postfixExpr INC_OP { $$ = exprNode_postOp ($1, $2); } + | postfixExpr DEC_OP { $$ = exprNode_postOp ($1, $2); } + +argumentExprList + : assignExpr { $$ = exprNodeList_singleton ($1); } + | argumentExprList TCOMMA assignExpr { $$ = exprNodeList_push ($1, $3); } + +unaryExpr + : postfixExpr + | INC_OP unaryExpr { $$ = exprNode_preOp ($2, $1); } + | DEC_OP unaryExpr { $$ = exprNode_preOp ($2, $1); } + | TAMPERSAND castExpr { $$ = exprNode_preOp ($2, $1); } + | TMULT castExpr { $$ = exprNode_preOp ($2, $1); } + | TPLUS castExpr { $$ = exprNode_preOp ($2, $1); } + | TMINUS castExpr { $$ = exprNode_preOp ($2, $1); } + | TTILDE castExpr { $$ = exprNode_preOp ($2, $1); } + | TEXCL castExpr { $$ = exprNode_preOp ($2, $1); } + | sizeofExpr { $$ = $1; } + | offsetofExpr { $$ = $1; } + +fieldDesignator + : fieldDesignator TDOT newId { $$ = cstringList_add ($1, $3); } + | newId { $$ = cstringList_single ($1); } + +offsetofExpr + : COFFSETOF IsType TLPAREN typeExpression NotType TCOMMA fieldDesignator TRPAREN IsType + { $$ = exprNode_offsetof ($4, $7); } + +sizeofExpr + : IsType { context_setProtectVars (); } + sizeofExprAux { context_sizeofReleaseVars (); $$ = $3; } + +sizeofExprAux + : CSIZEOF TLPAREN typeExpression TRPAREN { $$ = exprNode_sizeofType ($3); } + | CSIZEOF unaryExpr { $$ = exprNode_sizeofExpr ($2); } + | CALIGNOF TLPAREN typeExpression TRPAREN { $$ = exprNode_alignofType ($3); } + | CALIGNOF unaryExpr { $$ = exprNode_alignofExpr ($2); } + +castExpr + : unaryExpr + | TLPAREN typeExpression TRPAREN castExpr + { $$ = exprNode_cast ($1, $4, $2); } + +timesExpr + : castExpr + | timesExpr TMULT castExpr { $$ = exprNode_op ($1, $3, $2); } + | timesExpr TDIV castExpr { $$ = exprNode_op ($1, $3, $2); } + | timesExpr TPERCENT castExpr { $$ = exprNode_op ($1, $3, $2); } + +plusExpr + : timesExpr + | plusExpr TPLUS timesExpr { $$ = exprNode_op ($1, $3, $2); } + | plusExpr TMINUS timesExpr { $$ = exprNode_op ($1, $3, $2); } + +shiftExpr + : plusExpr + | shiftExpr LEFT_OP plusExpr { $$ = exprNode_op ($1, $3, $2); } + | shiftExpr RIGHT_OP plusExpr { $$ = exprNode_op ($1, $3, $2); } + +relationalExpr + : shiftExpr + | relationalExpr TLT shiftExpr { $$ = exprNode_op ($1, $3, $2); } + | relationalExpr TGT shiftExpr { $$ = exprNode_op ($1, $3, $2); } + | relationalExpr LE_OP shiftExpr { $$ = exprNode_op ($1, $3, $2); } + | relationalExpr GE_OP shiftExpr { $$ = exprNode_op ($1, $3, $2); } + +equalityExpr + : relationalExpr + | equalityExpr EQ_OP relationalExpr { $$ = exprNode_op ($1, $3, $2); } + | equalityExpr NE_OP relationalExpr { $$ = exprNode_op ($1, $3, $2); } + +bitandExpr + : equalityExpr + | bitandExpr TAMPERSAND equalityExpr { $$ = exprNode_op ($1, $3, $2); } + +xorExpr + : bitandExpr + | xorExpr TCIRC bitandExpr { $$ = exprNode_op ($1, $3, $2); } +; + +bitorExpr + : xorExpr + | bitorExpr TBAR xorExpr { $$ = exprNode_op ($1, $3, $2); } + +andExpr + : bitorExpr + | andExpr AND_OP + { exprNode_produceGuards ($1); + context_enterAndClause ($1); + } + bitorExpr + { + $$ = exprNode_op ($1, $4, $2); + context_exitAndClause ($$, $4); + } + +orExpr + : andExpr + | orExpr OR_OP + { + exprNode_produceGuards ($1); + context_enterOrClause ($1); + } + andExpr + { + $$ = exprNode_op ($1, $4, $2); + context_exitOrClause ($$, $4); + } + +conditionalExpr + : orExpr + | orExpr TQUEST { exprNode_produceGuards ($1); context_enterTrueClause ($1); } expr TCOLON + { context_enterFalseClause ($1); } conditionalExpr + { $$ = exprNode_cond ($1, $4, $7); context_exitClause ($1, $4, $7); } + +assignExpr + : conditionalExpr + | unaryExpr TASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr MUL_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr DIV_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr MOD_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr ADD_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr SUB_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr LEFT_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr RIGHT_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr AND_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr XOR_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr OR_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + +expr + : assignExpr + | expr TCOMMA assignExpr { $$ = exprNode_comma ($1, $3); } + +optExpr + : /* empty */ { $$ = exprNode_undefined; } + | expr + +constantExpr + : conditionalExpr + +/* instance_orTypeDecl_and_possible_initialization */ + +initializer + : instanceDecl { $$ = $1; } + | VA_DCL { doVaDcl (); $$ = exprNode_makeError (); } + | typeDecl { $$ = exprNode_makeError (); } + +instanceDecl + : completeTypeSpecifier IsType TSEMI { $$ = exprNode_makeError (); } + /* + ** This causes r/r conflicts with function definitions. + ** Instead we need to snarf one first. (gack) + ** + ** | completeTypeSpecifier { setProcessingVars ($1); } + ** NotType + ** namedInitializerList IsType TSEMI + ** { unsetProcessingVars (); } + **; + ** + ** the solution is pretty ugly: + */ + | completeTypeSpecifier NotType namedDecl NotType + { + setProcessingVars ($1); + processNamedDecl ($3); } + IsType optDeclarators TSEMI IsType { unsetProcessingVars (); $$ = $7; } + | completeTypeSpecifier NotType namedDecl NotType TASSIGN + { setProcessingVars ($1); processNamedDecl ($3); + } + IsType init optDeclarators TSEMI IsType + { $$ = exprNode_concat ($9, exprNode_makeInitialization ($3, $8)); + unsetProcessingVars (); + } +namedInitializer + : namedDecl NotType { processNamedDecl ($1); $$ = exprNode_makeError (); } + | namedDecl NotType TASSIGN { processNamedDecl ($1); } IsType init + { $$ = exprNode_makeInitialization ($1, $6); } + + +typeDecl + : CTYPEDEF completeTypeSpecifier { setProcessingTypedef ($2); } + NotType namedInitializerList IsType TSEMI { unsetProcessingTypedef (); } + | CTYPEDEF completeTypeSpecifier IsType TSEMI { /* in the ANSI grammar, semantics unclear */ } + | CTYPEDEF namedInitializerList IsType TSEMI { /* in the ANSI grammar, semantics unclear */ } + +IsType + : { g_expectingTypeName = TRUE; } + +PushType + : { g_expectingTypeName = TRUE; context_pushLoc (); } + +namedInitializerList + : namedInitializerListAux IsType { ; } + +namedInitializerListAux + : namedInitializer { ; } + | namedInitializerList TCOMMA NotType namedInitializer { ; } + +optDeclarators + : /* empty */ { $$ = exprNode_makeError (); } + | optDeclarators TCOMMA NotType namedInitializer { $$ = exprNode_concat ($1, $4); } + +init + : assignExpr + | TLBRACE initList TRBRACE { $$ = exprNode_makeInitBlock ($1, $2); } + | TLBRACE initList TCOMMA TRBRACE { $$ = exprNode_makeInitBlock ($1, $2); } + + +initList + : init + { $$ = exprNodeList_singleton ($1); } + | initList TCOMMA init + { $$ = exprNodeList_push ($1, $3); } + +/* +** need to do the storage class global hack so tags are +** declared with the right storage class. +*/ + +storageSpecifier + : QEXTERN { setStorageClass (SCEXTERN); $$ = qual_createExtern (); } + | QINLINE { $$ = qual_createInline (); } + | QSTATIC { setStorageClass (SCSTATIC); $$ = qual_createStatic (); } + | QAUTO { $$ = qual_createAuto (); } + | QREGISTER { $$ = qual_createRegister (); } + +typeQualifier + : QCONST IsType { $$ = qual_createConst (); } + | QVOLATILE IsType { $$ = qual_createVolatile (); } + | QOUT IsType { $$ = qual_createOut (); } + | QIN IsType { $$ = qual_createIn (); } + | QPARTIAL IsType { $$ = qual_createPartial (); } + | QSPECIAL IsType { $$ = qual_createSpecial (); } + | QOWNED IsType { $$ = qual_createOwned (); } + | QDEPENDENT IsType { $$ = qual_createDependent (); } + | QYIELD IsType { $$ = qual_createYield (); } + | QTEMP IsType { $$ = qual_createTemp (); } + | QONLY IsType { $$ = qual_createOnly (); } + | QKEEP IsType { $$ = qual_createKeep (); } + | QKEPT IsType { $$ = qual_createKept (); } + | QSHARED IsType { $$ = qual_createShared (); } + | QUNIQUE IsType { $$ = qual_createUnique (); } + | QEXITS IsType { $$ = qual_createExits (); } + | QMAYEXIT IsType { $$ = qual_createMayExit (); } + | QTRUEEXIT IsType { $$ = qual_createTrueExit (); } + | QFALSEEXIT IsType { $$ = qual_createFalseExit (); } + | QNEVEREXIT IsType { $$ = qual_createNeverExit (); } + | QNULL IsType { $$ = qual_createNull (); } + | QRELNULL IsType { $$ = qual_createRelNull (); } + | QRETURNED IsType { $$ = qual_createReturned (); } + | QEXPOSED IsType { $$ = qual_createExposed (); } + | QOBSERVER IsType { $$ = qual_createObserver (); } + | QCHECKED IsType { $$ = qual_createChecked (); } + | QCHECKMOD IsType { $$ = qual_createCheckMod (); } + | QUNCHECKED IsType { $$ = qual_createUnchecked (); } + | QCHECKEDSTRICT IsType { $$ = qual_createCheckedStrict (); } + | QTRUENULL IsType { $$ = qual_createTrueNull (); } + | QFALSENULL IsType { $$ = qual_createFalseNull (); } + | QUNUSED IsType { $$ = qual_createUnused (); } + | QEXTERNAL IsType { $$ = qual_createExternal (); } + | QSEF IsType { $$ = qual_createSef (); } + | QABSTRACT IsType { $$ = qual_createAbstract (); } + | QCONCRETE IsType { $$ = qual_createConcrete (); } + | QMUTABLE IsType { $$ = qual_createMutable (); } + | QIMMUTABLE IsType { $$ = qual_createImmutable (); } + | QNOTNULL IsType { $$ = qual_createNotNull (); } + | QREFCOUNTED IsType { $$ = qual_createRefCounted (); } + | QREFS IsType { $$ = qual_createRefs (); } + | QKILLREF IsType { $$ = qual_createKillRef (); } + | QRELDEF IsType { $$ = qual_createRelDef (); } + | QNEWREF IsType { $$ = qual_createNewRef (); } + | QTEMPREF IsType { $$ = qual_createTempRef (); } + +typeModifier + : QSHORT { $$ = qual_createShort (); } + | QLONG { $$ = qual_createLong (); } + | QSIGNED { $$ = qual_createSigned (); } + | QUNSIGNED { $$ = qual_createUnsigned (); } + +typeSpecifier + : CGCHAR NotType + | CINT NotType + | CBOOL NotType + | CGFLOAT NotType + | CDOUBLE NotType + | CVOID NotType + | QANYTYPE NotType { $$ = ctype_unknown; } + | QINTEGRALTYPE NotType { $$ = ctype_anyintegral; } + | QUNSIGNEDINTEGRALTYPE NotType { $$ = ctype_unsignedintegral; } + | QSIGNEDINTEGRALTYPE NotType { $$ = ctype_signedintegral; } + | typeName NotType + | suSpc NotType + | enumSpc NotType + | typeModifier NotType { $$ = ctype_fromQual ($1); } + +completeType + : IsType completeTypeSpecifier IsType + { $$ = qtype_resolve ($2); } + +completeTypeSpecifier + : completeTypeSpecifierAux { $$ = $1; } + | completeTypeSpecifierAux QALT altType QENDMACRO + { $$ = qtype_mergeAlt ($1, $3); } + +altType + : typeExpression + | typeExpression TCOMMA altType + { $$ = qtype_mergeAlt ($1, $3); } + +completeTypeSpecifierAux + : storageSpecifier optCompleteType { $$ = qtype_addQual ($2, $1); } + | typeQualifier optCompleteType { $$ = qtype_addQual ($2, $1); } + | typeSpecifier optCompleteType { $$ = qtype_combine ($2, $1); } + +optCompleteType + : /* empty */ { $$ = qtype_unknown (); } + | completeTypeSpecifier { $$ = $1; } + +suSpc + : NotType CSTRUCT newId IsType TLBRACE { sRef_setGlobalScopeSafe (); } + CreateStructInnerScope + structDeclList DeleteStructInnerScope { sRef_clearGlobalScopeSafe (); } + TRBRACE + { $$ = declareStruct ($3, $8); } + | NotType CUNION newId IsType TLBRACE { sRef_setGlobalScopeSafe (); } + CreateStructInnerScope + structDeclList DeleteStructInnerScope { sRef_clearGlobalScopeSafe (); } + TRBRACE + { $$ = declareUnion ($3, $8); } + | NotType CSTRUCT newId IsType TLBRACE TRBRACE + { $$ = declareStruct ($3, uentryList_new ()); } + | NotType CUNION newId IsType TLBRACE TRBRACE + { $$ = declareUnion ($3, uentryList_new ()); } + | NotType CSTRUCT IsType TLBRACE { sRef_setGlobalScopeSafe (); } + CreateStructInnerScope + structDeclList DeleteStructInnerScope { sRef_clearGlobalScopeSafe (); } + TRBRACE + { $$ = declareUnnamedStruct ($7); } + | NotType CUNION IsType TLBRACE { sRef_setGlobalScopeSafe (); } + CreateStructInnerScope + structDeclList DeleteStructInnerScope { sRef_clearGlobalScopeSafe (); } + TRBRACE + { $$ = declareUnnamedUnion ($7); } + | NotType CSTRUCT IsType TLBRACE TRBRACE + { $$ = ctype_createUnnamedStruct (uentryList_new ()); } + | NotType CUNION IsType TLBRACE TRBRACE + { $$ = ctype_createUnnamedUnion (uentryList_new ()); } + | NotType CSTRUCT newId NotType { $$ = handleStruct ($3); } + | NotType CUNION newId NotType { $$ = handleUnion ($3); } + +NotType + : { g_expectingTypeName = FALSE; } + +structDeclList + : structDecl + | macroDef { $$ = uentryList_undefined; /* bogus! */ } + | structDeclList structDecl { $$ = uentryList_mergeFields ($1, $2); } + +structDecl + : completeTypeSpecifier NotType structNamedDeclList IsType TSEMI + { $$ = fixUentryList ($3, $1); } + | completeTypeSpecifier IsType TSEMI + { $$ = fixUnnamedDecl ($1); } + +structNamedDeclList + : structNamedDecl NotType + { $$ = idDeclList_singleton ($1); } + | structNamedDeclList TCOMMA structNamedDecl NotType + { $$ = idDeclList_add ($1, $3); } + +structNamedDecl /* hack to get around namespace problems */ + : namedDecl { $$ = $1; } + | TCOLON IsType constantExpr { $$ = idDecl_undefined; } + | namedDecl TCOLON IsType constantExpr { $$ = $1; } + /* Need the IsType in case there is a cast in the constant expression. */ + +enumSpc + : NotType CENUM TLBRACE enumeratorList TRBRACE IsType + { $$ = declareUnnamedEnum ($4); } + | NotType CENUM newId TLBRACE { context_pushLoc (); } enumeratorList TRBRACE IsType + { context_popLoc (); $$ = declareEnum ($3, $6); } + | NotType CENUM newId IsType { $$ = handleEnum ($3); } + +enumeratorList + : enumerator + { $$ = enumNameList_single ($1); } + | enumeratorList TCOMMA enumerator + { $$ = enumNameList_push ($1, $3); } + | enumeratorList TCOMMA + +enumerator + : newId + { uentry ue = uentry_makeEnumConstant ($1, ctype_unknown); + usymtab_supGlobalEntry (ue); + $$ = $1; + } + | newId TASSIGN IsType constantExpr + { uentry ue = uentry_makeEnumInitializedConstant ($1, ctype_unknown, $4); + usymtab_supGlobalEntry (ue); + $$ = $1; + } + +optNamedDecl + : namedDeclBase + | optAbstractDeclBase { $$ = idDecl_create (cstring_undefined, qtype_create ($1)); } + | pointers TYPE_NAME + { + qtype qt = qtype_unknown (); + + qtype_adjustPointers ($1, qt); + $$ = idDecl_create (cstring_copy (LastIdentifier ()), qt); + } + | pointers optNamedDecl + { $$ = $2; qtype_adjustPointers ($1, idDecl_getTyp ($$)); } + +namedDecl + : namedDeclBase + | pointers namedDeclBase + { $$ = $2; qtype_adjustPointers ($1, idDecl_getTyp ($$)); } + +genericParamList + : paramTypeList { $$ = handleParamTypeList ($1); } + | NotType paramIdList { $$ = handleParamIdList ($2); } + +innerMods + : QCONST { /* ignored for now */; } + | QVOLATILE { ; } + +innerModsList + : innerMods { ; } + | innerModsList innerMods { ; } + +pointers + : TMULT { $$ = 1; } + | TMULT innerModsList { $$ = 1; } + | TMULT pointers { $$ = 1 + $2; } + | TMULT innerModsList pointers { $$ = 1 + $3; } + +paramIdList + : idList + | idList TCOMMA CTOK_ELIPSIS { $$ = uentryList_add ($1, uentry_makeElipsisMarker ()); } + +idList + : newId { $$ = uentryList_single (uentry_makeVariableLoc ($1, ctype_int)); } + | idList TCOMMA newId { $$ = uentryList_add ($1, uentry_makeVariableLoc ($3, ctype_int)); } + +paramTypeList + : CTOK_ELIPSIS { $$ = uentryList_single (uentry_makeElipsisMarker ()); } + | paramList + | paramList TCOMMA CTOK_ELIPSIS { $$ = uentryList_add ($1, uentry_makeElipsisMarker ()); } + +paramList + : { storeLoc (); } paramDecl { $$ = uentryList_single ($2); } + | paramList TCOMMA { storeLoc (); } paramDecl + { $$ = uentryList_add ($1, $4); } + +paramDecl + : IsType completeTypeSpecifier optNamedDecl IsType + { + if (isFlipOldStyle ()) + { + llparseerror (cstring_makeLiteral ("Inconsistent function parameter syntax (mixing old and new style declaration)")); + } + else + { + setNewStyle (); + } + $$ = makeCurrentParam (idDecl_fixParamBase ($3, $2)); + } + | newId /* its an old-style declaration */ + { + idDecl tparam = idDecl_create ($1, qtype_unknown ()); + + if (isNewStyle ()) + { + llparseerror (message ("Inconsistent function parameter syntax: %q", + idDecl_unparse (tparam))); + } + + setFlipOldStyle (); + $$ = makeCurrentParam (tparam); + idDecl_free (tparam); + } + +typeExpression + : completeType + | completeType abstractDecl { $$ = qtype_newBase ($1, $2); } + +abstractDecl + : pointers { $$ = ctype_adjustPointers ($1, ctype_unknown); } + | abstractDeclBase + | pointers abstractDeclBase { $$ = ctype_adjustPointers ($1, $2); } + +optAbstractDeclBase + : /* empty */ { $$ = ctype_unknown; } + | abstractDeclBase + +abstractDeclBase + : IsType TLPAREN NotType abstractDecl TRPAREN + { $$ = ctype_expectFunction ($4); } + | TLSQBR TRSQBR { $$ = ctype_makeArray (ctype_unknown); } + | TLSQBR constantExpr TRSQBR { $$ = ctype_makeArray (ctype_unknown); } + | abstractDeclBase TLSQBR TRSQBR { $$ = ctype_makeArray ($1); } + | abstractDeclBase TLSQBR constantExpr TRSQBR { $$ = ctype_makeArray ($1); } + | IsType TLPAREN TRPAREN + { $$ = ctype_makeFunction (ctype_unknown, uentryList_makeMissingParams ()); } + | IsType TLPAREN paramTypeList TRPAREN + { $$ = ctype_makeParamsFunction (ctype_unknown, $3); } + | abstractDeclBase IsType TLPAREN TRPAREN + { $$ = ctype_makeFunction ($1, uentryList_makeMissingParams ()); } + | abstractDeclBase IsType TLPAREN paramTypeList TRPAREN + { $$ = ctype_makeParamsFunction ($1, $4); } + +/* statement */ + +stmt + : labeledStmt + | caseStmt + | defaultStmt + | compoundStmt + | expressionStmt + | selectionStmt + | iterationStmt + | iterStmt + | jumpStmt + +iterBody + : iterDefStmtList { $$ = $1; } + +endBody + : iterBody + +iterDefStmtList + : iterDefStmt + | iterDefStmtList iterDefStmt + { $$ = exprNode_concat ($1, $2); } + +iterDefIterationStmt + : iterWhilePred iterDefStmtList + { $$ = exprNode_while ($1, $2); } + | doHeader stmtErr WHILE TLPAREN expr TRPAREN TSEMI + { $$ = exprNode_doWhile ($2, $5); } + | doHeader stmtErr WHILE TLPAREN expr TRPAREN + { $$ = exprNode_doWhile ($2, $5); } + | forPred iterDefStmt + { $$ = exprNode_for ($1, $2); } + +forPred + : CFOR TLPAREN optExpr TSEMI optExpr TSEMI + { context_setProtectVars (); } optExpr { context_sizeofReleaseVars (); } + TRPAREN + { $$ = exprNode_forPred ($3, $5, $8); + context_enterForClause ($5); } + +partialIterStmt + : ITER_NAME CreateInnerScope TLPAREN + { setProcessingIterVars ($1); } + iterArgList TRPAREN + { $$ = exprNode_iterStart ($1, $5); } + | ITER_ENDNAME { $$ = exprNode_createId ($1); } + +iterDefStmt + : labeledStmt + | caseStmt + | defaultStmt + | openScope initializerList { $$ = $2; } + | openScope + | closeScope + | expressionStmt + | iterSelectionStmt + | iterDefIterationStmt + | partialIterStmt + | jumpStmt + | TLPAREN iterDefStmt TRPAREN { $$ = $2; } + | error { $$ = exprNode_makeError (); } + +iterSelectionStmt + : ifPred iterDefStmt + { /* don't: context_exitTrueClause ($1, $2); */ + $$ = exprNode_if ($1, $2); + } + +openScope + : CreateInnerScope TLBRACE { $$ = exprNode_createTok ($2); } + +closeScope + : DeleteInnerScopeSafe TRBRACE { $$ = exprNode_createTok ($2); } + +macroBody + : stmtErr + | stmtListErr + +stmtErr + : labeledStmt + | caseStmt + | defaultStmt + | compoundStmtErr + | expressionStmtErr + | selectionStmt + | iterStmt + | iterationStmtErr + | TLPAREN stmtErr TRPAREN { $$ = exprNode_addParens ($1, $2); } + | jumpStmt + | error { $$ = exprNode_makeError (); } + +labeledStmt + : newId TCOLON { $$ = exprNode_labelMarker ($1); } + | QNOTREACHED stmt { $$ = exprNode_notReached ($2); } + +/* Note that we can semantically check that the object to the case is + indeed constant. In this case, we may not want to go through this effort */ + +caseStmt + : CASE constantExpr { context_enterCaseClause ($2); } + TCOLON { $$ = exprNode_caseMarker ($2, FALSE); } + | QFALLTHROUGH CASE constantExpr { context_enterCaseClause ($3); } + TCOLON { $$ = exprNode_caseMarker ($3, TRUE); } + +defaultStmt + : DEFAULT { context_enterCaseClause (exprNode_undefined); } + TCOLON { $$ = exprNode_defaultMarker ($1, FALSE); } + | QFALLTHROUGH DEFAULT { context_enterCaseClause (exprNode_undefined); } + TCOLON { $$ = exprNode_defaultMarker ($2, TRUE); } + +compoundStmt + : TLPAREN compoundStmt TRPAREN { $$ = $2; } + | CreateInnerScope compoundStmtAux + { $$ = $2; context_exitInner ($2); } + +compoundStmtErr + : CreateInnerScope compoundStmtAuxErr DeleteInnerScope { $$ = $2; } + +CreateInnerScope + : { context_enterInnerContext (); } + +DeleteInnerScope + : { context_exitInnerPlain (); } + +CreateStructInnerScope + : { context_enterStructInnerContext (); } + +DeleteStructInnerScope + : { context_exitStructInnerContext (); } + +DeleteInnerScopeSafe + : { context_exitInnerSafe (); } + +compoundStmtRest + : TRBRACE { $$ = exprNode_createTok ($1); } + | QNOTREACHED TRBRACE { $$ = exprNode_notReached (exprNode_createTok ($2)); } + | stmtList TRBRACE { $$ = exprNode_updateLocation ($1, lltok_getLoc ($2)); } + | stmtList QNOTREACHED TRBRACE + { $$ = exprNode_notReached (exprNode_updateLocation ($1, lltok_getLoc ($3))); } + | initializerList TRBRACE { $$ = exprNode_updateLocation ($1, lltok_getLoc ($2)); } + | initializerList QNOTREACHED TRBRACE + { $$ = exprNode_notReached (exprNode_updateLocation ($1, lltok_getLoc ($3))); } + | initializerList stmtList TRBRACE + { $$ = exprNode_updateLocation (exprNode_concat ($1, $2), lltok_getLoc ($3)); } + | initializerList stmtList QNOTREACHED TRBRACE + { $$ = exprNode_notReached (exprNode_updateLocation (exprNode_concat ($1, $2), + lltok_getLoc ($3))); + } + + +compoundStmtAux + : TLBRACE compoundStmtRest + { $$ = exprNode_makeBlock ($2); } + +compoundStmtAuxErr + : TLBRACE TRBRACE + { $$ = exprNode_createTok ($2); } + | TLBRACE stmtListErr TRBRACE + { $$ = exprNode_updateLocation ($2, lltok_getLoc ($3)); } + | TLBRACE initializerList TRBRACE + { $$ = exprNode_updateLocation ($2, lltok_getLoc ($3)); } + | TLBRACE initializerList stmtList TRBRACE + { $$ = exprNode_updateLocation (exprNode_concat ($2, $3), lltok_getLoc ($4)); } + +stmtListErr + : stmtErr + | stmtListErr stmtErr { $$ = exprNode_concat ($1, $2); } + +initializerList + : initializer { $$ = $1; } + | initializerList initializer { $$ = exprNode_concat ($1, $2); } + +stmtList + : stmt { $$ = $1; } + | stmtList stmt { $$ = exprNode_concat ($1, $2); } + +expressionStmt + : TSEMI { $$ = exprNode_createTok ($1); } + | expr TSEMI { $$ = exprNode_statement ($1); } + +expressionStmtErr + : TSEMI { $$ = exprNode_createTok ($1); } + | expr TSEMI { $$ = exprNode_statement ($1); } + | expr { $$ = exprNode_checkExpr ($1); } + +ifPred + : CIF TLPAREN expr TRPAREN + { $$ = $3; exprNode_produceGuards ($3); context_enterTrueClause ($3); } + /* + ** not ANSI: | CIF TLPAREN compoundStmt TRPAREN + ** { $$ = $3; context_enterTrueClause (); } + */ + +selectionStmt + : ifPred stmt + { + context_exitTrueClause ($1, $2); + $$ = exprNode_if ($1, $2); + } + | ifPred stmt CELSE { context_enterFalseClause ($1); } stmt + { + context_exitClause ($1, $2, $5); + $$ = exprNode_ifelse ($1, $2, $5); + } + | SWITCH TLPAREN expr { context_enterSwitch ($3); } + TRPAREN stmt { $$ = exprNode_switch ($3, $6); } + +whilePred + : WHILE TLPAREN expr TRPAREN + { $$ = exprNode_whilePred ($3); context_enterWhileClause ($3); } + /* not ANSI: | WHILE TLPAREN compoundStmt TRPAREN stmt { $$ = exprNode_while ($3, $5); } */ + +iterWhilePred + : WHILE TLPAREN expr TRPAREN { $$ = exprNode_whilePred($3); } + +iterStmt + : ITER_NAME { context_enterIterClause (); } + CreateInnerScope TLPAREN { setProcessingIterVars ($1); } + iterArgList TRPAREN + compoundStmt endIter DeleteInnerScope + { + $$ = exprNode_iter ($1, $6, $8, $9); + + } + +iterArgList + : iterArgExpr { $$ = exprNodeList_singleton ($1); } + | iterArgList { nextIterParam (); } TCOMMA iterArgExpr + { $$ = exprNodeList_push ($1, $4); } + +iterArgExpr + : assignIterExpr { $$ = exprNode_iterExpr ($1); } + | id { $$ = exprNode_iterId ($1); } + | TYPE_NAME_OR_ID { uentry ue = coerceIterId ($1); + + if (uentry_isValid (ue)) + { + $$ = exprNode_iterId (ue); + } + else + { + $$ = exprNode_iterNewId (cstring_copy (LastIdentifier ())); + } + } + | NEW_IDENTIFIER { $$ = exprNode_iterNewId ($1); } + +/* +** everything is the same, EXCEPT it cannot be a NEW_IDENTIFIER +*/ + +primaryIterExpr + : CCONSTANT + | TLPAREN expr TRPAREN { $$ = exprNode_addParens ($1, $2); } + +postfixIterExpr + : primaryIterExpr + | postfixExpr TLSQBR expr TRSQBR { $$ = exprNode_arrayFetch ($1, $3); } + | postfixExpr TLPAREN TRPAREN { $$ = exprNode_functionCall ($1, exprNodeList_new ()); } + | postfixExpr TLPAREN argumentExprList TRPAREN { $$ = exprNode_functionCall ($1, $3); } + | VA_ARG TLPAREN assignExpr TCOMMA typeExpression TRPAREN + { $$ = exprNode_vaArg ($1, $3, $5); } + | postfixExpr NotType TDOT newId IsType { $$ = exprNode_fieldAccess ($1, $4); } + | postfixExpr NotType ARROW_OP newId IsType { $$ = exprNode_arrowAccess ($1, $4); } + | postfixExpr INC_OP { $$ = exprNode_postOp ($1, $2); } + | postfixExpr DEC_OP { $$ = exprNode_postOp ($1, $2); } + +unaryIterExpr + : postfixIterExpr + | INC_OP unaryExpr { $$ = exprNode_preOp ($2, $1); } + | DEC_OP unaryExpr { $$ = exprNode_preOp ($2, $1); } + | TAMPERSAND castExpr { $$ = exprNode_preOp ($2, $1); } + | TMULT castExpr { $$ = exprNode_preOp ($2, $1); } + | TPLUS castExpr { $$ = exprNode_preOp ($2, $1); } + | TMINUS castExpr { $$ = exprNode_preOp ($2, $1); } + | TTILDE castExpr { $$ = exprNode_preOp ($2, $1); } + | TEXCL castExpr { $$ = exprNode_preOp ($2, $1); } + | sizeofExpr { $$ = $1; } + +castIterExpr + : unaryIterExpr + | TLPAREN typeExpression TRPAREN castExpr { $$ = exprNode_cast ($1, $4, $2); } + +timesIterExpr + : castIterExpr + | timesExpr TMULT castExpr { $$ = exprNode_op ($1, $3, $2); } + | timesExpr TDIV castExpr { $$ = exprNode_op ($1, $3, $2); } + | timesExpr TPERCENT castExpr { $$ = exprNode_op ($1, $3, $2); } + +plusIterExpr + : timesIterExpr + | plusExpr TPLUS timesExpr { $$ = exprNode_op ($1, $3, $2); } + | plusExpr TMINUS timesExpr { $$ = exprNode_op ($1, $3, $2); } + +shiftIterExpr + : plusIterExpr + | shiftExpr LEFT_OP plusExpr { $$ = exprNode_op ($1, $3, $2); } + | shiftExpr RIGHT_OP plusExpr { $$ = exprNode_op ($1, $3, $2); } + +relationalIterExpr + : shiftIterExpr + | relationalExpr TLT shiftExpr { $$ = exprNode_op ($1, $3, $2); } + | relationalExpr TGT shiftExpr { $$ = exprNode_op ($1, $3, $2); } + | relationalExpr LE_OP shiftExpr { $$ = exprNode_op ($1, $3, $2); } + | relationalExpr GE_OP shiftExpr { $$ = exprNode_op ($1, $3, $2); } + +equalityIterExpr + : relationalIterExpr + | equalityExpr EQ_OP relationalExpr { $$ = exprNode_op ($1, $3, $2); } + | equalityExpr NE_OP relationalExpr { $$ = exprNode_op ($1, $3, $2); } + +bitandIterExpr + : equalityIterExpr + | bitandExpr TAMPERSAND equalityExpr { $$ = exprNode_op ($1, $3, $2); } + +xorIterExpr + : bitandIterExpr + | xorExpr TCIRC bitandExpr { $$ = exprNode_op ($1, $3, $2); } +; + +bitorIterExpr + : xorIterExpr + | bitorExpr TBAR xorExpr { $$ = exprNode_op ($1, $3, $2); } + +andIterExpr + : bitorIterExpr + | andExpr AND_OP bitorExpr { $$ = exprNode_op ($1, $3, $2); } + +orIterExpr + : andIterExpr + | orExpr OR_OP andExpr { $$ = exprNode_op ($1, $3, $2); } + +conditionalIterExpr + : orIterExpr + | orExpr TQUEST { context_enterTrueClause ($1); } + expr TCOLON { context_enterFalseClause ($1); } conditionalExpr + { $$ = exprNode_cond ($1, $4, $7); } + +assignIterExpr + : conditionalIterExpr + | unaryExpr TASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr MUL_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr DIV_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr MOD_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr ADD_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr SUB_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr LEFT_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr RIGHT_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr AND_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr XOR_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + | unaryExpr OR_ASSIGN assignExpr { $$ = exprNode_assign ($1, $3, $2); } + +endIter + : ITER_ENDNAME { $$ = $1; } + | /* empty */ { $$ = uentry_undefined; } + +doHeader + : DO { context_enterDoWhileClause (); $$ = $1; } + +iterationStmt + : whilePred stmt + { $$ = exprNode_while ($1, $2); context_exitWhileClause ($1, $2); } + | doHeader stmt WHILE TLPAREN expr TRPAREN TSEMI + { $$ = exprNode_statement (exprNode_doWhile ($2, $5)); } + | forPred stmt + { $$ = exprNode_for ($1, $2); context_exitForClause ($1, $2); } + +iterationStmtErr + : whilePred stmtErr { $$ = exprNode_while ($1, $2); context_exitWhileClause ($1, $2); } + | doHeader stmtErr WHILE TLPAREN expr TRPAREN TSEMI + { $$ = exprNode_statement (exprNode_doWhile ($2, $5)); } + | doHeader stmtErr WHILE TLPAREN expr TRPAREN + { $$ = exprNode_doWhile ($2, $5); } + | forPred stmtErr { $$ = exprNode_for ($1, $2); context_exitForClause ($1, $2); } + +jumpStmt + : GOTO newId TSEMI { $$ = exprNode_goto ($2); } + | CONTINUE TSEMI { $$ = exprNode_continue ($1, BADTOK); } + | QINNERCONTINUE CONTINUE TSEMI + { $$ = exprNode_continue ($1, QINNERCONTINUE); } + | BREAK TSEMI { $$ = exprNode_break ($1, BADTOK); } + | QSWITCHBREAK BREAK TSEMI { $$ = exprNode_break ($2, QSWITCHBREAK); } + | QLOOPBREAK BREAK TSEMI { $$ = exprNode_break ($2, QLOOPBREAK); } + | QINNERBREAK BREAK TSEMI { $$ = exprNode_break ($2, QINNERBREAK); } + | QSAFEBREAK BREAK TSEMI { $$ = exprNode_break ($2, QSAFEBREAK); } + | RETURN TSEMI { $$ = exprNode_nullReturn ($1); } + | RETURN expr TSEMI { $$ = exprNode_return ($2); } + +optSemi + : + | TSEMI { ; } + +id + : IDENTIFIER + +newId + : NEW_IDENTIFIER + | ITER_NAME { $$ = uentry_getName ($1); } + | ITER_ENDNAME { $$ = uentry_getName ($1); } + | id { $$ = uentry_getName ($1); } + | TYPE_NAME_OR_ID { $$ = $1; } + +typeName + : TYPE_NAME + | TYPE_NAME_OR_ID { $$ = ctype_unknown; } + +%% + +/*@-redecl@*/ +extern char *yytext; +/*@=redecl@*/ + +# include "bison.reset" + +void yyerror (/*@unused@*/ char *s) +{ + static bool givehint = FALSE; + + if (context_inIterDef ()) + { + llerror (FLG_SYNTAX, message ("Iter syntax not parseable: %s", + context_inFunctionName ())); + } + else if (context_inIterEnd ()) + { + llerror (FLG_SYNTAX, message ("Iter finalizer syntax not parseable: %s", + context_inFunctionName ())); + } + else if (context_inMacro ()) + { + llerror (FLG_SYNTAX, message ("Macro syntax not parseable: %s", + context_inFunctionName ())); + + if (context_inMacroUnknown ()) + { + if (!givehint) + { + llhint (cstring_makeLiteral + ("Precede macro definition with /*@notfunction@*/ " + "to suppress checking and force expansion")); + givehint = TRUE; + } + } + + swallowMacro (); + } + else + { + llparseerror (cstring_undefined); + } +} + + + + + + + + + + + + + diff --git a/src/checking.c b/src/checking.c new file mode 100644 index 0000000..cdc1e5d --- /dev/null +++ b/src/checking.c @@ -0,0 +1,820 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** checking.c +** +** sort checking. +** +** AUTHOR: +** Yang Meng Tan, +** Massachusetts Institute of Technology +*/ + +# include "lclintMacros.nf" +# include "llbasic.h" +# include "llgrammar.h" +# include "checking.h" +# include "lclscan.h" + +/*@+ignorequals@*/ + +static /*@only@*/ cstring printBadArgs (sortSetList p_args); +static /*@only@*/ sortSet + standardOperators (/*@null@*/ nameNode p_n, sortSetList p_argSorts, sort p_qual); +static bool isStandardOperator (/*@null@*/ nameNode p_n); +static void assignSorts (termNode p_t, sort p_s); + +/*@null@*/ termNode +computePossibleSorts (/*@returned@*/ /*@null@*/ termNode t) +{ + ltoken errtok; + + if (t != (termNode) 0) + { + switch (t->kind) + { + case TRM_LITERAL: + case TRM_CONST: + case TRM_VAR: + case TRM_ZEROARY: + case TRM_SIZEOF: + case TRM_UNCHANGEDALL: + case TRM_UNCHANGEDOTHERS: + case TRM_QUANTIFIER: + break; + case TRM_APPLICATION: + { + bool fail = FALSE; + sortSetList argSorts = sortSetList_new (); + lslOpSet ops; + sortSet standards; + + if (termNodeList_size (t->args) != 0) + { + termNodeList_elements (t->args, arg) + { + (void) computePossibleSorts (arg); + + if (sortSet_size (arg->possibleSorts) == 0) + { + fail = TRUE; + } + else + { + sortSetList_addh (argSorts, arg->possibleSorts); + } + } end_termNodeList_elements; + + if (fail) + { + lslOpSet_free (t->possibleOps); + sortSetList_free (argSorts); + t->possibleOps = lslOpSet_new (); + return t; + } + } + + ops = symtable_opsWithLegalDomain (g_symtab, t->name, argSorts, t->given); + lslOpSet_free (t->possibleOps); + t->possibleOps = ops; + + lslOpSet_elements (t->possibleOps, op) + { + sort sort; + sort = sigNode_rangeSort (op->signature); + (void) sortSet_insert (t->possibleSorts, sort); + } end_lslOpSet_elements; + + standards = standardOperators (t->name, argSorts, t->given); + + sortSet_elements (standards, el) + { + (void) sortSet_insert (t->possibleSorts, el); + } end_sortSet_elements; + + sortSet_free (standards); + + if (!(t->error_reported) && sortSet_size (t->possibleSorts) == 0) + { + unsigned int arity = termNodeList_size (t->args); + errtok = nameNode_errorToken (t->name); + + /* errorShowPoint (tsource_thisLine (lclsource), ltoken_getCol (errtok)); */ + + if (isStandardOperator (t->name)) + { + lclerror (errtok, + message ("Type error: %q not declared for %q", + nameNode_unparse (t->name), printBadArgs (argSorts))); + } + else if (t->name != NULL + && symtable_opExistsWithArity (g_symtab, t->name, arity)) + { + sigNodeSet possibleOps = symtable_possibleOps (g_symtab, t->name); + cstring opName = nameNode_unparse (t->name); + + /* + ** all these will be standardOperators soon... + */ + + if (cstring_equalLit (opName, "__ [__]")) + { + lclerror (errtok, + message ("Type error: %q not declared for %q", + opName, printBadArgs (argSorts))); + } + else + { + lclerror (errtok, + message ("Type error: %q declared: %q\ngiven: %q", + opName, + sigNodeSet_unparseSomeSigs (possibleOps), + printBadArgs (argSorts))); + } + } + else + { + sigNodeSet possibleOps; + int npossibleOps; + + llassert (t->name != NULL); + + possibleOps = symtable_possibleOps (g_symtab, t->name); + npossibleOps = sigNodeSet_size (possibleOps); + + /* + ** evs --- check is it is wrong arity... + */ + + if (npossibleOps == 0) + { + lclerror + (errtok, + message ("Undeclared operator: %q", nameNode_unparse (t->name))); + } + else + { + lclerror + (errtok, + message ("Operator %q declared for %q arguments, given %d", + nameNode_unparse (t->name), + sigNodeSet_unparsePossibleAritys (possibleOps), + arity)); + } + } + t->error_reported = TRUE; + } + sortSetList_free (argSorts); + break; + } + } + } + + return t; +} + +static /*@only@*/ cstring +printBadArgs (sortSetList args) +{ + if (sortSetList_size (args) == 1) + { + return (sortSet_unparseOr (sortSetList_head (args))); + } + else + { + cstring s = cstring_undefined; + int argno = 1; + + sortSetList_elements (args, ss) + { + if (argno == 1) + s = message ("arg %d: %q", argno, sortSet_unparseOr (ss)); + else + s = message ("%q; arg %d: %q", s, argno, sortSet_unparseOr (ss)); + argno++; + } end_sortSetList_elements; + + return s; + } +} + +termNode +checkSort (/*@returned@*/ termNode t) +{ + sortSet sorts; + sort theSort; + int size; + ltoken errtok; + + (void) computePossibleSorts (t); + sorts = t->possibleSorts; + + llassert (sortSet_isDefined (sorts)); + + size = sortSet_size (sorts); + switch (size) + { + case 0: /* complain later */ + break; + case 1: /* just right */ + theSort = sortSet_choose (sorts); + assignSorts (t, theSort); + break; + default: + /* we allow C literals to have multiple sorts */ + if (t->kind != TRM_LITERAL) + { + errtok = termNode_errorToken (t); + t->error_reported = TRUE; + + lclerror (errtok, + message ("Term %q: can have more than one possible type. Possible types: %q", + termNode_unparse (t), sortSet_unparseClean (sorts))); + } + } + return t; +} + +static void + assignSorts (termNode t, sort s) +{ + /* other kinds are already assigned bottom-up */ + ltoken errtok; + + switch (t->kind) + { + case TRM_ZEROARY: /* pick s to be the sort chosen */ + case TRM_LITERAL: + sortSet_elements (t->possibleSorts, s2) + { + if (sort_equal (&s2, &s)) + { + sortSet_free (t->possibleSorts); + t->possibleSorts = sortSet_new (); + (void) sortSet_insert (t->possibleSorts, s); + t->sort = s; + } + return; + } end_sortSet_elements; + break; + case TRM_APPLICATION: + { + lslOpSet sigs = t->possibleOps; + lslOpSet oldops = lslOpSet_undefined; + sigNode op = (sigNode) 0; + nameNode name = t->name; + termNodeList args = t->args; + bool found = FALSE; + + errtok = nameNode_errorToken (name); + + /* why compute again? to check for duplicates */ + lslOpSet_elements (sigs, sig) + { + sort rsort = sigNode_rangeSort (sig->signature); + + if (sort_equal (&s, &rsort)) + { + lslOp iop; + + if (found) + { + t->error_reported = TRUE; + + lclerror (errtok, + message ("Ambiguous operator %q: %q or %q", + nameNode_unparse (name), + sigNode_unparse (op), + sigNode_unparse (sig->signature))); + return; + } + + iop = (lslOp) dmalloc (sizeof (*iop)); + found = TRUE; + op = sig->signature; + + oldops = t->possibleOps; + t->possibleOps = lslOpSet_new (); + iop->name = nameNode_copy (name); + iop->signature = op; + (void) lslOpSet_insert (t->possibleOps, iop); + t->sort = s; + /*@-branchstate@*/ + } + /*@=branchstate@*/ + } end_lslOpSet_elements; + + lslOpSet_free (oldops); + + if (!found) + { + if (sortSet_size (t->possibleSorts) == 1) + { + t->sort = sortSet_choose (t->possibleSorts); + } + else + { + /* errorShowPoint (tsource_thisLine (lclsource), ltoken_getCol (errtok)); */ + t->error_reported = TRUE; + + lclerror (errtok, message ("Operator not found: %q", + nameNode_unparse (name))); + /* evs --- ??? */ + } + return; + } + + if (termNodeList_empty (args)) + { + if (op != (sigNode) 0) + { + /* was --- NB: copy to avoid interference */ + /* shouldn't need to copy --- its a fresh list */ + sortList dom = sigNode_domain (op); + + sortList_reset (dom); + termNodeList_elements (args, arg) + { + assignSorts (arg, sortList_current (dom)); + sortList_advance (dom); + } end_termNodeList_elements; + + sortList_free (dom); + } + else + { + errtok = nameNode_errorToken (name); + /* errorShowPoint (tsource_thisLine (lclsource), ltoken_getCol (errtok)); */ + t->error_reported = TRUE; + + lclerror (errtok, message ("No matching operator: %q", + nameNode_unparse (name))); + } + return; + } + break; + } + default: /* do nothing */ + break; + } +} + +void +checkLclPredicate (ltoken t, lclPredicateNode n) +{ + sort theSort; + + if ((n == NULL) || (n->predicate == NULL)) + { + llcontbuglit ("checkLclPredicate expects valid lclPredicate. " + "Skipping current check"); + return; + } + + /* check only if there are no previous errors */ + + if (!n->predicate->error_reported) + { + /* check that the sort of n is boolean */ + theSort = n->predicate->sort; + if (!sort_compatible (theSort, sort_capBool)) + { + if (sort_isNoSort (theSort)) + { + ; /* "Expects a boolean term. Given term has unknown sort" */ + } + else + { + cstring clauset = ltoken_getRawString (t); + + if (cstring_firstChar (clauset) == '(') + { + clauset = cstring_makeLiteral ("Equality"); + } + else + { + /* uppercase first letter */ + clauset = cstring_copy (clauset); + cstring_setChar (clauset, 1, + (char) toupper (cstring_firstChar (clauset))); + } + + lclerror (t, message ("%q expects a boolean term, given %q.", + clauset, sort_unparse (theSort))); + + } + } + } +} + +/* +** these should not be doing string comparisons! +*/ + +static bool isDeRefOperator (cstring s) +{ + return (cstring_equalLit (s, "*")); +} + +static bool isStateOperator (cstring s) +{ + return (cstring_equalLit (s, "^") || + cstring_equalLit (s, "'") || + cstring_equalLit (s, "\\any") || + cstring_equalLit (s, "\\pre") || + cstring_equalLit (s, "\\post")); +} + +static bool isCompareOperator (cstring s) /* YUCK!!! */ +{ + return (cstring_equalLit (s, "\\eq") || + cstring_equalLit (s, "\\neq") || + cstring_equalLit (s, "=") || + cstring_equalLit (s, "!=") || + cstring_equalLit (s, "~=") || + cstring_equalLit (s, "==")); +} + +static bool isStandardOperator (/*@null@*/ nameNode n) +{ + if (n != (nameNode) 0) + { + if (!n->isOpId) + { + opFormNode opf = n->content.opform; + + llassert (opf != NULL); + + switch (opf->kind) + { + case OPF_IF: return TRUE; + case OPF_ANYOP: + break; + case OPF_MANYOP: + { + cstring s = ltoken_getRawString (opf->content.anyop); + + if (isStateOperator (s)) return TRUE; + return FALSE; + } + case OPF_ANYOPM: + /* operator: *__ */ + { + cstring s = ltoken_getRawString (opf->content.anyop); + + return (isDeRefOperator (s)); + } + case OPF_MANYOPM: + { + cstring s = ltoken_getRawString (opf->content.anyop); + + return (isCompareOperator (s)); + } + case OPF_MIDDLE: + break; + case OPF_MMIDDLE: + break; + case OPF_MIDDLEM: + break; + case OPF_MMIDDLEM: + break; + case OPF_BMIDDLE: + break; + case OPF_BMMIDDLE: + break; + case OPF_BMIDDLEM: + break; + case OPF_BMMIDDLEM: + break; + case OPF_SELECT: + break; + case OPF_MAP: + break; + case OPF_MSELECT: + break; + case OPF_MMAP: + break; + default: + break; + } + } + else + { + int code = ltoken_getCode (n->content.opid); + + if (code == simpleId) + { + cstring text = nameNode_unparse (n); + bool ret = (cstring_equalLit (text, "trashed") + || cstring_equalLit (text, "maxIndex") + || cstring_equalLit (text, "minIndex") + || cstring_equalLit (text, "isSub")); + + cstring_free (text); + return ret; + } + + return (code == LLT_MODIFIES || code == LLT_FRESH + || code == LLT_UNCHANGED || code == LLT_SIZEOF); + } + } + return FALSE; +} + +static /*@only@*/ sortSet +standardOperators (/*@null@*/ nameNode n, sortSetList argSorts, /*@unused@*/ sort qual) +{ + sortSet argSet; + sortSet ret = sortSet_new (); + + if (n == (nameNode) 0) return ret; + + if (n->isOpId) + { + int code = ltoken_getCode (n->content.opid); + + if (sortSetList_size (argSorts) == 1) + { + sortSetList_reset (argSorts); + + argSet = sortSetList_current (argSorts); + + sortSet_elements (argSet, current) + { + sortNode sn; + + sn = sort_quietLookup (current); + + while (sn.kind == SRT_SYN) + { + sn = sort_quietLookup (sn.baseSort); + } + + /*@-loopswitchbreak@*/ + switch (code) + { + case simpleId: + { + cstring text = ltoken_getRawString (n->content.opid); + + if (cstring_equalLit (text, "trashed")) /* GACK! */ + { + if (sn.kind == SRT_OBJ || + sn.kind == SRT_ARRAY) + (void) sortSet_insert (ret, sort_bool); + } + + if (cstring_equalLit (text, "maxIndex") || + cstring_equalLit (text, "minIndex")) + { + if (sn.kind == SRT_ARRAY || sn.kind == SRT_PTR) + (void) sortSet_insert (ret, sort_int); + + /* if (lsymbol_fromChars ("maxIndex") */ + } + } + break; + case LLT_MODIFIES: + case LLT_FRESH: + case LLT_UNCHANGED: + if (sn.kind == SRT_OBJ || + sn.kind == SRT_ARRAY) + { + (void) sortSet_insert (ret, sort_bool); + } + break; + case LLT_SIZEOF: + if (sn.kind == SRT_OBJ || + sn.kind == SRT_ARRAY || + sn.kind == SRT_VECTOR) + (void) sortSet_insert (ret, sort_int); + break; + default: + break; + } + } end_sortSet_elements; + } + } + else + { + opFormNode opf = n->content.opform; + + llassert (opf != NULL); + + switch (opf->kind) + { + case OPF_IF: + /* + ** if __ then __ else __ : bool, S, S -> S + ** is defined for all sorts + */ + + if (sortSetList_size (argSorts) == 3) + { + argSet = sortSetList_head (argSorts); + + if (sortSet_member (argSet, sort_bool)) + { + sortSetList_reset (argSorts); + sortSetList_advance (argSorts); + + argSet = sortSetList_current (argSorts); + + if (sortSet_size (argSet) == 1) + { + sort clause = sortSet_choose (argSet); + sort clause2; + + sortSetList_advance (argSorts); + argSet = sortSetList_current (argSorts); + + clause2 = sortSet_choose (argSet); + + if (sortSet_size (argSet) == 1 && + sort_equal (&clause, &clause2)) + { + (void) sortSet_insert (ret, clause); + } + } + } + } + break; + case OPF_MANYOP: + { + cstring s = ltoken_getRawString (opf->content.anyop); + + if (isStateOperator (s)) + { + if (sortSetList_size (argSorts) == 1) + { + sortSetList_reset (argSorts); + + argSet = sortSetList_current (argSorts); + + sortSet_elements (argSet, current) + { + sortNode sn; + + sn = sort_quietLookup (current); + + while (sn.kind == SRT_SYN) + { + sn = sort_quietLookup (sn.baseSort); + } + + switch (sn.kind) + { + case SRT_OBJ: + (void) sortSet_insert (ret, sn.baseSort); + break; + case SRT_ARRAY: + (void) sortSet_insert (ret, + sort_makeVec (ltoken_undefined, current)); + break; + case SRT_STRUCT: + (void) sortSet_insert (ret, + sort_makeTuple (ltoken_undefined, current)); + break; + case SRT_UNION: + (void) sortSet_insert (ret, + sort_makeUnionVal (ltoken_undefined, current)); + break; + case SRT_TUPLE: + case SRT_UNIONVAL: + case SRT_ENUM: + case SRT_LAST: + case SRT_FIRST: + case SRT_NONE: + case SRT_HOF: + case SRT_PRIM: + case SRT_PTR: + case SRT_VECTOR: + break; + case SRT_SYN: + llbuglit ("standardOperators: Synonym in switch"); + } + } end_sortSet_elements ; + } + } + } + break; + case OPF_ANYOPM: + /* operator: *__ */ + { + cstring s = ltoken_getRawString (opf->content.anyop); + + if (isDeRefOperator (s)) + { + if (sortSetList_size (argSorts) == 1) + { + sortSetList_reset (argSorts); + + argSet = sortSetList_current (argSorts); + + sortSet_elements (argSet, current) + { + sortNode sn; + + sn = sort_quietLookup (current); + + while (sn.kind == SRT_SYN) + { + sn = sort_quietLookup (sn.baseSort); + } + + if (sn.kind == SRT_PTR) + { + (void) sortSet_insert (ret, sn.baseSort); + } + } end_sortSet_elements; + } + } + } + break; + case OPF_ANYOP: + break; + case OPF_MANYOPM: + { + cstring s = ltoken_getRawString (opf->content.anyop); + + if (isCompareOperator (s)) + { + if (sortSetList_size (argSorts) == 2) + { + sortSet argSet2; + + sortSetList_reset (argSorts); + + argSet = sortSetList_current (argSorts); + sortSetList_advance (argSorts); + argSet2 = sortSetList_current (argSorts); + + if (sortSet_size (argSet) == 1) + { + sortSet_elements (argSet, cl) + { + sortSet_elements (argSet2, cl2) + { + if (sort_equal (&cl, &cl2)) + { + (void) sortSet_insert (ret, sort_bool); + } + } end_sortSet_elements; + } end_sortSet_elements; + } + } + } + } + break; + case OPF_MIDDLE: + break; + case OPF_MMIDDLE: + break; + case OPF_MIDDLEM: + break; + case OPF_MMIDDLEM: + break; + case OPF_BMIDDLE: + break; + case OPF_BMMIDDLE: + break; + case OPF_BMIDDLEM: + break; + case OPF_BMMIDDLEM: + break; + case OPF_SELECT: + break; + case OPF_MAP: + break; + case OPF_MSELECT: + break; + case OPF_MMAP: + break; + default: + break; + } + /*@=loopswitchbreak@*/ + } + return ret; +} diff --git a/src/clabstract.c b/src/clabstract.c new file mode 100644 index 0000000..573cf29 --- /dev/null +++ b/src/clabstract.c @@ -0,0 +1,2273 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** clabstract.c +** +** ASTs for C grammar +** +*/ + +# include "lclintMacros.nf" +# include "llbasic.h" +# include "cgrammar.h" + +# ifndef NOLCL +# include "usymtab_interface.h" +# endif + +# include "structNames.h" +# include "nameChecks.h" + +# ifdef SANITIZER +# include "sgrammar_tokens.h" +# else +# include "cgrammar_tokens.h" +# endif + +/* +** Lots of variables are needed because of interactions with the +** parser. This is easier than restructuring the grammar so the +** right values are available in the right place. +*/ + +static /*@only@*/ sRefSet fcnModifies = sRefSet_undefined; +static /*@only@*/ /*@null@*/ specialClauses specClauses = specialClauses_undefined; +static bool fcnNoGlobals = FALSE; +static bool ProcessingVars = FALSE; +static bool ProcessingParams = FALSE; +static bool ProcessingGlobals = FALSE; +static bool ProcessingTypedef = FALSE; +static bool ProcessingIterVars = FALSE; +static /*@only@*/ qtype processingType = qtype_undefined; +static uentry currentIter = uentry_undefined; +static globSet currentGlobals = globSet_undefined; +static /*@dependent@*/ uentryList saveParamList; /* for old style functions */ +static /*@owned@*/ uentry saveFunction = uentry_undefined; +static int saveIterParamNo; +static idDecl fixStructDecl (/*@returned@*/ idDecl p_d); +static void checkTypeDecl (uentry p_e, ctype p_rep); +static /*@dependent@*/ fileloc saveStoreLoc = fileloc_undefined; +static storageClassCode storageClass = SCNONE; +static void declareEnumList (/*@temp@*/ enumNameList p_el, ctype p_c, fileloc p_loc); +static void resetGlobals (void); +static qual specialFunctionCode = QU_UNKNOWN; +static bool argsUsed = FALSE; + +static bool hasSpecialCode (void) +{ + return (specialFunctionCode != QU_UNKNOWN); +} + +extern void setArgsUsed (void) +{ + if (argsUsed) + { + voptgenerror + (FLG_SYNTAX, + cstring_makeLiteral ("Multiple ARGSUSED comments for one function"), + g_currentloc); + } + + argsUsed = TRUE; +} + +static void reflectArgsUsed (uentry ue) +{ + if (argsUsed) + { + if (uentry_isFunction (ue)) + { + uentryList params = uentry_getParams (ue); + + uentryList_elements (params, el) + { + uentry_setUsed (el, fileloc_undefined); + } end_uentryList_elements ; + } + + argsUsed = FALSE; + } +} + +extern void setSpecialFunction (qual qu) +{ + if (specialFunctionCode != QU_UNKNOWN) + { + voptgenerror (FLG_SYNTAX, + message ("Multiple special function codes: %s, %s " + "(first code is ignored)", + qual_unparse (specialFunctionCode), + qual_unparse (qu)), + g_currentloc); + } + + specialFunctionCode = qu; +} + +static void reflectSpecialCode (uentry ue) +{ + switch (specialFunctionCode) + { + case QU_UNKNOWN: break; + case QU_PRINTFLIKE: + uentry_setPrintfLike (ue); + break; + case QU_SCANFLIKE: + uentry_setScanfLike (ue); + break; + case QU_MESSAGELIKE: + uentry_setMessageLike (ue); + break; + BADDEFAULT; + } + + specialFunctionCode = QU_UNKNOWN; +} + +static void resetStorageClass (void) +{ + qtype_free (processingType); + processingType = qtype_undefined; + storageClass = SCNONE; +} + +static void reflectModGlobs (uentry ue) +{ + if (fcnNoGlobals) + { + llassert (globSet_isUndefined (currentGlobals)); + + uentry_setGlobals (ue, globSet_undefined); + fcnNoGlobals = FALSE; + } + else if (globSet_isDefined (currentGlobals)) + { + uentry_setGlobals (ue, currentGlobals); + currentGlobals = globSet_undefined; + } + else + { + ; /* no globals */ + } + + if (sRefSet_isDefined (fcnModifies)) + { + uentry_setModifies (ue, fcnModifies); + fcnModifies = sRefSet_undefined; + } + + if (uentry_isFunction (ue)) + { + uentry_setSpecialClauses (ue, specClauses); + specClauses = NULL; + DPRINTF (("Done with spec clauses")); + } +} + +static void reflectStorageClass (uentry u) +{ + if (storageClass == SCSTATIC) + { + uentry_setStatic (u); + } + else if (storageClass == SCEXTERN) + { + uentry_setExtern (u); + } + else + { + ; /* no storage class */ + } + + } + +void storeLoc () +{ + saveStoreLoc = g_currentloc; +} + +void setFunctionNoGlobals (void) +{ + llassert (globSet_isUndefined (currentGlobals)); + fcnNoGlobals = TRUE; +} + +void + setFunctionStateSpecialClause (lltok stok, specialClauseKind kind, + sRefSet s, + /*@unused@*/ lltok etok) +{ + int tok = lltok_getTok (stok); + + switch (tok) + { + case QPRECLAUSE: + specClauses = specialClauses_add (specClauses, + specialClause_create (TK_BEFORE, kind, s)); + break; + case QPOSTCLAUSE: + specClauses = specialClauses_add (specClauses, + specialClause_create (TK_AFTER, kind, s)); + break; + default: + sRefSet_free (s); + BADBRANCH; + } + + DPRINTF (("Added to specclauses: %s", specialClauses_unparse (specClauses))); +} + +void setFunctionSpecialClause (lltok stok, sRefSet s, + /*@unused@*/ lltok etok) +{ + int tok = lltok_getTok (stok); + + switch (tok) + { + case QUSES: + specClauses = specialClauses_add (specClauses, specialClause_createUses (s)); + break; + case QDEFINES: + specClauses = specialClauses_add (specClauses, specialClause_createDefines (s)); + break; + case QALLOCATES: + specClauses = specialClauses_add (specClauses, specialClause_createAllocates (s)); + break; + case QSETS: + specClauses = specialClauses_add (specClauses, specialClause_createSets (s)); + break; + case QRELEASES: + specClauses = specialClauses_add (specClauses, specialClause_createReleases (s)); + break; + default: + sRefSet_free (s); + BADBRANCH; + } + + DPRINTF (("Added to specclauses: %s", specialClauses_unparse (specClauses))); +} + +void setFunctionModifies (sRefSet s) +{ + sRefSet_free (fcnModifies); + fcnModifies = s; +} + +static void reflectGlobalQualifiers (sRef sr, qualList quals) +{ + qualList_elements (quals, qel) + { + if (qual_isGlobalQual (qel)) /* undef, killed */ + { + sstate oldstate = sRef_getDefState (sr); + sstate defstate = sstate_fromQual (qel); + + if ((oldstate == SS_UNDEFGLOB && defstate == SS_KILLED) + || (oldstate == SS_KILLED && defstate == SS_UNDEFGLOB)) + { + defstate = SS_UNDEFKILLED; + } + else + { + ; /* any errors? */ + } + + sRef_setDefState (sr, defstate, fileloc_undefined); + } + else if (qual_isAllocQual (qel)) /* out, partial, reldef, etc. */ + { + ctype realType = sRef_getType (sr); + sstate defstate = sstate_fromQual (qel); + + if (qual_isRelDef (qel)) + { + ; /* okay anywhere */ + } + else + { + if (!ctype_isAP (realType) + && !ctype_isSU (realType) + && !ctype_isUnknown (realType) + && !ctype_isAbstract (sRef_getType (sr))) + { + llerror + (FLG_SYNTAX, + message ("Qualifier %s used on non-pointer or struct: %q", + qual_unparse (qel), sRef_unparse (sr))); + + } + } + + sRef_setDefState (sr, defstate, fileloc_undefined); + } + else if (qual_isNull (qel)) + { + sRef_setNullState (sr, NS_POSNULL, fileloc_undefined); + } + else if (qual_isRelNull (qel)) + { + sRef_setNullState (sr, NS_RELNULL, fileloc_undefined); + } + else if (qual_isNotNull (qel)) + { + sRef_setNullState (sr, NS_MNOTNULL, fileloc_undefined); + } + else + { + if (qual_isCQual (qel)) + { + ; /* okay */ + } + else + { + llerror (FLG_SYNTAX, + message ("Qualifier %s cannot be used in a globals list", + qual_unparse (qel))); + } + } + } end_qualList_elements; +} + +void globListAdd (sRef sr, qualList quals) +{ + if (sRef_isValid (sr)) + { + sRef sc = sRef_copy (sr); + + reflectGlobalQualifiers (sc, quals); + currentGlobals = globSet_insert (currentGlobals, sc); + } +} + +extern void declareCIter (cstring name, /*@owned@*/ uentryList params) +{ + uentry ue; + + ue = uentry_makeIter (name, + ctype_makeFunction (ctype_void, params), + fileloc_copy (g_currentloc)); + + usymtab_supEntry (uentry_makeEndIter (name, fileloc_copy (g_currentloc))); + + reflectModGlobs (ue); + + ue = usymtab_supGlobalEntryReturn (ue); +} + +extern void nextIterParam (void) +{ + llassert (ProcessingIterVars); + saveIterParamNo++; +} + +extern int iterParamNo (void) +{ + llassert (ProcessingIterVars); + return saveIterParamNo; +} + +/* +** yucky hacks to put it in the right place +*/ + +/*@only@*/ uentry +makeCurrentParam (idDecl t) +{ + uentry ue; + + saveStoreLoc = fileloc_undefined; + + /* param number unknown */ + + ue = uentry_makeParam (t, 0); + return ue; +} + +ctype +declareUnnamedEnum (enumNameList el) +{ + ctype ret = usymtab_enumEnumNameListType (el); + ctype rt; + uentry e; + + if (ctype_isDefined (ret)) + { + rt = ret; + e = uentry_makeEnumTagLoc (ctype_enumTag (rt), ret); + + reflectStorageClass (e); + usymtab_supGlobalEntry (e); + + declareEnumList (el, ret, g_currentloc); + enumNameList_free (el); + } + else + { + ctype ct = ctype_createEnum (fakeTag (), el); + + e = uentry_makeEnumTagLoc (ctype_enumTag (ctype_realType (ct)), ct); + reflectStorageClass (e); + + e = usymtab_supGlobalEntryReturn (e); + rt = uentry_getAbstractType (e); + declareEnumList (el, ct, g_currentloc); + } + + return (rt); +} + +ctype +declareEnum (cstring ename, enumNameList el) +{ + ctype cet; + uentry e; + + llassert (cstring_isDefined (ename)); + + cet = ctype_createEnum (ename, el); + e = uentry_makeEnumTagLoc (ename, cet); + reflectStorageClass (e); + e = usymtab_supGlobalEntryReturn (e); + cet = uentry_getType (e); + declareEnumList (el, cet, uentry_whereLast (e)); + return (uentry_getAbstractType (e)); +} + +static void +declareEnumList (enumNameList el, ctype c, fileloc loc) +{ + bool boolnames = FALSE; + bool othernames = FALSE; + + (void) context_getSaveLocation (); /* undefine it */ + + if (context_maybeSet (FLG_NUMENUMMEMBERS)) + { + int maxnum = context_getValue (FLG_NUMENUMMEMBERS); + int num = enumNameList_size (el); + + if (num > maxnum) + { + voptgenerror + (FLG_NUMENUMMEMBERS, + message ("Enumerator %s declared with %d members (limit is set to %d)", + ctype_unparse (c), num, maxnum), + loc); + } + } + + enumNameList_elements (el, e) + { + uentry ue = usymtab_lookupExposeGlob (e); + ctype ct = uentry_getType (ue); + + llassert (uentry_isEnumConstant (ue)); + + if (ctype_isUnknown (ct)) + { + uentry_setType (ue, c); + } + else + { + if (cstring_equal (e, context_getFalseName ()) + || cstring_equal (e, context_getTrueName ())) + { + if (othernames) + { + if (optgenerror + (FLG_INCONDEFS, + message ("Enumerator mixes boolean name (%s) with " + "non-boolean names", + e), + uentry_whereLast (ue))) + { + ; + } + } + + boolnames = TRUE; + uentry_setType (ue, ctype_bool); + } + else + { + if (boolnames) + { + if (optgenerror + (FLG_INCONDEFS, + message ("Enumerator mixes boolean names (%s, %s) with " + "non-boolean name: %s", + context_getTrueName (), + context_getFalseName (), + e), + uentry_whereLast (ue))) + { + ; + } + } + + othernames = TRUE; + } + + if (!ctype_match (c, ct)) + { + if (ctype_isDirectBool (ct)) + { + if (cstring_equal (e, context_getFalseName ()) + || cstring_equal (e, context_getTrueName ())) + { + ; + } + else + { + if (optgenerror + (FLG_INCONDEFS, + message ("Enumerator member %s declared with " + "inconsistent type: %s", + e, ctype_unparse (c)), + uentry_whereLast (ue))) + { + uentry_showWhereSpecifiedExtra + (ue, cstring_copy (ctype_unparse (ct))); + } + } + } + else + { + if (optgenerror + (FLG_INCONDEFS, + message ("Enumerator member %s declared with " + "inconsistent type: %s", + e, ctype_unparse (c)), + uentry_whereLast (ue))) + { + uentry_showWhereSpecifiedExtra + (ue, cstring_copy (ctype_unparse (ct))); + } + } + } + } + } end_enumNameList_elements; +} + +static /*@dependent@*/ uentryList currentParamList; + +void setCurrentParams (/*@dependent@*/ uentryList ue) +{ + currentParamList = ue; +} + +void clearCurrentParams (void) +{ + currentParamList = uentryList_undefined; +} + +/* +** requires: uentry_isFunction (e) +** parameter names for current function are in currentParamList +*/ + +static void enterFunctionParams (uentryList params) +{ + int paramno = 0; + + uentryList_elements (params, current) + { + if (uentry_hasName (current)) + { + uentry_setParamNo (current, paramno); + usymtab_supEntry (uentry_copy (current)); + } + + paramno++; + } end_uentryList_elements; +} + + +extern void enterParamsTemp (void) +{ + usymtab_enterScope (); + enterFunctionParams (currentParamList); +} + +extern void exitParamsTemp (void) +{ + usymtab_quietPlainExitScope (); +} + +static /*@exposed@*/ uentry globalDeclareFunction (idDecl tid) +{ + ctype deftype = idDecl_getCtype (tid); + ctype rettype; + uentry ue; + + DPRINTF (("Global function: %s", idDecl_unparse (tid))); + + if (ctype_isFunction (deftype)) + { + rettype = ctype_returnValue (deftype); + } + else + { + rettype = ctype_unknown; + } + + /* + ** check has been moved here... + */ + + if (ctype_isFunction (idDecl_getCtype (tid))) + { + ue = uentry_makeIdFunction (tid); + reflectSpecialCode (ue); + reflectArgsUsed (ue); + } + else + { + llparseerror (message ("Inconsistent function declaration: %q", + idDecl_unparse (tid))); + + tid = idDecl_replaceCtype + (tid, ctype_makeFunction (ctype_unknown, uentryList_undefined)); + ue = uentry_makeIdFunction (tid); + } + + reflectStorageClass (ue); + + uentry_checkParams (ue); + reflectModGlobs (ue); + + ue = usymtab_supGlobalEntryReturn (ue); + context_enterFunction (ue); + enterFunctionParams (uentry_getParams (ue)); + + resetStorageClass (); + return (ue); +} + +/* +** for now, no type checking +** (must check later though!) +*/ + +static /*@only@*/ uentry globalDeclareOldStyleFunction (idDecl tid) +{ + uentry ue; + + /* + ** check has been moved here... + */ + + if (cstring_equalLit (idDecl_observeId (tid), "main")) + { + context_setFlagTemp (FLG_MAINTYPE, FALSE); + } + + ue = uentry_makeIdFunction (tid); + reflectStorageClass (ue); + reflectSpecialCode (ue); + reflectArgsUsed (ue); + uentry_setDefined (ue, g_currentloc); + + uentry_checkParams (ue); + + if (ProcessingGlobals) + { + uentry_setGlobals (ue, currentGlobals); + } + + resetStorageClass (); + return (ue); +} + +static void oldStyleDeclareFunction (/*@only@*/ uentry e) +{ + uentryList params = saveParamList; + ctype rt = uentry_getType (e); + + llassert (ctype_isFunction (rt)); + + e = usymtab_supGlobalEntryReturn (e); + + context_enterFunction (e); + enterFunctionParams (params); + saveParamList = uentryList_undefined; + resetStorageClass (); +} + +void declareFunction (idDecl tid) /*@globals undef saveFunction; @*/ +{ + uentry ue; + + DPRINTF (("Declare function: %s", idDecl_unparse (tid))); + + if (ProcessingParams) + { + ue = globalDeclareOldStyleFunction (tid); + saveFunction = ue; + } + else + { + saveFunction = uentry_undefined; + + if (context_inRealFunction ()) + { + ue = uentry_makeVariableLoc (idDecl_observeId (tid), ctype_unknown); + + llparseerror (message ("Function declared inside function: %q", + idDecl_unparse (tid))); + + context_quietExitFunction (); + ue = usymtab_supEntryReturn (ue); + } + else + { + if (context_inInnerScope ()) + { + llparseerror (message ("Declaration in inner context: %q", + idDecl_unparse (tid))); + + sRef_setGlobalScope (); + ue = uentry_makeVariableLoc (idDecl_observeId (tid), + ctype_unknown); + ue = usymtab_supGlobalEntryReturn (ue); + sRef_clearGlobalScope (); + } + else + { + ue = globalDeclareFunction (tid); + } + } + + resetGlobals (); + } + + resetStorageClass (); + idDecl_free (tid); +} + +void declareStaticFunction (idDecl tid) /*@globals undef saveFunction; @*/ +{ + uentry ue; + + DPRINTF (("Declare static funciton: %s", idDecl_unparse (tid))); + + if (ProcessingParams) + { + ue = globalDeclareOldStyleFunction (tid); + saveFunction = ue; + } + else + { + saveFunction = uentry_undefined; + + if (context_inRealFunction ()) + { + ue = uentry_makeVariableLoc (idDecl_observeId (tid), ctype_unknown); + + llparseerror (message ("Function declared inside function: %q", + idDecl_unparse (tid))); + + context_quietExitFunction (); + ue = usymtab_supEntryReturn (ue); + } + else + { + if (context_inInnerScope ()) + { + llparseerror (message ("Declaration in inner context: %q", + idDecl_unparse (tid))); + + sRef_setGlobalScope (); + ue = uentry_makeVariableLoc (idDecl_observeId (tid), + ctype_unknown); + ue = usymtab_supGlobalEntryReturn (ue); + sRef_clearGlobalScope (); + } + else + { + ctype deftype = idDecl_getCtype (tid); + ctype rettype; + + if (ctype_isFunction (deftype)) + { + rettype = ctype_returnValue (deftype); + } + else + { + rettype = ctype_unknown; + } + + /* + ** check has been moved here... + */ + + if (ctype_isFunction (idDecl_getCtype (tid))) + { + ue = uentry_makeIdFunction (tid); + reflectSpecialCode (ue); + reflectArgsUsed (ue); + } + else + { + llparseerror (message ("Inconsistent function declaration: %q", + idDecl_unparse (tid))); + + tid = idDecl_replaceCtype + (tid, ctype_makeFunction (ctype_unknown, uentryList_undefined)); + ue = uentry_makeIdFunction (tid); + } + + reflectStorageClass (ue); + uentry_setStatic (ue); + + uentry_checkParams (ue); + reflectModGlobs (ue); + + DPRINTF (("Sub global entry: %s", uentry_unparse (ue))); + ue = usymtab_supGlobalEntryReturn (ue); + + context_enterFunction (ue); + enterFunctionParams (uentry_getParams (ue)); + resetStorageClass (); + } + } + + resetGlobals (); + } + + resetStorageClass (); + idDecl_free (tid); +} + +void +checkTypeDecl (uentry e, ctype rep) +{ + cstring n = uentry_getName (e); + + DPRINTF (("Check type decl: %s", n)); + + if (cstring_equal (context_getBoolName (), n)) + { + ctype rrep = ctype_realType (rep); + + /* + ** for abstract enum types, we need to fix the enum members: + ** they should have the abstract type, not the rep type. + */ + + if (ctype_isEnum (ctype_realType (rrep))) + { + enumNameList el = ctype_elist (rrep); + + enumNameList_elements (el, ye) + { + if (usymtab_existsGlob (ye)) + { + uentry ue = usymtab_lookupSafe (ye); + uentry_setType (ue, ctype_bool); + } + + if (cstring_equal (context_getTrueName (), ye) + || cstring_equal (context_getFalseName (), ye)) + { + ; + } + else + { + vgenhinterror + (FLG_SYNTAX, + message ("Member of boolean enumerated type definition " + "does not match name set to represent TRUE " + "or FALSE: %s", + ye), + message ("Use -boolfalse and -booltrue to set the " + "name of false and true boolean values."), + uentry_whereDefined (e)); + } + } end_enumNameList_elements; + } + } + + if (usymtab_exists (n)) + { + usymId llm = usymtab_getId (n); + uentry le = usymtab_getTypeEntry (llm); + + uentry_setDeclared (e, g_currentloc); + uentry_setSref (e, sRef_makeGlobal (llm, uentry_getType (le))); + + DPRINTF (("Here we are: %s / %s", + n, context_getBoolName ())); + + if (uentry_isAbstractDatatype (le)) + { + ctype rrep = ctype_realType (rep); + + /* + ** for abstract enum types, we need to fix the enum members: + ** they should have the abstract type, not the rep type. + */ + + if (ctype_isEnum (ctype_realType (rrep))) + { + ctype at = uentry_getAbstractType (le); + enumNameList el = ctype_elist (rrep); + + enumNameList_elements (el, ye) + { + if (usymtab_existsGlob (ye)) + { + uentry ue = usymtab_lookupSafe (ye); + + llassert (uentry_isEitherConstant (ue)); + llassertprint (ctype_match (uentry_getType (ue), rrep), + ("Bad enum: %s / %s", + uentry_unparse (ue), + ctype_unparse (rrep))); + + uentry_setType (ue, at); + } + } end_enumNameList_elements; + } + + if (uentry_isMutableDatatype (le)) + { + /* maybe more complicated if abstract and immutable ? */ + + if (!ctype_isRealPointer (rep) && !ctype_isRealAbstract (rep)) + { + voptgenerror + (FLG_MUTREP, + message ("Mutable abstract type %s declared without pointer " + "indirection: %s (violates assignment semantics)", + n, ctype_unparse (rep)), + uentry_whereDefined (e)); + + uentry_setMutable (e); + } + } + } + } + else + { + fileloc fl = uentry_whereDeclared (e); + + if (context_getFlag (FLG_LIKELYBOOL) + && !context_getFlag (FLG_BOOLINT)) + { + if ((cstring_equalLit (n, "BOOL") + || cstring_equalLit (n, "Bool") + || cstring_equalLit (n, "bool") + || cstring_equalLit (n, "boolean") + || cstring_equalLit (n, "Boolean") + || cstring_equalLit (n, "BOOLEAN")) + && !(cstring_equal (n, context_getBoolName ()))) + { + if (context_setBoolName ()) { + voptgenerror + (FLG_LIKELYBOOL, + message ("Type %s is probably meant as a boolean type, but does " + "not match the boolean type name \"%s\".", + n, + context_getBoolName ()), + fl); + } else + voptgenerror + (FLG_LIKELYBOOL, + message ("Type %s is probably meant as a boolean type, " + "but the boolean type name is not set. " + "Use -booltype %s to set it.", + n, + n), + fl); + } + } + + if (!uentry_isStatic (e) + && !ctype_isFunction (uentry_getType (e)) + && !fileloc_isLib (fl) + && !fileloc_isImport (fl) + && fileloc_isHeader (fl)) + { + voptgenerror (FLG_EXPORTTYPE, + message ("Type exported, but not specified: %s\n", n), + fl); + } + } + + cstring_free (n); +} + +uentryList +fixUentryList (idDeclList tl, qtype q) +{ + uentryList f = uentryList_new (); + + idDeclList_elements (tl, i) + { + if (idDecl_isDefined (i)) + { + uentry ue; + uentry old; + ctype rt; + + (void) idDecl_fixBase (i, q); + + /* + ** implicit annotations + */ + + (void) fixStructDecl (i); + + ue = uentry_makeIdVariable (i); + rt = ctype_realType (uentry_getType (ue)); + + /* + ** where is this here??? + + if (ctype_isArray (rt) || ctype_isSU (rt)) + { + sRef_setAllocated (uentry_getSref (ue), uentry_whereDefined (ue)); + } + + ** + */ + + if (uentry_isValid (old = uentryList_lookupField (f, uentry_rawName (ue)))) + { + if (optgenerror (FLG_SYNTAX, + message ("Field name reused: %s", uentry_rawName (ue)), + uentry_whereDefined (ue))) + { + llgenmsg (message ("Previous use of %s", uentry_rawName (ue)), + uentry_whereDefined (old)); + } + } + + f = uentryList_add (f, ue); + } + } end_idDeclList_elements; + + idDeclList_free (tl); + return (f); +} + +/* +** This is a hack to support unnamed struct/union fields as done by +** Microsoft VC++. It is not supported by the ANSI standard. +** +** The inner fields are added to the outer structure. This is meaningful +** for nesting structs inside unions, but lclint does no related +** checking. +*/ + +uentryList +fixUnnamedDecl (qtype q) +{ + ctype ct = ctype_realType (qtype_getType (q)); + + if (ctype_isStruct (ct) || ctype_isUnion (ct)) + { + uentryList res = ctype_getFields (ct); + + return (uentryList_copy (res)); + } + else + { + BADBRANCHCONT; + } + + return uentryList_undefined; +} + +void setStorageClass (storageClassCode sc) +{ + storageClass = sc; +} + +void +setProcessingIterVars (uentry iter) +{ + ProcessingIterVars = TRUE; + currentIter = iter; + saveIterParamNo = 0; +} + +void +setProcessingGlobalsList () +{ + ProcessingGlobals = TRUE; + + llassert (globSet_isUndefined (currentGlobals)); + currentGlobals = globSet_undefined; + + llassert (sRefSet_isUndefined (fcnModifies)); + fcnModifies = sRefSet_undefined; + + /* + ** No, special clauses might have been processed first! + llassert (specialClauses_isUndefined (specClauses)); + specClauses = specialClauses_undefined; + */ + + fcnNoGlobals = FALSE; +} + +static bool ProcessingGlobMods = FALSE; + +void +setProcessingGlobMods () +{ + ProcessingGlobMods = TRUE; +} + +void +clearProcessingGlobMods () +{ + ProcessingGlobMods = FALSE; +} + +bool +isProcessingGlobMods () +{ + return (ProcessingGlobMods); +} + +static void resetGlobals (void) +{ + ProcessingGlobals = FALSE; + currentGlobals = globSet_undefined; + llassert (sRefSet_isUndefined (fcnModifies)); + fcnModifies = sRefSet_undefined; + fcnNoGlobals = FALSE; +} + +void +unsetProcessingGlobals () +{ + ProcessingGlobals = FALSE; +} + +void +setProcessingVars (/*@only@*/ qtype q) +{ + ProcessingVars = TRUE; + qtype_free (processingType); + processingType = q; +} + +static void +setGenericParamList (/*@dependent@*/ uentryList pm) +{ + ProcessingParams = TRUE; + saveParamList = pm; +} + +void +setProcessingTypedef (/*@only@*/ qtype q) +{ + ProcessingTypedef = TRUE; + + qtype_free (processingType); + processingType = q; +} + +void +unsetProcessingVars () +{ + resetStorageClass (); + ProcessingVars = FALSE; +} + +void +doneParams () +{ + if (ProcessingParams) + { + if (uentry_isInvalid (saveFunction)) + { + llbuglit ("unsetProcessingVars: no saved function\n"); + + if (sRefSet_isDefined (fcnModifies)) { + sRefSet_free (fcnModifies); + fcnModifies = sRefSet_undefined; + } + } + else + { + ctype ct = ctype_returnValue (uentry_getType (saveFunction)); + uentryList params = uentryList_copy (saveParamList); + ctype ct2 = ctype_makeFunction (ct, params); + + uentry_setType (saveFunction, ct2); + ProcessingParams = FALSE; + + reflectModGlobs (saveFunction); + oldStyleDeclareFunction (saveFunction); + saveFunction = uentry_undefined; + resetGlobals (); + } + } + else + { + /* + ** If the paramlist used a type name, we could be here. + */ + + llfatalerror (message ("%q: Old-style function parameter list uses a " + "type name.", fileloc_unparse (g_currentloc))); + } +} + +void +checkDoneParams () +{ + if (uentry_isValid (saveFunction)) + { + /* + ** old style declaration + */ + + ctype ct = ctype_returnValue (uentry_getType (saveFunction)); + ctype ct2; + + uentryList_elements (saveParamList, current) + { + uentry_setType (current, ctype_int); /* all params are ints */ + } end_uentryList_elements; + + ct2 = ctype_makeParamsFunction (ct, uentryList_copy (saveParamList)); + + uentry_setType (saveFunction, ct2); + ProcessingParams = FALSE; + + oldStyleDeclareFunction (saveFunction); + saveFunction = uentry_undefined; + } +} + +void +unsetProcessingTypedef () +{ + ProcessingTypedef = FALSE; +} + +void checkConstant (qtype t, idDecl id) +{ + uentry e; + + id = idDecl_fixBase (id, t); + e = uentry_makeIdConstant (id); + + reflectStorageClass (e); + resetStorageClass (); + + usymtab_supGlobalEntry (e); +} + +void checkValueConstant (qtype t, idDecl id, exprNode e) +{ + uentry ue; + + id = idDecl_fixBase (id, t); + ue = uentry_makeIdConstant (id); + reflectStorageClass (ue); + resetStorageClass (); + + if (exprNode_isDefined (e)) + { + if (!exprNode_matchType (uentry_getType (ue), e)) + { + (void) gentypeerror + (exprNode_getType (e), e, + uentry_getType (ue), exprNode_undefined, + message ("Constant %q initialized to type %t, expects %t: %s", + uentry_getName (ue), + exprNode_getType (e), + uentry_getType (ue), + exprNode_unparse (e)), + exprNode_loc (e)); + } + else + { + if (exprNode_hasValue (e)) + { + uentry_mergeConstantValue (ue, multiVal_copy (exprNode_getValue (e))); + } + } + } + + usymtab_supGlobalEntry (ue); +} + + +void processNamedDecl (idDecl t) +{ + if (qtype_isUndefined (processingType)) + { + llparseerror (message ("No type before declaration name: %q", idDecl_unparse (t))); + + processingType = qtype_create (ctype_unknown); + } + + t = idDecl_fixBase (t, processingType); + + DPRINTF (("Declare: %s", idDecl_unparse (t))); + + if (ProcessingGlobals) + { + cstring id = idDecl_getName (t); + uentry ue = usymtab_lookupSafe (id); + + if (!uentry_isValid (ue)) + { + llerror (FLG_UNRECOG, + message ("Variable used in globals list is undeclared: %s", id)); + } + else + { + if (!ctype_match (uentry_getType (ue), idDecl_getCtype (t))) + { + voptgenerror + (FLG_INCONDEFS, + message ("Variable %s used in globals list declared %s, " + "but listed as %s", + id, ctype_unparse (uentry_getType (ue)), + ctype_unparse (idDecl_getCtype (t))), + g_currentloc); + } + else + { + sRef sr = sRef_copy (uentry_getSref (ue)); + + reflectGlobalQualifiers (sr, idDecl_getQuals (t)); + + currentGlobals = globSet_insert (currentGlobals, sr); + } + } + } + else if (ProcessingVars) + { + uentry e; + ctype ct; + + ct = ctype_realType (idDecl_getCtype (t)); + + if (ProcessingParams) + { + cstring id = idDecl_getName (t); + int paramno = uentryList_lookupRealName (saveParamList, id); + + if (paramno >= 0) + { + uentry cparam = uentryList_getN (saveParamList, paramno); + + uentry_setType (cparam, idDecl_getCtype (t)); + uentry_reflectQualifiers (cparam, idDecl_getQuals (t)); + uentry_setDeclaredOnly (cparam, context_getSaveLocation ()); + } + else + { + llfatalerrorLoc + (message ("Old style declaration uses unlisted parameter: %s", + id)); + } + } + else + { + fileloc loc; + + if (context_inIterDef ()) + { + cstring pname = makeParam (idDecl_observeId (t)); + uentry p = usymtab_lookupSafe (pname); + + cstring_free (pname); + + if (uentry_isYield (p)) + { + e = uentry_makeParam (t, sRef_getParam (uentry_getSref (p))); + + uentry_checkYieldParam (p, e); + + usymtab_supEntrySref (e); + return; + } + } + + if ((hasSpecialCode () || argsUsed) + && ctype_isFunction (idDecl_getCtype (t))) + { + e = uentry_makeIdFunction (t); + reflectSpecialCode (e); + reflectArgsUsed (e); + } + else + { + e = uentry_makeIdVariable (t); + } + + loc = uentry_whereDeclared (e); + + /* + if (context_inGlobalScope ()) + { + uentry_checkParams was here! + } + */ + + if (ctype_isFunction (uentry_getType (e))) + { + reflectModGlobs (e); + } + else + { + llassert (!globSet_isDefined (currentGlobals) + && !sRefSet_isDefined (fcnModifies)); + } + + e = usymtab_supEntrySrefReturn (e); + + if (uentry_isExtern (e) && !context_inGlobalScope ()) + { + voptgenerror + (FLG_NESTEDEXTERN, + message ("Declaration using extern inside function scope: %q", + uentry_unparse (e)), + g_currentloc); + + uentry_setDefined (e, fileloc_getExternal ()); + sRef_setDefined (uentry_getSref (e), fileloc_getExternal ()); + } + + if (uentry_isFunction (e)) + { + uentry_checkParams (e); + checkParamNames (e); + } + + if (uentry_isVar (e) + && uentry_isCheckedUnknown (e)) + { + sRef sr = uentry_getSref (e); + + if (sRef_isLocalVar (sr)) + { + if (context_getFlag (FLG_IMPCHECKMODINTERNALS)) + { + uentry_setCheckMod (e); + } + else + { + uentry_setUnchecked (e); + } + } + else if (sRef_isFileStatic (sr)) + { + if (context_getFlag (FLG_IMPCHECKEDSTRICTSTATICS)) + { + uentry_setCheckedStrict (e); + } + else if (context_getFlag (FLG_IMPCHECKEDSTATICS)) + { + uentry_setChecked (e); + } + else if (context_getFlag (FLG_IMPCHECKMODSTATICS)) + { + uentry_setCheckMod (e); + } + else + { + ; + } + } + else /* real global */ + { + llassert (sRef_isRealGlobal (sr)); + + if (context_getFlag (FLG_IMPCHECKEDSTRICTGLOBALS)) + { + uentry_setCheckedStrict (e); + } + else if (context_getFlag (FLG_IMPCHECKEDGLOBALS)) + { + uentry_setChecked (e); + } + else if (context_getFlag (FLG_IMPCHECKMODGLOBALS)) + { + uentry_setCheckMod (e); + } + else + { + ; + } + } + } + } + } + else if (ProcessingTypedef) + { + ctype ct = idDecl_getCtype (t); + uentry e; + + DPRINTF (("Processing typedef: %s", ctype_unparse (ct))); + + e = uentry_makeIdDatatype (t); + + if (cstring_equal (idDecl_getName (t), context_getBoolName ())) { + ctype rt = ctype_realType (ct); + + if (ctype_isEnum (rt)) { + ; + } else { + if (!(ctype_isInt (rt) + || ctype_isUnknown (rt) + || ctype_isChar (rt))) { + (void) llgenerror + (FLG_BOOLTYPE, + message ("Boolean type %s defined using non-standard type %s (integral, char or enum type expected)", + context_getBoolName (), + ctype_unparse (ct)), + uentry_whereLast (e)); + } + + ct = ctype_bool; + uentry_setType (e, ct); + } + } + + reflectStorageClass (e); + checkTypeDecl (e, ct); + + e = usymtab_supReturnTypeEntry (e); + + if (uentry_isMaybeAbstract (e)) + { + if (context_getFlag (FLG_IMPABSTRACT)) + { + uentry_setAbstract (e); + } + else + { + uentry_setConcrete (e); + } + } + } + else + { + llparseerror (message ("Suspect missing struct or union keyword: %q", + idDecl_unparse (t))); + } + + } + +/* +** moved from grammar +*/ + +static idDecl fixStructDecl (/*@returned@*/ idDecl d) +{ + if (ctype_isVisiblySharable (idDecl_getCtype (d)) + && context_getFlag (FLG_STRUCTIMPONLY)) + { + if (!qualList_hasAliasQualifier (idDecl_getQuals (d))) + { + if (qualList_hasExposureQualifier (idDecl_getQuals (d))) + { + idDecl_addQual (d, qual_createDependent ()); + } + else + { + idDecl_addQual (d, qual_createImpOnly ()); + } + } + } + + return d; +} + +ctype +declareUnnamedStruct (/*@only@*/ uentryList f) +{ + if (context_maybeSet (FLG_NUMSTRUCTFIELDS)) + { + int num = uentryList_size (f); + int max = context_getValue (FLG_NUMSTRUCTFIELDS); + + if (num > max) + { + voptgenerror + (FLG_NUMSTRUCTFIELDS, + message ("Structure declared with %d fields " + "(limit is set to %d)", + num, max), + g_currentloc); + } + } + + return (ctype_createUnnamedStruct (f)); +} + +ctype +declareUnnamedUnion (/*@only@*/ uentryList f) +{ + if (context_maybeSet (FLG_NUMSTRUCTFIELDS)) + { + int num = uentryList_size (f); + int max = context_getValue (FLG_NUMSTRUCTFIELDS); + + if (num > max) + { + voptgenerror + (FLG_NUMSTRUCTFIELDS, + message ("Union declared with %d fields " + "(limit is set to %d)", + num, max), + g_currentloc); + } + } + + return (ctype_createUnnamedUnion (f)); +} + +ctype declareStruct (cstring id, /*@only@*/ uentryList f) +{ + ctype ct; + uentry ue; + int num = uentryList_size (f); + + ct = ctype_createStruct (cstring_copy (id), f); + ue = uentry_makeStructTagLoc (id, ct); + + if (context_maybeSet (FLG_NUMSTRUCTFIELDS)) + { + int max = context_getValue (FLG_NUMSTRUCTFIELDS); + + if (num > max) + { + voptgenerror + (FLG_NUMSTRUCTFIELDS, + message ("Structure %q declared with %d fields " + "(limit is set to %d)", + uentry_getName (ue), num, max), + uentry_whereLast (ue)); + } + } + + return (usymtab_supTypeEntry (ue)); +} + +ctype declareUnion (cstring id, uentryList f) +{ + ctype ct; + uentry ue; + int num = uentryList_size (f); + + ct = ctype_createUnion (cstring_copy (id), f); + ue = uentry_makeUnionTagLoc (id, ct); + + if (context_maybeSet (FLG_NUMSTRUCTFIELDS)) + { + int max = context_getValue (FLG_NUMSTRUCTFIELDS); + + if (num > max) + { + voptgenerror + (FLG_NUMSTRUCTFIELDS, + message ("Union %q declared with %d fields " + "(limit is set to %d)", + uentry_getName (ue), num, max), + uentry_whereLast (ue)); + } + } + + return (usymtab_supTypeEntry (ue)); +} + +ctype handleStruct (/*@only@*/ cstring id) +{ + if (usymtab_existsStructTag (id)) + { + ctype ct = uentry_getAbstractType (usymtab_lookupStructTag (id)); + + cstring_free (id); + return ct; + } + else + { + return (ctype_createForwardStruct (id)); + } +} + +ctype handleUnion (/*@only@*/ cstring id) +{ + if (usymtab_existsUnionTag (id)) + { + ctype ret = uentry_getAbstractType (usymtab_lookupUnionTag (id)); + cstring_free (id); + return (ret); + } + else + { + return (ctype_createForwardUnion (id)); + } +} + +ctype +handleEnum (cstring id) +{ + if (usymtab_existsEnumTag (id)) + { + ctype ret = uentry_getAbstractType (usymtab_lookupEnumTag (id)); + cstring_free (id); + return ret; + } + else + { + return (declareEnum (id, enumNameList_new ())); + } +} + +bool processingIterVars (void) +{ + return ProcessingIterVars; +} + +uentry getCurrentIter (void) +{ + return currentIter; +} + +static bool flipOldStyle = FALSE; +static bool flipNewStyle = TRUE; + +void setFlipOldStyle () { flipOldStyle = TRUE; } +bool isFlipOldStyle () { return flipOldStyle; } +bool isNewStyle () { return flipNewStyle; } +void setNewStyle () { flipNewStyle = TRUE; } + +/*@dependent@*/ uentryList handleParamIdList (/*@dependent@*/ uentryList params) +{ + int paramno = 0; + + /* + ** this is a really YUCKY hack to handle old style + ** declarations. + */ + + voptgenerror (FLG_OLDSTYLE, + cstring_makeLiteral ("Old style function declaration"), + g_currentloc); + + uentryList_elements (params, current) + { + uentry_setParam (current); + uentry_setSref (current, sRef_makeParam (paramno, ctype_unknown)); + paramno++; + } end_uentryList_elements; + + setGenericParamList (params); + g_expectingTypeName = TRUE; + + return params; +} + +/*@dependent@*/ uentryList handleParamTypeList (/*@returned@*/ uentryList params) +{ + if (flipOldStyle) + { + uentryList_fixMissingNames (params); + + voptgenerror (FLG_OLDSTYLE, + cstring_makeLiteral ("Old style function declaration."), + g_currentloc); + + setGenericParamList (params); + flipOldStyle = FALSE; + g_expectingTypeName = TRUE; + } + + return (params); +} + +void +doVaDcl () +{ + ctype c = ctype_unknown; + cstring id = cstring_makeLiteral ("va_alist"); + uentry e; + + if (ProcessingParams) + { + int i = uentryList_lookupRealName (saveParamList, id); + + if (i >= 0) + { + e = uentry_makeVariableSrefParam (id, c, sRef_makeParam (i, c)); + } + else + { + e = uentry_undefined; /* suppress gcc message */ + llfatalerrorLoc (cstring_makeLiteral ("va_dcl used without va_alist")); + } + } + else + { + llerror (FLG_SYNTAX, cstring_makeLiteral ("va_dcl used outside of function declaration")); + e = uentry_makeVariableLoc (id, c); + } + + cstring_free (id); + uentry_setUsed (e, g_currentloc); + usymtab_supEntrySref (e); +} + +/*@exposed@*/ sRef modListPointer (sRef s) +{ + ctype ct = sRef_getType (s); + ctype rt = ctype_realType (ct); + + if (ctype_isAP (rt)) + { + if (context_inHeader () && ctype_isAbstract (ct)) + { + voptgenerror + (FLG_ABSTRACT, + message + ("Modifies clause in header file dereferences abstract " + "type %s (interface modifies clause should not depend " + "on or expose type representation): %q", + ctype_unparse (ct), + sRef_unparse (s)), + g_currentloc); + } + + return (sRef_constructPointer (s)); + } + else + { + if (ctype_isKnown (rt)) + { + voptgenerror + (FLG_TYPE, + message ("Implementation modifies clause dereferences non-pointer (type %s): %q", + ctype_unparse (rt), + sRef_unparse (s)), + g_currentloc); + } + + return s; + } +} + +/*@exposed@*/ sRef modListFieldAccess (sRef s, cstring f) +{ + ctype ct = sRef_getType (s); + ctype rt = ctype_realType (ct); + + if (ctype_isStructorUnion (rt)) + { + uentry tf = uentryList_lookupField (ctype_getFields (rt), f); + + if (uentry_isUndefined (tf)) + { + voptgenerror (FLG_TYPE, + message ("Modifies list accesses non-existent " + "field %s of %t: %q", f, ct, + sRef_unparse (s)), + g_currentloc); + + cstring_free (f); + return sRef_undefined; + } + else + { + if (ctype_isAbstract (ct) && context_inHeader ()) + { + voptgenerror + (FLG_ABSTRACT, + message + ("Modifies clause in header file accesses abstract " + "type %s (interface modifies clause should not depend " + "on or expose type representation): %q", + ctype_unparse (ct), + sRef_unparse (s)), + g_currentloc); + } + } + + cstring_markOwned (f); + return (sRef_makeField (s, f)); + } + else + { + voptgenerror + (FLG_TYPE, + message ("Modifies clause dereferences non-pointer (type %s): %q", + ctype_unparse (rt), + sRef_unparse (s)), + g_currentloc); + + cstring_free (f); + return s; + } +} + +sRef globListUnrecognized (cstring s) +{ + if (cstring_equalLit (s, "nothing")) + { + return sRef_makeNothing (); + } + else if (cstring_equalLit (s, "internalState")) + { + return sRef_makeInternalState (); + } + else if (cstring_equalLit (s, "fileSystem") + || cstring_equalLit (s, "systemState")) + { + return sRef_makeSystemState (); + } + else + { + voptgenerror + (FLG_UNRECOG, + message ("Unrecognized identifier in globals list: %s", s), + g_currentloc); + + return sRef_undefined; + } +} + +/*@exposed@*/ sRef modListArrowAccess (sRef s, cstring f) +{ + ctype ct = sRef_getType (s); + ctype rt = ctype_realType (ct); + + if (ctype_isRealPointer (rt)) + { + ctype b = ctype_baseArrayPtr (rt); + ctype rb = ctype_realType (b); + + if (ctype_isStructorUnion (rb)) + { + uentry tf = uentryList_lookupField (ctype_getFields (rb), f); + + if (uentry_isUndefined (tf)) + { + voptgenerror (FLG_TYPE, + message ("Modifies list arrow accesses non-existent " + "field %s of %t: %q", f, b, + sRef_unparse (s)), + g_currentloc); + + cstring_free (f); + return sRef_undefined; + } + else + { + if (context_inHeader ()) + { + if (ctype_isAbstract (b)) + { + voptgenerror + (FLG_ABSTRACT, + message + ("Modifies clause in header file arrow accesses abstract " + "type %s (interface modifies clause should not depend " + "on or expose type representation): %q", + ctype_unparse (b), + sRef_unparse (s)), + g_currentloc); + } + } + else + { + if (ctype_isAbstract (ct)) + { + voptgenerror + (FLG_ABSTRACT, + message + ("Modifies clause in header file arrow accesses abstract " + "type %s (interface modifies clause should not depend " + "on or expose type representation): %q", + ctype_unparse (ct), + sRef_unparse (s)), + g_currentloc); + } + } + } + + cstring_markOwned (f); + return (sRef_makeArrow (s, f)); + } + else + { + voptgenerror + (FLG_TYPE, + message ("Modifies clause arrow accesses pointer to " + "non-structure (type %s): %q", + ctype_unparse (rt), + sRef_unparse (s)), + g_currentloc); + } + } + else + { + voptgenerror + (FLG_TYPE, + message ("Modifies clause arrow accesses non-pointer (type %s): %q", + ctype_unparse (rt), + sRef_unparse (s)), + g_currentloc); + } + + cstring_free (f); + return s; +} + +sRef checkSpecClausesId (uentry ue) +{ + cstring s = uentry_rawName (ue); + + if (sRef_isGlobal (uentry_getSref (ue))) + { + voptgenerror + (FLG_SYNTAX, + message ("Global variable %s used special clause. (Global variables " + "are not recognized in special clauses. If there is " + "sufficient interest in support for this, it may be " + "added to a future release. Send mail to " + "lclint@cs.virginia.edu.)", + s), + g_currentloc); + + return sRef_undefined; + } + else + { + if (cstring_equalLit (s, "result")) + { + if (optgenerror + (FLG_SYNTAX, + message ("Special clause list uses %s which is a variable and has special " + "meaning in a modifies list. (Special meaning assumed.)", s), + g_currentloc)) + { + uentry_showWhereDeclared (ue); + } + } + + return uentry_getSref (ue); + } +} + + +void checkModifiesId (uentry ue) +{ + cstring s = uentry_rawName (ue); + + if (cstring_equalLit (s, "nothing") + || cstring_equalLit (s, "internalState") + || cstring_equalLit (s, "systemState") + || (cstring_equalLit (s, "fileSystem"))) + { + if (optgenerror + (FLG_SYNTAX, + message ("Modifies list uses %s which is a variable and has special " + "meaning in a modifies list. (Special meaning assumed.)", s), + g_currentloc)) + { + uentry_showWhereDeclared (ue); + } + } +} + +/*@exposed@*/ sRef fixModifiesId (cstring s) +{ + sRef ret; + cstring pname = makeParam (s); + uentry ue = usymtab_lookupSafe (pname); + + cstring_free (pname); + + if (cstring_equalLit (s, "nothing")) + { + ret = sRef_makeNothing (); + } + else if (cstring_equalLit (s, "internalState")) + { + ret = sRef_makeInternalState (); + } + else if (cstring_equalLit (s, "fileSystem") + || cstring_equalLit (s, "systemState")) + { + ret = sRef_makeSystemState (); + } + else + { + ret = sRef_undefined; + } + + if (sRef_isValid (ret)) + { + if (uentry_isValid (ue)) + { + voptgenerror + (FLG_SYNTAX, + message ("Modifies list uses %s which is a parameter and has special " + "meaning in a modifies list. (Special meaning assumed.)", s), + g_currentloc); + } + } + else + { + if (uentry_isValid (ue)) + { + ret = uentry_getSref (ue); + } + else + { + fileloc loc = fileloc_decColumn (g_currentloc, cstring_length (s)); + ret = sRef_undefined; + + voptgenerror + (FLG_UNRECOG, + message ("Unrecognized identifier in modifies comment: %s", s), + loc); + + fileloc_free (loc); + } + } + + return ret; +} + +sRef fixSpecClausesId (cstring s) +{ + sRef ret; + cstring pname = makeParam (s); + uentry ue = usymtab_lookupSafe (pname); + + cstring_free (pname); + + if (cstring_equalLit (s, "result")) + { + ret = sRef_makeResult (); + } + else + { + ret = sRef_undefined; + } + + if (sRef_isValid (ret)) + { + if (uentry_isValid (ue)) + { + voptgenerror + (FLG_SYNTAX, + message ("Special clause uses %s which is a parameter and has special " + "meaning in a special clause. (Special meaning assumed.)", s), + g_currentloc); + } + } + else + { + if (uentry_isValid (ue)) + { + ret = uentry_getSref (ue); + + if (sRef_isGlobal (ret)) + { + voptgenerror + (FLG_SYNTAX, + message ("Global variable %s used special clause. (Global variables " + "are not recognized in special clauses. If there is " + "sufficient interest in support for this, it may be " + "added to a future release. Send mail to " + "lclint@cs.virginia.edu.)", + s), + g_currentloc); + + ret = sRef_undefined; + } + } + else + { + fileloc loc = fileloc_decColumn (g_currentloc, cstring_length (s)); + ret = sRef_undefined; + + voptgenerror + (FLG_UNRECOG, + message ("Unrecognized identifier in special clause: %s", s), + loc); + + fileloc_free (loc); + } + } + + return ret; +} + +sRef modListArrayFetch (sRef s, /*@unused@*/ sRef mexp) +{ + ctype ct = sRef_getType (s); + ctype rt = ctype_realType (ct); + + if (ctype_isAP (rt)) + { + if (context_inHeader () && ctype_isAbstract (ct)) + { + voptgenerror + (FLG_ABSTRACT, + message + ("Modifies clause in header file indexes abstract " + "type %s (interface modifies clause should not depend " + "on or expose type representation): %q", + ctype_unparse (ct), + sRef_unparse (s)), + g_currentloc); + } + + return (sRef_makeAnyArrayFetch (s)); + } + else + { + voptgenerror + (FLG_TYPE, + message + ("Implementation modifies clause uses array fetch on non-array (type %s): %q", + ctype_unparse (ct), sRef_unparse (s)), + g_currentloc); + return s; + } +} + + + + + + + + diff --git a/src/clause.c b/src/clause.c new file mode 100644 index 0000000..7e7e256 --- /dev/null +++ b/src/clause.c @@ -0,0 +1,155 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** clause.c +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +cstring +clause_unparse (clause cl) +{ + switch (cl) + { + case TRUECLAUSE: return (cstring_makeLiteralTemp ("true")); + case FALSECLAUSE: return (cstring_makeLiteralTemp ("false")); + case ANDCLAUSE: return (cstring_makeLiteralTemp ("and")); + case ORCLAUSE: return (cstring_makeLiteralTemp ("or")); + case DOWHILECLAUSE: return (cstring_makeLiteralTemp ("do ... while")); + case WHILECLAUSE: return (cstring_makeLiteralTemp ("while")); + case ITERCLAUSE: return (cstring_makeLiteralTemp ("iter")); + case FORCLAUSE: return (cstring_makeLiteralTemp ("for")); + case CASECLAUSE: return (cstring_makeLiteralTemp ("case")); + case NOCLAUSE: return (cstring_makeLiteralTemp ("none")); + case SWITCHCLAUSE: return (cstring_makeLiteralTemp ("switch")); + case CONDCLAUSE: return (cstring_makeLiteralTemp ("cond")); + case TRUEEXITCLAUSE: return (cstring_makeLiteralTemp ("trueexit")); + case FALSEEXITCLAUSE: return (cstring_makeLiteralTemp ("falseexit")); + } + + BADEXIT; +} + +cstring +clause_nameTaken (clause cl) +{ + switch (cl) + { + case TRUECLAUSE: return (cstring_makeLiteralTemp ("in true branch")); + case FALSECLAUSE: return (cstring_makeLiteralTemp ("in true branch")); + case ANDCLAUSE: return (cstring_makeLiteralTemp ("in first and clause")); + case ORCLAUSE: return (cstring_makeLiteralTemp ("in first or clause")); + case DOWHILECLAUSE: return (cstring_makeLiteralTemp ("in do ... while body")); + case WHILECLAUSE: return (cstring_makeLiteralTemp ("in while body")); + case ITERCLAUSE: return (cstring_makeLiteralTemp ("in iter body")); + case FORCLAUSE: return (cstring_makeLiteralTemp ("in for body")); + case CASECLAUSE: return (cstring_makeLiteralTemp ("in one case")); + case NOCLAUSE: return (cstring_makeLiteralTemp ("in some clause")); + case SWITCHCLAUSE: return (cstring_makeLiteralTemp ("in one possible execution")); + case CONDCLAUSE: return (cstring_makeLiteralTemp ("in true condition")); + case TRUEEXITCLAUSE: return (cstring_makeLiteralTemp ("in trueexit")); + case FALSEEXITCLAUSE: return (cstring_makeLiteralTemp ("in falseexit")); + } + + BADBRANCH; +} + +cstring +clause_nameAlternate (clause cl) +{ + switch (cl) + { + case TRUECLAUSE: return (cstring_makeLiteralTemp ("in continuation")); + case FALSECLAUSE: return (cstring_makeLiteralTemp ("in false branch")); + case ANDCLAUSE: return (cstring_makeLiteralTemp ("in second and clause")); + case ORCLAUSE: return (cstring_makeLiteralTemp ("in second or clause")); + case DOWHILECLAUSE: return (cstring_makeLiteralTemp ("if loop is not taken")); + case WHILECLAUSE: return (cstring_makeLiteralTemp ("if loop is not taken")); + case ITERCLAUSE: return (cstring_makeLiteralTemp ("if iter body does not execute")); + case FORCLAUSE: return (cstring_makeLiteralTemp ("if for loop body does not execute")); + case CASECLAUSE: return (cstring_makeLiteralTemp ("in other case")); + case NOCLAUSE: + case SWITCHCLAUSE: return (cstring_makeLiteralTemp ("in other possible execution")); + case CONDCLAUSE: return (cstring_makeLiteralTemp ("in false condition")); + case TRUEEXITCLAUSE: return (cstring_makeLiteralTemp ("in trueexit")); + case FALSEEXITCLAUSE: return (cstring_makeLiteralTemp ("in falseexit")); + } + + BADBRANCH; +} + +cstring clause_nameFlip (clause cl, bool flip) +{ + if (flip) + { + return clause_nameAlternate (cl); + } + else + { + return clause_nameTaken (cl); + } +} + +bool clause_isBreakable (clause cl) +{ + return (cl == SWITCHCLAUSE + || cl == WHILECLAUSE + || cl == DOWHILECLAUSE + || cl == FORCLAUSE + || cl == ITERCLAUSE); +} + +bool clause_isLoop (clause cl) +{ + return (cl == WHILECLAUSE + || cl == FORCLAUSE + || cl == ITERCLAUSE + || cl == DOWHILECLAUSE); +} + +bool clause_isConditional (clause cl) +{ + return ( cl == TRUECLAUSE + || cl == FALSECLAUSE + || cl == WHILECLAUSE + || cl == FORCLAUSE + || cl == SWITCHCLAUSE + || cl == ITERCLAUSE); +} + +bool clause_isSwitch (clause cl) +{ + return (cl == SWITCHCLAUSE); +} + +bool clause_isCase (clause cl) +{ + return (cl == CASECLAUSE); +} + +bool clause_isNone (clause cl) +{ + return (cl == NOCLAUSE); +} diff --git a/src/clauseStack.c b/src/clauseStack.c new file mode 100644 index 0000000..8da6430 --- /dev/null +++ b/src/clauseStack.c @@ -0,0 +1,186 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** clauseStack.c +** +** based on list_template.c +** +** where T has T_equal (or change this) and T_unparse +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +clauseStack +clauseStack_new () +{ + clauseStack s = (clauseStack) dmalloc (sizeof (*s)); + + s->nelements = 0; + s->nspace = clauseStackBASESIZE; + s->elements = (clause *) dmalloc (sizeof (*s->elements) * clauseStackBASESIZE); + s->current = 0; + + return (s); +} + +static void +clauseStack_grow (clauseStack s) +{ + int i; + clause *newelements; + + s->nspace += clauseStackBASESIZE; + + newelements = (clause *) dmalloc (sizeof (*newelements) + * (s->nelements + s->nspace)); + + if (newelements == (clause *) 0) + { + llfatalerror (cstring_makeLiteral ("clauseStack_grow: out of memory!")); + } + + for (i = 0; i < s->nelements; i++) + { + newelements[i] = s->elements[i]; + } + + sfree (s->elements); + s->elements = newelements; +} + +void clauseStack_push (clauseStack s, clause el) +{ + if (s->nspace <= 0) + clauseStack_grow (s); + + s->nspace--; + s->elements[s->nelements] = el; + s->nelements++; + } + +void clauseStack_pop (clauseStack s) +{ + s->nelements--; + s->nspace++; + } + +clause clauseStack_top (clauseStack s) +{ + return (s->elements[s->nelements - 1]); +} + +void clauseStack_switchTop (clauseStack s, clause x) +{ + llassert (s->nelements > 0); + + s->elements[s->nelements - 1] = x; +} + +void +clauseStack_removeFirst (clauseStack s, clause key) +{ + if (clauseStack_top (s) == key) + { + clauseStack_pop (s); + } + else + { + int i; + + for (i = s->nelements - 2; i >= 0; i--) + { + clause el = s->elements[i]; + + if (el == key) + { + int j; + + for (j = i; j < s->nelements - 1; j++) + { + s->elements[j] = s->elements[j + 1]; + } + + s->nelements--; + s->nspace++; + return; + } + } + + llbuglit ("clauseStack_removeFirst: not found"); + } +} + +int +clauseStack_controlDepth (clauseStack s) +{ + int depth = 0; + int i; + + for (i = 0; i < s->nelements; i++) + { + clause current = s->elements[i]; + + if (clause_isConditional (current)) + { + depth++; + } + } + + return depth; +} + +cstring +clauseStack_unparse (clauseStack s) +{ + int i; + cstring st = cstring_makeLiteral ("["); + + for (i = 0; i < s->nelements; i++) + { + if (i == 0) + { + st = message ("%q %s", st, clause_unparse (s->elements[i])); + } + else + st = message ("%q, %s", st, clause_unparse (s->elements[i])); + } + + st = message ("%q ]", st); + return st; +} + +void +clauseStack_clear (clauseStack s) +{ + s->nspace += s->nelements; + s->nelements = 0; +} + +void +clauseStack_free (clauseStack s) +{ + sfree (s->elements); + sfree (s); +} diff --git a/src/configure.scan b/src/configure.scan new file mode 100644 index 0000000..3992450 --- /dev/null +++ b/src/configure.scan @@ -0,0 +1,31 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(Headers/misc.h) + +dnl Checks for programs. +AC_PROG_CXX +AC_PROG_YACC +AC_PROG_CPP +AC_PROG_LEX +AC_PROG_CC + +dnl Checks for libraries. +dnl Replace `main' with a function in -load: +AC_CHECK_LIB(oad, main) + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS(fcntl.h malloc.h sys/time.h unistd.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_MODE_T +AC_TYPE_PID_T +AC_TYPE_SIZE_T +AC_STRUCT_TM + +dnl Checks for library functions. +AC_FUNC_ALLOCA +AC_TYPE_SIGNAL +AC_CHECK_FUNCS(strerror strstr strtod) + +AC_OUTPUT(Makefile) diff --git a/src/context.c b/src/context.c new file mode 100644 index 0000000..9cce2b5 --- /dev/null +++ b/src/context.c @@ -0,0 +1,4095 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** context.c +*/ +/* + * Modified by Herbert 04/19/97: + * - added include for new header portab.h containing OS dependent stuff. + * - changed occurrances of '/' as path delimiters to macro from portab.h + * - changed the handling of the tmp directory -- will no longer always be + * ".", if possible, environment variables "TMP" or, if not set, "TMP", + * or, if not set "." will be used. + */ + +# include "lclintMacros.nf" +# include "llbasic.h" + +# ifndef NOLCL +# include "usymtab_interface.h" +# endif + +# include "exprChecks.h" +# include "filelocStack.h" +# include "fileIdList.h" +# include "llmain.h" +# include "intSet.h" +# include "osd.h" +# include "portab.h" + +extern /*@external@*/ int yydebug; + +typedef struct +{ + cstring file; + typeIdSet daccess ; +} maccesst; + +typedef enum { + CX_GLOBAL, CX_INNER, + CX_FUNCTION, CX_FCNDECL, + CX_MACROFCN, CX_MACROCONST, CX_UNKNOWNMACRO, + CX_ITERDEF, CX_ITEREND, + CX_LCL, CX_LCLLIB +} kcontext; + +static struct _context +{ + int linesprocessed; + int speclinesprocessed; + + flagMarkerList markers; + + /* + ** used to record state where a macro must match a function name + ** (i.e., no params were listed in the macro definition + */ + + bool macroMissingParams BOOLBITS; + bool preprocessing BOOLBITS; + bool incommandline BOOLBITS; + bool insuppressregion BOOLBITS; + bool inDerivedFile BOOLBITS; + bool instandardlib BOOLBITS; + bool inimport BOOLBITS; + bool inheader BOOLBITS; + bool inmacrocache BOOLBITS; + bool protectVars BOOLBITS; + bool neednl BOOLBITS; + bool showfunction BOOLBITS; + bool savedFlags BOOLBITS; + bool justpopped BOOLBITS; + bool anyExports BOOLBITS; + + flagcode library; + + ynm isNullGuarded; + fileloc saveloc; + fileloc pushloc; + + clauseStack clauses; + clause inclause; + + int numerrors; + + filelocStack locstack; + fileTable ftab; + cstring msgAnnote; + /*@observer@*/ sRef aliasAnnote; + /*@observer@*/ sRef aliasAnnoteAls; + messageLog msgLog; + + macrocache mc; + /*@observer@*/ sRefSet mods; + + /* file access types */ + typeIdSet facct; + + /* local access types (this function) */ + typeIdSet acct; + + /* no access types (@noaccess) */ + typeIdSet nacct; + + /*@observer@*/ globSet globs; + /*@only@*/ globSet globs_used; + + int nmods; + int maxmods; + /*@reldef@*/ maccesst *moduleaccess; /* Not defined is nmods == 0. */ + + kcontext kind; + + ctype boolType; + + bool flags[NUMFLAGS]; + bool saveflags[NUMFLAGS]; + bool setGlobally[NUMFLAGS]; + bool setLocally[NUMFLAGS]; + + int values[NUMVALUEFLAGS]; + int counters[NUMVALUEFLAGS]; + + o_cstring strings[NUMSTRINGFLAGS]; + sRefSetList modrecs; + + union + { + bool glob; + int cdepth; + /*@dependent@*/ /*@exposed@*/ uentry fcn; + } cont; +} gc; + +static /*@exposed@*/ cstring context_exposeString (flagcode p_flag) ; +static void context_restoreFlagSettings (void) /*@modifies gc@*/ ; +static void context_saveFlagSettings (void) /*@modifies gc@*/ ; +static void context_exitClauseAux (exprNode p_pred, exprNode p_tbranch) + /*@modifies gc@*/ ; +static void context_exitClauseSimp (void) /*@modifies gc@*/ ; +static void context_exitClausePlain (void) /*@modifies gc@*/ ; +static void context_setJustPopped (void) /*@modifies gc.justpopped@*/ ; +static void context_setValue (flagcode p_flag, int p_val) /*@modifies gc.flags@*/ ; +static void context_setFlag (flagcode p_f, bool p_b) + /*@modifies gc.flags@*/ ; + +static void + context_setFlagAux (flagcode p_f, bool p_b, bool p_inFile, bool p_isRestore) + /*@modifies gc.flags@*/ ; + +static void context_restoreFlag (flagcode p_f) /*@modifies gc.flags@*/ ; + +/*@+enumindex@*/ + +cstring context_unparseFlagMarkers () +{ + return (flagMarkerList_unparse (gc.markers)); +} + +void context_setPreprocessing (void) +{ + llassert (!gc.preprocessing); + gc.preprocessing = TRUE; +} + +void context_clearPreprocessing (void) +{ + llassert (gc.preprocessing); + gc.preprocessing = FALSE; +} + +bool context_isPreprocessing (void) +{ + return gc.preprocessing; +} + +void context_setInCommandLine (void) +{ + llassert (!gc.incommandline); + gc.incommandline = TRUE; +} + +void context_clearInCommandLine (void) +{ + llassert (gc.incommandline); + gc.incommandline = FALSE; +} + +bool context_isInCommandLine (void) +{ + return gc.incommandline; +} + +static +void pushClause (clause c) /*@modifies gc.clauses, gc.inclause@*/ +{ + gc.inclause = c; + clauseStack_push (gc.clauses, c); + + if (clause_isConditional (c) + && context_getFlag (FLG_CONTROLNESTDEPTH)) + { + int maxdepth = context_getValue (FLG_CONTROLNESTDEPTH); + int depth = clauseStack_controlDepth (gc.clauses); + + if (depth == maxdepth + 1) + { + voptgenerror + (FLG_CONTROLNESTDEPTH, + message ("Maximum control nesting depth " + "(%d) exceeded", + maxdepth), + g_currentloc); + } + } +} + +static +clause topClause (clauseStack s) /*@*/ +{ + if (clauseStack_isEmpty (s)) return NOCLAUSE; + return ((clause) clauseStack_top (s)); +} + +void +context_addMacroCache (/*@only@*/ cstring def) +{ + macrocache_addEntry (gc.mc, fileloc_copy (g_currentloc), def); +} + +void +context_addComment (/*@only@*/ cstring def) +{ + macrocache_addComment (gc.mc, fileloc_copy (g_currentloc), def); +} + +/* +** returns TRUE is fl is in ignore region, or region where -code +** +** the logic is fuzzy... +*/ + +static bool +context_inSuppressFlagZone (fileloc fl, flagcode code) +{ + ynm ret = flagMarkerList_suppressError (gc.markers, code, fl); + bool res = FALSE; + + if (ynm_isMaybe (ret)) + { + /* + ** whas is dis? + */ + + if (gc.savedFlags) + { + res = !gc.saveflags[code]; + } + else + { + res = !context_getFlag (code); + } + } + else + { + res = ynm_toBoolStrict (ret); + } + + return res; +} + +static bool +context_suppressSystemMsg (fileloc fl) +{ + if (context_getFlag (FLG_SYSTEMDIRERRORS)) + { + return FALSE; + } + else + { + return (fileloc_isSystemFile (fl)); + } +} + +bool +context_suppressFlagMsg (flagcode flag, fileloc fl) +{ + if (context_suppressSystemMsg (fl)) + { + return TRUE; + } + + /* want same object compare here */ + + if (fileloc_equal (fl, g_currentloc) || gc.inDerivedFile) + { + return (!context_getFlag (flag) + || context_inSuppressRegion () + || context_inSuppressZone (fl) + || (gc.inDerivedFile && context_inSuppressFlagZone (fl, flag))); + } + else + { + return (context_inSuppressFlagZone (fl, flag)); + } +} + +bool +context_suppressNotFlagMsg (flagcode flag, fileloc fl) +{ + + if (context_suppressSystemMsg (fl)) + { + return TRUE; + } + + /*@access fileloc@*/ + if (fl == g_currentloc) + /*@noaccess fileloc@*/ + { + return (context_getFlag (flag) || context_inSuppressRegion ()); + } + else + { + /* for now... */ + return (context_getFlag (flag) || context_inSuppressRegion ()); + } +} + +bool +context_inSuppressZone (fileloc fl) +{ + if (context_suppressSystemMsg (fl)) + { + return TRUE; + } + + return (flagMarkerList_inIgnore (gc.markers, fl)); +} + +bool +context_inSuppressRegion (void) +{ + return (gc.insuppressregion); +} + +void +context_enterSuppressRegion (void) +{ + if (gc.insuppressregion) + { + gc.insuppressregion = FALSE; /* get this msg! */ + llmsg (message + ("%q: New ignore errors region entered while in ignore errors region", + fileloc_unparse (g_currentloc))); + } + + gc.insuppressregion = TRUE; + flagMarkerList_add (gc.markers, flagMarker_createIgnoreOn (g_currentloc)); +} + +static void +context_addFlagMarker (flagcode code, ynm set) +{ + flagMarkerList_add (gc.markers, + flagMarker_createLocalSet (code, set, g_currentloc)); +} + +void +context_enterSuppressLine (int count) +{ + fileloc nextline = fileloc_copy (g_currentloc); + + flagMarkerList_add (gc.markers, + flagMarker_createIgnoreCount (count, g_currentloc)); + + fileloc_nextLine (nextline); + flagMarkerList_add (gc.markers, + flagMarker_createIgnoreOff (nextline)); + fileloc_free (nextline); +} + +void context_checkSuppressCounts (void) +{ + if (context_getFlag (FLG_SUPCOUNTS)) + { + flagMarkerList_checkSuppressCounts (gc.markers); + } +} + +void context_incLineno (void) +{ + gc.linesprocessed++; + incLine (); +} + +void +context_exitSuppressRegion (void) +{ + if (!gc.insuppressregion) + { + llerrorlit (FLG_SYNTAX, + "End ignore errors in region while not ignoring errors"); + } + + gc.insuppressregion = FALSE; + flagMarkerList_add (gc.markers, flagMarker_createIgnoreOff (g_currentloc)); +} + +# ifndef NOLCL +void +context_enterLCLfile (void) +{ + gc.kind = CX_LCL; + gc.facct = typeIdSet_emptySet (); +} +# endif + +static void +addModuleAccess (/*@only@*/ cstring fname, typeIdSet mods) +{ + int i; + + for (i = 0; i < gc.nmods; i++) + { + if (cstring_equal (gc.moduleaccess[i].file, fname)) + { + gc.moduleaccess[i].daccess = typeIdSet_union (gc.moduleaccess[i].daccess, mods); + cstring_free (fname); + return; + } + } + + if (gc.nmods == gc.maxmods) + { + maccesst *oldmods; + + gc.maxmods = gc.maxmods + DEFAULTMAXMODS; + oldmods = gc.moduleaccess; + + gc.moduleaccess = (maccesst *) dmalloc (sizeof (*gc.moduleaccess) * (gc.maxmods)); + + for (i = 0; i < gc.nmods; i++) + { + gc.moduleaccess[i] = oldmods[i]; + } + + sfree (oldmods); + } + + gc.moduleaccess[gc.nmods].file = fname; + gc.moduleaccess[gc.nmods].daccess = mods; + + gc.nmods++; +} + +static void +insertModuleAccess (cstring fname, typeId t) +{ + int i; + + for (i = 0; i < gc.nmods; i++) + { + if (cstring_equal (gc.moduleaccess[i].file, fname)) + { + gc.moduleaccess[i].daccess = typeIdSet_insert (gc.moduleaccess[i].daccess, t); + break; + } + } + + addModuleAccess (cstring_copy (fname), typeIdSet_single (t)); +} + +# ifndef NOLCL +void +context_exitLCLfile (void) +{ + if (gc.kind != CX_LCLLIB) + { + char *lclname = + removeExtension (cstring_toCharsSafe + (fileName (currentFile ())), ".lcl"); + + addModuleAccess (cstring_fromCharsO (removePath (lclname)), gc.facct); + + mstring_free (lclname); + } + + gc.kind = CX_LCL; + gc.kind = CX_GLOBAL; + gc.facct = typeIdSet_emptySet (); +} +# endif + +void +context_dumpModuleAccess (FILE *fout) +{ + int i = 0; + + for (i = 0; i < gc.nmods; i++) + { + cstring td = typeIdSet_dump (gc.moduleaccess[i].daccess); + + fprintf (fout, "%s#%s@\n", + cstring_toCharsSafe (gc.moduleaccess[i].file), + cstring_toCharsSafe (td)); + + cstring_free (td); + } +} + +bool context_usingPosixLibrary () +{ + return (gc.library == FLG_POSIXLIB + || gc.library == FLG_POSIXSTRICTLIB + || gc.library == FLG_UNIXLIB + || gc.library == FLG_UNIXSTRICTLIB); +} + +bool context_usingAnsiLibrary () +{ + return (gc.library != FLG_NOLIB); +} + +flagcode context_getLibrary () +{ + return gc.library; +} + +void context_setLibrary (flagcode code) +{ + gc.library = code; +} + +/*@observer@*/ char *context_selectedLibrary () +{ + switch (gc.library) + { + case FLG_STRICTLIB: + return LLSTRICTLIBS_NAME; + case FLG_POSIXLIB: + return LLPOSIXLIBS_NAME; + case FLG_POSIXSTRICTLIB: + return LLPOSIXSTRICTLIBS_NAME; + case FLG_UNIXLIB: + return LLUNIXLIBS_NAME; + case FLG_UNIXSTRICTLIB: + return LLUNIXSTRICTLIBS_NAME; + case FLG_ANSILIB: + return LLSTDLIBS_NAME; + BADDEFAULT; + } +} + + +void +context_loadModuleAccess (FILE *in) +{ + char *s = mstring_create (MAX_DUMP_LINE_LENGTH); + char *lasts = s; + char *name = mstring_create (MAX_NAME_LENGTH); + char *oname = name; +# ifndef NOFREE + char *os = s; +# endif + + while (fgets (s, MAX_DUMP_LINE_LENGTH, in) != NULL + && *s == ';') + { + ; + } + + while (s != NULL && *s != ';' && *s != '\0') + { + name = oname; + + while (*s != '#' && *s != '\0') + { + *name++ = *s++; + } + + *name = '\0'; + + if (*s != '#') + { + llcontbug (message ("context_loadModuleAccess: bad library line: %s\n", + cstring_fromChars (s))); + break; + } + + s++; + + addModuleAccess (cstring_copy (cstring_fromChars (oname)), + typeIdSet_undump (&s)); + + (void) fgets (s, MAX_DUMP_LINE_LENGTH, in); + llassert (s != lasts); + lasts = s; + } + + sfree (oname); +# ifndef NOFREE + sfree (os); +# endif +} + +typeIdSet context_fileAccessTypes (void) +{ + return gc.facct; +} + +void +context_resetModeFlags (void) +{ + + allFlagCodes (code) + { + if (flagcode_isModeFlag (code)) + { + context_setFlag (code, FALSE); + } + } end_allFlagCodes; + + } + +/* +** resetAllFlags +** +** Set all flags to FALSE, except for a few which are +** true by default. +** +** Set all values and strings to appropriate defaults. +** Set all counters to 0. +*/ + +static void +conext_resetAllCounters (void) +{ + int i; + + for (i = 0; i < NUMVALUEFLAGS; i++) + { + gc.counters[i] = 0; + } +} + +void +context_resetAllFlags (void) +{ + allFlagCodes (code) + { + gc.flags[code] = FALSE; + + if (flagcode_hasValue (code)) + { + int val = 0; + + /*@-loopswitchbreak@*/ + switch (code) + { + case FLG_LIMIT: + val = DEFAULT_LIMIT; break; + case FLG_LINELEN: + val = DEFAULT_LINELEN; break; + case FLG_EXTERNALNAMELEN: + val = DEFAULT_EXTERNALNAMELEN; break; + case FLG_INTERNALNAMELEN: + val = DEFAULT_INTERNALNAMELEN; break; + case FLG_COMMENTCHAR: + val = (int) DEFAULT_COMMENTCHAR; break; + case FLG_CONTROLNESTDEPTH: + val = (int) DEFAULT_CONTROLNESTDEPTH; break; + case FLG_STRINGLITERALLEN: + val = (int) DEFAULT_STRINGLITERALLEN; break; + case FLG_INCLUDENEST: + val = (int) DEFAULT_INCLUDENEST; break; + case FLG_NUMSTRUCTFIELDS: + val = (int) DEFAULT_NUMSTRUCTFIELDS; break; + case FLG_NUMENUMMEMBERS: + val = (int) DEFAULT_NUMENUMMEMBERS; break; + case FLG_EXPECT: + case FLG_LCLEXPECT: + break; + default: + llbug (message ("Bad value flag: %s", flagcode_unparse (code))); + } + /*@=loopswitchbreak@*/ + + context_setValue (code, val); + } + else if (flagcode_hasString (code)) + { + cstring val = cstring_undefined; + + switch (code) + { /*@-loopswitchbreak@*/ + case FLG_LARCHPATH: + { + char *larchpath = osd_getEnvironmentVariable (LARCH_PATH); + + if (larchpath != NULL) + { + val = cstring_fromCharsNew (larchpath); + } + else + { + val = cstring_makeLiteral (DEFAULT_LARCHPATH); + } + + break; + } + case FLG_LCLIMPORTDIR: + { + val = cstring_fromCharsNew (osd_getEnvironment (LCLIMPORTDIR, DEFAULT_LCLIMPORTDIR)); + break; + } + case FLG_TMPDIR: +# if defined(OS2) || defined(MSDOS) || defined(WIN32) + { + char *env = osd_getEnvironmentVariable ("TMP"); + + if (env == NULL) + { + env = osd_getEnvironmentVariable ("TEMP"); + } + + val = cstring_makeLiteral (env != NULL ? env : DEFAULT_TMPDIR); + } +# else + val = cstring_makeLiteral (DEFAULT_TMPDIR); +# endif /* !defined(OS2) && !defined(MSDOS) */ + + break; + case FLG_BOOLTYPE: + val = cstring_makeLiteral (DEFAULT_BOOLTYPE); break; + case FLG_BOOLFALSE: + val = cstring_makeLiteral ("FALSE"); break; + case FLG_BOOLTRUE: + val = cstring_makeLiteral ("TRUE"); break; + case FLG_MACROVARPREFIX: + val = cstring_makeLiteral ("m_"); break; + case FLG_SYSTEMDIRS: + val = cstring_makeLiteral (DEFAULT_SYSTEMDIR); break; + default: + break; + } /*@=loopswitchbreak@*/ + + context_setString (code, val); + } + else + { + ; /* nothing to set */ + } + } end_allFlagCodes; + + /* + ** These flags are true by default. + */ + + gc.flags[FLG_MODIFIES] = TRUE; + gc.flags[FLG_NESTCOMMENT] = TRUE; + gc.flags[FLG_GLOBALS] = TRUE; + gc.flags[FLG_FULLINITBLOCK] = TRUE; + gc.flags[FLG_LIKELYBOOL] = TRUE; + gc.flags[FLG_ZEROPTR] = TRUE; + gc.flags[FLG_NUMLITERAL] = TRUE; + gc.flags[FLG_DUPLICATEQUALS] = TRUE; + gc.flags[FLG_SKIPANSIHEADERS] = TRUE; + gc.flags[FLG_SKIPPOSIXHEADERS] = TRUE; + gc.flags[FLG_SYSTEMDIREXPAND] = TRUE; + gc.flags[FLG_UNRECOGCOMMENTS] = TRUE; + gc.flags[FLG_CASTFCNPTR] = TRUE; + gc.flags[FLG_DOLCS] = TRUE; + gc.flags[FLG_USEVARARGS] = TRUE; + gc.flags[FLG_MAINTYPE] = TRUE; + gc.flags[FLG_SPECMACROS] = TRUE; + gc.flags[FLG_REDEF] = TRUE; + gc.flags[FLG_MACRONEXTLINE] = TRUE; + + gc.flags[FLG_SIZEOFFORMALARRAY] = TRUE; + gc.flags[FLG_FIXEDFORMALARRAY] = TRUE; + + gc.flags[FLG_PREDASSIGN] = TRUE; + gc.flags[FLG_MODOBSERVER] = TRUE; + gc.flags[FLG_MACROVARPREFIXEXCLUDE] = TRUE; + gc.flags[FLG_EXTERNALNAMECASEINSENSITIVE] = TRUE; + + gc.flags[FLG_PARAMIMPTEMP] = TRUE; + gc.flags[FLG_RETIMPONLY] = TRUE; + gc.flags[FLG_GLOBIMPONLY] = TRUE; + gc.flags[FLG_STRUCTIMPONLY] = TRUE; + gc.flags[FLG_PREPROC] = TRUE; + gc.flags[FLG_NAMECHECKS] = TRUE; + gc.flags[FLG_FORMATCODE] = TRUE; + gc.flags[FLG_FORMATTYPE] = TRUE; + gc.flags[FLG_BADFLAG] = TRUE; + gc.flags[FLG_WARNFLAGS] = TRUE; + gc.flags[FLG_WARNUNIXLIB] = TRUE; + gc.flags[FLG_WARNPOSIX] = TRUE; + gc.flags[FLG_SHOWCOL] = TRUE; + gc.flags[FLG_SHOWFUNC] = TRUE; + gc.flags[FLG_SUPCOUNTS] = TRUE; + gc.flags[FLG_HINTS] = TRUE; + gc.flags[FLG_SYNTAX] = TRUE; + gc.flags[FLG_TYPE] = TRUE; + gc.flags[FLG_INCOMPLETETYPE] = TRUE; + gc.flags[FLG_ABSTRACT] = TRUE; + gc.flags[FLG_ITER] = TRUE; + gc.flags[FLG_CONTROL] = TRUE; + gc.flags[FLG_UNRECOG] = TRUE; + gc.flags[FLG_SYSTEMUNRECOG] = TRUE; + gc.flags[FLG_LINTCOMMENTS] = TRUE; + gc.flags[FLG_ACCESSCZECH] = TRUE; + gc.flags[FLG_ACCESSMODULE] = TRUE; + gc.flags[FLG_ACCESSFILE] = TRUE; + gc.flags[FLG_MACROVARPREFIX] = TRUE; + + /* + ** Changed for version 2.4. + */ + + gc.flags[FLG_GNUEXTENSIONS] = TRUE; + + /* + ** On by default for Win32, but not Unix (to support MS/VC++ error message format). + */ + +# ifdef WIN32 + gc.flags[FLG_PARENFILEFORMAT] = TRUE; +# endif +} + +/* +** C is way-lame, and you can initialize an array to a constant except where +** it is declared. Hence, a macro is used to set the modeflags. +*/ + +/*@notfunction@*/ +# define SETFLAGS() \ + { int i = 0; while (modeflags[i] != INVALID_FLAG) { \ + if (!flagcode_isModeFlag (modeflags[i])) \ + { llbug (message ("not a mode flag: %s", \ + flagcode_unparse (modeflags[i]))); } \ + else { context_setFlag (modeflags[i], TRUE); } i++; }} + +void +context_setMode (cstring s) +{ + intSet setflags = intSet_new (); + + allFlagCodes (code) + { + if (flagcode_isModeFlag (code)) + { + if (gc.setGlobally[code]) + { + (void) intSet_insert (setflags, (int) code); + } + } + } end_allFlagCodes; + + if (!intSet_isEmpty (setflags)) + { + cstring rflags = cstring_undefined; + int num = 0; + + intSet_elements (setflags, el) + { + if (cstring_isUndefined (rflags)) + { + rflags = cstring_copy (flagcode_unparse ((flagcode) (el))); + } + else + { + rflags = message ("%q, %s", rflags, + flagcode_unparse ((flagcode) el)); + } + + num++; + if (num > 4 && intSet_size (setflags) > 6) + { + rflags = message ("%q, (%d others) ...", rflags, + intSet_size (setflags) - num); + break; + } + } end_intSet_elements ; + + voptgenerror (FLG_WARNFLAGS, + message ("Setting mode %s after setting mode flags will " + "override set values of flags: %s", + s, rflags), + g_currentloc); + + cstring_free (rflags); + } + + intSet_free (setflags); + + context_resetModeFlags (); + + if (cstring_equalLit (s, "standard")) + { + flagcode modeflags[] = + { + FLG_ENUMINT, FLG_MACROMATCHNAME, + FLG_MACROUNDEF, FLG_RELAXQUALS, + FLG_USEALLGLOBS, FLG_CHECKSTRICTGLOBALS, + FLG_CHECKSTRICTGLOBALIAS, + FLG_CHECKEDGLOBALIAS, + FLG_CHECKMODGLOBALIAS, + FLG_PREDBOOLOTHERS, FLG_PREDBOOLINT, + FLG_PARAMUNUSED, FLG_VARUNUSED, FLG_FUNCUNUSED, + FLG_TYPEUNUSED, + FLG_CONSTUNUSED, FLG_ENUMMEMUNUSED, FLG_FIELDUNUSED, + FLG_PTRNUMCOMPARE, FLG_BOOLCOMPARE, FLG_MUTREP, + FLG_NOEFFECT, FLG_IMPTYPE, + FLG_RETVALOTHER, FLG_RETVALBOOL, FLG_RETVALINT, + FLG_SPECUNDEF, FLG_INCONDEFS, FLG_INCONDEFSLIB, + FLG_MATCHFIELDS, + FLG_MACROPARAMS, FLG_MACROASSIGN, FLG_SEFPARAMS, + FLG_MACROSTMT, FLG_MACROPARENS, + FLG_MACROFCNDECL, + FLG_MACROCONSTDECL, + FLG_MACROREDEF, FLG_INFLOOPS, FLG_UNREACHABLE, + FLG_NORETURN, FLG_CASEBREAK, FLG_MISSCASE, FLG_USEDEF, + FLG_FIRSTCASE, + FLG_NESTEDEXTERN, + FLG_NUMLITERAL, + /* memchecks flags */ + FLG_NULLDEREF, + FLG_NULLSTATE, FLG_NULLASSIGN, + FLG_NULLPASS, FLG_NULLRET, + + FLG_COMPDEF, FLG_COMPMEMPASS, FLG_UNIONDEF, + FLG_RETSTACK, + + /* memtrans flags */ + FLG_EXPOSETRANS, + FLG_OBSERVERTRANS, + FLG_DEPENDENTTRANS, + FLG_NEWREFTRANS, + FLG_ONLYTRANS, + FLG_OWNEDTRANS, + FLG_FRESHTRANS, + FLG_SHAREDTRANS, + FLG_TEMPTRANS, + FLG_KEPTTRANS, + FLG_REFCOUNTTRANS, + FLG_STATICTRANS, + FLG_UNKNOWNTRANS, + FLG_KEEPTRANS, + FLG_IMMEDIATETRANS, + + FLG_EXPORTLOCAL, + + FLG_USERELEASED, FLG_ALIASUNIQUE, FLG_MAYALIASUNIQUE, + FLG_MUSTFREE, FLG_MUSTDEFINE, FLG_GLOBSTATE, + FLG_COMPDESTROY, FLG_MUSTNOTALIAS, + FLG_MEMIMPLICIT, + FLG_BRANCHSTATE, + + FLG_EVALORDER, FLG_SHADOW, FLG_READONLYSTRINGS, + FLG_EXITARG, + FLG_IMPCHECKEDSPECGLOBALS, + FLG_MODGLOBS, FLG_WARNLINTCOMMENTS, + FLG_IFEMPTY, FLG_REALCOMPARE, + FLG_BOOLOPS, FLG_PTRNEGATE, + FLG_SHIFTSIGNED, + INVALID_FLAG } ; + + SETFLAGS (); + } + else if (cstring_equalLit (s, "weak")) + { + flagcode modeflags[] = + { + FLG_BOOLINT, FLG_CHARINT, FLG_FLOATDOUBLE, + FLG_ENUMINT, FLG_RELAXQUALS, FLG_FORWARDDECL, + FLG_CHARINDEX, FLG_ABSTVOIDP, FLG_USEALLGLOBS, + FLG_CHARUNSIGNEDCHAR, + FLG_PREDBOOLOTHERS, + FLG_VARUNUSED, FLG_FUNCUNUSED, + FLG_TYPEUNUSED, + FLG_CHECKSTRICTGLOBALS, FLG_MACROMATCHNAME, + FLG_RETVALOTHER, + FLG_IFEMPTY, + FLG_RETSTACK, FLG_PTRNEGATE, + FLG_LONGUNSIGNEDINTEGRAL, + FLG_LONGUNSIGNEDUNSIGNEDINTEGRAL, + FLG_NUMLITERAL, + FLG_CHARINTLITERAL, + INVALID_FLAG + } ; + + SETFLAGS (); + } + else if (cstring_equalLit (s, "checks")) + { + flagcode modeflags[] = + { + FLG_EXPORTLOCAL, FLG_IMPTYPE, + FLG_CHECKSTRICTGLOBALIAS, + FLG_CHECKEDGLOBALIAS, + FLG_CHECKMODGLOBALIAS, + FLG_UNCHECKEDGLOBALIAS, + FLG_EXITARG, FLG_PTRNUMCOMPARE, + FLG_BOOLCOMPARE, FLG_MACROUNDEF, + FLG_MUSTMOD, FLG_ALLGLOBALS, + FLG_PREDBOOLOTHERS, FLG_PREDBOOLPTR, FLG_PREDBOOLINT, + FLG_USEALLGLOBS, FLG_MUTREP, FLG_RETALIAS, + FLG_RETEXPOSE, FLG_ASSIGNEXPOSE, FLG_CASTEXPOSE, + FLG_FUNCUNUSED, FLG_GLOBALSIMPMODIFIESNOTHING, + FLG_TYPEUNUSED, FLG_FIELDUNUSED, FLG_PARAMUNUSED, FLG_VARUNUSED, + FLG_CONSTUNUSED, FLG_ENUMMEMUNUSED, + FLG_NOEFFECT, FLG_EXPORTHEADER, FLG_EXPORTHEADERVAR, + FLG_RETVALOTHER, FLG_RETVALBOOL, FLG_RETVALINT, + FLG_SPECUNDEF, FLG_IMPCHECKMODINTERNALS, + FLG_DECLUNDEF, FLG_INCONDEFS, FLG_INCONDEFSLIB, + FLG_MATCHFIELDS, + FLG_MACROPARAMS, + FLG_MACROASSIGN, + FLG_DECLPARAMMATCH, + FLG_FCNDEREF, + FLG_FIRSTCASE, + FLG_SEFPARAMS, FLG_SEFUNSPEC, FLG_MACROSTMT, FLG_MACROPARENS, + FLG_MACROCONSTDECL, + FLG_MACROFCNDECL, + FLG_MACROREDEF, + FLG_INFLOOPS, FLG_INFLOOPSUNCON, + FLG_UNREACHABLE, + FLG_NORETURN, FLG_CASEBREAK, FLG_MISSCASE, + FLG_EVALORDER, FLG_USEDEF, + + FLG_NESTEDEXTERN, + + /* memchecks flags */ + + FLG_NULLSTATE, FLG_NULLDEREF, FLG_NULLASSIGN, + FLG_NULLPASS, FLG_NULLRET, + + FLG_COMPDEF, FLG_COMPMEMPASS, FLG_UNIONDEF, FLG_RETSTACK, + + /* memtrans flags */ + FLG_EXPOSETRANS, + FLG_OBSERVERTRANS, + FLG_DEPENDENTTRANS, + FLG_NEWREFTRANS, + FLG_ONLYTRANS, + FLG_OWNEDTRANS, + FLG_FRESHTRANS, + FLG_SHAREDTRANS, + FLG_TEMPTRANS, + FLG_KEPTTRANS, + FLG_REFCOUNTTRANS, + FLG_STATICTRANS, + FLG_UNKNOWNTRANS, + FLG_STATICINITTRANS, + FLG_UNKNOWNINITTRANS, + FLG_KEEPTRANS, + FLG_IMMEDIATETRANS, + FLG_ONLYUNQGLOBALTRANS, + FLG_USERELEASED, FLG_ALIASUNIQUE, FLG_MAYALIASUNIQUE, + FLG_MUSTFREE, FLG_MUSTDEFINE, FLG_GLOBSTATE, + FLG_COMPDESTROY, FLG_MUSTNOTALIAS, + FLG_MEMIMPLICIT, + FLG_BRANCHSTATE, + FLG_NULLPOINTERARITH, + FLG_SHADOW, FLG_DEPARRAYS, + FLG_REDECL, FLG_READONLYSTRINGS, FLG_READONLYTRANS, + FLG_LOOPLOOPBREAK, FLG_SWITCHLOOPBREAK, FLG_MODGLOBS, + FLG_CHECKSTRICTGLOBALS, FLG_IMPCHECKEDSPECGLOBALS, + FLG_MACROMATCHNAME, FLG_WARNLINTCOMMENTS, + FLG_INCLUDENEST, FLG_ANSIRESERVED, FLG_CPPNAMES, + FLG_NOPARAMS, FLG_IFEMPTY, FLG_WHILEEMPTY, FLG_REALCOMPARE, + FLG_BOOLOPS, FLG_SHIFTSIGNED, + INVALID_FLAG } ; + + SETFLAGS (); + } + else if (cstring_equalLit (s, "strict")) + { + flagcode modeflags[] = + { + FLG_CHECKSTRICTGLOBALIAS, + FLG_CHECKEDGLOBALIAS, + FLG_CHECKMODGLOBALIAS, + FLG_UNCHECKEDGLOBALIAS, + FLG_MODFILESYSTEM, + FLG_MACROMATCHNAME, + FLG_MACROUNDEF, FLG_MUTREP, FLG_MUSTMOD, + FLG_ALLGLOBALS, FLG_IMPTYPE, + FLG_MODNOMODS, FLG_MODGLOBSUNSPEC, FLG_MODSTRICTGLOBSUNSPEC, + FLG_GLOBUNSPEC, FLG_SIZEOFTYPE, + FLG_EXPORTHEADER, FLG_EXPORTHEADERVAR, + FLG_NOPARAMS, FLG_OLDSTYLE, FLG_EXITARG, + FLG_RETSTACK, + FLG_FCNDEREF, + FLG_ONLYUNQGLOBALTRANS, + FLG_GLOBALSIMPMODIFIESNOTHING, + FLG_PREDBOOLOTHERS, FLG_PREDBOOLPTR, FLG_PREDBOOLINT, + FLG_INTERNALGLOBS, FLG_INTERNALGLOBSNOGLOBS, + FLG_USEALLGLOBS, FLG_RETALIAS, + FLG_MODGLOBS, FLG_MODGLOBSUNSPEC, FLG_MODGLOBSUNCHECKED, + FLG_RETEXPOSE, FLG_ASSIGNEXPOSE, FLG_CASTEXPOSE, + FLG_NOEFFECTUNCON, FLG_EVALORDERUNCON, + FLG_FUNCUNUSED, + FLG_EXPORTITER, FLG_EXPORTCONST, + FLG_TYPEUNUSED, FLG_FIELDUNUSED, FLG_PARAMUNUSED, FLG_TOPUNUSED, + FLG_CONSTUNUSED, FLG_ENUMMEMUNUSED, + FLG_VARUNUSED, + FLG_NULLPOINTERARITH, FLG_POINTERARITH, + FLG_PTRNUMCOMPARE, + FLG_BOOLCOMPARE, FLG_NOEFFECT, + FLG_RETVALINT, FLG_RETVALBOOL, FLG_RETVALOTHER, + FLG_ANSIRESERVED, FLG_ANSIRESERVEDLOCAL, FLG_CPPNAMES, + FLG_RETVALBOOL, FLG_RETVALINT, FLG_SPECUNDEF, + FLG_DECLUNDEF, FLG_STRICTOPS, FLG_INCONDEFS, + FLG_INCONDEFSLIB, FLG_MATCHFIELDS, FLG_EXPORTMACRO, FLG_EXPORTVAR, + FLG_EXPORTFCN, FLG_EXPORTTYPE, FLG_EXPORTLOCAL, FLG_MACROPARAMS, + FLG_MACROASSIGN, + FLG_SEFPARAMS, FLG_SEFUNSPEC, FLG_MACROSTMT, FLG_MACROPARENS, + FLG_MACROFCNDECL, + FLG_MACROCONSTDECL, + FLG_MACROREDEF, FLG_MACROEMPTY, + FLG_INFLOOPS, FLG_INFLOOPSUNCON, + FLG_UNREACHABLE, + FLG_NORETURN, FLG_CASEBREAK, FLG_MISSCASE, FLG_USEDEF, + FLG_EVALORDER, + FLG_MODUNCON, FLG_MODUNCONNOMODS, FLG_MODINTERNALSTRICT, + FLG_MODOBSERVERUNCON, + + FLG_NESTEDEXTERN, + FLG_FIRSTCASE, + + /* memchecks flags */ + FLG_NULLSTATE, FLG_NULLDEREF, FLG_NULLASSIGN, + FLG_NULLPASS, FLG_NULLRET, + + FLG_COMPDEF, FLG_COMPMEMPASS, FLG_UNIONDEF, + + /* memtrans flags */ + FLG_EXPOSETRANS, + FLG_OBSERVERTRANS, + FLG_DEPENDENTTRANS, + FLG_NEWREFTRANS, + FLG_ONLYTRANS, + FLG_OWNEDTRANS, + FLG_FRESHTRANS, + FLG_SHAREDTRANS, + FLG_TEMPTRANS, + FLG_KEPTTRANS, + FLG_REFCOUNTTRANS, + FLG_STATICTRANS, + FLG_UNKNOWNTRANS, + FLG_KEEPTRANS, + FLG_IMMEDIATETRANS, + FLG_STATICINITTRANS, + FLG_UNKNOWNINITTRANS, + + FLG_USERELEASED, FLG_ALIASUNIQUE, FLG_MAYALIASUNIQUE, + FLG_MUSTFREE, FLG_MUSTDEFINE, FLG_GLOBSTATE, + FLG_COMPDESTROY, FLG_MUSTNOTALIAS, + FLG_MEMIMPLICIT, + FLG_BRANCHSTATE, + + FLG_DECLPARAMNAME, FLG_DECLPARAMMATCH, + + FLG_SHADOW, FLG_DEPARRAYS, + FLG_STRICTDESTROY, FLG_STRICTUSERELEASED, FLG_STRICTBRANCHSTATE, + FLG_REDECL, FLG_READONLYSTRINGS, FLG_READONLYTRANS, + FLG_LOOPLOOPBREAK, FLG_LOOPSWITCHBREAK, FLG_SWITCHLOOPBREAK, + FLG_SWITCHSWITCHBREAK, FLG_LOOPLOOPCONTINUE, + FLG_CHECKSTRICTGLOBALS, FLG_IMPCHECKEDSPECGLOBALS, + FLG_ALLGLOBALS, FLG_IMPCHECKEDSTRICTGLOBALS, + FLG_IMPCHECKEDSTRICTSTATICS, + FLG_IMPCHECKEDSTRICTSPECGLOBALS, + FLG_IMPCHECKMODINTERNALS, + FLG_WARNMISSINGGLOBALS, FLG_WARNMISSINGGLOBALSNOGLOBS, + FLG_WARNLINTCOMMENTS, FLG_ANSIRESERVEDLOCAL, + FLG_INCLUDENEST, FLG_STRINGLITERALLEN, + FLG_NUMSTRUCTFIELDS, FLG_NUMENUMMEMBERS, + FLG_CONTROLNESTDEPTH, + FLG_FORBLOCK, FLG_WHILEBLOCK, + FLG_FOREMPTY, FLG_WHILEEMPTY, + FLG_IFEMPTY, FLG_IFBLOCK, + FLG_ELSEIFCOMPLETE, + FLG_REALCOMPARE, FLG_BOOLOPS, + FLG_SYSTEMDIRERRORS, FLG_UNUSEDSPECIAL, + + FLG_SHIFTSIGNED, FLG_BITWISEOPS, + INVALID_FLAG } ; + + SETFLAGS (); + } + else + { + llcontbug (message ("context_setMode: bad mode: %s", s)); + } +} + +bool +context_isSpecialFile (cstring fname) +{ + char *ext = filenameExtension (cstring_toCharsSafe (fname)); + + return (mstring_equal (ext, ".y") + || mstring_equal (ext, ".l") + || cstring_equalLit (fname, "lex.yy.c")); +} + +bool +context_isSystemDir (cstring dir) +{ + cstring sysDirs = context_exposeString (FLG_SYSTEMDIRS); + char *thisdir = cstring_toCharsSafe (sysDirs); + char *nextdir = strchr (thisdir, SEPCHAR); + + if (nextdir != NULL) + { + *nextdir = '\0'; + nextdir += 1; + } + + while (thisdir != NULL) + { + DPRINTF (("Test: %s / %s", dir, thisdir)); + + if (cstring_equalCanonicalPrefix (dir, thisdir)) + { + if (nextdir != NULL) + { + *(nextdir - 1) = SEPCHAR; + } + + return TRUE; + } + + if (nextdir != NULL) + { + *(nextdir - 1) = SEPCHAR; + } + + if (nextdir != NULL) + { + thisdir = nextdir; + nextdir = strchr (thisdir, SEPCHAR); + + if (nextdir != NULL) + { + *nextdir = '\0'; + nextdir += 1; + } + } + else + { + break; + } + } + + DPRINTF (("Returns FALSE")); + return FALSE; +} + +void +context_addFileAccessType (typeId t) +{ + cstring base; + + if (gc.kind == CX_FUNCTION || gc.kind == CX_MACROFCN + || gc.kind == CX_UNKNOWNMACRO) + { + gc.acct = typeIdSet_insert (gc.acct, t); + } + + gc.facct = typeIdSet_insert (gc.facct, t); + + base = fileloc_getBase (g_currentloc); + insertModuleAccess (base, t); + + } + +void +context_removeFileAccessType (typeId t) +{ + if (gc.kind == CX_FUNCTION || gc.kind == CX_MACROFCN + || gc.kind == CX_UNKNOWNMACRO) + { + gc.acct = typeIdSet_removeFresh (gc.acct, t); + } + + gc.facct = typeIdSet_removeFresh (gc.facct, t); + gc.nacct = typeIdSet_insert (gc.nacct, t); +} + +void context_enterFunctionDecl (void) +{ + llassert (gc.kind == CX_GLOBAL); + gc.kind = CX_FCNDECL; +} + +void context_exitFunctionDecl (void) +{ + gc.kind = CX_GLOBAL; +} + +bool context_inFunctionDecl (void) +{ + return (gc.kind == CX_FCNDECL); +} + +void +context_enterMacro (/*@observer@*/ uentry e) +{ + context_enterFunction (e); + gc.kind = CX_MACROFCN; +} + +void +context_enterUnknownMacro (/*@dependent@*/ uentry e) +{ + llassert (uentry_isFunction (e)); + context_enterFunction (e); + gc.kind = CX_UNKNOWNMACRO; +} + +void context_enterAndClause (exprNode e) +{ + + usymtab_trueBranch (guardSet_copy (exprNode_getGuards (e))); + pushClause (ANDCLAUSE); +} + +void context_enterOrClause (exprNode e) +{ + usymtab_trueBranch (guardSet_invert (exprNode_getGuards (e))); + pushClause (ORCLAUSE); +} + +bool context_inDeepLoop (void) +{ + bool inLoop = FALSE; + + clauseStack_elements (gc.clauses, el) + { + if (clause_isLoop (el)) + { + if (inLoop) + { + return TRUE; + } + + inLoop = TRUE; + } + } end_clauseStack_elements; + + return FALSE; +} + +bool context_inDeepSwitch (void) +{ + bool inLoop = FALSE; + + clauseStack_elements (gc.clauses, el) + { + if (clause_isSwitch (el)) + { + if (inLoop) + { + return TRUE; + } + + inLoop = TRUE; + } + } end_clauseStack_elements; + + return FALSE; +} + +bool context_inDeepLoopSwitch (void) +{ + bool inLoop = FALSE; + + clauseStack_elements (gc.clauses, el) + { + if (clause_isBreakable (el)) + { + if (inLoop) + { + return TRUE; + } + + inLoop = TRUE; + } + } end_clauseStack_elements; + + return FALSE; +} + +clause context_breakClause (void) +{ + clauseStack_elements (gc.clauses, el) + { + if (clause_isSwitch (el)) + { + return el; + } + else if (clause_isLoop (el)) + { + return el; + } + else + { + ; + } + } end_clauseStack_elements; + + return NOCLAUSE; +} + +clause context_nextBreakClause (void) +{ + bool hasOne = FALSE; + + clauseStack_elements (gc.clauses, el) + { + if (clause_isBreakable (el)) + { + if (hasOne) + { + return el; + } + else + { + hasOne = TRUE; + } + } + } end_clauseStack_elements; + + return NOCLAUSE; +} + +bool context_inConditional (void) +{ + clauseStack_elements (gc.clauses, el) + { + /* + ** Should also include TRUECLAUSE and FALSECLAUSE, but need + ** to distinguish if from ? for this + */ + + if (clause_isBreakable (el) && (el != DOWHILECLAUSE)) + { + return TRUE; + } + } end_clauseStack_elements; + + return FALSE; +} + +void context_exitAndClause (exprNode pred, exprNode tbranch) +{ + context_setJustPopped (); + + llassert (gc.inclause == ANDCLAUSE); + + usymtab_popAndBranch (pred, tbranch); + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); +} + +void context_exitOrClause (exprNode pred, exprNode tbranch) +{ + context_setJustPopped (); + + llassert (gc.inclause == ORCLAUSE); + + usymtab_popOrBranch (pred, tbranch); + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); +} + +static void context_enterCondClauseAux (clause cl) + /*@modifies gc@*/ +{ + pushClause (cl); +} + +static void context_enterTrueAux (exprNode e, clause cl) + /*@modifies gc@*/ +{ + usymtab_trueBranch (guardSet_copy (exprNode_getGuards (e))); + pushClause (cl); +} + +void context_enterIterClause (void) +{ + context_enterTrueAux (exprNode_undefined, ITERCLAUSE); +} + +void context_enterDoWhileClause (void) +{ + pushClause (DOWHILECLAUSE); +} + +void context_enterWhileClause (exprNode e) +{ + context_enterTrueAux (e, WHILECLAUSE); +} + +void context_enterForClause (exprNode e) +{ + context_enterTrueAux (e, FORCLAUSE); +} + +void context_enterTrueClause (exprNode e) +{ + context_enterTrueAux (e, TRUECLAUSE); +} + +void context_enterSwitch (exprNode e) +{ + + usymtab_switchBranch (e); + context_enterCondClauseAux (SWITCHCLAUSE); +} + +void context_exitSwitch (exprNode e, bool allpaths) +{ + usymtab_exitSwitch (e, allpaths); + + while (clause_isCase (clauseStack_top (gc.clauses))) + { + clauseStack_pop (gc.clauses); + } + + context_exitClauseSimp (); +} + +void context_enterCaseClause (exprNode e) +{ + bool branch = FALSE; + + DPRINTF (("Enter case clause!")); + + branch = usymtab_newCase (exprNode_undefined, e); + + if (branch) + { + context_enterCondClauseAux (CASECLAUSE); + } +} + +static void context_enterFalseClauseAux (exprNode e, clause cl) + /*@modifies gc@*/ +{ + usymtab_altBranch (guardSet_invert (exprNode_getGuards (e))); + gc.inclause = cl; + clauseStack_switchTop (gc.clauses, cl); +} + +void context_enterFalseClause (exprNode e) +{ + + context_enterFalseClauseAux (e, FALSECLAUSE); +} + +void +context_enterConstantMacro (/*@exposed@*/ /*@dependent@*/ uentry e) +{ + gc.kind = CX_MACROCONST; + gc.cont.fcn = e; + gc.showfunction = context_getFlag (FLG_SHOWFUNC); + + gc.acct = typeIdSet_subtract (typeIdSet_union (gc.facct, uentry_accessType (e)), + gc.nacct); + + + usymtab_enterScope (); + sRef_enterFunctionScope (); + + gc.globs = globSet_undefined; + globSet_clear (gc.globs_used); + gc.mods = sRefSet_undefined; +} + +uentry context_getHeader (void) +{ + if (!(context_inFunctionLike () || (gc.kind == CX_MACROCONST))) + { + llfatalbug (message ("context_getHeader: bad call: %q", + context_unparse ())); + } + + return (gc.cont.fcn); +} + +void +context_setFunctionDefined (fileloc loc) +{ + switch (gc.kind) + { + case CX_UNKNOWNMACRO: + case CX_FUNCTION: + case CX_MACROFCN: + uentry_setFunctionDefined (gc.cont.fcn, loc); + break; + default: + /* (not a bug because of parse errors) */ + break; + } +} + +void +context_enterFunction (/*@exposed@*/ uentry e) +{ + gc.kind = CX_FUNCTION; + gc.cont.fcn = e; + + if (uentry_hasAccessType (e)) + { + gc.acct = typeIdSet_subtract (typeIdSet_union (gc.facct, uentry_accessType (e)), + gc.nacct); + } + else + { + gc.acct = gc.facct; + } + + gc.showfunction = context_getFlag (FLG_SHOWFUNC); + + gc.globs = uentry_getGlobs (e); + globSet_clear (gc.globs_used); + gc.mods = uentry_getMods (e); + + usymtab_enterFunctionScope (e); + sRef_enterFunctionScope (); +} + +static bool context_checkStrictGlobals (void) +{ + return (context_getFlag (FLG_CHECKSTRICTGLOBALS)); +} + +static bool context_hasGlobs (void) +{ + if (context_inFunctionLike ()) + { + return (uentry_hasGlobs (gc.cont.fcn)); + } + else + { + return (FALSE); + } +} + +static bool context_checkCheckedGlobals (void) +{ + return (context_getFlag (FLG_GLOBALS) + && (context_getFlag (FLG_GLOBUNSPEC) + || context_hasGlobs ())); +} + +static bool context_checkUnknownGlobals (void) +{ + /* should be uentry_hasGlobs ? */ + + return (context_getFlag (FLG_ALLGLOBALS) + && (context_getFlag (FLG_GLOBUNSPEC) + || context_hasGlobs ())); +} + +static bool context_checkUncheckedGlobals (void) +{ + return (FALSE); +} + +bool +context_checkExport (uentry e) +{ + if (!gc.anyExports) return FALSE; + + if (uentry_isFunction (e) + || (uentry_isVariable (e) && ctype_isFunction (uentry_getType (e)))) + { + return context_maybeSet (FLG_EXPORTFCN); + } + else if (uentry_isExpandedMacro (e)) + { + return context_maybeSet (FLG_EXPORTMACRO); + } + else if (uentry_isVariable (e)) + { + return context_maybeSet (FLG_EXPORTVAR); + } + else if (uentry_isEitherConstant (e)) + { + return context_maybeSet (FLG_EXPORTCONST); + } + else if (uentry_isIter (e) || uentry_isEndIter (e)) + { + return context_maybeSet (FLG_EXPORTITER); + } + else if (uentry_isDatatype (e)) + { + return context_maybeSet (FLG_EXPORTTYPE); + } + else + { + BADEXIT; + } +} + +bool +context_checkGlobUse (uentry glob) +{ + + if (uentry_isCheckedStrict (glob)) + { + return context_checkStrictGlobals (); + } + else if (uentry_isChecked (glob)) + { + return context_checkCheckedGlobals (); + } + else if (uentry_isCheckedUnknown (glob) || uentry_isCheckMod (glob)) + { + return context_checkUnknownGlobals (); + } + else + { + llassert (uentry_isUnchecked (glob)); + + return context_checkUncheckedGlobals (); + } +} + +bool +context_checkAliasGlob (uentry glob) +{ + if (uentry_isCheckedStrict (glob)) + { + return gc.flags[FLG_CHECKSTRICTGLOBALIAS]; + } + else if (uentry_isChecked (glob)) + { + return gc.flags[FLG_CHECKEDGLOBALIAS]; + } + else if (uentry_isCheckMod (glob)) + { + return gc.flags[FLG_CHECKMODGLOBALIAS]; + } + else + { + llassert (uentry_isUnchecked (glob) || uentry_isCheckedUnknown (glob)); + + return gc.flags[FLG_UNCHECKEDGLOBALIAS]; + } +} + +bool context_checkInternalUse (void) +{ + if (context_hasGlobs ()) + { + return (gc.flags[FLG_INTERNALGLOBS]); + } + else + { + return (gc.flags[FLG_INTERNALGLOBSNOGLOBS]); + } +} + +bool +context_checkGlobMod (sRef el) +{ + uentry ue = sRef_getUentry (el); + + /* no: llassert (sRef_isGlobal (el)); also check local statics */ + + if (uentry_isCheckedModify (ue) + || (!uentry_isUnchecked (ue) && (gc.flags[FLG_ALLGLOBALS]))) + { + if (context_hasMods ()) + { + return (gc.flags[FLG_MODGLOBS]); + } + else + { + if (uentry_isCheckedStrict (ue)) + { + return (gc.flags[FLG_MODGLOBSUNSPEC]); + } + else + { + return (gc.flags[FLG_MODSTRICTGLOBSUNSPEC]); + } + } + } + else + { + if (context_hasMods ()) + { + return (gc.flags[FLG_MODGLOBSUNCHECKED]); + } + else + { + return FALSE; + } + } +} + +void +context_usedGlobal (sRef el) +{ + if (!globSet_member (gc.globs_used, el)) + { + /* + ** The first time a global is used in a function, we need + ** to clear the derived sRefs, since they were set for the + ** previous function. + */ + + sRef_clearDerived (el); + gc.globs_used = globSet_insert (gc.globs_used, el); + } +} + +/*@observer@*/ sRefSet +context_modList (void) +{ + return gc.mods; +} + +bool +context_globAccess (sRef s) +{ + llassert (sRef_isGlobal (s) || sRef_isKindSpecial (s)); + return (globSet_member (gc.globs, s)); +} + +bool +context_hasAccess (typeId t) +{ + if (context_inFunctionLike ()) + { + return (typeIdSet_member (gc.acct, t)); + } + else + { + return (context_hasFileAccess (t)); + } +} + +bool +context_hasFileAccess (typeId t) +{ + return (typeIdSet_member (gc.facct, t)); +} + +/*@only@*/ cstring +context_unparseAccess (void) +{ + return (message ("%q / %q", typeIdSet_unparse (gc.acct), + typeIdSet_unparse (gc.facct))); +} + +/*@only@*/ cstring +context_unparseClauses (void) +{ + return (clauseStack_unparse (gc.clauses)); +} + +bool +context_couldHaveAccess (typeId t) +{ + if (gc.kind == CX_FUNCTION || gc.kind == CX_MACROFCN || gc.kind == CX_UNKNOWNMACRO) + { + return (typeIdSet_member (gc.acct, t)); + } + else + { + return (typeIdSet_member (gc.facct, t)); + } +} + +ctype +context_getRetType (void) +{ + ctype f = ctype_undefined; + + if (gc.kind == CX_FUNCTION || gc.kind == CX_MACROFCN) + { + f = uentry_getType (gc.cont.fcn); + } + else if (gc.kind == CX_UNKNOWNMACRO) + { + return ctype_unknown; + } + else + { + llcontbuglit ("context_getRetType: not in a function context"); + return ctype_unknown; + } + + if (!ctype_isFunction (f)) + { + if (ctype_isKnown (f)) + { + llbuglit ("context_getRetType: not a function"); + } + + return ctype_unknown; + } + return (ctype_returnValue (f)); +} + +bool +context_hasMods (void) +{ + if (context_inFunctionLike ()) + { + return (uentry_hasMods (gc.cont.fcn)); + } + else + { + return FALSE; + } +} + +void +context_exitAllClauses (void) +{ + + while (!clauseStack_isEmpty (gc.clauses)) + { + clause el = clauseStack_top (gc.clauses); + + gc.inclause = el; + + if (clause_isNone (el)) + { + usymtab_quietExitScope (g_currentloc); + clauseStack_pop (gc.clauses); + } + else + { + context_exitClausePlain (); + } + } + + clauseStack_clear (gc.clauses); + + + gc.inclause = NOCLAUSE; +} + +static +void context_exitClauseSimp (void) +{ + + context_setJustPopped (); + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); +} + +static +void context_exitCaseClause (void) +{ + context_setJustPopped (); + usymtab_popCaseBranch (); + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); +} + +static +void context_exitClauseAux (exprNode pred, exprNode tbranch) +{ + context_setJustPopped (); + usymtab_popTrueBranch (pred, tbranch, gc.inclause); + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); +} + +void context_exitTrueClause (exprNode pred, exprNode tbranch) +{ + if (gc.inclause != TRUECLAUSE) + { + llparseerror (cstring_makeLiteral + ("Likely parse error. Conditional clauses are inconsistent.")); + return; + } + + + context_setJustPopped (); + + usymtab_popTrueBranch (pred, tbranch, TRUECLAUSE); + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); + + } + +void context_exitIterClause (exprNode body) +{ + llassert (gc.inclause == ITERCLAUSE); + + context_setJustPopped (); + + if (context_getFlag (FLG_LOOPEXEC)) + { + usymtab_popTrueExecBranch (exprNode_undefined, body, ITERCLAUSE); + } + else + { + usymtab_popTrueBranch (exprNode_undefined, body, ITERCLAUSE); + } + + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); +} + +static void context_popCase (void) { + /* + ** If we are exiting an outer clause, sometimes still in a switch case. + ** + ** e.g.: + ** + ** switch(a) + ** { + ** case 1: + ** while (c>3) + ** { + ** case 3: ++c; + ** } + ** } + */ + + DPRINTF (("Popping case clause: %s", + clauseStack_unparse (gc.clauses))); + + if (gc.inclause == CASECLAUSE) { + context_exitCaseClause (); + } +} + +void context_exitWhileClause (exprNode pred, exprNode body) +{ + guardSet invGuards = guardSet_invert (exprNode_getGuards (pred)); + + context_popCase (); + + if (gc.inclause != WHILECLAUSE) { + DPRINTF (("Clause: %s / %s", clause_unparse (gc.inclause), + clauseStack_unparse (gc.clauses))); + } + + llassert (gc.inclause == WHILECLAUSE); + + context_setJustPopped (); + + + /* + ** predicate must be false after while loop (unless there are breaks) + */ + + if (context_getFlag (FLG_LOOPEXEC)) + { + usymtab_popTrueExecBranch (pred, body, WHILECLAUSE); + } + else + { + usymtab_popTrueBranch (pred, body, WHILECLAUSE); + } + + + usymtab_addGuards (invGuards); + guardSet_free (invGuards); + + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); +} + +void context_exitDoWhileClause (exprNode pred) +{ + guardSet invGuards = guardSet_invert (exprNode_getGuards (pred)); + + if (gc.inclause == CASECLAUSE) { + /* handle Duff's device */ + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); + } + + llassert (gc.inclause == DOWHILECLAUSE); + + context_setJustPopped (); + + + usymtab_addGuards (invGuards); + guardSet_free (invGuards); + + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); +} + +void context_exitForClause (exprNode forPred, exprNode body) +{ + guardSet invGuards = guardSet_invert (exprNode_getForGuards (forPred)); + + llassert (gc.inclause == FORCLAUSE); + context_setJustPopped (); + + /* + ** predicate must be false after while loop (unless there are breaks) + */ + + if (context_getFlag (FLG_LOOPEXEC)) + { + usymtab_popTrueExecBranch (forPred, body, FORCLAUSE); + } + else + { + usymtab_popTrueBranch (forPred, body, FORCLAUSE); + } + + usymtab_addGuards (invGuards); + guardSet_free (invGuards); + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); +} + +static void context_exitClausePlain (void) +{ + llassert (gc.inclause != NOCLAUSE); + + if (gc.inclause == FALSECLAUSE) + { + context_exitClause (exprNode_undefined, exprNode_undefined, exprNode_undefined); + } + else + { + context_exitClauseAux (exprNode_undefined, exprNode_undefined); + } + +} + +void context_exitClause (exprNode pred, exprNode tbranch, exprNode fbranch) +{ + + context_setJustPopped (); + + if (gc.inclause == FALSECLAUSE) + { + usymtab_popBranches (pred, tbranch, fbranch, FALSE, FALSECLAUSE); + + llassert (clauseStack_top (gc.clauses) == FALSECLAUSE); + + clauseStack_pop (gc.clauses); + gc.inclause = topClause (gc.clauses); + } + else + { + context_exitTrueClause (pred, tbranch); + } +} + +void +context_returnFunction (void) +{ + usymtab_checkFinalScope (TRUE); + } + +void +context_exitFunction (void) +{ + + if (!context_inFunction () && !context_inMacroConstant () + && !context_inMacroUnknown () + && !context_inIterDef () && !context_inIterEnd ()) + { + /* + ** not a bug because of parse errors + */ + } + else + { + if (context_inMacro () && usymtab_inFunctionScope ()) + { + usymtab_exitScope (exprNode_undefined); + } + + if (uentry_hasGlobs (gc.cont.fcn)) + { + exprChecks_checkUsedGlobs (gc.globs, gc.globs_used); + } + + + if (uentry_hasMods (gc.cont.fcn)) + { + if (context_getFlag (FLG_MUSTMOD)) + { + exprNode_checkAllMods (gc.mods, gc.cont.fcn); + } + } + + /* + ** clear file static modifies + */ + + /* do this first to get unused error messages */ + + usymtab_exitScope (exprNode_undefined); + sRef_exitFunctionScope (); + + gc.showfunction = FALSE; + gc.kind = CX_GLOBAL; + gc.cont.glob = TRUE; + gc.acct = gc.facct; + gc.globs = globSet_new (); + globSet_clear (gc.globs_used); + gc.mods = sRefSet_new (); + } + + llassert (clauseStack_isEmpty (gc.clauses)); + llassert (gc.inclause == NOCLAUSE); +} + +void +context_quietExitFunction (void) +{ + while (gc.kind == CX_INNER) + { + context_exitInnerPlain (); + } + + if (!context_inFunction () && !context_inMacroConstant () && !context_inMacroUnknown () + && !context_inIterDef () && !context_inIterEnd ()) + { + } + else + { + usymtab_quietExitScope (g_currentloc); + + gc.showfunction = FALSE; + gc.kind = CX_GLOBAL; + gc.cont.glob = TRUE; + gc.acct = gc.facct; + gc.globs = globSet_new (); + globSet_clear (gc.globs_used); + gc.mods = sRefSet_new (); + + sRef_exitFunctionScope (); + } +} + +/*@observer@*/ uentryList +context_getParams (void) +{ + if (context_inFunctionLike ()) + { + return (uentry_getParams (gc.cont.fcn)); + } + else + { + llcontbug (message ("context_getParams: not in function: %q", context_unparse ())); + return uentryList_undefined; + } +} + +/*@observer@*/ globSet +context_getUsedGlobs (void) +{ + llassert (gc.kind == CX_FUNCTION || gc.kind == CX_MACROFCN + || gc.kind == CX_UNKNOWNMACRO || gc.kind == CX_ITERDEF); + + return (gc.globs_used); +} + +cstring +context_moduleName () +{ + return (fileloc_getBase (g_currentloc)); +} + +/*@observer@*/ globSet +context_getGlobs (void) +{ + llassert (gc.kind == CX_FUNCTION || gc.kind == CX_MACROFCN + || gc.kind == CX_UNKNOWNMACRO || gc.kind == CX_ITERDEF); + + return (gc.globs); +} + +void +context_addBoolAccess (void) +{ + cstring bname = context_getString (FLG_BOOLTYPE); + typeIdSet boolt = typeIdSet_single (usymtab_getTypeId (bname)); + + addModuleAccess (cstring_copy (bname), boolt); + + /* for sys/types (perhaps, this is bogus!) */ + addModuleAccess (cstring_makeLiteral ("types"), boolt); +} + +bool +context_canAccessBool (void) +{ + static typeId boolType = typeId_invalid; + + + if (context_getFlag (FLG_ABSTRACTBOOL)) + { + if (typeId_isInvalid (boolType)) + { + boolType = usymtab_getTypeId (context_getBoolName ()); + } + return (typeIdSet_member (gc.acct, boolType)); + } + + return FALSE; +} + +void +context_setMessageAnnote (/*@only@*/ cstring s) +{ + llassert (cstring_isUndefined (gc.msgAnnote)); + gc.msgAnnote = s; +} + +bool +context_hasMessageAnnote (void) +{ + return (cstring_isDefined (gc.msgAnnote)); +} + +void +context_clearMessageAnnote (void) +{ + if (cstring_isDefined (gc.msgAnnote)) + { + cstring_free (gc.msgAnnote); + gc.msgAnnote = cstring_undefined; + } +} + +/*@only@*/ cstring +context_getMessageAnnote (void) +{ + cstring st = gc.msgAnnote; + + gc.msgAnnote = cstring_undefined; + return st; +} + +void +context_setAliasAnnote (/*@observer@*/ sRef s, /*@observer@*/ sRef t) +{ + llassert (sRef_isInvalid (gc.aliasAnnote)); + llassert (!sRef_sameName (s, t)); + gc.aliasAnnote = s; + gc.aliasAnnoteAls = t; +} + +bool +context_hasAliasAnnote (void) +{ + return (sRef_isValid (gc.aliasAnnote)); +} + +void +context_clearAliasAnnote (void) +{ + gc.aliasAnnote = sRef_undefined; +} + +cstring +context_getAliasAnnote (void) +{ + sRef ret = gc.aliasAnnote; + sRef als = gc.aliasAnnoteAls; + + llassert (sRef_isValid (ret) && sRef_isValid (als)); + + gc.aliasAnnote = sRef_undefined; + return (message ("%q aliases %q", sRef_unparse (als), sRef_unparse (ret))); +} + +void +context_recordFileModifies (sRefSet mods) +{ + gc.modrecs = sRefSetList_add (gc.modrecs, mods); +} + +void +context_recordFileGlobals (globSet mods) +{ + /*@access globSet@*/ context_recordFileModifies (mods); /*@noaccess globSet@*/ +} + +void +context_setCommentMarkerChar (char c) +{ + llassert (c != '\0'); + + context_setValue (FLG_COMMENTCHAR, (int) c); +} + +char +context_getCommentMarkerChar (void) +{ + return ((char) context_getValue (FLG_COMMENTCHAR)); +} + +static void +context_setValue (flagcode flag, int val) +{ + int index = flagcode_valueIndex (flag); + + llassert (index >= 0 && index <= NUMVALUEFLAGS); + + if (val <= 0) + { + switch (flag) + { + case FLG_INCLUDENEST: + case FLG_CONTROLNESTDEPTH: + case FLG_STRINGLITERALLEN: + case FLG_NUMSTRUCTFIELDS: + case FLG_NUMENUMMEMBERS: + case FLG_LINELEN: + { + cstring warn = message ("Value for %s must be a positive " + "number (given %d)", + flagcode_unparse (flag), val); + + flagWarning (warn); + cstring_free (warn); + val = MINLINELEN; + } + return; + default: + break; + } + } + + if (flag == FLG_LINELEN && val < MINLINELEN) + { + cstring warn = message ("Value for %s must be at least %d (given %d)", + flagcode_unparse (flag), + MINLINELEN, val); + flagWarning (warn); + cstring_free (warn); + val = MINLINELEN; + } + + gc.values[index] = val; +} + +void +context_setValueAndFlag (flagcode flag, int val) +{ + gc.flags[flag] = TRUE; + context_setValue (flag, val); +} + +int +context_getValue (flagcode flag) +{ + int index = flagcode_valueIndex (flag); + + llassert (index >= 0 && index <= NUMVALUEFLAGS); + return (gc.values[index]); +} + +int +context_getCounter (flagcode flag) +{ + int index = flagcode_valueIndex (flag); + + llassert (index >= 0 && index <= NUMVALUEFLAGS); + return (gc.counters[index]); +} + +void +context_incCounter (flagcode flag) +{ + int index = flagcode_valueIndex (flag); + + llassert (index >= 0 && index <= NUMVALUEFLAGS); + /* check limit */ + gc.counters[index]++; +} + +void +context_decCounter (flagcode flag) +{ + int index = flagcode_valueIndex (flag); + + llassert (index >= 0 && index <= NUMVALUEFLAGS); + gc.counters[index]--; +} + +bool context_showFunction (void) +{ + return (gc.showfunction); +} + +void +context_setString (flagcode flag, cstring val) +{ + int index = flagcode_stringIndex (flag); + + llassert (index >= 0 && index <= NUMSTRINGFLAGS); + + if (flag == FLG_SYSTEMDIRS) + { + llassert (cstring_isDefined (val)); + + if (cstring_firstChar (val) == '\"') + { + cstring oval = val; + cstring tval = cstring_copy (cstring_suffix (val, 1)); + + if (cstring_lastChar (tval) != '\"') + { + int n = cstring_length (tval) - 1; + + while (isspace ((int) cstring_getChar (tval, n))) + { + n--; + } + + if (cstring_getChar (tval, n) != '\"') + { + cstring msg = message ("Setting -systemdirs to string with unmatching quotes: %s", val); + flagWarning (msg); + cstring_free (msg); + } + else + { + cstring otval = tval; + tval = cstring_prefix (tval, n); + cstring_free (otval); + } + } + + val = cstring_copy (cstring_clip (tval, cstring_length (tval) - 1)); + DPRINTF (("val = %s", val)); + cstring_free (tval); + cstring_free (oval); + } + } + + if (flag == FLG_TMPDIR) + { + llassert (cstring_isDefined (val)); + + if (cstring_length (val) == 0) + { + cstring_free (val); + val = message (".%s", cstring_makeLiteralTemp (CONNECTSTR)); + } + else if (cstring_lastChar (val) != CONNECTCHAR) + { + val = cstring_appendChar (val, CONNECTCHAR); + } + else + { + ; + } + } + + if (cstring_length (val) >= 1 + && cstring_firstChar (val) == '"') + { + cstring s = message + ("setting %s to string beginning with \". You probably " + "don't meant to have the \"'s.", + flagcode_unparse (flag)); + + flagWarning (s); + cstring_free (s); + } + + if (flag == FLG_BOOLTYPE) + { + + } + + gc.strings[index] = val; +} + +static /*@exposed@*/ cstring +context_exposeString (flagcode flag) +{ + int index = flagcode_stringIndex (flag); + + llassert (index >= 0 && index <= NUMSTRINGFLAGS); + return (gc.strings[index]); +} + +cstring +context_getString (flagcode flag) +{ + return (context_exposeString (flag)); +} + +void +context_resetErrors (void) +{ + gc.numerrors = 0; +} + +void context_initMod (void) + /*@globals undef gc; @*/ +{ + gc.kind = CX_GLOBAL; + gc.instandardlib = FALSE; + gc.numerrors = 0; + gc.neednl = FALSE; + gc.linesprocessed = 0; + gc.speclinesprocessed = 0; + gc.insuppressregion = FALSE; + gc.macroMissingParams = FALSE; + gc.preprocessing = FALSE; + gc.incommandline = FALSE; + gc.mc = macrocache_create (); + gc.nmods = 0; + gc.maxmods = DEFAULTMAXMODS; + gc.moduleaccess = (maccesst *) + dmalloc (sizeof (*gc.moduleaccess) * (gc.maxmods)); + + gc.library = FLG_ANSILIB; + + gc.locstack = filelocStack_new (); + gc.modrecs = sRefSetList_undefined; + gc.anyExports = FALSE; + + gc.ftab = fileTable_create (); + gc.msgLog = messageLog_new (); + gc.inimport = FALSE; + gc.inDerivedFile = FALSE; + gc.inheader = FALSE; + gc.markers = flagMarkerList_new (); + gc.cont.glob = TRUE; + gc.showfunction = FALSE; + gc.msgAnnote = cstring_undefined; + gc.aliasAnnote = sRef_undefined; + gc.aliasAnnoteAls = sRef_undefined; + gc.boolType = ctype_bool; + gc.mods = sRefSet_new (); + + gc.saveloc = fileloc_undefined; + + gc.inmacrocache = FALSE; + gc.inclause = NOCLAUSE; + gc.clauses = clauseStack_new (); + gc.globs = globSet_new (); + gc.nacct = typeIdSet_emptySet (); + gc.acct = typeIdSet_emptySet (); + gc.facct = typeIdSet_emptySet (); + gc.savedFlags = FALSE; + gc.pushloc = fileloc_undefined; + gc.protectVars = FALSE; + gc.justpopped = FALSE; + gc.isNullGuarded = NO; + gc.globs_used = globSet_undefined; + + allFlagCodes (code) + { + gc.setGlobally[code] = FALSE; + gc.setLocally[code] = FALSE; + } end_allFlagCodes ; + + usymtab_initMod (); + + context_resetAllFlags (); + conext_resetAllCounters (); + context_setMode (DEFAULT_MODE); +} + +ctype +context_typeofZero (void) +{ + ctype ct = ctype_int; + + if (context_getFlag (FLG_ZEROPTR)) + { + ct = ctype_makeConj (ct, ctype_voidPointer); + } + + if (!context_getFlag (FLG_ABSTRACTBOOL)) + { + ct = ctype_makeConj (ct, ctype_bool); + } + + return ct; +} + +ctype +context_typeofOne (void) +{ + ctype ct = ctype_int; + + /* 1 is on longer a bool (was before 2.4) + if (!context_getFlag (FLG_ABSTRACTBOOL)) + { + ct = ctype_makeConj (ct, ctype_bool); + } + */ + + return (ct); +} + +/*@only@*/ cstring +context_unparse (void) +{ + cstring s; + + switch (gc.kind) + { + case CX_LCL: + s = message ("LCL File: %q", fileloc_unparse (g_currentloc)); + break; + case CX_LCLLIB: + s = message ("LCL Lib File: %q", fileloc_unparse (g_currentloc)); + break; + case CX_GLOBAL: + s = message ("Global Context:%q", fileloc_unparse (g_currentloc)); + break; + case CX_INNER: + s = message ("Inner Context:%q", fileloc_unparse (g_currentloc)); + break; + case CX_FUNCTION: + s = message ("Function %q :%q \n\taccess %q\n\tmodifies %q", + uentry_unparse (gc.cont.fcn), + fileloc_unparse (g_currentloc), + typeIdSet_unparse (gc.acct), + sRefSet_unparse (gc.mods)); + break; + case CX_MACROFCN: + s = message ("Function Macro %q", uentry_unparse (gc.cont.fcn)); + break; + case CX_UNKNOWNMACRO: + s = message ("Forward Specified Macro %q", uentry_unparse (gc.cont.fcn)); + break; + case CX_MACROCONST: + s = message ("Constant Macro %q", uentry_unparse (gc.cont.fcn)); + break; + case CX_ITERDEF: + s = message ("Iter definition %q", uentry_unparse (gc.cont.fcn)); + break; + case CX_ITEREND: + s = message ("Iter end %q", uentry_unparse (gc.cont.fcn)); + break; + default: + s = message ("Un-unparseable context: %d", (int) gc.kind); + break; + } + + s = message ("%q\naccess: %q", s, context_unparseAccess ()); + return (s); +} + +extern ctype +context_currentFunctionType (void) +{ + if (gc.kind == CX_FUNCTION || gc.kind == CX_MACROFCN) + { + return (uentry_getType (gc.cont.fcn)); + } + else if (gc.kind == CX_INNER) + { + llcontbuglit ("context_currentFunctionType: inner context"); + do { context_exitInnerPlain (); } while (gc.kind == CX_INNER); + return (context_currentFunctionType ()); + } + else + { + llcontbuglit ("context_currentFunctionType: not in function"); + return (ctype_undefined); + } +} + +void +context_enterInnerContext (void) +{ + if (gc.kind == CX_GLOBAL) + { + gc.kind = CX_INNER; + gc.cont.cdepth = 1; + } + else if (gc.kind == CX_INNER) + { + gc.cont.cdepth++; + } + else + { + ; + } + + + usymtab_enterScope (); + pushClause (NOCLAUSE); +} + +void +context_exitInnerPlain (void) /*@modifies gc;@*/ +{ + context_exitInner (exprNode_undefined); +} + +void +context_exitInner (exprNode exp) +{ + + llassertprint (gc.inclause == NOCLAUSE || gc.inclause == CASECLAUSE, + ("inclause = %s", clause_nameTaken (gc.inclause))); + + clauseStack_removeFirst (gc.clauses, NOCLAUSE); + gc.inclause = topClause (gc.clauses); + + if (gc.kind == CX_INNER) + { + if (--gc.cont.cdepth == 0) + { + gc.kind = CX_GLOBAL; + gc.cont.glob = TRUE; + } + } + else + { + if (gc.kind == CX_GLOBAL) + { + llcontbuglit ("Attempt to exit global context"); + return; + } + } + + usymtab_exitScope (exp); +} + + +void +context_enterStructInnerContext (void) +{ + if (gc.kind == CX_GLOBAL) + { + gc.kind = CX_INNER; + gc.cont.cdepth = 1; + } + else if (gc.kind == CX_INNER) + { + gc.cont.cdepth++; + } + else + { + ; + } + + usymtab_enterScope (); +} + +void +context_exitStructInnerContext (void) +{ + if (gc.kind == CX_INNER) + { + if (--gc.cont.cdepth == 0) + { + gc.kind = CX_GLOBAL; + gc.cont.glob = TRUE; + } + } + else + { + if (gc.kind == CX_GLOBAL) + { + llcontbuglit ("Attempt to exit global context"); + return; + } + } + + usymtab_exitScope (exprNode_undefined); +} + +void +context_exitInnerSafe (void) +{ + + if (gc.kind == CX_INNER) + { + if (--gc.cont.cdepth == 0) + { + gc.cont.cdepth++; + } + } + else if (gc.kind == CX_GLOBAL) + { + llcontbuglit ("Attempt to exit global context"); + return; + } + else + { + if (usymtab_inDeepScope ()) + { + usymtab_exitScope (exprNode_undefined); + } + } +} + +static +void setModuleAccess (void) +{ + gc.facct = typeIdSet_emptySet (); + + if (fileId_isValid (currentFile ())) + { + cstring baseName = fileloc_getBase (g_currentloc); + + DPRINTF (("Access: %s", baseName)); + + if (context_getFlag (FLG_ACCESSFILE)) + { + if (usymtab_existsType (baseName)) + { + gc.facct = typeIdSet_insert (gc.facct, + usymtab_getTypeId (baseName)); + } + } + + if (context_getFlag (FLG_ACCESSMODULE)) + { + int i; + bool hasaccess = FALSE; + + for (i = 0; i < gc.nmods; i++) + { + if (cstring_equal (baseName, gc.moduleaccess[i].file)) + { + gc.facct = typeIdSet_union (gc.facct, gc.moduleaccess[i].daccess); + + hasaccess = TRUE; + break; + } + } + } + + gc.acct = gc.facct; + gc.inheader = fileId_isHeader (currentFile ()); + } + else + { + llcontbuglit ("Current file not defined\n"); + gc.facct = typeIdSet_emptySet (); + gc.acct = gc.facct; + gc.inheader = FALSE; + } + + /* 17 Jan 1995: forgot to clear nacct */ + + gc.nacct = typeIdSet_emptySet (); + } + +static void +context_enterFileAux (void) +{ + setModuleAccess (); +} + +void +context_enterFile (void) +{ + context_enterFileAux (); + usymtab_enterFile (); +} + +void +context_enterMacroFile (void) +{ + context_enterFileAux (); +} + +bool +context_inFunction (void) +{ + kcontext ck = gc.kind; + + return ((ck == CX_FUNCTION) || (ck == CX_MACROFCN) || (ck == CX_INNER)); +} + +bool +context_inFunctionLike (void) +{ + return (gc.kind == CX_FUNCTION || gc.kind == CX_MACROFCN + || gc.kind == CX_UNKNOWNMACRO || gc.kind == CX_ITERDEF); +} + +bool +context_inRealFunction (void) +{ + kcontext ck = gc.kind; + + return ((ck == CX_FUNCTION) || (ck == CX_MACROFCN)); +} + +void +context_processAllMacros (void) +{ + usymtab_enterFile (); + + gc.inmacrocache = TRUE; + macrocache_processUndefinedElements (gc.mc); + cleanupMessages (); + usymtab_exitFile (); + + gc.inmacrocache = FALSE; + macrocache_finalize (); +} + +/* +** this happens once at the end of each C file +** +** check each Macro that was defined in current file.c or current file.h +** +*/ + +static void +context_processMacros (void) +{ + if (fileId_isValid (currentFile ())) + { + fileloc lastfl; + cstring cbase = cstring_fromChars + (removePathFree + (removeAnyExtension + (cstring_toCharsSafe (fileName (currentFile ()))))); + + gc.inmacrocache = TRUE; + + lastfl = macrocache_processFileElements (gc.mc, cbase); + cstring_free (cbase); + + if (fileloc_isDefined (lastfl)) + { + g_currentloc = fileloc_update (g_currentloc, lastfl); + cleanupMessages (); + } + + gc.inmacrocache = FALSE; + } +} + +bool +context_processingMacros (void) +{ + return (gc.inmacrocache); +} + +void +context_exitFile (void) +{ + if (gc.kind != CX_GLOBAL) + { + llfatalerrorLoc + (cstring_makeLiteral ("File ended outside global scope")); + } + + if (gc.insuppressregion) + { + /* gack...don't reverse the order of these lines! ;-> */ + gc.insuppressregion = FALSE; + llerrorlit (FLG_SYNTAX, + "File ended in ignore errors region, " + "possible missing /*@end*/"); + } + + /* fix up parse errors */ + + while (!usymtab_inFileScope ()) + { + usymtab_quietExitScope (g_currentloc); + } + + /* + ** Clear the file-specific modifies information. + */ + + sRefSetList_elements (gc.modrecs, mods) + { + sRefSet_clearStatics (mods); + } end_sRefSetList_elements ; + + sRefSetList_clear (gc.modrecs); + + context_processMacros (); + cleanupMessages (); + + usymtab_exitFile (); + + gc.inDerivedFile = FALSE; + filelocStack_clear (gc.locstack); + + gc.nacct = typeIdSet_emptySet (); /* empty noaccess */ + + gc.cont.glob = TRUE; + + if (gc.savedFlags) + { + context_restoreFlagSettings (); + gc.savedFlags = FALSE; + } +} + +void +context_exitMacroCache (void) +{ + if (gc.kind != CX_GLOBAL) + { + if (context_inMacro ()) /* this is okay, file could end without newline in macro */ + { + context_exitFunction (); + } + else + { + llcontbug (message ("context_exitMacroCache: outside global scope: %q", + context_unparse ())); + gc.kind = CX_GLOBAL; + } + } + + /* + ** no longer valid here + ** if (gc.insuppressregion) + ** { + ** gc.insuppressregion = FALSE; + ** llerror ("File ended in ignore errors region, possible missing @"); + ** } + */ + + gc.cont.glob = TRUE; +} + +void +context_saveLocation (void) +{ + /* was llassert (fileloc_isUndefined (gc.saveloc)) */ + fileloc_free (gc.saveloc); + + + gc.saveloc = fileloc_copy (g_currentloc); + } + +fileloc +context_getSaveLocation (void) +{ + fileloc fl = gc.saveloc; + + gc.saveloc = fileloc_undefined; + return fl; +} + +/*@observer@*/ cstring +context_inFunctionName (void) +{ + if (gc.kind == CX_FUNCTION + || gc.kind == CX_MACROFCN || gc.kind == CX_UNKNOWNMACRO + || gc.kind == CX_MACROCONST + || gc.kind == CX_ITERDEF || gc.kind == CX_ITEREND) + { + return (uentry_rawName (gc.cont.fcn)); + } + else + { + llcontbuglit ("context_inFunctionName: not in function"); + return (cstring_undefined); + } +} + +void +context_userSetFlag (flagcode f, bool b) +{ + DPRINTF (("set flag: %s", flagcode_name (f))); + + if (f == FLG_NEVERINCLUDE && b) + { + if (gc.flags[FLG_EXPORTHEADER]) + { + flagWarning (cstring_makeLiteralTemp + ("setting +neverinclude after +exportheader. " + "Turning off exportheader, since headers are not checked " + "when +neverinclude is used.")); + + gc.flags[FLG_EXPORTHEADER] = FALSE; + } + } + else + { + if (f == FLG_EXPORTHEADER && b) + { + if (gc.flags[FLG_NEVERINCLUDE]) + { + flagWarning (cstring_makeLiteralTemp + ("setting +exportheader after +neverinclude. " + "Not setting exportheader, since headers are not checked " + "when +neverinclude is used.")); + gc.flags[FLG_EXPORTHEADER] = FALSE; + return; + } + } + } + + if (context_getFlag (FLG_WARNFLAGS) && f != FLG_NOF && f != FLG_OPTF) + { + bool lastsetting = context_getFlag (f); + + if (bool_equal (lastsetting, b) + && !flagcode_isSpecialFlag (f) + && !flagcode_isIdemFlag (f) + && !flagcode_hasArgument (f)) + { + cstring warn = message ("setting %s%s redundant with current value", + cstring_makeLiteralTemp (b ? "+" : "-"), + flagcode_name (f)); + flagWarning (warn); + cstring_free (warn); + } + } + + if (flagcode_isLibraryFlag (f)) + { + if (gc.library != FLG_ANSILIB + && gc.library != f) + { + cstring warn = message ("selecting library %s after library %s was " + "selected (only one library may be used)", + flagcode_name (f), + flagcode_name (gc.library)); + flagWarning (warn); + cstring_free (warn); + } + + if (f == FLG_UNIXLIB) + { + if (context_getFlag (FLG_WARNUNIXLIB)) + { + flagWarning (cstring_makeLiteralTemp + ("selecting unix library. Unix library is " + "ad hoc addition to POSIX library. Recommend " + "use +posixlib to select POSIX library instead. " + "Use -warnunixlib to suppress this message.")); + } + } + + gc.library = f; + } + + gc.setGlobally[f] = TRUE; + context_setFlag (f, b); +} + +void +context_fileSetFlag (flagcode f, ynm set) +{ + if (!gc.savedFlags) + { + context_saveFlagSettings (); + } + + if (ynm_isOff (set)) + { + context_setFlagAux (f, FALSE, TRUE, FALSE); + } + else if (ynm_isOn (set)) + { + context_setFlagAux (f, TRUE, TRUE, FALSE); + gc.setLocally[f] = TRUE; + } + else + { + context_restoreFlag (f); + } +} + +static void +context_restoreFlag (flagcode f) +{ + + if (!gc.savedFlags) + { + voptgenerror + (FLG_SYNTAX, + message ("Attempt to restore flag %s when no file scope flags " + "have been set.", + flagcode_unparse (f)), + g_currentloc); + } + else + { + context_addFlagMarker (f, MAYBE); + context_setFlagAux (f, gc.saveflags[f], FALSE, TRUE); + } + + } + +static void +context_setFlag (flagcode f, bool b) +{ + context_setFlagAux (f, b, FALSE, FALSE); +} + +void +context_setFlagTemp (flagcode f, bool b) +{ + DPRINTF (("Set flag temp: %s / %s", flagcode_unparse (f), bool_unparse (b))); + gc.flags[f] = b; +} + +/*@notfunction@*/ +# define DOSET(ff,b) \ + do { if (inFile) { gc.setLocally[ff] = TRUE; \ + context_addFlagMarker (ff, ynm_fromBool (b)); } \ + DPRINTF (("set flag: %s / %s", flagcode_name (ff), bool_unparse (b))); \ + gc.flags[ff] = b; } while (FALSE) + +static void + context_setFlagAux (flagcode f, bool b, bool + inFile, /*@unused@*/ bool isRestore) +{ + DPRINTF (("set flag: %s / %s", flagcode_unparse (f), bool_unparse (b))); + + if (f == FLG_USESTDERR) + { + if (b) { + g_msgstream = stderr; + } else { + g_msgstream = stdout; + } + } + + if (flagcode_isSpecialFlag (f)) + { + gc.flags[f] = b; + + + switch (f) + { + case FLG_ALLEMPTY: + DOSET (FLG_ALLEMPTY, b); + DOSET (FLG_IFEMPTY, b); + DOSET (FLG_WHILEEMPTY, b); + DOSET (FLG_FOREMPTY, b); + break; + case FLG_PREDBOOL: + DOSET (FLG_PREDBOOL, b); + DOSET (FLG_PREDBOOLINT, b); + DOSET (FLG_PREDBOOLPTR, b); + DOSET (FLG_PREDBOOLOTHERS, b); + break; + case FLG_GLOBALIAS: + DOSET (FLG_CHECKSTRICTGLOBALIAS, b); + DOSET (FLG_CHECKEDGLOBALIAS, b); + DOSET (FLG_CHECKMODGLOBALIAS, b); + DOSET (FLG_UNCHECKEDGLOBALIAS, b); + break; + case FLG_ALLBLOCK: + DOSET (FLG_ALLBLOCK, b); + DOSET (FLG_IFBLOCK, b); + DOSET (FLG_WHILEBLOCK, b); + DOSET (FLG_FORBLOCK, b); + break; + case FLG_GRAMMAR: + if (b) + { + yydebug = 1; + } + else + { + yydebug = 0; + } + + DOSET (FLG_GRAMMAR, b); + break; + case FLG_CODEIMPONLY: + DOSET (FLG_CODEIMPONLY, b); + DOSET (FLG_GLOBIMPONLY, b); + DOSET (FLG_RETIMPONLY, b); + DOSET (FLG_STRUCTIMPONLY, b); + break; + case FLG_SPECALLIMPONLY: + DOSET (FLG_SPECALLIMPONLY, b); + DOSET (FLG_SPECGLOBIMPONLY, b); + DOSET (FLG_SPECRETIMPONLY, b); + DOSET (FLG_SPECSTRUCTIMPONLY, b); + break; + case FLG_ALLIMPONLY: + DOSET (FLG_ALLIMPONLY, b); + DOSET (FLG_GLOBIMPONLY, b); + DOSET (FLG_RETIMPONLY, b); + DOSET (FLG_STRUCTIMPONLY, b); + DOSET (FLG_SPECGLOBIMPONLY, b); + DOSET (FLG_SPECRETIMPONLY, b); + DOSET (FLG_SPECSTRUCTIMPONLY, b); + break; + case FLG_ANSILIMITS: + DOSET (FLG_ANSILIMITS, b); + DOSET (FLG_CONTROLNESTDEPTH, b); + DOSET (FLG_STRINGLITERALLEN, b); + DOSET (FLG_INCLUDENEST, b); + DOSET (FLG_NUMSTRUCTFIELDS, b); + DOSET (FLG_NUMENUMMEMBERS, b); + + if (b) + { + context_setValue (FLG_CONTROLNESTDEPTH, DEFAULT_CONTROLNESTDEPTH); + context_setValue (FLG_STRINGLITERALLEN, DEFAULT_STRINGLITERALLEN); + context_setValue (FLG_INCLUDENEST, DEFAULT_INCLUDENEST); + context_setValue (FLG_NUMSTRUCTFIELDS, DEFAULT_NUMSTRUCTFIELDS); + context_setValue (FLG_NUMENUMMEMBERS, DEFAULT_NUMENUMMEMBERS); + } + break; + case FLG_EXTERNALNAMELEN: + DOSET (FLG_DISTINCTEXTERNALNAMES, TRUE); + DOSET (FLG_EXTERNALNAMELEN, TRUE); + break; + case FLG_INTERNALNAMELEN: + DOSET (FLG_DISTINCTINTERNALNAMES, TRUE); + DOSET (FLG_INTERNALNAMELEN, TRUE); + break; + case FLG_EXTERNALNAMECASEINSENSITIVE: + DOSET (FLG_EXTERNALNAMECASEINSENSITIVE, b); + + if (b && !gc.flags[FLG_DISTINCTEXTERNALNAMES]) + { + DOSET (FLG_DISTINCTEXTERNALNAMES, TRUE); + context_setValue (FLG_EXTERNALNAMELEN, 0); + } + break; + case FLG_INTERNALNAMECASEINSENSITIVE: + DOSET (FLG_INTERNALNAMECASEINSENSITIVE, b); + + if (b && !gc.flags[FLG_DISTINCTINTERNALNAMES]) + { + DOSET (FLG_DISTINCTINTERNALNAMES, TRUE); + context_setValue (FLG_INTERNALNAMELEN, 0); + } + break; + case FLG_INTERNALNAMELOOKALIKE: + DOSET (FLG_INTERNALNAMELOOKALIKE, b); + + if (b && !gc.flags[FLG_DISTINCTINTERNALNAMES]) + { + DOSET (FLG_DISTINCTINTERNALNAMES, TRUE); + context_setValue (FLG_INTERNALNAMELEN, 0); + } + break; + case FLG_MODUNSPEC: + DOSET (FLG_MODNOMODS, b); + DOSET (FLG_MODGLOBSUNSPEC, b); + DOSET (FLG_MODSTRICTGLOBSUNSPEC, b); + break; + case FLG_EXPORTANY: + DOSET (FLG_EXPORTVAR, b); + DOSET (FLG_EXPORTFCN, b); + DOSET (FLG_EXPORTTYPE, b); + DOSET (FLG_EXPORTMACRO, b); + DOSET (FLG_EXPORTCONST, b); + gc.anyExports = TRUE; + break; + case FLG_REPEXPOSE: + DOSET (FLG_RETEXPOSE, b); + DOSET (FLG_ASSIGNEXPOSE, b); + DOSET (FLG_CASTEXPOSE, b); + break; + case FLG_RETVAL: + DOSET (FLG_RETVALBOOL, b); + DOSET (FLG_RETVALINT, b); + DOSET (FLG_RETVALOTHER, b); + break; + case FLG_PARTIAL: + if (b) + { + DOSET (FLG_EXPORTLOCAL, FALSE); + DOSET (FLG_DECLUNDEF, FALSE); + DOSET (FLG_SPECUNDEF, FALSE); + DOSET (FLG_TOPUNUSED, FALSE); + } + break; + case FLG_DEEPBREAK: + DOSET (FLG_LOOPLOOPBREAK, b); + DOSET (FLG_LOOPSWITCHBREAK, b); + DOSET (FLG_SWITCHLOOPBREAK, b); + DOSET (FLG_SWITCHSWITCHBREAK, b); + DOSET (FLG_LOOPLOOPCONTINUE, b); + DOSET (FLG_DEEPBREAK, b); + break; + case FLG_ACCESSALL: + DOSET (FLG_ACCESSMODULE, b); + DOSET (FLG_ACCESSFILE, b); + DOSET (FLG_ACCESSCZECH, b); + break; + case FLG_ALLMACROS: + DOSET (FLG_ALLMACROS, b); + DOSET (FLG_FCNMACROS, b); + DOSET (FLG_CONSTMACROS, b); + break; + case FLG_CZECH: + if (b) { DOSET (FLG_ACCESSCZECH, b); } + DOSET (FLG_CZECHFUNCTIONS, b); + DOSET (FLG_CZECHVARS, b); + DOSET (FLG_CZECHCONSTANTS, b); + DOSET (FLG_CZECHTYPES, b); + break; + case FLG_SLOVAK: + if (b) { DOSET (FLG_ACCESSSLOVAK, b); } + DOSET (FLG_SLOVAKFUNCTIONS, b); + DOSET (FLG_SLOVAKVARS, b); + DOSET (FLG_SLOVAKCONSTANTS, b); + DOSET (FLG_SLOVAKTYPES, b); + break; + case FLG_CZECHOSLOVAK: + if (b) { DOSET (FLG_ACCESSCZECHOSLOVAK, b); } + DOSET (FLG_CZECHOSLOVAKFUNCTIONS, b); + DOSET (FLG_CZECHOSLOVAKVARS, b); + DOSET (FLG_CZECHOSLOVAKCONSTANTS, b); + DOSET (FLG_CZECHOSLOVAKTYPES, b); + break; + case FLG_NULL: + DOSET (FLG_NULLSTATE, b); + DOSET (FLG_NULLDEREF, b); + DOSET (FLG_NULLASSIGN, b); + DOSET (FLG_NULLPASS, b); + DOSET (FLG_NULLRET, b); + break; + case FLG_MEMCHECKS: + DOSET (FLG_NULLSTATE, b); + DOSET (FLG_NULLDEREF, b); + DOSET (FLG_NULLASSIGN, b); + DOSET (FLG_NULLPASS, b); + DOSET (FLG_NULLRET, b); + DOSET (FLG_COMPDEF, b); + DOSET (FLG_COMPMEMPASS, b); + DOSET (FLG_UNIONDEF, b); + DOSET (FLG_MEMTRANS, b); + DOSET (FLG_USERELEASED, b); + DOSET (FLG_ALIASUNIQUE, b); + DOSET (FLG_MAYALIASUNIQUE, b); + DOSET (FLG_MUSTFREE, b); + DOSET (FLG_MUSTDEFINE, b); + DOSET (FLG_GLOBSTATE, b); + DOSET (FLG_COMPDESTROY, b); + DOSET (FLG_MUSTNOTALIAS, b); + DOSET (FLG_MEMIMPLICIT, b); + DOSET (FLG_BRANCHSTATE, b); + /*@fallthrough@*/ /* also sets memtrans flags */ + case FLG_MEMTRANS: + DOSET (FLG_MEMTRANS, b); + DOSET (FLG_EXPOSETRANS, b); + DOSET (FLG_OBSERVERTRANS, b); + DOSET (FLG_DEPENDENTTRANS, b); + DOSET (FLG_NEWREFTRANS, b); + DOSET (FLG_ONLYTRANS, b); + DOSET (FLG_OWNEDTRANS, b); + DOSET (FLG_FRESHTRANS, b); + DOSET (FLG_SHAREDTRANS, b); + DOSET (FLG_TEMPTRANS, b); + DOSET (FLG_KEPTTRANS, b); + DOSET (FLG_REFCOUNTTRANS, b); + DOSET (FLG_STATICTRANS, b); + DOSET (FLG_UNKNOWNTRANS, b); + DOSET (FLG_KEEPTRANS, b); + DOSET (FLG_IMMEDIATETRANS, b); + break; + + default: + llcontbug (message ("Unhandled special flag: %s", + flagcode_unparse (f))); + break; + } + } + else + { + if (flagcode_isIdemFlag (f)) + { + DOSET (f, TRUE); + } + else + { + if (b && !gc.anyExports + && (f == FLG_EXPORTVAR || f == FLG_EXPORTFCN + || f == FLG_EXPORTTYPE || f == FLG_EXPORTMACRO + || f == FLG_EXPORTCONST + || f == FLG_EXPORTANY)) + { + gc.anyExports = TRUE; + } + + DOSET (f, b); + } + } +} + +bool +context_maybeSet (flagcode d) +{ + return (gc.flags[d] || gc.setLocally[d]); +} + +bool +context_getFlag (flagcode d) +{ + return (gc.flags[d]); +} + +static void context_saveFlagSettings (void) +{ + gc.savedFlags = TRUE; + llassert (sizeof (gc.saveflags) == sizeof (gc.flags)); + memcpy (gc.saveflags, gc.flags, sizeof (gc.flags)); +} + +static void context_restoreFlagSettings (void) +{ + llassert (sizeof (gc.saveflags) == sizeof (gc.flags)); + memcpy (gc.flags, gc.saveflags, sizeof (gc.flags)); + gc.savedFlags = FALSE; +} + +void context_setFilename (fileId fid, int lineno) + /*@globals fileloc g_currentloc;@*/ + /*@modifies g_currentloc@*/ +{ + if (fileId_baseEqual (currentFile (), fid)) + { + setLine (lineno); + return; + } + else + { + fileloc_setColumn (g_currentloc, 0); + + if (fileloc_isSpecialFile (g_currentloc)) + { + gc.inDerivedFile = TRUE; + } + + if (filelocStack_popPushFile (gc.locstack, g_currentloc)) + { + int maxdepth = context_getValue (FLG_INCLUDENEST); + + if (filelocStack_size (gc.locstack) > maxdepth) + { + int depth = filelocStack_includeDepth (gc.locstack); + + if (depth > maxdepth) + { + if (optgenerror + (FLG_INCLUDENEST, + message ("Maximum include nesting depth " + "(%d, current depth %d) exceeded", + maxdepth, + depth), + filelocStack_nextTop (gc.locstack))) + { + filelocStack_printIncludes (gc.locstack); + } + } + } + } + + g_currentloc = fileloc_create (fid, lineno, 1); + gc.inheader = fileId_isHeader (currentFile ()); + + context_enterFileAux (); + } +} + +void context_enterIterDef (/*@observer@*/ uentry le) +{ + context_enterMacro (le); + gc.acct = typeIdSet_subtract (gc.facct, gc.nacct); + gc.kind = CX_ITERDEF; +} + +void context_enterIterEnd (/*@observer@*/ uentry le) +{ + context_enterMacro (le); + gc.kind = CX_ITEREND; +} + +void +context_destroyMod (void) + /*@globals killed gc@*/ +{ + setCodePoint (); + ctype_destroyMod (); + setCodePoint (); + usymtab_free (); + setCodePoint (); + fileTable_free (gc.ftab); + filelocStack_free (gc.locstack); + setCodePoint (); + gc.ftab = fileTable_undefined; + + macrocache_free (gc.mc); + sfree (gc.moduleaccess); + setCodePoint (); + + fileloc_free (gc.saveloc); gc.saveloc = fileloc_undefined; + fileloc_free (gc.pushloc); gc.pushloc = fileloc_undefined; + + setCodePoint (); + sRefSetList_free (gc.modrecs); + setCodePoint (); + flagMarkerList_free (gc.markers); + setCodePoint (); + messageLog_free (gc.msgLog); + setCodePoint (); + clauseStack_free (gc.clauses); + setCodePoint (); + + cstring_free (gc.msgAnnote); + globSet_free (gc.globs_used); + } + +/* +** Flag shortcuts. +*/ + +bool context_msgBoolInt (void) +{ + return gc.flags [FLG_BOOLINT]; +} + +bool context_msgCharInt (void) +{ + return gc.flags [FLG_CHARINT]; +} + +bool context_msgEnumInt (void) +{ + return gc.flags [FLG_ENUMINT]; +} + +bool context_msgPointerArith (void) +{ + return gc.flags [FLG_POINTERARITH]; +} + +bool context_msgStrictOps (void) +{ + return gc.flags [FLG_STRICTOPS]; +} + +# ifndef NOLCL +bool context_msgLh (void) +{ + return gc.flags [FLG_DOLH]; +} +# endif + +void context_pushLoc (void) +{ + fileloc_free (gc.pushloc); + gc.pushloc = gc.saveloc; + gc.saveloc = fileloc_undefined; +} + +void context_popLoc (void) +{ + gc.saveloc = fileloc_update (gc.saveloc, gc.pushloc); +} + +bool context_inGlobalScope (void) +{ + return (usymtab_inFileScope() || usymtab_inGlobalScope ()); +} + +bool context_inInnerScope (void) +{ + return (gc.kind == CX_INNER); +} + +void context_setProtectVars (void) +{ + gc.protectVars = TRUE; +} + +bool context_anyErrors (void) +{ + return (gc.numerrors > 0); +} + +void context_hasError (void) +{ + gc.numerrors++; +} + +int context_numErrors (void) +{ + return gc.numerrors; +} + +bool context_neednl (void) +{ + return gc.neednl; +} + +void context_setNeednl (void) +{ + gc.neednl = TRUE; +} + +int context_getExpect (void) +{ + return (context_getValue (FLG_EXPECT)); +} + +# ifndef NOLCL +int context_getLCLExpect (void) +{ + return (context_getValue (FLG_LCLEXPECT)); +} +# endif + +int context_getLimit (void) +{ + return (context_getValue (FLG_LIMIT)); +} + +bool context_unlimitedMessages (void) +{ + return (context_getLimit () < 0); +} + +void context_releaseVars (void) +{ + llassert (gc.protectVars); + gc.protectVars = FALSE; +} + +void context_sizeofReleaseVars (void) +{ + /* If there is a nested sizeof, this might not hold: + llassert (gc.protectVars); + */ + + gc.protectVars = FALSE; +} + +bool context_inProtectVars (void) +{ + return (gc.protectVars); +} + +void context_hideShowscan (void) +{ + gc.flags[FLG_SHOWSCAN] = FALSE; +} + +void context_unhideShowscan (void) +{ + gc.flags[FLG_SHOWSCAN] = TRUE; +} + +bool context_inHeader (void) +{ + return (gc.inheader); +} + +fileTable context_fileTable (void) +{ + return gc.ftab; +} + +cstring context_tmpdir (void) +{ + return (context_getString (FLG_TMPDIR)); +} + +messageLog context_messageLog (void) +{ + return gc.msgLog; +} + +bool context_inMacroFunction (void) +{ + return (gc.kind == CX_MACROFCN); +} + +bool context_inMacroConstant (void) +{ + return (gc.kind == CX_MACROCONST); +} + +bool context_inMacroUnknown (void) +{ + return (gc.kind == CX_UNKNOWNMACRO); +} + +void context_setShownFunction (void) +{ + gc.showfunction = FALSE; +} + +bool context_doDump (void) +{ + return cstring_isNonEmpty (context_getString (FLG_DUMP)); +} + +bool context_doMerge (void) +{ + return cstring_isNonEmpty (context_getString (FLG_MERGE)); +} + +cstring context_getDump (void) +{ + return context_getString (FLG_DUMP); +} + +cstring context_getMerge (void) +{ + return context_getString (FLG_MERGE); +} + +# ifndef NOLCL +bool context_inLCLLib (void) +{ + return (gc.kind == CX_LCLLIB); +} + +bool context_inImport (void) +{ + return (gc.inimport); +} + +void context_enterImport (void) +{ + gc.inimport = TRUE; +} + +void context_leaveImport (void) +{ + gc.inimport = FALSE; +} +# endif + +bool context_inMacro (void) +{ + return (gc.kind == CX_MACROFCN || gc.kind == CX_MACROCONST + || gc.kind == CX_UNKNOWNMACRO + || gc.kind == CX_ITERDEF || gc.kind == CX_ITEREND); +} + +bool context_inIterDef (void) +{ + return (gc.kind == CX_ITERDEF); +} + +bool context_inIterEnd (void) +{ + return (gc.kind == CX_ITEREND); +} + +int context_getLinesProcessed (void) +{ + return (gc.linesprocessed); +} + +int context_getSpecLinesProcessed (void) +{ + return (gc.speclinesprocessed); +} + +# ifndef NOLCL +void context_processedSpecLine (void) +{ + gc.speclinesprocessed++; +} + +void context_resetSpecLines (void) +{ + gc.speclinesprocessed = 0; +} +# endif + +bool context_inGlobalContext (void) +{ + return (gc.kind == CX_GLOBAL); +} + +void context_setFileId (fileId s) +{ + g_currentloc = fileloc_updateFileId (g_currentloc, s); +} + +bool context_setBoolName (void) +{ + return (!cstring_equalLit (context_getString (FLG_BOOLTYPE), + DEFAULT_BOOLTYPE)); +} + +cstring context_printBoolName (void) +{ + if (context_setBoolName ()) + { + return context_getBoolName (); + } + else + { + return cstring_makeLiteralTemp ("boolean"); + } +} + +cstring context_getBoolName (void) +{ + return (context_getString (FLG_BOOLTYPE)); +} + +cstring context_getFalseName (void) +{ + return (context_getString (FLG_BOOLFALSE)); +} + +cstring context_getTrueName (void) +{ + return (context_getString (FLG_BOOLTRUE)); +} + +cstring context_getLarchPath (void) +{ + return (context_getString (FLG_LARCHPATH)); +} + +cstring context_getLCLImportDir (void) +{ + return (context_getString (FLG_LCLIMPORTDIR)); +} + +static void context_setJustPopped (void) +{ + gc.justpopped = TRUE; +} + +void context_clearJustPopped (void) +{ + gc.justpopped = FALSE; +} + +bool context_justPopped (void) +{ + return (gc.justpopped); +} + +void context_setMacroMissingParams (void) +{ + gc.macroMissingParams = TRUE; +} + +void context_resetMacroMissingParams (void) +{ + gc.macroMissingParams = FALSE; +} + +bool context_isMacroMissingParams (void) +{ + return (gc.macroMissingParams); +} + + + + + + + + + diff --git a/src/cpperror.c b/src/cpperror.c new file mode 100644 index 0000000..1fd7027 --- /dev/null +++ b/src/cpperror.c @@ -0,0 +1,399 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** cpperror.c +*/ +/* Default error handlers for CPP Library. + Copyright (C) 1986, 87, 89, 92, 93, 94, 1995 Free Software Foundation, Inc. + Written by Per Bothner, 1994. + Based on CCCP program by by Paul Rubin, June 1986 + Adapted to ANSI C, Richard Stallman, Jan 1987 + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +/*@-macroconstdecl@*/ +/*@-macrofcndecl@*/ +/*@-evalorderuncon@*/ +/*@+ptrnegate@*/ +/*@-memchecks@*/ +/*@+charintliteral@*/ +/*@-infloopsuncon@*/ +/*@-loopswitchbreak@*/ +/*@-switchloopbreak@*/ +/*@-whileblock@*/ +/*@-forblock@*/ +/*@-elseifcomplete@*/ +/*@-abstract@*/ +/*@-usedef@*/ +/*@-retvalint@*/ +/*@-macroparams@*/ +/*@-readonlytrans@*/ +/*@-boolops@*/ +/*@-sizeoftype@*/ +/*@-predboolint@*/ +/*@-predboolptr@*/ +/*@+boolint@*/ +/*@+charint@*/ +/*@+ignorequals@*/ +/*@+ignoresigns@*/ +/*@+matchanyintegral@*/ +/*@-shiftsigned@*/ +/*@-onlyunqglobaltrans@*/ +/*@-macroconstdecl@*/ + +# include +# include +# include + +# define FATAL_EXIT_CODE EXIT_FAILURE + +# include "lclintMacros.nf" +# include "llbasic.h" +# include "cpp.h" +# include "cpplib.h" +# include "cpperror.h" + +static void cppReader_printFileAndLine (cppReader *p_pfile); +static void cppReader_warningWithLine (cppReader *p_pfile, + int p_line, int p_column, + /*@only@*/ cstring p_msg); + +/* Print the file names and line numbers of the #include + commands which led to the current file. */ + +static void cppReader_printContainingFiles (cppReader *pfile) +{ + cppBuffer *ip; + int first = 1; + + if (pfile == NULL) { + /* Error processing command line. */ + return; + } + + /* If stack of files hasn't changed since we last printed + this info, don't repeat it. */ + if (pfile->input_stack_listing_current) + { + return; + } + + ip = cppReader_fileBuffer (pfile); + + /* Give up if we don't find a source file. */ + if (ip == NULL) + { + return; + } + + /* Find the other, outer source files. */ + while ((ip = cppBuffer_prevBuffer (ip)), + ip != cppReader_nullBuffer (pfile)) + { + int line, col; + cstring temps; + + cppBuffer_lineAndColumn (ip, &line, &col); + if (ip->fname != NULL) + { + if (first) + { + first = 0; + fprintf (stderr, "In file included"); + } + else + fprintf (stderr, ",\n "); + } + + fprintf (stderr, " from %s", + cstring_toCharsSafe (temps = fileloc_unparseRaw (ip->nominal_fname, line))); + + cstring_free (temps); + } + + if (!first) + { + fprintf (stderr, ":\n"); + } + + /* Record we have printed the status as of this time. */ + pfile->input_stack_listing_current = 1; +} + +static void +cppReader_fileLineForMessage (cstring filename, long line, long column) +{ + if (column > 0) + { + cstring temps; + + if (filename != NULL) + { + fprintf (stderr, "%s: ", + cstring_toCharsSafe (temps = fileloc_unparseRawCol (filename, (int) line, (int) column))); + } + else + { + fprintf (stderr, "%s: ", + cstring_toCharsSafe (temps = fileloc_unparseRawCol (cstring_makeLiteralTemp (""), + (int) line, (int) column))); + } + + cstring_free (temps); + } + else + { + cstring temps; + + if (filename != NULL) + { + fprintf (stderr, "%s: ", + cstring_toCharsSafe (temps = fileloc_unparseRaw (filename, (int) line))); + + } + else + { + fprintf (stderr, "%s: ", + cstring_toCharsSafe (temps = fileloc_unparseRaw (cstring_makeLiteralTemp (""), + (int) line))); + } + + cstring_free (temps); + } +} + +/* IS_ERROR is 2 for "fatal" error, 1 for error, 0 for warning */ + +static void +cppReader_message (cppReader *pfile, int is_error, /*@only@*/ cstring msg) +{ + if (!is_error) + { + /* fprintf (stderr, "warning: "); */ + } + else if (is_error == 2) + { + pfile->errors = cppReader_fatalErrorLimit; + } + else if (pfile->errors < cppReader_fatalErrorLimit) + { + pfile->errors++; + } + else + { + ; + } + + fprintf (stderr, "%s", cstring_toCharsSafe (msg)); + fprintf (stderr, "\n"); +} + +/* Same as cppReader_error, except we consider the error to be "fatal", + such as inconsistent options. I.e. there is little point in continuing. + (We do not exit, to support use of cpplib as a library. + Instead, it is the caller's responsibility to check + cppFatalErrors. */ + +void +cppReader_fatalError (cppReader *pfile, /*@only@*/ cstring str) +{ + fprintf (stderr, "preprocessor: "); + cppReader_message (pfile, 2, str); +} + +void +cppReader_pfatalWithName (cppReader *pfile, cstring name) +{ + cppReader_perrorWithName (pfile, name); + exit (FATAL_EXIT_CODE); +} + +void +cppReader_printFileAndLine (cppReader *pfile) +{ + cppBuffer *ip = cppReader_fileBuffer (pfile); + + if (ip != NULL) + { + int line, col; + + cppBuffer_lineAndColumn (ip, &line, &col); + cppReader_fileLineForMessage (ip->nominal_fname, + line, pfile->show_column ? col : -1); + } + else + { + fprintf (stderr, "Command Line: "); + } +} + +void +cppReader_errorLit (cppReader *pfile, /*@observer@*/ cstring msg) +{ + cppReader_error (pfile, cstring_copy (msg)); +} + +void +cppReader_error (cppReader *pfile, /*@only@*/ cstring msg) +{ + prepareMessage (); + cppReader_printContainingFiles (pfile); + cppReader_printFileAndLine (pfile); + cppReader_message (pfile, 1, msg); + closeMessage (); +} + +/* Print error message but don't count it. */ + +void +cppReader_warningLit (cppReader *pfile, cstring msg) +{ + cppReader_warning (pfile, cstring_copy (msg)); +} + +void +cppReader_warning (cppReader *pfile, /*@only@*/ cstring msg) +{ + if (CPPOPTIONS (pfile)->inhibit_warnings) + return; + + if (CPPOPTIONS (pfile)->warnings_are_errors) + pfile->errors++; + + prepareMessage (); + cppReader_printContainingFiles (pfile); + cppReader_printFileAndLine (pfile); + cppReader_message (pfile, 0, msg); + closeMessage (); +} + +/* Print an error message and maybe count it. */ + +extern void +cppReader_pedwarnLit (cppReader *pfile, /*@observer@*/ cstring msg) +{ + cppReader_pedwarn (pfile, cstring_copy (msg)); +} + +extern void +cppReader_pedwarn (cppReader *pfile, /*@only@*/ cstring msg) +{ + if (CPPOPTIONS (pfile)->pedantic_errors) + { + cppReader_error (pfile, msg); + } + else + { + cppReader_warning (pfile, msg); + } +} + +void +cppReader_errorWithLine (cppReader *pfile, long line, long column, + /*@only@*/ cstring msg) +{ + cppBuffer *ip = cppReader_fileBuffer (pfile); + + prepareMessage (); + cppReader_printContainingFiles (pfile); + + if (ip != NULL) + cppReader_fileLineForMessage (ip->nominal_fname, line, column); + + cppReader_message (pfile, 1, msg); + closeMessage (); +} + +void +cppReader_warningWithLine (cppReader *pfile, + int line, int column, + /*@only@*/ cstring msg) +{ + cppBuffer *ip; + + if (CPPOPTIONS (pfile)->inhibit_warnings) + return; + + if (CPPOPTIONS (pfile)->warnings_are_errors) + pfile->errors++; + + prepareMessage (); + + cppReader_printContainingFiles (pfile); + + ip = cppReader_fileBuffer (pfile); + + if (ip != NULL) + { + cppReader_fileLineForMessage (ip->nominal_fname, line, column); + } + + cppReader_message (pfile, 0, msg); + closeMessage (); +} + +void +cppReader_pedwarnWithLine (cppReader *pfile, int line, int column, + /*@only@*/ cstring msg) +{ + if (CPPOPTIONS (pfile)->pedantic_errors) + { + cppReader_errorWithLine (pfile, column, line, msg); + } + else + { + cppReader_warningWithLine (pfile, line, column, msg); + } +} + +void cppReader_perrorWithName (cppReader *pfile, cstring name) +{ + cppReader_message (pfile, 1, + message ("preprocessing: %s: %s", + name, lldecodeerror (errno))); +} + + + + + + + + diff --git a/src/cppexp.c b/src/cppexp.c new file mode 100644 index 0000000..e012dfe --- /dev/null +++ b/src/cppexp.c @@ -0,0 +1,1337 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** cppexp.c +*/ +/* Parse C expressions for CCCP. + Copyright (C) 1987, 1992, 1994, 1995, 1997 Free Software Foundation. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! + +Written by Per Bothner 1994. */ + +/* Parse a C expression from text in a string */ + +/*@+charint@*/ +/*@+ignorequals@*/ +/*@+ignoresigns@*/ +/*@+matchanyintegral@*/ +/*@-shiftsigned@*/ + +# include +# include "lclintMacros.nf" +# include "llbasic.h" +# include "cpp.h" +# include "cpplib.h" +# include "cpphash.h" +# include "cppexp.h" +# include "cpperror.h" + +/* Yield nonzero if adding two numbers with A's and B's signs can yield a + number with SUM's sign, where A, B, and SUM are all C integers. */ + +/*@function static bool possibleSumSign (sef int, int, int) + modifies nothing ; @*/ + +#define possibleSumSign(a, b, sum) ((((a) ^ (b)) | ~ ((a) ^ (sum))) < 0) + +/* these are guesses! */ + +/*@constant int BITS_PER_UNIT@*/ +# define BITS_PER_UNIT 8 + +/*@constant size_t BITS_PER_CHAR@*/ +# define BITS_PER_CHAR 8 + +/*@constant size_t BITS_PER_WORD@*/ +# define BITS_PER_WORD 32 + +/*@constant size_t HOST_BITS_PER_INT@*/ +# define HOST_BITS_PER_INT 32 + +/*@constant size_t HOST_BITS_PER_LONG@*/ +# define HOST_BITS_PER_LONG 32 + +/*@constant char TARGET_BELL@*/ +# define TARGET_BELL (char) 6 + +/*@constant char TARGET_BS@*/ +# define TARGET_BS (char) 7 + +/*@constant char TARGET_FF@*/ +# define TARGET_FF (char) 8 + +/*@constant char TARGET_NEWLINE@*/ +# define TARGET_NEWLINE '\n' + +/*@constant char TARGET_CR@*/ +# define TARGET_CR '\n' + +/*@constant char TARGET_TAB@*/ +# define TARGET_TAB '\t' + +/*@constant char TARGET_VT@*/ +# define TARGET_VT '\v' + +#ifdef MULTIBYTE_CHARS +#include +#include +#endif + +#include + +#ifndef INT_TYPE_SIZE +/*@constant size_t INT_TYPE_SIZE@*/ +#define INT_TYPE_SIZE BITS_PER_WORD +#endif + +#ifndef LONG_TYPE_SIZE +/*@constant size_t LONG_TYPE_SIZE@*/ +#define LONG_TYPE_SIZE BITS_PER_WORD +#endif + +#ifndef WCHAR_TYPE_SIZE +/*@constant size_t WCHAR_TYPE_SIZE@*/ +#define WCHAR_TYPE_SIZE INT_TYPE_SIZE +#endif + +# ifndef CHAR_TYPE_SIZE +/*@constant size_t CHAR_TYPE_SIZE@*/ +# define CHAR_TYPE_SIZE BITS_PER_CHAR +# endif + +#ifndef MAX_CHAR_TYPE_SIZE +/*@constant size_t MAX_CHAR_TYPE_SIZE@*/ +#define MAX_CHAR_TYPE_SIZE CHAR_TYPE_SIZE +#endif + +#ifndef MAX_LONG_TYPE_SIZE +/*@constant size_t MAX_LONG_TYPE_SIZE@*/ +#define MAX_LONG_TYPE_SIZE LONG_TYPE_SIZE +#endif + +#ifndef MAX_WCHAR_TYPE_SIZE +/*@constant size_t MAX_WCHAR_TYPE_SIZE@*/ +#define MAX_WCHAR_TYPE_SIZE WCHAR_TYPE_SIZE +#endif + +static struct operation cppReader_lex (cppReader *); +static void integer_overflow (cppReader *); +static long left_shift (cppReader *, long, bool p_unsignedp, size_t); +static long right_shift (long, bool p_unsignedp, unsigned long); + +/*@constant short CPPREADER_ERRORTOK@*/ +#define CPPREADER_ERRORTOK 299 + +/*@constant int OROR@*/ +#define OROR 300 + +/*@constant int ANDAND@*/ +#define ANDAND 301 + +/*@constant int CPP_EQUALTOK@*/ +#define CPP_EQUALTOK 302 + +/*@constant int NOTEQUAL@*/ +#define NOTEQUAL 303 + +/*@constant int LEQ@*/ +#define LEQ 304 + +/*@constant int GEQ@*/ +#define GEQ 305 + +/*@constant int LSH@*/ +#define LSH 306 + +/*@constant int RSH@*/ +#define RSH 307 + +/*@constant int NAME@*/ +#define NAME 308 + +/*@constant short CPPEXP_INT@*/ +#define CPPEXP_INT 309 + +/*@constant short CPPEXP_CHAR@*/ +#define CPPEXP_CHAR 310 + +/*@constant int LEFT_OPERAND_REQUIRED@*/ +#define LEFT_OPERAND_REQUIRED 1 + +/*@constant int RIGHT_OPERAND_REQUIRED@*/ +#define RIGHT_OPERAND_REQUIRED 2 + +/*@constant int HAVE_VALUE@*/ +#define HAVE_VALUE 4 + +#ifndef HOST_BITS_PER_WIDE_INT + +#if HOST_BITS_PER_LONG > HOST_BITS_PER_INT +/*@constant int HOST_BITS_PER_WIDE_INT@*/ +#define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG +/*@notfunction@*/ +#define HOST_WIDE_INT long +#else +/*@constant int HOST_BITS_PER_WIDE_INT@*/ +#define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_INT +/*@notfunction@*/ +#define HOST_WIDE_INT long +#endif + +#endif + +struct operation { + short op; + + /* Priority of op (relative to it right operand). */ + /*@reldef@*/ char rprio; + + /*@reldef@*/ char flags; + + /* true if value should be treated as unsigned */ + /*@reldef@*/ bool unsignedp; + + /* The value logically "right" of op. */ + /*@reldef@*/ HOST_WIDE_INT value; +} ; + +/* Take care of parsing a number (anything that starts with a digit). + LEN is the number of characters in it. */ + +/* maybe needs to actually deal with floating point numbers */ + +struct operation +cppReader_parseNumber (cppReader *pfile, char *start, int olen) +{ + struct operation op; + char *p = start; + char c; + int i; + long n = 0; + unsigned long nd, ULONG_MAX_over_base; + int base = 10; + int len = olen; + bool overflow = FALSE; + int digit, largest_digit = 0; + bool spec_long = FALSE; + + op.unsignedp = FALSE; + + for (i = 0; i < len; i++) + { + if (p[i] == '.') { + /* It's a float since it contains a point. */ + cppReader_errorLit + (pfile, + cstring_makeLiteralTemp + ("Floating point numbers not allowed in #if expressions")); + op.op = CPPREADER_ERRORTOK; + return op; + } + } + + if (len >= 3 && (mstring_equalPrefix (p, "0x") + || mstring_equalPrefix (p, "0X"))) + { + p += 2; + base = 16; + len -= 2; + } + else if (*p == '0') + { + base = 8; + } + else + { + ; + } + + /* Some buggy compilers (e.g. MPW C) seem to need both casts. */ + ULONG_MAX_over_base = ((unsigned long) -1) / ((unsigned long) base); + + for (; len > 0; len--) { + c = *p++; + + if (c >= '0' && c <= '9') + { + digit = (int) (c - '0'); + } + else if (base == 16 && c >= 'a' && c <= 'f') + { + digit = (int) (c - 'a') + 10; + } + else if (base == 16 && c >= 'A' && c <= 'F') + { + digit = (int) (c - 'A') + 10; + } + else + { + /* `l' means long, and `u' means unsigned. */ + while (TRUE) + { + if (c == 'l' || c == 'L') + { + if (spec_long) + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("two `l's in integer constant")); + spec_long = TRUE; + } + else if (c == 'u' || c == 'U') + { + if (op.unsignedp) + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("two `u's in integer constant")); + op.unsignedp = TRUE; + } + else + { + /*@innerbreak@*/ break; + } + + if (--len == 0) + { + /*@innerbreak@*/ break; + } + + c = *p++; + } + /* Don't look for any more digits after the suffixes. */ + break; + } + + if (largest_digit < digit) + { + largest_digit = digit; + } + + nd = (long unsigned) (n * base + digit); + overflow |= (ULONG_MAX_over_base < (unsigned long) n) + | (nd < (unsigned long) n); + n = (long) nd; + } + + if (len != 0) + { + cppReader_errorLit + (pfile, + cstring_makeLiteralTemp ("Invalid number in #if expression")); + op.op = CPPREADER_ERRORTOK; + return op; + } + + if (base <= largest_digit) + { + cppReader_pedwarnLit + (pfile, + cstring_makeLiteralTemp + ("Integer constant contains digits beyond the radix")); + } + + if (overflow) + { + cppReader_pedwarnLit + (pfile, + cstring_makeLiteralTemp ("Integer constant out of range")); + } + + /* If too big to be signed, consider it unsigned. */ + if ((long) n < 0 && ! op.unsignedp) + { + if (base == 10) + { + cppReader_warningLit + (pfile, + cstring_makeLiteralTemp ("Integer constant is so large that it is unsigned")); + } + + op.unsignedp = TRUE; + } + + op.value = n; + op.op = CPPEXP_INT; + return op; +} + +struct token { + /*@null@*/ /*@observer@*/ char *operator; + int token; +}; + +static struct token tokentab2[] = { + { "&&", ANDAND }, + { "||", OROR }, + { "<<", LSH }, + { ">>", RSH }, + { "==", CPP_EQUALTOK }, + { "!=", NOTEQUAL }, + { "<=", LEQ }, + { ">=", GEQ }, + { "++", CPPREADER_ERRORTOK }, + { "--", CPPREADER_ERRORTOK }, + { NULL, CPPREADER_ERRORTOK } +} ; + +/* Read one token. */ + +struct operation cppReader_lex (cppReader *pfile) +{ + int ic; + char c; + register struct token *toktab; + enum cpp_token token; + struct operation op; + char *tok_start, *tok_end; + int old_written; + + retry: + + old_written = size_toInt (cppReader_getWritten (pfile)); + cppSkipHspace (pfile); + ic = cppBufPeek (cppReader_getBufferSafe (pfile)); + + c = (char) ic; + llassert (c != '#'); + + if (c == '\n') + { + op.op = 0; + return op; + } + + token = cppGetToken (pfile); + tok_start = pfile->token_buffer + old_written; + tok_end = cppReader_getPWritten (pfile); + pfile->limit = tok_start; + + switch (token) + { + case CPP_EOF: /* Should not happen ... */ + case CPP_VSPACE: + op.op = 0; + return op; + case CPP_POP: + if (cppReader_getBufferSafe (pfile)->fname != NULL) + { + op.op = 0; + return op; + } + (void) cppReader_popBuffer (pfile); + goto retry; + case CPP_HSPACE: case CPP_COMMENT: + goto retry; + case CPP_NUMBER: + return cppReader_parseNumber (pfile, tok_start, tok_end - tok_start); + case CPP_STRING: + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("string constants not allowed in #if expressions")); + op.op = CPPREADER_ERRORTOK; + return op; + case CPP_CHAR: + /* This code for reading a character constant + handles multicharacter constants and wide characters. + It is mostly copied from c-lex.c. */ + { + int result = 0; + int num_chars = 0; + size_t width = MAX_CHAR_TYPE_SIZE; + int wide_flag = 0; + int max_chars; + char *ptr = tok_start; +#ifdef MULTIBYTE_CHARS + char token_buffer[MAX_LONG_TYPE_SIZE/MAX_CHAR_TYPE_SIZE + MB_CUR_MAX]; +#else + char token_buffer[MAX_LONG_TYPE_SIZE/MAX_CHAR_TYPE_SIZE + 1]; +#endif + + if (*ptr == 'L') + { + ptr++; + wide_flag = 1; + width = MAX_WCHAR_TYPE_SIZE; +#ifdef MULTIBYTE_CHARS + max_chars = MB_CUR_MAX; +#else + max_chars = 1; +#endif + } + else + { + max_chars = size_toInt (MAX_LONG_TYPE_SIZE / width); + } + + ++ptr; + while (ptr < tok_end && ((c = *ptr++) != '\'')) + { + if (c == '\\') + { + c = cppReader_parseEscape (pfile, &ptr); + if (width < HOST_BITS_PER_INT && c >= (1 << width)) + { + cppReader_pedwarnLit + (pfile, + cstring_makeLiteralTemp ("Escape sequence out of range for character")); + } + } + + num_chars++; + + /* Merge character into result; ignore excess chars. */ + if (num_chars < max_chars + 1) + { + if (width < HOST_BITS_PER_INT) + { + result = (int) ((unsigned) result << width) | (c & ((1 << width) - 1)); + } + else + { + result = c; + } + + token_buffer[num_chars - 1] = c; + } + } + + token_buffer[num_chars] = 0; + + if (c != '\'') + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("malformatted character constant")); + else if (num_chars == 0) + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("empty character constant")); + else if (num_chars > max_chars) + { + num_chars = max_chars; + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("character constant too long")); + } + else if (num_chars != 1 && ! cppReader_isTraditional (pfile)) + { + cppReader_warningLit (pfile, + cstring_makeLiteralTemp ("multi-character character constant")); + } + else + { + ; + } + + /* If char type is signed, sign-extend the constant. */ + if (wide_flag == 0) + { + int num_bits = num_chars * width; + + if ((cppReader_lookup ("__CHAR_UNSIGNED__", + sizeof ("__CHAR_UNSIGNED__") - 1, -1) != NULL) + || (((unsigned) result >> (num_bits - 1)) & 1) == 0) + { + op.value + = result & ((unsigned long) ~0 >> (HOST_BITS_PER_LONG - num_bits)); + } + else + { + op.value + = result | ~((unsigned long) ~0 >> (HOST_BITS_PER_LONG - num_bits)); + } + } + else + { +#ifdef MULTIBYTE_CHARS + /* Set the initial shift state and convert the next sequence. */ + result = 0; + /* In all locales L'\0' is zero and mbtowc will return zero, + so don't use it. */ + if (num_chars > 1 + || (num_chars == 1 && token_buffer[0] != '\0')) + { + wchar_t wc; + (void) mbtowc (NULL, NULL, 0); + if (mbtowc (& wc, token_buffer, num_chars) == num_chars) + result = wc; + else + cppReader_pedwarn (pfile,"Ignoring invalid multibyte character"); + } +#endif + op.value = result; + } + } + + /* This is always a signed type. */ + op.unsignedp = 0; + op.op = CPPEXP_CHAR; + + return op; + + case CPP_NAME: + return cppReader_parseNumber (pfile, "0", 0); + + case CPP_OTHER: + /* See if it is a special token of length 2. */ + if (tok_start + 2 == tok_end) + { + for (toktab = tokentab2; toktab->operator != NULL; toktab++) + { + if (tok_start[0] == toktab->operator[0] + && tok_start[1] == toktab->operator[1]) + { + /*@loopbreak@*/ break; + } + } + + if (toktab->token == CPPREADER_ERRORTOK) + { + cppReader_error (pfile, message ("`%s' not allowed in operand of `#if'", cstring_fromChars (tok_start))); + } + + op.op = toktab->token; + return op; + } + /*@fallthrough@*/ + default: + op.op = *tok_start; + return op; + } + + BADEXIT; + /*@notreached@*/ +} + + +/* Parse a C escape sequence. STRING_PTR points to a variable + containing a pointer to the string to parse. That pointer + is updated past the characters we use. The value of the + escape sequence is returned. + + A negative value means the sequence \ newline was seen, + which is supposed to be equivalent to nothing at all. + + If \ is followed by a null character, we return a negative + value and leave the string pointer pointing at the null character. + + If \ is followed by 000, we return 0 and leave the string pointer + after the zeros. A value of 0 does not mean end of string. */ + +int +cppReader_parseEscape (cppReader *pfile, char **string_ptr) +{ + char c = *(*string_ptr)++; + + switch (c) + { + case 'a': + return TARGET_BELL; + case 'b': + return TARGET_BS; + case 'e': + case 'E': + if (cppReader_isPedantic (pfile)) + { + cppReader_pedwarn (pfile, + message ("non-ANSI-standard escape sequence, `\\%c'", c)); + } + return (char) 033; + case 'f': + return TARGET_FF; + case 'n': + return TARGET_NEWLINE; + case 'r': + return TARGET_CR; + case 't': + return TARGET_TAB; + case 'v': + return TARGET_VT; + case '\n': + return -2; + case 0: + (*string_ptr)--; + return 0; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + { + int i = (int) c - '0'; + int count = 0; + + while (++count < 3) + { + c = *(*string_ptr)++; + if (c >= '0' && c <= '7') + { + i = ((unsigned) i << 3) + c - '0'; + } + + else + { + (*string_ptr)--; + /*@loopbreak@*/ break; + } + } + if ((i & ~((1 << MAX_CHAR_TYPE_SIZE) - 1)) != 0) + { + i &= (1 << MAX_CHAR_TYPE_SIZE) - 1; + cppReader_pedwarnLit (pfile, + cstring_makeLiteralTemp ("octal character constant does not fit in a byte")); + } + return i; + } + case 'x': + { + register unsigned i = 0, overflow = 0, digits_found = 0, digit; + for (;;) + { + c = *(*string_ptr)++; + + if (c >= '0' && c <= '9') + { + digit = (unsigned int) (c - '0'); + } + else if (c >= 'a' && c <= 'f') + { + digit = (unsigned int) (c - 'a') + 10; + } + else if (c >= 'A' && c <= 'F') + { + digit = (unsigned int) (c - 'A') + 10; + } + else + { + (*string_ptr)--; + /*@loopbreak@*/ break; + } + overflow |= i ^ (i << 4 >> 4); + i = (i << 4) + digit; + digits_found = 1; + } + + if (digits_found == 0) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("\\x used with no following hex digits")); + } + + if ((overflow | (i & ~((1 << BITS_PER_UNIT) - 1))) != 0) + { + i &= (1 << BITS_PER_UNIT) - 1; + cppReader_pedwarnLit (pfile, + cstring_makeLiteralTemp ("hex character constant does not fit in a byte")); + } + + return i; + } + default: + return c; + } +} + +static void +integer_overflow (cppReader *pfile) +{ + if (cppReader_isPedantic (pfile)) + cppReader_pedwarnLit (pfile, + cstring_makeLiteralTemp ("integer overflow in preprocessor expression")); +} + +static long +left_shift (cppReader *pfile, long a, bool unsignedp, size_t b) +{ + if (b >= HOST_BITS_PER_LONG) + { + if (!unsignedp && a != 0) + { + integer_overflow (pfile); + } + + return 0; + } + else if (unsignedp) + { + return (unsigned long) a << b; + } + else + { + long l = a << b; + + if (l >> b != a) + { + integer_overflow (pfile); + } + + return l; + } +} + +static long +right_shift (long a, bool unsignedp, unsigned long b) +{ + if (b >= HOST_BITS_PER_LONG) + return (unsignedp ? 0 : a >> (HOST_BITS_PER_LONG - 1)); + else if (unsignedp) + return (unsigned long) a >> b; + else + return a >> b; +} + +/* These priorities are all even, so we can handle associatively. */ + +/*@constant int PAREN_INNER_PRIO@*/ +#define PAREN_INNER_PRIO 0 + +/*@constant int COMMA_PRIO@*/ +#define COMMA_PRIO 4 + +/*@constant int COND_PRIO@*/ +#define COND_PRIO (COMMA_PRIO+2) + +/*@constant int OROR_PRIO@*/ +#define OROR_PRIO (COND_PRIO+2) + +/*@constant int ANDAND_PRIO@*/ +#define ANDAND_PRIO (OROR_PRIO+2) + +/*@constant int OR_PRIO@*/ +#define OR_PRIO (ANDAND_PRIO+2) + +/*@constant int XOR_PRIO@*/ +#define XOR_PRIO (OR_PRIO+2) + +/*@constant int AND_PRIO@*/ +#define AND_PRIO (XOR_PRIO+2) + +/*@constant int CPP_EQUAL_PRIO@*/ +#define CPP_EQUAL_PRIO (AND_PRIO+2) + +/*@constant int LESS_PRIO@*/ +#define LESS_PRIO (CPP_EQUAL_PRIO+2) + +/*@constant int SHIFT_PRIO@*/ +#define SHIFT_PRIO (LESS_PRIO+2) + +/*@constant int PLUS_PRIO@*/ +#define PLUS_PRIO (SHIFT_PRIO+2) + +/*@constant int MUL_PRIO@*/ +#define MUL_PRIO (PLUS_PRIO+2) + +/*@constant int UNARY_PRIO@*/ +#define UNARY_PRIO (MUL_PRIO+2) + +/*@constant int PAREN_OUTER_PRIO@*/ +#define PAREN_OUTER_PRIO (UNARY_PRIO+2) + +/*@notfunction@*/ +#define COMPARE(OP) \ + top->unsignedp = 0;\ + top->value = ((unsigned1 || unsigned2) \ + ? (unsigned long) v1 OP (unsigned long) v2 \ + : ((long) v1 OP (long) v2)) ? 1 : 0 + +/* Parse and evaluate a C expression, reading from PFILE. + Returns the value of the expression. */ + +/*@constant int INIT_STACK_SIZE@*/ +# define INIT_STACK_SIZE 20 + +HOST_WIDE_INT +cppReader_parseExpression (cppReader *pfile) +{ + /* The implementation is an operator precedence parser, + i.e. a bottom-up parser, using a stack for not-yet-reduced tokens. + + The stack base is 'stack', and the current stack pointer is 'top'. + There is a stack element for each operator (only), + and the most recently pushed operator is 'top->op'. + An operand (value) is stored in the 'value' field of the stack + element of the operator that precedes it. + In that case the 'flags' field has the HAVE_VALUE flag set. */ + + struct operation init_stack[INIT_STACK_SIZE]; + struct operation *stack = init_stack; + struct operation *limit = stack + INIT_STACK_SIZE; + register struct operation *top = stack; + int lprio, rprio = 0; + int skip_evaluation = 0; + + top->rprio = 0; + top->flags = 0; + + for (;;) + { + struct operation op; + int flags = 0; + + /* Read a token */ + op = cppReader_lex (pfile); + + /* See if the token is an operand, in which case go to set_value. + If the token is an operator, figure out its left and right + priorities, and then goto maybe_reduce. */ + + switch (op.op) + { + case NAME: + top->value = 0, top->unsignedp = 0; + goto set_value; + case CPPEXP_INT: + case CPPEXP_CHAR: + top->value = op.value; + top->unsignedp = op.unsignedp; + goto set_value; + case 0: + lprio = 0; goto maybe_reduce; + case '+': case '-': + /* Is this correct if unary ? FIXME */ + flags = RIGHT_OPERAND_REQUIRED; + lprio = PLUS_PRIO; rprio = lprio + 1; goto maybe_reduce; + case '!': case '~': + flags = RIGHT_OPERAND_REQUIRED; + rprio = UNARY_PRIO; lprio = rprio + 1; goto maybe_reduce; + case '*': case '/': case '%': + lprio = MUL_PRIO; goto binop; + case '<': case '>': case LEQ: case GEQ: + lprio = LESS_PRIO; goto binop; + case CPP_EQUALTOK: case NOTEQUAL: + lprio = CPP_EQUAL_PRIO; goto binop; + case LSH: case RSH: + lprio = SHIFT_PRIO; goto binop; + case '&': lprio = AND_PRIO; goto binop; + case '^': lprio = XOR_PRIO; goto binop; + case '|': lprio = OR_PRIO; goto binop; + case ANDAND: lprio = ANDAND_PRIO; goto binop; + case OROR: lprio = OROR_PRIO; goto binop; + case ',': + lprio = COMMA_PRIO; goto binop; + case '(': + lprio = PAREN_OUTER_PRIO; rprio = PAREN_INNER_PRIO; + goto maybe_reduce; + case ')': + lprio = PAREN_INNER_PRIO; rprio = PAREN_OUTER_PRIO; + goto maybe_reduce; + case ':': + lprio = COND_PRIO; rprio = COND_PRIO; + goto maybe_reduce; + case '?': + lprio = COND_PRIO + 1; rprio = COND_PRIO; + goto maybe_reduce; + binop: + flags = LEFT_OPERAND_REQUIRED | RIGHT_OPERAND_REQUIRED; + rprio = lprio + 1; + goto maybe_reduce; + default: + cppReader_error + (pfile, + message ("Invalid character in #if: %c", + (char) op.op)); + goto syntax_error; + } + + set_value: + /* Push a value onto the stack. */ + if ((top->flags & HAVE_VALUE) != 0) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("syntax error in #if")); + goto syntax_error; + } + top->flags |= HAVE_VALUE; + continue; + + maybe_reduce: + /* Push an operator, and check if we can reduce now. */ + while (top->rprio > lprio) + { + /*@-usedef@*/ + long v1 = top[-1].value, v2 = top[0].value; + bool unsigned1 = top[-1].unsignedp; + bool unsigned2 = top[0].unsignedp; + + top--; + + if (((top[1].flags & LEFT_OPERAND_REQUIRED) != 0) + && ((top[0].flags & HAVE_VALUE) == 0)) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("syntax error - missing left operand")); + goto syntax_error; + } + if (((top[1].flags & RIGHT_OPERAND_REQUIRED) != 0) + && ((top[1].flags & HAVE_VALUE) == 0)) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("syntax error - missing right operand")); + goto syntax_error; + } + /* top[0].value = (top[1].op)(v1, v2);*/ + switch (top[1].op) + { + case '+': + if ((top->flags & HAVE_VALUE) == 0) + { /* Unary '+' */ + top->value = v2; + top->unsignedp = unsigned2; + top->flags |= HAVE_VALUE; + } + else + { + top->value = v1 + v2; + top->unsignedp = unsigned1 || unsigned2; + if (!top->unsignedp && (skip_evaluation == 0) + && ! possibleSumSign (v1, v2, top->value)) + integer_overflow (pfile); + } + /*@switchbreak@*/ break; + case '-': + if ((top->flags & HAVE_VALUE) == 0) + { /* Unary '-' */ + top->value = - v2; + if ((skip_evaluation == 0) + && (top->value & v2) < 0 && !unsigned2) + integer_overflow (pfile); + top->unsignedp = unsigned2; + top->flags |= HAVE_VALUE; + } + else + { /* Binary '-' */ + top->value = v1 - v2; + top->unsignedp = unsigned1 || unsigned2; + if (!top->unsignedp && (skip_evaluation == 0) + && !possibleSumSign (top->value, v2, v1)) + { + integer_overflow (pfile); + } + } + /*@switchbreak@*/ break; + case '*': + top->unsignedp = unsigned1 || unsigned2; + + if (top->unsignedp) + { + top->value = (unsigned long) v1 * v2; + } + else if (skip_evaluation == 0) + { + top->value = v1 * v2; + if ((v1 != 0) + && (top->value / v1 != v2 + || (top->value & v1 & v2) < 0)) + { + integer_overflow (pfile); + } + } + else + { + ; + } + + /*@switchbreak@*/ break; + case '/': + if (skip_evaluation != 0) + /*@switchbreak@*/ break; + if (v2 == 0) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("Division by zero in #if")); + v2 = 1; + } + top->unsignedp = unsigned1 || unsigned2; + if (top->unsignedp) + top->value = (unsigned long) v1 / v2; + else + { + top->value = v1 / v2; + if ((top->value & v1 & v2) < 0) + integer_overflow (pfile); + } + /*@switchbreak@*/ break; + case '%': + if (skip_evaluation != 0) + /*@switchbreak@*/ break; + if (v2 == 0) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("Division by zero in #if")); + v2 = 1; + } + top->unsignedp = unsigned1 || unsigned2; + if (top->unsignedp) + top->value = (unsigned long) v1 % v2; + else + top->value = v1 % v2; + /*@switchbreak@*/ break; + case '!': + if ((top->flags & HAVE_VALUE) != 0) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("Syntax error")); + goto syntax_error; + } + + top->value = (v2 == 0) ? 1 : 0; + top->unsignedp = 0; + top->flags |= HAVE_VALUE; + /*@switchbreak@*/ break; + case '~': + if ((top->flags & HAVE_VALUE) != 0) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("syntax error")); + goto syntax_error; + } + top->value = ~ v2; + top->unsignedp = unsigned2; + top->flags |= HAVE_VALUE; + /*@switchbreak@*/ break; + case '<': COMPARE(<); /*@switchbreak@*/ break; + case '>': COMPARE(>); /*@switchbreak@*/ break; + case LEQ: COMPARE(<=); /*@switchbreak@*/ break; + case GEQ: COMPARE(>=); /*@switchbreak@*/ break; + case CPP_EQUALTOK: + top->value = (v1 == v2) ? 1 : 0; + top->unsignedp = 0; + /*@switchbreak@*/ break; + case NOTEQUAL: + top->value = (v1 != v2) ? 1 : 0; + top->unsignedp = 0; + /*@switchbreak@*/ break; + case LSH: + if (skip_evaluation != 0) + { + /*@switchbreak@*/ break; + } + + top->unsignedp = unsigned1; + if (v2 < 0 && ! unsigned2) + top->value = right_shift (v1, unsigned1, -v2); + else + top->value = left_shift (pfile, v1, unsigned1, v2); + /*@switchbreak@*/ break; + case RSH: + if (skip_evaluation != 0) + { + /*@switchbreak@*/ break; + } + top->unsignedp = unsigned1; + if (v2 < 0 && ! unsigned2) + top->value = left_shift (pfile, v1, unsigned1, -v2); + else + top->value = right_shift (v1, unsigned1, v2); + /*@switchbreak@*/ break; + +/*@notfunction@*/ +#define LOGICAL(OP) \ + top->value = v1 OP v2;\ + top->unsignedp = unsigned1 || unsigned2; + + case '&': LOGICAL(&); /*@switchbreak@*/ break; + case '^': LOGICAL(^); /*@switchbreak@*/ break; + case '|': LOGICAL(|); /*@switchbreak@*/ break; + case ANDAND: + top->value = ((v1 != 0) && (v2 != 0)) ? 1 : 0; + top->unsignedp = 0; + + if (v1 == 0) + { + skip_evaluation--; + } + /*@switchbreak@*/ break; + case OROR: + top->value = ((v1 != 0) || (v2 != 0)) ? 1 : 0; + top->unsignedp = 0; + if (v1 != 0) + { + skip_evaluation--; + } + /*@switchbreak@*/ break; + case ',': + if (cppReader_isPedantic (pfile)) + cppReader_pedwarnLit (pfile, + cstring_makeLiteralTemp ("comma operator in operand of `#if'")); + top->value = v2; + top->unsignedp = unsigned2; + /*@switchbreak@*/ break; + case '(': case '?': + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("syntax error in #if")); + goto syntax_error; + case ':': + if (top[0].op != '?') + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("syntax error ':' without preceding '?'")); + goto syntax_error; + } + else if (((top[1].flags & HAVE_VALUE) == 0) + || ((top[-1].flags & HAVE_VALUE) == 0) + || ((top[0].flags & HAVE_VALUE) == 0)) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("bad syntax for ?: operator")); + goto syntax_error; + } + else + { + top--; + if (top->value != 0) + { + skip_evaluation--; + } + + top->value = (top->value != 0) ? v1 : v2; + top->unsignedp = unsigned1 || unsigned2; + } + /*@switchbreak@*/ break; + case ')': + if (((top[1].flags & HAVE_VALUE) != 0) + || ((top[0].flags & HAVE_VALUE) == 0) + || top[0].op != '(' + || ((top[-1].flags & HAVE_VALUE) != 0)) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("mismatched parentheses in #if")); + goto syntax_error; + } + else + { + top--; + top->value = v1; + top->unsignedp = unsigned1; + top->flags |= HAVE_VALUE; + } + /*@switchbreak@*/ break; + default: + fprintf (stderr, + top[1].op >= ' ' && top[1].op <= '~' + ? "unimplemented operator '%c'\n" + : "unimplemented operator '\\%03o'\n", + top[1].op); + } + } + if (op.op == 0) + { + long val; + + if (top != stack) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("internal error in #if expression")); + } + + val = top->value; + + if (stack != init_stack) + { + sfree (stack); + /*@-branchstate@*/ + } /*@=branchstate@*/ + + return val; + } + top++; + + /* Check for and handle stack overflow. */ + if (top == limit) + { + struct operation *new_stack; + int old_size = (char *) limit - (char *) stack; + size_t new_size = size_fromInt (2 * old_size); + + if (stack != init_stack) + { + new_stack = (struct operation *) drealloc ((char *) stack, + new_size); + } + else + { + new_stack = (struct operation *) dmalloc (new_size); + + /* Bug: the parameters were in the wrong order! */ + memcpy ((char *) new_stack, (char *) stack, old_size); + /*@-branchstate@*/ + } /*@=branchstate@*/ + + stack = new_stack; + top = (struct operation *) ((char *) new_stack + old_size); + limit = (struct operation *) ((char *) new_stack + new_size); + /*@-branchstate@*/ + } /*@=branchstate@*/ + + top->flags = flags; + top->rprio = rprio; + top->op = op.op; + if ((op.op == OROR && (top[-1].value != 0)) + || (op.op == ANDAND && (top[-1].value == 0)) + || (op.op == '?' && (top[-1].value == 0))) + { + skip_evaluation++; + } + else if (op.op == ':') + { + if (top[-2].value != 0) /* Was condition true? */ + { + skip_evaluation++; + } + else + { + skip_evaluation--; + } + } + else + { + ; + } + } + syntax_error: + /*@-usereleased@*/ + if (stack != init_stack) + { + sfree (stack); + /*@-branchstate@*/ + } /*@=branchstate@*/ + /*@=usereleased@*/ + + cppReader_skipRestOfLine (pfile); + return 0; +} diff --git a/src/cpphash.c b/src/cpphash.c new file mode 100644 index 0000000..9f316a4 --- /dev/null +++ b/src/cpphash.c @@ -0,0 +1,492 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** cpphash.c +** +** Pre-processor hash table. Derived from gnu cpp. +*/ + +/* Part of CPP library. (Macro hash table support.) + Copyright (C) 1986, 87, 89, 92-95, 1996 Free Software Foundation, Inc. + Written by Per Bothner, 1994. + Based on CCCP program by by Paul Rubin, June 1986 + Adapted to ANSI C, Richard Stallman, Jan 1987 + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +# include "lclintMacros.nf" +# include "llbasic.h" +# include +# include "cpp.h" +# include "cpplib.h" +# include "cpphash.h" + +typedef /*@only@*/ HASHNODE *o_HASHNODE; + +static o_HASHNODE hashtab[CPP_HASHSIZE]; +static o_HASHNODE ohashtab[CPP_HASHSIZE]; + +static void HashNode_delete (/*@null@*/ /*@only@*/ HASHNODE *); + +/* p_prev need not be defined, but isn't defined by HashNode_copy */ + +/*@function static unsigned int hashStep (unsigned, char) modifies nothing ; @*/ +# define hashStep(old, c) (((old) << 2) + (unsigned int) (c)) + +/*@function static unsigned int makePositive (unsigned int) modifies nothing ; @*/ +# define makePositive(v) ((v) & 0x7fffffff) /* make number positive */ + +static /*@null@*/ HASHNODE * + HashNode_copy (/*@null@*/ HASHNODE *, + /*@dependent@*/ HASHNODE **p_hdr, + /*@dependent@*/ /*@null@*/ /*@special@*/ HASHNODE *p_prev) + /*@*/ ; + +void cppReader_saveHashtab () +{ + int i; + + for (i = 0; i < CPP_HASHSIZE; i++) + { + ohashtab[i] = HashNode_copy (hashtab[i], &ohashtab[i], NULL); + } +} + +void cppReader_restoreHashtab () +{ + int i; + + for (i = 0; i < CPP_HASHSIZE; i++) { + /* HashNode_delete (hashtab[i]); */ + hashtab[i] = HashNode_copy (ohashtab[i], &hashtab[i], NULL); + } +} + +static void HashNode_delete (/*@only@*/ /*@null@*/ HASHNODE *node) +{ + if (node == NULL) + { + ; + } + else + { + HashNode_delete (node->next); + + if (node->type == T_MACRO) + { + DEFINITION *d = node->value.defn; + struct reflist *ap, *nextap; + + for (ap = d->pattern; ap != NULL; ap = nextap) + { + nextap = ap->next; + sfree (ap); + } + + if (d->nargs >= 0) + { + sfree (d->args.argnames); + } + + sfree (d); + } + + cstring_free (node->name); + sfree (node); + } +} + +/*@null@*/ HASHNODE *HashNode_copy (HASHNODE *node, HASHNODE **hdr, + /*@dependent@*/ HASHNODE *prev) +{ + if (node == NULL) + { + return NULL; + } + else + { + HASHNODE *res = dmalloc (sizeof (*res)); + + res->next = HashNode_copy (node->next, hdr, res); + res->prev = prev; + + res->bucket_hdr = hdr; + res->type = node->type; + res->length = node->length; + res->name = cstring_copy (node->name); + + if (node->type == T_MACRO) + { + DEFINITION *d = node->value.defn; + DEFINITION *nd = dmalloc (sizeof (*nd)); + + res->value.defn = nd; + nd->nargs = d->nargs; + + nd->length = d->length; + nd->predefined = d->predefined; + nd->expansion = d->expansion; + nd->line = d->line; + nd->file = d->file; + + if (d->pattern != NULL) + { + struct reflist *ap, *nextap; + struct reflist **last = &nd->pattern; + + for (ap = d->pattern; ap != NULL; ap = nextap) + { + struct reflist *npattern = dmalloc (sizeof (*(nd->pattern))); + + nextap = ap->next; + + if (ap == d->pattern) + { + *last = npattern; + /*@-branchstate@*/ + } /*@=branchstate@*/ /* npattern is propagated through loop */ + + last = &(npattern->next); + npattern->next = NULL; /* will get filled in */ + npattern->stringify = d->pattern->stringify; + npattern->raw_before = d->pattern->raw_before; + npattern->raw_after = d->pattern->raw_after; + npattern->rest_args = d->pattern->rest_args; + npattern->argno = d->pattern->argno; + /*@-mustfree@*/ + } + /*@=mustfree@*/ + } + else + { + nd->pattern = NULL; + } + + if (d->nargs >= 0) + { + llassert (d->args.argnames != NULL); + + nd->args.argnames = mstring_copy (d->args.argnames); + } + else + { + /* + ** This fix found by: + ** + ** Date: Mon, 31 May 1999 15:10:50 +0900 (JST) + ** From: "N.Komazaki" + */ + + /*! why doesn't lclint report an error for this? */ + nd->args.argnames = mstring_createEmpty (); + } + } + else + { + if (node->type == T_CONST) + { + res->value.ival = node->value.ival; + } + else if (node->type == T_PCSTRING) + { + res->value.cpval = mstring_copy (node->value.cpval); + llassert (res->value.cpval != NULL); + } + else + { + res->value = node->value; + } + } + + /*@-uniondef@*/ /*@-compdef@*/ /* res->prev is not defined */ + return res; + /*@=uniondef@*/ /*@=compdef@*/ + } +} + +/* Return hash function on name. must be compatible with the one + computed a step at a time, elsewhere */ + +int +hashf (const char *name, int len, int hashsize) +{ + unsigned int r = 0; + + while (len-- != 0) + { + r = hashStep (r, *name++); + } + + return (int) (makePositive (r) % hashsize); +} + +/* +** Find the most recent hash node for name name (ending with first +** non-identifier char) cppReader_installed by install +** +** If LEN is >= 0, it is the length of the name. +** Otherwise, compute the length by scanning the entire name. +** +** If HASH is >= 0, it is the precomputed hash code. +** Otherwise, compute the hash code. +*/ + +/*@null@*/ HASHNODE *cppReader_lookup (char *name, int len, int hash) +{ + const char *bp; + HASHNODE *bucket; + + if (len < 0) + { + for (bp = name; isIdentifierChar (*bp); bp++) + { + ; + } + + len = bp - name; + } + + if (hash < 0) + { + hash = hashf (name, len, CPP_HASHSIZE); + } + + bucket = hashtab[hash]; + + while (bucket != NULL) + { + if (bucket->length == len && + cstring_equalLen (bucket->name, cstring_fromChars (name), len)) + { + return bucket; + } + + bucket = bucket->next; + } + + return NULL; +} + +/*@null@*/ HASHNODE *cppReader_lookupExpand (char *name, int len, int hash) +{ + HASHNODE *node = cppReader_lookup (name, len, hash); + + DPRINTF (("Lookup expand: %s", name)); + + if (node != NULL) + { + if (node->type == T_MACRO) + { + DEFINITION *defn = (DEFINITION *) node->value.defn; + + DPRINTF (("Check macro...")); + + if (defn->noExpand) { + DPRINTF (("No expand!")); + return NULL; + } + } + } + + return node; +} + +/* + * Delete a hash node. Some weirdness to free junk from macros. + * More such weirdness will have to be added if you define more hash + * types that need it. + */ + +/* Note that the DEFINITION of a macro is removed from the hash table + but its storage is not freed. This would be a storage leak + except that it is not reasonable to keep undefining and redefining + large numbers of macros many times. + In any case, this is necessary, because a macro can be #undef'd + in the middle of reading the arguments to a call to it. + If #undef freed the DEFINITION, that would crash. */ + +void +cppReader_deleteMacro (HASHNODE *hp) +{ + if (hp->prev != NULL) + { + /*@-mustfree@*/ + hp->prev->next = hp->next; + /*@=mustfree@*/ + /*@-branchstate@*/ + } /*@=branchstate@*/ + + if (hp->next != NULL) + { + hp->next->prev = hp->prev; + } + + /* make sure that the bucket chain header that + the deleted guy was on points to the right thing afterwards. */ + if (hp == *hp->bucket_hdr) { + *hp->bucket_hdr = hp->next; + } + + if (hp->type == T_MACRO) + { + DEFINITION *d = hp->value.defn; + struct reflist *ap, *nextap; + + for (ap = d->pattern; ap != NULL; ap = nextap) + { + nextap = ap->next; + sfree (ap); + } + + if (d->nargs >= 0) + { + sfree (d->args.argnames); + } + } + + /*@-dependenttrans@*/ /*@-exposetrans@*/ /*@-compdestroy@*/ + sfree (hp); + /*@=dependenttrans@*/ /*@=exposetrans@*/ /*@=compdestroy@*/ +} + +/* Install a name in the main hash table, even if it is already there. + name stops with first non alphanumeric, except leading '#'. + caller must check against redefinition if that is desired. + cppReader_deleteMacro () removes things installed by install () in fifo order. + this is important because of the `defined' special symbol used + in #if, and also if pushdef/popdef directives are ever implemented. + + If LEN is >= 0, it is the length of the name. + Otherwise, compute the length by scanning the entire name. + + If HASH is >= 0, it is the precomputed hash code. + Otherwise, compute the hash code. */ + +HASHNODE *cppReader_install (char *name, int len, enum node_type type, + int ivalue, char *value, int hash) +{ + HASHNODE *hp; + int i, bucket; + char *p, *q; + + if (len < 0) { + p = name; + + while (isIdentifierChar (*p)) + { + p++; + } + + len = p - name; + } + + if (hash < 0) + { + hash = hashf (name, len, CPP_HASHSIZE); + } + + i = sizeof (*hp) + len + 1; + + + hp = (HASHNODE *) dmalloc (size_fromInt (i)); + bucket = hash; + hp->bucket_hdr = &hashtab[bucket]; + + hp->next = hashtab[bucket]; + hp->prev = NULL; + + if (hp->next != NULL) + { + hp->next->prev = hp; + } + + hashtab[bucket] = hp; + + hp->type = type; + hp->length = len; + + if (hp->type == T_CONST) + { + hp->value.ival = ivalue; + llassert (value == NULL); + } + else + { + hp->value.cpval = value; + } + + { + char *tmp = ((char *) hp) + sizeof (*hp); + p = tmp; + q = name; + + for (i = 0; i < len; i++) + { + *p++ = *q++; + } + + tmp[len] = '\0'; + hp->name = cstring_fromChars (tmp); + } + + /*@-mustfree@*/ /*@-uniondef@*/ /*@-compdef@*/ + return hp; + /*@=mustfree@*/ /*@=uniondef@*/ /*@=compdef@*/ +} + +HASHNODE *cppReader_installMacro (char *name, int len, + struct definition *defn, int hash) +{ + return cppReader_install (name, len, T_MACRO, 0, (char *) defn, hash); +} + +void +cppReader_hashCleanup (void) +{ + int i; + + for (i = CPP_HASHSIZE; --i >= 0; ) + { + while (hashtab[i] != NULL) + { + cppReader_deleteMacro (hashtab[i]); + } + } +} diff --git a/src/cpplib.c b/src/cpplib.c new file mode 100644 index 0000000..74c83e3 --- /dev/null +++ b/src/cpplib.c @@ -0,0 +1,7425 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** cpplib.c +*/ +/* + Copyright (C) 1986, 87, 89, 92-6, 1997 Free Software Foundation, Inc. + Contributed by Per Bothner, 1994-95. + Based on CCCP program by Paul Rubin, June 1986 + Adapted to ANSI C, Richard Stallman, Jan 1987 + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +# include +# include +# include +# ifdef __STDC__ +# include +# endif + +# include + +# ifndef WIN32 +# include +# endif + +# include +# include +# include + +# ifdef WIN32 +# include +# include /* for __DATE__ and __TIME__ */ +# include +# else +# ifndef VMS +# ifndef USG +# include +# include +# else +# include +# include +# include +# endif /* USG */ +# endif /* not VMS */ +# endif /* not WIN32 */ + +/* This defines "errno" properly for VMS, and gives us EACCES. */ +# include + +# include "lclintMacros.nf" +# include "llbasic.h" +# include "lcllib.h" +# include "cpp.h" +# include "cpplib.h" +# include "cpperror.h" +# include "cpphash.h" +# include "cppexp.h" +# include "version.h" +# include "portab.h" +# include "osd.h" + +/* +** This is really kludgey code... +*/ + +/*@+boolint@*/ +/*@+charint@*/ + +#define NO_SHORTNAMES + +# ifdef open +# undef open +# undef read +# undef write +# endif /* open */ + +/*@constant int IMPORT_FOUND@*/ +# define IMPORT_FOUND -2 + +/*@constant int SKIP_INCLUDE@*/ +# define SKIP_INCLUDE IMPORT_FOUND + +/*@constant unused int IMPORT_NOT_FOUND@*/ +# define IMPORT_NOT_FOUND -1 + +#ifndef STDC_VALUE +/*@constant unused int STDC_VALUE@*/ +#define STDC_VALUE 1 +#endif + +/* By default, colon separates directories in a path. */ +#ifndef PATH_SEPARATOR +/*@constant char PATH_SEPARATOR@*/ +#define PATH_SEPARATOR ':' +#endif + +static void parse_name (cppReader *, int); + +static int cpp_openIncludeFile (char *p_filename) + /*@modifies fileSystem @*/ ; + +static void cpp_setLocation (cppReader *p_pfile) + /*@modifies g_currentloc@*/ ; + +static enum cpp_token cpp_handleComment (cppReader *p_pfile, + struct parse_marker *p_smark) + /*@modifies *p_pfile, *p_smark@*/; + +static bool cpp_shouldCheckMacro (cppReader *p_pfile, char *p_p) /*@*/ ; + +static bool cpp_skipIncludeFile (cstring p_fname) /*@*/ ; + +#ifndef O_RDONLY +#define O_RDONLY 0 +#endif + +/* Symbols to predefine. */ + +#ifdef CPP_PREDEFINES +static /*@observer@*/ char *predefs = CPP_PREDEFINES; +#else +static /*@observer@*/ char *predefs = ""; +#endif + +/* We let tm.h override the types used here, to handle trivial differences + such as the choice of unsigned int or long unsigned int for size_t. + When machines start needing nontrivial differences in the size type, + it would be best to do something here to figure out automatically + from other information what type to use. */ + +/* The string value for __SIZE_TYPE__. */ + +#ifndef SIZE_TYPE +/*@constant observer char *SIZE_TYPE@*/ +#define SIZE_TYPE "long unsigned int" +#endif + +/* The string value for __PTRDIFF_TYPE__. */ + +#ifndef PTRDIFF_TYPE +/*@constant observer char *PTRDIFF_TYPE@*/ +#define PTRDIFF_TYPE "long int" +#endif + +/* The string value for __WCHAR_TYPE__. */ + +#ifndef WCHAR_TYPE +/*@constant observer char *WCHAR_TYPE@*/ +#define WCHAR_TYPE "int" +#endif + +/* The string value for __USER_LABEL_PREFIX__ */ + +#ifndef USER_LABEL_PREFIX +/*@constant observer char *USER_LABEL_PREFIX@*/ +#define USER_LABEL_PREFIX "" +#endif + +/* The string value for __REGISTER_PREFIX__ */ + +#ifndef REGISTER_PREFIX +/*@constant observer char *REGISTER_PREFIX@*/ +#define REGISTER_PREFIX "" +#endif + +/* table to tell if char can be part of a C identifier. */ +static bool is_idchar[256]; +/* table to tell if char can be first char of a c identifier. */ +static bool is_idstart[256]; +/* table to tell if c is horizontal space. */ +static bool is_hor_space[256]; +/* table to tell if c is horizontal or vertical space. */ +static bool is_space[256]; + +static /*@exposed@*/ /*@null@*/ cppBuffer * +cppReader_getBuffer (/*@special@*/ cppReader *p_pfile) + /*@uses p_pfile->buffer@*/ + /*@modifies nothing@*/ ; + +/*@notfunction@*/ +# define SKIP_WHITE_SPACE(p) do { /*@access cstring@*/ while (is_hor_space[(int) *(p)]) { (p)++; } } /*@noaccess cstring@*/ while (0) + +/*@notfunction@*/ +# define SKIP_ALL_WHITE_SPACE(p) do { while (is_space[*(p)]) { (p)++; } } while (0) + +static int cpp_peekN (cppReader *p_pfile, int p_n) /*@*/ ; + +/*@function static int cppBuffer_get (sef cppBuffer *p_b) modifies *p_b ; @*/ +# define cppBuffer_get(BUFFER) \ + ((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur++ : EOF) + +/* Append string STR (of length N) to PFILE's output buffer. Make space. */ +/*@function static void cppReader_puts (sef cppReader *p_file, char *p_str, sef size_t p_n) + modifies *p_file; @*/ +# define cppReader_puts(PFILE, STR, N) \ + cppReader_reserve(PFILE, N), cppReader_putStrN (PFILE, STR,N) + +/* Append character CH to PFILE's output buffer. Assume sufficient space. */ + +/*@function static void cppReader_putCharQ (cppReader *p_file, char p_ch) + modifies *p_file; @*/ +# define cppReader_putCharQ(PFILE, CH) (*(PFILE)->limit++ = (CH)) + +/* Append character CH to PFILE's output buffer. Make space if need be. */ + +/*@function static void cppReader_putChar (sef cppReader *p_file, char p_ch) + modifies *p_file; @*/ +#define cppReader_putChar(PFILE, CH) (cppReader_reserve (PFILE, (size_t) 1), cppReader_putCharQ (PFILE, CH)) + +/* Make sure PFILE->limit is followed by '\0'. */ +/*@function static void cppReader_nullTerminateQ (cppReader *p_file) + modifies *p_file; @*/ + +#define cppReader_nullTerminateQ(PFILE) (*(PFILE)->limit = 0) + +/*@function static void cppReader_nullTerminate (sef cppReader *p_file) + modifies *p_file; @*/ +# define cppReader_nullTerminate(PFILE) \ + (cppReader_reserve (PFILE, (size_t) 1), *(PFILE)->limit = 0) + +/*@function static void cppReader_adjustWritten (cppReader *p_file, size_t) + modifies *p_file; @*/ +#define cppReader_adjustWritten(PFILE,DELTA) ((PFILE)->limit += (DELTA)) + +/*@function static bool cppReader_isC89 (cppReader *) modifies nothing; @*/ +#define cppReader_isC89(PFILE) (CPPOPTIONS(PFILE)->c89) + +/*@function static observer char *cppReader_wcharType (cppReader *) + modifies nothing; @*/ + +# define cppReader_wcharType(PFILE) \ + (CPPOPTIONS (PFILE)->cplusplus ? "__wchar_t" : WCHAR_TYPE) + +static void cppBuffer_forward (cppBuffer *p_buf, int p_n) /*@modifies *p_buf@*/ ; + +/*@function static void cppReader_forward (cppReader *p_pfile, int) modifies *p_pfile; @*/ +# define cppReader_forward(pfile, N) \ + (cppBuffer_forward (cppReader_getBufferSafe (pfile), (N))) + +/*@function static int cppReader_getC (cppReader *p_pfile) modifies *p_pfile; @*/ +# define cppReader_getC(pfile) (cppBuffer_get (cppReader_getBufferSafe (pfile))) + +/*@function static int cppReader_peekC (cppReader *) modifies nothing;@*/ +# define cppReader_peekC(pfile) (cppBufPeek (cppReader_getBufferSafe (pfile))) + +/* Move all backslash-newline pairs out of embarrassing places. + Exchange all such pairs following BP + with any potentially-embarrassing characters that follow them. + Potentially-embarrassing characters are / and * + (because a backslash-newline inside a comment delimiter + would cause it not to be recognized). */ + +/*@notfunction@*/ +# define NEWLINE_FIX \ + do { while (cppReader_peekC (pfile) == '\\' && cpp_peekN (pfile, 1) == '\n') { cppReader_forward (pfile, 2); } } while(FALSE) + + /* Same, but assume we've already read the potential '\\' into C. */ +/*@notfunction@*/ +# define NEWLINE_FIX1(C) do { \ + while ((C) == '\\' && cppReader_peekC (pfile) == '\n') { cppReader_forward (pfile, 1); (C) = cppReader_getC (pfile); }\ + } while(0) + +static void parseSetMark (/*@out@*/ struct parse_marker *, + cppReader *); +static void parseClearMark (struct parse_marker *); +static void parseGotoMark (struct parse_marker *, cppReader *); +static void parseMoveMark (struct parse_marker *, cppReader *); + +/* If we have a huge buffer, may need to cache more recent counts */ +static /*@exposed@*/ char *cppLineBase (/*@sef@*/ cppBuffer *); + +static /*@exposed@*/ /*@null@*/ cppBuffer * + cppReader_pushBuffer (cppReader *p_pfile, + /*@owned@*/ /*@null@*/ char *, size_t) + /*@modifies p_pfile@*/ ; + +static void cppReader_appendIncludeChain +(cppReader *p_pfile, + /*@keep@*/ struct file_name_list *p_first, + /*@dependent@*/ struct file_name_list *p_last); + +static void cppReader_macroCleanup (cppBuffer *p_pbuf, cppReader *p_pfile); +static enum cpp_token cppReader_nullUnderflow (/*@unused@*/ cppReader *p_pfile); + +static void cppReader_nullCleanup (/*@unused@*/ cppBuffer *p_pbuf, + /*@unused@*/ cppReader *p_pfile); + +static void cppReader_fileCleanup (cppBuffer *p_pbuf, + /*@unused@*/ cppReader *p_pfile); + +static int cppReader_handleDirective (cppReader *p_pfile); + +static void cppReader_scanBuffer (cppReader *p_pfile); + +# ifdef WIN32 + +/* +** WIN32 (at least the VC++ include files) does not define mode_t. +*/ + +/*@-incondefs@*/ /*@-czechtypes@*/ +typedef unsigned int mode_t; +/*@=incondefs@*/ /*@=czechtypes@*/ + +# endif + +static int file_size_and_mode (int p_fd, /*@out@*/ mode_t *p_mode_pointer, + /*@out@*/ size_t *p_size_pointer); +static int safe_read (int p_desc, /*@out@*/ char *p_ptr, int p_len); + + +/* +** cppBuffer_isMacro is true if the buffer contains macro expansion. +** (Note that it is false while we're expanding marco *arguments*.) +*/ + +static bool cppBuffer_isMacro (/*@null@*/ cppBuffer *) /*@*/ ; + +static void path_include (cppReader *p_pfile, char *p_path) + /*@modifies p_pfile@*/ ; + +static void initialize_builtins (cppReader *p_pfile) + /*@modifies p_pfile@*/ ; + +static void initialize_char_syntax (struct cppOptions *p_opts) ; + +static int /*@alt void@*/ finclude (cppReader *p_pfile, int p_f, + cstring p_fname, + bool p_system_header_p, + /*@dependent@*/ /*@null@*/ struct file_name_list *p_dirptr); + +static void validate_else (cppReader *p_pfile, cstring p_directive); + +static void conditional_skip (cppReader *p_pfile, int p_skip, + enum node_type p_type, + /*@dependent@*/ /*@null@*/ char *p_control_macro); + +static HOST_WIDE_INT eval_if_expression (cppReader *p_pfile, + char *p_buf, + int p_length); + +static void skip_if_group (cppReader *p_pfile, int p_any); + +static bool comp_def_part (bool p_first, char *p_beg1, int p_len1, + char *p_beg2, int p_len2, bool p_last); + +#ifdef abort +extern void fancy_abort (); +#endif + +static bool redundant_include_p (cppReader *p_pfile, /*@null@*/ cstring p_name); +static bool is_system_include (cppReader *p_pfile, cstring p_filename); + +static /*@observer@*/ /*@null@*/ struct file_name_map * +read_name_map (cppReader *p_pfile, cstring p_dirname); + +static cstring read_filename_string (int p_ch, FILE *p_f); + +static int open_include_file (cppReader *p_pfile, + /*@owned@*/ cstring p_fname, + /*@null@*/ struct file_name_list *p_searchptr); + +static void push_macro_expansion (cppReader *, + /*@owned@*/ char *, size_t, + /*@dependent@*/ HASHNODE *); + +/* Last arg to output_line_command. */ +enum file_change_code { + same_file, enter_file, leave_file +}; + +/* `struct directive' defines one #-directive, including how to handle it. */ + +struct directive { + int length; /* Length of name */ + /*@null@*/ int (*func)(); /* Function to handle directive */ + /*@observer@*/ cstring name; /* Name of directive */ + enum node_type type; /* Code which describes which directive. */ + bool command_reads_line; /* One if rest of line is read by func. */ + bool traditional_comments; /* Nonzero: keep comments if -traditional. */ + bool pass_thru; /* Copy preprocessed directive to output file.*/ +}; + +/* These functions are declared to return int instead of void since they + are going to be placed in a table and some old compilers have trouble with + pointers to functions returning void. */ + +static int do_define (cppReader *, /*@null@*/ struct directive *, + char *, char *); +static int do_defineAux (cppReader *, /*@null@*/ struct directive *, + char *, char *, bool); + +static int do_line (cppReader *, /*@null@*/ struct directive *); +static int do_include (cppReader *, struct directive *, char *, char *); +static int do_undef (cppReader *, struct directive *, char *, char *); +static int do_error (cppReader *, struct directive *, char *, char *); +static int do_pragma (cppReader *, struct directive *, char *, char *); +static int do_ident (cppReader *, struct directive *, char *, char *); +static int do_if (cppReader *, struct directive *, char *, char *); +static int do_xifdef (cppReader *, struct directive *, char *, char *); +static int do_else (cppReader *, struct directive *, char *, char *); +static int do_elif (cppReader *, struct directive *, char *, char *); +static int do_endif (cppReader *, struct directive *, char *, char *); +static int do_warning (cppReader *, struct directive *, char *, char *); + +/* If a buffer's dir field is SELF_DIR_DUMMY, it means the file was found + via the same directory as the file that #included it. */ + +/*@constant observer struct file_name_list *SELF_DIR_DUMMY@*/ +#define SELF_DIR_DUMMY ((struct file_name_list *) (~0)) + +/* #include "file" looks in source file dir, then stack. */ +/* #include just looks in the stack. */ +/* -I directories are added to the end, then the defaults are added. */ + +/*@access cstring@*/ + +static struct default_include { + /*@dependent@*/ /*@observer@*/ cstring fname; /* The name of the directory. */ + int cplusplus; /* Only look here if we're compiling C++. */ + int cxx_aware; /* Includes in this directory don't need to + be wrapped in extern "C" when compiling + C++. */ +} include_defaults_array[] += { + /* This is the dir for fixincludes. Put it just before + the files that we fix. */ + { GCC_INCLUDE_DIR, 0, 0 }, + { GCC_INCLUDE_DIR2, 0, 0 }, + { cstring_undefined, 0, 0 } +}; + +/*@noaccess cstring@*/ + +/* Here is the actual list of #-directives, most-often-used first. + The initialize_builtins function assumes #define is the very first. */ + +/*@access cstring@*/ + +static struct directive directive_table[] = { + { 6, do_define, "define", T_DEFINE, FALSE, TRUE, FALSE }, + { 5, do_xifdef, "ifdef", T_IFDEF, TRUE, FALSE, FALSE }, + { 6, do_xifdef, "ifndef", T_IFNDEF, TRUE, FALSE, FALSE }, + { 7, do_include, "include", T_INCLUDE, TRUE, FALSE, FALSE }, + { 5, do_endif, "endif", T_ENDIF, TRUE, FALSE, FALSE }, + { 4, do_else, "else", T_ELSE, TRUE, FALSE, FALSE }, + { 2, do_if, "if", T_IF, TRUE, FALSE, FALSE }, + { 4, do_elif, "elif", T_ELIF, TRUE, FALSE, FALSE }, + { 5, do_undef, "undef", T_UNDEF, FALSE, FALSE, FALSE }, + { 5, do_error, "error", T_ERROR, FALSE, FALSE, FALSE }, + { 7, do_warning, "warning", T_WARNING, FALSE, FALSE, FALSE }, + { 6, do_pragma, "pragma", T_PRAGMA, FALSE, FALSE, TRUE}, + { 4, do_line, "line", T_LINE, TRUE, FALSE, FALSE }, + { 5, do_ident, "ident", T_IDENT, TRUE, FALSE, TRUE }, + /* { 8, do_unassert, "unassert", T_UNASSERT, TRUE, FALSE, FALSE }, */ + { -1, 0, "", T_UNUSED, FALSE, FALSE, FALSE }, +}; + +/*@noaccess cstring@*/ +/*@+charint@*/ + +static void +initialize_char_syntax (struct cppOptions *opts) +{ + char i; + + /* + * Set up is_idchar and is_idstart tables. These should be + * faster than saying (is_alpha (c) || c == '_'), etc. + * Set up these things before calling any routines tthat + * refer to them. + */ + + for (i = 'a'; i <= 'z'; i++) { + is_idchar[i - 'a' + 'A'] = TRUE; + is_idchar[(int) i] = TRUE; + is_idstart[i - 'a' + 'A'] = TRUE; + is_idstart[(int) i] = TRUE; + } + + for (i = '0'; i <= '9'; i++) + { + is_idchar[(int) i] = TRUE; + } + + is_idchar['_'] = TRUE; + is_idstart['_'] = TRUE; + is_idchar['$'] = opts->dollars_in_ident; + is_idstart['$'] = opts->dollars_in_ident; + + /* horizontal space table */ + is_hor_space[' '] = TRUE; + is_hor_space['\t'] = TRUE; + is_hor_space['\v'] = TRUE; + is_hor_space['\f'] = TRUE; + is_hor_space['\r'] = TRUE; + + is_space[' '] = TRUE; + is_space['\t'] = TRUE; + is_space['\v'] = TRUE; + is_space['\f'] = TRUE; + is_space['\n'] = TRUE; + is_space['\r'] = TRUE; +} + +bool isIdentifierChar (char c) +{ + return is_idchar[(int) c]; +} + +/* Place into P_PFILE a quoted string representing the string SRC. + Caller must reserve enough space in pfile->token_buffer. */ + +static void +quote_string (cppReader *pfile, char *src) +{ + char c; + + cppReader_putCharQ (pfile, '\"'); + for (;;) + { + switch ((c = *src++)) + { + default: + if (isprint (c)) + cppReader_putCharQ (pfile, c); + else + { + sprintf (cppReader_getPWritten (pfile), "\\%03o", + (unsigned int) c); + cppReader_adjustWritten (pfile, (size_t) 4); + } + /*@switchbreak@*/ break; + + case '\"': + case '\\': + cppReader_putCharQ (pfile, '\\'); + cppReader_putCharQ (pfile, c); + /*@switchbreak@*/ break; + + case '\0': + cppReader_putCharQ (pfile, '\"'); + cppReader_nullTerminateQ (pfile); + return; + } + } +} + +/* Re-allocates PFILE->token_buffer so it will hold at least N more chars. */ + +void +cppReader_growBuffer (cppReader *pfile, size_t n) +{ + size_t old_written = cppReader_getWritten (pfile); + pfile->token_buffer_size = n + 2 * pfile->token_buffer_size; + pfile->token_buffer = (char *) + drealloc (pfile->token_buffer, pfile->token_buffer_size); + cppReader_setWritten (pfile, old_written); +} + +/* + * process a given definition string, for initialization + * If STR is just an identifier, define it with value 1. + * If STR has anything after the identifier, then it should + * be identifier=definition. + */ + +void +cppReader_define (cppReader *pfile, char *str) +{ + char *buf = NULL; + char *p = str; + + DPRINTF (("Cpp reader define: %s", str)); + + if (!is_idstart[(int) *p]) + { + DPRINTF (("ERROR 1")); + cppReader_error (pfile, + message ("Malformed option `-D%s'", + cstring_fromChars (str))); + + return; + } + + p++; + + DPRINTF (("Here 2")); + + while (is_idchar[(int) *p]) + { + p++; + } + + if (*p == '(') { + p++; + while (*p != ')' && *p != '\0') { + p++; + } + + if (*p == ')') { + p++; + } else { + cppReader_error + (pfile, + message ("Malformed option: -D%s (no closing parenthesis)", + cstring_fromChars (str))); + } + } + + DPRINTF (("Here 2")); + + if (*p == '\0') + { + buf = (char *) dmalloc (size_fromInt (p - str + 4)); + strcpy ((char *) buf, str); + strcat ((char *) buf, " 1"); + } + else if (*p != '=') + { + DPRINTF (("ERROR 2")); + cppReader_error (pfile, + message ("Malformed option: -D%s (expected '=', found '%c')", + cstring_fromChars (str), + *p)); + return; + } + else + { + char *q; + /* Copy the entire option so we can modify it. */ + DPRINTF (("Copying...")); + buf = (char *) dmalloc (2 * strlen (str) + 1); + strncpy (buf, str, size_fromInt (p - str)); + + /* Change the = to a space. */ + buf[p - str] = ' '; + /* Scan for any backslash-newline and remove it. */ + p++; + q = &buf[p - str]; + + while (*p != '\0') + { + if (*p == '\\' && p[1] == '\n') + p += 2; + else + *q++ = *p++; + } + + DPRINTF (("Here we are...")); + *q = '\0'; + } + + llassert (buf != NULL); + DPRINTF (("Do define: %s / %ld", buf, size_toLong (strlen (buf)))); + (void) do_define (pfile, NULL, buf, buf + strlen (buf)); + sfree (buf); +} + +/* Append a chain of `struct file_name_list's + to the end of the main include chain. + FIRST is the beginning of the chain to append, and LAST is the end. */ + +void +cppReader_appendIncludeChain (cppReader *pfile, + struct file_name_list *first, + struct file_name_list *last) +{ + struct cppOptions *opts = CPPOPTIONS (pfile); + struct file_name_list *dir; + + if (first == NULL || last == NULL) + { + return; + } + + if (opts->include == 0) + { + opts->include = first; + } + else + { + llassert (opts->last_include->next == NULL); + opts->last_include->next = first; + } + + if (opts->first_bracket_include == 0) + { + opts->first_bracket_include = first; + + for (dir = first; ; dir = dir->next) { + int len = cstring_length (dir->fname) + INCLUDE_LEN_FUDGE; + if (len > pfile->max_include_len) + pfile->max_include_len = len; + if (dir == last) + break; + } + } + + llassert (last->next == NULL); + /* last->next = NULL; */ + opts->last_include = last; +} + +static /*@unused@*/ void +cppReader_showIncludeChain (cppReader *pfile) +{ + struct file_name_list *dirs = CPPOPTIONS (pfile)->include; + + if (dirs != NULL) + { + while (dirs != NULL) + { + fprintf (stderr, "*%s*:", cstring_toCharsSafe (dirs->fname)); + dirs = dirs->next; + } + + fprintf (stderr, "\n"); + } + else + { + fprintf (stderr, "No includes\n"); + } +} + +void +cppReader_addIncludeChain (cppReader *pfile, struct file_name_list *dir) +{ + struct cppOptions *opts = CPPOPTIONS (pfile); + + if (dir == 0) + { + return; + } + + if (opts->include == 0) + { + opts->include = dir; + } + else + { + llassert (opts->last_include->next == NULL); + opts->last_include->next = dir; + } + + if (opts->first_bracket_include == 0) + { + int len = cstring_length (dir->fname) + INCLUDE_LEN_FUDGE; + opts->first_bracket_include = dir; + if (len > pfile->max_include_len) + { + pfile->max_include_len = len; + } + } + + dir->next = NULL; + opts->last_include = dir; + /* cppReader_showIncludeChain (pfile); */ +} + +/* Given a colon-separated list of file names PATH, + add all the names to the search path for include files. */ + +static void +path_include (cppReader *pfile, char *path) +{ + char *p; + +#ifdef __CYGWIN32__ + char *win32temp; + + /* if we have a posix path list, convert to win32 path list */ + win32temp = (char *) dmalloc /*@i4@*/ + (cygwin32_posix_to_win32_path_list_buf_size (path)); + cygwin32_posix_to_win32_path_list (path, win32temp); + path = win32temp; +#endif + + p = path; + + if (*p != '\0') + while (1) { + char *q = p; + char *name; + struct file_name_list *dirtmp; + + /* Find the end of this name. */ + while (*q != '\0' && *q != PATH_SEPARATOR) + { + q++; + } + + if (p == q) + { + /* An empty name in the path stands for the current directory. */ + name = (char *) dmalloc ((size_t) 2); + name[0] = '.'; + name[1] = '\0'; + } + else + { + /* Otherwise use the directory that is named. */ + name = (char *) dmalloc (size_fromInt (q - p + 1)); + memcpy (name, p, size_fromInt (q - p)); + name[q - p] = '\0'; + } + + dirtmp = (struct file_name_list *) dmalloc (sizeof (*dirtmp)); + dirtmp->next = 0; /* New one goes on the end */ + dirtmp->control_macro = 0; + dirtmp->c_system_include_path = 0; + dirtmp->fname = cstring_fromChars (name); + dirtmp->got_name_map = 0; + cppReader_addIncludeChain (pfile, dirtmp); + + /* Advance past this name. */ + p = q; + if (*p == '\0') + break; + /* Skip the colon. */ + p++; + } +} + +void +cppOptions_init (cppOptions *opts) +{ + memset ((char *) opts, 0, sizeof *opts); + assertSet (opts); + + opts->in_fname = NULL; + opts->out_fname = NULL; + + /* Initialize is_idchar to allow $. */ + opts->dollars_in_ident = TRUE; + + opts->no_line_commands = 0; + opts->no_trigraphs = TRUE; + opts->put_out_comments = 1; + opts->print_include_names = 0; + opts->dump_macros = DUMP_DEFINITIONS; /* DUMP_NONE; */ + opts->no_output = 0; + opts->cplusplus = 0; + + opts->cplusplus_comments = 1; + opts->verbose = 0; + opts->lang_asm = 0; + opts->for_lint = 0; + opts->chill = 0; + opts->pedantic_errors = 0; + opts->inhibit_warnings = 0; + opts->warn_comments = 0; + opts->warnings_are_errors = 0; + + initialize_char_syntax (opts); +} + +enum cpp_token +cppReader_nullUnderflow (/*@unused@*/ cppReader *pfile) +{ + return CPP_EOF; +} + +void +cppReader_nullCleanup (/*@unused@*/ cppBuffer *pbuf, + /*@unused@*/ cppReader *pfile) +{ + ; +} + +void +cppReader_macroCleanup (cppBuffer *pbuf, /*@unused@*/ cppReader *pfile) +{ + HASHNODE *macro = pbuf->hnode; + + if (macro->type == T_DISABLED) + { + macro->type = T_MACRO; + } + + if (macro->type != T_MACRO || pbuf->buf != macro->value.defn->expansion) + { + sfree (pbuf->buf); + pbuf->buf = NULL; + } +} + +void +cppReader_fileCleanup (cppBuffer *pbuf, /*@unused@*/ cppReader *pfile) +{ + if (pbuf->buf != NULL) + { + sfree (pbuf->buf); + pbuf->buf = NULL; + } +} + +/* Assuming we have read '/'. + If this is the start of a comment (followed by '*' or '/'), + skip to the end of the comment, and return ' '. + Return EOF if we reached the end of file before the end of the comment. + If not the start of a comment, return '/'. */ + +static int +skip_comment (cppReader *pfile, /*@null@*/ long *linep) +{ + int c = 0; + + llassert (pfile->buffer != NULL); + llassert (pfile->buffer->cur != NULL); + + while (cppReader_peekC (pfile) == '\\' && cpp_peekN (pfile, 1) == '\n') + { + if (linep != NULL) + { + (*linep)++; + } + + cppReader_forward (pfile, 2); + } + + if (cppReader_peekC (pfile) == '*') + { + cppReader_forward (pfile, 1); + + for (;;) + { + int prev_c = c; + c = cppReader_getC (pfile); + + if (c == EOF) + { + return EOF; + } + + while (c == (int) '\\' && cppReader_peekC (pfile) == (int) '\n') + { + if (linep != NULL ) + { + (*linep)++; + } + + cppReader_forward (pfile, 1), c = cppReader_getC (pfile); + } + + if (prev_c == (int) '*' && c == (int) '/') + { + return (int) ' '; + } + + if (c == (int) '\n' && (linep != NULL)) + { + (*linep)++; + } + } + } + else if (cppReader_peekC (pfile) == '/' + && CPPOPTIONS (pfile)->cplusplus_comments) + { + cppReader_forward (pfile, 1); + + for (;;) + { + c = cppReader_getC (pfile); + + if (c == EOF) + { + /* Allow hash comment to be terminated by EOF. */ + return (int) ' '; + } + + while (c == (int) '\\' && cppReader_peekC (pfile) == '\n') + { + cppReader_forward (pfile, 1); + c = cppReader_getC (pfile); + + if (linep != NULL) + { + (*linep)++; + } + } + + if (c == (int) '\n') + { + /* Don't consider final '\n' to be part of comment. */ + cppReader_forward (pfile, -1); + return (int) ' '; + } + } + } + else + { + return (int) '/'; + } +} + +/* Skip whitespace \-newline and comments. Does not macro-expand. */ +int /*@alt void@*/ +cppSkipHspace (cppReader *pfile) +{ + int nspaces = 0; + + while (TRUE) + { + int c; + + llassert (pfile->buffer != NULL); + + c = cppReader_peekC (pfile); + + if (c == EOF) + { + return 0; /* FIXME */ + } + + if (is_hor_space[c]) + { + if ((c == '\f' || c == '\v') && cppReader_isPedantic (pfile)) + cppReader_pedwarn (pfile, + message ("%s in preprocessing directive", + c == '\f' + ? cstring_makeLiteralTemp ("formfeed") + : cstring_makeLiteralTemp ("vertical tab"))); + + nspaces++; + cppReader_forward (pfile, 1); + } + else if (c == '/') + { + cppReader_forward (pfile, 1); + c = skip_comment (pfile, NULL); + + if (c == '/') + { + cppReader_forward (pfile, -1); + } + + if (c == EOF || c == '/') + { + return nspaces; + } + } + else if (c == '\\' && cpp_peekN (pfile, 1) == '\n') + { + cppReader_forward (pfile, 2); + } + else if (c == '@' && CPPBUFFER (pfile)->has_escapes + && is_hor_space [cpp_peekN (pfile, 1)]) + { + cppReader_forward (pfile, 2); + } + else + { + return nspaces; + } + } +} + +/* Read the rest of the current line. + The line is appended to PFILE's output buffer. */ + +static void +copy_rest_of_line (cppReader *pfile) +{ + struct cppOptions *opts = CPPOPTIONS (pfile); + + for (;;) + { + int c; + int nextc; + + llassert (pfile->buffer != NULL); + + c = cppReader_getC (pfile); + switch (c) + { + case EOF: + goto end_directive; + case '\\': + if (cppReader_peekC (pfile) == '\n') + { + cppReader_forward (pfile, 1); + continue; + } + + /*@fallthrough@*/ case '\'': case '\"': + goto scan_directive_token; + + case '/': + nextc = cppReader_peekC (pfile); + + /* + ** was (opts->cplusplus_comments && nextc == '*') + ** yoikes! + */ + + if (nextc == '*' + || (opts->cplusplus_comments && nextc == '/')) + { + goto scan_directive_token; + } + /*@switchbreak@*/ break; + case '\f': + case '\v': + if (cppReader_isPedantic (pfile)) + cppReader_pedwarn (pfile, + message ("%s in preprocessing directive", + c == '\f' + ? cstring_makeLiteralTemp ("formfeed") + : cstring_makeLiteralTemp ("vertical tab"))); + /*@switchbreak@*/ break; + + case '\n': + cppReader_forward (pfile, -1); + goto end_directive; + scan_directive_token: + cppReader_forward (pfile, -1); + (void) cppGetToken (pfile); + continue; + } + cppReader_putChar (pfile, c); + } +end_directive: ; + cppReader_nullTerminate (pfile); +} + +void +cppReader_skipRestOfLine (cppReader *pfile) +{ + size_t old = cppReader_getWritten (pfile); + copy_rest_of_line (pfile); + cppReader_setWritten (pfile, old); +} + +/* Handle a possible # directive. + '#' has already been read. */ + +int +cppReader_handleDirective (cppReader *pfile) +{ + int c; + struct directive *kt = NULL; + int ident_length; + size_t after_ident = 0; + char *ident, *line_end = NULL; + size_t old_written = cppReader_getWritten (pfile); + int nspaces = cppSkipHspace (pfile); + + c = cppReader_peekC (pfile); + + if (c >= '0' && c <= '9') + { + /* Handle # followed by a line number. */ + if (cppReader_isPedantic (pfile)) + { + cppReader_pedwarnLit + (pfile, + cstring_makeLiteralTemp ("`#' followed by integer")); + } + + (void) do_line (pfile, NULL); + goto done_a_directive; + } + + + /* Now find the directive name. */ + + cppReader_putChar (pfile, '#'); + + parse_name (pfile, cppReader_getC (pfile)); + + llassert (pfile->token_buffer != NULL); + ident = pfile->token_buffer + old_written + 1; + + ident_length = cppReader_getPWritten (pfile) - ident; + + if (ident_length == 0 && cppReader_peekC (pfile) == '\n') + { + /* A line of just `#' becomes blank. */ + return 1; + } + + for (kt = directive_table; ; kt++) + { + if (kt->length <= 0) + { + return 0; /* goto not_a_directive; */ + } + + if (kt->length == ident_length + && (cstring_equalPrefix (kt->name, ident))) + { + break; + } + } + + if (kt->command_reads_line) + { + after_ident = 0; + } + else + { + /* Nonzero means do not delete comments within the directive. + #define needs this when -traditional. */ + bool comments = 1; /*cppReader_isTraditional (pfile) && kt->traditional_comments; */ + int save_put_out_comments = CPPOPTIONS (pfile)->put_out_comments; + CPPOPTIONS (pfile)->put_out_comments = comments; + after_ident = cppReader_getWritten (pfile); + copy_rest_of_line (pfile); + CPPOPTIONS (pfile)->put_out_comments = save_put_out_comments; + } + + + /* For #pragma and #define, we may want to pass through the directive. + Other directives may create output, but we don't want the directive + itself out, so we pop it now. For example #include may write a #line + command (see comment in do_include), and conditionals may emit + #failed ... #endfailed stuff. But note that popping the buffer + means the parameters to kt->func may point after pfile->limit + so these parameters are invalid as soon as something gets appended + to the token_buffer. */ + + line_end = cppReader_getPWritten (pfile); + + + if (!kt->pass_thru && kt->type != T_DEFINE) + { + cppReader_setWritten (pfile, old_written); + } + + llassert (pfile->token_buffer != NULL); + + /* was kt->pass_thru || */ + + if (kt->type == T_DEFINE + && cpp_shouldCheckMacro (pfile, pfile->token_buffer + old_written)) + { + char *p = pfile->token_buffer + old_written; + + /* + ** Still need to record value for preprocessing, so + ** #ifdef's, etc. using the value behave correctly. + */ + + (void) do_defineAux (pfile, kt, + pfile->token_buffer + after_ident, + line_end, + TRUE); + + if (*p == '#') + { + *p = ' '; + } + + SKIP_WHITE_SPACE (p); + + llassert (*p == 'd'); + *p++ = LLMRCODE[0]; + + llassert (*p == 'e'); + *p++ = LLMRCODE[1]; + + llassert (*p == 'f'); + *p++ = LLMRCODE[2]; + + llassert (*p == 'i'); + *p++ = LLMRCODE[3]; + + llassert (*p == 'n'); + *p++ = LLMRCODE[4]; + + llassert (*p == 'e'); + + /* + ** This is way-bogus. We use the last char to record the number of + ** spaces. Its too hard to get them back into the input stream. + */ + + if (nspaces > 9) nspaces = 9; + + *p++ = '0' + nspaces; + + return 0; /* not_a_directive */ + } + else if (kt->pass_thru) + { + /* Just leave the entire #define in the output stack. */ + return 0; /* not_a_directive */ + + } + else if (kt->type == T_DEFINE + && CPPOPTIONS (pfile)->dump_macros == DUMP_NAMES) + { + char *p = pfile->token_buffer + old_written + 7; /* Skip "#define". */ + SKIP_WHITE_SPACE (p); + + while (is_idchar[(int) *p]) + { + p++; + } + + pfile->limit = p; + cppReader_putChar (pfile, '\n'); + } + else if (kt->type == T_DEFINE) + { + cppReader_setWritten (pfile, old_written); + } + else + { + ; + } + +done_a_directive: + if (kt == NULL) { + return 1; + } else { + llassert (kt->func != NULL); + (void) (*kt->func) (pfile, kt, pfile->token_buffer + after_ident, line_end); + return 1; + } +} + +/* Pass a directive through to the output file. + BUF points to the contents of the directive, as a contiguous string. + LIMIT points to the first character past the end of the directive. + KEYWORD is the keyword-table entry for the directive. */ + +static void +pass_thru_directive (char *buf, char *limit, + cppReader *pfile, + struct directive *keyword) +{ + int keyword_length = keyword->length; + + cppReader_reserve (pfile, + size_fromInt (2 + keyword_length + (limit - buf))); + cppReader_putCharQ (pfile, '#'); + /*@-observertrans@*/ + cppReader_putStrN (pfile, cstring_toCharsSafe (keyword->name), + size_fromInt (keyword_length)); + /*:=observertrans@*/ + + if (limit != buf && buf[0] != ' ') + { + /* Was a bug, since reserve only used 1 + ... */ + cppReader_putCharQ (pfile, ' '); + } + + cppReader_putStrN (pfile, buf, size_fromInt (limit - buf)); +} + +/* Read a replacement list for a macro with parameters. + Build the DEFINITION structure. + Reads characters of text starting at BUF until END. + ARGLIST specifies the formal parameters to look for + in the text of the definition; NARGS is the number of args + in that list, or -1 for a macro name that wants no argument list. + MACRONAME is the macro name itself (so we can avoid recursive expansion) + and NAMELEN is its length in characters. + + Note that comments, backslash-newlines, and leading white space + have already been deleted from the argument. */ + +static DEFINITION * +collect_expansion (cppReader *pfile, char *buf, char *limit, + int nargs, /*@null@*/ struct arglist *arglist) +{ + DEFINITION *defn; + char *p, *lastp, *exp_p; + struct reflist *endpat = NULL; + /* Pointer to first nonspace after last ## seen. */ + char *concat = 0; + /* Pointer to first nonspace after last single-# seen. */ + char *stringify = 0; + size_t maxsize; + char expected_delimiter = '\0'; + + + /* Scan thru the replacement list, ignoring comments and quoted + strings, picking up on the macro calls. It does a linear search + thru the arg list on every potential symbol. Profiling might say + that something smarter should happen. */ + + if (limit < buf) + abort (); + + /* Find the beginning of the trailing whitespace. */ + p = buf; + + while (p < limit && is_space[(int) limit[-1]]) + { + limit--; + } + + /* Allocate space for the text in the macro definition. + Leading and trailing whitespace chars need 2 bytes each. + Each other input char may or may not need 1 byte, + so this is an upper bound. The extra 5 are for invented + leading and trailing newline-marker and final null. */ + maxsize = (sizeof (*defn) + (limit - p) + 5); + + /* Occurrences of '@' get doubled, so allocate extra space for them. */ + while (p < limit) + { + if (*p++ == '@') + { + maxsize++; + } + } + + defn = (DEFINITION *) dmalloc (maxsize); + defn->noExpand = FALSE; + defn->file = NULL; + defn->pattern = NULL; + defn->nargs = nargs; + defn->predefined = NULL; + + exp_p = defn->expansion = (char *) defn + sizeof (*defn); + + defn->line = 0; + defn->rest_args = NULL; + defn->args.argnames = NULL; + + lastp = exp_p; + + p = buf; + + /* Add one initial space escape-marker to prevent accidental + token-pasting (often removed by macroexpand). */ + *exp_p++ = '@'; + *exp_p++ = ' '; + + if (limit - p >= 2 && p[0] == '#' && p[1] == '#') { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("`##' at start of macro definition")); + p += 2; + } + + /* Process the main body of the definition. */ + while (p < limit) { + int skipped_arg = 0; + register char c = *p++; + + *exp_p++ = c; + + if (!cppReader_isTraditional (pfile)) { + switch (c) { + case '\'': + case '\"': + if (expected_delimiter != '\0') + { + if (c == expected_delimiter) + expected_delimiter = '\0'; + } + else + { + expected_delimiter = c; + } + /*@switchbreak@*/ break; + + case '\\': + if (p < limit && (expected_delimiter != '\0')) + { + /* In a string, backslash goes through + and makes next char ordinary. */ + *exp_p++ = *p++; + } + /*@switchbreak@*/ break; + + case '@': + /* An '@' in a string or character constant stands for itself, + and does not need to be escaped. */ + if (expected_delimiter == '\0') + { + *exp_p++ = c; + } + + /*@switchbreak@*/ break; + + case '#': + /* # is ordinary inside a string. */ + if (expected_delimiter != '\0') + { + /*@switchbreak@*/ break; + } + + if (p < limit && *p == '#') { + /* ##: concatenate preceding and following tokens. */ + /* Take out the first #, discard preceding whitespace. */ + exp_p--; + + /*@-usedef@*/ + while (exp_p > lastp && is_hor_space[(int) exp_p[-1]]) + { + --exp_p; + } + /*@=usedef@*/ + + /* Skip the second #. */ + p++; + /* Discard following whitespace. */ + SKIP_WHITE_SPACE (p); + concat = p; + if (p == limit) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("`##' at end of macro definition")); + } + } else if (nargs >= 0) { + /* Single #: stringify following argument ref. + Don't leave the # in the expansion. */ + exp_p--; + SKIP_WHITE_SPACE (p); + if (p == limit || ! is_idstart[(int) *p] + || (*p == 'L' && p + 1 < limit && (p[1] == '\'' || p[1] == '"'))) + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("`#' operator is not followed by a macro argument name")); + else + stringify = p; + } else { + ; /* BADBRANCH; */ + } + + /*@switchbreak@*/ break; + } + } else { + /* In -traditional mode, recognize arguments inside strings and + and character constants, and ignore special properties of #. + Arguments inside strings are considered "stringified", but no + extra quote marks are supplied. */ + switch (c) { + case '\'': + case '\"': + if (expected_delimiter != '\0') { + if (c == expected_delimiter) + expected_delimiter = '\0'; + } else + expected_delimiter = c; + /*@switchbreak@*/ break; + + case '\\': + /* Backslash quotes delimiters and itself, but not macro args. */ + if (expected_delimiter != '\0' && p < limit + && (*p == expected_delimiter || *p == '\\')) { + *exp_p++ = *p++; + continue; + } + /*@switchbreak@*/ break; + + case '/': + if (expected_delimiter != '\0') /* No comments inside strings. */ + /*@switchbreak@*/ break; + if (*p == '*') { + /* If we find a comment that wasn't removed by cppReader_handleDirective, + this must be -traditional. So replace the comment with + nothing at all. */ + exp_p--; + p += 1; + while (p < limit && !(p[-2] == '*' && p[-1] == '/')) + { + p++; + } + } + /*@switchbreak@*/ break; + } + } + + /* Handle the start of a symbol. */ + if (is_idchar[(int) c] && nargs > 0) { + char *id_beg = p - 1; + int id_len; + + --exp_p; + while (p != limit && is_idchar[(int) *p]) + { + p++; + } + + id_len = p - id_beg; + + if (is_idstart[(int) c] + && ! (id_len == 1 && c == 'L' && (*p == '\'' || *p == '"'))) { + register struct arglist *arg; + + for (arg = arglist; arg != NULL; arg = arg->next) { + struct reflist *tpat; + + if (arg->name[0] == c + && arg->length == id_len + && strncmp (arg->name, id_beg, size_fromInt (id_len)) == 0) { + char *p1; + + if (expected_delimiter && CPPOPTIONS (pfile)->warn_stringify) { + if (cppReader_isTraditional (pfile)) { + cppReader_warning (pfile, + message ("macro argument `%x' is stringified.", + cstring_prefix (cstring_fromChars (arg->name), id_len))); + } else { + cppReader_warning (pfile, + message ("macro arg `%x' would be stringified with -traditional.", + cstring_prefix (cstring_fromChars (arg->name), id_len))); + } + } + /* If ANSI, don't actually substitute inside a string. */ + if (!cppReader_isTraditional (pfile) && expected_delimiter) + /*@innerbreak@*/ break; + /* make a pat node for this arg and append it to the end of + the pat list */ + tpat = (struct reflist *) dmalloc (sizeof (*tpat)); + tpat->next = NULL; + tpat->raw_before = (concat == id_beg); + tpat->raw_after = 0; + tpat->rest_args = arg->rest_args; + tpat->stringify = (cppReader_isTraditional (pfile) + ? expected_delimiter != '\0' + : stringify == id_beg); + + if (endpat == NULL) + { + defn->pattern = tpat; + } + else + { + endpat->next = tpat; + /*@-branchstate@*/ + } /*:=branchstate@*/ + + endpat = tpat; + + tpat->argno = arg->argno; + tpat->nchars = exp_p - lastp; + + p1 = p; + + SKIP_WHITE_SPACE (p1); + + if (p1 + 2 <= limit && p1[0] == '#' && p1[1] == '#') + { + tpat->raw_after = 1; + } + + lastp = exp_p; /* place to start copying from next time */ + skipped_arg = 1; + + /*@innerbreak@*/ break; + } + } + } + + /* If this was not a macro arg, copy it into the expansion. */ + if (skipped_arg == 0) { + register char *lim1 = p; + p = id_beg; + + while (p != lim1) + { + *exp_p++ = *p++; + } + + if (stringify == id_beg) + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("`#' operator should be followed by a macro argument name")); + } + } + } + + if (!cppReader_isTraditional (pfile) && expected_delimiter == '\0') + { + /* If ANSI, put in a "@ " marker to prevent token pasting. + But not if "inside a string" (which in ANSI mode + happens only for -D option). */ + *exp_p++ = '@'; + *exp_p++ = ' '; + } + + *exp_p = '\0'; + + defn->length = size_fromInt (exp_p - defn->expansion); + + /* Crash now if we overrun the allocated size. */ + if (defn->length + 1 > maxsize) + { + llfatalbug (cstring_makeLiteral ("Maximum definition size exceeded.")); + } + + return defn; +} + +/* + * special extension string that can be added to the last macro argument to + * allow it to absorb the "rest" of the arguments when expanded. Ex: + * #define wow(a, b...) process (b, a, b) + * { wow (1, 2, 3); } -> { process (2, 3, 1, 2, 3); } + * { wow (one, two); } -> { process (two, one, two); } + * if this "rest_arg" is used with the concat token '##' and if it is not + * supplied then the token attached to with ## will not be outputted. Ex: + * #define wow (a, b...) process (b ## , a, ## b) + * { wow (1, 2); } -> { process (2, 1, 2); } + * { wow (one); } -> { process (one); { + */ + +/*@-readonlytrans@*/ +static char rest_extension[] = "..."; +/*:=readonlytrans@*/ + +/*@notfunction@*/ +#define REST_EXTENSION_LENGTH (sizeof (rest_extension) - 1) + +/* Create a DEFINITION node from a #define directive. Arguments are + as for do_define. */ + +static /*@null@*/ MACRODEF +create_definition (char *buf, char *limit, + cppReader *pfile, bool predefinition, + bool noExpand) +{ + char *bp; /* temp ptr into input buffer */ + char *symname; /* remember where symbol name starts */ + int sym_length; /* and how long it is */ + int rest_args = 0; /* really int! */ + int line; + int col; + cstring file = (CPPBUFFER (pfile) != NULL) + ? CPPBUFFER (pfile)->nominal_fname : cstring_makeLiteralTemp (""); + DEFINITION *defn; + int arglengths = 0; /* Accumulate lengths of arg names + plus number of args. */ + MACRODEF mdef; + + cppBuffer_lineAndColumn (CPPBUFFER (pfile), &line, &col); + + bp = buf; + + while (is_hor_space[(int) *bp]) + { + bp++; + } + + symname = bp; /* remember where it starts */ + + sym_length = cppReader_checkMacroName (pfile, bp, cstring_makeLiteralTemp ("macro")); + + bp += sym_length; + + /* Lossage will occur if identifiers or control keywords are broken + across lines using backslash. This is not the right place to take + care of that. */ + + if (*bp == '(') { + struct arglist *arg_ptrs = NULL; + int argno = 0; + + bp++; /* skip '(' */ + SKIP_WHITE_SPACE (bp); + + /* Loop over macro argument names. */ + while (*bp != ')') + { + struct arglist *temp = (struct arglist *) dmalloc (sizeof (*temp)); + temp->name = bp; + temp->next = arg_ptrs; + temp->argno = argno++; + temp->rest_args = 0; + + arg_ptrs = temp; + + if (rest_args != 0) + { + cppReader_pedwarn (pfile, + message ("another parameter follows `%s'", + cstring_fromChars (rest_extension))); + } + + if (!is_idstart[(int) *bp]) + { + cppReader_pedwarnLit (pfile, + cstring_makeLiteralTemp ("invalid character in macro parameter name")); + } + + /* Find the end of the arg name. */ + while (is_idchar[(int) *bp]) + { + bp++; + /* do we have a "special" rest-args extension here? */ + if (limit - bp > size_toInt (REST_EXTENSION_LENGTH) + && strncmp (rest_extension, bp, REST_EXTENSION_LENGTH) == 0) + { + rest_args = 1; + temp->rest_args = 1; + /*@innerbreak@*/ break; + } + } + + temp->length = bp - temp->name; + + if (rest_args != 0) + { + bp += REST_EXTENSION_LENGTH; + } + + arglengths += temp->length + 2; + SKIP_WHITE_SPACE (bp); + + if (temp->length == 0 || (*bp != ',' && *bp != ')')) { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("Parameter list for #define is not parseable")); + goto nope; + } + + if (*bp == ',') { + bp++; + SKIP_WHITE_SPACE (bp); + } + if (bp >= limit) { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("unterminated parameter list in `#define'")); + goto nope; + } + { + struct arglist *otemp; + + for (otemp = temp->next; otemp != NULL; otemp = otemp->next) + { + if (temp->length == otemp->length && + strncmp (temp->name, otemp->name, size_fromInt (temp->length)) == 0) { + cstring name = cstring_copyLength (temp->name, temp->length); + cppReader_error (pfile, + message ("duplicate argument name `%x' in `#define'", name)); + goto nope; + } + } + } + } + + ++bp; /* skip paren */ + SKIP_WHITE_SPACE (bp); + /* now everything from bp before limit is the definition. */ + defn = collect_expansion (pfile, bp, limit, argno, arg_ptrs); + defn->rest_args = rest_args; + + /* Now set defn->args.argnames to the result of concatenating + the argument names in reverse order + with comma-space between them. */ + defn->args.argnames = (char *) dmalloc (size_fromInt (arglengths + 1)); + + { + struct arglist *temp; + int i = 0; + for (temp = arg_ptrs; temp != NULL; temp = temp->next) { + memcpy (&defn->args.argnames[i], temp->name, size_fromInt (temp->length)); + i += temp->length; + if (temp->next != 0) { + defn->args.argnames[i++] = ','; + defn->args.argnames[i++] = ' '; + } + } + + defn->args.argnames[i] = '\0'; + } + + sfree (arg_ptrs); + } else { + /* Simple expansion or empty definition. */ + + if (bp < limit) + { + if (is_hor_space[(int) *bp]) { + bp++; + SKIP_WHITE_SPACE (bp); + } else { + switch (*bp) { + case '!': case '"': case '#': case '%': case '&': case '\'': + case ')': case '*': case '+': case ',': case '-': case '.': + case '/': case ':': case ';': case '<': case '=': case '>': + case '?': case '[': case '\\': case ']': case '^': case '{': + case '|': case '}': case '~': + cppReader_warning (pfile, + message ("Missing white space after #define %x", + cstring_prefix (cstring_fromChars (symname), + sym_length))); + break; + + default: + cppReader_pedwarn (pfile, + message ("Missing white space after #define %x", + cstring_prefix (cstring_fromChars (symname), + sym_length))); + break; + } + } + } + /* now everything from bp before limit is the definition. */ + defn = collect_expansion (pfile, bp, limit, -1, NULL); + defn->args.argnames = mstring_createEmpty (); + } + + defn->noExpand = noExpand; + DPRINTF (("No expand: %d", noExpand)); + + defn->line = line; + + /* not: llassert (cstring_isUndefined (defn->file)); */ + defn->file = file; + + /* OP is null if this is a predefinition */ + defn->predefined = predefinition; + mdef.defn = defn; + mdef.symnam = symname; + mdef.symlen = sym_length; + + return mdef; + +nope: + mdef.defn = NULL; + mdef.symnam = NULL; + return mdef; +} + +/* Check a purported macro name SYMNAME, and yield its length. + USAGE is the kind of name this is intended for. */ + +int cppReader_checkMacroName (cppReader *pfile, + char *symname, + cstring usage) +{ + char *p; + size_t sym_length; + + for (p = symname; is_idchar[(int) *p]; p++) + { + ; + } + + sym_length = size_fromInt (p - symname); + + if (sym_length == 0 + || (sym_length == 1 && *symname == 'L' && (*p == '\'' || *p == '"'))) + cppReader_error (pfile, message ("invalid %s name", usage)); + else if (!is_idstart[(int) *symname]) + { + char *msg = (char *) dmalloc (sym_length + 1); + memcpy (msg, symname, sym_length); + msg[sym_length] = '\0'; + cppReader_error (pfile, message ("invalid %s name `%s'", usage, + cstring_fromChars (msg))); + sfree (msg); + } + else + { + if ((strncmp (symname, "defined", 7) == 0) && sym_length == 7) + { + cppReader_error (pfile, message ("invalid %s name `defined'", usage)); + } + } + + return size_toInt (sym_length); +} + +/* Return zero if two DEFINITIONs are isomorphic. */ + +static bool +compare_defs (DEFINITION *d1, DEFINITION *d2) +{ + register struct reflist *a1, *a2; + register char *p1 = d1->expansion; + register char *p2 = d2->expansion; + bool first = TRUE; + + if (d1->nargs != d2->nargs) + { + return TRUE; + } + + llassert (d1->args.argnames != NULL); + llassert (d2->args.argnames != NULL); + + if (strcmp ((char *)d1->args.argnames, (char *)d2->args.argnames) != 0) + { + return TRUE; + } + + for (a1 = d1->pattern, a2 = d2->pattern; + (a1 != NULL) && (a2 != NULL); + a1 = a1->next, a2 = a2->next) { + if (!((a1->nchars == a2->nchars + && (strncmp (p1, p2, size_fromInt (a1->nchars)) == 0)) + || ! comp_def_part (first, p1, a1->nchars, p2, a2->nchars, 0)) + || a1->argno != a2->argno + || a1->stringify != a2->stringify + || a1->raw_before != a2->raw_before + || a1->raw_after != a2->raw_after) + return TRUE; + first = 0; + p1 += a1->nchars; + p2 += a2->nchars; + } + if (a1 != a2) + return TRUE; + + if (comp_def_part (first, p1, d1->length - (p1 - d1->expansion), + p2, d2->length - (p2 - d2->expansion), 1)) + return TRUE; + + return FALSE; +} + +/* Return TRUE if two parts of two macro definitions are effectively different. + One of the parts starts at BEG1 and has LEN1 chars; + the other has LEN2 chars at BEG2. + Any sequence of whitespace matches any other sequence of whitespace. + FIRST means these parts are the first of a macro definition; + so ignore leading whitespace entirely. + LAST means these parts are the last of a macro definition; + so ignore trailing whitespace entirely. */ + +static bool +comp_def_part (bool first, char *beg1, int len1, char *beg2, int len2, bool last) +{ + char *end1 = beg1 + len1; + char *end2 = beg2 + len2; + + if (first) { + while (beg1 != end1 && is_space[(int) *beg1]) { beg1++; } + while (beg2 != end2 && is_space[(int) *beg2]) { beg2++; } + } + if (last) { + while (beg1 != end1 && is_space[(int) end1[-1]]) { end1--; } + while (beg2 != end2 && is_space[(int) end2[-1]]) { end2--; } + } + while (beg1 != end1 && beg2 != end2) { + if (is_space[(int) *beg1] && is_space[(int) *beg2]) { + while (beg1 != end1 && is_space[(int) *beg1]) { beg1++; } + while (beg2 != end2 && is_space[(int) *beg2]) { beg2++; } + } else if (*beg1 == *beg2) { + beg1++; beg2++; + } else break; + } + return (beg1 != end1) || (beg2 != end2); +} + +/* Process a #define command. + BUF points to the contents of the #define command, as a contiguous string. + LIMIT points to the first character past the end of the definition. + KEYWORD is the keyword-table entry for #define, + or NULL for a "predefined" macro. */ + +static int +do_defineAux (cppReader *pfile, struct directive *keyword, + char *buf, char *limit, bool noExpand) +{ + int hashcode; + MACRODEF mdef; + HASHNODE *hp; + + DPRINTF (("Define aux: %d", noExpand)); + + mdef = create_definition (buf, limit, pfile, keyword == NULL, noExpand); + + if (mdef.defn == 0) + goto nope; + + hashcode = hashf (mdef.symnam, mdef.symlen, CPP_HASHSIZE); + + DPRINTF (("Macro: %s / %s", + cstring_copyLength (mdef.symnam, mdef.symlen), + bool_unparse (noExpand))); + + if ((hp = cppReader_lookup (mdef.symnam, mdef.symlen, hashcode)) != NULL) + { + bool ok = FALSE; + + /* Redefining a precompiled key is ok. */ + if (hp->type == T_PCSTRING) + ok = TRUE; + /* Redefining a macro is ok if the definitions are the same. */ + else if (hp->type == T_MACRO) + ok = !compare_defs (mdef.defn, hp->value.defn); + /* Redefining a constant is ok with -D. */ + else if (hp->type == T_CONST) + ok = !CPPOPTIONS (pfile)->done_initializing; + else { + BADBRANCH; + } + + /* Print the warning if it's not ok. */ + if (!ok) + { + /* + ** If we are passing through #define and #undef directives, do + ** that for this re-definition now. + */ + + if (CPPOPTIONS (pfile)->debug_output && (keyword != NULL)) + { + /* llassert (keyword != NULL); */ + pass_thru_directive (buf, limit, pfile, keyword); + } + + cpp_setLocation (pfile); + + if (hp->type == T_MACRO) + { + if (hp->value.defn->noExpand) + { + ; /* error will be reported checking macros */ + } + else + { + genppllerrorhint + (FLG_MACROREDEF, + message ("Macro %q already defined", + cstring_copyLength (mdef.symnam, mdef.symlen)), + message ("%q: Previous definition of %q", + fileloc_unparseRaw (hp->value.defn->file, + (int) hp->value.defn->line), + cstring_copyLength (mdef.symnam, mdef.symlen))); + } + } + else + { + genppllerror (FLG_MACROREDEF, + message ("Macro %q already defined", + cstring_copyLength (mdef.symnam, + mdef.symlen))); + + } + } + + /* Replace the old definition. */ + hp->type = T_MACRO; + hp->value.defn = mdef.defn; + } + else + { + /* + ** If we are passing through #define and #undef directives, do + ** that for this new definition now. + */ + + HASHNODE *hn; + + if (CPPOPTIONS (pfile)->debug_output && (keyword != NULL)) + { + pass_thru_directive (buf, limit, pfile, keyword); + } + + DPRINTF (("Define macro: %s / %d", + mdef.symnam, mdef.defn->noExpand)); + + hn = cppReader_installMacro (mdef.symnam, mdef.symlen, mdef.defn, hashcode); + /*@-branchstate@*/ + } /*:=branchstate@*/ + + return 0; + +nope: + + return 1; +} + +static int +do_define (cppReader *pfile, struct directive *keyword, + char *buf, char *limit) +{ + DPRINTF (("Regular do define")); + return do_defineAux (pfile, keyword, buf, limit, FALSE); +} + +/* This structure represents one parsed argument in a macro call. + `raw' points to the argument text as written (`raw_length' is its length). + `expanded' points to the argument's macro-expansion + (its length is `expand_length'). + `stringified_length' is the length the argument would have + if stringified. + `use_count' is the number of times this macro arg is substituted + into the macro. If the actual use count exceeds 10, + the value stored is 10. */ + +/* raw and expanded are relative to ARG_BASE */ +/*@notfunction@*/ +#define ARG_BASE ((pfile)->token_buffer) + +struct argdata { + /* Strings relative to pfile->token_buffer */ + long raw; + size_t expanded; + size_t stringified; + int raw_length; + int expand_length; + int stringified_length; + bool newlines; + int use_count; +}; + +/* Allocate a new cppBuffer for PFILE, and push it on the input buffer stack. + If BUFFER != NULL, then use the LENGTH characters in BUFFER + as the new input buffer. + Return the new buffer, or NULL on failure. */ + +/*@null@*/ /*@exposed@*/ cppBuffer * +cppReader_pushBuffer (cppReader *pfile, char *buffer, size_t length) +{ + cppBuffer *buf = cppReader_getBuffer (pfile); + + if (buf == pfile->buffer_stack) + { + cppReader_fatalError + (pfile, + message ("%s: macro or `#include' recursion too deep", + (buf->fname != NULL) + ? buf->fname + : cstring_makeLiteral (""))); + sfreeEventually (buffer); + return NULL; + } + + llassert (buf != NULL); + + buf--; + memset ((char *) buf, 0, sizeof (*buf)); + CPPBUFFER (pfile) = buf; + + buf->if_stack = pfile->if_stack; + buf->cleanup = cppReader_nullCleanup; + buf->underflow = cppReader_nullUnderflow; + buf->buf = buffer; + buf->cur = buf->buf; + + if (buffer != NULL) + { + buf->alimit = buf->rlimit = buffer + length; + } + else + { + buf->alimit = buf->rlimit = NULL; + } + + return buf; +} + +cppBuffer * +cppReader_popBuffer (cppReader *pfile) +{ + cppBuffer *buf = CPPBUFFER (pfile); + + llassert (buf != NULL); + + (void) (*buf->cleanup) (buf, pfile); + return ++CPPBUFFER (pfile); +} + +/* Scan until CPPBUFFER (PFILE) is exhausted into PFILE->token_buffer. + Pop the buffer when done. */ + +void +cppReader_scanBuffer (cppReader *pfile) +{ + cppBuffer *buffer = CPPBUFFER (pfile); + for (;;) + { + enum cpp_token token; + + token = cppGetToken (pfile); + + if (token == CPP_EOF) /* Should not happen ... */ + { + break; + } + + if (token == CPP_POP && CPPBUFFER (pfile) == buffer) + { + (void) cppReader_popBuffer (pfile); + break; + } + } +} + +/* + * Rescan a string (which may have escape marks) into pfile's buffer. + * Place the result in pfile->token_buffer. + * + * The input is copied before it is scanned, so it is safe to pass + * it something from the token_buffer that will get overwritten + * (because it follows cppReader_getWritten). This is used by do_include. + */ + +static void +cpp_expand_to_buffer (cppReader *pfile, char *buf, size_t length) +{ + register cppBuffer *ip; + char *limit = buf + length; + char *buf1, *p1, *p2; + + if (length < 0) + abort (); + + /* Set up the input on the input stack. */ + + buf1 = (char *) dmalloc (length + 1); + + p1 = buf; + p2 = buf1; + + while (p1 != limit) + { + *p2++ = *p1++; + } + + buf1[length] = '\0'; + + ip = cppReader_pushBuffer (pfile, buf1, length); + + if (ip == NULL) + return; + + ip->has_escapes = TRUE; + + /* Scan the input, create the output. */ + cppReader_scanBuffer (pfile); + + cppReader_nullTerminate (pfile); +} + +static void +adjust_position (char *buf, char *limit, int *linep, int *colp) +{ + while (buf < limit) + { + char ch = *buf++; + if (ch == '\n') + (*linep)++, (*colp) = 1; + else + (*colp)++; + } +} + +/* Move line_base forward, updating lineno and colno. */ + +static void +update_position (cppBuffer *pbuf) +{ + char *old_pos; + char *new_pos = pbuf->cur; + register struct parse_marker *mark; + + llassert (pbuf->buf != NULL); + old_pos = pbuf->buf + pbuf->line_base; + + for (mark = pbuf->marks; mark != NULL; mark = mark->next) + { + if (pbuf->buf + mark->position < new_pos) + new_pos = pbuf->buf + mark->position; + } + pbuf->line_base += new_pos - old_pos; + + llassert (old_pos != NULL); + llassert (new_pos != NULL); + + adjust_position (old_pos, new_pos, &pbuf->lineno, &pbuf->colno); +} + +void +cppBuffer_lineAndColumn (/*@null@*/ cppBuffer *pbuf, /*@out@*/ int *linep, + /*@null@*/ /*@out@*/ int *colp) +{ + int dummy; + + if (colp == NULL) + { + colp = &dummy; + /*@-branchstate@*/ + } /*:=branchstate@*/ + + if (pbuf != NULL) + { + *linep = pbuf->lineno; + *colp = pbuf->colno; + + llassert (pbuf->buf != NULL); + llassert (pbuf->cur != NULL); + + adjust_position (pbuf->buf + pbuf->line_base, pbuf->cur, linep, colp); + } + else + { + *linep = 0; + *colp = 0; + } +} + +/* Return the cppBuffer that corresponds to a file (not a macro). */ + +/*@exposed@*/ /*@null@*/ cppBuffer *cppReader_fileBuffer (cppReader *pfile) +{ + cppBuffer *ip = cppReader_getBuffer (pfile); + + for ( ; + ip != NULL && ip != cppReader_nullBuffer (pfile); + ip = cppBuffer_prevBuffer (ip)) + { + if (ip->fname != NULL) + { + return ip; + } + } + + return NULL; +} + +static long +count_newlines (char *buf, char *limit) +{ + register long count = 0; + + while (buf < limit) + { + char ch = *buf++; + if (ch == '\n') + count++; + } + return count; +} + +/* + * write out a #line command, for instance, after an #include file. + * If CONDITIONAL is nonzero, we can omit the #line if it would + * appear to be a no-op, and we can output a few newlines instead + * if we want to increase the line number by a small amount. + * FILE_CHANGE says whether we are entering a file, leaving, or neither. + */ + +static void +output_line_command (cppReader *pfile, bool conditional, + enum file_change_code file_change) +{ + int line, col; + cppBuffer *ip = CPPBUFFER (pfile); + cppBuffer *buf; + + llassert (ip != NULL); + + if (ip->fname == NULL) + return; + + update_position (ip); + + if (CPPOPTIONS (pfile)->no_line_commands + || CPPOPTIONS (pfile)->no_output) + return; + + buf = CPPBUFFER (pfile); + + llassert (buf != NULL); + + line = buf->lineno; + col = buf->colno; + + llassert (ip->cur != NULL); + + adjust_position (cppLineBase (ip), ip->cur, &line, &col); + + if (CPPOPTIONS (pfile)->no_line_commands) + return; + + if (conditional) { + if (line == pfile->lineno) + return; + + /* If the inherited line number is a little too small, + output some newlines instead of a #line command. */ + + if (line > pfile->lineno && line < pfile->lineno + 8) + { + cppReader_reserve (pfile, 20); + while (line > pfile->lineno) + { + cppReader_putCharQ (pfile, '\n'); + pfile->lineno++; + } + + return; + } + } + + cppReader_reserve (pfile, + size_fromInt (4 * cstring_length (ip->nominal_fname) + 50)); + + { +#ifdef OUTPUT_LINE_COMMANDS + static char sharp_line[] = "#line "; +#else + static char sharp_line[] = "# "; +#endif + cppReader_putStrN (pfile, sharp_line, sizeof(sharp_line)-1); + } + + sprintf (cppReader_getPWritten (pfile), "%d ", line); + cppReader_adjustWritten (pfile, strlen (cppReader_getPWritten (pfile))); + + quote_string (pfile, cstring_toCharsSafe (ip->nominal_fname)); + + if (file_change != same_file) { + cppReader_putCharQ (pfile, ' '); + cppReader_putCharQ (pfile, file_change == enter_file ? '1' : '2'); + } + /* Tell cc1 if following text comes from a system header file. */ + if (ip->system_header_p != '\0') { + cppReader_putCharQ (pfile, ' '); + cppReader_putCharQ (pfile, '3'); + } +#ifndef NO_IMPLICIT_EXTERN_C + /* Tell cc1plus if following text should be treated as C. */ + if (ip->system_header_p == (char) 2 && CPPOPTIONS (pfile)->cplusplus) { + cppReader_putCharQ (pfile, ' '); + cppReader_putCharQ (pfile, '4'); + } +#endif + cppReader_putCharQ (pfile, '\n'); + pfile->lineno = line; +} + + +/* + * Parse a macro argument and append the info on PFILE's token_buffer. + * REST_ARGS means to absorb the rest of the args. + * Return nonzero to indicate a syntax error. + */ + +static enum cpp_token +macarg (cppReader *pfile, int rest_args) +{ + int paren = 0; + enum cpp_token token; + char save_put_out_comments = CPPOPTIONS (pfile)->put_out_comments; + bool oldexpand = pfile->no_macro_expand; + CPPOPTIONS (pfile)->put_out_comments = 1; + + /* Try to parse as much of the argument as exists at this + input stack level. */ + + pfile->no_macro_expand = TRUE; + + for (;;) + { + token = cppGetToken (pfile); + + switch (token) + { + case CPP_EOF: + goto done; + case CPP_POP: + /* If we've hit end of file, it's an error (reported by caller). + Ditto if it's the end of cpp_expand_to_buffer text. + If we've hit end of macro, just continue. */ + if (!cppBuffer_isMacro (CPPBUFFER (pfile))) + goto done; + /*@switchbreak@*/ break; + case CPP_LPAREN: + paren++; + /*@switchbreak@*/ break; + case CPP_RPAREN: + if (--paren < 0) + goto found; + /*@switchbreak@*/ break; + case CPP_COMMA: + /* if we've returned to lowest level and + we aren't absorbing all args */ + if (paren == 0 && rest_args == 0) + goto found; + /*@switchbreak@*/ break; + found: + /* Remove ',' or ')' from argument buffer. */ + cppReader_adjustWritten (pfile, -1); + goto done; + default: + ; + } + } + +done: + CPPOPTIONS (pfile)->put_out_comments = save_put_out_comments; + pfile->no_macro_expand = oldexpand; + + return token; +} + + +/* Turn newlines to spaces in the string of length LENGTH at START, + except inside of string constants. + The string is copied into itself with its beginning staying fixed. */ + +static int +change_newlines (char *start, int length) +{ + register char *ibp; + register char *obp; + register char *limit; + char c; + + ibp = start; + limit = start + length; + obp = start; + + while (ibp < limit) { + *obp++ = c = *ibp++; + switch (c) { + + case '\'': + case '\"': + /* Notice and skip strings, so that we don't delete newlines in them. */ + { + char quotec = c; + while (ibp < limit) { + *obp++ = c = *ibp++; + if (c == quotec) + /*@innerbreak@*/ break; + if (c == '\n' && quotec == '\'') + /*@innerbreak@*/ break; + } + } + /*@switchbreak@*/ break; + } + } + + return obp - start; +} + +static /*@observer@*/ struct tm * +timestamp (/*@returned@*/ cppReader *pfile) +{ + if (pfile->timebuf == NULL) + { + time_t t = time ((time_t *) 0); + pfile->timebuf = localtime (&t); + } + + llassert (pfile->timebuf != NULL); + + return pfile->timebuf; +} + +static ob_mstring monthnames[] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", +} ; + +/* + * expand things like __FILE__. Place the expansion into the output + * buffer *without* rescanning. + */ + +static void +special_symbol (HASHNODE *hp, cppReader *pfile) +{ + cstring buf = cstring_undefined; + size_t len; + int true_indepth; + cppBuffer *ip; + struct tm *timebuf; + + int paren = 0; /* For special `defined' keyword */ + + for (ip = cppReader_getBuffer (pfile); ip != NULL; ip = cppBuffer_prevBuffer (ip)) + { + if (ip == cppReader_nullBuffer (pfile)) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("cccp error: not in any file?!")); + return; /* the show must go on */ + } + + if (ip != NULL && ip->fname != NULL) + { + break; + } + } + + switch (hp->type) + { + case T_FILE: + case T_BASE_FILE: + { + char *string; + if (hp->type == T_BASE_FILE) + { + while (cppBuffer_prevBuffer (ip) != cppReader_nullBuffer (pfile)) + { + ip = cppBuffer_prevBuffer (ip); + } + } + + llassert (ip != NULL); + string = cstring_toCharsSafe (ip->nominal_fname); + + if (string == NULL) + { + string = ""; + } + + cppReader_reserve (pfile, 3 + 4 * strlen (string)); + quote_string (pfile, string); + return; + } + + case T_INCLUDE_LEVEL: + true_indepth = 0; + ip = cppReader_getBuffer (pfile); + + for (; ip != cppReader_nullBuffer (pfile) && ip != NULL; + ip = cppBuffer_prevBuffer (ip)) + { + if (ip != NULL && ip->fname != NULL) + { + true_indepth++; + } + } + + buf = message ("%d", true_indepth - 1); + break; + + case T_VERSION: + buf = message ("\"%s\"", cstring_makeLiteralTemp (CPP_VERSION)); + break; + +#ifndef NO_BUILTIN_SIZE_TYPE + case T_SIZE_TYPE: + buf = cstring_makeLiteral (SIZE_TYPE); + break; +#endif + +#ifndef NO_BUILTIN_PTRDIFF_TYPE + case T_PTRDIFF_TYPE: + buf = cstring_makeLiteral (PTRDIFF_TYPE); + break; +#endif + + case T_WCHAR_TYPE: + buf = cstring_makeLiteral (cppReader_wcharType (pfile)); + break; + + case T_USER_LABEL_PREFIX_TYPE: + buf = cstring_makeLiteral (USER_LABEL_PREFIX); + break; + + case T_REGISTER_PREFIX_TYPE: + buf = cstring_makeLiteral (REGISTER_PREFIX); + break; + + case T_CONST: + buf = message ("%d", hp->value.ival); + break; + + case T_SPECLINE: + { + if (ip != NULL) + { + int line = ip->lineno; + int col = ip->colno; + + llassert (ip->cur != NULL); + adjust_position (cppLineBase (ip), ip->cur, &line, &col); + + buf = message ("%d", (int) line); + } + else + { + BADBRANCH; + } + } + break; + + case T_DATE: + case T_TIME: + { + char *sbuf = (char *) dmalloc (20); + timebuf = timestamp (pfile); + if (hp->type == T_DATE) + { + sprintf (sbuf, "\"%s %2d %4d\"", monthnames[timebuf->tm_mon], + timebuf->tm_mday, timebuf->tm_year + 1900); + } + else + { + sprintf (sbuf, "\"%02d:%02d:%02d\"", timebuf->tm_hour, timebuf->tm_min, + timebuf->tm_sec); + } + + buf = cstring_fromCharsNew (sbuf); + sfree (sbuf); + break; + } + + case T_SPEC_DEFINED: + buf = cstring_makeLiteral (" 0 "); /* Assume symbol is not defined */ + ip = cppReader_getBuffer (pfile); + + llassert (ip->cur != NULL); + SKIP_WHITE_SPACE (ip->cur); + + if (*ip->cur == '(') + { + paren++; + ip->cur++; /* Skip over the paren */ + SKIP_WHITE_SPACE (ip->cur); + } + + if (!is_idstart[(int) *ip->cur]) + goto oops; + if (ip->cur[0] == 'L' && (ip->cur[1] == '\'' || ip->cur[1] == '"')) + goto oops; + + if ((hp = cppReader_lookup (ip->cur, -1, -1)) != 0) + { + cstring_free (buf); + buf = cstring_makeLiteral (" 1 "); + } + + while (is_idchar[(int) *ip->cur]) + { + ++ip->cur; + } + + SKIP_WHITE_SPACE (ip->cur); + + if (paren != 0) + { + if (*ip->cur != ')') + goto oops; + ++ip->cur; + } + break; + + oops: + + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("`defined' without an identifier")); + break; + + default: + cpp_setLocation (pfile); + llfatalerror (message ("Pre-processing error: invalid special hash type")); + } + + len = size_fromInt (cstring_length (buf)); + + cppReader_reserve (pfile, len + 1); + cppReader_putStrN (pfile, cstring_toCharsSafe (buf), len); + cppReader_nullTerminateQ (pfile); + + cstring_free (buf); + return; +} + +/* Write out a #define command for the special named MACRO_NAME + to PFILE's token_buffer. */ + +static void +dump_special_to_buffer (cppReader *pfile, char *macro_name) +{ + static char define_directive[] = "#define "; + size_t macro_name_length = strlen (macro_name); + output_line_command (pfile, 0, same_file); + cppReader_reserve (pfile, sizeof(define_directive) + macro_name_length); + cppReader_putStrN (pfile, define_directive, sizeof(define_directive)-1); + cppReader_putStrN (pfile, macro_name, macro_name_length); + cppReader_putCharQ (pfile, ' '); + cpp_expand_to_buffer (pfile, macro_name, macro_name_length); + cppReader_putChar (pfile, '\n'); +} + +/* Initialize the built-in macros. */ + +static void +cppReader_installBuiltin (/*@observer@*/ char *name, ctype ctyp, + int len, enum node_type type, + int ivalue, /*@null@*/ /*@only@*/ char *value, + int hash) +{ + cstring sname = cstring_fromCharsNew (name); + + llassert (usymtab_inGlobalScope ()); + + /* + ** Be careful here: this is done before the ctype table has + ** been initialized. + */ + + if (!usymtab_exists (sname)) + { + uentry ue = uentry_makeConstant (sname, ctyp, fileloc_createBuiltin ()); + + if (ctype_equal (ctyp, ctype_string)) + { + qualList ql = qualList_new (); + ql = qualList_add (ql, QU_OBSERVER); + uentry_reflectQualifiers (ue, ql); + qualList_free (ql); + } + + usymtab_addGlobalEntry (ue); + } + else + { + ; + } + + (void) cppReader_install (name, len, type, ivalue, value, hash); + cstring_free (sname); +} + +static void +cppReader_installBuiltinType (/*@observer@*/ char *name, ctype ctyp, + int len, enum node_type type, + int ivalue, + /*@only@*/ /*@null@*/ char *value, int hash) +{ + cstring sname = cstring_fromCharsNew (name); + + llassert (usymtab_inGlobalScope ()); + + if (!usymtab_exists (sname)) + { + uentry ue = uentry_makeDatatype (sname, ctyp, + NO, NO, + fileloc_createBuiltin ()); + usymtab_addGlobalEntry (ue); + } + else + { + cstring_free (sname); + } + + (void) cppReader_install (name, len, type, ivalue, value, hash); +} + +static void +initialize_builtins (cppReader *pfile) +{ + cppReader_installBuiltin ("__LINE__", ctype_int, -1, T_SPECLINE, 0, NULL, -1); + cppReader_installBuiltin ("__DATE__", ctype_string, -1, T_DATE, 0, NULL, -1); + cppReader_installBuiltin ("__FILE__", ctype_string, -1, T_FILE, 0, NULL, -1); + cppReader_installBuiltin ("__BASE_FILE__", ctype_string, -1, T_BASE_FILE, 0, NULL, -1); + cppReader_installBuiltin ("__INCLUDE_LEVEL__", ctype_int, -1, T_INCLUDE_LEVEL, 0, NULL, -1); + cppReader_installBuiltin ("__VERSION__", ctype_string, -1, T_VERSION, 0, NULL, -1); +#ifndef NO_BUILTIN_SIZE_TYPE + cppReader_installBuiltinType ("__SIZE_TYPE__", ctype_anyintegral, -1, T_SIZE_TYPE, 0, NULL, -1); +#endif +#ifndef NO_BUILTIN_PTRDIFF_TYPE + cppReader_installBuiltinType ("__PTRDIFF_TYPE__ ", ctype_anyintegral, -1, T_PTRDIFF_TYPE, 0, NULL, -1); +#endif + cppReader_installBuiltinType ("__WCHAR_TYPE__", ctype_anyintegral, -1, T_WCHAR_TYPE, 0, NULL, -1); + cppReader_installBuiltin ("__USER_LABEL_PREFIX__", ctype_string, -1, T_USER_LABEL_PREFIX_TYPE, 0, NULL, -1); + cppReader_installBuiltin ("__REGISTER_PREFIX__", ctype_string, -1, T_REGISTER_PREFIX_TYPE, 0, NULL, -1); + cppReader_installBuiltin ("__TIME__", ctype_string, -1, T_TIME, 0, NULL, -1); + + /* + ** No, don't define __STDC__ + ** + + if (!cppReader_isTraditional (pfile)) + { + cppReader_installBuiltin ("__STDC__", ctype_int, -1, T_CONST, STDC_VALUE, NULL, -1); + } + + ** + */ + +# ifdef WIN32 + cppReader_installBuiltin ("_WIN32", ctype_int, -1, T_CONST, STDC_VALUE, NULL, -1); +# endif + + /* + ** This is supplied using a -D by the compiler driver + ** so that it is present only when truly compiling with GNU C. + */ + + /* cppReader_install ("__GNUC__", -1, T_CONST, 2, 0, -1); */ + + cppReader_installBuiltin ("__LCLINT__", ctype_int, -1, T_CONST, 2, NULL, -1); + + if (CPPOPTIONS (pfile)->debug_output) + { + dump_special_to_buffer (pfile, "__BASE_FILE__"); + dump_special_to_buffer (pfile, "__VERSION__"); +#ifndef NO_BUILTIN_SIZE_TYPE + dump_special_to_buffer (pfile, "__SIZE_TYPE__"); +#endif +#ifndef NO_BUILTIN_PTRDIFF_TYPE + dump_special_to_buffer (pfile, "__PTRDIFF_TYPE__"); +#endif + dump_special_to_buffer (pfile, "__WCHAR_TYPE__"); + dump_special_to_buffer (pfile, "__DATE__"); + dump_special_to_buffer (pfile, "__TIME__"); + if (!cppReader_isTraditional (pfile)) + dump_special_to_buffer (pfile, "__STDC__"); + } +} + + +/* Return 1 iff a token ending in C1 followed directly by a token C2 + could cause mis-tokenization. */ + +static bool +unsafe_chars (char c1, char c2) +{ + switch (c1) + { + case '+': case '-': + if (c2 == c1 || c2 == '=') + return 1; + goto letter; + case '.': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case 'e': case 'E': case 'p': case 'P': + if (c2 == '-' || c2 == '+') + return 1; /* could extend a pre-processing number */ + goto letter; + case 'L': + if (c2 == '\'' || c2 == '\"') + return 1; /* Could turn into L"xxx" or L'xxx'. */ + goto letter; + letter: + case '_': + case 'a': case 'b': case 'c': case 'd': case 'f': + case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': + case 'm': case 'n': case 'o': case 'q': case 'r': + case 's': case 't': case 'u': case 'v': case 'w': case 'x': + case 'y': case 'z': + case 'A': case 'B': case 'C': case 'D': case 'F': + case 'G': case 'H': case 'I': case 'J': case 'K': + case 'M': case 'N': case 'O': case 'Q': case 'R': + case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': + case 'Y': case 'Z': + /* We're in the middle of either a name or a pre-processing number. */ + return (is_idchar[(int) c2] || c2 == '.'); + case '<': case '>': case '!': case '%': case '#': case ':': + case '^': case '&': case '|': case '*': case '/': case '=': + return (c2 == c1 || c2 == '='); + } + return 0; +} + +/* Expand a macro call. + HP points to the symbol that is the macro being called. + Put the result of expansion onto the input stack + so that subsequent input by our caller will use it. + + If macro wants arguments, caller has already verified that + an argument list follows; arguments come from the input stack. */ + +static void +macroexpand (cppReader *pfile, /*@dependent@*/ HASHNODE *hp) +{ + int nargs; + DEFINITION *defn = hp->value.defn; + char *xbuf; + char *oxbuf = NULL; + int start_line; + int start_column; + size_t xbuf_len; + size_t old_written = cppReader_getWritten (pfile); + int rest_args; + int rest_zero = 0; + int i; + struct argdata *args = NULL; + + pfile->output_escapes++; + + cppBuffer_lineAndColumn (cppReader_fileBuffer (pfile), &start_line, &start_column); + + nargs = defn->nargs; + + if (nargs >= 0) + { + enum cpp_token token = CPP_EOF; + + args = (struct argdata *) dmalloc ((nargs + 1) * sizeof (*args)); + + for (i = 0; i < nargs; i++) + { + args[i].expanded = 0; + args[i].raw = 0; + args[i].raw_length = 0; + args[i].expand_length = args[i].stringified_length = -1; + args[i].use_count = 0; + } + + /* + ** Parse all the macro args that are supplied. I counts them. + ** The first NARGS args are stored in ARGS. + ** The rest are discarded. If rest_args is set then we assume + ** macarg absorbed the rest of the args. + */ + + i = 0; + rest_args = 0; + + cppReader_forward (pfile, 1); /* Discard the open-parenthesis before the first arg. */ + do + { + if (rest_args != 0) + { + continue; + } + + if (i < nargs || (nargs == 0 && i == 0)) + { + /* if we are working on last arg which absorbs rest of args... */ + if (i == nargs - 1 && defn->rest_args) + { + rest_args = 1; + } + + args[i].raw = size_toLong (cppReader_getWritten (pfile)); + token = macarg (pfile, rest_args); + args[i].raw_length = cppReader_getWritten (pfile) - args[i].raw; + args[i].newlines = FALSE; /* FIXME */ + } + else + { + token = macarg (pfile, 0); + } + + if (token == CPP_EOF || token == CPP_POP) + { + cppReader_errorWithLine (pfile, start_line, start_column, + cstring_fromCharsNew ("unterminated macro call")); + sfree (args); + return; + } + i++; + } while (token == CPP_COMMA); + + /* If we got one arg but it was just whitespace, call that 0 args. */ + if (i == 1) + { + char *bp; + char *lim; + + assertSet (args); + + bp = ARG_BASE + args[0].raw; + lim = bp + args[0].raw_length; + + /* cpp.texi says for foo ( ) we provide one argument. + However, if foo wants just 0 arguments, treat this as 0. */ + + if (nargs == 0) + { + while (bp != lim && is_space[(int) *bp]) + { + bp++; + } + } + + if (bp == lim) + i = 0; + } + + /* Don't output an error message if we have already output one for + a parse error above. */ + rest_zero = 0; + + if (nargs == 0 && i > 0) + { + cppReader_error (pfile, + message ("arguments given to macro `%s'", hp->name)); + } + else if (i < nargs) + { + /* traditional C allows foo() if foo wants one argument. */ + if (nargs == 1 && i == 0 && cppReader_isTraditional (pfile)) + { + ; + } + /* the rest args token is allowed to absorb 0 tokens */ + else if (i == nargs - 1 && defn->rest_args) + rest_zero = 1; + else if (i == 0) + cppReader_error (pfile, + message ("macro `%s' used without args", hp->name)); + else if (i == 1) + cppReader_error (pfile, + message ("macro `%s' used with just one arg", hp->name)); + else + { + cppReader_error (pfile, + message ("macro `%s' used with only %d args", + hp->name, i)); + } + } + else if (i > nargs) + { + cppReader_error (pfile, + message ("macro `%s' used with too many (%d) args", hp->name, i)); + } + else + { + ; + } + } + + /* If macro wants zero args, we parsed the arglist for checking only. + Read directly from the macro definition. */ + + if (nargs <= 0) + { + xbuf = defn->expansion; + xbuf_len = defn->length; + } + else + { + char *exp = defn->expansion; + int offset; /* offset in expansion, + copied a piece at a time */ + size_t totlen; /* total amount of exp buffer filled so far */ + + register struct reflist *ap, *last_ap; + + /* Macro really takes args. Compute the expansion of this call. */ + + /* Compute length in characters of the macro's expansion. + Also count number of times each arg is used. */ + xbuf_len = defn->length; + + llassert (args != NULL); + + for (ap = defn->pattern; ap != NULL; ap = ap->next) + { + if (ap->stringify) + { + struct argdata *arg = &args[ap->argno]; + + /* Stringify it it hasn't already been */ + assertSet (arg); + + if (arg->stringified_length < 0) + { + int arglen = arg->raw_length; + bool escaped = FALSE; + char in_string = '\0'; + char c; + + /* Initially need_space is -1. Otherwise, 1 means the + previous character was a space, but we suppressed it; + 0 means the previous character was a non-space. */ + int need_space = -1; + + i = 0; + arg->stringified = cppReader_getWritten (pfile); + if (!cppReader_isTraditional (pfile)) + cppReader_putChar (pfile, '\"'); /* insert beginning quote */ + for (; i < arglen; i++) + { + c = (ARG_BASE + arg->raw)[i]; + + if (in_string == '\0') + { + /* Internal sequences of whitespace are replaced by + one space except within an string or char token.*/ + if (is_space[(int) c]) + { + if (cppReader_getWritten (pfile) > arg->stringified + && (cppReader_getPWritten (pfile))[-1] == '@') + { + /* "@ " escape markers are removed */ + cppReader_adjustWritten (pfile, -1); + /*@innercontinue@*/ continue; + } + if (need_space == 0) + need_space = 1; + /*@innercontinue@*/ continue; + } + else if (need_space > 0) + cppReader_putChar (pfile, ' '); + else + { + ; + } + + need_space = 0; + } + + if (escaped) + escaped = 0; + else + { + if (c == '\\') + escaped = 1; + + if (in_string != '\0') + { + if (c == in_string) + in_string = '\0'; + } + else if (c == '\"' || c == '\'') + { + in_string = c; + } + else + { + ; + } + } + + /* Escape these chars */ + if (c == '\"' || (in_string != '\0' && c == '\\')) + cppReader_putChar (pfile, '\\'); + if (isprint (c)) + cppReader_putChar (pfile, c); + else + { + cppReader_reserve (pfile, 4); + sprintf (cppReader_getPWritten (pfile), "\\%03o", + (unsigned int) c); + cppReader_adjustWritten (pfile, 4); + } + } + if (!cppReader_isTraditional (pfile)) + cppReader_putChar (pfile, '\"'); /* insert ending quote */ + arg->stringified_length + = size_toInt (cppReader_getWritten (pfile) - arg->stringified); + } + + xbuf_len += args[ap->argno].stringified_length; + } + else if (ap->raw_before || ap->raw_after || cppReader_isTraditional (pfile)) + { + /* Add 4 for two newline-space markers to prevent + token concatenation. */ + xbuf_len += args[ap->argno].raw_length + 4; + } + else + { + /* We have an ordinary (expanded) occurrence of the arg. + So compute its expansion, if we have not already. */ + + if (args[ap->argno].expand_length < 0) + { + args[ap->argno].expanded = cppReader_getWritten (pfile); + cpp_expand_to_buffer (pfile, + ARG_BASE + args[ap->argno].raw, + size_fromInt (args[ap->argno].raw_length)); + + args[ap->argno].expand_length + = size_toInt (cppReader_getWritten (pfile) - args[ap->argno].expanded); + } + + /* Add 4 for two newline-space markers to prevent + token concatenation. */ + xbuf_len += args[ap->argno].expand_length + 4; + } + if (args[ap->argno].use_count < 10) + args[ap->argno].use_count++; + } + + xbuf = (char *) dmalloc (xbuf_len + 1); + oxbuf = xbuf; + + /* + ** Generate in XBUF the complete expansion + ** with arguments substituted in. + ** TOTLEN is the total size generated so far. + ** OFFSET is the index in the definition + ** of where we are copying from. + */ + + offset = 0; + totlen = 0; + + for (last_ap = NULL, ap = defn->pattern; ap != NULL; + last_ap = ap, ap = ap->next) + { + register struct argdata *arg = &args[ap->argno]; + size_t count_before = totlen; + + /* Add chars to XBUF. */ + for (i = 0; i < ap->nchars; i++, offset++) + { + xbuf[totlen++] = exp[offset]; + } + + /* If followed by an empty rest arg with concatenation, + delete the last run of nonwhite chars. */ + if (rest_zero && totlen > count_before + && ((ap->rest_args && ap->raw_before) + || (last_ap != NULL && last_ap->rest_args + && last_ap->raw_after))) + { + /* Delete final whitespace. */ + while (totlen > count_before && is_space[(int) xbuf[totlen - 1]]) + { + totlen--; + } + + /* Delete the nonwhites before them. */ + while (totlen > count_before && ! is_space[(int) xbuf[totlen - 1]]) + { + totlen--; + } + } + + if (ap->stringify != 0) + { + assertSet(arg); + memcpy (xbuf + totlen, + ARG_BASE + arg->stringified, + size_fromInt (arg->stringified_length)); + totlen += arg->stringified_length; + } + else if (ap->raw_before || ap->raw_after || cppReader_isTraditional (pfile)) + { + char *p1; + char *l1; + + assertSet (arg); + + p1 = ARG_BASE + arg->raw; + l1 = p1 + arg->raw_length; + + if (ap->raw_before) + { + while (p1 != l1 && is_space[(int) *p1]) + { + p1++; + } + + while (p1 != l1 && is_idchar[(int) *p1]) + { + xbuf[totlen++] = *p1++; + } + + /* Delete any no-reexpansion marker that follows + an identifier at the beginning of the argument + if the argument is concatenated with what precedes it. */ + if (p1[0] == '@' && p1[1] == '-') + p1 += 2; + } + if (ap->raw_after) + { + /* Arg is concatenated after: delete trailing whitespace, + whitespace markers, and no-reexpansion markers. */ + while (p1 != l1) + { + if (is_space[(int) l1[-1]]) l1--; + else if (l1[-1] == '-') + { + char *p2 = l1 - 1; + /* If a `-' is preceded by an odd number of newlines then it + and the last newline are a no-reexpansion marker. */ + while (p2 != p1 && p2[-1] == '\n') + { + p2--; + } + + if (((l1 - 1 - p2) & 1) != 0) + { + l1 -= 2; + } + else + { + /*@innerbreak@*/ break; + } + } + else + { + /*@innerbreak@*/ break; + } + } + } + + memcpy (xbuf + totlen, p1, size_fromInt (l1 - p1)); + totlen += l1 - p1; + } + else + { + char *expanded; + + assertSet (arg); + expanded = ARG_BASE + arg->expanded; + + if (!ap->raw_before && totlen > 0 + && (arg->expand_length != 0) + && !cppReader_isTraditional(pfile) + && unsafe_chars (xbuf[totlen-1], expanded[0])) + { + xbuf[totlen++] = '@'; + xbuf[totlen++] = ' '; + } + + memcpy (xbuf + totlen, expanded, + size_fromInt (arg->expand_length)); + totlen += arg->expand_length; + + if (!ap->raw_after && totlen > 0 + && offset < size_toInt (defn->length) + && !cppReader_isTraditional(pfile) + && unsafe_chars (xbuf[totlen-1], exp[offset])) + { + xbuf[totlen++] = '@'; + xbuf[totlen++] = ' '; + } + + /* If a macro argument with newlines is used multiple times, + then only expand the newlines once. This avoids creating + output lines which don't correspond to any input line, + which confuses gdb and gcov. */ + if (arg->use_count > 1 && arg->newlines > 0) + { + /* Don't bother doing change_newlines for subsequent + uses of arg. */ + arg->use_count = 1; + arg->expand_length + = change_newlines (expanded, arg->expand_length); + } + } + + if (totlen > xbuf_len) + abort (); + } + + /* if there is anything left of the definition + after handling the arg list, copy that in too. */ + + for (i = offset; i < size_toInt (defn->length); i++) + { + /* if we've reached the end of the macro */ + if (exp[i] == ')') + rest_zero = 0; + if (! (rest_zero && last_ap != NULL && last_ap->rest_args + && last_ap->raw_after)) + xbuf[totlen++] = exp[i]; + } + + xbuf[totlen] = '\0'; + xbuf_len = totlen; + } + + pfile->output_escapes--; + + /* Now put the expansion on the input stack + so our caller will commence reading from it. */ + push_macro_expansion (pfile, xbuf, xbuf_len, hp); + cppReader_getBuffer (pfile)->has_escapes = 1; + + /* Pop the space we've used in the token_buffer for argument expansion. */ + cppReader_setWritten (pfile, old_written); + + /* Recursive macro use sometimes works traditionally. + #define foo(x,y) bar (x (y,0), y) + foo (foo, baz) */ + + if (!cppReader_isTraditional (pfile)) + hp->type = T_DISABLED; + + sfree (args); +} + +static void +push_macro_expansion (cppReader *pfile, char *xbuf, size_t xbuf_len, + /*@dependent@*/ HASHNODE *hp) +{ + cppBuffer *mbuf = cppReader_pushBuffer (pfile, xbuf, xbuf_len); + + if (mbuf == NULL) + { + return; + } + + mbuf->cleanup = cppReader_macroCleanup; + + llassert (mbuf->hnode == NULL); + mbuf->hnode = hp; + + /* The first chars of the expansion should be a "@ " added by + collect_expansion. This is to prevent accidental token-pasting + between the text preceding the macro invocation, and the macro + expansion text. + + We would like to avoid adding unneeded spaces (for the sake of + tools that use cpp, such as imake). In some common cases we can + tell that it is safe to omit the space. + + The character before the macro invocation cannot have been an + idchar (or else it would have been pasted with the idchars of + the macro name). Therefore, if the first non-space character + of the expansion is an idchar, we do not need the extra space + to prevent token pasting. + + Also, we don't need the extra space if the first char is '(', + or some other (less common) characters. */ + + if (xbuf[0] == '@' && xbuf[1] == ' ' + && (is_idchar[(int) xbuf[2]] || xbuf[2] == '(' || xbuf[2] == '\'' + || xbuf[2] == '\"')) + { + llassert (mbuf->cur != NULL); + mbuf->cur += 2; + } +} + + +/* Like cppGetToken, except that it does not read past end-of-line. + Also, horizontal space is skipped, and macros are popped. */ + +static enum cpp_token +get_directive_token (cppReader *pfile) +{ + for (;;) + { + size_t old_written = cppReader_getWritten (pfile); + enum cpp_token token; + cppSkipHspace (pfile); + if (cppReader_peekC (pfile) == '\n') + { + return CPP_VSPACE; + } + + token = cppGetToken (pfile); + + switch (token) + { + case CPP_POP: + if (!cppBuffer_isMacro (cppReader_getBuffer (pfile))) + return token; + /*@fallthrough@*/ + case CPP_HSPACE: + case CPP_COMMENT: + cppReader_setWritten (pfile, old_written); + /*@switchbreak@*/ break; + default: + return token; + } + } +} + + +/* Handle #include and #import. + This function expects to see "fname" or on the input. + + The input is normally in part of the output_buffer following + cppReader_getWritten, and will get overwritten by output_line_command. + I.e. in input file specification has been popped by cppReader_handleDirective. + This is safe. */ + +static int +do_include (cppReader *pfile, struct directive *keyword, + /*@unused@*/ char *unused1, /*@unused@*/ char *unused2) +{ + bool skip_dirs = (keyword->type == T_INCLUDE_NEXT); + cstring fname; + char *fbeg, *fend; /* Beginning and end of fname */ + enum cpp_token token; + + /* Chain of dirs to search */ + struct file_name_list *search_start = CPPOPTIONS (pfile)->include; + struct file_name_list dsp[1]; /* First in chain, if #include "..." */ + struct file_name_list *searchptr = NULL; + size_t old_written = cppReader_getWritten (pfile); + + int flen; + + int f; /* file number */ + int angle_brackets = 0; /* 0 for "...", 1 for <...> */ + f= -1; /* JF we iz paranoid! */ + + + pfile->parsing_include_directive++; + token = get_directive_token (pfile); + pfile->parsing_include_directive--; + + if (token == CPP_STRING) + { + /* FIXME - check no trailing garbage */ + fbeg = pfile->token_buffer + old_written + 1; + fend = cppReader_getPWritten (pfile) - 1; + if (fbeg[-1] == '<') + { + angle_brackets = 1; + /* If -I-, start with the first -I dir after the -I-. */ + if (CPPOPTIONS (pfile)->first_bracket_include != NULL) + search_start = CPPOPTIONS (pfile)->first_bracket_include; + } + /* If -I- was specified, don't search current dir, only spec'd ones. */ + else if (!CPPOPTIONS (pfile)->ignore_srcdir) + { + cppBuffer *fp = CPPBUFFER (pfile); + /* We have "filename". Figure out directory this source + file is coming from and put it on the front of the list. */ + + for ( ; fp != cppReader_nullBuffer (pfile); fp = cppBuffer_prevBuffer (fp)) + { + int n; + char *ep,*nam; + + llassert (fp != NULL); + + nam = NULL; + + if (cstring_isDefined (fp->nominal_fname)) + { + nam = cstring_toCharsSafe (fp->nominal_fname); + + /* Found a named file. Figure out dir of the file, + and put it in front of the search list. */ + dsp[0].next = search_start; + search_start = dsp; +#ifndef VMS + ep = strrchr (nam, CONNECTCHAR); +#else /* VMS */ + ep = strrchr (nam, ']'); + if (ep == NULL) ep = strrchr (nam, '>'); + if (ep == NULL) ep = strrchr (nam, ':'); + if (ep != NULL) ep++; +#endif /* VMS */ + if (ep != NULL) + { + char save; + + n = ep - nam; + save = nam[n]; + nam[n] = '\0'; + dsp[0].fname = cstring_fromChars (nam); + nam[n] = save; + + if (n + INCLUDE_LEN_FUDGE > pfile->max_include_len) + pfile->max_include_len = n + INCLUDE_LEN_FUDGE; + } + else + { + dsp[0].fname = cstring_undefined; /* Current directory */ + } + + dsp[0].got_name_map = 0; + break; + } + } + } + else + { + ; + } + } +#ifdef VMS + else if (token == CPP_NAME) + { + /* + * Support '#include xyz' like VAX-C to allow for easy use of all the + * decwindow include files. It defaults to '#include ' (so the + * code from case '<' is repeated here) and generates a warning. + */ + cppReader_warning (pfile, + "VAX-C-style include specification found, use '#include ' !"); + angle_brackets = 1; + /* If -I-, start with the first -I dir after the -I-. */ + if (CPPOPTIONS (pfile)->first_bracket_include) + search_start = CPPOPTIONS (pfile)->first_bracket_include; + fbeg = pfile->token_buffer + old_written; + fend = cppReader_getPWritten (pfile); + } +#endif + else + { + cppReader_error (pfile, + message ("Preprocessor command #%s expects \"FILENAME\" or ", + keyword->name)); + + cppReader_setWritten (pfile, old_written); + cppReader_skipRestOfLine (pfile); + return 0; + } + + *fend = 0; + + token = get_directive_token (pfile); + if (token != CPP_VSPACE) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("Junk at end of #include")); + + while (token != CPP_VSPACE && token != CPP_EOF && token != CPP_POP) + { + token = get_directive_token (pfile); + } + } + + /* + ** For #include_next, skip in the search path + ** past the dir in which the containing file was found. + */ + + if (skip_dirs) + { + cppBuffer *fp = CPPBUFFER (pfile); + + for (; fp != cppReader_nullBuffer (pfile); fp = cppBuffer_prevBuffer (fp)) + { + llassert (fp != NULL); + + if (fp->fname != NULL) + { + /* fp->dir is null if the containing file was specified with + an absolute file name. In that case, don't skip anything. */ + if (fp->dir == SELF_DIR_DUMMY) + { + search_start = CPPOPTIONS (pfile)->include; + } + else if (fp->dir != NULL) + { + search_start = fp->dir->next; + } + else + { + ; + } + + break; + } + } + } + + cppReader_setWritten (pfile, old_written); + + flen = fend - fbeg; + + if (flen == 0) + { + cppReader_error (pfile, + message ("Empty file name in #%s", keyword->name)); + return 0; + } + + /* + ** Allocate this permanently, because it gets stored in the definitions + ** of macros. + */ + + fname = cstring_undefined; + + /* + 2 above for slash and terminating null. */ + /* + 2 added for '.h' on VMS (to support '#include filename') */ + + /* If specified file name is absolute, just open it. */ + + if (osd_isConnectChar (*fbeg) +# ifdef WIN32 + || (*(fbeg + 1) == ':') +# endif + ) + { + fname = cstring_copyLength (fbeg, flen); + + if (redundant_include_p (pfile, fname)) + { + cstring_free (fname); + return 0; + } + + f = open_include_file (pfile, fname, NULL); + + if (f == IMPORT_FOUND) + { + return 0; /* Already included this file */ + } + } + else + { + /* Search directory path, trying to open the file. + Copy each filename tried into FNAME. */ + + for (searchptr = search_start; searchptr != NULL; + searchptr = searchptr->next) + { + if (!cstring_isEmpty (searchptr->fname)) + { + /* The empty string in a search path is ignored. + This makes it possible to turn off entirely + a standard piece of the list. */ + if (cstring_isEmpty (searchptr->fname)) + continue; + + fname = cstring_copy (searchptr->fname); + fname = cstring_appendChar (fname, CONNECTCHAR); + } + else + { + ; + } + + fname = cstring_concatLength (fname, fbeg, flen); +#ifdef VMS + /* Change this 1/2 Unix 1/2 VMS file specification into a + full VMS file specification */ + if (searchptr->fname && (searchptr->fname[0] != 0)) { + /* Fix up the filename */ + hack_vms_include_specification (fname); + } else { + /* This is a normal VMS filespec, so use it unchanged. */ + strncpy (fname, fbeg, flen); + fname[flen] = 0; + /* if it's '#include filename', add the missing .h */ + if (strchr (fname,'.') == NULL) { + strcat (fname, ".h"); + } + } +#endif /* VMS */ + /* ??? There are currently 3 separate mechanisms for avoiding processing + of redundant include files: #import, #pragma once, and + redundant_include_p. It would be nice if they were unified. */ + + if (redundant_include_p (pfile, fname)) + { + cstring_free (fname); + return 0; + } + + f = open_include_file (pfile, fname, searchptr); + + if (f == IMPORT_FOUND) + { + return 0; /* Already included this file */ + } +#ifdef EACCES + else if (f == IMPORT_NOT_FOUND && errno == EACCES) + { + cppReader_warning (pfile, + message ("Header file %s exists, but is not readable", fname)); + } +#endif + + if (f >= 0) + { + break; + } + } + } + + if (f < 0) + { + /* A file that was not found. */ + fname = cstring_copyLength (fbeg, flen); + + if (search_start != NULL) + { + cppReader_error (pfile, + message ("Cannot find include file %s", fname)); + } + else + { + cppReader_error (pfile, + message ("No include path in which to find %s", fname)); + } + } + else { + /* + ** Check to see if this include file is a once-only include file. + ** If so, give up. + */ + + struct file_name_list *ptr; + + for (ptr = pfile->all_include_files; ptr != NULL; ptr = ptr->next) + { + if (cstring_equal (ptr->fname, fname)) + { + /* This file was included before. */ + break; + } + } + + if (ptr == NULL) + { + /* This is the first time for this file. */ + /* Add it to list of files included. */ + + ptr = (struct file_name_list *) dmalloc (sizeof (*ptr)); + ptr->control_macro = NULL; + ptr->c_system_include_path = NULL; + ptr->next = pfile->all_include_files; + ptr->fname = fname; + ptr->got_name_map = NULL; + + pfile->all_include_files = ptr; + assertSet (pfile->all_include_files); + } + + if (angle_brackets != 0) + { + pfile->system_include_depth++; + } + + /* Actually process the file */ + if (cppReader_pushBuffer (pfile, NULL, 0) == NULL) + { + cstring_free (fname); + return 0; + } + + if (finclude (pfile, f, fname, is_system_include (pfile, fname), + searchptr != dsp ? searchptr : SELF_DIR_DUMMY)) + { + output_line_command (pfile, 0, enter_file); + pfile->only_seen_white = 2; + } + + if (angle_brackets) + { + pfile->system_include_depth--; + } + /*@-branchstate@*/ + } /*:=branchstate@*/ + + return 0; +} + +/* Return nonzero if there is no need to include file NAME + because it has already been included and it contains a conditional + to make a repeated include do nothing. */ + +static bool +redundant_include_p (cppReader *pfile, cstring name) +{ + struct file_name_list *l = pfile->all_include_files; + + for (; l != NULL; l = l->next) + { + if (cstring_equal (name, l->fname) + && (l->control_macro != NULL) + && (cppReader_lookup (l->control_macro, -1, -1) != NULL)) + { + return TRUE; + } + } + + return FALSE; +} + +/* Return nonzero if the given FILENAME is an absolute pathname which + designates a file within one of the known "system" include file + directories. We assume here that if the given FILENAME looks like + it is the name of a file which resides either directly in a "system" + include file directory, or within any subdirectory thereof, then the + given file must be a "system" include file. This function tells us + if we should suppress pedantic errors/warnings for the given FILENAME. + + The value is 2 if the file is a C-language system header file + for which C++ should (on most systems) assume `extern "C"'. */ + +static bool +is_system_include (cppReader *pfile, cstring filename) +{ + struct file_name_list *searchptr; + + for (searchptr = CPPOPTIONS (pfile)->first_system_include; + searchptr != NULL; + searchptr = searchptr->next) + { + if (!cstring_isEmpty (searchptr->fname)) { + cstring sys_dir = searchptr->fname; + int length = cstring_length (sys_dir); + + if (cstring_equalLen (sys_dir, filename, length) + && osd_isConnectChar (cstring_getChar (filename, length))) + { + if (searchptr->c_system_include_path) + return 2; + else + return 1; + } + } + } + + return 0; +} + +/* Convert a character string literal into a nul-terminated string. + The input string is [IN ... LIMIT). + The result is placed in RESULT. RESULT can be the same as IN. + The value returned in the end of the string written to RESULT, + or NULL on error. */ + +static /*@null@*/ char * +convert_string (cppReader *pfile, /*@returned@*/ char *result, + char *in, char *limit, int handle_escapes) +{ + char c; + c = *in++; + + if (c != '\"') + { + return NULL; + } + + while (in < limit) + { + c = *in++; + + switch (c) + { + case '\0': + return NULL; + case '\"': + limit = in; + /*@switchbreak@*/ break; + case '\\': + if (handle_escapes) + { + char *bpc = (char *) in; + int i = (char) cppReader_parseEscape (pfile, &bpc); + in = (char *) bpc; + if (i >= 0) + *result++ = (char) c; + /*@switchbreak@*/ break; + } + + /*@fallthrough@*/ + default: + *result++ = c; + } + } + + *result = 0; + return result; +} + +/* + * interpret #line command. Remembers previously seen fnames + * in its very own hash table. + */ + +/*@constant int FNAME_HASHSIZE@*/ +#define FNAME_HASHSIZE 37 + +static int +do_line (cppReader *pfile, /*@unused@*/ struct directive *keyword) +{ + cppBuffer *ip = cppReader_getBuffer (pfile); + int new_lineno; + size_t old_written = cppReader_getWritten (pfile); + enum file_change_code file_change = same_file; + enum cpp_token token; + + token = get_directive_token (pfile); + + if (token != CPP_NUMBER + || !isdigit(pfile->token_buffer[old_written])) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("invalid format `#line' command")); + + goto bad_line_directive; + } + + /* The Newline at the end of this line remains to be processed. + To put the next line at the specified line number, + we must store a line number now that is one less. */ + new_lineno = atoi (pfile->token_buffer + old_written) - 1; + cppReader_setWritten (pfile, old_written); + + /* NEW_LINENO is one less than the actual line number here. */ + if (cppReader_isPedantic (pfile) && new_lineno < 0) + cppReader_pedwarnLit (pfile, + cstring_makeLiteralTemp ("line number out of range in `#line' command")); + + token = get_directive_token (pfile); + + if (token == CPP_STRING) { + char *fname = pfile->token_buffer + old_written; + char *end_name; + static HASHNODE *fname_table[FNAME_HASHSIZE]; + HASHNODE *hp, **hash_bucket; + char *p; + size_t num_start; + int fname_length; + + /* Turn the file name, which is a character string literal, + into a null-terminated string. Do this in place. */ + end_name = convert_string (pfile, fname, fname, cppReader_getPWritten (pfile), 1); + if (end_name == NULL) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("invalid format `#line' command")); + goto bad_line_directive; + } + + fname_length = end_name - fname; + num_start = cppReader_getWritten (pfile); + + token = get_directive_token (pfile); + if (token != CPP_VSPACE && token != CPP_EOF && token != CPP_POP) { + p = pfile->token_buffer + num_start; + if (cppReader_isPedantic (pfile)) + cppReader_pedwarnLit (pfile, + cstring_makeLiteralTemp ("garbage at end of `#line' command")); + + if (token != CPP_NUMBER || *p < '0' || *p > '4' || p[1] != '\0') + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("invalid format `#line' command")); + goto bad_line_directive; + } + if (*p == '1') + file_change = enter_file; + else if (*p == 2) + file_change = leave_file; + else if (*p == 3) + ip->system_header_p = 1; + else /* if (*p == 4) */ + ip->system_header_p = 2; + + cppReader_setWritten (pfile, num_start); + token = get_directive_token (pfile); + p = pfile->token_buffer + num_start; + if (token == CPP_NUMBER && p[1] == '\0' && (*p == '3' || *p== '4')) { + ip->system_header_p = *p == 3 ? 1 : 2; + token = get_directive_token (pfile); + } + if (token != CPP_VSPACE) { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("invalid format `#line' command")); + + goto bad_line_directive; + } + } + + hash_bucket = + &fname_table[hashf (fname, fname_length, FNAME_HASHSIZE)]; + for (hp = *hash_bucket; hp != NULL; hp = hp->next) + { + if (hp->length == fname_length && + strncmp (hp->value.cpval, fname, size_fromInt (fname_length)) == 0) { + ip->nominal_fname = cstring_fromChars (hp->value.cpval); + break; + } + } + + if (hp == 0) { + /* Didn't find it; cons up a new one. */ + hp = (HASHNODE *) dmalloc (sizeof (*hp) + fname_length + 1); + + hp->prev = NULL; + hp->bucket_hdr = NULL; + hp->type = T_NONE; + hp->name = cstring_undefined; + hp->next = *hash_bucket; + + *hash_bucket = hp; + + hp->length = fname_length; + hp->value.cpval = dmalloc (sizeof (*hp->value.cpval) * (fname_length + 1)); + memcpy (hp->value.cpval, fname, size_fromInt (fname_length)); + hp->value.cpval[fname_length] = '\0'; + ip->nominal_fname = cstring_fromChars (hp->value.cpval); + } + } + else if (token != CPP_VSPACE && token != CPP_EOF) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("invalid format `#line' command")); + goto bad_line_directive; + } + else + { + ; + } + + ip->lineno = new_lineno; +bad_line_directive: + cppReader_skipRestOfLine (pfile); + cppReader_setWritten (pfile, old_written); + output_line_command (pfile, 0, file_change); + return 0; +} + +/* + * remove the definition of a symbol from the symbol table. + * according to un*x /lib/cpp, it is not an error to undef + * something that has no definitions, so it isn't one here either. + */ + +static int +do_undef (cppReader *pfile, struct directive *keyword, char *buf, char *limit) +{ + + int sym_length; + HASHNODE *hp; + char *orig_buf = buf; + + SKIP_WHITE_SPACE (buf); + + sym_length = cppReader_checkMacroName (pfile, buf, cstring_makeLiteralTemp ("macro")); + + while ((hp = cppReader_lookup (buf, sym_length, -1)) != NULL) + { + /* If we are generating additional info for debugging (with -g) we + need to pass through all effective #undef commands. */ + if (CPPOPTIONS (pfile)->debug_output && (keyword != NULL)) + { + pass_thru_directive (orig_buf, limit, pfile, keyword); + } + + if (hp->type != T_MACRO) + { + cppReader_warning (pfile, + message ("Undefining preprocessor builtin: %s", + hp->name)); + } + + cppReader_deleteMacro (hp); + } + + if (cppReader_isPedantic (pfile)) { + buf += sym_length; + SKIP_WHITE_SPACE (buf); + if (buf != limit) + { + cppReader_pedwarnLit (pfile, + cstring_makeLiteralTemp ("garbage after `#undef' directive")); + } + } + + return 0; +} + + +/* + * Report an error detected by the program we are processing. + * Use the text of the line in the error message. + * (We use error because it prints the filename & line#.) + */ + +static int +do_error (cppReader *pfile, /*@unused@*/ struct directive *keyword, + char *buf, char *limit) +{ + int length = limit - buf; + cstring copy = cstring_copyLength (buf, length); + cstring adv = cstring_advanceWhiteSpace (copy); + + cppReader_error (pfile, message ("#error %s", adv)); + cstring_free (copy); + return 0; +} + +/* + * Report a warning detected by the program we are processing. + * Use the text of the line in the warning message, then continue. + * (We use error because it prints the filename & line#.) + */ + +static int +do_warning (cppReader *pfile, /*@unused@*/ struct directive *keyword, + char *buf, char *limit) +{ + int length = limit - buf; + cstring copy = cstring_copyLength (buf, length); + cstring adv = cstring_advanceWhiteSpace (copy); + cppReader_warning (pfile, message ("#warning %s", adv)); + cstring_free (copy); + return 0; +} + + +/* #ident has already been copied to the output file, so just ignore it. */ + +static int +do_ident (cppReader *pfile, /*@unused@*/ struct directive *keyword, + /*@unused@*/ char *buf, /*@unused@*/ char *limit) +{ + /* Allow #ident in system headers, since that's not user's fault. */ + if (cppReader_isPedantic (pfile) && !cppReader_getBuffer (pfile)->system_header_p) + cppReader_pedwarnLit (pfile, + cstring_makeLiteralTemp ("ANSI C does not allow `#ident'")); + + /* Leave rest of line to be read by later calls to cppGetToken. */ + + return 0; +} + +/* #pragma and its argument line have already been copied to the output file. + Just check for some recognized pragmas that need validation here. */ + +static int +do_pragma (cppReader *pfile, /*@unused@*/ struct directive *keyword, + /*@unused@*/ char *buf, /*@unused@*/ char *limit) +{ + while (*buf == ' ' || *buf == '\t') + { + buf++; + } + + if (!strncmp (buf, "implementation", 14)) { + /* Be quiet about `#pragma implementation' for a file only if it hasn't + been included yet. */ + struct file_name_list *ptr; + char *p = buf + 14, *fname, *inc_fname; + int fname_len; + SKIP_WHITE_SPACE (p); + if (*p == '\n' || *p != '\"') + return 0; + + fname = p + 1; + p = (char *) strchr (fname, '\"'); + fname_len = p != NULL ? p - fname : mstring_length (fname); + + for (ptr = pfile->all_include_files; ptr != NULL; ptr = ptr->next) + { + inc_fname = (char *) strrchr (cstring_toCharsSafe (ptr->fname), CONNECTCHAR); + inc_fname = (inc_fname != NULL) + ? inc_fname + 1 : cstring_toCharsSafe (ptr->fname); + + if ((inc_fname != NULL) + && (strncmp (inc_fname, fname, size_fromInt (fname_len)) == 0)) + { + cpp_setLocation (pfile); + + ppllerror (message ("`#pragma implementation' for `%s' appears " + "after file is included", + cstring_fromChars (fname))); + } + } + } + + return 0; +} + +/* + * handle #if command by + * 1) inserting special `defined' keyword into the hash table + * that gets turned into 0 or 1 by special_symbol (thus, + * if the luser has a symbol called `defined' already, it won't + * work inside the #if command) + * 2) rescan the input into a temporary output buffer + * 3) pass the output buffer to the yacc parser and collect a value + * 4) clean up the mess left from steps 1 and 2. + * 5) call conditional_skip to skip til the next #endif (etc.), + * or not, depending on the value from step 3. + */ + +static int +do_if (cppReader *pfile, /*@unused@*/ struct directive *keyword, + char *buf, char *limit) +{ + HOST_WIDE_INT value = eval_if_expression (pfile, buf, limit - buf); + conditional_skip (pfile, value == 0, T_IF, NULL); + return 0; +} + +/* + * handle a #elif directive by not changing if_stack either. + * see the comment above do_else. + */ + +static int do_elif (cppReader *pfile, /*@unused@*/ struct directive *keyword, + char *buf, char *limit) +{ + if (pfile->if_stack == cppReader_getBuffer (pfile)->if_stack) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("Preprocessor command #elif is not within a conditional")); + return 0; + } + else + { + llassert (pfile->if_stack != NULL); + + if (pfile->if_stack->type != T_IF && pfile->if_stack->type != T_ELIF) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("`#elif' after `#else'")); + + if (pfile->if_stack->fname != NULL + && cppReader_getBuffer (pfile)->fname != NULL + && !cstring_equal (pfile->if_stack->fname, + cppReader_getBuffer (pfile)->nominal_fname)) + fprintf (stderr, ", file %s", cstring_toCharsSafe (pfile->if_stack->fname)); + fprintf (stderr, ")\n"); + } + pfile->if_stack->type = T_ELIF; + } + + if (pfile->if_stack->if_succeeded) + { + skip_if_group (pfile, 0); + } + else + { + HOST_WIDE_INT value = eval_if_expression (pfile, buf, limit - buf); + if (value == 0) + skip_if_group (pfile, 0); + else + { + ++pfile->if_stack->if_succeeded; /* continue processing input */ + output_line_command (pfile, 1, same_file); + } + } + + return 0; +} + +/* + * evaluate a #if expression in BUF, of length LENGTH, + * then parse the result as a C expression and return the value as an int. + */ + +static HOST_WIDE_INT +eval_if_expression (cppReader *pfile, + /*@unused@*/ char *buf, + /*@unused@*/ int length) +{ + HASHNODE *save_defined; + HOST_WIDE_INT value; + size_t old_written = cppReader_getWritten (pfile); + + save_defined = cppReader_install ("defined", -1, T_SPEC_DEFINED, 0, 0, -1); + pfile->pcp_inside_if = 1; + + value = cppReader_parseExpression (pfile); + pfile->pcp_inside_if = 0; + + /* Clean up special symbol */ + cppReader_deleteMacro (save_defined); + + cppReader_setWritten (pfile, old_written); /* Pop */ + + return value; +} + +/* + * routine to handle ifdef/ifndef. Try to look up the symbol, + * then do or don't skip to the #endif/#else/#elif depending + * on what directive is actually being processed. + */ + +static int +do_xifdef (cppReader *pfile, struct directive *keyword, + /*@unused@*/ char *unused1, /*@unused@*/ char *unused2) +{ + int skip; + cppBuffer *ip = cppReader_getBuffer (pfile); + char *ident; + int ident_length; + enum cpp_token token; + int start_of_file = 0; + char *control_macro = 0; + size_t old_written = cppReader_getWritten (pfile); + + DPRINTF (("do xifdef: %d", + keyword->type == T_IFNDEF)); + + /* Detect a #ifndef at start of file (not counting comments). */ + if (cstring_isDefined (ip->fname) && keyword->type == T_IFNDEF) + { + start_of_file = pfile->only_seen_white == 2; + } + + pfile->no_macro_expand++; + token = get_directive_token (pfile); + pfile->no_macro_expand--; + + ident = pfile->token_buffer + old_written; + ident_length = size_toInt (cppReader_getWritten (pfile) - old_written); + cppReader_setWritten (pfile, old_written); /* Pop */ + + if (token == CPP_VSPACE || token == CPP_POP || token == CPP_EOF) + { + skip = (keyword->type == T_IFDEF); + if (! cppReader_isTraditional (pfile)) + { + cppReader_pedwarn (pfile, + message ("`#%s' with no argument", keyword->name)); + } + } + else if (token == CPP_NAME) + { + HASHNODE *hp = cppReader_lookup (ident, ident_length, -1); + skip = (keyword->type == T_IFDEF) + ? (hp == NULL) : (hp != NULL); + + DPRINTF (("hp null: %d / %d / %d", + (hp == NULL), + (keyword->type == T_IFNDEF), + skip)); + + if (start_of_file && !skip) + { + DPRINTF (("Not skipping!")); + control_macro = (char *) dmalloc (size_fromInt (ident_length + 1)); + memcpy (control_macro, ident, size_fromInt (ident_length + 1)); + } + } + else + { + skip = (keyword->type == T_IFDEF); + if (! cppReader_isTraditional (pfile)) + { + cppReader_error (pfile, + message ("`#%s' with invalid argument", keyword->name)); + } + } + + if (!cppReader_isTraditional (pfile)) + { + int c; + cppSkipHspace (pfile); + c = cppReader_peekC (pfile); + if (c != EOF && c != '\n') + { + cppReader_pedwarn (pfile, + message ("garbage at end of `#%s' argument", keyword->name)); + } + } + + cppReader_skipRestOfLine (pfile); + + DPRINTF (("Conditional skip: %d", skip)); + conditional_skip (pfile, skip, T_IF, control_macro); + return 0; +} + +/* Push TYPE on stack; then, if SKIP is nonzero, skip ahead. + If this is a #ifndef starting at the beginning of a file, + CONTROL_MACRO is the macro name tested by the #ifndef. + Otherwise, CONTROL_MACRO is 0. */ + +static void +conditional_skip (cppReader *pfile, int skip, + enum node_type type, + /*@dependent@*/ char *control_macro) +{ + cppIfStackFrame *temp = (cppIfStackFrame *) dmalloc (sizeof (*temp)); + + temp->fname = cppReader_getBuffer (pfile)->nominal_fname; + temp->next = pfile->if_stack; + temp->control_macro = control_macro; + temp->lineno = 0; + temp->if_succeeded = 0; + + pfile->if_stack = temp; + pfile->if_stack->type = type; + + if (skip != 0) + { + skip_if_group (pfile, 0); + return; + } + else + { + ++pfile->if_stack->if_succeeded; + output_line_command (pfile, 1, same_file); + } +} + +/* + * skip to #endif, #else, or #elif. adjust line numbers, etc. + * leaves input ptr at the sharp sign found. + * If ANY is nonzero, return at next directive of any sort. + */ + +static void +skip_if_group (cppReader *pfile, int any) +{ + int c; + struct directive *kt; + cppIfStackFrame *save_if_stack = pfile->if_stack; /* don't pop past here */ + register int ident_length; + char *ident; + struct parse_marker line_start_mark; + + parseSetMark (&line_start_mark, pfile); + + if (CPPOPTIONS (pfile)->output_conditionals) { + static char failed[] = "#failed\n"; + cppReader_puts (pfile, failed, sizeof(failed)-1); + pfile->lineno++; + output_line_command (pfile, 1, same_file); + } + +beg_of_line: + if (CPPOPTIONS (pfile)->output_conditionals) + { + cppBuffer *pbuf = cppReader_getBuffer (pfile); + char *start_line; + + llassert (pbuf->buf != NULL); + + start_line = pbuf->buf + line_start_mark.position; + cppReader_puts (pfile, start_line, size_fromInt (pbuf->cur - start_line)); + } + + parseMoveMark (&line_start_mark, pfile); + + if (!cppReader_isTraditional (pfile)) + { + cppSkipHspace (pfile); + } + + c = cppReader_getC (pfile); + if (c == '#') + { + size_t old_written = cppReader_getWritten (pfile); + cppSkipHspace (pfile); + + parse_name (pfile, cppReader_getC (pfile)); + ident_length = size_toInt (cppReader_getWritten (pfile) - old_written); + ident = pfile->token_buffer + old_written; + pfile->limit = ident; + + for (kt = directive_table; kt->length >= 0; kt++) + { + cppIfStackFrame *temp; + if (ident_length == kt->length + && cstring_equalPrefix (kt->name, ident)) + { + /* If we are asked to return on next directive, do so now. */ + if (any) + { + goto done; + } + + switch (kt->type) + { + case T_IF: + case T_IFDEF: + case T_IFNDEF: + temp = (cppIfStackFrame *) dmalloc (sizeof (*temp)); + temp->next = pfile->if_stack; + temp->fname = cppReader_getBuffer (pfile)->nominal_fname; + temp->type = kt->type; + temp->lineno = 0; + temp->if_succeeded = 0; + temp->control_macro = NULL; + + pfile->if_stack = temp; + /*@switchbreak@*/ break; + case T_ELSE: + case T_ENDIF: + if (cppReader_isPedantic (pfile) && pfile->if_stack != save_if_stack) + validate_else (pfile, + cstring_makeLiteralTemp (kt->type == T_ELSE ? "#else" : "#endif")); + /*@fallthrough@*/ + case T_ELIF: + if (pfile->if_stack == cppReader_getBuffer (pfile)->if_stack) + { + cppReader_error (pfile, + message ("Preprocessor command #%s is not within a conditional", kt->name)); + /*@switchbreak@*/ break; + } + else if (pfile->if_stack == save_if_stack) + { + goto done; /* found what we came for */ + } + else + { + ; + } + + if (kt->type != T_ENDIF) + { + llassert (pfile->if_stack != NULL); + + if (pfile->if_stack->type == T_ELSE) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("`#else' or `#elif' after `#else'")); + } + + pfile->if_stack->type = kt->type; + /*@switchbreak@*/ break; + } + + temp = pfile->if_stack; + llassert (temp != NULL); + pfile->if_stack = temp->next; + sfree (temp); + /*@switchbreak@*/ break; + default: ; + } + break; + } + + /* Don't let erroneous code go by. */ + + if (kt->length < 0 && !CPPOPTIONS (pfile)->lang_asm + && cppReader_isPedantic (pfile)) + { + cppReader_pedwarnLit (pfile, + cstring_makeLiteralTemp ("Invalid preprocessor directive name")); + } + } + + c = cppReader_getC (pfile); + } + /* We're in the middle of a line. Skip the rest of it. */ + for (;;) { + switch (c) + { + size_t old; + case EOF: + goto done; + case '/': /* possible comment */ + c = skip_comment (pfile, NULL); + if (c == EOF) + goto done; + /*@switchbreak@*/ break; + case '\"': + case '\'': + cppReader_forward (pfile, -1); + old = cppReader_getWritten (pfile); + (void) cppGetToken (pfile); + cppReader_setWritten (pfile, old); + /*@switchbreak@*/ break; + case '\\': + /* Char after backslash loses its special meaning. */ + if (cppReader_peekC (pfile) == '\n') + { + cppReader_forward (pfile, 1); + } + + /*@switchbreak@*/ break; + case '\n': + goto beg_of_line; + } + c = cppReader_getC (pfile); + } +done: + if (CPPOPTIONS (pfile)->output_conditionals) { + static char end_failed[] = "#endfailed\n"; + cppReader_puts (pfile, end_failed, sizeof(end_failed)-1); + pfile->lineno++; + } + pfile->only_seen_white = 1; + + parseGotoMark (&line_start_mark, pfile); + parseClearMark (&line_start_mark); +} + +/* + * handle a #else directive. Do this by just continuing processing + * without changing if_stack ; this is so that the error message + * for missing #endif's etc. will point to the original #if. It + * is possible that something different would be better. + */ + +static int +do_else (cppReader *pfile, /*@unused@*/ struct directive *keyword, + /*@unused@*/ char *buf, /*@unused@*/ char *limit) +{ + if (cppReader_isPedantic (pfile)) + { + validate_else (pfile, cstring_makeLiteralTemp ("#else")); + } + + cppReader_skipRestOfLine (pfile); + + if (pfile->if_stack == cppReader_getBuffer (pfile)->if_stack) { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("Preprocessor command #else is not within a conditional")); + return 0; + } else { + /* #ifndef can't have its special treatment for containing the whole file + if it has a #else clause. */ + + llassert (pfile->if_stack != NULL); + + pfile->if_stack->control_macro = 0; + + if (pfile->if_stack->type != T_IF && pfile->if_stack->type != T_ELIF) + { + cpp_setLocation (pfile); + genppllerrorhint (FLG_PREPROC, + message ("Pre-processor directive #else after #else"), + message ("%q: Location of match", + fileloc_unparseRaw (pfile->if_stack->fname, + pfile->if_stack->lineno))); + } + + pfile->if_stack->type = T_ELSE; + } + + if (pfile->if_stack->if_succeeded) + skip_if_group (pfile, 0); + else { + ++pfile->if_stack->if_succeeded; /* continue processing input */ + output_line_command (pfile, 1, same_file); + } + + return 0; +} + +/* + * unstack after #endif command + */ + +static int +do_endif (cppReader *pfile, /*@unused@*/ struct directive *keyword, + /*@unused@*/ char *buf, /*@unused@*/ char *limit) +{ + if (cppReader_isPedantic (pfile)) + { + validate_else (pfile, cstring_makeLiteralTemp ("#endif")); + } + + cppReader_skipRestOfLine (pfile); + + if (pfile->if_stack == cppReader_getBuffer (pfile)->if_stack) + { + cppReader_errorLit (pfile, cstring_makeLiteralTemp ("Unbalanced #endif")); + } + else + { + cppIfStackFrame *temp = pfile->if_stack; + + llassert (temp != NULL); + + pfile->if_stack = temp->next; + if (temp->control_macro != 0) + { + /* This #endif matched a #ifndef at the start of the file. + See if it is at the end of the file. */ + struct parse_marker start_mark; + int c; + + parseSetMark (&start_mark, pfile); + + for (;;) + { + cppSkipHspace (pfile); + c = cppReader_getC (pfile); + + if (c != '\n') + break; + } + + parseGotoMark (&start_mark, pfile); + parseClearMark (&start_mark); + + if (c == EOF) + { + /* If we get here, this #endif ends a #ifndef + that contains all of the file (aside from whitespace). + Arrange not to include the file again + if the macro that was tested is defined. + + Do not do this for the top-level file in a -include or any + file in a -imacros. */ + struct file_name_list *ifile = pfile->all_include_files; + + for ( ; ifile != NULL; ifile = ifile->next) + { + if (cstring_equal (ifile->fname, cppReader_getBuffer (pfile)->fname)) + { + ifile->control_macro = temp->control_macro; + break; + } + } + } + } + + sfree (temp); + output_line_command (pfile, 1, same_file); + } + return 0; +} + +/* When an #else or #endif is found while skipping failed conditional, + if -pedantic was specified, this is called to warn about text after + the command name. P points to the first char after the command name. */ + +static void +validate_else (cppReader *pfile, cstring directive) +{ + int c; + cppSkipHspace (pfile); + c = cppReader_peekC (pfile); + if (c != EOF && c != '\n') + { + cppReader_pedwarn (pfile, + message ("text following `%s' violates ANSI standard", directive)); + } +} + +/* +** Get the next token, and add it to the text in pfile->token_buffer. +** Return the kind of token we got. +*/ + +enum cpp_token +cppGetToken (cppReader *pfile) +{ + int c, c2, c3; + size_t old_written = 0; + int start_line, start_column; + enum cpp_token token; + struct cppOptions *opts = CPPOPTIONS (pfile); + cppReader_getBuffer (pfile)->prev = cppReader_getBuffer (pfile)->cur; + +get_next: + c = cppReader_getC (pfile); + + if (c == EOF) + { + handle_eof: + if (cppReader_getBuffer (pfile)->seen_eof) + { + cppBuffer *buf = cppReader_popBuffer (pfile); + + if (buf != cppReader_nullBuffer (pfile)) + { + goto get_next; + } + else + { + return CPP_EOF; + } + } + else + { + cppBuffer *next_buf = cppBuffer_prevBuffer (cppReader_getBuffer (pfile)); + cppReader_getBuffer (pfile)->seen_eof = 1; + + if (cstring_isDefined (cppReader_getBuffer (pfile)->nominal_fname) + && next_buf != cppReader_nullBuffer (pfile)) + { + /* We're about to return from an #include file. + Emit #line information now (as part of the CPP_POP) result. + But the #line refers to the file we will pop to. */ + cppBuffer *cur_buffer = CPPBUFFER (pfile); + CPPBUFFER (pfile) = next_buf; + pfile->input_stack_listing_current = 0; + output_line_command (pfile, 0, leave_file); + CPPBUFFER (pfile) = cur_buffer; + } + return CPP_POP; + } + } + else + { + long newlines; + struct parse_marker start_mark; + + switch (c) + { + case '/': + if (cppReader_peekC (pfile) == '=') + { + goto op2; + } + + if (opts->put_out_comments) + { + parseSetMark (&start_mark, pfile); + } + + newlines = 0; + cppBuffer_lineAndColumn (cppReader_fileBuffer (pfile), + &start_line, &start_column); + c = skip_comment (pfile, &newlines); + + if (opts->put_out_comments && (c == '/' || c == EOF)) + { + assertSet (&start_mark); + parseClearMark (&start_mark); + } + + if (c == '/') + goto randomchar; + if (c == EOF) + { + cppReader_errorWithLine (pfile, start_line, start_column, + cstring_makeLiteral ("Unterminated comment")); + goto handle_eof; + } + c = '/'; /* Initial letter of comment. */ + return_comment: + /* Comments are equivalent to spaces. + For -traditional, a comment is equivalent to nothing. */ + + if (opts->put_out_comments) + { + enum cpp_token res; + + assertSet (&start_mark); + res = cpp_handleComment (pfile, &start_mark); + pfile->lineno += newlines; + return res; + } + else if (cppReader_isTraditional (pfile)) + { + return CPP_COMMENT; + } + else + { + cppReader_reserve(pfile, 1); + cppReader_putCharQ (pfile, ' '); + return CPP_HSPACE; + } + + case '#': + if (!pfile->only_seen_white) + { + goto randomchar; + } + + if (cppReader_handleDirective (pfile)) + { + return CPP_DIRECTIVE; + } + + pfile->only_seen_white = 0; + return CPP_OTHER; + + case '\"': + case '\'': + /* A single quoted string is treated like a double -- some + programs (e.g., troff) are perverse this way */ + cppBuffer_lineAndColumn (cppReader_fileBuffer (pfile), + &start_line, &start_column); + old_written = cppReader_getWritten (pfile); + string: + cppReader_putChar (pfile, c); + while (TRUE) + { + int cc = cppReader_getC (pfile); + if (cc == EOF) + { + if (cppBuffer_isMacro (CPPBUFFER (pfile))) + { + /* try harder: this string crosses a macro expansion + boundary. This can happen naturally if -traditional. + Otherwise, only -D can make a macro with an unmatched + quote. */ + cppBuffer *next_buf + = cppBuffer_prevBuffer (cppReader_getBuffer (pfile)); + (*cppReader_getBuffer (pfile)->cleanup) + (cppReader_getBuffer (pfile), pfile); + CPPBUFFER (pfile) = next_buf; + continue; + } + if (!cppReader_isTraditional (pfile)) + { + cpp_setLocation (pfile); + + setLine (long_toInt (start_line)); + setColumn (long_toInt (start_column)); + + if (pfile->multiline_string_line != long_toInt (start_line) + && pfile->multiline_string_line != 0) + { + genppllerrorhint + (FLG_PREPROC, + message ("Unterminated string or character constant"), + message ("%q: Possible real start of unterminated constant", + fileloc_unparseRaw + (fileloc_filename (g_currentloc), + pfile->multiline_string_line))); + pfile->multiline_string_line = 0; + } + else + { + genppllerror + (FLG_PREPROC, + message ("Unterminated string or character constant")); + } + } + /*@loopbreak@*/ break; + } + cppReader_putChar (pfile, cc); + switch (cc) + { + case '\n': + /* Traditionally, end of line ends a string constant with + no error. So exit the loop and record the new line. */ + if (cppReader_isTraditional (pfile)) + goto while2end; + if (c == '\'') + { + goto while2end; + } + if (cppReader_isPedantic (pfile) + && pfile->multiline_string_line == 0) + { + cppReader_pedwarnWithLine + (pfile, long_toInt (start_line), + long_toInt (start_column), + cstring_makeLiteral ("String constant runs past end of line")); + } + if (pfile->multiline_string_line == 0) + { + pfile->multiline_string_line = start_line; + } + + /*@switchbreak@*/ break; + + case '\\': + cc = cppReader_getC (pfile); + if (cc == '\n') + { + /* Backslash newline is replaced by nothing at all. */ + cppReader_adjustWritten (pfile, -1); + pfile->lineno++; + } + else + { + /* ANSI stupidly requires that in \\ the second \ + is *not* prevented from combining with a newline. */ + NEWLINE_FIX1(cc); + if (cc != EOF) + cppReader_putChar (pfile, cc); + } + /*@switchbreak@*/ break; + + case '\"': + case '\'': + if (cc == c) + goto while2end; + /*@switchbreak@*/ break; + } + } + while2end: + pfile->lineno += count_newlines (pfile->token_buffer + old_written, + cppReader_getPWritten (pfile)); + pfile->only_seen_white = 0; + return c == '\'' ? CPP_CHAR : CPP_STRING; + + case '$': + if (!opts->dollars_in_ident) + goto randomchar; + goto letter; + + case ':': + if (opts->cplusplus && cppReader_peekC (pfile) == ':') + goto op2; + goto randomchar; + + case '&': + case '+': + case '|': + NEWLINE_FIX; + c2 = cppReader_peekC (pfile); + if (c2 == c || c2 == '=') + goto op2; + goto randomchar; + + case '*': + case '!': + case '%': + case '=': + case '^': + NEWLINE_FIX; + if (cppReader_peekC (pfile) == '=') + goto op2; + goto randomchar; + + case '-': + NEWLINE_FIX; + c2 = cppReader_peekC (pfile); + if (c2 == '-' && opts->chill) + { + /* Chill style comment */ + if (opts->put_out_comments) + { + parseSetMark (&start_mark, pfile); + } + + cppReader_forward (pfile, 1); /* Skip second '-'. */ + + for (;;) + { + c = cppReader_getC (pfile); + if (c == EOF) + /*@loopbreak@*/ break; + if (c == '\n') + { + /* Don't consider final '\n' to be part of comment. */ + cppReader_forward (pfile, -1); + /*@loopbreak@*/ break; + } + } + c = '-'; + goto return_comment; + } + if (c2 == '-' || c2 == '=' || c2 == '>') + goto op2; + goto randomchar; + + case '<': + if (pfile->parsing_include_directive) + { + for (;;) + { + cppReader_putChar (pfile, c); + if (c == '>') + /*@loopbreak@*/ break; + c = cppReader_getC (pfile); + NEWLINE_FIX1 (c); + if (c == '\n' || c == EOF) + { + cppReader_errorLit (pfile, + cstring_makeLiteralTemp ("Missing '>' in \"#include \"")); + /*@loopbreak@*/ break; + } + } + return CPP_STRING; + } + /*@fallthrough@*/ + case '>': + NEWLINE_FIX; + c2 = cppReader_peekC (pfile); + if (c2 == '=') + goto op2; + if (c2 != c) + goto randomchar; + cppReader_forward (pfile, 1); + cppReader_reserve (pfile, 4); + cppReader_putChar (pfile, c); + cppReader_putChar (pfile, c2); + NEWLINE_FIX; + c3 = cppReader_peekC (pfile); + if (c3 == '=') + cppReader_putCharQ (pfile, cppReader_getC (pfile)); + cppReader_nullTerminateQ (pfile); + pfile->only_seen_white = 0; + return CPP_OTHER; + + case '@': + if (cppReader_getBuffer (pfile)->has_escapes) + { + c = cppReader_getC (pfile); + if (c == '-') + { + if (pfile->output_escapes) + cppReader_puts (pfile, "@-", 2); + parse_name (pfile, cppReader_getC (pfile)); + return CPP_NAME; + } + else if (is_space [c]) + { + cppReader_reserve (pfile, 2); + if (pfile->output_escapes) + cppReader_putCharQ (pfile, '@'); + cppReader_putCharQ (pfile, c); + return CPP_HSPACE; + } + else + { + ; + } + } + if (pfile->output_escapes) + { + cppReader_puts (pfile, "@@", 2); + return CPP_OTHER; + } + goto randomchar; + case '.': + NEWLINE_FIX; + c2 = cppReader_peekC (pfile); + if (isdigit(c2)) + { + cppReader_reserve(pfile, 2); + cppReader_putCharQ (pfile, '.'); + c = cppReader_getC (pfile); + goto number; + } + + /* FIXME - misses the case "..\\\n." */ + if (c2 == '.' && cpp_peekN (pfile, 1) == '.') + { + cppReader_reserve(pfile, 4); + cppReader_putCharQ (pfile, '.'); + cppReader_putCharQ (pfile, '.'); + cppReader_putCharQ (pfile, '.'); + cppReader_forward (pfile, 2); + cppReader_nullTerminateQ (pfile); + pfile->only_seen_white = 0; + return CPP_3DOTS; + } + goto randomchar; + op2: + token = CPP_OTHER; + pfile->only_seen_white = 0; + op2any: + cppReader_reserve(pfile, 3); + cppReader_putCharQ (pfile, c); + cppReader_putCharQ (pfile, cppReader_getC (pfile)); + cppReader_nullTerminateQ (pfile); + return token; + + case 'L': + NEWLINE_FIX; + c2 = cppReader_peekC (pfile); + if ((c2 == '\'' || c2 == '\"') && !cppReader_isTraditional (pfile)) + { + cppReader_putChar (pfile, c); + c = cppReader_getC (pfile); + goto string; + } + goto letter; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + number: + c2 = '.'; + for (;;) + { + cppReader_reserve (pfile, 2); + cppReader_putCharQ (pfile, c); + NEWLINE_FIX; + c = cppReader_peekC (pfile); + if (c == EOF) + /*@loopbreak@*/ break; + if (!is_idchar[c] && c != '.' + && ((c2 != 'e' && c2 != 'E' + && ((c2 != 'p' && c2 != 'P') || cppReader_isC89 (pfile))) + || (c != '+' && c != '-'))) + /*@loopbreak@*/ break; + cppReader_forward (pfile, 1); + c2= c; + } + + cppReader_nullTerminateQ (pfile); + pfile->only_seen_white = 0; + return CPP_NUMBER; + + case 'b': case 'c': case 'd': case 'h': case 'o': + case 'B': case 'C': case 'D': case 'H': case 'O': + if (opts->chill && cppReader_peekC (pfile) == '\'') + { + pfile->only_seen_white = 0; + cppReader_reserve (pfile, 2); + cppReader_putCharQ (pfile, c); + cppReader_putCharQ (pfile, '\''); + cppReader_forward (pfile, 1); + for (;;) + { + c = cppReader_getC (pfile); + if (c == EOF) + goto chill_number_eof; + if (!is_idchar[c]) + { + if (c == '\\' && cppReader_peekC (pfile) == '\n') + { + cppReader_forward (pfile, 2); + continue; + } + /*@loopbreak@*/ break; + } + cppReader_putChar (pfile, c); + } + if (c == '\'') + { + cppReader_reserve (pfile, 2); + cppReader_putCharQ (pfile, c); + cppReader_nullTerminateQ (pfile); + return CPP_STRING; + } + else + { + cppReader_forward (pfile, -1); + chill_number_eof: + cppReader_nullTerminate (pfile); + return CPP_NUMBER; + } + } + else + goto letter; + case '_': + case 'a': case 'e': case 'f': case 'g': case 'i': case 'j': + case 'k': case 'l': case 'm': case 'n': case 'p': case 'q': + case 'r': case 's': case 't': case 'u': case 'v': case 'w': + case 'x': case 'y': case 'z': + case 'A': case 'E': case 'F': case 'G': case 'I': case 'J': + case 'K': case 'M': case 'N': case 'P': case 'Q': case 'R': + case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': + case 'Y': case 'Z': + letter: + { + HASHNODE *hp; + char *ident; + size_t before_name_written = cppReader_getWritten (pfile); + int ident_len; + parse_name (pfile, c); + pfile->only_seen_white = 0; + if (pfile->no_macro_expand) + { + return CPP_NAME; + } + + ident = pfile->token_buffer + before_name_written; + ident_len = (cppReader_getPWritten (pfile)) - ident; + + hp = cppReader_lookupExpand (ident, ident_len, -1); + + if (hp == NULL) + { + return CPP_NAME; + } + + if (hp->type == T_DISABLED) + { + if (pfile->output_escapes) + { /* Return "@-IDENT", followed by '\0'. */ + int i; + cppReader_reserve (pfile, 3); + ident = pfile->token_buffer + before_name_written; + cppReader_adjustWritten (pfile, 2); + + for (i = ident_len; i >= 0; i--) + { + ident[i+2] = ident[i]; + } + + ident[0] = '@'; + ident[1] = '-'; + } + return CPP_NAME; + } + + /* If macro wants an arglist, verify that a '(' follows. + first skip all whitespace, copying it to the output + after the macro name. Then, if there is no '(', + decide this is not a macro call and leave things that way. */ + + if (hp->type == T_MACRO && hp->value.defn->nargs >= 0) + { + struct parse_marker macro_mark; + int is_macro_call; + + while (cppBuffer_isMacro (CPPBUFFER (pfile))) + { + cppBuffer *next_buf; + cppSkipHspace (pfile); + if (cppReader_peekC (pfile) != EOF) + { + /*@loopbreak@*/ break; + } + + next_buf = cppBuffer_prevBuffer (cppReader_getBuffer (pfile)); + (*cppReader_getBuffer (pfile)->cleanup) (cppReader_getBuffer (pfile), pfile); + CPPBUFFER (pfile) = next_buf; + } + + parseSetMark (¯o_mark, pfile); + + for (;;) + { + cppSkipHspace (pfile); + c = cppReader_peekC (pfile); + is_macro_call = c == '('; + if (c != '\n') + /*@loopbreak@*/ break; + cppReader_forward (pfile, 1); + } + + if (!is_macro_call) + { + parseGotoMark (¯o_mark, pfile); + } + + parseClearMark (¯o_mark); + + if (!is_macro_call) + { + return CPP_NAME; + } + } + /* This is now known to be a macro call. */ + + /* it might not actually be a macro. */ + if (hp->type != T_MACRO) + { + size_t xbuf_len; + char *xbuf; + + cppReader_setWritten (pfile, before_name_written); + special_symbol (hp, pfile); + xbuf_len = cppReader_getWritten (pfile) - before_name_written; + xbuf = (char *) dmalloc (xbuf_len + 1); + cppReader_setWritten (pfile, before_name_written); + memcpy (xbuf, cppReader_getPWritten (pfile), xbuf_len + 1); + push_macro_expansion (pfile, xbuf, xbuf_len, hp); + } + else + { + /* Expand the macro, reading arguments as needed, + and push the expansion on the input stack. */ + macroexpand (pfile, hp); + cppReader_setWritten (pfile, before_name_written); + } + + /* An extra "@ " is added to the end of a macro expansion + to prevent accidental token pasting. We prefer to avoid + unneeded extra spaces (for the sake of cpp-using tools like + imake). Here we remove the space if it is safe to do so. */ + + llassert (pfile->buffer->rlimit != NULL); + + if (pfile->buffer->rlimit - pfile->buffer->cur >= 3 + && pfile->buffer->rlimit[-2] == '@' + && pfile->buffer->rlimit[-1] == ' ') + { + int c1 = pfile->buffer->rlimit[-3]; + int cl2 = cppBufPeek (cppBuffer_prevBuffer (CPPBUFFER (pfile))); + + if (cl2 == EOF || !unsafe_chars ((char) c1, (char) cl2)) + pfile->buffer->rlimit -= 2; + } + } + goto get_next; + + case ' ': case '\t': case '\v': case '\r': + for (;;) + { + cppReader_putChar (pfile, c); + c = cppReader_peekC (pfile); + if (c == EOF || !is_hor_space[c]) + /*@loopbreak@*/ break; + cppReader_forward (pfile, 1); + } + return CPP_HSPACE; + + case '\\': + c2 = cppReader_peekC (pfile); + if (c2 != '\n') + goto randomchar; + token = CPP_HSPACE; + goto op2any; + + case '\n': + cppReader_putChar (pfile, c); + if (pfile->only_seen_white == 0) + pfile->only_seen_white = 1; + pfile->lineno++; + output_line_command (pfile, 1, same_file); + return CPP_VSPACE; + + case '(': token = CPP_LPAREN; goto char1; + case ')': token = CPP_RPAREN; goto char1; + case '{': token = CPP_LBRACE; goto char1; + case '}': token = CPP_RBRACE; goto char1; + case ',': token = CPP_COMMA; goto char1; + case ';': token = CPP_SEMICOLON; goto char1; + + randomchar: + default: + token = CPP_OTHER; + char1: + pfile->only_seen_white = 0; + cppReader_putChar (pfile, c); + return token; + } + } + + BADBRANCH; + /*@notreached@*/ +} + +/* Parse an identifier starting with C. */ + +void +parse_name (cppReader *pfile, int c) +{ + for (;;) + { + if (!is_idchar[c]) + { + if (c == '\\' && cppReader_peekC (pfile) == '\n') + { + cppReader_forward (pfile, 2); + continue; + } + + cppReader_forward (pfile, -1); + break; + } + + if (c == '$' && cppReader_isPedantic (pfile)) + { + cppReader_pedwarnLit (pfile, + cstring_makeLiteralTemp ("`$' in identifier")); + } + + cppReader_reserve(pfile, 2); /* One more for final NUL. */ + cppReader_putCharQ (pfile, c); + c = cppReader_getC (pfile); + + if (c == EOF) + break; + } + + cppReader_nullTerminateQ (pfile); +} + +/* The file_name_map structure holds a mapping of file names for a + particular directory. This mapping is read from the file named + FILE_NAME_MAP_FILE in that directory. Such a file can be used to + map filenames on a file system with severe filename restrictions, + such as DOS. The format of the file name map file is just a series + of lines with two tokens on each line. The first token is the name + to map, and the second token is the actual name to use. */ + +struct file_name_map +{ + struct file_name_map *map_next; + cstring map_from; + cstring map_to; +}; + +/*@constant observer char *FILE_NAME_MAP_FILE*/ +#define FILE_NAME_MAP_FILE "header.gcc" + +/* Read a space delimited string of unlimited length from a stdio + file. */ + +static cstring read_filename_string (int ch, FILE *f) +{ + char *alloc, *set; + size_t len; + + len = 20; + set = alloc = dmalloc (len + 1); + + if (!is_space[ch]) + { + *set++ = ch; + while ((ch = getc (f)) != EOF && ! is_space[ch]) + { + if (set - alloc == size_toInt (len)) + { + len *= 2; + alloc = drealloc (alloc, len + 1); + set = alloc + len / 2; + } + + *set++ = ch; + } + } + *set = '\0'; + check (ungetc (ch, f) != EOF); + + return cstring_fromChars (alloc); +} + +/* This structure holds a linked list of file name maps, one per directory. */ + +struct file_name_map_list +{ + struct file_name_map_list *map_list_next; + cstring map_list_name; + struct file_name_map *map_list_map; +}; + +/* Read the file name map file for DIRNAME. */ + +static struct file_name_map * +read_name_map (cppReader *pfile, cstring dirname) +{ + struct file_name_map_list *map_list_ptr; + cstring name; + FILE *f; + + for (map_list_ptr = CPPOPTIONS (pfile)->map_list; + map_list_ptr != NULL; + map_list_ptr = map_list_ptr->map_list_next) + { + if (cstring_equal (map_list_ptr->map_list_name, dirname)) + { + return map_list_ptr->map_list_map; + } + } + + map_list_ptr = (struct file_name_map_list *) dmalloc (sizeof (*map_list_ptr)); + map_list_ptr->map_list_name = cstring_copy (dirname); + map_list_ptr->map_list_map = NULL; + + name = cstring_copy (dirname); + + if (cstring_length (dirname) > 0) + { + name = cstring_appendChar (name, CONNECTCHAR); + } + + name = cstring_concatFree1 (name, cstring_makeLiteralTemp (FILE_NAME_MAP_FILE)); + + f = fopen (cstring_toCharsSafe (name), "r"); + cstring_free (name); + + if (f == NULL) + { + map_list_ptr->map_list_map = NULL; + } + else + { + int ch; + + while ((ch = getc (f)) != EOF) + { + cstring from, to; + struct file_name_map *ptr; + + if (is_space[ch]) + { + continue; + } + + from = read_filename_string (ch, f); + while ((ch = getc (f)) != EOF && is_hor_space[ch]) + { + ; + } + + to = read_filename_string (ch, f); + + ptr = (struct file_name_map *) dmalloc (sizeof (*ptr)); + ptr->map_from = from; + + /* Make the real filename absolute. */ + if (cstring_length (to) > 1 + && osd_isConnectChar (cstring_firstChar (to))) + { + ptr->map_to = to; + } + else + { + ptr->map_to = cstring_copy (dirname); + ptr->map_to = cstring_appendChar (ptr->map_to, CONNECTCHAR); + ptr->map_to = cstring_concatFree (ptr->map_to, to); + } + + ptr->map_next = map_list_ptr->map_list_map; + map_list_ptr->map_list_map = ptr; + + while ((ch = getc (f)) != '\n') + { + if (ch == EOF) + { + /*@innerbreak@*/ break; + } + } + } + + assertSet (map_list_ptr->map_list_map); + check (fclose (f) == 0); + } + + map_list_ptr->map_list_next = pfile->opts->map_list; + pfile->opts->map_list = map_list_ptr; + + return map_list_ptr->map_list_map; +} + +/* Try to open include file FILENAME. SEARCHPTR is the directory + being tried from the include file search path. This function maps + filenames on file systems based on information read by + read_name_map. */ + +static int +open_include_file (cppReader *pfile, + cstring fname, + struct file_name_list *searchptr) +{ + char *filename = cstring_toCharsSafe (fname); + struct file_name_map *map; + char *from; + char *p, *dir; + + cstring_markOwned (fname); + + cpp_setLocation (pfile); + + if (context_getFlag (FLG_NEVERINCLUDE)) + { + if (isHeaderFile (fname)) + { + return SKIP_INCLUDE; + } + } + + if ((searchptr != NULL) && ! searchptr->got_name_map) + { + searchptr->name_map = read_name_map (pfile, + !cstring_isEmpty (searchptr->fname) + ? searchptr->fname : + cstring_makeLiteralTemp (".")); + searchptr->got_name_map = 1; + } + + /* First check the mapping for the directory we are using. */ + + if ((searchptr != NULL) + && (searchptr->name_map != NULL)) + { + from = filename; + + if (!cstring_isEmpty (searchptr->fname)) + { + from += cstring_length (searchptr->fname) + 1; + } + + for (map = searchptr->name_map; + map != NULL; + map = map->map_next) + { + if (cstring_equal (map->map_from, cstring_fromChars (from))) + { + /* + ** Found a match. Check if the file should be skipped + */ + + if (cpp_skipIncludeFile (map->map_to)) + { + return SKIP_INCLUDE; + } + else + { + return cpp_openIncludeFile (cstring_toCharsSafe (map->map_to)); + } + } + } + } + + /* + ** Try to find a mapping file for the particular directory we are + ** looking in. Thus #include will look up sys/types.h + ** in /usr/include/header.gcc and look up types.h in + ** /usr/include/sys/header.gcc. + */ + + p = strrchr (filename, CONNECTCHAR); + + if (p == NULL) + { + p = filename; + } + + if ((searchptr != NULL) + && (cstring_isDefined (searchptr->fname)) + && (cstring_length (searchptr->fname) == p - filename) + && !strncmp (cstring_toCharsSafe (searchptr->fname), + filename, + size_fromInt (p - filename))) + { + /* filename is in SEARCHPTR, which we've already checked. */ + + if (cpp_skipIncludeFile (cstring_fromChars (filename))) + { + return SKIP_INCLUDE; + } + else + { + return cpp_openIncludeFile (filename); + } + } + + if (p == filename) + { + dir = mstring_copy ("."); + from = filename; + } + else + { + dir = (char *) dmalloc (size_fromInt (p - filename + 1)); + memcpy (dir, filename, size_fromInt (p - filename)); + dir[p - filename] = '\0'; + from = p + 1; + } + + for (map = read_name_map (pfile, cstring_fromChars (dir)); + map != NULL; + map = map->map_next) + { + if (cstring_equal (map->map_from, cstring_fromChars (from))) + { + sfree (dir); + + if (cpp_skipIncludeFile (map->map_to)) + { + return SKIP_INCLUDE; + } + else + { + return cpp_openIncludeFile (cstring_toCharsSafe (map->map_to)); + } + } + } + + sfree (dir); + + if (cpp_skipIncludeFile (cstring_fromChars (filename))) + { + return SKIP_INCLUDE; + } + else + { + return cpp_openIncludeFile (filename); + } +} + +/* Process the contents of include file FNAME, already open on descriptor F, + with output to OP. + SYSTEM_HEADER_P is 1 if this file resides in any one of the known + "system" include directories (as decided by the `is_system_include' + function above). + DIRPTR is the link in the dir path through which this file was found, + or 0 if the file name was absolute or via the current directory. + Return 1 on success, 0 on failure. + + The caller is responsible for the cppReader_pushBuffer. */ + +static int +finclude (cppReader *pfile, int f, + cstring fname, + bool system_header_p, + /*@dependent@*/ struct file_name_list *dirptr) +{ + mode_t st_mode; + size_t st_size; + long i; + int length = 0; + cppBuffer *fp; /* For input stack frame */ + + if (file_size_and_mode (f, &st_mode, &st_size) < 0) + { + cppReader_perrorWithName (pfile, fname); + check (close (f) == 0); + (void) cppReader_popBuffer (pfile); + /*@-mustfree@*/ + return 0; + /*@=mustfree@*/ + } + + fp = cppReader_getBuffer (pfile); + + /*@-temptrans@*/ /* fname shouldn't really be temp */ + fp->nominal_fname = fp->fname = fname; + /*@=temptrans@*/ + + fp->dir = dirptr; + fp->system_header_p = system_header_p; + fp->lineno = 1; + fp->colno = 1; + fp->cleanup = cppReader_fileCleanup; + + if (S_ISREG (st_mode)) + { + sfree (fp->buf); + fp->buf = (char *) dmalloc (st_size + 2); + fp->alimit = fp->buf + st_size + 2; + fp->cur = fp->buf; + + /* Read the file contents, knowing that st_size is an upper bound + on the number of bytes we can read. */ + length = safe_read (f, fp->buf, size_toInt (st_size)); + fp->rlimit = fp->buf + length; + if (length < 0) goto nope; + } + else if (S_ISDIR (st_mode)) + { + cppReader_error (pfile, + message ("directory `%s' specified in #include", fname)); + check (close (f) == 0); + return 0; + } + else + { + /* + ** Cannot count its file size before reading. + ** First read the entire file into heap and + ** copy them into buffer on stack. + */ + + size_t bsize = 2000; + + st_size = 0; + + sfree (fp->buf); + fp->buf = (char *) dmalloc (bsize + 2); + + for (;;) { + i = safe_read (f, fp->buf + st_size, size_toInt (bsize - st_size)); + + if (i < 0) + goto nope; /* error! */ + st_size += i; + + if (st_size != bsize) + { + break; /* End of file */ + } + + bsize *= 2; + fp->buf = (char *) drealloc (fp->buf, bsize + 2); + } + + fp->cur = fp->buf; + length = size_toInt (st_size); + } + + if ((length > 0 && fp->buf[length - 1] != '\n') + /* Backslash-newline at end is not good enough. */ + || (length > 1 && fp->buf[length - 2] == '\\')) { + fp->buf[length++] = '\n'; + } + + fp->buf[length] = '\0'; + fp->rlimit = fp->buf + length; + + + /* Close descriptor now, so nesting does not use lots of descriptors. */ + check (close (f) == 0); + + /* Must do this before calling trigraph_pcp, so that the correct file name + will be printed in warning messages. */ + + pfile->input_stack_listing_current = 0; + return 1; + + nope: + + cppReader_perrorWithName (pfile, fname); + check (close (f) == 0); + sfree (fp->buf); + return 1; +} + +void +cppReader_init (cppReader *pfile) +{ + memset ((char *) pfile, 0, sizeof (*pfile)); + + pfile->get_token = cppGetToken; + pfile->token_buffer_size = 200; + pfile->token_buffer = (char *) dmalloc (pfile->token_buffer_size); + pfile->all_include_files = NULL; + + assertSet (pfile); + + cppReader_setWritten (pfile, 0); + + pfile->system_include_depth = 0; + pfile->max_include_len = 0; + pfile->timebuf = NULL; + pfile->only_seen_white = 1; + + pfile->buffer = cppReader_nullBuffer (pfile); +} + +void +cppReader_finish (/*@unused@*/ cppReader *pfile) +{ + ; +} + +/* Free resources used by PFILE. + This is the cppReader 'finalizer' or 'destructor' (in C++ terminology). */ + +void +cppCleanup (cppReader *pfile) +{ + while (CPPBUFFER (pfile) != cppReader_nullBuffer (pfile)) + { + (void) cppReader_popBuffer (pfile); + } + + if (pfile->token_buffer != NULL) + { + sfree (pfile->token_buffer); + pfile->token_buffer = NULL; + } + + while (pfile->if_stack != NULL) + { + cppIfStackFrame *temp = pfile->if_stack; + pfile->if_stack = temp->next; + sfree (temp); + } + + while (pfile->all_include_files != NULL) + { + struct file_name_list *temp = pfile->all_include_files; + pfile->all_include_files = temp->next; + /*@-dependenttrans@*/ + cstring_free (temp->fname); + /*@=dependenttrans@*/ + sfree (temp); + } + + cppReader_hashCleanup (); +} + +/* +** Get the file-mode and data size of the file open on FD +** and store them in *MODE_POINTER and *SIZE_POINTER. +*/ + +static int +file_size_and_mode (int fd, mode_t *mode_pointer, size_t *size_pointer) +{ + struct stat sbuf; + + if (fstat (fd, &sbuf) < 0) { + return (-1); + } + + if (mode_pointer != NULL) + { + *mode_pointer = sbuf.st_mode; + } + + if (size_pointer != NULL) + { + *size_pointer = (size_t) sbuf.st_size; + } + + return 0; +} + +/* Read LEN bytes at PTR from descriptor DESC, for file FILENAME, + retrying if necessary. Return a negative value if an error occurs, + otherwise return the actual number of bytes read, + which must be LEN unless end-of-file was reached. */ + +static int safe_read (int desc, char *ptr, int len) +{ + int left = len; + + while (left > 0) + { +# ifdef WIN32 + /*@-compdef@*/ /* ptr is an out parameter */ + int nchars = _read (desc, ptr, (unsigned) left); + /*@=compdef@*/ +# else + ssize_t nchars = read (desc, ptr, size_fromInt (left)); +# endif + + if (nchars < 0) + { +#ifdef EINTR + if (errno == EINTR) + continue; +#endif + return (int) nchars; + } + + if (nchars == 0) { + break; + } + + ptr += nchars; + left -= nchars; + } + + return len - left; +} + +/* Initialize PMARK to remember the current position of PFILE. */ + +void +parseSetMark (struct parse_marker *pmark, cppReader *pfile) +{ + cppBuffer *pbuf = cppReader_getBuffer (pfile); + + pmark->next = pbuf->marks; + /*@-temptrans@*/ + pbuf->marks = pmark; + /*@=temptrans@*/ + + pmark->buf = pbuf; + pmark->position = pbuf->cur - pbuf->buf; +} + +/* Cleanup PMARK - we no longer need it. */ + +void parseClearMark (struct parse_marker *pmark) +{ + struct parse_marker **pp = &pmark->buf->marks; + + for (; ; pp = &(*pp)->next) + { + llassert (*pp != NULL); + if (*pp == pmark) break; + } + + *pp = pmark->next; +} + +/* Backup the current position of PFILE to that saved in PMARK. */ + +void +parseGotoMark (struct parse_marker *pmark, cppReader *pfile) +{ + cppBuffer *pbuf = cppReader_getBuffer (pfile); + + if (pbuf != pmark->buf) + { + cpp_setLocation (pfile); + llfatalbug (cstring_makeLiteral ("Internal error parseGotoMark")); + } + + llassert (pbuf->buf != NULL); + pbuf->cur = pbuf->buf + pmark->position; +} + +/* Reset PMARK to point to the current position of PFILE. (Same + as parseClearMark (PMARK), parseSetMark (PMARK, PFILE) but faster. */ + +void +parseMoveMark (struct parse_marker *pmark, cppReader *pfile) +{ + cppBuffer *pbuf = cppReader_getBuffer (pfile); + + if (pbuf != pmark->buf) + { + cpp_setLocation (pfile); + llfatalerror (cstring_makeLiteral ("Internal error parseMoveMark")); + } + + pmark->position = pbuf->cur - pbuf->buf; +} + +void cppReader_initializeReader (cppReader *pfile) +{ + struct cppOptions *opts = CPPOPTIONS (pfile); + char *xp; + + /* The code looks at the defaults through this pointer, rather than through + the constant structure above. This pointer gets changed if an environment + variable specifies other defaults. */ + + struct default_include *include_defaults = include_defaults_array; + + /* Add dirs from CPATH after dirs from -I. */ + /* There seems to be confusion about what CPATH should do, + so for the moment it is not documented. */ + /* Some people say that CPATH should replace the standard include dirs, + but that seems pointless: it comes before them, so it overrides them + anyway. */ + + xp = (char *) getenv ("CPATH"); + + if (xp != 0 && ! opts->no_standard_includes) + { + path_include (pfile, xp); + } + + /* Now that dollars_in_ident is known, initialize is_idchar. */ + initialize_char_syntax (opts); + + /* CppReader_Install __LINE__, etc. Must follow initialize_char_syntax + and option processing. */ + + initialize_builtins (pfile); + + /* Do standard #defines and assertions + that identify system and machine type. */ + + if (!opts->inhibit_predefs) { + char *p = (char *) dmalloc (strlen (predefs) + 1); + strcpy (p, predefs); + + while (*p) + { + char *q; + + while (*p == ' ' || *p == '\t') + { + p++; + } + + /* Handle -D options. */ + if (p[0] == '-' && p[1] == 'D') + { + q = &p[2]; + + while (*p && *p != ' ' && *p != '\t') + { + p++; + } + + if (*p != 0) + { + *p++= 0; + } + + if (opts->debug_output) + { + output_line_command (pfile, 0, same_file); + } + + cppReader_define (pfile, q); + + while (*p == ' ' || *p == '\t') + { + p++; + } + } + else + { + abort (); + } + } + + sfree (p); + } + + opts->done_initializing = 1; + + { /* Read the appropriate environment variable and if it exists + replace include_defaults with the listed path. */ + char *epath = 0; +#ifdef __CYGWIN32__ + char *win32epath; + int win32_buf_size = 0; /* memory we need to allocate */ +#endif + + if (opts->cplusplus) + { + epath = getenv ("CPLUS_INCLUDE_PATH"); + } + else + { + epath = getenv ("C_INCLUDE_PATH"); + } + + /* + ** If the environment var for this language is set, + ** add to the default list of include directories. + */ + + if (epath != NULL) { + char *nstore = (char *) dmalloc (strlen (epath) + 2); + int num_dirs; + char *startp, *endp; + +#ifdef __CYGWIN32__ + /* if we have a posix path list, convert to win32 path list */ + if (cygwin32_posix_path_list_p (epath)) + { + win32_buf_size = cygwin32_posix_to_win32_path_list_buf_size (epath); + win32epath = (char *) dmalloc /*@i4@*/ (win32_buf_size); + cygwin32_posix_to_win32_path_list (epath, win32epath); + epath = win32epath; + } +#endif + for (num_dirs = 1, startp = epath; *startp; startp++) + { + if (*startp == PATH_SEPARATOR) + num_dirs++; + } + + /*@-sizeoftype@*/ + include_defaults + = (struct default_include *) dmalloc ((num_dirs + * sizeof (struct default_include)) + + sizeof (include_defaults_array)); + /*@=sizeoftype@*/ + + startp = endp = epath; + num_dirs = 0; + while (1) { + /* Handle cases like c:/usr/lib:d:/gcc/lib */ + if ((*endp == PATH_SEPARATOR) || *endp == 0) + { + strncpy (nstore, startp, size_fromInt (endp - startp)); + if (endp == startp) + { + strcpy (nstore, "."); + } + else + { + nstore[endp-startp] = '\0'; + } + + include_defaults[num_dirs].fname = cstring_fromCharsNew (nstore); + include_defaults[num_dirs].cplusplus = opts->cplusplus; + include_defaults[num_dirs].cxx_aware = 1; + num_dirs++; + + if (*endp == '\0') + { + break; + } + endp = startp = endp + 1; + } + else + { + endp++; + } + } + /* Put the usual defaults back in at the end. */ + memcpy ((char *) &include_defaults[num_dirs], + (char *) include_defaults_array, + sizeof (include_defaults_array)); + + sfree (nstore); + } + } + + cppReader_appendIncludeChain (pfile, opts->before_system, + opts->last_before_system); + opts->first_system_include = opts->before_system; + + /* Unless -fnostdinc, + tack on the standard include file dirs to the specified list */ + if (!opts->no_standard_includes) { + struct default_include *p = include_defaults; + char *specd_prefix = opts->include_prefix; + char *default_prefix = mstring_copy (GCC_INCLUDE_DIR); + int default_len = 0; + + /* Remove the `include' from /usr/local/lib/gcc.../include. */ + if (default_prefix != NULL) { + if (!strcmp (default_prefix + strlen (default_prefix) - 8, "/include")) { + default_len = strlen (default_prefix) - 7; + default_prefix[default_len] = 0; + } + } + + /* Search "translated" versions of GNU directories. + These have /usr/local/lib/gcc... replaced by specd_prefix. */ + if (specd_prefix != 0 && default_len != 0) + for (p = include_defaults; p->fname != NULL; p++) { + /* Some standard dirs are only for C++. */ + if (!p->cplusplus + || (opts->cplusplus && !opts->no_standard_cplusplus_includes)) { + /* Does this dir start with the prefix? */ + if (!strncmp (cstring_toCharsSafe (p->fname), default_prefix, + size_fromInt (default_len))) + { + /* Yes; change prefix and add to search list. */ + struct file_name_list *nlist + = (struct file_name_list *) dmalloc (sizeof (*nlist)); + size_t this_len = strlen (specd_prefix) + cstring_length (p->fname) - default_len; + char *str = (char *) dmalloc (this_len + 1); + strcpy (str, specd_prefix); + strcat (str, cstring_toCharsSafe (p->fname) + default_len); + + nlist->next = NULL; + nlist->fname = cstring_fromChars (str); + nlist->control_macro = 0; + nlist->c_system_include_path = !p->cxx_aware; + nlist->got_name_map = 0; + + cppReader_addIncludeChain (pfile, nlist); + if (opts->first_system_include == 0) + { + opts->first_system_include = nlist; + } + } + } + } + + /* Search ordinary names for GNU include directories. */ + + for (p = include_defaults; p->fname != NULL; p++) + { + /* Some standard dirs are only for C++. */ + if (!p->cplusplus + || (opts->cplusplus && !opts->no_standard_cplusplus_includes)) + { + struct file_name_list *nlist + = (struct file_name_list *) dmalloc (sizeof (*nlist)); + nlist->control_macro = 0; + nlist->c_system_include_path = !p->cxx_aware; + nlist->fname = p->fname; + nlist->got_name_map = 0; + nlist->next = NULL; + + cppReader_addIncludeChain (pfile, nlist); + + if (opts->first_system_include == 0) + { + opts->first_system_include = nlist; + } + } + } + sfree (default_prefix); + } + + /* Tack the after_include chain at the end of the include chain. */ + cppReader_appendIncludeChain (pfile, opts->after_include, + opts->last_after_include); + + if (opts->first_system_include == 0) + { + opts->first_system_include = opts->after_include; + } + + /* With -v, print the list of dirs to search. */ + if (opts->verbose) { + struct file_name_list *p; + fprintf (stderr, "#include \"...\" search starts here:\n"); + + for (p = opts->include; p != NULL; p = p->next) { + if (p == opts->first_bracket_include) + fprintf (stderr, "#include <...> search starts here:\n"); + + fprintf (stderr, " %s\n", cstring_toCharsSafe (p->fname)); + } + fprintf (stderr, "End of search list.\n"); + } +} + +int cppReader_startProcess (cppReader *pfile, cstring fname) +{ + cppBuffer *fp; + int f; + struct cppOptions *opts = CPPOPTIONS (pfile); + + fp = cppReader_pushBuffer (pfile, NULL, 0); + + if (fp == NULL) + { + return 0; + } + + if (opts->in_fname == NULL) + { + opts->in_fname = cstring_makeLiteralTemp (""); + } + + fp->fname = opts->in_fname; + fp->nominal_fname = fp->fname; + fp->lineno = 0; + + /* Copy the entire contents of the main input file into + the stacked input buffer previously allocated for it. */ + + if (cstring_isEmpty (fname)) + { + fname = cstring_makeLiteralTemp (""); + f = 0; + } + else if ((f = open (cstring_toCharsSafe (fname), O_RDONLY, 0666)) < 0) + { + cppReader_pfatalWithName (pfile, fname); + } + else + { + ; + } + + if (finclude (pfile, f, fname, 0, NULL)) + { + output_line_command (pfile, 0, same_file); + } + + return 1; +} + +static /*@exposed@*/ /*@null@*/ cppBuffer *cppReader_getBuffer (cppReader *pfile) +{ + return pfile->buffer; +} + +/*@exposed@*/ cppBuffer *cppReader_getBufferSafe (cppReader *pfile) +{ + llassert (pfile->buffer != NULL); + return pfile->buffer; +} + +/*@exposed@*/ char *cppLineBase (cppBuffer *buf) +{ + llassert (buf->buf != NULL); + return (buf->buf + buf->line_base); +} + +int cppBufPeek (cppBuffer *buf) +{ + if (buf->cur == NULL || buf->rlimit == NULL) { + return EOF; + } + + if (buf->cur < buf->rlimit) { + return *(buf->cur); + } + + return EOF; +} + +bool cppBuffer_isMacro (cppBuffer *buf) +{ + if (buf != NULL) + { + return (buf->cleanup == cppReader_macroCleanup); + } + + return FALSE; +} + +/* +** Returns true if the macro should be checked, false +** if it should be expanded normally. +*/ + +static bool notparseable = FALSE; /* preceeded by @notparseable@ */ +static bool notfunction = FALSE; /* preceeded by @notfunction@ */ +static bool expectiter = FALSE; /* preceeded by @iter@ */ +static bool expectenditer = FALSE; /* second after @iter@ */ +static bool expectfunction = FALSE; /* preceeded by @function@ */ +static bool expectconstant = FALSE; /* preceeded by @constant@ */ +static bool expectmacro = FALSE; /* preceeded by notfunction or notparseable */ + +static void cpp_setLocation (cppReader *pfile) +{ + fileId fid; + int line; + + if (pfile->buffer != NULL) + { + if (cstring_isDefined (cppReader_getBuffer (pfile)->nominal_fname)) + { + cstring fname = cppReader_getBuffer (pfile)->nominal_fname; + + if (fileTable_exists (context_fileTable (), fname)) + { + fid = fileTable_lookup (context_fileTable (), fname); + } + else + { + fid = fileTable_lookup (context_fileTable (), + cppReader_getBuffer (pfile)->fname); + } + } + else + { + fid = fileTable_lookup (context_fileTable (), + cppReader_getBuffer (pfile)->fname); + } + + line = cppReader_getBuffer (pfile)->lineno; + fileloc_free (g_currentloc); + g_currentloc = fileloc_create (fid, line, 1); + } + else + { + fileloc_free (g_currentloc); + g_currentloc = fileloc_createBuiltin (); + } +} + +static bool cpp_shouldCheckMacro (cppReader *pfile, char *p) /*@*/ +{ + bool checkmacro = FALSE; + bool hasParams = FALSE; + bool noexpand = FALSE; + cstring sname; + char c; + + cpp_setLocation (pfile); + + DPRINTF (("Should check macro? %s", p)); + + if (expectiter || expectconstant || expectenditer) + { + if (expectiter) + { + expectiter = FALSE; + expectenditer = TRUE; + } + else + { + expectiter = FALSE; + expectconstant = FALSE; + expectenditer = FALSE; + } + + if (notfunction || notparseable) + { + notfunction = FALSE; + notparseable = FALSE; + return FALSE; + } + else + { + return TRUE; + } + } + + llassert (*p == '#'); + p++; + + while (*p == ' ' || *p == '\t') + { + p++; + } + + llassert (*p == 'd'); /* define starts */ + + p += 6; + + while (*p == ' ' || *p == '\t') + { + p++; + } + + sname = cstring_fromChars (p); + DPRINTF (("Check macro: %s", sname)); + + while (((c = *p) != ' ') + && c != '\0' && c != '(' + && c != '\t' && c != '\\' && c != '\n' + && !iscntrl (c)) + { + p++; + } + + hasParams = (c == '('); + *p = '\0'; + + + if (notparseable) + { + notparseable = FALSE; + } + else if (notfunction || fileloc_isStandardLib (g_currentloc)) + { + DPRINTF (("Clear notfunction")); + notfunction = FALSE; + } + else + { + if (noexpand) + { + checkmacro = TRUE; + + if (!expectenditer) + { + noexpand = FALSE; + } + } + else + { + if (usymtab_existsReal (sname)) + { + uentry ue = usymtab_lookup (sname); + + DPRINTF (("Lookup macro: %s", uentry_unparse (ue))); + + if (fileloc_isPreproc (uentry_whereLast (ue))) + { + goto macroDne; + } + else + { + if (uentry_isSpecified (ue)) + { + checkmacro = context_getFlag (FLG_SPECMACROS); + } + else + { + if (hasParams) + { + checkmacro = context_getFlag (FLG_LIBMACROS) + || context_getFlag (FLG_FCNMACROS); + } + } + } + } + else + { + macroDne: + DPRINTF (("Macro doesn't exist: %s", bool_unparse (checkmacro))); + + if (fileloc_isSystemFile (g_currentloc) + && context_getFlag (FLG_SYSTEMDIREXPAND)) + { + ; /* don't check this macro */ + DPRINTF (("Don't check 1")); + } + else + { + uentry le; + + if (hasParams) + { + DPRINTF (("Has params...")); + + if (context_getFlag (FLG_FCNMACROS)) + { + if (usymtab_exists (sname)) + { + /* + ** only get here is macro is redefined + ** error reported elsewhere + */ + + DPRINTF (("It exists!")); + } + else + { + /* + ** We make it a forward function, since it might be declared elsewhere. + ** After all headers have been processed, we should check the forward + ** functions. + */ + + fileloc loc = fileloc_makePreproc (g_currentloc); + + /* the line is off-by-one, since the newline was already read */ + decLine (); + + if (expectfunction) + { + expectfunction = FALSE; + } + + le = uentry_makeForwardFunction (sname, + typeId_invalid, loc); + + fileloc_free (loc); + + incLine (); + + /* Do not define here! */ + + (void) usymtab_addEntry (le); + } + + checkmacro = TRUE; + DPRINTF (("Check: TRUE")); + } + else + { + DPRINTF (("Flag FCN_MACROS not set!")); + } + } + else + { + DPRINTF (("No params")); + + if (context_getFlag (FLG_CONSTMACROS)) + { + bool nocontent = FALSE; + + if (c == '\0') + { + nocontent = TRUE; + } + else + { + if (isspace (c)) + { + char *rest = p + 1; + + /* + ** Check if there is nothing after the define. + */ + + while ((*rest) != '\0' && isspace (*rest)) + { + rest++; + } + + if (*rest == '\0') + { + nocontent = TRUE; /* empty macro, don't check */ + } + } + } + + if (usymtab_exists (sname)) + { + ; + } + else + { + fileloc loc = fileloc_makePreproc (g_currentloc); + DPRINTF (("Make constant: %s", sname)); + le = uentry_makeConstant (sname, + ctype_unknown, loc); + (void) usymtab_addEntry (le); + } + + checkmacro = !nocontent; + } + } + } + + if (checkmacro && usymtab_existsType (sname)) + { + DPRINTF (("Making false...")); + decLine (); + ppllerror (message ("Specified type implemented as macro: %s", sname)); + checkmacro = FALSE; + incLine (); + } + } + } + } + + if (!checkmacro) + { + if (usymtab_exists (sname)) + { + uentry ue = usymtab_lookupExpose (sname); + fileloc tloc = fileloc_makePreproc (g_currentloc); + + uentry_setDefined (ue, tloc); + fileloc_free (tloc); + uentry_setUsed (ue, fileloc_undefined); + } + else + { + fileloc tloc = fileloc_makePreproc (g_currentloc); + uentry ue = uentry_makeExpandedMacro (sname, tloc); + DPRINTF (("Make expanded macro: %s", sname)); + DPRINTF (("Not in symbol table: %s", sname)); + + (void) usymtab_addGlobalEntry (ue); + fileloc_free (tloc); + } + } + + *p = c; + DPRINTF (("Returning: %s", bool_unparse (checkmacro))); + return checkmacro; +} + +static enum cpp_token +cpp_handleComment (cppReader *pfile, struct parse_marker *smark) +{ + cppBuffer *pbuf = cppReader_getBuffer (pfile); + char *start; + int len; + bool eliminateComment = FALSE; + + llassert (pbuf->buf != NULL); + + start = pbuf->buf + smark->position; + + llassert (pbuf->cur != NULL); + len = pbuf->cur - start; + + if (start[0] == '*' + && start[1] == context_getCommentMarkerChar ()) + { + int i; + char c = ' '; + char *scomment = start + 2; + + start[0] = BEFORE_COMMENT_MARKER[0]; + start[1] = BEFORE_COMMENT_MARKER[1]; + + llassert (start[len - 2] == '*'); + start[len - 2] = AFTER_COMMENT_MARKER[0]; + + llassert (start[len - 1] == '/'); + start[len - 1] = AFTER_COMMENT_MARKER[1]; + + cppReader_reserve(pfile, size_fromInt (1 + len)); + cppReader_putCharQ (pfile, c); + + cpp_setLocation (pfile); + + if (mstring_equalPrefix (scomment, "ignore")) + { + if (!context_getFlag (FLG_NOCOMMENTS)) + { + context_enterSuppressRegion (); + } + } + else if (mstring_equalPrefix (scomment, "end")) + { + if (!context_getFlag (FLG_NOCOMMENTS)) + { + context_exitSuppressRegion (); + } + } + else if (mstring_equalPrefix (scomment, "notparseable")) + { + notparseable = TRUE; + expectmacro = TRUE; + eliminateComment = TRUE; + } + else if (mstring_equalPrefix (scomment, "notfunction")) + { + notfunction = TRUE; + expectmacro = TRUE; + eliminateComment = TRUE; + } + else if (mstring_equalPrefix (scomment, "iter")) + { + expectiter = TRUE; + } + else if (mstring_equalPrefix (scomment, "function")) + { + expectfunction = TRUE; + } + else if (mstring_equalPrefix (scomment, "constant")) + { + expectconstant = TRUE; + } + else + { + char sChar = *scomment; + + if (sChar == '=' + || sChar == '-' + || sChar == '+') + { + char *rest = scomment + 1; + + if (mstring_equalPrefix (rest, "commentchar")) + { + eliminateComment = TRUE; + + if (sChar == '=') + { + ppllerror (cstring_makeLiteral + ("Cannot restore commentchar")); + } + else + { + char *next = scomment + 12; /* strlen commentchar = 12 */ + + if (*next != ' ' && *next != '\t' && *next != '\n') + { + ppllerror + (message + ("Syntactic commentchar comment is not followed by a " + "whitespace character: %c", + *next)); + } + else + { + char cchar = *(next + 1); + + if (cchar == '\0') + { + ppllerror + (cstring_makeLiteral + ("Cannot set commentchar to NUL")); + } + else + { + context_setCommentMarkerChar (cchar); + /* setComment = TRUE; */ + } + } + } + } + else if (mstring_equalPrefix (rest, "namechecks")) + { + context_fileSetFlag (FLG_NAMECHECKS, + ynm_fromCodeChar (sChar)); + } + else if (mstring_equalPrefix (rest, "macroredef")) + { + context_fileSetFlag (FLG_MACROREDEF, + ynm_fromCodeChar (sChar)); + } + else if (mstring_equalPrefix (rest, "usevarargs")) + { + context_fileSetFlag (FLG_USEVARARGS, + ynm_fromCodeChar (sChar)); + } + else if (mstring_equalPrefix (rest, "nextlinemacros")) + { + context_fileSetFlag (FLG_MACRONEXTLINE, + ynm_fromCodeChar (sChar)); + } + else if (mstring_equalPrefix (rest, "allmacros") + || mstring_equalPrefix (rest, "fcnmacros") + || mstring_equalPrefix (rest, "constmacros")) + { + flagcode fl; + + if (mstring_equalPrefix (rest, "allmacros")) + { + fl = FLG_ALLMACROS; + } + else if (mstring_equalPrefix (rest, "fcnmacros")) + { + fl = FLG_FCNMACROS; + } + else + { + llassert (mstring_equalPrefix (rest, "constmacros")); + fl = FLG_CONSTMACROS; + } + + + context_fileSetFlag (fl, ynm_fromCodeChar (sChar)); + notfunction = FALSE; + } + else + { + ; + } + } + else + { + ; + } + } + + if (eliminateComment) + { + goto removeComment; + } + + /* Replaces comment char's in start with spaces */ + + for (i = 2; i < len - 2; i++) + { + if (start[i] == BEFORE_COMMENT_MARKER[0] + || start[i] == BEFORE_COMMENT_MARKER[1] + || start[i] == context_getCommentMarkerChar ()) + { + start[i] = ' '; + } + } + + cppReader_putStrN (pfile, start, size_fromInt (len)); + parseClearMark (smark); + return CPP_COMMENT; + } + else + { + removeComment: + { + int i; + + /* + ** Output the comment as all spaces so line/column + ** in output file is still correct. + */ + + char c = ' '; + cstring lintcomment = cstring_undefined; + + if (context_getFlag (FLG_LINTCOMMENTS)) + { + if (mstring_equalPrefix (start, "*NOTREACHED*/")) + { + lintcomment = cstring_makeLiteralTemp ("l_notreach"); + } + else if (mstring_equalPrefix (start, "*PRINTFLIKE*/")) + { + lintcomment = cstring_makeLiteralTemp ("l_printfli"); + } + else if (mstring_equalPrefix (start, "*FALLTHROUGH*/")) + { + lintcomment = cstring_makeLiteralTemp ("l_fallthrou"); + } + else if (mstring_equalPrefix (start, "*ARGSUSED*/")) + { + lintcomment = cstring_makeLiteralTemp ("l_argsus"); + } + else if (mstring_equalPrefix (start, "*FALLTHRU*/")) + { + lintcomment = cstring_makeLiteralTemp ("l_fallth"); + } + else + { + lintcomment = cstring_undefined; + } + } + else + { + lintcomment = cstring_undefined; + } + + if (cstring_isDefined (lintcomment)) + { + c = BEFORE_COMMENT_MARKER[0]; + start[0] = BEFORE_COMMENT_MARKER[1]; + + llassert (cstring_length (lintcomment) == len - 3); + + for (i = 1; i < len - 2; i++) + { + start[i] = cstring_getChar (lintcomment, i); + } + + start[len - 2] = AFTER_COMMENT_MARKER[0]; + start[len - 1] = AFTER_COMMENT_MARKER[1]; + } + else + { + /* Replaces char's in start with spaces */ + for (i = 0; i < len; i++) + { + if (start[i] == '/' + && i < len - 1 + && start[i + 1] == '*') { + cppReader_warning + (pfile, + message ("Start comment inside comment")); + } + + if (start[i] != '\n') + { + start[i] = ' '; + } + } + } + + cppReader_reserve (pfile, size_fromInt (1 + len)); + cppReader_putCharQ (pfile, c); + cppReader_putStrN (pfile, start, size_fromInt (len)); + parseClearMark (smark); + return CPP_COMMENT; + } + } +} + +static int cpp_openIncludeFile (char *filename) +{ + int res = open (filename, O_RDONLY, 0666); + + if (res + && !fileTable_exists (context_fileTable (), + cstring_fromChars (filename))) + { + DPRINTF (("Add header: %s", filename)); + (void) fileTable_addHeaderFile (context_fileTable (), + cstring_fromChars (filename)); + } + + return res; +} + +static bool cpp_skipIncludeFile (cstring fname) +{ + if (context_isSystemDir (fname)) + { + DPRINTF (("System dir: %s", fname)); + + if (lcllib_isSkipHeader (fname)) + { + DPRINTF (("Skip include TRUE: %s", fname)); + return TRUE; + } + + if (context_getFlag (FLG_SKIPSYSHEADERS)) + { + DPRINTF (("Skip include TRUE: %s", fname)); + return TRUE; + } + } + + if (context_getFlag (FLG_SINGLEINCLUDE)) + { + fname = cstring_fromChars (removePreDirs (cstring_toCharsSafe (fname))); + +# ifdef WIN32 + cstring_replaceAll (fname, '\\', '/'); +# endif + + if (fileTable_exists (context_fileTable (), fname)) + { + DPRINTF (("Skip include TRUE: %s", fname)); + return TRUE; + } + } + + DPRINTF (("Skip include FALSE: %s", fname)); + return FALSE; +} + +static int cpp_peekN (cppReader *pfile, int n) +{ + cppBuffer *buf = cppReader_getBuffer (pfile); + + llassert (buf->cur != NULL); + + return (buf->rlimit - buf->cur >= (n) + ? buf->cur[n] + : EOF); +} + +cppBuffer *cppBuffer_prevBuffer (cppBuffer *buf) +{ + return buf + 1; +} + +void cppBuffer_forward (cppBuffer *buf, int n) +{ + llassert (buf->cur != NULL); + buf->cur += n; +} diff --git a/src/cppmain.c b/src/cppmain.c new file mode 100644 index 0000000..f876ba4 --- /dev/null +++ b/src/cppmain.c @@ -0,0 +1,222 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** cppmain.c +*/ +/* CPP main program, using CPP Library. + Copyright (C) 1995 Free Software Foundation, Inc. + Written by Per Bothner, 1994-95. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! */ + +# include "lclintMacros.nf" +# include "llbasic.h" +# include "cpp.h" +# include "cpplib.h" +# include "cpphash.h" +# include "cpperror.h" +# include "llmain.h" + +# include + +# ifdef WIN32 +/*@-ansireserved@*/ +extern /*@external@*/ /*@observer@*/ char *getenv (const char *); +/*@=ansireserved@*/ +# endif + +/* char *progname; */ + +cppReader g_cppState; + +#ifdef abort +/* More 'friendly' abort that prints the line and file. + config.h can #define abort fancy_abort if you like that sort of thing. */ + +void +fancy_abort () +{ + fatal ("Internal gcc abort."); +} +#endif + +void cppReader_initMod () +{ + struct cppOptions *opts = (struct cppOptions *) dmalloc (sizeof (*opts)); + + cppReader_init (&g_cppState); + llassert (g_cppState.opts == NULL); + g_cppState.opts = opts; + + cppOptions_init (opts); + /*@-compdef@*/ /* g_cppState is not yet innitialized */ +} /*@=compdef@*/ + +void cppReader_initialize () +{ + cppReader_initializeReader (&g_cppState); +} + +int cppProcess (/*@dependent@*/ cstring infile, + /*@dependent@*/ cstring outfile) +{ + FILE *ofile; + struct cppOptions *opts = CPPOPTIONS (&g_cppState); + + opts->out_fname = outfile; + opts->in_fname = infile; + opts->out_fname = outfile; + + if (cppFatalErrors (&g_cppState)) + { + llexit (LLFAILURE); + } + + g_cppState.show_column = TRUE; + + if (cppReader_startProcess (&g_cppState, opts->in_fname) == 0) + { + llexit (LLFAILURE); + } + + ofile = fopen (cstring_toCharsSafe (outfile), "w"); + + if (ofile == NULL) + { + fileTable_noDelete (context_fileTable (), outfile); + llfatalerror (message ("Cannot create temporary file for " + "pre-processor output. Trying to " + "open: %s. Use -tmpdir to change " + "the directory for temporary files.", + outfile)); + } + + for (;;) + { + enum cpp_token kind; + + llassert (g_cppState.token_buffer != NULL); + + if (!opts->no_output) + { + (void) fwrite (g_cppState.token_buffer, (size_t) 1, + cppReader_getWritten (&g_cppState), ofile); + } + + cppReader_setWritten (&g_cppState, 0); + kind = cppGetToken (&g_cppState); + + if (kind == CPP_EOF) + break; + } + + cppReader_finish (&g_cppState); + check (fclose (ofile) == 0); + + /* Resotre the original definition table. */ + + if (!context_getFlag (FLG_SINGLEINCLUDE)) + { + cppReader_restoreHashtab (); + } + + + /* Undefine everything from this file! */ + + if (g_cppState.errors != 0) { + return -1; + } + + return 0; +} + +void cppAddIncludeDir (cstring dir) +{ + /* -I option (Add directory to include path) */ + struct file_name_list *dirtmp = (struct file_name_list *) dmalloc (sizeof (*dirtmp)); + + DPRINTF (("Add include: %s", dir)); + + dirtmp->next = 0; /* New one goes on the end */ + dirtmp->control_macro = 0; + dirtmp->c_system_include_path = 0; + + /* This copy is necessary...but shouldn't be? */ + /*@-onlytrans@*/ + dirtmp->fname = cstring_copy (dir); + /*@=onlytrans@*/ + + dirtmp->got_name_map = 0; + cppReader_addIncludeChain (&g_cppState, dirtmp); +} + +void cppDoDefine (cstring str) +{ + cppBuffer *tbuf = g_cppState.buffer; + + g_cppState.buffer = NULL; + cppReader_define (&g_cppState, cstring_toCharsSafe (str)); + g_cppState.buffer = tbuf; +} + +void cppDoUndefine (cstring str) +{ + int sym_length; + HASHNODE *hp; + char *buf = cstring_toCharsSafe (str); + + sym_length = cppReader_checkMacroName (&g_cppState, buf, + cstring_makeLiteralTemp ("macro")); + + while ((hp = cppReader_lookup (buf, sym_length, -1)) != NULL) + { + /*@-exposetrans@*/ /*@-dependenttrans@*/ + cppReader_deleteMacro (hp); + /*@=exposetrans@*/ /*@=dependenttrans@*/ + } +} + +void cppReader_saveDefinitions () +{ + if (!context_getFlag (FLG_SINGLEINCLUDE)) + { + cppReader_saveHashtab (); + } +} diff --git a/src/cprim.c b/src/cprim.c new file mode 100644 index 0000000..ba785ad --- /dev/null +++ b/src/cprim.c @@ -0,0 +1,393 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** cprim.c +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +static bool cprim_isReal (cprim c) +{ + return (cprim_isAnyReal (c)); +} + +static bool cprim_isNumeric (cprim c) +{ + return (cprim_isReal (c) || cprim_isInt (c)); +} + +cprim +cprim_fromInt (int i) +{ + if (i < CTX_UNKNOWN || i > CTX_LAST) + { + llcontbug (message ("cprim_fromInt: out of range: %d", i)); + return CTX_UNKNOWN; + } + return (cprim) i; +} + + +/* +** not symmetric: c1 := c2 or c2 is passed as c1 +** (if RELAXQUALS, c1 must be "bigger" than c2) +*/ + +bool +cprim_closeEnough (cprim c1, cprim c2) +{ + if (c1 == c2) return TRUE; + + if (c1 == CTX_ANYINTEGRAL) + { + if (context_getFlag (FLG_MATCHANYINTEGRAL) + || context_getFlag (FLG_IGNOREQUALS)) + { + return (cprim_isAnyInt (c2) + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + } + else if (context_getFlag (FLG_LONGINTEGRAL)) + { + return (cprim_closeEnough (CTX_LINT, c2)); + } + else if (context_getFlag (FLG_LONGUNSIGNEDINTEGRAL)) + { + return (cprim_closeEnough (CTX_ULINT, c2)); + } + else + { + return FALSE; + } + } + + if (c1 == CTX_UNSIGNEDINTEGRAL) + { + if (context_getFlag (FLG_MATCHANYINTEGRAL) + || context_getFlag (FLG_IGNOREQUALS)) + { + return (cprim_isAnyInt (c2) + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + } + else if (context_getFlag (FLG_LONGUNSIGNEDUNSIGNEDINTEGRAL)) + { + return (cprim_closeEnough (CTX_ULINT, c2)); + } + else + { + return FALSE; + } + } + + if (c1 == CTX_SIGNEDINTEGRAL) + { + if (context_getFlag (FLG_MATCHANYINTEGRAL) + || context_getFlag (FLG_IGNOREQUALS)) + { + return (cprim_isAnyInt (c2) + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + } + else if (context_getFlag (FLG_LONGSIGNEDINTEGRAL)) + { + return (cprim_closeEnough (CTX_LINT, c2)); + } + else + { + return FALSE; + } + } + + if (c2 == CTX_ANYINTEGRAL) + { + if (context_getFlag (FLG_MATCHANYINTEGRAL)) + { + return (cprim_isAnyInt (c1) + || (cprim_isAnyChar (c1) && context_msgCharInt ())); + } + else if (context_getFlag (FLG_LONGINTEGRAL)) + { + return (cprim_closeEnough (c1, CTX_LINT)); + } + else if (context_getFlag (FLG_LONGUNSIGNEDINTEGRAL)) + { + return (cprim_closeEnough (c1, CTX_ULINT)); + } + else + { + return FALSE; + } + } + + if (c2 == CTX_UNSIGNEDINTEGRAL) + { + if (context_getFlag (FLG_MATCHANYINTEGRAL)) + { + return (cprim_isAnyInt (c1) + || (cprim_isAnyChar (c1) && context_msgCharInt ())); + } + else if (context_getFlag (FLG_LONGUNSIGNEDUNSIGNEDINTEGRAL)) + { + return (cprim_closeEnough (c1, CTX_ULINT)); + } + else + { + return FALSE; + } + } + + if (c2 == CTX_SIGNEDINTEGRAL) + { + if (context_getFlag (FLG_MATCHANYINTEGRAL)) + { + return (cprim_isAnyInt (c2) + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + } + else if (context_getFlag (FLG_LONGSIGNEDINTEGRAL)) + { + return (cprim_closeEnough (c1, CTX_LINT)); + } + else + { + return FALSE; + } + } + + if (context_getFlag (FLG_RELAXTYPES)) + { + if (cprim_isNumeric (c1) && cprim_isNumeric (c2)) return TRUE; + } + + if (context_getFlag (FLG_IGNOREQUALS)) + { + switch (c1) + { + case CTX_CHAR: + case CTX_UCHAR: + return (cprim_isAnyChar (c2) + || (cprim_isAnyInt (c2) && (context_msgCharInt ()))); + case CTX_DOUBLE: + case CTX_FLOAT: + case CTX_LDOUBLE: + return (c2 == CTX_DOUBLE || c2 == CTX_FLOAT || c2 == CTX_LDOUBLE); + case CTX_INT: + case CTX_LINT: + case CTX_LLINT: + case CTX_ULLINT: + case CTX_SINT: + case CTX_UINT: + case CTX_ULINT: + case CTX_USINT: + return (cprim_isAnyInt (c2) + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + default: + return FALSE; + } + } + else + { + if (context_getFlag (FLG_IGNORESIGNS)) + { + if (c1 == CTX_UCHAR) + { + c1 = CTX_CHAR; + } + else if (c1 == CTX_UINT) + { + c1 = CTX_INT; + } + else if (c1 == CTX_ULINT) + { + c1 = CTX_LINT; + } + else if (c1 == CTX_USINT) + { + c1 = CTX_SINT; + } + else + { + ; + } + + if (c2 == CTX_UCHAR) + { + c2 = CTX_CHAR; + } + else if (c2 == CTX_UINT) + { + c2 = CTX_INT; + } + else if (c2 == CTX_ULINT) + { + c2 = CTX_LINT; + } + else if (c2 == CTX_USINT) + { + c2 = CTX_SINT; + } + else + { + ; + } + } + + if (c1 == c2) return TRUE; + + if (context_getFlag (FLG_FLOATDOUBLE)) + { + if (c1 == CTX_FLOAT && c2 == CTX_DOUBLE) + { + return TRUE; + } + if (c2 == CTX_FLOAT && c1 == CTX_DOUBLE) + { + return TRUE; + } + } + + if (context_getFlag (FLG_RELAXQUALS)) + { + switch (c1) + { + case CTX_DOUBLE: + return (c2 == CTX_FLOAT); + case CTX_LDOUBLE: + return (c2 == CTX_DOUBLE || c2 == CTX_FLOAT); + case CTX_SINT: + return (c2 == CTX_CHAR && context_msgCharInt ()); + case CTX_INT: + return (c2 == CTX_SINT + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + case CTX_LLINT: + return (c2 == CTX_SINT + || c2 == CTX_INT + || c2 == CTX_LINT + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + case CTX_ULLINT: + return (c2 == CTX_USINT + || c2 == CTX_UINT + || c2 == CTX_ULINT); + case CTX_LINT: + return (c2 == CTX_SINT + || c2 == CTX_INT + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + case CTX_UINT: + return (c2 == CTX_USINT + || (c2 == CTX_UCHAR && context_msgCharInt ())); + case CTX_USINT: + return (c2 == CTX_UCHAR && context_msgCharInt ()); + case CTX_ULINT: + return (c2 == CTX_UINT || c2 == CTX_USINT); + case CTX_UCHAR: + return (c2 == CTX_UINT && context_msgCharInt ()); + case CTX_CHAR: + return ((c2 == CTX_INT || c2 == CTX_SINT) + && context_msgCharInt ()); + default: + return FALSE; + } + } + else + { + switch (c1) + { + case CTX_DOUBLE: + case CTX_LDOUBLE: + return FALSE; + case CTX_SINT: + case CTX_INT: + case CTX_LINT: + case CTX_LLINT: + return (c2 == CTX_CHAR && context_msgCharInt ()); + case CTX_UINT: + case CTX_USINT: + case CTX_ULINT: + case CTX_ULLINT: + return (c2 == CTX_UCHAR && context_msgCharInt ()); + case CTX_UCHAR: + return (c2 == CTX_UINT && context_msgCharInt ()); + case CTX_CHAR: + return ((c2 == CTX_INT || c2 == CTX_SINT) + && context_msgCharInt ()); + default: + return FALSE; + } + } + } +} + +/*@only@*/ cstring +cprim_unparse (cprim c) +{ + switch (c) + { + case CTX_UNKNOWN: + return cstring_makeLiteral ("-"); + case CTX_VOID: + return cstring_makeLiteral ("void"); + case CTX_CHAR: + return cstring_makeLiteral ("char"); + case CTX_UCHAR: + return cstring_makeLiteral ("unsigned char"); + case CTX_DOUBLE: + return cstring_makeLiteral ("double"); + case CTX_LDOUBLE: + return cstring_makeLiteral ("long double"); + case CTX_FLOAT: + return cstring_makeLiteral ("float"); + case CTX_INT: + return cstring_makeLiteral ("int"); + case CTX_LINT: + return cstring_makeLiteral ("long int"); + case CTX_LLINT: + return cstring_makeLiteral ("long long"); + case CTX_ULLINT: + return cstring_makeLiteral ("unsigned long long"); + case CTX_SINT: + return cstring_makeLiteral ("short int"); + case CTX_UINT: + return cstring_makeLiteral ("unsigned int"); + case CTX_ULINT: + return cstring_makeLiteral ("unsigned long int"); + case CTX_USINT: + return cstring_makeLiteral ("unsigned short int"); + case CTX_UNSIGNEDINTEGRAL: + return cstring_makeLiteral ("arbitrary unsigned integral type"); + case CTX_SIGNEDINTEGRAL: + return cstring_makeLiteral ("arbitrary signed integral type"); + case CTX_ANYINTEGRAL: + return cstring_makeLiteral ("arbitrary integral type"); + default: + return cstring_makeLiteral ("unknown prim"); + } +} + +bool cprim_isInt (cprim c) +{ + return (cprim_isAnyInt (c) + || (cprim_isAnyChar (c) && context_msgCharInt ())); +} + + + + diff --git a/src/cscanner.c.der b/src/cscanner.c.der new file mode 100644 index 0000000..574fac0 --- /dev/null +++ b/src/cscanner.c.der @@ -0,0 +1,5435 @@ +/* +** Inserted at beginning of c files generated by flex +** REMEMBER: Change flex.reset too. +*/ + +/*@-allmacros@*/ +/*@-pred@*/ +/*@-globstate@*/ +/*@-null@*/ +/*@+boolint@*/ +/*@+charint@*/ +/*@-macrospec@*/ +/*@-macroredef@*/ +/*@-exitarg@*/ +/*@-compdef@*/ +/*@-uniondef@*/ +/*@+ignorequals@*/ +/*@-noreturn@*/ +/*@-mustfree@*/ +/*@-compdestroy@*/ +/*@-branchstate@*/ +/*@-unreachable@*/ +/*@-varuse@*/ +/*@-fcnuse@*/ +/*@-exportlocal@*/ +/*@-evalorderuncon@*/ +/*@-exportheader@*/ +/*@-redecl@*/ +/*@-loopswitchbreak@*/ +/*@-switchswitchbreak@*/ +/*@-sizeoftype@*/ +/*@-czechfcns@*/ +/*@-noparams@*/ +/*@-ansireserved@*/ +/*@-ifblock@*/ +/*@-whileblock@*/ +/*@-forblock@*/ +/*@-elseifcomplete@*/ +/*@+ptrnegate@*/ +/*@-onlytrans@*/ +/*@-temptrans@*/ +/*@-immediatetrans@*/ +/*@-namechecks@*/ +/*@+matchanyintegral@*/ +/*@-statictrans@*/ +/*@-compmempass@*/ +/*@-forempty@*/ +/*@-evalorder@*/ +/*@-retalias@*/ +/*@-dependenttrans@*/ +/*@-noeffect@*/ +/*@-protoparammatch@*/ +/*@-casebreak@*/ +/*@-retvalother@*/ + +# ifdef __LCLINT__ +/*@-redecl@*/ /*@-type@*/ +extern int lsllex (void); +/*@=redecl@*/ /*@=type@*/ + +/* +** Need to do this because ECHO is defined by the Posix library. +** flex shouldn't use it. +*/ + +/*@notfunction@*/ +# define ECHO \ + fwrite (yytext, yyleng, 1, yyout) + +# ifndef DEFFILENO +extern /*@external@*/ int fileno (/* FILE *stream */); +# define DEFFILENO +# endif +# endif + +# ifdef OSF +# undef __GNUC__ +# endif + +/*@-redecl@*/ + +/* < end of flex.head > */ + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#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 */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* 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 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* 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 yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * 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 yyless() call. + */ + +/* 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_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* 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 char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (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; + +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 )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +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 yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 177 +#define YY_END_OF_BUFFER 178 +static yyconst short int yy_accept[509] = + { 0, + 0, 0, 178, 176, 156, 157, 144, 176, 3, 79, + 150, 143, 176, 138, 139, 148, 147, 135, 146, 142, + 149, 94, 94, 136, 132, 151, 137, 152, 155, 176, + 140, 175, 141, 153, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 133, 154, 134, 145, 131, + 0, 42, 0, 2, 79, 117, 173, 174, 126, 118, + 0, 0, 115, 123, 113, 124, 114, 125, 0, 107, + 1, 116, 110, 87, 0, 96, 95, 0, 94, 122, + 128, 130, 129, 121, 0, 0, 0, 119, 79, 79, + + 79, 79, 79, 79, 79, 79, 9, 79, 79, 79, + 79, 79, 79, 79, 13, 44, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 120, 127, 0, 0, 2, 101, + 4, 0, 105, 106, 107, 0, 108, 109, 89, 88, + 0, 104, 97, 98, 98, 80, 112, 111, 163, 164, + 161, 166, 171, 162, 172, 167, 170, 165, 168, 169, + 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 11, + + 79, 79, 27, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 43, 79, 79, 79, 79, 79, 79, + 74, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 0, 42, 0, 0, 107, 0, 105, 106, + 0, 110, 90, 91, 91, 102, 103, 100, 99, 81, + 83, 160, 0, 0, 79, 79, 39, 79, 6, 29, + 79, 79, 79, 79, 79, 79, 10, 25, 79, 79, + 79, 79, 12, 79, 79, 79, 51, 79, 31, 79, + 79, 52, 79, 79, 68, 79, 79, 79, 79, 79, + + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 26, 79, 79, 79, 0, 107, 93, 92, 82, 84, + 84, 0, 159, 79, 79, 5, 79, 36, 79, 79, + 79, 79, 79, 79, 79, 30, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 69, 79, 79, 79, 79, + 79, 79, 79, 32, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 77, 24, 79, 79, 79, 79, + 79, 18, 76, 86, 85, 158, 79, 79, 79, 79, + 79, 79, 79, 28, 79, 38, 79, 21, 79, 54, + + 78, 79, 60, 79, 79, 79, 79, 79, 79, 58, + 79, 14, 75, 34, 15, 79, 41, 22, 17, 79, + 79, 79, 79, 79, 72, 19, 20, 79, 37, 47, + 64, 79, 79, 8, 79, 59, 79, 79, 79, 62, + 53, 79, 79, 45, 79, 79, 57, 79, 46, 61, + 79, 23, 79, 79, 79, 79, 65, 7, 79, 73, + 79, 79, 70, 16, 79, 40, 79, 55, 79, 33, + 35, 79, 71, 56, 79, 79, 79, 67, 79, 79, + 79, 63, 79, 79, 79, 79, 79, 79, 79, 48, + 79, 79, 66, 79, 79, 79, 79, 79, 79, 79, + + 79, 79, 79, 50, 79, 79, 49, 0 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 30, 32, 33, + 34, 8, 8, 8, 35, 36, 37, 8, 8, 8, + 38, 39, 40, 41, 42, 8, 43, 44, 8, 45, + 46, 47, 48, 49, 50, 1, 51, 52, 53, 54, + + 55, 56, 57, 58, 59, 8, 60, 61, 62, 63, + 64, 65, 8, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 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 yyconst int yy_meta[79] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 4, + 4, 1, 1, 1, 1, 1, 1, 1, 5, 5, + 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, + 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 1, 1, 1, 1 + } ; + +static yyconst short int yy_base[516] = + { 0, + 0, 0, 659, 660, 660, 660, 633, 73, 0, 0, + 55, 71, 610, 660, 660, 631, 67, 660, 68, 66, + 74, 80, 85, 660, 660, 65, 630, 82, 660, 91, + 660, 660, 660, 629, 603, 28, 586, 67, 40, 65, + 72, 587, 88, 55, 586, 79, 101, 598, 593, 103, + 90, 584, 51, 588, 586, 660, 113, 660, 660, 660, + 133, 163, 641, 0, 0, 660, 660, 660, 660, 660, + 100, 139, 660, 660, 660, 660, 660, 660, 625, 155, + 660, 660, 162, 172, 164, 160, 142, 0, 204, 617, + 660, 660, 660, 616, 245, 603, 603, 660, 585, 564, + + 568, 580, 567, 122, 570, 141, 563, 564, 561, 144, + 568, 564, 561, 558, 0, 99, 562, 569, 562, 559, + 550, 552, 558, 551, 561, 555, 547, 551, 547, 174, + 556, 135, 158, 556, 154, 551, 547, 539, 542, 184, + 556, 167, 546, 549, 660, 660, 242, 153, 0, 660, + 660, 235, 660, 660, 251, 243, 660, 660, 233, 230, + 241, 272, 165, 660, 234, 261, 660, 660, 660, 562, + 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, + 563, 564, 536, 531, 534, 546, 541, 529, 541, 200, + 542, 537, 539, 535, 527, 524, 532, 519, 534, 0, + + 520, 524, 527, 512, 515, 518, 521, 511, 513, 514, + 519, 506, 499, 0, 516, 502, 516, 509, 246, 498, + 0, 500, 499, 501, 508, 509, 493, 491, 491, 493, + 502, 501, 497, 499, 489, 493, 484, 203, 496, 498, + 487, 486, 271, 308, 543, 278, 296, 304, 660, 660, + 306, 314, 254, 660, 277, 660, 660, 660, 660, 295, + 279, 660, 517, 505, 480, 469, 0, 481, 0, 0, + 480, 471, 479, 468, 473, 474, 0, 0, 467, 467, + 477, 463, 0, 467, 472, 467, 0, 287, 0, 472, + 457, 0, 459, 469, 0, 469, 463, 457, 453, 464, + + 449, 451, 461, 447, 459, 449, 453, 452, 457, 456, + 442, 444, 452, 450, 448, 440, 445, 446, 434, 446, + 0, 430, 442, 442, 323, 325, 660, 660, 294, 660, + 305, 467, 660, 427, 428, 0, 293, 0, 429, 430, + 436, 434, 433, 424, 423, 0, 430, 418, 422, 428, + 426, 424, 418, 408, 409, 0, 425, 406, 406, 417, + 411, 408, 416, 0, 415, 412, 416, 413, 397, 406, + 408, 393, 406, 407, 0, 0, 396, 404, 400, 395, + 396, 0, 0, 660, 660, 660, 386, 398, 398, 387, + 381, 381, 393, 0, 393, 395, 376, 0, 393, 0, + + 0, 387, 0, 381, 386, 376, 378, 375, 382, 0, + 375, 0, 0, 376, 0, 373, 0, 0, 0, 377, + 371, 375, 370, 374, 0, 0, 0, 367, 0, 0, + 360, 372, 370, 0, 361, 0, 362, 361, 360, 0, + 0, 354, 363, 0, 350, 351, 0, 353, 0, 0, + 345, 0, 347, 343, 339, 325, 0, 0, 317, 0, + 323, 315, 0, 0, 327, 0, 312, 0, 325, 319, + 0, 311, 0, 0, 303, 320, 318, 0, 309, 312, + 304, 0, 311, 299, 312, 307, 294, 304, 286, 0, + 300, 292, 0, 278, 254, 236, 250, 176, 186, 174, + + 151, 158, 128, 0, 48, 28, 0, 660, 386, 390, + 394, 399, 403, 405, 410 + } ; + +static yyconst short int yy_def[516] = + { 0, + 508, 1, 508, 508, 508, 508, 508, 509, 510, 511, + 508, 508, 512, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 508, 508, 508, 508, 508, + 509, 508, 509, 513, 511, 508, 508, 508, 508, 508, + 512, 512, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 514, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 511, 511, + + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 508, 508, 508, 515, 513, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 514, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 515, 508, 515, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 508, 508, 508, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + + 511, 511, 511, 511, 511, 511, 511, 0, 508, 508, + 508, 508, 508, 508, 508 + } ; + +static yyconst short int yy_nxt[739] = + { 0, + 4, 5, 6, 5, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 10, 43, 44, + 45, 10, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 10, 55, 10, 56, 57, 58, 59, 62, 66, + 69, 74, 507, 79, 76, 80, 80, 81, 90, 91, + 100, 75, 77, 78, 106, 70, 101, 83, 82, 84, + + 84, 141, 83, 107, 89, 89, 93, 94, 95, 118, + 150, 85, 506, 119, 142, 86, 85, 103, 96, 63, + 86, 87, 111, 88, 104, 108, 87, 109, 97, 67, + 105, 68, 112, 121, 85, 113, 110, 145, 62, 85, + 86, 508, 122, 115, 137, 86, 72, 123, 87, 71, + 116, 88, 124, 87, 117, 138, 125, 131, 244, 202, + 132, 133, 139, 126, 147, 147, 203, 134, 148, 127, + 135, 128, 188, 136, 80, 80, 189, 165, 161, 63, + 161, 155, 155, 162, 162, 222, 152, 153, 146, 83, + 154, 84, 84, 156, 157, 163, 191, 158, 223, 245, + + 505, 164, 165, 85, 227, 192, 258, 159, 196, 152, + 153, 197, 504, 160, 224, 154, 156, 157, 503, 228, + 163, 83, 158, 89, 89, 239, 85, 240, 164, 217, + 218, 225, 159, 258, 219, 85, 233, 234, 502, 86, + 160, 220, 235, 147, 147, 87, 501, 148, 500, 246, + 236, 246, 237, 319, 247, 247, 320, 251, 85, 251, + 162, 162, 252, 252, 86, 255, 272, 273, 253, 259, + 155, 155, 87, 169, 254, 170, 244, 171, 172, 173, + 174, 175, 248, 249, 176, 177, 250, 178, 179, 180, + 255, 162, 162, 253, 259, 327, 260, 247, 247, 300, + + 499, 254, 261, 498, 256, 248, 249, 257, 301, 147, + 147, 250, 328, 148, 331, 247, 247, 245, 325, 497, + 325, 260, 327, 326, 326, 252, 252, 256, 153, 261, + 329, 154, 257, 252, 252, 384, 330, 328, 496, 331, + 385, 350, 326, 326, 326, 326, 157, 389, 495, 158, + 494, 153, 351, 493, 390, 329, 154, 249, 492, 491, + 250, 490, 384, 330, 489, 385, 488, 487, 486, 157, + 485, 484, 483, 482, 158, 481, 480, 479, 478, 477, + 249, 476, 475, 474, 473, 250, 61, 61, 61, 61, + 61, 64, 472, 471, 64, 65, 470, 65, 65, 71, + + 71, 469, 71, 71, 149, 468, 149, 149, 166, 166, + 243, 243, 243, 243, 243, 467, 466, 465, 464, 463, + 462, 461, 460, 459, 458, 457, 456, 455, 454, 453, + 452, 451, 450, 449, 448, 447, 446, 445, 444, 443, + 442, 441, 440, 439, 438, 437, 436, 435, 434, 433, + 432, 431, 430, 429, 428, 427, 426, 425, 424, 423, + 422, 421, 420, 419, 418, 417, 416, 415, 414, 413, + 412, 411, 410, 409, 408, 407, 406, 405, 404, 403, + 402, 401, 400, 399, 398, 397, 396, 395, 394, 393, + 392, 391, 388, 387, 386, 383, 382, 381, 380, 379, + + 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, + 368, 367, 366, 365, 364, 363, 362, 361, 360, 359, + 358, 357, 356, 355, 354, 353, 352, 349, 348, 347, + 346, 345, 344, 343, 342, 341, 340, 339, 338, 337, + 336, 335, 334, 333, 332, 508, 324, 323, 322, 321, + 318, 317, 316, 315, 314, 313, 312, 311, 310, 309, + 308, 307, 306, 305, 304, 303, 302, 299, 298, 297, + 296, 295, 294, 293, 292, 291, 290, 289, 288, 287, + 286, 285, 284, 283, 282, 281, 280, 279, 278, 277, + 276, 275, 274, 271, 270, 269, 268, 267, 266, 265, + + 264, 263, 262, 242, 241, 238, 232, 231, 230, 229, + 226, 221, 216, 215, 214, 213, 212, 211, 210, 209, + 208, 207, 206, 205, 204, 201, 200, 199, 198, 195, + 194, 193, 190, 187, 186, 185, 184, 183, 182, 181, + 168, 167, 151, 508, 144, 143, 140, 130, 129, 120, + 114, 102, 99, 98, 92, 73, 72, 60, 508, 3, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508 + } ; + +static yyconst short int yy_chk[739] = + { 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, 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, 8, 11, + 12, 17, 506, 20, 19, 20, 20, 21, 26, 26, + 36, 17, 19, 19, 39, 12, 36, 22, 21, 22, + + 22, 53, 23, 39, 23, 23, 28, 28, 30, 44, + 71, 22, 505, 44, 53, 22, 23, 38, 30, 8, + 23, 22, 41, 22, 38, 40, 23, 40, 30, 11, + 38, 11, 41, 46, 22, 41, 40, 57, 61, 23, + 22, 72, 46, 43, 51, 23, 71, 46, 22, 72, + 43, 22, 47, 23, 43, 51, 47, 50, 148, 116, + 50, 50, 51, 47, 62, 62, 116, 50, 62, 47, + 50, 47, 104, 50, 80, 80, 104, 87, 85, 61, + 85, 83, 83, 85, 85, 132, 80, 80, 57, 84, + 80, 84, 84, 83, 83, 86, 106, 83, 132, 148, + + 503, 86, 87, 84, 135, 106, 163, 84, 110, 80, + 80, 110, 502, 84, 133, 80, 83, 83, 501, 135, + 86, 89, 83, 89, 89, 142, 84, 142, 86, 130, + 130, 133, 84, 163, 130, 89, 140, 140, 500, 89, + 84, 130, 140, 147, 147, 89, 499, 147, 498, 152, + 140, 152, 140, 238, 152, 152, 238, 156, 89, 156, + 161, 161, 156, 156, 89, 160, 190, 190, 159, 165, + 155, 155, 89, 95, 159, 95, 243, 95, 95, 95, + 95, 95, 155, 155, 95, 95, 155, 95, 95, 95, + 160, 162, 162, 159, 165, 253, 166, 246, 246, 219, + + 497, 159, 166, 496, 162, 155, 155, 162, 219, 244, + 244, 155, 255, 244, 261, 247, 247, 243, 248, 495, + 248, 166, 253, 248, 248, 251, 251, 162, 247, 166, + 260, 247, 162, 252, 252, 329, 260, 255, 494, 261, + 331, 288, 325, 325, 326, 326, 252, 337, 492, 252, + 491, 247, 288, 489, 337, 260, 247, 326, 488, 487, + 326, 486, 329, 260, 485, 331, 484, 483, 481, 252, + 480, 479, 477, 476, 252, 475, 472, 470, 469, 467, + 326, 465, 462, 461, 459, 326, 509, 509, 509, 509, + 509, 510, 456, 455, 510, 511, 454, 511, 511, 512, + + 512, 453, 512, 512, 513, 451, 513, 513, 514, 514, + 515, 515, 515, 515, 515, 448, 446, 445, 443, 442, + 439, 438, 437, 435, 433, 432, 431, 428, 424, 423, + 422, 421, 420, 416, 414, 411, 409, 408, 407, 406, + 405, 404, 402, 399, 397, 396, 395, 393, 392, 391, + 390, 389, 388, 387, 381, 380, 379, 378, 377, 374, + 373, 372, 371, 370, 369, 368, 367, 366, 365, 363, + 362, 361, 360, 359, 358, 357, 355, 354, 353, 352, + 351, 350, 349, 348, 347, 345, 344, 343, 342, 341, + 340, 339, 335, 334, 332, 324, 323, 322, 320, 319, + + 318, 317, 316, 315, 314, 313, 312, 311, 310, 309, + 308, 307, 306, 305, 304, 303, 302, 301, 300, 299, + 298, 297, 296, 294, 293, 291, 290, 286, 285, 284, + 282, 281, 280, 279, 276, 275, 274, 273, 272, 271, + 268, 266, 265, 264, 263, 245, 242, 241, 240, 239, + 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, + 227, 226, 225, 224, 223, 222, 220, 218, 217, 216, + 215, 213, 212, 211, 210, 209, 208, 207, 206, 205, + 204, 203, 202, 201, 199, 198, 197, 196, 195, 194, + 193, 192, 191, 189, 188, 187, 186, 185, 184, 183, + + 182, 181, 170, 144, 143, 141, 139, 138, 137, 136, + 134, 131, 129, 128, 127, 126, 125, 124, 123, 122, + 121, 120, 119, 118, 117, 114, 113, 112, 111, 109, + 108, 107, 105, 103, 102, 101, 100, 99, 97, 96, + 94, 90, 79, 63, 55, 54, 52, 49, 48, 45, + 42, 37, 35, 34, 27, 16, 13, 7, 3, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508 + } ; + +static yy_state_type yy_last_accepting_state; +static 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 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "cscanner.l" +#define INITIAL 0 +/*;-*-C-*-; +** Copyright (c) Massachusetts Institute of Technology 1994-1998. +** All Rights Reserved. +** Unpublished rights reserved under the copyright laws of +** the United States. +** +** THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED +** OR IMPLIED. ANY USE IS AT YOUR OWN RISK. +** +** This code is distributed freely and may be used freely under the +** following conditions: +** +** 1. This notice may not be removed or altered. +** +** 2. Works derived from this code are not distributed for +** commercial gain without explicit permission from MIT +** (for permission contact lclint-request@sds.lcs.mit.edu). +*/ +/* + * Modified by Herbert 08/19/97: + * - added #include for IBM's OS/2 compiler. + * - fixed weird bug with lookup of tmp files (OS/2 and MSDOS only). + */ +/* + * Modified by Mike Smith + * Corrected missing 'line' in scanf() calls in handleSpecial(). + * Without this, I get an error when LCLint hits a '#line' directive + * in the pre-pre-processed source files. For safety, I have made these + * conditional on OS2 and MSDOS because I don't understand why noone else + * has seen this problem. + * + * Modified by Mike Smith, 4th June 1997 + * Finally resolved the #line problem. The scanf() calls have been fixed to + * allow the following #line forms:- + * + * #line 123 "filename" + * #line 123 + * # 123 "filename" + * # 123 + * + * The last two are generated by the GNU pre-processor, apparently + */ +#line 56 "cscanner.l" +/* +** based on original C lexer by Nate Osgood +** from hacrat@catfish.lcs.mit.edu Mon Jun 14 13:06:32 1993 +** +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +# ifdef SANITIZER +# include "sgrammar.h" +# include "sgrammar_tokens.h" +# else +# include "cgrammar.h" +# include "cgrammar_tokens.h" +# endif + +# include "fileIdList.h" +# include "portab.h" + +# if defined(OS2) && defined(__IBMC__) + /* needed for isatty()... */ +# include +# endif + +static bool lastWasString = FALSE; +static char savechar = '\0'; + +/*@notfunction@*/ +# define yyinput() (incColumn (), getc (yyin)) + +/*@-noparams@*/ +/*@-incondefs@*/ +extern /*@external@*/ int read (); +/*@=incondefs@*/ +/*@=noparams@*/ + +static /*@owned@*/ cstring lastidprocessed = cstring_undefined; + +static int lminput (void); +static int tokLength = 0; +static bool inSpecPart = FALSE; +static bool continueLine = FALSE; + +static int ninput (void); +static char processChar (void); +static double processFloat (void); +static /*@only@*/ exprNode processString (void); +static long processDec (void); +static long processHex (void); +static long processOctal (void); +static int processIdentifier (/*@only@*/ cstring) + /*@globals undef lastidprocessed@*/ ; +static bool processHashIdentifier (/*@only@*/ cstring) + /*@globals undef lastidprocessed@*/ ; + +static int processSpec (int); +static bool handleSpecial (char *); +static int handleLlSpecial (void); +static void handleMacro (void); +static bool processMacro (void); +static /*@only@*/ cstring makeIdentifier (char *); + +/* yes, this is exported! */ +bool g_expectingTypeName = TRUE; /* beginning of file can be type name! */ + +static int returnInt (ctype, long); +static int returnFloat (ctype, double); +static int returnChar (char); +static void setTokLength (int) /*@modifies g_currentloc@*/ ; +static void setTokLengthT (size_t) /*@modifies g_currentloc@*/ ; + +static void advanceLine (void) +{ + tokLength = 0; + beginLine (); +} + +/*@-allmacros@*/ +# define RETURN_INT(c,i) \ + do { lastWasString = FALSE; \ + return (returnInt (c, i)); } while (FALSE) + +# define RETURN_FLOAT(c,f) \ + do { lastWasString = FALSE; \ + return (returnFloat (c, f)); \ + } while (FALSE) + +# define RETURN_CHAR(c) \ + do { lastWasString = FALSE; \ + return (returnChar (c)); \ + } while (FALSE) + +# define RETURN_TOK(t) \ + do { yylval.tok = lltok_create (t, fileloc_decColumn (g_currentloc, tokLength)); \ + tokLength = 0; \ + lastWasString = FALSE; \ + return (t); } while (FALSE) + +# define RETURN_TYPE(t, ct) \ + do { yylval.ctyp = ct; tokLength = 0; return (t); } while (FALSE) + +/* don't fileloc_decColumn (g_currentloc, tokLength)); + the string could have \n's in it! +*/ + +# define RETURN_STRING(c) \ + do { yylval.expr = exprNode_stringLiteral (c, fileloc_decColumn (g_currentloc, tokLength)); \ + tokLength = 0; \ + lastWasString = TRUE; \ + return (CCONSTANT); } while (FALSE) + +# define RETURN_EXPR(e) \ + do { yylval.expr = e; \ + tokLength = 0; \ + lastWasString = TRUE; \ + return (CCONSTANT); } while (FALSE) + +/*@=allmacros@*/ + +static void setTokLength (int len) +{ + addColumn (len); + tokLength = len; +} + +static void setTokLengthT (size_t len) +{ + setTokLength (size_toInt (len)); +} + +# include "flex.head" +#line 872 "lex.yy.c" + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* 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. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 190 "cscanner.l" + + +#line 1026 "lex.yy.c" + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + 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; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*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 = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 509 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 660 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* 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: +YY_RULE_SETUP +#line 192 "cscanner.l" +{ llfatalbug (cstring_makeLiteral ("Comment in pre-processor output")); } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 194 "cscanner.l" +{ + context_saveLocation (); + setTokLength (longUnsigned_toInt (mstring_length (yytext))); + + if (processHashIdentifier (makeIdentifier (yytext + 1))) + { + if (lastWasString) + { + ; + } + else + { + RETURN_STRING (cstring_makeLiteral ("\"\"")); + } + } + else + { + if (handleSpecial (yytext)) + { + setTokLength (1); + RETURN_TOK (0); + } + } + } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 218 "cscanner.l" +{ if (handleSpecial (yytext)) + { + setTokLength (1); RETURN_TOK (0); + } + } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 223 "cscanner.l" +{ setTokLength (3); RETURN_TOK (CTOK_ELIPSIS); } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 224 "cscanner.l" +{ setTokLength (5); RETURN_TOK (BREAK); } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 225 "cscanner.l" +{ setTokLength (4); RETURN_TOK (CASE); } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 226 "cscanner.l" +{ setTokLength (8); RETURN_TOK (CONTINUE); } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 227 "cscanner.l" +{ setTokLength (7); RETURN_TOK (DEFAULT); } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 228 "cscanner.l" +{ setTokLength (2); RETURN_TOK (DO); } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 229 "cscanner.l" +{ setTokLength (4); RETURN_TOK (CELSE); } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 230 "cscanner.l" +{ setTokLength (3); RETURN_TOK (CFOR); } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 231 "cscanner.l" +{ setTokLength (4); RETURN_TOK (GOTO); } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 232 "cscanner.l" +{ setTokLength (2); RETURN_TOK (CIF); } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 233 "cscanner.l" +{ setTokLength (6); RETURN_TOK (RETURN); } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 234 "cscanner.l" +{ setTokLength (6); RETURN_TOK (CSIZEOF); } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 235 "cscanner.l" +{ setTokLength (8); RETURN_TOK (COFFSETOF); } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 236 "cscanner.l" +{ setTokLength (6); RETURN_TOK (SWITCH); } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 237 "cscanner.l" +{ setTokLength (5); RETURN_TOK (WHILE); } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 238 "cscanner.l" +{ setTokLength (6); RETURN_TOK (VA_ARG); } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 239 "cscanner.l" +{ setTokLength (6); RETURN_TOK (VA_DCL); } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 240 "cscanner.l" +{ + /* gcc extension...this might not be appropriate */ + setTokLength (6); RETURN_TOK (QINLINE); } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 244 "cscanner.l" +{ setTokLength (6); RETURN_TOK (CSTRUCT); } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 245 "cscanner.l" +{ setTokLength (7); RETURN_TOK (CTYPEDEF); } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 247 "cscanner.l" +{ setTokLength (5); RETURN_TOK (CUNION); } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 248 "cscanner.l" +{ setTokLength (4); RETURN_TOK (CENUM); } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 250 "cscanner.l" +{ setTokLength (4); RETURN_TYPE (CVOID, ctype_void); } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 251 "cscanner.l" +{ setTokLength (3); RETURN_TYPE (CINT, ctype_int); } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 252 "cscanner.l" +{ setTokLength (6); RETURN_TYPE (CDOUBLE, ctype_double); } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 253 "cscanner.l" +{ setTokLength (4); RETURN_TYPE (CGCHAR, ctype_char); } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 254 "cscanner.l" +{ setTokLength (5); RETURN_TYPE (CGFLOAT, ctype_float); } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 256 "cscanner.l" +{ setTokLength (4); RETURN_TOK (QLONG); } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 257 "cscanner.l" +{ setTokLength (5); RETURN_TOK (QSHORT); } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 258 "cscanner.l" +{ setTokLength (8); RETURN_TOK (QUNSIGNED); } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 259 "cscanner.l" +{ setTokLength (6); RETURN_TOK (QSIGNED); } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 261 "cscanner.l" +{ setTokLength (8); RETURN_TOK (QVOLATILE); } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 262 "cscanner.l" +{ setTokLength (5); RETURN_TOK (QCONST); } + YY_BREAK +/* some systems expect this! [gack!] */ +case 37: +YY_RULE_SETUP +#line 265 "cscanner.l" +{ setTokLength (7); RETURN_TOK (QCONST); } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 267 "cscanner.l" +{ setTokLength (6); RETURN_TOK (QEXTERN); } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 268 "cscanner.l" +{ setTokLength (4); RETURN_TOK (QAUTO); } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 269 "cscanner.l" +{ setTokLength (8); RETURN_TOK (QREGISTER); } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 270 "cscanner.l" +{ setTokLength (6); RETURN_TOK (QSTATIC); } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 272 "cscanner.l" +{ RETURN_EXPR (processString ()); } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 273 "cscanner.l" +{ return (processSpec (QOUT)); } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 274 "cscanner.l" +{ return (processSpec (QIN)); } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 275 "cscanner.l" +{ return (processSpec (QPARTIAL)); } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 276 "cscanner.l" +{ return (processSpec (QSPECIAL)); } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 277 "cscanner.l" +{ return (processSpec (QANYTYPE)); } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 278 "cscanner.l" +{ return (processSpec (QINTEGRALTYPE)); } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 279 "cscanner.l" +{ return (processSpec (QUNSIGNEDINTEGRALTYPE)); } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 280 "cscanner.l" +{ return (processSpec (QSIGNEDINTEGRALTYPE)); } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 281 "cscanner.l" +{ return (processSpec (QKEEP)); } + YY_BREAK +case 52: +YY_RULE_SETUP +#line 282 "cscanner.l" +{ return (processSpec (QNULL)); } + YY_BREAK +case 53: +YY_RULE_SETUP +#line 283 "cscanner.l" +{ return (processSpec (QNOTNULL)); } + YY_BREAK +case 54: +YY_RULE_SETUP +#line 284 "cscanner.l" +{ return (processSpec (QISNULL)); } + YY_BREAK +case 55: +YY_RULE_SETUP +#line 285 "cscanner.l" +{ return (processSpec (QTRUENULL)); } + YY_BREAK +case 56: +YY_RULE_SETUP +#line 286 "cscanner.l" +{ return (processSpec (QFALSENULL)); } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 287 "cscanner.l" +{ return (processSpec (QRELNULL)); } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 288 "cscanner.l" +{ return (processSpec (QRELDEF)); } + YY_BREAK +case 59: +YY_RULE_SETUP +#line 289 "cscanner.l" +{ return (processSpec (QEXPOSED)); } + YY_BREAK +case 60: +YY_RULE_SETUP +#line 290 "cscanner.l" +{ return (processSpec (QNEWREF)); } + YY_BREAK +case 61: +YY_RULE_SETUP +#line 291 "cscanner.l" +{ return (processSpec (QTEMPREF)); } + YY_BREAK +case 62: +YY_RULE_SETUP +#line 292 "cscanner.l" +{ return (processSpec (QKILLREF)); } + YY_BREAK +case 63: +YY_RULE_SETUP +#line 293 "cscanner.l" +{ return (processSpec (QREFCOUNTED)); } + YY_BREAK +case 64: +YY_RULE_SETUP +#line 294 "cscanner.l" +{ return (processSpec (QCHECKED)); } + YY_BREAK +case 65: +YY_RULE_SETUP +#line 295 "cscanner.l" +{ return (processSpec (QCHECKMOD)); } + YY_BREAK +case 66: +YY_RULE_SETUP +#line 296 "cscanner.l" +{ return (processSpec (QCHECKEDSTRICT)); } + YY_BREAK +case 67: +YY_RULE_SETUP +#line 297 "cscanner.l" +{ return (processSpec (QUNCHECKED)); } + YY_BREAK +case 68: +YY_RULE_SETUP +#line 298 "cscanner.l" +{ return (processSpec (QONLY)); } + YY_BREAK +case 69: +YY_RULE_SETUP +#line 299 "cscanner.l" +{ return (processSpec (QOWNED)); } + YY_BREAK +case 70: +YY_RULE_SETUP +#line 300 "cscanner.l" +{ return (processSpec (QOBSERVER)); } + YY_BREAK +case 71: +YY_RULE_SETUP +#line 301 "cscanner.l" +{ return (processSpec (QDEPENDENT)); } + YY_BREAK +case 72: +YY_RULE_SETUP +#line 302 "cscanner.l" +{ return (processSpec (QUNUSED)); } + YY_BREAK +case 73: +YY_RULE_SETUP +#line 303 "cscanner.l" +{ return (processSpec (QEXTERNAL)); } + YY_BREAK +case 74: +YY_RULE_SETUP +#line 304 "cscanner.l" +{ return (processSpec (QSEF)); } + YY_BREAK +case 75: +YY_RULE_SETUP +#line 305 "cscanner.l" +{ return (processSpec (QSHARED)); } + YY_BREAK +case 76: +YY_RULE_SETUP +#line 306 "cscanner.l" +{ return (processSpec (QYIELD)); } + YY_BREAK +case 77: +YY_RULE_SETUP +#line 307 "cscanner.l" +{ return (processSpec (QUNDEF)); } + YY_BREAK +case 78: +YY_RULE_SETUP +#line 308 "cscanner.l" +{ return (processSpec (QKILLED)); } + YY_BREAK +case 79: +YY_RULE_SETUP +#line 309 "cscanner.l" +{ int tok; + context_saveLocation (); + setTokLength (longUnsigned_toInt (mstring_length (yytext))); + tok = processIdentifier (makeIdentifier (yytext)); + if (tok != BADTOK) + { + return (tok); + } + } + YY_BREAK +case 80: +YY_RULE_SETUP +#line 318 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_int, processHex ()); /* evs 2000-05-17 was ctype_uint */ + } + YY_BREAK +case 81: +YY_RULE_SETUP +#line 321 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_lint, processHex ()); } + YY_BREAK +case 82: +YY_RULE_SETUP +#line 323 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_llint, processHex ()); } + YY_BREAK +case 83: +YY_RULE_SETUP +#line 325 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_uint, processHex ()); } + YY_BREAK +case 84: +YY_RULE_SETUP +#line 327 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ulint, processHex ()); } + YY_BREAK +case 85: +YY_RULE_SETUP +#line 329 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processHex ()); } + YY_BREAK +case 86: +YY_RULE_SETUP +#line 331 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processHex ()); } + YY_BREAK +case 87: +YY_RULE_SETUP +#line 333 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_int, processOctal ()); } + YY_BREAK +case 88: +YY_RULE_SETUP +#line 335 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_uint, processOctal ()); } + YY_BREAK +case 89: +YY_RULE_SETUP +#line 337 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_lint, processOctal ()); } + YY_BREAK +case 90: +YY_RULE_SETUP +#line 339 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_llint, processOctal ()); } + YY_BREAK +case 91: +YY_RULE_SETUP +#line 341 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ulint, processOctal ()); } + YY_BREAK +case 92: +YY_RULE_SETUP +#line 343 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processOctal ()); } + YY_BREAK +case 93: +YY_RULE_SETUP +#line 345 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processOctal ()); } + YY_BREAK +case 94: +YY_RULE_SETUP +#line 347 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_int, processDec ()); } + YY_BREAK +case 95: +YY_RULE_SETUP +#line 349 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_uint, processDec ()); } + YY_BREAK +case 96: +YY_RULE_SETUP +#line 351 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_lint, processDec ()); } + YY_BREAK +case 97: +YY_RULE_SETUP +#line 353 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_llint, processDec ()); } + YY_BREAK +case 98: +YY_RULE_SETUP +#line 355 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ulint, processDec ()); } + YY_BREAK +case 99: +YY_RULE_SETUP +#line 357 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processDec ()); } + YY_BREAK +case 100: +YY_RULE_SETUP +#line 359 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processDec ()); } + YY_BREAK +case 101: +YY_RULE_SETUP +#line 361 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_CHAR (processChar ()); } + YY_BREAK +case 102: +YY_RULE_SETUP +#line 363 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_float, processFloat ()); } + YY_BREAK +case 103: +YY_RULE_SETUP +#line 365 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_ldouble, processFloat ()); } + YY_BREAK +case 104: +YY_RULE_SETUP +#line 367 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_double, processFloat ()); } + YY_BREAK +case 105: +YY_RULE_SETUP +#line 370 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_float, processFloat ()); } + YY_BREAK +case 106: +YY_RULE_SETUP +#line 372 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_ldouble, processFloat ()); } + YY_BREAK +case 107: +YY_RULE_SETUP +#line 374 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_double, processFloat ()); } + YY_BREAK +case 108: +YY_RULE_SETUP +#line 377 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_float, processFloat ()); } + YY_BREAK +case 109: +YY_RULE_SETUP +#line 379 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_ldouble, processFloat ()); } + YY_BREAK +case 110: +YY_RULE_SETUP +#line 381 "cscanner.l" +{ setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_double, processFloat ()); } + YY_BREAK +case 111: +YY_RULE_SETUP +#line 384 "cscanner.l" +{ setTokLength (3); RETURN_TOK (RIGHT_ASSIGN); } + YY_BREAK +case 112: +YY_RULE_SETUP +#line 385 "cscanner.l" +{ setTokLength (3); RETURN_TOK (LEFT_ASSIGN); } + YY_BREAK +case 113: +YY_RULE_SETUP +#line 386 "cscanner.l" +{ setTokLength (2); RETURN_TOK (ADD_ASSIGN); } + YY_BREAK +case 114: +YY_RULE_SETUP +#line 387 "cscanner.l" +{ setTokLength (2); RETURN_TOK (SUB_ASSIGN); } + YY_BREAK +case 115: +YY_RULE_SETUP +#line 388 "cscanner.l" +{ setTokLength (2); RETURN_TOK (MUL_ASSIGN); } + YY_BREAK +case 116: +YY_RULE_SETUP +#line 389 "cscanner.l" +{ setTokLength (2); RETURN_TOK (DIV_ASSIGN); } + YY_BREAK +case 117: +YY_RULE_SETUP +#line 390 "cscanner.l" +{ setTokLength (2); RETURN_TOK (MOD_ASSIGN); } + YY_BREAK +case 118: +YY_RULE_SETUP +#line 391 "cscanner.l" +{ setTokLength (2); RETURN_TOK (AND_ASSIGN); } + YY_BREAK +case 119: +YY_RULE_SETUP +#line 392 "cscanner.l" +{ setTokLength (2); RETURN_TOK (XOR_ASSIGN); } + YY_BREAK +case 120: +YY_RULE_SETUP +#line 393 "cscanner.l" +{ setTokLength (2); RETURN_TOK (OR_ASSIGN); } + YY_BREAK +case 121: +YY_RULE_SETUP +#line 394 "cscanner.l" +{ setTokLength (2); RETURN_TOK (RIGHT_OP); } + YY_BREAK +case 122: +YY_RULE_SETUP +#line 395 "cscanner.l" +{ setTokLength (2); RETURN_TOK (LEFT_OP); } + YY_BREAK +case 123: +YY_RULE_SETUP +#line 396 "cscanner.l" +{ setTokLength (2); RETURN_TOK (INC_OP); } + YY_BREAK +case 124: +YY_RULE_SETUP +#line 397 "cscanner.l" +{ setTokLength (2); RETURN_TOK (DEC_OP); } + YY_BREAK +case 125: +YY_RULE_SETUP +#line 398 "cscanner.l" +{ setTokLength (2); RETURN_TOK (ARROW_OP); } + YY_BREAK +case 126: +YY_RULE_SETUP +#line 399 "cscanner.l" +{ setTokLength (2); RETURN_TOK (AND_OP); } + YY_BREAK +case 127: +YY_RULE_SETUP +#line 400 "cscanner.l" +{ setTokLength (2); RETURN_TOK (OR_OP); } + YY_BREAK +case 128: +YY_RULE_SETUP +#line 401 "cscanner.l" +{ setTokLength (2); RETURN_TOK (LE_OP); } + YY_BREAK +case 129: +YY_RULE_SETUP +#line 402 "cscanner.l" +{ setTokLength (2); RETURN_TOK (GE_OP); } + YY_BREAK +case 130: +YY_RULE_SETUP +#line 403 "cscanner.l" +{ setTokLength (2); RETURN_TOK (EQ_OP); } + YY_BREAK +case 131: +YY_RULE_SETUP +#line 404 "cscanner.l" +{ setTokLength (2); RETURN_TOK (NE_OP); } + YY_BREAK +case 132: +YY_RULE_SETUP +#line 405 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TSEMI); } + YY_BREAK +case 133: +YY_RULE_SETUP +#line 406 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TLBRACE); } + YY_BREAK +case 134: +YY_RULE_SETUP +#line 407 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TRBRACE); } + YY_BREAK +case 135: +YY_RULE_SETUP +#line 408 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TCOMMA); } + YY_BREAK +case 136: +YY_RULE_SETUP +#line 409 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TCOLON); } + YY_BREAK +case 137: +YY_RULE_SETUP +#line 410 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TASSIGN); } + YY_BREAK +case 138: +YY_RULE_SETUP +#line 411 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TLPAREN); } + YY_BREAK +case 139: +YY_RULE_SETUP +#line 412 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TRPAREN); } + YY_BREAK +case 140: +YY_RULE_SETUP +#line 413 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TLSQBR); } + YY_BREAK +case 141: +YY_RULE_SETUP +#line 414 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TRSQBR); } + YY_BREAK +case 142: +YY_RULE_SETUP +#line 415 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TDOT); } + YY_BREAK +case 143: +YY_RULE_SETUP +#line 416 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TAMPERSAND); } + YY_BREAK +case 144: +YY_RULE_SETUP +#line 417 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TEXCL); } + YY_BREAK +case 145: +YY_RULE_SETUP +#line 420 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TTILDE); } + YY_BREAK +case 146: +YY_RULE_SETUP +#line 421 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TMINUS); } + YY_BREAK +case 147: +YY_RULE_SETUP +#line 422 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TPLUS); } + YY_BREAK +case 148: +YY_RULE_SETUP +#line 423 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TMULT); } + YY_BREAK +case 149: +YY_RULE_SETUP +#line 424 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TDIV); } + YY_BREAK +case 150: +YY_RULE_SETUP +#line 425 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TPERCENT); } + YY_BREAK +case 151: +YY_RULE_SETUP +#line 426 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TLT); } + YY_BREAK +case 152: +YY_RULE_SETUP +#line 427 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TGT); } + YY_BREAK +case 153: +YY_RULE_SETUP +#line 428 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TCIRC); } + YY_BREAK +case 154: +YY_RULE_SETUP +#line 429 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TBAR); } + YY_BREAK +case 155: +YY_RULE_SETUP +#line 430 "cscanner.l" +{ setTokLength (1); RETURN_TOK (TQUEST); } + YY_BREAK +case 156: +YY_RULE_SETUP +#line 432 "cscanner.l" +{ incColumn (); } + YY_BREAK +case 157: +YY_RULE_SETUP +#line 433 "cscanner.l" +{ context_incLineno (); + if (continueLine) + { + continueLine = FALSE; + } + else + { + if (context_inMacro ()) + { + /* Don't use RETURN_TOK */ + yylval.tok = lltok_create (TENDMACRO, g_currentloc); + lastWasString = FALSE; + return (TENDMACRO); + } + } + } + YY_BREAK +case 158: +YY_RULE_SETUP +#line 449 "cscanner.l" +{ setTokLength (6); + + if (processMacro ()) { + if (context_inIterDef ()) + { + RETURN_TOK (LLMACROITER); + } + if (context_inIterEnd ()) + { + RETURN_TOK (LLMACROEND); + } + if (context_inMacro ()) + { + RETURN_TOK (LLMACRO); + } + } + } + YY_BREAK +case 159: +YY_RULE_SETUP +#line 466 "cscanner.l" +{ if (context_inHeader () || context_inFunction ()) + { + handleMacro (); + } + else + { + int nspchar = ninput (); + int nspaces; + + /* + ** This is a hack to get the column number correct. + */ + + llassert (nspchar >= '0' && nspchar <= '9'); + + nspaces = nspchar - '0'; + + setTokLength (5 + nspaces); + + if (processMacro ()) + { + if (context_inIterDef ()) + { + RETURN_TOK (LLMACROITER); + } + if (context_inIterEnd ()) + { + RETURN_TOK (LLMACROEND); + } + if (context_inMacro ()) + { + RETURN_TOK (LLMACRO); + } + } + } + } + YY_BREAK +case 160: +YY_RULE_SETUP +#line 502 "cscanner.l" +{ setTokLength (4); lldiagmsg (ctype_unparseTable ()); } + YY_BREAK +case 161: +YY_RULE_SETUP +#line 503 "cscanner.l" +{ setTokLength (3); + lldiagmsg (message ("%q: *** marker ***", fileloc_unparse (g_currentloc))); + } + YY_BREAK +case 162: +YY_RULE_SETUP +#line 506 "cscanner.l" +{ setTokLength (3); usymtab_printLocal (); } + YY_BREAK +case 163: +YY_RULE_SETUP +#line 507 "cscanner.l" +{ setTokLength (3); lldiagmsg (usymtab_unparseAliases ()); } + YY_BREAK +case 164: +YY_RULE_SETUP +#line 508 "cscanner.l" +{ setTokLength (3); lldiagmsg (context_unparse ()); } + YY_BREAK +case 165: +YY_RULE_SETUP +#line 509 "cscanner.l" +{ setTokLength (3); lldiagmsg (context_unparseClauses ()); } + YY_BREAK +case 166: +YY_RULE_SETUP +#line 510 "cscanner.l" +{ setTokLength (3); usymtab_printGuards (); } + YY_BREAK +case 167: +YY_RULE_SETUP +#line 511 "cscanner.l" +{ setTokLength (3); usymtab_printOut (); } + YY_BREAK +case 168: +YY_RULE_SETUP +#line 512 "cscanner.l" +{ setTokLength (3); usymtab_printAll (); } + YY_BREAK +case 169: +YY_RULE_SETUP +#line 513 "cscanner.l" +{ setTokLength (3); usymtab_printComplete (); } + YY_BREAK +case 170: +YY_RULE_SETUP +#line 514 "cscanner.l" +{ setTokLength (3); usymtab_printTypes (); } + YY_BREAK +case 171: +YY_RULE_SETUP +#line 515 "cscanner.l" +{ setTokLength (3); lldiagmsg (usymtab_unparseStack ()); } + YY_BREAK +case 172: +YY_RULE_SETUP +#line 516 "cscanner.l" +{ setTokLength (3); + lldiagmsg (message ("Can modify: %q", + sRefSet_unparse (context_modList ()))); + } + YY_BREAK +case 173: +YY_RULE_SETUP +#line 520 "cscanner.l" +{ /* BEFORE_COMMENT_MARKER */ + int tok; + incColumn (); incColumn (); + tok = handleLlSpecial (); + if (tok != BADTOK) + { + RETURN_TOK (tok); + } + } + YY_BREAK +case 174: +YY_RULE_SETUP +#line 529 "cscanner.l" +{ /* AFTER_COMMENT_MARKER */ + setTokLength (2); + inSpecPart = FALSE; + RETURN_TOK (QENDMACRO); } + YY_BREAK +case 175: +YY_RULE_SETUP +#line 533 "cscanner.l" +{ incColumn (); continueLine = TRUE; } + YY_BREAK +case 176: +YY_RULE_SETUP +#line 534 "cscanner.l" +{ incColumn (); + voptgenerror + (FLG_SYNTAX, + message ("Invalid character (ascii: %d), skipping character", + (int)(*yytext)), + g_currentloc); + } + YY_BREAK +case 177: +YY_RULE_SETUP +#line 541 "cscanner.l" +ECHO; + YY_BREAK +#line 2152 "lex.yy.c" +case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* 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 input(). + */ + 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_ptr + 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_ptr + 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_c_buf_p; + 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_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + 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_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + 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_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new 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 char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + 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" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_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_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*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 = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 509 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) 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( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + register 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 = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 509 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 508); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register 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 */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + 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" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = 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 */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + 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 + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + 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_ptr = 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) yy_flex_alloc( 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 = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + 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 ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#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 + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* 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[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#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 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 541 "cscanner.l" + + +struct skeyword +{ + /*@null@*/ /*@observer@*/ char *name; + int token; +} ; + +/* +** These tokens are followed by syntax that is parsed by the +** grammar proper. +*/ + +struct skeyword s_parsetable[] = { + { "modifies", QMODIFIES } , + { "globals", QGLOBALS } , + { "alt", QALT } , + { "constant", QCONSTANT } , + { "function", QFUNCTION } , + { "iter", QITER } , + { "defines", QDEFINES } , + { "uses", QUSES } , + { "allocates", QALLOCATES } , + { "sets", QSETS } , + { "releases", QRELEASES } , + { "pre", QPRECLAUSE } , + { "post", QPOSTCLAUSE } , + { NULL, BADTOK } +} ; + +/* +** These tokens are either stand-alone tokens, or followed by +** token-specific text. +*/ + +struct skeyword s_keytable[] = { + { "anytype", QANYTYPE } , + { "integraltype", QINTEGRALTYPE } , + { "unsignedintegraltype", QUNSIGNEDINTEGRALTYPE } , + { "signedintegraltype", QSIGNEDINTEGRALTYPE } , + { "out", QOUT } , + { "in", QIN } , + { "only", QONLY } , + { "owned", QOWNED } , + { "dependent", QDEPENDENT } , + { "partial", QPARTIAL } , + { "special", QSPECIAL } , + { "truenull", QTRUENULL } , + { "falsenull", QFALSENULL } , + { "keep", QKEEP } , + { "kept", QKEPT } , + { "notnull", QNOTNULL } , + { "abstract", QABSTRACT } , + { "concrete", QCONCRETE } , + { "mutable", QMUTABLE } , + { "immutable", QIMMUTABLE } , + { "unused", QUNUSED } , + { "external", QEXTERNAL } , + { "sef", QSEF } , + { "unique", QUNIQUE } , + { "returned", QRETURNED } , + { "exposed", QEXPOSED } , + { "refcounted", QREFCOUNTED } , + { "refs", QREFS } , + { "newref", QNEWREF } , + { "tempref", QTEMPREF } , + { "killref", QKILLREF } , + { "null", QNULL } , + { "relnull", QRELNULL } , + { "reldef", QRELDEF } , + { "observer", QOBSERVER } , + { "exits", QEXITS } , + { "mayexit", QMAYEXIT } , + { "trueexit", QTRUEEXIT } , + { "falseexit", QFALSEEXIT } , + { "neverexit", QNEVEREXIT } , + { "temp", QTEMP } , + { "shared", QSHARED } , + { "ref", QREF } , + { "unchecked", QUNCHECKED } , + { "checked", QCHECKED } , + { "checkmod", QCHECKMOD } , + { "checkedstrict", QCHECKEDSTRICT } , + { "innercontinue", QINNERCONTINUE } , + { "innerbreak", QINNERBREAK } , + { "loopbreak", QLOOPBREAK } , + { "switchbreak", QSWITCHBREAK } , + { "safebreak", QSAFEBREAK } , + { "fallthrough", QFALLTHROUGH } , + { "l_fallthrou", QLINTFALLTHROUGH } , + { "l_fallth", QLINTFALLTHRU } , + { "notreached", QNOTREACHED } , + { "l_notreach", QLINTNOTREACHED } , + { "printflike", QPRINTFLIKE } , + { "l_printfli", QLINTPRINTFLIKE } , + { "scanflike", QSCANFLIKE } , + { "messagelike", QMESSAGELIKE } , + { "l_argsus", QARGSUSED } , + { NULL, BADTOK } +} ; + +/* +** would be better if these weren't hard coded... +*/ + +static bool isArtificial (cstring s) +{ + return (cstring_equalLit (s, "modifies") + || cstring_equalLit (s, "globals") + || cstring_equalLit (s, "alt")); +} + +void swallowMacro (void) +{ + int i; + bool skipnext = FALSE; + + while ((i = lminput ()) != EOF) + { + char c = (char) i; + + + if (c == '\\') + { + skipnext = TRUE; + } + else if (c == '\n') + { + if (skipnext) + { + skipnext = FALSE; + } + else + { + checkUngetc (i, yyin); + return; + } + } + } + + if (i != EOF) + { + checkUngetc (i, yyin); + } +} + +static int commentMarkerToken (cstring s) +{ + int i = 0; + + while (s_parsetable[i].name != NULL) + { + if (cstring_equalLit (s, s_parsetable[i].name)) + { + return s_parsetable[i].token; + } + + i++; + } + + return BADTOK; +} + +static int tokenMacroCode (cstring s) +{ + int i = 0; + + while (s_keytable[i].name != NULL) + { + if (cstring_equalLit (s, s_keytable[i].name)) + { + if (s_keytable[i].token == QLINTFALLTHROUGH) + { + voptgenerror + (FLG_WARNLINTCOMMENTS, + cstring_makeLiteral + ("Traditional lint comment /*FALLTHROUGH*/ used. " + "This is interpreted by " + "LCLint in the same way as most Unix lints, but it is " + "preferable to replace it with the /*@fallthrough@*/ " + "stylized comment"), + g_currentloc); + return QFALLTHROUGH; + } + else if (s_keytable[i].token == QLINTFALLTHRU) + { + voptgenerror + (FLG_WARNLINTCOMMENTS, + cstring_makeLiteral + ("Traditional lint comment /*FALLTHRU*/ used. " + "This is interpreted by " + "LCLint in the same way as most Unix lints, but it is " + "preferable to replace it with the /*@fallthrough@*/ " + "stylized comment"), + g_currentloc); + return QFALLTHROUGH; + } + else if (s_keytable[i].token == QLINTNOTREACHED) + { + voptgenerror + (FLG_WARNLINTCOMMENTS, + cstring_makeLiteral + ("Traditional lint comment /*NOTREACHED*/ used. " + "This is interpreted by " + "LCLint in the same way as most Unix lints, but it is " + "preferable to replace it with the /*@notreached@*/ " + "stylized comment."), + g_currentloc); + + return QNOTREACHED; + } + else if (s_keytable[i].token == QPRINTFLIKE) + { + setSpecialFunction (QU_PRINTFLIKE); + return SKIPTOK; + } + else if (s_keytable[i].token == QLINTPRINTFLIKE) + { + voptgenerror + (FLG_WARNLINTCOMMENTS, + cstring_makeLiteral + ("Traditional lint comment /*PRINTFLIKE*/ used. " + "This is interpreted by " + "LCLint in the same way as most Unix lints, but it is " + "preferable to replace it with either /*@printflike@*/, " + "/*@scanflike@*/ or /*@messagelike@*/."), + g_currentloc); + + setSpecialFunction (QU_PRINTFLIKE); + return SKIPTOK; + } + else if (s_keytable[i].token == QSCANFLIKE) + { + setSpecialFunction (QU_SCANFLIKE); + return SKIPTOK; + } + else if (s_keytable[i].token == QMESSAGELIKE) + { + setSpecialFunction (QU_MESSAGELIKE); + return SKIPTOK; + } + else if (s_keytable[i].token == QARGSUSED) + { + voptgenerror + (FLG_WARNLINTCOMMENTS, + cstring_makeLiteral + ("Traditional lint comment /*ARGSUSED*/ used. " + "This is interpreted by " + "LCLint in the same way as most Unix lints, but it is " + "preferable to use /*@unused@*/ annotations on " + "the unused parameters."), + g_currentloc); + + setArgsUsed (); + return SKIPTOK; + } + + return s_keytable[i].token; + } + + i++; + } + + return BADTOK; +} + +static int lminput () +{ + if (savechar == '\0') + { + incColumn (); + return (input ()); + } + else + { + int save = (int) savechar; + savechar = '\0'; + return save; + } +} + +static void lmsavechar (char c) +{ + if (savechar == '\0') savechar = c; + else + { + llbuglit ("lmsavechar: override"); + } +} + +static int returnFloat (ctype ct, double f) +{ + yylval.expr = exprNode_floatLiteral (f, ct, cstring_fromChars (yytext), + fileloc_decColumn (g_currentloc, tokLength)); + tokLength = 0; + return (CCONSTANT); +} + +static int returnInt (ctype ct, long i) +{ + ctype c = ct; + + if (ctype_equal (ct, ctype_int)) + { + if (i == 0) + { + c = context_typeofZero (); + } + else if (i == 1) + { + c = context_typeofOne (); + } + } + + yylval.expr = exprNode_numLiteral (c, cstring_fromChars (yytext), + fileloc_decColumn (g_currentloc, tokLength), i); + tokLength = 0; + return (CCONSTANT); +} + +static int returnChar (char c) +{ + yylval.expr = exprNode_charLiteral (c, cstring_fromChars (yytext), + fileloc_decColumn (g_currentloc, tokLength)); + tokLength = 0; + return (CCONSTANT); +} + +static int ninput () +{ + int c = lminput (); + + if (c != EOF && ((char)c == '\n')) + { + context_incLineno (); + } + + return c; +} + +static char macro_nextChar () +{ + static bool in_quote = FALSE, in_escape = FALSE, in_char = FALSE; + int ic; + char c; + + ic = lminput (); + c = char_fromInt (ic); + + if (!in_quote && !in_char && (c == '\\' || c == BEFORE_COMMENT_MARKER[0])) + { + if (c == '\\') + { + while ((c = char_fromInt (lminput ())) != '\0' && c != '\n') + { + ; /* skip to newline */ + } + + context_incLineno (); + + if (c != '\0') + { + return macro_nextChar (); + } + else + { + return c; + } + } + else /* if (c == '@') */ + { + if (handleLlSpecial () != BADTOK) + { + llerrorlit (FLG_SYNTAX, "Macro cannot use special syntax"); + } + + return macro_nextChar (); + } + } + else if (!in_escape && c == '\"') + { + in_quote = !in_quote; + } + else if (!in_escape && c == '\'') + { + in_char = !in_char; + } + else if ((in_quote || in_char) && c == '\\') + { + in_escape = !in_escape; + } + else if ((in_quote || in_char) && in_escape) + { + in_escape = FALSE; + } + else if (!in_quote && c == '/') + { + char c2; + + if ((c2 = char_fromInt (lminput ())) == '*') + { + while (c2 != '\0') + { + while ((c2 = char_fromInt (lminput ())) != '\0' + && c2 != '\n' && c2 != '*') + { + ; + } + + if (c2 == '*') + { + while ((c2 = char_fromInt (lminput ())) != '\0' + && c2 == '*') + { + ; + } + + if (c2 == '/') + { + goto outofcomment; + } + } + else + { + llfatalerror (cstring_makeLiteral ("Macro: bad comment!")); + } + } + outofcomment: + return macro_nextChar (); + } + else + { + /*** putchar does not work! why? puts to stdio...??! ***/ + lmsavechar (c2); + } + } + return c; +} + +/* +** keeps stylized comments +*/ + +static char macro_nextCharC () +{ + static bool in_quote = FALSE, in_escape = FALSE, in_char = FALSE; + char c; + + c = char_fromInt (lminput ()); + + if (!in_quote && !in_char && c == '\\') + { + while ((c = char_fromInt (lminput ())) != '\0' && c != '\n') + { + ; /* skip to newline */ + } + + context_incLineno (); + + if (c != '\0') + { + return macro_nextCharC (); + } + else + { + return c; + } + } + else if (!in_escape && c == '\"') + { + in_quote = !in_quote; + } + else if (!in_escape && c == '\'') + { + in_char = !in_char; + } + else if ((in_quote || in_char) && c == '\\') + { + in_escape = !in_escape; + } + else if ((in_quote || in_char) && in_escape) + { + in_escape = FALSE; + } + else if (!in_quote && c == '/') + { + char c2; + + if ((c2 = char_fromInt (lminput ())) == '*') + { + while (c2 != '\0') + { + while ((c2 = char_fromInt (lminput ())) != '\0' + && c2 != '\n' && c2 != '*') + { + ; + } + + if (c2 == '*') + { + while ((c2 = char_fromInt (lminput ())) != '\0' + && c2 == '*') + { + ; + } + + if (c2 == '/') + { + goto outofcomment; + } + } + else + { + llfatalerror (cstring_makeLiteral ("Macro: bad comment!")); + } + } + outofcomment: + return macro_nextCharC (); + } + else + { + lmsavechar (c2); + } + } + return c; +} + +/* +** skips whitespace (handles line continuations) +** returns first non-whitespace character +*/ + +static char skip_whitespace () +{ + char c; + + while ((c = macro_nextChar ()) == ' ' || c == '\t') + { + ; + } + + return c; +} + +static void handleMacro () +{ + cstring mac = cstring_undefined; + int macrocode; + char c; + + while (currentColumn () > 2) + { + mac = cstring_appendChar (mac, ' '); + setTokLength (-1); + } + + c = macro_nextCharC (); + + if (c >= '0' && c <= '9') + { + int i; + + for (i = 0; i < ((c - '0') + 1); i++) + { + mac = cstring_appendChar (mac, ' '); + } + } + else + { + BADBRANCH; + } + + while (((c = macro_nextCharC ()) != '\0') && (c != '\n')) + { + mac = cstring_appendChar (mac, c); + } + + + macrocode = tokenMacroCode (mac); + + if (macrocode == BADTOK && !isArtificial (mac)) + { + DPRINTF (("Add macro: %s", mac)); + context_addMacroCache (mac); + } + else + { + cstring_free (mac); + } + + if (c == '\n') + { + context_incLineno (); + } +} + +static bool processMacro (void) +{ + uentry e2; + ctype ct; + int noparams = 0; + cstring fname = cstring_undefined; + bool res = TRUE; + bool isspecfcn = FALSE; + bool isiter = FALSE; + bool skipparam = FALSE; + bool isenditer = FALSE; + bool unknownm = FALSE; + bool hasParams = FALSE; + bool emptyMacro = FALSE; + char c = skip_whitespace (); + fileloc loc = fileloc_noColumn (g_currentloc); + + /* are both of these necessary? what do they mean? */ + uentryList specparams = uentryList_undefined; + uentryList pn = uentryList_undefined; + + context_resetMacroMissingParams (); + + if (c == '\0' || c == '\n') + { + llcontbug (cstring_makeLiteral ("Bad macro")); + fileloc_free (loc); + return FALSE; + } + + fname = cstring_appendChar (fname, c); + + while ((c = macro_nextChar ()) != '(' && c != '\0' + && c != ' ' && c != '\t' && c != '\n') + { + fname = cstring_appendChar (fname, c); + } + + if (c == ' ' || c == '\t' || c == '\n') + { + char oldc = c; + + if (c != '\n') + { + while (c == ' ' || c == '\t') + { + c = macro_nextChar (); + } + unput (c); + } + + if (c == '\n') + { + emptyMacro = TRUE; + unput (c); + } + + c = oldc; + } + + hasParams = (c == '('); + + + if (usymtab_exists (fname)) + { + e2 = usymtab_lookupExpose (fname); + ct = uentry_getType (e2); + + + if (uentry_isCodeDefined (e2) + && fileloc_isUser (uentry_whereDefined (e2))) + { + if (optgenerror + (FLG_MACROREDEF, + message ("Macro %s already defined", fname), + loc)) + { + uentry_showWhereDefined (e2); + uentry_clearDefined (e2); + } + + if (uentry_isFunction (e2)) + { + uentry_setType (e2, ctype_unknown); + ct = ctype_unknown; + unknownm = TRUE; + context_enterUnknownMacro (e2); + } + else + { + context_enterConstantMacro (e2); + } + } + else + { + if (uentry_isForward (e2) && uentry_isFunction (e2)) + { + unknownm = TRUE; + + voptgenerror + (FLG_MACROFCNDECL, + message + ("Parameterized macro has no prototype or specification: %s ", + fname), + loc); + + ct = ctype_unknown; + uentry_setType (e2, ctype_unknown); + uentry_setFunctionDefined (e2, loc); + uentry_setUsed (e2, fileloc_undefined); + context_enterUnknownMacro (e2); + } + else + { + if (uentry_isIter (e2)) + { + isiter = TRUE; + specparams = uentry_getParams (e2); + noparams = uentryList_size (specparams); + uentry_setDefined (e2, loc); + context_enterIterDef (e2); + } + else if (uentry_isEndIter (e2)) + { + isenditer = TRUE; + uentry_setDefined (e2, loc); + context_enterIterEnd (e2); /* don't care about it now */ + /* but should parse like an iter! */ + } + else if (uentry_isConstant (e2)) + { + if (hasParams) + { + voptgenerror + (FLG_INCONDEFS, + message ("Constant %s implemented as parameterized macro", + fname), + g_currentloc); + + uentry_showWhereSpecified (e2); + uentry_setType (e2, ctype_unknown); + uentry_makeVarFunction (e2); + uentry_setDefined (e2, g_currentloc); + uentry_setFunctionDefined (e2, g_currentloc); + context_enterUnknownMacro (e2); + } + else + { + if (!uentry_isSpecified (e2)) + { + fileloc oloc = uentry_whereDeclared (e2); + + if (fileloc_isLib (oloc)) + { + ; + } + else if (fileloc_isUndefined (oloc) + || fileloc_isPreproc (oloc)) + { + if (!emptyMacro) + { + voptgenerror + (FLG_MACROCONSTDECL, + message + ("Macro constant %q not declared", + uentry_getName (e2)), + loc); + } + } + else if (!fileloc_withinLines (oloc, loc, 2)) + { /* bogus! will give errors if there is too much whitespace */ + voptgenerror + (FLG_SYNTAX, + message + ("Macro constant name %s does not match name in " + "previous constant declaration. This constant " + "is declared at %q", fname, + fileloc_unparse (oloc)), + loc); + } + } + + context_enterConstantMacro (e2); + cstring_free (fname); + fileloc_free (loc); + return res; + } + + } + else if (ctype_isFunction (ct)) + { + isspecfcn = TRUE; + specparams = ctype_argsFunction (ct); + noparams = uentryList_size (specparams); + + uentry_setFunctionDefined (e2, loc); + context_enterMacro (e2); + } + else if (uentry_isVar (e2)) + { + if (hasParams) + { + voptgenerror + (FLG_INCONDEFS, + message ("Variable %s implemented as parameterized macro", + fname), + loc); + + uentry_showWhereSpecified (e2); + uentry_setType (e2, ctype_unknown); + uentry_makeVarFunction (e2); + uentry_setDefined (e2, g_currentloc); + uentry_setFunctionDefined (e2, g_currentloc); + context_enterUnknownMacro (e2); + } + else + { + uentry ucons = uentry_makeConstant (fname, + ctype_unknown, + loc); + if (uentry_isExpandedMacro (e2)) + { + ; /* okay */ + } + else + { + if (optgenerror + (FLG_INCONDEFS, + message ("Variable %s implemented by a macro", + fname), + loc)) + { + uentry_showWhereSpecified (e2); + } + } + + uentry_setDefined (e2, loc); + uentry_setUsed (ucons, loc); + + context_enterConstantMacro (ucons); + uentry_markOwned (ucons); + cstring_free (fname); + return res; + } + } + else + { + if (uentry_isDatatype (e2)) + { + vgenhinterror + (FLG_SYNTAX, + message ("Type implemented as macro: %x", + uentry_getName (e2)), + message ("A type is implemented using a macro definition. A " + "typedef should be used instead."), + g_currentloc); + + swallowMacro (); + /* Must exit scope (not sure why a new scope was entered?) */ + usymtab_quietExitScope (g_currentloc); + uentry_setDefined (e2, g_currentloc); + res = FALSE; + } + else + { + llcontbug + (message ("Unexpanded macro not function or constant: %q", + uentry_unparse (e2))); + uentry_setType (e2, ctype_unknown); + + if (hasParams) + { + uentry_makeVarFunction (e2); + uentry_setDefined (e2, g_currentloc); + uentry_setFunctionDefined (e2, g_currentloc); + context_enterUnknownMacro (e2); + } + } + } + } + } + } + else + { + uentry ce; + + voptgenerror + (FLG_MACROMATCHNAME, + message ("Unexpanded macro %s does not match name of a constant " + "or iter declaration. The name used in the control " + "comment on the previous line should match. " + "(Assuming macro defines a constant.)", + fname), + loc); + + + ce = uentry_makeConstant (fname, ctype_unknown, fileloc_undefined); + uentry_setUsed (ce, loc); /* perhaps bogus? */ + e2 = usymtab_supEntryReturn (ce); + + context_enterConstantMacro (e2); + cstring_free (fname); + fileloc_free (loc); + return res; + } + + /* in macros, ( must follow immediatetly after name */ + + if (hasParams) + { + int paramno = 0; + + c = skip_whitespace (); + + while (c != ')' && c != '\0') + { + uentry param; + bool suppress = context_inSuppressRegion (); + cstring paramname = cstring_undefined; + + /* + ** save the parameter location + */ + + decColumn (); + context_saveLocation (); + incColumn (); + + while (c != ' ' && c != '\t' && c != ',' && c != '\0' && c != ')') + { + paramname = cstring_appendChar (paramname, c); + c = macro_nextChar (); + } + + if (c == ' ' || c == '\t') c = skip_whitespace (); + + if (c == ',') + { + c = macro_nextChar (); + if (c == ' ' || c == '\t') c = skip_whitespace (); + } + + if (c == '\0') + { + llfatalerror (cstring_makeLiteral + ("Bad macro syntax: uentryList")); + } + + if ((isspecfcn || isiter) && (paramno < noparams) + && !uentry_isElipsisMarker (uentryList_getN + (specparams, paramno))) + { + uentry decl = uentryList_getN (specparams, paramno); + sRef sr; + + param = uentry_nameCopy (paramname, decl); + + + uentry_setParam (param); + sr = sRef_makeParam (paramno, uentry_getType (param)); + + if (sRef_getNullState (sr) == NS_ABSNULL) + { + ctype pt = ctype_realType (uentry_getType (param)); + + if (ctype_isUser (pt)) + { + uentry te = usymtab_getTypeEntrySafe (ctype_typeId (pt)); + + if (uentry_isValid (te)) + { + sRef_setStateFromUentry (sr, te); + } + } + else + { + sRef_setNullState (sr, NS_UNKNOWN, g_currentloc); + } + } + + uentry_setSref (param, sr); + uentry_setDeclaredForceOnly (param, context_getSaveLocation ()); + + skipparam = isiter && uentry_isOut (uentryList_getN (specparams, paramno)); + } + else + { + fileloc sloc = context_getSaveLocation (); + + param = uentry_makeVariableSrefParam + (paramname, ctype_unknown, sRef_makeParam (paramno, ctype_unknown)); + cstring_free (paramname); + + sRef_setPosNull (uentry_getSref (param), sloc); + + uentry_setDeclaredForce (param, sloc); + + skipparam = FALSE; + fileloc_free (sloc); + } + + if (!skipparam) + { + llassert (!uentry_isElipsisMarker (param)); + + if (!suppress) + { + sRef_makeUnsafe (uentry_getSref (param)); + } + + pn = uentryList_add (pn, uentry_copy (param)); + usymtab_supEntry (param); + } + else + { + /* don't add param */ + uentry_free (param); + } + + if (c == ',') + { + (void) macro_nextChar (); + c = skip_whitespace (); + } + + paramno++; + } + + if (c == ')') + { + if (isspecfcn || isiter) + { + if (paramno != noparams && noparams >= 0) + { + advanceLine (); + + voptgenerror + (FLG_INCONDEFS, + message ("Macro %s specified with %d args, defined with %d", + fname, noparams, paramno), + g_currentloc); + + uentry_showWhereSpecified (e2); + uentry_resetParams (e2, pn); + } + } + else + { + uentry_resetParams (e2, pn); + } + } + } + else + { + /* + ** the form should be: + ** + ** # define newname oldname + ** where oldname refers to a function matching the specification + ** of newname. + */ + + if (unknownm) + { + sRef_setGlobalScope (); + usymtab_supGlobalEntry (uentry_makeVariableLoc (fname, ctype_unknown)); + sRef_clearGlobalScope (); + } + else + { + context_setMacroMissingParams (); + } + } + + + /* context_setuentryList (pn); */ + usymtab_enterScope (); + + fileloc_free (loc); + cstring_free (fname); + + return res; +} + +static bool handleSpecial (char *yyt) +{ + char *l = mstring_create (MAX_NAME_LENGTH); + static bool reportcpp = FALSE; + int lineno = 0; + char c; + char *ol; + cstring olc; + + strcpy (l, yyt + 1); + + /* Need to safe original l for deallocating. */ + ol = l; + + l += strlen (yyt) - 1; + + while ((c = char_fromInt (lminput ())) != '\n' && c != '\0') + { + *l++ = c; + } + + *l = '\0'; + olc = cstring_fromChars (ol); + + if (cstring_equalPrefix (olc, "pragma")) + { + char *pname = mstring_create (longUnsigned_fromInt (MAX_PRAGMA_LEN)); + char *opname = pname; + char *ptr = ol + 6; /* pragma is six characters, plus space */ + int len = 0; + + + /* skip whitespace */ + while (((c = *ptr) != '\0') && isspace (c)) + { + ptr++; + } + + + while (((c = *ptr) != '\0') && !isspace (c)) + { + len++; + + if (len > MAX_PRAGMA_LEN) + { + break; + } + + ptr++; + *pname++ = c; + } + + *pname = '\0'; + + if (len == PRAGMA_LEN_EXPAND + && mstring_equal (opname, PRAGMA_EXPAND)) + { + cstring exname = cstring_undefined; + uentry ue; + + ptr++; + while (((c = *ptr) != '\0') && !isspace (c)) + { + exname = cstring_appendChar (exname, c); + ptr++; + } + + + ue = usymtab_lookupExposeGlob (exname); + + if (uentry_isExpandedMacro (ue)) + { + if (fileloc_isPreproc (uentry_whereDefined (ue))) + { + fileloc_setColumn (g_currentloc, 1); + uentry_setDefined (ue, g_currentloc); + } + } + + cstring_free (exname); + } + } + else if (cstring_equalPrefix (olc, "ident")) + { + /* Some pre-processors will leave these in the code. Ignore rest of line */ + } + /* + ** Yuk...Win32 filenames can have spaces in them...we need to read + ** to the matching end quote. + */ + else if ((sscanf (ol, "line %d \"", &lineno) == 1) + || (sscanf (ol, " %d \"", &lineno) == 1)) + { + char *tmp = ol; + char *fname; + fileId fid; + + while (*tmp != '\"' && *tmp != '\0') + { + tmp++; + } + + llassert (*tmp == '\"'); + + tmp++; + fname = tmp; + + while (*tmp != '\"' && *tmp != '\0') + { + tmp++; + } + + llassert (*tmp == '\"'); + + *tmp = '\0'; + + DPRINTF (("fname: %s", fname)); + +# if defined(OS2) || defined(MSDOS) || defined(WIN32) + + /* + ** DOS-like path delimiters get delivered in pairs, something like + ** \"..\\\\file.h\", so we have to make it normal again. We do NOT + ** remove the pre dirs yet as we usually specify tmp paths relative + ** to the current directory, so tmp files would not get found in + ** the hash table. If this method fails we try it again later. + */ + + { + char *stmp = fname; + + /* + ** Skip past the drive marker. + */ + + DPRINTF (("stmp: %s / %s", stmp, fname)); + + if (strchr (stmp, ':') != NULL) + { + stmp = strchr (stmp, ':') + 1; + } + + DPRINTF (("stmp: %s / %s", stmp, fname)); + + while ((stmp = strchr (stmp, CONNECTCHAR)) != NULL ) + { + if (*(stmp+1) == CONNECTCHAR) + { + memmove (stmp, stmp+1, strlen (stmp)); + } + + stmp++; + DPRINTF (("stmp: %s / %s", stmp, fname)); + } + + DPRINTF (("Now: base = %s", fname)); + + fid = fileTable_lookupBase (context_fileTable (), + cstring_fromChars (fname)); + if (!(fileId_isValid (fid))) + { + fname = removePreDirs (fname); + fid = fileTable_lookupBase (context_fileTable (), + cstring_fromChars (fname)); + } + } +# else /* !defined(OS2) && !defined(MSDOS) */ + fname = removePreDirs (fname); + fid = fileTable_lookupBase (context_fileTable (), + cstring_fromChars (fname)); +# endif /* !defined(OS2) && !defined(MSDOS) */ + + if (!(fileId_isValid (fid))) + { + if (isHeaderFile (cstring_fromChars (fname))) + { + fid = fileTable_addHeaderFile (context_fileTable (), + cstring_fromChars (fname)); + } + else + { + fid = fileTable_addFile (context_fileTable (), + cstring_fromChars (fname)); + } + } + + setFileLine (fid, lineno); + } + else if ((sscanf (ol, "line %d", &lineno) == 1) + || (sscanf (ol, " %d", &lineno) == 1)) + { + setLine (lineno); /* next line is */ + } + else + { + if (mstring_equal (ol, "")) { + DPRINTF (("Empty pp command!")); + /* + ** evs 2000-05-16: This is a horrible kludge, to get around a bug (well, difficulty) in the pre-processor. + ** We handle a plain # in the input file, by echoing it, and ignoring it in the post-pp-file. + */ + mstring_free (ol); + return FALSE; + } else { + if (!reportcpp) + { + + } else { + llbug (message ("File contains preprocessor command: #%s", + cstring_fromChars (ol))); + reportcpp = TRUE; + } + } + + sfree (ol); + return TRUE; + } + + sfree (ol); + return FALSE; +} + +static int handleLlSpecial () +{ + int ic; + char c; + char *s = mstring_createEmpty (); + char *os; + int tok; + int charsread = 0; + + while (((ic = ninput ()) != 0) && isalpha (ic)) + { + c = (char) ic; + s = mstring_append (s, c); + charsread++; + } + + os = s; + + if (charsread == 0 && ic == (int) AFTER_COMMENT_MARKER[0]) + { + ic = ninput (); + + llassert (ic == AFTER_COMMENT_MARKER[1]); + + + if (isProcessingGlobMods () && (*s == '\0')) + { + sfree (os); + return QNOMODS; /* special token no modifications token */ + } + else + { + ; + } + } + + tok = commentMarkerToken (cstring_fromChars (os)); + + if (tok != BADTOK) + { + tokLength = charsread; + sfree (os); + inSpecPart = TRUE; + return tok; + } + + /* Add rest of the comment */ + + if (ic != 0 && ic != EOF) + { + c = (char) ic; + + + s = mstring_append (s, c); + charsread++; + + while (((ic = ninput ()) != 0) && (ic != EOF) + && (ic != AFTER_COMMENT_MARKER[0])) + { + c = (char) ic; + s = mstring_append (s, c); + charsread++; + } + } + + if (ic == AFTER_COMMENT_MARKER[0]) + { + int nc = ninput (); + llassert ((char) nc == AFTER_COMMENT_MARKER[1]); + charsread++; + } + + + os = s; + + while (*s == ' ' || *s == '\t' || *s == '\n') + { + s++; + } + + if (*s == '-' || *s == '+' || *s == '=') /* setting flags */ + { + c = *s; + + while (c == '-' || c == '+' || c == '=') + { + ynm set = ynm_fromCodeChar (c); + cstring thisflag; + + s++; + + thisflag = cstring_fromChars (s); + + while ((c = *s) != '\0' && (c != '-') && (c != '=') + && (c != '+') && (c != ' ') && (c != '\t') && (c != '\n')) + { + s++; + } + + *s = '\0'; + + if (!context_getFlag (FLG_NOCOMMENTS)) + { + cstring flagname = thisflag; + flagcode fflag = identifyFlag (flagname); + + if (flagcode_isSkip (fflag)) + { + ; + } + else if (flagcode_isInvalid (fflag)) + { + if (isMode (flagname)) + { + if (ynm_isMaybe (set)) + { + llerror + (FLG_BADFLAG, + message + ("Stylized comment attempts to restore flag %s. " + "A mode flag cannot be restored.", + flagname)); + } + else + { + context_setMode (flagname); + } + } + else + { + llerror + (FLG_BADFLAG, + message ("Unrecognized option in stylized comment: %s", + flagname)); + } + } + else if (flagcode_isGlobalFlag (fflag)) + { + llerror + (FLG_BADFLAG, + message + ("Stylized comment attempts to set global flag %s. " + "A global flag cannot be set locally.", + flagname)); + } + else + { + context_fileSetFlag (fflag, set); + + if (flagcode_hasArgument (fflag)) + { + if (ynm_isMaybe (set)) + { + llerror + (FLG_BADFLAG, + message + ("Stylized comment attempts to restore flag %s. " + "A flag for setting a value cannot be restored.", + flagname)); + } + else + { /* cut-and-pastied from llmain...blecch */ + cstring extra = cstring_undefined; + char *rest; + char *orest; + char rchar; + + *s = c; + rest = mstring_copy (s); + orest = rest; + *s = '\0'; + + while ((rchar = *rest) != '\0' + && (isspace (rchar))) + { + rest++; + s++; + } + + while ((rchar = *rest) != '\0' + && !isspace (rchar)) + { + extra = cstring_appendChar (extra, rchar); + rest++; + s++; + } + + sfree (orest); + + if (cstring_isUndefined (extra)) + { + llerror + (FLG_BADFLAG, + message + ("Flag %s (in stylized comment) must be followed by an argument", + flagcode_unparse (fflag))); + } + else + { + s--; + + if (flagcode_hasValue (fflag)) + { + setValueFlag (fflag, extra); + } + else if (flagcode_hasString (fflag)) + { + setStringFlag (fflag, extra); + } + else + { + BADEXIT; + } + } + } + } + } + } + else + { + } + + *s = c; + while ((c == ' ') || (c == '\t') || (c == '\n')) + { + c = *(++s); + } + } + + if (context_inHeader () && !isArtificial (cstring_fromChars (os))) + { + context_addComment (cstring_fromCharsNew (os)); + } + else + { + ; + } + } + else + { + char *t = s; + int macrocode; + char tchar = '\0'; + + while (*s != '\0' && *s != ' ' && *s != '\t' && *s != '\n') + { + s++; + } + + if (*s != '\0') + { + tchar = *s; + *s = '\0'; + s++; + } + + t = cstring_toCharsSafe (cstring_downcase (cstring_fromChars (t))); + macrocode = tokenMacroCode (cstring_fromChars (t)); + + if (macrocode != BADTOK) + { + tokLength = mstring_length (t); + + + sfree (t); + sfree (os); + + if (macrocode == SKIPTOK) + { + return BADTOK; + } + + return macrocode; + } + + if (context_inHeader ()) + { + if (tchar != '\0') + { + *(s-1) = tchar; + } + + if ((context_inMacro () || context_inGlobalContext ()) + && macrocode != SKIPTOK + && !isArtificial (cstring_fromChars (os))) + { + context_addComment (cstring_fromCharsNew (os)); + } + else + { + ; + } + + if (tchar != '\0') + { + *(s-1) = '\0'; + } + } + + if (mstring_equal (t, "ignore")) + { + if (!context_getFlag (FLG_NOCOMMENTS)) + { + context_enterSuppressRegion (); + } + } + else if ((*t == 'i' || *t == 't') + && (*(t + 1) == '\0')) + { + if (!context_getFlag (FLG_NOCOMMENTS) + && (*t == 'i' || context_getFlag (FLG_TMPCOMMENTS))) + { + context_enterSuppressLine (-1); /* infinite suppression */ + } + } + else if (((*t == 'i') || (*t == 't')) + && ((*(t + 1) >= '0' && *(t + 1) <= '9'))) + { + bool tmpcomment = (*t == 't'); + int val = -1; + char *tt = t; /* don't mangle t, since it is free'd */ + char lc = *(++tt); + + if (lc >= '0' && lc <= '9') + { + val = (int)(lc - '0'); + + lc = *(++tt); + while (lc >= '0' && lc <= '9') + { + val *= 10; + val += lc - '0'; + lc = *(++tt); + } + } + + + if (!context_getFlag (FLG_NOCOMMENTS) + && (!tmpcomment || context_getFlag (FLG_TMPCOMMENTS))) + { + context_enterSuppressLine (val); + } + } + else if (mstring_equal (t, "end")) + { + if (!context_getFlag (FLG_NOCOMMENTS)) + { + context_exitSuppressRegion (); + } + } + else if (mstring_equal (t, "notfunction")) + { + ; /* handled by pcpp */ + } + else if (mstring_equal (t, "access")) + { + cstring tname; + + while (TRUE) + { + while ((c = *s) && (c == ' ' || c == '\t' || c == '\n')) + { + s++; + } + + if (c == '\0') + { + break; + } + + tname = cstring_fromChars (s); + + while ((c = *s) != '\0' && c != ' ' + && c != '\t' && c != '\n' && c != ',') + { + s++; + } + + *s = '\0'; + + + if (!context_getFlag (FLG_NOCOMMENTS) + && !context_getFlag (FLG_NOACCESS)) + { + if (usymtab_existsType (tname)) + { + usymId uid = usymtab_getTypeId (tname); + + context_addFileAccessType (uid); + } + else + { + if (!(context_inSuppressRegion () + || context_inSuppressZone (g_currentloc))) + { + llmsg + (message + ("%q: Unrecognized type %s used in access comment", + fileloc_unparse (g_currentloc), tname)); + } + } + } + + if (c != '\0') + { + s++; + } + + if (c != ',' && c != ' ') + { + break; + } + } + } + else if (mstring_equal (t, "noaccess")) + { + cstring tname; + char lc; + + while (TRUE) + { + while ((lc = *s) && (lc == ' ' || lc == '\t' || lc == '\n')) + { + s++; + } + + if (lc == '\0') + { + break; + } + + tname = cstring_fromChars (s); + + while ((lc = *s) != '\0' && lc != ' ' && lc != '\t' + && lc != '\n' && lc != ',') + { + s++; + } + + *s = '\0'; + + if (!context_getFlag (FLG_NOCOMMENTS) + && !context_getFlag (FLG_NOACCESS)) + { + if (usymtab_existsType (tname)) + { + typeId tuid = usymtab_getTypeId (tname); + + if (context_couldHaveAccess (tuid)) + { + context_removeFileAccessType (tuid); + } + else + { + if (!(context_inSuppressRegion () + || context_inSuppressZone (g_currentloc))) + { + uentry ue = usymtab_getTypeEntry (tuid); + + if (uentry_isAbstractDatatype (ue)) + { + llmsg + (message + ("%q: Non-accessible abstract type %s used in noaccess comment", + fileloc_unparse (g_currentloc), tname)); + } + else + { + llmsg + (message + ("%q: Non-abstract type %s used in noaccess comment", + fileloc_unparse (g_currentloc), tname)); + } + } + } + } + else + { + if (!(context_inSuppressRegion () + || context_inSuppressZone (g_currentloc))) + { + llmsg + (message + ("%q: Unrecognized type %s used in noaccess comment", + fileloc_unparse (g_currentloc), tname)); + } + } + } + + if (lc != '\0') + { + s++; + } + + if (lc != ',' && lc != ' ') + { + break; + } + } + } + else + { + setTokLength (- (2 + charsread)); + + voptgenerror (FLG_UNRECOGCOMMENTS, + message ("Stylized comment unrecognized: %s", + cstring_fromChars (os)), + g_currentloc); + } + + sfree (t); + } + + sfree (os); + return BADTOK; +} + +static /*@only@*/ cstring makeIdentifier (char *s) +{ + char *c = mstring_create (size_toInt (strlen (s)) + 1); + cstring id = cstring_fromChars (c); + + while (isalnum (*s) || (*s == '_') || (*s == '$')) + { + *c++ = *s++; + } + + *c = '\0'; + return (id); +} + +/*@observer@*/ /*@dependent@*/ uentry coerceId (cstring cn) +{ + if (!(usymtab_exists (cn))) + { + fileloc loc = fileloc_createExternal (); + + /* + ** We need to put this in a global scope, otherwise the sRef will be deallocated. + */ + + uentry ce = uentry_makeUnrecognized (cn, loc); + + if (!context_inIterEnd ()) + { + voptgenerror + (FLG_SYSTEMUNRECOG, + message ("Unrecognized (possibly system) identifier: %q", + uentry_getName (ce)), + g_currentloc); + } + + return ce; + } + + return (usymtab_lookup (cn)); +} + +/* +** like, coerceId, but doesn't supercede for iters +*/ + +/*@observer@*/ uentry coerceIterId (cstring cn) +{ + if (!(usymtab_exists (cn))) + { + return uentry_undefined; + } + + return (usymtab_lookup (cn)); +} + +/*@observer@*/ cstring LastIdentifier () +{ + return (lastidprocessed); +} + +static int processIdentifier (cstring id) +{ + uentry le; + + DPRINTF (("Process identifier: %s", id)); + + context_clearJustPopped (); + lastidprocessed = id; + + if (context_inFunctionDecl ()) + { + int tok = commentMarkerToken (id); + + if (tok != BADTOK) + { + return tok; + } + else + { + tok = tokenMacroCode (id); + + if (tok != BADTOK) + { + return tok; + } + } + } + + /* Consider handling: Defined by C99 as static const char __func__[] */ + + if (context_getFlag (FLG_GNUEXTENSIONS)) + { + int tok = BADTOK; + + if (cstring_equalLit (id, "__stdcall") + || cstring_equalLit (id, "__cdecl") + || cstring_equalLit (id, "__extension__")) + { + return BADTOK; + } + else if (cstring_equalLit (id, "__volatile__")) + { + tok = QVOLATILE; + } + else if (cstring_equalLit (id, "__signed")) + { + tok = QSIGNED; + } + else if (cstring_equalLit (id, "__unsigned")) + { + tok = QUNSIGNED; + } + else if (cstring_equalLit (id, "__const__")) + { + tok = QCONST; + } + else if (cstring_equalLit (id, "__alignof__")) + { + tok = CALIGNOF; /* alignof is parsed like sizeof */ + } + else if (cstring_equalLit (id, "__FUNCTION__") + || cstring_equalLit (id, "__PRETTY_FUNCTION__")) + { + /* These tokens hold the name of the current function as strings */ + yylval.expr = exprNode_stringLiteral (id, fileloc_copy (g_currentloc)); + tokLength = 0; + lastWasString = TRUE; + tok = CCONSTANT; + return tok; + } + else if (cstring_equalLit (id, "__attribute__") + || cstring_equalLit (id, "__asm__") + || cstring_equalLit (id, "_asm") + || cstring_equalLit (id, "__asm") + || cstring_equalLit (id, "__declspec")) + { + int depth = 0; + bool useparens = FALSE; + bool usebraces = FALSE; + bool inquote = FALSE; + bool inescape = FALSE; + int ic; + + while ((ic = input ()) != EOF) + { + + if (inescape) + { + inescape = FALSE; + } + else if (ic == '\\') + { + inescape = TRUE; + } + else if (ic == '\"') + { + inquote = !inquote; + } + else if (!inquote) + { + if (ic == '(') + { + if (!useparens) + { + if (!usebraces) + { + useparens = TRUE; + } + } + + if (useparens) + { + depth++; + } + } + else if (ic == '{') + { + if (!usebraces) + { + if (!useparens) + { + usebraces = TRUE; + } + } + + if (usebraces) + { + depth++; + } + } + else if (ic == ')' && useparens) + { + depth--; + if (depth == 0) break; + } + else if (ic == '}' && usebraces) + { + depth--; + if (depth == 0) break; + } + else if (ic == '}' + && !usebraces && !useparens + && cstring_equalLit (id, "__asm")) + { + /* + ** We need this because some MS VC++ include files + ** have __asm mov ... } + ** Its a kludge, but otherwise would need to parse + ** the asm code! + */ + return TRBRACE; + } + } + + if (ic == '\n') + { + context_incLineno (); + + if (cstring_equalLit (id, "__asm") + && !useparens && !usebraces) + { + break; + } + } + } + + llassert ((useparens && ic == ')') + || (usebraces && ic == '}') + || (!useparens && !usebraces)); + + return BADTOK; + } + else if (cstring_equalLit (id, "inline") + || cstring_equalLit (id, "__inline") + || cstring_equalLit (id, "_inline") + || cstring_equalLit (id, "__inline__")) + { + tok = QINLINE; + } + + if (tok != BADTOK) + { + RETURN_TOK (tok); + } + } + + le = usymtab_lookupSafe (id); + + /*@-dependenttrans@*/ + + if (uentry_isIter (le)) + { + yylval.entry = le; + return (ITER_NAME); + } + else if (uentry_isEndIter (le)) + { + yylval.entry = le; + return (ITER_ENDNAME); + } + else if (uentry_isUndefined (le)) + { + yylval.cname = id; + + /* avoid parse errors for certain system built ins */ + + if (g_expectingTypeName && (cstring_firstChar (id) == '_') + && (cstring_secondChar (id) == '_')) + { + return (TYPE_NAME_OR_ID); + } + + return (NEW_IDENTIFIER); + } + else if (!uentry_isDeclared (le) && !uentry_isCodeDefined (le)) + { + if (uentry_isDatatype (le)) + { + yylval.cname = id; + return (NEW_IDENTIFIER); + } + else + { + yylval.entry = le; + return (IDENTIFIER); + } + } + else if (uentry_isDatatype (le)) + { + if (!g_expectingTypeName) + { + yylval.cname = id; + + return (NEW_IDENTIFIER); + } + else + { + yylval.ctyp = uentry_getAbstractType (le); + + uentry_setUsed (le, g_currentloc); + return (TYPE_NAME); + } + } + else + { + yylval.entry = le; + return (IDENTIFIER); + } + + /*@=dependenttrans@*/ +} + +static bool processHashIdentifier (/*@only@*/ cstring id) +{ + if (context_inMacro () || context_inIterDef () || + context_inIterEnd ()) + { + uentry le; + + context_clearJustPopped (); + + lastidprocessed = id; + le = usymtab_lookupSafe (id); + + if (uentry_isParam (le) || uentry_isRefParam (le)) + { + return TRUE; + } + else + { + return FALSE; + } + } + else + { + cstring_free (id); + return FALSE; + } +} + + +static /*@only@*/ exprNode processString () +{ + exprNode res; + fileloc loc; + char *nl = strchr (yytext, '\n'); + cstring ns = cstring_fromCharsNew (yytext); + + if (nl == NULL) + { + loc = fileloc_copy (g_currentloc); + addColumn (cstring_length (ns)); + } + else + { + char *lastnl = nl; + + loc = fileloc_copy (g_currentloc); + + context_incLineno (); + + while ((nl = strchr ((nl + 1), '\n')) != NULL) + { + context_incLineno (); + lastnl = nl; + } + } + + + res = exprNode_stringLiteral (ns, loc); + return (res); +} + +static +char processChar () +{ + char fchar; + char next; + + llassert (*yytext != '\0'); + fchar = *(yytext + 1); + if (fchar != '\\') return fchar; + + next = *(yytext + 2); + + switch (next) + { + case 'n': return '\n'; + case 't': return '\t'; + case '\"': return '\"'; + case '\'': return '\''; + case '\\': return '\\'; + default: return '\0'; + } +} + +static +double processFloat () +{ + double ret = atof (yytext); + + return (ret); +} + +static +long processHex () +{ + int index = 2; + long val = 0; + + llassert (yytext[0] == '0' + && (yytext[1] == 'X' || yytext[1] == 'x')); + + while (yytext[index] != '\0') { + int tval; + char c = yytext[index]; + + if (c >= '0' && c <= '9') { + tval = (int) c - (int) '0'; + } else if (c >= 'A' && c <= 'F') { + tval = (int) c - (int) 'A' + 10; + } else if (c >= 'a' && c <= 'f') { + tval = (int) c - (int) 'a' + 10; + } else { + voptgenerror + (FLG_SYNTAX, + message ("Invalid character (%c) in hex constant: %s", + c, cstring_fromChars (yytext)), + g_currentloc); + break; + } + + val = (val * 16) + tval; + index++; + } + + DPRINTF (("Hex constant: %s = %ld", yytext, val)); + return val; +} + +static +long processOctal () +{ + int index = 1; + long val = 0; + + llassert (yytext[0] == '0' && yytext[1] != 'X' && yytext[1] != 'x'); + + while (yytext[index] != '\0') { + int tval; + char c = yytext[index]; + + if (c >= '0' && c <= '7') { + tval = (int) c - (int) '0'; + } else { + voptgenerror + (FLG_SYNTAX, + message ("Invalid character (%c) in octal constant: %s", + c, cstring_fromChars (yytext)), + g_currentloc); + break; + } + + val = (val * 8) + tval; + index++; + } + + DPRINTF (("Octal constant: %s = %ld", yytext, val)); + return val; +} + +static +long processDec () +{ + return (atol (yytext)); +} + +static int +processSpec (int tok) +{ + size_t length = strlen (yytext); + + + if (inSpecPart) + { + setTokLengthT (length); + RETURN_TOK (tok); + } + else + { + + context_saveLocation (); + setTokLengthT (length); + return (processIdentifier (makeIdentifier (yytext))); + } +} diff --git a/src/cscanner.l b/src/cscanner.l new file mode 100644 index 0000000..0eb50f2 --- /dev/null +++ b/src/cscanner.l @@ -0,0 +1,2855 @@ +/*;-*-C-*-; +** Copyright (c) Massachusetts Institute of Technology 1994-1998. +** All Rights Reserved. +** Unpublished rights reserved under the copyright laws of +** the United States. +** +** THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED +** OR IMPLIED. ANY USE IS AT YOUR OWN RISK. +** +** This code is distributed freely and may be used freely under the +** following conditions: +** +** 1. This notice may not be removed or altered. +** +** 2. Works derived from this code are not distributed for +** commercial gain without explicit permission from MIT +** (for permission contact lclint-request@sds.lcs.mit.edu). +*/ +/* + * Modified by Herbert 08/19/97: + * - added #include for IBM's OS/2 compiler. + * - fixed weird bug with lookup of tmp files (OS/2 and MSDOS only). + */ + +/* + * Modified by Mike Smith + * Corrected missing 'line' in scanf() calls in handleSpecial(). + * Without this, I get an error when LCLint hits a '#line' directive + * in the pre-pre-processed source files. For safety, I have made these + * conditional on OS2 and MSDOS because I don't understand why noone else + * has seen this problem. + * + * Modified by Mike Smith, 4th June 1997 + * Finally resolved the #line problem. The scanf() calls have been fixed to + * allow the following #line forms:- + * + * #line 123 "filename" + * #line 123 + * # 123 "filename" + * # 123 + * + * The last two are generated by the GNU pre-processor, apparently + */ + +Digit [0-9] +Letter [a-zA-Z_$] +H [a-fA-F0-9] +E [Ee][+-]?{Digit}+ +U (u|U) +L (l|L) +FS (f|F|l|L) +IS (u|U|l|L)* +ULSuffix ({U}{L}|{L}{U}) + +%{ +/* +** based on original C lexer by Nate Osgood +** from hacrat@catfish.lcs.mit.edu Mon Jun 14 13:06:32 1993 +** +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +# ifdef SANITIZER +# include "sgrammar.h" +# include "sgrammar_tokens.h" +# else +# include "cgrammar.h" +# include "cgrammar_tokens.h" +# endif + +# include "fileIdList.h" +# include "portab.h" + +# if defined(OS2) && defined(__IBMC__) + /* needed for isatty()... */ +# include +# endif + +static bool lastWasString = FALSE; +static char savechar = '\0'; + +/*@notfunction@*/ +# define yyinput() (incColumn (), getc (yyin)) + +/*@-noparams@*/ +/*@-incondefs@*/ +extern /*@external@*/ int read (); +/*@=incondefs@*/ +/*@=noparams@*/ + +static /*@owned@*/ cstring lastidprocessed = cstring_undefined; + +static int lminput (void); +static int tokLength = 0; +static bool inSpecPart = FALSE; +static bool continueLine = FALSE; + +static int ninput (void); +static char processChar (void); +static double processFloat (void); +static /*@only@*/ exprNode processString (void); +static long processDec (void); +static long processHex (void); +static long processOctal (void); +static int processIdentifier (/*@only@*/ cstring) + /*@globals undef lastidprocessed@*/ ; +static bool processHashIdentifier (/*@only@*/ cstring) + /*@globals undef lastidprocessed@*/ ; + +static int processSpec (int); +static bool handleSpecial (char *); +static int handleLlSpecial (void); +static void handleMacro (void); +static bool processMacro (void); +static /*@only@*/ cstring makeIdentifier (char *); + +/* yes, this is exported! */ +bool g_expectingTypeName = TRUE; /* beginning of file can be type name! */ + +static int returnInt (ctype, long); +static int returnFloat (ctype, double); +static int returnChar (char); +static void setTokLength (int) /*@modifies g_currentloc@*/ ; +static void setTokLengthT (size_t) /*@modifies g_currentloc@*/ ; + +static void advanceLine (void) +{ + tokLength = 0; + beginLine (); +} + +/*@-allmacros@*/ +# define RETURN_INT(c,i) \ + do { lastWasString = FALSE; \ + return (returnInt (c, i)); } while (FALSE) + +# define RETURN_FLOAT(c,f) \ + do { lastWasString = FALSE; \ + return (returnFloat (c, f)); \ + } while (FALSE) + +# define RETURN_CHAR(c) \ + do { lastWasString = FALSE; \ + return (returnChar (c)); \ + } while (FALSE) + +# define RETURN_TOK(t) \ + do { yylval.tok = lltok_create (t, fileloc_decColumn (g_currentloc, tokLength)); \ + tokLength = 0; \ + lastWasString = FALSE; \ + return (t); } while (FALSE) + +# define RETURN_TYPE(t, ct) \ + do { yylval.ctyp = ct; tokLength = 0; return (t); } while (FALSE) + +/* don't fileloc_decColumn (g_currentloc, tokLength)); + the string could have \n's in it! +*/ + +# define RETURN_STRING(c) \ + do { yylval.expr = exprNode_stringLiteral (c, fileloc_decColumn (g_currentloc, tokLength)); \ + tokLength = 0; \ + lastWasString = TRUE; \ + return (CCONSTANT); } while (FALSE) + +# define RETURN_EXPR(e) \ + do { yylval.expr = e; \ + tokLength = 0; \ + lastWasString = TRUE; \ + return (CCONSTANT); } while (FALSE) + +/*@=allmacros@*/ + +static void setTokLength (int len) +{ + addColumn (len); + tokLength = len; +} + +static void setTokLengthT (size_t len) +{ + setTokLength (size_toInt (len)); +} + +# include "flex.head" +%} + +%% + +"/*" { llfatalbug (cstring_makeLiteral ("Comment in pre-processor output")); } + +"#"{Letter}({Letter}|{Digit})* { + context_saveLocation (); + setTokLength (longUnsigned_toInt (mstring_length (yytext))); + + if (processHashIdentifier (makeIdentifier (yytext + 1))) + { + if (lastWasString) + { + ; + } + else + { + RETURN_STRING (cstring_makeLiteral ("\"\"")); + } + } + else + { + if (handleSpecial (yytext)) + { + setTokLength (1); + RETURN_TOK (0); + } + } + } +"#" { if (handleSpecial (yytext)) + { + setTokLength (1); RETURN_TOK (0); + } + } +"..." { setTokLength (3); RETURN_TOK (CTOK_ELIPSIS); } +"break" { setTokLength (5); RETURN_TOK (BREAK); } +"case" { setTokLength (4); RETURN_TOK (CASE); } +"continue" { setTokLength (8); RETURN_TOK (CONTINUE); } +"default" { setTokLength (7); RETURN_TOK (DEFAULT); } +"do" { setTokLength (2); RETURN_TOK (DO); } +"else" { setTokLength (4); RETURN_TOK (CELSE); } +"for" { setTokLength (3); RETURN_TOK (CFOR); } +"goto" { setTokLength (4); RETURN_TOK (GOTO); } +"if" { setTokLength (2); RETURN_TOK (CIF); } +"return" { setTokLength (6); RETURN_TOK (RETURN); } +"sizeof" { setTokLength (6); RETURN_TOK (CSIZEOF); } +"offsetof" { setTokLength (8); RETURN_TOK (COFFSETOF); } +"switch" { setTokLength (6); RETURN_TOK (SWITCH); } +"while" { setTokLength (5); RETURN_TOK (WHILE); } +"va_arg" { setTokLength (6); RETURN_TOK (VA_ARG); } +"va_dcl" { setTokLength (6); RETURN_TOK (VA_DCL); } +"inline" { + /* gcc extension...this might not be appropriate */ + setTokLength (6); RETURN_TOK (QINLINE); } + +"struct" { setTokLength (6); RETURN_TOK (CSTRUCT); } +"typedef" { setTokLength (7); RETURN_TOK (CTYPEDEF); } + +"union" { setTokLength (5); RETURN_TOK (CUNION); } +"enum" { setTokLength (4); RETURN_TOK (CENUM); } + +"void" { setTokLength (4); RETURN_TYPE (CVOID, ctype_void); } +"int" { setTokLength (3); RETURN_TYPE (CINT, ctype_int); } +"double" { setTokLength (6); RETURN_TYPE (CDOUBLE, ctype_double); } +"char" { setTokLength (4); RETURN_TYPE (CGCHAR, ctype_char); } +"float" { setTokLength (5); RETURN_TYPE (CGFLOAT, ctype_float); } + +"long" { setTokLength (4); RETURN_TOK (QLONG); } +"short" { setTokLength (5); RETURN_TOK (QSHORT); } +"unsigned" { setTokLength (8); RETURN_TOK (QUNSIGNED); } +"signed" { setTokLength (6); RETURN_TOK (QSIGNED); } + +"volatile" { setTokLength (8); RETURN_TOK (QVOLATILE); } +"const" { setTokLength (5); RETURN_TOK (QCONST); } + + /* some systems expect this! [gack!] */ +"__const" { setTokLength (7); RETURN_TOK (QCONST); } + +"extern" { setTokLength (6); RETURN_TOK (QEXTERN); } +"auto" { setTokLength (4); RETURN_TOK (QAUTO); } +"register" { setTokLength (8); RETURN_TOK (QREGISTER); } +"static" { setTokLength (6); RETURN_TOK (QSTATIC); } + +\"(\\.|[^\\"])*\"([ \t\n]*\"(\\.|[^\\"])*\")* { RETURN_EXPR (processString ()); } +"out" { return (processSpec (QOUT)); } +"in" { return (processSpec (QIN)); } +"partial" { return (processSpec (QPARTIAL)); } +"special" { return (processSpec (QSPECIAL)); } +"anytype" { return (processSpec (QANYTYPE)); } +"integraltype" { return (processSpec (QINTEGRALTYPE)); } +"unsignedintegraltype" { return (processSpec (QUNSIGNEDINTEGRALTYPE)); } +"signedintegraltype" { return (processSpec (QSIGNEDINTEGRALTYPE)); } +"keep" { return (processSpec (QKEEP)); } +"null" { return (processSpec (QNULL)); } +"notnull" { return (processSpec (QNOTNULL)); } +"isnull" { return (processSpec (QISNULL)); } +"truenull" { return (processSpec (QTRUENULL)); } +"falsenull" { return (processSpec (QFALSENULL)); } +"relnull" { return (processSpec (QRELNULL)); } +"reldef" { return (processSpec (QRELDEF)); } +"exposed" { return (processSpec (QEXPOSED)); } +"newref" { return (processSpec (QNEWREF)); } +"tempref" { return (processSpec (QTEMPREF)); } +"killref" { return (processSpec (QKILLREF)); } +"refcounted" { return (processSpec (QREFCOUNTED)); } +"checked" { return (processSpec (QCHECKED)); } +"checkmod" { return (processSpec (QCHECKMOD)); } +"checkedstrict" { return (processSpec (QCHECKEDSTRICT)); } +"unchecked" { return (processSpec (QUNCHECKED)); } +"only" { return (processSpec (QONLY)); } +"owned" { return (processSpec (QOWNED)); } +"observer" { return (processSpec (QOBSERVER)); } +"dependent" { return (processSpec (QDEPENDENT)); } +"unused" { return (processSpec (QUNUSED)); } +"external" { return (processSpec (QEXTERNAL)); } +"sef" { return (processSpec (QSEF)); } +"shared" { return (processSpec (QSHARED)); } +"yield" { return (processSpec (QYIELD)); } +"undef" { return (processSpec (QUNDEF)); } +"killed" { return (processSpec (QKILLED)); } +{Letter}({Letter}|{Digit})* { int tok; + context_saveLocation (); + setTokLength (longUnsigned_toInt (mstring_length (yytext))); + tok = processIdentifier (makeIdentifier (yytext)); + if (tok != BADTOK) + { + return (tok); + } + } +0[xX]{H}+ { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_int, processHex ()); /* evs 2000-05-17 was ctype_uint */ + } +0[xX]{H}+{L} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_lint, processHex ()); } +0[xX]{H}+{L}{L} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_llint, processHex ()); } +0[xX]{H}+{U} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_uint, processHex ()); } +0[xX]{H}+{ULSuffix} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ulint, processHex ()); } +0[xX]{H}+{U}{L}{L} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processHex ()); } +0[xX]{H}+{L}{L}{U} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processHex ()); } +0{Digit}+ { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_int, processOctal ()); } +0{Digit}+{U} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_uint, processOctal ()); } +0{Digit}+{L} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_lint, processOctal ()); } +0{Digit}+{L}{L} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_llint, processOctal ()); } +0{Digit}+{ULSuffix} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ulint, processOctal ()); } +0{Digit}+{U}{L}{L} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processOctal ()); } +0{Digit}+{L}{L}{U} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processOctal ()); } +{Digit}+ { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_int, processDec ()); } +{Digit}+{U} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_uint, processDec ()); } +{Digit}+{L} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_lint, processDec ()); } +{Digit}+{L}{L} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_llint, processDec ()); } +{Digit}+{ULSuffix} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ulint, processDec ()); } +{Digit}+{U}{L}{L} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processDec ()); } +{Digit}+{L}{L}{U} { setTokLengthT (mstring_length (yytext)); + RETURN_INT (ctype_ullint, processDec ()); } +'(\\.|[^\\'])+' { setTokLengthT (mstring_length (yytext)); + RETURN_CHAR (processChar ()); } +{Digit}+{E}[fF] { setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_float, processFloat ()); } +{Digit}+{E}[lL] { setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_ldouble, processFloat ()); } +{Digit}+{E} { setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_double, processFloat ()); } + +{Digit}*"."{Digit}+({E})?[fF] { setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_float, processFloat ()); } +{Digit}*"."{Digit}+({E})?[lL] { setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_ldouble, processFloat ()); } +{Digit}*"."{Digit}+({E})? { setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_double, processFloat ()); } + +{Digit}+"."{Digit}*({E})?[fF] { setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_float, processFloat ()); } +{Digit}+"."{Digit}*({E})?[lL] { setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_ldouble, processFloat ()); } +{Digit}+"."{Digit}*({E})? { setTokLengthT (mstring_length (yytext)); + RETURN_FLOAT (ctype_double, processFloat ()); } + +">>=" { setTokLength (3); RETURN_TOK (RIGHT_ASSIGN); } +"<<=" { setTokLength (3); RETURN_TOK (LEFT_ASSIGN); } +"+=" { setTokLength (2); RETURN_TOK (ADD_ASSIGN); } +"-=" { setTokLength (2); RETURN_TOK (SUB_ASSIGN); } +"*=" { setTokLength (2); RETURN_TOK (MUL_ASSIGN); } +"/=" { setTokLength (2); RETURN_TOK (DIV_ASSIGN); } +"%=" { setTokLength (2); RETURN_TOK (MOD_ASSIGN); } +"&=" { setTokLength (2); RETURN_TOK (AND_ASSIGN); } +"^=" { setTokLength (2); RETURN_TOK (XOR_ASSIGN); } +"|=" { setTokLength (2); RETURN_TOK (OR_ASSIGN); } +">>" { setTokLength (2); RETURN_TOK (RIGHT_OP); } +"<<" { setTokLength (2); RETURN_TOK (LEFT_OP); } +"++" { setTokLength (2); RETURN_TOK (INC_OP); } +"--" { setTokLength (2); RETURN_TOK (DEC_OP); } +"->" { setTokLength (2); RETURN_TOK (ARROW_OP); } +"&&" { setTokLength (2); RETURN_TOK (AND_OP); } +"||" { setTokLength (2); RETURN_TOK (OR_OP); } +"<=" { setTokLength (2); RETURN_TOK (LE_OP); } +">=" { setTokLength (2); RETURN_TOK (GE_OP); } +"==" { setTokLength (2); RETURN_TOK (EQ_OP); } +"!=" { setTokLength (2); RETURN_TOK (NE_OP); } +";" { setTokLength (1); RETURN_TOK (TSEMI); } +"{" { setTokLength (1); RETURN_TOK (TLBRACE); } +"}" { setTokLength (1); RETURN_TOK (TRBRACE); } +"," { setTokLength (1); RETURN_TOK (TCOMMA); } +":" { setTokLength (1); RETURN_TOK (TCOLON); } +"=" { setTokLength (1); RETURN_TOK (TASSIGN); } +"(" { setTokLength (1); RETURN_TOK (TLPAREN); } +")" { setTokLength (1); RETURN_TOK (TRPAREN); } +"[" { setTokLength (1); RETURN_TOK (TLSQBR); } +"]" { setTokLength (1); RETURN_TOK (TRSQBR); } +"." { setTokLength (1); RETURN_TOK (TDOT); } +"&" { setTokLength (1); RETURN_TOK (TAMPERSAND); } +"!" { setTokLength (1); RETURN_TOK (TEXCL); } + + +"~" { setTokLength (1); RETURN_TOK (TTILDE); } +"-" { setTokLength (1); RETURN_TOK (TMINUS); } +"+" { setTokLength (1); RETURN_TOK (TPLUS); } +"*" { setTokLength (1); RETURN_TOK (TMULT); } +"/" { setTokLength (1); RETURN_TOK (TDIV); } +"%" { setTokLength (1); RETURN_TOK (TPERCENT); } +"<" { setTokLength (1); RETURN_TOK (TLT); } +">" { setTokLength (1); RETURN_TOK (TGT); } +"^" { setTokLength (1); RETURN_TOK (TCIRC); } +"|" { setTokLength (1); RETURN_TOK (TBAR); } +"?" { setTokLength (1); RETURN_TOK (TQUEST); } + +[ \t\v\f] { incColumn (); } +\n { context_incLineno (); + if (continueLine) + { + continueLine = FALSE; + } + else + { + if (context_inMacro ()) + { + /* Don't use RETURN_TOK */ + yylval.tok = lltok_create (TENDMACRO, g_currentloc); + lastWasString = FALSE; + return (TENDMACRO); + } + } + } +"@@MR@@" { setTokLength (6); + + if (processMacro ()) { + if (context_inIterDef ()) + { + RETURN_TOK (LLMACROITER); + } + if (context_inIterEnd ()) + { + RETURN_TOK (LLMACROEND); + } + if (context_inMacro ()) + { + RETURN_TOK (LLMACRO); + } + } + } +"@QLMR" { if (context_inHeader () || context_inFunction ()) + { + handleMacro (); + } + else + { + int nspchar = ninput (); + int nspaces; + + /* + ** This is a hack to get the column number correct. + */ + + llassert (nspchar >= '0' && nspchar <= '9'); + + nspaces = nspchar - '0'; + + setTokLength (5 + nspaces); + + if (processMacro ()) + { + if (context_inIterDef ()) + { + RETURN_TOK (LLMACROITER); + } + if (context_inIterEnd ()) + { + RETURN_TOK (LLMACROEND); + } + if (context_inMacro ()) + { + RETURN_TOK (LLMACRO); + } + } + } + } +"@.CT" { setTokLength (4); lldiagmsg (ctype_unparseTable ()); } +"@.F" { setTokLength (3); + lldiagmsg (message ("%q: *** marker ***", fileloc_unparse (g_currentloc))); + } +"@.L" { setTokLength (3); usymtab_printLocal (); } +"@.A" { setTokLength (3); lldiagmsg (usymtab_unparseAliases ()); } +"@.C" { setTokLength (3); lldiagmsg (context_unparse ()); } +"@.W" { setTokLength (3); lldiagmsg (context_unparseClauses ()); } +"@.G" { setTokLength (3); usymtab_printGuards (); } +"@.S" { setTokLength (3); usymtab_printOut (); } +"@.X" { setTokLength (3); usymtab_printAll (); } +"@.Z" { setTokLength (3); usymtab_printComplete (); } +"@.T" { setTokLength (3); usymtab_printTypes (); } +"@.K" { setTokLength (3); lldiagmsg (usymtab_unparseStack ()); } +"@.M" { setTokLength (3); + lldiagmsg (message ("Can modify: %q", + sRefSet_unparse (context_modList ()))); + } +"%{" { /* BEFORE_COMMENT_MARKER */ + int tok; + incColumn (); incColumn (); + tok = handleLlSpecial (); + if (tok != BADTOK) + { + RETURN_TOK (tok); + } + } +"%}" { /* AFTER_COMMENT_MARKER */ + setTokLength (2); + inSpecPart = FALSE; + RETURN_TOK (QENDMACRO); } +"\\" { incColumn (); continueLine = TRUE; } +. { incColumn (); + voptgenerror + (FLG_SYNTAX, + message ("Invalid character (ascii: %d), skipping character", + (int)(*yytext)), + g_currentloc); + } +%% + +struct skeyword +{ + /*@null@*/ /*@observer@*/ char *name; + int token; +} ; + +/* +** These tokens are followed by syntax that is parsed by the +** grammar proper. +*/ + +struct skeyword s_parsetable[] = { + { "modifies", QMODIFIES } , + { "globals", QGLOBALS } , + { "alt", QALT } , + { "constant", QCONSTANT } , + { "function", QFUNCTION } , + { "iter", QITER } , + { "defines", QDEFINES } , + { "uses", QUSES } , + { "allocates", QALLOCATES } , + { "sets", QSETS } , + { "releases", QRELEASES } , + { "pre", QPRECLAUSE } , + { "post", QPOSTCLAUSE } , + { NULL, BADTOK } +} ; + +/* +** These tokens are either stand-alone tokens, or followed by +** token-specific text. +*/ + +struct skeyword s_keytable[] = { + { "anytype", QANYTYPE } , + { "integraltype", QINTEGRALTYPE } , + { "unsignedintegraltype", QUNSIGNEDINTEGRALTYPE } , + { "signedintegraltype", QSIGNEDINTEGRALTYPE } , + { "out", QOUT } , + { "in", QIN } , + { "only", QONLY } , + { "owned", QOWNED } , + { "dependent", QDEPENDENT } , + { "partial", QPARTIAL } , + { "special", QSPECIAL } , + { "truenull", QTRUENULL } , + { "falsenull", QFALSENULL } , + { "keep", QKEEP } , + { "kept", QKEPT } , + { "notnull", QNOTNULL } , + { "abstract", QABSTRACT } , + { "concrete", QCONCRETE } , + { "mutable", QMUTABLE } , + { "immutable", QIMMUTABLE } , + { "unused", QUNUSED } , + { "external", QEXTERNAL } , + { "sef", QSEF } , + { "unique", QUNIQUE } , + { "returned", QRETURNED } , + { "exposed", QEXPOSED } , + { "refcounted", QREFCOUNTED } , + { "refs", QREFS } , + { "newref", QNEWREF } , + { "tempref", QTEMPREF } , + { "killref", QKILLREF } , + { "null", QNULL } , + { "relnull", QRELNULL } , + { "reldef", QRELDEF } , + { "observer", QOBSERVER } , + { "exits", QEXITS } , + { "mayexit", QMAYEXIT } , + { "trueexit", QTRUEEXIT } , + { "falseexit", QFALSEEXIT } , + { "neverexit", QNEVEREXIT } , + { "temp", QTEMP } , + { "shared", QSHARED } , + { "ref", QREF } , + { "unchecked", QUNCHECKED } , + { "checked", QCHECKED } , + { "checkmod", QCHECKMOD } , + { "checkedstrict", QCHECKEDSTRICT } , + { "innercontinue", QINNERCONTINUE } , + { "innerbreak", QINNERBREAK } , + { "loopbreak", QLOOPBREAK } , + { "switchbreak", QSWITCHBREAK } , + { "safebreak", QSAFEBREAK } , + { "fallthrough", QFALLTHROUGH } , + { "l_fallthrou", QLINTFALLTHROUGH } , + { "l_fallth", QLINTFALLTHRU } , + { "notreached", QNOTREACHED } , + { "l_notreach", QLINTNOTREACHED } , + { "printflike", QPRINTFLIKE } , + { "l_printfli", QLINTPRINTFLIKE } , + { "scanflike", QSCANFLIKE } , + { "messagelike", QMESSAGELIKE } , + { "l_argsus", QARGSUSED } , + { NULL, BADTOK } +} ; + +/* +** would be better if these weren't hard coded... +*/ + +static bool isArtificial (cstring s) +{ + return (cstring_equalLit (s, "modifies") + || cstring_equalLit (s, "globals") + || cstring_equalLit (s, "alt")); +} + +void swallowMacro (void) +{ + int i; + bool skipnext = FALSE; + + while ((i = lminput ()) != EOF) + { + char c = (char) i; + + + if (c == '\\') + { + skipnext = TRUE; + } + else if (c == '\n') + { + if (skipnext) + { + skipnext = FALSE; + } + else + { + checkUngetc (i, yyin); + return; + } + } + } + + if (i != EOF) + { + checkUngetc (i, yyin); + } +} + +static int commentMarkerToken (cstring s) +{ + int i = 0; + + while (s_parsetable[i].name != NULL) + { + if (cstring_equalLit (s, s_parsetable[i].name)) + { + return s_parsetable[i].token; + } + + i++; + } + + return BADTOK; +} + +static int tokenMacroCode (cstring s) +{ + int i = 0; + + while (s_keytable[i].name != NULL) + { + if (cstring_equalLit (s, s_keytable[i].name)) + { + if (s_keytable[i].token == QLINTFALLTHROUGH) + { + voptgenerror + (FLG_WARNLINTCOMMENTS, + cstring_makeLiteral + ("Traditional lint comment /*FALLTHROUGH*/ used. " + "This is interpreted by " + "LCLint in the same way as most Unix lints, but it is " + "preferable to replace it with the /*@fallthrough@*/ " + "stylized comment"), + g_currentloc); + return QFALLTHROUGH; + } + else if (s_keytable[i].token == QLINTFALLTHRU) + { + voptgenerror + (FLG_WARNLINTCOMMENTS, + cstring_makeLiteral + ("Traditional lint comment /*FALLTHRU*/ used. " + "This is interpreted by " + "LCLint in the same way as most Unix lints, but it is " + "preferable to replace it with the /*@fallthrough@*/ " + "stylized comment"), + g_currentloc); + return QFALLTHROUGH; + } + else if (s_keytable[i].token == QLINTNOTREACHED) + { + voptgenerror + (FLG_WARNLINTCOMMENTS, + cstring_makeLiteral + ("Traditional lint comment /*NOTREACHED*/ used. " + "This is interpreted by " + "LCLint in the same way as most Unix lints, but it is " + "preferable to replace it with the /*@notreached@*/ " + "stylized comment."), + g_currentloc); + + return QNOTREACHED; + } + else if (s_keytable[i].token == QPRINTFLIKE) + { + setSpecialFunction (QU_PRINTFLIKE); + return SKIPTOK; + } + else if (s_keytable[i].token == QLINTPRINTFLIKE) + { + voptgenerror + (FLG_WARNLINTCOMMENTS, + cstring_makeLiteral + ("Traditional lint comment /*PRINTFLIKE*/ used. " + "This is interpreted by " + "LCLint in the same way as most Unix lints, but it is " + "preferable to replace it with either /*@printflike@*/, " + "/*@scanflike@*/ or /*@messagelike@*/."), + g_currentloc); + + setSpecialFunction (QU_PRINTFLIKE); + return SKIPTOK; + } + else if (s_keytable[i].token == QSCANFLIKE) + { + setSpecialFunction (QU_SCANFLIKE); + return SKIPTOK; + } + else if (s_keytable[i].token == QMESSAGELIKE) + { + setSpecialFunction (QU_MESSAGELIKE); + return SKIPTOK; + } + else if (s_keytable[i].token == QARGSUSED) + { + voptgenerror + (FLG_WARNLINTCOMMENTS, + cstring_makeLiteral + ("Traditional lint comment /*ARGSUSED*/ used. " + "This is interpreted by " + "LCLint in the same way as most Unix lints, but it is " + "preferable to use /*@unused@*/ annotations on " + "the unused parameters."), + g_currentloc); + + setArgsUsed (); + return SKIPTOK; + } + + return s_keytable[i].token; + } + + i++; + } + + return BADTOK; +} + +static int lminput () +{ + if (savechar == '\0') + { + incColumn (); + return (input ()); + } + else + { + int save = (int) savechar; + savechar = '\0'; + return save; + } +} + +static void lmsavechar (char c) +{ + if (savechar == '\0') savechar = c; + else + { + llbuglit ("lmsavechar: override"); + } +} + +static int returnFloat (ctype ct, double f) +{ + yylval.expr = exprNode_floatLiteral (f, ct, cstring_fromChars (yytext), + fileloc_decColumn (g_currentloc, tokLength)); + tokLength = 0; + return (CCONSTANT); +} + +static int returnInt (ctype ct, long i) +{ + ctype c = ct; + + if (ctype_equal (ct, ctype_int)) + { + if (i == 0) + { + c = context_typeofZero (); + } + else if (i == 1) + { + c = context_typeofOne (); + } + } + + yylval.expr = exprNode_numLiteral (c, cstring_fromChars (yytext), + fileloc_decColumn (g_currentloc, tokLength), i); + tokLength = 0; + return (CCONSTANT); +} + +static int returnChar (char c) +{ + yylval.expr = exprNode_charLiteral (c, cstring_fromChars (yytext), + fileloc_decColumn (g_currentloc, tokLength)); + tokLength = 0; + return (CCONSTANT); +} + +static int ninput () +{ + int c = lminput (); + + if (c != EOF && ((char)c == '\n')) + { + context_incLineno (); + } + + return c; +} + +static char macro_nextChar () +{ + static bool in_quote = FALSE, in_escape = FALSE, in_char = FALSE; + int ic; + char c; + + ic = lminput (); + c = char_fromInt (ic); + + if (!in_quote && !in_char && (c == '\\' || c == BEFORE_COMMENT_MARKER[0])) + { + if (c == '\\') + { + while ((c = char_fromInt (lminput ())) != '\0' && c != '\n') + { + ; /* skip to newline */ + } + + context_incLineno (); + + if (c != '\0') + { + return macro_nextChar (); + } + else + { + return c; + } + } + else /* if (c == '@') */ + { + if (handleLlSpecial () != BADTOK) + { + llerrorlit (FLG_SYNTAX, "Macro cannot use special syntax"); + } + + return macro_nextChar (); + } + } + else if (!in_escape && c == '\"') + { + in_quote = !in_quote; + } + else if (!in_escape && c == '\'') + { + in_char = !in_char; + } + else if ((in_quote || in_char) && c == '\\') + { + in_escape = !in_escape; + } + else if ((in_quote || in_char) && in_escape) + { + in_escape = FALSE; + } + else if (!in_quote && c == '/') + { + char c2; + + if ((c2 = char_fromInt (lminput ())) == '*') + { + while (c2 != '\0') + { + while ((c2 = char_fromInt (lminput ())) != '\0' + && c2 != '\n' && c2 != '*') + { + ; + } + + if (c2 == '*') + { + while ((c2 = char_fromInt (lminput ())) != '\0' + && c2 == '*') + { + ; + } + + if (c2 == '/') + { + goto outofcomment; + } + } + else + { + llfatalerror (cstring_makeLiteral ("Macro: bad comment!")); + } + } + outofcomment: + return macro_nextChar (); + } + else + { + /*** putchar does not work! why? puts to stdio...??! ***/ + lmsavechar (c2); + } + } + return c; +} + +/* +** keeps stylized comments +*/ + +static char macro_nextCharC () +{ + static bool in_quote = FALSE, in_escape = FALSE, in_char = FALSE; + char c; + + c = char_fromInt (lminput ()); + + if (!in_quote && !in_char && c == '\\') + { + while ((c = char_fromInt (lminput ())) != '\0' && c != '\n') + { + ; /* skip to newline */ + } + + context_incLineno (); + + if (c != '\0') + { + return macro_nextCharC (); + } + else + { + return c; + } + } + else if (!in_escape && c == '\"') + { + in_quote = !in_quote; + } + else if (!in_escape && c == '\'') + { + in_char = !in_char; + } + else if ((in_quote || in_char) && c == '\\') + { + in_escape = !in_escape; + } + else if ((in_quote || in_char) && in_escape) + { + in_escape = FALSE; + } + else if (!in_quote && c == '/') + { + char c2; + + if ((c2 = char_fromInt (lminput ())) == '*') + { + while (c2 != '\0') + { + while ((c2 = char_fromInt (lminput ())) != '\0' + && c2 != '\n' && c2 != '*') + { + ; + } + + if (c2 == '*') + { + while ((c2 = char_fromInt (lminput ())) != '\0' + && c2 == '*') + { + ; + } + + if (c2 == '/') + { + goto outofcomment; + } + } + else + { + llfatalerror (cstring_makeLiteral ("Macro: bad comment!")); + } + } + outofcomment: + return macro_nextCharC (); + } + else + { + lmsavechar (c2); + } + } + return c; +} + +/* +** skips whitespace (handles line continuations) +** returns first non-whitespace character +*/ + +static char skip_whitespace () +{ + char c; + + while ((c = macro_nextChar ()) == ' ' || c == '\t') + { + ; + } + + return c; +} + +static void handleMacro () +{ + cstring mac = cstring_undefined; + int macrocode; + char c; + + while (currentColumn () > 2) + { + mac = cstring_appendChar (mac, ' '); + setTokLength (-1); + } + + c = macro_nextCharC (); + + if (c >= '0' && c <= '9') + { + int i; + + for (i = 0; i < ((c - '0') + 1); i++) + { + mac = cstring_appendChar (mac, ' '); + } + } + else + { + BADBRANCH; + } + + while (((c = macro_nextCharC ()) != '\0') && (c != '\n')) + { + mac = cstring_appendChar (mac, c); + } + + + macrocode = tokenMacroCode (mac); + + if (macrocode == BADTOK && !isArtificial (mac)) + { + DPRINTF (("Add macro: %s", mac)); + context_addMacroCache (mac); + } + else + { + cstring_free (mac); + } + + if (c == '\n') + { + context_incLineno (); + } +} + +static bool processMacro (void) +{ + uentry e2; + ctype ct; + int noparams = 0; + cstring fname = cstring_undefined; + bool res = TRUE; + bool isspecfcn = FALSE; + bool isiter = FALSE; + bool skipparam = FALSE; + bool isenditer = FALSE; + bool unknownm = FALSE; + bool hasParams = FALSE; + bool emptyMacro = FALSE; + char c = skip_whitespace (); + fileloc loc = fileloc_noColumn (g_currentloc); + + /* are both of these necessary? what do they mean? */ + uentryList specparams = uentryList_undefined; + uentryList pn = uentryList_undefined; + + context_resetMacroMissingParams (); + + if (c == '\0' || c == '\n') + { + llcontbug (cstring_makeLiteral ("Bad macro")); + fileloc_free (loc); + return FALSE; + } + + fname = cstring_appendChar (fname, c); + + while ((c = macro_nextChar ()) != '(' && c != '\0' + && c != ' ' && c != '\t' && c != '\n') + { + fname = cstring_appendChar (fname, c); + } + + if (c == ' ' || c == '\t' || c == '\n') + { + char oldc = c; + + if (c != '\n') + { + while (c == ' ' || c == '\t') + { + c = macro_nextChar (); + } + unput (c); + } + + if (c == '\n') + { + emptyMacro = TRUE; + unput (c); + } + + c = oldc; + } + + hasParams = (c == '('); + + + if (usymtab_exists (fname)) + { + e2 = usymtab_lookupExpose (fname); + ct = uentry_getType (e2); + + + if (uentry_isCodeDefined (e2) + && fileloc_isUser (uentry_whereDefined (e2))) + { + if (optgenerror + (FLG_MACROREDEF, + message ("Macro %s already defined", fname), + loc)) + { + uentry_showWhereDefined (e2); + uentry_clearDefined (e2); + } + + if (uentry_isFunction (e2)) + { + uentry_setType (e2, ctype_unknown); + ct = ctype_unknown; + unknownm = TRUE; + context_enterUnknownMacro (e2); + } + else + { + context_enterConstantMacro (e2); + } + } + else + { + if (uentry_isForward (e2) && uentry_isFunction (e2)) + { + unknownm = TRUE; + + voptgenerror + (FLG_MACROFCNDECL, + message + ("Parameterized macro has no prototype or specification: %s ", + fname), + loc); + + ct = ctype_unknown; + uentry_setType (e2, ctype_unknown); + uentry_setFunctionDefined (e2, loc); + uentry_setUsed (e2, fileloc_undefined); + context_enterUnknownMacro (e2); + } + else + { + if (uentry_isIter (e2)) + { + isiter = TRUE; + specparams = uentry_getParams (e2); + noparams = uentryList_size (specparams); + uentry_setDefined (e2, loc); + context_enterIterDef (e2); + } + else if (uentry_isEndIter (e2)) + { + isenditer = TRUE; + uentry_setDefined (e2, loc); + context_enterIterEnd (e2); /* don't care about it now */ + /* but should parse like an iter! */ + } + else if (uentry_isConstant (e2)) + { + if (hasParams) + { + voptgenerror + (FLG_INCONDEFS, + message ("Constant %s implemented as parameterized macro", + fname), + g_currentloc); + + uentry_showWhereSpecified (e2); + uentry_setType (e2, ctype_unknown); + uentry_makeVarFunction (e2); + uentry_setDefined (e2, g_currentloc); + uentry_setFunctionDefined (e2, g_currentloc); + context_enterUnknownMacro (e2); + } + else + { + if (!uentry_isSpecified (e2)) + { + fileloc oloc = uentry_whereDeclared (e2); + + if (fileloc_isLib (oloc)) + { + ; + } + else if (fileloc_isUndefined (oloc) + || fileloc_isPreproc (oloc)) + { + if (!emptyMacro) + { + voptgenerror + (FLG_MACROCONSTDECL, + message + ("Macro constant %q not declared", + uentry_getName (e2)), + loc); + } + } + else if (!fileloc_withinLines (oloc, loc, 2)) + { /* bogus! will give errors if there is too much whitespace */ + voptgenerror + (FLG_SYNTAX, + message + ("Macro constant name %s does not match name in " + "previous constant declaration. This constant " + "is declared at %q", fname, + fileloc_unparse (oloc)), + loc); + } + } + + context_enterConstantMacro (e2); + cstring_free (fname); + fileloc_free (loc); + return res; + } + + } + else if (ctype_isFunction (ct)) + { + isspecfcn = TRUE; + specparams = ctype_argsFunction (ct); + noparams = uentryList_size (specparams); + + uentry_setFunctionDefined (e2, loc); + context_enterMacro (e2); + } + else if (uentry_isVar (e2)) + { + if (hasParams) + { + voptgenerror + (FLG_INCONDEFS, + message ("Variable %s implemented as parameterized macro", + fname), + loc); + + uentry_showWhereSpecified (e2); + uentry_setType (e2, ctype_unknown); + uentry_makeVarFunction (e2); + uentry_setDefined (e2, g_currentloc); + uentry_setFunctionDefined (e2, g_currentloc); + context_enterUnknownMacro (e2); + } + else + { + uentry ucons = uentry_makeConstant (fname, + ctype_unknown, + loc); + if (uentry_isExpandedMacro (e2)) + { + ; /* okay */ + } + else + { + if (optgenerror + (FLG_INCONDEFS, + message ("Variable %s implemented by a macro", + fname), + loc)) + { + uentry_showWhereSpecified (e2); + } + } + + uentry_setDefined (e2, loc); + uentry_setUsed (ucons, loc); + + context_enterConstantMacro (ucons); + uentry_markOwned (ucons); + cstring_free (fname); + return res; + } + } + else + { + if (uentry_isDatatype (e2)) + { + vgenhinterror + (FLG_SYNTAX, + message ("Type implemented as macro: %x", + uentry_getName (e2)), + message ("A type is implemented using a macro definition. A " + "typedef should be used instead."), + g_currentloc); + + swallowMacro (); + /* Must exit scope (not sure why a new scope was entered?) */ + usymtab_quietExitScope (g_currentloc); + uentry_setDefined (e2, g_currentloc); + res = FALSE; + } + else + { + llcontbug + (message ("Unexpanded macro not function or constant: %q", + uentry_unparse (e2))); + uentry_setType (e2, ctype_unknown); + + if (hasParams) + { + uentry_makeVarFunction (e2); + uentry_setDefined (e2, g_currentloc); + uentry_setFunctionDefined (e2, g_currentloc); + context_enterUnknownMacro (e2); + } + } + } + } + } + } + else + { + uentry ce; + + voptgenerror + (FLG_MACROMATCHNAME, + message ("Unexpanded macro %s does not match name of a constant " + "or iter declaration. The name used in the control " + "comment on the previous line should match. " + "(Assuming macro defines a constant.)", + fname), + loc); + + + ce = uentry_makeConstant (fname, ctype_unknown, fileloc_undefined); + uentry_setUsed (ce, loc); /* perhaps bogus? */ + e2 = usymtab_supEntryReturn (ce); + + context_enterConstantMacro (e2); + cstring_free (fname); + fileloc_free (loc); + return res; + } + + /* in macros, ( must follow immediatetly after name */ + + if (hasParams) + { + int paramno = 0; + + c = skip_whitespace (); + + while (c != ')' && c != '\0') + { + uentry param; + bool suppress = context_inSuppressRegion (); + cstring paramname = cstring_undefined; + + /* + ** save the parameter location + */ + + decColumn (); + context_saveLocation (); + incColumn (); + + while (c != ' ' && c != '\t' && c != ',' && c != '\0' && c != ')') + { + paramname = cstring_appendChar (paramname, c); + c = macro_nextChar (); + } + + if (c == ' ' || c == '\t') c = skip_whitespace (); + + if (c == ',') + { + c = macro_nextChar (); + if (c == ' ' || c == '\t') c = skip_whitespace (); + } + + if (c == '\0') + { + llfatalerror (cstring_makeLiteral + ("Bad macro syntax: uentryList")); + } + + if ((isspecfcn || isiter) && (paramno < noparams) + && !uentry_isElipsisMarker (uentryList_getN + (specparams, paramno))) + { + uentry decl = uentryList_getN (specparams, paramno); + sRef sr; + + param = uentry_nameCopy (paramname, decl); + + + uentry_setParam (param); + sr = sRef_makeParam (paramno, uentry_getType (param)); + + if (sRef_getNullState (sr) == NS_ABSNULL) + { + ctype pt = ctype_realType (uentry_getType (param)); + + if (ctype_isUser (pt)) + { + uentry te = usymtab_getTypeEntrySafe (ctype_typeId (pt)); + + if (uentry_isValid (te)) + { + sRef_setStateFromUentry (sr, te); + } + } + else + { + sRef_setNullState (sr, NS_UNKNOWN, g_currentloc); + } + } + + uentry_setSref (param, sr); + uentry_setDeclaredForceOnly (param, context_getSaveLocation ()); + + skipparam = isiter && uentry_isOut (uentryList_getN (specparams, paramno)); + } + else + { + fileloc sloc = context_getSaveLocation (); + + param = uentry_makeVariableSrefParam + (paramname, ctype_unknown, sRef_makeParam (paramno, ctype_unknown)); + cstring_free (paramname); + + sRef_setPosNull (uentry_getSref (param), sloc); + + uentry_setDeclaredForce (param, sloc); + + skipparam = FALSE; + fileloc_free (sloc); + } + + if (!skipparam) + { + llassert (!uentry_isElipsisMarker (param)); + + if (!suppress) + { + sRef_makeUnsafe (uentry_getSref (param)); + } + + pn = uentryList_add (pn, uentry_copy (param)); + usymtab_supEntry (param); + } + else + { + /* don't add param */ + uentry_free (param); + } + + if (c == ',') + { + (void) macro_nextChar (); + c = skip_whitespace (); + } + + paramno++; + } + + if (c == ')') + { + if (isspecfcn || isiter) + { + if (paramno != noparams && noparams >= 0) + { + advanceLine (); + + voptgenerror + (FLG_INCONDEFS, + message ("Macro %s specified with %d args, defined with %d", + fname, noparams, paramno), + g_currentloc); + + uentry_showWhereSpecified (e2); + uentry_resetParams (e2, pn); + } + } + else + { + uentry_resetParams (e2, pn); + } + } + } + else + { + /* + ** the form should be: + ** + ** # define newname oldname + ** where oldname refers to a function matching the specification + ** of newname. + */ + + if (unknownm) + { + sRef_setGlobalScope (); + usymtab_supGlobalEntry (uentry_makeVariableLoc (fname, ctype_unknown)); + sRef_clearGlobalScope (); + } + else + { + context_setMacroMissingParams (); + } + } + + + /* context_setuentryList (pn); */ + usymtab_enterScope (); + + fileloc_free (loc); + cstring_free (fname); + + return res; +} + +static bool handleSpecial (char *yyt) +{ + char *l = mstring_create (MAX_NAME_LENGTH); + static bool reportcpp = FALSE; + int lineno = 0; + char c; + char *ol; + cstring olc; + + strcpy (l, yyt + 1); + + /* Need to safe original l for deallocating. */ + ol = l; + + l += strlen (yyt) - 1; + + while ((c = char_fromInt (lminput ())) != '\n' && c != '\0') + { + *l++ = c; + } + + *l = '\0'; + olc = cstring_fromChars (ol); + + if (cstring_equalPrefix (olc, "pragma")) + { + char *pname = mstring_create (longUnsigned_fromInt (MAX_PRAGMA_LEN)); + char *opname = pname; + char *ptr = ol + 6; /* pragma is six characters, plus space */ + int len = 0; + + + /* skip whitespace */ + while (((c = *ptr) != '\0') && isspace (c)) + { + ptr++; + } + + + while (((c = *ptr) != '\0') && !isspace (c)) + { + len++; + + if (len > MAX_PRAGMA_LEN) + { + break; + } + + ptr++; + *pname++ = c; + } + + *pname = '\0'; + + if (len == PRAGMA_LEN_EXPAND + && mstring_equal (opname, PRAGMA_EXPAND)) + { + cstring exname = cstring_undefined; + uentry ue; + + ptr++; + while (((c = *ptr) != '\0') && !isspace (c)) + { + exname = cstring_appendChar (exname, c); + ptr++; + } + + + ue = usymtab_lookupExposeGlob (exname); + + if (uentry_isExpandedMacro (ue)) + { + if (fileloc_isPreproc (uentry_whereDefined (ue))) + { + fileloc_setColumn (g_currentloc, 1); + uentry_setDefined (ue, g_currentloc); + } + } + + cstring_free (exname); + } + } + else if (cstring_equalPrefix (olc, "ident")) + { + /* Some pre-processors will leave these in the code. Ignore rest of line */ + } + /* + ** Yuk...Win32 filenames can have spaces in them...we need to read + ** to the matching end quote. + */ + else if ((sscanf (ol, "line %d \"", &lineno) == 1) + || (sscanf (ol, " %d \"", &lineno) == 1)) + { + char *tmp = ol; + char *fname; + fileId fid; + + while (*tmp != '\"' && *tmp != '\0') + { + tmp++; + } + + llassert (*tmp == '\"'); + + tmp++; + fname = tmp; + + while (*tmp != '\"' && *tmp != '\0') + { + tmp++; + } + + llassert (*tmp == '\"'); + + *tmp = '\0'; + + DPRINTF (("fname: %s", fname)); + +# if defined(OS2) || defined(MSDOS) || defined(WIN32) + + /* + ** DOS-like path delimiters get delivered in pairs, something like + ** \"..\\\\file.h\", so we have to make it normal again. We do NOT + ** remove the pre dirs yet as we usually specify tmp paths relative + ** to the current directory, so tmp files would not get found in + ** the hash table. If this method fails we try it again later. + */ + + { + char *stmp = fname; + + /* + ** Skip past the drive marker. + */ + + DPRINTF (("stmp: %s / %s", stmp, fname)); + + if (strchr (stmp, ':') != NULL) + { + stmp = strchr (stmp, ':') + 1; + } + + DPRINTF (("stmp: %s / %s", stmp, fname)); + + while ((stmp = strchr (stmp, CONNECTCHAR)) != NULL ) + { + if (*(stmp+1) == CONNECTCHAR) + { + memmove (stmp, stmp+1, strlen (stmp)); + } + + stmp++; + DPRINTF (("stmp: %s / %s", stmp, fname)); + } + + DPRINTF (("Now: base = %s", fname)); + + fid = fileTable_lookupBase (context_fileTable (), + cstring_fromChars (fname)); + if (!(fileId_isValid (fid))) + { + fname = removePreDirs (fname); + fid = fileTable_lookupBase (context_fileTable (), + cstring_fromChars (fname)); + } + } +# else /* !defined(OS2) && !defined(MSDOS) */ + fname = removePreDirs (fname); + fid = fileTable_lookupBase (context_fileTable (), + cstring_fromChars (fname)); +# endif /* !defined(OS2) && !defined(MSDOS) */ + + if (!(fileId_isValid (fid))) + { + if (isHeaderFile (cstring_fromChars (fname))) + { + fid = fileTable_addHeaderFile (context_fileTable (), + cstring_fromChars (fname)); + } + else + { + fid = fileTable_addFile (context_fileTable (), + cstring_fromChars (fname)); + } + } + + setFileLine (fid, lineno); + } + else if ((sscanf (ol, "line %d", &lineno) == 1) + || (sscanf (ol, " %d", &lineno) == 1)) + { + setLine (lineno); /* next line is */ + } + else + { + if (mstring_equal (ol, "")) { + DPRINTF (("Empty pp command!")); + /* + ** evs 2000-05-16: This is a horrible kludge, to get around a bug (well, difficulty) in the pre-processor. + ** We handle a plain # in the input file, by echoing it, and ignoring it in the post-pp-file. + */ + mstring_free (ol); + return FALSE; + } else { + if (!reportcpp) + { + + } else { + llbug (message ("File contains preprocessor command: #%s", + cstring_fromChars (ol))); + reportcpp = TRUE; + } + } + + sfree (ol); + return TRUE; + } + + sfree (ol); + return FALSE; +} + +static int handleLlSpecial () +{ + int ic; + char c; + char *s = mstring_createEmpty (); + char *os; + int tok; + int charsread = 0; + + while (((ic = ninput ()) != 0) && isalpha (ic)) + { + c = (char) ic; + s = mstring_append (s, c); + charsread++; + } + + os = s; + + if (charsread == 0 && ic == (int) AFTER_COMMENT_MARKER[0]) + { + ic = ninput (); + + llassert (ic == AFTER_COMMENT_MARKER[1]); + + + if (isProcessingGlobMods () && (*s == '\0')) + { + sfree (os); + return QNOMODS; /* special token no modifications token */ + } + else + { + ; + } + } + + tok = commentMarkerToken (cstring_fromChars (os)); + + if (tok != BADTOK) + { + tokLength = charsread; + sfree (os); + inSpecPart = TRUE; + return tok; + } + + /* Add rest of the comment */ + + if (ic != 0 && ic != EOF) + { + c = (char) ic; + + + s = mstring_append (s, c); + charsread++; + + while (((ic = ninput ()) != 0) && (ic != EOF) + && (ic != AFTER_COMMENT_MARKER[0])) + { + c = (char) ic; + s = mstring_append (s, c); + charsread++; + } + } + + if (ic == AFTER_COMMENT_MARKER[0]) + { + int nc = ninput (); + llassert ((char) nc == AFTER_COMMENT_MARKER[1]); + charsread++; + } + + + os = s; + + while (*s == ' ' || *s == '\t' || *s == '\n') + { + s++; + } + + if (*s == '-' || *s == '+' || *s == '=') /* setting flags */ + { + c = *s; + + while (c == '-' || c == '+' || c == '=') + { + ynm set = ynm_fromCodeChar (c); + cstring thisflag; + + s++; + + thisflag = cstring_fromChars (s); + + while ((c = *s) != '\0' && (c != '-') && (c != '=') + && (c != '+') && (c != ' ') && (c != '\t') && (c != '\n')) + { + s++; + } + + *s = '\0'; + + if (!context_getFlag (FLG_NOCOMMENTS)) + { + cstring flagname = thisflag; + flagcode fflag = identifyFlag (flagname); + + if (flagcode_isSkip (fflag)) + { + ; + } + else if (flagcode_isInvalid (fflag)) + { + if (isMode (flagname)) + { + if (ynm_isMaybe (set)) + { + llerror + (FLG_BADFLAG, + message + ("Stylized comment attempts to restore flag %s. " + "A mode flag cannot be restored.", + flagname)); + } + else + { + context_setMode (flagname); + } + } + else + { + llerror + (FLG_BADFLAG, + message ("Unrecognized option in stylized comment: %s", + flagname)); + } + } + else if (flagcode_isGlobalFlag (fflag)) + { + llerror + (FLG_BADFLAG, + message + ("Stylized comment attempts to set global flag %s. " + "A global flag cannot be set locally.", + flagname)); + } + else + { + context_fileSetFlag (fflag, set); + + if (flagcode_hasArgument (fflag)) + { + if (ynm_isMaybe (set)) + { + llerror + (FLG_BADFLAG, + message + ("Stylized comment attempts to restore flag %s. " + "A flag for setting a value cannot be restored.", + flagname)); + } + else + { /* cut-and-pastied from llmain...blecch */ + cstring extra = cstring_undefined; + char *rest; + char *orest; + char rchar; + + *s = c; + rest = mstring_copy (s); + orest = rest; + *s = '\0'; + + while ((rchar = *rest) != '\0' + && (isspace (rchar))) + { + rest++; + s++; + } + + while ((rchar = *rest) != '\0' + && !isspace (rchar)) + { + extra = cstring_appendChar (extra, rchar); + rest++; + s++; + } + + sfree (orest); + + if (cstring_isUndefined (extra)) + { + llerror + (FLG_BADFLAG, + message + ("Flag %s (in stylized comment) must be followed by an argument", + flagcode_unparse (fflag))); + } + else + { + s--; + + if (flagcode_hasValue (fflag)) + { + setValueFlag (fflag, extra); + } + else if (flagcode_hasString (fflag)) + { + setStringFlag (fflag, extra); + } + else + { + BADEXIT; + } + } + } + } + } + } + else + { + } + + *s = c; + while ((c == ' ') || (c == '\t') || (c == '\n')) + { + c = *(++s); + } + } + + if (context_inHeader () && !isArtificial (cstring_fromChars (os))) + { + context_addComment (cstring_fromCharsNew (os)); + } + else + { + ; + } + } + else + { + char *t = s; + int macrocode; + char tchar = '\0'; + + while (*s != '\0' && *s != ' ' && *s != '\t' && *s != '\n') + { + s++; + } + + if (*s != '\0') + { + tchar = *s; + *s = '\0'; + s++; + } + + t = cstring_toCharsSafe (cstring_downcase (cstring_fromChars (t))); + macrocode = tokenMacroCode (cstring_fromChars (t)); + + if (macrocode != BADTOK) + { + tokLength = mstring_length (t); + + + sfree (t); + sfree (os); + + if (macrocode == SKIPTOK) + { + return BADTOK; + } + + return macrocode; + } + + if (context_inHeader ()) + { + if (tchar != '\0') + { + *(s-1) = tchar; + } + + if ((context_inMacro () || context_inGlobalContext ()) + && macrocode != SKIPTOK + && !isArtificial (cstring_fromChars (os))) + { + context_addComment (cstring_fromCharsNew (os)); + } + else + { + ; + } + + if (tchar != '\0') + { + *(s-1) = '\0'; + } + } + + if (mstring_equal (t, "ignore")) + { + if (!context_getFlag (FLG_NOCOMMENTS)) + { + context_enterSuppressRegion (); + } + } + else if ((*t == 'i' || *t == 't') + && (*(t + 1) == '\0')) + { + if (!context_getFlag (FLG_NOCOMMENTS) + && (*t == 'i' || context_getFlag (FLG_TMPCOMMENTS))) + { + context_enterSuppressLine (-1); /* infinite suppression */ + } + } + else if (((*t == 'i') || (*t == 't')) + && ((*(t + 1) >= '0' && *(t + 1) <= '9'))) + { + bool tmpcomment = (*t == 't'); + int val = -1; + char *tt = t; /* don't mangle t, since it is free'd */ + char lc = *(++tt); + + if (lc >= '0' && lc <= '9') + { + val = (int)(lc - '0'); + + lc = *(++tt); + while (lc >= '0' && lc <= '9') + { + val *= 10; + val += lc - '0'; + lc = *(++tt); + } + } + + + if (!context_getFlag (FLG_NOCOMMENTS) + && (!tmpcomment || context_getFlag (FLG_TMPCOMMENTS))) + { + context_enterSuppressLine (val); + } + } + else if (mstring_equal (t, "end")) + { + if (!context_getFlag (FLG_NOCOMMENTS)) + { + context_exitSuppressRegion (); + } + } + else if (mstring_equal (t, "notfunction")) + { + ; /* handled by pcpp */ + } + else if (mstring_equal (t, "access")) + { + cstring tname; + + while (TRUE) + { + while ((c = *s) && (c == ' ' || c == '\t' || c == '\n')) + { + s++; + } + + if (c == '\0') + { + break; + } + + tname = cstring_fromChars (s); + + while ((c = *s) != '\0' && c != ' ' + && c != '\t' && c != '\n' && c != ',') + { + s++; + } + + *s = '\0'; + + + if (!context_getFlag (FLG_NOCOMMENTS) + && !context_getFlag (FLG_NOACCESS)) + { + if (usymtab_existsType (tname)) + { + usymId uid = usymtab_getTypeId (tname); + + context_addFileAccessType (uid); + } + else + { + if (!(context_inSuppressRegion () + || context_inSuppressZone (g_currentloc))) + { + llmsg + (message + ("%q: Unrecognized type %s used in access comment", + fileloc_unparse (g_currentloc), tname)); + } + } + } + + if (c != '\0') + { + s++; + } + + if (c != ',' && c != ' ') + { + break; + } + } + } + else if (mstring_equal (t, "noaccess")) + { + cstring tname; + char lc; + + while (TRUE) + { + while ((lc = *s) && (lc == ' ' || lc == '\t' || lc == '\n')) + { + s++; + } + + if (lc == '\0') + { + break; + } + + tname = cstring_fromChars (s); + + while ((lc = *s) != '\0' && lc != ' ' && lc != '\t' + && lc != '\n' && lc != ',') + { + s++; + } + + *s = '\0'; + + if (!context_getFlag (FLG_NOCOMMENTS) + && !context_getFlag (FLG_NOACCESS)) + { + if (usymtab_existsType (tname)) + { + typeId tuid = usymtab_getTypeId (tname); + + if (context_couldHaveAccess (tuid)) + { + context_removeFileAccessType (tuid); + } + else + { + if (!(context_inSuppressRegion () + || context_inSuppressZone (g_currentloc))) + { + uentry ue = usymtab_getTypeEntry (tuid); + + if (uentry_isAbstractDatatype (ue)) + { + llmsg + (message + ("%q: Non-accessible abstract type %s used in noaccess comment", + fileloc_unparse (g_currentloc), tname)); + } + else + { + llmsg + (message + ("%q: Non-abstract type %s used in noaccess comment", + fileloc_unparse (g_currentloc), tname)); + } + } + } + } + else + { + if (!(context_inSuppressRegion () + || context_inSuppressZone (g_currentloc))) + { + llmsg + (message + ("%q: Unrecognized type %s used in noaccess comment", + fileloc_unparse (g_currentloc), tname)); + } + } + } + + if (lc != '\0') + { + s++; + } + + if (lc != ',' && lc != ' ') + { + break; + } + } + } + else + { + setTokLength (- (2 + charsread)); + + voptgenerror (FLG_UNRECOGCOMMENTS, + message ("Stylized comment unrecognized: %s", + cstring_fromChars (os)), + g_currentloc); + } + + sfree (t); + } + + sfree (os); + return BADTOK; +} + +static /*@only@*/ cstring makeIdentifier (char *s) +{ + char *c = mstring_create (size_toInt (strlen (s)) + 1); + cstring id = cstring_fromChars (c); + + while (isalnum (*s) || (*s == '_') || (*s == '$')) + { + *c++ = *s++; + } + + *c = '\0'; + return (id); +} + +/*@observer@*/ /*@dependent@*/ uentry coerceId (cstring cn) +{ + if (!(usymtab_exists (cn))) + { + fileloc loc = fileloc_createExternal (); + + /* + ** We need to put this in a global scope, otherwise the sRef will be deallocated. + */ + + uentry ce = uentry_makeUnrecognized (cn, loc); + + if (!context_inIterEnd ()) + { + voptgenerror + (FLG_SYSTEMUNRECOG, + message ("Unrecognized (possibly system) identifier: %q", + uentry_getName (ce)), + g_currentloc); + } + + return ce; + } + + return (usymtab_lookup (cn)); +} + +/* +** like, coerceId, but doesn't supercede for iters +*/ + +/*@observer@*/ uentry coerceIterId (cstring cn) +{ + if (!(usymtab_exists (cn))) + { + return uentry_undefined; + } + + return (usymtab_lookup (cn)); +} + +/*@observer@*/ cstring LastIdentifier () +{ + return (lastidprocessed); +} + +static int processIdentifier (cstring id) +{ + uentry le; + + DPRINTF (("Process identifier: %s", id)); + + context_clearJustPopped (); + lastidprocessed = id; + + if (context_inFunctionDecl ()) + { + int tok = commentMarkerToken (id); + + if (tok != BADTOK) + { + return tok; + } + else + { + tok = tokenMacroCode (id); + + if (tok != BADTOK) + { + return tok; + } + } + } + + /* Consider handling: Defined by C99 as static const char __func__[] */ + + if (context_getFlag (FLG_GNUEXTENSIONS)) + { + int tok = BADTOK; + + if (cstring_equalLit (id, "__stdcall") + || cstring_equalLit (id, "__cdecl") + || cstring_equalLit (id, "__extension__")) + { + return BADTOK; + } + else if (cstring_equalLit (id, "__volatile__")) + { + tok = QVOLATILE; + } + else if (cstring_equalLit (id, "__signed")) + { + tok = QSIGNED; + } + else if (cstring_equalLit (id, "__unsigned")) + { + tok = QUNSIGNED; + } + else if (cstring_equalLit (id, "__const__")) + { + tok = QCONST; + } + else if (cstring_equalLit (id, "__alignof__")) + { + tok = CALIGNOF; /* alignof is parsed like sizeof */ + } + else if (cstring_equalLit (id, "__FUNCTION__") + || cstring_equalLit (id, "__PRETTY_FUNCTION__")) + { + /* These tokens hold the name of the current function as strings */ + yylval.expr = exprNode_stringLiteral (id, fileloc_copy (g_currentloc)); + tokLength = 0; + lastWasString = TRUE; + tok = CCONSTANT; + return tok; + } + else if (cstring_equalLit (id, "__attribute__") + || cstring_equalLit (id, "__asm__") + || cstring_equalLit (id, "_asm") + || cstring_equalLit (id, "__asm") + || cstring_equalLit (id, "__declspec")) + { + int depth = 0; + bool useparens = FALSE; + bool usebraces = FALSE; + bool inquote = FALSE; + bool inescape = FALSE; + int ic; + + while ((ic = input ()) != EOF) + { + + if (inescape) + { + inescape = FALSE; + } + else if (ic == '\\') + { + inescape = TRUE; + } + else if (ic == '\"') + { + inquote = !inquote; + } + else if (!inquote) + { + if (ic == '(') + { + if (!useparens) + { + if (!usebraces) + { + useparens = TRUE; + } + } + + if (useparens) + { + depth++; + } + } + else if (ic == '{') + { + if (!usebraces) + { + if (!useparens) + { + usebraces = TRUE; + } + } + + if (usebraces) + { + depth++; + } + } + else if (ic == ')' && useparens) + { + depth--; + if (depth == 0) break; + } + else if (ic == '}' && usebraces) + { + depth--; + if (depth == 0) break; + } + else if (ic == '}' + && !usebraces && !useparens + && cstring_equalLit (id, "__asm")) + { + /* + ** We need this because some MS VC++ include files + ** have __asm mov ... } + ** Its a kludge, but otherwise would need to parse + ** the asm code! + */ + return TRBRACE; + } + } + + if (ic == '\n') + { + context_incLineno (); + + if (cstring_equalLit (id, "__asm") + && !useparens && !usebraces) + { + break; + } + } + } + + llassert ((useparens && ic == ')') + || (usebraces && ic == '}') + || (!useparens && !usebraces)); + + return BADTOK; + } + else if (cstring_equalLit (id, "inline") + || cstring_equalLit (id, "__inline") + || cstring_equalLit (id, "_inline") + || cstring_equalLit (id, "__inline__")) + { + tok = QINLINE; + } + + if (tok != BADTOK) + { + RETURN_TOK (tok); + } + } + + le = usymtab_lookupSafe (id); + + /*@-dependenttrans@*/ + + if (uentry_isIter (le)) + { + yylval.entry = le; + return (ITER_NAME); + } + else if (uentry_isEndIter (le)) + { + yylval.entry = le; + return (ITER_ENDNAME); + } + else if (uentry_isUndefined (le)) + { + yylval.cname = id; + + /* avoid parse errors for certain system built ins */ + + if (g_expectingTypeName && (cstring_firstChar (id) == '_') + && (cstring_secondChar (id) == '_')) + { + return (TYPE_NAME_OR_ID); + } + + return (NEW_IDENTIFIER); + } + else if (!uentry_isDeclared (le) && !uentry_isCodeDefined (le)) + { + if (uentry_isDatatype (le)) + { + yylval.cname = id; + return (NEW_IDENTIFIER); + } + else + { + yylval.entry = le; + return (IDENTIFIER); + } + } + else if (uentry_isDatatype (le)) + { + if (!g_expectingTypeName) + { + yylval.cname = id; + + return (NEW_IDENTIFIER); + } + else + { + yylval.ctyp = uentry_getAbstractType (le); + + uentry_setUsed (le, g_currentloc); + return (TYPE_NAME); + } + } + else + { + yylval.entry = le; + return (IDENTIFIER); + } + + /*@=dependenttrans@*/ +} + +static bool processHashIdentifier (/*@only@*/ cstring id) +{ + if (context_inMacro () || context_inIterDef () || + context_inIterEnd ()) + { + uentry le; + + context_clearJustPopped (); + + lastidprocessed = id; + le = usymtab_lookupSafe (id); + + if (uentry_isParam (le) || uentry_isRefParam (le)) + { + return TRUE; + } + else + { + return FALSE; + } + } + else + { + cstring_free (id); + return FALSE; + } +} + + +static /*@only@*/ exprNode processString () +{ + exprNode res; + fileloc loc; + char *nl = strchr (yytext, '\n'); + cstring ns = cstring_fromCharsNew (yytext); + + if (nl == NULL) + { + loc = fileloc_copy (g_currentloc); + addColumn (cstring_length (ns)); + } + else + { + char *lastnl = nl; + + loc = fileloc_copy (g_currentloc); + + context_incLineno (); + + while ((nl = strchr ((nl + 1), '\n')) != NULL) + { + context_incLineno (); + lastnl = nl; + } + } + + + res = exprNode_stringLiteral (ns, loc); + return (res); +} + +static +char processChar () +{ + char fchar; + char next; + + llassert (*yytext != '\0'); + fchar = *(yytext + 1); + if (fchar != '\\') return fchar; + + next = *(yytext + 2); + + switch (next) + { + case 'n': return '\n'; + case 't': return '\t'; + case '\"': return '\"'; + case '\'': return '\''; + case '\\': return '\\'; + default: return '\0'; + } +} + +static +double processFloat () +{ + double ret = atof (yytext); + + return (ret); +} + +static +long processHex () +{ + int index = 2; + long val = 0; + + llassert (yytext[0] == '0' + && (yytext[1] == 'X' || yytext[1] == 'x')); + + while (yytext[index] != '\0') { + int tval; + char c = yytext[index]; + + if (c >= '0' && c <= '9') { + tval = (int) c - (int) '0'; + } else if (c >= 'A' && c <= 'F') { + tval = (int) c - (int) 'A' + 10; + } else if (c >= 'a' && c <= 'f') { + tval = (int) c - (int) 'a' + 10; + } else { + voptgenerror + (FLG_SYNTAX, + message ("Invalid character (%c) in hex constant: %s", + c, cstring_fromChars (yytext)), + g_currentloc); + break; + } + + val = (val * 16) + tval; + index++; + } + + DPRINTF (("Hex constant: %s = %ld", yytext, val)); + return val; +} + +static +long processOctal () +{ + int index = 1; + long val = 0; + + llassert (yytext[0] == '0' && yytext[1] != 'X' && yytext[1] != 'x'); + + while (yytext[index] != '\0') { + int tval; + char c = yytext[index]; + + if (c >= '0' && c <= '7') { + tval = (int) c - (int) '0'; + } else { + voptgenerror + (FLG_SYNTAX, + message ("Invalid character (%c) in octal constant: %s", + c, cstring_fromChars (yytext)), + g_currentloc); + break; + } + + val = (val * 8) + tval; + index++; + } + + DPRINTF (("Octal constant: %s = %ld", yytext, val)); + return val; +} + +static +long processDec () +{ + return (atol (yytext)); +} + +static int +processSpec (int tok) +{ + size_t length = strlen (yytext); + + + if (inSpecPart) + { + setTokLengthT (length); + RETURN_TOK (tok); + } + else + { + + context_saveLocation (); + setTokLengthT (length); + return (processIdentifier (makeIdentifier (yytext))); + } +} diff --git a/src/cstring.c b/src/cstring.c new file mode 100644 index 0000000..eb876c8 --- /dev/null +++ b/src/cstring.c @@ -0,0 +1,942 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** cstring.c +*/ + +# include "lclintMacros.nf" +# include "basic.h" +# include "osd.h" +# include "portab.h" + +static /*@only@*/ /*@notnull@*/ +cstring cstring_newEmpty (void) +{ + return (cstring_create (0)); +} + +char cstring_firstChar (cstring s) +{ + llassert (cstring_isDefined (s)); + llassert (cstring_length (s) > 0); + + return (s[0]); +} + +char cstring_getChar (cstring s, int n) +{ + int length = cstring_length (s); + + llassert (cstring_isDefined (s)); + llassert (n >= 1 && n <= length); + + return (s[n - 1]); +} + +cstring cstring_suffix (cstring s, int n) +{ + llassert (cstring_isDefined (s)); + llassert (n <= cstring_length (s)); + + return (s + n); +} + +cstring cstring_prefix (cstring s, int n) +{ + cstring t; + char c; + llassert (cstring_isDefined (s)); + llassert (n <= cstring_length (s)); + + c = *(s + n); + /*@-mods@*/ /* The modifications cancel out. */ + *(s + n) = '\0'; + t = cstring_copy (s); + *(s + n) = c; + /*@=mods@*/ + + return t; +} + +/* effects If s = [0-9]*, returns s as an int. +** else returns -1. +*/ + +int cstring_toPosInt (cstring s) +{ + int val = 0; + + cstring_chars (s, c) + { + if (isdigit ((unsigned char) c)) + { + val = (val * 10) + (int)(c - '0'); + } + else + { + return -1; + } + } end_cstring_chars ; + + return val; +} + +cstring cstring_beforeChar (cstring s, char c) +{ + if (cstring_isDefined (s)) + { + char *cp = strchr (s, c); + + if (cp != NULL) + { + cstring ret; + + /*@-mods@*/ + *cp = '\0'; + ret = cstring_copy (s); + *cp = c; + /*@=mods@*/ /* modification is undone */ + + return ret; + } + } + + return cstring_undefined; +} + +void cstring_setChar (cstring s, int n, char c) +{ + llassert (cstring_isDefined (s)); + llassert (n > 0 && n <= cstring_length (s)); + + s[n - 1] = c; +} + +char cstring_lastChar (cstring s) +{ + int length; + + llassert (cstring_isDefined (s)); + + length = cstring_length (s); + llassert (length > 0); + + return (s[length - 1]); +} + +/*@only@*/ cstring cstring_copy (cstring s) +{ + if (cstring_isDefined (s)) + { + return (mstring_copy (s)); + } + else + { + return cstring_undefined; + } +} + +/*@only@*/ cstring cstring_copyLength (char *s, int len) +{ + char *res = mstring_create (len + 1); + + strncpy (res, s, size_fromInt (len)); + res[len] = '\0'; + return res; +} + +bool cstring_containsChar (cstring c, char ch) +{ + if (cstring_isDefined (c)) + { + return (strchr (c, ch) != NULL); + } + else + { + return FALSE; + } +} + +/* +** Replaces all occurances of old in s with new. +*/ + +# ifdef WIN32 +void cstring_replaceAll (cstring s, char old, char snew) +{ + + llassert (old != snew); + + if (cstring_isDefined (s)) + { + char *sp = strchr (s, old); + + while (sp != NULL) + { + *sp = snew; + sp = strchr (sp, old); + } + + } +} +# endif + +void cstring_replaceLit (/*@unique@*/ cstring s, char *old, char *snew) +{ + + llassert (strlen (old) >= strlen (snew)); + + if (cstring_isDefined (s)) + { + char *sp = strstr (s, old); + + while (sp != NULL) + { + int lendiff = size_toInt (strlen (old) - strlen (snew)); + char *tsnew = snew; + + while (*tsnew != '\0') + { + *sp++ = *tsnew++; + } + + if (lendiff > 0) + { + while (*(sp + lendiff) != '\0') + { + *sp = *(sp + lendiff); + sp++; + } + + *sp = '\0'; + } + + sp = strstr (s, old); + } + } +} + +/* +** removes all chars in clist from s +*/ + +void cstring_stripChars (cstring s, const char *clist) +{ + if (cstring_isDefined (s)) + { + int i; + int size = cstring_length (s); + + for (i = 0; i < size; i++) + { + char c = s[i]; + + if (strchr (clist, c) != NULL) + { + /* strip this char */ + int j; + + size--; + + for (j = i; j < size; j++) + { + s[j] = s[j+1]; + } + + s[size] = '\0'; + i--; + } + } + } +} + +bool cstring_contains (/*@unique@*/ cstring c, cstring sub) +{ + if (cstring_isDefined (c)) + { + llassert (cstring_isDefined (sub)); + + return (strstr (c, sub) != NULL); + } + else + { + return FALSE; + } +} + +static char lookLike (char c) /*@*/ +{ + if (c == 'I' || c == 'l') + { + return '1'; + } + else if (c == 'O' || c == 'o') + { + return '0'; + } + else if (c == 'Z') + { + return '2'; + } + else if (c == 'S') + { + return '5'; + } + else + { + return c; + } +} + +cmpcode cstring_genericEqual (cstring s, cstring t, + int nchars, + bool caseinsensitive, + bool lookalike) +{ + if (s == t) return CGE_SAME; + else if (cstring_isUndefined (s)) + { + return cstring_isEmpty (t) ? CGE_SAME : CGE_DISTINCT; + } + else if (cstring_isUndefined (t)) + { + return cstring_isEmpty (s) ? CGE_SAME : CGE_DISTINCT; + } + else + { + int i = 0; + bool diffcase = FALSE; + bool difflookalike = FALSE; + + while (*s != '\0') + { + if (nchars > 0 && i >= nchars) + { + break; + } + + if (*t == *s) + { + ; /* no difference */ + } + else if (caseinsensitive + && (toupper ((int) *t) == toupper ((int) *s))) + { + diffcase = TRUE; + } + else if (lookalike && (lookLike (*t) == lookLike (*s))) + { + difflookalike = TRUE; + } + else + { + return CGE_DISTINCT; + } + i++; + s++; + t++; + } + + if (*s == '\0' && *t != '\0') + { + return CGE_DISTINCT; + } + + if (diffcase) + { + return CGE_CASE; + } + else if (difflookalike) + { + return CGE_LOOKALIKE; + } + else + { + return CGE_SAME; + } + } +} + + + +bool cstring_equalFree (/*@only@*/ cstring c1, /*@only@*/ cstring c2) +{ + bool res = cstring_equal (c1, c2); + cstring_free (c1); + cstring_free (c2); + return res; +} + +bool cstring_equal (cstring c1, cstring c2) +{ + if (c1 == c2) return TRUE; + else if (cstring_isUndefined (c1)) return cstring_isEmpty (c2); + else if (cstring_isUndefined (c2)) return cstring_isEmpty (c1); + else return (strcmp (c1, c2) == 0); +} + +bool cstring_equalLen (cstring c1, cstring c2, int len) +{ + if (c1 == c2) return TRUE; + else if (cstring_isUndefined (c1)) return cstring_isEmpty (c2); + else if (cstring_isUndefined (c2)) return cstring_isEmpty (c1); + else return (strncmp (c1, c2, size_fromInt (len)) == 0); +} + +bool cstring_equalCaseInsensitive (cstring c1, cstring c2) +{ + if (c1 == c2) return TRUE; + else if (cstring_isUndefined (c1)) return cstring_isEmpty (c2); + else if (cstring_isUndefined (c2)) return cstring_isEmpty (c1); + else return (cstring_genericEqual (c1, c2, 0, TRUE, FALSE) != CGE_DISTINCT); +} + +bool cstring_equalLenCaseInsensitive (cstring c1, cstring c2, int len) +{ + llassert (len >= 0); + + if (c1 == c2) return TRUE; + else if (cstring_isUndefined (c1)) return cstring_isEmpty (c2); + else if (cstring_isUndefined (c2)) return cstring_isEmpty (c1); + else return (cstring_genericEqual (c1, c2, len, TRUE, FALSE) != CGE_DISTINCT); +} + +bool cstring_equalPrefix (cstring c1, char *c2) +{ + llassert (c2 != NULL); + + if (cstring_isUndefined (c1)) + { + return (strlen (c2) == 0); + } + + return (strncmp (c1, c2, strlen (c2)) == 0); +} + +bool cstring_equalCanonicalPrefix (cstring c1, char *c2) +{ + llassert (c2 != NULL); + + if (cstring_isUndefined (c1)) + { + return (strlen (c2) == 0); + } + +# ifdef WIN32 + /* + ** If one has a drive specification, but the other doesn't, skip it. + */ + + if (strchr (c1, ':') == NULL + && strchr (c2, ':') != NULL) + { + c2 = strchr (c2 + 1, ':'); + } + else + { + if (strchr (c2, ':') == NULL + && strchr (c1, ':') != NULL) + { + c1 = strchr (c1 + 1, ':'); + } + } + + { + int len = size_toInt (strlen (c2)); + int i = 0; + int slen = 0; + + if (cstring_length (c1) < len) + { + return FALSE; + } + + for (i = 0; i < len; i++) + { + if (c1[slen] == c2[i] + || (osd_isConnectChar (c1[slen]) && osd_isConnectChar (c2[i]))) + { + ; + } + else + { + /* + ** We allow \\ to match \ because MS-DOS screws up the directory + ** names. + */ + + if (c1[slen] == '\\' + && (slen > 0 + && c1[slen - 1] == '\\' + && c2[i - 1] == '\\')) + { + slen++; + if (c1[slen] != c2[i]) + { + return FALSE; + } + } + else + { + return FALSE; + } + } + + slen++; + if (slen >= cstring_length (c1)) + { + return FALSE; + } + } + } + + return TRUE; +# else + return (strncmp (c1, c2, strlen (c2)) == 0); +# endif +} + +int cstring_xcompare (cstring *c1, cstring *c2) +{ + return (cstring_compare (*c1, *c2)); +} + +int cstring_compare (cstring c1, cstring c2) +{ + int res; + + if (c1 == c2) + { + res = 0; + } + else if (cstring_isUndefined (c1)) + { + if (cstring_isEmpty (c2)) + { + res = 0; + } + else + { + res = 1; + } + } + else if (cstring_isUndefined (c2)) + { + if (cstring_isEmpty (c1)) + { + res = 0; + } + else + { + res = -1; + } + } + else + { + res = strcmp (c1, c2); + } + + return (res); +} + +void cstring_markOwned (/*@owned@*/ cstring s) +{ + sfreeEventually (s); +} + +void cstring_free (/*@only@*/ cstring s) +{ + if (cstring_isDefined (s)) + { + sfree (s); + } +} + +cstring cstring_fromChars (/*@exposed@*/ const char *cp) +{ + return (cstring) cp; +} + +/*@exposed@*/ char *cstring_toCharsSafe (cstring s) +{ + static /*@only@*/ cstring emptystring = cstring_undefined; + + if (cstring_isDefined (s)) + { + return (char *) s; + } + else + { + if (cstring_isUndefined (emptystring)) + { + emptystring = cstring_newEmpty (); + } + + return emptystring; + } +} + +int cstring_length (cstring s) +{ + if (cstring_isDefined (s)) + { + return size_toInt (strlen (s)); + } + return 0; +} + +cstring +cstring_capitalize (cstring s) +{ + if (!cstring_isEmpty (s)) + { + cstring ret = cstring_copy (s); + + cstring_setChar (ret, 1, (char) toupper ((int) cstring_firstChar (ret))); + return ret; + } + + return cstring_undefined; +} + +cstring +cstring_capitalizeFree (cstring s) +{ + if (!cstring_isEmpty (s)) + { + cstring_setChar (s, 1, (char) toupper ((int) cstring_firstChar (s))); + return s; + } + + return s; +} + +cstring +cstring_clip (cstring s, int len) +{ + if (cstring_isUndefined (s) || cstring_length (s) <= len) + { + ; + } + else + { + llassert (s != NULL); + *(s + len) = '\0'; + } + + return s; +} + +/*@only@*/ cstring +cstring_elide (cstring s, int len) +{ + if (cstring_isUndefined (s) || cstring_length (s) <= len) + { + return cstring_copy (s); + } + else + { + cstring sc = cstring_create (len); + + strncpy (sc, s, size_fromInt (len)); + *(sc + len - 1) = '\0'; + *(sc + len - 2) = '.'; + *(sc + len - 3) = '.'; + *(sc + len - 4) = '.'; + return sc; + } +} + +/*@only@*/ cstring +cstring_fill (cstring s, int n) +{ + cstring t = cstring_create (n + 1); + cstring ot = t; + int len = cstring_length (s); + int i; + + if (len > n) + { + for (i = 0; i < n; i++) + { + *t++ = *s++; + } + *t = '\0'; + } + else + { + for (i = 0; i < len; i++) + { + *t++ = *s++; + } + for (i = 0; i < n - len; i++) + { + *t++ = ' '; + } + *t = '\0'; + } + + return ot; +} + +cstring +cstring_downcase (cstring s) +{ + if (cstring_isDefined (s)) + { + cstring t = cstring_create (strlen (s) + 1); + cstring ot = t; + char c; + + while ((c = *s) != '\0') + { + if (c >= 'A' && c <= 'Z') + { + c = c - 'A' + 'a'; + } + *t++ = c; + s++; + } + *t = '\0'; + + return ot; + } + else + { + return cstring_undefined; + } +} + +/*@notnull@*/ cstring +cstring_appendChar (/*@only@*/ cstring s1, char c) +{ + int l = cstring_length (s1); + char *s; + + s = (char *) dmalloc (sizeof (*s) * (l + 2)); + + if (cstring_isDefined (s1)) + { + strcpy (s, s1); + *(s + l) = c; + *(s + l + 1) = '\0'; + sfree (s1); + } + else + { + *(s) = c; + *(s + 1) = '\0'; + } + + return s; +} + +/*@only@*/ cstring +cstring_concatFree (cstring s, cstring t) +{ + cstring res = cstring_concat (s, t); + cstring_free (s); + cstring_free (t); + return res; +} + +/*@only@*/ cstring +cstring_concatFree1 (cstring s, cstring t) +{ + cstring res = cstring_concat (s, t); + cstring_free (s); + return res; +} + +# ifndef NOLCL +/*@only@*/ cstring +cstring_concatChars (cstring s, char *t) +{ + cstring res = cstring_concat (s, cstring_fromChars (t)); + cstring_free (s); + return res; +} +# endif + +/*@only@*/ cstring +cstring_concatLength (cstring s1, char *s2, int len) +{ + cstring tmp = cstring_copyLength (s2, len); + cstring res = cstring_concat (s1, tmp); + cstring_free (tmp); + cstring_free (s1); + + return res; +} + +/*@only@*/ cstring +cstring_concat (cstring s, cstring t) +{ + char *ret = mstring_create (cstring_length (s) + cstring_length (t)); + + if (cstring_isDefined (s)) + { + strcpy (ret, s); + } + if (cstring_isDefined (t)) + { + strcat (ret, t); + } + + return ret; +} + +/*@notnull@*/ /*@only@*/ cstring +cstring_prependCharO (char c, /*@only@*/ cstring s1) +{ + cstring res = cstring_prependChar (c, s1); + + cstring_free (s1); + return (res); +} + +/*@notnull@*/ /*@only@*/ cstring +cstring_prependChar (char c, /*@temp@*/ cstring s1) +{ + int l = cstring_length (s1); + char *s = (char *) dmalloc (sizeof (*s) * (l + 2)); + + *(s) = c; + + if (cstring_isDefined (s1)) + { + /*@-mayaliasunique@*/ + strcpy (s + 1, s1); + /*@=mayaliasunique@*/ + } + + *(s + l + 1) = '\0'; + return s; +} + +# ifndef NOLCL +bool +cstring_hasNonAlphaNumBar (cstring s) +{ + int c; + + if (cstring_isUndefined (s)) return FALSE; + + while ((c = (int) *s) != (int) '\0') + { + if ((isalnum (c) == 0) && (c != (int) '_') + && (c != (int) '.') && (c != (int) CONNECTCHAR)) + { + return TRUE; + } + + s++; + } + return FALSE; +} +# endif + +/*@only@*/ /*@notnull@*/ cstring +cstring_create (int n) +{ + char *s = dmalloc (sizeof (*s) * (n + 1)); + + *s = '\0'; + return s; +} + +# ifndef NOLCL +lsymbol cstring_toSymbol (cstring s) +{ + lsymbol res = lsymbol_fromChars (cstring_toCharsSafe (s)); + + cstring_free (s); + return res; +} +# endif + +cstring cstring_bsearch (cstring key, char **table, int nentries) +{ + if (cstring_isDefined (key)) + { + int low = 0; + int high = nentries; + int mid = (high + low + 1) / 2; + int last = -1; + cstring res = cstring_undefined; + + while (low <= high && mid < nentries) + { + int cmp; + + llassert (mid != last); + llassert (mid >= 0 && mid < nentries); + + cmp = cstring_compare (key, table[mid]); + + if (cmp == 0) + { + res = table[mid]; + break; + } + else if (cmp < 0) /* key is before table[mid] */ + { + high = mid - 1; + } + else /* key of after table[mid] */ + { + low = mid + 1; + } + + last = mid; + mid = (high + low + 1) / 2; + } + + if (mid != 0 && mid < nentries - 1) + { + llassert (cstring_compare (key, table[mid - 1]) > 0); + llassert (cstring_compare (key, table[mid + 1]) < 0); + } + + return res; + } + + return cstring_undefined; +} + +extern /*@observer@*/ cstring cstring_advanceWhiteSpace (cstring s) +{ + if (cstring_isDefined (s)) { + char *t = s; + + while (*t != '\0' && isspace ((int) *t)) { + t++; + } + + return t; + } + + return cstring_undefined; +} + diff --git a/src/cstringList.c b/src/cstringList.c new file mode 100644 index 0000000..7cced01 --- /dev/null +++ b/src/cstringList.c @@ -0,0 +1,243 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** cstringList.c +** +** based on list_template.c +** +** where T has T_equal (or change this) and T_unparse +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +cstringList +cstringList_new () +{ + return cstringList_undefined; +} + +static /*@notnull@*/ cstringList +cstringList_newEmpty (void) +{ + cstringList s = (cstringList) dmalloc (sizeof (*s)); + + s->nelements = 0; + s->nspace = cstringListBASESIZE; + s->elements = (cstring *) dmalloc (sizeof (*s->elements) * cstringListBASESIZE); + + return (s); +} + +static void +cstringList_grow (/*@notnull@*/ cstringList s) +{ + int i; + cstring *newelements; + + s->nspace += cstringListBASESIZE; + + newelements = (cstring *) dmalloc (sizeof (*newelements) + * (s->nelements + s->nspace)); + + + if (newelements == (cstring *) 0) + { + llfatalerror (cstring_makeLiteral ("cstringList_grow: out of memory!")); + } + + for (i = 0; i < s->nelements; i++) + { + newelements[i] = s->elements[i]; + } + + sfree (s->elements); + s->elements = newelements; +} + +cstringList cstringList_single (/*@keep@*/ cstring el) +{ + cstringList s = cstringList_new (); + s = cstringList_add (s, el); + return s; +} + +cstringList cstringList_add (cstringList s, /*@keep@*/ cstring el) +{ + if (!cstringList_isDefined (s)) + { + s = cstringList_newEmpty (); + } + + if (s->nspace <= 0) + { + cstringList_grow (s); + } + + s->nspace--; + s->elements[s->nelements] = el; + s->nelements++; + + return s; +} + +cstring +cstringList_unparse (cstringList s) +{ + return cstringList_unparseSep (s, cstring_makeLiteralTemp (", ")); +} + +cstring +cstringList_unparseSep (cstringList s, cstring sep) +{ + cstring st = cstring_undefined; + + if (cstringList_isDefined (s)) + { + int i; + + for (i = 0; i < s->nelements; i++) + { + if (i == 0) + { + st = cstring_copy (s->elements[i]); + } + else + st = message ("%q%s%s", st, sep, s->elements[i]); + } + } + + return st; +} + +void +cstringList_printSpaced (cstringList s, int indent, int gap, int linelen) +{ + if (cstringList_isDefined (s)) + { + cstring line = cstring_undefined; + cstring istring = cstring_fill (cstring_undefined, indent); + cstring gstring = cstring_fill (cstring_undefined, gap); + int numcol; + int longest = 0; + int i; + + /* + ** find the longest string + */ + + for (i = 0; i < s->nelements; i++) + { + int len = cstring_length (s->elements[i]); + + if (len > longest) + { + longest = len; + } + } + + numcol = (linelen - indent) / (longest + gap); + + if (numcol <= 1) + { + numcol = 1; + } + + for (i = 0; i < s->nelements; i++) + { + if (i % numcol == 0) + { + if (i != 0) + { + llmsg (line); + } + + line = message ("%s%q", istring, + cstring_fill (s->elements[i], longest)); + } + else + { + line = message ("%q%s%q", line, gstring, + cstring_fill (s->elements[i], longest)); + } + } + + cstring_free (line); + cstring_free (istring); + cstring_free (gstring); + } +} + +/*@only@*/ cstring +cstringList_unparseAbbrev (cstringList s) +{ + cstring st = cstring_undefined; + + if (cstringList_isDefined (s)) + { + int i; + + for (i = 0; i < s->nelements; i++) + { + if (i == 0) + { + st = cstring_copy (s->elements[i]); + } + else if (i > 3 && s->nelements > 5) + { + st = message ("%q, ...", st); + break; + } + else + { + st = message ("%q, %s", st, s->elements[i]); + } + } + } + + return st; +} + +void +cstringList_free (cstringList s) +{ + if (cstringList_isDefined (s)) + { + sfree (s->elements); + sfree (s); + } +} + +void +cstringList_alphabetize (cstringList s) +{ + if (cstringList_isDefined (s)) + { + /*@-modobserver@*/ + qsort (s->elements, (size_t) s->nelements, + sizeof (*s->elements), (int (*)(const void *, const void *)) cstring_xcompare); + /*@=modobserver@*/ + } +} + diff --git a/src/cstringSList.c b/src/cstringSList.c new file mode 100644 index 0000000..8fd4b71 --- /dev/null +++ b/src/cstringSList.c @@ -0,0 +1,252 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** cstringSList.c +** +** based on list_template.c +** +** where T has T_equal (or change this) and T_unparse +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +cstringSList +cstringSList_new () +{ + return cstringSList_undefined; +} + +static /*@notnull@*/ cstringSList +cstringSList_newEmpty (void) +{ + cstringSList s = (cstringSList) dmalloc (sizeof (*s)); + + s->nelements = 0; + s->nspace = cstringSListBASESIZE; + s->elements = (cstring *) dmalloc (sizeof (*s->elements) * cstringSListBASESIZE); + + return (s); +} + +static void +cstringSList_grow (/*@notnull@*/ cstringSList s) +{ + int i; + cstring *newelements; + + s->nspace += cstringSListBASESIZE; + + newelements = (cstring *) dmalloc (sizeof (*newelements) + * (s->nelements + s->nspace)); + + + if (newelements == (cstring *) 0) + { + llfatalerror (cstring_makeLiteral ("cstringSList_grow: out of memory!")); + } + + for (i = 0; i < s->nelements; i++) + { + newelements[i] = s->elements[i]; + } + + sfree (s->elements); + s->elements = newelements; +} + +cstringSList cstringSList_single (/*@exposed@*/ cstring el) +{ + cstringSList s = cstringSList_new (); + s = cstringSList_add (s, el); + return s; +} + +cstringSList cstringSList_add (cstringSList s, /*@exposed@*/ cstring el) +{ + if (!cstringSList_isDefined (s)) + { + s = cstringSList_newEmpty (); + } + + if (s->nspace <= 0) + { + cstringSList_grow (s); + } + + s->nspace--; + s->elements[s->nelements] = el; + s->nelements++; + + return s; +} + +cstring +cstringSList_unparse (cstringSList s) +{ + return cstringSList_unparseSep (s, cstring_makeLiteralTemp (", ")); +} + +cstring +cstringSList_unparseSep (cstringSList s, cstring sep) +{ + cstring st = cstring_undefined; + + if (cstringSList_isDefined (s)) + { + int i; + + for (i = 0; i < s->nelements; i++) + { + if (i == 0) + { + st = cstring_copy (s->elements[i]); + } + else + st = message ("%q%s%s", st, sep, s->elements[i]); + } + } + + return st; +} + +void +cstringSList_printSpaced (cstringSList s, int indent, int gap, int linelen) +{ + if (cstringSList_isDefined (s)) + { + cstring line = cstring_undefined; + cstring istring = cstring_fill (cstring_undefined, indent); + cstring gstring = cstring_fill (cstring_undefined, gap); + int numcol; + int longest = 0; + int i; + + /* + ** find the longest string + */ + + for (i = 0; i < s->nelements; i++) + { + int len = cstring_length (s->elements[i]); + + if (len > longest) + { + longest = len; + } + } + + numcol = (linelen - indent) / (longest + gap); + + if (numcol <= 1) + { + numcol = 1; + } + + for (i = 0; i < s->nelements; i++) + { + if (i % numcol == 0) + { + if (i != 0) + { + llmsg (line); + } + + line = message ("%s%q", istring, + cstring_fill (s->elements[i], longest)); + } + else + { + line = message ("%q%s%q", line, gstring, + cstring_fill (s->elements[i], longest)); + } + } + + cstring_free (line); + cstring_free (istring); + cstring_free (gstring); + } +} + +/*@only@*/ cstring +cstringSList_unparseAbbrev (cstringSList s) +{ + cstring st = cstring_undefined; + + if (cstringSList_isDefined (s)) + { + int i; + + for (i = 0; i < s->nelements; i++) + { + if (i == 0) + { + st = cstring_copy (s->elements[i]); + } + else if (i > 3 && s->nelements > 5) + { + st = message ("%q, ...", st); + break; + } + else + { + st = message ("%q, %s", st, s->elements[i]); + } + } + } + + return st; +} + +void +cstringSList_free (cstringSList s) +{ + if (cstringSList_isDefined (s)) + { + /* + ** A modification of observer message is reported here, since + ** *s->elements is an observer. But sfree doesn't REALLY modify + ** the value of this object. + */ + + /*@-modobserver@*/ + sfree (s->elements); + /*@=modobserver@*/ + + sfree (s); + } +} + +void +cstringSList_alphabetize (cstringSList s) +{ + if (cstringSList_isDefined (s)) + { + /*@-modobserver@*/ + qsort (s->elements, (size_t) s->nelements, + sizeof (*s->elements), (int (*)(const void *, const void *)) cstring_xcompare); + /*@=modobserver@*/ + } +} + diff --git a/src/ctbase.i b/src/ctbase.i new file mode 100644 index 0000000..ed316bc --- /dev/null +++ b/src/ctbase.i @@ -0,0 +1,2454 @@ +/* ;-*-C-*-; +** Copyright (c) Massachusetts Institute of Technology 1994-1998. +** All Rights Reserved. +** Unpublished rights reserved under the copyright laws of +** the United States. +** +** THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED +** OR IMPLIED. ANY USE IS AT YOUR OWN RISK. +** +** This code is distributed freely and may be used freely under the +** following conditions: +** +** 1. This notice may not be removed or altered. +** +** 2. Works derived from this code are not distributed for +** commercial gain without explicit permission from MIT +** (for permission contact lclint-request@sds.lcs.mit.edu). +*/ +/* +** ctbase.i +** +** NOTE: This is not a stand-alone source file, but is included in ctype.c. +** (This is necessary becuase there is no other way in C to have a +** hidden scope, besides at the file level.) +*/ + +/*@access cprim*/ + +typedef /*@null@*/ struct __ctbase *ctbase; + +typedef struct _ctentry { + ctkind kind; + ctbase ctbase; + ctype base; /* type I point to (or element of array) */ + ctype ptr; /* type of pointer to me */ + ctype array; /* type of array of me */ + cstring unparse; /* unparse me, if memoized */ +} *ctentry ; + +typedef /*@only@*/ ctentry o_ctentry; + +typedef struct _cttable { + int size; + int nspace; + /*@relnull@*/ /*@only@*/ o_ctentry *entries; + /* memoize matches...maybe in context? */ +} cttable ; + +extern bool ctentry_isBogus (/*@sef@*/ ctentry p_c) /*@*/; +# define ctentry_isBogus(c) \ + ((c)->kind == CTK_INVALID || (c)->kind == CTK_DNE) + +static cttable cttab = { 0, 0, NULL }; + +static /*@notnull@*/ /*@only@*/ ctbase ctbase_createAbstract (typeId p_u); +static /*@observer@*/ cstring ctentry_doUnparse (ctentry p_c) /*@modifies p_c@*/; +static /*@only@*/ ctentry + ctentry_make (ctkind p_ctk, /*@keep@*/ ctbase p_c, ctype p_base, + ctype p_ptr, ctype p_array, /*@keep@*/ cstring p_unparse); +static /*@only@*/ ctentry ctentry_makeNew (ctkind p_ctk, /*@only@*/ ctbase p_c); +static /*@only@*/ cstring ctentry_unparse (ctentry p_c) /*@*/ ; + +static void cttable_grow (void); +static ctype cttable_addDerived (ctkind p_ctk, /*@keep@*/ ctbase p_cnew, ctype p_base); +static ctype cttable_addFull (/*@keep@*/ ctentry p_cnew); +static bool ctentry_isInteresting (ctentry p_c) /*@*/; +static /*@notnull@*/ /*@only@*/ ctbase ctbase_makeFixedArray (ctype p_b, long p_size) /*@*/ ; + +/* +** These are file-static macros (used in ctype.c). No way to +** declare them as static in C. +*/ + +/*@-allmacros@*/ /*@-macrospec@*/ /*@-namechecks@*/ +# define ctentry_getBase(c) ((c)->base) +# define ctentry_getKind(c) ((c)->kind) +# define ctentry_getArray(c) ((c)->array) +# define ctentry_getPtr(c) ((c)->ptr) +# define ctentry_isArray(c) ((c)->kind == CTK_ARRAY) +# define ctentry_isComplex(c) ((c)->kind == CTK_COMPLEX) +# define ctentry_isPlain(c) ((c)->kind == CTK_PLAIN) +# define ctentry_isPointer(c) ((c)->kind == CTK_PTR) +# define ctentry_setArray(c,b) ((c)->array = (b)) +# define ctentry_setPtr(c,b) ((c)->ptr = (b)) + +# define ctbase_fixUser(c) (c = ctbase_realType(c)) +/*@=allmacros@*/ /*@=macrospec@*/ /*@=namechecks@*/ + +static ctype cttable_addComplex (/*@notnull@*/ /*@only@*/ ctbase p_cnew); +static /*@observer@*/ ctbase ctype_getCtbase (ctype p_c) /*@*/ ; +static ctype ctype_makeConjAux (ctype p_c1, ctype p_c2, bool p_isExplicit) /*@*/ ; +static /*@notnull@*/ /*@observer@*/ ctbase ctype_getCtbaseSafe (ctype p_c) /*@*/ ; +static /*@observer@*/ ctentry ctype_getCtentry (ctype p_c) /*@*/ ; +static /*@observer@*/ /*@notnull@*/ ctbase + ctbase_realType (/*@notnull@*/ ctbase p_c) /*@*/ ; +static bool ctbase_isPointer (/*@notnull@*/ /*@dependent@*/ ctbase p_c) /*@*/ ; +static bool ctbase_isEitherArray (/*@notnull@*/ /*@dependent@*/ ctbase p_c) /*@*/ ; +static /*@observer@*/ enumNameList ctbase_elist (ctbase p_c) /*@*/ ; +static /*@only@*/ cstring ctbase_unparse (ctbase p_c) /*@*/ ; +static /*@only@*/ cstring ctbase_unparseDeep (ctbase p_c) /*@*/ ; +static /*@only@*/ /*@notnull@*/ ctbase ctbase_copy (/*@notnull@*/ ctbase p_c) /*@*/ ; +static void ctbase_free (/*@only@*/ ctbase p_c); +static /*@notnull@*/ /*@only@*/ ctbase ctbase_createPrim (cprim p_p) /*@*/ ; +static /*@notnull@*/ /*@only@*/ ctbase ctbase_createBool (void) /*@*/ ; +static /*@notnull@*/ /*@observer@*/ ctbase ctbase_getBool (void) /*@*/ ; +static /*@notnull@*/ /*@only@*/ ctbase ctbase_createUser (typeId p_u) /*@*/ ; + +static /*@notnull@*/ /*@only@*/ ctbase + ctbase_createStruct (/*@only@*/ cstring p_n, /*@only@*/ uentryList p_f); + +static /*@notnull@*/ /*@only@*/ ctbase + ctbase_createUnion (/*@keep@*/ cstring p_n, /*@only@*/ uentryList p_f); +static /*@notnull@*/ /*@only@*/ ctbase ctbase_createEnum (/*@keep@*/ cstring p_etag, /*@keep@*/ enumNameList p_emembers); +static /*@notnull@*/ /*@only@*/ ctbase ctbase_createUnknown (void); +static bool ctbase_match (ctbase p_c1, ctbase p_c2) /*@modifies nothing@*/; +static bool ctbase_matchDef (ctbase p_c1, ctbase p_c2) /*@modifies nothing@*/; +static bool ctbase_genMatch (ctbase p_c1, ctbase p_c2, bool p_force, bool p_arg, bool p_def); +static bool ctbase_isAbstract (/*@notnull@*/ ctbase p_c) /*@*/ ; +static /*@notnull@*/ /*@only@*/ ctbase ctbase_makePointer (ctype p_b) /*@*/ ; +static /*@notnull@*/ /*@only@*/ ctbase ctbase_makeArray (ctype p_b) /*@*/ ; +static /*@notnull@*/ ctype + ctbase_makeFunction (ctype p_b, /*@only@*/ uentryList p_p) /*@*/ ; +static /*@notnull@*/ /*@only@*/ ctbase + ctbase_makeRealFunction (ctype p_b, /*@dependent@*/ uentryList p_p) /*@*/ ; +static /*@notnull@*/ /*@observer@*/ ctbase + ctbase_realFunction (/*@notnull@*/ /*@dependent@*/ ctbase p_c) /*@*/ ; +static ctype ctbase_baseArrayPtr (/*@notnull@*/ ctbase p_c) /*@*/ ; +static ctype ctbase_baseFunction (/*@notnull@*/ ctbase p_c) /*@*/ ; +static /*@observer@*/ uentryList ctbase_argsFunction (/*@notnull@*/ ctbase p_c) /*@*/ ; +static /*@observer@*/ uentryList ctbase_getuentryList (/*@notnull@*/ ctbase p_c) /*@*/ ; +static ctype ctbase_newBase (ctype p_c, ctype p_p) /*@*/ ; +static ctype ctbase_newBaseExpFcn (ctype p_c, ctype p_p) /*@*/ ; +static bool ctbase_isFixedArray (/*@notnull@*/ ctbase p_c) /*@*/ ; + +/*@-macroundef@*/ +extern int cttable_lastIndex(); +# define cttable_lastIndex() (cttab.size - 1) +/*@=macroundef@*/ + +typedef struct _cfcn +{ + ctype rval; + /*@dependent@*/ uentryList params; /* params are owned if liveparams is TRUE */ + bool liveparams; +} *cfcn; + +typedef struct _tsu +{ + cstring name; + uentryList fields; +} *tsu; + +typedef struct _tconj +{ + ctype a; + ctype b; + bool isExplicit; +} *tconj; + +typedef struct _tenum +{ + cstring tag; + enumNameList members; +} *tenum; + +typedef struct _tfixed +{ + ctype base; + long size; +} *tfixed; + +typedef union _uconts +{ + cprim prim; /* primitive */ + typeId tid; /* abstract, user */ + ctype base; /* ptr, array */ + cfcn fcn; /* function */ + tsu su; /* struct union */ + tenum cenum; /* enum */ + tconj conj; /* conj */ + tfixed farray; /* fixed array */ +} uconts; + +struct __ctbase +{ + ctuid type; + uconts contents; +} ; + +static /*@falsenull@*/ bool ctbase_isUA (ctbase p_c) /*@*/ ; +static bool ctbase_isBaseUA(ctbase p_c) /*@*/ ; +static typeId ctbase_typeBaseUid(ctbase p_c) /*@*/ ; +static bool ctbase_isKind (/*@notnull@*/ ctbase p_c, ctuid p_kind) /*@*/ ; +static bool ctbase_isKind2 (/*@notnull@*/ ctbase p_c, ctuid p_kind1, ctuid p_kind2) /*@*/ ; +static /*@only@*/ /*@notnull@*/ ctbase + ctbase_getBaseType (/*@notnull@*/ ctbase p_c) /*@*/ ; + +static /*@falsenull@*/ bool ctbase_isFunction(ctbase p_c) /*@*/ ; + +/*@constant null ctbase ctbase_undefined; @*/ +# define ctbase_undefined ((ctbase)0) + +static /*@owned@*/ ctbase ctbase_bool = ctbase_undefined; +static /*@owned@*/ ctbase ctbase_unknown = ctbase_undefined; + +static /*@falsenull@*/ bool ctbase_isDefined (ctbase c) /*@*/ +{ + return ((c) != ctbase_undefined); +} + +static /*@truenull@*/ bool ctbase_isUndefined (ctbase c) +{ + return ((c) == ctbase_undefined); +} + +static ctkind ctype_getCtKind (ctype c) +{ + ctentry ce = ctype_getCtentry (c); + + return ctentry_getKind (ce); +} + +static bool ctbase_isUser (ctbase c) +{ + if (ctbase_isDefined (c)) + { + return (ctbase_isKind (c, CT_USER)); + } + else + { + return FALSE; + } +} + +static bool ctbase_isEnum (ctbase c) +{ + if (ctbase_isDefined (c)) + { + return (ctbase_isKind (c, CT_ENUM)); + } + else + { + return FALSE; + } +} + +static bool ctbase_isExpFcn (ctbase c) +{ + if (ctbase_isDefined (c)) + { + return (c->type == CT_EXPFCN); + } + else + { + return FALSE; + } +} + +static /*@falsenull@*/ bool ctbase_isConj (ctbase c) +{ + if (ctbase_isDefined (c)) + { + return (c->type == CT_CONJ); + } + else + { + return FALSE; + } +} + +static bool ctuid_isAP (ctuid c) /*@*/ +{ + return (c == CT_ARRAY || c == CT_PTR); +} + +static typeId ctbase_typeId (ctbase p_c); +static /*@only@*/ cstring ctbase_dump (ctbase p_c); +static /*@only@*/ ctbase ctbase_undump (char **p_c); +static int ctbase_compare (ctbase p_c1, ctbase p_c2, bool p_strict); +static bool ctbase_matchArg (ctbase p_c1, ctbase p_c2); +static /*@notnull@*/ /*@only@*/ ctbase + ctbase_makeConj (ctype p_c1, ctype p_c2, bool p_isExplicit) /*@*/ ; +static ctype ctbase_getConjA (/*@notnull@*/ ctbase p_c) /*@*/ ; +static ctype ctbase_getConjB (/*@notnull@*/ ctbase p_c) /*@*/ ; +static bool ctbase_isExplicitConj (/*@notnull@*/ ctbase p_c) /*@*/ ; +static bool ctbase_forceMatch (ctbase p_c1, ctbase p_c2); +static /*@notnull@*/ /*@only@*/ ctbase ctbase_expectFunction (ctype p_c); +static bool ctbase_isVoidPointer(/*@notnull@*/ /*@dependent@*/ ctbase p_c) /*@*/ ; +static bool ctbase_isUnion (/*@notnull@*/ /*@dependent@*/ ctbase p_c) /*@*/ ; +static bool ctbase_isStruct (/*@notnull@*/ /*@dependent@*/ ctbase p_c) /*@*/ ; +static /*@observer@*/ cstring ctbase_enumTag (/*@notnull@*/ ctbase p_ct) /*@*/ ; +static /*@only@*/ cstring ctbase_unparseNotypes (ctbase p_c) /*@*/ ; + +static /*@out@*/ /*@notnull@*/ /*@only@*/ ctbase ctbase_new (void) /*@*/ ; +static int nctbases = 0; + +static /*@notnull@*/ /*@only@*/ + ctbase ctbase_makeLiveFunction (ctype p_b, /*@owned@*/ uentryList p_p); + +static /*@observer@*/ ctbase ctbase_realType (ctbase c) +{ + if (ctbase_isUA (c)) + { + typeId uid = ctbase_typeId (c); + + if (usymtab_isBoolType (uid)) + { + return ctbase_getBool (); + } + else + { + ctbase ret = ctype_getCtbase + (uentry_getRealType (usymtab_getTypeEntry (ctbase_typeId (c)))); + + llassert (ret != ctbase_undefined); + return ret; + } + } + else + { + return c; + } +} + +static bool +ctbase_isVoidPointer (/*@dependent@*/ /*@notnull@*/ ctbase c) +{ + ctbase r = ctbase_realType (c); + + return (ctbase_isKind (r, CT_PTR) && + ctype_isVoid (r->contents.base)); +} + +static bool +ctbase_isPointer (/*@notnull@*/ /*@dependent@*/ ctbase c) +{ + ctbase r = ctbase_realType (c); + + return (ctbase_isKind (r, CT_PTR)); +} + +static bool +ctbase_isEitherArray (/*@notnull@*/ ctbase c) +{ + ctbase r = ctbase_realType (c); + + return (ctbase_isKind (r, CT_ARRAY) + || ctbase_isKind (r, CT_FIXEDARRAY)); +} + +static bool +ctbase_isFixedArray (/*@notnull@*/ ctbase c) +{ + ctbase r = ctbase_realType (c); + + return (ctbase_isKind (r, CT_FIXEDARRAY)); +} + +static bool +ctbase_isStruct (/*@notnull@*/ ctbase c) +{ + ctbase r = ctbase_realType (c); + + return (ctbase_isKind (r, CT_STRUCT)); +} + +static bool +ctbase_isUnion (/*@notnull@*/ /*@dependent@*/ ctbase c) +{ + ctbase r = ctbase_realType (c); + + return (ctbase_isKind (r, CT_UNION)); +} + +/* +** clean this up -> typeTable should store ctype +*/ + +static typeId +ctbase_typeBaseUid (ctbase c) +{ + ctuid ct; + + if (ctbase_isDefined (c)) + { + ct = c->type; + + if (ctuid_isAP (ct)) + { + return ctbase_typeBaseUid (ctype_getCtbase (c->contents.base)); + } + else if (ct == CT_USER || ct == CT_ABST) + { + return c->contents.tid; + } + else if (ct == CT_FIXEDARRAY) + { + return ctbase_typeBaseUid (ctype_getCtbase (c->contents.farray->base)); + } + else + { + llcontbuglit ("ctbase_typeBaseUid: bad call"); + return typeId_invalid; + } + } + return typeId_invalid; +} + +static bool +ctbase_isBaseUA (ctbase c) +{ + ctuid ct; + + if (ctbase_isDefined (c)) + { + ct = c->type; + + if (ctuid_isAP (ct)) + { + return ctbase_isBaseUA (ctype_getCtbase (c->contents.base)); + } + else if (ct == CT_FIXEDARRAY) + { + return ctbase_isBaseUA (ctype_getCtbase (c->contents.farray->base)); + } + else + return (ct == CT_USER || ct == CT_ABST); + } + return FALSE; +} + +static typeId +ctbase_typeId (ctbase c) +{ + if (ctbase_isUA (c)) + { + return c->contents.tid; + } + else + { + llcontbug (message ("ctbase_typeId: bad call: %q", ctbase_unparse (c))); + return typeId_invalid; + } +} + +static /*@only@*/ cstring +ctbase_unparse (ctbase c) +{ + if (ctbase_isUndefined (c)) { + return cstring_makeLiteral ("<>"); + } + + switch (c->type) + { + case CT_UNKNOWN: + return cstring_makeLiteral ("?"); + case CT_BOOL: + return cstring_copy (context_printBoolName ()); + case CT_PRIM: + return (cprim_unparse (c->contents.prim)); + case CT_USER: + return (usymtab_getTypeEntryName (c->contents.tid)); + case CT_ABST: + return (usymtab_getTypeEntryName (c->contents.tid)); + case CT_EXPFCN: + return (message ("", c->contents.base)); + case CT_PTR: + /* no spaces for multiple pointers */ + + if (ctype_isPointer (c->contents.base)) + { + return (cstring_appendChar (cstring_copy (ctype_unparse (c->contents.base)), '*')); + } + else + { + return (message ("%t *", c->contents.base)); + } + case CT_FIXEDARRAY: + return (message ("%t [%d]", c->contents.farray->base, + (int) c->contents.farray->size)); + case CT_ARRAY: + return (message ("%t []", c->contents.base)); + case CT_FCN: + return (message ("[function (%q) returns %t]", + uentryList_unparseParams (c->contents.fcn->params), + c->contents.fcn->rval)); + case CT_STRUCT: + if (cstring_isDefined (c->contents.su->name) && + !cstring_isEmpty (c->contents.su->name) && + !isFakeTag (c->contents.su->name)) + { + return (message ("struct %s", c->contents.su->name)); + } + else + { + return (message ("struct { %q }", uentryList_unparseAbbrev (c->contents.su->fields))); + } + case CT_UNION: + if (cstring_isDefined (c->contents.su->name) && + !cstring_isEmpty (c->contents.su->name) && + !isFakeTag (c->contents.su->name)) + { + return (message ("union %s", c->contents.su->name)); + } + else + { + return (message ("union { %q }", + uentryList_unparseAbbrev (c->contents.su->fields))); + } + case CT_ENUM: + if (isFakeTag (c->contents.cenum->tag)) + { + return (message ("enum { %q }", + enumNameList_unparseBrief (c->contents.cenum->members))); + } + else + { + return (message ("enum %s { %q }", + c->contents.cenum->tag, + enumNameList_unparseBrief (c->contents.cenum->members))); + } + case CT_CONJ: + if (c->contents.conj->isExplicit || context_getFlag (FLG_SHOWALLCONJS)) + { + if (!ctype_isSimple (c->contents.conj->a) || + !ctype_isSimple (c->contents.conj->b)) + { + return (message ("<%t> | <%t>", c->contents.conj->a, c->contents.conj->b)); + } + else + { + return (message ("%t | %t", c->contents.conj->a, c->contents.conj->b)); + } + } + else + { + return (cstring_copy (ctype_unparse (c->contents.conj->a))); + } + BADDEFAULT; + } + BADEXIT; +} + +static /*@only@*/ cstring + ctbase_unparseDeep (ctbase c) +{ + if (ctbase_isUndefined (c)) + { + return cstring_makeLiteral ("<>"); + } + + switch (c->type) + { + case CT_UNKNOWN: + return cstring_makeLiteral ("?"); + case CT_BOOL: + return cstring_copy (context_printBoolName ()); + case CT_PRIM: + return (cprim_unparse (c->contents.prim)); + case CT_ENUM: + if (cstring_isNonEmpty (c->contents.cenum->tag)) + { + return (message ("enum %s { %q }", + c->contents.cenum->tag, + enumNameList_unparse (c->contents.cenum->members))); + } + else + { + return (message ("enum { %q }", + enumNameList_unparse (c->contents.cenum->members))); + } + case CT_USER: + return (usymtab_getTypeEntryName (c->contents.tid)); + case CT_ABST: + return (usymtab_getTypeEntryName (c->contents.tid)); + case CT_EXPFCN: + return (message ("", c->contents.base)); + case CT_PTR: + return (message ("%t *", c->contents.base)); + case CT_FIXEDARRAY: + return (message ("%t [%d]", c->contents.farray->base, + (int) c->contents.farray->size)); + case CT_ARRAY: + return (message ("%t []", c->contents.base)); + case CT_FCN: + return (message ("[function (%q) returns %t]", + uentryList_unparse (c->contents.fcn->params), + c->contents.fcn->rval)); + case CT_STRUCT: + return (message ("struct %s { ... } ", c->contents.su->name)); + case CT_UNION: + return (message ("union %s { ... }", c->contents.su->name)); + case CT_CONJ: + return (message ("%t", c->contents.conj->a)); + BADDEFAULT; + } + BADEXIT; +} + +static /*@only@*/ cstring +ctbase_unparseNotypes (ctbase c) +{ + llassert (ctbase_isDefined (c)); + + switch (c->type) + { + case CT_UNKNOWN: + return cstring_makeLiteral ("?"); + case CT_BOOL: + return cstring_copy (context_printBoolName ()); + case CT_PRIM: + return (cprim_unparse (c->contents.prim)); + case CT_ENUM: + if (typeId_isInvalid (c->contents.tid)) + { + return cstring_makeLiteral ("enum"); + } + else + { + return (message ("T#%d", c->contents.tid)); + } + case CT_USER: + return (message ("uT#%d", c->contents.tid)); + case CT_ABST: + return (message ("aT#%d", c->contents.tid)); + case CT_EXPFCN: + return (message ("", ctbase_unparseNotypes (ctype_getCtbase (c->contents.base)))); + case CT_PTR: + return (message ("%q *", ctbase_unparseNotypes (ctype_getCtbase (c->contents.base)))); + case CT_ARRAY: + return (message ("%q []", ctbase_unparseNotypes (ctype_getCtbase (c->contents.base)))); + case CT_FCN: + return (message ("[function (%d) returns %q]", uentryList_size (c->contents.fcn->params), + ctbase_unparseNotypes (ctype_getCtbase (c->contents.fcn->rval)))); + case CT_STRUCT: + return (message ("struct %s", c->contents.su->name)); + case CT_UNION: + return (message ("union %s", c->contents.su->name)); + case CT_ENUMLIST: + return (message ("[enumlist]")); + case CT_CONJ: + return (message ("%q/%q", + ctbase_unparseNotypes (ctype_getCtbase (c->contents.conj->a)), + ctbase_unparseNotypes (ctype_getCtbase (c->contents.conj->b)))); + BADDEFAULT; + } + BADEXIT; +} + +static /*@only@*/ cstring +ctbase_unparseDeclaration (ctbase c, /*@only@*/ cstring name) /*@*/ +{ + if (ctbase_isUndefined (c)) + { + return name; + } + + switch (c->type) + { + case CT_UNKNOWN: + return (message ("? %q", name)); + case CT_BOOL: + return (message ("%s %q", context_printBoolName (), name)); + case CT_PRIM: + return (message ("%q %q", cprim_unparse (c->contents.prim), name)); + case CT_USER: + case CT_ABST: + return (message ("%q %q", usymtab_getTypeEntryName (c->contents.tid), name)); + case CT_EXPFCN: + llcontbuglit ("ctbase_unparseDeclaration: expfcn"); + return name; + case CT_PTR: + if (ctype_isFunction (c->contents.base)) + { + return ctbase_unparseDeclaration (ctype_getCtbase (c->contents.base), name); + } + else + { + cstring s = cstring_prependChar ('*', name); + cstring ret = ctbase_unparseDeclaration (ctype_getCtbase (c->contents.base), s); + cstring_free (name); + return (ret); + } + case CT_FIXEDARRAY: + return (message ("%q[%d]", + ctbase_unparseDeclaration (ctype_getCtbase (c->contents.farray->base), name), + (int) c->contents.farray->size)); + case CT_ARRAY: + return (message ("%q[]", + ctbase_unparseDeclaration (ctype_getCtbase (c->contents.base), name))); + case CT_FCN: + { + cstring s = message ("%q(%q)", name, + uentryList_unparseParams (c->contents.fcn->params)); + + return (ctbase_unparseDeclaration + (ctype_getCtbase (c->contents.fcn->rval), s)); + } + case CT_STRUCT: + if (cstring_isDefined (c->contents.su->name) && + !cstring_isEmpty (c->contents.su->name) && + !isFakeTag (c->contents.su->name)) + { + return (message ("struct %s %q", c->contents.su->name, name)); + } + else + { + return (message ("struct { %q } %q", + uentryList_unparseAbbrev (c->contents.su->fields), + name)); + } + case CT_UNION: + if (cstring_isDefined (c->contents.su->name) && + !cstring_isEmpty (c->contents.su->name) && + !isFakeTag (c->contents.su->name)) + { + return (message ("union %s %q", c->contents.su->name, name)); + } + else + { + return (message ("union { %q } %q", + uentryList_unparseAbbrev (c->contents.su->fields), + name)); + } + case CT_ENUM: + if (isFakeTag (c->contents.cenum->tag)) + { + return (message ("enum { %q } %q", + enumNameList_unparseBrief (c->contents.cenum->members), + name)); + } + else + { + return (message ("enum %s { %q } %q", + c->contents.cenum->tag, + enumNameList_unparseBrief (c->contents.cenum->members), + name)); + } + case CT_CONJ: + if (c->contents.conj->isExplicit || context_getFlag (FLG_SHOWALLCONJS)) + { + if (!ctype_isSimple (c->contents.conj->a) || + !ctype_isSimple (c->contents.conj->b)) + { + cstring name1 = cstring_copy (name); + + return + (message + ("<%q> | <%q>", + ctbase_unparseDeclaration + (ctype_getCtbase (c->contents.conj->a), name1), + ctbase_unparseDeclaration + (ctype_getCtbase (c->contents.conj->b), name))); + } + else + { + cstring s1 = ctbase_unparseDeclaration (ctype_getCtbase (c->contents.conj->a), + cstring_copy (name)); + return + (message ("%q | %q", s1, + ctbase_unparseDeclaration (ctype_getCtbase (c->contents.conj->b), + name))); + } + } + else + { + cstring_free (name); + return (cstring_copy (ctype_unparse (c->contents.conj->a))); + } + BADDEFAULT; + } + BADEXIT; +} + +static ctbase ctbase_undump (d_char *c) +{ + ctbase res; + char p = **c; + + (*c)++; + + switch (p) + { + case '?': + return (ctbase_undefined); + case 'u': + return (ctbase_createUnknown ()); + case 'b': + return (ctbase_createBool ()); + case 'p': + res = ctbase_createPrim (cprim_fromInt (getInt (c))); + checkChar (c, '|'); + return res; + case 's': + res = ctbase_createUser (typeId_fromInt (getInt (c))); + checkChar (c, '|'); + return res; + case 'a': + res = ctbase_createAbstract (typeId_fromInt (getInt (c))); + checkChar (c, '|'); + return res; + case 't': + res = ctbase_makePointer (ctype_undump (c)); + checkChar (c, '|'); + return res; + case 'y': + res = ctbase_makeArray (ctype_undump (c)); + checkChar (c, '|'); + return res; + case 'F': + { + ctype ct = ctype_undump (c); + int size; + + checkChar (c, '/'); + size = getInt (c); + checkChar (c, '|'); + return (ctbase_makeFixedArray (ct, size)); + } + case 'f': + { + ctype ct; + char *lp = strchr (*c, '('); + + llassertfatal (lp != NULL); + + *lp = '\0'; + ct = ctype_undump (c); + *c = lp + 1; + + return (ctbase_makeLiveFunction (ct, uentryList_undump (c))); + } + case 'S': + { + uentryList fields; + ctbase ctb; + char *sname; + char *lc = strchr (*c, '{'); + + llassert (lc != NULL); + *lc = '\0'; + + sname = mstring_copy (*c); + + *c = lc + 1; + + if (*sname == '!') + { + unsigned int i; + + i = (unsigned) atoi (sname + 1); + + setTagNo (i); + } + + fields = uentryList_undumpFields (c, g_currentloc); + + ctb = ctbase_createStruct (cstring_fromCharsO (sname), fields); + return ctb; + } + case 'U': + { + char *sname; + char *lc = strchr (*c, '{'); + + llassert (lc != NULL); + + *lc = '\0'; + sname = mstring_copy (*c); + llassert (sname != NULL); + + *c = lc + 1; + + if (*sname == '!') + { + unsigned int i; + + i = (unsigned) atoi (sname + 1); + setTagNo (i); + } + + return (ctbase_createUnion (cstring_fromCharsO (sname), + uentryList_undumpFields (c, g_currentloc))); + } + case 'e': + { + ctbase ret; + char *sname; + char *lc = strchr (*c, '{'); + + llassert (lc != NULL); + + *lc = '\0'; + sname = mstring_copy (*c); + *c = lc + 1; + + if (*sname == '!') + { + unsigned int i; + + i = (unsigned) atoi (sname + 1); + setTagNo (i); + } + + ret = ctbase_createEnum (cstring_fromCharsO (sname), + enumNameList_undump (c)); + return ret; + } + case 'C': + { + bool isExplicit; + ctype c1, c2; + + isExplicit = bool_fromInt (getInt (c)); + checkChar (c, '.'); + c1 = ctype_undump (c); + checkChar (c, '/'); + c2 = ctype_undump (c); + checkChar (c, '|'); + + return (ctbase_makeConj (c1, c2, isExplicit)); + } + + default: + (*c)--; + llerror (FLG_SYNTAX, + message ("Bad Library line (type): %s", cstring_fromChars (*c))); + + while (**c != '\0') + { + (*c)++; + } + + return ctbase_createUnknown (); + } +} + +/* first letter of c encodes type: */ +/* u unknown */ +/* b bool */ +/* p prim */ +/* e enum */ +/* l enumList */ +/* s uSer */ +/* a abstract */ +/* t poinTer */ +/* y arraY */ +/* F Fixed array */ +/* f function */ +/* S structure */ +/* U union */ +/* C conj */ + +static /*@only@*/ cstring +ctbase_dump (ctbase c) +{ + if (!ctbase_isDefined (c)) + { + return cstring_makeLiteral ("?"); + } + + switch (c->type) + { + case CT_UNKNOWN: + return cstring_makeLiteral ("u"); + case CT_BOOL: + return cstring_makeLiteral ("b"); + case CT_PRIM: + return (message ("p%d|", c->contents.prim)); + case CT_USER: + return (message ("s%d|", + usymtab_convertId (c->contents.tid))); + case CT_ABST: + return (message ("a%d|", usymtab_convertId (c->contents.tid))); + case CT_PTR: + return (message ("t%q|", ctype_dump (c->contents.base))); + case CT_ARRAY: + return (message ("y%q|", ctype_dump (c->contents.base))); + case CT_FIXEDARRAY: + return (message ("F%q/%d|", + ctype_dump (c->contents.farray->base), + (int) c->contents.farray->size)); + case CT_FCN: + return (message ("f%q (%q)", ctype_dump (c->contents.fcn->rval), + uentryList_dumpParams (c->contents.fcn->params))); + case CT_STRUCT: + return (message ("S%s{%q}", c->contents.su->name, + uentryList_dumpFields (c->contents.su->fields))); + case CT_UNION: + return (message ("U%s{%q}", c->contents.su->name, + uentryList_dumpFields (c->contents.su->fields))); + case CT_ENUM: + { + cstring s; + + if (cstring_isNonEmpty (c->contents.cenum->tag)) + { + s = message ("e%s{%q}", + c->contents.cenum->tag, + enumNameList_dump (c->contents.cenum->members)); + } + else + { + s = message ("e{%q}", + enumNameList_dump (c->contents.cenum->members)); + } + return (s); + } + case CT_CONJ: + return (message ("C%d.%q/%q|", + bool_toInt (c->contents.conj->isExplicit), + ctype_dump (c->contents.conj->a), + ctype_dump (c->contents.conj->b))); + case CT_EXPFCN: + /* should clean them up! */ + return (cstring_makeLiteral ("?")); + case CT_ENUMLIST: + llcontbug (message ("Cannot dump: %q", ctbase_unparse (c))); + return (message ("u")); + BADDEFAULT; + } + + BADEXIT; +} + +static /*@only@*/ ctbase +ctbase_copy (/*@notnull@*/ ctbase c) +{ + switch (c->type) + { + case CT_UNKNOWN: + return (ctbase_createUnknown ()); + case CT_BOOL: + return (ctbase_createBool ()); + case CT_ENUM: + return (ctbase_createEnum (cstring_copy (c->contents.cenum->tag), + enumNameList_copy (c->contents.cenum->members))); + case CT_PRIM: + return (ctbase_createPrim (c->contents.prim)); + case CT_USER: + return (ctbase_createUser (c->contents.tid)); + case CT_ABST: + return (ctbase_createAbstract (c->contents.tid)); + case CT_EXPFCN: + return (ctbase_expectFunction (c->contents.base)); + case CT_PTR: + return (ctbase_makePointer (c->contents.base)); + case CT_ARRAY: + return (ctbase_makeArray (c->contents.base)); + case CT_FCN: + return (ctbase_makeLiveFunction (c->contents.fcn->rval, + uentryList_copy (c->contents.fcn->params))); + case CT_STRUCT: + return (ctbase_createStruct (cstring_copy (c->contents.su->name), + uentryList_copy (c->contents.su->fields))); + case CT_UNION: + return (ctbase_createUnion (cstring_copy (c->contents.su->name), + uentryList_copy (c->contents.su->fields))); + case CT_CONJ: + /*@i@*/ return (c); /* not a real copy for conj's */ + default: + llbug (message ("ctbase_copy: %q", ctbase_unparse (c))); + } + + BADEXIT; +} + +static enumNameList +ctbase_elist (ctbase c) +{ + llassert (ctbase_isDefined (c)); + llassert (c->type == CT_ENUM); + + return (c->contents.cenum->members); +} + +static void +ctbase_free (/*@only@*/ ctbase c) +{ + if (c == ctbase_bool || c == ctbase_unknown) + { + /*@-mustfree@*/ return; /*@=mustfree@*/ + } + + --nctbases; + + + if (ctbase_isDefined (c)) + { + switch (c->type) + { + case CT_UNKNOWN: + sfree (c); + break; + case CT_PRIM: + sfree (c); + break; + case CT_ENUM: + sfree (c); + break; + case CT_ENUMLIST: + /* sfree list? */ + sfree (c); + break; + case CT_USER: + sfree (c); + break; + case CT_ABST: + sfree (c); + break; + case CT_PTR: + case CT_ARRAY: + sfree (c); + break; + case CT_FCN: + + if (c->contents.fcn->liveparams) + { + /* Because of liveparams, we know this can be released. */ + + /*@-dependenttrans@*/ /*@-unqualifiedtrans@*/ + uentryList_free (c->contents.fcn->params); + c->contents.fcn->params = NULL; + /*@=dependenttrans@*/ /*@=unqualifiedtrans@*/ + } + + sfree (c); + break; + case CT_STRUCT: + case CT_UNION: + cstring_free (c->contents.su->name); + uentryList_free (c->contents.su->fields); + sfree (c); + break; + case CT_CONJ: + /* Don't bree conj's, */ + break; + default: + sfree (c); + break; + } + } +} + +/* +** c should be * +*/ + +static /*@only@*/ ctbase +ctbase_expectFunction (ctype c) +{ + ctbase f = ctbase_new (); + + f->type = CT_EXPFCN; + f->contents.base = c; + + return (f); +} + +static bool +ctbase_genMatch (ctbase c1, ctbase c2, bool force, bool arg, bool def) +{ + ctuid c1tid, c2tid; + + /* undefined types never match */ + + if (ctbase_isUndefined (c1) || ctbase_isUndefined (c2)) + return FALSE; + + /* abstract types match user types of same name */ + + c1 = ctbase_realType (c1); + c2 = ctbase_realType (c2); + + c1tid = c1->type; + c2tid = c2->type; + + if (c1tid == CT_CONJ) + { + return (ctbase_genMatch (ctype_getCtbase (c1->contents.conj->a), c2, + force, arg, def) + || ctbase_genMatch (ctype_getCtbase (c1->contents.conj->b), c2, + force, arg, def)); + } + + if (c2tid == CT_CONJ) + { + return (ctbase_genMatch (c1, ctype_getCtbase (c2->contents.conj->a), + force, arg, def) + || ctbase_genMatch (c1, ctype_getCtbase (c2->contents.conj->b), + force, arg, def)); + } + + /* + ** if the types don't match, there are some special cases... + */ + + if (c1tid != c2tid) + { + /* unknowns match anything */ + + if (c1tid == CT_UNKNOWN || c2tid == CT_UNKNOWN) + { + return TRUE; + } + + if (c1tid == CT_FIXEDARRAY + && (c2tid == CT_ARRAY || (!def && c2tid == CT_PTR))) + { + if (ctype_isVoid (c2->contents.base)) + { + return (context_getFlag (FLG_ABSTVOIDP) || + (!(ctype_isRealAbstract (c1->contents.farray->base)) && + !(ctype_isRealAbstract (c2->contents.base)))); + } + + return (ctbase_genMatch (ctype_getCtbase (c1->contents.farray->base), + ctype_getCtbase (c2->contents.base), + force, arg, def)); + } + + + if (c2tid == CT_FIXEDARRAY + && (c1tid == CT_ARRAY || (!def && c1tid == CT_PTR))) + { + if (ctype_isVoid (c1->contents.base)) + { + return (context_getFlag (FLG_ABSTVOIDP) || + (!(ctype_isRealAbstract (c2->contents.farray->base)) && + !(ctype_isRealAbstract (c1->contents.base)))); + } + + return (ctbase_genMatch (ctype_getCtbase (c1->contents.base), + ctype_getCtbase (c2->contents.farray->base), + force, arg, def)); + } + + /* in most cases, bool and int are matched if FLG_BOOLINT */ + + if ((c1tid == CT_BOOL + && (c2tid == CT_PRIM && cprim_isInt (c2->contents.prim))) || + (c2tid == CT_BOOL + && (c1tid == CT_PRIM && cprim_isInt (c1->contents.prim)))) + { + return (context_msgBoolInt ()); + } + + if ((c1tid == CT_ENUM + && (c2tid == CT_PRIM && cprim_isInt (c2->contents.prim))) || + (c2tid == CT_ENUM + && (c1tid == CT_PRIM && cprim_isInt (c1->contents.prim)))) + { + return (context_msgEnumInt ()); + } + + /* + ** arrays and pointers...yuk! + ** + ** Considered equivalent except in definitions. + ** (e.g., function parameters are equivalent) + ** + */ + + if (!def) + { + if (ctuid_isAP (c1tid) && ctuid_isAP (c2tid)) + { + c2tid = c1tid; + } + } + + /* + ** Function pointers can be removed. + ** + ** [function ..] is equivalent to [function ..] * + */ + + if (c1tid == CT_PTR && c2tid == CT_FCN) + { + if (ctype_isFunction (ctype_realType (c1->contents.base))) + { + c1 = ctbase_realType (ctype_getCtbaseSafe (c1->contents.base)); + c1tid = c1->type; + } + } + + if (c2tid == CT_PTR && c1tid == CT_FCN) + { + if (ctype_isFunction (ctype_realType (c2->contents.base))) + { + c2 = ctbase_realType (ctype_getCtbaseSafe (c2->contents.base)); + c2tid = c2->type; + } + } + + /* + ** we allow forward declarations to structures like, + ** + ** typedef struct _t *t; + ** + ** to allow, + ** struct _t * to match t + */ + + if (context_getFlag (FLG_FORWARDDECL)) + { + if (c1tid == CT_ABST || c1tid == CT_USER) + { + if (ctuid_isAP (c2tid)) + { + ctype ts = c2->contents.base; + + if (ctype_isUA (ts)) + { + typeId ttid = ctype_typeId (ts); + typeId ctid = c1->contents.tid ; + + if (usymtab_matchForwardStruct (ctid, ttid)) + { + return TRUE; + } + } + } + } + + if (c2tid == CT_ABST || c2tid == CT_USER) + { + if (ctuid_isAP (c1tid)) + { + ctype ts = c1->contents.base; + + if (ctype_isUA (ts)) + { + typeId ttid = ctype_typeId (ts); + typeId ctid = c2->contents.tid ; + + if (usymtab_matchForwardStruct (ctid, ttid)) + { + return TRUE; + } + } + } + } + } + } + + if (c1tid != c2tid) + return FALSE; + + switch (c1tid) + { + case CT_UNKNOWN: + return (TRUE); + case CT_PRIM: + return (cprim_closeEnough (c1->contents.prim, c2->contents.prim)); + case CT_BOOL: + return (TRUE); + case CT_ABST: + return (typeId_equal (c1->contents.tid, c2->contents.tid)); + case CT_USER: + return (typeId_equal (c1->contents.tid, c2->contents.tid)); + case CT_ENUM: + return (cstring_equal (c1->contents.cenum->tag, c2->contents.cenum->tag)); + case CT_PTR: + if (ctype_isVoid (c1->contents.base) + || (ctype_isVoid (c2->contents.base))) + { + if (ctype_isFunction (ctype_realType (c1->contents.base)) + || ctype_isFunction (ctype_realType (c2->contents.base))) + { + return (!context_getFlag (FLG_CASTFCNPTR)); + } + else + { + return (context_getFlag (FLG_ABSTVOIDP) || + (!(ctype_isRealAbstract (c1->contents.base)) && + !(ctype_isRealAbstract (c2->contents.base)))); + } + } + else + { + /* Only allow one implicit function pointer. */ + + if (!bool_equal (ctype_isRealPointer (c1->contents.base), + ctype_isRealPointer (c2->contents.base)) + && (ctype_isRealFunction (c1->contents.base) + || ctype_isRealFunction (c2->contents.base))) + { + return FALSE; + } + + return (ctype_genMatch (c1->contents.base, + c2->contents.base, force, arg, def)); + } + case CT_FIXEDARRAY: + if (ctype_isVoid (c1->contents.farray->base) + || ctype_isVoid (c2->contents.farray->base)) + return TRUE; + return (ctype_genMatch (c1->contents.farray->base, + c2->contents.farray->base, + force, arg, def)); + case CT_ARRAY: + if (ctype_isVoid (c1->contents.base) || ctype_isVoid (c2->contents.base)) + return TRUE; + return (ctype_genMatch (c1->contents.base, c2->contents.base, force, arg, def)); + case CT_FCN: + return (ctype_genMatch (c1->contents.fcn->rval, + c2->contents.fcn->rval, + force, arg, def) + && uentryList_matchParams (c1->contents.fcn->params, + c2->contents.fcn->params, + force, TRUE)); + case CT_STRUCT: + case CT_UNION: + if (!cstring_isEmpty (c1->contents.su->name)) + { + return (cstring_equal (c1->contents.su->name, c2->contents.su->name)); + } + else + { + if (!cstring_isEmpty (c2->contents.su->name)) + { + return FALSE; + } + + llcontbuglit ("ctbase_genMatch: match fields"); + return (FALSE); + } + default: + llcontbug (message ("ctbase_genMatch: unknown type: %d\n", (int)c1tid)); + return (FALSE); + } +} + +/* +** like ctbase_match, except for conjuncts: +** modifies conjuncts to match only +*/ + +static bool +ctbase_forceMatch (ctbase c1, ctbase c2) +{ + /* + ** modifies c1, c2 + */ + + return (ctbase_genMatch (c1, c2, TRUE, FALSE, FALSE)); +} + +static bool +ctbase_match (ctbase c1, ctbase c2) /*@modifies nothing@*/ +{ + return (ctbase_genMatch (c1, c2, FALSE, FALSE, FALSE)); +} + +static bool +ctbase_matchDef (ctbase c1, ctbase c2) /*@modifies nothing@*/ +{ + return (ctbase_genMatch (c1, c2, FALSE, FALSE, TRUE)); +} + +static bool +ctbase_matchArg (ctbase c1, ctbase c2) +{ + return (ctbase_genMatch (c1, c2, FALSE, TRUE, FALSE)); +} + +static /*@out@*/ /*@only@*/ /*@notnull@*/ ctbase +ctbase_new () +{ + ctbase c = (ctbase) dmalloc (sizeof (*c)); + + nctbases++; + /* + if (nctbases % 100 == 0 && nctbases > lastnc) + { + llmsg (message ("ctbases: %d", nctbases)); + lastnc = nctbases; + } + */ + return (c); +} + +static /*@only@*/ ctbase +ctbase_createPrim (cprim p) +{ + ctbase c = ctbase_new (); + + c->type = CT_PRIM; + c->contents.prim = p; + + return (c); +} + +static /*@observer@*/ ctbase +ctbase_getBool (void) +{ + /*@i@*/ return ctbase_createBool (); +} + +static ctbase +ctbase_createBool () +{ + if (!ctbase_isDefined (ctbase_bool)) + { + ctbase_bool = ctbase_new (); + ctbase_bool->type = CT_BOOL; + ctbase_bool->contents.prim = CTX_BOOL; + } + + /*@-retalias@*/ /*@-globstate@*/ + return ctbase_bool; + /*@=retalias@*/ /*@=globstate@*/ +} + +static /*@only@*/ ctbase +ctbase_createUser (typeId u) +{ + ctbase c = ctbase_new (); + + c->type = CT_USER; + c->contents.tid = u; + + llassert (typeId_isValid (u)); + + return (c); +} + +static /*@only@*/ ctbase +ctbase_createEnum (/*@keep@*/ cstring etag, /*@keep@*/ enumNameList emembers) +{ + ctbase c = ctbase_new (); + + c->type = CT_ENUM; + + if (cstring_isUndefined (etag)) + { + llcontbuglit ("Undefined enum tag!"); + etag = fakeTag (); + } + + c->contents.cenum = (tenum) dmalloc (sizeof (*c->contents.cenum)); + c->contents.cenum->tag = etag; + c->contents.cenum->members = emembers; + + return (c); +} + +static /*@observer@*/ cstring +ctbase_enumTag (/*@notnull@*/ ctbase ct) +{ + return (ct->contents.cenum->tag); +} + +static /*@only@*/ ctbase +ctbase_createAbstract (typeId u) +{ + ctbase c = ctbase_new (); + + c->type = CT_ABST; + c->contents.tid = u; + + /* also check its abstract? */ + + llassert (typeId_isValid (c->contents.tid)); + + return (c); +} + +static /*@only@*/ ctbase +ctbase_createUnknown (void) +{ + if (!ctbase_isDefined (ctbase_unknown)) + { + ctbase_unknown = ctbase_new (); + ctbase_unknown->type = CT_UNKNOWN; + ctbase_unknown->contents.prim = CTX_UNKNOWN; + } + + /*@-retalias@*/ /*@-globstate@*/ + return ctbase_unknown; + /*@=retalias@*/ /*@=globstate@*/ +} + +/* +** requires: result is not assigned to b +** (should copy, but no way to reclaim storage) +*/ + +static /*@only@*/ ctbase +ctbase_makePointer (ctype b) +{ + ctbase c = ctbase_new (); + + c->type = CT_PTR; + c->contents.base = b; + + return (c); +} + +static /*@only@*/ ctbase +ctbase_makeArray (ctype b) +{ + ctbase c = ctbase_new (); + + c->type = CT_ARRAY; + c->contents.base = b; + + return (c); +} + +static /*@notnull@*/ /*@only@*/ ctbase +ctbase_makeFixedArray (ctype b, long size) +{ + ctbase c = ctbase_new (); + + c->type = CT_FIXEDARRAY; + + c->contents.farray = (tfixed) dmalloc (sizeof (*c->contents.farray)); + c->contents.farray->base = b; + c->contents.farray->size = size; + + return (c); +} + +static ctype +ctbase_makeFunction (ctype b, /*@only@*/ uentryList p) +{ + ctbase c = ctbase_new (); + ctype ct; + + c->type = CT_FCN; + c->contents.fcn = (cfcn) dmalloc (sizeof (*c->contents.fcn)); + + if (ctype_isFunction (b)) /* was: && ctype_isPointer (b)) */ + { + ctbase ctb; + ctype rval; + + if (ctype_isPointer (b)) + { + ctb = ctype_getCtbase (ctype_baseArrayPtr (b)); + } + else + { + ctb = ctype_getCtbase (b); + } + + llassert (ctbase_isDefined (ctb)); + llassert (ctb->type == CT_FCN); + + rval = ctype_makeFunction (ctb->contents.fcn->rval, p); + + c->contents.fcn->rval = rval; + c->contents.fcn->params = ctb->contents.fcn->params; + c->contents.fcn->liveparams = FALSE; + } + else + { + c->contents.fcn->rval = b; + /*@i@*/ c->contents.fcn->params = p; + c->contents.fcn->liveparams = TRUE; + /*@-branchstate@*/ /* p is really released on this branch */ + } + /*@=branchstate@*/ + + ct = cttable_addComplex (c); + return (ct); /* was: ctype_makePointer (ct)); */ +} + +static ctype +ctbase_makeNFFunction (ctype b, /*@only@*/ uentryList p) +{ + ctbase c = ctbase_new (); + ctype ct; + + c->type = CT_FCN; + c->contents.fcn = (cfcn) dmalloc (sizeof (*c->contents.fcn)); + + if (ctype_isFunction (b)) /* was && ctype_isPointer (b)) */ + { + ctbase ctb; + ctype rval; + + if (ctype_isPointer (b)) + { + ctb = ctype_getCtbase (ctype_baseArrayPtr (b)); + } + else + { + ctb = ctype_getCtbase (b); + } + + llassert (ctbase_isDefined (ctb)); + llassert (ctb->type == CT_FCN); + + rval = ctype_makeNFParamsFunction (ctb->contents.fcn->rval, p); + + c->contents.fcn->rval = rval; + c->contents.fcn->params = ctb->contents.fcn->params; + c->contents.fcn->liveparams = FALSE; + } + else + { + c->contents.fcn->rval = b; + /*@i@*/ c->contents.fcn->params = p; + c->contents.fcn->liveparams = TRUE; + + /*@-branchstate@*/ + } + /*@=branchstate@*/ + + ct = cttable_addComplex (c); + return (ct); /* was: ctype_makePointer (ct)); */ +} + +static /*@only@*/ ctbase + ctbase_makeLiveFunction (ctype b, /*@owned@*/ uentryList p) +{ + ctbase c = ctbase_new (); + + c->type = CT_FCN; + + c->contents.fcn = (cfcn) dmalloc (sizeof (*c->contents.fcn)); + c->contents.fcn->rval = b; + c->contents.fcn->params = p; + c->contents.fcn->liveparams = TRUE; + + /*@-mustfree@*/ return (c); /*@=mustfree@*/ +} + +static /*@only@*/ ctbase + ctbase_makeRealFunction (ctype b, /*@dependent@*/ uentryList p) +{ + ctbase c = ctbase_new (); + + c->type = CT_FCN; + + c->contents.fcn = (cfcn) dmalloc (sizeof (*c->contents.fcn)); + c->contents.fcn->rval = b; + c->contents.fcn->params = p; + c->contents.fcn->liveparams = FALSE; + + return (c); +} + +static /*@observer@*/ /*@notnull@*/ ctbase +ctbase_realFunction (/*@dependent@*/ /*@notnull@*/ ctbase c) +{ + ctbase res; + + if (c->type == CT_FCN) + { + return c; + } + + llassert (ctbase_isFunction (c)); + + res = ctype_getCtbase (c->contents.base); + + llassert (ctbase_isDefined (res)); + + return (res); +} + +static bool +ctbase_isFunction (ctbase c) +{ + llassert (c != ctbase_undefined); + + if (c->type == CT_FCN) + { + return TRUE; + } + else + { + if (c->type == CT_PTR) + { + ctbase fcn = ctype_getCtbase (ctbase_baseArrayPtr (c)); + + return (ctbase_isDefined (fcn) && fcn->type == CT_FCN); + } + + return FALSE; + } +} + +/* doesn't copy c1 and c2 */ + +static /*@only@*/ ctbase + ctbase_makeConj (ctype c1, ctype c2, bool isExplicit) +{ + ctbase c = ctbase_new (); + + c->type = CT_CONJ; + + c->contents.conj = (tconj) dmalloc (sizeof (*c->contents.conj)); + c->contents.conj->a = c1; + c->contents.conj->b = c2; + c->contents.conj->isExplicit = isExplicit; + + return (c); +} + +static ctype +ctbase_getConjA (/*@notnull@*/ ctbase c) +{ + llassert (c->type == CT_CONJ); + return (c->contents.conj->a); +} + +static ctype +ctbase_getConjB (/*@notnull@*/ ctbase c) +{ + llassert (c->type == CT_CONJ); + return (c->contents.conj->b); +} + +static bool +ctbase_isExplicitConj (/*@notnull@*/ ctbase c) +{ + llassert (c->type == CT_CONJ); + return (c->contents.conj->isExplicit); +} + +static /*@only@*/ ctbase +ctbase_createStruct (/*@only@*/ cstring n, /*@only@*/ uentryList f) +{ + ctbase c = ctbase_new (); + + c->type = CT_STRUCT; + + c->contents.su = (tsu) dmalloc (sizeof (*c->contents.su)); + c->contents.su->name = n; + c->contents.su->fields = f; + + return (c); +} + +static /*@observer@*/ uentryList +ctbase_getuentryList (/*@notnull@*/ ctbase c) +{ + c = ctbase_realType (c); + + if (!(c->type == CT_STRUCT || c->type == CT_UNION)) + llfatalbug (message ("ctbase_getuentryList: bad invocation: %q", ctbase_unparse (c))); + + return (c->contents.su->fields); +} + +static ctbase +ctbase_createUnion (/*@keep@*/ cstring n, /*@only@*/ uentryList f) +{ + ctbase c = ctbase_new (); + + c->type = CT_UNION; + + c->contents.su = (tsu) dmalloc (sizeof (*c->contents.su)); + c->contents.su->name = n; + c->contents.su->fields = f; + + return (c); +} + +static ctype +ctbase_baseArrayPtr (/*@notnull@*/ ctbase c) +{ + ctuid ct; + c = ctbase_realType (c); + ct = c->type; + + if (ct == CT_FIXEDARRAY) + { + return c->contents.farray->base; + } + else + { + llassert (ctuid_isAP (ct)); + + return c->contents.base; + } +} + +static ctype +ctbase_baseFunction (/*@notnull@*/ ctbase c) +{ + ctbase_fixUser (c); + c = ctbase_realFunction (c); + + if (c->type != CT_FCN) + { + llfatalbug (message ("ctbase_baseFunction: bad call: %q", ctbase_unparse (c))); + } + + return (c->contents.fcn->rval); +} + +static uentryList +ctbase_argsFunction (/*@notnull@*/ ctbase c) +{ + ctbase_fixUser (c); + c = ctbase_realFunction (c); + + if (c->type != CT_FCN) + { + llfatalbug (message ("ctbase_argsFunction: bad call: %q", + ctbase_unparse (c))); + } + return (c->contents.fcn->params); +} + +static bool +ctbase_baseisExpFcn (ctype c) +{ + ctbase cb; + c = ctype_removePointers (c); + + cb = ctype_getCtbase (c); + llassert (ctbase_isDefined (cb)); + + if (cb->type == CT_FCN) + { + c = ctype_removePointers (ctype_returnValue (c)); + + cb = ctype_getCtbase (c); + llassert (ctbase_isDefined (cb)); + + return (cb->type == CT_EXPFCN); + } + return FALSE; +} + +/* +** ctbase_newBase behaves specially when p is a CONJ: +** +** c -> conj (newBase (c, p.a), p.b) +*/ + +static ctype +ctbase_newBase (ctype c, ctype p) +{ + ctbase cb; + + DPRINTF (("New base: %s / %s", ctype_unparse (c), ctype_unparse (p))); + + cb = ctype_getCtbase (c); + + if (ctype_isUndefined (c)) + { + return p; + } + + if (ctype_isConj (p)) + { + ctbase pb = ctype_getCtbase (p); + + llassert (ctbase_isDefined (pb)); + + if (pb->contents.conj->isExplicit) + { + return (ctype_makeExplicitConj (ctype_newBase (c, pb->contents.conj->a), + pb->contents.conj->b)); + + } + else + { + return (ctype_makeConj (ctype_newBase (c, pb->contents.conj->a), + pb->contents.conj->b)); + + } + } + + if (ctbase_baseisExpFcn (c)) + { + return (ctbase_newBaseExpFcn (c, p)); + } + + llassert (ctbase_isDefined (cb)); + + switch (cb->type) + { + case CT_UNKNOWN: + case CT_PRIM: + case CT_USER: + case CT_ENUM: + case CT_ABST: + case CT_STRUCT: + case CT_UNION: + case CT_EXPFCN: + return (p); + + case CT_PTR: + { + ctype ret; + ctype cbn; + + cbn = ctbase_newBase (cb->contents.base, p); + ret = ctype_makePointer (cbn); + + return ret; + } + case CT_FIXEDARRAY: + return (ctype_makeFixedArray (ctbase_newBase (cb->contents.farray->base, p), + cb->contents.farray->size)); + case CT_ARRAY: + return (ctype_makeArray (ctbase_newBase (cb->contents.base, p))); + case CT_FCN: + return (ctype_makeRealFunction (ctbase_newBase (cb->contents.fcn->rval, p), + cb->contents.fcn->params)); + case CT_CONJ: + return (ctype_makeConjAux (ctbase_newBase (cb->contents.conj->a, p), + ctbase_newBase (cb->contents.conj->b, p), + cb->contents.conj->isExplicit)); + default: + llcontbug (message ("ctbase_newBase: bad ctbase: %q", ctbase_unparse (cb))); + return (p); + } + BADEXIT; +} + +static ctype +ctbase_newBaseExpFcn (ctype c, ctype p) +{ + ctbase cb = ctype_getCtbase (c); + ctbase tcb; + ctype ret, tmpct; + ctype fp = ctype_unknown; + uentryList ctargs = ctype_argsFunction (c); + + /* + ** okay, this is really ugly... + ** + ** pointers inside mean pointers to the function; + ** pointers outside are pointers to the return value; + ** because its a function there is one superfluous pointer. + */ + + /* + ** bf is a ctype, used to derived structure of cb + */ + + if (!ctbase_isFunction (cb)) + llbuglit ("ctbase_newBaseExpFcn: expFcn -> not a function"); + + tmpct = ctype_getBaseType (ctype_returnValue (c)); + + /* + ** pointers before expfcn -> p are pointers to function, not result + ** + */ + + tcb = ctype_getCtbase (tmpct); + + llassert (ctbase_isDefined (tcb)); + tmpct = tcb->contents.base; + + /* + ** record pointers to base in fp + */ + + while (!ctype_isUnknown (tmpct)) + { + if (ctype_isExpFcn (tmpct)) { + ctbase ttcb = ctype_getCtbase (tmpct); + + /* + ** evs 2000-05-16: This is necessary to deal with function pointers in parens. + ** The whole function pointer parsing is a major kludge, but it seems to work, + ** and I'm only embarrassed by it when I haven't look at the C spec recently... + */ + + llassert (ctbase_isDefined (ttcb)); + tmpct = ttcb->contents.base; + llassert (!ctype_isUnknown (tmpct)); + } + + switch (ctype_getCtKind (tmpct)) + { + case CTK_PTR: + fp = ctype_makePointer (fp); + /*@switchbreak@*/ break; + case CTK_ARRAY: + fp = ctype_makeArray (fp); + /*@switchbreak@*/ break; + case CTK_COMPLEX: + { + ctbase fbase = ctype_getCtbase (tmpct); + + if (ctbase_isFunction (fbase)) + { + fp = ctype_makeFunction (fp, uentryList_copy (ctargs)); + ctargs = ctbase_argsFunction (fbase); + } + else + { + llbug + (message + ("ctbase_newBaseExpFcn: fixing expfunction: bad complex type: %s [base: %q]", + ctype_unparse (tmpct), ctbase_unparse (fbase))); + } + goto exitLoop; + } + default: + { + llcontbug + (message ("ctbase_newBaseExpFcn: fixing expfunction: bad type: %s", + ctype_unparse (tmpct))); + goto exitLoop; + } + } + tmpct = ctype_baseArrayPtr (tmpct); + } + + exitLoop: + tmpct = ctype_returnValue (c); + + /* + ** pointers to expf are pointers to return value + */ + + while (!ctype_isExpFcn (tmpct)) + { + switch (ctype_getCtKind (tmpct)) + { + case CTK_PTR: + p = ctype_makePointer (p); + /*@switchbreak@*/ break; + case CTK_ARRAY: + p = ctype_makeArray (p); + /*@switchbreak@*/ break; + case CTK_COMPLEX: + { + ctbase fbase = ctype_getCtbase (tmpct); + + if (ctbase_isFunction (fbase)) + { + p = ctype_makeFunction (p, uentryList_copy (ctbase_argsFunction (fbase))); + } + else + { + llbug + (message + ("ctbase_newBaseExpFcn: fixing expfunction: bad complex type: %s", + ctype_unparse (tmpct))); + } + goto exitLoop2; + } + + default: + { + llcontbug + (message ("ctbase_newBaseExpFcn: fixing expfunction2: bad type: %t", + tmpct)); + goto exitLoop2; + } + } + tmpct = ctype_baseArrayPtr (tmpct); + } + + exitLoop2: + + /* + ** pointers to fp are pointers to function type + */ + + ret = ctype_makeRealFunction (p, ctargs); + + while (ctype_getCtKind (fp) > CTK_PLAIN) + { + switch (ctype_getCtKind (fp)) + { + case CTK_PTR: + ret = ctype_makePointer (ret); + /*@switchbreak@*/ break; + case CTK_ARRAY: + ret = ctype_makeArray (ret); + /*@switchbreak@*/ break; + case CTK_COMPLEX: + { + ctbase fbase = ctype_getCtbase (fp); + + if (ctbase_isFunction (fbase)) + { + ret = + ctype_makeFunction (ret, + uentryList_copy (ctbase_argsFunction (fbase))); + } + else + { + BADBRANCH; + } + goto exitLoop3; + } + + default: + { + llcontbug (message ("post-fixing expfunction: bad type: %t", fp)); + goto exitLoop3; + } + } + fp = ctype_baseArrayPtr (fp); + } + + exitLoop3: + return (ret); +} + +/* +** returns lowest level base of c: plain type +*/ + +static /*@notnull@*/ /*@only@*/ ctbase +ctbase_getBaseType (/*@notnull@*/ ctbase c) +{ + switch (c->type) + { + case CT_UNKNOWN: + case CT_PRIM: + case CT_USER: + case CT_ENUM: + case CT_ENUMLIST: + case CT_BOOL: + case CT_ABST: + case CT_FCN: + case CT_STRUCT: + case CT_UNION: + return (ctbase_copy (c)); + + case CT_PTR: + case CT_ARRAY: + return (ctbase_getBaseType (ctype_getCtbaseSafe (c->contents.base))); + + case CT_FIXEDARRAY: + return (ctbase_getBaseType (ctype_getCtbaseSafe (c->contents.farray->base))); + case CT_CONJ: /* base type of A conj branch? */ + return (ctbase_getBaseType (ctype_getCtbaseSafe (c->contents.conj->a))); + case CT_EXPFCN: + return (ctbase_copy (c)); + + default: + llfatalbug (message ("ctbase_getBaseType: bad ctbase: %q", ctbase_unparse (c))); + } + + BADEXIT; +} + +static int +ctbase_compare (ctbase c1, ctbase c2, bool strict) +{ + ctuid c1tid, c2tid; + + if (ctbase_isUndefined (c1) || ctbase_isUndefined (c2)) + { + llcontbuglit ("ctbase_compare: undefined ctbase"); + return -1; + } + + c1tid = c1->type; + c2tid = c2->type; + + if (c1tid < c2tid) + return -1; + if (c1tid > c2tid) + return 1; + + switch (c1tid) + { + case CT_UNKNOWN: + return 0; + case CT_PRIM: + return (int_compare (c1->contents.prim, c2->contents.prim)); + case CT_BOOL: + return 0; + case CT_USER: + return (int_compare (c1->contents.tid, c2->contents.tid)); + case CT_ENUMLIST: + return 1; + case CT_ENUM: /* for now, keep like abstract */ + case CT_ABST: + return (int_compare (c1->contents.tid, c2->contents.tid)); + case CT_PTR: + return (ctype_compare (c1->contents.base, c2->contents.base)); + case CT_FIXEDARRAY: + INTCOMPARERETURN (c1->contents.farray->size, c2->contents.farray->size); + + return (ctype_compare (c1->contents.farray->base, + c2->contents.farray->base)); + case CT_ARRAY: + return (ctype_compare (c1->contents.base, c2->contents.base)); + case CT_FCN: + { + COMPARERETURN (ctype_compare (c1->contents.fcn->rval, c2->contents.fcn->rval)); + + if (strict) + { + return (uentryList_compareStrict (c1->contents.fcn->params, + c2->contents.fcn->params)); + } + else + { + return (uentryList_compareParams (c1->contents.fcn->params, + c2->contents.fcn->params)); + } + } + case CT_EXPFCN: + return (ctype_compare (c1->contents.base, c2->contents.base)); + case CT_STRUCT: + case CT_UNION: + return (uentryList_compareFields (c1->contents.su->fields, + c2->contents.su->fields)); + case CT_CONJ: + { + COMPARERETURN (ctype_compare (c1->contents.conj->a, + c2->contents.conj->a)); + COMPARERETURN (ctype_compare (c1->contents.conj->b, + c2->contents.conj->b)); + return (bool_compare (c1->contents.conj->isExplicit, + c2->contents.conj->isExplicit)); + } + } + BADEXIT; +} + +static int +ctbase_compareStrict (/*@notnull@*/ ctbase c1, /*@notnull@*/ ctbase c2) +{ + return (ctbase_compare (c1, c2, TRUE)); +} + +static bool ctbase_equivStrict (/*@notnull@*/ ctbase c1, /*@notnull@*/ ctbase c2) +{ + return (ctbase_compareStrict (c1,c2) == 0); +} + +static bool ctbase_equiv (/*@notnull@*/ ctbase c1, /*@notnull@*/ ctbase c2) +{ + return (ctbase_compare (c1, c2, FALSE) == 0); +} + +static bool +ctbase_isKind (/*@notnull@*/ ctbase c, ctuid kind) +{ + ctuid ck = c->type; + + if (ck == kind) + return TRUE; + + if (ck == CT_CONJ) + return (ctbase_isKind (ctype_getCtbaseSafe (c->contents.conj->a), kind) || + ctbase_isKind (ctype_getCtbaseSafe (c->contents.conj->b), kind)); + + return FALSE; +} + +static bool +ctbase_isKind2 (/*@notnull@*/ ctbase c, ctuid kind1, ctuid kind2) +{ + ctuid ck = c->type; + + if (ck == kind1 || ck == kind2) + return TRUE; + + if (ck == CT_CONJ) + return (ctbase_isKind2 (ctype_getCtbaseSafe (c->contents.conj->a), kind1, kind2) || + ctbase_isKind2 (ctype_getCtbaseSafe (c->contents.conj->b), kind1, kind2)); + + return FALSE; +} + +static bool +ctbase_isAbstract (/*@notnull@*/ ctbase c) +{ + return (c->type == CT_ABST); +} + +static bool ctbase_isUA (ctbase c) +{ + return (ctbase_isDefined (c) && ((c)->type == CT_USER || (c)->type == CT_ABST)); +} + +static bool +ctbase_almostEqual (ctbase c1, ctbase c2) +{ + ctuid c1tid, c2tid; + + /* undefined types never match */ + + if (ctbase_isUndefined (c1) || ctbase_isUndefined (c2)) + return FALSE; + + c1tid = c1->type; + c2tid = c2->type; + + if (c1tid == CT_FIXEDARRAY && c2tid == CT_ARRAY) + { + return (ctbase_almostEqual (ctype_getCtbase (c1->contents.farray->base), + ctype_getCtbase (c2->contents.base))); + } + + if (c2tid == CT_FIXEDARRAY && c1tid == CT_ARRAY) + { + return (ctbase_almostEqual (ctype_getCtbase (c1->contents.base), + ctype_getCtbase (c2->contents.farray->base))); + } + + if (c1tid != c2tid) + return FALSE; + + switch (c1tid) + { + case CT_UNKNOWN: + return TRUE; + case CT_PRIM: + return (cprim_equal (c1->contents.prim, c2->contents.prim)); + case CT_BOOL: + return TRUE; + case CT_ABST: + return (typeId_equal (c1->contents.tid, c2->contents.tid)); + case CT_USER: + return (typeId_equal (c1->contents.tid, c2->contents.tid)); + case CT_ENUM: + return (cstring_equal (c1->contents.cenum->tag, c2->contents.cenum->tag)); + case CT_PTR: + return (ctype_almostEqual (c1->contents.base, c2->contents.base)); + case CT_FIXEDARRAY: + return (ctype_almostEqual (c1->contents.farray->base, + c2->contents.farray->base)); + case CT_ARRAY: + return (ctype_almostEqual (c1->contents.base, c2->contents.base)); + case CT_FCN: + return (ctype_almostEqual (c1->contents.fcn->rval, c2->contents.fcn->rval) + && uentryList_matchParams (c1->contents.fcn->params, + c2->contents.fcn->params, FALSE, TRUE)); + case CT_STRUCT: + case CT_UNION: + if (!cstring_isEmpty (c1->contents.su->name)) + { + return (cstring_equal (c1->contents.su->name, c2->contents.su->name)); + } + else + { + if (!cstring_isEmpty (c2->contents.su->name)) + { + return FALSE; + } + + llcontbuglit ("ctbase_almostEqual: match fields"); + return (FALSE); + } + default: + llcontbug (message ("ctbase_almostEqual: unknown type: %d\n", (int)c1tid)); + return (FALSE); + } +} diff --git a/src/cttable.i b/src/cttable.i new file mode 100644 index 0000000..25c79aa --- /dev/null +++ b/src/cttable.i @@ -0,0 +1,656 @@ +/* ;-*-C-*-; +** Copyright (c) Massachusetts Institute of Technology 1994-1998. +** All Rights Reserved. +** Unpublished rights reserved under the copyright laws of +** the United States. +** +** THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED +** OR IMPLIED. ANY USE IS AT YOUR OWN RISK. +** +** This code is distributed freely and may be used freely under the +** following conditions: +** +** 1. This notice may not be removed or altered. +** +** 2. Works derived from this code are not distributed for +** commercial gain without explicit permission from MIT +** (for permission contact lclint-request@sds.lcs.mit.edu). +*/ +/* +** cttable.i +** +** NOTE: This is not a stand-alone source file, but is included in ctype.c. +** (This is necessary becuase there is no other way in C to have a +** hidden scope, besides at the file level.) +*/ + +/*@access ctype@*/ + +/* +** type definitions and forward declarations in ctbase.i +*/ + +static void +ctentry_free (/*@only@*/ ctentry c) +{ + ctbase_free (c->ctbase); + cstring_free (c->unparse); + sfree (c); +} + +static void cttable_reset (void) + /*@globals cttab@*/ + /*@modifies cttab@*/ +{ + if (cttab.entries != NULL) + { + int i; + + for (i = 0; i < cttab.size; i++) + { + ctentry_free (cttab.entries[i]); + } + + /*@-compdestroy@*/ + sfree (cttab.entries); + /*@=compdestroy@*/ + + cttab.entries = NULL; + } + + cttab.size = 0 ; + cttab.nspace = 0 ; +} + +static /*@observer@*/ ctbase ctype_getCtbase (ctype c) +{ + /*@+enumint@*/ + if (c >= 0 && c < cttab.size) + { + return (cttab.entries[c]->ctbase); + } + else + { + if (c == CTK_UNKNOWN) + llbuglit ("ctype_getCtbase: ctype unknown"); + if (c == CTK_INVALID) + llbuglit ("ctype_getCtbase: ctype invalid"); + if (c == CTK_DNE) + llbuglit ("ctype_getCtbase: ctype dne"); + if (c == CTK_ELIPS) + llbuglit ("ctype_getCtbase: elips marker"); + + llfatalbug (message ("ctype_getCtbase: ctype out of range: %d", c)); + BADEXIT; + } + + /*@=enumint@*/ +} + +static /*@notnull@*/ /*@observer@*/ ctbase +ctype_getCtbaseSafe (ctype c) +{ + ctbase res = ctype_getCtbase (c); + + llassert (ctbase_isDefined (res)); + return res; +} + +/* +** ctentry +*/ + +static ctentry +ctype_getCtentry (ctype c) +{ + static /*@only@*/ ctentry errorEntry = NULL; + + if (cttab.size == 0) + { + if (errorEntry == NULL) + { + errorEntry = ctentry_makeNew (CTK_UNKNOWN, ctbase_undefined); + } + + return errorEntry; + } + + /*@+enumint@*/ + if (c >= CTK_PLAIN && c < cttab.size) + { + return (cttab.entries[c]); + } + else if (c == CTK_UNKNOWN) + llcontbuglit ("ctype_getCtentry: ctype unknown"); + else if (c == CTK_INVALID) + llcontbuglit ("ctype_getCtentry: ctype invalid (ctype_undefined)"); + else if (c == CTK_DNE) + llcontbuglit ("ctype_getCtentry: ctype dne"); + else + llbug (message ("ctype_getCtentry: ctype out of range: %d", c)); + + return (cttab.entries[ctype_unknown]); + /*@=enumint@*/ +} + +static ctentry +ctentry_makeNew (ctkind ctk, /*@only@*/ ctbase c) +{ + + return (ctentry_make (ctk, c, ctype_dne, ctype_dne, ctype_dne, cstring_undefined)); +} + +static /*@only@*/ ctentry +ctentry_make (ctkind ctk, + /*@keep@*/ ctbase c, ctype base, + ctype ptr, ctype array, + /*@keep@*/ cstring unparse) /*@*/ +{ + ctentry cte = (ctentry) dmalloc (sizeof (*cte)); + cte->kind = ctk; + cte->ctbase = c; + cte->base = base; + cte->ptr = ptr; + cte->array = array; + cte->unparse = unparse; + return cte; +} + +static cstring +ctentry_unparse (ctentry c) +{ + return (message + ("%20s [%d] [%d] [%d]", + (cstring_isDefined (c->unparse) ? c->unparse : cstring_makeLiteral ("")), + c->base, + c->ptr, + c->array)); +} + +static bool +ctentry_isInteresting (ctentry c) +{ + return (cstring_isNonEmpty (c->unparse)); +} + +static /*@only@*/ cstring +ctentry_dump (ctentry c) +{ + if (c->ptr == ctype_dne + && c->array == ctype_dne + && c->base == ctype_dne) + { + return (message ("%d %q&", + ctkind_toInt (c->kind), + ctbase_dump (c->ctbase))); + } + else if (c->base == ctype_undefined + && c->array == ctype_dne) + { + if (c->ptr == ctype_dne) + { + return (message ("%d %q!", + ctkind_toInt (c->kind), + ctbase_dump (c->ctbase))); + } + else + { + return (message ("%d %q^%d", + ctkind_toInt (c->kind), + ctbase_dump (c->ctbase), + c->ptr)); + } + } + else if (c->ptr == ctype_dne + && c->array == ctype_dne) + { + return (message ("%d %q%d&", + ctkind_toInt (c->kind), + ctbase_dump (c->ctbase), + c->base)); + } + else + { + return (message ("%d %q%d %d %d", + ctkind_toInt (c->kind), + ctbase_dump (c->ctbase), + c->base, c->ptr, c->array)); + } +} + + +static /*@only@*/ ctentry +ctentry_undump (/*@dependent@*/ char *s) +{ + int base, ptr, array; + ctkind kind; + ctbase ct; + + kind = ctkind_fromInt (getInt (&s)); + ct = ctbase_undump (&s); + + if (optCheckChar (&s, '&')) + { + base = ctype_dne; + ptr = ctype_dne; + array = ctype_dne; + } + else if (optCheckChar (&s, '!')) + { + base = ctype_undefined; + ptr = ctype_dne; + array = ctype_dne; + } + else if (optCheckChar (&s, '^')) + { + base = ctype_undefined; + ptr = getInt (&s); + array = ctype_dne; + } + else + { + base = getInt (&s); + + if (optCheckChar (&s, '&')) + { + ptr = ctype_dne; + array = ctype_dne; + } + else + { + ptr = getInt (&s); + array = getInt (&s); + } + } + + /* can't unparse w/o typeTable */ + return (ctentry_make (kind, ct, base, ptr, array, cstring_undefined)); +} + +static /*@observer@*/ cstring +ctentry_doUnparse (ctentry c) /*@modifies c@*/ +{ + if (cstring_isDefined (c->unparse)) + { + return (c->unparse); + } + else + { + cstring s = ctbase_unparse (c->ctbase); + + if (!cstring_isEmpty (s) && !cstring_containsChar (s, '<')) + { + c->unparse = s; + } + else + { + cstring_markOwned (s); + } + + return (s); + } +} + +static /*@observer@*/ cstring +ctentry_doUnparseDeep (ctentry c) +{ + if (cstring_isDefined (c->unparse)) + { + return (c->unparse); + } + else + { + c->unparse = ctbase_unparseDeep (c->ctbase); + return (c->unparse); + } +} + +/* +** cttable operations +*/ + +static /*@only@*/ cstring +cttable_unparse (void) +{ + int i; + cstring s = cstring_undefined; + + /*@access ctbase@*/ + for (i = 0; i < cttab.size; i++) + { + ctentry cte = cttab.entries[i]; + if (ctentry_isInteresting (cte)) + { + if (ctbase_isUA (cte->ctbase)) + { + s = message ("%s%d\t%q [%d]\n", s, i, ctentry_unparse (cttab.entries[i]), + cte->ctbase->contents.tid); + } + else + { + s = message ("%s%d\t%q\n", s, i, ctentry_unparse (cttab.entries[i])); + } + } + } + /*@noaccess ctbase@*/ + return (s); +} + +void +cttable_print (void) +{ + int i; + + /*@access ctbase@*/ + for (i = 0; i < cttab.size; i++) + { + ctentry cte = cttab.entries[i]; + + if (ctentry_isInteresting (cte)) + { + if (ctbase_isUA (cte->ctbase)) + { + fprintf (g_msgstream, "%3d: %s [%d]\n", i, + cstring_toCharsSafe (ctentry_doUnparse (cttab.entries[i])), + cte->ctbase->contents.tid); + } + else + { + fprintf (g_msgstream, "%3d: %s\n", i, + cstring_toCharsSafe (ctentry_doUnparse (cttab.entries[i]))); + } + } + else + { + /* fprintf (g_msgstream, "%3d: \n", i); */ + } + } + /*@noaccess ctbase@*/ +} + +/* +** cttable_dump +** +** Output cttable for dump file +*/ + +static void +cttable_dump (FILE *fout) +{ + bool showdots = FALSE; + int showdotstride = 0; + int i; + + if (context_getFlag (FLG_SHOWSCAN) && cttab.size > 5000) + { + fprintf (g_msgstream, " >\n"); /* end dumping to */ + fprintf (g_msgstream, "< Dumping type table (%d types) ", cttab.size); + showdotstride = cttab.size / 5; + showdots = TRUE; + } + + for (i = 0; i < cttab.size; i++) + { + cstring s; + + s = ctentry_dump (cttab.entries[i]); + llassert (cstring_length (s) < MAX_DUMP_LINE_LENGTH); + fputline (fout, cstring_toCharsSafe (s)); + cstring_free (s); + + if (showdots && (i != 0 && ((i - 1) % showdotstride == 0))) + { + (void) fflush (g_msgstream); + fprintf (stderr, "."); + (void) fflush (stderr); + } + } + + if (showdots) + { + fprintf (stderr, " >\n< Continuing dump "); + } + + } + +/* +** load cttable from init file +*/ + +static void cttable_load (FILE *f) + /*@globals cttab @*/ + /*@modifies cttab, f @*/ +{ + char *s = mstring_create (MAX_DUMP_LINE_LENGTH); + ctentry cte; + + cttable_reset (); + + while (fgets (s, MAX_DUMP_LINE_LENGTH, f) != NULL && *s == ';') + { + ; + } + + if (mstring_length (s) == (MAX_DUMP_LINE_LENGTH - 1)) + { + llbug (message ("Library line too long: %s\n", cstring_fromChars (s))); + } + + while (s != NULL && *s != ';' && *s != '\0') + { + ctype ct; + + cte = ctentry_undump (s); + ct = cttable_addFull (cte); + + if (ctbase_isConj (cte->ctbase) + && !(cte->ctbase->contents.conj->isExplicit)) + { + ctype_recordConj (ct); + } + + (void) fgets (s, MAX_DUMP_LINE_LENGTH, f); + } + + sfree (s); + } + +/* +** cttable_init +** +** fill up the cttable with basic types, and first order derivations. +** this is done without using our constructors for efficiency reasons +** (probably bogus) +** +*/ + +/*@access cprim@*/ +static void cttable_init (void) + /*@globals cttab@*/ /*@modifies cttab@*/ +{ + ctkind i; + cprim j; + ctbase ct = ctbase_undefined; + + llassert (cttab.size == 0); + + /* do for plain, pointer, arrayof */ + for (i = CTK_PLAIN; i <= CTK_ARRAY; i++) + { + for (j = CTX_UNKNOWN; j <= CTX_LAST; j++) + { + if (i == CTK_PLAIN) + { + if (j == CTX_BOOL) + { + ct = ctbase_createBool (); /* why different? */ + } + else if (j == CTX_UNKNOWN) + { + ct = ctbase_createUnknown (); + } + else + { + ct = ctbase_createPrim ((cprim)j); + } + + (void) cttable_addFull + (ctentry_make (CTK_PLAIN, + ct, ctype_undefined, + j + CTK_PREDEFINED, j + CTK_PREDEFINED2, + ctbase_unparse (ct))); + } + else + { + switch (i) + { + case CTK_PTR: + ct = ctbase_makePointer (j); + /*@switchbreak@*/ break; + case CTK_ARRAY: + ct = ctbase_makeArray (j); + /*@switchbreak@*/ break; + default: + llbugexitlit ("cttable_init: base case"); + } + + (void) cttable_addDerived (i, ct, j); + } + } + } + + /**** reserve a slot for userBool ****/ + (void) cttable_addFull (ctentry_make (CTK_INVALID, ctbase_undefined, + ctype_undefined, ctype_dne, ctype_dne, + cstring_undefined)); +} + +/*@noaccess cprim@*/ + +static void +cttable_grow () +{ + int i; + o_ctentry *newentries ; + + cttab.nspace = CTK_BASESIZE; + newentries = (ctentry *) dmalloc (sizeof (*newentries) * (cttab.size + cttab.nspace)); + + if (newentries == NULL) + { + llfatalerror (message ("cttable_grow: out of memory. Size: %d", + cttab.size)); + } + + for (i = 0; i < cttab.size; i++) + { + newentries[i] = cttab.entries[i]; + } + + /*@-compdestroy@*/ + sfree (cttab.entries); + /*@=compdestroy@*/ + + cttab.entries = newentries; +/*@-compdef@*/ +} /*@=compdef@*/ + +static ctype +cttable_addDerived (ctkind ctk, /*@keep@*/ ctbase cnew, ctype base) +{ + if (cttab.nspace == 0) + cttable_grow (); + + cttab.entries[cttab.size] = + ctentry_make (ctk, cnew, base, ctype_dne, ctype_dne, cstring_undefined); + + cttab.nspace--; + + return (cttab.size++); +} + +static ctype +cttable_addComplex (/*@only@*/ /*@notnull@*/ ctbase cnew) + /*@modifies cttab; @*/ +{ + if (cnew->type != CT_FCN && cnew->type != CT_EXPFCN) + { + ctype i; + int ctstop = cttable_lastIndex () - DEFAULT_OPTLEVEL; + + if (ctstop < LAST_PREDEFINED) + { + ctstop = LAST_PREDEFINED; + } + + for (i = cttable_lastIndex (); i >= ctstop; i--) /* better to go from back... */ + { + ctbase ctb; + + + ctb = ctype_getCtbase (i); + + if (ctbase_isDefined (ctb) && ctbase_equivStrict (cnew, ctb)) + { + ctbase_free (cnew); + + return i; + } + } + } + + if (cttab.nspace == 0) + cttable_grow (); + + cttab.entries[cttab.size] = ctentry_make (CTK_COMPLEX, cnew, ctype_undefined, + ctype_dne, ctype_dne, + cstring_undefined); + cttab.nspace--; + + return (cttab.size++); +} + +static ctype +cttable_addFull (ctentry cnew) +{ + if (cttab.nspace == 0) + { + cttable_grow (); + } + + cttab.entries[cttab.size] = cnew; + cttab.nspace--; + + return (cttab.size++); +} + +static ctype +cttable_addFullSafe (/*@only@*/ ctentry cnew) +{ + int i; + ctbase cnewbase = cnew->ctbase; + + llassert (ctbase_isDefined (cnewbase)); + + for (i = cttable_lastIndex (); i >= CT_FIRST; i--) + { + ctbase ctb = ctype_getCtbase (i); + + if (ctbase_isDefined (ctb) + && ctbase_equiv (cnewbase, ctype_getCtbaseSafe (i))) + { + ctentry_free (cnew); + return i; + } + } + + if (cttab.nspace == 0) + cttable_grow (); + + cttab.entries[cttab.size] = cnew; + + cttab.nspace--; + + return (cttab.size++); +} + diff --git a/src/ctype.c b/src/ctype.c new file mode 100644 index 0000000..f36bc11 --- /dev/null +++ b/src/ctype.c @@ -0,0 +1,2309 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** ctype.c +** +** This files implements three types: ctentry, cttable and ctype. +** They should probably be separated soon. +*/ + +# include "lclintMacros.nf" +# include "basic.h" +# include "structNames.h" + +static void ctype_recordConj (ctype p_c); + +/* +** ctbase file +*/ + +# include "ctbase.i" + +/* +** ctype table +*/ + +# include "cttable.i" + +static ctype ctype_getConjA (ctype p_c) /*@*/ ; +static ctype ctype_getConjB (ctype p_c) /*@*/ ; + +static bool ctype_isComplex (ctype c) +{ + return (ctentry_isComplex (ctype_getCtentry(c))); +} + +static bool ctype_isPlain (ctype c) +{ + return (ctentry_isPlain (ctype_getCtentry(c))); +} + +static bool ctype_isBroken (ctype c) +{ + /*@+enumint@*/ + if (c == CTK_DNE || c == CTK_INVALID || c == CTK_UNKNOWN) + { + /*@-enumint@*/ + return TRUE; + } + else + { + ctentry cte = ctype_getCtentry (c); + + return (ctentry_isBogus (cte)); + } +} + +ctkind +ctkind_fromInt (int i) +{ + /*@+enumint@*/ + if (i < CTK_UNKNOWN || i > CTK_COMPLEX) + { + llcontbug (message ("ctkind_fromInt: out of range: %d", i)); + return CTK_INVALID; + } + return (ctkind) i; + /*@=enumint@*/ +} + +/* +** ctype functions +*/ + +void +ctype_initTable () +{ + cttable_init (); +} + +void +ctype_destroyMod () +{ + cttable_reset (); +} + +void +ctype_loadTable (FILE *f) +{ + cttable_load (f); +} + +void +ctype_dumpTable (FILE *f) +{ + cttable_dump (f); +} + +cstring +ctype_unparseTable () +{ + return (cttable_unparse ()); +} + +void +ctype_printTable () +{ + cttable_print (); +} + +bool +ctype_isUserBool (ctype ct) +{ + if (ctype_isUA (ct)) + { + return (usymtab_isBoolType (ctype_typeId (ct))); + } + + return (FALSE); +} + +ctype +ctype_createUser (typeId u) +{ + /* requires: ctype_createUser (u) is never called more than once for any u. */ + + ctbase ct = ctbase_createUser (u); + return (cttable_addFullSafe (ctentry_makeNew (CTK_PLAIN, ct))); +} + +ctype +ctype_createAbstract (typeId u) +{ + /* requires: ctype_createAbstract (u) is never called more than once for any u. */ + /* [ tested by cttable_addFullSafe, not really required ] */ + return (cttable_addFullSafe (ctentry_makeNew (CTK_PLAIN, ctbase_createAbstract (u)))); +} + +int +ctype_count (void) +{ + return (cttab.size); +} + +ctype +ctype_realType (ctype c) +{ + ctype r = c; + + if (ctype_isUA (c)) + { + r = uentry_getRealType (usymtab_getTypeEntry (ctype_typeId (c))); + } + + if (ctype_isDirectBool (r)) + { + if (context_canAccessBool ()) + { + r = ctype_int; + } + } + + return r; +} + +bool +ctype_isSimple (ctype c) +{ + return (!(ctype_isPointer (c) + || ctype_isArray (c) + || ctype_isFunction (c))); +} + +ctype +ctype_forceRealType (ctype c) +{ + ctype r = c; + + if (ctype_isUA (c)) + { + r = uentry_getForceRealType (usymtab_getTypeEntry (ctype_typeId (c))); + } + + return r; +} + +ctype +ctype_realishType (ctype c) +{ + if (ctype_isUA (c)) + { + if (ctype_isUserBool (c)) + { + return ctype_bool; + } + else + { + ctype r = uentry_getRealType (usymtab_getTypeEntry + (ctype_typeId (c))); + return (r); + } + } + + return c; +} + +bool +ctype_isUA (ctype c) +{ + return (ctbase_isUA (ctype_getCtbase (c))); +} + +bool +ctype_isUser (ctype c) +{ + return (ctbase_isUser (ctype_getCtbase (c))); +} + +bool +ctype_isAbstract (ctype c) +{ + return ((ctype_isPlain (c) && ctbase_isAbstract (ctype_getCtbaseSafe (c))) || + (ctype_isConj (c) && + (ctype_isAbstract (ctype_getConjA (c)) + || ctype_isAbstract (ctype_getConjB (c))))); +} + +bool +ctype_isRealAbstract (ctype c) +{ + return (ctype_isAbstract (ctype_realType (c)) || + (ctype_isConj (c) && + (ctype_isRealAbstract (ctype_getConjA (c)) || + ctype_isRealAbstract (ctype_getConjB (c))))); +} + +/* +** primitive creators +*/ + +/* +** createPrim not necessary --- subsumed by ctype_int, etc. +*/ + +/* +** ctbase_unknown --- removed argument +*/ + +/* +** derived types: +** requires: if DerivedType (T) exists in cttable, then T->derivedType is it. +*/ + +ctype +ctype_makePointer (ctype c) +{ + if (c == ctype_char) + { + return ctype_string; + } + else if (c == ctype_void) + { + return ctype_voidPointer; + } + else + { + ctentry cte = ctype_getCtentry (c); + ctype clp = ctentry_getPtr (cte); + + if /*@+enumint@*/ (clp == CTK_DNE) /*@=enumint@*/ + { + ctype cnew = cttable_addDerived (CTK_PTR, ctbase_makePointer (c), c); + ctentry_setPtr (cte, cnew); + return (cnew); + } + else + { + return clp; + } + } +} + +ctype ctype_makeFixedArray (ctype c, long size) +{ + return (cttable_addDerived (CTK_ARRAY, ctbase_makeFixedArray (c, size), c)); +} + +ctype +ctype_makeArray (ctype c) +{ + ctentry cte = ctype_getCtentry (c); + ctype clp = ctentry_getArray (cte); + + if /*@+enumint@*/ (clp == CTK_DNE) /*@=enumint@*/ + { + ctype cnew = cttable_addDerived (CTK_ARRAY, ctbase_makeArray (c), c); + ctentry_setArray (cte, cnew); + return (cnew); + } + else + return clp; +} + +/* +** requires c is a pointer of array +*/ + +ctype +ctype_baseArrayPtr (ctype c) +{ + ctentry cte = ctype_getCtentry (ctype_realType (c)); + + if (ctype_isConj (c)) + { + if (ctype_isAP (ctype_getConjA (c))) + { + if (ctype_isAP (ctype_getConjB (c))) + { + return (ctype_makeConj (ctype_baseArrayPtr (ctype_getConjA (c)), + ctype_baseArrayPtr (ctype_getConjB (c)))); + } + else + { + return (ctype_baseArrayPtr (ctype_getConjA (c))); + } + } + else + { + return (ctype_baseArrayPtr (ctype_getConjB (c))); + } + } + else if (ctype_isInt (c)) /* could be NULL */ + { + return ctype_unknown; + } + else + { + ctype clp = ctentry_getBase (cte); + + if (ctype_isBroken (clp)) + { + llbuglit ("ctype_baseArrayPtr: bogus ctype"); + } + + return clp; + } +} + +ctype +ctype_returnValue (ctype c) +{ + return (ctbase_baseFunction (ctype_getCtbaseSafe (c))); +} + +/* +** must be a shared pointer +*/ + +/*@observer@*/ uentryList +ctype_argsFunction (ctype c) +{ + return (ctbase_argsFunction (ctype_getCtbaseSafe (c))); +} + +/* +** Returns type with base type p and compound types from c. +** +** i.e., c = char *[]; p = int +** => int *[] +*/ + +ctype +ctype_newBase (ctype c, ctype p) +{ + return (ctbase_newBase (c, p)); +} + +bool +ctype_sameAltTypes (ctype c1, ctype c2) +{ + ctype c1a, c2a; + ctype c1b, c2b; + + llassert (ctype_isConj (c1) && ctype_isConj (c2)); + + c1a = ctype_getConjA (c1); + c2a = ctype_getConjA (c2); + + c1b = ctype_getConjB (c1); + c2b = ctype_getConjB (c2); + + if (ctype_compare (c1a, c2a) == 0) + { + if (ctype_compare (c1b, c2b) == 0) + { + return TRUE; + } + else + { + if (ctype_isConj (c1b) && ctype_isConj (c2b)) + { + return ctype_sameAltTypes (c1b, c2b); + } + else + { + return FALSE; + } + } + } + else + { + if (ctype_compare (c1a, c2b) == 0) + { + if (ctype_compare (c1b, c2a) == 0) + { + return TRUE; + } + else + { + if (ctype_isConj (c1b) && ctype_isConj (c2a)) + { + return ctype_sameAltTypes (c1b, c2a); + } + else + { + return FALSE; + } + } + } + else + { + return FALSE; + } + } +} + +int +ctype_compare (ctype c1, ctype c2) +{ + ctentry ce1; + ctentry ce2; + + ce1 = ctype_getCtentry (c1); + ce2 = ctype_getCtentry (c2); + + if (ctentry_isComplex (ce1)) + { + if (ctentry_isComplex (ce2)) + { + return (ctbase_compare (ctype_getCtbase (c1), + ctype_getCtbase (c2), FALSE)); + } + else + { + return 1; + } + } + else if (ctentry_isComplex (ce2)) + { + return -1; + } + else + { + return (int_compare (c1, c2)); + } +} + +/* +** complex types +*/ + +/* +** makeFunction: pointer to function returning base +*/ + +ctype +ctype_makeParamsFunction (ctype base, /*@only@*/ uentryList p) +{ + uentryList_fixImpParams (p); + return (ctype_makeFunction (base, p)); +} + +ctype +ctype_makeNFParamsFunction (ctype base, /*@only@*/ uentryList p) +{ + uentryList_fixImpParams (p); + return (ctbase_makeNFFunction (base, p)); +} + +ctype +ctype_makeFunction (ctype base, /*@only@*/ uentryList p) +{ + ctype ret; + ret = ctbase_makeFunction (base, p); + return (ret); +} + +ctype ctype_expectFunction (ctype c) +{ + /* handle parenthesized declarations */ + + if (!ctype_isAP (c)) + { + c = ctype_makePointer (c); + } + + return (cttable_addComplex (ctbase_expectFunction (c))); +} + +/* +** makeRealFunction: function returning base +*/ + +ctype ctype_makeRealFunction (ctype base, uentryList p) +{ + return (cttable_addComplex (ctbase_makeRealFunction (base, p))); +} + +/* +** plain predicates +*/ + +/*** +**** this is very poorly defined +**** +**** need to unify function/function pointer meaning +***/ + +bool +ctype_isFunction (ctype c) +{ + return (ctbase_isFunction (ctype_getCtbase (c))); +} + +bool +ctype_isExpFcn (ctype c) +{ + return (ctbase_isExpFcn (ctype_getCtbase (c))); +} + +bool +ctype_isVoid (ctype c) +{ + return (c == CTX_VOID); +} + +bool +ctype_isArbitraryIntegral (ctype c) +{ + ctype cr = ctype_realType (c); + + return (cr == ctype_anyintegral || cr == ctype_unsignedintegral + || cr == ctype_signedintegral); +} + +bool +ctype_isUnsignedIntegral (ctype c) +{ + ctype cr = ctype_realType (c); + + return (cr == ctype_unsignedintegral); +} + +bool +ctype_isSignedIntegral (ctype c) +{ + ctype cr = ctype_realType (c); + + return (cr == ctype_signedintegral); +} + +bool +ctype_isInt (ctype c) +{ + cprim cp = ctype_toCprim (c); + + return (c == ctype_unknown || cprim_isAnyInt (cp) + || (cprim_isAnyChar (cp) && context_msgCharInt ()) + || (c == ctype_bool && context_msgBoolInt ()) + || (ctype_isEnum (c) && context_msgEnumInt ())); +} + +bool +ctype_isRegularInt (ctype c) +{ + cprim cp = ctype_toCprim (c); + + return (c == ctype_unknown + || cprim_closeEnough (cprim_int, cp) + || (cprim_isAnyChar (cp) && context_msgCharInt ()) + || (c == ctype_bool && context_msgBoolInt ()) + || (ctype_isEnum (c) && context_msgEnumInt ())); +} + +bool +ctype_isString (ctype c) +{ + return (c == ctype_string + || (ctype_isPointer (c) + && ctype_isChar (ctype_baseArrayPtr (c)))); +} + +bool +ctype_isChar (ctype c) +{ + return ((c == ctype_unknown) || (cprim_isAnyChar (ctype_toCprim (c))) + || (context_getFlag (FLG_CHARINT) && ctype_isInt (c))); +} + +bool +ctype_isUnsignedChar (ctype c) +{ + return ((c == ctype_unknown) || (cprim_isUnsignedChar (ctype_toCprim (c)))); +} + +bool +ctype_isSignedChar (ctype c) +{ + return ((c == ctype_unknown) || (cprim_isSignedChar (ctype_toCprim (c)))); +} + +bool +ctype_isBool (ctype c) +{ + /*@unchecked@*/ static typeId boolType = typeId_invalid; + + if (context_getFlag (FLG_ABSTRACTBOOL)) + { + if (typeId_isInvalid (boolType)) + { + boolType = usymtab_getTypeId (context_getBoolName ()); + } + + if (context_hasAccess (boolType)) + { + return (((c == CTX_UNKNOWN) || (c == CTX_BOOL) + || (context_msgBoolInt () + && (c == CTX_INT + || (c == CTX_CHAR && context_msgCharInt ())))) + || ctype_isInt (c)); + } + } + + return ((c == CTX_UNKNOWN) || (c == CTX_BOOL) + || (context_msgBoolInt () + && (c == CTX_INT || (c == CTX_CHAR && context_msgCharInt ())))); +} + +bool +ctype_isDirectBool (ctype c) +{ + return (c == CTX_BOOL); +} + +bool +ctype_isReal (ctype c) +{ + return (cprim_isAnyReal (ctype_toCprim (c))); +} + +bool +ctype_isFloat (ctype c) +{ + return (c == ctype_float); +} + +bool +ctype_isDouble (ctype c) +{ + return (c == ctype_double || c == ctype_ldouble); +} + +bool +ctype_isSigned (ctype c) +{ + return (!ctype_isUnsigned (c)); +} + +bool +ctype_isNumeric (ctype c) +{ + return (ctype_isInt (c) || ctype_isReal (c) || ctype_isEnum (c)); +} + + +/* +** real predicates +** +** work on actual type in current context +*/ + +bool +ctype_isRealNumeric (ctype c) +{ + if (ctype_isPlain (c)) + return (ctype_isNumeric (ctype_realType (c))); + if (ctype_isConj (c)) + return (ctype_isRealNumeric (ctype_getConjA (c)) || + ctype_isRealNumeric (ctype_getConjB (c))); + else + return FALSE; +} + +bool +ctype_isRealInt (ctype c) +{ + if (ctype_isPlain (c)) + return (ctype_isInt (ctype_realType (c))); + else if (ctype_isConj (c)) + return (ctype_isRealInt (ctype_getConjA (c)) || + ctype_isRealInt (ctype_getConjB (c))); + else + { + if (ctype_isEnum (c) && context_msgEnumInt ()) return TRUE; + return FALSE; + } +} + +bool +ctype_isRealVoid (ctype c) +{ + if (ctype_isPlain (c)) + { + return (ctype_isVoid (ctype_realType (c))); + } + else if (ctype_isConj (c)) + { + return (ctype_isRealVoid (ctype_getConjA (c)) || + ctype_isRealVoid (ctype_getConjB (c))); + } + else + { + return FALSE; + } +} + +bool +ctype_isRealBool (ctype c) +{ + if (ctype_isPlain (c)) + { + return (ctype_isBool (ctype_realishType (c))); + } + else if (ctype_isConj (c)) + { + return (ctype_isRealBool (ctype_getConjA (c)) || + ctype_isRealBool (ctype_getConjB (c))); + } + else + { + return FALSE; + } +} + +bool +ctype_isRealPointer (ctype c) +{ + if (ctype_isConj (c)) + return (ctype_isRealPointer (ctype_getConjA (c)) || + ctype_isRealPointer (ctype_getConjB (c))); + return (ctype_isPointer (ctype_realType (c))); +} + +bool +ctype_isRealSU (ctype c) +{ + if (ctype_isConj (c)) + { + return (ctype_isRealSU (ctype_getConjA (c)) || + ctype_isRealSU (ctype_getConjB (c))); + } + return (ctype_isStructorUnion (ctype_realType (c))); +} + +bool +ctype_isRealArray (ctype c) +{ + if (ctype_isConj (c)) + return (ctype_isRealArray (ctype_getConjA (c)) || + ctype_isRealArray (ctype_getConjB (c))); + return (ctype_isArray (ctype_realType (c))); +} + +bool +ctype_isRealAP (ctype c) +{ + if (ctype_isConj (c)) + return (ctype_isRealAP (ctype_getConjA (c)) || + ctype_isRealAP (ctype_getConjB (c))); + return (ctype_isAP (ctype_realType (c))); +} + +bool +ctype_isRealFunction (ctype c) +{ + if (ctype_isConj (c)) + return (ctype_isRealFunction (ctype_getConjA (c)) || + ctype_isRealFunction (ctype_getConjB (c))); + return (ctype_isFunction (ctype_realType (c))); +} + +bool +ctype_isDirectInt (ctype c) +{ + return (c == CTX_INT || c == CTX_UINT || c == CTX_SINT || c == CTX_ULINT || c == CTX_USINT); +} + +/* +** forceful predicates +** +** take *ctype; if its a conjunct, and there is a match replace with match only. +** if both match, still conjunct +*/ + +static bool + ctype_isForcePred (ctype * c, bool (pred) (ctype)) +{ + if (ctype_isConj (*c)) + { + ctype cbr = ctype_getConjA (*c); + + if ((*pred) (cbr)) + { + if ((*pred) (ctype_getConjB (*c))) + { + ; + } + else + { + *c = cbr; + } + + return TRUE; + } + else + { + if ((*pred) (cbr = ctype_getConjB (*c))) + { + *c = cbr; + return TRUE; + } + } + } + + return ((*pred) (*c)); +} + +bool +ctype_isForceRealNumeric (ctype * c) +{ + return (ctype_isForcePred (c, ctype_isRealNumeric)); +} + +bool +ctype_isForceRealInt (ctype * c) +{ + return (ctype_isForcePred (c, ctype_isRealInt)); +} + +bool +ctype_isForceRealBool (ctype * c) +{ + return (ctype_isForcePred (c, ctype_isRealBool)); +} + +/* +** conjuncts +** +** save int/char, int/bool, other random conjuncts +*/ + +static ctype +ctype_makeConjAux (ctype c1, ctype c2, bool isExplicit) +{ + if (ctype_isBogus (c1) || ctype_isUndefined (c1)) + { + return c2; + } + else if (ctype_isBogus (c2) || ctype_isUndefined (c2)) + { + return c1; + } + else + { + if (isExplicit) + { + return (ctype_makeExplicitConj (c1, c2)); + } + else + { + return (ctype_makeConj (c1, c2)); + } + } +} + +ctype +ctype_makeExplicitConj (ctype c1, ctype c2) +{ + if (ctype_isFunction (c1) && !ctype_isFunction (c2)) + { + ctype ret = ctype_makeExplicitConj (ctype_returnValue (c1), c2); + + return ctype_makeFunction (ret, uentryList_copy (ctype_getParams (c1))); + } + else if (ctype_isFunction (c2) && !ctype_isFunction (c1)) + { + ctype ret = ctype_makeExplicitConj (c1, ctype_returnValue (c2)); + + return ctype_makeFunction (ret, uentryList_copy (ctype_getParams (c2))); + } + else + { + return (cttable_addComplex (ctbase_makeConj (c1, c2, TRUE))); + } +} + +static ctype ic = ctype_unknown; /* int | char */ +static ctype ib = ctype_unknown; /* int | bool */ +static ctype ifl = ctype_unknown; /* int | float */ +static ctype ibf = ctype_unknown; /* int | bool | float */ +static ctype ibc = ctype_unknown; /* int | bool | char */ +static ctype iv = ctype_unknown; /* int | void * */ +static ctype ivf = ctype_unknown; /* int | void * | float */ +static ctype ivb = ctype_unknown; /* int | void * | bool */ +static ctype ivbf = ctype_unknown; /* int | void * | bool | float */ +static ctype cuc = ctype_unknown; /* char | unsigned char */ + +static void +ctype_recordConj (ctype c) +{ + ctype c1, c2; + + llassert (ctype_isConj (c)); + + c1 = ctype_getConjA (c); + c2 = ctype_getConjB (c); + + /* No, can't swap! + if (c2 == ctype_int && c1 != ctype_int) + { + ctype tmp; + + tmp = c1; + c1 = c2; + c2 = tmp; + } + */ + + if (c1 == ctype_int) + { + if (c2 == ctype_char) + { + llassert (ic == ctype_unknown); + ic = c; + } + else if (c2 == ctype_bool) + { + llassert (ib == ctype_unknown); + ib = c; + } + else if (c2 == ctype_float) + { + llassert (ifl == ctype_unknown); + ifl = c; + } + else if (c2 == CTP_VOID) + { + llassert (iv == ctype_unknown); + iv = c; + } + else + { + /* not special */ + } + } + else if (c1 == ib && ib != ctype_unknown) + { + if (c2 == ctype_float) + { + llassert (ibf == ctype_unknown); + ibf = c; + } + else if (c2 == ctype_char) + { + llassert (ibc == ctype_unknown); + ibc = c; + } + else + { + /* not special */ + } + } + else if (c1 == iv) + { + if (c2 == ctype_bool) + { + llassert (ivb == ctype_unknown); + ivb = c; + } + else if (c2 == ctype_float) + { + llassert (ivf == ctype_unknown); + ivf = c; + } + else + { + /* not special */ + } + } + else if (c1 == ivf) + { + if (c2 == ctype_bool) + { + llassert (ivbf == ctype_unknown); + ivbf = c; + } + } + else if (c1 == ivb) + { + if (c2 == ctype_float) + { + llassert (ivbf == ctype_unknown); + ivbf = c; + } + } + else if (c1 == ctype_char) + { + if (c2 == ctype_uchar) + { + llassert (cuc == ctype_unknown); + + cuc = c; + } + } + else + { + /* not special */ + } +} + +ctype +ctype_makeConj (ctype c1, ctype c2) +{ + /* no: can have unsigned long @alt long@: llassert (c1 != c2); */ + + DPRINTF (("Make conj: %s / %s", ctype_unparse (c1), ctype_unparse (c2))); + + if (ctype_isFunction (c1) && !ctype_isFunction (c2)) + { + ctype ret = ctype_makeConj (ctype_returnValue (c1), c2); + return ctype_makeFunction (ret, uentryList_copy (ctype_getParams (c1))); + } + else if (ctype_isFunction (c2) && !ctype_isFunction (c1)) + { + ctype ret = ctype_makeConj (c1, ctype_returnValue (c2)); + return ctype_makeFunction (ret, uentryList_copy (ctype_getParams (c2))); + } + else + { + if (ctype_isUserBool (c1)) + { + c1 = ctype_bool; + } + + if (ctype_isUserBool (c2)) + { + c2 = ctype_bool; + } + + if (ctbase_isVoidPointer (ctype_getCtbaseSafe (c1))) + { + c1 = ctype_voidPointer; + } + + if (ctbase_isVoidPointer (ctype_getCtbaseSafe (c2))) + { + c2 = ctype_voidPointer; + } + + /* + ** Ouch, can't do this. unsigned, etc. modifiers might + ** apply to wrong type! + ** + ** if (c2 == ctype_int && c1 != ctype_int) + ** { + ** ctype tmp; + ** + ** tmp = c1; + ** c1 = c2; + ** c2 = tmp; + ** } + ** + */ + + if (c1 == ctype_int) + { + if (c2 == ctype_char) + { + if (ic == ctype_unknown) + { + ic = cttable_addComplex (ctbase_makeConj (ctype_int, ctype_char, FALSE)); + } + + return ic; + } + else if (c2 == ctype_bool) + { + if (ib == ctype_unknown) + { + ib = cttable_addComplex + (ctbase_makeConj (ctype_int, ctype_bool, FALSE)); + } + + return ib; + } + else if (c2 == ctype_float) + { + if (ifl == ctype_unknown) + { + ifl = cttable_addComplex (ctbase_makeConj (ctype_int, ctype_float, FALSE)); + } + + return ifl; + } + else + { + if (c2 == ctype_voidPointer) + { + if (iv == ctype_unknown) + { + iv = cttable_addComplex + (ctbase_makeConj (ctype_int, + ctype_voidPointer, + FALSE)); + } + + return iv; + } + } + } + else if (c1 == ib && ib != ctype_unknown) + { + if (c2 == ctype_float) + { + if (ibf == ctype_unknown) + { + ibf = cttable_addComplex (ctbase_makeConj (ib, ctype_float, FALSE)); + } + + return ibf; + } + else if (c2 == ctype_char) + { + if (ibc == ctype_unknown) + { + ibc = cttable_addComplex (ctbase_makeConj (ib, ctype_char, FALSE)); + } + + return ibc; + } + else + { + ; + } + } + else if (c1 == iv) + { + if (c2 == ctype_bool) + { + if (ivb == ctype_unknown) + { + ivb = cttable_addComplex (ctbase_makeConj (c1, c2, FALSE)); + } + + return ivb; + } + else if (c2 == ctype_float) + { + if (ivf == ctype_unknown) + { + ivf = cttable_addComplex (ctbase_makeConj (c1, c2, FALSE)); + } + + return ivf; + } + else + { + ; + } + } + else if (c1 == ivf) + { + if (c2 == ctype_bool) + { + if (ivbf == ctype_unknown) + { + ivbf = cttable_addComplex (ctbase_makeConj (c1, c2, FALSE)); + } + + return ivbf; + } + } + else if (c1 == ivb) + { + if (c2 == ctype_float) + { + if (ivbf == ctype_unknown) + { + ivbf = cttable_addComplex (ctbase_makeConj (c1, c2, FALSE)); + } + + return ivbf; + } + } + else if (c1 == ctype_char) + { + if (c2 == ctype_uchar) + { + if (cuc == ctype_unknown) + { + cuc = cttable_addComplex (ctbase_makeConj (c1, c2, FALSE)); + } + + return cuc; + } + } + else + { + ; + } + + + return (cttable_addComplex (ctbase_makeConj (c1, c2, FALSE))); + } +} + + +bool +ctype_isConj (ctype c) +{ + return (ctype_isComplex (c) && ctbase_isConj (ctype_getCtbase (c))); +} + +static ctype +ctype_getConjA (ctype c) +{ + if (!ctype_isConj (c)) + llbuglit ("ctype_getConjA: not a conj"); + return (ctbase_getConjA (ctype_getCtbaseSafe (c))); +} + +static ctype +ctype_getConjB (ctype c) +{ + if (!ctype_isConj (c)) + llbuglit ("ctype_getConjB: not a conj"); + return (ctbase_getConjB (ctype_getCtbaseSafe (c))); +} + +static bool +ctype_isExplicitConj (ctype c) +{ + return (ctype_isConj (c) && ctbase_isExplicitConj (ctype_getCtbaseSafe (c))); +} + +/** << need to fix resolveConj >> **/ + +/* +** structs and unions +*/ + +ctype +ctype_createStruct (/*@only@*/ cstring n, /*@only@*/ uentryList f) +{ + ctype ct; + + ct = cttable_addComplex (ctbase_createStruct (n, f)); + return (ct); +} + +uentryList +ctype_getFields (ctype c) +{ + return (ctbase_getuentryList (ctype_getCtbaseSafe (c))); +} + +ctype +ctype_createUnion (/*@only@*/ cstring n, /*@only@*/ uentryList f) +{ + ctype ret; + + ret = cttable_addComplex (ctbase_createUnion (n, f)); + return ret; +} + +/* +** matching +** +** if ctype's are same, definite match. +** else, need to call ctbase_match. +** +** if necessary context can memoize matches +*/ + +static bool + quickMatch (ctype c1, ctype c2) +{ + if (c1 == c2) + return TRUE; + + return FALSE; +} + +bool +ctype_genMatch (ctype c1, ctype c2, bool force, bool arg, bool def) +{ + bool match; + + if (quickMatch (c1, c2)) + { + return TRUE; + } + + if (ctype_isElips (c1) || ctype_isElips (c2)) + { + return FALSE; + } + else + { + match = ctbase_genMatch (ctype_getCtbase (c1), ctype_getCtbase (c2), force, arg, def); + return (match); + } +} + +bool +ctype_sameName (ctype c1, ctype c2) +{ + if (quickMatch (c1, c2)) + return TRUE; + else + return (cstring_equal (ctype_unparse (c1), ctype_unparse (c2))); +} + +bool +ctype_almostEqual (ctype c1, ctype c2) +{ + if (ctype_equal (c1, c2)) + { + return TRUE; + } + else + { + return (ctbase_almostEqual (ctype_getCtbase (c1), ctype_getCtbase (c2))); + } +} + +bool +ctype_matchDef (ctype c1, ctype c2) +{ + if (quickMatch (c1, c2)) + return TRUE; + + if (ctype_isElips (c1)) + return (ctype_isElips (c2) || ctype_isUnknown (c2)); + + if (ctype_isElips (c2)) + return (ctype_isUnknown (c2)); + else + { + bool oldrelax = context_getFlag (FLG_RELAXQUALS); + bool res; + + context_setFlagTemp (FLG_RELAXQUALS, FALSE); + res = ctbase_matchDef (ctype_getCtbase (c1), ctype_getCtbase (c2)); + context_setFlagTemp (FLG_RELAXQUALS, oldrelax); + return res; + } +} + +bool ctype_match (ctype c1, ctype c2) +{ + if (quickMatch (c1, c2)) + return TRUE; + + if (ctype_isElips (c1)) + return (ctype_isElips (c2) || ctype_isUnknown (c2)); + + if (ctype_isElips (c2)) + return (ctype_isUnknown (c2)); + + return (ctbase_match (ctype_getCtbase (c1), ctype_getCtbase (c2))); +} + +bool +ctype_forceMatch (ctype c1, ctype c2) +{ + if (quickMatch (c1, c2)) + return TRUE; + + if (ctype_isElips (c1)) + return (ctype_isElips (c2)); + + if (ctype_isElips (c2)) + return FALSE; + + return (ctbase_forceMatch (ctype_getCtbase (c1), ctype_getCtbase (c2))); +} + +bool +ctype_matchArg (ctype c1, ctype c2) +{ + if (quickMatch (c1, c2)) + { + return TRUE; + } + else + { + return (ctbase_matchArg (ctype_getCtbase (c1), ctype_getCtbase (c2))); + } +} + +/* +** simple ctype_is operations. +** DO NOT use real type of c, only direct type. +*/ + +/* +** ctype_isVoidPointer +** +** void * +*/ + +bool +ctype_isVoidPointer (ctype c) +{ + if (ctype_isComplex (c)) + { + return ctbase_isVoidPointer (ctype_getCtbaseSafe (c)); + } + if (ctype_isConj (c)) + { + return (ctype_isVoidPointer (ctype_getConjA (c)) || + ctype_isVoidPointer (ctype_getConjB (c))); + } + else + { + return (c == ctype_voidPointer + || (ctype_isRealPointer (c) + && ctype_isVoid (ctype_baseArrayPtr (c)))); + } +} + +/* +** ctype_isPointer +** +** true for C and LCL pointers +*/ + +bool +ctype_isPointer (ctype c) +{ + if (ctype_isElips (c)) return FALSE; + + if (ctype_isComplex (c)) + { + ctbase ctb = ctype_getCtbaseSafe (c); + bool res = ctbase_isPointer (ctb); + + return res; + } + else + { + bool res = ctentry_isPointer (ctype_getCtentry (c)); + + return res; + } +} + +/* +** ctype_isArray +** +** true for C and LCL array's +*/ + +bool +ctype_isArray (ctype c) +{ + if (ctype_isElips (c)) return FALSE; + + if (ctype_isComplex (c)) + return (ctbase_isEitherArray (ctype_getCtbaseSafe (c))); + else + return (ctentry_isArray (ctype_getCtentry (c))); +} + +bool ctype_isIncompleteArray (ctype c) +{ + return (ctype_isArray (c) && !ctype_isFixedArray (c)); +} + +bool ctype_isFixedArray (ctype c) +{ + if (ctype_isElips (c)) return FALSE; + + return (ctbase_isFixedArray (ctype_getCtbaseSafe (c))); +} + +bool +ctype_isArrayPtr (ctype c) +{ + return ((ctype_isArray (c)) || (ctype_isPointer (c))); +} + +typeId +ctype_typeId (ctype c) +{ + return (ctbase_typeId (ctype_getCtbase (c))); +} + +cstring +ctype_unparseDeclaration (ctype c, /*@only@*/ cstring name) +{ + llassert (!(ctype_isElips (c) || ctype_isMissingParamsMarker (c))); + return (ctbase_unparseDeclaration (ctype_getCtbase (c), name)); +} + +cstring +ctype_unparse (ctype c) +{ + if (ctype_isElips (c)) + { + return cstring_makeLiteralTemp ("..."); + } + else if (ctype_isMissingParamsMarker (c)) + { + return cstring_makeLiteralTemp ("-"); + } + else + { + /*@-modobserver@*/ + return (ctentry_doUnparse (ctype_getCtentry (c))); + /*@=modobserver@*/ + } +} + +cstring +ctype_unparseSafe (ctype c) +{ + if (ctype_isElips (c)) + { + return cstring_makeLiteralTemp ("..."); + } + else if (ctype_isMissingParamsMarker (c)) + { + return cstring_makeLiteralTemp ("-"); + } + else + { + cstring ret; + + if /*@+enumint@*/ (c >= CTK_PLAIN && c < cttab.size) /*@=enumint@*/ + { + ctentry cte = ctype_getCtentry (c); + + if (cstring_isDefined (cte->unparse)) + { + return (cte->unparse); + } + } + + ret = message ("[%d]", (int) c); + cstring_markOwned (ret); + return ret; + } +} + +cstring +ctype_unparseDeep (ctype c) +{ + if (ctype_isElips (c)) + { + return cstring_makeLiteralTemp ("..."); + } + if (ctype_isMissingParamsMarker (c)) + { + return cstring_makeLiteralTemp ("-"); + } + + return (ctentry_doUnparseDeep (ctype_getCtentry (c))); +} + +ctype +ctype_undump (char **c) +{ + return ((ctype) getInt (c)); /* check its valid? */ +} + +cstring +ctype_dump (ctype c) +{ + if (c < 0) + { + /* Handle invalid types in a kludgey way. */ + return (message ("0")); + } + + if (ctype_isUA (c)) + { + cstring tname = usymtab_getTypeEntryName + (usymtab_convertId (ctype_typeId (c))); + + if (cstring_equal (tname, context_getBoolName ())) + { + cstring_free (tname); + return (message ("%d", ctype_bool)); + } + + cstring_free (tname); + } + + return (message ("%d", c)); +} + +ctype +ctype_getBaseType (ctype c) +{ + ctentry cte = ctype_getCtentry (c); + + switch (ctentry_getKind (cte)) + { + case CTK_UNKNOWN: + llcontbuglit ("ctype_getBaseType: unknown ctype"); break; + case CTK_INVALID: + llcontbuglit ("ctype_getBaseType: invalid ctype"); break; + case CTK_PLAIN: + return c; + case CTK_PTR: + case CTK_ARRAY: + return (ctype_getBaseType (ctype_baseArrayPtr (c))); + case CTK_COMPLEX: + { + ctbase ctb = cte->ctbase; + + if (ctbase_isDefined (ctb)) + { + switch (ctb->type) + { + case CT_UNKNOWN: + case CT_PRIM: + case CT_USER: + case CT_ENUM: + case CT_ENUMLIST: + case CT_BOOL: + case CT_ABST: + case CT_FCN: + case CT_STRUCT: + case CT_UNION: + case CT_EXPFCN: + return c; + case CT_PTR: + case CT_ARRAY: + return (ctype_getBaseType (ctb->contents.base)); + case CT_FIXEDARRAY: + return (ctype_getBaseType (ctb->contents.farray->base)); + case CT_CONJ: /* base type of A conj branch? */ + return (ctype_getBaseType (ctb->contents.conj->a)); + } + } + else + { + return c; + } + } + default: + llbuglit ("ctype_newBase: bad case"); + } + llcontbuglit ("ctype_getBaseType: unreachable code"); + return ((ctype)NULL); +} + +ctype +ctype_adjustPointers (int np, ctype c) +{ + + if (ctype_isFunction (c)) + { + c = ctype_makeParamsFunction + (ctype_adjustPointers (np, ctype_returnValue (c)), + uentryList_copy (ctype_argsFunction (c))); + } + else + { + /* fix this should not use getBaseType ??? */ + ctype cb = ctype_getBaseType (c); + + while (np > 0) + { + cb = ctype_makePointer (cb); + np--; + } + c = ctype_newBase (c, cb); + } + + return (c); +} + + +enumNameList +ctype_elist (ctype c) +{ + return (ctbase_elist (ctype_getCtbase (c))); +} + +bool +ctype_isFirstVoid (ctype c) +{ + return (c == CTX_VOID || (ctype_isConj (c) && ctype_isFirstVoid (ctype_getConjA (c)))); +} + +ctype +ctype_createEnum (/*@keep@*/ cstring tag, /*@keep@*/ enumNameList el) +{ + return (cttable_addComplex (ctbase_createEnum (tag, el))); +} + +bool +ctype_isEnum (ctype c) +{ + return (ctype_isComplex (c) && ctbase_isEnum (ctype_getCtbase (c))); +} + +cstring +ctype_enumTag (ctype c) +{ + llassert (ctype_isEnum (c)); + + return (ctbase_enumTag (ctype_getCtbaseSafe (c))); +} + +bool +ctype_isStruct (ctype c) +{ + return (ctype_isComplex (c) && ctbase_isStruct (ctype_getCtbaseSafe (c))); +} + +bool +ctype_isUnion (ctype c) +{ + return (ctype_isComplex (c) && ctbase_isUnion (ctype_getCtbaseSafe (c))); +} + +ctype +ctype_resolveNumerics (ctype c1, ctype c2) +{ + /* + ** returns longest type of c1 and c2 + */ + + if (c1 == c2) return c1; + + c1 = ctype_realType (c1); + c2 = ctype_realType (c2); + + if (ctype_isEnum (c1)) c1 = ctype_unknown; + if (ctype_isEnum (c2)) c2 = ctype_int; + + if (c1 == ctype_ldouble || c2 == ctype_ldouble) return ctype_ldouble; + if (c1 == ctype_ulint || c2 == ctype_ulint) return ctype_ulint; + if (c1 == ctype_lint || c2 == ctype_lint) return ctype_lint; + if (c1 == ctype_uint || c2 == ctype_uint) return ctype_uint; + if (c1 == ctype_int || c2 == ctype_int) return ctype_int; + if (c1 == ctype_sint || c2 == ctype_sint) return ctype_sint; + if (c1 == ctype_uchar || c2 == ctype_uchar) return ctype_uchar; + if (c1 == ctype_char || c2 == ctype_char) return ctype_char; + + if (ctype_isKnown (c1)) return c1; + else return c2; +} + +bool +ctype_isStructorUnion (ctype c) +{ + return (ctype_isStruct (c) || ctype_isUnion (c)); +} + +ctype +ctype_fixArrayPtr (ctype c) +{ + if (ctype_isArray (c)) + { + return (ctype_makePointer (ctype_baseArrayPtr (c))); + } + else + return c; +} + +/* +** createUnnamedStruct/Union +** +** check if it corresponds to an existing LCL-specified unnamed struct +** otherwise, give it a new tag +*/ + +ctype +ctype_createUnnamedStruct (/*@only@*/ uentryList f) +{ + ctype ret = usymtab_structFieldsType (f); + + if (ctype_isDefined (ret)) + { + uentryList_free (f); + return ret; + } + else + { + cstring ft = fakeTag (); + ctype ct = ctype_createStruct (cstring_copy (ft), f); + uentry ue = uentry_makeStructTagLoc (ft, ct); + + usymtab_supGlobalEntry (ue); + + cstring_free (ft); + return (ct); + } +} + +ctype +ctype_createUnnamedUnion (/*@only@*/ uentryList f) +{ + ctype ret = usymtab_unionFieldsType (f); + + if (ctype_isDefined (ret)) + { + uentryList_free (f); + return ret; + } + else + { + cstring ft = fakeTag (); + ctype ct = ctype_createUnion (cstring_copy (ft), f); + uentry ue = uentry_makeUnionTagLoc (ft, ct); + + usymtab_supGlobalEntry (ue); + cstring_free (ft); + return (ct); + } +} + +ctype +ctype_createForwardStruct (cstring n) +{ + uentry ue = uentry_makeStructTag (n, ctype_unknown, fileloc_undefined); + ctype ct = usymtab_supForwardTypeEntry (ue); + + cstring_free (n); + return (ct); +} + +ctype +ctype_createForwardUnion (cstring n) +{ + uentry ue = uentry_makeUnionTag (n, ctype_unknown, fileloc_undefined); + ctype ct = usymtab_supForwardTypeEntry (ue); + + cstring_free (n); + return (ct); +} + +ctype +ctype_removePointers (ctype c) +{ + ctype oldc; + + while (ctype_isArrayPtr (c)) + { + oldc = c; + c = ctype_baseArrayPtr (c); + llassert (c != oldc); + } + + return (c); +} + +bool ctype_isMutable (ctype t) +{ + if (ctype_isUA (t)) + { + return (uentry_isMutableDatatype + (usymtab_getTypeEntry (ctype_typeId (t)))); + } + else + { + return (ctype_isPointer (ctype_realType (t))); + } +} + +bool ctype_isRefCounted (ctype t) +{ + if (ctype_isUA (t)) + { + return (uentry_isRefCountedDatatype + (usymtab_getTypeEntry (ctype_typeId (t)))); + } + + return FALSE; +} + +bool ctype_isVisiblySharable (ctype t) +{ + if (ctype_isUnknown (t)) return TRUE; + + if (ctype_isConj (t)) + { + return (ctype_isVisiblySharable (ctype_getConjA (t)) + || ctype_isVisiblySharable (ctype_getConjB (t))); + } + + if (ctype_isMutable (t)) + { + if (ctype_isUA (t)) + { + ctype rt = ctype_realType (t); + + if (rt == t) + { + return TRUE; + } + else + { + return ctype_isVisiblySharable (rt); + } + } + else + { + return TRUE; + } + } + + return FALSE; +} + +# if 0 +/* Replaced by ctype_isMutable (more sensible) */ +bool ctype_canAlias (ctype ct) +{ + /* can ct refer to memory locations? + ** ==> a pointer or a mutable abstract type + ** arrays? + */ + + ctype tr = ctype_realType (ct); + + return (ctype_isPointer (tr) || ctype_isMutable (ct) || ctype_isStructorUnion (tr)); +} +# endif + +/* +** c1 is the dominant type; c2 is the modifier type +** +** eg. double + long int => long double +*/ + +ctype ctype_combine (ctype dominant, ctype modifier) +{ + DPRINTF (("Combine: %s + %s", + ctype_unparse (dominant), + ctype_unparse (modifier))); + + if (ctype_isConj (dominant)) + { + ctype res; + + if (ctype_isExplicitConj (dominant)) + { + res = ctype_makeExplicitConj (ctype_combine (ctype_getConjA (dominant), + modifier), + ctype_getConjB (dominant)); + } + else + { + res = ctype_makeConj (ctype_combine (ctype_getConjA (dominant), + modifier), + ctype_getConjB (dominant)); + } + + return res; + } + + if (ctype_isUnknown (modifier)) + { + return dominant; + } + else if (ctype_isUnknown (dominant)) + { + return modifier; + } + else + { + if (ctype_isEnum (dominant)) dominant = ctype_int; + if (ctype_isEnum (modifier)) modifier = ctype_int; + + if (modifier == ctype_uint) + { + if (dominant == ctype_int) return ctype_uint; + if (dominant == ctype_lint) return ctype_ulint; + if (dominant == ctype_sint) return ctype_usint; + if (dominant == ctype_char) return ctype_uchar; + if ((dominant == ctype_uint) || dominant == ctype_uchar) + { + voptgenerror (FLG_DUPLICATEQUALS, + message ("Duplicate unsigned qualifier"), + g_currentloc); + + return ctype_uint; + } + else + { + voptgenerror (FLG_DUPLICATEQUALS, + message ("Type qualifier unsigned used with %s", + ctype_unparse (dominant)), + g_currentloc); + + return dominant; + } + } + else if (modifier == ctype_llint) + { + if (dominant == ctype_int) + { + return ctype_llint; + } + + voptgenerror (FLG_DUPLICATEQUALS, + message ("Duplicate long qualifier on non-int"), + g_currentloc); + } + else if (modifier == ctype_lint) + { + if (dominant == ctype_int) return ctype_lint; + if (dominant == ctype_uint) return ctype_ulint; + if (dominant == ctype_double) return ctype_ldouble; + + if (dominant == ctype_lint || dominant == ctype_ulint + || dominant == ctype_sint || dominant == ctype_usint + || dominant == ctype_ldouble) + { + if (dominant == ctype_lint) + { + /* long long not supported by ANSI */ + return ctype_llint; + } + + if (dominant == ctype_sint || dominant == ctype_usint) + { + if (!context_getFlag (FLG_IGNOREQUALS)) + { + llerrorlit (FLG_SYNTAX, + "Contradictory long and short type qualifiers"); + } + } + else + { + voptgenerror (FLG_DUPLICATEQUALS, + message ("Duplicate long qualifier"), + g_currentloc); + } + + return ctype_lint; + } + } + else if (modifier == ctype_sint) + { + if (dominant == ctype_int) return ctype_sint; + if (dominant == ctype_uint) return ctype_usint; + + if (dominant == ctype_sint || dominant == ctype_usint) + { + voptgenerror (FLG_DUPLICATEQUALS, + message ("Duplicate short qualifier"), + g_currentloc); + return ctype_uint; + } + else if (dominant == ctype_lint) + { + if (!context_getFlag (FLG_IGNOREQUALS)) + { + llerrorlit (FLG_SYNTAX, + "Contradictory long and short type qualifiers"); + } + + return dominant; + } + else + { + if (!context_getFlag (FLG_IGNOREQUALS)) + { + llerror (FLG_SYNTAX, + message ("Type qualifier short used with %s", + ctype_unparse (dominant))); + } + + return dominant; + } + } + else if (modifier == ctype_ulint) + { + if (dominant == ctype_int) return modifier; + + if (dominant == ctype_lint || dominant == ctype_ulint) + { + voptgenerror (FLG_DUPLICATEQUALS, + message ("Duplicate long qualifier"), + g_currentloc); + + return modifier; + } + + if (dominant == ctype_uint || dominant == ctype_usint) + { + voptgenerror (FLG_DUPLICATEQUALS, + message ("Duplicate unsigned qualifier"), + g_currentloc); + + return modifier; + } + + if (dominant == ctype_sint || dominant == ctype_usint) + { + if (!context_getFlag (FLG_IGNOREQUALS)) + { + llerrorlit (FLG_SYNTAX, + "Contradictory long and short type qualifiers"); + } + + return dominant; + } + + if (!context_getFlag (FLG_IGNOREQUALS)) + { + llerror (FLG_SYNTAX, + message ("Type qualifiers unsigned long used with %s", + ctype_unparse (dominant))); + } + + return dominant; + } + else if (modifier == ctype_usint) + { + if (dominant == ctype_int) return modifier; + + if (dominant == ctype_sint || dominant == ctype_usint) + { + voptgenerror (FLG_DUPLICATEQUALS, + message ("Duplicate short qualifier"), + g_currentloc); + return modifier; + } + + if (dominant == ctype_uint) + { + voptgenerror (FLG_DUPLICATEQUALS, + message ("Duplicate unsigned qualifier"), + g_currentloc); + + return modifier; + } + + if (dominant == ctype_lint || dominant == ctype_ulint + || dominant == ctype_llint) + { + if (!context_getFlag (FLG_IGNOREQUALS)) + { + llerrorlit (FLG_SYNTAX, + "Contradictory long and short type qualifiers"); + } + + return dominant; + } + + if (!context_getFlag (FLG_IGNOREQUALS)) + { + llerror (FLG_SYNTAX, + message ("Type qualifiers unsigned short used with %s", + ctype_unparse (dominant))); + } + + return dominant; + } + else + { + ; + } + + return dominant; + } +} + +ctype ctype_resolve (ctype c) +{ + if (ctype_isUnknown (c)) return ctype_int; + return c; +} + +ctype ctype_fromQual (qual q) +{ + if (qual_isSigned (q)) return ctype_int; + if (qual_isUnsigned (q)) return ctype_uint; + if (qual_isLong (q)) return ctype_lint; + if (qual_isShort (q)) return ctype_sint; + + llcontbug (message ("ctype_fromQual: invalid qualifier: %s", qual_unparse (q))); + return ctype_unknown; +} + +bool +ctype_isAnyFloat (ctype c) +{ + return (cprim_isAnyReal (ctype_toCprim (c))); +} + +bool +ctype_isUnsigned (ctype c) +{ + if (ctype_isConj (c)) + return (ctype_isUnsigned (ctype_getConjA (c)) || + ctype_isUnsigned (ctype_getConjB (c))); + + return (c == ctype_uint || c == ctype_uchar + || c == ctype_usint || c == ctype_ulint + || c == ctype_unsignedintegral); +} + +static bool +ctype_isLong (ctype c) +{ + if (ctype_isConj (c)) + return (ctype_isLong (ctype_getConjA (c)) || + ctype_isLong (ctype_getConjB (c))); + + return (c == ctype_lint || c == ctype_ulint); +} + +static bool +ctype_isShort (ctype c) +{ + if (ctype_isConj (c)) + return (ctype_isShort (ctype_getConjA (c)) || + ctype_isShort (ctype_getConjB (c))); + + return (c == ctype_sint || c == ctype_usint); +} + +bool +ctype_isStackAllocated (ctype c) +{ + ctype ct = ctype_realType (c); + + if (ctype_isConj (ct)) + return (ctype_isStackAllocated (ctype_getConjA (ct)) || + ctype_isStackAllocated (ctype_getConjB (ct))); + + return (ctype_isArray (c) || ctype_isSU (c)); +} + +static bool ctype_isMoreUnsigned (ctype c1, ctype c2) +{ + return (ctype_isUnsigned (c1) && !ctype_isUnsigned (c2)); +} + +static bool ctype_isLonger (ctype c1, ctype c2) +{ + return ((ctype_isDouble (c1) && !ctype_isDouble (c2)) + || (ctype_isLong (c1) && !ctype_isLong (c2)) + || (ctype_isShort (c2) && !ctype_isShort (c1))); +} + +ctype +ctype_widest (ctype c1, ctype c2) +{ + if (ctype_isMoreUnsigned (c2, c1) + || ctype_isLonger (c2, c1)) + { + return c2; + } + else + { + return c1; + } +} diff --git a/src/ctypeList.c b/src/ctypeList.c new file mode 100644 index 0000000..c5fab28 --- /dev/null +++ b/src/ctypeList.c @@ -0,0 +1,131 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** ctypeList.c +** +** based on list_template.c +** +** where T has T_equal (or change this) and T_unparse +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +/*@only@*/ ctypeList +ctypeList_new () +{ + ctypeList s = (ctypeList) dmalloc (sizeof (*s)); + + s->nelements = 0; + s->nspace = ctypeListBASESIZE; + s->elements = (ctype *) dmalloc (sizeof (*s->elements) * ctypeListBASESIZE); + + return (s); +} + +static void +ctypeList_grow (/*@notnull@*/ ctypeList s) +{ + int i; + ctype *newelements; + + s->nspace += ctypeListBASESIZE; + newelements = (ctype *) dmalloc (sizeof (*newelements) * (s->nelements + s->nspace)); + + if (newelements == (ctype *) 0) + { + llfatalerror (cstring_makeLiteral ("ctypeList_grow: out of memory!")); + } + + for (i = 0; i < s->nelements; i++) + { + newelements[i] = s->elements[i]; + } + + sfree (s->elements); + s->elements = newelements; +} + +void ctypeList_addh (ctypeList s, ctype el) +{ + llassert (ctypeList_isDefined (s)); + llassert (ctypeListBASESIZE > 0); + + if (s->nspace <= 0) ctypeList_grow (s); + + s->nspace--; + s->elements[s->nelements] = el; + s->nelements++; +} + +/*@only@*/ cstring +ctypeList_unparse (ctypeList ct) +{ + cstring s = cstring_undefined; + int i; + bool first = TRUE; + + if (ctypeList_isUndefined (ct) || ctypeList_size (ct) == 0) + { + return (cstring_makeLiteral ("void")); + } + + for (i = 0; i < ct->nelements; i++) + { + if (first) + { + s = cstring_copy (ctype_unparse (ct->elements[i])); + first = FALSE; + } + else + { + s = message ("%q, %s", s, ctype_unparse (ct->elements[i])); + } + } + + return s; +} + +void +ctypeList_free (/*@only@*/ ctypeList s) +{ + if (ctypeList_isDefined (s)) + { + int i; + for (i = 0; i < s->nelements; i++) + { + /* ctype_free (s->elements[i]); */ + } + + sfree (s->elements); /* not quite!!! */ + sfree (s); + } +} + + + + + + + diff --git a/src/cvar.c b/src/cvar.c new file mode 100644 index 0000000..107d238 --- /dev/null +++ b/src/cvar.c @@ -0,0 +1,31 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** cvar.c +*/ + +# include "lclintMacros.nf" +# include "basic.h" +# include "cvar.h" + diff --git a/src/declaratorInvNodeList.c b/src/declaratorInvNodeList.c new file mode 100644 index 0000000..64cc2d7 --- /dev/null +++ b/src/declaratorInvNodeList.c @@ -0,0 +1,114 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** declaratorInvNodeList.c +** +** based on list_template.c +** +** where T has T_equal (or change this) and T_unparse +*/ + +# include "lclintMacros.nf" +# include "llbasic.h" + +declaratorInvNodeList + declaratorInvNodeList_new () +{ + declaratorInvNodeList s = (declaratorInvNodeList) dmalloc (sizeof (*s)); + + s->nelements = 0; + + s->nspace = declaratorInvNodeListBASESIZE; + s->elements = (declaratorInvNode *) + dmalloc (sizeof (*s->elements) * declaratorInvNodeListBASESIZE); + + return (s); +} + +static void +declaratorInvNodeList_grow (declaratorInvNodeList s) +{ + int i; + declaratorInvNode *newelements; + + s->nspace = declaratorInvNodeListBASESIZE + s->nspace; + + newelements = (declaratorInvNode *) + dmalloc (sizeof (*newelements) * (s->nelements + s->nspace)); + + if (newelements == (declaratorInvNode *) 0) + { + llfatalerror (cstring_makeLiteral ("declaratorInvNodeList_grow: out of memory!")); + } + + for (i = 0; i < s->nelements; i++) + { + newelements[i] = s->elements[i]; + } + + sfree (s->elements); + s->elements = newelements; +} + +declaratorInvNodeList +declaratorInvNodeList_add (declaratorInvNodeList s, declaratorInvNode el) +{ + if (s->nspace <= 0) + { + declaratorInvNodeList_grow (s); + } + + s->nspace--; + s->elements[s->nelements] = el; + s->nelements++; + + return s; +} + +/*@only@*/ cstring +declaratorInvNodeList_unparse (declaratorInvNodeList s) +{ + int i; + cstring st = cstring_undefined; + + for (i = 0; i < s->nelements; i++) + { + st = message ("%q%q", st, declaratorInvNode_unparse (s->elements[i])); + } + + return st; +} + +void +declaratorInvNodeList_free (declaratorInvNodeList s) +{ + int i; + for (i = 0; i < s->nelements; i++) + { + declaratorInvNode_free (s->elements[i]); + } + + sfree (s->elements); + sfree (s); +} diff --git a/src/declaratorNodeList.c b/src/declaratorNodeList.c new file mode 100644 index 0000000..118f132 --- /dev/null +++ b/src/declaratorNodeList.c @@ -0,0 +1,130 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** declaratorNodeList.c +** +** based on list_template.c +** +** where T has T_equal (or change this) and T_unparse +*/ + +# include "lclintMacros.nf" +# include "llbasic.h" + +declaratorNodeList + declaratorNodeList_new () +{ + declaratorNodeList s = (declaratorNodeList) dmalloc (sizeof (*s)); + + s->nelements = 0; + s->nspace = declaratorNodeListBASESIZE; + s->elements = (declaratorNode *) + dmalloc (sizeof (*s->elements) * declaratorNodeListBASESIZE); + + return (s); +} + +static void +declaratorNodeList_grow (declaratorNodeList s) +{ + int i; + declaratorNode *newelements; + + s->nspace = declaratorNodeListBASESIZE + s->nspace; + newelements = (declaratorNode *) dmalloc (sizeof (*newelements) * (s->nelements + s->nspace)); + + if (newelements == (declaratorNode *) 0) + { + llfatalerror (cstring_makeLiteral ("declaratorNodeList_grow: out of memory!")); + } + + for (i = 0; i < s->nelements; i++) + { + newelements[i] = s->elements[i]; + } + + sfree (s->elements); + s->elements = newelements; +} + +declaratorNodeList +declaratorNodeList_add (declaratorNodeList s, declaratorNode el) +{ + if (s->nspace <= 0) + declaratorNodeList_grow (s); + + s->nspace--; + s->elements[s->nelements] = el; + s->nelements++; + + return s; +} + +/*@only@*/ cstring +declaratorNodeList_unparse (declaratorNodeList s) +{ + cstring st = cstring_undefined; + bool first = TRUE; + + declaratorNodeList_elements (s, current) + { + if (first) + { + st = declaratorNode_unparse (current); + first = FALSE; + } + else + { + st = message ("%q, %q", st, declaratorNode_unparse (current)); + } + } end_declaratorNodeList_elements; + + return st; +} + +declaratorNodeList +declaratorNodeList_copy (declaratorNodeList s) +{ + declaratorNodeList ret = declaratorNodeList_new (); + + declaratorNodeList_elements (s, el) + { + ret = declaratorNodeList_add (ret, declaratorNode_copy (el)); + } end_declaratorNodeList_elements ; + + return ret; +} + +void +declaratorNodeList_free (declaratorNodeList s) +{ + int i; + for (i = 0; i < s->nelements; i++) + { + declaratorNode_free (s->elements[i]); + } + + sfree (s->elements); + sfree (s); +} diff --git a/src/dummy.c b/src/dummy.c new file mode 100644 index 0000000..15abc35 --- /dev/null +++ b/src/dummy.c @@ -0,0 +1,3 @@ +# include "lclintMacros.nf" +# include "llbasic.h" +# include "gram.h" diff --git a/src/ekind.c b/src/ekind.c new file mode 100644 index 0000000..af5b6cf --- /dev/null +++ b/src/ekind.c @@ -0,0 +1,106 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** ekind.c +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +ekind +ekind_fromInt (int i) +{ + if /*@+enumint@*/ (i < KINVALID || i > KELAST) /*@=enumint@*/ + { + llcontbug (message ("ekind_fromInt: invalid: %d", i)); + return KINVALID; + } + + return (ekind)i; +} + +cstring ekind_unparse (ekind k) +{ + switch (k) + { + case KENUMCONST: return cstring_makeLiteralTemp ("ect"); + case KCONST: return cstring_makeLiteralTemp ("cst"); + case KVAR: return cstring_makeLiteralTemp ("var"); + case KITER: return cstring_makeLiteralTemp ("itr"); + case KENDITER: return cstring_makeLiteralTemp ("etr"); + case KDATATYPE: return cstring_makeLiteralTemp ("dtp"); + case KFCN: return cstring_makeLiteralTemp ("fcn"); + case KSTRUCTTAG: return cstring_makeLiteralTemp ("stg"); + case KUNIONTAG: return cstring_makeLiteralTemp ("utg"); + case KENUMTAG: return cstring_makeLiteralTemp ("etg"); + case KELIPSMARKER: return cstring_makeLiteralTemp ("eps"); + case KINVALID: return cstring_makeLiteralTemp ("[invalid]"); + } + + BADEXIT; +} + +cstring ekind_unparseLong (ekind k) +{ + switch (k) + { + case KCONST: return cstring_makeLiteralTemp ("constant"); + case KENUMCONST: return cstring_makeLiteralTemp ("enum member"); + case KVAR: return cstring_makeLiteralTemp ("variable"); + case KITER: return cstring_makeLiteralTemp ("iterator"); + case KENDITER: return cstring_makeLiteralTemp ("iterator finalizer"); + case KDATATYPE: return cstring_makeLiteralTemp ("datatype"); + case KFCN: return cstring_makeLiteralTemp ("function"); + case KSTRUCTTAG: return cstring_makeLiteralTemp ("struct tag"); + case KUNIONTAG: return cstring_makeLiteralTemp ("union tag"); + case KENUMTAG: return cstring_makeLiteralTemp ("enum tag"); + case KELIPSMARKER: return cstring_makeLiteralTemp ("..."); + case KINVALID: return cstring_makeLiteralTemp ("[invalid]"); + } + + BADEXIT; +} + +cstring +ekind_capName (ekind k) +{ + switch (k) + { + case KCONST: return cstring_makeLiteralTemp ("Constant"); + case KENUMCONST: return cstring_makeLiteralTemp ("Enum member"); + case KVAR: return cstring_makeLiteralTemp ("Variable"); + case KITER: return cstring_makeLiteralTemp ("Iterator"); + case KENDITER: return cstring_makeLiteralTemp ("Iterator finalizer"); + case KDATATYPE: return cstring_makeLiteralTemp ("Datatype"); + case KFCN: return cstring_makeLiteralTemp ("Function"); + case KSTRUCTTAG: return cstring_makeLiteralTemp ("Struct tag"); + case KUNIONTAG: return cstring_makeLiteralTemp ("Union tag"); + case KENUMTAG: return cstring_makeLiteralTemp ("Enum tag"); + case KELIPSMARKER: return cstring_makeLiteralTemp ("..."); + case KINVALID: return cstring_makeLiteralTemp ("[invalid]"); + } + + BADEXIT; +} + diff --git a/src/enumNameList.c b/src/enumNameList.c new file mode 100644 index 0000000..9a45d09 --- /dev/null +++ b/src/enumNameList.c @@ -0,0 +1,275 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** enumNameList.c +** +** based on list_template.c +** +** where T has T_equal (or change this) and T_unparse +** +** used to be cenum.c +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +enumNameList + enumNameList_new () +{ + enumNameList s = (enumNameList) dmalloc (sizeof (*s)); + + s->nelements = 0; + s->nspace = enumNameListBASESIZE; + s->elements = (enumName *) + dmalloc (sizeof (*s->elements) * enumNameListBASESIZE); + + return (s); +} + +/*@only@*/ enumNameList +enumNameList_single (/*@keep@*/ enumName t) +{ + enumNameList s = (enumNameList) dmalloc (sizeof (*s)); + + s->nelements = 1; + s->nspace = enumNameListBASESIZE - 1; + s->elements = (enumName *) dmalloc (sizeof (*s->elements) * enumNameListBASESIZE); + s->elements[0] = t; + + return (s); +} + +bool +enumNameList_match (enumNameList e1, enumNameList e2) +{ + int i; + + if (e1->nelements != e2->nelements) return FALSE; + + for (i = 0; i < e1->nelements; i++) + { + if (!cstring_equal (e1->elements[i], e2->elements[i])) + return FALSE; + } + return TRUE; +} + +static void +enumNameList_grow (enumNameList s) +{ + int i; + enumName *newelements; + + s->nspace += enumNameListBASESIZE; + newelements = (enumName *) dmalloc (sizeof (*newelements) * (s->nelements + s->nspace)); + + if (newelements == (enumName *) 0) + { + llfatalerror (cstring_makeLiteral ("enumNameList_grow: out of memory!")); + } + + for (i = 0; i < s->nelements; i++) + { + newelements[i] = s->elements[i]; + } + + sfree (s->elements); + s->elements = newelements; +} + +void +enumNameList_addh (enumNameList s, /*@keep@*/ enumName el) +{ + if (s->nspace <= 0) + enumNameList_grow (s); + + s->nspace--; + s->elements[s->nelements] = el; + s->nelements++; +} + +enumNameList +enumNameList_push (/*@returned@*/ enumNameList s, /*@only@*/ enumName el) +{ + enumNameList_addh (s, el); + return s; +} + +/*@only@*/ enumNameList +enumNameList_copy (enumNameList s) +{ + enumNameList r = enumNameList_new (); + + enumNameList_elements (s, x) + { + enumNameList_addh (r, cstring_copy (x)); + } end_enumNameList_elements; + + return r; +} + +bool +enumNameList_member (enumNameList s, cstring m) +{ + enumNameList_elements (s, x) + { + if (cstring_equal (m, x)) return TRUE; + } end_enumNameList_elements; + + return FALSE; +} + +/*@only@*/ enumNameList +enumNameList_subtract (enumNameList source, enumNameList del) +{ + enumNameList ret = enumNameList_new (); + + enumNameList_elements (source, el) + { + if (!enumNameList_member (del, el)) + { + enumNameList_addh (ret, cstring_copy (el)); + } + } end_enumNameList_elements; + + return ret; +} + +cstring +enumNameList_unparse (enumNameList s) +{ + int i; + cstring st = cstring_undefined; + + for (i = 0; i < s->nelements; i++) + { + if (i == 0) + { + st = cstring_copy (s->elements[i]); + } + else + { + st = message ("%q, %s", st, s->elements[i]); + } + } + + return st; +} + +cstring enumNameList_unparseBrief (enumNameList s) +{ + int i; + cstring st = cstring_undefined; + + for (i = 0; i < s->nelements; i++) + { + if (i == 0) + { + st = cstring_copy (s->elements[i]); + } + else if (i == 3 && s->nelements > 5) + { + st = message ("%q, ...", st); + i = s->nelements - 2; + } + else + { + st = message ("%q, %s", st, s->elements[i]); + } + } + + return st; +} + +/*@only@*/ cstring +enumNameList_dump (enumNameList s) +{ + int i; + cstring st = cstring_undefined; + + for (i = 0; i < s->nelements; i++) + { + if (i == 0) + { + st = cstring_copy (s->elements[i]); + } + else + st = message ("%q,%s", st, s->elements[i]); + } + return st; +} + +/*@only@*/ enumNameList +enumNameList_undump (d_char *s) +{ + enumNameList e = enumNameList_new (); + + if (**s == '}') + (*s)++; + else + { + while (TRUE) + { + char *t = strchr (*s, ','); + char mt; + + if (t == NULL) + { + t = strchr (*s, '}'); + + if (t == NULL) + { + llcontbug (message ("enumNameList_undump: bad line: %s", cstring_fromChars (*s))); + return e; + } + } + + mt = *t; + *t = '\0'; + + enumNameList_addh (e, cstring_fromChars (mstring_copy (*s))); + *s = t + 1; + if (mt == '}') + break; + } + } + return e; +} + +void +enumNameList_free (enumNameList s) +{ + int i; + + + for (i = 0; i < s->nelements; i++) + { + cstring_free (s->elements[i]); + } + + sfree (s->elements); + sfree (s); +} + + diff --git a/src/enumNameSList.c b/src/enumNameSList.c new file mode 100644 index 0000000..6edd020 --- /dev/null +++ b/src/enumNameSList.c @@ -0,0 +1,45 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** enumNameList.c +** +** based on list_template.c +** +** where T has T_equal (or change this) and T_unparse +** +** used to be cenum.c +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +/*@access enumNameList@*/ + +void +enumNameSList_free (enumNameSList s) +{ + sfree (s->elements); + sfree (s); +} + diff --git a/src/exprChecks.c b/src/exprChecks.c new file mode 100644 index 0000000..cbeeef8 --- /dev/null +++ b/src/exprChecks.c @@ -0,0 +1,1357 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** exprChecks.c +*/ + +# include "lclintMacros.nf" +# include "basic.h" +# include "cgrammar.h" +# include "cgrammar_tokens.h" +# include "aliasChecks.h" +# include "exprChecks.h" + +/* +** for now, allow exprChecks to access exprNode. +** may remove this in future +*/ + +/*@access exprNode@*/ + +static bool checkCallModifyAux (sRef p_s, exprNode p_f, sRef p_alias, exprNode p_err); +static bool checkModifyValAux (sRef p_s, exprNode p_f, sRef p_alias, exprNode p_err); +static bool checkModifyAux (sRef p_s, exprNode p_f, sRef p_alias, exprNode p_err); +static void checkSafeReturnExpr (/*@notnull@*/ exprNode p_e); + +/* +** called at end of expression statement +** +** of e->kind is not an assign, empty, body or modop +** verify the the value is void +** +*/ + +void +exprNode_checkStatement (exprNode e) +{ + bool hasError = FALSE; + + if (!exprNode_isError (e)) + { + exprKind ek = e->kind; + + if (ek == XPR_CALL && !(ctype_isRealVoid (e->typ))) + { + if (ctype_isKnown (e->typ)) + { + if (ctype_isBool (ctype_realishType (e->typ))) + { + hasError = optgenerror + (FLG_RETVALBOOL, + message ("Return value (type %t) ignored: %s", + e->typ, + exprNode_unparseFirst (e)), + e->loc); + } + else if (ctype_isDirectInt (e->typ)) + { + hasError = optgenerror + (FLG_RETVALINT, + message ("Return value (type %t) ignored: %s", + e->typ, + exprNode_unparseFirst (e)), + e->loc); + } + else + { + hasError = optgenerror + (FLG_RETVALOTHER, + message ("Return value (type %t) ignored: %s", + e->typ, + exprNode_unparseFirst (e)), + e->loc); + } + } + } + + if (!hasError && !(exprNode_mayEscape (e)) + && !(e->canBreak)) /* control changes are effects too! */ + { + if (sRefSet_hasRealElement (e->sets) + || sRefSet_hasRealElement (e->msets)) + { + ; /* okay */ + } + else + { + if (sRefSet_isEmpty (e->sets) && sRefSet_isEmpty (e->msets)) + { + voptgenerror + (FLG_NOEFFECT, + message ("Statement has no effect: %s", + exprNode_unparseFirst (e)), + e->loc); + } + else + { + if (context_maybeSet (FLG_NOEFFECTUNCON)) + { + if (sRefSet_hasUnconstrained (e->sets)) + { + voptgenerror + (FLG_NOEFFECTUNCON, + message ("Statement has no effect (possible " + "undected modification through " + "call to %q): %s", + sRefSet_unparseUnconstrained (e->sets), + exprNode_unparseFirst (e)), + e->loc); + } + else if (sRefSet_hasUnconstrained (e->msets)) + { + voptgenerror + (FLG_NOEFFECTUNCON, + message ("Statement has no effect (possible " + "undected modification through " + "call to %q): %s", + sRefSet_unparseUnconstrained (e->msets), + exprNode_unparseFirst (e)), + e->loc); + } + else + { + ; /* statement has unknown modification */ + } + } + } + } + } + } +} + +static bool +checkRepExposed (sRef base, /*@notnull@*/ exprNode e, sRef alias, + /*@unused@*/ exprNode unused) +{ + ctype btype; + + if (sRef_isInvalid (alias) || sRef_sameName (base, alias)) + { + btype = sRef_getType (base); + + if (ctype_isAbstract (btype) && ctype_isVisiblySharable (e->typ)) + { + voptgenerror (FLG_RETEXPOSE, + message ("Return value exposes rep of %s: %s", + ctype_unparse (btype), + exprNode_unparse (e)), + e->loc); + return TRUE; + } + } + else + { + sRef rbase = sRef_getRootBase (base); + btype = sRef_getType (rbase); + + if (ctype_isAbstract (btype) && ctype_isVisiblySharable (e->typ)) + { + voptgenerror + (FLG_RETEXPOSE, + message ("Return value may expose rep of %s through alias %q: %s", + ctype_unparse (btype), + sRef_unparse (rbase), + exprNode_unparse (e)), + e->loc); + return TRUE; + } + } + + return FALSE; +} + +static bool +checkRefGlobParam (sRef base, /*@notnull@*/ exprNode e, + sRef alias, /*@unused@*/ exprNode unused) +{ + if (sRef_isInvalid (alias) || sRef_sameName (base, alias)) + { + ctype ct = e->typ; + + if (ctype_isUnknown (ct)) + { + ct = sRef_getType (base); + } + + if (ctype_isVisiblySharable (ct)) + { + if (sRef_isGlobal (base)) + { + voptgenerror + (FLG_RETALIAS, + message ("Function returns reference to global %q: %s", + sRef_unparse (base), + exprNode_unparse (e)), + e->loc); + + return TRUE; + } + else if (sRef_isAnyParam (base)) + { + uentryList params = context_getParams (); + int paramno = sRef_getParam (base); + + if (paramno < uentryList_size (params)) + { + uentry arg = uentryList_getN (params, paramno); + sRef ref = uentry_getSref (arg); + + if (uentry_isReturned (arg) + || sRef_isOnly (ref) + || sRef_isExposed (ref) + || sRef_isRefCounted (ref)) + { + ; /* okay */ + } + else + { + voptgenerror + (FLG_RETALIAS, + message ("Function returns reference to parameter %q: %s", + sRef_unparse (base), + exprNode_unparse (e)), + e->loc); + } + } + else + { + llbuglit ("ret alias: bad paramno"); + } + + return TRUE; + } + else + { + return FALSE; + } + } + } + else + { + if (ctype_isVisiblySharable (e->typ)) + { + if (sRef_isGlobal (base)) + { + voptgenerror + (FLG_RETALIAS, + message ("Function may return reference to global %q through alias %q: %s", + sRef_unparse (alias), + sRef_unparse (base), + exprNode_unparse (e)), + e->loc); + return TRUE; + } + else if (sRef_isAnyParam (base) && !(sRef_isOnly (base))) + { + uentryList params = context_getParams (); + int paramno = sRef_getParam (base); + + if (paramno < uentryList_size (params)) + { + uentry arg = uentryList_getN (params, paramno); + + if (!uentry_isReturned (arg)) + { + voptgenerror + (FLG_RETALIAS, + message + ("Function may return reference to parameter %q through alias %q: %s", + sRef_unparse (base), + sRef_unparse (alias), + exprNode_unparse (e)), + e->loc); + + return TRUE; + } + } + else + { + voptgenerror + (FLG_RETALIAS, + message + ("Function may return reference to parameter %q through alias %q: %s", + sRef_unparse (base), + sRef_unparse (alias), + exprNode_unparse (e)), + e->loc); + + return TRUE; + } + } + else + { + return FALSE; + } + } + } + return FALSE; +} + + +void +exprNode_checkModify (exprNode e, exprNode err) +{ + llassert (exprNode_isDefined (e)); + + DPRINTF (("Check modify: %s", exprNode_unparse (e))); + + if (sRef_isValid (e->sref)) + { + sRef_aliasCheckPred (checkModifyAux, sRef_isReference, e->sref, e, err); + } +} + +void +exprNode_checkModifyVal (exprNode e, exprNode err) +{ + llassert (exprNode_isDefined (e)); + + DPRINTF (("Check modify val: %s", exprNode_unparse (e))); + + if (sRef_isValid (e->sref)) + { + sRef_aliasCheckPred (checkModifyValAux, sRef_isReference, e->sref, e, err); + } +} + +void +exprChecks_checkNullReturn (fileloc loc) +{ + if (!context_inRealFunction ()) + { + /* + llmsg ("exprChecks_checkNullReturnExpr: not in function context"); + */ + return; + } + else + { + if (ctype_isFunction (context_currentFunctionType ())) + { + ctype tr = ctype_returnValue (context_currentFunctionType ()); + + if (!ctype_isFirstVoid (tr)) + { + if (ctype_isUnknown (tr)) + { + voptgenerror + (FLG_CONTROL, + cstring_makeLiteral ("Empty return in function declared to implicitly return int"), + loc); + } + else + { + voptgenerror (FLG_CONTROL, + message ("Empty return in function declared to return %t", tr), + loc); + } + } + } + } +} + +void +exprNode_checkReturn (exprNode e) +{ + if (!exprNode_isError (e)) + { + if (!context_inRealFunction ()) + { + if (context_inMacro ()) + { + llerror (FLG_CONTROL, + message ("Macro %s uses return (not functional)", + context_inFunctionName ())); + } + else + { + /* + llbuglit ("exprNode_checkReturn: not in function context"); + */ + } + } + else + { + if (ctype_isFunction (context_currentFunctionType ())) + { + checkSafeReturnExpr (e); + } + else + { + ; + } + } + } +} + +void +exprNode_checkPred (cstring c, exprNode e) +{ + ctype ct; + + if (exprNode_isError (e)) + return; + + ct = exprNode_getType (e); + + if (exprNode_isAssign (e)) + { + voptgenerror + (FLG_PREDASSIGN, + message ("Test expression for %s is assignment expression: %s", + c, exprNode_unparse (e)), + e->loc); + } + + if (ctype_isRealBool (ct)) + { + ; + } + else if (ctype_isRealPointer (ct)) + { + voptgenerror + (FLG_PREDBOOLPTR, + message ("Test expression for %s not %s, type %t: %s", c, + context_printBoolName (), + ct, exprNode_unparse (e)), + e->loc); + } + else if (ctype_isRealInt (ct)) + { + voptgenerror + (FLG_PREDBOOLINT, + message ("Test expression for %s not %s, type %t: %s", c, + context_printBoolName (), ct, exprNode_unparse (e)), + e->loc); + } + else + { + voptgenerror + (FLG_PREDBOOLOTHERS, + message ("Test expression for %s not %s, type %t: %s", c, + context_printBoolName (), ct, exprNode_unparse (e)), + e->loc); + } +} + +void +exprChecks_checkUsedGlobs (globSet decl, globSet used) +{ + fileloc fl = uentry_whereSpecified (context_getHeader ()); + + if (fileloc_isUndefined (fl)) + { + fl = uentry_whereDeclared (context_getHeader ()); + } + + globSet_allElements (decl, el) + { + if (!globSet_member (used, el)) + { + if (sRef_isSpecInternalState (el) + || sRef_isNothing (el)) + { + ; + } + else + { + cstring sname = sRef_unparse (el); + + if (fileloc_isLib (fl)) + { + voptgenerror (FLG_USEALLGLOBS, + message ("Global %s listed (%q) but not used", + sname, fileloc_unparse (fl)), + g_currentloc); + } + else + { + voptgenerror (FLG_USEALLGLOBS, + message ("Global %s listed but not used", sname), + fl); + } + + cstring_free (sname); + } + } + } end_globSet_allElements; +} + +void +exprNode_checkAllMods (sRefSet mods, uentry ue) +{ + bool realParams = FALSE; + uentry le = context_getHeader (); + fileloc fl = uentry_whereSpecified (le); + uentryList specParamNames = uentryList_undefined; + uentryList paramNames = context_getParams (); + + if (uentry_isFunction (le)) + { + specParamNames = uentry_getParams (le); + + if (uentryList_isUndefined (specParamNames)) + { + ; /* unknown params */ + } + else if (uentryList_size (paramNames) != uentryList_size (specParamNames)) + { + llbug + (message ("exprNode_checkAllMods: parameter lists have different sizes: " + "%q (%d) / %q (%d)", + uentryList_unparse (paramNames), + uentryList_size (paramNames), + uentryList_unparse (specParamNames), + uentryList_size (specParamNames))); + } + else if (uentryList_size (paramNames) > 0 + && !uentry_hasRealName (uentryList_getN (specParamNames, 0))) + { + /* loaded from a library */ + } + else + { + realParams = TRUE; + } + } + + sRefSet_allElements (mods, sr) + { + if (sRef_isNothing (sr) || sRef_isSpecState (sr)) + { + ; /* should report on anything? */ + } + else if (sRef_isInternalState (sr)) + { + if (!sRef_isModified (sr)) + { + if (sRefSet_hasStatic (mods)) + { + ; /* okay */ + } + else + { + if (optgenerror + (FLG_MUSTMOD, + message + ("Function %s specified to modify internal state " + "but no internal state is modified", + uentry_rawName (ue)), + uentry_whereLast (ue))) + { + uentry_showWhereSpecified (le); + } + } + } + } + else + { + if (!sRef_isModified (sr)) + { + cstring sname = realParams ? sRef_unparse (sr) : sRef_unparse (sr); + + if (fileloc_isLib (fl) && !realParams) + { + voptgenerror + (FLG_MUSTMOD, + message ("Suspect object listed (%q) in modifies " + "clause of %s not modified: %s", + fileloc_unparse (fl), + uentry_rawName (ue), + sname), + uentry_whereLast (ue)); + } + else + { + if (optgenerror + (FLG_MUSTMOD, + message ("Suspect object listed in modifies of %s " + "not modified: %s", + uentry_rawName (ue), + sname), + uentry_whereLast (ue))) + { + uentry_showWhereSpecified (le); + } + } + cstring_free (sname); + } + } + } end_sRefSet_allElements; +} + +void exprNode_checkMacroBody (/*@only@*/ exprNode e) +{ + if (!exprNode_isError (e)) + { + uentry hdr; + + if (!(context_inFunctionLike () || context_inMacroConstant () + || context_inMacroUnknown ())) + { + llcontbug + (message + ("exprNode_checkMacroBody: not in macro function or constant: %q", + context_unparse ())); + exprNode_free (e); + return; + } + + hdr = context_getHeader (); + + if (e->kind == XPR_STMTLIST || e->kind == XPR_BODY) + { + voptgenerror + (FLG_MACROSTMT, + message + ("Macro %q definition is statement list (recommend " + "do { ... } while (0) constuction to ensure multiple " + "statement macro is syntactic function)", + uentry_getName (hdr)), + fileloc_isDefined (e->loc) ? e->loc : g_currentloc); + } + + if (context_inMacroConstant ()) + { + ctype t = uentry_getType (hdr); + + uentry_setDefined (hdr, e->loc); + + if (!(exprNode_matchType (ctype_realType (t), e))) + { + if (optgenerror + (FLG_INCONDEFS, + message + ("Constant %q specified as %s, but defined as %s: %s", + uentry_getName (hdr), + ctype_unparse (t), + ctype_unparse (e->typ), + exprNode_unparse (e)), + e->loc)) + { + uentry_showWhereSpecified (hdr); + } + } + else + { + if (context_maybeSet (FLG_NULLSTATE) + && ctype_isUA(t) + && ctype_isRealPointer (t) + && exprNode_isNullValue (e)) + { + uentry ue = usymtab_getTypeEntry (ctype_typeId (t)); + sRef sr = uentry_getSref (ue); + + if (!sRef_possiblyNull (sr)) + { + vgenhinterror + (FLG_NULLSTATE, + message ("Constant %q of non-null type %s defined " + "as null: %s", + uentry_getName (hdr), ctype_unparse (t), + exprNode_unparse (e)), + message ("If %s can be null, add a /*@null@*/ " + "qualifer to its typedef.", + ctype_unparse (t)), + e->loc); + } + + uentry_mergeConstantValue (hdr, e->val); + e->val = multiVal_undefined; + } + } + } + else if (context_inMacroFunction () || context_inMacroUnknown ()) + { + ctype rettype = context_getRetType (); + + if (context_isMacroMissingParams ()) + { + llassert (context_inMacroFunction ()); + + /* + ** # define newname oldname + ** + ** newname is a function + ** specification of oldname should match + ** specification of newname. + */ + + if (!ctype_isFunction (e->typ)) + { + voptgenerror + (FLG_INCONDEFS, + message ("Function %s defined by unparameterized " + "macro not corresponding to function", + context_inFunctionName ()), + e->loc); + } + else + { + uentry ue = exprNode_getUentry (e); + + if (uentry_isValid (ue)) + { + /* + ** Okay, for now --- should check for consistency + */ + /* + ** uentry oldue = usymtab_lookup (cfname); + */ + + /* check var conformance here! */ + } + else + { + voptgenerror + (FLG_INCONDEFS, + message ("Function %s defined by unparameterized " + "macro not corresponding to function", + context_inFunctionName ()), + e->loc); + } + + e->typ = ctype_returnValue (e->typ); + rettype = e->typ; /* avoid aditional errors */ + } + } + + if (ctype_isVoid (rettype) || ctype_isUnknown (rettype)) + { + ; /* don't complain when void macros have values */ + } + else if (!exprNode_matchType (rettype, e)) + { + if (optgenerror + (FLG_INCONDEFS, + message ("Function %q specified to return %s, " + "implemented as macro having type %s: %s", + uentry_getName (hdr), + ctype_unparse (rettype), ctype_unparse (e->typ), + exprNode_unparse (e)), + e->loc)) + { + uentry_showWhereSpecified (hdr); + } + } + else + { + switch (e->kind) + { + /* these expressions have values: */ + case XPR_PARENS: case XPR_ASSIGN: + case XPR_EMPTY: case XPR_VAR: + case XPR_OP: case XPR_POSTOP: + case XPR_PREOP: case XPR_CALL: + case XPR_SIZEOFT: case XPR_SIZEOF: + case XPR_ALIGNOFT: case XPR_ALIGNOF: + case XPR_CAST: case XPR_FETCH: + case XPR_COMMA: case XPR_COND: + case XPR_ARROW: case XPR_CONST: + case XPR_STRINGLITERAL: case XPR_NUMLIT: + case XPR_FACCESS: case XPR_OFFSETOF: + + checkReturnTransfer (e, hdr); + break; + + /* these expressions don't */ + case XPR_LABEL: + case XPR_VAARG: case XPR_ITER: + case XPR_FOR: case XPR_FORPRED: + case XPR_GOTO: case XPR_CONTINUE: + case XPR_BREAK: case XPR_RETURN: + case XPR_NULLRETURN: case XPR_IF: + case XPR_IFELSE: case XPR_DOWHILE: + case XPR_WHILE: case XPR_STMT: + case XPR_STMTLIST: case XPR_SWITCH: + case XPR_INIT: case XPR_BODY: + case XPR_NODE: case XPR_ITERCALL: + case XPR_TOK: case XPR_CASE: + case XPR_FTCASE: case XPR_FTDEFAULT: + case XPR_DEFAULT: case XPR_WHILEPRED: + case XPR_BLOCK: case XPR_INITBLOCK: + if (optgenerror + (FLG_INCONDEFS, + message ("Function %q specified to return %s, " + "implemented as macro with no result: %s", + uentry_getName (hdr), + ctype_unparse (rettype), + exprNode_unparse (e)), + e->loc)) + { + uentry_showWhereSpecified (hdr); + } + } + } + + usymtab_checkFinalScope (FALSE); + } + else + { + llbug (message ("exprNode_checkMacroBody: not in macro function: %q", context_unparse ())); + } + + exprNode_free (e); + } + + context_exitFunction (); + return; +} + +void exprNode_checkFunctionBody (exprNode body) +{ + if (!exprNode_isError (body)) + { + bool noret = context_getFlag (FLG_NORETURN); + bool checkret = exprNode_mustEscape (body); + + if (!checkret + && noret + && !exprNode_errorEscape (body) + && context_inRealFunction () + && ctype_isFunction (context_currentFunctionType ())) + { + ctype tr = ctype_returnValue (context_currentFunctionType ()); + + if (!ctype_isFirstVoid (tr)) + { + if (ctype_isUnknown (tr)) + { + voptgenerror + (FLG_NORETURN, + cstring_makeLiteral ("Path with no return in function declared to implicity return int"), + g_currentloc); + } + else + { + voptgenerror + (FLG_NORETURN, + message ("Path with no return in function declared to return %t", + tr), + g_currentloc); + } + } + } + + if (!checkret) + { + context_returnFunction (); + } + } +} + +void exprNode_checkFunction (/*@unused@*/ uentry ue, /*@only@*/ exprNode body) +{ + exprNode_free (body); + } + +void exprChecks_checkEmptyMacroBody (void) +{ + uentry hdr; + + if (!(context_inFunctionLike () || context_inMacroConstant () + || context_inMacroUnknown ())) + { + llcontbug + (message ("exprNode_checkEmptyMacroBody: not in macro function or constant: %q", + context_unparse ())); + return; + } + + hdr = context_getHeader (); + + beginLine (); + + if (uentry_isFunction (hdr)) + { + voptgenerror + (FLG_MACROEMPTY, + message + ("Macro definition for %q is empty", uentry_getName (hdr)), + g_currentloc); + + usymtab_checkFinalScope (FALSE); + } + + context_exitFunction (); + return; +} + +void exprNode_checkIterBody (/*@only@*/ exprNode body) +{ + context_exitAllClauses (); + + context_exitFunction (); + exprNode_free (body); +} + +void exprNode_checkIterEnd (/*@only@*/ exprNode body) +{ + context_exitAllClauses (); + context_exitFunction (); + exprNode_free (body); +} + +static +bool checkModifyAuxAux (sRef s, exprNode f, sRef alias, exprNode err) +{ + bool hasMods = context_hasMods (); + flagcode errCode = hasMods ? FLG_MODIFIES : FLG_MODNOMODS; + + if (exprNode_isDefined (f)) + { + f->sets = sRefSet_insert (f->sets, s); + } + + if (context_getFlag (FLG_MODIFIES) + && (hasMods || context_getFlag (FLG_MODNOMODS))) + { + sRefSet mods = context_modList (); + + if (!sRef_canModify (s, mods)) + { + sRef rb = sRef_getRootBase (s); + + + if (sRef_isGlobal (rb)) + { + if (!context_checkGlobMod (rb)) + { + return FALSE; + } + } + + if (sRef_isInvalid (alias) || sRef_sameName (s, alias)) + { + if (sRef_isLocalVar (sRef_getRootBase (s))) + { + voptgenerror + (errCode, + message + ("Undocumented modification of internal state (%q): %s", + sRef_unparse (s), exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc); + } + else + { + if (sRef_isSystemState (s)) + { + if (errCode == FLG_MODNOMODS) + { + if (context_getFlag (FLG_MODNOMODS)) + { + errCode = FLG_MODFILESYSTEM; + } + } + else + { + errCode = FLG_MODFILESYSTEM; + } + } + + voptgenerror + (errCode, + message ("Undocumented modification of %q: %s", + sRef_unparse (s), exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc); + } + + return TRUE; + } + else + { + if (sRef_isReference (s) && !sRef_isAddress (alias)) + { + voptgenerror + (errCode, + message + ("Possible undocumented modification of %q through alias %q: %s", + sRef_unparse (s), + sRef_unparse (alias), + exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc); + return TRUE; + } + } + } + } + else + { + if (context_maybeSet (FLG_MUSTMOD)) + { + (void) sRef_canModify (s, context_modList ()); + } + + if (sRef_isRefsField (s)) + { + sRef_setModified (s); + } + } + + return FALSE; +} + +static +bool checkModifyAux (sRef s, exprNode f, sRef alias, exprNode err) +{ + DPRINTF (("Check modify aux: %s", sRef_unparseFull (s))); + + if (sRef_isReference (s) && sRef_isObserver (s) + && context_maybeSet (FLG_MODOBSERVER)) + { + cstring sname; + + if (sRef_isPointer (s)) + { + sRef base = sRef_getBase (s); + sname = sRef_unparse (base); + } + else + { + if (sRef_isAddress (s)) + { + sRef p = sRef_constructPointer (s); + sname = sRef_unparse (p); + } + else + { + sname = sRef_unparse (s); + } + } + + if (!sRef_isValid (alias) || sRef_sameName (s, alias)) + { + if (sRef_isMeaningful (s)) + { + if (optgenerror + (FLG_MODOBSERVER, + message ("Suspect modification of observer %s: %s", + sname, exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc)) + { + sRef_showExpInfo (s); + } + } + else + { + voptgenerror + (FLG_MODOBSERVER, + message ("Suspect modification of observer returned by " + "function call: %s", + exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc); + } + } + else + { + if (optgenerror + (FLG_MODOBSERVER, + message ("Suspect modification of observer %s through alias %q: %s", + sname, sRef_unparse (alias), exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc)) + { + sRef_showExpInfo (s); + } + } + + cstring_free (sname); + } + + (void) checkModifyAuxAux (s, f, alias, err); + return FALSE; +} + +static +bool checkModifyValAux (sRef s, exprNode f, sRef alias, exprNode err) +{ + (void) checkModifyAuxAux (s, f, alias, err); + return FALSE; +} + +static +bool checkCallModifyAux (sRef s, exprNode f, sRef alias, exprNode err) +{ + bool result = FALSE; + + if (sRef_isObserver (s) && context_maybeSet (FLG_MODOBSERVER)) + { + sRef p = sRef_isAddress (s) ? sRef_constructPointer (s) : s; + cstring sname = sRef_unparse (p); + + if (!sRef_isValid (alias) || sRef_sameName (s, alias)) + { + if (sRef_isMeaningful (s)) + { + result = optgenerror + (FLG_MODOBSERVER, + message ("Suspect modification of observer %s: %s", + sname, exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc); + } + else + { + result = optgenerror + (FLG_MODOBSERVER, + message ("Suspect modification of observer returned by " + "function call: %s", + exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc); + } + } + else + { + result = optgenerror + (FLG_MODOBSERVER, + message + ("Suspect modification of observer %s through alias %q: %s", + sname, sRef_unparse (alias), exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc); + } + + cstring_free (sname); + } + else if (context_maybeSet (FLG_MODIFIES)) + { + if (!(sRef_canModifyVal (s, context_modList ()))) + { + sRef p = sRef_isAddress (s) ? sRef_constructPointer (s) : s; + cstring sname = sRef_unparse (p); + bool hasMods = context_hasMods (); + sRef rb = sRef_getRootBase (s); + flagcode errCode = hasMods ? FLG_MODIFIES : FLG_MODNOMODS; + bool check = TRUE; + + if (sRef_isGlobal (rb)) + { + uentry ue = sRef_getUentry (rb); + + /* be more specific here! */ + if (!uentry_isCheckedModify (ue)) + { + check = FALSE; + } + } + + if (check) + { + if (!sRef_isValid (alias) || sRef_sameName (s, alias)) + { + if (sRef_isLocalVar (sRef_getRootBase (s))) + { + voptgenerror + (errCode, + message + ("Undocumented modification of internal " + "state (%q) through call to %s: %s", + sRef_unparse (s), exprNode_unparse (f), + exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc); + } + else + { + if (sRef_isSystemState (s)) + { + if (errCode == FLG_MODNOMODS) + { + if (context_getFlag (FLG_MODNOMODS)) + { + errCode = FLG_MODFILESYSTEM; + } + } + else + { + errCode = FLG_MODFILESYSTEM; + } + } + + result = optgenerror + (errCode, + message ("Undocumented modification of %s " + "possible from call to %s: %s", + sname, + exprNode_unparse (f), + exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc); + } + } + else + { + result = optgenerror + (errCode, + message ("Undocumented modification of %s possible " + "from call to %s (through alias %q): %s", + sname, + exprNode_unparse (f), + sRef_unparse (alias), + exprNode_unparse (err)), + exprNode_isDefined (f) ? f->loc : g_currentloc); + } + } + cstring_free (sname); + } + } + else + { + if (context_maybeSet (FLG_MUSTMOD)) + { + (void) sRef_canModifyVal (s, context_modList ()); + } + } + + return result; +} + +void exprNode_checkCallModifyVal (sRef s, exprNodeList args, exprNode f, exprNode err) +{ + s = sRef_fixBaseParam (s, args); + sRef_aliasCheckPred (checkCallModifyAux, NULL, s, f, err); +} + +void +exprChecks_checkExport (uentry e) +{ + if (context_checkExport (e)) + { + fileloc fl = uentry_whereDeclared (e); + + if (fileloc_isHeader (fl) && !fileloc_isLib (fl) + && !fileloc_isImport (fl) && !uentry_isStatic (e)) + { + if (uentry_isFunction (e) || + (uentry_isVariable (e) && ctype_isFunction (uentry_getType (e)))) + { + voptgenerror + (FLG_EXPORTFCN, + message ("Function exported, but not specified: %q", + uentry_getName (e)), + fl); + } + else if (uentry_isExpandedMacro (e)) + { + voptgenerror + (FLG_EXPORTMACRO, + message ("Expanded macro exported, but not specified: %q", + uentry_getName (e)), + fl); + } + else if (uentry_isVariable (e) && !uentry_isParam (e)) + { + voptgenerror + (FLG_EXPORTVAR, + message ("Variable exported, but not specified: %q", + uentry_getName (e)), + fl); + } + else if (uentry_isEitherConstant (e)) + { + voptgenerror + (FLG_EXPORTCONST, + message ("Constant exported, but not specified: %q", + uentry_getName (e)), + fl); + } + else if (uentry_isIter (e) || uentry_isEndIter (e)) + { + voptgenerror + (FLG_EXPORTITER, + message ("Iterator exported, but not specified: %q", + uentry_getName (e)), + fl); + } + + else if (uentry_isDatatype (e)) + { + ; /* error already reported */ + } + else + { + BADEXIT; + } + } + } +} + +static void checkSafeReturnExpr (/*@notnull@*/ exprNode e) +{ + ctype tr = ctype_returnValue (context_currentFunctionType ()); + ctype te = exprNode_getType (e); + + if (!ctype_forceMatch (tr, te) && !exprNode_matchLiteral (tr, e)) + { + (void) gentypeerror + (te, e, tr, exprNode_undefined, + message ("Return value type %t does not match declared type %t: %s", + te, tr, exprNode_unparse (e)), + e->loc); + } + else + { + sRef ret = e->sref; + uentry rval = context_getHeader (); + sRef resultref = uentry_getSref (rval); + + checkReturnTransfer (e, rval); + + if (!(sRef_isExposed (uentry_getSref (context_getHeader ())) + || sRef_isObserver (uentry_getSref (context_getHeader ()))) + && (context_getFlag (FLG_RETALIAS) + || context_getFlag (FLG_RETEXPOSE))) + { + sRef base = sRef_getRootBase (ret); + ctype rtype = e->typ; + + if (ctype_isUnknown (rtype)) + { + rtype = tr; + } + + if (ctype_isVisiblySharable (rtype)) + { + if (context_getFlag (FLG_RETALIAS)) + { + sRef_aliasCheckPred (checkRefGlobParam, NULL, base, + e, exprNode_undefined); + } + + if (context_getFlag (FLG_RETEXPOSE) && sRef_isIReference (ret) + && !sRef_isExposed (resultref) && !sRef_isObserver (resultref)) + { + sRef_aliasCheckPred (checkRepExposed, NULL, base, e, + exprNode_undefined); + } + } + } + } +} + diff --git a/src/exprData.i b/src/exprData.i new file mode 100644 index 0000000..e71f176 --- /dev/null +++ b/src/exprData.i @@ -0,0 +1,684 @@ +/* ;-*-C-*-; */ + +/* +** freeShallow: free exprData created from exprNode_effect calls. +** All but the innermost storage is free'd. +*/ + +static void exprData_freeShallow (/*@only@*/ exprData data, exprKind kind) +{ + /*@-compdestroy@*/ + + if (data == exprData_undefined) + { + return; + } + + switch (kind) + { + case XPR_INITBLOCK: + case XPR_CALL: + exprNode_freeShallow (data->call->fcn); + exprNodeList_freeShallow (data->call->args); + sfree (data->call); + break; + case XPR_COMMA: + case XPR_FETCH: + case XPR_OP: + case XPR_ASSIGN: + case XPR_IF: + case XPR_WHILE: + case XPR_DOWHILE: + case XPR_STMTLIST: + case XPR_SWITCH: + case XPR_FOR: + exprNode_freeShallow (data->op->a); + exprNode_freeShallow (data->op->b); + sfree (data->op); + break; + + case XPR_PREOP: + case XPR_POSTOP: + case XPR_PARENS: + exprNode_freeShallow (data->uop->a); + sfree (data->uop); + break; + + case XPR_FTCASE: + case XPR_CASE: + case XPR_RETURN: + case XPR_WHILEPRED: + case XPR_STMT: + case XPR_BLOCK: + exprNode_freeShallow (data->single); + break; + + case XPR_CAST: + case XPR_VAARG: + exprNode_freeShallow (data->cast->exp); + /* NO: qtype_free (data->cast->q); */ + sfree (data->cast); + break; + + case XPR_ITERCALL: + exprNodeList_freeShallow (data->itercall->args); + sfree (data->itercall); + break; + + case XPR_ITER: + exprNodeList_freeShallow (data->iter->args); + exprNode_freeShallow (data->iter->body); + sfree (data->iter); + break; + + case XPR_FORPRED: + case XPR_COND: + case XPR_IFELSE: + exprNode_freeShallow (data->triple->pred); + exprNode_freeShallow (data->triple->tbranch); + exprNode_freeShallow (data->triple->fbranch); + sfree (data->triple); + break; + + case XPR_INIT: + exprNode_freeShallow (data->init->exp); + /* NO: idDecl_free (data->init->id); */ + sfree (data->init); + break; + + case XPR_FACCESS: + case XPR_ARROW: + exprNode_freeShallow (data->field->rec); + /* NO: cstring_free (data->field->field); */ + sfree (data->field); + break; + + case XPR_LABEL: + case XPR_CONST: + case XPR_VAR: + break; + + case XPR_OFFSETOF: + case XPR_ALIGNOFT: + case XPR_ALIGNOF: + case XPR_SIZEOFT: + case XPR_SIZEOF: + case XPR_GOTO: + case XPR_CONTINUE: + case XPR_BREAK: + case XPR_NULLRETURN: + case XPR_TOK: + case XPR_FTDEFAULT: + case XPR_DEFAULT: + break; + + case XPR_STRINGLITERAL: + case XPR_NUMLIT: + llcontbuglit ("exprData_freeShallow: not shallow!"); + break; + + case XPR_EMPTY: + llcontbuglit ("XPR_EMPTY case!"); + break; + + case XPR_BODY: + llcontbuglit ("XPR_BODY case!"); + break; + case XPR_NODE: + llcontbuglit ("XPR_NODE case!"); + break; + } + + sfree (data); + /*@=compdestroy@*/ +} + +static void exprData_free (/*@only@*/ exprData data, exprKind kind) +{ + if (data == exprData_undefined) + { + return; + } + + switch (kind) + { + case XPR_INITBLOCK: + case XPR_CALL: + exprNode_free (data->call->fcn); + exprNodeList_free (data->call->args); + sfree (data->call); + break; + + case XPR_LABEL: + case XPR_CONST: + case XPR_VAR: + cstring_free (data->id); + break; + + case XPR_COMMA: + case XPR_FETCH: + case XPR_OP: + case XPR_ASSIGN: + case XPR_IF: + case XPR_WHILE: + case XPR_DOWHILE: + case XPR_STMTLIST: + case XPR_SWITCH: + case XPR_FOR: + exprNode_free (data->op->a); + exprNode_free (data->op->b); + sfree (data->op); + break; + + case XPR_PREOP: + case XPR_POSTOP: + case XPR_PARENS: + exprNode_free (data->uop->a); + sfree (data->uop); + break; + + case XPR_OFFSETOF: + qtype_free (data->offset->q); + cstringList_free (data->offset->field); + sfree (data->offset); + break; + + case XPR_ALIGNOFT: + case XPR_SIZEOFT: + qtype_free (data->qt); + break; + + case XPR_FTCASE: + case XPR_CASE: + case XPR_SIZEOF: + case XPR_ALIGNOF: + case XPR_RETURN: + case XPR_WHILEPRED: + case XPR_STMT: + case XPR_BLOCK: + exprNode_free (data->single); + break; + + case XPR_CAST: + case XPR_VAARG: + exprNode_free (data->cast->exp); + qtype_free (data->cast->q); + sfree (data->cast); + break; + + case XPR_ITERCALL: + exprNodeList_free (data->itercall->args); + sfree (data->itercall); + break; + + case XPR_ITER: + exprNodeList_free (data->iter->args); + exprNode_free (data->iter->body); + sfree (data->iter); + break; + + case XPR_FORPRED: + case XPR_COND: + case XPR_IFELSE: + exprNode_free (data->triple->pred); + exprNode_free (data->triple->tbranch); + exprNode_free (data->triple->fbranch); + sfree (data->triple); + break; + + case XPR_GOTO: + case XPR_STRINGLITERAL: + case XPR_NUMLIT: + cstring_free (data->literal); + break; + + case XPR_CONTINUE: + case XPR_BREAK: + case XPR_NULLRETURN: + break; + + case XPR_FTDEFAULT: + case XPR_DEFAULT: + case XPR_TOK: + break; + + case XPR_INIT: + exprNode_free (data->init->exp); + idDecl_free (data->init->id); + sfree (data->init); + break; + + case XPR_FACCESS: + case XPR_ARROW: + exprNode_free (data->field->rec); + cstring_free (data->field->field); + sfree (data->field); + break; + + case XPR_EMPTY: + llcontbuglit ("XPR_EMPTY case!"); + break; + case XPR_BODY: + llcontbuglit ("XPR_BODY case!"); + break; + case XPR_NODE: + llcontbuglit ("XPR_NODE case!"); + break; + } + + sfree (data); +} + +static /*@exposed@*/ exprNode exprData_getInitNode (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->init->exp); +} + +static /*@exposed@*/ idDecl exprData_getInitId (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->init->id); +} + +static /*@exposed@*/ exprNode exprData_getOpA (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->op->a); +} + +static /*@exposed@*/ exprNode exprData_getOpB (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->op->b); +} + +static /*@observer@*/ lltok exprData_getOpTok (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->op->op); +} + +static /*@exposed@*/ exprNode exprData_getPairA (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->pair->a); +} + +static /*@exposed@*/ exprNode exprData_getPairB (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->pair->b); +} + + +static /*@exposed@*/ uentry exprData_getIterSname (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->iter->sname); +} + +static /*@exposed@*/ exprNodeList exprData_getIterAlist (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->iter->args); +} + +static /*@exposed@*/ exprNode exprData_getIterBody (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->iter->body); +} + +static /*@exposed@*/ uentry exprData_getIterEname (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->iter->ename); +} + +static /*@exposed@*/ exprNode exprData_getFcn (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->call->fcn); +} + +static /*@exposed@*/ exprNodeList exprData_getArgs (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->call->args); +} + +static /*@exposed@*/ exprNode exprData_getTriplePred (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->triple->pred); +} + +static /*@exposed@*/ uentry exprData_getIterCallIter (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->itercall->iter); +} + +static /*@exposed@*/ exprNodeList + exprData_getIterCallArgs (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->itercall->args); +} + +static /*@exposed@*/ exprNode exprData_getTripleInit (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->triple->pred); +} + +static /*@exposed@*/ exprNode exprData_getTripleTrue (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->triple->tbranch); +} + +static /*@exposed@*/ exprNode exprData_getTripleTest (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->triple->tbranch); +} + +static /*@exposed@*/ exprNode exprData_getTripleFalse (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->triple->fbranch); +} + +static /*@exposed@*/ exprNode exprData_getTripleInc (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->triple->fbranch); +} + +static /*@exposed@*/ exprNode exprData_getFieldNode (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->field->rec); +} + +static /*@exposed@*/ cstring exprData_getFieldName (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->field->field); +} + +static /*@observer@*/ lltok exprData_getUopTok (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->uop->op); +} + +static /*@exposed@*/ exprNode exprData_getUopNode (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->uop->a); +} + +static /*@exposed@*/ exprNode exprData_getCastNode (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->cast->exp); +} + +static /*@observer@*/ lltok exprData_getCastTok (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->cast->tok); +} + +static /*@exposed@*/ qtype exprData_getCastType (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->cast->q); +} + +static /*@exposed@*/ cstring exprData_getLiteral (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->literal); +} + +static /*@exposed@*/ cstring exprData_getId (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->id); +} + +static /*@observer@*/ lltok exprData_getTok (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (*data->tok); +} + +static /*@exposed@*/ qtype exprData_getType (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->qt); +} + +static /*@exposed@*/ qtype exprData_getOffsetType (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->offset->q); +} + +static /*@exposed@*/ cstringList exprData_getOffsetName (exprData data) /*@*/ +{ + llassert (data != exprData_undefined); + return (data->offset->field); +} + +static /*@exposed@*/ exprNode exprData_getSingle (exprData data) +{ + exprNode ret; + llassert (data != exprData_undefined); + + ret = data->single; + return (ret); +} + +/*@only@*/ exprData exprData_makeLiteral (/*@only@*/ cstring s) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->literal = s; + return ed; +} + +/*@only@*/ exprData exprData_makeId (/*@temp@*/ uentry id) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + ed->id = cstring_copy (uentry_rawName (id)); + return ed; +} + +/*@only@*/ exprData exprData_makePair (/*@keep@*/ exprNode a, /*@keep@*/ exprNode b) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->pair = (exprPair) dmalloc (sizeof (*ed->pair)); + ed->pair->a = a; + ed->pair->b = b; + + return ed; +} + +static /*@only@*/ exprData + exprData_makeOp (/*@keep@*/ exprNode a, /*@keep@*/ exprNode b, /*@keep@*/ lltok op) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->op = (exprOp) dmalloc (sizeof (*ed->op)); + ed->op->a = a; + ed->op->b = b; + ed->op->op = op; + + return ed; +} + +static /*@only@*/ exprData exprData_makeUop (/*@keep@*/ exprNode a, /*@keep@*/ lltok op) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->uop = (exprUop) dmalloc (sizeof (*ed->uop)); + ed->uop->a = a; + ed->uop->op = op; + + return ed; +} + +static /*@only@*/ exprData exprData_makeSingle (/*@only@*/ exprNode a) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->single = a; + return ed; +} + +static /*@only@*/ exprData exprData_makeTok (/*@only@*/ lltok op) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->tok = (lltok *) dmalloc (sizeof (*(ed->tok))); + *(ed->tok) = op; + return ed; +} + +static /*@only@*/ exprData +exprData_makeIter (/*@exposed@*/ uentry sname, /*@keep@*/ exprNodeList args, + /*@keep@*/ exprNode body, /*@exposed@*/ uentry ename) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->iter = (exprIter) dmalloc (sizeof (*ed->iter)); + ed->iter->sname = uentry_isVar (sname) ? uentry_copy (sname) : sname; + ed->iter->args = args; + ed->iter->body = body; + ed->iter->ename = uentry_isVar (ename) ? uentry_copy (ename) : ename; + return ed; +} + +static /*@only@*/ exprData exprData_makeTriple (/*@keep@*/ exprNode pred, + /*@keep@*/ exprNode tbranch, + /*@keep@*/ exprNode fbranch) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->triple = (exprTriple) dmalloc (sizeof (*ed->triple)); + ed->triple->pred = pred; + ed->triple->tbranch = tbranch; + ed->triple->fbranch = fbranch; + + return ed; +} + +static /*@only@*/ exprData exprData_makeCall (/*@keep@*/ exprNode fcn, + /*@keep@*/ exprNodeList args) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->call = (exprCall) dmalloc (sizeof (*ed->call)); + ed->call->fcn = fcn; + ed->call->args = args; + + return ed; +} + +static /*@only@*/ exprData exprData_makeIterCall (/*@dependent@*/ uentry iter, + /*@keep@*/ exprNodeList args) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->itercall = (exprIterCall) dmalloc (sizeof (*ed->itercall)); + ed->itercall->iter = uentry_isVar (iter) ? uentry_copy (iter) : iter; + ed->itercall->args = args; + + return ed; +} + +static /*@only@*/ exprData exprData_makeField (/*@keep@*/ exprNode rec, + /*@keep@*/ cstring field) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->field = (exprField) dmalloc (sizeof (*ed->field)); + ed->field->rec = rec; + ed->field->field = field; + + return ed; +} + +static /*@only@*/ exprData exprData_makeOffsetof (/*@only@*/ qtype q, + /*@keep@*/ cstringList s) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + ed->offset = (exprOffsetof) dmalloc (sizeof (*ed->offset)); + + ed->offset->q = q; + ed->offset->field = s; + return ed; +} + +static /*@only@*/ exprData exprData_makeSizeofType (/*@only@*/ qtype q) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->qt = q; + return ed; +} + +static /*@only@*/ exprData + exprData_makeCast (/*@keep@*/ lltok tok, /*@keep@*/ exprNode e, /*@only@*/ qtype q) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->cast = (exprCast) dmalloc (sizeof (*ed->cast)); + ed->cast->tok = tok; + ed->cast->exp = e; + ed->cast->q = q; + + return ed; +} + +static /*@only@*/ exprData + exprData_makeInit (/*@keep@*/ idDecl t, /*@keep@*/ exprNode e) +{ + exprData ed = (exprData) dmalloc (sizeof (*ed)); + + ed->init = (exprInit) dmalloc (sizeof (*ed->init)); + ed->init->exp = e; + ed->init->id = t; + + return ed; +} + +static /*@only@*/ exprData exprData_makeCond (/*@keep@*/ exprNode pred, + /*@keep@*/ exprNode ifclause, + /*@keep@*/ exprNode elseclause) +{ + return exprData_makeTriple (pred, ifclause, elseclause); +} + +static /*@only@*/ exprData exprData_makeFor (/*@keep@*/ exprNode init, + /*@keep@*/ exprNode pred, + /*@keep@*/ exprNode inc) +{ + return exprData_makeTriple (init, pred, inc); +} + + + + + + + + + + diff --git a/src/exprNode.c b/src/exprNode.c new file mode 100644 index 0000000..923457b --- /dev/null +++ b/src/exprNode.c @@ -0,0 +1,9735 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** exprNode.c +*/ + +# include /* for isdigit */ +# include "lclintMacros.nf" +# include "basic.h" +# include "cgrammar.h" +# include "cgrammar_tokens.h" + +# include "exprChecks.h" +# include "aliasChecks.h" +# include "exprNodeSList.h" +# include "exprData.i" + +static bool exprNode_isEmptyStatement (exprNode p_e); +static /*@exposed@*/ exprNode exprNode_firstStatement (/*@returned@*/ exprNode p_e); +static bool exprNode_isFalseConstant (exprNode p_e) /*@*/ ; +static bool exprNode_isBlock (exprNode p_e); +static void checkGlobUse (uentry p_glob, bool p_isCall, /*@notnull@*/ exprNode p_e); +static void exprNode_addUse (exprNode p_e, sRef p_s); +static bool exprNode_matchArgType (ctype p_ct, exprNode p_e); +static exprNode exprNode_fakeCopy (exprNode p_e) /*@*/ ; +static exprNode exprNode_statementError (/*@only@*/ exprNode p_e); +static bool exprNode_matchTypes (exprNode p_e1, exprNode p_e2); +static void checkUniqueParams (exprNode p_fcn, + /*@notnull@*/ exprNode p_current, exprNodeList p_args, + int p_paramno, uentry p_ucurrent); +static void updateAliases (/*@notnull@*/ exprNode p_e1, /*@notnull@*/ exprNode p_e2); +static void abstractOpError (ctype p_tr1, ctype p_tr2, lltok p_op, + /*@notnull@*/ exprNode p_e1, /*@notnull@*/ exprNode p_e2, + fileloc p_loc1, fileloc p_loc2); +static ctype checkNumerics (ctype p_tr1, ctype p_tr2, ctype p_te1, ctype p_te2, + /*@notnull@*/ exprNode p_e1, /*@notnull@*/ exprNode p_e2, lltok p_op); +static void doAssign (/*@notnull@*/ exprNode p_e1, /*@notnull@*/ exprNode p_e2, bool p_isInit); +static void checkSafeUse (exprNode p_e, sRef p_s); +static void reflectNullTest (/*@notnull@*/ exprNode p_e, bool p_isnull); +static void checkMacroParen (exprNode p_e); +static exprNodeSList exprNode_flatten (/*@dependent@*/ exprNode p_e); +static void exprNode_checkSetAny (exprNode p_e, /*@dependent@*/ cstring p_name); +static void exprNode_checkUse (exprNode p_e, sRef p_s, fileloc p_loc); +static void exprNode_mergeUSs (exprNode p_res, exprNode p_other); +static void exprNode_mergeCondUSs (exprNode p_res, exprNode p_other1, exprNode p_other2); +static /*@only@*/ /*@notnull@*/ exprNode exprNode_fromIdentifierAux (/*@observer@*/ uentry p_c); +static void checkAnyCall (/*@notnull@*/ /*@dependent@*/ exprNode p_fcn, + /*@dependent@*/ cstring p_fname, + uentryList p_pn, exprNodeList p_args, + bool p_hasMods, sRefSet p_mods, bool p_isSpec, + int p_specialArgs); +static void checkOneArg (uentry p_ucurrent, /*@notnull@*/ exprNode p_current, + /*@dependent@*/ exprNode p_fcn, bool p_isSpec, int p_argno, int p_totargs); +static void + checkUnspecCall (/*@notnull@*/ /*@dependent@*/ exprNode p_fcn, uentryList p_params, exprNodeList p_args); + +static /*@only@*/ exprNode exprNode_effect (exprNode p_e) + /*@globals internalState@*/ ; +static /*@only@*/ cstring exprNode_doUnparse (exprNode p_e); +static /*@observer@*/ cstring exprNode_rootVarName (exprNode p_e); +static /*@exposed@*/ exprNode + exprNode_lastStatement (/*@returned@*/ exprNode p_e); + +static /*@null@*/ sRef defref = sRef_undefined; +static /*@only@*/ exprNode mustExitNode = exprNode_undefined; + +static int checkArgsReal (uentry p_fcn, /*@dependent@*/ exprNode p_f, + uentryList p_cl, + exprNodeList p_args, bool p_isIter, exprNode p_ret); + +static bool inEffect = FALSE; +static int nowalloc = 0; +static int totalloc = 0; +static int maxalloc = 0; + +static /*@only@*/ uentry regArg; +static /*@only@*/ uentry outArg; +static /*@only@*/ uentry outStringArg; +static /*@exposed@*/ sRef stdinRef; +static /*@exposed@*/ sRef stdoutRef; +static /*@only@*/ uentry csArg; +static /*@only@*/ uentry csOnlyArg; +static ctype cstringType; +static ctype ctypeType; +static ctype filelocType; +static bool initMod = FALSE; + +/* +** must occur after library has been read +*/ + +void exprNode_initMod (void) + /*@globals undef regArg, undef outArg, undef outStringArg, + undef csOnlyArg, undef csArg; + @*/ +{ + uentry ue; + idDecl tmp; + + initMod = TRUE; + cstringType = ctype_unknown; + ctypeType = ctype_unknown; + filelocType = ctype_unknown; + + defref = sRef_undefined; + + if (usymtab_existsType (cstring_makeLiteralTemp ("cstring"))) + { + cstringType = usymtab_lookupAbstractType (cstring_makeLiteralTemp ("cstring")); + } + + if (usymtab_existsType (cstring_makeLiteralTemp ("ctype"))) + { + ctypeType = usymtab_lookupAbstractType (cstring_makeLiteralTemp ("ctype")); + } + + if (usymtab_existsType (cstring_makeLiteralTemp ("fileloc"))) + { + filelocType = usymtab_lookupAbstractType (cstring_makeLiteralTemp ("fileloc")); + } + + if (usymtab_existsGlob (cstring_makeLiteralTemp ("stdin"))) + { + ue = usymtab_lookupGlob (cstring_makeLiteralTemp ("stdin")); + } + else /* define stdin */ + { + ue = uentry_makeVariable (cstring_makeLiteralTemp ("stdin"), + ctype_unknown, + fileloc_getBuiltin (), + FALSE); + uentry_setHasNameError (ue); + ue = usymtab_supGlobalEntryReturn (ue); + } + + stdinRef = sRef_makePointer (uentry_getSref (ue)); + + if (usymtab_existsGlob (cstring_makeLiteralTemp ("stdout"))) + { + ue = usymtab_lookupGlob (cstring_makeLiteralTemp ("stdout")); + } + else + { + ue = uentry_makeVariable (cstring_makeLiteralTemp ("stdout"), + ctype_unknown, + fileloc_getBuiltin (), + FALSE); + uentry_setHasNameError (ue); + ue = usymtab_supGlobalEntryReturn (ue); + } + + stdoutRef = sRef_makePointer (uentry_getSref (ue)); + + tmp = idDecl_create (cstring_undefined, qtype_create (ctype_unknown)); + + regArg = uentry_makeParam (tmp, PARAMUNKNOWN); + + idDecl_setTyp (tmp, + qtype_addQual (qtype_create (ctype_makePointer (ctype_unknown)), + qual_createOut ())); + + outArg = uentry_makeParam (tmp, PARAMUNKNOWN); + + idDecl_setTyp (tmp, qtype_addQual (qtype_create (ctype_string), + qual_createOut ())); + + outStringArg = uentry_makeParam (tmp, PARAMUNKNOWN); + + idDecl_setTyp (tmp, qtype_addQual (qtype_addQual (qtype_create (cstringType), + qual_createOnly ()), + qual_createNull ())); + + csOnlyArg = uentry_makeParam (tmp, PARAMUNKNOWN); + + idDecl_setTyp (tmp, qtype_addQual (qtype_create (cstringType), qual_createNull ())); + csArg = uentry_makeParam (tmp, PARAMUNKNOWN); + + idDecl_free (tmp); +} + +void +exprNode_destroyMod (void) + /*@globals killed regArg, killed outArg, killed outStringArg, + killed mustExitNode, initMod @*/ +{ + if (initMod) + { + uentry_free (regArg); + uentry_free (outArg); + uentry_free (outStringArg); + + exprNode_free (mustExitNode); + initMod = FALSE; + /*@-branchstate@*/ + } + /*@=branchstate@*/ +} + +static void exprNode_resetSref (/*@notnull@*/ exprNode e) +{ + e->sref = defref; +} + +static exprNode exprNode_fakeCopy (exprNode e) +{ + /*@-temptrans@*/ /*@-retalias@*/ + return e; + /*@=temptrans@*/ /*@=retalias@*/ +} + +static bool isFlagKey (char key) +{ + return (key == '-' || key == '+' || key == ' ' || key == '#'); +} + +static void exprNode_combineControl (/*@notnull@*/ exprNode ret, + /*@notnull@*/ exprNode ifclause, + /*@notnull@*/ exprNode elseclause) +{ + ret->canBreak = ifclause->canBreak || elseclause->canBreak; + + ret->mustBreak = + (ifclause->mustBreak || exprNode_mustEscape (ifclause)) + && (elseclause->mustBreak || exprNode_mustEscape (elseclause)); + + ret->exitCode = exitkind_combine (ifclause->exitCode, + elseclause->exitCode); + +} + +/* +** For exprNode's returned by exprNode_effect. +*/ + +static bool shallowKind (exprKind kind) +{ + return (kind == XPR_STRINGLITERAL + || kind == XPR_NUMLIT + || kind == XPR_EMPTY + || kind == XPR_BODY + || kind == XPR_NODE); +} + +static void +exprNode_freeIniter (/*@only@*/ exprNode e) +{ + if (!exprNode_isError (e)) + { + switch (e->kind) + { + case XPR_FACCESS: + sfree (e->edata->field); + sfree (e->edata); + break; + case XPR_FETCH: + exprNode_free (e->edata->op->b); + /*@-compdestroy@*/ sfree (e->edata->op); /*@=compdestroy@*/ + sfree (e->edata); + break; + default: + llbug (message ("other: %s", exprNode_unparse (e))); + } + + multiVal_free (e->val); + cstring_free (e->etext); + fileloc_free (e->loc); + sRefSet_free (e->uses); + sRefSet_free (e->sets); + sRefSet_free (e->msets); + guardSet_free (e->guards); + sfree (e); + } +} + +void +exprNode_freeShallow (/*@only@*/ exprNode e) +{ + if (!exprNode_isError (e)) + { + if (shallowKind (e->kind)) + { + } + else + { + if (!inEffect) + { + if (e->kind == XPR_EMPTY + || e->kind == XPR_BODY + || e->kind == XPR_STRINGLITERAL + || e->kind == XPR_NUMLIT + || e->kind == XPR_NODE + || e->kind == XPR_OFFSETOF + || e->kind == XPR_ALIGNOFT + || e->kind == XPR_ALIGNOF + || e->kind == XPR_SIZEOFT + || e->kind == XPR_SIZEOF) + { + /* don't free anything */ + } + else + { + /* multiVal_free (e->val); */ + cstring_free (e->etext); + fileloc_free (e->loc); + sRefSet_free (e->uses); + sRefSet_free (e->sets); + sRefSet_free (e->msets); + guardSet_free (e->guards); + exprData_freeShallow (e->edata, e->kind); + nowalloc--; + /*@-compdestroy@*/ sfree (e); /*@=compdestroy@*/ + /*@-branchstate@*/ + } + } + } /*@=branchstate@*/ + } + } + +void +exprNode_free (exprNode e) +{ + if (!exprNode_isError (e)) + { + if (!inEffect) + { + multiVal_free (e->val); + cstring_free (e->etext); + fileloc_free (e->loc); + sRefSet_free (e->uses); + sRefSet_free (e->sets); + sRefSet_free (e->msets); + guardSet_free (e->guards); + exprData_free (e->edata, e->kind); + + nowalloc--; + sfree (e); + /*@-branchstate@*/ + } /*@=branchstate@*/ + } +} + +exprNode +exprNode_makeError () +{ + return exprNode_undefined; +} + +static /*@out@*/ /*@only@*/ /*@notnull@*/ exprNode +exprNode_new (void) +{ + exprNode ret = (exprNode) dmalloc (sizeof (*ret)); + /* static int lastexpnodes = 0; */ + + nowalloc++; + totalloc++; + + if (nowalloc > maxalloc) + { + maxalloc = nowalloc; + } + + return ret; +} + +static /*@notnull@*/ /*@special@*/ exprNode + exprNode_createPlain (ctype c) + /*@defines result@*/ + /*@post:isnull result->edata, result->loc, result->val, result->guards, + result->uses, result->sets, result->msets, result->etext @*/ + /*@*/ +{ + exprNode e = exprNode_new (); + + e->typ = c; + e->kind = XPR_EMPTY; + e->val = multiVal_undefined; + e->sref = defref; + e->etext = cstring_undefined; + e->loc = fileloc_undefined; + e->guards = guardSet_undefined; + e->uses = sRefSet_undefined; + e->sets = sRefSet_undefined; + e->msets = sRefSet_undefined; + e->edata = exprData_undefined; + e->exitCode = XK_NEVERESCAPE; + e->canBreak = FALSE; + e->mustBreak = FALSE; + e->isJumpPoint = FALSE; + return (e); +} + +/*@observer@*/ exprNode exprNode_makeMustExit (void) +{ + if (exprNode_isUndefined (mustExitNode)) + { + mustExitNode = exprNode_createPlain (ctype_unknown); + mustExitNode->exitCode = XK_MUSTEXIT; + } + + return mustExitNode; +} + + +static /*@notnull@*/ /*@special@*/ exprNode exprNode_create (ctype c) + /*@defines result@*/ + /*@post:isnull result->edata, result->guards, result->val, + result->uses, result->sets, result->msets@*/ + /*@*/ +{ + exprNode e = exprNode_createPlain (c); + e->loc = fileloc_copy (g_currentloc); + return (e); +} + +static /*@notnull@*/ /*@special@*/ exprNode exprNode_createUnknown (void) + /*@defines result@*/ + /*@post:isnull result->edata, result->guards, + result->uses, result->sets, result->msets@*/ + /*@*/ +{ + return (exprNode_create (ctype_unknown)); +} + +static /*@notnull@*/ /*@special@*/ exprNode + exprNode_createLoc (ctype c, /*@keep@*/ fileloc loc) + /*@defines result@*/ + /*@post:isnull result->edata, result->guards, result->val, + result->uses, result->sets, result->msets@*/ + /*@*/ +{ + exprNode e = exprNode_createPlain (c); + e->loc = loc; + return (e); +} + +static void + exprNode_copySets (/*@special@*/ /*@notnull@*/ exprNode ret, exprNode e) + /*@defines ret->guards, ret->uses, ret->sets, ret->msets@*/ +{ + if (exprNode_isDefined (e)) + { + ret->guards = guardSet_copy (e->guards); + ret->uses = sRefSet_newCopy (e->uses); + ret->sets = sRefSet_newCopy (e->sets); + ret->msets = sRefSet_newCopy (e->msets); + } + else + { + ret->guards = guardSet_undefined; + ret->uses = sRefSet_undefined; + ret->sets = sRefSet_undefined; + ret->msets = sRefSet_undefined; + } +} + +static /*@notnull@*/ /*@special@*/ exprNode + exprNode_createPartialLocCopy (exprNode e, /*@only@*/ fileloc loc) + /*@defines result@*/ + /*@post:isnull result->edata, result->etext@*/ + /*@*/ +{ + exprNode ret = exprNode_new (); + + if (exprNode_isError (e)) + { + ret->typ = ctype_unknown; + ret->val = multiVal_undefined; + ret->loc = loc; + ret->guards = guardSet_undefined; + ret->uses = sRefSet_undefined; + ret->sets = sRefSet_undefined; + ret->msets = sRefSet_undefined; + } + else + { + ret->typ = e->typ; + ret->val = multiVal_copy (e->val); + ret->loc = loc; + ret->guards = guardSet_copy (e->guards); + ret->uses = sRefSet_newCopy (e->uses); + ret->sets = sRefSet_newCopy (e->sets); + ret->msets = sRefSet_newCopy (e->msets); + } + + ret->kind = XPR_EMPTY; + ret->sref = defref; + ret->etext = cstring_undefined; + ret->exitCode = XK_NEVERESCAPE; + ret->canBreak = FALSE; + ret->mustBreak = FALSE; + ret->isJumpPoint = FALSE; + ret->edata = exprData_undefined; + + return (ret); +} + + +static /*@notnull@*/ /*@special@*/ exprNode + exprNode_createPartialCopy (exprNode e) + /*@defines result@*/ + /*@post:isnull result->edata, result->etext@*/ + /*@*/ +{ + return (exprNode_createPartialLocCopy (e, fileloc_copy (exprNode_loc (e)))); +} + +static /*@notnull@*/ /*@special@*/ exprNode + exprNode_createPartialNVCopy (exprNode e) + /*@defines result@*/ + /*@post:isnull result->edata, result->etext, result->val @*/ + /*@*/ +{ + exprNode ret = exprNode_new (); + + if (exprNode_isError (e)) + { + ret->typ = ctype_unknown; + ret->loc = fileloc_undefined; + ret->guards = guardSet_undefined; + ret->uses = sRefSet_undefined; + ret->sets = sRefSet_undefined; + ret->msets = sRefSet_undefined; + } + else + { + ret->typ = e->typ; + ret->loc = fileloc_copy (e->loc); + ret->guards = guardSet_copy (e->guards); + ret->uses = sRefSet_newCopy (e->uses); + ret->sets = sRefSet_newCopy (e->sets); + ret->msets = sRefSet_newCopy (e->msets); + } + + ret->val = multiVal_undefined; + ret->kind = XPR_EMPTY; + ret->sref = defref; + ret->etext = cstring_undefined; + ret->exitCode = XK_NEVERESCAPE; + ret->canBreak = FALSE; + ret->mustBreak = FALSE; + ret->isJumpPoint = FALSE; + ret->edata = exprData_undefined; + + return (ret); +} + +static /*@notnull@*/ /*@special@*/ exprNode + exprNode_createSemiCopy (exprNode e) + /*@defines result@*/ + /*@post:isnull result->edata, result->etext, result->sets, + result->msets, result->uses, result->guards@*/ + /*@*/ +{ + if (exprNode_isError (e)) + { + return exprNode_createPlain (ctype_unknown); + } + else + { + exprNode ret = exprNode_new (); + + ret->typ = e->typ; + ret->val = multiVal_copy (e->val); + ret->loc = fileloc_copy (e->loc); + ret->guards = guardSet_undefined; + ret->uses = sRefSet_undefined; + ret->sets = sRefSet_undefined; + ret->msets = sRefSet_undefined; + + ret->kind = XPR_EMPTY; + ret->sref = defref; + ret->etext = cstring_undefined; + ret->exitCode = XK_NEVERESCAPE; + ret->canBreak = FALSE; + ret->mustBreak = FALSE; + ret->isJumpPoint = FALSE; + ret->edata = exprData_undefined; + + return (ret); + } +} + +bool +exprNode_isNullValue (exprNode e) +{ + if (exprNode_isDefined (e)) + { + multiVal m = exprNode_getValue (e); + + if (multiVal_isInt (m)) + { + return (multiVal_forceInt (m) == 0); + } + } + + return FALSE; +} + +static bool +exprNode_isUnknownConstant (/*@notnull@*/ exprNode e) +{ + while (e->kind == XPR_PARENS) + { + e = exprData_getUopNode (e->edata); + llassert (exprNode_isDefined (e)); + } + + if (e->kind == XPR_CONST) + { + multiVal m = exprNode_getValue (e); + + if (multiVal_isUnknown (m)) + { + return TRUE; + } + } + + return FALSE; +} + +/*@only@*/ exprNode + exprNode_numLiteral (ctype c, /*@temp@*/ cstring t, + /*@only@*/ fileloc loc, long val) +{ + exprNode e = exprNode_createLoc (c, loc); + + e->kind = XPR_NUMLIT; + + llassert (multiVal_isUndefined (e->val)); + e->val = multiVal_makeInt (val); + e->edata = exprData_makeLiteral (cstring_copy (t)); + + if (val == 0) + { + e->sref = sRef_makeUnknown (); + sRef_setDefNull (e->sref, e->loc); + } + + DPRINTF (("Num lit: %s / %s", exprNode_unparse (e), ctype_unparse (exprNode_getType (e)))); + return (e); +} + +/*@only@*/ exprNode +exprNode_charLiteral (char c, cstring text, /*@only@*/ fileloc loc) +{ + exprNode e = exprNode_createLoc (ctype_char, loc); + + if (context_getFlag (FLG_CHARINTLITERAL)) + { + e->typ = ctype_makeConj (ctype_char, ctype_int); + } + + e->kind = XPR_NUMLIT; + e->val = multiVal_makeChar (c); + + e->edata = exprData_makeLiteral (cstring_copy (text)); + return (e); +} + +/*@only@*/ exprNode +exprNode_floatLiteral (double d, ctype ct, cstring text, /*@only@*/ fileloc loc) +{ + exprNode e = exprNode_createLoc (ct, loc); + + e->kind = XPR_NUMLIT; + e->val = multiVal_makeDouble (d); + e->edata = exprData_makeLiteral (cstring_copy (text)); + return (e); +} + +multiVal exprNode_getValue (exprNode e) +{ + while (exprNode_isInParens (e)) { + if (e->edata != NULL) { + e = exprData_getUopNode (e->edata); + } else { + break; + } + } + + if (exprNode_isDefined (e)) { + return e->val; + } else { + return multiVal_undefined; + } +} + +/*@only@*/ exprNode +exprNode_stringLiteral (/*@only@*/ cstring t, /*@only@*/ fileloc loc) +{ + exprNode e = exprNode_createLoc (ctype_string, loc); + int len = cstring_length (t) - 2; + char *ts = cstring_toCharsSafe (t); + char *s = cstring_toCharsSafe (cstring_create (len + 1)); + + if (context_getFlag (FLG_STRINGLITERALLEN)) + { + if (len > context_getValue (FLG_STRINGLITERALLEN)) + { + voptgenerror (FLG_STRINGLITERALLEN, + message + ("String literal length (%d) exceeds maximum " + "length (%d): %s", + len, + context_getValue (FLG_STRINGLITERALLEN), + t), + e->loc); + } + } + + strncpy (s, ts+1, size_fromInt (len)); + *(s + len) = '\0'; + + + e->kind = XPR_STRINGLITERAL; + e->val = multiVal_makeString (cstring_fromCharsO (s)); + e->edata = exprData_makeLiteral (t); + e->sref = sRef_makeType (ctype_string); + + if (context_getFlag (FLG_READONLYSTRINGS)) + { + sRef_setAliasKind (e->sref, AK_STATIC, fileloc_undefined); + sRef_setExKind (e->sref, XO_OBSERVER, loc); + } + else + { + sRef_setAliasKind (e->sref, AK_ERROR, fileloc_undefined); + } + + return (e); /* s released */ +} + +exprNode exprNode_fromUIO (cstring c) +{ + fileloc loc = context_getSaveLocation (); + exprNode e = exprNode_createPlain (ctype_unknown); + + e->kind = XPR_VAR; + + if (fileloc_isUndefined (loc)) + { + loc = fileloc_copy (g_currentloc); + } + + e->loc = loc; /* save loc was mangled */ + e->sref = defref; + + if (usymtab_exists (c)) + { + uentry ue = usymtab_lookupEither (c); + + if (uentry_isDatatype (ue) + && uentry_isSpecified (ue)) + { + llfatalerror + (message ("%q: Specified datatype %s used in code, but not defined. " + "(Cannot continue reasonably from this error.)", + fileloc_unparse (e->loc), c)); + } + else + { + BADBRANCH; + } + } + + llassertprint (!usymtab_exists (c), ("Entry exists: %s", c)); + + /* + ** was supercedeGlobalEntry...is this better? + */ + + if (!context_inIterEnd ()) + { + if (context_inMacro ()) + { + if (context_getFlag (FLG_UNRECOG)) + { + voptgenerror + (FLG_MACROUNDEF, + message ("Unrecognized identifier in macro definition: %s", c), e->loc); + } + else + { + flagcode_recordSuppressed (FLG_UNRECOG); + } + } + else + { + voptgenerror + (FLG_UNRECOG, message ("Unrecognized identifier: %s", c), + e->loc); + } + } + + e->edata = exprData_makeId (uentry_makeUnrecognized (c, fileloc_copy (loc))); + + /* No alias errors for unrecognized identifiers */ + sRef_setAliasKind (e->sref, AK_ERROR, loc); + + return (e); +} + +exprNode exprNode_createId (/*@observer@*/ uentry c) +{ + if (uentry_isValid (c)) + { + exprNode e = exprNode_new (); + + e->typ = uentry_getType (c); + + if (uentry_isFunction (c) + && !sRef_isLocalVar (uentry_getSref (c))) + { + e->sref = sRef_undefined; + } + else + { + e->sref = uentry_getSref (c); + } + + if (sRef_isStateUnknown (e->sref) && uentry_isNonLocal (c)) + { + sRef_setDefined (e->sref, fileloc_undefined); + } + + /* + ** yoikes! leaving this out was a heinous bug...that would have been + ** caught if i had lclint working first. gag! + */ + + e->etext = cstring_undefined; + + if (uentry_isEitherConstant (c)) + { + e->kind = XPR_CONST; + e->val = multiVal_copy (uentry_getConstantValue (c)); + } + else + { + e->kind = XPR_VAR; + e->val = multiVal_unknown (); + } + + e->edata = exprData_makeId (c); + e->loc = context_getSaveLocation (); + + if (fileloc_isUndefined (e->loc)) + { + fileloc_free (e->loc); + e->loc = fileloc_copy (g_currentloc); + } + + e->guards = guardSet_new (); + e->sets = sRefSet_new (); + e->msets = sRefSet_new (); + e->uses = sRefSet_new (); + + /*> missing fields, detected by lclint <*/ + e->exitCode = XK_NEVERESCAPE; + e->isJumpPoint = FALSE; + e->canBreak = FALSE; + e->mustBreak = FALSE; + + return e; + } + else + { + return exprNode_createUnknown (); + } +} + +/*@notnull@*/ exprNode +exprNode_fromIdentifier (/*@observer@*/ uentry c) +{ + exprNode ret; + + if (context_justPopped ()) /* watch out! c could be dead */ + { + uentry ce = usymtab_lookupSafe (LastIdentifier ()); + + if (uentry_isValid (ce)) + { + c = ce; + } + else + { + llbuglit ("Looks like Aunt Millie forgot to walk to dog again."); + } + } + + ret = exprNode_fromIdentifierAux (c); + + return ret; +} + + +static /*@only@*/ /*@notnull@*/ exprNode +exprNode_fromIdentifierAux (/*@observer@*/ uentry c) +{ + exprNode e = exprNode_createId (c); + sRef sr = e->sref; + + uentry_setUsed (c, e->loc); + + if (uentry_isVar (c) && sRef_isGlobal (sr)) + { + checkGlobUse (c, FALSE, e); + } + + return (e); +} + +static bool +exprNode_isZero (exprNode e) +{ + if (exprNode_isDefined (e)) + { + multiVal m = exprNode_getValue (e); + + if (multiVal_isInt (m)) + { + return (multiVal_forceInt (m) == 0); + } + } + + return FALSE; +} + +static bool +exprNode_isNonNegative (exprNode e) +{ + if (exprNode_isDefined (e)) + { + multiVal m = exprNode_getValue (e); + + if (multiVal_isInt (m)) + { + return (multiVal_forceInt (m) >= 0); + } + } + + return FALSE; +} + +/* +** a[x] - uses a but NOT a[] +** result sref = a[] (set/use in assignment) +** +** The syntax x[a] is also legal in C, and has the same +** semantics. If ind is an array, and arr is an int, flip +** the arguments. +*/ + +/*@only@*/ exprNode +exprNode_arrayFetch (/*@only@*/ exprNode e1, /*@only@*/ exprNode e2) +{ + /* + ** error in arr, error propagates (no new messages) + ** error in ind, assume valid and continue + */ + + if (exprNode_isError (e1)) + { + exprNode_free (e2); + return (exprNode_makeError ()); + } + else + { + exprNode arr; + exprNode ind; + ctype carr = exprNode_getType (e1); + ctype crarr = ctype_realType (carr); + + /* + ** this sets up funny aliasing, that leads to spurious + ** lclint errors. Hence, the i2 comments. + */ + + if (!ctype_isRealArray (crarr) + && ctype_isRealNumeric (crarr) + && !exprNode_isError (e2) + && ctype_isRealAP (exprNode_getType (e2))) /* fetch like 3[a] */ + { + arr = e2; + ind = e1; + + carr = exprNode_getType (arr); + crarr = ctype_realType (carr); + } + else + { + arr = e1; + ind = e2; + } + + if (sRef_possiblyNull (arr->sref)) + { + if (!usymtab_isGuarded (arr->sref)) + { + if (optgenerror (FLG_NULLDEREF, + message ("Index of %s pointer %q: %s", + sRef_nullMessage (arr->sref), + sRef_unparse (arr->sref), + exprNode_unparse (arr)), + arr->loc)) + { + sRef_showNullInfo (arr->sref); + + /* suppress future messages */ + sRef_setNullError (arr->sref); + } + } + } + + if (exprNode_isError (ind)) + { + if ((ctype_isArrayPtr (crarr) + && !ctype_isFunction (crarr)) + || ctype_isUnknown (carr)) + { + exprNode ret = exprNode_createPartialCopy (arr); + + if (ctype_isKnown (carr)) + { + ret->typ = ctype_baseArrayPtr (crarr); + } + else + { + ret->typ = ctype_unknown; + } + + ret->sref = sRef_makeArrayFetch (arr->sref); + + ret->kind = XPR_FETCH; + + /* + ** Because of funny aliasing (when arr and ind are + ** flipped) spurious errors would be reported here. + */ + + /*@i2@*/ ret->edata = exprData_makePair (arr, ind); + checkSafeUse (ret, arr->sref); + return (ret); + } + else + { + voptgenerror (FLG_TYPE, + message ("Array fetch from non-array (%t): %s[%s]", carr, + exprNode_unparse (e1), exprNode_unparse (e2)), + arr->loc); + exprNode_free (arr); + return (exprNode_makeError ()); + } + } + else + { + if (!ctype_isForceRealInt (&(ind->typ))) + { + ctype rt = ctype_realType (ind->typ); + + if (ctype_isChar (rt)) + { + vnoptgenerror + (FLG_CHARINDEX, + message ("Array fetch using non-integer, %t: %s[%s]", + ind->typ, + exprNode_unparse (e1), exprNode_unparse (e2)), + arr->loc); + } + else if (ctype_isEnum (rt)) + { + vnoptgenerror + (FLG_ENUMINDEX, + message ("Array fetch using non-integer, %t: %s[%s]", + ind->typ, + exprNode_unparse (e1), exprNode_unparse (e2)), + arr->loc); + } + else + { + voptgenerror + (FLG_TYPE, + message ("Array fetch using non-integer, %t: %s[%s]", + ind->typ, + exprNode_unparse (e1), exprNode_unparse (e2)), + arr->loc); + } + + multiVal_free (ind->val); + ind->val = multiVal_unknown (); + } + + if (ctype_isArrayPtr (crarr) && !ctype_isFunction (crarr)) + { + exprNode ret = exprNode_createSemiCopy (arr); + multiVal m = exprNode_getValue (ind); + + ret->typ = ctype_baseArrayPtr (crarr); + ret->kind = XPR_FETCH; + + if (multiVal_isInt (m)) + { + int i = (int) multiVal_forceInt (m); + + if (sRef_isValid (arr->sref)) { + ret->sref = sRef_makeArrayFetchKnown (arr->sref, i); + } else { + ret->sref = sRef_undefined; + } + } + else + { + ret->sref = sRef_makeArrayFetch (arr->sref); + } + + ret->sets = sRefSet_realNewUnion (arr->sets, ind->sets); + ret->msets = sRefSet_realNewUnion (arr->msets, ind->msets); + ret->uses = sRefSet_realNewUnion (arr->uses, ind->uses); + + /* (see comment on spurious errors above) */ + /*@i2@*/ ret->edata = exprData_makePair (arr, ind); + + exprNode_checkUse (ret, ind->sref, ind->loc); + exprNode_checkUse (ret, arr->sref, arr->loc); + + return (ret); + } + else + { + if (ctype_isUnknown (carr)) + { + exprNode ret = exprNode_createPartialCopy (arr); + + ret->kind = XPR_FETCH; + ret->typ = ctype_unknown; + ret->sets = sRefSet_union (ret->sets, ind->sets); + ret->msets = sRefSet_union (ret->msets, ind->msets); + ret->uses = sRefSet_union (ret->uses, ind->uses); + + /* (see comment on spurious errors above) */ + /*@i2@*/ ret->edata = exprData_makePair (arr, ind); + + exprNode_checkUse (ret, ind->sref, ind->loc); + exprNode_checkUse (ret, arr->sref, arr->loc); + return (ret); + } + else + { + voptgenerror + (FLG_TYPE, + message ("Array fetch from non-array (%t): %s[%s]", carr, + exprNode_unparse (e1), exprNode_unparse (e2)), + arr->loc); + + exprNode_free (arr); + exprNode_free (ind); + + return (exprNode_makeError ()); + } + } + } + } + BADEXIT; +} + + +static int +checkArgs (uentry fcn, /*@dependent@*/ exprNode f, ctype t, + exprNodeList args, exprNode ret) +{ + return (checkArgsReal (fcn, f, ctype_argsFunction (t), args, FALSE, ret)); +} + +/* +** checkPrintfArgs --- checks arguments for printf-like functions +** Arguments before ... have already been checked. +** The argument before the ... is a char *. +** argno is the format string argument. +*/ + +static void +checkPrintfArgs (/*@notnull@*/ /*@dependent@*/ exprNode f, uentry fcn, + exprNodeList args, exprNode ret, int argno) +{ + /* + ** the last argument before the elips is the format string + */ + + int i = argno; + fileloc formatloc; + int nargs = exprNodeList_size (args); + uentryList params = uentry_getParams (fcn); + exprNode a; + + /* + ** These should be ensured by checkSpecialFunction + */ + + llassert (uentryList_size (params) == argno + 1); + llassert (uentry_isElipsisMarker (uentryList_getN (params, argno))); + + a = exprNodeList_getN (args, argno - 1); + formatloc = fileloc_copy (exprNode_loc (a)); + + if (exprNode_isDefined (a) && exprNode_isStringLiteral (a) + && exprNode_knownStringValue (a)) + { + char *format = cstring_toCharsSafe (multiVal_forceString (exprNode_getValue (a))); + char *code = format; + char *ocode = code; + + nargs = exprNodeList_size (args); + + while ((code = strchr (code, '%')) != NULL) + { + char *origcode = code; + char key = *(++code); + ctype modtype = ctype_int; + bool modified = FALSE; + + fileloc_addColumn (formatloc, code - ocode); + + /* ignore flags */ + while (isFlagKey (key)) + { + key = *(++code); + fileloc_incColumn (formatloc); + } + + if (key == 'm') /* skipped in syslog */ + { + continue; + } + + /* ignore field width */ + while (isdigit ((int) key) != 0) + { + key = *(++code); + fileloc_incColumn (formatloc); + } + + /* ignore precision */ + if (key == '.') + { + key = *(++code); + fileloc_incColumn (formatloc); + + /* + ** In printf, '*' means: read the next arg as an int for the + ** field width. This seems to be missing from my copy of the + ** standard x3.159-1989. Setion 4.9.6.1 refers to * (described + ** later) but never does. + */ + + if (key == '*') + { + ; /* don't do anything --- handle later */ + } + else + { + while (isdigit ((int) key) != 0) + { + key = *(++code); + fileloc_incColumn (formatloc); + } + } + } + + if (key == 'h') + { + modtype = ctype_sint; /* short */ + key = *(++code); + fileloc_incColumn (formatloc); + } + else if (key == 'l' || key == 'L') + { + modtype = ctype_lint; /* long */ + key = *(++code); + fileloc_incColumn (formatloc); + } + else + { + ; /* no modifier */ + } + + /* now, key = type of conversion to apply */ + ++code; + fileloc_incColumn (formatloc); + + if (key != '%') + { + if (i >= nargs) + { + if (optgenerror + (FLG_TYPE, + message ("No argument corresponding to %q format " + "code %d (%%%h): \"%s\"", + uentry_getName (fcn), + i, key, + cstring_fromChars (format)), + f->loc)) + { + if (fileloc_isDefined (formatloc) + && context_getFlag (FLG_SHOWCOL)) + { + llgenindentmsg (cstring_makeLiteral ("Corresponding format code"), + formatloc); + } + } + i++; + } + else + { + a = exprNodeList_getN (args, i); + i++; + + if (!exprNode_isError (a)) + { + ctype expecttype; + + switch (key) + { + case '*': /* int argument for fieldwidth */ + expecttype = ctype_int; + *(--code) = '%'; /* convert it for next code */ + fileloc_subColumn (formatloc, 1); + /*@switchbreak@*/ break; + case 'u': + case 'o': + expecttype = ctype_combine (ctype_uint, modtype); + /*@switchbreak@*/ break; + + case 'i': /* int argument */ + case 'd': + expecttype = ctype_combine (ctype_int, modtype); + /*@switchbreak@*/ break; + + case 'x': /* unsigned int */ + case 'X': + expecttype = ctype_combine (ctype_uint, modtype); + /*@switchbreak@*/ break; + + case 'e': + case 'E': + case 'g': + case 'G': + case 'f': /* double */ + expecttype = ctype_combine (ctype_double, modtype); + /*@switchbreak@*/ break; + + case 'c': /* int converted to char (check its a char?) */ + expecttype = ctype_makeConj (ctype_char, ctype_uchar); + /*@switchbreak@*/ break; + + case 's': /* string */ + expecttype = ctype_string; + /*@switchbreak@*/ break; + case '[': + /* skip to ']' */ + while (((key = *(++code)) != ']') + && (key != '\0')) + { + fileloc_incColumn (formatloc); + } + + if (key == '\0') + { + llfatalerrorLoc + (message ("Bad character set format: %s", + cstring_fromChars (origcode))); + } + + expecttype = ctype_string; + /*@switchbreak@*/ break; + + case 'p': /* pointer */ + expecttype = ctype_makePointer (ctype_void); + /* really! */ + /*@switchbreak@*/ break; + + case 'n': /* pointer to int, modified by call! */ + expecttype = ctype_combine (ctype_makePointer (ctype_int), modtype); + modified = TRUE; + uentry_setDefState (regArg, SS_ALLOCATED); /* corresponds to out */ + /*@switchbreak@*/ break; + + case 'm': /* in a syslog, it doesn't consume an argument */ + /* should check we're really doing syslog */ + + /*@switchbreak@*/ break; + + + default: + expecttype = ctype_unknown; + + voptgenerror + (FLG_FORMATCODE, + message ("Unrecognized format code: %s", + cstring_fromChars (origcode)), + fileloc_isDefined (formatloc) + ? formatloc : g_currentloc); + + /*@switchbreak@*/ break; + } + + if (!(exprNode_matchArgType (expecttype, a))) + { + if (ctype_isVoidPointer (expecttype) + && ctype_isRealAbstract (a->typ) + && (context_getFlag (FLG_ABSTVOIDP))) + { + ; + } + else + { + if (llgenformattypeerror + (expecttype, exprNode_undefined, + a->typ, a, + message ("Format argument %d to %q (%%%h) expects " + "%t gets %t: %s", + i - argno, + uentry_getName (fcn), + key, expecttype, + a->typ, exprNode_unparse (a)), + a->loc)) + { + if (fileloc_isDefined (formatloc) + && context_getFlag (FLG_SHOWCOL)) + { + llgenindentmsg + (cstring_makeLiteral + ("Corresponding format code"), + formatloc); + } + } + } + } + + uentry_setType (regArg, expecttype); + checkOneArg (regArg, a, f, FALSE, i+1, nargs); + + if (ctype_equal (expecttype, ctype_string)) + { + exprNode_checkUse (a, sRef_makePointer (a->sref), a->loc); + } + + uentry_setType (regArg, ctype_unknown); + uentry_fixupSref (regArg); + + if (modified) + { + exprNode_checkCallModifyVal (a->sref, args, f, ret); + } + } + else + { + ; + } + } + } + ocode = code; + } + + if (i < nargs) + { + voptgenerror (FLG_TYPE, + message ("Format string for %q has %d arg%p, given %d", + uentry_getName (fcn), i - argno, nargs - argno), + f->loc); + } + } + else + { + /* no checking possible for compile-time unknown format strings */ + } + + fileloc_free (formatloc); +} + +static void +checkScanfArgs (/*@notnull@*/ /*@dependent@*/ exprNode f, uentry fcn, + exprNodeList args, exprNode ret, int argno) +{ + int i = argno; + fileloc formatloc; + int nargs = exprNodeList_size (args); + uentryList params = uentry_getParams (fcn); + exprNode a; + + /* + ** These should be ensured by checkSpecialFunction + */ + + llassert (uentryList_size (params) == argno + 1); + llassert (uentry_isElipsisMarker (uentryList_getN (params, argno))); + + a = exprNodeList_getN (args, argno - 1); + formatloc = fileloc_copy (exprNode_loc (a)); + + if (exprNode_isDefined (a) && exprNode_isStringLiteral (a) + && exprNode_knownStringValue (a)) + { + char *format = cstring_toCharsSafe (multiVal_forceString (exprNode_getValue (a))); + char *code = format; + char *ocode = code; + + nargs = exprNodeList_size (args); + + while ((code = strchr (code, '%')) != NULL) + { + char *origcode = code; + char key = *(++code); + ctype modtype = ctype_int; + char modifier = '\0'; + bool modified = TRUE; + bool ignore = FALSE; + + fileloc_addColumn (formatloc, code - ocode); + + /* + ** this is based on ANSI standard library description of fscanf + ** (from ANSI standard X3.159-1989, 4.9.6.1) + */ + + /* '*' suppresses assignment (does not need match argument) */ + + if (key == '*') + { + key = *(++code); + modified = FALSE; + ignore = TRUE; + fileloc_incColumn (formatloc); + } + + /* ignore field width */ + while (isdigit ((int) key) != 0) + { + key = *(++code); + fileloc_incColumn (formatloc); + } + + if (key == 'h') + { + modtype = ctype_sint; /* short */ + key = *(++code); + fileloc_incColumn (formatloc); + } + else if (key == 'l' || key == 'L') + { + modtype = ctype_lint; /* long */ + modifier = key; + + key = *(++code); + fileloc_incColumn (formatloc); + } + else + { + ; /* no modifier */ + } + + /* now, key = type of conversion to apply */ + ++code; + fileloc_incColumn (formatloc); + + if (key != '%') + { + if (ignore) + { + ; + } + else + { + if (i >= nargs) + { + if (optgenerror + (FLG_TYPE, + message ("No argument corresponding to %q format " + "code %d (%%%h): \"%s\"", + uentry_getName (fcn), + i, key, + cstring_fromChars (format)), + f->loc)) + { + if (fileloc_isDefined (formatloc) + && context_getFlag (FLG_SHOWCOL)) + { + llgenindentmsg + (cstring_makeLiteral ("Corresponding format code"), + formatloc); + } + } + i++; + } + else + { + a = exprNodeList_getN (args, i); + i++; + + if (!exprNode_isError (a)) + { + ctype expecttype; + + switch (key) + { + case '*': /* int argument for fieldwidth */ + expecttype = ctype_makePointer (ctype_int); + *(--code) = '%'; /* convert it for next code */ + fileloc_subColumn (formatloc, 1); + /*@switchbreak@*/ break; + case 'u': + case 'o': + expecttype = ctype_makePointer (ctype_combine (ctype_uint, modtype)); + /*@switchbreak@*/ break; + + case 'i': + case 'd': + case 'x': + case 'X': /* unsigned int */ + expecttype = ctype_makePointer (ctype_combine (ctype_int, modtype)); + /*@switchbreak@*/ break; + + case 'e': + case 'E': + case 'g': + case 'G': + case 'f': + /* printf is double, scanf is float! */ + + if (modifier == 'l') + { + expecttype = ctype_makePointer (ctype_double); + } + else if (modifier == 'L') + { + expecttype = ctype_makePointer (ctype_ldouble); + } + else + { + llassert (modifier == '\0'); + expecttype = ctype_makePointer (ctype_float); + } + /*@switchbreak@*/ break; + + case 'c': /* int converted to char (check its a char?) */ + expecttype = ctype_makePointer (ctype_makeConj (ctype_char, ctype_uchar)); + /*@switchbreak@*/ break; + + case 's': /* string */ + expecttype = ctype_string; + /*@switchbreak@*/ break; + + case '[': + /* skip to ']' */ + while (((key = *(++code)) != ']') + && (key != '\0')) + { + fileloc_incColumn (formatloc); + } + + if (key == '\0') + { + llfatalerrorLoc + (message ("Bad character set format: %s", + cstring_fromChars (origcode))); + } + + expecttype = ctype_string; + /*@switchbreak@*/ break; + + case 'p': /* pointer */ + expecttype = ctype_unknown; + /* really! */ + /*@switchbreak@*/ break; + + case 'n': /* pointer to int, modified by call! */ + expecttype = ctype_makePointer (ctype_int); + /*@switchbreak@*/ break; + + default: + expecttype = ctype_unknown; + + voptgenerror + (FLG_FORMATCODE, + message ("Unrecognized format code: %s", + cstring_fromChars (origcode)), + fileloc_isDefined (formatloc) + ? formatloc : g_currentloc); + + /*@switchbreak@*/ break; + } + + if (!(exprNode_matchArgType (expecttype, a))) + { + if (ctype_isVoidPointer (expecttype) + && ctype_isRealAbstract (a->typ) + && (context_getFlag (FLG_ABSTVOIDP))) + { + ; + } + else + { + if (modifier != '\0') + { + if (llgenformattypeerror + (expecttype, exprNode_undefined, + a->typ, a, + message ("Format argument %d to %q (%%%h%h) expects " + "%t gets %t: %s", + i - argno, + uentry_getName (fcn), + modifier, + key, expecttype, + a->typ, exprNode_unparse (a)), + a->loc)) + { + if (fileloc_isDefined (formatloc) + && context_getFlag (FLG_SHOWCOL)) + { + llgenindentmsg + (cstring_makeLiteral + ("Corresponding format code"), + formatloc); + } + } + + } + else + { + if (llgenformattypeerror + (expecttype, exprNode_undefined, + a->typ, a, + message ("Format argument %d to %q (%%%h) expects " + "%t gets %t: %s", + i - argno, + uentry_getName (fcn), + key, expecttype, + a->typ, exprNode_unparse (a)), + a->loc)) + { + if (fileloc_isDefined (formatloc) + && context_getFlag (FLG_SHOWCOL)) + { + llgenindentmsg + (cstring_makeLiteral + ("Corresponding format code"), + formatloc); + } + } + } + } + } + + uentry_setType (outArg, expecttype); + checkOneArg (outArg, a, f, FALSE, i+1, nargs); + uentry_setType (outArg, ctype_unknown); + uentry_fixupSref (outArg); + + if (modified) + { + exprNode_checkCallModifyVal (a->sref, args, f, ret); + } + } + else + { + /* a->sref = defref; */ + } + } + } + } + ocode = code; + } + + if (i < nargs) + { + voptgenerror (FLG_TYPE, + message ("Format string for %q has %d arg%p, given %d", + uentry_getName (fcn), i - argno, nargs - argno), + f->loc); + } + } + else + { + /* no checking possible for compile-time unknown format strings */ + } + + fileloc_free (formatloc); +} + +static void +checkMessageArgs (/*@notnull@*/ /*@dependent@*/ exprNode f, + uentry fcn, + exprNodeList args, + /*@unused@*/ int argno) +{ + /* + ** the last argument before the elips is the format string + */ + + int nargs = exprNodeList_size (args); + int i = argno; + fileloc formatloc; + exprNode a; + + a = exprNodeList_getN (args, argno - 1); + formatloc = fileloc_copy (exprNode_loc (a)); + + if (ctype_isUnknown (cstringType)) { + if (usymtab_existsType (cstring_makeLiteralTemp ("cstring"))) + { + cstringType = usymtab_lookupAbstractType (cstring_makeLiteralTemp ("cstring")); + } + } + + if (ctype_isUnknown (ctypeType)) { + if (usymtab_existsType (cstring_makeLiteralTemp ("ctype"))) + { + ctypeType = usymtab_lookupAbstractType (cstring_makeLiteralTemp ("ctype")); + } + } + + if (ctype_isUnknown (filelocType)) { + if (usymtab_existsType (cstring_makeLiteralTemp ("fileloc"))) + { + filelocType = usymtab_lookupAbstractType (cstring_makeLiteralTemp ("fileloc")); + } + } + + if (exprNode_isDefined (a) && exprNode_isStringLiteral (a) + && exprNode_knownStringValue (a)) + { + cstring format = multiVal_forceString (exprNode_getValue (a)); + char *code = cstring_toCharsSafe (format); + char *ocode = code; + + nargs = exprNodeList_size (args); + + while ((code = strchr (code, '%')) != NULL) + { + char *origcode = code; + char key = *(++code); + bool isOnly = FALSE; + + fileloc_addColumn (formatloc, code - ocode); + + while (key >= '0' && key <= '9') + { + key = *(++code); + fileloc_incColumn (formatloc); + } + + ++code; + fileloc_incColumn (formatloc); + + if (key != '%') + { + if (key == 'p') + { + goto nextKey; + } + + if (i >= nargs) + { + voptgenerror + (FLG_TYPE, + message ("Message missing format arg %d (%%%h): \"%s\"", + i + 1, key, format), + f->loc); + i++; + } + else + { + a = exprNodeList_getN (args, i); + i++; + + nextKey: + if (!exprNode_isError (a)) + { + ctype expecttype; + + /*@-loopswitchbreak@*/ + + switch (key) + { + case 'c': + case 'h': + expecttype = ctype_char; break; + case 's': + expecttype = cstringType; break; + case 'q': + expecttype = cstringType; isOnly = TRUE; break; + case 'x': + expecttype = cstringType; isOnly = TRUE; break; + case 'd': expecttype = ctype_int; break; + case 'u': expecttype = ctype_uint; break; + case 'w': expecttype = ctype_ulint; break; + case 'f': expecttype = ctype_float; break; + case 'b': expecttype = ctype_bool; break; + case 't': expecttype = ctypeType; break; + case 'l': expecttype = filelocType; break; + case 'p': /* a wee bit of a hack methinks */ + expecttype = ctype_int; + break; + case 'r': expecttype = ctype_bool; break; + default: + expecttype = ctype_unknown; + voptgenerror + (FLG_FORMATCODE, + message ("Unrecognized format code: %s", + cstring_fromChars (origcode)), + fileloc_isDefined (formatloc) + ? formatloc : g_currentloc); + break; + } + /*@=loopswitchbreak@*/ + + if (!(exprNode_matchArgType (expecttype, a))) + { + if (ctype_isVoidPointer (expecttype) + && ctype_isRealAbstract (a->typ) + && (context_getFlag (FLG_ABSTVOIDP))) + { + ; + } + else + { + if (llgenformattypeerror + (expecttype, exprNode_undefined, + a->typ, a, + message ("Format argument %d to %q (%%%h) expects " + "%t gets %t: %s", + i - argno, + uentry_getName (fcn), + key, expecttype, + a->typ, exprNode_unparse (a)), + a->loc)) + { + if (fileloc_isDefined (formatloc) + && context_getFlag (FLG_SHOWCOL)) + { + llgenindentmsg + (cstring_makeLiteral + ("Corresponding format code"), + formatloc); + } + } + } + } + + if (ctype_equal (expecttype, cstringType)) + { + if (isOnly) + { + checkOneArg (csOnlyArg, a, f, FALSE, i+1, nargs); + uentry_fixupSref (csOnlyArg); + } + else + { + checkOneArg (csArg, a, f, FALSE, i+1, nargs); + uentry_fixupSref (csArg); + } + } + else + { + checkOneArg (regArg, a, f, FALSE, i+1, nargs); + uentry_fixupSref (regArg); + } + } + } + } + } + + if (i < nargs) + { + voptgenerror (FLG_TYPE, + message ("Format string for %q has %d arg%p, given %d", + uentry_getName (fcn), i - argno, nargs -argno), + f->loc); + } + } + else + { + /* no checking possible for compile-time unknown format strings */ + } + + fileloc_free (formatloc); +} + +static void + checkExpressionDefinedAux (/*@notnull@*/ exprNode e1, + /*@notnull@*/ exprNode e2, + sRefSet sets1, + sRefSet sets2, + lltok op, + flagcode flag) +{ + bool hadUncon = FALSE; + + if (sRef_isGlobal (sRef_getRootBase (e1->sref)) && + sRefSet_hasUnconstrained (sets2)) + { + voptgenerror + (FLG_EVALORDERUNCON, + message + ("Expression may have undefined behavior (%q used in right operand " + "may set global variable %q used in left operand): %s %s %s", + sRefSet_unparseUnconstrained (sets2), + sRef_unparse (sRef_getRootBase (e1->sref)), + exprNode_unparse (e1), lltok_unparse (op), exprNode_unparse (e2)), + e2->loc); + } + + if (sRef_isGlobal (sRef_getRootBase (e2->sref)) && + sRefSet_hasUnconstrained (sets1)) + { + voptgenerror + (FLG_EVALORDERUNCON, + message + ("Expression has undefined behavior (%q used in left operand " + "may set global variable %q used in right operand): %s %s %s", + sRefSet_unparseUnconstrained (sets1), + sRef_unparse (e2->sref), + exprNode_unparse (e1), lltok_unparse (op), exprNode_unparse (e2)), + e2->loc); + } + + sRefSet_realElements (e1->uses, sr) + { + if (sRef_isMeaningful (sr) && sRefSet_member (sets2, sr)) + { + voptgenerror + (FLG_EVALORDER, + message + ("Expression has undefined behavior (left operand uses %q, " + "modified by right operand): %s %s %s", + sRef_unparse (sr), + exprNode_unparse (e1), lltok_unparse (op), exprNode_unparse (e2)), + e2->loc); + } + } end_sRefSet_realElements; + + sRefSet_realElements (sets1, sr) + { + if (sRef_isMeaningful (sr)) + { + if (sRef_same (sr, e2->sref)) + { + voptgenerror + (flag, + message + ("Expression has undefined behavior (value of right operand " + "modified by left operand): %s %s %s", + exprNode_unparse (e1), lltok_unparse (op), exprNode_unparse (e2)), + e2->loc); + } + else if (sRefSet_member (e2->uses, sr)) + { + voptgenerror + (flag, + message + ("Expression has undefined behavior (left operand modifies %q, " + "used by right operand): %s %s %s", + sRef_unparse (sr), + exprNode_unparse (e1), lltok_unparse (op), exprNode_unparse (e2)), + e2->loc); + } + else + { + if (sRefSet_member (sets2, sr)) + { + if (sRef_isUnconstrained (sr)) + { + if (hadUncon) + { + ; + } + else + { + hadUncon = optgenerror + (FLG_EVALORDERUNCON, + message + ("Expression may have undefined behavior. Left operand " + "calls %q; right operand calls %q. The unconstrained " + "functions may modify global state used by " + "the other operand): %s %s %s", + sRefSet_unparseUnconstrained (sets1), + sRefSet_unparseUnconstrained (sets2), + exprNode_unparse (e1), lltok_unparse (op), + exprNode_unparse (e2)), + e2->loc); + } + } + else + { + voptgenerror + (flag, + message + ("Expression has undefined behavior (both " + "operands modify %q): %s %s %s", + sRef_unparse (sr), + exprNode_unparse (e1), + lltok_unparse (op), exprNode_unparse (e2)), + e2->loc); + } + } + } + } + } end_sRefSet_realElements; +} + +static void checkExpressionDefined (exprNode e1, exprNode e2, lltok op) +{ + bool hasError = FALSE; + + if (exprNode_isError (e1) || exprNode_isError (e2)) + { + return; + } + + if (sRefSet_member (e2->sets, e1->sref)) + { + if (e2->kind == XPR_CALL) + { + ; + } + else + { + hasError = optgenerror + (FLG_EVALORDER, + message ("Expression has undefined behavior " + "(value of left operand is modified " + "by right operand): %s %s %s", + exprNode_unparse (e1), lltok_unparse (op), + exprNode_unparse (e2)), + e2->loc); + } + } + + if (context_getFlag (FLG_EVALORDERUNCON)) + { + if (sRefSet_member (e2->msets, e1->sref)) + { + if (e2->kind == XPR_CALL) + { + ; + } + else + { + hasError = optgenerror + (FLG_EVALORDER, + message + ("Expression has undefined behavior (value of left " + "operand may be modified by right operand): %s %s %s", + exprNode_unparse (e1), lltok_unparse (op), + exprNode_unparse (e2)), + e2->loc); + } + } + } + + if (!hasError) + { + checkExpressionDefinedAux (e1, e2, e1->sets, e2->sets, op, FLG_EVALORDER); + + if (context_maybeSet (FLG_EVALORDERUNCON)) + { + checkExpressionDefinedAux (e1, e2, e1->msets, + e2->msets, op, FLG_EVALORDERUNCON); + } + } +} + +static void checkSequencing (exprNode p_f, exprNodeList p_args); + +static int + checkArgsReal (uentry fcn, /*@dependent@*/ exprNode f, uentryList cl, + exprNodeList args, bool isIter, exprNode ret) +{ + int special = 0; + + if (!exprNode_isError (f)) + { + if (!uentryList_isMissingParams (cl)) + { + int nargs = exprNodeList_size (args); + int expectargs = uentryList_size (cl); + ctype last; + int i = 0; + + if (expectargs == 0) + { + if (nargs != 0) + { + if (isIter) + { + voptgenerror + (FLG_TYPE, + message ("Iter %q invoked with %d args, " + "declared void", + uentry_getName (fcn), + nargs), + f->loc); + } + else + { + voptgenerror + (FLG_TYPE, + message ("Function %s called with %d args, " + "declared void", + exprNode_unparse (f), nargs), + f->loc); + } + } + return special; + } + + last = uentry_getType (uentryList_getN (cl, expectargs - 1)); + + exprNodeList_reset (args); + + uentryList_elements (cl, current) + { + ctype ct = uentry_getType (current); + exprNode a; + + if (ctype_isElips (ct)) + { + /* + ** do special checking for printf/scanf library functions + ** + ** this is kludgey code, just for handling the special case + ** + */ + + if (uentry_isPrintfLike (fcn)) + { + checkPrintfArgs (f, fcn, args, ret, i); + special = i; + } + else if (uentry_isScanfLike (fcn)) + { + checkScanfArgs (f, fcn, args, ret, i); + special = i; + } + else if (uentry_isMessageLike (fcn)) + { + checkMessageArgs (f, fcn, args, i); + special = i; + } + else + { + llassert (!uentry_isSpecialFunction (fcn)); + } + + nargs = expectargs; /* avoid errors */ + break; + } + else + { + if (i >= nargs) break; + + a = exprNodeList_current (args); + exprNodeList_advance (args); + + i++; + + if (exprNode_isError (a)) + { + ; + } + else + { + /* + probably necessary? I'm not sure about this one + checkMacroParen (a); + */ + + f->guards = guardSet_union (f->guards, a->guards); + + if (!(exprNode_matchArgType (ct, a))) + { + if (ctype_isVoidPointer (ct) + && (ctype_isPointer (a->typ) + && (ctype_isRealAbstract (ctype_baseArrayPtr (a->typ))))) + { + vnoptgenerror + (FLG_ABSTVOIDP, + message + ("Pointer to abstract type (%t) used " + "as void pointer " + "(arg %d to %q): %s", + a->typ, i, + uentry_getName (fcn), + exprNode_unparse (a)), + a->loc); + } + else + { + if (isIter) + { + (void) gentypeerror + (ct, exprNode_undefined, + a->typ, a, + message + ("Iter %q expects arg %d to " + "be %t gets %t: %s", + uentry_getName (fcn), + i, ct, a->typ, exprNode_unparse (a)), + a->loc); + } + else + { + if (gentypeerror + (ct, + exprNode_undefined, + a->typ, + a, + message + ("Function %q expects arg %d to be %t gets %t: %s", + uentry_getName (fcn), + i, ct, a->typ, exprNode_unparse (a)), + a->loc)) + { + DPRINTF (("Types: %s / %s", + ctype_unparse (ct), + ctype_unparse (a->typ))); + } + + /* + ** Clear null marker for abstract types. + ** (It is not revealed, so suppress future messages.) + */ + + if (ctype_isAbstract (a->typ)) + { + sRef_setNullUnknown (exprNode_getSref (a), a->loc); + } + } + } + } + } + } + } end_uentryList_elements ; + + + if (expectargs != nargs) /* note: not != since we may have ... */ + { + if (ctype_isElips (last)) + { + voptgenerror + (FLG_TYPE, + message ("Function %s called with %d args, expects at least %d", + exprNode_unparse (f), + nargs, expectargs - 1), + f->loc); + } + else + { + if (isIter) + { + voptgenerror + (FLG_TYPE, + message ("Iter %q invoked with %d args, expects %d", + uentry_getName (fcn), nargs, expectargs), + f->loc); + } + else + { + voptgenerror + (FLG_TYPE, + message ("Function %s called with %d args, expects %d", + exprNode_unparse (f), + nargs, expectargs), + f->loc); + } + } + } + } + } + + return special; +} + +/* +** Check for undefined code sequences in function arguments: +** +** one parameter sets something used by another parameter +** one parameter sets something set by another parameter +*/ + +static void +checkSequencingOne (exprNode f, exprNodeList args, + /*@notnull@*/ exprNode el, int argno) +{ + /* + ** Do second loop, iff +undefunspec + */ + + int checkloop; + int numloops = context_maybeSet (FLG_EVALORDERUNCON) ? 2 : 1; + + for (checkloop = 0; checkloop < numloops; checkloop++) + { + sRefSet thissets; + + if (checkloop == 0) + { + thissets = el->sets; + } + else + { + llassert (checkloop == 1); + thissets = el->msets; + } + + sRefSet_realElements (thissets, thisset) + { + int j; + + /*@access exprNodeList@*/ + for (j = 0; j < args->nelements; j++) + { + exprNode jl = args->elements[j]; + int thisargno = j + 1; + + if (thisargno != argno && exprNode_isDefined (jl)) + { + sRefSet otheruses = jl->uses; + + if (sRef_isGlobal (sRef_getRootBase (jl->sref)) && + sRefSet_hasUnconstrained (thissets)) + { + voptgenerror + (FLG_EVALORDERUNCON, + /*@-sefparams@*/ + message + ("%q used in argument %d may set " + "global variable %q used by argument %d: %s(%q)", + cstring_capitalizeFree (sRefSet_unparseUnconstrained (thissets)), + /*@=sefparams@*/ + argno, + sRef_unparse (sRef_getRootBase (jl->sref)), + thisargno, + exprNode_unparse (f), exprNodeList_unparse (args)), + el->loc); + } + + if (sRefSet_member (otheruses, thisset)) + { + if (sRef_isUnconstrained (thisset)) + { + voptgenerror + (FLG_EVALORDERUNCON, + message + ("Unconstrained functions used in arguments %d (%q) " + "and %d (%s) may modify " + "or use global state in undefined way: %s(%q)", + argno, + sRefSet_unparseUnconstrainedPlain (otheruses), + thisargno, + sRef_unconstrainedName (thisset), + exprNode_unparse (f), + exprNodeList_unparse (args)), + el->loc); + } + else + { + voptgenerror + (FLG_EVALORDER, + message + ("Argument %d modifies %q, used by argument %d " + "(order of evaluation of actual parameters is " + "undefined): %s(%q)", + argno, sRef_unparse (thisset), thisargno, + exprNode_unparse (f), exprNodeList_unparse (args)), + el->loc); + } + } + else + { + sRefSet othersets = jl->sets; + + if (sRefSet_member (othersets, thisset)) + { + if (sRef_isUnconstrained (thisset)) + { + voptgenerror + (FLG_EVALORDERUNCON, + message + ("Unconstrained functions used in " + "arguments %d (%q) and %d (%s) may modify " + "or use global state in undefined way: %s(%q)", + argno, + sRefSet_unparseUnconstrainedPlain (othersets), + thisargno, + sRef_unconstrainedName (thisset), + exprNode_unparse (f), exprNodeList_unparse (args)), + el->loc); + } + else + { + voptgenerror + (FLG_EVALORDER, + message + ("Argument %d modifies %q, set by argument %d (order of" + " evaluation of actual parameters is undefined): %s(%q)", + argno, sRef_unparse (thisset), thisargno, + exprNode_unparse (f), exprNodeList_unparse (args)), + el->loc); + } + } + } + } + } + /*@noaccess exprNodeList@*/ + } end_sRefSet_realElements; + } +} + +static void +checkSequencing (exprNode f, exprNodeList args) +{ + if (exprNodeList_size (args) > 1) + { + int i; + exprNode el; + + /*@access exprNodeList*/ + + for (i = 0; i < args->nelements; i++) + { + el = args->elements[i]; + + if (!exprNode_isError (el)) + { + checkSequencingOne (f, args, el, i + 1); + } + } + /*@noaccess exprNodeList*/ + } +} + +/* +** requires le = exprNode_getUentry (f) +*/ + +static void +checkGlobMods (/*@notnull@*/ /*@dependent@*/ exprNode f, + uentry le, exprNodeList args, + /*@notnull@*/ exprNode ret, int specialArgs) +{ + bool isSpec = FALSE; + bool hasMods = FALSE; + cstring fname; + globSet usesGlobs = globSet_undefined; + sRefSet mods = sRefSet_undefined; + bool freshMods = FALSE; + uentryList params = uentryList_undefined; + + /* + ** check globals and modifies + */ + + setCodePoint (); + + if (!uentry_isValid (le)) + { + ctype fr = ctype_realType (f->typ); + + if (ctype_isFunction (fr)) + { + params = ctype_argsFunction (fr); + } + else + { + params = uentryList_missingParams; + } + + if (!context_getFlag (FLG_MODNOMODS) + && !context_getFlag (FLG_GLOBUNSPEC)) + { + checkUnspecCall (f, params, args); + } + + return; + } + + fname = uentry_rawName (le); + + setCodePoint (); + + if (uentry_isFunction (le)) + { + params = uentry_getParams (le); + mods = uentry_getMods (le); + hasMods = uentry_hasMods (le); + usesGlobs = uentry_getGlobs (le); + isSpec = uentry_isSpecified (le); + } + else /* not a function */ + { + ctype ct = ctype_realType (uentry_getType (le)); + + llassertprint (uentry_isVar (le) && ctype_isFunction (ct), + ("checkModGlobs: uentry not a function: %s", + uentry_unparse (le))); + + params = ctype_argsFunction (ct); + } + + /* + ** check globals + */ + + setCodePoint (); + + + globSet_allElements (usesGlobs, el) + { + if (sRef_isValid (el)) + { + if (sRef_isInternalState (el) || sRef_isSystemState (el)) + { + context_usedGlobal (el); + exprNode_checkUse (f, el, f->loc); + + if (context_checkInternalUse ()) + { + if (!context_globAccess (el)) + { + if (sRef_isSystemState (el) + && !context_getFlag (FLG_MODFILESYSTEM)) + { + ; + } + else + { + voptgenerror + (FLG_INTERNALGLOBS, + message + ("Called procedure %s may access %q, but " + "globals list does not include globals %s", + exprNode_unparse (f), + sRef_unparse (el), + cstring_makeLiteralTemp (sRef_isInternalState (el) + ? "internalState" + : "fileSystem")), + f->loc); + } + } + } + } + else if (sRef_isNothing (el) || sRef_isSpecState (el)) + { + ; + } + else + { + uentry gle = sRef_getUentry (el); + sRef sr = sRef_updateSref (el); + + if (sRef_isUndefGlob (el)) + { + sRef_setDefined (sr, f->loc); + exprNode_checkSet (f, sr); + } + else + { + /* + ** check definition + */ + + if (sRef_isAllocated (el)) + { + exprNode_checkSet (f, sr); + } + else + { + if (sRef_isStateUndefined (sr)) + { + voptgenerror + (FLG_GLOBSTATE, + message + ("%s %q used by function undefined before call: %s", + sRef_getScopeName (sr), + sRef_unparse (sr), + exprNode_unparse (f)), + f->loc); + sRef_setDefined (sr, f->loc); + } + exprNode_checkUse (f, sr, f->loc); + } + + checkGlobUse (gle, TRUE, f); + } + + if (sRef_isKilledGlob (el)) + { + sRef_kill (sr, f->loc); + context_usedGlobal (sr); + } + } + } + } end_globSet_allElements; + + /* + ** check modifies + */ + + if (context_hasMods () || context_getFlag (FLG_MODNOMODS)) + { + sRefSet smods = sRefSet_undefined; + + /* + ** NEED to check for modifies anything + */ + + /* + ** check each sRef that called function modifies (ml), is + ** modifiable by tl + */ + + setCodePoint (); + + sRefSet_allElements (mods, s) /* s is something which may be modified */ + { + if (sRef_isKindSpecial (s)) + { + if (sRef_isSpecInternalState (s)) + { + if (context_getFlag (FLG_MODINTERNALSTRICT)) + { + exprNode_checkCallModifyVal (s, args, f, ret); + } + else + { + sRefSet mmods = context_modList (); + + sRefSet_allElements (mmods, el) + { + if (sRef_isInternalState (el)) + { + sRef_setModified (el); + } + } end_sRefSet_allElements ; + } + } + else + { + exprNode_checkCallModifyVal (s, args, f, ret); + } + } + else + { + sRef rb = sRef_getRootBase (s); + + if (sRef_isGlobal (rb)) + { + context_usedGlobal (rb); + } + + if (sRef_isFileStatic (s) + && !fileId_equal (fileloc_fileId (f->loc), + fileloc_fileId (uentry_whereDefined (le)))) + { + smods = sRefSet_insert (smods, s); + } + else + { + exprNode_checkCallModifyVal (s, args, f, ret); + } + } + } end_sRefSet_allElements; + + setCodePoint (); + + /* + ** Static elements in modifies set can have nasty consequences. + ** (I think...have not been able to reproduce a possible bug.) + */ + + if (!sRefSet_isDefined (smods)) + { + mods = sRefSet_newCopy (mods); + freshMods = TRUE; + + sRefSet_allElements (smods, el) + { + bool res = sRefSet_delete (mods, el); + + llassert (res); + } end_sRefSet_allElements; + + sRefSet_free (smods); + /*@-branchstate@*/ + } + /*@=branchstate@*/ + } + else if (sRefSet_isDefined (mods)) + { /* just check observers */ + setCodePoint (); + + sRefSet_allElements (mods, s) /* s is something which may be modified */ + { + sRef rb = sRef_getRootBase (s); + + setCodePoint (); + + if (sRef_isParam (rb)) + { + sRef b = sRef_fixBaseParam (s, args); + + if (sRef_isObserver (b)) + { + exprNode e = exprNodeList_nth (args, sRef_getParam (rb)); + + if (optgenerror + (FLG_MODOBSERVER, + message ("Function call may modify observer%q: %s", + sRef_unparsePreOpt (b), exprNode_unparse (e)), + exprNode_loc (e))) + { + sRef_showExpInfo (b); + } + } + } + } end_sRefSet_allElements; + } + else + { + if (!hasMods) /* no specified modifications */ + { + if (context_getFlag (FLG_MODOBSERVERUNCON)) + { + exprNodeList_elements (args, e) + { + if (exprNode_isDefined (e)) + { + sRef s = exprNode_getSref (e); + + if (sRef_isObserver (s) + && ctype_isMutable (sRef_getType (s))) + { + if (optgenerror + (FLG_MODOBSERVERUNCON, + message + ("Call to unconstrained function %s may modify observer%q: %s", + exprNode_unparse (f), + sRef_unparsePreOpt (s), exprNode_unparse (e)), + exprNode_loc (e))) + { + sRef_showExpInfo (s); + } + } + } + } end_exprNodeList_elements; + } + } + } + + checkAnyCall (f, fname, params, args, hasMods, mods, isSpec, specialArgs); + + ret->uses = sRefSet_union (ret->uses, f->uses); + ret->sets = sRefSet_union (ret->sets, f->sets); + ret->msets = sRefSet_union (ret->msets, f->msets); + + if (freshMods) + { + /* + ** Spurious errors reported, because lclint can't tell + ** mods must be fresh if freshMods is true. + */ + + /*@i@*/ sRefSet_free (mods); + } + + setCodePoint (); +} + +void checkGlobUse (uentry glob, bool isCall, /*@notnull@*/ exprNode e) +{ + if (uentry_isVar (glob)) + { + if (context_inFunctionLike ()) + { + sRef sr = uentry_getSref (glob); + + context_usedGlobal (sr); + + if (context_checkGlobUse (glob)) + { + if (!context_globAccess (sr)) + { + if (isCall) + { + voptgenerror + (FLG_GLOBALS, + message ("Called procedure %s may access %s %q", + exprNode_unparse (e), + sRef_unparseScope (sr), + uentry_getName (glob)), + e->loc); + } + else + { + voptgenerror + (FLG_GLOBALS, + message ("Undocumented use of %s %s", + sRef_unparseScope (sr), + exprNode_unparse (e)), + e->loc); + } + } + } + } + } + else + { + llbug (message ("Global not variable: %q", uentry_unparse (glob))); + } +} + +static /*@only@*/ exprNode +functionCallSafe (/*@only@*/ /*@notnull@*/ exprNode f, + ctype t, /*@keep@*/ exprNodeList args) +{ + /* requires f is a non-error exprNode, with type function */ + cstring fname = exprNode_unparse (f); + uentry le = exprNode_getUentry (f); + exprNode ret = exprNode_createPartialCopy (f); + int special; + + setCodePoint (); + + ret->typ = ctype_returnValue (t); + ret->kind = XPR_CALL; + + ret->edata = exprData_makeCall (f, args); + + /* + ** Order of these steps is very important! + ** + ** Must check for argument dependencies before messing up uses and sets. + */ + + if (context_getFlag (FLG_EVALORDER)) + { + exprNodeList_elements (args, current) + { + if (exprNode_isDefined (current)) + { + exprNode_addUse (current, current->sref); + } + } end_exprNodeList_elements; + + if (context_maybeSet (FLG_EVALORDER) || context_maybeSet (FLG_EVALORDERUNCON)) + { + checkSequencing (f, args); + } + + exprNodeList_elements (args, current) + { + if (exprNode_isDefined (current) && sRef_isMeaningful (current->sref)) + { + exprNode_addUse (ret, sRef_makeDerived (current->sref)); + } + } end_exprNodeList_elements ; + } + + special = checkArgs (le, f, t, args, ret); + checkGlobMods (f, le, args, ret, special); + + setCodePoint (); + + if (uentry_isValid (le) + && (uentry_isFunction (le) + || (uentry_isVariable (le) + && ctype_isFunction (uentry_getType (le))))) + { + exitkind exk = uentry_getExitCode (le); + + /* f->typ is already set to the return type */ + + ret->sref = uentry_returnedRef (le, args); + + if (uentry_isFunction (le) && exprNodeList_size (args) >= 1) + { + qual nullPred = uentry_nullPred (le); + + if (qual_isTrueNull (nullPred)) + { + exprNode arg = exprNodeList_head (args); + + if (exprNode_isDefined (arg)) + { + ret->guards = guardSet_addFalseGuard (ret->guards, arg->sref); + } + } + else if (qual_isFalseNull (nullPred)) + { + exprNode arg = exprNodeList_head (args); + + if (exprNode_isDefined (arg)) + { + ret->guards = guardSet_addTrueGuard (ret->guards, arg->sref); + } + } + else + { + llassert (qual_isUnknown (nullPred)); + } + } + + if (exitkind_isConditionalExit (exk)) + { + /* + ** True exit is: + ** if (arg0) then { exit! } else { ; } + ** False exit is: + ** if (arg0) then { ; } else { exit! } + */ + + exprNode firstArg; + + llassert (!exprNodeList_isEmpty (args)); + firstArg = exprNodeList_head (args); + + if (exprNode_isDefined (firstArg) + && !guardSet_isEmpty (firstArg->guards)) + { + usymtab_trueBranch (guardSet_undefined); + usymtab_altBranch (guardSet_undefined); + + if (exitkind_isTrueExit (exk)) + { + usymtab_popBranches (firstArg, + exprNode_makeMustExit (), + exprNode_undefined, + TRUE, TRUEEXITCLAUSE); + } + else + { + usymtab_popBranches (firstArg, + exprNode_undefined, + exprNode_makeMustExit (), + TRUE, FALSEEXITCLAUSE); + } + } + + ret->exitCode = XK_MAYEXIT; + } + else if (exitkind_mustExit (exk)) + { + ret->exitCode = XK_MUSTEXIT; + } + else if (exitkind_couldExit (exk)) + { + ret->exitCode = XK_MAYEXIT; + } + else + { + ; + } + + if (cstring_equalLit (fname, "exit")) + { + if (exprNodeList_size (args) == 1) + { + exprNode arg = exprNodeList_head (args); + + if (exprNode_isDefined (arg) && exprNode_knownIntValue (arg)) + { + long int val = multiVal_forceInt (exprNode_getValue (arg)); + + if (val != 0) + { + voptgenerror + (FLG_EXITARG, + message + ("Argument to exit has implementation defined behavior: %s", + exprNode_unparse (arg)), + exprNode_loc (arg)); + } + } + } + } + } + else + { + ret->sref = defref; + exprNode_checkSetAny (ret, uentry_rawName (le)); + } + + return (ret); +} + +/* +** this is yucky! should keep the uentry as part of exprNode! +*/ + +/*@observer@*/ uentry +exprNode_getUentry (exprNode e) +{ + if (exprNode_isError (e)) + { + return uentry_undefined; + } + else + { + cstring s = exprNode_rootVarName (e); + uentry ue = usymtab_lookupSafe (s); + + return ue; + } +} + +exprNode +exprNode_makeInitBlock (lltok brace, /*@only@*/ exprNodeList inits) +{ + exprNode ret = exprNode_createPlain (ctype_unknown); + + ret->kind = XPR_INITBLOCK; + ret->edata = exprData_makeCall (exprNode_undefined, inits); + ret->loc = fileloc_update (ret->loc, lltok_getLoc (brace)); + + return (ret); +} + +exprNode +exprNode_functionCall (/*@only@*/ exprNode f, /*@only@*/ exprNodeList args) +{ + ctype t; + + setCodePoint (); + + if (exprNode_isUndefined (f)) + { + exprNode_free (f); + exprNodeList_free (args); + return exprNode_undefined; + } + + t = exprNode_getType (f); + + if (sRef_isLocalVar (f->sref)) + { + exprNode_checkUse (f, f->sref, f->loc); + + if (sRef_possiblyNull (f->sref)) + { + if (!usymtab_isGuarded (f->sref)) + { + if (optgenerror (FLG_NULLDEREF, + message ("Function call using %s pointer %q", + sRef_nullMessage (f->sref), + sRef_unparse (f->sref)), + f->loc)) + { + sRef_showNullInfo (f->sref); + sRef_setNullError (f->sref); + } + } + } + } + + setCodePoint (); + + if (ctype_isRealFunction (t)) + { + exprNode ret = functionCallSafe (f, t, args); + setCodePoint (); + return ret; + } + else if (ctype_isUnknown (t)) + { + exprNode ret = exprNode_createPartialCopy (f); + cstring tstring; + + setCodePoint (); + + ret->typ = t; + exprNodeList_elements (args, current) + { + if (exprNode_isDefined (current)) + { + exprNode_checkUse (ret, current->sref, ret->loc); + + /* + ** also, anything derivable from current->sref may be used + */ + + exprNode_addUse (ret, sRef_makeDerived (current->sref)); + exprNode_mergeUSs (ret, current); + } + } end_exprNodeList_elements; + + ret->edata = exprData_makeCall (f, args); + ret->kind = XPR_CALL; + + tstring = cstring_copy (exprNode_unparse (f)); + + cstring_markOwned (tstring); + exprNode_checkSetAny (ret, tstring); + + return (ret); + } + else + { + voptgenerror (FLG_TYPE, + message ("Call to non-function (type %t): %s", t, + exprNode_unparse (f)), + f->loc); + exprNode_free (f); + exprNodeList_free (args); + + return (exprNode_makeError ()); + } +} + +exprNode +exprNode_fieldAccess (/*@only@*/ exprNode s, /*@only@*/ cstring f) +{ + exprNode ret = exprNode_createPartialCopy (s); + + ret->kind = XPR_FACCESS; + + if (exprNode_isError (s)) + { + ret->edata = exprData_makeField (s, f); + return ret; + } + else + { + ctype t = exprNode_getType (s); + ctype tr = ctype_realType (t); + + checkMacroParen (s); + + ret->edata = exprData_makeField (s, f); + + if (ctype_isStructorUnion (tr)) + { + uentry tf = uentryList_lookupField (ctype_getFields (tr), f); + + if (uentry_isUndefined (tf)) + { + voptgenerror (FLG_TYPE, + message ("Access non-existent field %s of %t: %s", f, t, + exprNode_unparse (ret)), + s->loc); + + return (ret); + } + else + { + uentry_setUsed (tf, exprNode_loc (ret)); + + ret->typ = uentry_getType (tf); + checkSafeUse (ret, s->sref); + + ret->sref = sRef_makeField (s->sref, uentry_rawName (tf)); + return (ret); + } + } + else /* isStructorUnion */ + { + if (ctype_isRealAbstract (tr)) + { + voptgenerror + (FLG_ABSTRACT, + message ("Access field of abstract type (%t): %s.%s", + t, exprNode_unparse (s), f), + s->loc); + ret->typ = ctype_unknown; + } + else + { + if (ctype_isKnown (tr)) + { + voptgenerror + (FLG_TYPE, + message + ("Access field of non-struct or union (%t): %s.%s", + t, exprNode_unparse (s), f), + s->loc); + + ret->typ = ctype_unknown; + } + else + { + cstring sn = cstring_copy (f); + + checkSafeUse (ret, s->sref); + cstring_markOwned (sn); + ret->sref = sRef_makeField (s->sref, sn); + + return (ret); + } + } + return (ret); + } + } + BADEXIT; +} + +exprNode +exprNode_addParens (/*@only@*/ lltok lpar, /*@only@*/ exprNode e) +{ + exprNode ret = exprNode_createPartialCopy (e); + + ret->loc = fileloc_update (ret->loc, lltok_getLoc (lpar)); + ret->kind = XPR_PARENS; + ret->edata = exprData_makeUop (e, lpar); + + if (!exprNode_isError (e)) + { + ret->exitCode = e->exitCode; + ret->canBreak = e->canBreak; + ret->mustBreak = e->mustBreak; + ret->isJumpPoint = e->isJumpPoint; + ret->sref = e->sref; + } + + return ret; +} + +exprNode +exprNode_arrowAccess (/*@only@*/ exprNode s, /*@only@*/ cstring f) +{ + exprNode ret = exprNode_createPartialCopy (s); + + ret->edata = exprData_makeField (s, f); + ret->kind = XPR_ARROW; + + if (exprNode_isError (s)) + { + return (ret); + } + else + { + ctype t = exprNode_getType (s); + ctype tr = ctype_realType (t); + + checkMacroParen (s); + + (void) ctype_fixArrayPtr (tr); /* REWRITE THIS */ + + if (ctype_isRealPointer (tr)) + { + ctype b = ctype_realType (ctype_baseArrayPtr (tr)); + + if (ctype_isStructorUnion (b)) + { + uentry fentry = uentryList_lookupField (ctype_getFields (b), f); + + if (sRef_isKnown (s->sref) && sRef_possiblyNull (s->sref)) + { + if (!usymtab_isGuarded (s->sref) && !context_inProtectVars ()) + { + if (optgenerror + (FLG_NULLDEREF, + message ("Arrow access from %s pointer%q: %s", + sRef_nullMessage (s->sref), + sRef_unparsePreOpt (s->sref), + exprNode_unparse (ret)), + s->loc)) + { + sRef_showNullInfo (s->sref); + sRef_setNullError (s->sref); + } + } + } + + if (uentry_isUndefined (fentry)) + { + voptgenerror + (FLG_TYPE, + message ("Access non-existent field %s of %t: %s", + f, t, exprNode_unparse (ret)), + s->loc); + ret->typ = ctype_unknown; + + return (ret); + } + else + { + /* + ** was safeUse: shouldn't be safe! + ** + ** to do rec->field + ** rec must be defined, + ** *rec must be allocated + ** rec->field need only be defined it if is an rvalue + */ + + uentry_setUsed (fentry, exprNode_loc (ret)); + ret->typ = uentry_getType (fentry); + + exprNode_checkUse (ret, s->sref, s->loc); + + /* exprNode_checkUse (ret, sRef_makePointer (s->sref), s->loc); */ + ret->sref = sRef_makeArrow (s->sref, uentry_rawName (fentry)); + return (ret); + } + } + else /* Pointer to something that is not a struct or union*/ + { + if (ctype_isRealAbstract (tr)) + { + ctype xrt = ctype_forceRealType (tr); + + voptgenerror + (FLG_ABSTRACT, + message ("Arrow access field of abstract type (%t): %s->%s", + t, exprNode_unparse (s), f), + s->loc); + + /* + ** Set the state correctly, as if the abstraction is broken. + */ + + if (ctype_isRealPointer (xrt) && + (b = ctype_realType (ctype_baseArrayPtr (xrt)), + ctype_isStructorUnion (b))) + { + uentry fentry = uentryList_lookupField (ctype_getFields (b), f); + ret->typ = uentry_getType (fentry); + ret->sref = sRef_makeArrow (s->sref, uentry_rawName (fentry)); + } + else + { + ret->typ = ctype_unknown; + ret->sref = sRef_undefined; + } + } + else /* not a struct, union or abstract */ + { + if (ctype_isUnknown (tr)) { + cstring sn = cstring_copy (f); + + DPRINTF (("Here: %s", exprNode_unparse (s))); + + exprNode_checkUse (ret, s->sref, s->loc); + exprNode_checkUse (ret, sRef_makePointer (s->sref), s->loc); + + cstring_markOwned (sn); + ret->sref = sRef_makeArrow (s->sref, sn); + + ret->kind = XPR_ARROW; + return (ret); + } else { + voptgenerror + (FLG_TYPE, + message ("Arrow access field of non-struct or union " + "pointer (%t): %s->%s", + t, exprNode_unparse (s), f), + s->loc); + + ret->typ = ctype_unknown; + ret->sref = sRef_undefined; + } + } + } + } + else /* its not a pointer */ + { + if (!ctype_isUnknown (tr)) + { + voptgenerror + (FLG_TYPE, + message ("Arrow access of non-pointer (%t): %s->%s", + t, exprNode_unparse (s), f), + s->loc); + + ret->typ = ctype_unknown; + ret->sref = sRef_undefined; + } + else + { + cstring sn = cstring_copy (f); + + DPRINTF (("Here: %s", exprNode_unparse (s))); + + exprNode_checkUse (ret, s->sref, s->loc); + exprNode_checkUse (ret, sRef_makePointer (s->sref), s->loc); + + cstring_markOwned (sn); + ret->sref = sRef_makeArrow (s->sref, sn); + + ret->kind = XPR_ARROW; + return (ret); + } + } + + return (ret); + } + BADEXIT; +} + +/* +** only postOp's in C: i++ and i-- +*/ + +exprNode +exprNode_postOp (/*@only@*/ exprNode e, /*@only@*/ lltok op) +{ + /* check modification also */ + /* cstring opname = lltok_unparse (op);*/ + ctype t; + exprNode ret = exprNode_createPartialCopy (e); + + ret->loc = fileloc_update (ret->loc, lltok_getLoc (op)); + ret->kind = XPR_POSTOP; + ret->edata = exprData_makeUop (e, op); + + if (!exprNode_isDefined (e)) + { + return ret; + } + + checkMacroParen (e); + + exprNode_checkUse (ret, e->sref, e->loc); + exprNode_checkSet (ret, e->sref); + + t = exprNode_getType (e); + + if (sRef_isUnsafe (e->sref)) + { + voptgenerror (FLG_MACROPARAMS, + message ("Operand of %s is macro parameter (non-functional): %s%s", + lltok_unparse (op), exprNode_unparse (e), lltok_unparse (op)), + e->loc); + sRef_makeSafe (e->sref); + sRef_makeSafe (ret->sref); + } + + if (ctype_isForceRealNumeric (&t) || ctype_isRealAP (t)) + { + ret->typ = e->typ; + } + else + { + if (ctype_isRealAbstract (t)) + { + voptgenerror + (FLG_ABSTRACT, + message ("Operand of %s is abstract type (%t): %s", + lltok_unparse (op), t, exprNode_unparse (e)), + e->loc); + } + else + { + voptgenerror + (FLG_TYPE, + message ("Operand of %s is non-numeric (%t): %s", + lltok_unparse (op), t, exprNode_unparse (e)), + e->loc); + } + ret->typ = ctype_unknown; + } + + /* if (ctype_isZero (t)) e->typ = ctype_int; */ + + exprNode_checkModify (e, ret); + + return ret; +} + +exprNode +exprNode_preOp (/*@only@*/ exprNode e, /*@only@*/ lltok op) +{ + bool checkMod = FALSE; + ctype te, tr; + int opid = lltok_getTok (op); + exprNode ret = exprNode_createSemiCopy (e); + + exprNode_copySets (ret, e); + + multiVal_free (ret->val); + ret->val = multiVal_undefined; + ret->loc = fileloc_update (ret->loc, lltok_getLoc (op)); + ret->kind = XPR_PREOP; + ret->edata = exprData_makeUop (e, op); + + if (exprNode_isError (e)) + { + return ret; + } + + checkMacroParen (e); + + te = exprNode_getType (e); + tr = ctype_realType (te); + + if (opid != TAMPERSAND) + { + exprNode_checkUse (ret, e->sref, e->loc); + + if (ctype_isRealAbstract (tr) + && (!(ctype_isRealBool (te) && (opid == TEXCL)))) + { + if (optgenerror (FLG_ABSTRACT, + message ("Operand of %s is abstract type (%t): %s", + lltok_unparse (op), tr, + exprNode_unparse (ret)), + e->loc)) + { + tr = te = ctype_unknown; + ret->typ = ctype_unknown; + sRef_setNullError (e->sref); + } + } + } + + switch (opid) + { + case INC_OP: + case DEC_OP: /* should also check modification! */ + + if (sRef_isMacroParamRef (e->sref)) + { + voptgenerror + (FLG_MACROPARAMS, + message ("Operand of %s is macro parameter (non-functional): %s", + lltok_unparse (op), exprNode_unparse (ret)), + e->loc); + } + else + { + exprNode_checkSet (ret, e->sref); + } + + if (ctype_isForceRealNumeric (&tr) || ctype_isRealAP (tr)) + { + } + else + { + if (context_msgStrictOps ()) + { + voptgenerror + (FLG_STRICTOPS, + message ("Operand of %s is non-numeric (%t): %s", + lltok_unparse (op), te, exprNode_unparse (ret)), + e->loc); + } + ret->typ = ctype_int; + } + + checkMod = TRUE; + break; + + case TMINUS: + case TPLUS: + if (ctype_isForceRealNumeric (&tr)) + { + if (opid == TMINUS) + { + ret->val = multiVal_invert (exprNode_getValue (e)); + } + else + { + ret->val = multiVal_copy (exprNode_getValue (e)); + } + } + else + { + if (context_msgStrictOps ()) + { + voptgenerror + (FLG_STRICTOPS, + message ("Operand of %s is non-numeric (%t): %s", + lltok_unparse (op), te, exprNode_unparse (ret)), + e->loc); + } + + ret->typ = ctype_int; + } + break; + + case TEXCL: /* maybe this should be restricted */ + guardSet_flip (ret->guards); + + if (ctype_isRealBool (te)) + { + ; + } + else + { + if (ctype_isRealPointer (tr)) + { + if (sRef_isKnown (e->sref)) + { + ret->guards = guardSet_addFalseGuard (ret->guards, e->sref); + } + + voptgenerror2n + (FLG_BOOLOPS, FLG_PTRNEGATE, + message ("Operand of %s is non-boolean (%t): %s", + lltok_unparse (op), te, exprNode_unparse (ret)), + e->loc); + } + else + { + voptgenerror + (FLG_BOOLOPS, + message ("Operand of %s is non-boolean (%t): %s", + lltok_unparse (op), te, exprNode_unparse (ret)), + e->loc); + } + + ret->typ = ctype_bool; + } + break; + + case TTILDE: + if (ctype_isForceRealInt (&tr)) + { + } + else + { + if (context_msgStrictOps ()) + { + voptgenerror + (FLG_STRICTOPS, + message ("Operand of %s is non-integer (%t): %s", + lltok_unparse (op), te, exprNode_unparse (ret)), + e->loc); + } + + if (ctype_isInt (e->typ)) + { + ret->typ = e->typ; + } + else + { + ret->typ = ctype_int; + } + } + break; + + case TAMPERSAND: + ret->typ = ctype_makePointer (e->typ); + + if (sRef_isKnown (e->sref)) + { + ret->sref = sRef_makeAddress (e->sref); + } + + break; + + case TMULT: + + if (ctype_isAP (tr)) + { + ret->typ = ctype_baseArrayPtr (e->typ); + } + else + { + if (ctype_isKnown (te)) + { + if (ctype_isFunction (te)) + { + ret->typ = e->typ; + + voptgenerror + (FLG_FCNDEREF, + message ("Dereference of function type (%t): %s", + te, exprNode_unparse (ret)), + e->loc); + } + else + { + voptgenerror (FLG_TYPE, + message ("Dereference of non-pointer (%t): %s", + te, exprNode_unparse (ret)), + e->loc); + ret->typ = ctype_unknown; + } + } + else + { + ret->typ = ctype_unknown; + } + + } + + if (sRef_isKnown (e->sref)) + { + if (sRef_possiblyNull (e->sref)) + { + if (!usymtab_isGuarded (e->sref) && !context_inProtectVars ()) + { + if (optgenerror + (FLG_NULLDEREF, + message ("Dereference of %s pointer %q: %s", + sRef_nullMessage (e->sref), + sRef_unparse (e->sref), + exprNode_unparse (ret)), + e->loc)) + { + sRef_showNullInfo (e->sref); + sRef_setNotNull (e->sref, e->loc); /* suppress future messages */ + } + } + } + + ret->sref = sRef_makePointer (e->sref); + } + break; + + default: + llbug (message ("exprNode_preOp: unhandled op: %s", lltok_unparse (op))); + } + + if (checkMod) + { + exprNode_checkModify (e, ret); + } + + return ret; +} + +/* +** any reason to disallow sizeof (abstract type) ? +*/ + +/* +** used by both sizeof +*/ + +static +ctype sizeof_resultType (void) +{ + static ctype sizet = ctype_unknown; + + if (ctype_isUnknown (sizet)) + { + if (usymtab_existsType (cstring_makeLiteralTemp ("size_t"))) + { + sizet = uentry_getAbstractType (usymtab_lookup (cstring_makeLiteralTemp ("size_t"))); + } + else + { + sizet = ctype_ulint; + } + } + return sizet; +} + +exprNode +exprNode_sizeofType (/*@only@*/ qtype qt) +{ + exprNode ret = exprNode_create (sizeof_resultType ()); + ctype ct = qtype_getType (qt); + + ret->kind = XPR_SIZEOFT; + ret->edata = exprData_makeSizeofType (qt); + + voptgenerror (FLG_SIZEOFTYPE, + message ("Parameter to sizeof is type %s: %s", + ctype_unparse (ct), + exprNode_unparse (ret)), + ret->loc); + + return (ret); +} + +exprNode +exprNode_alignofType (/*@only@*/ qtype qt) +{ + exprNode ret = exprNode_create (sizeof_resultType ()); + ctype ct = qtype_getType (qt); + + ret->kind = XPR_ALIGNOFT; + ret->edata = exprData_makeSizeofType (qt); + + voptgenerror (FLG_SIZEOFTYPE, + message ("Parameter to alignof is type %s: %s", + ctype_unparse (ct), + exprNode_unparse (ret)), + ret->loc); + + return (ret); +} + +exprNode exprNode_offsetof (qtype qt, cstringList s) +{ + exprNode ret = exprNode_create (sizeof_resultType ()); + ctype ct = qtype_getType (qt); + + ret->kind = XPR_OFFSETOF; + ret->edata = exprData_makeOffsetof (qt, s); + + if (!ctype_isRealSU (ct)) + { + voptgenerror (FLG_TYPE, + message ("First parameter to offsetof is not a " + "struct or union type (type %s): %s", + ctype_unparse (ct), + exprNode_unparse (ret)), + ret->loc); + } + else + { + ctype lt = ct; + + cstringList_elements (s, el) { + uentryList fields; + uentry fld; + + if (ctype_isUndefined (lt)) + { + break; + } + else if (!ctype_isRealSU (lt)) + { + voptgenerror (FLG_TYPE, + message ("Inner offsetof type is not a " + "struct or union type (type %s before field %s): %s", + ctype_unparse (lt), el, + exprNode_unparse (ret)), + ret->loc); + break; + } + else + { + fields = ctype_getFields (ctype_realType (lt)); + fld = uentryList_lookupField (fields, el); + DPRINTF (("Try: %s / %s", ctype_unparse (lt), el)); + + if (uentry_isUndefined (fld)) + { + if (ctype_equal (lt, ct)) { + voptgenerror (FLG_TYPE, + message ("Field %s in offsetof is not the " + "name of a field of %s: %s", + el, + ctype_unparse (ct), + exprNode_unparse (ret)), + ret->loc); + } else { + voptgenerror (FLG_TYPE, + message ("Deep field %s in offsetof is not the " + "name of a field of %s: %s", + el, + ctype_unparse (lt), + exprNode_unparse (ret)), + ret->loc); + } + } + else + { + lt = uentry_getType (fld); + } + } + } end_cstringList_elements; + + /* Should report error if its a bit field - behavior is undefined! */ + } + + return (ret); +} + +/*@only@*/ exprNode +exprNode_sizeofExpr (/*@only@*/ exprNode e) +{ + exprNode ret; + + if (exprNode_isUndefined (e)) + { + ret = exprNode_createLoc (ctype_unknown, fileloc_copy (g_currentloc)); + ret->edata = exprData_makeSingle (e); + ret->typ = sizeof_resultType (); + ret->kind = XPR_SIZEOF; + } + else + { + uentry u = exprNode_getUentry (e); + + ret = exprNode_createPartialCopy (e); + ret->edata = exprData_makeSingle (e); + + ret->typ = sizeof_resultType (); + ret->kind = XPR_SIZEOF; + + if (uentry_isValid (u) + && uentry_isRefParam (u) + && ctype_isRealArray (uentry_getType (u))) + { + voptgenerror + (FLG_SIZEOFFORMALARRAY, + message ("Parameter to sizeof is an array-type function parameter: %s", + exprNode_unparse (ret)), + ret->loc); + } + } + + /* + ** sizeof (x) doesn't "really" use x + */ + + return (ret); +} + +/*@only@*/ exprNode +exprNode_alignofExpr (/*@only@*/ exprNode e) +{ + exprNode ret; + + if (exprNode_isUndefined (e)) + { + ret = exprNode_createLoc (ctype_unknown, fileloc_copy (g_currentloc)); + } + else + { + ret = exprNode_createPartialCopy (e); + } + + ret->edata = exprData_makeSingle (e); + ret->typ = sizeof_resultType (); + ret->kind = XPR_ALIGNOF; + + /* + ** sizeof (x) doesn't "really" use x + */ + + return (ret); +} + +/*@only@*/ exprNode +exprNode_cast (/*@only@*/ lltok tok, /*@only@*/ exprNode e, /*@only@*/ qtype q) +{ + ctype c; + ctype t; + exprNode ret; + + if (exprNode_isError (e)) + { + qtype_free (q); + lltok_release (tok); + return exprNode_undefined; + } + + checkMacroParen (e); + + c = qtype_getType (q); + t = exprNode_getType (e); + + ret = exprNode_createPartialCopy (e); + + ret->loc = fileloc_update (ret->loc, lltok_getLoc (tok)); + ret->typ = c; + ret->kind = XPR_CAST; + ret->edata = exprData_makeCast (tok, e, q); + + if (ctype_isRealSU (ctype_getBaseType (sRef_getType (e->sref)))) + { + /* + ** This is a bit of a hack to avoid a problem + ** when the code does, + ** (some other struct) x + ** ... + ** x->field + */ + + ret->sref = sRef_copy (e->sref); + usymtab_addForceMustAlias (ret->sref, e->sref); + sRef_setTypeFull (ret->sref, c); + DPRINTF (("Cast: %s -> %s", sRef_unparseFull (e->sref), + sRef_unparseFull (ret->sref))); + } + else + { + ret->sref = e->sref; + sRef_setTypeFull (ret->sref, c); + DPRINTF (("Cast 2: -> %s", sRef_unparseFull (ret->sref))); + } + + /* + ** we allow + ** abstract -> void + ** 0 <-> abstract * + ** void * <-> abstract * (if FLG_ABSTVOIDP) + ** abstract * <-> void * (if FLG_ABSTVOIDP) + */ + + if (ctype_isVoid (c)) /* cast to void is always okay --- discard value */ + { + ; + } + else if (ctype_isRealAP (c)) /* casting to array or pointer */ + { + ctype bc = ctype_getBaseType (c); + ctype bt = ctype_getBaseType (t); + ctype rt = ctype_realType (t); + + if (ctype_isFunction (ctype_baseArrayPtr (ctype_realType (c))) + && (ctype_isArrayPtr (rt) + && !ctype_isFunction (ctype_realType (ctype_baseArrayPtr (rt))))) + { + voptgenerror + (FLG_CASTFCNPTR, + message ("Cast from function pointer type (%t) to " + "non-function pointer (%t): %s", + c, t, exprNode_unparse (ret)), + e->loc); + } + + if (!ctype_isFunction (ctype_baseArrayPtr (c)) + && (ctype_isArrayPtr (rt) + && ctype_isFunction (ctype_realType (ctype_baseArrayPtr (rt))))) + { + voptgenerror + (FLG_CASTFCNPTR, + message ("Cast from non-function pointer type (%t) to " + "function pointer (%t): %s", + c, t, exprNode_unparse (ret)), + e->loc); + } + + if (exprNode_isZero (e) && context_getFlag (FLG_ZEROPTR) && + !(ctype_isRealAbstract (bc) + && context_hasAccess (ctype_typeId (bc)))) + { + ; /* okay to cast zero */ + } + else + { + if (ctype_isRealAbstract (bc) + && !context_hasAccess (ctype_typeId (bc))) + { + if (ctype_isVoidPointer (t) || ctype_isUnknown (t)) + { + vnoptgenerror + (FLG_ABSTVOIDP, + message ("Cast to underlying abstract type %t: %s", + c, exprNode_unparse (ret)), + e->loc); + } + else + { + voptgenerror + (FLG_ABSTRACT, + message ("Cast to underlying abstract type %t: %s", + c, exprNode_unparse (ret)), + e->loc); + } + } + + if (ctype_isRealAbstract (bt) + && !context_hasAccess (ctype_typeId (bt))) + { + if (ctype_isUnknown (c) || ctype_isVoidPointer (c)) + { + vnoptgenerror + (FLG_ABSTVOIDP, + message ("Cast from underlying abstract type %t: %s", + t, exprNode_unparse (ret)), + e->loc); + } + else + { + voptgenerror + (FLG_ABSTRACT, + message ("Cast from underlying abstract type %t: %s", + t, exprNode_unparse (ret)), + e->loc); + } + } + } + } + else + { + ctype bt = ctype_realType (ctype_getBaseType (t)); + ctype bc = ctype_realType (ctype_getBaseType (c)); + + if (ctype_isAbstract (bt) && !context_hasAccess (ctype_typeId (bt))) + { + if (ctype_match (c, t)) + { + if (ctype_equal (c, t)) + { + voptgenerror + (FLG_TYPE, + message ("Redundant cast involving abstract type %t: %s", + bt, exprNode_unparse (ret)), + e->loc); + } + } + else + { + voptgenerror + (FLG_ABSTRACT, + message ("Cast from abstract type %t: %s", + bt, exprNode_unparse (ret)), + e->loc); + } + } + + if (ctype_isAbstract (bc) + && !context_hasAccess (ctype_typeId (bc))) + { + if (ctype_match (c, t)) + { + ; + } + else + { + voptgenerror + (FLG_ABSTRACT, + message ("Cast to abstract type %t: %s", bc, + exprNode_unparse (ret)), + e->loc); + } + } + } + + if (ctype_isAbstract (c)) + { + if (sRef_isExposed (e->sref) || sRef_isOnly (e->sref)) + { + /* okay, cast exposed to abstract */ + sRef_clearExKindComplete (ret->sref, fileloc_undefined); + } + else + { + if (ctype_isVisiblySharable (t) + && sRef_isExternallyVisible (e->sref) + && !(ctype_isAbstract (t) + && context_hasAccess (ctype_typeId (t)))) + { + voptgenerror + (FLG_CASTEXPOSE, + message ("Cast to abstract type from externally visible " + "mutable storage exposes rep of %s: %s", + ctype_unparse (c), + exprNode_unparse (e)), + e->loc); + } + } + } + + return (ret); +} + +static bool +evaluationOrderUndefined (lltok op) +{ + int opid = lltok_getTok (op); + + return (opid != AND_OP && opid != OR_OP); +} + +static bool checkIntegral (/*@notnull@*/ exprNode e1, + /*@notnull@*/ exprNode e2, + /*@notnull@*/ exprNode ret, + lltok op) +{ + bool error = FALSE; + + ctype te1 = exprNode_getType (e1); + ctype te2 = exprNode_getType (e2); + + ctype tr1 = ctype_realishType (te1); + ctype tr2 = ctype_realishType (te2); + + if (ctype_isForceRealInt (&tr1) && ctype_isForceRealInt (&tr2)) + { + ; + } + else + { + if (context_msgStrictOps ()) + { + if (!ctype_isInt (tr1) && !ctype_isInt (tr2)) + { + if (ctype_sameName (te1, te2)) + { + error = optgenerror + (FLG_STRICTOPS, + message ("Operands of %s are non-integer (%t): %s", + lltok_unparse (op), te1, + exprNode_unparse (ret)), + e1->loc); + } + else + { + error = optgenerror + (FLG_STRICTOPS, + message ("Operands of %s are non-integers (%t, %t): %s", + lltok_unparse (op), te1, te2, + exprNode_unparse (ret)), + e1->loc); + } + } + else if (!ctype_isInt (tr1)) + { + error = optgenerror + (FLG_STRICTOPS, + message ("Left operand of %s is non-integer (%t): %s", + lltok_unparse (op), te1, exprNode_unparse (ret)), + e1->loc); + } + else + /* !ctype_isInt (te2) */ + { + error = optgenerror + (FLG_STRICTOPS, + message ("Right operand of %s is non-integer (%t): %s", + lltok_unparse (op), te2, exprNode_unparse (ret)), + e2->loc); + } + } + } + + return !error; +} + +/* +** returns exprNode representing e1 op e2 +** +** uses msg if there are errors +** can be used for both assignment ops and regular ops +** +** modifies e1 +*/ + +static /*@only@*/ /*@notnull@*/ exprNode +exprNode_makeOp (/*@keep@*/ exprNode e1, /*@keep@*/ exprNode e2, + /*@keep@*/ lltok op) +{ + ctype te1, te2, tr1, tr2, tret; + int opid = lltok_getTok (op); + bool hasError = FALSE; + exprNode ret; + + if (exprNode_isError (e1)) + { + ret = exprNode_createPartialNVCopy (e2); + } + else + { + ret = exprNode_createPartialNVCopy (e1); + } + + ret->val = multiVal_undefined; + ret->kind = XPR_OP; + ret->edata = exprData_makeOp (e1, e2, op); + + if (exprNode_isError (e1) || exprNode_isError (e2)) + { + if (opid == TLT || opid == TGT || opid == LE_OP || opid == GE_OP + || opid == EQ_OP || opid == NE_OP + || opid == AND_OP || opid == OR_OP) + { + ret->typ = ctype_bool; + } + + if (exprNode_isDefined (e1)) + { + exprNode_checkUse (ret, e1->sref, e1->loc); + } + + if (exprNode_isDefined (e2)) + { + exprNode_mergeUSs (ret, e2); + exprNode_checkUse (ret, e2->sref, e2->loc); + } + + return ret; + } + + tret = ctype_unknown; + te1 = exprNode_getType (e1); + DPRINTF (("te1 = %s / %s", exprNode_unparse (e1), ctype_unparse (te1))); + + te2 = exprNode_getType (e2); + + tr1 = ctype_realishType (te1); + tr2 = ctype_realishType (te2); + + if (opid == OR_OP) + { + ret->guards = guardSet_or (ret->guards, e2->guards); + } + else if (opid == AND_OP) + { + ret->guards = guardSet_and (ret->guards, e2->guards); + } + else + { + /* no guards */ + } + + if (opid == EQ_OP || opid == NE_OP) + { + exprNode temp1 = e1, temp2 = e2; + + /* could do NULL == x */ + + if (exprNode_isNullValue (e1) || exprNode_isUnknownConstant (e1)) + { + temp1 = e2; temp2 = e1; + } + + if (exprNode_isNullValue (temp2) || exprNode_isUnknownConstant (temp2)) + { + reflectNullTest (temp1, (opid == NE_OP)); + guardSet_free (ret->guards); + ret->guards = guardSet_copy (temp1->guards); + } + } + + if (opid == TLT || opid == TGT || opid == LE_OP || opid == GE_OP + || opid == EQ_OP || opid == NE_OP || opid == AND_OP || opid == OR_OP) + { + tret = ctype_bool; + } + + if (anyAbstract (tr1, tr2) && + (!((ctype_isRealBool (te1) || ctype_isRealBool (te2)) && + (opid == AND_OP || opid == OR_OP + || opid == EQ_OP || opid == NE_OP)))) + { + abstractOpError (tr1, tr2, op, e1, e2, e1->loc, e2->loc); + } + else if (ctype_isUnknown (te1) || ctype_isUnknown (te2)) + { + /* unknown types, no comparisons possible */ + } + else + { + switch (opid) + { + case TMULT: /* multiplication and division: */ + case TDIV: /* */ + case MUL_ASSIGN: /* numeric, numeric -> numeric */ + case DIV_ASSIGN: /* */ + + tret = checkNumerics (tr1, tr2, te1, te2, e1, e2, op); + break; + + case TPLUS: /* addition and subtraction: */ + case TMINUS: /* pointer, int -> pointer */ + case SUB_ASSIGN: /* int, pointer -> pointer */ + case ADD_ASSIGN: /* numeric, numeric -> numeric */ + + tr1 = ctype_fixArrayPtr (tr1); + + if ((ctype_isRealPointer (tr1) && !exprNode_isNullValue (e1)) + && (!ctype_isRealPointer (tr2) && ctype_isRealInt (tr2))) + { + /* pointer + int */ + + if (context_msgPointerArith ()) + { + voptgenerror + (FLG_POINTERARITH, + message ("Pointer arithmetic (%t, %t): %s", + te1, te2, exprNode_unparse (ret)), + e1->loc); + } + + if (sRef_possiblyNull (e1->sref) + && !usymtab_isGuarded (e1->sref)) + { + voptgenerror + (FLG_NULLPOINTERARITH, + message ("Pointer arithmetic involving possibly " + "null pointer %s: %s", + exprNode_unparse (e1), + exprNode_unparse (ret)), + e1->loc); + } + + ret->sref = sRef_copy (e1->sref); + + sRef_setNullError (ret->sref); + + /* + ** Fixed for 2.2c: the alias state of ptr + int is dependent, + ** since is points to storage that should not be deallocated + ** through this pointer. + */ + + if (sRef_isOnly (ret->sref) + || sRef_isFresh (ret->sref)) + { + sRef_setAliasKind (ret->sref, AK_DEPENDENT, exprNode_loc (ret)); + } + + tret = e1->typ; + } + else if ((!ctype_isRealPointer(tr1) && ctype_isRealInt (tr1)) + && (ctype_isRealPointer (tr2) && !exprNode_isNullValue (e2))) + { + if (context_msgPointerArith ()) + { + voptgenerror + (FLG_POINTERARITH, + message ("Pointer arithmetic (%t, %t): %s", + te1, te2, exprNode_unparse (ret)), + e1->loc); + } + + if (sRef_possiblyNull (e1->sref) + && !usymtab_isGuarded (e1->sref)) + { + voptgenerror + (FLG_NULLPOINTERARITH, + message ("Pointer arithmetic involving possibly " + "null pointer %s: %s", + exprNode_unparse (e2), + exprNode_unparse (ret)), + e2->loc); + } + + ret->sref = sRef_copy (e2->sref); + + sRef_setNullError (ret->sref); + + /* + ** Fixed for 2.2c: the alias state of ptr + int is dependent, + ** since is points to storage that should not be deallocated + ** through this pointer. + */ + + if (sRef_isOnly (ret->sref) + || sRef_isFresh (ret->sref)) { + sRef_setAliasKind (ret->sref, AK_DEPENDENT, exprNode_loc (ret)); + } + + tret = e2->typ; + ret->sref = e2->sref; + } + else + { + tret = checkNumerics (tr1, tr2, te1, te2, e1, e2, op); + } + + break; + + case LEFT_ASSIGN: /* Shifts: should be unsigned values */ + case RIGHT_ASSIGN: + case LEFT_OP: + case RIGHT_OP: + case TAMPERSAND: /* bitwise & */ + case AND_ASSIGN: + case TCIRC: /* ^ (XOR) */ + case TBAR: + case XOR_ASSIGN: + case OR_ASSIGN: + { + bool reported = FALSE; + flagcode code = FLG_BITWISEOPS; + + if (opid == LEFT_OP || opid == LEFT_ASSIGN + || opid == RIGHT_OP || opid == RIGHT_ASSIGN) { + code = FLG_SHIFTSIGNED; + } + + if (!ctype_isUnsigned (tr1)) + { + if (exprNode_isNonNegative (e1)) { + ; + } else { + reported = optgenerror + (code, + message ("Left operand of %s is not unsigned value (%t): %s", + lltok_unparse (op), te1, + exprNode_unparse (ret)), + e1->loc); + + if (reported) { + te1 = ctype_uint; + } + } + } + else + { + /* right need not be signed for shifts */ + if (code != FLG_SHIFTSIGNED + && !ctype_isUnsigned (tr2)) + { + if (!exprNode_isNonNegative (e2)) { + reported = optgenerror + (code, + message ("Right operand of %s is not unsigned value (%t): %s", + lltok_unparse (op), te2, + exprNode_unparse (ret)), + e2->loc); + } + } + } + + if (!reported) + { + if (!checkIntegral (e1, e2, ret, op)) { + te1 = ctype_unknown; + } + } + + DPRINTF (("Set: %s", ctype_unparse (te1))); + + /* + ** tret is the widest type of te1 and te2 + */ + + tret = ctype_widest (te1, te2); + break; + } + case MOD_ASSIGN: + case TPERCENT: + if (checkIntegral (e1, e2, ret, op)) { + tret = te1; + } else { + tret = ctype_unknown; + } + break; + case EQ_OP: + case NE_OP: + case TLT: /* comparisons */ + case TGT: /* numeric, numeric -> bool */ + if ((ctype_isReal (tr1) && !ctype_isInt (tr1)) + || (ctype_isReal (tr2) && !ctype_isInt (tr2))) + { + ctype rtype = tr1; + bool fepsilon = FALSE; + + if (!ctype_isReal (rtype) || ctype_isInt (rtype)) + { + rtype = tr2; + } + + if (opid == TLT || opid == TGT) + { + uentry ue1 = exprNode_getUentry (e1); + uentry ue2 = exprNode_getUentry (e2); + + /* + ** FLT_EPSILON, etc. really is a variable, not + ** a constant. + */ + + if (uentry_isVariable (ue1)) + { + cstring uname = uentry_rawName (ue1); + + if (cstring_equalLit (uname, "FLT_EPSILON") + || cstring_equalLit (uname, "DBL_EPSILON") + || cstring_equalLit (uname, "LDBL_EPSILON")) + { + fepsilon = TRUE; + } + } + + if (uentry_isVariable (ue2)) + { + cstring uname = uentry_rawName (ue2); + + if (cstring_equalLit (uname, "FLT_EPSILON") + || cstring_equalLit (uname, "DBL_EPSILON") + || cstring_equalLit (uname, "LDBL_EPSILON")) + { + fepsilon = TRUE; + } + } + } + + if (fepsilon) + { + ; /* Don't complain. */ + } + else + { + voptgenerror + (FLG_REALCOMPARE, + message ("Dangerous comparison involving %s types: %s", + ctype_unparse (rtype), + exprNode_unparse (ret)), + ret->loc); + } + } + /*@fallthrough@*/ + case LE_OP: + case GE_OP: + + /* + ** Types should match. + */ + + if (!exprNode_matchTypes (e1, e2)) + { + hasError = gentypeerror + (te1, e1, te2, e2, + message ("Operands of %s have incompatible types (%t, %t): %s", + lltok_unparse (op), te1, te2, exprNode_unparse (ret)), + e1->loc); + + } + + if (hasError + || (ctype_isForceRealNumeric (&tr1) + && ctype_isForceRealNumeric (&tr2)) || + (ctype_isRealPointer (tr1) && ctype_isRealPointer (tr2))) + { + ; /* okay */ + } + else + { + if ((ctype_isRealNumeric (tr1) && ctype_isRealPointer (tr2)) || + (ctype_isRealPointer (tr1) && ctype_isRealNumeric (tr2))) + { + voptgenerror + (FLG_PTRNUMCOMPARE, + message ("Comparison of pointer and numeric (%t, %t): %s", + te1, te2, exprNode_unparse (ret)), + e1->loc); + } + else + { + (void) checkNumerics (tr1, tr2, te1, te2, e1, e2, op); + } + tret = ctype_bool; + } + + /* EQ_OP should NOT be used with booleans (unless one is FALSE) */ + + if ((opid == EQ_OP || opid == NE_OP) && + ctype_isDirectBool (tr1) && ctype_isDirectBool (tr2)) + { + /* + ** is one a variable? + */ + + if (uentry_isVariable (exprNode_getUentry (e1)) + || uentry_isVariable (exprNode_getUentry (e2))) + { + /* + ** comparisons with FALSE are okay + */ + + if (exprNode_isFalseConstant (e1) + || exprNode_isFalseConstant (e2)) + { + ; + } + else + { + voptgenerror + (FLG_BOOLCOMPARE, + message + ("Use of %q with %s variables (risks inconsistency because " + "of multiple true values): %s", + cstring_makeLiteral ((opid == EQ_OP) ? "==" : "!="), + context_printBoolName (), exprNode_unparse (ret)), + e1->loc); + } + } + } + break; + + case AND_OP: /* bool, bool -> bool */ + case OR_OP: + + if (ctype_isForceRealBool (&tr1) && ctype_isForceRealBool (&tr2)) + { + ; + } + else + { + if (context_maybeSet (FLG_BOOLOPS)) + { + if (!ctype_isRealBool (te1) && !ctype_isRealBool (te2)) + { + if (ctype_sameName (te1, te2)) + { + voptgenerror + (FLG_BOOLOPS, + message ("Operands of %s are non-boolean (%t): %s", + lltok_unparse (op), te1, + exprNode_unparse (ret)), + e1->loc); + } + else + { + voptgenerror + (FLG_BOOLOPS, + message + ("Operands of %s are non-booleans (%t, %t): %s", + lltok_unparse (op), te1, te2, exprNode_unparse (ret)), + e1->loc); + } + } + else if (!ctype_isRealBool (te1)) + { + voptgenerror + (FLG_BOOLOPS, + message ("Left operand of %s is non-boolean (%t): %s", + lltok_unparse (op), te1, exprNode_unparse (ret)), + e1->loc); + } + else if (!ctype_isRealBool (te2)) + { + voptgenerror + (FLG_BOOLOPS, + message ("Right operand of %s is non-boolean (%t): %s", + lltok_unparse (op), te2, exprNode_unparse (ret)), + e2->loc); + } + else + { + ; + } + } + tret = ctype_bool; + } + break; + default: { + llfatalbug + (cstring_makeLiteral + ("There has been a problem in the parser. This usually results " + "from using an old version of bison (1.25) to build LCLint. " + "Please upgrade your bison implementation to version 1.28.")); + } + } + } + + DPRINTF (("Return type: %s", ctype_unparse (tret))); + ret->typ = tret; + + exprNode_checkUse (ret, e1->sref, e1->loc); + exprNode_mergeUSs (ret, e2); + exprNode_checkUse (ret, e2->sref, e2->loc); + + return ret; +} + +/*@only@*/ exprNode +exprNode_op (/*@only@*/ exprNode e1, /*@keep@*/ exprNode e2, + /*@only@*/ lltok op) +{ + exprNode ret; + + checkMacroParen (e1); + checkMacroParen (e2); + + if (evaluationOrderUndefined (op) && context_maybeSet (FLG_EVALORDER)) + { + checkExpressionDefined (e1, e2, op); + } + + ret = exprNode_makeOp (e1, e2, op); + return (ret); +} + +static +void exprNode_checkAssignMod (exprNode e1, exprNode ret) +{ + /* + ** This is somewhat bogus! + ** + ** Assigning to a nested observer in a non-observer datatype + ** should not produce an error. + */ + + sRef ref = exprNode_getSref (e1); + + DPRINTF (("Check assign mod: %s", + sRef_unparseFull (ref))); + + if (sRef_isObserver (ref) + || ((sRef_isFileStatic (ref) || sRef_isGlobal (ref)) + && ctype_isArray (ctype_realType (sRef_getType (ref))))) + { + sRef base = sRef_getBase (ref); + + if (sRef_isValid (base) && sRef_isObserver (base)) + { + exprNode_checkModify (e1, ret); + } + else + { + exprNode_checkModifyVal (e1, ret); + } + } + else + { + exprNode_checkModify (e1, ret); + } +} + +exprNode +exprNode_assign (/*@only@*/ exprNode e1, + /*@only@*/ exprNode e2, /*@only@*/ lltok op) +{ + bool isalloc = FALSE; + bool isjustalloc = FALSE; + exprNode ret; + + DPRINTF (("%s [%s] <- %s [%s]", + exprNode_unparse (e1), + ctype_unparse (e1->typ), + exprNode_unparse (e2), + ctype_unparse (e2->typ))); + + if (lltok_getTok (op) != TASSIGN) + { + ret = exprNode_makeOp (e1, e2, op); + } + else + { + ret = exprNode_createPartialCopy (e1); + ret->kind = XPR_ASSIGN; + ret->edata = exprData_makeOp (e1, e2, op); + + if (!exprNode_isError (e2)) + { + ret->sets = sRefSet_union (ret->sets, e2->sets); + ret->msets = sRefSet_union (ret->msets, e2->msets); + ret->uses = sRefSet_union (ret->uses, e2->uses); + } + } + + checkExpressionDefined (e1, e2, op); + + if (exprNode_isError (e1)) + { + if (!exprNode_isError (e2)) + { + ret->loc = fileloc_update (ret->loc, e2->loc); + } + else + { + ret->loc = fileloc_update (ret->loc, g_currentloc); + } + } + + if (!exprNode_isError (e2)) + { + checkMacroParen (e2); + } + + if (exprNode_isDefined (e1)) + { + if (sRef_isMacroParamRef (e1->sref)) + { + if (context_inIterDef ()) + { + uentry ue = sRef_getUentry (e1->sref); + + if (uentry_isYield (ue)) + { + ; + } + else + { + if (fileloc_isDefined (e1->loc)) + { + voptgenerror + (FLG_MACROPARAMS, + message ("Assignment to non-yield iter parameter: %q", + sRef_unparse (e1->sref)), + e1->loc); + } + else + { + voptgenerror + (FLG_MACROPARAMS, + message ("Assignment to non-yield iter parameter: %q", + sRef_unparse (e1->sref)), + g_currentloc); + } + } + } + else + { + if (fileloc_isDefined (e1->loc)) + { + voptgenerror + (FLG_MACROASSIGN, + message ("Assignment to macro parameter: %q", + sRef_unparse (e1->sref)), + e1->loc); + } + else + { + voptgenerror + (FLG_MACROASSIGN, + message ("Assignment to macro parameter: %q", + sRef_unparse (e1->sref)), + g_currentloc); + } + } + } + else + { + exprNode_checkAssignMod (e1, ret); + } + + if (exprNode_isDefined (e2)) + { + if (lltok_getTok (op) == TASSIGN) + { + ctype te1 = exprNode_getType (e1); + ctype te2 = exprNode_getType (e2); + + if (!ctype_forceMatch (te1, te2)) + { + if (exprNode_matchLiteral (te1, e2)) + { + ; + } + else + { + (void) gentypeerror + (te2, e2, te1, e1, + message ("Assignment of %t to %t: %s %s %s", + te2, te1, exprNode_unparse (e1), + lltok_unparse (op), + exprNode_unparse (e2)), + e1->loc); + } + } + } + + exprNode_mergeUSs (ret, e2); + exprNode_checkUse (ret, e2->sref, e2->loc); + + doAssign (e1, e2, FALSE); + ret->sref = e1->sref; + } + else + { + if (exprNode_isDefined (e2)) + { + exprNode_mergeUSs (ret, e2); + exprNode_checkUse (ret, e2->sref, e2->loc); + } + } + + if (sRef_isPointer (e1->sref) && !sRef_isMacroParamRef (e1->sref)) + { + exprNode_checkUse (ret, sRef_getBase (e1->sref), e1->loc); + } + + isjustalloc = sRef_isJustAllocated (e1->sref); + isalloc = sRef_isAllocated (e1->sref); + + if (sRef_isField (e1->sref)) + { + sRef root = sRef_getRootBase (sRef_getBase (e1->sref)); + + if (!sRef_isAllocated (root) && !sRef_isMacroParamRef (root)) + { + exprNode_checkUse (ret, root, e1->loc); + } + + } + + /* + ** be careful! this defines e1->sref. + */ + + if (!sRef_isMacroParamRef (e1->sref)) + { + exprNode_checkSet (ret, e1->sref); + } + + if (isjustalloc) + { + sRef_setAllocatedComplete (e1->sref, exprNode_isDefined (e2) + ? e2->loc : e1->loc); + } + else + { + if (isalloc) + { + sRef_setAllocatedShallowComplete (e1->sref, exprNode_loc (e2)); + } + } + } + + return ret; +} + +exprNode +exprNode_cond (/*@keep@*/ exprNode pred, /*@keep@*/ exprNode ifclause, + /*@keep@*/ exprNode elseclause) +{ + exprNode ret; + + if (!exprNode_isError (pred)) + { + ret = exprNode_createPartialCopy (pred); + checkMacroParen (pred); + exprNode_checkPred (cstring_makeLiteralTemp ("conditional"), pred); + + if (!exprNode_isError (ifclause)) + { + checkMacroParen (ifclause); /* update macro counts! */ + + if (!exprNode_isError (elseclause)) + { + checkMacroParen (elseclause); + + if (!exprNode_matchTypes (ifclause, elseclause)) + { + if (gentypeerror + (exprNode_getType (ifclause), + ifclause, + exprNode_getType (elseclause), + elseclause, + message ("Conditional clauses are not of same type: " + "%s (%t), %s (%t)", + exprNode_unparse (ifclause), + exprNode_getType (ifclause), + exprNode_unparse (elseclause), + exprNode_getType (elseclause)), + ifclause->loc)) + { + ret->sref = sRef_undefined; + ret->typ = ctype_unknown; + } + } + else + { + /* for now...should merge the states */ + ret->sref = ifclause->sref; + ret->typ = ifclause->typ; + + if (exprNode_isNullValue (ifclause)) + { + ret->typ = elseclause->typ; + } + } + + exprNode_checkUse (ret, pred->sref, pred->loc); + exprNode_checkUse (ifclause, ifclause->sref, ifclause->loc); + exprNode_checkUse (elseclause, elseclause->sref, elseclause->loc); + + exprNode_mergeCondUSs (ret, ifclause, elseclause); + + } + else + { + ret->typ = ifclause->typ; + + exprNode_checkUse (pred, pred->sref, pred->loc); + exprNode_checkUse (ifclause, ifclause->sref, ifclause->loc); + + exprNode_mergeCondUSs (ret, ifclause, exprNode_undefined); + } + } + else + { + if (!exprNode_isError (elseclause)) + { + ret->typ = elseclause->typ; + + exprNode_checkUse (pred, pred->sref, pred->loc); + exprNode_checkUse (elseclause, elseclause->sref, elseclause->loc); + + exprNode_mergeCondUSs (ret, exprNode_undefined, elseclause); + } + } + } + else /* pred is error */ + { + if (!exprNode_isError (ifclause)) + { + ret = exprNode_createSemiCopy (ifclause); + + checkMacroParen (ifclause); /* update macro counts! */ + + if (!exprNode_isError (elseclause)) + { + checkMacroParen (elseclause); + + ret->typ = ifclause->typ; + + if (!ctype_forceMatch (ifclause->typ, elseclause->typ)) + { + if (gentypeerror + (exprNode_getType (ifclause), + ifclause, + exprNode_getType (elseclause), + elseclause, + message ("Conditional clauses are not of same type: " + "%s (%t), %s (%t)", + exprNode_unparse (ifclause), + exprNode_getType (ifclause), + exprNode_unparse (elseclause), + exprNode_getType (elseclause)), + ifclause->loc)) + { + ret->typ = ctype_unknown; + } + } + + exprNode_checkUse (ifclause, ifclause->sref, ifclause->loc); + exprNode_checkUse (elseclause, elseclause->sref, elseclause->loc); + + exprNode_mergeCondUSs (ret, ifclause, elseclause); + } + } + else if (!exprNode_isError (elseclause)) /* pred, if errors */ + { + ret = exprNode_createSemiCopy (ifclause); + + ret->typ = elseclause->typ; + checkMacroParen (elseclause); + + exprNode_checkUse (elseclause, elseclause->sref, elseclause->loc); + exprNode_mergeCondUSs (ret, exprNode_undefined, elseclause); + } + else /* all errors! */ + { + ret = exprNode_createLoc (ctype_unknown, g_currentloc); + } + } + + ret->kind = XPR_COND; + ret->edata = exprData_makeCond (pred, ifclause, elseclause); + + if (exprNode_isDefined (ifclause) && exprNode_isDefined (elseclause)) + { + exprNode_combineControl (ret, ifclause, elseclause); + } + + return (ret); +} + +exprNode +exprNode_vaArg (/*@only@*/ lltok tok, /*@only@*/ exprNode arg, /*@only@*/ qtype qt) +{ + ctype totype = qtype_getType (qt); + exprNode ret = + exprNode_createPartialLocCopy (arg, fileloc_copy (lltok_getLoc (tok))); + ctype targ; + + /* + ** check use of va_arg : , type -> type + */ + + if (exprNode_isError (arg)) + { + } + else + { + targ = exprNode_getType (arg); + + /* + ** arg should have be a pointer + */ + + if (!ctype_isUA (targ) || + (!usymId_equal (ctype_typeId (targ), + usymtab_getTypeId (cstring_makeLiteralTemp ("va_list"))))) + { + voptgenerror + (FLG_TYPE, + message ("First argument to va_arg is not a va_list (type %t): %s", + targ, exprNode_unparse (arg)), + arg->loc); + } + + exprNode_checkSet (ret, arg->sref); + } + + /* + ** return type is totype + */ + + ret->typ = totype; + ret->kind = XPR_VAARG; + ret->edata = exprData_makeCast (tok, arg, qt); + + return (ret); +} + +exprNode exprNode_labelMarker (/*@only@*/ cstring label) +{ + exprNode ret = exprNode_createPlain (ctype_undefined); + ret->kind = XPR_LABEL; + ret->edata = exprData_makeLiteral (label); + ret->isJumpPoint = TRUE; + + return (ret); /* for now, ignore label */ +} + +exprNode exprNode_notReached (/*@returned@*/ exprNode stmt) +{ + if (exprNode_isDefined (stmt)) + { + stmt->isJumpPoint = TRUE; + + /* This prevent stray no return path errors, etc. */ + stmt->exitCode = XK_MUSTEXIT; + } + + return (stmt); +} + +bool exprNode_isDefaultMarker (exprNode e) +{ + if (exprNode_isDefined (e)) + { + return (e->kind == XPR_DEFAULT || e->kind == XPR_FTDEFAULT); + } + + return FALSE; +} + +bool exprNode_isCaseMarker (exprNode e) +{ + if (exprNode_isDefined (e)) + { + return (e->kind == XPR_FTCASE || e->kind == XPR_CASE); + } + + return FALSE; +} + +bool exprNode_isLabelMarker (exprNode e) +{ + if (exprNode_isDefined (e)) + { + return (e->kind == XPR_LABEL); + } + + return FALSE; +} + +exprNode exprNode_caseMarker (/*@only@*/ exprNode test, bool fallThrough) +{ + exprNode ret = exprNode_createPartialCopy (test); + + ret->kind = fallThrough ? XPR_FTCASE : XPR_CASE; + + if (exprNode_isError (test)) { + return ret; + } + + exprNode_checkUse (ret, test->sref, test->loc); + + usymtab_setExitCode (ret->exitCode); + + if (ret->mustBreak) + { + usymtab_setMustBreak (); + } + + ret->edata = exprData_makeSingle (test); + ret->isJumpPoint = TRUE; + + return ret; +} + +# if 0 +exprNode exprNode_caseStatement (/*@only@*/ exprNode test, /*@only@*/ exprNode stmt, bool fallThrough) +{ + exprNode ret = exprNode_createPartialCopy (test); + + ret->kind = fallThrough ? XPR_FTCASE : XPR_CASE; + ret->edata = exprData_makePair (test, stmt); + ret->isJumpPoint = TRUE; + + if (exprNode_isError (test)) + { + return ret; + } + + exprNode_checkUse (ret, test->sref, test->loc); + + if (exprNode_isError (stmt)) + { + return ret; + } + + exprNode_mergeUSs (ret, stmt); + + ret->exitCode = stmt->exitCode; + ret->mustBreak = stmt->mustBreak; + ret->canBreak = stmt->canBreak; + + usymtab_setExitCode (ret->exitCode); + + if (ret->mustBreak) + { + usymtab_setMustBreak (); + } + + return ret; +} +# endif + +/*@notnull@*/ /*@only@*/ exprNode +exprNode_defaultMarker (/*@only@*/ lltok def, bool fallThrough) +{ + exprNode ret = exprNode_createTok (def); + + ret->isJumpPoint = TRUE; + ret->kind = fallThrough ? XPR_FTDEFAULT : XPR_DEFAULT; + return (ret); +} + +bool +exprNode_mayEscape (exprNode e) +{ + if (exprNode_isDefined (e)) + { + return exitkind_couldEscape (e->exitCode); + } + return FALSE; +} + +static bool +exprNode_mustBreak (exprNode e) +{ + if (exprNode_isDefined (e)) + { + return e->mustBreak; + } + return FALSE; +} + +bool +exprNode_mustEscape (exprNode e) +{ + if (exprNode_isDefined (e)) + { + return exitkind_mustEscape (e->exitCode) || exprNode_mustBreak (e); + } + + return FALSE; +} + +bool +exprNode_errorEscape (exprNode e) +{ + if (exprNode_isDefined (e)) + { + return exitkind_isError (e->exitCode); + } + + return FALSE; +} + +exprNode exprNode_concat (/*@only@*/ exprNode e1, /*@only@*/ exprNode e2) +{ + exprNode ret = exprNode_createPartialCopy (e1); + + ret->edata = exprData_makePair (e1, e2); + ret->kind = XPR_STMTLIST; + + if (exprNode_isDefined (e1)) + { + ret->isJumpPoint = e1->isJumpPoint; + ret->canBreak = e1->canBreak; + } + else + { + if (exprNode_isDefined (e2)) + { + ret->loc = fileloc_update (ret->loc, e2->loc); + } + } + + if (exprNode_isDefined (e2)) + { + ret->exitCode = e2->exitCode; + ret->mustBreak = e2->mustBreak; + if (e2->canBreak) ret->canBreak = TRUE; + } + + /* + ** if e1 must return, then e2 is unreachable! + */ + + if (exprNode_isDefined (e1) && exprNode_isDefined (e2)) + { + if ((exprNode_mustEscape (e1) || exprNode_mustBreak (e1)) + && !(e2->isJumpPoint)) + { + if (context_getFlag (FLG_UNREACHABLE)) + { + exprNode nr = e2; + + if (e2->kind == XPR_STMT) + { + nr = exprData_getSingle (e2->edata); + } + + if ((nr->kind == XPR_TOK + && lltok_isSemi (exprData_getTok (nr->edata)))) + { + /* okay to have unreachable ";" */ + ret->exitCode = XK_MUSTEXIT; + ret->canBreak = TRUE; + } + else + { + if (optgenerror (FLG_UNREACHABLE, + message ("Unreachable code: %s", + exprNode_unparseFirst (nr)), + exprNode_loc (nr))) + { + ret->isJumpPoint = TRUE; + ret->mustBreak = FALSE; + ret->exitCode = XK_ERROR; + DPRINTF (("Jump point: %s", exprNode_unparse (ret))); + } + else + { + ret->exitCode = XK_MUSTEXIT; + ret->canBreak = TRUE; + } + + } + } + } + else + { + if ((e2->kind == XPR_CASE || e2->kind == XPR_DEFAULT)) + { + /* + ** We want a warning anytime we have: + ** case xxx: ... + ** yyy; <<<- no break or return + ** case zzz: ... + */ + + exprNode lastStmt = exprNode_lastStatement (e1); + + if (exprNode_isDefined (lastStmt) + && !exprNode_mustEscape (lastStmt) + && !exprNode_mustBreak (lastStmt) + && !exprNode_isCaseMarker (lastStmt) + && !exprNode_isDefaultMarker (lastStmt) + && !exprNode_isLabelMarker (lastStmt)) + { + voptgenerror (FLG_CASEBREAK, + cstring_makeLiteral + ("Fall through case (no preceeding break)"), + e2->loc); + } + } + } + } + + exprNode_mergeUSs (ret, e2); + + usymtab_setExitCode (ret->exitCode); + + if (ret->mustBreak) + { + usymtab_setMustBreak (); + } + + return ret; +} + +exprNode exprNode_createTok (/*@only@*/ lltok t) +{ + exprNode ret = exprNode_create (ctype_unknown); + ret->kind = XPR_TOK; + ret->edata = exprData_makeTok (t); + return ret; +} + +exprNode exprNode_statement (/*@only@*/ exprNode e) +{ + if (!exprNode_isError (e)) + { + exprNode_checkStatement(e); + } + + return (exprNode_statementError (e)); +} + +static exprNode exprNode_statementError (/*@only@*/ exprNode e) +{ + exprNode ret = exprNode_createPartialCopy (e); + + if (!exprNode_isError (e)) + { + if (e->kind != XPR_ASSIGN) + { + exprNode_checkUse (ret, e->sref, e->loc); + } + + ret->exitCode = e->exitCode; + ret->canBreak = e->canBreak; + ret->mustBreak = e->mustBreak; + } + + ret->edata = exprData_makeSingle (e); + ret->kind = XPR_STMT; + + return ret; +} + +exprNode exprNode_checkExpr (/*@returned@*/ exprNode e) +{ + if (!exprNode_isError (e)) + { + if (e->kind != XPR_ASSIGN) + { + exprNode_checkUse (e, e->sref, e->loc); + } + } + + return e; +} + +void exprNode_produceGuards (exprNode pred) +{ + if (!exprNode_isError (pred)) + { + if (ctype_isRealPointer (pred->typ)) + { + pred->guards = guardSet_addTrueGuard (pred->guards, pred->sref); + } + + exprNode_checkUse (pred, pred->sref, pred->loc); + exprNode_resetSref (pred); + } +} + +exprNode exprNode_makeBlock (/*@only@*/ exprNode e) +{ + exprNode ret = exprNode_createPartialCopy (e); + + if (!exprNode_isError (e)) + { + ret->exitCode = e->exitCode; + ret->canBreak = e->canBreak; + ret->mustBreak = e->mustBreak; + } + + ret->edata = exprData_makeSingle (e); + ret->kind = XPR_BLOCK; + return ret; +} + +bool exprNode_isBlock (exprNode e) +{ + return (exprNode_isDefined (e) + && ((e)->kind == XPR_BLOCK)); +} + +bool exprNode_isAssign (exprNode e) +{ + if (exprNode_isDefined (e)) + { + return (e->kind == XPR_ASSIGN); + } + + return FALSE; +} + +bool exprNode_isEmptyStatement (exprNode e) +{ + return (exprNode_isDefined (e) + && (e->kind == XPR_TOK) + && (lltok_isSemi (exprData_getTok (e->edata)))); +} + +exprNode exprNode_if (/*@only@*/ exprNode pred, /*@only@*/ exprNode tclause) +{ + exprNode ret; + bool emptyErr = FALSE; + + if (context_maybeSet (FLG_IFEMPTY)) + { + if (exprNode_isEmptyStatement (tclause)) + { + emptyErr = optgenerror (FLG_IFEMPTY, + cstring_makeLiteral + ("Body of if statement is empty"), + exprNode_loc (tclause)); + } + } + + if (!emptyErr && context_maybeSet (FLG_IFBLOCK)) + { + if (exprNode_isDefined (tclause) + && !exprNode_isBlock (tclause)) + { + voptgenerror (FLG_IFBLOCK, + message + ("Body of if statement is not a block: %s", + exprNode_unparse (tclause)), + exprNode_loc (tclause)); + } + } + + if (exprNode_isError (pred)) + { + if (exprNode_isError (tclause)) + { + ret = exprNode_createLoc (ctype_unknown, g_currentloc); + } + else + { + ret = exprNode_createPartialCopy (tclause); + } + } + else + { + if (exprNode_mustEscape (pred)) + { + voptgenerror + (FLG_UNREACHABLE, + message ("Predicate always exits: %s", exprNode_unparse (pred)), + exprNode_loc (pred)); + } + + exprNode_checkPred (cstring_makeLiteralTemp ("if"), pred); + exprNode_checkUse (pred, pred->sref, pred->loc); + + if (!exprNode_isError (tclause)) + { + exprNode_mergeCondUSs (pred, tclause, exprNode_undefined); + } + + ret = exprNode_createPartialCopy (pred); + } + + ret->kind = XPR_IF; + ret->edata = exprData_makePair (pred, tclause); + + ret->exitCode = XK_UNKNOWN; + + if (exprNode_isDefined (tclause)) + { + ret->exitCode = exitkind_makeConditional (tclause->exitCode); + ret->canBreak = tclause->canBreak; + ret->sets = sRefSet_union (ret->sets, tclause->sets); + ret->msets = sRefSet_union (ret->msets, tclause->msets); + ret->uses = sRefSet_union (ret->uses, tclause->uses); + } + + ret->mustBreak = FALSE; + + return ret; +} + +exprNode exprNode_ifelse (/*@only@*/ exprNode pred, + /*@only@*/ exprNode tclause, + /*@only@*/ exprNode eclause) +{ + exprNode ret; + bool tEmptyErr = FALSE; + bool eEmptyErr = FALSE; + + if (context_maybeSet (FLG_IFEMPTY)) + { + if (exprNode_isEmptyStatement (tclause)) + { + tEmptyErr = optgenerror + (FLG_IFEMPTY, + cstring_makeLiteral + ("Body of if clause of if statement is empty"), + exprNode_loc (tclause)); + } + + if (exprNode_isEmptyStatement (eclause)) + { + eEmptyErr = optgenerror + (FLG_IFEMPTY, + cstring_makeLiteral + ("Body of else clause of if statement is empty"), + exprNode_loc (eclause)); + } + } + + if (context_maybeSet (FLG_IFBLOCK)) + { + if (!tEmptyErr + && exprNode_isDefined (tclause) + && !exprNode_isBlock (tclause)) + { + voptgenerror (FLG_IFBLOCK, + message + ("Body of if clause of if statement is not a block: %s", + exprNode_unparse (tclause)), + exprNode_loc (tclause)); + } + + if (!eEmptyErr + && exprNode_isDefined (eclause) + && !exprNode_isBlock (eclause) + && !(eclause->kind == XPR_IF) + && !(eclause->kind == XPR_IFELSE)) + { + voptgenerror + (FLG_IFBLOCK, + message + ("Body of else clause of if statement is not a block: %s", + exprNode_unparse (eclause)), + exprNode_loc (eclause)); + } + } + + if (context_maybeSet (FLG_ELSEIFCOMPLETE)) + { + if (exprNode_isDefined (eclause) + && (eclause->kind == XPR_IF)) + { + voptgenerror (FLG_ELSEIFCOMPLETE, + message ("Incomplete else if logic (no final else): %s", + exprNode_unparse (eclause)), + exprNode_loc (eclause)); + } + } + + if (exprNode_isError (pred)) + { + if (exprNode_isError (tclause)) + { + if (exprNode_isError (eclause)) + { + ret = exprNode_createLoc (ctype_unknown, g_currentloc); + } + else + { + ret = exprNode_createPartialCopy (eclause); + } + } + else + { + ret = exprNode_createPartialCopy (tclause); + } + } + else /* pred is okay */ + { + ret = exprNode_createPartialCopy (pred); + + if (exprNode_mustEscape (pred)) + { + voptgenerror + (FLG_UNREACHABLE, + message ("Predicate always exits: %s", exprNode_unparse (pred)), + exprNode_loc (pred)); + } + + exprNode_checkPred (cstring_makeLiteralTemp ("if"), pred); + exprNode_checkUse (ret, pred->sref, pred->loc); + + exprNode_mergeCondUSs (ret, tclause, eclause); + } + + ret->kind = XPR_IFELSE; + ret->edata = exprData_makeCond (pred, tclause, eclause); + + if (exprNode_isDefined (tclause) && exprNode_isDefined (eclause)) + { + exprNode_combineControl (ret, tclause, eclause); + ret->loc = fileloc_update (ret->loc, eclause->loc); + } + + return ret; +} + +/* +** *allpaths <- TRUE iff all executions paths must go through the switch +*/ + +static bool +checkSwitchExpr (exprNode test, /*@dependent@*/ exprNode e, /*@out@*/ bool *allpaths) +{ + exprNodeSList el = exprNode_flatten (e); + bool mustReturn = TRUE; /* find a branch that doesn't */ + bool thisReturn = FALSE; + bool hasDefault = FALSE; + bool hasAllMembers = FALSE; + bool inSwitch = FALSE; + bool isEnumSwitch = FALSE; + bool canBreak = FALSE; + bool fallThrough = FALSE; + ctype ct = ctype_unknown; + enumNameSList usedEnums; + enumNameList enums; + + if (exprNode_isDefined (test)) + { + ctype ttype; + + ct = test->typ; + ttype = ctype_realType (ct); + + if (ctype_isEnum (ttype)) + { + isEnumSwitch = TRUE; + enums = ctype_elist (ttype); + usedEnums = enumNameSList_new (); + } + } + + exprNodeSList_elements (el, current) + { + if (exprNode_isDefined (current)) + { + switch (current->kind) + { + case XPR_FTDEFAULT: + case XPR_DEFAULT: + if (hasDefault) + { + voptgenerror + (FLG_CONTROL, + message ("Duplicate default cases in switch"), + exprNode_loc (current)); + } + /*@fallthrough@*/ + case XPR_FTCASE: + case XPR_CASE: + if (current->kind == XPR_DEFAULT || current->kind == XPR_FTDEFAULT) + { + hasDefault = TRUE; + } + else + { + if (isEnumSwitch) + { + exprNode st = exprData_getSingle (current->edata); + uentry ue = exprNode_getUentry (st); + + if (uentry_isValid (ue)) + { + cstring cname = uentry_rawName (ue); + + if (enumNameList_member (/*@-usedef@*/enums/*@=usedef@*/, cname)) + { + if (enumNameSList_member + (/*@-usedef@*/usedEnums/*@=usedef@*/, cname)) + { + voptgenerror + (FLG_CONTROL, + message ("Duplicate case in switch: %s", + cname), + current->loc); + } + else + { + enumNameSList_addh (usedEnums, cname); + } + } + else + { + voptgenerror + (FLG_TYPE, + message ("Case in switch not %s member: %s", + ctype_unparse (ct), cname), + current->loc); + } + } + } + } + + if (inSwitch && !fallThrough) + { + if (!thisReturn || canBreak) + { + mustReturn = FALSE; + } + } + + fallThrough = TRUE; + inSwitch = TRUE; + thisReturn = FALSE; + canBreak = FALSE; + /*@switchbreak@*/ break; + default: + thisReturn = thisReturn || exprNode_mustEscape (current); + canBreak = canBreak || current->canBreak; + if (canBreak) fallThrough = FALSE; + } + } + } end_exprNodeSList_elements; + + if (inSwitch) /* check the last one! */ + { + if (!thisReturn || canBreak) + { + mustReturn = FALSE; + } + } + + if (isEnumSwitch) + { + if (!hasDefault + && (enumNameSList_size (/*@-usedef@*/usedEnums/*@=usedef@*/) != + enumNameList_size (/*@-usedef@*/enums/*@=usedef@*/))) + { + enumNameSList unused = enumNameSList_subtract (enums, usedEnums); + + voptgenerror (FLG_MISSCASE, + message ("Missing case%s in switch: %q", + cstring_makeLiteralTemp + ((enumNameSList_size (unused) > 1) ? "s" : ""), + enumNameSList_unparse (unused)), + g_currentloc); + + enumNameSList_free (unused); + } + else + { + hasAllMembers = TRUE; + *allpaths = TRUE; + } + + enumNameSList_free (usedEnums); + } + else + { + *allpaths = hasDefault; + } + + exprNodeSList_free (el); + return ((hasDefault || hasAllMembers) && mustReturn); +} + +exprNode exprNode_switch (/*@only@*/ exprNode e, /*@only@*/ exprNode s) +{ + exprNode ret = exprNode_createPartialCopy (e); + bool allpaths; + + DPRINTF (("Switch: %s", exprNode_unparse (s))); + + ret->kind = XPR_SWITCH; + ret->edata = exprData_makePair (e, s); + + if (!exprNode_isError (s)) + { + exprNode fs = exprNode_firstStatement (s); + ret->loc = fileloc_update (ret->loc, s->loc); + + if (exprNode_isUndefined (fs) + || exprNode_isCaseMarker (fs) || exprNode_isLabelMarker (fs) + || exprNode_isDefaultMarker (fs)) { + ; + } else { + voptgenerror (FLG_FIRSTCASE, + message + ("Statement after switch is not a case: %s", exprNode_unparse (fs)), + fs->loc); + } + } + + if (!exprNode_isError (e)) + { + if (checkSwitchExpr (e, s, &allpaths)) + { + ret->exitCode = XK_MUSTRETURN; + } + else + { + ret->exitCode = e->exitCode; + } + + ret->canBreak = e->canBreak; + ret->mustBreak = e->mustBreak; + } + /* + ** forgot this! + ** exprNode.c:3883,32: Variable allpaths used before definition + */ + else + { + allpaths = FALSE; + } + + DPRINTF (("Context exit switch!")); + context_exitSwitch (ret, allpaths); + DPRINTF (("Context exit switch done!")); + + return ret; +} + +static void checkInfiniteLoop (/*@notnull@*/ exprNode test, + /*@notnull@*/ exprNode body) +{ + sRefSet tuses = test->uses; + + if (!sRefSet_isEmpty (test->uses)) + { + sRefSet sets = sRefSet_newCopy (body->sets); + bool hasError = TRUE; + bool innerState = FALSE; + sRefSet tuncon = sRefSet_undefined; + + sets = sRefSet_union (sets, test->sets); + sets = sRefSet_union (sets, body->msets); + sets = sRefSet_union (sets, test->msets); + + sRefSet_allElements (tuses, el) + { + if (sRef_isUnconstrained (el)) + { + tuncon = sRefSet_insert (tuncon, el); + } + else + { + if (sRefSet_member (sets, el)) + { + hasError = FALSE; + break; + } + } + + if (sRef_isInternalState (el) + || sRef_isFileStatic (sRef_getRootBase (el))) + { + innerState = TRUE; + } + } end_sRefSet_allElements ; + + if (hasError) + { + sRefSet suncon = sRefSet_undefined; + bool sinner = FALSE; + + sRefSet_allElements (sets, el) + { + if (sRef_isUnconstrained (el)) + { + suncon = sRefSet_insert (suncon, el); + } + else if (sRef_isInternalState (el)) + { + sinner = TRUE; + } + else + { + ; + } + } end_sRefSet_allElements ; + + if (sinner && innerState) + { + ; + } + else if (sRefSet_isEmpty (tuncon) + && sRefSet_isEmpty (suncon)) + { + voptgenerror + (FLG_INFLOOPS, + message + ("Suspected infinite loop. No value used in loop test (%q) " + "is modified by test or loop body.", + sRefSet_unparsePlain (tuses)), + test->loc); + } + else + { + if (sRefSet_isEmpty (tuncon)) + { + voptgenerror + (FLG_INFLOOPSUNCON, + message ("Suspected infinite loop. No condition values " + "modified. Modification possible through " + "unconstrained calls: %q", + sRefSet_unparsePlain (suncon)), + test->loc); + } + else + { + voptgenerror + (FLG_INFLOOPSUNCON, + message ("Suspected infinite loop. No condition values " + "modified. Possible undetected dependency through " + "unconstrained calls in loop test: %q", + sRefSet_unparsePlain (tuncon)), + test->loc); + } + } + } + + sRefSet_free (sets); + } +} + +exprNode exprNode_while (/*@keep@*/ exprNode t, /*@keep@*/ exprNode b) +{ + exprNode ret; + bool emptyErr = FALSE; + + if (context_maybeSet (FLG_WHILEEMPTY)) + { + if (exprNode_isEmptyStatement (b)) + { + emptyErr = optgenerror + (FLG_WHILEEMPTY, + cstring_makeLiteral + ("Body of while statement is empty"), + exprNode_loc (b)); + } + } + + if (!emptyErr && context_maybeSet (FLG_WHILEBLOCK)) + { + if (exprNode_isDefined (b) + && !exprNode_isBlock (b)) + { + if (context_inIterDef () + && (b->kind == XPR_STMTLIST + || b->kind == XPR_TOK)) + { + ; /* no error */ + } + else + { + voptgenerror (FLG_WHILEBLOCK, + message + ("Body of while statement is not a block: %s", + exprNode_unparse (b)), + exprNode_loc (b)); + } + } + } + + if (exprNode_isError (t)) + { + if (exprNode_isError (b)) + { + ret = exprNode_createLoc (ctype_unknown, g_currentloc); + } + else + { + ret = exprNode_createPartialCopy (b); + } + } + else + { + exprNode test; + + ret = exprNode_createPartialCopy (t); + + llassert (t->kind == XPR_WHILEPRED); + + test = exprData_getSingle (t->edata); + + if (!exprNode_isError (b) && exprNode_isDefined (test)) + { + if (context_maybeSet (FLG_INFLOOPS) + || context_maybeSet (FLG_INFLOOPSUNCON)) + { + /* + ** check that some variable in the predicate is set by the body + ** if the predicate uses any variables + */ + + checkInfiniteLoop (test, b); + } + + exprNode_mergeUSs (ret, b); + + if (exprNode_isDefined (b)) + { + ret->exitCode = exitkind_makeConditional (b->exitCode); + } + } + } + + ret->edata = exprData_makePair (t, b); + ret->kind = XPR_WHILE; + + if (exprNode_isDefined (t) && exprNode_mustEscape (t)) + { + voptgenerror + (FLG_CONTROL, + message ("Predicate always exits: %s", exprNode_unparse (t)), + exprNode_loc (t)); + } + + ret->exitCode = XK_NEVERESCAPE; + + /* + ** If loop is infinite, and there is no break inside, + ** exit code is never reach. + */ + + if (exprNode_knownIntValue (t)) + { + if (!exprNode_isZero (t)) + { + if (exprNode_isDefined (b)) + { + if (!b->canBreak) + { + /* Really, it means never reached. */ + ret->exitCode = XK_MUSTEXIT; + } + } + } + } + else + { + ; + } + + ret->canBreak = FALSE; + ret->mustBreak = FALSE; + + return ret; +} + +/* +** do { b } while (t); +** +** note: body passed as first argument +*/ + +exprNode exprNode_doWhile (/*@only@*/ exprNode b, /*@only@*/ exprNode t) +{ + exprNode ret; + + if (exprNode_isError (t)) + { + if (exprNode_isError (b)) + { + ret = exprNode_createLoc (ctype_unknown, g_currentloc); + } + else + { + ret = exprNode_createPartialCopy (b); + + ret->exitCode = exitkind_makeConditional (b->exitCode); + exprNode_checkUse (ret, b->sref, b->loc); + ret->exitCode = b->exitCode; + ret->canBreak = b->canBreak; + ret->mustBreak = b->mustBreak; + } + } + else + { + ret = exprNode_createPartialCopy (t); + exprNode_checkPred (cstring_makeLiteralTemp ("while"), t); + + if (!exprNode_isError (b)) + { + /* + ** forgot the copy's --- why wasn't this detected?? + */ + + ret->sets = sRefSet_copy (ret->sets, b->sets); + ret->msets = sRefSet_copy (ret->msets, b->msets); + ret->uses = sRefSet_copy (ret->uses, b->uses); + + /* left this out --- causes and aliasing bug (infinite loop) + should be detected?? */ + + exprNode_checkUse (ret, b->sref, b->loc); + exprNode_mergeUSs (ret, t); + exprNode_checkUse (ret, t->sref, t->loc); + + ret->exitCode = b->exitCode; + ret->canBreak = b->canBreak; + ret->mustBreak = b->mustBreak; + } + } + + context_exitDoWhileClause (t); + + ret->kind = XPR_DOWHILE; + ret->edata = exprData_makePair (t, b); + return ret; +} + +exprNode exprNode_for (/*@keep@*/ exprNode inc, /*@keep@*/ exprNode body) +{ + exprNode ret; + bool emptyErr = FALSE; + + if (context_maybeSet (FLG_FOREMPTY)) + { + if (exprNode_isEmptyStatement (body)) + { + emptyErr = optgenerror + (FLG_FOREMPTY, + cstring_makeLiteral + ("Body of for statement is empty"), + exprNode_loc (body)); + } + } + + if (!emptyErr && context_maybeSet (FLG_FORBLOCK)) + { + if (exprNode_isDefined (body) + && !exprNode_isBlock (body)) + { + if (context_inIterDef () + && (body->kind == XPR_STMTLIST + || body->kind == XPR_TOK)) + { + ; /* no error */ + } + else + { + voptgenerror (FLG_FORBLOCK, + message + ("Body of for statement is not a block: %s", + exprNode_unparse (body)), + exprNode_loc (body)); + } + } + } + + /* + ** for ud purposes: (alreadly) init -> test -> (now) LOOP: body + inc + test + */ + + if (exprNode_isError (body)) + { + ret = exprNode_createPartialCopy (inc); + } + else + { + ret = exprNode_createPartialCopy (body); + + ret->exitCode = exitkind_makeConditional (body->exitCode); + + exprNode_mergeUSs (inc, body); + + if (exprNode_isDefined (inc)) + { + exprNode tmp; + + context_setMessageAnnote (cstring_makeLiteral ("in post loop increment")); + + + tmp = exprNode_effect (exprData_getTripleInc (inc->edata)); + exprNode_freeShallow (tmp); + + context_clearMessageAnnote (); + context_setMessageAnnote (cstring_makeLiteral ("in post loop test")); + + tmp = exprNode_effect (exprData_getTripleTest (inc->edata)); + exprNode_freeShallow (tmp); + + context_clearMessageAnnote (); + + ret->uses = sRefSet_copy (ret->uses, inc->uses); + ret->sets = sRefSet_copy (ret->sets, inc->sets); + ret->msets = sRefSet_copy (ret->msets, inc->msets); + } + } + + ret->kind = XPR_FOR; + ret->edata = exprData_makePair (inc, body); + + if (exprNode_isDefined (inc)) { + exprNode test = exprData_getTripleTest (inc->edata); + + if (exprNode_isUndefined (test)) { + if (exprNode_isDefined (body)) { + if (!body->canBreak) { + /* Really, it means never reached. */ + ret->exitCode = XK_MUSTEXIT; + } + } + } + } + + return (ret); +} + +/* +** for (init; test; inc) +** ==> +** init; +** while (test) { body; inc; } +** +** Now: check use of init (may set vars for test) +** check use of test +** no checks on inc +_*/ + +/*@observer@*/ guardSet exprNode_getForGuards (exprNode pred) +{ + exprNode test; + + if (exprNode_isError (pred)) return guardSet_undefined; + + llassert (pred->kind == XPR_FORPRED); + + test = exprData_getTripleTest (pred->edata); + + if (!exprNode_isError (test)) + { + return (test->guards); + } + + return guardSet_undefined; +} + +exprNode exprNode_whilePred (/*@only@*/ exprNode test) +{ + exprNode ret = exprNode_createSemiCopy (test); + + if (exprNode_isDefined (test)) + { + exprNode_copySets (ret, test); + exprNode_checkPred (cstring_makeLiteralTemp ("while"), test); + exprNode_checkUse (ret, test->sref, test->loc); + + exprNode_produceGuards (test); + + ret->guards = guardSet_copy (test->guards); + } + + ret->edata = exprData_makeSingle (test); + ret->kind = XPR_WHILEPRED; + return ret; +} + +exprNode exprNode_forPred (/*@only@*/ exprNode init, /*@only@*/ exprNode test, + /*@only@*/ exprNode inc) +{ + exprNode ret; + + /* + ** for ud purposes: init -> test -> LOOP: [ body, inc ] + */ + + exprNode_checkPred (cstring_makeLiteralTemp ("for"), test); + + if (!exprNode_isError (inc)) + { + ret = exprNode_createPartialCopy (inc); + } + else + { + if (!exprNode_isError (init)) + { + ret = exprNode_createPartialCopy (init); + } + else if (!exprNode_isError (test)) + { + ret = exprNode_createPartialCopy (test); + } + else + { + ret = exprNode_createUnknown (); + } + } + + exprNode_mergeUSs (ret, init); + + if (exprNode_isDefined (init)) + { + exprNode_checkUse (ret, init->sref, init->loc); + } + + exprNode_mergeUSs (ret, test); + + if (exprNode_isDefined (test)) + { + exprNode_checkUse (ret, test->sref, test->loc); + } + + ret->kind = XPR_FORPRED; + ret->edata = exprData_makeFor (init, test, inc); + return (ret); +} + +/*@notnull@*/ /*@only@*/ exprNode exprNode_goto (/*@only@*/ cstring label) +{ + exprNode ret = exprNode_createUnknown (); + + if (context_inMacro ()) + { + voptgenerror (FLG_MACROSTMT, + message ("Macro %s uses goto (not functional)", + context_inFunctionName ()), + g_currentloc); + } + + ret->kind = XPR_GOTO; + ret->edata = exprData_makeLiteral (label); + ret->mustBreak = TRUE; + ret->exitCode = XK_GOTO; + ret->canBreak = TRUE; + return ret; +} + +exprNode exprNode_continue (/*@only@*/ lltok l, int qcontinue) +{ + exprNode ret = exprNode_createLoc (ctype_unknown, fileloc_copy (lltok_getLoc (l))); + + ret->kind = XPR_CONTINUE; + ret->edata = exprData_makeTok (l); + ret->canBreak = TRUE; + ret->mustBreak = TRUE; + + if (qcontinue == QSAFEBREAK) + { + ; /* no checking */ + } + else if (qcontinue == QINNERCONTINUE) + { + if (!context_inDeepLoop ()) + { + voptgenerror + (FLG_LOOPLOOPCONTINUE, + cstring_makeLiteral ("Continue statement marked with innercontinue " + "is not inside a nested loop"), + exprNode_loc (ret)); + } + } + else if (qcontinue == BADTOK) + { + if (context_inDeepLoop ()) + { + voptgenerror + (FLG_LOOPLOOPCONTINUE, + cstring_makeLiteral ("Continue statement in nested loop"), + exprNode_loc (ret)); + } + } + else + { + llbuglit ("exprNode_continue: bad qcontinue"); + } + + return ret; +} + +exprNode exprNode_break (/*@only@*/ lltok l, int bqual) +{ + exprNode ret = exprNode_createLoc (ctype_unknown, fileloc_copy (lltok_getLoc (l))); + clause breakClause = context_breakClause (); + + ret->kind = XPR_BREAK; + ret->edata = exprData_makeTok (l); + ret->canBreak = TRUE; + ret->mustBreak = TRUE; + + if (breakClause == NOCLAUSE) + { + voptgenerror + (FLG_SYNTAX, + cstring_makeLiteral ("Break not inside while, for or switch statement"), + exprNode_loc (ret)); + } + else + { + if (bqual != BADTOK) + { + switch (bqual) + { + case QSAFEBREAK: + break; + case QINNERBREAK: + if (breakClause == SWITCHCLAUSE) + { + if (!context_inDeepSwitch ()) + { + voptgenerror (FLG_SYNTAX, + cstring_makeLiteral + ("Break preceded by innerbreak is not in a deep switch"), + exprNode_loc (ret)); + } + } + else + { + if (!context_inDeepLoop ()) + { + voptgenerror (FLG_SYNTAX, + cstring_makeLiteral + ("Break preceded by innerbreak is not in a deep loop"), + exprNode_loc (ret)); + } + } + break; + case QLOOPBREAK: + if (breakClause == SWITCHCLAUSE) + { + voptgenerror (FLG_SYNTAX, + cstring_makeLiteral + ("Break preceded by loopbreak is breaking a switch"), + exprNode_loc (ret)); + } + break; + case QSWITCHBREAK: + if (breakClause != SWITCHCLAUSE) + { + voptgenerror + (FLG_SYNTAX, + message ("Break preceded by switchbreak is breaking %s", + cstring_makeLiteralTemp + ((breakClause == WHILECLAUSE + || breakClause == DOWHILECLAUSE) ? "a while loop" + : (breakClause == FORCLAUSE) ? "a for loop" + : (breakClause == ITERCLAUSE) ? "an iterator" + : "")), + exprNode_loc (ret)); + } + break; + BADDEFAULT; + } + } + else + { + if (breakClause == SWITCHCLAUSE) + { + clause nextBreakClause = context_nextBreakClause (); + + switch (nextBreakClause) + { + case NOCLAUSE: break; + case WHILECLAUSE: + case DOWHILECLAUSE: + case FORCLAUSE: + case ITERCLAUSE: + voptgenerror + (FLG_LOOPSWITCHBREAK, + cstring_makeLiteral ("Break statement in switch inside loop"), + exprNode_loc (ret)); + break; + case SWITCHCLAUSE: + voptgenerror + (FLG_SWITCHSWITCHBREAK, + cstring_makeLiteral ("Break statement in switch inside switch"), + exprNode_loc (ret)); + break; + BADDEFAULT; + } + } + else + { + if (context_inDeepLoop ()) + { + voptgenerror + (FLG_LOOPLOOPBREAK, + cstring_makeLiteral ("Break statement in nested loop"), + exprNode_loc (ret)); + } + else + { + if (context_inDeepLoopSwitch ()) + { + voptgenerror + (FLG_SWITCHLOOPBREAK, + cstring_makeLiteral ("Break statement in loop inside switch"), + exprNode_loc (ret)); + } + } + } + } + } + + return ret; +} + +exprNode exprNode_nullReturn (/*@only@*/ lltok t) +{ + fileloc loc = lltok_getLoc (t); + exprNode ret = exprNode_createLoc (ctype_unknown, fileloc_copy (loc)); + + context_returnFunction (); + exprChecks_checkNullReturn (loc); + + ret->kind = XPR_NULLRETURN; + ret->edata = exprData_makeTok (t); + ret->exitCode = XK_MUSTRETURN; + return ret; +} + +exprNode exprNode_return (/*@only@*/ exprNode e) +{ + exprNode ret; + + if (exprNode_isError (e)) + { + ret = exprNode_createUnknown (); + } + else + { + ret = exprNode_createLoc (ctype_unknown, fileloc_copy (e->loc)); + + exprNode_checkUse (ret, e->sref, e->loc); + exprNode_checkReturn (e); + } + + context_returnFunction (); + ret->kind = XPR_RETURN; + ret->edata = exprData_makeSingle (e); + ret->exitCode = XK_MUSTRETURN; + + return (ret); +} + +exprNode exprNode_comma (/*@only@*/ exprNode e1, /*@only@*/ exprNode e2) +{ + exprNode ret; + + if (exprNode_isError (e1)) + { + if (exprNode_isError (e2)) + { + ret = exprNode_createLoc (ctype_unknown, g_currentloc); + } + else + { + ret = exprNode_createPartialCopy (e2); + exprNode_checkUse (ret, e2->sref, e2->loc); + ret->sref = e2->sref; + } + } + else + { + ret = exprNode_createPartialCopy (e1); + + exprNode_checkUse (ret, e1->sref, e1->loc); + + if (!exprNode_isError (e2)) + { + exprNode_mergeUSs (ret, e2); + exprNode_checkUse (ret, e2->sref, e2->loc); + ret->sref = e2->sref; + } + } + + ret->kind = XPR_COMMA; + ret->edata = exprData_makePair (e1, e2); + + if (exprNode_isDefined (e1)) + { + if (exprNode_isDefined (e2)) + { + ret->typ = e2->typ; + + if (exprNode_mustEscape (e1) || e1->mustBreak) + { + voptgenerror + (FLG_UNREACHABLE, + message ("Second clause of comma expression is unreachable: %s", + exprNode_unparse (e2)), + exprNode_loc (e2)); + } + + ret->exitCode = exitkind_combine (e1->exitCode, e2->exitCode); + ret->mustBreak = e1->mustBreak || e2->mustBreak; + ret->canBreak = e1->canBreak || e2->canBreak; + } + else + { + if (exprNode_mustEscape (e1) || e1->mustBreak) + { + voptgenerror + (FLG_UNREACHABLE, + message ("Second clause of comma expression is unreachable: %s", + exprNode_unparse (e2)), + exprNode_loc (e2)); + } + + ret->exitCode = e1->exitCode; + ret->canBreak = e1->canBreak; + } + } + else + { + if (exprNode_isDefined (e2)) + { + ret->exitCode = e2->exitCode; + ret->mustBreak = e2->mustBreak; + ret->canBreak = e2->canBreak; + } + } + + return (ret); +} + +static bool exprNode_checkOneInit (/*@notnull@*/ exprNode el, exprNode val) +{ + ctype t1 = exprNode_getType (el); + ctype t2 = exprNode_getType (val); + bool hasError = FALSE; + + if (ctype_isUnknown (t1)) + { + voptgenerror (FLG_IMPTYPE, + message ("Variable has unknown (implicitly int) type: %s", + exprNode_unparse (el)), + el->loc); + + t1 = ctype_int; + el->typ = ctype_int; + } + + if (exprNode_isDefined (val) && val->kind == XPR_INITBLOCK) + { + exprNodeList vals = exprData_getArgs (val->edata); + + if (ctype_isRealAP (t1)) + { + int i = 0; + int nerrors = 0; + + exprNodeList_elements (vals, oneval) + { + cstring istring = message ("%d", i); + exprNode newel = + exprNode_arrayFetch + (exprNode_fakeCopy (el), + exprNode_numLiteral (ctype_int, istring, + fileloc_copy (el->loc), i)); + + if (exprNode_isDefined (newel)) + { + if (exprNodeList_size (vals) == 1 + && ctype_isString (exprNode_getType (oneval)) + && ctype_isChar (exprNode_getType (newel))) + { + exprNode_freeIniter (newel); + } + else + { + if (exprNode_checkOneInit (newel, oneval)) + { + hasError = TRUE; + nerrors++; + + if (nerrors > 3 && exprNodeList_size (vals) > 6) + { + llgenmsg + (message ("Additional initialization errors " + "for %s not reported", + exprNode_unparse (el)), + exprNode_loc (el)); + exprNode_freeIniter (newel); + break; + } + else + { + exprNode_freeIniter (newel); + } + } + else + { + exprNode_freeIniter (newel); + } + } + } + + cstring_free (istring); + i++; + /*@-branchstate@*/ + } end_exprNodeList_elements; + /*@=branchstate@*/ + } + else if (ctype_isStruct (ctype_realType (t1))) + { + uentryList fields = ctype_getFields (t1); + int i = 0; + + if (uentryList_size (fields) != exprNodeList_size (vals)) + { + if (uentryList_size (fields) > exprNodeList_size (vals)) + { + hasError = optgenerror + (FLG_FULLINITBLOCK, + message ("Initializer block for " + "%s has %d field%p, but %s has %d field%p: %q", + exprNode_unparse (el), + exprNodeList_size (vals), + ctype_unparse (t1), + uentryList_size (fields), + exprNodeList_unparse (vals)), + val->loc); + } + else + { + hasError = optgenerror + (FLG_TYPE, + message ("Initializer block for " + "%s has %d field%p, but %s has %d field%p: %q", + exprNode_unparse (el), + exprNodeList_size (vals), + ctype_unparse (t1), + uentryList_size (fields), + exprNodeList_unparse (vals)), + val->loc); + } + } + else + { + exprNodeList_elements (vals, oneval) + { + uentry thisfield = uentryList_getN (fields, i); + exprNode newel = + exprNode_fieldAccess (exprNode_fakeCopy (el), + uentry_getName (thisfield)); + + if (exprNode_isDefined (newel)) + { + if (exprNode_checkOneInit (newel, oneval)) + { + hasError = TRUE; + } + + exprNode_freeIniter (newel); + } + + i++; + } end_exprNodeList_elements; + } + } + else + { + hasError = optgenerror + (FLG_TYPE, + message ("Initializer block used for " + "%s where %t is expected: %s", + exprNode_unparse (el), t1, exprNode_unparse (val)), + val->loc); + } + } + else + { + if (exprNode_isDefined (val)) + { + doAssign (el, val, TRUE); + + if (!exprNode_matchType (t1, val)) + { + hasError = gentypeerror + (t1, val, t2, el, + message ("Initial value of %s is type %t, " + "expects %t: %s", + exprNode_unparse (el), + t2, t1, exprNode_unparse (val)), + val->loc); + } + } + } + + return hasError; +} + +exprNode exprNode_makeInitialization (/*@only@*/ idDecl t, + /*@only@*/ exprNode e) +{ + uentry ue = usymtab_lookup (idDecl_observeId (t)); + bool isUsed = uentry_isUsed (ue); + exprNode ret = exprNode_fromIdentifierAux (ue); + ctype ct = ctype_realishType (ret->typ); + fileloc loc; + + if (ctype_isUnknown (ct)) + { + voptgenerror (FLG_IMPTYPE, + message ("Variable has unknown (implicitly int) type: %s", + idDecl_getName (t)), + exprNode_isDefined (e) ? exprNode_loc (e) : g_currentloc); + + ct = ctype_int; + } + + if (exprNode_isError (e)) + { + e = exprNode_createUnknown (); + loc = g_currentloc; + + /* error: assume initializer is defined */ + sRef_setDefined (ret->sref, loc); + } + else + { + loc = exprNode_loc (e); + + /* + ** evs - 9 Apr 1995 + ** + ** was addSafeUse --- what's the problem? + ** + ** int x = 3, y = x ? + */ + + exprNode_checkUse (ret, e->sref, e->loc); + + if (ctype_isUnknown (e->typ) && uentry_isValid (ue)) + { + exprNode lhs = exprNode_createId (ue); + + /* + ** static storage should be undefined before initializing + */ + + if (uentry_isStatic (ue)) + { + sRef_setDefState (lhs->sref, SS_PARTIAL, fileloc_undefined); + } + + (void) exprNode_checkOneInit (lhs, e); + + if (uentry_isStatic (ue)) + { + sRef_setDefState (lhs->sref, SS_DEFINED, fileloc_undefined); + } + + exprNode_free (lhs); + } + else + { + if (!exprNode_matchType (ct, e)) + { + if (exprNode_isZero (e) && ctype_isArrayPtr (ct)) + { + ; + } + else + { + (void) gentypeerror + (exprNode_getType (e), e, exprNode_getType (ret), ret, + message + ("Variable %s initialized to type %t, expects %t: %s", + exprNode_unparse (ret), exprNode_getType (e), + exprNode_getType (ret), + exprNode_unparse (e)), + e->loc); + } + } + } + + if (uentry_isStatic (ue)) + { + sRef_setDefState (ret->sref, SS_PARTIAL, fileloc_undefined); + } + + doAssign (ret, e, TRUE); + + if (uentry_isStatic (ue)) + { + sRef_setDefState (ret->sref, SS_DEFINED, fileloc_undefined); + } + } + + if (context_inIterDef ()) + { + /* should check if it is yield */ + uentry_setUsed (ue, loc); + } + else + { + if (!isUsed) /* could be @unused@-qualified variable */ + { + uentry_setNotUsed (ue); + } + } + + ret->exitCode = XK_NEVERESCAPE; + ret->mustBreak = FALSE; + + /* + ** Must be before new kind is assigned! + */ + + exprData_free (ret->edata, ret->kind); + + ret->kind = XPR_INIT; + ret->edata = exprData_makeInit (t, e); + exprNode_mergeUSs (ret, e); + return ret; +} + +exprNode exprNode_iter (/*@observer@*/ uentry name, + /*@only@*/ exprNodeList alist, + /*@only@*/ exprNode body, + /*@observer@*/ uentry end) +{ + exprNode ret; + cstring iname; + + llassert (uentry_isValid (name)); + + uentry_setUsed (name, exprNode_loc (body)); + + ret = exprNode_createPartialCopy (body); + iname = uentry_getName (name); + + if (uentry_isInvalid (end)) + { + llerror (FLG_ITER, + message ("Iter %s not balanced with end_%s", iname, iname)); + } + else + { + cstring ename = uentry_getName (end); + + if (!cstring_equalPrefix (ename, "end_")) + { + llerror (FLG_ITER, message ("Iter %s not balanced with end_%s: %s", + iname, iname, ename)); + } + else + { + if (!cstring_equal (iname, cstring_suffix (ename, 4))) + { + llerror (FLG_ITER, + message ("Iter %s not balanced with end_%s: %s", + iname, iname, ename)); + } + } + + cstring_free (ename); + } + + context_exitIterClause (body); + + ret->kind = XPR_ITER; + ret->edata = exprData_makeIter (name, alist, body, end); + + if (uentry_isIter (name)) + { + (void) checkArgsReal (name, body, + uentry_getParams (name), alist, TRUE, ret); + } + + cstring_free (iname); + + return ret; +} + +exprNode +exprNode_iterNewId (/*@only@*/ cstring s) +{ + exprNode e = exprNode_new (); + uentry ue = uentryList_getN (uentry_getParams (getCurrentIter ()), iterParamNo ()); + + llassert (processingIterVars ()); + + e->loc = context_getSaveLocation (); + + if (fileloc_isUndefined (e->loc)) + { + fileloc_free (e->loc); + e->loc = fileloc_copy (g_currentloc); + } + + e->uses = sRefSet_new (); + e->sets = sRefSet_new (); + e->msets = sRefSet_new (); + e->kind = XPR_VAR; + e->val = multiVal_unknown (); + e->guards = guardSet_new (); + e->sref = defref; + e->isJumpPoint = FALSE; + e->exitCode = XK_NEVERESCAPE; + + /*> missing fields, detected by lclint <*/ + e->canBreak = FALSE; + e->mustBreak = FALSE; + e->etext = cstring_undefined; + + if (uentry_isYield (ue)) + { + uentry uue = uentry_makeVariable (s, uentry_getType (ue), + fileloc_copy (e->loc), + FALSE); + sRef sr; + + uue = usymtab_supEntrySrefReturn (uue); + + sr = uentry_getSref (uue); + sRef_mergeStateQuiet (sr, uentry_getSref (ue)); + sr = uentry_getSref (uue); + sRef_setDefined (sr, e->loc); + + e->typ = uentry_getType (uue); + e->sref = sr; + e->edata = exprData_makeId (uue); + uentry_setUsed (uue, g_currentloc); + } + else + { + uentry uue; + + sRef_setGlobalScope (); + uue = uentry_makeVariableLoc (s, ctype_unknown); + + e->typ = ctype_unknown; + e->edata = exprData_makeId (uue); + + uentry_setUsed (uue, e->loc); + uentry_setHasNameError (uue); + + if (context_getFlag (FLG_REPEATUNRECOG)) + { + uentry_markOwned (uue); + } + else + { + usymtab_supGlobalEntry (uue); + } + + sRef_clearGlobalScope (); + + voptgenerror (FLG_UNRECOG, message ("Unrecognized identifier: %s", s), + e->loc); + } + + + cstring_free (s); + return (e); +} + +exprNode +exprNode_iterExpr (/*@returned@*/ exprNode e) +{ + if (!processingIterVars ()) + { + llcontbuglit ("checkIterParam: not in iter"); + return e; + } + + if (uentry_isYield (uentryList_getN (uentry_getParams (getCurrentIter ()), + iterParamNo ()))) + { + if (exprNode_isDefined (e)) + { + if (fileloc_isDefined (e->loc)) + { + voptgenerror + (FLG_ITER, + message ("Yield parameter is not simple identifier: %s", + exprNode_unparse (e)), + e->loc); + } + else + { + voptgenerror + (FLG_ITER, + message ("Yield parameter is not simple identifier: %s", + exprNode_unparse (e)), + g_currentloc); + + } + } + } + return e; +} + +exprNode +exprNode_iterId (/*@observer@*/ uentry c) +{ + uentry ue; + + llassert (processingIterVars ()); + + ue = uentryList_getN (uentry_getParams (getCurrentIter ()), + iterParamNo ()); + + if (uentry_isYield (ue)) + { + ctype ct = uentry_getType (ue); + exprNode e = exprNode_createPlain (ct); + cstring name = uentry_getName (c); + uentry le = uentry_makeVariable (name, ct, fileloc_undefined, FALSE); + + uentry_setUsed (ue, g_currentloc); + uentry_setHasNameError (ue); + + cstring_free (name); + + e->kind = XPR_VAR; + e->edata = exprData_makeId (le); + e->loc = context_getSaveLocation (); + e->sref = uentry_getSref (le); + + usymtab_supEntrySref (le); + + if (!context_inHeader ()) + { + if (optgenerror + (FLG_ITER, + message ("Yield parameter shadows local declaration: %q", + uentry_getName (c)), + fileloc_isDefined (e->loc) ? e->loc : g_currentloc)) + { + uentry_showWhereDeclared (c); + } + } + + return e; + } + + return (exprNode_fromIdentifierAux (c)); +} + +exprNode exprNode_iterStart (/*@observer@*/ uentry name, /*@only@*/ exprNodeList alist) +{ + exprNode ret = exprNode_create (ctype_unknown); + + ret->kind = XPR_ITERCALL; + ret->edata = exprData_makeIterCall (name, alist); + + if (uentry_isIter (name)) + { + uentryList params = uentry_getParams (name); + + if (context_inIterDef () + && uentryList_size (params) == exprNodeList_size (alist)) + { + int i = 0; + + exprNodeList_elements (alist, arg) + { + uentry parg = uentryList_getN (params, i); + + if (uentry_isYield (parg)) + { + uentry ue = exprNode_getUentry (arg); + + if (uentry_isValid (ue)) + { + ; + } + } + + i++; + } end_exprNodeList_elements; + } + + (void) checkArgsReal (name, ret, params, alist, TRUE, ret); + checkUnspecCall (ret, params, alist); + } + + return ret; +} + +/*@exposed@*/ sRef exprNode_getSref (exprNode e) +{ + if (exprNode_isDefined (e)) + { + /*@access sRef@*/ + if (e->sref == defref) /*@noaccess sRef@*/ + { + /*@-mods@*/ + e->sref = sRef_makeUnknown (); + sRef_setAliasKind (e->sref, AK_ERROR, fileloc_undefined); + /*@=mods@*/ + return e->sref; + } + else + { + return e->sref; + } + } + else + { + return sRef_undefined; + } +} + +/*@observer@*/ cstring +exprNode_unparseFirst (exprNode e) +{ + if (exprNode_isDefined (e)) + { + cstring ret; + + if (e->kind == XPR_STMTLIST + || e->kind == XPR_COMMA || e->kind == XPR_COND) + { + exprNode first = exprData_getPairA (e->edata); + + if (exprNode_isDefined (first)) + { + return (exprNode_unparseFirst (exprData_getPairA (e->edata))); + } + else + { + return (cstring_makeLiteralTemp ("...")); + } + } + + ret = cstring_elide (exprNode_unparse (e), 20); + cstring_markOwned (ret); + + return (ret); + } + else + { + return cstring_makeLiteralTemp (""); + } +} + +/*@observer@*/ cstring +exprNode_unparse (exprNode e) +{ + if (exprNode_isError (e)) + { + return cstring_makeLiteralTemp (""); + } + + if (cstring_isDefined (e->etext)) + { + return e->etext; + } + else + { + cstring ret = exprNode_doUnparse (e); + + /*@-modifies@*/ /* benevolent */ + e->etext = ret; + /*@=modifies@*/ + return ret; + } +} + +/*@observer@*/ fileloc +exprNode_loc (exprNode e) +{ + if (exprNode_isError (e)) + { + return (g_currentloc); + } + else + { + return (e->loc); + } +} + +/* +** executes exprNode e +** recursively rexecutes as though in original parse using +** information in e->edata +*/ + +static /*@only@*/ exprNodeList exprNodeList_effect (exprNodeList e) +{ + exprNodeList ret = exprNodeList_new (); + + exprNodeList_elements (e, current) + { + exprNodeList_addh (ret, exprNode_effect (current)); + } end_exprNodeList_elements; + + return ret; +} + +static /*@only@*/ exprNode exprNode_effect (exprNode e) + /*@globals internalState@*/ +{ + bool innerEffect = inEffect; + exprNode ret; + exprData data; + + inEffect = TRUE; + + context_clearJustPopped (); + + if (exprNode_isError (e)) + { + ret = exprNode_undefined; + } + else + { + /* + ** Turn off expose and dependent transfer checking. + ** Need to pass exposed internal nodes, + ** [ copying would be a waste! ] + ** [ Actually, I think I wasted a lot more time than its worth ] + ** [ trying to do this. ] + */ + + /*@-exposetrans@*/ + /*@-observertrans@*/ + /*@-dependenttrans@*/ + + data = e->edata; + + switch (e->kind) + { + case XPR_PARENS: + ret = exprNode_addParens (exprData_getUopTok (data), + exprNode_effect (exprData_getUopNode (data))); + break; + case XPR_ASSIGN: + ret = exprNode_assign (exprNode_effect (exprData_getOpA (data)), + exprNode_effect (exprData_getOpB (data)), + exprData_getOpTok (data)); + break; + case XPR_INITBLOCK: + ret = exprNode_undefined; + break; + case XPR_CALL: + ret = exprNode_functionCall (exprNode_effect (exprData_getFcn (data)), + exprNodeList_effect (exprData_getArgs (data))); + break; + case XPR_EMPTY: + ret = e; + break; + + case XPR_LABEL: + ret = e; + break; + + case XPR_CONST: + case XPR_VAR: + { + cstring id = exprData_getId (data); + uentry ue = usymtab_lookupSafe (id); + + ret = exprNode_fromIdentifierAux (ue); + ret->loc = fileloc_update (ret->loc, e->loc); + break; + } + case XPR_BODY: + ret = e; + break; + case XPR_FETCH: + ret = exprNode_arrayFetch (exprNode_effect (exprData_getPairA (data)), + exprNode_effect (exprData_getPairB (data))); + break; + case XPR_OP: + ret = exprNode_op (exprNode_effect (exprData_getOpA (data)), + exprNode_effect (exprData_getOpB (data)), + exprData_getOpTok (data)); + break; + + case XPR_POSTOP: + ret = exprNode_postOp (exprNode_effect (exprData_getUopNode (data)), + exprData_getUopTok (data)); + break; + case XPR_PREOP: + ret = exprNode_preOp (exprNode_effect (exprData_getUopNode (data)), + exprData_getUopTok (data)); + break; + + case XPR_OFFSETOF: + case XPR_SIZEOFT: + case XPR_SIZEOF: + case XPR_ALIGNOFT: + case XPR_ALIGNOF: + ret = e; + break; + + case XPR_VAARG: + ret = exprNode_vaArg (exprData_getCastTok (data), + exprNode_effect (exprData_getCastNode (data)), + exprData_getCastType (data)); + break; + + case XPR_CAST: + ret = exprNode_cast (exprData_getCastTok (data), + exprNode_effect (exprData_getCastNode (data)), + exprData_getCastType (data)); + break; + case XPR_ITERCALL: + ret = exprNode_iterStart (exprData_getIterCallIter (data), + exprNodeList_effect + (exprData_getIterCallArgs (data))); + break; + + case XPR_ITER: + ret = exprNode_iter (exprData_getIterSname (data), + exprNodeList_effect (exprData_getIterAlist (data)), + exprNode_effect (exprData_getIterBody (data)), + exprData_getIterEname (data)); + break; + + case XPR_FOR: + ret = exprNode_for (exprNode_effect (exprData_getPairA (data)), + exprNode_effect (exprData_getPairB (data))); + break; + + case XPR_FORPRED: + ret = exprNode_forPred (exprNode_effect (exprData_getTripleInit (data)), + exprNode_effect (exprData_getTripleTest (data)), + exprNode_effect (exprData_getTripleInc (data))); + break; + + case XPR_TOK: + ret = exprNode_createTok (exprData_getTok (data)); + break; + + case XPR_GOTO: + ret = exprNode_goto (exprData_getLiteral (data)); + ret->loc = fileloc_update (ret->loc, e->loc); + break; + + case XPR_CONTINUE: + ret = exprNode_continue (exprData_getTok (data), QSAFEBREAK); + break; + + case XPR_BREAK: + ret = exprNode_break (exprData_getTok (data), QSAFEBREAK); + break; + + case XPR_RETURN: + ret = exprNode_return (exprNode_effect (exprData_getSingle (data))); + break; + + case XPR_NULLRETURN: + ret = exprNode_nullReturn (exprData_getTok (data)); + break; + + case XPR_COMMA: + ret = exprNode_comma (exprNode_effect (exprData_getPairA (data)), + exprNode_effect (exprData_getPairB (data))); + break; + + case XPR_COND: + ret = exprNode_cond (exprNode_effect (exprData_getTriplePred (data)), + exprNode_effect (exprData_getTripleTrue (data)), + exprNode_effect (exprData_getTripleFalse (data))); + break; + case XPR_IF: + ret = exprNode_if (exprNode_effect (exprData_getPairA (data)), + exprNode_effect (exprData_getPairB (data))); + break; + + case XPR_IFELSE: + ret = exprNode_ifelse (exprNode_effect (exprData_getTriplePred (data)), + exprNode_effect (exprData_getTripleTrue (data)), + exprNode_effect (exprData_getTripleFalse (data))); + break; + case XPR_WHILEPRED: + ret = exprNode_whilePred (exprData_getSingle (data)); + break; + + case XPR_WHILE: + ret = exprNode_while (exprNode_effect (exprData_getPairA (data)), + exprNode_effect (exprData_getPairB (data))); + break; + + case XPR_DOWHILE: + ret = exprNode_doWhile (exprNode_effect (exprData_getPairA (data)), + exprNode_effect (exprData_getPairB (data))); + break; + + case XPR_BLOCK: + ret = exprNode_makeBlock (exprNode_effect (exprData_getSingle (data))); + break; + + case XPR_STMT: + ret = exprNode_statement (exprNode_effect (exprData_getSingle (data))); + break; + + case XPR_STMTLIST: + ret = exprNode_concat (exprNode_effect (exprData_getPairA (data)), + exprNode_effect (exprData_getPairB (data))); + break; + + case XPR_FTCASE: + case XPR_CASE: + ret = exprNode_caseMarker + (exprNode_effect (exprData_getSingle (data)), + TRUE); + break; + + case XPR_FTDEFAULT: + case XPR_DEFAULT: + ret = exprNode_createTok (exprData_getTok (data)); + break; + + case XPR_SWITCH: + ret = exprNode_switch (exprNode_effect (exprData_getPairA (data)), + exprNode_effect (exprData_getPairB (data))); + break; + + case XPR_INIT: + ret = exprNode_makeInitialization + (exprData_getInitId (data), + exprNode_effect (exprData_getInitNode (data))); + break; + + case XPR_FACCESS: + ret = exprNode_fieldAccess (exprNode_effect (exprData_getFieldNode (data)), + cstring_copy (exprData_getFieldName (data))); + break; + + case XPR_ARROW: + ret = exprNode_arrowAccess (exprNode_effect (exprData_getFieldNode (data)), + cstring_copy (exprData_getFieldName (data))); + break; + + case XPR_STRINGLITERAL: + ret = e; + break; + + case XPR_NUMLIT: + ret = e; + break; + + case XPR_NODE: + ret = e; + break; + /*@-branchstate@*/ + } + /*@=branchstate@*/ + /*@=observertrans@*/ + /*@=exposetrans@*/ + /*@=dependenttrans@*/ + } + + if (!innerEffect) + { + inEffect = FALSE; + } + + return ret; +} + +static /*@observer@*/ cstring exprNode_rootVarName (exprNode e) +{ + cstring ret; + exprData data; + + if (exprNode_isError (e)) + { + return cstring_undefined; + } + + data = e->edata; + + switch (e->kind) + { + case XPR_PARENS: + ret = exprNode_rootVarName (exprData_getUopNode (data)); + break; + case XPR_ASSIGN: + ret = exprNode_rootVarName (exprData_getOpA (data)); + break; + case XPR_CONST: + case XPR_VAR: + ret = exprData_getId (data); + break; + case XPR_LABEL: + case XPR_TOK: + case XPR_ITERCALL: + case XPR_EMPTY: + case XPR_CALL: + case XPR_INITBLOCK: + case XPR_BODY: + case XPR_FETCH: + case XPR_OP: + case XPR_POSTOP: + case XPR_PREOP: + case XPR_OFFSETOF: + case XPR_ALIGNOFT: + case XPR_ALIGNOF: + case XPR_SIZEOFT: + case XPR_SIZEOF: + case XPR_VAARG: + case XPR_CAST: + case XPR_ITER: + case XPR_FOR: + case XPR_FORPRED: + case XPR_BREAK: + case XPR_RETURN: + case XPR_NULLRETURN: + case XPR_COMMA: + case XPR_COND: + case XPR_IF: + case XPR_IFELSE: + case XPR_WHILE: + case XPR_WHILEPRED: + case XPR_DOWHILE: + case XPR_GOTO: + case XPR_CONTINUE: + case XPR_FTDEFAULT: + case XPR_DEFAULT: + case XPR_SWITCH: + case XPR_FTCASE: + case XPR_CASE: + case XPR_BLOCK: + case XPR_STMT: + case XPR_STMTLIST: + case XPR_INIT: + case XPR_FACCESS: + case XPR_ARROW: + case XPR_NODE: + case XPR_NUMLIT: + case XPR_STRINGLITERAL: + ret = cstring_undefined; + break; + } + + return ret; +} + +static /*@only@*/ cstring exprNode_doUnparse (exprNode e) +{ + cstring ret; + exprData data; + + if (exprNode_isError (e)) + { + static /*@only@*/ cstring error = cstring_undefined; + + if (!cstring_isDefined (error)) + { + error = cstring_makeLiteral (""); + } + + return error; + } + + data = e->edata; + + switch (e->kind) + { + case XPR_PARENS: + ret = message ("(%s)", exprNode_unparse (exprData_getUopNode (e->edata))); + break; + case XPR_ASSIGN: + ret = message ("%s %s %s", + exprNode_unparse (exprData_getOpA (data)), + lltok_unparse (exprData_getOpTok (data)), + exprNode_unparse (exprData_getOpB (data))); + break; + case XPR_CALL: + ret = message ("%s(%q)", + exprNode_unparse (exprData_getFcn (data)), + exprNodeList_unparse (exprData_getArgs (data))); + break; + case XPR_INITBLOCK: + ret = message ("{ %q }", exprNodeList_unparse (exprData_getArgs (data))); + break; + case XPR_EMPTY: + ret = cstring_undefined; + break; + case XPR_LABEL: + ret = message ("%s:", exprData_getId (data)); + break; + case XPR_CONST: + case XPR_VAR: + ret = cstring_copy (exprData_getId (data)); + break; + case XPR_FETCH: + ret = message ("%s[%s]", exprNode_unparse (exprData_getPairA (data)), + exprNode_unparse (exprData_getPairB (data))); + break; + case XPR_BODY: + ret = message (""); + break; + case XPR_OP: + ret = message ("%s %s %s", + exprNode_unparse (exprData_getOpA (data)), + lltok_unparse (exprData_getOpTok (data)), + exprNode_unparse (exprData_getOpB (data))); + break; + + case XPR_PREOP: + ret = message ("%s%s", + lltok_unparse (exprData_getUopTok (data)), + exprNode_unparse (exprData_getUopNode (data))); + break; + + case XPR_POSTOP: + ret = message ("%s%s", + exprNode_unparse (exprData_getUopNode (data)), + lltok_unparse (exprData_getUopTok (data))); + break; + + case XPR_OFFSETOF: + ret = message ("offsetof(%s,%q)", + ctype_unparse (qtype_getType (exprData_getOffsetType (data))), + cstringList_unparseSep (exprData_getOffsetName (data), cstring_makeLiteralTemp ("."))); + break; + + case XPR_SIZEOFT: + ret = message ("sizeof(%s)", ctype_unparse (qtype_getType (exprData_getType (data)))); + break; + + case XPR_SIZEOF: + ret = message ("sizeof(%s)", exprNode_unparse (exprData_getSingle (data))); + break; + + case XPR_ALIGNOFT: + ret = message ("alignof(%s)", ctype_unparse (qtype_getType (exprData_getType (data)))); + break; + + case XPR_ALIGNOF: + ret = message ("alignof(%s)", exprNode_unparse (exprData_getSingle (data))); + break; + + case XPR_VAARG: + ret = message ("va_arg(%s, %q)", + exprNode_unparse (exprData_getCastNode (data)), + qtype_unparse (exprData_getCastType (data))); + break; + + case XPR_ITERCALL: + ret = message ("%q(%q)", + uentry_getName (exprData_getIterCallIter (data)), + exprNodeList_unparse (exprData_getIterCallArgs (data))); + break; + case XPR_ITER: + ret = message ("%q(%q) %s %q", + uentry_getName (exprData_getIterSname (data)), + exprNodeList_unparse (exprData_getIterAlist (data)), + exprNode_unparse (exprData_getIterBody (data)), + uentry_getName (exprData_getIterEname (data))); + break; + case XPR_CAST: + ret = message ("(%q)%s", + qtype_unparse (exprData_getCastType (data)), + exprNode_unparse (exprData_getCastNode (data))); + break; + + case XPR_FOR: + ret = message ("%s %s", + exprNode_unparse (exprData_getPairA (data)), + exprNode_unparse (exprData_getPairB (data))); + break; + + case XPR_FORPRED: + ret = message ("for (%s; %s; %s)", + exprNode_unparse (exprData_getTripleInit (data)), + exprNode_unparse (exprData_getTripleTest (data)), + exprNode_unparse (exprData_getTripleInc (data))); + break; + + case XPR_GOTO: + ret = message ("goto %s", exprData_getLiteral (data)); + break; + + case XPR_CONTINUE: + ret = cstring_makeLiteral ("continue"); + break; + + case XPR_BREAK: + ret = cstring_makeLiteral ("break"); + break; + + case XPR_RETURN: + ret = message ("return %s", exprNode_unparse (exprData_getSingle (data))); + break; + + case XPR_NULLRETURN: + ret = cstring_makeLiteral ("return"); + break; + + case XPR_COMMA: + ret = message ("%s, %s", + exprNode_unparse (exprData_getPairA (data)), + exprNode_unparse (exprData_getPairB (data))); + break; + + case XPR_COND: + ret = message ("%s ? %s : %s", + exprNode_unparse (exprData_getTriplePred (data)), + exprNode_unparse (exprData_getTripleTrue (data)), + exprNode_unparse (exprData_getTripleFalse (data))); + break; + case XPR_IF: + ret = message ("if (%s) %s", + exprNode_unparse (exprData_getPairA (data)), + exprNode_unparse (exprData_getPairB (data))); + break; + + case XPR_IFELSE: + ret = message ("if (%s) %s else %s", + exprNode_unparse (exprData_getTriplePred (data)), + exprNode_unparse (exprData_getTripleTrue (data)), + exprNode_unparse (exprData_getTripleFalse (data))); + break; + case XPR_WHILE: + ret = message ("while (%s) %s", + exprNode_unparse (exprData_getPairA (data)), + exprNode_unparse (exprData_getPairB (data))); + break; + + case XPR_WHILEPRED: + ret = cstring_copy (exprNode_unparse (exprData_getSingle (data))); + break; + + case XPR_TOK: + ret = cstring_copy (lltok_unparse (exprData_getTok (data))); + break; + + case XPR_DOWHILE: + ret = message ("do { %s } while (%s)", + exprNode_unparse (exprData_getPairB (data)), + exprNode_unparse (exprData_getPairA (data))); + break; + + case XPR_BLOCK: + ret = message ("{ %s }", exprNode_unparseFirst (exprData_getSingle (data))); + break; + + case XPR_STMT: + ret = cstring_copy (exprNode_unparse (exprData_getSingle (data))); + break; + + case XPR_STMTLIST: + ret = message ("%s; %s", + exprNode_unparse (exprData_getPairA (data)), + exprNode_unparse (exprData_getPairB (data))); + break; + + case XPR_FTDEFAULT: + case XPR_DEFAULT: + ret = cstring_makeLiteral ("default:"); + break; + + case XPR_SWITCH: + ret = message ("switch (%s) %s", + exprNode_unparse (exprData_getPairA (data)), + exprNode_unparse (exprData_getPairB (data))); + break; + + case XPR_FTCASE: + case XPR_CASE: + ret = message ("case %s:", + exprNode_unparse (exprData_getSingle (data))); + break; + + case XPR_INIT: + ret = message ("%s = %s", + idDecl_getName (exprData_getInitId (data)), + exprNode_unparse (exprData_getInitNode (data))); + break; + + case XPR_FACCESS: + ret = message ("%s.%s", + exprNode_unparse (exprData_getFieldNode (data)), + exprData_getFieldName (data)); + break; + + case XPR_ARROW: + ret = message ("%s->%s", + exprNode_unparse (exprData_getFieldNode (data)), + exprData_getFieldName (data)); + break; + + case XPR_STRINGLITERAL: + ret = cstring_copy (exprData_getLiteral (data)); + break; + + case XPR_NUMLIT: + ret = cstring_copy (exprData_getLiteral (data)); + break; + + case XPR_NODE: + ret = cstring_makeLiteral (""); + break; + } + + return ret; +} + +bool +exprNode_isCharLit (exprNode e) +{ + if (exprNode_isDefined (e)) + { + return (multiVal_isChar (exprNode_getValue (e))); + } + else + { + return FALSE; + } +} + +bool +exprNode_isNumLit (exprNode e) +{ + if (exprNode_isDefined (e)) + { + return (multiVal_isInt (exprNode_getValue (e))); + } + else + { + return FALSE; + } +} + +static bool +exprNode_isFalseConstant (exprNode e) +{ + if (exprNode_isDefined (e)) + { + cstring s = exprNode_rootVarName (e); + + if (cstring_equal (s, context_getFalseName ())) + { + return TRUE; + } + } + + return FALSE; +} + +bool +exprNode_matchLiteral (ctype expected, exprNode e) +{ + if (exprNode_isDefined (e)) + { + multiVal m = exprNode_getValue (e); + + if (multiVal_isDefined (m)) + { + if (multiVal_isInt (m)) + { + long int val = multiVal_forceInt (m); + + if (ctype_isDirectBool (ctype_realishType (expected))) + { + if (val == 0) + { + return FALSE; /* really?! return TRUE; allow use of 0 for FALSE */ + } + else + { + return FALSE; + } + } + + if (ctype_isRealInt (expected)) + { + /* + ** unsigned <- [ constant >= 0 is okay ] + */ + + if (ctype_isUnsigned (expected)) + { + if (val < 0) + { + return FALSE; + } + } + + /* + ** No checks on sizes of integers...maybe add + ** these later. + */ + + DPRINTF (("Here: %s => %s", exprNode_unparse (e), ctype_unparse (expected))); + DPRINTF (("Type: %s / %s", ctype_unparse (exprNode_getType (e)), + bool_unparse (ctype_isInt (exprNode_getType (e))))); + + if (context_getFlag (FLG_NUMLITERAL) + && (ctype_isRegularInt (exprNode_getType (e)) || val == 0)) { + return TRUE; + } else { + if (val == 0) { + return TRUE; + } else { + return FALSE; /* evs 2000-05-17: previously, always returned TRUE */ + } + } + } + else if (ctype_isChar (expected)) + { + return FALSE; + } + else if (ctype_isArrayPtr (expected)) + { + return (val == 0); + } + else if (ctype_isAnyFloat (expected)) + { + return (context_getFlag (FLG_NUMLITERAL)); + } + else + { + return FALSE; + } + } + else if (multiVal_isDouble (m)) + { + if (ctype_isAnyFloat (expected)) + { + return TRUE; + } + } + else if (multiVal_isChar (m)) + { + char val = multiVal_forceChar (m); + + if (ctype_isChar (expected)) + { + if (ctype_isUnsigned (expected) && ((int)val) < 0) + { + return FALSE; + } + else + { + return TRUE; + } + } + } + else + { + return FALSE; + } + } + } + + return FALSE; +} + +bool +exprNode_matchType (ctype expected, exprNode e) +{ + ctype actual; + + if (!exprNode_isDefined (e)) return TRUE; + + actual = ctype_realishType (exprNode_getType (e)); + + if (ctype_match (ctype_realishType (expected), actual)) + { + return TRUE; + } + + llassert (!exprNode_isError (e)); + return (exprNode_matchLiteral (expected, e)); +} + +static bool +exprNode_matchTypes (exprNode e1, exprNode e2) +{ + ctype t1; + ctype t2; + + if (!exprNode_isDefined (e1)) return TRUE; + if (!exprNode_isDefined (e2)) return TRUE; + + /* + ** realish type --- keep bools, bools + */ + + t1 = ctype_realishType (exprNode_getType (e1)); + t2 = ctype_realishType (exprNode_getType (e2)); + + if (ctype_match (t1, t2)) + { + return TRUE; + } + + return (exprNode_matchLiteral (t1, e2) || exprNode_matchLiteral (t2, e1)); +} + +/* +** pass e as ct +*/ + +static bool + exprNode_matchArgType (ctype ct, exprNode e) +{ + ctype et; + + if (!exprNode_isDefined (e)) + { + return TRUE; + } + + et = ctype_realType (exprNode_getType (e)); + + if (ctype_matchArg (ct, et)) return TRUE; + + llassert (!exprNode_isError (e)); + return (exprNode_matchLiteral (ct, e)); +} + +static /*@only@*/ exprNodeSList + exprNode_flatten (/*@dependent@*/ exprNode e) /*@*/ +{ + if (exprNode_isDefined (e)) + { + if (e->kind == XPR_STMTLIST) + { + return (exprNodeSList_append + (exprNode_flatten (exprData_getPairA (e->edata)), + exprNode_flatten (exprData_getPairB (e->edata)))); + } + else if (e->kind == XPR_BLOCK) + { + return (exprNode_flatten (exprData_getSingle (e->edata))); + } + else + { + return (exprNodeSList_singleton (e)); + } + } + + return exprNodeSList_new (); +} + +static /*@exposed@*/ exprNode +exprNode_lastStatement (/*@returned@*/ exprNode e) +{ + if (exprNode_isDefined (e)) + { + if (e->kind == XPR_STMTLIST) + { + exprNode b = exprData_getPairB (e->edata); + + if (exprNode_isDefined (b)) + { + return exprNode_lastStatement (b); + } + else + { + return exprNode_lastStatement (exprData_getPairA (e->edata)); + } + } + else if (e->kind == XPR_BLOCK) + { + return (exprNode_lastStatement (exprData_getSingle (e->edata))); + } + else + { + return (e); + } + } + + return exprNode_undefined; +} + +static /*@exposed@*/ exprNode +exprNode_firstStatement (/*@returned@*/ exprNode e) +{ + if (exprNode_isDefined (e)) + { + if (e->kind == XPR_STMTLIST) + { + exprNode b = exprData_getPairA (e->edata); + + if (exprNode_isDefined (b)) + { + return exprNode_firstStatement (b); + } + else + { + return exprNode_firstStatement (exprData_getPairB (e->edata)); + } + } + else if (e->kind == XPR_BLOCK) + { + return (exprNode_firstStatement (exprData_getSingle (e->edata))); + } + else + { + return (e); + } + } + + return exprNode_undefined; +} + +static void +exprNode_mergeUSs (exprNode res, exprNode other) +{ + if (exprNode_isDefined (res) && exprNode_isDefined (other)) + { + res->msets = sRefSet_union (res->msets, other->msets); + res->sets = sRefSet_union (res->sets, other->sets); + res->uses = sRefSet_union (res->uses, other->uses); + } +} + +static void +exprNode_mergeCondUSs (exprNode res, exprNode other1, exprNode other2) +{ + if (exprNode_isDefined (res)) + { + if (exprNode_isDefined (other1)) + { + res->sets = sRefSet_union (res->sets, other1->sets); + res->msets = sRefSet_union (res->msets, other1->msets); + res->uses = sRefSet_union (res->uses, other1->uses); + } + if (exprNode_isDefined (other2)) + { + res->sets = sRefSet_union (res->sets, other2->sets); + res->msets = sRefSet_union (res->msets, other2->msets); + res->uses = sRefSet_union (res->uses, other2->uses); + } + } +} + +/* +** modifies e->uses +** +** Reports errors is s is not defined. +*/ + +static void +exprNode_addUse (exprNode e, sRef s) +{ + if (exprNode_isDefined (e)) + { + e->uses = sRefSet_insert (e->uses, s); + } +} + +void +exprNode_checkUse (exprNode e, sRef s, fileloc loc) +{ + if (sRef_isKnown (s) && !sRef_isConst (s)) + { + /* + ** need to check all outer types are useable + */ + + DPRINTF (("Check use: %s / %s", + exprNode_unparse (e), sRef_unparse (s))); + + exprNode_addUse (e, s); + + if (!context_inProtectVars ()) + { + /* + ** only report the deepest error + */ + + sRef errorRef = sRef_undefined; + sRef lastRef = sRef_undefined; + bool deadRef = FALSE; + bool unuseable = FALSE; + bool errorMaybe = FALSE; + + while (sRef_isValid (s) && sRef_isKnown (s)) + { + ynm readable = sRef_isReadable (s); + + if (!(ynm_toBoolStrict (readable))) + { + if (ynm_isMaybe (readable)) + { + lastRef = errorRef; + errorRef = s; + deadRef = sRef_isPossiblyDead (errorRef); + unuseable = sRef_isUnuseable (errorRef); + errorMaybe = TRUE; + } + else + { + lastRef = errorRef; + errorRef = s; + deadRef = sRef_isDead (errorRef); + unuseable = sRef_isUnuseable (errorRef); + errorMaybe = FALSE; + } + + if (!sRef_isPartial (s)) + { + sRef_setDefined (s, fileloc_undefined); + } + } + + s = sRef_getBaseSafe (s); + } /* end while */ + + if (sRef_isValid (errorRef)) + { + if (sRef_isValid (lastRef) && sRef_isField (lastRef) + && sRef_isPointer (errorRef)) + { + errorRef = lastRef; + } + + if (deadRef) + { + if (sRef_isThroughArrayFetch (errorRef)) + { + if (optgenerror + (FLG_STRICTUSERELEASED, + message ("%q %q may be used after being released", + sRef_unparseKindNamePlain (errorRef), + sRef_unparse (errorRef)), + loc)) + { + sRef_showRefKilled (errorRef); + + if (sRef_isKept (errorRef)) + { + sRef_clearAliasState (errorRef, loc); + } + } + } + else + { + DPRINTF (("HERE: %s", sRef_unparse (errorRef))); + + if (optgenerror + (FLG_USERELEASED, + message ("%q %q %qused after being released", + sRef_unparseKindNamePlain (errorRef), + sRef_unparse (errorRef), + cstring_makeLiteral (errorMaybe + ? "may be " : "")), + loc)) + { + sRef_showRefKilled (errorRef); + + if (sRef_isKept (errorRef)) + { + sRef_clearAliasState (errorRef, loc); + } + } + } + } + else if (unuseable) + { + if (optgenerror + (FLG_USEDEF, + message ("%q %q%qused in inconsistent state", + sRef_unparseKindName (errorRef), + sRef_unparseOpt (errorRef), + cstring_makeLiteral (errorMaybe ? "may be " : "")), + loc)) + { + sRef_showStateInconsistent (errorRef); + } + } + else + { + DPRINTF (("HERE: %s", sRef_unparse (errorRef))); + + voptgenerror + (FLG_USEDEF, + message ("%q %q%qused before definition", + sRef_unparseKindName (errorRef), + sRef_unparseOpt (errorRef), + cstring_makeLiteral (errorMaybe ? "may be " : "")), + loc); + } + + sRef_setDefined (errorRef, loc); + + if (sRef_isAddress (errorRef)) + { + sRef_setDefined (sRef_getRootBase (errorRef), loc); + } + } /* end is error */ + } + } + + setCodePoint (); +} + +static void +checkSafeUse (exprNode e, sRef s) +{ + if (exprNode_isDefined (e) && sRef_isKnown (s)) + { + e->uses = sRefSet_insert (e->uses, s); + } +} + +static void +exprNode_checkSetAny (exprNode e, /*@dependent@*/ cstring name) +{ + if (exprNode_isDefined (e)) + { + e->sets = sRefSet_insert (e->sets, sRef_makeUnconstrained (name)); + } +} + +void +exprNode_checkSet (exprNode e, sRef s) +{ + sRef defines = sRef_undefined; + + if (sRef_isValid (s) && !sRef_isNothing (s)) + { + uentry ue = sRef_getBaseUentry (s); + + if (uentry_isValid (ue)) + { + uentry_setLset (ue); + } + + if (!ynm_toBoolStrict (sRef_isWriteable (s))) + { + voptgenerror (FLG_USEDEF, + message ("Attempt to set unuseable storage: %q", + sRef_unparse (s)), + exprNode_loc (e)); + } + + if (sRef_isMeaningful (s)) + { + + if (sRef_isDead (s)) + { + sRef base = sRef_getBaseSafe (s); + + if (sRef_isValid (base) + && sRef_isDead (base)) + { + sRef_setPartial (s, exprNode_loc (e)); + } + + defines = s; /* okay - modifies for only param */ + } + else if (sRef_isPartial (s)) + { + sRef eref = exprNode_getSref (e); + + if (!sRef_isPartial (eref)) + { + /* + ** should do something different here??? + */ + + sRef_setDefinedComplete (eref, exprNode_loc (e)); + } + else + { + sRef_setPartialDefinedComplete (eref, exprNode_loc (e)); + } + + if (sRef_isMeaningful (eref)) + { + defines = eref; + } + else + { + defines = s; + } + } + else if (sRef_isAllocated (s)) + { + sRef eref = exprNode_getSref (e); + + + if (!sRef_isAllocated (eref)) + { + sRef_setDefinedComplete (eref, exprNode_loc (e)); + } + else + { + sRef base = sRef_getBaseSafe (eref); + + if (sRef_isValid (base)) + { + sRef_setPdefined (base, exprNode_loc (e)); + } + } + + defines = s; + } + else + { + sRef_setDefinedNCComplete (s, exprNode_loc (e)); + defines = s; + } + + } + else /* not meaningful...but still need to insert it */ + { + defines = s; + } + } + + if (exprNode_isDefined (e) && sRef_isValid (defines)) + { + e->sets = sRefSet_insert (e->sets, defines); + } +} + +void +exprNode_checkMSet (exprNode e, sRef s) +{ + if (sRef_isValid (s) && !sRef_isNothing (s)) + { + uentry ue = sRef_getBaseUentry (s); + + if (uentry_isValid (ue)) + { + uentry_setLset (ue); + } + + if (!ynm_toBoolStrict (sRef_isWriteable (s))) + { + voptgenerror (FLG_USEDEF, + message ("Attempt to set unuseable storage: %q", sRef_unparse (s)), + exprNode_loc (e)); + } + + if (sRef_isMeaningful (s)) + { + sRef_setDefinedComplete (s, exprNode_loc (e)); + } + + if (exprNode_isDefined (e)) + { + e->msets = sRefSet_insert (e->msets, s); + } + } +} + +static void +checkUnspecCall (/*@notnull@*/ /*@dependent@*/ exprNode fcn, uentryList params, exprNodeList args) +{ + checkAnyCall (fcn, cstring_undefined, params, args, + FALSE, sRefSet_undefined, FALSE, 0); +} + +static void +checkOneArg (uentry ucurrent, /*@notnull@*/ exprNode current, + /*@dependent@*/ exprNode fcn, bool isSpec, int argno, int totargs) +{ + setCodePoint (); + + if (uentry_isYield (ucurrent)) + { + sRef_setDefined (exprNode_getSref (current), exprNode_loc (current)); + exprNode_checkSet (current, current->sref); + } + else + { + if (uentry_isSefParam (ucurrent)) + { + sRefSet sets = current->sets; + sRef ref = exprNode_getSref (current); + + if (sRef_isMacroParamRef (ref)) + { + uentry ue = sRef_getUentry (ref); + + if (!uentry_isSefParam (ue)) + { + voptgenerror + (FLG_SEFPARAMS, + message + ("Parameter %d to %s is declared sef, but " + "the argument is a macro parameter declared " + "without sef: %s", + argno, exprNode_unparse (fcn), + exprNode_unparse (current)), + exprNode_loc (current)); + } + } + + if (!sRefSet_isEmpty (sets)) + { + sRefSet reported = sRefSet_undefined; + + sRefSet_realElements (current->sets, el) + { + if (sRefSet_isSameNameMember (reported, el)) + { + ; /* don't report again */ + } + else + { + if (sRef_isUnconstrained (el)) + { + voptgenerror + (FLG_SEFUNSPEC, + message + ("Parameter %d to %s is declared sef, but " + "the argument calls unconstrained function %s " + "(no guarantee it will not modify something): %s", + argno, exprNode_unparse (fcn), + sRef_unconstrainedName (el), + exprNode_unparse (current)), + exprNode_loc (current)); + } + else + { + voptgenerror + (FLG_SEFPARAMS, + message + ("Parameter %d to %s is declared sef, but " + "the argument may modify %q: %s", + argno, exprNode_unparse (fcn), + sRef_unparse (el), + exprNode_unparse (current)), + exprNode_loc (current)); + } + } + } end_sRefSet_realElements; + } + } + + checkPassTransfer (current, ucurrent, isSpec, fcn, argno, totargs); + exprNode_mergeUSs (fcn, current); + } +} + +static void + checkAnyCall (/*@dependent@*/ exprNode fcn, + /*@dependent@*/ cstring fname, + uentryList pn, + exprNodeList args, + bool hasMods, sRefSet mods, + bool isSpec, + int specialArgs) +{ + int paramno = 0; + int nargs = exprNodeList_size (args); + + setCodePoint (); + + /* + ** concat all args ud's to f, add each arg sref as a use unless + ** it was specified as "out", in which case it is a def. + */ + + uentryList_reset (pn); + + /* + ** aliasing checks: + ** + ** if paramn is only or unique, no other arg may alias argn + */ + + exprNodeList_elements (args, current) + { + paramno++; + + if (exprNode_isDefined (current)) + { + if ((!uentryList_isUndefined (pn) && !uentryList_isFinished (pn))) + { + uentry ucurrent = uentryList_current (pn); + + if (specialArgs == 0 + || (paramno < specialArgs)) + { + checkOneArg (ucurrent, current, fcn, isSpec, paramno, nargs); + + if (context_maybeSet (FLG_ALIASUNIQUE)) + { + if (uentry_isOnly (ucurrent) + || uentry_isUnique (ucurrent)) + { + checkUniqueParams (fcn, current, args, + paramno, ucurrent); + } + } + } + } + else /* uentry is undefined */ + { + if (specialArgs == 0) + { + exprNode_checkUseParam (current); + } + + exprNode_mergeUSs (fcn, current); + } + } + uentryList_advanceSafe (pn); + } end_exprNodeList_elements; + + if (hasMods) + { + setCodePoint (); + + sRefSet_allElements (mods, s) + { + sRef fb; + sRef rb = sRef_getRootBase (s); + + if (sRef_isGlobal (rb)) + { + context_usedGlobal (rb); + } + + fb = sRef_fixBaseParam (s, args); + + if (!sRef_isMacroParamRef (fb)) + { + if (sRef_isNothing (fb)) + { + ; + } + else + { + if (sRef_isValid (fb)) + { + uentry ue = sRef_getBaseUentry (s); + + if (uentry_isValid (ue)) + { + uentry_setLset (ue); + } + } + + fcn->sets = sRefSet_insert (fcn->sets, fb); + } + } + sRef_clearDerivedComplete (s); + } end_sRefSet_allElements; + + setCodePoint (); + } + else + { + if (context_hasMods ()) + { + if (context_maybeSet (FLG_MODUNCON)) + { + voptgenerror + (FLG_MODUNCON, + message ("Undetected modification possible " + "from call to unconstrained function %s: %s", + fname, + exprNode_unparse (fcn)), + exprNode_loc (fcn)); + } + } + else + { + if (context_maybeSet (FLG_MODUNCONNOMODS) + && !(context_inIterDef () || context_inIterEnd ())) + { + voptgenerror + (FLG_MODUNCONNOMODS, + message ("Undetected modification possible " + "from call to unconstrained function %s: %s", + fname, + exprNode_unparse (fcn)), + exprNode_loc (fcn)); + } + } + + exprNode_checkSetAny (fcn, fname); + } +} + +void exprNode_checkUseParam (exprNode current) +{ + if (exprNode_isDefined (current)) + { + exprNode_checkUse (current, current->sref, current->loc); + } +} + +static ctype + checkNumerics (ctype tr1, ctype tr2, ctype te1, ctype te2, + /*@notnull@*/ exprNode e1, /*@notnull@*/ exprNode e2, + lltok op) +{ + ctype ret = tr1; + + if (!ctype_match (tr1, tr2)) + { + if ((ctype_isRealInt (tr1) || ctype_isReal (tr1)) && + (ctype_isRealInt (tr2) || ctype_isReal (tr2))) + { + ; + } + else + { + (void) gentypeerror + (tr1, e1, tr2, e2, + message ("Incompatible types for %s (%s, %s): %s %s %s", + lltok_unparse (op), + ctype_unparse (te1), + ctype_unparse (te2), + exprNode_unparse (e1), lltok_unparse (op), + exprNode_unparse (e2)), + e1->loc); + } + ret = ctype_unknown; + } + else + { + if (ctype_isForceRealNumeric (&tr1) && ctype_isForceRealNumeric (&tr2)) + { + ret = ctype_resolveNumerics (tr1, tr2); + } + else if (!context_msgStrictOps ()) + { + if (ctype_isPointer (tr1)) + { + if (ctype_isPointer (tr2) && !exprNode_isNullValue (e2)) + { + ret = ctype_int; + } + else if (ctype_isInt (tr2)) + { + ret = te1; + } + else + { + ret = ctype_unknown; + } + } + else if (ctype_isPointer (tr2)) + { + if (ctype_isPointer (tr1)) + { + ret = ctype_int; + } + else if (ctype_isInt (tr1)) + { + ret = te2; + } + else + { + ret = ctype_unknown; + } + } + else + { + ret = ctype_resolveNumerics (tr1, tr2); + } + } + else + { + int opid = lltok_getTok (op); + bool comparop = (opid == EQ_OP || opid == NE_OP + || opid == TLT || opid == TGT + || opid == LE_OP || opid == GE_OP); + + if (!ctype_isNumeric (tr1) && !ctype_isNumeric (tr2)) + { + if (comparop + && ((ctype_isEnum (tr1) && ctype_isEnum (tr2)) + || (ctype_isBool (tr1) && ctype_isBool (tr2)) + || (ctype_isChar (tr1) && ctype_isChar (tr2)))) + { + ; /* no error */ + } + else + { + if (ctype_sameName (te1, te2)) + { + voptgenerror + (FLG_STRICTOPS, + message ("Operands of %s are non-numeric (%t): %s %s %s", + lltok_unparse (op), te1, + exprNode_unparse (e1), lltok_unparse (op), + exprNode_unparse (e2)), + e1->loc); + } + else + { + voptgenerror + (FLG_STRICTOPS, + message ("Operands of %s are non-numerics (%t, %t): %s %s %s", + lltok_unparse (op), te1, te2, + exprNode_unparse (e1), lltok_unparse (op), + exprNode_unparse (e2)), + e1->loc); + } + } + } + else if (!ctype_isNumeric (tr1)) + { + voptgenerror + (FLG_STRICTOPS, + message ("Right operand of %s is non-numeric (%t): %s %s %s", + lltok_unparse (op), te1, + exprNode_unparse (e1), lltok_unparse (op), + exprNode_unparse (e2)), + e1->loc); + } + else + { + if (!ctype_isNumeric (tr2)) + { + voptgenerror + (FLG_STRICTOPS, + message ("Left operand of %s is non-numeric (%t): %s %s %s", + lltok_unparse (op), te2, + exprNode_unparse (e1), lltok_unparse (op), + exprNode_unparse (e2)), + e2->loc); + } + } + + ret = ctype_unknown; + } + } + + return ret; +} + +static void +abstractOpError (ctype tr1, ctype tr2, lltok op, + /*@notnull@*/ exprNode e1, /*@notnull@*/ exprNode e2, + fileloc loc1, fileloc loc2) +{ + if (ctype_isRealAbstract (tr1) && ctype_isRealAbstract (tr2)) + { + if (ctype_match (tr1, tr2)) + { + voptgenerror + (FLG_ABSTRACT, + message ("Operands of %s are abstract type (%t): %s %s %s", + lltok_unparse (op), tr1, + exprNode_unparse (e1), lltok_unparse (op), exprNode_unparse (e2)), + loc1); + } + else + { + voptgenerror + (FLG_ABSTRACT, + message ("Operands of %s are abstract types (%t, %t): %s %s %s", + lltok_unparse (op), tr1, tr2, + exprNode_unparse (e1), lltok_unparse (op), exprNode_unparse (e2)), + loc1); + } + } + else if (ctype_isRealAbstract (tr1)) + { + voptgenerror + (FLG_ABSTRACT, + message ("Left operand of %s is abstract type (%t): %s %s %s", + lltok_unparse (op), tr1, + exprNode_unparse (e1), lltok_unparse (op), exprNode_unparse (e2)), + loc1); + } + else + { + if (ctype_isRealAbstract (tr2)) + { + voptgenerror + (FLG_ABSTRACT, + message ("Right operand of %s is abstract type (%t): %s %s %s", + lltok_unparse (op), tr2, + exprNode_unparse (e1), lltok_unparse (op), exprNode_unparse (e2)), + loc2); + } + } +} + +/* +** e1 <= e2 +** +** requies e1 and e2 and not error exprNode's. +** +** Checks: +** +** If e1 is a component of an abstract type, and e2 is mutable and client-visible, +** the rep of the abstract type is exposed. +** +** The order is very important: +** +** check rep expose (move into check transfer) +** check transfer +** setup aliases +*/ + +/* +** This isn't really a sensible procedure, but the indententation +** was getting too deep. +*/ + +static void +checkOneRepExpose (sRef ysr, sRef base, + /*@notnull@*/ exprNode e1, + /*@notnull@*/ exprNode e2, ctype ct, + sRef s2b) +{ + if (!(sRef_isOnly (ysr) || sRef_isKeep (ysr) + || sRef_isOwned (ysr) || sRef_isExposed (ysr))) + { + if (sRef_isAnyParam (base) && !sRef_isExposed (base)) + { + if (sRef_isIReference (ysr)) + { + if (sRef_sameName (base, sRef_getRootBase (e2->sref))) + { + voptgenerror + (FLG_ASSIGNEXPOSE, + message + ("Assignment of mutable component of parameter %q " + "to component of abstract " + "type %s exposes rep: %s = %s", + sRef_unparse (base), + ctype_unparse (ct), + exprNode_unparse (e1), exprNode_unparse (e2)), + e1->loc); + } + else + { + voptgenerror + (FLG_ASSIGNEXPOSE, + message + ("Assignment of mutable component of parameter %q " + "(through alias %q) to component of abstract " + "type %s exposes rep: %s = %s", + sRef_unparse (base), + sRef_unparse (e2->sref), + ctype_unparse (ct), + exprNode_unparse (e1), exprNode_unparse (e2)), + e1->loc); + } + } + else + { + if (sRef_sameName (base, sRef_getRootBase (e2->sref))) + { + voptgenerror + (FLG_ASSIGNEXPOSE, + message ("Assignment of mutable parameter %q " + "to component of abstract type %s " + "exposes rep: %s = %s", + sRef_unparse (base), + ctype_unparse (ct), + exprNode_unparse (e1), + exprNode_unparse (e2)), + e1->loc); + } + else + { + voptgenerror + (FLG_ASSIGNEXPOSE, + message ("Assignment of mutable parameter %q " + "(through alias %q) to " + "component of abstract type %s exposes " + "rep: %s = %s", + sRef_unparse (base), + sRef_unparse (e2->sref), + ctype_unparse (ct), + exprNode_unparse (e1), + exprNode_unparse (e2)), + e1->loc); + } + } + } + + if (sRef_isGlobal (s2b)) + { + if (sRef_sameName (base, sRef_getRootBase (e2->sref))) + { + voptgenerror + (FLG_REPEXPOSE, + message ("Assignment of global %q " + "to component of " + "abstract type %s exposes rep: %s = %s", + sRef_unparse (base), + ctype_unparse (ct), + exprNode_unparse (e1), exprNode_unparse (e2)), + e1->loc); + } + else + { + voptgenerror + (FLG_REPEXPOSE, + message ("Assignment of global %q (through alias %q) " + "to component of " + "abstract type %s exposes rep: %s = %s", + sRef_unparse (base), + sRef_unparse (e2->sref), + ctype_unparse (ct), + exprNode_unparse (e1), exprNode_unparse (e2)), + e1->loc); + } + } + } +} + +static void +doAssign (/*@notnull@*/ exprNode e1, /*@notnull@*/ exprNode e2, bool isInit) +{ + if (ctype_isRealFunction (exprNode_getType (e1)) + && !ctype_isRealPointer (exprNode_getType (e1))) + { + voptgenerror + (FLG_TYPE, + message ("Invalid left-hand side of assignment (function type %s): %s", + ctype_unparse (exprNode_getType (e1)), + exprNode_unparse (e1)), + e1->loc); + } + + if (context_getFlag (FLG_ASSIGNEXPOSE) && ctype_isMutable (e2->typ)) + { + ctype t2 = exprNode_getType (e2); + sRef sr = sRef_getRootBase (e1->sref); + ctype ct = sRef_getType (sr); + + if (ctype_isAbstract (t2) + && !(uentry_isMutableDatatype (usymtab_getTypeEntry (ctype_typeId (t2))))) + { + /* it is immutable, okay to reference */ + goto donerepexpose; + } + + if (ctype_isAbstract (ct) && sRef_isIReference (e1->sref)) + { + sRef s2b = sRef_getRootBase (e2->sref); + sRef s1 = e1->sref; + sRef s1b = sRef_getRootBase (s1); + sRefSet aliases; + + aliases = usymtab_canAlias (e2->sref); + + if (!sRef_similar (s2b, s1b) + && !sRef_isExposed (s1) + && !(sRef_isOnly (s2b) || sRef_isKeep (s2b) || sRef_isExposed (s2b))) + { + if (sRef_isAnyParam (s2b) && !sRef_isOnly (s2b) + && !sRef_isOwned (s2b) && !sRef_isKeep (s2b) + && !sRef_isExposed (s2b)) + { + if (sRef_isIReference (e2->sref)) + { + voptgenerror + (FLG_ASSIGNEXPOSE, + message + ("Assignment of mutable component of parameter %q " + "to component of abstract type %s exposes rep: %s = %s", + sRef_unparse (s2b), + ctype_unparse (ct), + exprNode_unparse (e1), exprNode_unparse (e2)), + e1->loc); + } + else + { + voptgenerror + (FLG_ASSIGNEXPOSE, + message ("Assignment of mutable parameter %q to " + "component of abstract type %s exposes rep: %s = %s", + sRef_unparse (s2b), + ctype_unparse (ct), + exprNode_unparse (e1), exprNode_unparse (e2)), + e1->loc); + } + } + + if (sRef_isGlobal (s2b)) + { + voptgenerror + (FLG_ASSIGNEXPOSE, + message ("Assignment of global %q to component of " + "abstract type %s exposes rep: %s = %s", + sRef_unparse (s2b), + ctype_unparse (ct), + exprNode_unparse (e1), exprNode_unparse (e2)), + e1->loc); + } + + sRefSet_realElements (aliases, ysr) + { + sRef base = sRef_getRootBase (ysr); + + if (sRef_similar (ysr, s2b) || sRef_similar (s1b, base) + || sRef_sameName (base, s1b)) + { + ; /* error already reported or same sref */ + } + else + { + checkOneRepExpose (ysr, base, e1, e2, ct, s2b); + } + } end_sRefSet_realElements; + } + sRefSet_free (aliases); + } + } + + donerepexpose: + + /* + ** function variables don't really work... + */ + + if (!ctype_isFunction (ctype_realType (e2->typ))) + { + if (isInit) + { + checkInitTransfer (e1, e2); + } + else + { + checkAssignTransfer (e1, e2); + } + } + else + { + sRef fref = e2->sref; + + sRef_setDefState (e1->sref, sRef_getDefState (fref), e1->loc); + sRef_setNullState (e1->sref, sRef_getNullState (fref), e1->loc); + + /* Need to typecheck the annotation on the parameters */ + + if (ctype_isRealFunction (e1->typ)) { + uentryList e1p = ctype_argsFunction (ctype_realType (e1->typ)); + uentryList e2p = ctype_argsFunction (ctype_realType (e2->typ)); + + if (!uentryList_isMissingParams (e1p) + && !uentryList_isMissingParams (e2p) + && uentryList_size (e1p) > 0) { + if (uentryList_size (e1p) == uentryList_size (e2p)) { + int n = 0; + + uentryList_elements (e1p, el1) { + uentry el2; + + el2 = uentryList_getN (e2p, n); + n++; + uentry_checkMatchParam (el1, el2, n, e2); + } end_uentryList_elements; + } + } + } + } + + if (isInit && sRef_isGlobal (e1->sref)) + { + ; + } + else + { + updateAliases (e1, e2); + } +} + +static void +checkMacroParen (exprNode e) +{ + if (exprNode_isError (e) || e->kind == XPR_CAST) + { + ; + } + else + { + if (sRef_isUnsafe (e->sref) && !exprNode_isInParens (e)) + { + voptgenerror + (FLG_MACROPARENS, + message ("Macro parameter used without parentheses: %s", + exprNode_unparse (e)), + e->loc); + } + } +} + +static void +reflectNullTest (/*@notnull@*/ exprNode e, bool isnull) +{ + if (isnull) + { + e->guards = guardSet_addTrueGuard (e->guards, e->sref); + } + else + { + e->guards = guardSet_addFalseGuard (e->guards, e->sref); + } +} + +/* +** e1 <= e2 +** +** if e2 is a parameter or global derived location which +** can be modified (that is, e2 is a mutable abstract type, +** or a derived pointer), then e1 can alias e2. +** +** e1 can alias everything which e2 can alias. +** +** Also, if e1 is guarded, remove from guard sets! +*/ + +static void updateAliases (/*@notnull@*/ exprNode e1, /*@notnull@*/ exprNode e2) +{ + if (!context_inProtectVars ()) + { + /* + ** depends on types of e1 and e2 + */ + + sRef s1 = e1->sref; + sRef s2 = e2->sref; + ctype t1 = exprNode_getType (e1); + + /* handle pointer sRefs, record fields, arrays, etc... */ + + if (!ctype_isRealSU (t1)) + { + sRef_copyRealDerivedComplete (s1, s2); + } + + if (ctype_isMutable (t1) && sRef_isKnown (s1)) + { + usymtab_clearAlias (s1); + usymtab_addMustAlias (s1, s2); + } + + if (sRef_possiblyNull (s1) && usymtab_isGuarded (s1)) + { + usymtab_unguard (s1); + } + } +} + +exprNode exprNode_updateLocation (/*@returned@*/ exprNode e, /*@temp@*/ fileloc loc) +{ + if (exprNode_isDefined (e)) + { + e->loc = fileloc_update (e->loc, loc); + } + else + { + e = exprNode_createLoc (ctype_unknown, fileloc_copy (loc)); + } + + return (e); +} + +static void checkUniqueParams (exprNode fcn, + /*@notnull@*/ exprNode current, + exprNodeList args, + int paramno, uentry ucurrent) +{ + int iparamno = 0; + sRef thisref = exprNode_getSref (current); + + /* + ** Check if any argument could match this argument. + */ + + exprNodeList_elements (args, icurrent) + { + iparamno++; + + if (iparamno != paramno) + { + sRef sr = exprNode_getSref (icurrent); + + if (sRef_similarRelaxed (thisref, sr)) + { + if (!sRef_isConst (thisref) && !sRef_isConst (sr)) + { + voptgenerror + (FLG_ALIASUNIQUE, + message + ("Parameter %d (%s) to function %s is declared %s but " + "is aliased by parameter %d (%s)", + paramno, + exprNode_unparse (current), + exprNode_unparse (fcn), + alkind_unparse (uentry_getAliasKind (ucurrent)), + iparamno, exprNode_unparse (icurrent)), + current->loc); + } + } + else + { + sRefSet aliases = usymtab_canAlias (sr); + + sRefSet_allElements (aliases, asr) + { + if (ctype_isUnknown (sRef_getType (thisref))) + { + sRef_setType (thisref, uentry_getType (ucurrent)); + } + + if (sRef_similarRelaxed (thisref, asr)) + { + if (sRef_isExternal (asr)) + { + if (sRef_isLocalState (thisref)) + { + ; /* okay */ + } + else + { + sRef base = sRef_getRootBase (asr); + + if (!sRef_similar (sRef_getBase (asr), thisref)) + { + if (sRef_isUnique (base) || sRef_isOnly (base) + || sRef_isKept (base) + || (sRef_isAddress (asr) && sRef_isLocalVar (base)) + || (sRef_isAddress (thisref) + && sRef_isLocalVar (sRef_getRootBase (thisref)))) + { + ; /* okay, no error */ + } + else + { + voptgenerror + (FLG_MAYALIASUNIQUE, + message + ("Parameter %d (%s) to function %s is declared %s but " + "may be aliased externally by parameter %d (%s)", + paramno, + exprNode_unparse (current), + exprNode_unparse (fcn), + alkind_unparse (uentry_getAliasKind (ucurrent)), + iparamno, exprNode_unparse (icurrent)), + current->loc); + } + } + } + } + else + { + voptgenerror + (FLG_ALIASUNIQUE, + message + ("Parameter %d (%s) to function %s is declared %s but " + "is aliased externally by parameter %d (%s) through " + "alias %q", + paramno, + exprNode_unparse (current), + exprNode_unparse (fcn), + alkind_unparse (uentry_getAliasKind (ucurrent)), + iparamno, exprNode_unparse (icurrent), + sRef_unparse (asr)), + current->loc); + } + } + } end_sRefSet_allElements; + sRefSet_free (aliases); + } + } + } end_exprNodeList_elements; +} + + diff --git a/src/exprNodeList.c b/src/exprNodeList.c new file mode 100644 index 0000000..69c5dcc --- /dev/null +++ b/src/exprNodeList.c @@ -0,0 +1,202 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** exprNodeList.c +** +** based on list_template.c +** +** where T has T_equal (or change this) and T_unparse +*/ + +# include "lclintMacros.nf" +# include "basic.h" + +/*@only@*/ exprNodeList +exprNodeList_new () +{ + exprNodeList s = (exprNodeList) dmalloc (sizeof (*s)); + + s->nelements = 0; + s->nspace = exprNodeListBASESIZE; + s->elements = (exprNode *) + dmalloc (sizeof (*s->elements) * exprNodeListBASESIZE); + s->current = 0; + + return (s); +} + +static void +exprNodeList_grow (exprNodeList s) +{ + int i; + exprNode *newelements; + int numnew; + + if (s->nelements < exprNodeListBASESIZE) + { + numnew = exprNodeListBASESIZE; + } + else + { + numnew = s->nelements; + } + + s->nspace = numnew + s->nspace; + + newelements = (exprNode *) dmalloc (sizeof (*newelements) * (s->nelements + numnew)); + + if (newelements == (exprNode *) 0) + { + llfatalerror (cstring_makeLiteral ("exprNodeList_grow: out of memory!")); + } + + for (i = 0; i < s->nelements; i++) + { + newelements[i] = s->elements[i]; + } + + sfree (s->elements); + s->elements = newelements; +} + +void exprNodeList_addh (exprNodeList s, /*@only@*/ exprNode el) +{ + llassert (exprNodeListBASESIZE > 0); + + if (s->nspace <= 0) + exprNodeList_grow (s); + + s->nspace--; + s->elements[s->nelements] = el; + s->nelements++; +} + +void exprNodeList_reset (exprNodeList s) +{ + s->current = 0; +} + +void exprNodeList_advance (exprNodeList s) +{ + s->current++; + llassert (s->current <= s->nelements); +} + +/*@observer@*/ exprNode exprNodeList_head (exprNodeList s) +{ + llassert (s->nelements > 0); + return (s->elements[0]); +} + +/*@observer@*/ exprNode exprNodeList_current (exprNodeList s) +{ + llassert (s->current >= 0 && s->current < s->nelements); + return (s->elements[s->current]); +} + +exprNode exprNodeList_getN (exprNodeList s, int n) +{ + llassert (n >= 0 && n < s->nelements); + return (s->elements[n]); +} + +/*@only@*/ exprNodeList exprNodeList_singleton (/*@only@*/ exprNode e) +{ + exprNodeList s = (exprNodeList) dmalloc (sizeof (*s)); + + s->nelements = 1; + s->nspace = exprNodeListBASESIZE - 1; + s->elements = (exprNode *) dmalloc (sizeof (*s->elements) * exprNodeListBASESIZE); + s->elements[0] = e; + s->current = 0; + + return (s); +} + +exprNodeList exprNodeList_push (/*@returned@*/ exprNodeList args, /*@only@*/ exprNode e) +{ + exprNodeList_addh (args, e); + return (args); +} + +/*@exposed@*/ exprNode +exprNodeList_nth (exprNodeList args, int n) +{ + if (n >= exprNodeList_size (args) || n < 0) + { + llcontbug (message ("exprNodeList_nth: out of range: %q arg %d\n", + exprNodeList_unparse (args), n)); + return exprNode_undefined; + } + + return args->elements[n]; +} + +/*@only@*/ cstring +exprNodeList_unparse (exprNodeList s) +{ + int i; + cstring st = cstring_undefined; + + for (i = 0; i < s->nelements; i++) + { + if (i == 0) + { + st = cstring_copy (exprNode_unparse (s->elements[i])); + } + else + st = message ("%q, %s", st, exprNode_unparse (s->elements[i])); + } + + return st; +} + +void +exprNodeList_free (exprNodeList s) +{ + int i; + + for (i = 0; i < s->nelements; i++) + { + exprNode_free (s->elements[i]); + } + + sfree (s->elements); + sfree (s); +} + +void +exprNodeList_freeShallow (/*@only@*/ exprNodeList s) +{ + int i; + + for (i = 0; i < s->nelements; i++) + { + exprNode_freeShallow (s->elements[i]); + } + + sfree (s->elements); + sfree (s); +} + diff --git a/src/exprNodeSList.c b/src/exprNodeSList.c new file mode 100644 index 0000000..123da58 --- /dev/null +++ b/src/exprNodeSList.c @@ -0,0 +1,138 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** exprNodeSList.c +** +** based on list_template.c +** +** where T has T_equal (or change this) and T_unparse +*/ + +# include "lclintMacros.nf" +# include "basic.h" +# include "exprNodeSList.h" + +exprNodeSList + exprNodeSList_new () +{ + exprNodeSList s = (exprNodeSList) dmalloc (sizeof (*s)); + + s->nelements = 0; + s->nspace = exprNodeSListBASESIZE; + s->elements = (exprNode *) + dmalloc (sizeof (*s->elements) * exprNodeSListBASESIZE); + + return (s); +} + +static void +exprNodeSList_grow (exprNodeSList s) +{ + int i; + exprNode *newelements; + + s->nspace += exprNodeSListBASESIZE; + + newelements = (exprNode *) dmalloc (sizeof (*newelements) + * (s->nelements + s->nspace)); + + if (newelements == (exprNode *) 0) + { + llfatalerror (cstring_makeLiteral ("exprNodeSList_grow: out of memory!")); + } + + for (i = 0; i < s->nelements; i++) + { + newelements[i] = s->elements[i]; + } + + sfree (s->elements); + s->elements = newelements; +} + +void exprNodeSList_addh (exprNodeSList s, /*@exposed@*/ /*@dependent@*/ exprNode el) +{ + llassert (exprNodeSListBASESIZE > 0); + + if (s->nspace <= 0) + exprNodeSList_grow (s); + + s->nspace--; + s->elements[s->nelements] = el; + s->nelements++; +} + +/* +** appends s2 to s1 +*/ + +exprNodeSList exprNodeSList_append (/*@returned@*/ exprNodeSList s1, /*@only@*/ exprNodeSList s2) +{ + exprNodeSList_elements (s2, x) + { + exprNodeSList_addh (s1, x); + } end_exprNodeSList_elements; + + exprNodeSList_free (s2); + return s1; +} + +/*@only@*/ exprNodeSList exprNodeSList_singleton (/*@exposed@*/ /*@dependent@*/ exprNode e) +{ + exprNodeSList s = (exprNodeSList) dmalloc (sizeof (*s)); + + s->nelements = 1; + s->nspace = exprNodeSListBASESIZE - 1; + s->elements = (exprNode *) dmalloc (sizeof (*s->elements) * exprNodeSListBASESIZE); + s->elements[0] = e; + + return (s); +} + +/*@only@*/ cstring +exprNodeSList_unparse (exprNodeSList s) +{ + int i; + cstring st = cstring_undefined; + + for (i = 0; i < s->nelements; i++) + { + if (i == 0) + { + st = cstring_copy (exprNode_unparse (s->elements[i])); + } + else + st = message ("%q, %s", st, exprNode_unparse (s->elements[i])); + } + + return st; +} + +void +exprNodeSList_free (exprNodeSList s) +{ + sfree (s->elements); + sfree (s); +} + diff --git a/src/fcnNodeList.c b/src/fcnNodeList.c new file mode 100644 index 0000000..8dfa917 --- /dev/null +++ b/src/fcnNodeList.c @@ -0,0 +1,127 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** fcnNodeList.c +** +** based on list_template.c +** +** where T has T_equal (or change this) and T_unparse +*/ + +# include "lclintMacros.nf" +# include "llbasic.h" + +fcnNodeList + fcnNodeList_new () +{ + return fcnNodeList_undefined; +} + +static /*@notnull@*/ /*@only@*/ fcnNodeList +fcnNodeList_newEmpty (void) +{ + fcnNodeList s = (fcnNodeList) dmalloc (sizeof (*s)); + + s->nelements = 0; + s->nspace = fcnNodeListBASESIZE; + s->elements = (fcnNode *) dmalloc (sizeof (*s->elements) * fcnNodeListBASESIZE); + + return (s); +} + +static void +fcnNodeList_grow (/*@notnull@*/ fcnNodeList s) +{ + int i; + fcnNode *newelements; + + s->nspace += fcnNodeListBASESIZE; + newelements = (fcnNode *) dmalloc (sizeof (*newelements) + * (s->nelements + s->nspace)); + + if (newelements == (fcnNode *) 0) + { + llfatalerror (cstring_makeLiteral ("fcnNodeList_grow: out of memory!")); + } + + for (i = 0; i < s->nelements; i++) + { + newelements[i] = s->elements[i]; + } + + sfree (s->elements); + s->elements = newelements; +} + +fcnNodeList +fcnNodeList_add (fcnNodeList s, fcnNode el) +{ + if (fcnNodeList_isUndefined (s)) + { + s = fcnNodeList_newEmpty (); + } + + if (s->nspace <= 0) + fcnNodeList_grow (s); + + s->nspace--; + s->elements[s->nelements] = el; + s->nelements++; + + return s; +} + +/*@only@*/ cstring +fcnNodeList_unparse (fcnNodeList s) +{ + int i; + cstring st = cstring_undefined; + + if (fcnNodeList_isDefined (s)) + { + for (i = 0; i < s->nelements; i++) + { + st = message ("%q%q\n", st, fcnNode_unparse (s->elements[i])); + } + } + + return st; +} + +void +fcnNodeList_free (/*@null@*/ /*@only@*/ fcnNodeList s) +{ + if (s != NULL) + { + int i; + for (i = 0; i < s->nelements; i++) + { + fcnNode_free (s->elements[i]); + } + + sfree (s->elements); + sfree (s); + + } +} diff --git a/src/fileIdList.c b/src/fileIdList.c new file mode 100644 index 0000000..1a97e0b --- /dev/null +++ b/src/fileIdList.c @@ -0,0 +1,36 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** fileIdList.c +*/ + +# include "lclintMacros.nf" +# include "basic.h" +# include "fileIdList.h" + + + + + + diff --git a/src/fileTable.c b/src/fileTable.c new file mode 100644 index 0000000..4b16a2d --- /dev/null +++ b/src/fileTable.c @@ -0,0 +1,822 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2000 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ +/* +** fileTable.c +** +** replaces filenamemap.c +** based (loosely) on typeTable.c +** +** entries in the fileTable are: +** +** name - name of the file +** type - kind of file (a temp file to be deleted?) +** link - derived from this file +** +*/ +/* + * Herbert 04/1997: + * - Added conditional stuff (macros OS2 and MSDOS) to make names of temporary + * files under Windows or OS/2 not larger than 8+3 characters to avoid + * trouble with FAT file systems or Novell Netware volumes. + * - Added include of new header file portab.h containing OS dependent stuff. + * - Changed occurance of '/' as path delimiter to a macro. + * - Added conditional stuff (#define and #include) for IBM's compiler. + */ + +# include "lclintMacros.nf" +# include "llbasic.h" +# include "osd.h" +# include "llmain.h" +# include "portab.h" +# if defined(__IBMC__) && defined(OS2) +# include +# define getpid _getpid +# endif + +/*@access fileId*/ + +static bool fileTable_inRange (fileTable ft, fileId fid) /*@*/ +{ + return (fileTable_isDefined (ft) && (fid >= 0) && (fid < ft->nentries)); +} + +static fileId fileTable_internAddEntry (fileTable p_ft, /*@only@*/ ftentry p_e) + /*@modifies p_ft@*/ ; +static /*@only@*/ char *makeTempName (char *p_dir, char *p_pre, char *p_suf); + +static /*@only@*/ cstring +fileType_unparse (fileType ft) +{ + switch (ft) + { + case FILE_NORMAL: return cstring_makeLiteral ("normal"); + case FILE_NODELETE: return cstring_makeLiteral ("normal"); + case FILE_LSLTEMP: return cstring_makeLiteral ("ltemp"); + case FILE_HEADER: return cstring_makeLiteral ("header"); + case FILE_MACROS: return cstring_makeLiteral ("macros"); + } + + BADEXIT; +} + +static int +fileTable_getIndex (fileTable ft, cstring s) +{ + if (ft == NULL) return NOT_FOUND; + return (hashTable_lookup (ft->htable, s)); +} + +/*@only@*/ cstring +fileTable_unparse (fileTable ft) +{ + cstring s = cstring_undefined; + int i; + + if (fileTable_isUndefined (ft)) + { + return (cstring_makeLiteral ("")); + } + + for (i = 0; i < ft->nentries; i++) + { + if (fileId_isValid (ft->elements[i]->fder)) + { + s = message ("%s\n[%d] %s %q %d (%s)", + s, i, + ft->elements[i]->fname, + fileType_unparse (ft->elements[i]->ftype), + ft->elements[i]->fder, + ft->elements[ft->elements[i]->fder]->fname); + } + else + { + s = message ("%s\n[%d] %s %q", s, i, ft->elements[i]->fname, + fileType_unparse (ft->elements[i]->ftype)); + } + } + + return s; +} + +void fileTable_printTemps (fileTable ft) +{ + if (fileTable_isDefined (ft)) + { + int i; + + for (i = 0; i < ft->nentries; i++) + { + if (ft->elements[i]->ftemp) + { + if (fileId_isValid (ft->elements[i]->fder)) + { + fprintf (stderr, " %s:1\n\t%s:1\n", + cstring_toCharsSafe (ft->elements[ft->elements[i]->fder]->fname), + cstring_toCharsSafe (ft->elements[i]->fname)); + } + else + { + fprintf (stderr, "[no file]\n\t%s:1\n", + cstring_toCharsSafe (ft->elements[i]->fname)); + } + } + } + } +} + +/* +** loads in fileTable from fileTable_dump +*/ + +static /*@notnull@*/ ftentry +ftentry_create (/*@keep@*/ cstring tn, bool temp, fileType typ, fileId der) +{ + ftentry t = (ftentry) dmalloc (sizeof (*t)); + + if (cstring_isUndefined (tn)) + { + llbug (cstring_makeLiteral ("Undefined filename!")); + } + + t->fname = tn; + + t->basename = cstring_undefined; + t->ftemp = temp; + t->ftype = typ; + t->fder = der; + + /* Don't set these until the basename is needed. */ + t->fsystem = FALSE; + t->fspecial = FALSE; + + return t; +} + +static void +ftentry_free (/*@only@*/ ftentry t) +{ + cstring_free (t->fname); + cstring_free (t->basename); + sfree (t); +} + +/*@only@*/ /*@notnull@*/ fileTable +fileTable_create () +{ + fileTable ft = (fileTable) dmalloc (sizeof (*ft)); + + ft->nentries = 0; + ft->nspace = FTBASESIZE; + ft->elements = (ftentry *) dmalloc (FTBASESIZE * sizeof (*ft->elements)); + ft->htable = hashTable_create (FTHASHSIZE); + + return (ft); +} + +static void +fileTable_grow (fileTable ft) +{ + int i; + ftentry *newent; + + llassert (fileTable_isDefined (ft)); + + ft->nspace = FTBASESIZE; + + newent = (ftentry *) dmalloc ((ft->nentries + ft->nspace) * sizeof (*newent)); + + for (i = 0; i < ft->nentries; i++) + { + newent[i] = ft->elements[i]; + } + + sfree (ft->elements); + ft->elements = newent; +} + +static fileId +fileTable_internAddEntry (fileTable ft, /*@only@*/ ftentry e) +{ + llassert (fileTable_isDefined (ft)); + + if (ft->nspace <= 0) + fileTable_grow (ft); + + ft->nspace--; + + hashTable_insert (ft->htable, e->fname, ft->nentries); + ft->elements[ft->nentries] = e; + + ft->nentries++; + + return (ft->nentries - 1); +} + +void fileTable_noDelete (fileTable ft, cstring name) +{ + fileId fid = fileTable_lookup (ft, name); + + if (fileId_isValid (fid)) { + llassert (fileTable_isDefined (ft)); + + ft->elements[fid]->ftype = FILE_NODELETE; + } +} + +static fileId +fileTable_addFilePrim (fileTable ft, /*@only@*/ cstring name, + bool temp, fileType typ, fileId der) + /*@modifies ft@*/ +{ + int tindex = fileTable_getIndex (ft, name); + + llassert (ft != fileTable_undefined); + + if (tindex != NOT_FOUND) + { + llcontbug (message ("fileTable_addFilePrim: duplicate entry: %q", name)); + + return tindex; + } + else + { + ftentry e = ftentry_create (name, temp, typ, der); + + if (der == fileId_invalid) + { + llassert (cstring_isUndefined (e->basename)); + + e->basename = cstring_fromChars + (removePathFree (removeAnyExtension + (cstring_toCharsSafe (name)))); + e->fsystem = context_isSystemDir (name); + e->fspecial = context_isSpecialFile (name); + + if (e->fspecial) + { + cstring srcname = cstring_concatFree (cstring_fromChars (removeAnyExtension (cstring_toCharsSafe (name))), cstring_makeLiteral (".c")); + fileId fid = fileTable_lookup (ft, srcname); + + cstring_free (srcname); + + if (fileId_isValid (fid)) + { + fileId derid = ft->elements[fid]->fder; + + ft->elements[fid]->fspecial = TRUE; + + if (fileId_isValid (derid)) + { + ft->elements[derid]->fspecial = TRUE; + } + } + } + } + else + { + ftentry de = ft->elements[der]; + + llassert (cstring_isUndefined (e->basename)); + e->basename = cstring_copy (de->basename); + e->fsystem = de->fsystem; + e->fspecial = de->fspecial; + } + + return (fileTable_internAddEntry (ft, e)); + } +} + +fileId +fileTable_addFile (fileTable ft, cstring name) +{ + /* while (*name == '.' && *(name + 1) == '/') name += 2; */ + return (fileTable_addFilePrim (ft, cstring_copy (name), + FALSE, FILE_NORMAL, fileId_invalid)); +} + +fileId +fileTable_addFileOnly (fileTable ft, /*@only@*/ cstring name) +{ + return (fileTable_addFilePrim (ft, name, FALSE, FILE_NORMAL, fileId_invalid)); +} + +fileId +fileTable_addHeaderFile (fileTable ft, cstring name) +{ + DPRINTF (("Add header: %s", name)); + return (fileTable_addFilePrim (ft, cstring_copy (name), FALSE, + FILE_HEADER, fileId_invalid)); +} + +bool +fileTable_isHeader (fileTable ft, fileId fid) +{ + if (fileId_isInvalid (fid)) + { + return FALSE; + } + + llassert (fileTable_isDefined (ft) && fileTable_inRange (ft, fid)); + return (ft->elements[fid]->ftype == FILE_HEADER); +} + +bool +fileTable_isSystemFile (fileTable ft, fileId fid) +{ + if (fileId_isInvalid (fid)) + { + return FALSE; + } + + llassert (fileTable_isDefined (ft) && fileTable_inRange (ft, fid)); + return (ft->elements[fid]->fsystem); +} + +bool +fileTable_isSpecialFile (fileTable ft, fileId fid) +{ + if (fileId_isInvalid (fid)) + { + return FALSE; + } + + llassert (fileTable_isDefined (ft) && fileTable_inRange (ft, fid)); + return (ft->elements[fid]->fspecial); +} + +fileId +fileTable_addLibraryFile (fileTable ft, cstring name) +{ + return (fileTable_addFilePrim (ft, cstring_copy (name), + FALSE, FILE_HEADER, fileId_invalid)); +} + +# ifndef NOLCL +fileId +fileTable_addImportFile (fileTable ft, cstring name) +{ + return (fileTable_addFilePrim (ft, cstring_copy (name), + FALSE, FILE_HEADER, fileId_invalid)); +} + +fileId +fileTable_addLCLFile (fileTable ft, cstring name) +{ + return (fileTable_addFilePrim (ft, cstring_copy (name), + FALSE, FILE_HEADER, fileId_invalid)); +} +# endif + +# ifndef NOLCL +static int tmpcounter = 0; +# endif + +fileId +fileTable_addMacrosFile (fileTable ft) +{ + cstring newname = cstring_fromChars + (makeTempName (cstring_toCharsSafe (context_tmpdir ()), "lmx", ".llm")); + + return (fileTable_addFilePrim (ft, newname, TRUE, FILE_MACROS, fileId_invalid)); +} + +fileId +fileTable_addCTempFile (fileTable ft, fileId fid) +{ +# if FALSE + /* Can't control output file name for cl preprocessor */ + cstring newname = cstring_concatChars (removeAnyExtension (fileName (fid)), ".i"); +# else + cstring newname = cstring_fromChars + (makeTempName (cstring_toCharsSafe (context_tmpdir ()), "cl", ".c")); +# endif + + llassert (fileTable_isDefined (ft)); + + if (!fileId_isValid (ft->elements[fid]->fder)) + { + return (fileTable_addFilePrim (ft, newname, TRUE, FILE_NORMAL, fid)); + } + else + { + return (fileTable_addFilePrim (ft, newname, TRUE, FILE_NORMAL, + ft->elements[fid]->fder)); + } +} + +# ifndef NOLCL +fileId +fileTable_addltemp (fileTable ft) +{ + char *newname = makeTempName (cstring_toCharsSafe (context_tmpdir ()), + "ls", ".lsl"); + char *onewname; + fileId ret; + + if (cstring_hasNonAlphaNumBar (cstring_fromChars (newname))) + { + char *lastpath = (char *)NULL; + + if (tmpcounter == 0) + { + lldiagmsg + (message + ("Operating system generates tmp filename containing invalid charater: %s", + cstring_fromChars (newname))); + lldiagmsg (cstring_makeLiteral + ("Try cleaning up the tmp directory. Attempting to continue.")); + } + + lastpath = strrchr (newname, CONNECTCHAR); /* get the directory */ + llassert (lastpath != NULL); + *lastpath = '\0'; + + onewname = newname; + newname = cstring_toCharsSafe (message ("%s%hlsl%d.lsl", + cstring_fromChars (newname), + CONNECTCHAR, + tmpcounter)); + sfree (onewname); + tmpcounter++; + } + + /* + ** this is kind of yucky...need to make the result of cstring_fromChars + ** refer to the same storage as its argument. Of course, this loses, + ** since cstring is abstract. Should make it an only? + */ + + ret = fileTable_addFilePrim (ft, cstring_copy (cstring_fromChars (newname)), + TRUE, FILE_LSLTEMP, fileId_invalid); + sfree (newname); + return (ret); +} +# endif + +bool +fileTable_exists (fileTable ft, cstring s) +{ + int tindex = fileTable_getIndex (ft, s); + + if (tindex == NOT_FOUND) + return FALSE; + else + return TRUE; +} + +fileId +fileTable_lookup (fileTable ft, cstring s) +{ + int tindex = fileTable_getIndex (ft, s); + + if (tindex == NOT_FOUND) + { + return fileId_invalid; + } + else + { + return tindex; + } +} + +fileId +fileTable_lookupBase (fileTable ft, cstring base) +{ + int tindex = fileTable_getIndex (ft, base); + + if (tindex == NOT_FOUND) + { + + return fileId_invalid; + } + else + { + fileId der; + + llassert (fileTable_isDefined (ft)); + + der = ft->elements[tindex]->fder; + + if (!fileId_isValid (der)) + { + der = tindex; + } + + return der; + } +} + +cstring +fileTable_getName (fileTable ft, fileId fid) +{ + if (!fileId_isValid (fid)) + { + llcontbug + (message ("fileTable_getName: called with invalid type id: %d", fid)); + return cstring_makeLiteralTemp (""); + } + + llassert (fileTable_isDefined (ft)); + return (ft->elements[fid]->fname); +} + +cstring +fileTable_getRootName (fileTable ft, fileId fid) +{ + fileId fder; + + if (!fileId_isValid (fid)) + { + llcontbug (message ("fileTable_getName: called with invalid id: %d", fid)); + return cstring_makeLiteralTemp (""); + } + + if (!fileTable_isDefined (ft)) + { + return cstring_makeLiteralTemp (""); + } + + fder = ft->elements[fid]->fder; + + if (fileId_isValid (fder)) + { + return (ft->elements[fder]->fname); + } + else + { + return (ft->elements[fid]->fname); + } +} + +cstring +fileTable_getNameBase (fileTable ft, fileId fid) +{ + if (!fileId_isValid (fid)) + { + llcontbug (message ("fileTable_getName: called with invalid id: %d", fid)); + return cstring_makeLiteralTemp (""); + } + + if (!fileTable_isDefined (ft)) + { + return cstring_makeLiteralTemp (""); + } + + return (ft->elements[fid]->basename); +} + +bool +fileTable_sameBase (fileTable ft, fileId f1, fileId f2) +{ + fileId fd1, fd2; + + if (!fileId_isValid (f1)) + { + return FALSE; + } + + if (!fileId_isValid (f2)) + { + return FALSE; + } + + llassert (fileTable_isDefined (ft)); + + if (f1 == f2) + { + return TRUE; + } + + fd1 = ft->elements[f1]->fder; + + if (!fileId_isValid (fd1)) + { + fd1 = f1; + } + + fd2 = ft->elements[f2]->fder; + + + if (!fileId_isValid (fd2)) + { + fd2 = f2; + } + + return (fd1 == fd2); +} + +void +fileTable_cleanup (fileTable ft) +{ + int i; + bool msg; + int skip; + + llassert (fileTable_isDefined (ft)); + + msg = ((ft->nentries > 40) && context_getFlag (FLG_SHOWSCAN)); + skip = ft->nentries / 10; + + if (msg) + { + (void) fflush (g_msgstream); + fprintf (stderr, "< cleaning"); + } + + for (i = 0; i < ft->nentries; i++) + { + ftentry fe = ft->elements[i]; + + if (fe->ftemp) + { + /* let's be real careful now, hon! */ + + /* + ** Make sure it is really a derived file + */ + + if (fe->ftype == FILE_LSLTEMP || fe->ftype == FILE_NODELETE) + { + ; /* already removed */ + } + else if (fileId_isValid (fe->fder)) + { + (void) osd_unlink (cstring_toCharsSafe (fe->fname)); + } + else if (fe->ftype == FILE_MACROS) + { + (void) osd_unlink (cstring_toCharsSafe (fe->fname)); + } + else + { + llbug (message ("Temporary file is not derivative: %s " + "(not deleted)", fe->fname)); + } + } + else + { + ; + } + + if (msg && ((i % skip) == 0)) + { + (void) fflush (g_msgstream); + + if (i == 0) { + fprintf (stderr, " "); + } else { + fprintf (stderr, "."); + } + + (void) fflush (stderr); + } + } + + if (msg) + { + fprintf (stderr, " >\n"); + } +} + +void +fileTable_free (/*@only@*/ fileTable f) +{ + int i = 0; + + if (f == (fileTable)NULL) + { + return; + } + + while ( i < f->nentries ) + { + ftentry_free (f->elements[i]); + i++; + } + + hashTable_free (f->htable); + sfree (f->elements); + sfree (f); +} + +/* +** unique temp filename are constructed from
.
+** requires:  must end in '/'
+*/
+
+static void nextMsg (char *msg)
+{
+  /*@+charint@*/
+  if (msg[0] < 'Z') 
+    {
+      msg[0]++; 
+    }
+  else 
+    {
+      msg[0] = 'A';
+      if (msg[1] < 'Z')
+	{ 
+	  msg[1]++; 
+	}
+      else
+	{
+	  msg[1] = 'A';
+	  if (msg[2] < 'Z') 
+	    {
+	      msg[2]++;
+	    }
+	  else
+	    {
+	      msg[2] = 'A';
+	      if (msg[3] < 'Z') 
+		{
+		  msg[3]++; 
+		}
+	      else
+		{
+		  llassertprint (FALSE, ("nextMsg: out of unique names!!!"));
+		}
+	    }
+	}
+    }
+  /*@-charint@*/
+}
+
+static /*@only@*/ char *makeTempName (char *dir, char *pre, char *suf)
+{
+  static int pid = 0; 
+  static /*@owned@*/ char *msg = NULL; 
+  static /*@only@*/ char *pidname = NULL;
+  size_t maxlen;
+  char *buf;
+
+  llassert (strlen (pre) <= 3);
+
+  /*
+  ** We limit the temp name to 8 characters:
+  **   pre: 3 or less
+  **   msg: 3
+  **   pid: 2  (% 100)
+  */
+
+  if (msg == NULL)
+    {
+      msg = mstring_copy ("AAA"); /* there are 26^3 temp names */
+    }
+
+  if (pid == 0) 
+    {
+      /*@+matchanyintegral@*/
+      pid = osd_getPid ();
+      /*@=matchanyintegral@*/
+    }
+
+  if (pidname == NULL) 
+    {
+      pidname = cstring_toCharsSafe (message ("%d", pid % 100));
+    }
+  else 
+    {
+      pidname = mstring_createEmpty ();
+    }
+  
+  maxlen = (strlen (dir) + strlen (pre) + strlen (msg) 
+	    + strlen (pidname) + strlen (suf) + 2);
+
+  buf = mstring_create (size_toInt (maxlen));
+
+  sprintf (buf, "%s%s%s%s%s", dir, pre, pidname, msg, suf);
+  nextMsg (msg);
+
+  while (osd_fileExists (buf))
+    {
+      sprintf (buf, "%s%s%s%s%s", dir, pre, pidname, msg, suf);
+      nextMsg (msg);
+    }
+
+  return buf;
+}
+  
+
+
diff --git a/src/fileloc.c b/src/fileloc.c
new file mode 100644
index 0000000..bf21ba4
--- /dev/null
+++ b/src/fileloc.c
@@ -0,0 +1,798 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** fileloc.c
+*/
+/*
+ * Modified by Herbert 04/19/97:
+ * - added new include file portab.h.
+ * - added new private function fileloc_filenameForCpp() to handle
+ *   filenames belonging to "#line" statements for OS/2 and MSDOS. It
+ *   gets called by fileloc_lineMarker() and fileloc_previousLineMarker()
+ *   instead of fileloc_unparseFilename().
+ */
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "fileIdList.h"
+# include "portab.h"
+
+static /*@only@*/ fileloc fileloc_createPrim (flkind p_kind, fileId p_fid, int p_line, int p_col);
+
+static flkind fileId_kind (fileId s)
+{
+  cstring fname = rootFileName (s);
+  
+  if (isLCLfile (fname))
+    {
+      return (FL_SPEC);
+    }
+  else if (cstring_equalPrefix (fname, SYSTEM_LIBDIR))
+    {
+      return (FL_STDHDR); 
+    }
+  else
+    {
+      return (FL_NORMAL);
+    }
+}  
+
+fileloc
+fileloc_decColumn (fileloc f, int x)
+{
+  fileloc ret = fileloc_copy (f);
+  if (x > 0 && fileloc_isDefined (ret))
+    {
+      llassertprint (ret->column > x, ("decColumn: %d", x));
+      ret->column -= x;
+    }
+
+  return ret;
+}
+
+fileloc
+fileloc_noColumn (fileloc f)
+{
+  if (fileloc_isDefined (f))
+    {
+      fileloc ret = fileloc_copy (f);
+
+      if (fileloc_isDefined (ret))
+	{
+	  ret->column = 0;
+	}
+
+      return ret;
+    }
+  else
+    {
+      return fileloc_undefined;
+    }
+}
+
+void
+fileloc_subColumn (fileloc f, int x)
+{
+  if (x > 0 && fileloc_isDefined (f))
+    {
+      llassert (f->column > x);
+      f->column -= x;
+    }
+}
+
+fileloc fileloc_copy (fileloc f)
+{
+  if (fileloc_isDefined (f))
+    {
+      if (fileloc_isBuiltin (f) || fileloc_isExternal (f))
+	{
+	  /*
+	  ** Legitimate (spurious) errors reported since no copy
+	  ** is made.
+	  */
+
+	  /*@i3@*/ return f; /* No copy is necessary. */
+	}
+      else
+	{
+	  return (fileloc_createPrim (f->kind, f->fid, f->lineno, f->column));
+	}
+    }
+  else
+    {
+      return fileloc_undefined;
+    }
+}
+
+fileloc fileloc_update (/*@only@*/ fileloc old, fileloc fnew)
+{
+  if (fileloc_isUndefined (fnew))
+    {
+      fileloc_free (old);
+      return fileloc_undefined;
+    }
+  else if (fileloc_isUndefined (old) || fileloc_isBuiltin (old) || fileloc_isExternal (old))
+    {
+      return (fileloc_copy (fnew));
+    }
+  else
+    {
+      old->kind   = fnew->kind;
+      old->fid    = fnew->fid; 
+      old->lineno = fnew->lineno;
+      old->column = fnew->column;
+
+      return old;
+    }
+}
+
+fileloc fileloc_updateFileId (/*@only@*/ fileloc old, fileId s)
+{
+  if (fileloc_isUndefined (old) || fileloc_isBuiltin (old) || fileloc_isExternal (old))
+    {
+      return (fileloc_create (s, 1, 1));
+    }
+  else
+    {
+      old->kind   = fileId_kind (s);
+      old->fid    = s; 
+      old->lineno = 1;
+      old->column = 1;
+
+      return old;
+    }
+}
+
+void
+fileloc_free (/*@only@*/ fileloc f)
+{
+  if (fileloc_isDefined (f))
+    {
+      if (f != g_currentloc)
+	{
+	  if (fileloc_isBuiltin (f) || fileloc_isExternal (f))
+	    {
+	      ; /* don't free */
+	    }
+	  else
+	    {
+	      	      sfree (f);  
+	      /*@-branchstate@*/ 
+	    } 
+	}
+      else
+	{
+	  	}
+      /*@=branchstate@*/
+    }
+}
+
+void
+fileloc_reallyFree (/*@only@*/ fileloc f)
+{
+  if (fileloc_isDefined (f))
+    {
+      if (fileloc_isBuiltin (f) || fileloc_isExternal (f))
+	{
+	  ; /* don't free */
+	}
+      else
+	{
+	  sfree (f);  
+	/*@-branchstate@*/ } /*@=branchstate@*/
+    }
+}
+
+cstring fileloc_getBase (fileloc f)
+{
+  llassert (fileloc_isDefined (f));
+
+  return (fileNameBase (f->fid));
+}
+
+bool
+fileloc_equal (fileloc f1, fileloc f2)
+{
+  return ((f1 == f2)
+	  || (fileloc_isDefined (f1) && fileloc_isDefined (f2) 
+	      && ((f1->column == f2->column) && 
+		  (f1->lineno == f2->lineno) && fileloc_sameFile (f1, f2))));
+}
+
+int
+fileloc_compare (fileloc f1, fileloc f2)
+{
+  if (fileloc_isUndefined (f1))
+    {
+      if (fileloc_isUndefined (f2)) return 0;
+      return -1;
+    }
+  
+  if (fileloc_isUndefined (f2))
+    return 1;
+
+  /*@access fileId@*/ 
+  INTCOMPARERETURN (f1->fid, f2->fid); 
+  /*@noaccess fileId@*/
+
+  INTCOMPARERETURN (f1->column, f2->column);
+  INTCOMPARERETURN (f1->lineno, f2->lineno); 
+
+  return 0;
+}
+
+bool
+fileloc_withinLines (fileloc f1, fileloc f2, int n)
+{
+  
+  return (fileloc_isDefined (f1) && 
+	  fileloc_isDefined (f2) &&
+	  ((f2->lineno <= f1->lineno + n) 
+	   && (f2->lineno >= f1->lineno)
+	   && fileloc_sameFile (f1, f2)));
+}
+
+bool
+fileloc_lessthan (fileloc f1, fileloc f2)
+{
+  /*@access fileId*/
+  return ((fileloc_isDefined (f1) && fileloc_isDefined (f2))
+	  && ((f1->fid < f2->fid)
+	      || ((f1->fid == f2->fid)
+		  && ((f1->lineno < f2->lineno)
+		      || ((f1->lineno == f2->lineno)
+			  && (f1->column < f2->column))))));
+  /*@noaccess fileId*/
+}
+
+/*
+** returns true if f1 and f2 are different files,
+** or f1 is before f2 in same file
+*/
+
+bool
+fileloc_notAfter (fileloc f1, fileloc f2)
+{
+  /*@access fileId*/
+  return ((fileloc_isDefined (f1) && fileloc_isDefined (f2))
+	  && ((f1->fid != f2->fid)
+	      || ((f1->lineno < f2->lineno)
+		  || ((f1->lineno == f2->lineno)
+		      && (f1->column <= f2->column)))));
+  /*@noaccess fileId@*/
+}
+
+# ifndef NOLCL
+bool
+fileloc_isStandardLibrary (fileloc f)
+{
+  cstring s = fileloc_getBase (f);
+
+  return (cstring_equalLit (s, LLSTDLIBS_NAME)
+	  || cstring_equalLit (s, LLSTRICTLIBS_NAME)
+	  || cstring_equalLit (s, LLUNIXLIBS_NAME)
+	  || cstring_equalLit (s, LLUNIXSTRICTLIBS_NAME)
+	  || cstring_equalLit (s, LLPOSIXSTRICTLIBS_NAME)
+	  || cstring_equalLit (s, LLPOSIXLIBS_NAME));
+}
+# endif
+
+bool
+fileloc_sameFile (fileloc f1, fileloc f2)
+{
+  if ((fileloc_isUndefined (f1) || (fileloc_isUndefined (f2)) 
+       || (fileloc_isLib (f1)) || (fileloc_isLib (f2))))
+    {
+      return FALSE;
+    }
+  else
+    {
+      return (fileId_equal (f1->fid, f2->fid));
+    }
+}
+
+bool
+fileloc_sameModule (fileloc f1, fileloc f2)
+{
+  if (fileloc_isUndefined (f1))
+    {
+      return (fileloc_isUndefined (f2));
+    }
+  else if (fileloc_isUndefined (f2))
+    {
+      return (FALSE);
+    }
+  else
+    {
+      if (fileloc_isBuiltin (f1) || fileloc_isBuiltin (f2)
+	  || fileloc_isExternal (f1) || fileloc_isExternal (f2))
+	{
+	  return fileloc_sameFile (f1, f2);
+	}
+      else
+	{
+	  cstring s1 = fileloc_getBase (f1);
+	  cstring s2 = fileloc_getBase (f2);
+	  
+	  return (cstring_equal (s1, s2));
+	}
+    }
+}
+
+bool
+fileloc_sameBaseFile (fileloc f1, fileloc f2)
+{
+  if (fileloc_isUndefined (f1))
+    {
+      return (fileloc_isUndefined (f2));
+    }
+  else if (fileloc_isUndefined (f2))
+    {
+      return (FALSE);
+    }
+  else
+    {
+      return (fileId_baseEqual (f1->fid, f2->fid));
+    }
+}
+
+bool fileloc_isSystemFile (fileloc f1)
+{
+  if (fileloc_isDefined (f1)
+      && !fileloc_isBuiltin (f1)
+      && !fileloc_isExternal (f1))
+    {
+      return (fileTable_isSystemFile (context_fileTable (), f1->fid));
+    }
+
+  return FALSE;
+}
+
+bool
+fileloc_almostSameFile (fileloc f1, fileloc f2)
+{
+  if ((fileloc_isUndefined (f1) || (fileloc_isUndefined (f2)) 
+       || (fileloc_isLib (f1)) || (fileloc_isLib (f2))))
+    {
+      return FALSE;
+    }
+  else
+    {
+      if (fileId_baseEqual (f1->fid, f2->fid))
+	{
+	  return TRUE;
+	}
+      else if (fileTable_isSystemFile (context_fileTable (), f1->fid)
+	       || fileTable_isSystemFile (context_fileTable (), f2->fid))
+	{
+	  return TRUE;
+	}
+      else if (fileTable_isSpecialFile (context_fileTable (), f1->fid)
+	       || fileTable_isSpecialFile (context_fileTable (), f2->fid))
+	{
+	  return (cstring_equal (fileloc_getBase (f1), 
+				 fileloc_getBase (f2)));
+	}
+      else 
+	{
+	  return FALSE;
+	}
+    }
+}
+
+# ifndef NOLCL
+/*@only@*/ fileloc
+fileloc_fromTok (ltoken t) 
+{
+  cstring fname = ltoken_fileName (t);
+  fileId fid = fileTable_lookup (context_fileTable (), fname);
+  fileloc fl;
+
+  if (!fileId_isValid (fid))
+    {
+      fid = fileTable_addLCLFile (context_fileTable (), fname);
+    }
+  
+  fl = fileloc_create (fid, (int) ltoken_getLine (t), (int) ltoken_getCol (t));
+  
+  return (fl);
+}
+# endif
+
+/*@only@*/ fileloc
+fileloc_createLib (cstring ln)
+{
+  flkind fk = FL_LIB;
+  fileId fid = fileTable_lookup (context_fileTable (), ln);
+
+  if (!fileId_isValid (fid))
+    {
+      fid = fileTable_addLibraryFile (context_fileTable (), ln);
+    }
+
+  if (cstring_equalPrefix (ln, SYSTEM_LIBDIR))
+    {
+      fk = FL_STDLIB;
+    }
+
+  return (fileloc_createPrim (fk, fid, 0, 0));
+}
+
+fileloc fileloc_createRc (cstring name)
+{
+  fileId fid = fileTable_addFile (context_fileTable (), name);
+
+  return (fileloc_createPrim (FL_RC, fid, 0, 0));
+}
+
+fileloc fileloc_createExternal (void)
+{
+  /*@i@*/ return (fileloc_getExternal ()); 
+}
+
+fileloc fileloc_getExternal (void)
+{
+  static /*@owned@*/ fileloc res = fileloc_undefined;
+
+  if (res == fileloc_undefined) 
+    {
+      res = fileloc_createPrim (FL_EXTERNAL, fileId_invalid, 0, 0);
+    }
+
+  return res;
+}
+
+fileloc fileloc_observeBuiltin ()
+{
+  /*@-onlytrans@*/ return (fileloc_getBuiltin ()); /*@=onlytrans@*/
+}
+
+fileloc fileloc_getBuiltin ()
+{
+  static /*@owned@*/ fileloc res = fileloc_undefined;
+
+  if (res == fileloc_undefined)
+    {
+      res = fileloc_createPrim (FL_BUILTIN, fileId_invalid, 0, 0); 
+    }
+
+  return res;
+}
+
+fileloc
+fileloc_makePreproc (fileloc loc)
+{
+  if (fileloc_isDefined (loc))
+    {
+      return (fileloc_createPrim (FL_PREPROC, loc->fid, 
+				  loc->lineno, loc->column));
+    }
+
+  return (fileloc_createPrim (FL_PREPROC, fileId_invalid, 0, 0));
+}
+
+fileloc
+fileloc_makePreprocPrevious (fileloc loc)
+{
+  if (fileloc_isDefined (loc))
+    {
+      if (loc->lineno > 1)
+	{
+	  return (fileloc_createPrim (FL_PREPROC, loc->fid,
+				      loc->lineno - 1, 0));
+	}
+      else
+	{
+	  return (fileloc_createPrim (FL_PREPROC, loc->fid,
+				      loc->lineno, 0));
+	}
+    }
+
+  return (fileloc_createPrim (FL_PREPROC, fileId_invalid, 0, 0));
+}
+
+/*@only@*/ fileloc
+fileloc_createBuiltin ()
+{
+  return (fileloc_createPrim (FL_BUILTIN, fileId_invalid, 0, 0)); 
+}
+
+# ifndef NOLCL
+/*@only@*/ fileloc
+fileloc_createImport (cstring fname, int lineno)
+{
+  fileId fid = fileTable_lookup (context_fileTable (), fname);
+
+  if (!fileId_isValid (fid))
+    {
+      fid = fileTable_addImportFile (context_fileTable (), fname);
+    }
+
+  return (fileloc_createPrim (FL_IMPORT, fid, lineno, 0));
+}
+# endif
+
+static /*@only@*/ fileloc
+fileloc_createPrim (flkind kind, fileId fid, int line, int col)
+{
+  fileloc f = (fileloc) dmalloc (sizeof (*f));
+  
+  f->kind   = kind;
+  f->fid    = fid; 
+  f->lineno = line;
+  f->column = col;
+  
+  return (f);
+}
+
+# ifndef NOLCL
+/*@only@*/ fileloc
+fileloc_createSpec (fileId fid, int line, int col)
+{
+  return (fileloc_createPrim (FL_SPEC, fid, line, col));
+}
+# endif
+
+fileloc fileloc_create (fileId fid, int line, int col)
+{
+  return (fileloc_createPrim (fileId_kind (fid), fid, line, col));
+}
+
+/*@observer@*/ cstring
+fileloc_filename (fileloc f)
+{
+  return (fileloc_isDefined (f)
+	  ? rootFileName (f->fid) : cstring_makeLiteralTemp (""));
+}
+
+cstring
+fileloc_unparseFilename (fileloc f)
+{
+  if (fileloc_isDefined (f))
+    {
+      switch (f->kind)
+	{
+	case FL_LIB:
+	  return (message ("load file %s", fileloc_filename (f)));
+	case FL_BUILTIN:
+	  return (cstring_makeLiteral ("# builtin #"));
+	case FL_IMPORT:
+	  return (message ("import file %s", fileloc_filename (f)));
+	case FL_EXTERNAL:
+	  return (cstring_makeLiteral (""));
+	default: 
+	  return (cstring_copy (fileloc_filename (f)));
+	}
+    }
+  return cstring_undefined;
+}
+
+int
+fileloc_lineno (fileloc f)
+{
+  return (fileloc_isDefined (f) ? f->lineno : -1);
+}
+
+int
+fileloc_column (fileloc f)
+{
+  return (fileloc_isDefined (f) ? f->column : -1);
+}
+
+/*@only@*/ cstring
+fileloc_unparse (fileloc f)
+{
+  bool parenFormat = context_getFlag (FLG_PARENFILEFORMAT); 
+
+  if (fileloc_isDefined (f))
+    {
+      switch (f->kind)
+	{
+	case FL_LIB:
+	  return (message ("load file %s", rootFileName (f->fid)));
+	case FL_BUILTIN:
+	  return (cstring_makeLiteral ("Command Line"));
+	case FL_IMPORT:
+	  if (parenFormat)
+	    {
+	      return (message ("import file %s(%d)", rootFileName (f->fid), f->lineno));
+	    }
+	  else
+	    {
+	      return (message ("import file %s:%d", rootFileName (f->fid), f->lineno));
+	    }
+	case FL_PREPROC:
+	  if (parenFormat)
+	    {
+	      return (message ("%s(%d)", rootFileName (f->fid), f->lineno));
+	    }
+	  else
+	    {
+	      return (message ("%s:%d", rootFileName (f->fid), f->lineno));
+	    }
+	case FL_EXTERNAL:
+	  return (cstring_makeLiteral (""));
+	default:
+	  if (context_getFlag (FLG_SHOWCOL))
+	    {
+	      if (fileloc_linenoDefined (f))
+		{
+		  if (fileloc_columnDefined (f))
+		    {
+		      if (parenFormat)
+			{
+			  return (message ("%s(%d,%d)", 
+					   rootFileName (f->fid),
+					   f->lineno, f->column));
+			}
+		      else
+			{
+			  return (message ("%s:%d:%d", 
+					   rootFileName (f->fid),
+					   f->lineno, f->column));
+			}
+		    }
+		  else
+		    {
+		      if (parenFormat)
+			{
+			  return (message ("%s(%d)", rootFileName (f->fid), f->lineno));
+			}
+		      else
+			{
+			  return (message ("%s:%d", rootFileName (f->fid), f->lineno));
+			}
+		    }
+		}
+	      return (cstring_copy (rootFileName (f->fid)));
+	    }
+	  else if (fileloc_linenoDefined (f))
+	    {
+	      if (parenFormat)
+		{
+		  return (message ("%s(%d)",
+				   rootFileName (f->fid), f->lineno));
+		}
+	      else
+		{
+		  return (message ("%s:%d", rootFileName (f->fid), f->lineno));
+		}
+	    }
+	  else
+	    {
+	      return (cstring_copy (rootFileName (f->fid)));
+	    }
+	}
+    }
+  return (cstring_makeLiteral ("< Location unknown >"));
+}
+
+/*@only@*/ cstring
+fileloc_unparseRaw (cstring fname, int lineno)
+{
+  bool parenFormat = context_getFlag (FLG_PARENFILEFORMAT); 
+
+  if (parenFormat)
+    {
+      return (message ("%s(%d)", fname, lineno));
+    }
+  else
+    {
+      return (message ("%s:%d", fname, lineno));
+    }
+}
+
+/*@only@*/ cstring
+fileloc_unparseRawCol (cstring fname, int lineno, int col)
+{
+  if (context_getFlag (FLG_SHOWCOL)) 
+    {
+      bool parenFormat = context_getFlag (FLG_PARENFILEFORMAT); 
+      
+      if (parenFormat)
+	{
+	  return (message ("%s(%d,%d)", fname, lineno, col));
+	}
+      else
+	{
+	  return (message ("%s:%d:%d", fname, lineno, col));
+	}
+    }
+  else
+    {
+      return fileloc_unparseRaw (fname, lineno);
+    }
+}
+
+bool fileloc_isSpecialFile (fileloc f)
+{
+  if (fileloc_isDefined (f) 
+      && fileId_isValid (f->fid))
+    {
+      return (fileTable_isSpecialFile (context_fileTable (), f->fid));
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+bool fileloc_isHeader (fileloc f)
+{
+  /* returns true if is not a .c file */
+
+  return (fileloc_isDefined (f) && fileId_isValid (f->fid)
+	  && fileId_isHeader (f->fid));
+}
+
+bool fileloc_isSpec (fileloc f)
+{
+  return (fileloc_isDefined (f) && 
+	  (f->kind == FL_LIB || f->kind == FL_STDLIB || f->kind == FL_SPEC));
+}
+
+bool fileloc_isRealSpec (fileloc f)
+{
+  return (fileloc_isDefined (f) && (f->kind == FL_SPEC));
+}
+
+bool fileloc_isRealLib (fileloc f)
+{
+  return (fileloc_isDefined (f) && f->kind == FL_LIB);
+}
+
+bool fileloc_isLib (fileloc f)
+{
+  return (fileloc_isDefined (f) 
+	  && (f->kind == FL_LIB || f->kind == FL_STDHDR || f->kind == FL_STDLIB));
+}
+
+bool fileloc_isStandardLib (fileloc f)
+{
+  return (fileloc_isDefined (f) && f->kind == FL_STDLIB);
+}
+
+/*@only@*/ cstring fileloc_unparseDirect (fileloc fl)
+{
+  if (fileloc_isDefined (fl))
+    {
+      return (message ("%d:%d:%d",
+		       /*@access fileId@*/ (int) fl->fid, /*@noaccess fileId@*/
+		       fl->lineno, fl->column));
+    }
+  else
+    {
+      return (cstring_makeLiteral (""));
+    }
+}
+
+bool fileloc_isUser (fileloc f)
+{
+  return (fileloc_isDefined (f) 
+	  && f->kind == FL_NORMAL);
+}
+
+
+
+
diff --git a/src/filelocList.c b/src/filelocList.c
new file mode 100644
index 0000000..8c3b4c2
--- /dev/null
+++ b/src/filelocList.c
@@ -0,0 +1,294 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** filelocList.c (from slist_template.c)
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "filelocList.h"
+
+/*
+** Invariant:  If any member of the list is fileloc_undefined, then
+**             the 0th member is fileloc_undefined.
+*/
+
+filelocList
+filelocList_new ()
+{
+  return (filelocList_undefined);
+}
+
+static /*@notnull@*/ /*@only@*/ filelocList
+filelocList_newEmpty (void)
+{
+  filelocList s = (filelocList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->free = filelocListBASESIZE;
+  s->elements = (fileloc *) dmalloc (sizeof (*s->elements) * filelocListBASESIZE);
+
+  return (s);
+}
+
+static void
+filelocList_grow (/*@notnull@*/ filelocList s)
+{
+  int i;
+  o_fileloc *oldelements = s->elements;
+  
+  s->free += filelocListBASESIZE; 
+  s->elements = (fileloc *) dmalloc (sizeof (*s->elements) 
+				     * (s->nelements + s->free));
+    
+  for (i = 0; i < s->nelements; i++)
+    {
+      s->elements[i] = oldelements[i];
+    }
+  
+  sfree (oldelements);
+}
+
+filelocList 
+filelocList_append (/*@returned@*/ filelocList s, /*@only@*/ filelocList t)
+{
+  llassert (NOALIAS (s, t));
+
+  if (filelocList_isUndefined (t) || filelocList_isEmpty (t)) return s;
+
+  if (filelocList_isUndefined (s)) 
+    {
+      s = filelocList_newEmpty ();
+    }
+
+  filelocList_elements (t, fl)
+    {
+      /* Okay to use exposed storage here, t is begin eaten. */
+
+      /*@-exposetrans@*/ /*@-dependenttrans@*/
+      s = filelocList_add (s, fl);
+      /*@=exposetrans@*/ /*@=dependenttrans@*/
+    } end_filelocList_elements;
+
+  sfree (t->elements);
+  sfree (t);
+
+  return s;
+}
+
+filelocList 
+  filelocList_addUndefined (/*@returned@*/ filelocList s)
+{
+  if (filelocList_isUndefined (s) 
+      || s->nelements == 0
+      || fileloc_isDefined (s->elements[0]))
+    {
+      return (filelocList_add (s, fileloc_undefined));
+    }
+  else
+    {
+      return s;
+    }
+}
+
+static bool filelocList_hasUndefinedLoc (filelocList s)
+{
+  return (filelocList_isDefined (s) 
+	  && s->nelements > 0
+	  && fileloc_isUndefined (s->elements[0]));
+}
+  
+filelocList 
+  filelocList_addDifferentFile (/*@returned@*/ filelocList s,
+				fileloc where,
+				fileloc loc)
+{
+  if (filelocList_hasUndefinedLoc (s) || filelocList_size (s) >= 2)
+    {
+      return s;
+    }
+  else
+    {
+      if (fileloc_sameModule (where, loc))
+	{
+	  if (filelocList_isEmpty (s))
+	    {
+	      return filelocList_add (s, fileloc_copy (loc));
+	    }
+	  else
+	    {
+	      return s;
+	    }
+	}
+      else
+	{
+	  return filelocList_addUndefined (s);
+	}
+    }
+}
+
+filelocList 
+  filelocList_add (/*@returned@*/ filelocList s, /*@only@*/ fileloc el)
+{
+  if (filelocList_isUndefined (s))
+    {
+      s = filelocList_newEmpty ();
+    }
+
+  if (s->free <= 0)
+    {
+      filelocList_grow (s);
+    }
+  
+  s->free--;
+  s->elements[s->nelements] = el;
+
+  if (fileloc_isUndefined (el))
+    {
+      s->elements[s->nelements] = s->elements[0];
+      s->elements[0] = fileloc_undefined;
+    }
+
+  s->nelements++;
+  return s;
+}
+
+/*@only@*/ cstring
+filelocList_unparse (filelocList s)
+{
+   int i;
+   cstring st = cstring_makeLiteral ("[");
+
+   if (filelocList_isDefined (s))
+     {
+       for (i = 0; i < filelocList_size (s); i++)
+	 {
+	   if (i == 0)
+	     {
+	       st = message ("%q %q", st, fileloc_unparse (s->elements[i]));
+	     }
+	   else
+	     st = message ("%q, %q", st, fileloc_unparse (s->elements[i]));
+	 }
+     }
+   
+   st = message ("%q ]", st);
+   return st;
+}
+
+int filelocList_realSize (filelocList s)
+{
+  int size = 0;
+
+  filelocList_elements (s, el)
+    {
+      if (fileloc_isDefined (el))
+	{
+	  size++;
+	}
+    } end_filelocList_elements;
+
+  return size;
+}
+
+cstring filelocList_unparseUses (filelocList s)
+{
+  int i;
+  int linelen = 0;
+  int maxlen = context_getLineLen () - 3;
+  cstring st = cstring_undefined;
+  fileId lastFile = fileId_invalid;
+
+  if (filelocList_isDefined (s))
+    {
+      bool firstone = TRUE;
+
+      for (i = 0; i < filelocList_size (s); i++)
+	{
+	  if (fileloc_isDefined (s->elements[i]))
+	    {
+	      if (firstone)
+		{
+		  st = fileloc_unparse (s->elements[i]);
+		  lastFile = fileloc_fileId (s->elements[i]);
+		  linelen = 3 + cstring_length (st);
+		  firstone = FALSE;
+		}
+	      else
+		{
+		  if (fileId_equal (fileloc_fileId (s->elements[i]), lastFile))
+		    {
+		      if (linelen + 7 > maxlen)
+			{
+			  st = message ("%q\n      ", st);
+			  linelen = 6;
+			}
+		      else
+			{
+			  st = message ("%q, ", st);
+			}
+		      
+		      st = message ("%q%d,%d", 
+				    st, fileloc_lineno (s->elements[i]), 
+				    fileloc_column (s->elements[i]));
+		      linelen += 3 + int_log (fileloc_lineno (s->elements[i])) 
+			+ int_log (fileloc_column (s->elements[i]));
+		    }
+		  else
+		    {
+		      cstring fl = fileloc_unparse (s->elements[i]);
+		      st = message ("%q\n   %s", st, fl);
+		      lastFile = fileloc_fileId (s->elements[i]);
+		      linelen = 3 + cstring_length (fl);
+		      cstring_free (fl);
+		    }
+		}
+	    }
+	}
+    }
+  
+  return st;
+}
+
+void
+filelocList_free (/*@only@*/ filelocList s)
+{
+  if (filelocList_isDefined (s))
+    {
+      int i;
+      for (i = 0; i < s->nelements; i++)
+	{
+	  fileloc_free (s->elements[i]); 
+	}
+      
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
+
+
+
+
+
+
diff --git a/src/filelocStack.c b/src/filelocStack.c
new file mode 100644
index 0000000..354488f
--- /dev/null
+++ b/src/filelocStack.c
@@ -0,0 +1,234 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** filelocStack.c (from slist_template.c)
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "filelocStack.h"
+
+static /*@notnull@*/ /*@only@*/ filelocStack
+filelocStack_newEmpty (void)
+{
+  filelocStack s = (filelocStack) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->free = filelocStackBASESIZE;
+  s->elements = (fileloc *) dmalloc (sizeof (*s->elements) * filelocStackBASESIZE);
+
+  return (s);
+}
+
+filelocStack
+filelocStack_new ()
+{
+  return (filelocStack_newEmpty ());
+}
+
+static void
+filelocStack_grow (/*@notnull@*/ filelocStack s)
+{
+  o_fileloc *oldelements = s->elements;
+  int i;
+  
+  s->free += filelocStackBASESIZE; 
+  s->elements = (fileloc *) dmalloc (sizeof (*s->elements) 
+				     * (s->nelements + s->free));
+    
+  for (i = 0; i < s->nelements; i++)
+    {
+      s->elements[i] = oldelements[i];
+    }
+  
+  sfree (oldelements);
+}
+
+static void 
+  filelocStack_push (/*@returned@*/ filelocStack s, /*@keep@*/ fileloc el)
+  /*@modifies s@*/
+{
+  llassert (filelocStack_isDefined (s));
+
+  if (s->free <= 0)
+    {
+      filelocStack_grow (s);
+    }
+  
+  s->free--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+}
+
+fileloc filelocStack_nextTop (filelocStack s)
+{
+  llassert (filelocStack_isDefined (s) && s->nelements > 1);
+
+  return (s->elements[s->nelements - 2]);
+}
+
+void filelocStack_clear (filelocStack s)
+{
+  if (filelocStack_isDefined (s))
+    {
+      int i;
+
+      for (i = 0; i < s->nelements; i++)
+	{
+	  fileloc_free (s->elements[i]);
+	}
+
+      s->free += s->nelements;
+      s->nelements = 0;
+    }
+}
+
+/*
+** Returns TRUE of el is a new file.
+*/
+
+bool filelocStack_popPushFile (filelocStack s, fileloc el)
+{
+  int i;
+
+  llassert (filelocStack_isDefined (s));
+
+  for (i = s->nelements - 1; i >= 0; i--)
+    {
+      if (fileloc_sameBaseFile (s->elements[i], el))
+	{
+	  int j;
+	  
+	  for (j = i; j < s->nelements; j++)
+	    {
+	      fileloc_free (s->elements[j]);
+	    }
+
+	  s->elements[i] = el;
+	  s->nelements = i + 1;
+	  return FALSE;
+	}
+    }
+
+  filelocStack_push (s, el);
+  return TRUE;
+}
+
+/*@only@*/ cstring
+filelocStack_unparse (filelocStack s)
+{
+   int i;
+   cstring st = cstring_makeLiteral ("[");
+
+   if (filelocStack_isDefined (s))
+     {
+       for (i = s->nelements - 1; i >= 0; i--)
+	 {
+	   if (i == s->nelements - 1)
+	     {
+	       st = message ("%q %q", st, fileloc_unparse (s->elements[i]));
+	     }
+	   else
+	     {
+	       st = message ("%q, %q", st, fileloc_unparse (s->elements[i]));
+	     }
+	 }
+     }
+   
+   st = message ("%q ]", st);
+   return st;
+}
+
+int filelocStack_includeDepth (filelocStack s)
+{
+  int depth = 0;
+  int i;
+
+  if (filelocStack_isDefined (s))
+    {
+      /* the zeroth element doesn't count! */
+      for (i = s->nelements - 1; i > 0; i--)
+	{
+	  if (!fileloc_isSpecialFile (s->elements[i]))
+	    {
+	      depth++;
+	    }
+	}
+    }
+
+  return depth;
+}
+
+void
+filelocStack_printIncludes (filelocStack s)
+{
+  if (filelocStack_isDefined (s))
+    {
+      int i;
+      bool prep = context_isPreprocessing ();
+      
+      if (prep)
+	{
+	  /* need to do this for messages */
+	  context_clearPreprocessing ();
+	}
+
+      /* don't show last two files pushed */
+      for (i = s->nelements - 3; i >= 0; i--)
+	{
+	  if (i == 0 || !fileloc_isSpecialFile (s->elements[i]))
+	    {
+	      llgenindentmsg (cstring_makeLiteral ("Include site"),
+			      s->elements[i]);
+	    }
+	}
+
+      if (prep)
+	{
+	  context_setPreprocessing ();
+	}
+    }
+}
+
+void
+filelocStack_free (/*@only@*/ filelocStack s)
+{
+  if (filelocStack_isDefined (s))
+    {
+      int i;
+      for (i = 0; i < s->nelements; i++)
+	{
+	  fileloc_free (s->elements[i]); 
+	}
+      
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
+
+
+
+
+
+
diff --git a/src/flagMarker.c b/src/flagMarker.c
new file mode 100644
index 0000000..86b0ca8
--- /dev/null
+++ b/src/flagMarker.c
@@ -0,0 +1,155 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** flagMarker.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+flagMarker flagMarker_createLocalSet (flagcode code, ynm set, fileloc loc)
+{
+  flagMarker c = (flagMarker) dmalloc (sizeof (*c));
+  
+  c->kind = FMK_LOCALSET;
+  c->code = code;
+  c->info.set = set;
+  c->loc = fileloc_copy (loc); 
+
+  return c;
+}
+
+flagMarker flagMarker_createSuppress (flagcode code, fileloc loc)
+{
+  flagMarker c = (flagMarker) dmalloc (sizeof (*c));
+  
+  c->kind = FMK_SUPPRESS;
+  c->code = code;
+  c->loc = fileloc_copy (loc); 
+
+  return c;
+}
+
+flagMarker flagMarker_createIgnoreOn (fileloc loc)
+{
+  flagMarker c = (flagMarker) dmalloc (sizeof (*c));
+  
+  c->kind = FMK_IGNOREON;
+  c->code = INVALID_FLAG;
+  c->loc = fileloc_copy (loc); 
+
+  return c;
+}
+
+flagMarker flagMarker_createIgnoreCount (int count, fileloc loc)
+{
+  flagMarker c = (flagMarker) dmalloc (sizeof (*c));
+  
+  c->kind = FMK_IGNORECOUNT;
+  c->code = INVALID_FLAG;
+  c->info.nerrors = count;
+  c->loc = fileloc_copy (loc); 
+
+  return c;
+}
+
+flagMarker flagMarker_createIgnoreOff (fileloc loc)
+{
+  flagMarker c = (flagMarker) dmalloc (sizeof (*c));
+  
+  c->kind = FMK_IGNOREOFF;
+  c->code = INVALID_FLAG;
+  c->loc = fileloc_copy (loc); 
+
+  return c;
+}
+
+ynm flagMarker_getSet (flagMarker f)
+{
+  llassert (f->kind == FMK_LOCALSET);
+
+  return f->info.set;
+}
+
+flagcode flagMarker_getCode (flagMarker f)
+{
+  llassert (f->kind == FMK_LOCALSET|| f->kind == FMK_SUPPRESS);
+
+  return f->code;
+}
+
+int flagMarker_getCount (flagMarker f)
+{
+  llassert (f->kind == FMK_IGNORECOUNT);
+
+  return f->info.nerrors;
+}
+
+cstring flagMarker_unparse (flagMarker c)
+{
+  switch (c->kind)
+    {
+    case FMK_LOCALSET:
+      return (message ("%q: %s%s", 
+		       fileloc_unparse (c->loc), ynm_unparseCode (c->info.set), 
+		       flagcode_name (c->code)));
+    case FMK_IGNORECOUNT:
+      return (message ("%q: ignore count %d", 
+		       fileloc_unparse (c->loc), c->info.nerrors));
+    case FMK_IGNOREON:
+      return (message ("%q: ignore on", 
+		       fileloc_unparse (c->loc)));
+    case FMK_IGNOREOFF:
+      return (message ("%q: ignore off", 
+		       fileloc_unparse (c->loc)));
+    case FMK_SUPPRESS:
+      return (message ("%q: suppress %s", 
+		       fileloc_unparse (c->loc),
+		       flagcode_name (c->code)));
+    }
+
+  BADBRANCH;
+}
+  
+void flagMarker_free (/*@only@*/ flagMarker c)
+{
+  sfree (c);
+}
+
+bool flagMarker_sameFile (flagMarker c, fileloc loc)
+{
+  return (fileloc_almostSameFile (c->loc, loc));
+}
+
+/*
+** return true if loc is before c->loc
+*/
+
+bool flagMarker_beforeMarker (flagMarker c, fileloc loc)
+{
+  return  (!fileloc_notAfter (c->loc, loc));
+}
+
+
+
diff --git a/src/flagMarkerList.c b/src/flagMarkerList.c
new file mode 100644
index 0000000..cd3fe67
--- /dev/null
+++ b/src/flagMarkerList.c
@@ -0,0 +1,541 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** flagMarkerList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+**
+** invariant: flagMarker's are listed in order
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+flagMarkerList
+  flagMarkerList_new ()
+{
+  flagMarkerList s = (flagMarkerList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = flagMarkerListBASESIZE; 
+  s->elements = (flagMarker *)
+    dmalloc (sizeof (*s->elements) * flagMarkerListBASESIZE);
+
+  return (s);
+}
+
+static void
+flagMarkerList_grow (flagMarkerList s)
+{
+  int i;
+  flagMarker *newelements;
+  
+  s->nspace += flagMarkerListBASESIZE; 
+
+  newelements = (flagMarker *) dmalloc (sizeof (*newelements) 
+					* (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+  
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+void flagMarkerList_add (flagMarkerList s, flagMarker fm)
+{
+  int i = s->nelements - 1;
+
+  
+  if (i > 0)
+    {
+      flagMarker last = s->elements[i];
+
+      
+      if (flagMarker_isIgnoreCount (last))
+	{
+	  if (!flagMarker_isIgnoreOff (fm))
+	    {
+	      if (flagMarker_isLocalSet (fm))
+		{
+		  llforceerror 
+		    (FLG_WARNFLAGS,
+		     cstring_makeLiteral ("Cannot set flag inside ignore "
+					  "count region."),
+		     flagMarker_getLoc (fm));
+		  llgenindentmsg 
+		    (cstring_makeLiteral ("Ignore count region starts"),
+		     flagMarker_getLoc (last));
+
+		}
+	      else 
+		{
+		  if (flagMarker_isIgnoreOn (fm)) 
+		    {
+		      llforceerror 
+			(FLG_WARNFLAGS,
+			 cstring_makeLiteral ("Cannot nest ignore regions."),
+			 flagMarker_getLoc (fm));
+		      llgenindentmsg 
+			(cstring_makeLiteral ("Previous ignore region starts"),
+			 flagMarker_getLoc (last));
+		    }
+		}
+
+	      flagMarker_free (fm);
+	      return;
+	    }
+	}
+      else 
+	{
+	  if (flagMarker_isIgnoreOff (last))
+	    {
+	      flagMarker nlast = s->elements [i - 1];
+	      
+	      if (flagMarker_isIgnoreCount (nlast))
+		{
+		  if (fileloc_sameFile (flagMarker_getLoc (fm),
+					flagMarker_getLoc (last))
+		      && fileloc_notAfter (flagMarker_getLoc (fm), 
+					   flagMarker_getLoc (last)))
+		    {
+		      if (flagMarker_isLocalSet (fm))
+			{
+			  llforceerror 
+			    (FLG_WARNFLAGS,
+			     cstring_makeLiteral ("Cannot set flag inside ignore "
+						  "count region."),
+			     flagMarker_getLoc (fm));
+			  llgenindentmsg 
+			    (cstring_makeLiteral ("Ignore count region starts"),
+			     flagMarker_getLoc (nlast));
+			  
+			}
+		      else 
+			{
+			  if (flagMarker_isIgnoreOn (fm)) 
+			    {
+			      llforceerror 
+				(FLG_WARNFLAGS,
+				 cstring_makeLiteral ("Cannot nest ignore regions."),
+				 flagMarker_getLoc (fm));
+			      llgenindentmsg 
+				(cstring_makeLiteral ("Previous ignore region starts"),
+				 flagMarker_getLoc (nlast));
+			    }
+			}
+		      
+		      flagMarker_free (fm);
+		      return;
+		    }
+		}
+	    }
+	}
+    }
+
+  
+  /*
+  ** all this code is necessary to check the invariant is preserved
+  */
+
+  while (i > 0
+	 && !flagMarker_sameFile (s->elements[i],
+				  flagMarker_getLoc (fm))) 
+    {
+      i--;
+    }
+
+  /*
+  ** reprocessing header file, okay to be out of order
+  */
+
+  if (i >= 0 && !fileloc_isHeader (flagMarker_getLoc (fm)))
+    {
+                  
+      /*
+      llassert (!flagMarker_beforeMarker (s->elements[i], 
+					  flagMarker_getLoc (fm)));
+					  */
+    }
+
+  if (s->nspace <= 0)
+    {
+      flagMarkerList_grow (s);
+    }
+  
+  s->nspace--;
+  s->elements[s->nelements] = fm;
+  s->nelements++;
+  }
+
+void flagMarkerList_checkSuppressCounts (flagMarkerList s)
+{
+  int nexpected = 0;
+  int nsuppressed = 0;
+  fileloc loc = fileloc_undefined;
+  bool inCount = FALSE;
+  int i;
+
+  
+  for (i = 0; i < s->nelements; i++)
+    {
+      flagMarker current = s->elements[i];
+
+      if (flagMarker_isIgnoreCount (current))
+	{
+	  llassert (!inCount);
+	  inCount = TRUE;
+	  nexpected = flagMarker_getCount (current);
+	  loc = flagMarker_getLoc (current);
+	  nsuppressed = 0;
+	  	}
+      else if (flagMarker_isIgnoreOff (current))
+	{
+	  if (inCount)
+	    {
+	      inCount = FALSE;
+	      llassert (fileloc_isDefined (loc));
+
+	      if (nexpected > 0 && nexpected != nsuppressed)
+		{
+		  llforceerror 
+		    (FLG_SUPCOUNTS,
+		     message 
+		     ("Line expects to suppress %d error%p, found %d error%p",
+		      nexpected, nsuppressed),
+		     loc);
+		}
+	    }
+	}
+      else if (flagMarker_isSuppress (current))
+	{
+	  nsuppressed++;
+	}
+      else
+	{
+	  ;
+	}
+    }
+
+  llassert (!inCount);
+}
+
+static void flagMarkerList_splice (flagMarkerList s, 
+				   int index,
+				   /*@keep@*/ flagMarker fm)
+{
+  fileloc loc = flagMarker_getLoc (fm);
+  fileloc beforeloc, afterloc;
+  int i;
+
+  llassert (index >= 0 && (index + 1 < s->nelements));
+  
+  beforeloc = flagMarker_getLoc (s->elements[index]);
+  afterloc = flagMarker_getLoc (s->elements[index + 1]);;
+  
+  llassert (fileloc_sameFile (beforeloc, loc));
+  llassert (fileloc_sameFile (afterloc, loc));
+
+  if (s->nspace <= 0)
+    {
+      flagMarkerList_grow (s);
+    }
+  
+  for (i = s->nelements; i > index + 1; i--)
+    {
+      s->elements[i] = s->elements[i - 1];
+    }
+
+  s->elements[index + 1] = fm;
+  s->nelements++;
+  s->nspace--;
+
+  }
+
+/*@only@*/ cstring
+flagMarkerList_unparse (flagMarkerList s)
+{
+   int i;
+   cstring st = cstring_makeLiteral ("[");
+
+   for (i = 0; i < s->nelements; i++)
+     {
+       if (i == 0)
+	 {
+	   st = message ("%q %q", st, flagMarker_unparse (s->elements[i]));
+	 }
+       else
+	 st = message ("%q, %q", st, flagMarker_unparse (s->elements[i]));
+     }
+   
+   st = message ("%q ]", st);
+   return st;
+}
+
+void
+flagMarkerList_free (flagMarkerList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      flagMarker_free (s->elements[i]);
+    }
+  
+  sfree (s->elements); 
+  sfree (s);
+}
+
+/*
+** returns YES iff
+**    > in ignore region (there is an ignore ON marker not followed by OFF)
+**    > code is OFF (-)
+**
+** returns NO iff
+**    > not in ignore region
+**    > code is ON (+)
+**
+** returns MAYBE iff
+**    > not in ignore region
+**    > code is unset or =
+**
+** requires: invariant for flagMarkerList:
+**    flagMarker's are sorted by line and col
+*/
+
+static int
+flagMarkerList_lastBeforeLoc (flagMarkerList s, fileloc loc)
+{
+  int i;
+
+  for (i = s->nelements - 1; i >= 0; i--) 
+    {
+      flagMarker current = s->elements[i];
+      
+      if (fileloc_sameFile (current->loc, loc) 
+	  && (!flagMarker_beforeMarker (current, loc)))
+	{
+	  return i;
+	}
+/*
+      if (flagMarker_sameFile (current, loc) 
+	  && (!flagMarker_beforeMarker (current, loc)))
+	{
+	  return i;
+	}
+*/
+    }
+
+  return -1;
+}
+	  
+ynm
+flagMarkerList_suppressError (flagMarkerList s, flagcode code, fileloc loc)
+{
+  int i;
+  bool ignoreOff = FALSE;
+  bool nameChecksOff = FALSE;
+  bool flagOff = FALSE;
+  ynm flagSet = MAYBE;
+  bool islib = FALSE;
+  bool isNameChecksFlag = flagcode_isNameChecksFlag (code);
+
+  if (fileloc_isLib (loc))
+    {
+      i = s->nelements - 1;
+      islib = TRUE;
+    }
+  else
+    {
+      i = flagMarkerList_lastBeforeLoc (s, loc);
+    }
+
+  
+  if (i < 0)
+    {
+      return MAYBE;
+    }
+  
+  /*
+  ** Go backwards through the remaining flagMarkers in this file.
+  */
+
+  for (; i >= 0; i--) 
+    {
+      flagMarker current = s->elements[i];
+
+      
+      if (!islib && !flagMarker_sameFile (current, loc))
+	{
+	  break;
+	}
+
+      if (flagMarker_isIgnoreOff (current))
+	{
+	  ignoreOff = TRUE;
+	}
+      else if (flagMarker_isIgnoreOn (current))
+	{
+	  if (!ignoreOff)
+	    {
+	      return YES;
+	    }
+	}
+      else if (flagMarker_isIgnoreCount (current))
+	{
+	  if (!ignoreOff)
+	    {
+	      flagMarkerList_splice (s, i,
+				     flagMarker_createSuppress (code, loc));
+	      return YES;
+	    }
+	}
+      else if (flagMarker_isLocalSet (current))
+	{
+	  
+	  if (!flagOff && flagMarker_getCode (current) == code)
+	    {
+	      ynm set  = flagMarker_getSet (current);
+	      
+	      if (ynm_isOff (set))
+		{
+		  return YES;
+		}
+	      else
+		{
+		  if (ynm_isOn (set))
+		    {
+		      flagOff = TRUE;
+		      flagSet = NO;
+		    }
+		  else
+		    {
+		      		      flagOff = TRUE;
+		      flagSet = MAYBE;
+		    }
+		  
+		  if (ignoreOff)
+		    {
+		      if (isNameChecksFlag && !nameChecksOff)
+			{
+			  ;
+			}
+		      else
+			{
+			  return flagSet;
+			}
+		    }
+		}
+	    }
+	  
+	  if (flagMarker_getCode (current) == FLG_NAMECHECKS
+	      && !nameChecksOff && isNameChecksFlag)
+	    {
+	      ynm set  = flagMarker_getSet (current);
+	      
+	      if (ynm_isOff (set))
+		{
+		  return YES;
+		}
+	      else
+		{
+		  if (ynm_isOn (set))
+		    {
+		      nameChecksOff = TRUE;
+		      flagSet = NO;
+		    }
+		  else
+		    {
+		      		      nameChecksOff = TRUE;
+		      flagSet = MAYBE;
+		    }
+		  
+		  if (ignoreOff && flagOff)
+		    {
+		      return flagSet;
+		    }
+		}
+	    }
+	}
+      else
+	{
+	  llassert (flagMarker_isSuppress (current));
+	}
+    }
+  
+  return flagSet;
+}
+
+bool
+flagMarkerList_inIgnore (flagMarkerList s, fileloc loc)
+{
+  int i;
+
+  if (fileloc_isLib (loc))
+    {
+      return FALSE;
+    }
+
+  i = flagMarkerList_lastBeforeLoc (s, loc);
+  
+  /*
+  ** Go backwards through the remaining flagMarkers in this file.
+  */
+
+  for (; i >= 0; i--) 
+    {
+      flagMarker current = s->elements[i];
+      
+      if (!flagMarker_sameFile (current, loc))
+	{
+	  break;
+	}
+
+      if (flagMarker_isIgnoreOff (current))
+	{
+	  return FALSE;;
+	}
+      else if (flagMarker_isIgnoreOn (current))
+	{
+	  return TRUE;
+	}
+      else if (flagMarker_isIgnoreCount (current))
+	{
+	  flagMarkerList_splice (s, i,
+				 flagMarker_createSuppress (SKIP_FLAG, loc));
+	  return TRUE;
+	}
+      else
+	{
+	  llassert (flagMarker_isLocalSet (current)
+		    || flagMarker_isSuppress (current));
+	}
+    }
+  
+  return FALSE;
+}
+
diff --git a/src/flags.c b/src/flags.c
new file mode 100644
index 0000000..265f771
--- /dev/null
+++ b/src/flags.c
@@ -0,0 +1,1199 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** flags.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "portab.h"
+
+/*
+** from the CC man page:
+**
+**  -Idir          Search for #include files whose names do not begin with a
+**                    slash (/) in the following order: (1) in the directory of
+**                    the dir argument, (2) in the directories specified by -I
+**                    options, (3) in the standard directory (/usr/include).
+*/
+
+/* needed for string literals literals */
+
+typedef struct { 
+  flagkind kind;
+  /*@null@*/ /*@observer@*/ char *name;
+  /*@null@*/ /*@observer@*/ char *describe;
+} flagcatinfo;
+
+static flagcatinfo categories[] =
+{
+  { FK_ABSTRACT, "abstract", "abstraction violations, representation access" } ,
+  { FK_ALIAS, "aliasing", "unexpected or dangerous aliasing" } ,
+  { FK_USE, "alluse", "all declarations are used" } ,
+  { FK_ANSI, "ansi", "violations of constraints imposed by ANSI/ISO standard" } ,
+  { FK_ARRAY, "arrays", "special checking involving arrays" } ,
+  { FK_BOOL, "booleans", "checking and naming of boolean types" } ,
+  { FK_COMMENTS, "comments", "interpretation of stylized comments" } ,
+  { FK_COMPLETE, "complete", "completely defined, used, or specified system" } ,
+  { FK_CONTROL, "controlflow", "suspicious control structures" } ,
+  { FK_DECL, "declarations", "consistency of declarations" } ,
+  { FK_DEF, "definition", "undefined storage errors" } ,
+  { FK_DIRECT, "directories", "set directores" } ,
+  { FK_DISPLAY, "display", "control what is displayed" } ,
+  { FK_EFFECT, "effect", "statements with no effects" } ,
+  { FK_ERRORS, "errors", "control expected errors, summary reporting" } ,
+  { FK_EXPORT, "export", "control what may be exported" } ,
+  { FK_EXPOSURE, "exposure", "representation exposure" } ,
+  { FK_FILES, "files", "control system files" } ,
+  { FK_FORMAT, "format", "control format of warning messages" } ,
+  { FK_GLOBALS, "globals", "use of global and file static variables" },
+  { FK_HEADERS, "headers", "control inclusion and generation of header files" },
+  { FK_HELP, "help", "on-line help" },
+  { FK_IMPLICIT, "implicit", "control implicit annotations and interpretations" } ,
+  { FK_INIT, "initializations", "initialization files" } ,
+  { FK_ITER, "iterators", "checking iterator definitions and uses" } ,
+  { FK_LEAK, "leaks", "memory leaks" } ,
+  { FK_LIBS, "libraries", "loading and dumping of user and standard libraries" } ,
+  { FK_LIMITS, "limits", "violations of set limits" } ,
+  { FK_MACROS, "macros", "expansion, definition and use of macros" },
+  { FK_MEMORY, "memory", "memory management" } ,
+  { FK_MODIFIES, "modification", "modification errors" } ,
+  { FK_NAMES, "names", "naming conventions and limits" } ,
+  { FK_NULL, "null", "misuses of null pointers" } ,
+  { FK_NUMBERS, "numbers", "control type-checking of numeric types" } ,
+  { FK_OPS, "operations", "checking of primitive operations" } ,
+  { FK_PARAMS, "parameters", "function and macro parameters" } ,
+  { FK_SPEED, "performance", "speeding up checking" } ,
+  { FK_POINTER, "pointers", "pointers" } ,
+  { FK_PRED, "predicates", "condition test expressions" } ,
+  { FK_PREFIX, "prefixes", "set naming prefixes and control checking" } ,
+  { FK_PREPROC, "preproc", "defines and undefines for the preprocessor" } ,
+  { FK_PROTOS, "prototypes", "function prototypes" } ,
+  { FK_DEAD, "released", "using storage that has been deallocated" } ,
+  { FK_IGNORERET, "returnvals", "ignored return values" },
+  { FK_SPEC, "specifications", "checks involving .lcl specifications" } ,
+  { FK_SUPPRESS, "suppress", "local and global suppression of messages" } ,
+  { FK_TYPEEQ, "typeequivalence", "control what types are equivalent" } ,
+  { FK_BEHAVIOR, "undefined", "code with undefined or implementation-defined behavior" } ,
+  { FK_UNRECOG, "unrecognized", "unrecognized identifiers" } ,
+  { FK_UNSPEC, "unconstrained", "checking in the presence of unconstrained functions" } ,
+  { FK_DEBUG, NULL, NULL } ,
+  { FK_SYNTAX, NULL, NULL } ,
+  { FK_TYPE, NULL, NULL } ,
+  { FK_SECRET, NULL, NULL } ,
+  { FK_OBSOLETE, NULL, NULL } ,
+  { FK_NONE, NULL, NULL }  /* must be last */
+} ; 
+
+typedef enum {
+  ARG_NONE,
+  ARG_VALUE,
+  ARG_STRING,
+  ARG_SPECIAL
+} argcode;
+
+typedef struct { 
+  flagkind main;
+  flagkind sub;
+  bool isSpecial;  /* setting this flag may set other flags (or values) */
+  bool isIdem;     /* idempotent - always sets to TRUE */
+  bool isGlobal;   /* cannot be set locally (using control comments) */
+  bool isModeFlag; /* set by modes */
+  argcode argtype;
+  /*@observer@*/ char *flag;
+  flagcode code; 
+  /*@observer@*/ /*@null@*/ char *desc;
+  bn_mstring hint; 
+  int nreported; 
+  int nsuppressed; 
+} fflag;
+
+typedef fflag flaglist[];
+
+# include "flags.def"
+
+/*@iter allFlags (yield observer fflag f); @*/
+# define allFlags(m_f) \
+  { /*@+enumint@*/ flagcode m_i; for (m_i = 0; m_i < NUMFLAGS; m_i++) { fflag m_f = flags[m_i]; /*@=enumint@*/
+# define end_allFlags }}
+
+static bn_mstring mode_names[] =
+{ 
+  "weak", "standard", "checks", "strict", NULL, 
+};
+
+/*@iter allModes (yield bn_mstring modename)@*/
+# define allModes(m_m) \
+  { int m_ii = 0; while (mstring_isDefined (mode_names[m_ii])) \
+      { bn_mstring m_m = mode_names[m_ii]; m_ii++; 
+
+# define end_allModes }}
+
+/*@+enumint@*/
+
+static cstring describeFlagCode (flagcode p_flag) /*@*/ ;
+static cstringSList sortedFlags (void) /*@*/ ;
+static /*@observer@*/ cstring categoryName (flagkind p_kind) /*@*/ ;
+static /*@unused@*/ cstring listModes (void) /*@*/ ;
+
+bool flagcode_isSpecialFlag (flagcode f)
+{
+  return (flags[f].isSpecial);
+}
+
+bool flagcode_isGlobalFlag (flagcode f)
+{
+  return (flags[f].isGlobal);
+}
+
+bool flagcode_isIdemFlag (flagcode f)
+{
+  return (flags[f].isIdem);
+}
+
+bool flagcode_isModeFlag (flagcode f)
+{
+  return (flags[f].isModeFlag);
+}
+
+bool flagcode_isNameChecksFlag (flagcode f)
+{
+  return (flags[f].main == FK_NAMES);
+}
+
+/*
+** Internal consistency check on the flags.
+*/
+
+void flags_initMod ()
+{
+  allFlagCodes (code)
+    {
+      /*@+enumint@*/
+      if (flags[code].code != code)
+	{
+	  llbug (message ("*** ERROR: inconsistent flag %s / %d / %d", 
+			  cstring_fromChars (flags[code].flag),
+			  flags[code].code, code));
+	}
+      /*@=enumint@*/
+    } end_allFlagCodes;
+}
+
+void
+summarizeErrors ()
+{
+  bool hadOne = FALSE;
+  int sumrep = 0;
+  int sumsup = 0;
+
+  char *buf = mstring_create (128);
+
+  allFlags (f)
+    {
+      if (f.nreported > 0 || f.nsuppressed > 0)
+	{
+	  int nrep = f.nreported;
+	  int nsup = f.nsuppressed;
+	  cstring fs = cstring_fill (cstring_fromChars (f.flag), 23);
+
+	  if (!hadOne)
+	    {
+	      llmsgplain (cstring_makeLiteral
+			  ("\nError Type                Reported  Suppressed\n"
+			   "===================       ========  ========="));
+	      hadOne = TRUE;
+	    }
+
+	  sprintf (buf, "%s%7d   %9d", cstring_toCharsSafe (fs), nrep, nsup);
+
+	  sumrep += nrep;
+	  sumsup += nsup;
+	  
+	  cstring_free (fs);
+	  llmsg (cstring_copy (cstring_fromChars (buf)));
+	}
+    } end_allFlags;
+
+  if (hadOne)
+    {
+      cstring ts = cstring_fill (cstring_makeLiteralTemp ("Total"), 23);
+
+      llmsglit ("                          ========  =========");
+
+      sprintf (buf, "%s%7d   %9d", cstring_toCharsSafe (ts), sumrep, sumsup);
+      cstring_free (ts);
+      llmsgplain (cstring_copy (cstring_fromChars (buf)));
+    }
+
+  sfree (buf);
+}
+
+/*@+enumindex@*/
+
+void
+flagcode_recordError (flagcode f)
+{
+  if (f != INVALID_FLAG)
+    {
+      if (f == FLG_WARNFLAGS)
+	{
+	  ; /* don't count these */
+	}
+      else
+	{
+	  flags[f].nreported = flags[f].nreported + 1;
+	}
+    }
+  else
+    {
+      llcontbug (message ("flagcode_recordError: invalid flag: %d", (int) f));
+    }
+}
+
+void
+flagcode_recordSuppressed (flagcode f)
+{
+  llassertprint (f != INVALID_FLAG, ("flagcode: %s", flagcode_unparse (f)));
+
+  flags[f].nsuppressed = flags[f].nsuppressed + 1;
+}
+
+int
+flagcode_numReported (flagcode f)
+{
+  llassert (f != INVALID_FLAG);
+
+  return (flags[f].nreported);
+}
+
+/*@observer@*/ cstring
+flagcodeHint (flagcode f)
+{
+  llassert (f != INVALID_FLAG);
+
+  if (mstring_isDefined (flags[f].hint))
+    {
+      return (cstring_fromChars (flags[f].hint));
+    }
+  else
+    {
+      return (cstring_fromChars (flags[f].desc));
+    }
+}
+
+static int categorySize (flagkind kind) /*@*/ 
+{
+  int n = 0;
+
+  
+  allFlags (f)
+    {
+      if (f.main == kind || f.sub == kind)
+	{
+	  	  n++;
+	}
+    } end_allFlags;
+
+  return n;
+}
+
+flagkind identifyCategory (cstring s)
+{
+  int i;
+
+  for (i = 0; categories[i].kind != FK_NONE; i++)
+    {
+      if (mstring_isDefined (categories[i].name))
+	{
+	  if (cstring_equalLit (s, categories[i].name))
+	    {
+	      return categories[i].kind;
+	    }
+	}
+    }
+
+  return FK_NONE;
+}
+
+static /*@observer@*/ cstring categoryName (flagkind kind)
+{
+  int i;
+
+  for (i = 0; categories[i].kind != FK_NONE; i++)
+    {
+      if (categories[i].kind == kind)
+	{
+	  return (cstring_fromChars (categories[i].name));
+	}
+    }
+  
+  return (cstring_makeLiteralTemp (""));
+}
+
+static int categoryIndex (flagkind kind)
+{
+  int i;
+
+  for (i = 0; categories[i].kind != FK_NONE; i++)
+    {
+      if (categories[i].kind == kind)
+	{
+	  return i;
+	}
+    }
+
+  return -1;
+}
+
+void printCategory (flagkind kind)
+{
+  int index = categoryIndex (kind);
+
+  llassert (index >= 0);
+
+  llmsg (message ("%s (%d flags)\n\3%s\n\n", 
+		  cstring_fromChars (categories[index].name), 
+		  categorySize (kind),
+		  cstring_fromChars (categories[index].describe)));
+
+  allFlags (f)
+    {
+      if (f.main == kind || f.sub == kind)
+	{
+	  llmsg (message ("   %s\n\6%q", cstring_fromChars (f.flag), 
+			  describeFlagCode (f.code)));
+	}
+    } end_allFlags;
+}
+
+void 
+listAllCategories (void)
+{
+  int i;
+
+  for (i = 0; categories[i].kind != FK_NONE; i++)
+    {
+      flagkind kind = categories[i].kind ;
+
+      if (categories[i].describe != NULL)
+	{
+	  llmsg (message ("%s (%d flags)\n\3%s", 
+			  categoryName (kind), 
+			  categorySize (kind),
+			  cstring_fromChars (categories[i].describe)));
+	}
+    }
+}
+
+void
+printAllFlags (bool desc, bool full)
+{
+  if (full)
+    {
+      cstringSList fl = sortedFlags ();
+
+      cstringSList_elements (fl, el)
+	{
+	  llmsg (message ("%q\n\n", describeFlag (el)));
+	} end_cstringSList_elements ;
+
+      cstringSList_free (fl);
+    }
+  else
+    {
+      allFlags (f)
+	{
+	  if (f.code != INVALID_FLAG && f.main != FK_OBSOLETE)
+	    {
+	      if (mstring_isDefined (f.desc))
+		{
+		  if (desc)
+		    {
+		      llmsg (message ("%s --- %s", cstring_fromChars (f.flag),
+				      cstring_fromChars (f.desc)));
+		    }
+		}
+	    }
+	} end_allFlags;
+    }
+}
+
+cstring
+describeFlagCode (flagcode flag)
+{
+  cstring ret = cstring_undefined;
+  fflag f;
+
+  if (flagcode_isInvalid (flag))
+    {
+      return (cstring_makeLiteral (""));
+    }
+
+  context_resetAllFlags ();
+  
+  f = flags[flag];
+  ret = cstring_copy (cstring_fromChars (f.desc));
+
+  
+  if (f.sub != FK_NONE)
+    {
+      ret = message ("%q\nCategories: %s, %s",
+		     ret, 
+		     categoryName (f.main),
+		     categoryName (f.sub));
+    }
+  else 
+    {
+      if (f.main != FK_NONE)
+	{
+	  cstring cname = categoryName (f.main);
+	  
+	  if (cstring_isDefined (cname))
+	    {
+	      ret = message ("%q\nCategory: %s",
+			     ret, cname);
+	    }
+	}
+    }
+
+  if (f.isModeFlag)
+    {
+      bool first = TRUE;
+
+      allModes (mname)
+	{
+	  context_setMode (cstring_fromChars (mname));
+
+	  if (first)
+	    {
+	      ret = message ("%q\nMode Settings: %s %s",
+			     ret, cstring_fromChars (mname), 
+			     cstring_makeLiteralTemp 
+			     (context_getFlag (flag) ? "+" : "-"));
+	      first = FALSE;
+	    }
+	  else
+	    {
+	      ret = message ("%q, %s %s",
+			     ret, cstring_fromChars (mname),
+			     cstring_makeLiteralTemp 
+			     (context_getFlag (flag) ? "+" : "-"));
+	    }
+	} end_allModes;
+    }
+  else
+    {
+      ret = message ("%q\nDefault Setting: %s",
+		     ret, 
+		     cstring_makeLiteralTemp 
+		     (context_getFlag (flag) ? "+" : "-"));
+    }
+
+  if (f.isGlobal)
+    {
+      ret = message("%q\nSet globally only", ret);
+    }
+  else
+    {
+      ret = message("%q\nSet locally", ret);
+    }
+
+  switch (f.argtype)
+    {
+    case ARG_NONE:
+    case ARG_SPECIAL:
+      break;
+    case ARG_VALUE:
+      if (flag == FLG_COMMENTCHAR)
+	{
+	  ret = message("%q\nCharacter Argument.  Default: %h",
+			ret, (char) context_getValue (flag));
+	}
+      else
+	{
+	  ret = message("%q\nNumeric Argument.  Default: %d",
+			ret,
+			context_getValue (flag));
+	}
+      break;
+    case ARG_STRING:
+      if (cstring_isDefined (context_getString (flag)))
+	{
+	  ret = message("%q\nString Argument.  Default: %s",
+			ret,
+			context_getString (flag));
+	}
+      else
+	{
+	  ret = message("%q\nString Argument.  No default.", ret);
+	}
+      break;
+    }
+
+  if (mstring_isDefined (f.hint))
+    {
+      ret = message("%q\n\3%s", ret, cstring_fromChars (f.hint));
+    }
+
+  return ret;
+}
+
+cstring
+describeFlag (cstring flagname)
+{
+  cstring oflagname = cstring_copy (flagname);
+  flagcode f = identifyFlag (flagname);
+
+  if (flagcode_isSkip (f))
+    {
+      cstring_free (oflagname);
+      return cstring_undefined;
+    }
+  else if (flagcode_isValid (f))
+    {
+      if (cstring_equal (flagname, oflagname))
+	{
+	  cstring_free (oflagname);
+	  return (message ("%s\n\3%q", flagname, describeFlagCode (f)));
+	}
+      else
+	{
+	  return (message ("%q (standardized name: %s)\n\3%q",
+			   oflagname, flagname, describeFlagCode (f)));
+	}
+    }
+  else
+    {
+      if (isMode (flagname))
+	{
+	  cstring_free (oflagname);
+
+	  return
+	    (message ("%s: predefined mode (see User's Guide for information)",
+		      flagname));
+	}
+      else
+	{
+	  return (message ("%q: ", oflagname));
+	}
+    }
+}
+
+static cstringSList
+sortedFlags (void)
+{
+  cstringSList s = cstringSList_new ();
+
+  allFlags (f)
+    {
+      if (f.desc != NULL)
+	{
+	  s = cstringSList_add (s, cstring_fromChars (f.flag));
+	}
+    } end_allFlags;
+
+  cstringSList_alphabetize (s);
+
+  return s;
+}
+
+void printAlphaFlags ()
+{
+  cstringSList fl = sortedFlags ();
+
+  cstringSList_printSpaced (fl, 3, 1, context_getLineLen () - 25); 
+  cstringSList_free (fl);
+}
+/*@observer@*/ cstring
+flagcode_name (flagcode code)
+{
+  return cstring_fromChars (flags[code].flag);
+}
+
+/*
+** Transforms a flag into its cannonical form.
+**
+** The following transformations are made:
+**
+**    function      -> fcn
+**    variable      -> var
+**    constant      -> const
+**    iterator      -> iter
+**    parameter     -> param
+**    unrecognized  -> unrecog
+**    qualifier     -> qual         
+**    declaration   -> decl
+**    globalias     -> (no change)
+**    global        -> glob
+**    modifies      -> mods
+**    modify        -> mod
+**    pointer       -> ptr
+**    implies       -> imp
+**    implicit      -> imp
+**    implied       -> imp
+**    unconstrained -> unspec       
+**    unconst       -> unspec
+**    memory        -> mem
+**    length        -> len
+*/
+
+static void
+canonicalizeFlag (cstring s)
+{
+  int i = 0;
+  static bn_mstring transform[] = 
+    { 
+      "function", "fcn",
+      "variable", "var",
+      "constant", "const",
+      "iterator", "iter",
+      "parameter", "param",
+      "unrecognized", "unrecog",
+      "qualifier", "qual",
+      "declaration", "decl",
+      "globals", "globs", 
+      "modifies", "mods", 
+      "modify", "mod",
+      "pointer", "ptr",
+      "implies", "imp",
+      "implicit", "imp",
+      "implied", "imp",
+      "unconstrained", "uncon",
+      "unconst", "uncon",
+      "memory", "mem",
+      "length", "len",
+      "return", "ret",
+      "system", "sys",
+      NULL
+      } ;
+  char *current;
+
+  while ((current = transform[i]) != NULL)
+    {
+      if (cstring_containsLit (s, current))
+	{
+	  cstring_replaceLit (s, current, transform[i+1]);
+	}
+      i += 2;
+    }
+
+  /* remove whitespace, -'s, and _'s */
+  cstring_stripChars (s, " -_");
+}
+
+flagcode
+identifyFlag (cstring s)
+{
+  if (cstring_firstChar (s) == 'I')
+    {
+      return FLG_INCLUDEPATH; /* no space after -I */
+    }
+
+  if (cstring_firstChar (s) == 'S') 
+    {
+      return FLG_SPECPATH;    /* no space after -S */
+    }
+
+  if (cstring_firstChar (s) == 'D') 
+    {
+      return FLG_DEFINE;      /* no space after -D */
+    }
+
+  if (cstring_firstChar (s) == 'U') 
+    {
+      return FLG_UNDEFINE;    /* no space after -D */
+    }
+
+  canonicalizeFlag (s);
+
+  allFlags (f)
+    {
+      if (cstring_equal (cstring_fromChars (f.flag), s))
+	{
+	  return (f.code);
+	}
+    } end_allFlags;
+
+  /*
+  ** Synonyms
+  */
+
+  if (cstring_equalLit (s, "pred"))
+    {
+      return FLG_PREDBOOL;
+    }
+
+  if (cstring_equalLit (s, "modobserverstrict"))
+    {
+      return FLG_MODOBSERVERUNCON;
+    }
+
+  if (cstring_equalLit (s, "czechnames"))
+    {
+      return FLG_CZECH;
+    }
+
+  if (cstring_equalLit (s, "slovaknames"))
+    {
+      return FLG_SLOVAK;
+    }
+
+  if (cstring_equalLit (s, "czechoslovaknames"))
+    {
+      return FLG_CZECHOSLOVAK;
+    }
+
+  if (cstring_equalLit (s, "globunspec")
+	   || cstring_equalLit (s, "globuncon"))
+    {
+      return FLG_GLOBUNSPEC;
+    }
+
+  if (cstring_equalLit (s, "modglobsunspec")
+	   || cstring_equalLit (s, "modglobsuncon")
+	   || cstring_equalLit (s, "modglobsnomods"))
+    {
+      return FLG_MODGLOBSUNSPEC;
+    }
+
+  if (cstring_equalLit (s, "export"))
+    {
+      return FLG_EXPORTANY;
+    }
+
+  if (cstring_equalLit (s, "macrospec"))
+    {
+      return FLG_MACRODECL;
+    }
+  
+  if (cstring_equalLit (s, "ansireservedlocal"))
+    {
+      return FLG_ANSIRESERVEDLOCAL;
+    }
+
+  if (cstring_equalLit (s, "warnposix"))
+    {
+      return FLG_WARNPOSIX;
+    }
+
+  if (cstring_equalLit (s, "defuse"))
+    {
+      return FLG_USEDEF;
+    }
+
+  if (cstring_equalLit (s, "macroundef"))
+    {
+      return FLG_MACROUNDEF;
+    }
+
+  if (cstring_equalLit (s, "showcol"))
+    {
+      return FLG_SHOWCOL;
+    }
+
+  if (cstring_equalLit (s, "intbool"))
+    {
+      return FLG_BOOLINT;
+    }
+
+  if (cstring_equalLit (s, "intchar"))
+    {
+      return FLG_CHARINT;
+    }
+
+  if (cstring_equalLit (s, "intenum"))
+    {
+      return FLG_ENUMINT;
+    }
+
+  /*
+  ** For our European friends...
+  */
+
+  if (cstring_equalLit (s, "isolib"))
+    {
+      return FLG_ANSILIB;
+    }
+
+  if (cstring_equalLit (s, "isostrictlib"))
+    {
+      return FLG_STRICTLIB;
+    }
+
+  if (cstring_equalLit (s, "ansistrictlib"))
+    {
+      return FLG_STRICTLIB;
+    }
+
+  if (cstring_equalLit (s, "skipisoheaders"))
+    {
+      return FLG_SKIPANSIHEADERS;
+    }
+
+  if (cstring_equalLit (s, "isoreserved"))
+    {
+      return FLG_ANSIRESERVED;
+    }
+
+  if (cstring_equalLit (s, "isoreservedinternal"))
+    {
+      return FLG_ANSIRESERVEDLOCAL;
+    }
+
+  if (cstring_equalLit (s, "isolimits"))
+    {
+      return FLG_ANSILIMITS;
+    }
+
+  /*
+  ** Obsolete Flags
+  */
+  
+  if (cstring_equalLit (s, "accessunspec"))
+    {
+      flagWarning 
+	(cstring_makeLiteralTemp
+	 ("accessunspec flag is not supported by LCLint version 2.0 or "
+	  "later.  It has been replaced by accessmodule, accessfile and "
+	  "accessfunction to provide more precise control of accessibility "
+	  "of representations.  For more information, "
+	  "see lclint -help accessmodule"));
+      
+      return SKIP_FLAG;
+    }
+
+  if (cstring_equalLit (s, "staticmods"))
+    {
+      flagWarning 
+	(cstring_makeLiteralTemp
+	 ("staticmods flag is obsolete.  You probably "
+	  "want impcheckmodstatics.  For more information, "
+	  "see lclint -help impcheckmodstatics"));
+      
+      return SKIP_FLAG;
+    }
+  
+  if (cstring_equalLit (s, "ansi"))
+    {
+      flagWarning
+	(cstring_makeLiteralTemp ("ansi flag is obsolete.  You probably "
+				  "want noparams and/or oldstyle."));
+      
+      return SKIP_FLAG;
+    }
+    
+  if (cstring_equalLit (s, "stdio"))
+    {
+      flagWarning 
+	(cstring_makeLiteralTemp
+	 ("stdio flag is obsolete.  You may "
+	  "want strictlib or one of the gloabls "
+	  "checking flags.  For more information, "
+	  "see lclint -help strictlib or lclint -help flags globals"));
+      
+      return SKIP_FLAG;
+    }
+
+  return INVALID_FLAG;
+}
+
+void setValueFlag (flagcode opt, cstring arg)
+{
+  switch (opt)
+    {
+    case FLG_EXPECT:
+    case FLG_LCLEXPECT:
+    case FLG_LIMIT:  
+    case FLG_LINELEN:
+    case FLG_EXTERNALNAMELEN:
+    case FLG_INTERNALNAMELEN:
+    case FLG_CONTROLNESTDEPTH:
+    case FLG_STRINGLITERALLEN:
+    case FLG_NUMSTRUCTFIELDS:
+    case FLG_NUMENUMMEMBERS:
+    case FLG_INCLUDENEST:
+      {
+	int val = cstring_toPosInt (arg);
+
+	if (val < 0)
+	  {
+	    llerror 
+	      (FLG_BADFLAG,
+	       message 
+	       ("Flag %s must be followed by a positive number number.  "
+		"Followed by %s",
+		flagcode_unparse (opt), arg));
+	  }
+	else
+	  {
+	    	    context_setValueAndFlag (opt, val);
+	  }
+      }
+      break;
+    case FLG_COMMENTCHAR:
+      {
+	if (cstring_length (arg) != 1)
+	  {
+	    llfatalerrorLoc
+	      (message
+	       ("Flag %s should be followed by a single character.  Followed by %s",
+		flagcode_unparse (opt), arg));
+	  }
+	else
+	  {
+	    context_setCommentMarkerChar (cstring_firstChar (arg));
+	  }
+      }
+      break;
+    BADDEFAULT;
+    }
+}
+
+void setStringFlag (flagcode opt, /*@only@*/ cstring arg)
+{
+  switch (opt)
+    {
+    case FLG_TMPDIR:
+      {
+	if (cstring_lastChar (arg) == CONNECTCHAR)
+	  {
+	    context_setString (opt, arg);
+	  }
+	else
+	  {
+	    context_setString (opt, cstring_appendChar (arg, CONNECTCHAR));
+	  }
+	break;
+      }
+    default:
+      {
+	context_setString (opt, arg);
+	break;
+      }
+    }
+}
+
+cstring
+describeModes ()
+{
+  cstring s = cstring_makeLiteral ("Flag                    ");
+  cstringSList sflags = sortedFlags ();
+
+  allModes (modename)
+    {
+      s = message ("%q%9s", s, cstring_fromChars (modename));
+    } end_allModes;
+  
+  s = message ("%q\n", s);
+
+  cstringSList_elements (sflags, flagname)
+    {
+      flagcode code = identifyFlag (flagname);
+      fflag currentflag = flags[code];
+      
+      if (mstring_isDefined (currentflag.desc) && flagcode_isModeFlag (code))
+	{
+	  s = message ("%q\n%27s", s, 
+		       cstring_fromChars (currentflag.flag));
+	  
+	  allModes (modename)
+	    {
+	      context_setMode (cstring_fromChars (modename));
+	      
+	      if (context_getFlag (code))
+		{
+		  s = message ("%q%9s", s, cstring_makeLiteralTemp ("+"));
+		}
+	      else
+		{
+		  s = message ("%q%9s", s, cstring_makeLiteralTemp (" "));
+		}
+
+	      context_resetModeFlags ();
+	    } end_allModes;
+	}
+    } end_cstringSList_elements;
+  
+  cstringSList_free (sflags);
+
+  s = cstring_appendChar (s, '\n');
+
+  return (s);
+}
+
+static cstring
+listModes (void)
+{
+  cstring s = cstring_makeLiteral ("\t");
+  int i = 0;
+
+  allModes (modename)
+    {
+      if (i != 0 && (i % 4 == 0))
+	{
+	  s = message ("%q\n\t%15s", s, cstring_fromChars (modename));
+	}
+      else
+	{
+	  s = message ("%q%15s", s, cstring_fromChars (modename));
+	}
+      i++;
+    } end_allModes;
+
+  return s;
+}
+
+bool
+isMode (cstring s)
+{
+  allModes (modename)
+    {
+      if (mstring_isDefined (modename))
+	{
+	  if (cstring_equalLit (s, modename))
+	    {
+	      return TRUE;
+	    }
+	}
+     } end_allModes;
+
+  return FALSE;
+}
+
+extern bool flagcode_hasArgument (flagcode f)
+{
+  return (flags[f].argtype != ARG_NONE);
+}
+
+extern bool flagcode_hasValue (flagcode f)
+{
+  return (flags[f].argtype == ARG_VALUE);
+}
+
+extern bool flagcode_hasString (flagcode f)
+{
+  return (flags[f].argtype == ARG_STRING);
+}
+
+extern int flagcode_valueIndex (flagcode f)
+{
+  /*@unchecked@*/ static bool initialized = FALSE;
+  int i;
+  /*@unchecked@*/ static flagcode valueFlags[NUMVALUEFLAGS];
+
+  
+  if (!initialized)
+    {
+      int nv = 0;
+
+      allFlagCodes (code)
+	{
+	  if (flagcode_hasValue (code))
+	    {
+	      llassert (nv < NUMVALUEFLAGS);
+	      valueFlags[nv] = code;
+	      	      nv++;
+	    }
+	} end_allFlagCodes;
+
+      llassertprint (nv == NUMVALUEFLAGS,
+		     ("number of value flags: %d (expected %d)",
+		      nv, NUMVALUEFLAGS));
+      initialized = TRUE;
+    }
+
+  for (i = 0; i < NUMVALUEFLAGS; i++)
+    {
+      /* static valueFlags must be defined */
+      /*@-usedef@*/ if (f == valueFlags[i]) /*@=usedef@*/
+	{
+	  return i;
+	}
+          }
+
+  BADEXIT;
+}
+
+extern int flagcode_stringIndex (flagcode f)
+{
+  /*@unchecked@*/ static bool initialized = FALSE;
+  /*@unchecked@*/ static flagcode stringFlags[NUMSTRINGFLAGS];
+  int i;
+
+
+  if (!initialized)
+    {
+      int nv = 0;
+
+      allFlagCodes (code)
+	{
+	  if (flagcode_hasString (code))
+	    {
+	      llassertprint (nv < NUMSTRINGFLAGS, ("Incorrect number of string flags: %d (need at least %d)", NUMSTRINGFLAGS, nv));
+	      stringFlags[nv] = code;
+	      nv++;
+	    }
+	} end_allFlagCodes;
+
+      llassertprint (nv == NUMSTRINGFLAGS,
+		     ("number of string flags: %d (expected %d)",
+		      nv, NUMSTRINGFLAGS));
+      initialized = TRUE;
+    }
+
+  for (i = 0; i < NUMSTRINGFLAGS; i++)
+    {
+      /*@-usedef@*/ if (f == stringFlags[i]) /*@=usedef@*/
+	{
+	  return i;
+	}
+    }
+
+  llbug (message ("Bad string flag: %s", flagcode_unparse (f)));
+  BADEXIT;
+}
+
+bool flagcode_isNamePrefixFlag (flagcode f)
+{
+  switch (f)
+    {
+    case FLG_MACROVARPREFIX:
+    case FLG_TAGPREFIX:
+    case FLG_ENUMPREFIX:
+    case FLG_FILESTATICPREFIX:
+    case FLG_GLOBPREFIX:
+    case FLG_TYPEPREFIX:
+    case FLG_EXTERNALPREFIX:
+    case FLG_LOCALPREFIX:
+    case FLG_UNCHECKEDMACROPREFIX:
+    case FLG_CONSTPREFIX:
+    case FLG_ITERPREFIX:
+    case FLG_DECLPARAMPREFIX:
+      return TRUE;
+    default:
+      return FALSE;
+    }
+}
+	
diff --git a/src/flags.def b/src/flags.def
new file mode 100644
index 0000000..fb59d95
--- /dev/null
+++ b/src/flags.def
@@ -0,0 +1,3420 @@
+/*;-*-C-*-; 
+**
+** flags.def
+**
+** This file is used to generate the flag header files.
+*/
+
+		 	     /* spec   idem   global  mode  args */
+/*@-namechecks@*/
+/*@notfunction@*/
+# define modeFlag   		FALSE, FALSE, FALSE,  TRUE, ARG_NONE
+/*@notfunction@*/
+# define plainFlag		FALSE, FALSE, FALSE, FALSE, ARG_NONE
+/*@notfunction@*/
+# define specialFlag 		TRUE,  FALSE, FALSE, FALSE, ARG_NONE
+/*@notfunction@*/
+# define plainSpecialFlag   	TRUE,  FALSE, FALSE, FALSE, ARG_NONE
+/*@notfunction@*/
+# define idemSpecialFlag 	TRUE,  TRUE,  FALSE, FALSE, ARG_NONE
+/*@notfunction@*/
+# define valueFlag     		FALSE, FALSE, FALSE, FALSE, ARG_VALUE
+/*@notfunction@*/
+# define modeValueFlag     	FALSE, FALSE, FALSE, TRUE,  ARG_VALUE
+/*@notfunction@*/
+# define specialValueFlag       TRUE,  FALSE, FALSE, FALSE, ARG_VALUE
+/*@notfunction@*/
+# define debugFlag              FALSE, TRUE,  FALSE, FALSE, ARG_NONE
+/*@notfunction@*/
+# define specialDebugFlag       TRUE,  TRUE,  FALSE, FALSE, ARG_NONE
+/*@notfunction@*/
+# define globalFlag             FALSE, FALSE, TRUE,  FALSE, ARG_NONE
+/*@notfunction@*/
+# define idemGlobalFlag         FALSE, TRUE,  TRUE,  FALSE, ARG_NONE
+/*@notfunction@*/
+# define globalValueFlag        FALSE, FALSE, TRUE,  FALSE, ARG_VALUE
+/*@notfunction@*/
+# define regStringFlag          FALSE, FALSE, FALSE, FALSE, ARG_STRING
+/*@notfunction@*/
+# define idemStringFlag         FALSE, TRUE,  FALSE, FALSE, ARG_STRING
+/*@notfunction@*/
+# define globalStringFlag       FALSE, FALSE, TRUE,  FALSE, ARG_STRING
+/*@notfunction@*/
+# define extraArgFlag           FALSE, FALSE, FALSE, FALSE, ARG_SPECIAL
+/*@notfunction@*/
+# define globalExtraArgFlag     FALSE, FALSE, TRUE,  FALSE, ARG_SPECIAL
+/*@=namechecks@*/
+
+/*
+** Note: the flag code must be on a separate line, since I'm
+** too stupid to write an awk/sed/whatever script that can separate
+** the lines.
+*/
+
+static flaglist flags = {	
+{	
+  FK_ABSTRACT, FK_BOOL, plainFlag,
+  "bool",
+  FLG_ABSTRACTBOOL,
+  "boolean type is abstract",
+  NULL, 0, 0
+  },
+{
+  FK_BOOL, FK_HELP, plainFlag,
+  "likelybool",
+  FLG_LIKELYBOOL,
+  "type name is probably a boolean type but does not match default "
+	"boolean type name, \"bool\", and alternate name is not set",
+  "Use the -booltype, -boolfalse and -booltrue flags to change the "
+	"name of the default boolean type.",
+   0, 0
+  },
+{
+  FK_ABSTRACT, FK_IMPLICIT, plainFlag,
+  "impabstract",
+  FLG_IMPABSTRACT,
+  "assume user type definitions are abstract (unless /*@concrete@*/ is used)",
+  NULL,
+  0, 0
+  },
+{
+  FK_ABSTRACT, FK_NAMES, specialFlag,
+  "accessall",
+  FLG_ACCESSALL,
+  "set accessmodule, accessfile and accessczech",
+  "Sets accessmodule, accessfile and accessczech",
+  0, 0
+  },
+{
+  FK_ABSTRACT, FK_NAMES, plainFlag,
+  "accessmodule",
+  FLG_ACCESSMODULE,
+  "allow access to abstract types in definition module",
+  "The representation of an abstract type defined in . is "
+  "accessible anywhere in a file named ..", 
+  0, 0
+  },
+{
+  FK_ABSTRACT, FK_NAMES, plainFlag,
+  "accessfile",
+  FLG_ACCESSFILE,
+  "allow access to abstract types by file name convention",
+  "The representation of an abstract type named  is "
+  "accessible anywhere in a file named ..", 
+  0, 0
+  },
+{
+  FK_ABSTRACT, FK_NAMES, plainFlag,
+  "accessczech",
+  FLG_ACCESSCZECH,
+  "allow access to abstract types by czech naming convention",
+  "The representation of an abstract type named  is accessible "
+  "in the definition of a function or constant named _",
+  0, 0
+  },
+{
+  FK_ABSTRACT, FK_NAMES, plainFlag,
+  "accessslovak",
+  FLG_ACCESSSLOVAK,
+  "allow access to abstract types by slovak naming convention",
+  "The representation of an abstract type named  is accessible "
+  "in the definition of a function or constant named ",
+  0, 0
+  },
+{
+  FK_ABSTRACT, FK_NAMES, plainFlag,
+  "accessczechoslovak",
+  FLG_ACCESSCZECHOSLOVAK,
+  "allow access to abstract types by czechoslovak naming convention",
+  "The representation of an abstract type named  is accessible "
+  "in the definition of a function or constant named _ or ",
+  0, 0
+  },
+{
+  FK_ABSTRACT, FK_NONE, plainFlag,
+  "abstract",
+  FLG_ABSTRACT,
+  "data abstraction barriers",
+  "An abstraction barrier is broken. If necessary, use /*@access @*/ to allow access to an abstract type.",
+  0, 0
+  },
+{
+  FK_ABSTRACT, FK_NONE, modeFlag,
+  "mutrep",
+  FLG_MUTREP,
+  "representation of mutable type has sharing semantics",
+  "LCL semantics requires that a mutable type exhibits sharing semantics. In order for objects to be shared a indirection is necessary in the representation. A mutable type may be represented by a pointer or an abstract mutable type. Handles into static data are fine, too, but will generate this error message unless it is suppressed.",
+  0, 0
+  },
+{
+  FK_ALIAS, FK_GLOBALS, specialFlag,
+  "globalias",
+  FLG_GLOBALIAS,
+  "function returns with global aliasing external state (sets "
+	"checkstrictglobalias, checkedglobalias, checkmodglobalias and "
+	"uncheckedglobalias)",
+  "A global variable aliases externally-visible state when the function returns.",
+  0, 0
+  },
+{
+  FK_ALIAS, FK_GLOBALS, modeFlag,
+  "checkstrictglobalias",
+  FLG_CHECKSTRICTGLOBALIAS,
+  "function returns with a checkstrict global aliasing external state",
+  "A global variable aliases externally-visible state when the function returns.",
+  0, 0
+  },
+{
+  FK_ALIAS, FK_GLOBALS, modeFlag,
+  "checkedglobalias",
+  FLG_CHECKEDGLOBALIAS,
+  "function returns with a checked global aliasing external state",
+  "A global variable aliases externally-visible state when the function returns.",
+  0, 0
+  },
+{
+  FK_ALIAS, FK_GLOBALS, modeFlag,
+  "checkmodglobalias",
+  FLG_CHECKMODGLOBALIAS,
+  "function returns with a checkmod global aliasing external state",
+  "A global variable aliases externally-visible state when the function returns.",
+  0, 0
+  },
+{
+  FK_ALIAS, FK_GLOBALS, modeFlag,
+  "uncheckedglobalias",
+  FLG_UNCHECKEDGLOBALIAS,
+  "function returns with an unchecked global aliasing external state",
+  "A global variable aliases externally-visible state when the function returns.",
+  0, 0
+  },
+{
+  FK_ALIAS, FK_MEMORY, modeFlag,
+  "aliasunique",
+  FLG_ALIASUNIQUE,
+  "unique parameter is aliased",
+  "A unique or only parameter is aliased by some other parameter or visible global.",
+  0, 0
+  },
+{
+  FK_ALIAS, FK_MEMORY, modeFlag,
+  "mayaliasunique",
+  FLG_MAYALIASUNIQUE,
+  "unique parameter may be aliased",
+  "A unique or only parameter may be aliased by some other parameter or visible global.",
+  0, 0
+  },
+{
+  FK_ALIAS, FK_MEMORY, modeFlag,
+  "mustnotalias",
+  FLG_MUSTNOTALIAS,
+  "temp storage aliased at return point or scope exit",
+  "An alias has been added to a temp-qualifier parameter or global that is visible externally when the function returns. If the aliasing is needed, use the /*@shared@*/ annotation to indicate that new aliases to the parameter may be created.",
+  0, 0
+  },
+{
+  FK_ALIAS, FK_NONE, modeFlag,
+  "retalias",
+  FLG_RETALIAS,
+  "function returns alias to parameter or global",
+  "The returned value shares storage with a parameter or global. If a parameter is to be returned, use the returned qualifier. If the result is not modified, use the observer qualifier on the result type. Otherwise, exposed can be used, but limited checking is done.", 0, 0
+  },
+{
+  FK_ANSI, FK_PROTOS, modeFlag,
+  "noparams",
+  FLG_NOPARAMS,
+  "function declaration has no parameter list",
+  "A function declaration does not have a parameter list.",
+  0, 0
+  },
+{
+  FK_ANSI, FK_PROTOS, modeFlag,
+  "oldstyle",
+  FLG_OLDSTYLE,
+  "old style function definition",
+  "Function definition is in old style syntax. Standard prototype "
+	"syntax is preferred.",
+  0, 0
+  },
+{
+  FK_ANSI, FK_SYNTAX, plainFlag,
+  "gnuextensions",
+  FLG_GNUEXTENSIONS,
+  "support some gnu (gcc) language extensions",
+  NULL, 0, 0
+  },
+{
+  FK_ANSI, FK_NONE, plainFlag,
+  "usevarargs",
+  FLG_USEVARARGS,
+  "non-standard  included",
+  "Header  is not part of ANSI Standard. "
+	"Should use  instead.",
+  0, 0
+  },
+{
+  FK_ANSI, FK_LIBS, plainFlag,
+  "warnposixheaders",
+  FLG_WARNPOSIX,
+  "a POSIX header is included, but the POSIX library is not used",
+  "Header name matches a POSIX header, but the POSIX library is not selected.",
+  0, 0
+  },
+{
+  FK_BEHAVIOR, FK_ANSI, modeFlag,
+  "exitarg",
+  FLG_EXITARG,
+  "argument to exit has implementation defined behavior",
+  "The argument to exit should be 0, EXIT_SUCCESS or EXIT_FAILURE",
+  0, 0
+  },
+{
+  FK_BEHAVIOR, FK_ANSI, modeFlag,
+  "evalorder",
+  FLG_EVALORDER,
+  "code has unspecified or implementation-dependent behavior "
+	"because of order of evaluation",
+  "Code has unspecified behavior. "
+	"Order of evaluation of function parameters or subexpressions "
+	"is not defined, so if a value is used and modified in different "
+	"places not separated by a sequence point constraining "
+	"evaluation order, then the result of the expression is "
+	"unspecified.", 
+	0, 0
+  },
+{
+  FK_BEHAVIOR, FK_ANSI, modeFlag,
+  "evalorderuncon",
+  FLG_EVALORDERUNCON,
+  "code involving call to unspecified function has undefined or implementation-dependent behavior",
+  "Code involving a call to function with no modifies or globals clause "
+	"may have undefined or implementation-dependent behavior (LCLint assumes the "
+	"unconstrained call may modify any reachable state or use any global). Add a "
+	"specification for the function.", 
+   0, 0
+  },
+{
+  FK_BOOL, FK_NONE, regStringFlag,
+  "boolfalse",
+  FLG_BOOLFALSE,
+  "set name of boolean false (default FALSE)",
+  NULL, 0, 0
+  },
+{
+  FK_BOOL, FK_NONE, regStringFlag,
+  "booltype",
+  FLG_BOOLTYPE,
+  "set name of boolean type (default bool)",
+  NULL, 0, 0
+  },
+{
+  FK_BOOL, FK_NONE, regStringFlag,
+  "booltrue",
+  FLG_BOOLTRUE, 
+  "set name of boolean true (default TRUE)",
+  NULL, 0, 0
+  },
+{
+  FK_COMMENTS, FK_ABSTRACT, plainFlag,
+  "noaccess",
+  FLG_NOACCESS,
+  "ignore access comments",
+  NULL, 0, 0
+  },
+{
+  FK_COMMENTS, FK_SUPPRESS, plainFlag,
+  "nocomments",
+  FLG_NOCOMMENTS,
+  "ignore all stylized comments",
+  NULL, 0, 0
+  },
+{
+  FK_COMMENTS, FK_SYNTAX, plainFlag,
+  "unrecogcomments",
+  FLG_UNRECOGCOMMENTS,
+  "stylized comment is unrecognized",
+  "Word after a stylized comment marker does not correspond to a "
+	"stylized comment.",
+   0, 0
+  },
+{
+  FK_COMMENTS, FK_SYNTAX, plainFlag,
+  "continuecomment",
+  FLG_CONTINUECOMMENT,
+  "line continuation marker (\\) in comment before */ on same line",
+  "A line continuation marker (\\) appears inside a comment on the same "
+	"line as the comment close. Preprocessors should handle this "
+	"correctly, but it causes problems for some preprocessors.",
+   0, 0
+  },
+{
+  FK_COMMENTS, FK_SYNTAX, plainFlag,
+  "nestcomment",
+  FLG_NESTCOMMENT,
+  "comment begins inside comment", 
+  "A comment open sequence (/*) appears within a comment.  This usually "
+	"means an earlier comment was not closed.",
+   0, 0
+  },
+{
+  FK_COMMENTS, FK_SUPPRESS, modeFlag,
+  "tmpcomments",
+  FLG_TMPCOMMENTS,
+  "interpret t comments (ignore errors in lines marked with /*@t@*/", 
+  NULL, 0, 0
+  },
+{
+  FK_COMMENTS, FK_SUPPRESS, plainFlag,
+  "lintcomments",
+  FLG_LINTCOMMENTS,
+  "interpret traditional lint comments (/*FALLTHROUGH*/, /*NOTREACHED*/)",
+  NULL, 0, 0
+  },
+{
+  FK_COMMENTS, FK_SUPPRESS, modeFlag,
+  "warnlintcomments",
+  FLG_WARNLINTCOMMENTS,
+  "print a warning and suggest an alternative when a traditional lint "
+	"comment is used",
+  "A traditional lint comment is used. Some traditional lint comments "
+	"are interpreted by LCLint to enable easier checking of legacy "
+	"code. It is preferable to replace these comments with the "
+	"suggested LCLint alternative.",
+  0, 0
+  },
+{
+  FK_COMPLETE, FK_NONE, modeFlag,
+  "declundef",
+  FLG_DECLUNDEF,
+  "function or variable declared but never defined",
+  "A function or variable is declared, but not defined in any source code file.",
+  0, 0
+  },
+{
+  FK_COMPLETE, FK_SPEC, modeFlag,
+  "specundef",
+  FLG_SPECUNDEF,
+  "function or variable specified but never defined",
+  "A function or variable is declared in an .lcl file, but not defined in any source code file.",
+  0, 0
+  },
+{
+  FK_COMPLETE, FK_SPEC, plainFlag,
+  "specundecl",
+  FLG_SPECUNDECL,
+  "function or variable specified but never declared in a source file",
+  "A function or variable is declared in an .lcl file, but not declared "
+	"in any source code file.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_MEMORY, modeFlag,
+  "loopexec",
+  FLG_LOOPEXEC,
+  "assume all loops execute at least once",
+  NULL, 0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, plainFlag,
+  "control",
+  FLG_CONTROL, 
+  NULL, NULL,
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "infloops",
+  FLG_INFLOOPS,
+  "likely infinite loop is detected",
+  "This appears to be an infinite loop. Nothing in the body of the "
+	"loop or the loop test modifies the value of the loop test. "
+	"Perhaps the specification of a function called in the loop "
+	"body is missing a modification.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "infloopsuncon",
+  FLG_INFLOOPSUNCON,
+  "likely infinite loop is detected (may result from unconstrained function)",
+  "This appears to be an infinite loop. Nothing in the body of the "
+    "loop or the loop test modifies the value of the loop test. "
+    "There may be a modification through a call to an unconstrained "
+    "function, or an unconstrained function in the loop test may use "
+    "a global variable modified by the loop body.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, specialFlag,
+  "deepbreak",
+  FLG_DEEPBREAK,
+  "break inside nested while or for or switch",
+  "A break statement appears inside the body of a nested while, for or "
+	"switch statement. Sets looploopbreak, loopswitchbreak, "
+	"switchloopbreak, switchswitchbreak, and looploopcontinue.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "looploopbreak",
+  FLG_LOOPLOOPBREAK,
+  "break inside nested while or for",
+  "A break statement appears inside the body of a nested while or for "
+	"statement. This is perfectly reasonable code, but check that "
+	"the break is intended to break only the inner loop. The "
+	"break statement may be preceded by /*@innerbreak@*/ to suppress "
+	"the message for this break only.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "switchloopbreak",
+  FLG_SWITCHLOOPBREAK,
+  "break in loop inside switch",
+  "A break statement appears inside the body of a while or for "
+	"statement within a switch. This is perfectly reasonable code, but check that "
+	"the break is intended to break only the inner loop. The "
+	"break statement may be preceded by /*@loopbreak@*/ to suppress "
+	"the message for this break only.",
+  0, 0
+  },
+ {
+   FK_CONTROL, FK_NONE, modeFlag,
+   "loopswitchbreak",
+   FLG_LOOPSWITCHBREAK,
+   "break in switch inside loop",
+  "A break statement appears inside a switch statement within a while or "
+	"for loop. This is perfectly reasonable code, but check that "
+	"the break is intended to break only the inner loop. The "
+	"break statement may be preceded by /*@switchbreak@*/ to suppress "
+	"the message for this break only.",
+  0, 0
+  },
+ {
+   FK_CONTROL, FK_NONE, modeFlag,
+   "switchswitchbreak",
+   FLG_SWITCHSWITCHBREAK,
+   "break in switch inside switch",
+  "A break statement appears inside a switch statement within another "
+	"switch statement. This is perfectly reasonable code, but check that "
+	"the break is intended to break only the inner switch. The "
+	"break statement may be preceded by /*@innerbreak@*/ to suppress "
+	"the message for this break only.",
+  0, 0
+  },
+ {
+   FK_CONTROL, FK_NONE, modeFlag,
+   "looploopcontinue",
+   FLG_LOOPLOOPCONTINUE,
+   "continue inside nested loop",
+  "A continue statement appears inside a loop within a loop. "
+	"This is perfectly reasonable code, but check that "
+	"the continue is intended to continue only the inner loop. The "
+	"continue statement may be preceded by /*@innercontinue@*/ to suppress "
+	"the message for this continue only.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "unreachable",
+  FLG_UNREACHABLE,
+  "unreachable code detected",
+  "This code will never be reached on any possible execution.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "whileempty",
+  FLG_WHILEEMPTY,
+  "a while statement has no body",
+  "While statement has no body.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "whileblock",
+  FLG_WHILEBLOCK,
+  "the body of a while statement is not a block",
+  "While body is a single statement, not a compound block.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "forempty",
+  FLG_FOREMPTY,
+  "a for statement has no body",
+  "For statement has no body.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "forblock",
+  FLG_FORBLOCK,
+  "the body of a for statement is not a block",
+  "Loop body is a single statement, not a compound block.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "ifempty",
+  FLG_IFEMPTY,
+  "an if statement has no body",
+  "If statement has no body.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "ifblock",
+  FLG_IFBLOCK,
+  "the body of an if statement is not a block",
+  "If body is a single statement, not a compound block.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, specialFlag,
+  "allempty",
+  FLG_ALLEMPTY,
+  "an if, while or for statement has no body (sets ifempty, "
+	"whileempty and forempty",
+  NULL,
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, specialFlag,
+  "allblock",
+  FLG_ALLBLOCK,
+  "the body of an if, while or for statement is not a block "
+	"(sets ifblock, whileblock and forblock)",
+  "Body is a single statement, not a compound block.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "elseifcomplete",
+  FLG_ELSEIFCOMPLETE,
+  "if ... else if chains must have final else",
+  "There is no final else following an else if construct.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "noret",
+  FLG_NORETURN,
+  "path with no return detected in non-void function",
+  "There is a path through a function declared to return a value on "
+	"which there is no return statement. This means the execution "
+	"may fall through without returning a meaningful result to "
+	"the caller.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "casebreak",
+  FLG_CASEBREAK,
+  "non-empty case in a switch without preceding break",
+  "Execution falls through from the previous case.", 0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "misscase",
+  FLG_MISSCASE,
+  "switch on enum type missing case for some value",
+  "Not all values in an enumeration are present as cases in the switch.",
+  0, 0
+  },
+{
+  FK_CONTROL, FK_NONE, modeFlag,
+  "firstcase",
+  FLG_FIRSTCASE,
+  "first statement in switch is not a case",
+  "The first statement after a switch is not a case.",
+  0, 0
+  },
+{
+  FK_DEBUG, FK_NONE, specialDebugFlag,
+  "grammar",
+  FLG_GRAMMAR, 
+  NULL, NULL,
+  0, 0
+  },
+{
+  FK_DEBUG, FK_NONE, debugFlag,
+  "nopp",
+  FLG_NOPP,
+  NULL, NULL,
+  0, 0
+  },
+{
+  FK_DECL, FK_NONE, modeFlag,
+  "shadow",
+  FLG_SHADOW,
+  "declaration reuses name visible in outer scope",
+  "An outer declaration is shadowed by the local declaration.",
+  0, 0
+  },
+{
+  FK_DECL, FK_LIBS, modeFlag,
+  "incondefslib",
+  FLG_INCONDEFSLIB,
+  "function, variable or constant defined in a library is redefined with inconsistent type",
+  "A function, variable or constant previously defined in a library is "
+	"redefined with a different type.",
+  0, 0
+  },
+{
+  FK_DECL, FK_LIBS, modeFlag,
+  "overload",
+  FLG_WARNOVERLOAD,
+  "library function overloaded",
+  "A function, variable or constant defined in the library is redefined "
+	"with a different type.",
+  0, 0
+  },
+{
+  FK_DECL, FK_NONE, modeFlag,
+  "nestedextern",
+  FLG_NESTEDEXTERN,
+  "an extern declaration is inside a function scope",
+  "An extern declaration is used inside a function scope.",
+  0, 0
+  },	
+{
+  FK_DECL, FK_NONE, modeFlag,
+  "redecl",
+  FLG_REDECL,
+  "function or variable redeclared",
+  "A function or variable is declared in more than one place. This is "
+	"not necessarily a problem, since the declarations are consistent.",
+  0, 0
+  },	
+{
+  FK_DECL, FK_NONE, plainFlag,
+  "redef",
+  FLG_REDEF,
+  "function or variable redefined",
+  "A function or variable is redefined. One of the declarations should use extern.",
+  0, 0
+  },
+{
+  FK_DECL, FK_TYPE, modeFlag,
+  "incondefs",
+  FLG_INCONDEFS,
+  "function, variable or constant redefined with inconsistent type",
+  "A function, variable or constant is redefined with a different type.",
+  0, 0
+  },
+{
+  FK_DECL, FK_TYPE, modeFlag,
+  "imptype",
+  FLG_IMPTYPE,
+  "variable declaration has unknown (implicitly int) type",
+  "A variable declaration has no explicit type.  The type is implicitly int.",
+  0, 0
+  },
+{
+  FK_DECL, FK_TYPE, modeFlag,
+  "matchfields",
+  FLG_MATCHFIELDS,
+  "struct or enum type redefined with inconsistent fields or members",
+  "A struct, union or enum type is redefined with inconsistent fields or members.",
+  0, 0
+  },
+{
+  FK_DEF, FK_NONE, modeFlag,
+  "usedef",
+  FLG_USEDEF,
+  "use before definition",
+  "An rvalue is used that may not be initialized to a value on some execution path.",
+  0, 0
+  },
+{
+  FK_DEF, FK_IMPLICIT, modeFlag,
+  "impouts",
+  FLG_IMPOUTS,
+  "pointer parameters to unspecified functions may be implicit out parameters",
+  NULL, 0, 0
+  },
+{
+  FK_DIRECT, FK_FILES, globalStringFlag,
+  "tmpdir",
+  FLG_TMPDIR,
+  "set directory for writing temp files",
+  NULL, 0, 0
+  },
+{
+  FK_DIRECT, FK_FILES, globalStringFlag,
+  "larchpath",
+  FLG_LARCHPATH,
+  "set path for searching for library files (overrides LARCH_PATH environment variable)",
+  NULL, 0, 0
+  },
+{
+  FK_DIRECT, FK_FILES, globalStringFlag,
+  "lclimportdir",
+  FLG_LCLIMPORTDIR,
+  "set directory to search for LCL import files (overrides LCLIMPORTDIR)",
+  NULL, 0, 0
+  },
+{
+  FK_DIRECT, FK_FILES, globalStringFlag,
+  "sysdirs",
+  FLG_SYSTEMDIRS,
+  "set directories for system files (default /usr/include). Separate "
+	"directories with colons (e.g., \"/usr/include:/usr/local/lib\"). "
+ 	"Flag settings propagate to files in a system directory. If "
+        "-sysdirerrors is set, no errors are reported for files in "
+	"system directories.",
+  NULL, 0, 0
+  },
+{
+  FK_DIRECT, FK_FILES, plainFlag,
+  "skipansiheaders",
+  FLG_SKIPANSIHEADERS,
+  "prevent inclusion of header files in a system directory with "
+    "names that match standard ANSI headers. The symbolic information "
+    "in the standard library is used instead.  Flag in effect only "
+    "if a library including the ANSI library is loaded.  The ANSI "
+    "headers are: assert, ctype, errno, float, limits, locale, math, "
+	"setjmp, signal, stdarg, stddef, stdio, stdlib, strings, string, "
+	"time, and wchar.",
+  NULL, 0, 0
+  },
+{
+  FK_DIRECT, FK_FILES, plainFlag,
+  "skipposixheaders",
+  FLG_SKIPPOSIXHEADERS,
+  "prevent inclusion of header files in a system directory with "
+    "names that match standard POSIX headers. The symbolic information "
+    "in the posix library is used instead.  The POSIX headers are: "
+	"dirent, fcntl, grp, pwd, termios, sys/stat, sys/times, "
+	"sys/types, sys/utsname, sys/wait, unistd, and utime.",
+  NULL, 0, 0
+  },
+{
+  FK_DIRECT, FK_SUPPRESS, modeFlag,
+  "sysdirerrors",
+  FLG_SYSTEMDIRERRORS,
+  "report errors in files in system directories (set by -sysdirs)",
+  NULL, 0, 0
+  },
+{
+  FK_HEADERS, FK_MACROS, plainFlag,
+  "sysdirexpandmacros",
+  FLG_SYSTEMDIREXPAND,
+  "expand macros in system directories regardless of other settings, "
+	"except for macros corresponding to names defined in a load library",
+  NULL, 0, 0
+  },
+
+{
+  FK_DIRECT, FK_HEADERS, globalExtraArgFlag,
+  "I",
+  FLG_INCLUDEPATH,
+  "add to C include path",
+  NULL, 0, 0
+  },
+{
+  FK_DIRECT, FK_SPEC, globalExtraArgFlag,
+  "S",
+  FLG_SPECPATH,
+  "add to spec path",
+  NULL, 0, 0
+  },
+{
+  FK_DISPLAY, FK_ERRORS, plainFlag,
+  "quiet",
+  FLG_QUIET,
+  "suppress herald and error count",
+  NULL, 0, 0
+  },
+{
+  FK_DISPLAY, FK_ERRORS, plainFlag,
+  "usestderr",
+  FLG_USESTDERR,
+  "send error messages to standard error (instead of standard out)",
+  NULL, 0, 0
+  },
+{
+  FK_DISPLAY, FK_ERRORS, plainFlag,
+  "showsummary",
+  FLG_SHOWSUMMARY,
+  "show summary of all errors reported and suppressed",
+  NULL, 0, 0
+  },
+{
+  FK_DISPLAY, FK_FILES, plainFlag,
+  "showscan",
+  FLG_SHOWSCAN,
+  "show file names are they are processed",
+  NULL, 0, 0
+  },
+{
+  FK_DISPLAY, FK_NONE, globalFlag,
+  "stats",
+  FLG_STATS,
+  "display lines processed and time",
+  NULL, 0, 0
+  },
+{
+  FK_DISPLAY, FK_NONE, globalFlag,
+  "timedist",
+  FLG_TIMEDIST,
+  "display time distribution",
+  NULL, 0, 0
+  },
+{
+  FK_DISPLAY, FK_USE, globalFlag,
+  "showalluses",
+  FLG_SHOWUSES,
+  "show sorted list of uses of all globals",
+  NULL, 0, 0
+  },
+{
+  FK_EFFECT, FK_CONTROL, modeFlag,
+  "noeffect",
+  FLG_NOEFFECT,
+  "statement with no effect",
+  "Statement has no visible effect --- no values are modified.",
+  0, 0
+  },
+{
+  FK_EFFECT, FK_CONTROL, modeFlag,
+  "noeffectuncon",
+  FLG_NOEFFECTUNCON,
+  "statement with no effect (except possibly through call to "
+	"unconstrained function)",
+  "Statement has no visible effect --- no values are modified. It may "
+	"modify something through a call to an unconstrained function.",
+  0, 0
+  },
+{
+  FK_EXPORT, FK_SPEC, specialFlag,
+  "exportany",
+  FLG_EXPORTANY,
+  "variable, function or type exported but not specified",
+  "A variable, function or type is exported, but not specified.",
+  0, 0
+  },
+{
+  FK_EXPORT, FK_SPEC, modeFlag,
+  "exportfcn",
+  FLG_EXPORTFCN,
+  "function exported but not specified",
+  "A function is exported, but not specified.", 0, 0
+  },
+{
+  FK_EXPORT, FK_SPEC, modeFlag,
+  "exportmacro",
+  FLG_EXPORTMACRO,
+  "expanded macro exported but not specified",
+  "A macro is exported, but not specified.", 0, 0
+  },
+{
+  FK_EXPORT, FK_SPEC, modeFlag,
+  "exporttype",
+  FLG_EXPORTTYPE,
+  "type definition exported but not specified",
+  "A type is exported, but not specified.", 0, 0
+  },
+{
+  FK_EXPORT, FK_SPEC, modeFlag,
+  "exportvar",
+  FLG_EXPORTVAR,
+  "variable exported but not specified",
+  "A variable is exported, but not specified.", 0, 0
+  },
+{
+  FK_EXPORT, FK_SPEC, modeFlag,
+  "exportconst",
+  FLG_EXPORTCONST,
+  "constant exported but not specified",
+  "A constant is exported, but not specified.", 0, 0
+  },
+{
+  FK_EXPORT, FK_SPEC, modeFlag,
+  "exportiter",
+  FLG_EXPORTITER,
+  "constant exported but not specified",
+  "A constant is exported, but not specified.", 0, 0
+  },
+{
+  FK_EXPOSURE, FK_ABSTRACT, specialFlag,
+  "repexpose",
+  FLG_REPEXPOSE,
+  "abstract representation is exposed (sets assignexpose, retexpose, and castexpose)",
+  "The internal representation of an abstract type is visible to the "
+	"caller. This means clients may have access to a pointer "
+	"into the abstract representation.",
+  0, 0
+  },
+{
+  FK_EXPOSURE, FK_ABSTRACT, modeFlag,
+  "retexpose",
+  FLG_RETEXPOSE,
+  "abstract representation is exposed (return values only)",
+  "The return value shares storage with an instance of an abstract "
+	"type. This means clients may have access to a pointer into "
+	"the abstract representation. Use the observer qualifier to "
+	"return exposed storage that may not be modified by the "
+	"client. Use the exposed qualifier to return modifiable "
+	"(but not deallocatable) exposed storage (dangerous).",
+  0, 0
+  },
+{
+  FK_EXPOSURE, FK_ABSTRACT, modeFlag,
+  "assignexpose",
+  FLG_ASSIGNEXPOSE,
+  "abstract representation is exposed (assignments only)",
+  "Storage internal to the representation of an abstract type is "
+	"assigned to an external pointer. This means clients may "
+	"have access to a pointer into the abstract representation. "
+	"If the external pointer is a parameter, the exposed qualifier "
+	"can be used to allow the assignment, however, this is "
+	"considered dangerous programming practice.",
+  0, 0
+  },
+{
+  FK_EXPOSURE, FK_ABSTRACT, modeFlag,
+  "castexpose",
+  FLG_CASTEXPOSE,
+  "abstract representation is exposed through a cast",
+  "Storage internal to the representation of an abstract type is exposed "
+	"through a type cast. This means clients may have access to a "
+	"pointer into the abstract representation.",
+  0, 0
+  },
+
+{
+  FK_FORMAT, FK_DISPLAY, valueFlag,
+  "linelen",
+  FLG_LINELEN,
+  "set length of messages (number of chars)",
+  NULL, 0, 0
+  },
+{
+  FK_FORMAT, FK_DISPLAY, plainFlag,
+  "showcolumn",
+  FLG_SHOWCOL,
+  "show column number where error is found",
+  NULL, 0, 0
+  },
+{
+  FK_FORMAT, FK_DISPLAY, plainFlag,
+  "parenfileformat",
+  FLG_PARENFILEFORMAT,
+  "show column number where error is found",
+  NULL, 0, 0
+  },
+{
+  FK_FORMAT, FK_NONE, plainFlag,
+  "showfunc",
+  FLG_SHOWFUNC,
+  "show name of function containing error",
+  NULL, 0, 0
+  },
+{
+  FK_FORMAT, FK_NONE, plainFlag,
+  "showallconjs",
+  FLG_SHOWALLCONJS,
+  "show all possible types",
+  "When a library function is declared with multiple possible type, the "
+	"alternate types are shown only if +showallconjs.", 
+   0, 0
+  },
+{
+  FK_LIBS, FK_NONE, plainFlag, 
+  "impconj",
+  FLG_IMPCONJ, 
+  "make all alternate types implicit (useful for making system libraries",
+  NULL, 0, 0
+  } ,
+{
+  FK_GLOBAL, FK_ERRORS, globalValueFlag,
+  "expect",
+  FLG_EXPECT,
+  "expect  code errors",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBAL, FK_ERRORS, globalValueFlag,
+  "lclexpect",
+  FLG_LCLEXPECT,
+  "expect  spec errors",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBAL, FK_USE, idemSpecialFlag,
+  "partial",
+  FLG_PARTIAL,
+  "check as partial system (-specundef, -declundef, -exportlocal, "
+	"don't check macros in headers without corresponding .c files)",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_SPEC, plainFlag,
+  "globs",
+  FLG_GLOBALS,
+  "undocumented use of a checked global variable",
+  "A checked global variable is used in the function, but not listed in "
+     "its globals clause. By default, only globals specified in .lcl "
+      "files are checked. To check all globals, use +allglobals. To "
+      "check globals selectively use /*@checked@*/ in the global "
+      "declaration.",
+  0, 0
+  },
+{
+  FK_GLOBALS, FK_SPEC, modeFlag,
+  "globuse",
+  FLG_USEALLGLOBS,
+  "global listed for a function not used",
+  "A global variable listed in the function's globals list is not used "
+	"in the body of the function.",
+  0, 0
+  },
+{
+  FK_GLOBALS, FK_NONE, modeFlag,
+  "internalglobs",
+  FLG_INTERNALGLOBS,
+  "use of internalState",
+  "A called function uses internal state, but the globals list for the "
+	"function being checked does not include internalState",
+  0, 0
+  },
+{
+  FK_GLOBALS, FK_NONE, modeFlag,
+  "internalglobsnoglobs",
+  FLG_INTERNALGLOBSNOGLOBS,
+  "use of internalState (in function with no globals list)",
+  "A called function uses internal state, but the function being checked "
+	"has no globals list",
+  0, 0
+  },
+{
+  FK_GLOBALS, FK_MODIFIES, modeFlag,
+  "warnmissingglobs",
+  FLG_WARNMISSINGGLOBALS,
+  "global variable used in modifies clause is not listed in globals list",
+  "A global variable is used in the modifies clause, but it not listed in "
+	"the globals list.  The variable will be added to the globals list.",
+  0, 0
+  },
+
+{
+  FK_GLOBALS, FK_MODIFIES, modeFlag,
+  "warnmissingglobsnoglobs",
+  FLG_WARNMISSINGGLOBALSNOGLOBS,
+  "global variable used in modifies clause in a function with no globals list",
+  "A global variable is used in the modifies clause, but the function "
+	"has no globals list.  The variable will be added to the globals list.",
+  0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "globnoglobs",
+  FLG_GLOBUNSPEC,
+  "use of checked global in a function with no globals list or specification",
+  "A specified global variable is used in the function, but not listed "
+	"in its globals list. Without +globnoglobs, only globals "
+	"declared with /*@checkedstrict@*/ will produce use "
+	"errors in functions without globals "
+	"lists. The /*@globals ... @*/ control comment can be used to give "
+	"a globals list for an unspecified function.",
+  0, 0
+  },
+{
+  FK_GLOBALS, FK_IMPLICIT, modeFlag,
+  "allglobs",
+  FLG_ALLGLOBALS,
+  "report use and modification errors for globals not annotated with unchecked",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "checkstrictglobs",
+  FLG_CHECKSTRICTGLOBALS,
+  "report use and modification errors for checkedstrict globals",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "impcheckedspecglobs",
+  FLG_IMPCHECKEDSPECGLOBALS,
+  "assume checked qualifier for unqualified global declarations in .lcl files",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "impcheckmodspecglobs",
+  FLG_IMPCHECKMODSPECGLOBALS,
+  "assume checkmod qualifier for unqualified global declarations in .lcl files",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "impcheckedstrictspecglobs",
+  FLG_IMPCHECKEDSTRICTSPECGLOBALS,
+  "assume checkmod qualifier for unqualified global declarations in .lcl files",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "impcheckedglobs",
+  FLG_IMPCHECKEDGLOBALS,
+  "assume checked qualifier for unqualified global declarations",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "impcheckmodglobs",
+  FLG_IMPCHECKMODGLOBALS,
+  "assume checkmod qualifier for unqualified global declarations",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "impcheckedstrictglobs",
+  FLG_IMPCHECKEDSTRICTGLOBALS,
+  "assume checkedstrict qualifier for unqualified global declarations",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "impcheckedstatics",
+  FLG_IMPCHECKEDSTATICS,
+  "assume checked qualifier for unqualified file static declarations",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "impcheckmodstatics",
+  FLG_IMPCHECKMODSTATICS,
+  "assume checkmod qualifier for unqualified file static declarations",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "impcheckmodinternals",
+  FLG_IMPCHECKMODINTERNALS,
+  "assume checkmod qualifier for unqualified local "
+	"static declarations (for internal state modifications)",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_UNSPEC, modeFlag,
+  "impcheckedstrictstatics",
+  FLG_IMPCHECKEDSTRICTSTATICS,
+  "assume checkedstrict qualifier for unqualified file static declarations",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_MODIFIES, modeFlag,
+  "modglobs",
+  FLG_MODGLOBS,
+  "undocumented modification of a checked global variable",
+  "A checked global variable is modified by the function, but not listed in "
+     "its modifies clause.",
+  0, 0
+  },
+{
+  FK_GLOBALS, FK_MODIFIES, modeFlag,
+  "modglobsnomods",
+  FLG_MODGLOBSUNSPEC,
+  "undocumented modification of a checked global variable in a function "
+	"declared with no modifies clause",
+  "A checked global variable is modified by the function, but not listed in "
+     "its modifies clause.",
+  0, 0
+  },
+{
+  FK_GLOBALS, FK_MODIFIES, modeFlag,
+  "modstrictglobsnomods",
+  FLG_MODSTRICTGLOBSUNSPEC,
+  "undocumented modification of a strict checked global variable in a "
+	"function declared with no modifies clause",
+  "A checked global variable is modified by the function, but not listed in "
+     "its modifies clause.",
+  0, 0
+  },
+{
+  FK_GLOBALS, FK_MODIFIES, modeFlag,
+  "modglobsunchecked",
+  FLG_MODGLOBSUNCHECKED,
+  "undocumented modification of an unchecked checked global variable",
+  "An unchecked global variable is modified by the function, but not listed in "
+     "its modifies clause.",
+  0, 0
+  },
+{
+  FK_HEADERS, FK_DEBUG, debugFlag,
+  "keep",
+  FLG_KEEP,
+  NULL, NULL,
+  0, 0
+  },
+{
+  FK_HEADERS, FK_SPEC, globalFlag,
+  "lh",
+  FLG_DOLH,
+  "generate .lh files", NULL,
+  0, 0
+  },
+{
+  FK_HEADERS, FK_SPEC, globalFlag,
+  "lcs",
+  FLG_DOLCS,
+  "generate .lcs files", NULL,
+  0, 0
+  },
+{
+  FK_HEADERS, FK_SPEED, globalFlag,
+  "singleinclude",
+  FLG_SINGLEINCLUDE,
+  "optimize header inclusion to eliminate redundant includes",
+  "When checking multiple files, each header file is processed only "
+	"once. This may change the meaning of the code, if the "
+	"same header file is included in different contexts (e.g., the "
+	"header file includes #if directives and the values are "
+	"different when it is included in different places.)",
+   0, 0
+  },
+{
+  FK_HEADERS, FK_SPEED, globalFlag,
+  "neverinclude",
+  FLG_NEVERINCLUDE,
+  "optimize header inclusion to not include any header files",
+  "Ignore header includes. Only works if relevant information is "
+	"loaded from a library.",
+   0, 0
+  },
+{
+  FK_HEADERS, FK_SPEED, globalFlag,
+  "skipsysheaders",
+  FLG_SKIPSYSHEADERS,
+  "do not include header files in system directories (set by -sysdirs)",
+  "Do not include header files in system directories (set by -sysdirs)",
+   0, 0
+  },
+{
+  FK_HELP, FK_NONE, plainFlag,
+  "warnflags",
+  FLG_WARNFLAGS,
+  "warn when command line sets flag to default value in mode",
+  NULL, 0, 0
+  },
+{
+  FK_HELP, FK_NONE, plainFlag,
+  "warnunixlib",
+  FLG_WARNUNIXLIB,
+  "warn when the unix library is used",
+  NULL, 0, 0
+  },
+{
+  FK_HELP, FK_NONE, plainFlag,
+  "badflag",
+  FLG_BADFLAG,
+  "a flag is not recognized or used in an incorrect way",
+  NULL, 0, 0
+  },
+{
+  FK_HELP, FK_NONE, plainFlag,
+  "forcehints",
+  FLG_FORCEHINTS,
+  "provide hints for all errors reported",
+  NULL, 0, 0
+  },
+{
+  FK_HELP, FK_NONE, globalExtraArgFlag,
+  "help",
+  FLG_HELP,
+  "-help  will describe flags",
+  NULL, 0, 0
+  },
+{
+  FK_HELP, FK_FORMAT, plainFlag,
+  "hints",
+  FLG_HINTS,
+  "provide hints on using lclint (hint only reported for first related error)",
+  NULL, 0, 0
+  },
+{
+  FK_IGNORERET, FK_NONE, specialFlag,
+  "retval",
+  FLG_RETVAL,
+  "return value ignored (sets retvalint, retvalbool and retvalother)",
+  "Result returned by function call is not used. If this is intended, "
+	"cast result to (void) to eliminate message.",
+  0, 0
+  },
+{
+  FK_IGNORERET, FK_BOOL, modeFlag,
+  "retvalother",
+  FLG_RETVALOTHER,
+  "return value of type other than bool or int ignored",
+  "Result returned by function call is not used. If this is intended, "
+	"can cast result to (void) to eliminate message.",
+  0, 0
+  },
+{
+  FK_IGNORERET, FK_BOOL, modeFlag,
+  "retvalbool",
+  FLG_RETVALBOOL,
+  "return value of type bool ignored",
+  "Result returned by function call is not used. If this is intended, "
+	"can cast result to (void) to eliminate message.",
+  0, 0
+  },
+{
+  FK_IGNORERET, FK_NONE, modeFlag,
+  "retvalint",
+  FLG_RETVALINT,
+  "return value of type int ignored",
+  "Result returned by function call is not used. If this is intended, "
+	"can cast result to (void) to eliminate message.",
+  0, 0
+  },
+{
+  FK_INIT, FK_FILES, globalExtraArgFlag,
+  "f",
+  FLG_OPTF,
+  "load options file (default ~/.lclintrc not loaded)",
+  NULL, 0, 0
+  },
+{
+  FK_INIT, FK_FILES, globalExtraArgFlag,
+  "i",
+  FLG_INIT,
+  "set LCL initilization file",
+  NULL, 0, 0
+  },
+{
+  FK_INIT, FK_FILES, globalFlag,
+  "nof",
+  FLG_NOF,
+  "do not read options file",
+  NULL, 0, 0
+  },
+{
+  FK_INIT, FK_SPEC, plainFlag,
+  "needspec",
+  FLG_NEEDSPEC,
+  "information in specifications is not also included in syntactic comments",
+  "There is information in the specification that is not duplicated "
+     "in syntactic comments. Normally, this is not an "
+     "error, but it may be useful to detect it to make "
+     "sure checking incomplete systems without the specifications will "
+     "still use this information.",
+   0, 0
+  },
+{
+  FK_DECL, FK_LIBS, plainFlag,
+  "newdecl",
+  FLG_NEWDECL,
+  "report new global declarations in source files",
+  "There is a new declaration that is not declared in a loaded library "
+	"or earlier file.  (Use this flag to check for consistency "
+	"against a library.)",
+   0, 0
+  },
+{
+  FK_ITER, FK_NONE, plainFlag,
+  "iter",
+  FLG_ITER,
+  NULL, NULL,
+  0, 0
+  },
+{
+  FK_ITER, FK_NONE, plainFlag,
+  "hasyield",
+  FLG_HASYIELD,
+  "iter declaration has no yield parameters",
+  "An iterator has been declared with no parameters annotated with "
+	"yield. This may be what you want, if the iterator is meant "
+    	"to do something a fixed number of times, but returns no "
+ 	"information to the calling context. Probably, a parameter "
+	"is missing the yield annotation to indicate that it is "
+	"assigned a value in the calling context.",
+  0, 0
+  },
+{
+  FK_LIBS, FK_FILES, globalStringFlag,
+  "dump",
+  FLG_DUMP,
+  "save state for merging (default suffix .lcd)",
+  NULL, 0, 0
+  },
+{
+  FK_LIBS, FK_FILES, globalStringFlag,
+  "load",
+  FLG_MERGE,
+  "load state from dump file (default suffix .lcd)",
+  NULL, 0, 0
+  },
+{
+  FK_LIBS, FK_INIT, idemGlobalFlag,
+  "nolib",
+  FLG_NOLIB,
+  "do not load standard library",
+  NULL, 0, 0
+  },
+{
+  FK_LIBS, FK_INIT, globalFlag,
+  "ansilib",
+  FLG_ANSILIB,
+  "use ANSI (ISO) standard library",
+  "Library based on the ANSI standard library specification is used.", 
+   0, 0
+  },
+{
+  FK_LIBS, FK_INIT, globalFlag,
+  "strictlib",
+  FLG_STRICTLIB,
+  "interpret standard library strictly",
+  "Stricter version of the standard library is used. (The default "
+   "library is standard.lcd;  strict library is strict.lcd.)", 
+   0, 0
+  },
+{
+  FK_LIBS, FK_INIT, globalFlag,
+  "unixlib",
+  FLG_UNIXLIB,
+  "use UNIX (sort-of) standard library",
+  "UNIX version of the standard library is used.",
+   0, 0
+  },
+{
+  FK_LIBS, FK_INIT, globalFlag,
+  "unixstrictlib",
+  FLG_UNIXSTRICTLIB,
+  "use strict version of UNIX (sort-of) library",
+  "strict version of the UNIX library is used.",
+   0, 0
+  },
+{
+  FK_LIBS, FK_INIT, globalFlag,
+  "posixlib",
+  FLG_POSIXLIB,
+  "use POSIX standard library",
+  "POSIX version of the standard library is used.",
+   0, 0
+  },
+{
+  FK_LIBS, FK_INIT, globalFlag,
+  "posixstrictlib",
+  FLG_POSIXSTRICTLIB,
+  "use strict POSIX standard library",
+  "POSIX version of the strict standard library is used.",
+   0, 0
+  },
+{
+  FK_LIBS, FK_INIT, globalFlag,
+  "whichlib",
+  FLG_WHICHLIB,
+  "show standard library filename",
+  NULL, 0, 0
+  },
+{
+  FK_INIT, FK_COMMENTS, valueFlag,
+  "commentchar",
+  FLG_COMMENTCHAR,
+  "set marker character for syntactic comments (default is '@')",
+  "Set the marker character for syntactic comments. Comments beginning "
+	"with /* are interpreted by lclint, where  is the "
+	"comment marker character.",
+   0, 0
+  },
+{
+  FK_MACROS, FK_NONE, plainSpecialFlag,
+  "allmacros",
+  FLG_ALLMACROS,
+  "sets fcnmacros and constmacros",
+  "All macros (not preceded by /*@notfunction@*/) are checked as functions or "
+	"constants depending on whether or not they have parameter lists.",
+  0, 0	
+  },
+{
+  FK_MACROS, FK_NONE, plainFlag,
+  "libmacros",
+  FLG_LIBMACROS,
+  "check all macros with declarations in library as functions",
+  "Every macro declared in the load library is checked.",
+  0, 0	
+  },
+{
+  FK_MACROS, FK_NONE, plainFlag,
+  "specmacros",
+  FLG_SPECMACROS,
+  "check all macros corresponding to specified functions or constants",
+  "Every macro declared a specification file is checked.",
+  0, 0	
+  },
+{
+  FK_MACROS, FK_NONE, plainFlag,
+  "fcnmacros",
+  FLG_FCNMACROS,
+  "check all macros with parameter lists as functions",
+  "Every parameterized macro (not preceded by /*@notfunction@*/) "
+	"is checked as a function.",
+  0, 0	
+  },
+{
+  FK_MACROS, FK_NONE, plainFlag,
+  "constmacros",
+  FLG_CONSTMACROS,
+  "check all macros without parameter lists as constants",
+  "Every non-parameterized macro (not preceded by /*@notfunction@*/) "
+	"is checked as a constant.",
+  0, 0	
+  },
+{
+  FK_MACROS, FK_NONE, modeFlag,
+  "macromatchname",
+  FLG_MACROMATCHNAME,
+  "macro definition does not match iter or constant declaration",
+  "A iter or constant macro is defined using a different name from the "
+    "one used in the previous syntactic comment",
+  0, 0
+  },
+{
+  FK_MACROS, FK_NONE, plainFlag,
+  "nextlinemacros",
+  FLG_MACRONEXTLINE,
+  "the line after a constant or iter declaration must be a macro definition",
+  "A constant or iter declaration is not immediately followed by a macro definition.",
+  0, 0
+  },
+{
+  FK_MACROS, FK_NONE, modeFlag,
+  "macrostmt",
+  FLG_MACROSTMT,
+  "macro definition is syntactically not equivalent to function",
+  "A macro is defined in a way that may cause syntactic problems. If the macro returns a value, use commas to separate expressions;  otherwise, use do {  } while (FALSE) construct.",
+  0, 0
+  },
+{
+  FK_MACROS, FK_NONE, modeFlag,
+  "macroempty",
+  FLG_MACROEMPTY,
+  "macro definition for is empty",
+  "A macro definition has no body.",
+  0, 0
+  },
+{
+  FK_MACROS, FK_PARAMS, modeFlag,
+  "macroparams",
+  FLG_MACROPARAMS,
+  "macro parameter not used exactly once",
+  "A macro parameter is not used exactly once in all possible "
+	"invocations of the macro. To behave like a function, "
+	"each macro parameter must be used exactly once on all "
+	"invocations of the macro so that parameters with "
+	"side-effects are evaluated exactly once. Use /*@sef@*/ to "
+	"denote parameters that must be side-effect free.",
+  0, 0
+  },
+{
+  FK_MACROS, FK_PARAMS, modeFlag,
+  "macroassign",
+  FLG_MACROASSIGN,
+  "assignment to a macro parameter",
+  "A macro parameter is used as the left side of an "
+	"assignment expression. This exhibits behavior that "
+	"could not be implemented by a function.", 
+  0, 0
+  },
+{
+  FK_MACROS, FK_PARAMS, modeFlag,
+  "sefparams",
+  FLG_SEFPARAMS,
+  "a parameter with side-effects is passed as a sef parameter",
+  "An actual parameter corresponding to a sef parameter may have a side-effect.",
+  0, 0
+  },
+{
+  FK_MACROS, FK_PARAMS, modeFlag,
+  "sefuncon",
+  FLG_SEFUNSPEC,
+  "a parameter with unconstrained side-effects is passed as a sef parameter",
+  "An actual parameter corresponding to a sef parameter involves a call "
+	"to a procedure with no modifies clause that may have a side-effect.",
+  0, 0
+  },
+{
+  FK_MACROS, FK_NONE, modeFlag,
+  "macroparens",
+  FLG_MACROPARENS,
+  "macro parameter used without parentheses (in potentially dangerous context)",
+  "A macro parameter is used without parentheses. This could be "
+	"dangerous if the macro is invoked with a complex expression "
+	"and precedence rules will change the evaluation inside the macro.",
+  0, 0
+  },
+{
+  FK_MACROS, FK_PROTOS, modeFlag,
+  "macrodecl",
+  FLG_MACRODECL,
+  "macro without prototype or specification (sets macrofcndecl and macroconstdecl)",
+  "Argument checking cannot be done well for macros without prototypes "
+	"or specifications, since the types of the arguments are unknown.",
+  0, 0
+  },
+{
+  FK_MACROS, FK_PROTOS, modeFlag,
+  "macrofcndecl",
+  FLG_MACROFCNDECL,
+  "parameterized macro without prototype or specification",
+  "Function macro has no declaration.",
+  0, 0
+  },
+{
+  FK_MACROS, FK_PROTOS, modeFlag,
+  "macroconstdecl",
+  FLG_MACROCONSTDECL,
+  "non-parameterized macro without prototype or specification",
+  "Macro constant has no declaration. Use /*@constant ...@*/ to "
+	"declare the macro.",
+  0, 0
+  },
+{
+  FK_MACROS, FK_NONE, modeFlag,
+  "macroredef",
+  FLG_MACROREDEF,
+  "macro redefined",
+  "A macro is defined in more than one place.", 0, 0
+  },
+{
+  FK_MACROS, FK_UNRECOG, modeFlag,
+  "macrounrecog",
+  FLG_MACROUNDEF,
+  "unrecognized identifier in macro",
+  "An unrecognized identifier appears in a macro. If the identifier "
+	"is defined before the macro is used, then this is okay.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_DEAD, modeFlag,
+  "stackref",
+  FLG_RETSTACK,
+  "external reference to stack-allocated storage is created",
+  "A stack reference is pointed to by an external reference when the "
+	"function returns. The stack-allocated storage is destroyed "
+	"after the call, leaving a dangling reference.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_DEAD, modeFlag,
+  "usereleased",
+  FLG_USERELEASED,
+  "storage used after release",
+  "Memory is used after it has been released (either by passing "
+	"as an only param or assigning to and only global.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_DEAD, modeFlag,
+  "strictusereleased",
+  FLG_STRICTUSERELEASED,
+  "element used after it may have been released",
+  "Memory (through fetch) is used after it may have been released "
+	"(either by passing as an only param or assigning to and only global.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_DEF, modeFlag,
+  "compdef",
+  FLG_COMPDEF,
+  "parameter, return value or global completely defined",
+  "Storage derivable from a parameter, return value or global is "
+	"not defined. Use /*@out@*/ to denote passed or returned "
+	"storage which need not be defined.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_DEF, modeFlag,
+  "compmempass",
+  FLG_COMPMEMPASS,
+  "actual parameter matches alias kind of formal parameter completely ",
+  "Storage derivable from a parameter does not match the alias kind "
+	"expected for the formal parameter.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_DEF, modeFlag,
+  "mustdefine",
+  FLG_MUSTDEFINE,
+  "out storage not defined before return or scope exit",
+  "An out parameter or global is not defined before control is transferred.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_DEF, modeFlag,
+  "uniondef",
+  FLG_UNIONDEF,
+  "at least one field of a union must be defined",
+  "No field of a union is defined. Generally, one field of a union is "
+	"expected to be defined.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_IMPLICIT, modeFlag,
+  "memimp",
+  FLG_MEMIMPLICIT,
+  "memory errors for unqualified storage",
+  NULL, 0, 0
+  },
+{
+  FK_MEMORY, FK_IMPLICIT, plainFlag,
+  "paramimptemp",
+  FLG_PARAMIMPTEMP,
+  "assume unannotated parameter is temp",
+  NULL, 0, 0
+  },
+{
+  FK_MEMORY, FK_IMPLICIT, specialFlag,
+  "allimponly",
+  FLG_ALLIMPONLY,
+  "sets globimponly, retimponly, structimponly, specglobimponly, "
+	"specretimponly and specstructimponly",  
+  NULL, 0, 0
+  },	
+{
+  FK_MEMORY, FK_IMPLICIT, specialFlag,
+  "codeimponly",
+  FLG_CODEIMPONLY,
+  "sets globimponly, retimponly and structimponly",
+  NULL, 0, 0
+  },	
+{
+  FK_MEMORY, FK_IMPLICIT, specialFlag,
+  "specimponly",
+  FLG_SPECALLIMPONLY,
+  "sets specglobimponly, specretimponly and specstructimponly",
+  NULL, 0, 0
+  },	
+{
+  FK_MEMORY, FK_IMPLICIT, plainFlag,
+  "globimponly",
+  FLG_GLOBIMPONLY,
+  "assume unannotated global storage is only",
+  NULL, 0, 0
+  },
+{
+  FK_MEMORY, FK_IMPLICIT, plainFlag,
+  "retimponly",
+  FLG_RETIMPONLY,
+  "assume unannotated returned storage is only",
+  NULL, 0, 0
+  },
+{
+  FK_MEMORY, FK_IMPLICIT, plainFlag,
+  "structimponly",
+  FLG_STRUCTIMPONLY,
+  "assume unannotated structure field is only",
+  NULL, 0, 0
+  },
+{
+  FK_MEMORY, FK_IMPLICIT, plainFlag,
+  "specglobimponly",
+  FLG_SPECGLOBIMPONLY,
+  "assume unannotated global storage is only",
+  NULL, 0, 0
+  },
+{
+  FK_MEMORY, FK_IMPLICIT, plainFlag,
+  "specretimponly",
+  FLG_SPECRETIMPONLY,
+  "assume unannotated returned storage is only",
+  NULL, 0, 0
+  },
+{
+  FK_MEMORY, FK_IMPLICIT, plainFlag,
+  "specstructimponly",
+  FLG_SPECSTRUCTIMPONLY,
+  "assume unannotated structure field is only",
+  NULL, 0, 0
+  },
+{
+  FK_MEMORY, FK_ARRAY, modeFlag,
+  "deparrays",
+  FLG_DEPARRAYS,
+  "array elements are dependent storage",
+  "When an element is fetched from an array, lclint analysis is "
+	"not able to determine if the same element is reused. "
+	"If +deparrays, lclint will mark local storage assigned from "
+	"array fetches as dependent.", 
+      0, 0
+  },
+{
+  FK_MEMORY, FK_LEAK, modeFlag,
+  "compdestroy",
+  FLG_COMPDESTROY,
+  "all only references derivable from void pointer out only parameter are released",
+  "A storage leak due to incomplete deallocation of a structure or deep "
+	"pointer is suspected. Unshared storage that is reachable from "
+	"a reference that is being deallocated has not yet been deallocated. "
+	"LCLint assumes when an object is passed "
+	"as an out only void pointer that the outer object will be "
+	"deallocated, but the inner objects will not.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_LEAK, modeFlag,
+  "strictdestroy",
+  FLG_STRICTDESTROY,
+  "report complete destruction errors for array elements that "
+	"may have been released",
+  NULL,
+  0, 0	
+  },	
+{
+  FK_MEMORY, FK_LEAK, modeFlag,
+  "mustfree",
+  FLG_MUSTFREE,
+  "only storage not released before return or scope exit",
+  "A memory leak has been detected. Newly-allocated or "
+	"only-qualified storage is not released before the last "
+	"reference to it is lost.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "branchstate",
+  FLG_BRANCHSTATE,
+  "storage has inconsistent states of alternate paths through a branch",
+  "The state of a variable is different depending on which branch "
+	"is taken. This means no annotation can sensibly be applied "
+	"to the storage.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "strictbranchstate",
+  FLG_STRICTBRANCHSTATE,
+  "storage through array fetch has inconsistent states of alternate "
+	"paths through a branch",
+  "The state of a variable through an array fetch is different depending "
+   "on which branch is taken. This means no annotation can sensibly be applied "
+   "to the storage.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, specialFlag,
+  "memchecks",
+  FLG_MEMCHECKS,
+  "sets all dynamic memory checking flags (memimplicit, mustfree, mustdefine, "
+	"mustnotalias, null, memtrans)",
+  NULL, 0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, specialFlag,
+  "memtrans",
+  FLG_MEMTRANS,
+  "memory transfer errors (sets all *trans flags)",
+  "Memory is transferred in a way that violates annotations.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "exposetrans",
+  FLG_EXPOSETRANS,
+  "exposure transfer errors",
+  "Exposed storage is transferred to a non-exposed, non-observer reference.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "observertrans",
+  FLG_OBSERVERTRANS,
+  "observer transfer errors",
+  "Observer storage is transferred to a non-observer reference.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "dependenttrans",
+  FLG_DEPENDENTTRANS,
+  "dependent transfer errors",
+  "Dependent storage is transferred to a non-dependent reference.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "newreftrans",
+  FLG_NEWREFTRANS,
+  "new reference transfer to reference counted reference",
+  "A new reference is transferred to a reference counted reference.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "onlytrans",
+  FLG_ONLYTRANS,
+  "only storage transferred to non-only reference (memory leak)",
+  "The only reference to this storage is transferred to another "
+	"reference (e.g., by returning it) that does not have the "
+	"only annotation. This may lead to a memory leak, since the "
+	"new reference is not necessarily released.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "onlyunqglobaltrans",
+  FLG_ONLYUNQGLOBALTRANS,
+  "only storage transferred to an unqualified global or "
+	"static reference (memory leak)",
+  "The only reference to this storage is transferred to another "
+	"reference that does not have an aliasing annotation. "
+	"This may lead to a memory leak, since the "
+	"new reference is not necessarily released.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "ownedtrans",
+  FLG_OWNEDTRANS,
+  "owned storage transferred to non-owned reference (memory leak)",
+  "The owned reference to this storage is transferred to another "
+	"reference (e.g., by returning it) that does not have the "
+	"owned annotation. This may lead to a memory leak, since the "
+	"new reference is not necessarily released.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "freshtrans",
+  FLG_FRESHTRANS,
+  "fresh storage transferred to non-only reference (memory leak)",
+  "Fresh storage (newly allocated in this function) is transferred "
+	"in a way that the obligation to release storage is not "
+	"propagated.  Use the /*@only@*/ annotation to indicate "
+	"the a return value is the only reference to the returned "
+	"storage.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "sharedtrans",
+  FLG_SHAREDTRANS,
+  "shared storage transferred to non-shared reference",
+  "Shared storage is transferred to a non-shared reference. The other "
+	"reference may release storage needed by this reference.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "temptrans",
+  FLG_TEMPTRANS,
+  "temp storage transferred to non-temporary reference",
+  "Temp storage (associated with a formal parameter) is transferred "
+	"to a non-temporary reference. The storage may be released "
+	"or new aliases created.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "kepttrans",
+  FLG_KEPTTRANS,
+  "kept storage transferred to non-temporary reference",
+  "Kept storage is transferred "
+	"to a non-temporary reference. The storage may be released "
+	"or new aliases created.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "keeptrans",
+  FLG_KEEPTRANS,
+  "keep storage transferred inconsistently",
+  "Keep storage is transferred inconsistently --- either in a way "
+	"that may add a new alias to it, or release it.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "immediatetrans",
+  FLG_IMMEDIATETRANS,
+  "an immediate address (result of &) is transferred inconsistently",
+  "An immediate address (result of & operator) is transferred "
+	"inconsistently.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "refcounttrans",
+  FLG_REFCOUNTTRANS,
+  "reference counted storage is transferred in an inconsistent way",
+   "Reference counted storage is transferred in a way that may not "
+	"be consistent with the reference count.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "statictrans",
+  FLG_STATICTRANS,
+  "static storage is transferred in an inconsistent way",
+  "Static storage is transferred in an inconsistent way.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "unqualifiedtrans",
+  FLG_UNKNOWNTRANS,
+  "unqualified storage is transferred in an inconsistent way",
+  "Unqualified storage is transferred in an inconsistent way.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "staticinittrans",
+  FLG_STATICINITTRANS,
+  "static storage is used as an initial value in an inconsistent way",
+  "Static storage is used as an initial value in an inconsistent way.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "unqualifiedinittrans",
+  FLG_UNKNOWNINITTRANS,
+  "unqualified storage is used as an initial value in an inconsistent way",
+  "Unqualified storage is used as an initial value in an inconsistent way.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "readonlystrings",
+  FLG_READONLYSTRINGS,
+  "string literals are read-only (error if one is modified or released)",
+  "String literals are read-only (ANSI semantics). An error is reported "
+	"if a string literal may be modified or released.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_NONE, modeFlag,
+  "readonlytrans",
+  FLG_READONLYTRANS,
+  "report memory transfer errors for initializations to read-only string literals",
+  "A read-only string literal is assigned to a non-observer reference.",
+  0, 0
+  },
+{
+  FK_MEMORY, FK_PARAMS, modeFlag,
+  "passunknown",
+  FLG_PASSUNKNOWN,
+  "passing a value as an un-annotated parameter clears its annotation",
+  NULL, 0, 0
+  },
+{
+  FK_MODIFIES, FK_SPEC, plainFlag,
+  "mods",
+  FLG_MODIFIES,
+  "unspecified modification of caller-visible state",
+  "An externally-visible object is modified by a function, but not "
+	"listed in its modifies clause.",
+  0, 0
+  },
+{
+  FK_MODIFIES, FK_SPEC, modeFlag,
+  "mustmod",
+  FLG_MUSTMOD,
+  "specified modification is not detected",
+  "An object listed in the modifies clause is not modified by the "
+	"implementation of the function. The modification may not "
+	"be detected if it is done through a call to an unspecified "
+	"function.",
+  0, 0
+  },
+{
+  FK_MODIFIES, FK_MEMORY, plainFlag,
+  "modobserver",
+  FLG_MODOBSERVER,
+  "possible modification of observer storage",
+  "Storage declared with observer is possibly modified. Observer "
+	"storage may not be modified.",
+  0, 0
+  },
+{
+  FK_MODIFIES, FK_MEMORY, modeFlag,
+  "modobserveruncon",
+  FLG_MODOBSERVERUNCON,
+  "possible modification of observer storage through unconstrained call",
+  "Storage declared with observer may be modified through a call to an "
+	"unconstrained function.",
+  0, 0
+  },
+{
+  FK_MODIFIES, FK_MEMORY, modeFlag,
+  "modinternalstrict",
+  FLG_MODINTERNALSTRICT,
+  "possible modification of internal storage through function call",
+  "A function that modifies internalState is called from a function that "
+	"does not list internalState in its modifies clause",
+  0, 0
+  },
+{
+  FK_MODIFIES, FK_UNSPEC, modeFlag,
+  "modfilesys",
+  FLG_MODFILESYSTEM,
+  "report undocumented file system modifications (applies to unspecified "
+	"functions if modnomods is set)", 
+  NULL, 0, 0
+  },
+{
+  FK_MODIFIES, FK_UNSPEC, specialFlag,
+  "modunspec",
+  FLG_MODUNSPEC,
+  "modification in unspecified functions (sets modnomods, "
+	"modglobunspec and modstrictglobsunspec)",
+  NULL, 0, 0
+  },
+{
+  FK_MODIFIES, FK_UNSPEC, modeFlag,
+  "modnomods",
+  FLG_MODNOMODS,
+  "modification in a function with no modifies clause",
+  "An externally-visible object is modified by a function with no "
+    	"/*@modifies@*/ comment. The /*@modifies ... @*/ control "
+	"comment can be used to give a modifies list for an "
+	"unspecified function.",
+  0, 0
+  },
+{
+  FK_MODIFIES, FK_UNSPEC, modeFlag,
+  "moduncon",
+  FLG_MODUNCON,
+  "possible modification through a call to an unconstrained function",
+  "An unconstrained function is called in a function body where "
+	"modifications are checked. Since the unconstrained function "
+	"may modify anything, there may be undetected modifications in "
+	"the checked function.",
+  0, 0
+  },
+{
+  FK_MODIFIES, FK_UNSPEC, modeFlag,
+  "modunconnomods",
+  FLG_MODUNCONNOMODS,
+  "possible modification through a call to an unconstrained function in "
+	"a function with no modifies clause",
+  "An unconstrained function is called in a function body where "
+	"modifications are checked. Since the unconstrained function "
+	"may modify anything, there may be undetected modifications in "
+	"the checked function.",
+  0, 0
+  },
+{
+  FK_MODIFIES, FK_GLOBALS, modeFlag,
+  "globsimpmodsnothing",
+  FLG_GLOBALSIMPMODIFIESNOTHING,
+  "functions declared with a globals list but no modifies clause are "
+	"assumed to modify nothing",
+  "An implicit modifies nothing clause is assumed for a function "
+	"declared with a globals list but not modifies clause.",
+  0, 0
+  },
+{
+  FK_MODIFIES, FK_GLOBALS, modeFlag,
+  "modsimpnoglobs",
+  FLG_MODIFIESIMPNOGLOBALS,
+  "functions declared with a modifies clause but no globals list "
+	"are assumed to use no globals",
+  "An implicit empty globals list is assumed for a function "
+	"declared with a modifies clause but no globals list.",
+  0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "namechecks",
+  FLG_NAMECHECKS,
+  "controls name checking without changing other settings",
+  NULL, 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, specialFlag,
+  "czech",
+  FLG_CZECH,
+  "czech naming convention (sets accessczech, czechfunctions, czechvars, "
+	"czechconstants, czechenums, and czechmacros)",
+  "Name is not consistent with Czech naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "czechfcns",
+  FLG_CZECHFUNCTIONS,
+  "czech naming convention violated in a function or iterator declaration",
+  "Function or iterator name is not consistent with Czech naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "czechvars",
+  FLG_CZECHVARS,
+  "czech naming convention violated in a variable declaration",
+  "Variable name is not consistent with Czech naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "czechmacros",
+  FLG_CZECHMACROS,
+  "czech naming convention violated in an expanded macro name",
+  "Expanded macro name is not consistent with Czech naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "czechconsts",
+  FLG_CZECHCONSTANTS,
+  "czech naming convention violated in a constant declaration",
+  "Constant name is not consistent with Czech naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "czechtypes",
+  FLG_CZECHTYPES,
+  "czech naming convention violated in a user-defined type definition",
+  "Type name is not consistent with Czech naming convention. Czech type "
+	"names must not use the underscore character.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, specialFlag,
+  "slovak",
+  FLG_SLOVAK,
+  "slovak naming convention violated",
+  "Name is not consistent with Slovak naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "slovakfcns",
+  FLG_SLOVAKFUNCTIONS,
+  "slovak naming convention violated in a function or iterator declaration",
+  "Function or iterator name is not consistent with Slovak naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "slovakmacros",
+  FLG_SLOVAKMACROS,
+  "slovak naming convention violated in an expanded macro name",
+  "Expanded macro name is not consistent with Slovak naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "slovakvars",
+  FLG_SLOVAKVARS,
+  "slovak naming convention violated in a variable declaration",
+  "Variable name is not consistent with Slovak naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "slovakconsts",
+  FLG_SLOVAKCONSTANTS,
+  "slovak naming convention violated in a constant declaration",
+  "Constant name is not consistent with Slovak naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "slovaktypes",
+  FLG_SLOVAKTYPES,
+  "slovak naming convention violated in a use-defined type definition",
+  "Type name is not consistent with Slovak naming convention. Slovak type "
+	"names may not include uppercase letters.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, specialFlag,
+  "czechoslovak",
+  FLG_CZECHOSLOVAK,
+  "czech or slovak naming convention violated",
+  "Name is not consistent with either Czech or Slovak naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "czechoslovakfcns",
+  FLG_CZECHOSLOVAKFUNCTIONS,
+  "czechoslovak naming convention violated in a function or iterator declaration",
+  "Function name is not consistent with Czechoslovak naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "czechoslovakmacros",
+  FLG_CZECHOSLOVAKMACROS,
+  "czechoslovak naming convention violated in an expanded macro name",
+  "Expanded macro name is not consistent with Czechoslovak naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "czechoslovakvars",
+  FLG_CZECHOSLOVAKVARS,
+  "czechoslovak naming convention violated in a variable declaration",
+  "Variable name is not consistent with Czechoslovak naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "czechoslovakconsts",
+  FLG_CZECHOSLOVAKCONSTANTS,
+  "czechoslovak naming convention violated in a constant declaration",
+  "Constant name is not consistent with Czechoslovak naming convention.", 0, 0
+  },
+{
+  FK_NAMES, FK_ABSTRACT, plainFlag,
+  "czechoslovaktypes",
+  FLG_CZECHOSLOVAKTYPES,
+  "czechoslovak naming convention violated in a user-defined type definition",
+  "Type name is not consistent with Czechoslovak naming convention. Czechoslovak "
+	"type names may not include uppercase letters or the underscore character.", 0, 0
+  },
+{
+  FK_NAMES, FK_ANSI, modeFlag,
+  "ansireserved",
+  FLG_ANSIRESERVED,
+  "external name conflicts with name reserved for system or standard library",
+  "External name is reserved for system in ANSI standard.",
+  0, 0
+  },
+{
+  FK_NAMES, FK_ANSI, modeFlag,
+  "cppnames",
+  FLG_CPPNAMES,
+  "external or internal name is a C++ keyword or reserved word",
+  "External name is a C++ keyword or reserved word. "
+	"This could lead to problems if the "
+	"code is compiled with a C++ compiler.",
+  0, 0
+  },
+{
+  FK_NAMES, FK_ANSI, modeFlag,
+  "ansireservedinternal",
+  FLG_ANSIRESERVEDLOCAL,
+  "internal name conflicts with name reserved for system or standard library",
+  "Internal name is reserved for system in ANSI standard.",
+  0, 0
+  },
+{
+  FK_NAMES, FK_ANSI, plainFlag,
+  "distinctexternalnames",
+  FLG_DISTINCTEXTERNALNAMES,
+  "external name is not distinguishable from another external name using "
+	"the number of significant characters",
+  "An external name is not distinguishable from another external name "
+	"using the number of significant characters. According to "
+	"ANSI Standard (3.1), an implementation may only consider the first 6 "
+	"characters significant, and ignore alphabetical case "
+	"distinctions. The "
+	"+externalnamelen  flag may be used to change the number "
+	"of significant characters, and -externalnamecaseinsensitive to make "
+	"alphabetical case significant in external names.",
+  0, 0
+  },
+{
+  FK_NAMES, FK_ANSI, specialValueFlag,
+  "externalnamelen",
+  FLG_EXTERNALNAMELEN,
+  "set the number of significant characters in an external name",
+  "Sets the number of significant characters in an external name (ANSI "
+	"default is 6.)  Sets +distinctexternalnames.",
+  0, 0
+  },
+{
+  FK_NAMES, FK_ANSI, plainSpecialFlag,
+  "externalnamecaseinsensitive",
+  FLG_EXTERNALNAMECASEINSENSITIVE,
+  "alphabetic comparisons for external names are case-insensitive",
+  "Make alphabetic case insignificant in external names. By ANSI "
+	"standard, case need not be significant in an external name. "
+	"If +distinctexternalnames is not set, sets "
+	"+distinctexternalnames with unlimited external name length.",
+  0, 0
+  },
+{
+  FK_NAMES, FK_ANSI, plainFlag,
+  "distinctinternalnames",
+  FLG_DISTINCTINTERNALNAMES,
+  "internal name is not distinguishable from another internal name using "
+	"the number of significant characters",
+  "An internal name is not distinguishable from another internal name "
+	"using the number of significant characters. According to "
+	"ANSI Standard (3.1), an implementation may only consider the first 31 "
+	"characters significant. The "
+	"+internalnamelen  flag changes the number "
+	"of significant characters, -internalnamecaseinsensitive to makes "
+	"alphabetical case significant, and "
+	"+internalnamelookalike to make similar-looking characters "
+	"non-distinct.",
+  0, 0
+  },
+{
+  FK_NAMES, FK_ANSI, specialValueFlag,
+  "internalnamelen",
+  FLG_INTERNALNAMELEN,
+  "set the number of significant characters in an internal name",
+  "Sets the number of significant characters in an internal name (ANSI "
+	"default is 31.)  Sets +distinctinternalnames.",
+  0, 0
+  },
+{
+  FK_NAMES, FK_ANSI, plainSpecialFlag,
+  "internalnamecaseinsensitive",
+  FLG_INTERNALNAMECASEINSENSITIVE,
+  "set whether case is significant an internal names "
+	"(-internalnamecaseinsensitive means case is significant)" ,
+  "Set whether case is significant an internal names "
+	"(-internalnamecaseinsensitive "
+	"means case is significant). By ANSI default, case is not "
+	"significant.  If +distinctinternalnames is not set, sets "
+	"+distinctinternalnames with unlimited internal name length.",
+  0, 0
+  },
+{
+  FK_NAMES, FK_ANSI, plainSpecialFlag,
+  "internalnamelookalike",
+  FLG_INTERNALNAMELOOKALIKE,
+  "lookalike characters match in internal names",
+  "Set whether similar looking characters (e.g., \"1\" and \"l\") "
+	"match in internal names.",
+  0, 0
+  },
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "macrovarprefix",
+  FLG_MACROVARPREFIX,
+  "set namespace prefix for variables declared in a macro body",
+  "A variable declared in a macro body does not start with the macrovarprefix.",
+    0, 0
+    } ,
+{
+  FK_NAMES, FK_PREFIX, plainFlag,	
+  "macrovarprefixexclude",
+  FLG_MACROVARPREFIXEXCLUDE,
+  "the macrovarprefix may not be used for non-macro variables",
+  "A variable declared outside a macro body starts with the macrovarprefix.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "tagprefix",
+  FLG_TAGPREFIX,
+  "set namespace prefix for struct, union and enum tags",
+  "A tag identifier does not start with the tagprefix.",
+    0, 0
+    } ,
+{
+  FK_NAMES, FK_PREFIX, plainFlag,
+  "tagprefixexclude",
+  FLG_TAGPREFIXEXCLUDE,
+  "the tagprefix may not be used for non-tag identifiers",
+  "An identifier that is not a tag starts with the tagprefix.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "enumprefix",
+  FLG_ENUMPREFIX,
+  "set namespace prefix for enum members",
+  "An enum member does not start with the enumprefix.",
+  0, 0
+  } ,
+{
+  FK_NAMES, FK_PREFIX, plainFlag,
+  "enumprefixexclude",
+  FLG_ENUMPREFIXEXCLUDE,
+  "the enumprefix may not be used for non-enum member identifiers",
+  "An identifier that is not an enum member starts with the enumprefix.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "filestaticprefix",
+  FLG_FILESTATICPREFIX,
+  "set namespace prefix for file static declarations",
+  "A file-static identifier does not start with the filestaticprefix.",
+  0, 0
+  } ,
+{
+  FK_NAMES, FK_PREFIX, plainFlag,
+  "filestaticprefixexclude",
+  FLG_FILESTATICPREFIXEXCLUDE,
+  "the filestaticprefix may not be used for identifiers that are not file static",
+  "An identifier that is not file static starts with the filestaticprefix.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "globalprefix",
+  FLG_GLOBPREFIX,
+  "set namespace prefix for global variables",
+  "A global variable does not start with the globalprefix",
+  0, 0
+  } ,
+{
+  FK_NAMES, FK_PREFIX, plainFlag,
+  "globalprefixexclude",
+  FLG_GLOBPREFIXEXCLUDE,
+  "the globalprefix may not be used for non-global identifiers",
+  "An identifier that is not a global variable starts with the globalprefix.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "typeprefix",
+  FLG_TYPEPREFIX,
+  "set namespace prefix for user-defined types",
+  "A user-defined type does not start with the typeprefix",
+  0, 0
+  } ,
+{
+  FK_NAMES, FK_PREFIX, plainFlag,
+  "typeprefixexclude",
+  FLG_TYPEPREFIXEXCLUDE,
+  "the typeprefix may not be used for identifiers that are not type names",
+  "An identifier that is not a type name starts with the typeprefix.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "externalprefix",
+  FLG_EXTERNALPREFIX,
+  "set namespace prefix for external identifiers",
+  "An external identifier does not start with the externalprefix",
+  0, 0
+  } ,
+{
+  FK_NAMES, FK_PREFIX, plainFlag,
+  "externalprefixexclude",
+  FLG_EXTERNALPREFIXEXCLUDE,
+  "the externalprefix may not be used for non-external identifiers",
+  "An identifier that is not external starts with the externalprefix.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "localprefix",
+  FLG_LOCALPREFIX,
+  "set namespace prefix for local variables",
+  "A local variable does not start with the localprefix",
+  0, 0
+  } ,
+{
+  FK_NAMES, FK_PREFIX, plainFlag,
+  "localprefixexclude",
+  FLG_LOCALPREFIXEXCLUDE,
+  "the localprefix may not be used for non-local identifiers",
+  "An identifier that is not a local variable starts with the localprefix.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "uncheckedmacroprefix",
+  FLG_UNCHECKEDMACROPREFIX,
+  "set namespace prefix for unchecked macros",
+  "An unchecked macro name does not start with the uncheckedmacroprefix",
+  0, 0
+  } ,
+{
+  FK_NAMES, FK_PREFIX, plainFlag,
+  "uncheckedmacroprefixexclude",
+  FLG_UNCHECKEDMACROPREFIXEXCLUDE,
+  "the uncheckmacroprefix may not be used for identifiers that are not "
+	"unchecked macros",
+  "An identifier that is not the name of an unchecked macro "
+	"starts with the uncheckedmacroprefix.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "constprefix",
+  FLG_CONSTPREFIX,
+  "set namespace prefix for constants",
+  "A constant does not start with the constantprefix",
+  0, 0
+  } ,
+{
+  FK_NAMES, FK_PREFIX, plainFlag,
+  "constprefixexclude",
+  FLG_CONSTPREFIXEXCLUDE,
+  "the constprefix may not be used for non-constant identifiers",
+  "An identifier that is not a constant starts with the constantprefix.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "iterprefix",
+  FLG_ITERPREFIX,
+  "set namespace prefix for iterators",
+  "An iter does not start with the iterator prefix",
+  0, 0
+  } ,
+{
+  FK_NAMES, FK_PREFIX, plainFlag,
+  "iterprefixexclude",
+  FLG_ITERPREFIXEXCLUDE,
+  "the iterprefix may not be used for non-iter identifiers",
+  "An identifier that is not a iter starts with the iterprefix.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, idemStringFlag,
+  "protoparamprefix",
+  FLG_DECLPARAMPREFIX,
+  "set namespace prefix for parameters in function prototype declarations",
+  "A parameter name in a function prototype declaration does not start with the "
+	"declaration parameter prefix",
+  0, 0
+  } ,
+{
+  FK_NAMES, FK_PREFIX, modeFlag,
+  "protoparamname",
+  FLG_DECLPARAMNAME,
+  "a parameter in a function prototype has a name",
+  "A parameter in a function prototype has a name.  This is dangerous, "
+	"since a macro definition could be visible here.",
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, modeFlag,
+  "protoparammatch",
+  FLG_DECLPARAMMATCH,
+  "the name of a parameter in a function prototype and corresponding "
+	"declaration must match (after removing the protoparamprefix", 
+  "A parameter in a function definition does not have the same name as "
+	"the corresponding in the declaration of the function after "
+	"removing the protoparamprefix", 
+    0, 0	
+    } ,	
+{
+  FK_NAMES, FK_PREFIX, plainFlag,
+  "protoparamprefixexclude",
+  FLG_DECLPARAMPREFIXEXCLUDE,
+  "the protoparamprefix may not be used for non-declaraction parameter identifiers",
+  "An identifier that is not a parameter name in a function prototype "
+	"starts with the protoparamprefix.",
+    0, 0	
+    } ,	
+{
+  FK_LIMITS, FK_ANSI, modeValueFlag,
+  "controlnestdepth",
+  FLG_CONTROLNESTDEPTH,
+  "set maximum nesting depth of compound statements, iteration control "
+    "structures, and selection control structures (ANSI minimum is 15)",
+  "Maximum number of control levels exceeded.",
+  0, 0
+  },
+{
+  FK_LIMITS, FK_ANSI, modeValueFlag,
+  "stringliterallen",
+  FLG_STRINGLITERALLEN,
+  "set maximum length of string literals (ANSI minimum is 509)",
+  "Maximum length of string literal exceeded.",
+  0, 0
+  },
+{
+  FK_LIMITS, FK_ANSI, modeValueFlag,
+  "numstructfields",
+  FLG_NUMSTRUCTFIELDS,
+  "set maximum number of fields in a struct or union (ANSI minimum is 127)",
+  "Maximum number of fields in a struct or union exceeded.",
+  0, 0
+  },
+{
+  FK_LIMITS, FK_ANSI, modeValueFlag,
+  "numenummembers",
+  FLG_NUMENUMMEMBERS,
+  "set maximum number of members of an enum (ANSI minimum is 127)",
+  "Limit on maximum number of members of an enum is exceeded.",
+  0, 0
+  },
+{
+  FK_LIMITS, FK_ANSI, modeValueFlag,
+  "includenest",
+  FLG_INCLUDENEST,
+  "set maximum number of nested #include files",
+  "Maximum number of nested #include files exceeded.",
+  0, 0
+  },
+{
+  FK_LIMITS, FK_ANSI, specialFlag,
+  "ansilimits",
+  FLG_ANSILIMITS,
+  "check for violations of standard limits (controlnestdepth, "
+    "stringliterallen, includenest, numstructfields, numenummembers)",
+  NULL,
+  0, 0
+  },
+{
+  FK_NAMES, FK_NONE, plainFlag,
+  "name",
+  FLG_NAME,
+  NULL,
+  "Naming convention is violated.",
+  0, 0
+  },
+{
+  FK_NONE, FK_NONE, plainFlag,
+  "special",
+  FLG_SPECIAL,
+NULL, NULL,
+  0, 0
+  },
+{
+  FK_NULL, FK_MEMORY, specialFlag,
+  "null",
+  FLG_NULL,
+  "misuses of null pointer",
+  "A possibly null pointer is misused (sets nullderef, nullpass, "
+	"nullref, nullassign, and nullstate).",
+  0, 0
+  },
+{
+  FK_NULL, FK_MEMORY, modeFlag,
+  "nullderef",
+  FLG_NULLDEREF,
+  "possible dereferencce of null pointer",
+  "A possibly null pointer is dereferenced.  Value is "
+	"either the result of a function which may return null "
+	"(in which case, code should check it is not null), or a "
+	"global, parameter or structure field declared with the "
+	"null qualifier.",
+  0, 0
+  },
+{
+  FK_TYPE, FK_NONE, modeFlag,
+  "fcnderef",
+  FLG_FCNDEREF,
+  "dereferencce of a function type",
+  "A function type is dereferenced.  The ANSI standard allows this "
+    "because of implicit conversion of function designators, however the "
+    "dereference is unnecessary.", 
+  0, 0
+  },
+{
+  FK_NULL, FK_MEMORY, modeFlag,
+  "nullpass",
+  FLG_NULLPASS,
+  "possibly null pointer passed as formal with no null annotation",
+  "A possibly null pointer is passed as a parameter corresponding to "
+	"a formal parameter with no /*@null@*/ annotation.  If NULL "
+	"may be used for this parameter, add a /*@null@*/ annotation "
+	"to the function parameter declaration.",
+  0, 0
+  },
+{
+  FK_NULL, FK_MEMORY, modeFlag,
+  "nullret",
+  FLG_NULLRET,
+  "possibly null pointer returned as result with no null annotation",
+  "Function returns a possibly null pointer, but is not declared "
+	"using /*@null@*/ annotation of result.  If function may "
+	"return NULL, add /*@null@*/ annotation to the return "
+	"value declaration.",
+  0, 0
+  },
+{
+  FK_NULL, FK_MEMORY, modeFlag,
+  "nullstate",
+  FLG_NULLSTATE,
+  "possibly null pointer reachable from a reference with no null annotation",
+  "A possibly null pointer is reachable from a parameter or global "
+	"variable that is not declared using a /*@null@*/ annotation.",
+  0, 0
+  },
+{
+  FK_NULL, FK_MEMORY, modeFlag,
+  "nullassign",
+  FLG_NULLASSIGN,
+  "inconsistent assignment or initialization involving null pointer",
+  "A reference with no null annotation is assigned or initialized "
+	"to NULL.  Use /*@null@*/ to declare the reference as "
+	"a possibly null pointer.",
+  0, 0
+  },
+{
+  FK_OPS, FK_BOOL, modeFlag,
+  "boolcompare",
+  FLG_BOOLCOMPARE,
+  "comparison between bools (dangerous because of multiple TRUE values)",
+  "Two bool values are compared directly using a C primitive. This "
+	"may produce unexpected results since all non-zero values are "
+	"considered TRUE, so different TRUE values may not be equal. "
+	"The file bool.h (included in lclint/lib) provides bool_equal "
+	"for safe bool comparisons.", 0, 0
+  },
+{
+  FK_OPS, FK_NONE, modeFlag,
+  "realcompare",
+  FLG_REALCOMPARE,
+  "dangerous comparison between reals (dangerous because of inexact "
+	"floating point representations)",
+  "Two real (float, double, or long double) values are compared "
+	"directly using a C primitive. "
+	"This may produce unexpected results since floating point "
+	"representations are inexact. Instead, compare the difference to "
+	"FLT_EPSILON or DBL_EPSILON.",
+   0, 0,
+  },
+{
+  FK_OPS, FK_POINTER, modeFlag,
+  "ptrarith",
+  FLG_POINTERARITH,
+  "arithmetic involving pointer and integer",
+  "Pointer arithmetic using pointer and integer.", 0, 0
+  },
+{
+  FK_OPS, FK_POINTER, modeFlag,
+  "nullptrarith",
+  FLG_NULLPOINTERARITH,
+  "arithmetic involving possibly null pointer and integer",
+  "Pointer arithmetic using a possibly null pointer and integer.", 0, 0
+  },
+{
+  FK_OPS, FK_POINTER, modeFlag,
+  "ptrcompare",
+  FLG_PTRNUMCOMPARE,
+  "comparison between pointer and number",
+  "A pointer is compared to a number.", 0, 0
+  },
+{
+  FK_OPS, FK_TYPE, modeFlag,
+  "strictops",
+  FLG_STRICTOPS,
+  "primitive operation does not type check strictly",
+  "A primitive operation does not type check strictly.", 0, 0
+  },
+{
+  FK_OPS, FK_TYPE, modeFlag,
+  "bitwisesigned",
+  FLG_BITWISEOPS,
+  "a bitwise logical operator does not have unsigned operands",
+  "An operand to a bitwise operator is not an unsigned values.  This "
+	"may have unexpected results depending on the signed "
+	"representations.", 0, 0
+  },
+{
+  FK_OPS, FK_TYPE, modeFlag,
+  "shiftsigned",
+  FLG_SHIFTSIGNED,
+  "a shift operator does not have unsigned operands",
+  "An operand to a shift operator is not unsigned values.  This "
+	"may have unexpected results depending on the signed "
+	"representations.", 0, 0
+  },
+{
+  FK_OPS, FK_BOOL, modeFlag,
+  "boolops",
+  FLG_BOOLOPS,
+  "primitive operation (!, && or ||) does not has a boolean argument",
+  "The operand of a boolean operator is not a boolean. Use +ptrnegate "
+	"to allow ! to be used on pointers.",
+   0, 0
+  },
+{
+  FK_OPS, FK_POINTER, modeFlag,
+  "ptrnegate",
+  FLG_PTRNEGATE,
+  "allow ! to be used on pointer operand",
+  "The operand of ! operator is a pointer.", 0, 0
+  },
+{
+  FK_OPS, FK_TYPE, modeFlag,
+  "sizeoftype",
+  FLG_SIZEOFTYPE,
+  "sizeof operator has a type argument",
+  "Operand of sizeof operator is a type. (Safer to use expression, "
+	"int *x = sizeof (*x); instead of sizeof (int).)", 
+  0, 0
+  },
+{
+  FK_OPS, FK_TYPE, plainFlag,
+  "sizeofformalarray",
+  FLG_SIZEOFFORMALARRAY,
+  "sizeof operator has an array formal parameter argument",
+  "Operand of a sizeof operator is a function parameter declared as "
+	"an array.  The value of sizeof will be the size of a pointer to the "
+	"element type, not the number of elements in the array.",
+  0, 0
+  },
+{
+  FK_DECL, FK_TYPE, plainFlag,
+  "fixedformalarray",
+  FLG_FIXEDFORMALARRAY,
+  "formal parameter of type array is declared with size",
+  "A formal parameter is declared as an array with size.  The size of the array "
+    "is ignored in this context, since the array formal parameter is treated "
+      "as a pointer.",
+  0, 0
+  },
+{
+  FK_DECL, FK_TYPE, plainFlag,
+  "incompletetype",
+  FLG_INCOMPLETETYPE,
+  "formal parameter has an incomplete type",
+  "A formal parameter is declared with an incomplete type.",
+  0, 0
+  },
+{
+  FK_DECL, FK_TYPE, plainFlag,
+  "formalarray",
+  FLG_FORMALARRAY,
+  "formal parameter is an array",
+  "A formal parameter is declared as an array.  This can be confusing, since "
+    "a formal array parameter is treated as a pointer.",
+  0, 0
+  },
+{
+  FK_PRED, FK_BOOL, plainFlag,
+  "predassign",
+  FLG_PREDASSIGN,
+  "condition test (if, while or for) is an assignment",
+  "The condition test is an assignment expression. Probably, you mean "
+	"to use == instead of =. If an assignment is intended, add an "
+	"extra parentheses nesting (e.g., if ((a = b)) ...) to suppress "
+	"this message.",
+   0, 0
+  },
+{
+  FK_PRED, FK_BOOL, specialFlag,
+  "predbool",
+  FLG_PREDBOOL,
+  "type of condition test (if, while or for) not bool (sets predboolint, "
+	"predboolptr and predboolothers)",
+  "Test expression type is not boolean.", 0, 0
+  },
+{
+  FK_PRED, FK_BOOL, modeFlag,
+  "predboolint",
+  FLG_PREDBOOLINT,
+  "type of condition test (if, while or for) is an integral type",
+  "Test expression type is not boolean or int.", 0, 0
+  },
+{
+  FK_PRED, FK_BOOL, modeFlag,
+  "predboolothers",
+  FLG_PREDBOOLOTHERS,
+  "type of condition test (if, while or for) not bool, int or pointer",
+  "Test expression type is not boolean.", 0, 0
+  },
+{
+  FK_PRED, FK_BOOL, modeFlag,
+  "predboolptr",
+  FLG_PREDBOOLPTR,
+  "type of condition test (if, while or for) is a pointer",
+  "Test expression type is not boolean.", 0, 0
+  },
+{
+  FK_PREPROC, FK_NONE, globalExtraArgFlag,
+  "D",
+  FLG_DEFINE,
+  "passed to pre-processor",
+  NULL, 0, 0
+  },
+{
+  FK_PREPROC, FK_NONE, globalExtraArgFlag,
+  "U",
+  FLG_UNDEFINE,
+  "passed to pre-processor",
+  NULL, 0, 0
+  },
+{
+  FK_GLOBALS, FK_NONE, modeFlag,
+  "globstate",
+  FLG_GLOBSTATE,
+  "returns with global in inconsistent state (null or undefined)",
+  "A global variable does not satisfy its annotations when control is transferred.",
+  0, 0
+  },
+{
+  FK_SUPPRESS, FK_COMMENTS, globalFlag,
+  "supcounts",
+  FLG_SUPCOUNTS,
+  "The number of errors detected does not match number in /*@i@*/.",
+  NULL, 0, 0
+  },
+{
+  FK_SUPPRESS, FK_ERRORS, valueFlag,
+  "limit",
+  FLG_LIMIT,
+  "limit  consecutive repeated errors",
+  NULL, 0, 0
+  },
+{
+  FK_SYNTAX, FK_NONE, plainFlag,
+  "syntax",
+  FLG_SYNTAX,
+  "syntax error in parsing",
+  "Code cannot be parsed.  For help on parse errors, see lclint -help parseerrors.", 
+	0, 0
+  },
+{
+  FK_SYNTAX, FK_NONE, plainFlag,
+  "trytorecover",
+  FLG_TRYTORECOVER,
+  "try to recover from parse error",
+  "Try to recover from parse error.  It really means try --- this doesn't usually work.", 0, 0
+  },
+{
+  FK_SYNTAX, FK_PREPROC, plainFlag,
+  "preproc",
+  FLG_PREPROC,
+  NULL, NULL,
+  0, 0
+  },
+{
+  FK_TYPE, FK_NONE, plainFlag,
+  "type",
+  FLG_TYPE,
+  "type mismatch",
+  "Types are incompatible.",
+  0, 0
+  },
+{
+  FK_TYPE, FK_NONE, plainFlag,
+  "fullinitblock",
+  FLG_FULLINITBLOCK,
+  "initializer sets all fields",
+  "Initializer does not set every field in the structure.",
+  0, 0
+  },
+{
+  FK_TYPE, FK_NONE, modeFlag,
+  "enummembers",
+  FLG_ENUMMEMBERS,
+  "enum members must be int values",
+  "Type of initial values for enum members must be int.",
+  0, 0
+  },
+
+{
+  FK_TYPE, FK_NONE, plainFlag,
+  "maintype",
+  FLG_MAINTYPE,
+  "type of main does not match expected type",
+  "The function main does not match the expected type.",
+  0, 0
+  },
+{
+  FK_TYPE, FK_NONE, plainFlag,
+  "formattype",
+  FLG_FORMATTYPE,
+  "type-mismatch in parameter corresponding to format code in a printf or scanf-like function",
+  "Type of parameter is not consistent with corresponding code in format string.",
+  0, 0
+  },
+{
+  FK_TYPE, FK_NONE, plainFlag,
+  "formatcode",
+  FLG_FORMATCODE,
+  "invalid format code in format string for printf or scanf-like function",
+  "Format code in a format string is not valid.",
+  0, 0
+  },
+{
+  FK_TYPEEQ, FK_ABSTRACT, modeFlag,
+  "forwarddecl",
+  FLG_FORWARDDECL,
+  "forward declarations of pointers to abstract representation match abstract type",
+  NULL, 0, 0
+  },
+{
+  FK_TYPEEQ, FK_ABSTRACT, modeFlag,
+  "voidabstract",
+  FLG_ABSTVOIDP,
+  "void * matches pointers to abstract types, casting ok (dangerous)",
+  "A pointer to void is cast to a pointer to an abstract type (or vice versa).",
+  0, 0
+  },
+{
+  FK_TYPEEQ, FK_POINTER, plainFlag,
+  "castfcnptr",
+  FLG_CASTFCNPTR,
+  "a pointer to a function is cast to a pointer to void (or vice versa)",
+  "A pointer to a function is cast to (or used as) a pointer to void (or vice versa).",
+  0, 0
+  },
+{
+  FK_TYPEEQ, FK_ARRAY, modeFlag,
+  "charindex",
+  FLG_CHARINDEX,
+  "char can be used to index arrays",
+	"To allow char types to index arrays, use +charindex.", 0, 0
+  },
+{
+  FK_TYPEEQ, FK_ARRAY, modeFlag,
+  "enumindex",
+  FLG_ENUMINDEX,
+  "enum can be used to index arrays",
+	"To allow enum types to index arrays, use +enumindex.", 0, 0
+  },
+{
+  FK_TYPEEQ, FK_BOOL, modeFlag,
+  "boolint",
+  FLG_BOOLINT,
+  "bool and int are equivalent",
+	  "To make bool and int types equivalent, use +boolint.",
+   0, 0
+  },
+{
+  FK_TYPEEQ, FK_NONE, modeFlag,
+  "charint",
+  FLG_CHARINT,
+  "char and int are equivalent",
+	"To make char and int types equivalent, use +charint.",
+    0, 0
+  },
+{
+  FK_TYPEEQ, FK_NONE, modeFlag,
+  "enumint",
+  FLG_ENUMINT,
+  "enum and int are equivalent",
+  "To make enum and int types equivalent, use +enumint.",
+  0, 0
+  },
+{
+  FK_TYPEEQ, FK_NONE, modeFlag,
+  "floatdouble",
+  FLG_FLOATDOUBLE,
+  "float and double are equivalent",
+	"To make float and double types equivalent, use +floatdouble.",
+  0, 0
+  },
+{
+  FK_TYPEEQ, FK_NUMBERS, modeFlag,
+  "ignorequals",
+  FLG_IGNOREQUALS,
+  "ignore type qualifiers (long, short, unsigned)",
+	"To ignore type qualifiers in type comparisons use +ignorequals.",
+	0, 0
+  },
+{
+  FK_TYPEEQ, FK_SYNTAX, plainFlag,
+  "duplicatequals",
+  FLG_DUPLICATEQUALS,
+  "report duplicate type qualifiers (e.g., long long)",
+	"Duplicate type qualifiers not supported by ANSI. Some "
+	"compilers (e.g., gcc) do support duplicate qualifiers.",
+	0, 0
+  },
+{
+  FK_TYPEEQ, FK_NUMBERS, modeFlag,
+  "ignoresigns",
+  FLG_IGNORESIGNS,
+  "ignore signs in type comparisons (unsigned matches signed)",
+	"To ignore signs in type comparisons use +ignoresigns",
+   0, 0
+  },
+{
+  FK_TYPEEQ, FK_NUMBERS, modeFlag,
+  "numliteral",
+  FLG_NUMLITERAL,
+  "int literals can be reals",
+	"An int literal is used as any numeric type (including float and long long). Use +numliteral to "
+	"allow int literals to be used as any numeric type.",
+  0, 0
+  },
+{
+  FK_TYPEEQ, FK_NUMBERS, modeFlag,
+  "charintliteral",
+  FLG_CHARINTLITERAL,
+  "character constants (e.g., 'a') can be used as ints",
+	"A character constant is used as an int. Use +charintliteral to "
+	"allow character constants to be used as ints.  (This is safe "
+	"since the actual type of a char constant is int.)",
+   0, 0
+  },
+{
+  FK_TYPEEQ, FK_NUMBERS, modeFlag,
+  "relaxquals",
+  FLG_RELAXQUALS,
+  "report qualifier mismatches only if dangerous",
+  NULL, 0, 0
+  },
+{
+  FK_TYPEEQ, FK_NUMBERS, modeFlag,
+  "relaxtypes",
+  FLG_RELAXTYPES,
+  "allow all numeric types to match",
+  NULL, 0, 0
+  },
+{
+  FK_TYPEEQ, FK_NONE, modeFlag,
+  "charunsignedchar",
+  FLG_CHARUNSIGNEDCHAR,
+  "allow char and unsigned char types to match",
+  "To allow char and unsigned char types to match use +charunsignedchar.", 
+    0, 0
+  },
+{
+  FK_TYPEEQ, FK_NUMBERS, modeFlag,
+  "matchanyintegral",
+  FLG_MATCHANYINTEGRAL,
+  "allow any intergral type to match an arbitrary integral type (e.g., dev_t)",
+     "To allow arbitrary integral types to match any integral type, use +matchanyintegral.",
+   0, 0
+  },
+{
+  FK_TYPEEQ, FK_NUMBERS, modeFlag,
+  "longunsignedintegral",
+  FLG_LONGUNSIGNEDINTEGRAL,
+  "allow long unsigned type to match an arbitrary integral type (e.g., dev_t)",
+     "To allow arbitrary integral types to match long unsigned, use +longunsignedintegral.",
+   0, 0
+  },
+{
+  FK_TYPEEQ, FK_NUMBERS, modeFlag,
+  "longintegral",
+  FLG_LONGINTEGRAL,
+  "allow long type to match an arbitrary integral type (e.g., dev_t)",
+     "To allow arbitrary integral types to match long unsigned, use +longintegral.",
+  0, 0
+  },
+{
+  FK_TYPEEQ, FK_NUMBERS, modeFlag,
+  "longunsignedunsignedintegral",
+  FLG_LONGUNSIGNEDUNSIGNEDINTEGRAL,
+  "allow long unsigned type to match an arbitrary unsigned integral type (e.g., size_t)",
+     "To allow arbitrary unsigned integral types to match long unsigned, "
+	"use +longunsignedunsignedintegral.",
+   0, 0
+  },
+{
+  FK_TYPEEQ, FK_NUMBERS, modeFlag,
+  "longsignedintegral",
+  FLG_LONGSIGNEDINTEGRAL,
+  "allow long type to match an arbitrary signed integral type (e.g., ssize_t)",
+     "To allow arbitrary signed integral types to match long unsigned, use +longsignedintegral.",
+  0, 0
+  },
+{
+  FK_TYPEEQ, FK_POINTER, plainFlag,
+  "zeroptr",
+  FLG_ZEROPTR,
+  "0 is treated as a pointer",
+  NULL, 0, 0
+  },
+{
+  FK_UNRECOG, FK_DISPLAY, plainFlag,
+  "repeatunrecog",
+  FLG_REPEATUNRECOG,
+  "do not suppress repeated unrecognized identifier messages (instead of only reporting the first error)",
+  "Identifier used in code has not been declared. (Message repeated for future uses in this file.)",
+  0, 0
+  },
+{
+  FK_UNRECOG, FK_DISPLAY, plainFlag,
+  "sysunrecog",
+  FLG_SYSTEMUNRECOG,
+  "report unrecognized identifiers with system (__) prefix",
+  "Identifier used in code has not been declared. (Message repeated for "
+	"future uses in this file.)  Use +gnuextensions to make lclint "
+	"recognize some keywords that are gnu extensions.",
+  0, 0
+  },
+{
+  FK_UNRECOG, FK_NONE, plainFlag,
+  "unrecog",
+  FLG_UNRECOG,
+  "unrecognized identifier",
+  "Identifier used in code has not been declared.", 0, 0
+  },
+{
+  FK_USE, FK_COMPLETE, modeFlag,
+  "topuse",
+  FLG_TOPUNUSED,
+  "declaration at top level not used",
+  "An external declaration not used in any source file.", 0, 0
+  },
+{
+  FK_USE, FK_EXPORT, modeFlag,
+  "exportlocal",
+  FLG_EXPORTLOCAL,
+  "a declaration is exported but not used outside this module",
+  "A declaration is exported, but not used outside this module. "
+	"Declaration can use static qualifier.",
+  0, 0
+  },
+{
+  FK_USE, FK_EXPORT, modeFlag,
+  "exportheader",
+  FLG_EXPORTHEADER,
+  "a declaration is exported but does not appear in a header file",
+  "A declaration is exported, but does not appear in a header file.",
+  0, 0
+  },
+{
+  FK_USE, FK_EXPORT, modeFlag,
+  "exportheadervar",
+  FLG_EXPORTHEADERVAR,
+  "a variable declaration is exported but does not appear in a header file",
+  "A variable declaration is exported, but does not appear in a header "
+	"file. (Used with exportheader.)",
+  0, 0
+  },
+{
+  FK_USE, FK_NONE, modeFlag,
+  "fielduse",
+  FLG_FIELDUNUSED,
+  "field of structure type not used",
+  "A field is present in a structure type but never used. Use /*@unused@*/ in front of field declaration to suppress message.",
+  0, 0
+  },
+{
+  FK_USE, FK_NONE, modeFlag,
+  "enummemuse",
+  FLG_ENUMMEMUNUSED,
+  "member of an enum type not used",
+  "A member of an enum type is never used.",
+  0, 0
+  },
+{
+  FK_USE, FK_NONE, modeFlag,
+  "constuse",
+  FLG_CONSTUNUSED,
+  "constant declared but not used",
+  "A constant is declared but not used. Use unused in the constant declaration to suppress message.",
+  0, 0
+  },
+{
+  FK_USE, FK_NONE, modeFlag,
+  "fcnuse",
+  FLG_FUNCUNUSED,
+  "function declared but not used",
+  "A function is declared but not used. Use /*@unused@*/ in front of function header to suppress message.",
+  0, 0
+  },
+{
+  FK_USE, FK_PARAMS, modeFlag,
+  "paramuse",
+  FLG_PARAMUNUSED,
+  "function parameter not used ",
+  "A function parameter is not used in the body of the function. If the argument is needed for type compatibility or future plans, use /*@unused@*/ in the argument declaration.",
+  0, 0
+  },
+{
+  FK_USE, FK_TYPE, modeFlag,
+  "typeuse",
+  FLG_TYPEUNUSED,
+  "type declared but not used",
+  "A type is declared but not used. Use /*@unused@*/ in front of typedef to suppress messages.",
+  0, 0
+  },
+{
+  FK_USE, FK_NONE, modeFlag,
+  "varuse",
+  FLG_VARUNUSED,
+  "variable declared but not used",
+  "A variable is declared but never used. Use /*@unused@*/ in front "
+	"of declaration to suppress message.",
+  0, 0
+  },
+
+{
+  FK_USE, FK_COMPLETE, modeFlag,
+  "unusedspecial",
+  FLG_UNUSEDSPECIAL,
+  "unused declaration in special file (corresponding to .l or .y file)",
+  NULL, 0, 0
+  }
+} ;
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/flex.head b/src/flex.head
new file mode 100644
index 0000000..b40ce75
--- /dev/null
+++ b/src/flex.head
@@ -0,0 +1,83 @@
+/*
+** Inserted at beginning of c files generated by flex
+** REMEMBER:  Change flex.reset too.
+*/
+
+/*@-allmacros@*/
+/*@-pred@*/
+/*@-globstate@*/
+/*@-null@*/
+/*@+boolint@*/
+/*@+charint@*/
+/*@-macrospec@*/
+/*@-macroredef@*/
+/*@-exitarg@*/
+/*@-compdef@*/
+/*@-uniondef@*/
+/*@+ignorequals@*/
+/*@-noreturn@*/
+/*@-mustfree@*/
+/*@-compdestroy@*/
+/*@-branchstate@*/
+/*@-unreachable@*/
+/*@-varuse@*/
+/*@-fcnuse@*/
+/*@-exportlocal@*/
+/*@-evalorderuncon@*/
+/*@-exportheader@*/
+/*@-redecl@*/
+/*@-loopswitchbreak@*/
+/*@-switchswitchbreak@*/
+/*@-sizeoftype@*/
+/*@-czechfcns@*/
+/*@-noparams@*/
+/*@-ansireserved@*/
+/*@-ifblock@*/
+/*@-whileblock@*/
+/*@-forblock@*/
+/*@-elseifcomplete@*/
+/*@+ptrnegate@*/
+/*@-onlytrans@*/
+/*@-temptrans@*/
+/*@-immediatetrans@*/
+/*@-namechecks@*/
+/*@+matchanyintegral@*/
+/*@-statictrans@*/
+/*@-compmempass@*/
+/*@-forempty@*/
+/*@-evalorder@*/
+/*@-retalias@*/
+/*@-dependenttrans@*/
+/*@-noeffect@*/
+/*@-protoparammatch@*/
+/*@-casebreak@*/
+/*@-retvalother@*/
+
+# ifdef __LCLINT__
+/*@-redecl@*/ /*@-type@*/
+extern int lsllex (void);
+/*@=redecl@*/ /*@=type@*/
+
+/*
+** Need to do this because ECHO is defined by the Posix library.  
+** flex shouldn't use it.
+*/
+
+/*@notfunction@*/
+# define ECHO \
+  fwrite (yytext, yyleng, 1, yyout)
+
+# ifndef DEFFILENO
+extern /*@external@*/ int fileno (/* FILE *stream */);
+# define DEFFILENO
+# endif
+# endif
+
+# ifdef OSF
+# undef __GNUC__ 
+# endif
+
+/*@-redecl@*/
+
+/* < end of flex.head > */
+
diff --git a/src/flex.reset b/src/flex.reset
new file mode 100644
index 0000000..0ef79de
--- /dev/null
+++ b/src/flex.reset
@@ -0,0 +1,56 @@
+/*
+** Resets flags set by flex.head.
+*/
+
+
+/*@=allmacros@*/
+/*@=pred@*/
+/*@=globstate@*/
+/*@=null@*/
+/*@=boolint@*/
+/*@=charint@*/
+/*@=macrospec@*/
+/*@=macroredef@*/
+/*@=exitarg@*/
+/*@=compdef@*/
+/*@=uniondef@*/
+/*@=ignorequals@*/
+/*@=noreturn@*/
+/*@=mustfree@*/
+/*@=compdestroy@*/
+/*@=branchstate@*/
+/*@=unreachable@*/
+/*@=varuse@*/
+/*@=fcnuse@*/
+/*@=exportlocal@*/
+/*@=evalorderuncon@*/
+/*@=exportheader@*/
+/*@=redecl@*/
+/*@=loopswitchbreak@*/
+/*@=switchswitchbreak@*/
+/*@=sizeoftype@*/
+/*@=czechfcns@*/
+/*@=noparams@*/
+/*@=ansireserved@*/
+/*@=ifblock@*/
+/*@=whileblock@*/
+/*@=forblock@*/
+/*@=elseifcomplete@*/
+/*@=ptrnegate@*/
+/*@=onlytrans@*/
+/*@=temptrans@*/
+/*@=immediatetrans@*/
+/*@=namechecks@*/
+/*@=matchanyintegral@*/
+/*@=statictrans@*/
+/*@=compmempass@*/
+/*@=forempty@*/
+/*@=evalorder@*/
+/*@=retalias@*/
+/*@=redecl@*/
+/*@=retvalother@*/
+
+# ifdef OSF
+# define __GNUC__
+# endif
+
diff --git a/src/general.c b/src/general.c
new file mode 100644
index 0000000..d8e2fb6
--- /dev/null
+++ b/src/general.c
@@ -0,0 +1,736 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** general.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# undef malloc
+# undef realloc
+# undef calloc
+
+# ifdef USEDMALLOC
+# include "dmalloc.h"
+# endif
+
+# include "portab.h"
+
+/*
+** redefine undef'd memory ops
+*/
+
+# ifndef USEDMALLOC
+# include  
+
+/*@-mustdefine@*/
+
+void sfree (void *x)
+{
+  if (x != NULL)
+    {
+      /*
+      fprintf (stderr, "Freeing: %ld\n", x);
+      if ((unsigned long) x < 136000000 && (unsigned long) x > 135000000) {
+	fprintf (stderr, "Looks bad!\n");
+      }
+      */
+      free (x);
+      /* fprintf (stderr, "Done.\n"); */
+    }
+}
+# endif
+
+void sfreeEventually (void *x)
+{
+  if (x != NULL)
+    {
+      ; /* should keep in a table */
+    }
+/*@-mustfree@*/
+} /*@=mustfree@*/
+
+/*
+** all memory should be allocated from dimalloc
+*/
+
+static long unsigned size_toLongUnsigned (size_t x)
+{
+  long unsigned res = (long unsigned) x;
+
+  llassert ((size_t) res == x);
+  return res;
+}
+
+/*@out@*/ void *dimalloc (size_t size, char *name, int line)
+{
+  /*
+  static void *lastaddr = 0;
+  static int numallocs = 0;
+  static int numbad = 0;
+  */
+
+  /* was malloc, use calloc to initialize to zero */
+  void *ret = (void *) calloc (1, size);
+
+  /*
+  numallocs++;
+
+  if (ret < lastaddr)
+    {
+      numbad++;
+      fprintf (stderr, "Bad alloc: %d / %d\n", numbad, numallocs);
+    }
+
+  lastaddr = ret;
+  */
+
+  if (ret == NULL)
+    {
+      if (size == 0)
+	{
+	  llbug (message ("Zero allocation at %q.",
+			  fileloc_unparseRaw (cstring_fromChars (name), line)));
+	}
+      else
+	{
+	  llfatalerrorLoc
+	    (message ("Out of memory.  Allocating %w bytes at %s:%d.", 
+		      size_toLongUnsigned (size),
+		      cstring_fromChars (name), line));
+	}
+    }
+      
+  /*@-null@*/ /* null okay for size = 0 */
+  return ret; 
+  /*@=null@*/
+}
+
+void *dicalloc (size_t num, size_t size, char *name, int line)
+{
+  void *ret = (void *) calloc (num, size);
+
+  if (ret == NULL)
+    {
+      llfatalerrorLoc 
+	(message ("Out of memory.  Allocating %w bytes at %s:%d.", 
+		  size_toLongUnsigned (size),
+		  cstring_fromChars (name), line));
+    }
+  
+  return ret;
+}
+
+void *direalloc (/*@out@*/ /*@null@*/ void *x, size_t size, 
+		 char *name, int line)
+{
+  void *ret;
+
+  if (x == NULL)
+    {				       
+      ret = (void *) dmalloc (size);
+    }
+  else
+    {
+      ret = (void *) realloc (x, size);
+    }
+
+  if (ret == NULL)
+    {
+      llfatalerrorLoc
+	(message ("Out of memory.  Allocating %w bytes at %s:%d.", 
+		  size_toLongUnsigned (size),
+		  cstring_fromChars (name), line));
+    }
+  
+  return ret;
+}
+
+/*@=mustdefine@*/
+
+# ifndef NOLCL
+char *FormatInt (int i)
+{
+  char temp[255]; /* assume the integer has at most 254 digits */
+  char *outs;
+
+  sprintf (temp, "%i", i);
+  outs = (char *) dmalloc (sizeof (*outs) * (1 + strlen (temp)));
+  strcpy (outs, temp);
+
+  return (outs);
+}
+# endif
+
+bool
+isCext (char *ext)
+{
+  return (!mstring_equal (ext, ".lcl") && 
+	  !mstring_equal (ext, ".spc") &&
+	  !mstring_equal (ext, ".ll"));
+}
+
+bool
+isLCLfile (cstring s)
+{
+  char *ext;
+
+  ext = filenameExtension (cstring_toCharsSafe (s));
+
+  if (ext != NULL)
+    {
+      return (!(isCext (ext)));
+    }
+
+  return (TRUE);
+}
+
+char *removeExtension (/*@temp@*/ char *s, const char *suffix)
+{
+  char *t = strrchr (s, '.');
+  char *s2;
+
+  if (t == (char *) 0 || !mstring_equal (t, suffix))
+    {
+      return mstring_copy (s);
+    }
+
+  /*@-mods@*/ 
+  *t = '\0';
+  s2 = mstring_copy (s);
+  *t = '.';
+  /*@=mods@*/  /* Modification is undone. */
+  return s2;
+}
+
+# ifndef NOLCL
+bool firstWord (char *s, char *w)
+{
+  llassert (s != NULL);
+  llassert (w != NULL);
+  
+  for (; *w != '\0'; w++, s++)
+    {
+      if (*w != *s || *s == '\0')
+	return FALSE;
+    }
+  return TRUE;
+}
+# endif
+
+# ifndef NOLCL
+/*@only@*/ char *removePath (char *s)
+{
+  char *t = strrchr (s, CONNECTCHAR);
+
+  if (t == NULL) return (mstring_copy (s));
+  else return (mstring_copy (t + 1));
+}
+# endif
+
+/*@only@*/ char *
+removePathFree (/*@only@*/ char *s)
+{
+  char *t = strrchr (s, CONNECTCHAR);
+
+# ifdef ALTCONNECTCHAR
+  {
+    char *at = strrchr (s, ALTCONNECTCHAR);
+    if (t == NULL || (at > t)) {
+      t = at;
+    }
+  }
+# endif
+
+  if (t == NULL) 
+    {
+      return (s);
+    }
+  else
+    {
+      char *res = mstring_copy (t + 1);
+      mstring_free (s);
+      return res;
+    }
+}
+
+void mstring_markFree (char *s)
+{
+    sfreeEventually (s);
+}
+
+/*@only@*/ char *
+removeAnyExtension (char *s)
+{
+  char *ret;
+  char *t = strrchr (s, '.');
+
+  if (t == (char *) 0)
+    {
+      return mstring_copy (s);
+    }
+
+  /*@-mods@*/
+  *t = '\0';
+  ret = mstring_copy (s);
+  *t = '.';
+  /*@=mods@*/ /* modification is undone */
+
+  return ret;
+}
+
+/*@only@*/ char *
+addExtension (char *s, const char *suffix)
+{
+  if (strrchr (s, '.') == (char *) 0)
+    {
+      /* <<< was mstring_concatFree1 --- bug detected by lclint >>> */
+      return (mstring_concat (s, suffix));
+    }
+  else
+    {
+      return mstring_copy (s);
+    }
+}
+
+int
+getInt (char **s)
+{
+  bool gotOne = FALSE;
+  int i = 0;
+
+  while (**s == ' ')
+    {
+      (*s)++;
+    }
+
+  if (**s == '-')
+    {
+      (*s)++;
+      if (**s < '0' || **s > '9')
+	{
+	  llbug (message ("getInt: bad int: %s", cstring_fromChars (*s))); 
+	}
+      else
+	{
+	  i = -1 * (int) (**s - '0');
+	  gotOne = TRUE;
+	}
+
+      (*s)++;
+    }
+
+  while (**s >= '0' && **s <= '9')
+    {
+      i *= 10;
+      i += (int) (**s - '0');
+      (*s)++;
+      gotOne = TRUE;
+    }
+
+  if (!gotOne)
+    {
+      llbug (message ("No int to read: %s", cstring_fromChars (*s)));
+    }
+
+  while (**s == '\n' || **s == ' ' || **s == '\t')
+    {
+      (*s)++;
+    }
+
+  return i;
+}
+
+char
+loadChar (char **s)
+{
+  char ret;
+
+  while (**s == ' ')
+    {
+      (*s)++;
+    }
+  
+  ret = **s;
+  (*s)++;
+  return ret;
+}
+
+/*
+** not sure if this works...
+*/
+
+double
+getDouble (char **s)
+{
+  char *end = mstring_createEmpty ();
+  double ret;
+
+  ret = strtod (*s, &end);
+
+  *s = end;
+  return ret;
+}
+
+/*
+** read to ' ', '\t'. '\n', '#', ',' or '\0'
+*/
+
+char *
+getWord (char **s)
+{
+  char *res;
+  char *t = *s;
+  char c;
+
+  while ((c = **s) != '\0' && (c != ' ') && (c != ',') 
+	 && (c != '\n') && (c != '\t') && (c != '#'))
+    {
+      (*s)++;
+    }
+
+  if (*s == t)  
+    {
+      return NULL;
+    }
+
+  **s = '\0';
+  res = mstring_copy (t);
+  **s = c;
+  return res;
+}
+
+bool
+optCheckChar (char **s, char c)
+{
+  if (**s == c)
+    {
+      (*s)++;
+      return TRUE;
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+void
+docheckChar (char **s, char c, char *file, int line)
+{
+  /*@unchecked@*/ static int nbadchars = 0;
+
+  if (**s == c)
+    {
+      (*s)++;
+    }
+  else
+    {
+      nbadchars++;
+
+      if (nbadchars > 5)
+	{
+	  llfatalbug (cstring_makeLiteral 
+		      ("checkChar: Too many errors.  Check library is up to date."));
+	}
+      else
+	{
+	  llbug (message ("checkChar: %q: Bad char, expecting %h: %s",
+			  fileloc_unparseRaw (cstring_fromChars (file), line),
+			  c,
+			  cstring_fromChars (*s)));
+	}
+    }
+}
+
+char *mstring_spaces (int n)
+{
+  int i;
+  char *ret;
+  char *ptr;
+
+  llassert (n >= 0);
+
+  ret = (char *) dmalloc (size_fromInt (n + 1));
+  ptr = ret;
+
+  for (i = 0; i < n; i++)
+    {
+      *ptr++ = ' ';
+    }
+
+  *ptr = '\0';
+
+  return ret;
+}
+ 
+char *mstring_concat (const char *s1, const char *s2)
+{
+  char *s = (char *) dmalloc (strlen (s1) + strlen (s2) + 1);
+  strcpy (s, s1);
+  strcat (s, s2);
+  return s;
+}
+
+extern /*@only@*/ char *
+mstring_concatFree (/*@only@*/ char *s1, /*@only@*/ char *s2)
+{
+  /* like mstring_concat but deallocates old strings */
+  char *s = (char *) dmalloc (strlen (s1) + strlen (s2) + 1);
+  strcpy (s, s1);
+  strcat (s, s2);
+
+  sfree (s1);
+  sfree (s2);
+  return s;
+}
+
+extern /*@only@*/ char *
+mstring_concatFree1 (/*@only@*/ char *s1, const char *s2)
+{
+  char *s = (char *) dmalloc (strlen (s1) + strlen (s2) + 1);
+  strcpy (s, s1);
+  strcat (s, s2);
+  sfree (s1);
+
+  return s;
+}
+
+extern /*@only@*/ char *
+mstring_append (/*@only@*/ char *s1, char c)
+{
+  size_t l = strlen (s1);
+  char *s;
+
+  s = (char *) dmalloc (sizeof (*s) * (l + 2));
+
+  strcpy (s, s1);
+  *(s + l) = c;
+  *(s + l + 1) = '\0';
+  sfree (s1); 
+  return s;
+}
+
+extern 
+char *mstring_copy (char *s1)
+{
+  if (s1 == NULL)
+    {
+      return NULL;
+    }
+  else
+    {
+      char *s = (char *) dmalloc ((strlen (s1) + 1) * sizeof (*s));
+      strcpy (s, s1);
+      return s;
+    }
+}
+
+extern
+char *mstring_safePrint (char *s)
+{
+  if (s == NULL)
+    {
+      return ("");
+    }
+  else
+    {
+      return s;
+    }
+}
+
+extern
+char *mstring_create (int n)
+{
+  char *s;
+
+  s = dmalloc (sizeof (*s) * (n + 1));
+  *s = '\0';
+  return s;
+}
+
+void
+fputline (FILE *out, char *s)
+{
+  if (strlen (s) > 0) 
+    {
+      check (fputs (s, out) != EOF);
+    }
+
+  check (fputc ('\n', out) == (int) '\n');
+}
+
+int int_log (int x)
+{
+  int ret = 1;
+
+  while (x > 10)
+    {
+      ret++;
+      x /= 10;
+    }
+
+  return ret;
+}
+
+/*@-czechfcns@*/
+long unsigned int 
+longUnsigned_fromInt (int x)
+{
+  llassert (x >= 0);
+  
+  return (long unsigned) x;
+}
+
+size_t size_fromInt (int x)
+{
+  size_t res = (size_t) x;
+
+  llassert ((int) res == x);
+  return res;
+}
+
+int size_toInt (size_t x)
+{
+  int res = (int) x;
+
+  llassert ((size_t) res == x);
+  return res;
+}
+
+long size_toLong (size_t x)
+{
+  long res = (long) x;
+
+  llassert ((size_t) res == x);
+  return res;
+}
+
+/*@=czechfcns@*/
+
+char
+char_fromInt (int x)
+{
+  llassert ((x >= (int)'\0') && (x <= (int)'~'));
+
+  return ((char) x);
+}
+
+/*@-czechfcns@*/
+int
+longUnsigned_toInt (long unsigned int x)
+{
+  int res = (int) x;
+
+  llassert ((long unsigned) res == x);
+  return res;
+}
+
+int
+long_toInt (long int x)
+{
+  int res = (int) x;
+
+  /*@+ignorequals@*/ llassert (res == x); /*@=ignorequals@*/
+  return res;
+}
+
+/*@+czechfcns@*/
+
+bool mstring_equalPrefix (const char *c1, const char *c2)
+{
+  llassert (c1 != NULL);
+  llassert (c2 != NULL);
+
+  if (strncmp(c1, c2, strlen(c2)) == 0)
+    {
+      return TRUE;
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+bool mstring_equal (/*@null@*/ const char *s1, /*@null@*/ const char *s2)
+{
+  if (s1 == NULL)
+    {
+      return (s2 == NULL);
+    }
+  else
+    {
+      if (s2 == NULL)
+	{
+	  return FALSE;
+	}
+      else
+	{
+	  return (strcmp(s1, s2) == 0);
+	}
+    }
+}
+
+/*@observer@*/ char *filenameExtension (/*@returned@*/ char *s)
+{
+  llassert (s != NULL);
+
+  return (strrchr(s, '.'));
+}
+
+char *removePreDirs (char *s)
+{
+  while (*s == '.' && *(s + 1) == CONNECTCHAR) 
+    {
+      s += 2;
+    }
+
+# if defined(OS2) || defined(MSDOS)
+  /* remove remainders from double path delimiters... */
+  while (*s == CONNECTCHAR) 
+    {
+      ++s;
+    }
+# endif /* !defined(OS2) && !defined(MSDOS) */
+
+  return s;
+}
+
+void checkUngetc (int c, FILE *f)
+{
+  int res;
+
+  llassert (c != EOF);
+  res = ungetc (c, f);
+  llassert (res == c);
+}
+
+bool isHeaderFile (cstring fname)
+{
+  char *ext = filenameExtension (cstring_toCharsSafe (fname));
+  
+  return (mstring_equal (ext, ".h")
+	  || mstring_equal (ext, ".H")
+	  || mstring_equal (ext, ".lh"));
+}
+
diff --git a/src/globSet.c b/src/globSet.c
new file mode 100644
index 0000000..70e67ff
--- /dev/null
+++ b/src/globSet.c
@@ -0,0 +1,165 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** globSet.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+globSet
+globSet_new ()
+{
+  return (globSet_undefined);
+}
+
+void
+globSet_clear (globSet g)
+{
+  sRefSet_clear (g);
+}
+
+globSet
+globSet_insert (/*@returned@*/ globSet s, sRef el)
+{
+  if (sRef_isKnown (el) && !sRef_isConst (el) && !sRef_isType (el))
+    {
+      llassertprint (sRef_isGlobal (el) || sRef_isKindSpecial (el),
+		     ("el: %s", sRef_unparse (el)));
+      
+      return (sRefSet_insert (s, el));
+    }
+  else
+    {
+      return s;
+    }
+}
+
+globSet
+  globSet_copy (/*@returned@*/ globSet s1, /*@exposed@*/ globSet s2)
+{
+  return (sRefSet_copy (s1, s2));
+}
+
+/*@only@*/ globSet
+globSet_newCopy (globSet s)
+{
+  return (sRefSet_newCopy (s));
+}
+
+bool
+globSet_member (globSet s, sRef el)
+{
+  return (sRefSet_member (s, el));
+}
+
+/*@exposed@*/ sRef globSet_lookup (globSet s, sRef el)
+{
+  sRefSet_allElements (s, e)
+    {
+      if (sRef_similar (e, el))
+	{
+	  return e;
+	}
+    } end_sRefSet_allElements;
+
+  return sRef_undefined;
+}
+
+bool
+globSet_hasStatic (globSet s)
+{
+  sRefSet_allElements (s, el)
+    {
+      if (sRef_isFileStatic (el))
+	{
+	  return TRUE;
+	}
+    } end_sRefSet_allElements;
+
+  return FALSE;
+}
+
+void
+globSet_free (/*@only@*/ globSet s)
+{
+  sRefSet_free (s);
+}
+
+/*@only@*/ cstring
+globSet_dump (globSet lset)
+{
+  cstring st = cstring_undefined;
+  bool first = TRUE;
+
+  
+  sRefSet_allElements (lset, el)
+    {
+      if (!first)
+	{
+	  st = cstring_appendChar (st, ',');
+	}
+      else
+	{
+	  first = FALSE;
+	}
+
+      st = cstring_concatFree (st, sRef_dumpGlobal (el));
+    } end_sRefSet_allElements;
+
+  return st;
+}
+
+globSet
+globSet_undump (char **s)
+{
+  char c;
+  sRefSet sl = sRefSet_new ();
+
+  while ((c = **s) != '#' && c != '@' && c != '$' && c != '&')
+    {
+      sl = sRefSet_insert (sl, sRef_undumpGlobal (s));
+
+      
+      if (**s == ',')
+	{
+	  (*s)++;
+	}
+    }
+
+    return sl;
+}
+
+/*@only@*/ cstring
+globSet_unparse (globSet ll)
+{
+  return (sRefSet_unparse (ll));
+}
+
+int 
+globSet_compare (globSet l1, globSet l2)
+{
+  return (sRefSet_compare (l1, l2));
+}
+
diff --git a/src/globals.c b/src/globals.c
new file mode 100644
index 0000000..e4ff1a1
--- /dev/null
+++ b/src/globals.c
@@ -0,0 +1,96 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** globals.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+fileloc g_currentloc;
+
+# ifndef NOLCL
+symtable g_symtab;
+/*@only@*/ lsymbolSet g_currentImports = lsymbolSet_undefined;
+# endif
+
+cstring g_codeFile = cstring_undefined;
+int g_codeLine = 0;
+
+cstring g_prevCodeFile = cstring_undefined;
+int g_prevCodeLine = 0;
+FILE *g_msgstream;
+
+/*
+** These were in llmain.c.  Most should not be globals...
+*/
+
+/*@observer@*/ char *g_localSpecPath = ".";
+
+# ifndef NOLCL
+/*@only@*/ cstring g_currentSpec;
+/*@only@*/ char *g_currentSpecName;
+# endif
+
+void printCodePoint (void)
+{
+  static bool incode = FALSE;
+
+  if (incode) {
+    fprintf (stderr, "[[[ in code! ]]]\n");
+  }
+
+  incode = TRUE;
+
+  if (cstring_isDefined (g_codeFile))
+    {
+      cstring temps = fileloc_unparseRaw (g_codeFile, g_codeLine);
+
+      fprintf (stderr, "*** Last code point: %s\n", 
+	       cstring_toCharsSafe (temps));
+
+      cstring_free (temps);
+
+      if (cstring_isDefined (g_prevCodeFile))
+	{
+	  temps = fileloc_unparseRaw (g_prevCodeFile, g_prevCodeLine);
+	  fprintf (stderr, "*** Previous code point: %s\n", 
+		   cstring_toCharsSafe (temps));
+
+	  cstring_free (temps);
+	}
+    }
+
+  incode = FALSE;
+}
+
+# ifdef WIN32
+int yywrap (void)
+{
+  return 1;
+}
+# endif
+
+
+
diff --git a/src/guardSet.c b/src/guardSet.c
new file mode 100644
index 0000000..e898a6c
--- /dev/null
+++ b/src/guardSet.c
@@ -0,0 +1,356 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** guardSet.c
+**
+** if x is in true guards, then x is not null on this branch,
+**                          and x is "probably" null on the other branch.
+** if x is in false guards, then x is "probably" null on this branch,
+**                          and x is not null on the other branch.
+**
+** Either guards is obsolete and should be removed soon.
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+guardSet guardSet_new ()
+{
+  return guardSet_undefined;
+}
+
+static /*@notnull@*/ /*@special@*/ guardSet guardSet_newEmpty (void)
+   /*@defines result@*/
+   /*@post:isnull result->tguard, result->fguard@*/
+{
+  guardSet g = (guardSet) dmalloc (sizeof (*g));
+
+  g->tguard = sRefSet_undefined;
+  g->fguard = sRefSet_undefined;
+
+  return g;
+}
+
+sRefSet guardSet_getTrueGuards (guardSet g)
+{
+  
+  if (guardSet_isDefined (g))
+    {
+      return (g->tguard);
+    }
+  else
+    {
+      return (sRefSet_undefined);
+    }
+}
+
+void guardSet_delete (guardSet g, sRef s) 
+{
+  bool res;
+  llassert (guardSet_isDefined (g));
+  res = sRefSet_delete (g->tguard, s);
+  
+  /*
+  ** This assertion is no longer always true:
+  ** llassert (res);
+  */
+}
+
+/*@dependent@*/ /*@exposed@*/ sRefSet guardSet_getFalseGuards (guardSet g)
+{
+  if (guardSet_isDefined (g))
+    { 
+      return (g->fguard);
+    }
+  else
+    {
+      return (sRefSet_undefined);
+    }
+}
+
+guardSet guardSet_or (/*@returned@*/ /*@unique@*/ guardSet s, guardSet t)
+{
+  
+  llassert (NOALIAS (s, t));
+
+  if (s == guardSet_undefined)
+    {
+      if (t == guardSet_undefined)
+	{
+	  return s;
+	}
+
+      s = guardSet_newEmpty ();
+    }
+
+  if (t == guardSet_undefined)
+    {
+      sRefSet_free (s->tguard);
+      s->tguard = sRefSet_new ();
+    }
+  else
+    {
+      sRefSet last;
+
+      s->tguard = sRefSet_intersect (last = s->tguard, t->tguard);
+      sRefSet_free (last);
+      s->fguard = sRefSet_union (s->fguard, t->fguard);
+    }
+  
+  
+  return s;
+}
+
+guardSet guardSet_and (/*@returned@*/ /*@unique@*/ guardSet s, guardSet t)
+{
+  llassert (NOALIAS (s, t));
+
+  if (s == guardSet_undefined)
+    {
+      if (t == guardSet_undefined)
+	{
+	  return s;
+	}
+
+      s = guardSet_newEmpty ();
+    }
+
+  if (t == guardSet_undefined)
+    {
+      sRefSet_free (s->fguard);
+      s->fguard = sRefSet_new ();
+    }
+  else
+    {
+      sRefSet last;
+
+      s->tguard = sRefSet_union (s->tguard, t->tguard);
+
+      s->fguard = sRefSet_intersect (last = s->fguard, t->fguard);
+      sRefSet_free (last);
+    }
+  
+  return s;
+}
+
+/*@only@*/ guardSet guardSet_union (/*@only@*/ guardSet s, guardSet t)
+{
+  if (t == guardSet_undefined) return s; 
+
+  llassert (NOALIAS (s, t));
+
+  if (guardSet_isDefined (s)) 
+    {
+      s->tguard = sRefSet_union (s->tguard, t->tguard);
+      s->fguard = sRefSet_union (s->fguard, t->fguard);
+    }
+  else
+    {
+      s = guardSet_newEmpty ();
+
+      s->tguard = sRefSet_newCopy (t->tguard);
+      s->fguard = sRefSet_newCopy (t->fguard);
+    }
+
+  return s;
+}
+
+guardSet guardSet_levelUnion (/*@only@*/ guardSet s, guardSet t, int lexlevel)
+{
+  if (t == guardSet_undefined) return s;
+
+  llassert (NOALIAS (s, t));
+
+  if (guardSet_isDefined (s))
+    {
+      s->tguard = sRefSet_levelUnion (s->tguard, t->tguard, lexlevel);
+      s->fguard = sRefSet_levelUnion (s->fguard, t->fguard, lexlevel);
+    }
+  else
+    {
+      s = guardSet_newEmpty ();
+
+      /* should be necessary! */
+
+      sRefSet_free (s->tguard);
+      sRefSet_free (s->fguard);
+
+      s->tguard = sRefSet_levelCopy (t->tguard, lexlevel);
+      s->fguard = sRefSet_levelCopy (t->fguard, lexlevel);
+    }
+
+  return s;
+}
+
+guardSet 
+  guardSet_levelUnionFree (/*@returned@*/ /*@unique@*/ guardSet s,
+			   /*@only@*/ guardSet t, int lexlevel)
+{
+  if (t == guardSet_undefined) return s;
+
+  if (guardSet_isDefined (s))
+    {
+      s->tguard = sRefSet_levelUnion (s->tguard, t->tguard, lexlevel);
+      s->fguard = sRefSet_levelUnion (s->fguard, t->fguard, lexlevel);
+    }
+  else
+    {
+      s = guardSet_newEmpty ();
+
+      /* should be necessary! */
+
+      sRefSet_free (s->tguard);
+      sRefSet_free (s->fguard);
+
+      s->tguard = sRefSet_levelCopy (t->tguard, lexlevel);
+      s->fguard = sRefSet_levelCopy (t->fguard, lexlevel);
+    }
+
+  guardSet_free (t);
+  return s;
+}
+
+void guardSet_flip (guardSet g)
+{
+  if (g != guardSet_undefined)
+    {
+      sRefSet tmp = g->tguard;
+
+      g->tguard = g->fguard;      
+      g->fguard = tmp;
+    }
+}
+
+/*@only@*/ guardSet guardSet_invert (/*@temp@*/ guardSet g)
+{
+  if (g != guardSet_undefined)
+    {
+      guardSet ret = guardSet_newEmpty ();
+
+      ret->tguard = sRefSet_newCopy (g->fguard);      
+      ret->fguard = sRefSet_newCopy (g->tguard);
+
+      return ret;
+    }
+  return guardSet_undefined;
+}
+
+/*@only@*/ guardSet guardSet_copy (/*@temp@*/ guardSet g)
+{
+  if (g != guardSet_undefined)
+    {
+      guardSet ret = guardSet_newEmpty ();
+
+      ret->tguard = sRefSet_newCopy (g->tguard);      
+      ret->fguard = sRefSet_newCopy (g->fguard);
+
+      return ret;
+    }
+  return guardSet_undefined;
+}
+  
+guardSet guardSet_addTrueGuard (/*@returned@*/ guardSet g, sRef s)
+{
+  if (sRef_isMeaningful (s))
+    {
+      if (g == guardSet_undefined)
+	{
+	  g = guardSet_newEmpty ();
+	}
+      
+      g->tguard = sRefSet_insert (g->tguard, s);
+    }
+
+  return g;
+}
+
+guardSet guardSet_addFalseGuard (/*@returned@*/ guardSet g, sRef s)
+{
+  if (sRef_isMeaningful (s))
+    {
+      if (g == guardSet_undefined)
+	{
+	  g = guardSet_newEmpty ();
+	}
+      
+      g->fguard = sRefSet_insert (g->fguard, s);
+    }
+
+  return g;
+}
+
+/*@only@*/ cstring guardSet_unparse (guardSet g)
+{
+  if (g == guardSet_undefined)
+    {
+      return (cstring_makeLiteral (""));
+    }
+  else
+    {
+      return (message ("not null: %q / prob null: %q",
+		       sRefSet_unparseDebug (g->tguard),
+		       sRefSet_unparseDebug (g->fguard)));
+    }
+}
+
+void guardSet_free (/*@only@*/ guardSet g)
+{
+  if (g == guardSet_undefined) return;
+
+  sRefSet_free (g->tguard);
+  sRefSet_free (g->fguard);
+  
+  sfree (g);
+}
+
+bool
+guardSet_isGuarded (guardSet g, sRef s)
+{
+  if (g == guardSet_undefined) return FALSE;
+  
+  return (sRefSet_member (g->tguard, s));
+}
+
+bool
+guardSet_isProbableNull (guardSet g, sRef s)
+{
+  bool ret;
+
+  if (g == guardSet_undefined) return FALSE;
+
+  ret = sRefSet_member (g->fguard, s);
+  return ret;
+}
+
+bool guardSet_isEmpty (guardSet g)
+{
+  if (guardSet_isDefined (g))
+    {
+      return (sRefSet_isEmpty (g->tguard) && sRefSet_isEmpty (g->fguard));
+    }
+  else
+    {
+      return TRUE;
+    }
+}
diff --git a/src/hashTable.c b/src/hashTable.c
new file mode 100644
index 0000000..39914e4
--- /dev/null
+++ b/src/hashTable.c
@@ -0,0 +1,469 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** hashTable.c
+**
+** Since hsearch defined in  only allows one hash table,
+** I'll implement my own.
+**
+** Try to find a decent hash function, etc. later...
+**
+** hashTable is from string -> unsigned
+**
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+/*@constant null hbucket hbucket_undefined; @*/
+# define hbucket_undefined 0
+
+static /*@truenull@*/ bool hbucket_isNull (/*@null@*/ hbucket h) 
+{ 
+  return (h == hbucket_undefined); 
+}
+
+static hentry
+hentry_create (cstring key, int val)
+{
+  hentry h;
+
+  h.key = key;
+  h.val = val;
+  return (h);
+}
+
+static bool
+hbucket_isEmpty (hbucket h)
+{
+  return (h == hbucket_undefined || h->size == 0);
+}
+
+static cstring
+hbucket_unparse (hbucket h)
+{
+  cstring s = cstring_undefined;
+
+  if (!hbucket_isNull (h))
+    {
+      int i;
+      
+      for (i = 0; i < h->size; i++)
+	{
+	  s = message ("%q %s:%d", s, h->entries[i].key, h->entries[i].val);
+	}
+    }
+
+  return s;
+}
+
+static hbucket
+hbucket_single (hentry e)
+{
+  hbucket h = (hbucket) dmalloc (sizeof (*h));
+  
+  h->size = 1;
+  h->nspace = HBUCKET_BASESIZE - 1;
+  h->entries = (hentry *) dmalloc (HBUCKET_BASESIZE * sizeof (*h->entries));
+  h->entries[0] = e;
+  
+  return (h);
+}
+
+static void
+hbucket_grow (/*@notnull@*/ hbucket h)
+{
+  int i;
+  hentry *newentries; 
+  
+  h->nspace += HBUCKET_BASESIZE;
+
+  newentries = (hentry *) 
+    dmalloc ((h->size + HBUCKET_BASESIZE) * sizeof (*newentries));
+  
+  for (i = 0; i < h->size; i++) 
+    {
+      newentries[i] = h->entries[i]; 
+    }
+  
+  sfree (h->entries);
+  h->entries = newentries; 
+}
+
+static int hbucket_lookup (hbucket p_h, cstring p_key);
+
+/*
+** bizarre duplicate behaviour
+** required for duplicate entries
+*/
+
+static void
+hbucket_add (/*@notnull@*/ hbucket h, hentry e)
+{
+  int exloc = hbucket_lookup (h, e.key);
+
+  
+  if (exloc != HBUCKET_DNE)
+    {
+      h->entries[exloc].key = e.key;
+      h->entries[exloc].val = e.val;
+      return;
+    }
+
+  if (h->nspace == 0)
+    {
+            hbucket_grow (h);
+    }
+
+  h->entries[h->size] = e;
+  h->size++;
+  h->nspace--;
+}
+
+static int
+hbucket_ncollisions (hbucket h)
+{
+  if (!hbucket_isNull (h) && (h->size > 1))
+    return (h->size - 1);
+  else
+    return 0;
+}
+
+int
+hbucket_lookup (hbucket h, cstring key)
+{
+  if (!hbucket_isNull (h))
+    {
+      int i;
+      
+      for (i = 0; i < h->size; i++)
+	{
+	  if (cstring_equal (h->entries[i].key, key))
+	    {
+	      return h->entries[i].val;
+	    }
+	}
+    }
+
+  return HBUCKET_DNE;
+}
+
+static
+void hbucket_free (/*@only@*/ hbucket h)
+{
+  if (!hbucket_isNull (h))
+    {
+      sfree (h->entries);
+      sfree (h);
+    }
+}
+
+void 
+hashTable_free (/*@only@*/ hashTable h)
+{
+  int i;
+
+  for (i = 0; i < h->size; i++)
+    {
+      hbucket_free (h->buckets[i]);
+    }
+
+  sfree (h->buckets);
+  sfree (h);
+}
+  
+static int
+hashTable_countCollisions (hashTable h)
+{
+  int nc = 0;
+  int i;
+
+  for (i = 0; i < h->size; i++)
+    {
+      nc += hbucket_ncollisions (h->buckets[i]);
+    }
+
+  return (nc);
+}
+
+
+static int
+hashTable_countEmpty (hashTable h)
+{
+  int nc = 0;
+  int i;
+
+  for (i = 0; i < h->size; i++)
+    {
+      if (hbucket_isEmpty (h->buckets[i]))
+	{
+	  nc++;
+	}
+    }
+
+  return (nc);
+}
+
+/*
+** hash function snarfed from quake/hash.c Hash_String
+** by Stephen Harrison
+*/
+
+/*
+ * Here are 256 random numbers for use in the hash function
+ */
+
+/*@+ignoresigns@*/
+static unsigned int RandomNumbers[256] =
+{
+#include "256_random_numbers.nf"
+};
+/*@=ignoresigns@*/
+
+static unsigned int 
+hashTable_hashValue (hashTable h, cstring key)
+{
+  char *p;
+  unsigned int hash_value = 0;
+
+  for (p = cstring_toCharsSafe (key); *p != '\0'; p++)
+    {
+      hash_value = (hash_value << 1) ^ RandomNumbers[*p % 256];
+    }
+
+  return (hash_value % h->size);
+}
+
+static /*@exposed@*/ hbucket
+hashTable_hash (hashTable h, cstring key)
+{
+  return h->buckets[hashTable_hashValue (h, key)];
+}
+
+
+/*@only@*/ hashTable
+hashTable_create (int size)
+{
+  int i;
+  hashTable h = (hashTable) dmalloc (sizeof (*h));
+  
+  h->size = size;
+  h->nentries = 0;
+  h->buckets = (hbucket *) dmalloc (sizeof (*h->buckets) * size);
+  
+  /*@+loopexec@*/
+  for (i = 0; i < size; i++)
+    {
+      h->buckets[i] = hbucket_undefined;
+    }
+  /*@-loopexec@*/
+  return h;
+}
+
+/*@-mustfree@*/
+static /*@unused@*/ void
+hashTable_print (hashTable h)
+{
+  int i;
+
+  for (i = 0; i < h->size; i++)
+    {
+      hbucket hb = h->buckets[i];
+
+      if (hb != NULL)
+	{
+	  llmsg (message ("%d. %s\n", i, hbucket_unparse (hb)));
+	}
+    }
+
+  llmsg (message ("size: %d, collisions: %d, empty: %d", 
+		  h->size, 
+		  hashTable_countCollisions (h),
+		  hashTable_countEmpty (h)));
+}
+/*@=mustfree@*/
+
+/*@only@*/ cstring
+hashTable_stats (hashTable h)
+{
+  return (message ("size: %d, collisions: %d, empty: %d\n", 
+			h->size, hashTable_countCollisions (h),
+			hashTable_countEmpty (h)));
+}
+
+static void
+hashTable_addEntry (hashTable h, hentry e)
+{
+  unsigned int hindex = hashTable_hashValue (h, e.key);
+  /*
+  ** using
+  **   hbucket hb = h->buckets[hindex];  
+  ** instead reveals a bug I don't want to deal with right now!
+  */
+
+  h->nentries++;
+  
+  if (hbucket_isNull (h->buckets[hindex]))
+    {
+      h->buckets[hindex] = hbucket_single (e); 
+    }
+  else
+    {
+      hbucket_add (h->buckets[hindex], e);
+    }
+}
+
+void
+hashTable_insert (hashTable h, cstring key, int value)
+{
+  unsigned int hindex;
+  hbucket hb;
+  hentry e;  
+
+  
+  h->nentries++;
+
+  /*
+  ** rehashing based (loosely) on code by Steve Harrison
+  */
+
+  if (h->nentries * 162 > h->size * 100) 
+    {
+      int i;
+      int oldsize = h->size;
+      int newsize = 1 + ((oldsize * 26244) / 10000); /* 26244 = 162^2 */
+      hbucket *oldbuckets = h->buckets;
+
+      
+      h->size = newsize;  
+      h->nentries = 0;
+      h->buckets = (hbucket *) dmalloc (sizeof (*h->buckets) * newsize);
+
+      /*@+loopexec@*/
+      for (i = 0; i < newsize; i++)
+	{
+	  h->buckets[i] = hbucket_undefined;
+	}
+      /*@=loopexec@*/
+      
+      for (i = 0; i < oldsize; i++)
+	{
+	  hbucket bucket = oldbuckets[i];
+	  
+	  if (!hbucket_isNull (bucket))
+	    {
+	      int j;
+
+	      for (j = 0; j < bucket->size; j++)
+		{
+		  hashTable_addEntry (h, bucket->entries[j]);
+		}
+
+	      sfree (bucket);
+	    }
+	}
+
+      sfree (oldbuckets);
+    }
+
+  
+  e = hentry_create (key, value);
+  hindex = hashTable_hashValue (h, key);
+  hb = h->buckets[hindex];
+  
+  if (hbucket_isNull (hb))
+    {
+            h->buckets[hindex] = hbucket_single (e);
+    }
+  else
+    {
+            hbucket_add (hb, e);
+    }
+
+  }
+
+int
+hashTable_lookup (hashTable h, cstring key)
+{
+  hbucket hb = hashTable_hash (h, key);
+
+  return (hbucket_lookup (hb, key));
+}
+
+/*
+** This is needed if oldkey is going to be released.
+*/
+
+void
+hashTable_replaceKey (hashTable h, cstring oldkey, /*@dependent@*/ cstring newkey)
+{
+  hbucket hb = hashTable_hash (h, oldkey);
+
+  llassert (cstring_equal (oldkey, newkey));
+
+  if (!hbucket_isNull (hb))
+    {
+      int i;
+      
+      for (i = 0; i < hb->size; i++)
+	{
+	  if (cstring_equal (hb->entries[i].key, oldkey))
+	    {
+	      hb->entries[i].key = newkey;
+	      return;
+	    }
+	}
+    }
+
+  llbug (message ("hashTable_replaceKey: %s not found", oldkey));
+}
+
+void
+hashTable_remove (hashTable h, cstring key)
+{
+  hbucket hb = hashTable_hash (h, key);
+
+  if (!hbucket_isNull (hb))
+    {
+      int i;
+      
+      for (i = 0; i < hb->size; i++)
+	{
+	  if (cstring_equal (hb->entries[i].key, key))
+	    {
+	      if (i < hb->size - 1)
+		{
+		  hb->entries[i] = hb->entries[hb->size - 1];
+		}
+	      
+	      hb->size--;
+	      return;
+	    }
+	}
+    }
+
+  llbug (message ("hashTable_removeKey: %s not found", key));
+}
+
+
diff --git a/src/idDecl.c b/src/idDecl.c
new file mode 100644
index 0000000..fb66c43
--- /dev/null
+++ b/src/idDecl.c
@@ -0,0 +1,181 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** idDecl.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+/*@only@*/ idDecl
+  idDecl_create (/*@only@*/ cstring s, /*@only@*/ qtype t)
+{
+  idDecl d = (idDecl) dmalloc (sizeof (*d));
+
+  d->id = s;
+  d->typ = t;
+
+  return (d);
+}
+
+void
+idDecl_free (idDecl t)
+{
+  if (idDecl_isDefined (t))
+    {
+      cstring_free (t->id);
+      qtype_free (t->typ);
+      sfree (t);
+    }
+}
+
+cstring
+idDecl_unparse (idDecl d)
+{
+  if (idDecl_isDefined (d))
+    {
+      return (message ("%s : %q", d->id, qtype_unparse (d->typ)));
+    }
+  else
+    {
+      return (cstring_makeLiteral (""));
+    }
+}
+
+/*@observer@*/ cstring
+idDecl_observeId (idDecl d)
+{
+  if (idDecl_isDefined (d))
+    {
+      return (d->id);
+    }
+  else
+    {
+      return cstring_undefined;
+    }
+}
+
+qtype
+idDecl_getTyp (idDecl d)
+{
+  llassert (idDecl_isDefined (d));
+
+  return d->typ;
+}
+
+ctype
+idDecl_getCtype (idDecl d)
+{
+  if (idDecl_isDefined (d))
+    {
+      return (qtype_getType (d->typ));
+    }
+  else
+    {
+      return ctype_unknown;
+    }
+}
+
+qualList
+idDecl_getQuals (idDecl d)
+{
+  if (idDecl_isDefined (d))
+    {
+      return (qtype_getQuals (d->typ));
+    }
+  else
+    {
+      return qualList_undefined;
+    }
+}
+
+void
+idDecl_addQual (idDecl d, qual q)
+{
+  llassert (idDecl_isDefined (d));
+
+  (void) qtype_addQual (d->typ, q);
+}
+
+void
+idDecl_setTyp (idDecl d, qtype c)
+{
+  llassert (idDecl_isDefined (d));
+
+  qtype_free (d->typ);
+  d->typ = c;
+}
+
+idDecl
+idDecl_replaceCtype (/*@returned@*/ idDecl d, ctype c)
+{
+  llassert (idDecl_isDefined (d));
+
+  qtype_setType (d->typ, c);
+  return d;
+}
+
+idDecl
+idDecl_fixBase (/*@returned@*/ idDecl t, qtype b)
+{
+  llassert (idDecl_isDefined (t));
+
+  t->typ = qtype_newQbase (t->typ, b);
+  return t;
+}
+
+idDecl
+idDecl_fixParamBase (/*@returned@*/ idDecl t, qtype b)
+{
+  qtype q;
+  ctype c;
+
+  llassert (idDecl_isDefined (t));
+
+  q = qtype_newQbase (t->typ, b);
+  c = qtype_getType (q);
+
+  /*
+  ** For some reason, C adds an implicit pointer to function
+  ** parameters.  It is "optional" syntax.
+  */
+
+  if (ctype_isFunction (c) && !ctype_isPointer (c))
+    {
+      qtype_setType (q, ctype_makePointer (c));
+    }
+
+  t->typ = q;
+  /* LCLint thinks t->typ is kept. */
+  /*@-compmempass@*/ return t; /*@=compmempass@*/
+}
+
+idDecl
+idDecl_expectFunction (/*@returned@*/ idDecl d)
+{
+  llassert (idDecl_isDefined (d));
+
+  qtype_setType (d->typ, ctype_expectFunction (qtype_getType (d->typ)));
+  return d;
+}
diff --git a/src/idDeclList.c b/src/idDeclList.c
new file mode 100644
index 0000000..8f51887
--- /dev/null
+++ b/src/idDeclList.c
@@ -0,0 +1,109 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** idDeclList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+idDeclList
+  idDeclList_singleton (/*@only@*/ idDecl e)
+{
+  idDeclList s = (idDeclList) dmalloc (sizeof (*s));
+  
+  s->nelements = 1;
+  s->nspace = idDeclListBASESIZE - 1; 
+  s->elements = (idDecl *) dmalloc (sizeof (*s->elements) * idDeclListBASESIZE);
+  s->elements[0] = e;
+  return (s);
+}
+
+static void
+idDeclList_grow (idDeclList s)
+{
+  int i;
+  idDecl *newelements;
+  
+  s->nspace += idDeclListBASESIZE; 
+  newelements = (idDecl *) dmalloc (sizeof (*newelements) 
+				    * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i]; 
+    }
+  
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+idDeclList idDeclList_add (idDeclList s, /*@only@*/ idDecl el)
+{
+  if (s->nspace <= 0)
+    idDeclList_grow (s);
+  
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+/*@only@*/ cstring
+idDeclList_unparse (idDeclList s)
+{
+   int i;
+   cstring st = cstring_makeLiteral ("[");
+
+   for (i = 0; i < s->nelements; i++)
+     {
+       if (i == 0)
+	 {
+	   st = message ("%q %q", st, idDecl_unparse (s->elements[i]));
+	 }
+       else
+	 st = message ("%q, %q", st, idDecl_unparse (s->elements[i]));
+     }
+   
+   st = message ("%q ]", st);
+   return st;
+}
+
+void
+idDeclList_free (idDeclList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      idDecl_free (s->elements[i]);
+    }
+  
+  sfree (s->elements);
+  sfree (s);
+}
diff --git a/src/importNodeList.c b/src/importNodeList.c
new file mode 100644
index 0000000..d8eb700
--- /dev/null
+++ b/src/importNodeList.c
@@ -0,0 +1,114 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** importNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ importNodeList
+importNodeList_new ()
+{
+  importNodeList s = (importNodeList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = importNodeListBASESIZE;
+  s->elements = (importNode *) 
+    dmalloc (sizeof (*s->elements) * importNodeListBASESIZE);
+  
+  return (s);
+}
+
+static void
+importNodeList_grow (importNodeList s)
+{
+  int i;
+  importNode *newelements;
+
+  s->nspace += importNodeListBASESIZE;
+
+  newelements = (importNode *) dmalloc (sizeof (*newelements) 
+					* (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+importNodeList
+importNodeList_add (importNodeList s, importNode el)
+{
+  if (s->nspace <= 0)
+    importNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+  return s;
+}
+
+/*@only@*/ cstring
+importNodeList_unparse (importNodeList s)
+{
+  bool first = TRUE;
+  cstring st = cstring_undefined;
+
+  importNodeList_elements (s, current)
+  {
+    if (first)
+      {
+	st = cstring_copy (ltoken_unparse (current->val));
+	first = FALSE;
+      }
+    else
+      {
+	st = message ("%q, %s", st, ltoken_unparse (current->val));
+      }
+  } end_importNodeList_elements;
+
+  return st;
+}
+
+void
+importNodeList_free (importNodeList s)
+{
+  int i;
+  
+  for (i = 0; i < s->nelements; i++)
+    {
+      importNode_free (s->elements[i]); 
+    }
+  
+  sfree (s->elements);
+  sfree (s);
+}
diff --git a/src/imports.c b/src/imports.c
new file mode 100644
index 0000000..209957e
--- /dev/null
+++ b/src/imports.c
@@ -0,0 +1,383 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** imports.c
+**
+** module for importing LCL specs.
+**
+**  AUTHOR:
+**	Yang Meng Tan,
+**         Massachusetts Institute of Technology
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h" 
+# include "osd.h"
+# include "llgrammar.h" /* need simpleOp, MULOP and logicalOp in makeInfixTermNode */
+# include "lclscan.h"
+# include "checking.h"
+# include "imports.h"
+# include "lslparse.h"
+# include "lh.h"
+# include "llmain.h"
+# include "portab.h"
+# include "herald.h"
+
+void
+outputLCSFile (char *path, char *msg, char *specname)
+{
+  static bool haserror = FALSE;
+  char *sfile = mstring_concat (specname, ".lcs");
+  char *outfile = mstring_concat (path, sfile);
+  char *s;
+  FILE *outfptr = fopen (outfile, "w");
+  sfree (sfile);
+
+  DPRINTF (("Output lcl file: %s / %s / %s", path, specname, outfile));
+  
+  /* check write permission */
+  
+  if (outfptr == 0)
+    {				/* fopen fails */
+      if (!haserror)
+	{
+	  lclplainerror (message ("Cannot write to output file: %s", 
+				  cstring_fromChars (outfile)));
+	  haserror = TRUE;
+	}
+      sfree (outfile);
+      return;
+    }
+
+  fprintf (outfptr, msg);
+  fprintf (outfptr, "%s\n", LCL_PARSE_VERSION);
+  
+  /* output line %LCLimports foo bar ... */
+  fprintf (outfptr, "%%LCLimports ");
+
+  lsymbolSet_elements (g_currentImports, sym)
+    {
+      s = lsymbol_toChars (sym);
+
+      if (s != NULL && !mstring_equal (s, specname))
+	{
+	  fprintf (outfptr, "%s ", s);
+	}
+    } end_lsymbolSet_elements;
+  
+  fprintf (outfptr, "\n");
+  
+  sort_dump (outfptr, TRUE);
+  symtable_dump (g_symtab, outfptr, TRUE);
+
+  check (fclose (outfptr) == 0);  
+  sfree (outfile);  
+}
+
+void
+importCTrait (void)
+{
+  char **infile = (char **) dmalloc (sizeof (*infile));
+  filestatus status = osd_findOnLarchPath (CTRAITSYMSNAME, infile);
+
+  
+  switch (status)
+    {
+    case OSD_FILEFOUND:
+      /*
+      ** This line was missing before version 2.3f.  Bug fix by Mike Smith.
+      **    This looks like a bug - infile is already fully qualified path  
+      **    parseSignatures() adds another path to the front and fails to   
+      **    open the file.                                                  
+      */
+	   
+      (void) parseSignatures (cstring_fromChars (CTRAITSYMSNAME));
+      (void) parseSignatures (cstring_fromChars (*infile));
+      break;
+    case OSD_FILENOTFOUND:
+      /* try spec name */
+      status = osd_findOnLarchPath (CTRAITSPECNAME, infile);
+
+      if (status == OSD_FILEFOUND)
+	{
+	  callLSL (CTRAITSPECNAME,
+		   cstring_toCharsSafe
+		   (message ("includes %s (%s for String)",
+			     cstring_fromChars (CTRAITFILENAMEN), 
+			     cstring_fromChars (sort_getName (sort_cstring)))));
+	  break;
+	}
+      else
+	{
+	  lldiagmsg 
+	    (message ("Unable to find %s or %s.  Check LARCH_PATH environment variable.",
+		      cstring_fromChars (CTRAITSYMSNAME), 
+		      cstring_fromChars (CTRAITSPECNAME)));
+	  llexit (LLFAILURE);
+	}
+    case OSD_PATHTOOLONG:
+      lclbug (message ("importCTrait: the concatenated directory and file "
+		       "name are too long: %s: "
+		       "continuing without it", 
+		       cstring_fromChars (CTRAITSPECNAME)));
+      break;
+    }
+
+  sfree (*infile);
+  sfree (infile);
+}
+
+/*
+** processImport --- load imports from file
+**
+**    impkind: IMPPLAIN  file on SPEC_PATH
+**                       # include "./file.h" if it exists,
+**			 # include "/file.h" if not.
+**			   (warn if neither exists)
+**            IMPBRACKET file in default LCL imports directory
+**                       # include 
+**            IMPQUOTE   file directly
+**                       # include "file.h"
+*/
+
+void
+processImport (lsymbol importSymbol, ltoken tok, impkind kind)
+{
+  bool readableP, oldexporting;
+  bool oldFormat = FALSE;
+  tsource *imported, *imported2, *lclsource;
+  char *bufptr, *tmpbufptr, *cptr;
+  char *name;
+  lsymbol sym;
+  char importName[MAX_NAME_LENGTH + 1], *importFileName, *realfname;
+  char *path;
+  char *fpath, *fpath2;
+  mapping *map;
+  filestatus ret;
+
+  importFileName = lsymbol_toCharsSafe (importSymbol);
+  name = mstring_concat (importFileName, IO_SUFFIX);
+  realfname = name;
+
+  /*
+  ** find .lcs file
+  */
+  
+  switch (kind)
+    {
+    case IMPPLAIN:
+      path = cstring_toCharsSafe 
+	(message ("%s%c%s", cstring_fromChars (g_localSpecPath), SEPCHAR, context_getLarchPath ()));
+      
+      break;
+    case IMPBRACKET:
+      path = mstring_copy (cstring_toCharsSafe (context_getLCLImportDir ()));
+      break;
+    case IMPQUOTE:
+      path = mstring_copy (g_localSpecPath);
+      break;
+    default:
+      path = mstring_createEmpty (); /* suppress gcc error message */
+      llbuglit ("bad imports case\n");
+    }
+
+  if ((ret = osd_getPath (path, realfname, &fpath)) != OSD_FILEFOUND)
+    {
+      char *fname2;
+      
+      if (ret == OSD_PATHTOOLONG)
+	{
+	  llfatalerrorLoc (cstring_makeLiteral ("Path too long"));
+	}
+      
+      imported2 = tsource_create (importFileName, LCL_SUFFIX, FALSE);
+      fname2 = tsource_fileName (imported2);
+      
+      
+
+      if (osd_getPath (path, fname2, &fpath2) == OSD_FILEFOUND)
+	{
+	  llfatalerrorLoc
+	    (message ("Specs must be processed before it can be imported: %s", 
+		      cstring_fromChars (fpath2)));
+	}
+      else
+	{
+	  if (kind == IMPPLAIN || kind == IMPQUOTE)
+	    llfatalerrorLoc (message ("Cannot find file to import: %s", 
+				       cstring_fromChars (realfname)));
+	  else
+	    llfatalerrorLoc (message ("Cannot find standard import file: %s",
+				       cstring_fromChars (realfname)));
+	}
+    }
+
+  
+  imported = tsource_create (fpath, IO_SUFFIX, FALSE);
+  
+  
+  readableP = tsource_open (imported);
+    
+  if (!readableP)
+    {			/* can't read ? */
+      llfatalerrorLoc (message ("Cannot open import file for reading: %s",
+				 cstring_fromChars (tsource_fileName (imported))));
+    }
+
+  bufptr = tsource_nextLine (imported);
+
+  if (bufptr == 0)
+    {
+      llerror (FLG_SYNTAX, message ("Import file is empty: %s", 
+				    cstring_fromChars (tsource_fileName (imported))));
+      sfree (name);
+      (void) tsource_close (imported);
+      tsource_free (imported);
+
+      sfree (path);
+      return;
+    }
+
+  /* was it processed successfully ? */
+  if (firstWord (bufptr, "%FAILED"))
+    {
+      llfatalerrorLoc
+	(message ("Imported file was not checked successfully: %s.", 
+		  cstring_fromChars (name)));
+    }
+  
+  /** is it generated by the right version of the checker? 
+   **
+   ** old .lcs files start with %PASSED
+   ** new (compressed) files start with %LCS 
+   */
+  
+  if (firstWord (bufptr, "%PASSED"))
+    {
+      /* %PASSED Output from LCP Version 2.* and 3.* */
+      /*                     1234567890123*/
+      /*                                 +*/
+
+      cptr = strstr (bufptr, "LCP Version");
+      
+      if (cptr != NULL)
+	{
+	  cptr += 12;
+	  if (*cptr != '2' && *cptr != '3')
+	    {
+	      llfatalerrorLoc (message ("Imported file is obsolete: %s.",
+					 cstring_fromChars (bufptr)));
+	    }
+	}
+      oldFormat = TRUE;
+    }
+  else 
+    {
+      if (!firstWord (bufptr, "%LCS"))
+	{
+	  llfatalerrorLoc (message ("Imported file is not in correct format: %s.",
+				    cstring_fromChars (bufptr)));
+	}
+    }
+  
+  /* push the imported LCL spec onto g_currentImports */
+
+  context_enterImport ();
+  
+  bufptr = tsource_nextLine (imported);
+  llassert (bufptr != NULL);
+
+  tmpbufptr = bufptr;
+
+    /* expect %LCLimports foo bar ... */
+  if (firstWord (bufptr, "%LCLimports "))
+    {
+      bufptr = bufptr + strlen ("%LCLimports ");
+      while (sscanf (bufptr, "%s", importName) == 1)
+	{
+	  bufptr = bufptr + strlen (importName) + 1;	/* 1 for space */
+	  sym = lsymbol_fromChars (importName);
+	  if (sym == importSymbol || 
+	      lsymbolSet_member (g_currentImports, sym))
+	    {
+	      /* ensure that the import list does not contain itself: an
+		 invariant useful for checking imports cycles. */
+	      lclsource = LCLScanSource ();
+	      lclfatalerror (tok, 
+			     message ("Imports cycle: %s.lcl imports %s",
+				      cstring_fromChars (importFileName),
+				      cstring_fromChars (importName)));
+	    }	  
+	  /* push them onto g_currentImports */
+	  /* evs - 94 Apr 3:  I don't think it should do this! */
+	  /* (void) lsymbolSet_insert (g_currentImports, sym); */
+	}
+    }
+  else
+    {
+      lclsource = LCLScanSource ();
+      lclfatalerror (tok, message ("Unexpected line in imported file %s: %s", 
+				   cstring_fromChars (name), 
+				   cstring_fromChars (bufptr)));
+    }
+	  
+  /* read in the imported info */
+  oldexporting = sort_setExporting (TRUE);
+
+  map = mapping_create ();
+
+  /* tok for error line numbering */
+
+  if (oldFormat)
+    {
+            sort_import (imported, tok, map);	
+    }
+
+  (void) sort_setExporting (oldexporting);
+
+  /* sort_import updates a mapping of old anonymous sorts to new
+     anonymous sort that is needed in symtable_import */
+  /* mapping_print (map); */
+  
+  if (oldFormat)
+    {
+      symtable_import (imported, tok, map);
+    }
+  else
+    {
+      /* symtable_loadImport (imported, tok, map); */
+    }
+  
+  check (tsource_close (imported));
+  tsource_free (imported);
+
+  sfree (map);
+  sfree (name);
+  sfree (path);
+
+  context_leaveImport ();  
+}
+
+
+
diff --git a/src/initDeclNodeList.c b/src/initDeclNodeList.c
new file mode 100644
index 0000000..9ac30c7
--- /dev/null
+++ b/src/initDeclNodeList.c
@@ -0,0 +1,118 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** initDeclNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ initDeclNodeList
+initDeclNodeList_new ()
+{
+  initDeclNodeList s = (initDeclNodeList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = initDeclNodeListBASESIZE;
+  s->elements = (initDeclNode *)
+    dmalloc (sizeof (*s->elements) * initDeclNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+initDeclNodeList_grow (initDeclNodeList s)
+{
+  int i;
+  initDeclNode *newelements;
+
+  s->nspace += initDeclNodeListBASESIZE;
+  newelements = (initDeclNode *) dmalloc (sizeof (*newelements)
+					  * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+initDeclNodeList
+initDeclNodeList_add (initDeclNodeList s, initDeclNode el)
+{
+  if (s->nspace <= 0)
+    initDeclNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+/*@only@*/ cstring
+initDeclNodeList_unparse (initDeclNodeList s)
+{
+  cstring st = cstring_undefined;
+  bool first = TRUE;
+
+  initDeclNodeList_elements (s, current)
+  {
+    if (first)
+      {
+	first = FALSE;
+	st = declaratorNode_unparse (current->declarator);
+      }
+    else
+      {
+	st = message ("%q, %q", st, declaratorNode_unparse (current->declarator));
+      }
+
+    if (current->value != (termNode) 0)
+      {
+	st = message ("%q = %q", st, termNode_unparse (current->value));
+      }
+  } end_initDeclNodeList_elements;
+
+  return st;
+}
+
+void
+initDeclNodeList_free (initDeclNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      initDeclNode_free (s->elements[i]);
+    }
+
+  sfree (s->elements);
+  sfree (s);
+}
diff --git a/src/intSet.c b/src/intSet.c
new file mode 100644
index 0000000..7fdf0b3
--- /dev/null
+++ b/src/intSet.c
@@ -0,0 +1,176 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** intSet.c
+**
+** based on set_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "intSet.h"
+
+/*@only@*/ intSet
+intSet_new ()
+{
+  intSet s = (intSet) dmalloc (sizeof (*s));
+  
+  s->entries = 0;
+  s->nspace = intSetBASESIZE;
+  s->elements = (int *) dmalloc (sizeof (*s->elements) * intSetBASESIZE);
+
+  return (s);
+}
+
+static void
+intSet_grow (intSet s)
+{
+  int i;
+  int *newelements;
+
+  s->nspace = intSetBASESIZE;
+  newelements = (int *) dmalloc (sizeof (*newelements) * (s->entries + s->nspace));
+
+  for (i = 0; i < s->entries; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements; 
+}
+
+/*
+** Ensures: if *e \in *s
+**          then unchanged (*s) & result = false
+**          else *s' = insert (*s, *e) & result = true
+** Modifies: *s
+*/
+
+bool
+intSet_insert (intSet s, int el)
+{
+  int i;
+
+  for (i = 0; i < s->entries; i++)
+    {
+      if (s->elements[i] >= el)
+	break;
+    }
+
+  if (s->entries > 0 && s->elements[i] == el)
+    {
+      return FALSE;
+    }
+  else
+    {
+      if (s->nspace <= 0)
+	intSet_grow (s);
+
+      s->nspace--;
+
+      if (i == (s->entries - 1))
+	{
+	  s->elements[s->entries] = el;
+	}
+      else
+	{
+	  int j;
+	  
+	  for (j = s->entries; j > i; j--)
+	    {
+	      s->elements[j] = s->elements[j-1];
+	    }
+	  s->elements[i] = el;
+	}
+      
+      s->entries++;      
+      return TRUE;
+    }
+}
+
+bool
+intSet_member (intSet s, int el)
+{
+  int i;
+
+  for (i = 0; i < s->entries; i++)
+    {
+      if (el == s->elements[i])
+	{
+	  return TRUE;
+	}
+      if (el > s->elements[i]) 
+	{
+	  return FALSE;
+	}
+    }
+  return FALSE;
+}
+
+# ifndef NOLCL
+/*@only@*/ cstring
+intSet_unparseText (intSet s)
+{
+  int i;
+  cstring st = cstring_undefined;
+  int lastentry = s->entries - 1;
+
+  for (i = 0; i < s->entries; i++)
+    {
+      if (i == 0)
+	st = message ("%d", s->elements[i]);
+      else if (i == lastentry)
+	st = message ("%q or %d", st, s->elements[i]);
+      else
+	st = message ("%q, %d", st, s->elements[i]);
+    }
+
+  return st;
+}
+# endif
+
+/*@only@*/ cstring
+intSet_unparse (intSet s)
+{
+  int i;
+  cstring st = cstring_makeLiteral ("{");
+
+  for (i = 0; i < s->entries; i++)
+    {
+      st = message ("%q %d", st, s->elements[i]);
+    }
+
+  st = message ("%q}", st);
+  return st;
+}
+
+void
+intSet_free (intSet s)
+{
+  sfree (s->elements); 
+  sfree (s);
+}
diff --git a/src/interfaceNodeList.c b/src/interfaceNodeList.c
new file mode 100644
index 0000000..ec708a0
--- /dev/null
+++ b/src/interfaceNodeList.c
@@ -0,0 +1,114 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** interfaceNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ interfaceNodeList
+interfaceNodeList_new ()
+{
+  interfaceNodeList s = (interfaceNodeList) dmalloc (sizeof (*s));
+
+  s->nelements = 0;
+  s->nspacelow = interfaceNodeListGROWLOW;
+  s->nspacehigh = interfaceNodeListGROWHI;
+  s->elementsroot = (interfaceNode *) dmalloc (sizeof (*s->elements)
+					       * interfaceNodeListBASESIZE);
+  s->elements = s->elementsroot + interfaceNodeListGROWLOW;
+
+  return (s);
+}
+
+static void
+interfaceNodeList_grow (interfaceNodeList s)
+{
+  int i;
+  interfaceNode *newelements; 
+  
+  newelements = (interfaceNode *) dmalloc 
+    (sizeof (*newelements) * (s->nelements + interfaceNodeListBASESIZE));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i + interfaceNodeListGROWLOW] = s->elements[i];
+    }
+  
+  s->nspacelow = interfaceNodeListGROWLOW;
+  s->nspacehigh = interfaceNodeListGROWHI; 
+  
+  sfree (s->elementsroot);  
+  s->elementsroot = newelements;
+
+  s->elements = newelements + s->nspacelow;
+}
+
+interfaceNodeList
+interfaceNodeList_addh (interfaceNodeList s, interfaceNode el)
+{
+  llassert (interfaceNodeListGROWHI > 0);
+
+  if (s->nspacehigh <= 0)
+    interfaceNodeList_grow (s);
+
+  s->nspacehigh--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+void 
+interfaceNodeList_addl (interfaceNodeList s, /*@keep@*/ interfaceNode el)
+{
+  llassert (interfaceNodeListGROWLOW > 0);
+
+  if (s->nspacelow <= 0)
+    interfaceNodeList_grow (s);
+
+  s->nspacelow--;
+  s->elements--;
+  s->elements[0] = el;
+  s->nelements++;
+}
+
+void
+interfaceNodeList_free (interfaceNodeList s)
+{
+  int i;
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      interfaceNode_free (s->elements[i]);
+    }
+
+  sfree (s->elementsroot);
+  sfree (s);
+}
diff --git a/src/lastversion b/src/lastversion
new file mode 100644
index 0000000..b335e44
--- /dev/null
+++ b/src/lastversion
@@ -0,0 +1 @@
+2.5m
diff --git a/src/lclctypes.c b/src/lclctypes.c
new file mode 100644
index 0000000..7880cb3
--- /dev/null
+++ b/src/lclctypes.c
@@ -0,0 +1,172 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lclctypes.c
+**
+** This contains definitions used in processing C builtin types.
+**
+** WARNING: there is a different file ctype.c for handling types
+**          in the C checking of lclint.  This is only for handling
+**          C builtin types in LCL files.
+**
+**  AUTHORS:
+**
+**      Gary Feldman, Technical Languages and Environements, DECspec project
+**	Joe Wild, Technical Languages and Environements, DECspec project
+**
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+typedef struct
+{
+  bits pt;
+  TypeSpec ts;
+} Lclctype2sortType;
+
+static Lclctype2sortType lclctype2type[] =
+{
+  { fixBits (TS_VOID, 0), TYS_VOID},
+  { fixBits (TS_UNKNOWN, 0), TYS_NONE},
+  { fixBits (TS_CHAR, 0), TYS_CHAR},
+  { fixBits (TS_SIGNED, fixBits (TS_CHAR, 0)), TYS_SCHAR},
+  { fixBits (TS_UNSIGNED, fixBits (TS_CHAR, 0)), TYS_UCHAR},
+
+  { fixBits (TS_SIGNED, fixBits (TS_SHORT, fixBits (TS_INT, 0))), TYS_SSINT},
+  { fixBits (TS_SIGNED, fixBits (TS_SHORT, 0)), TYS_SSINT},
+  { fixBits (TS_SHORT, fixBits (TS_INT, 0)), TYS_SSINT},
+  { fixBits (TS_SHORT, 0), TYS_SSINT},
+
+  { fixBits (TS_UNSIGNED, fixBits (TS_SHORT, fixBits (TS_INT, 0))), TYS_USINT},
+  { fixBits (TS_UNSIGNED, fixBits (TS_SHORT, 0)), TYS_USINT},
+
+  { fixBits (TS_SIGNED, fixBits (TS_INT, 0)), TYS_SINT},
+  { fixBits (TS_SIGNED, 0), TYS_SINT},
+
+  { fixBits (TS_INT, 0), TYS_INT},
+  { 0, TYS_INT},
+
+  { fixBits (TS_UNSIGNED, fixBits (TS_INT, 0)), TYS_UINT},
+  { fixBits (TS_UNSIGNED, 0), TYS_UINT},
+
+  { fixBits (TS_SIGNED, fixBits (TS_LONG, fixBits (TS_INT, 0))), TYS_SLINT},
+  { fixBits (TS_SIGNED, fixBits (TS_LONG, 0)), TYS_SLINT},
+  { fixBits (TS_LONG, fixBits (TS_INT, 0)), TYS_SLINT},
+  { fixBits (TS_LONG, 0), TYS_SLINT},
+
+  { fixBits (TS_UNSIGNED, fixBits (TS_LONG, fixBits (TS_INT, 0))), TYS_ULINT},
+  { fixBits (TS_UNSIGNED, fixBits (TS_LONG, 0)), TYS_ULINT},
+
+  { fixBits (TS_FLOAT, 0), TYS_FLOAT},
+  { fixBits (TS_DOUBLE, 0), TYS_DOUBLE},
+  { fixBits (TS_LONG, fixBits (TS_DOUBLE, 0)), TYS_LDOUBLE},
+
+  { fixBits (TS_STRUCT, 0), TYS_STRUCT},
+  { fixBits (TS_UNION, 0), TYS_UNION},
+  { fixBits (TS_ENUM, 0), TYS_ENUM},
+  { fixBits (TS_TYPEDEF, 0), TYS_TYPENAME}
+};
+
+lsymbol
+lclctype_toSortDebug (bits t)
+{
+  int i;
+  int lsize;
+  static ob_mstring OLD_Type2sortName[] =
+    {
+      "error",			/* TYS_NONE 	*/
+      "void",			/* TYS_VOID  	*/
+      "char",			/* TYS_CHAR  	*/
+      "signed_char",		/* TYS_SCHAR 	*/
+      "char",			/* TYS_UCHAR 	*/
+      "short_int",		/* TYS_SSINT	*/
+      "unsigned_short_int",	/* TYS_USINT	*/
+      "int",			/* TYS_INT        */
+      "int",			/* TYS_SINT 	*/
+      "unsigned_int",		/* TYS_UINT 	*/
+      "long_int",		/* TYS_SLINT	*/
+      "unsigned_long_int",	/* TYS_ULINT	*/
+      "float",			/* TYS_FLOAT	*/
+      "double",		        /* TYS_DOUBLE	*/
+      "long_double",		/* TYS_LDOUBLE 	*/
+      "error",			/* TYS_ENUM 	*/
+      "error",			/* TYS_STRUCT 	*/
+      "error",			/* TYS_UNION 	*/
+      "error"			/* TYS_TYPENAME */
+      };
+
+  lsize = size_toInt (sizeof (lclctype2type) / sizeof (lclctype2type[0]));
+
+  for (i = 0; i < lsize; i++)
+    {
+      if (lclctype2type[i].pt == t)
+	{
+	  return lsymbol_fromChars (OLD_Type2sortName[(int)lclctype2type[i].ts]);
+	}
+    }
+  return lsymbol_fromChars ("_error");
+}
+
+
+lsymbol
+lclctype_toSort (bits t)
+{
+  int i;
+  static ob_mstring Type2sortName[] =
+    {
+      /* _error must have underscore, LSL/LCL interface convention */
+      "_error",		        /* TYS_NONE 	*/
+      "void",			/* TYS_VOID  	*/
+      "char",			/* TYS_CHAR  	*/
+      "char",			/* TYS_SCHAR 	*/
+      "char",			/* TYS_UCHAR 	*/
+      "int",			/* TYS_SSINT	*/
+      "int",			/* TYS_USINT	*/
+      "int",			/* TYS_INT	*/
+      "int",			/* TYS_SINT 	*/
+      "int",			/* TYS_UINT 	*/
+      "int",			/* TYS_SLINT	*/
+      "int",			/* TYS_ULINT	*/
+      "double",		        /* TYS_FLOAT	*/
+      "double",		        /* TYS_DOUBLE	*/
+      "double",		        /* TYS_LDOUBLE 	*/
+      "error",			/* TYS_ENUM 	*/
+      "error",			/* TYS_STRUCT 	*/
+      "error",			/* TYS_UNION 	*/
+      "error"			/* TYS_TYPENAME 	*/
+      };
+
+  int lsize = size_toInt (sizeof (lclctype2type) / sizeof (lclctype2type[0]));
+
+  for (i = 0; i < lsize; i++)
+    {
+      if (lclctype2type[i].pt == t)
+	{
+	  return lsymbol_fromChars (Type2sortName[(int)lclctype2type[i].ts]);
+	}
+    }
+
+  return lsymbol_fromChars ("_error");
+}
diff --git a/src/lclinit.c b/src/lclinit.c
new file mode 100644
index 0000000..2535200
--- /dev/null
+++ b/src/lclinit.c
@@ -0,0 +1,1557 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lslinit.c
+**
+** Processor for Larch Shared Language Init Files
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "gram.h"
+# include "lclscan.h"
+# include "scanline.h"
+# include "lclscanline.h"
+# include "lcltokentable.h"
+# include "lclsyntable.h"
+# include "lslinit.h"
+# include "lclinit.h"
+# include "shift.h"
+
+# if 0
+/*@notfunction@*/
+# define TRACE(rule) printf ("Reducing: %s\n", rule)
+# else
+/*@notfunction@*/
+# define TRACE(rule)
+# endif
+
+static /*@dependent@*/ ltoken nextToken;
+static void InitLines (void) /*@modifies nextToken@*/ ;
+static void InitLine (void) /*@modifies nextToken@*/;
+static void Classification (void) /*@modifies nextToken@*/;
+static void CharClass (void) /*@modifies nextToken@*/;
+
+static void EndCommentChars (void) /*@modifies nextToken@*/ ;
+static void IdChars (void) /*@modifies nextToken@*/ ;
+static void OpChars (void) /*@modifies nextToken@*/ ;
+static void ExtensionChar (void) /*@modifies nextToken@*/ ;
+static void SingChars (void) /*@modifies nextToken@*/ ;
+static void WhiteChars (void) /*@modifies nextToken@*/ ;
+static void EndCommentChar (void) /*@modifies nextToken@*/ ;
+static void IdChar (void) /*@modifies nextToken@*/ ;
+static void OpChar (void) /*@modifies nextToken@*/ ;
+static void SingChar (void) /*@modifies nextToken@*/ ;
+static void WhiteChar (void) /*@modifies nextToken@*/ ;
+
+static void TokenClass (void) /*@modifies nextToken@*/ ;
+static void QuantifierSymToks (void) /*@modifies nextToken@*/ ;
+static void LogicalOpToks (void) /*@modifies nextToken@*/ ;
+static void EqOpToks (void) /*@modifies nextToken@*/ ;
+static void EquationSymToks (void) /*@modifies nextToken@*/ ;
+static void EqSepSymToks (void) /*@modifies nextToken@*/ ;
+static void SelectSymToks (void) /*@modifies nextToken@*/ ;
+static void OpenSymToks (void) /*@modifies nextToken@*/ ;
+static void SepSymToks (void) /*@modifies nextToken@*/ ;
+static void CloseSymToks (void) /*@modifies nextToken@*/ ;
+static void SimpleIdToks (void) /*@modifies nextToken@*/ ;
+static void MapSymToks (void) /*@modifies nextToken@*/ ;
+static void MarkerSymToks (void) /*@modifies nextToken@*/ ;
+static void CommentSymToks (void) /*@modifies nextToken@*/ ;
+static void QuantifierSymTok (void) /*@modifies nextToken@*/ ;
+static void LogicalOpTok (void) /*@modifies nextToken@*/ ;
+static void EqOpTok (void) /*@modifies nextToken@*/ ;
+static void EquationSymTok (void) /*@modifies nextToken@*/ ;
+static void EqSepSymTok (void) /*@modifies nextToken@*/ ;
+static void SelectSymTok (void) /*@modifies nextToken@*/ ;
+static void OpenSymTok (void) /*@modifies nextToken@*/ ;
+static void SepSymTok (void) /*@modifies nextToken@*/ ;
+static void CloseSymTok (void) /*@modifies nextToken@*/ ;
+static void SimpleIdTok (void) /*@modifies nextToken@*/ ;
+static void MapSymTok (void) /*@modifies nextToken@*/ ;
+static void MarkerSymTok (void) /*@modifies nextToken@*/ ;
+static void CommentSymTok (void) /*@modifies nextToken@*/ ;
+static void SynClass (void) /*@modifies nextToken@*/ ;
+static void OldToken (void) /*@modifies nextToken@*/ ;
+static void NewToken (void) /*@modifies nextToken@*/ ;
+static void Token (void) /*@modifies nextToken@*/ ;
+
+static void InitReduce (LCLInitRuleCode p_rule) /*@modifies nextToken@*/ ;
+static void UpdateXCharKeywords (charCode p_xChar) /*@modifies nextToken@*/ ;
+static void ProcessExtensionChar (void) /*@modifies nextToken@*/ ;
+static void ProcessEndCommentChar (void) /*@modifies nextToken@*/ ;
+static void ProcessSingleChar (charCode p_code) /*@modifies nextToken@*/ ;
+static void ProcessToken (ltokenCode p_code) /*@modifies nextToken@*/ ;
+static void ProcessSynonym (void) /*@modifies nextToken@*/ ;
+
+static void
+  LocalUserError (/*@unused@*/ ltoken p_t, /*@temp@*/ char *p_msg)
+  /*@modifies *g_msgstream@*/ ;
+
+/* If TRUE character has been redefined as a singleChar. */
+static bool defineSingleChar[LASTCHAR + 1];
+
+static charCode currentExtensionChar;
+
+/* LSL init file keyword tokens.  */
+
+static /*@exposed@*/ ltoken endCommentCharToken;
+static /*@exposed@*/ ltoken idCharToken;
+static /*@exposed@*/ ltoken opCharToken;
+static /*@exposed@*/ ltoken extensionCharToken;
+static /*@exposed@*/ ltoken singleCharToken;
+static /*@exposed@*/ ltoken whiteCharToken;
+
+static /*@exposed@*/ ltoken quantifierSymToken;
+static /*@exposed@*/ ltoken logicalOpToken;
+static /*@exposed@*/ ltoken eqOpToken;
+static /*@exposed@*/ ltoken equationSymToken;
+static /*@exposed@*/ ltoken eqSepSymToken;
+static /*@exposed@*/ ltoken selectSymToken;
+static /*@exposed@*/ ltoken openSymToken;
+static /*@exposed@*/ ltoken sepSymToken;
+static /*@exposed@*/ ltoken closeSymToken;
+static /*@exposed@*/ ltoken simpleIdToken;
+static /*@exposed@*/ ltoken mapSymToken;
+static /*@exposed@*/ ltoken markerSymToken;
+static /*@exposed@*/ ltoken commentSymToken;
+
+static /*@exposed@*/ ltoken synonymToken;
+
+static /*@exposed@*/ ltoken
+insertSimpleToken (char *s) /*@modifies internalState@*/ 
+{
+    return (LCLInsertToken (simpleId, lsymbol_fromChars (s), 0, FALSE));
+}
+
+static bool
+hasFirstChar (ltoken tok) /*@*/ 
+{
+  return (ltoken_isChar (tok)
+	  && ltoken_isSingleChar (cstring_firstChar (ltoken_unparse (tok))));
+}
+
+void
+LCLProcessInitFile (void)
+{
+  InitLines ();
+
+  InitReduce (INITFILE1);
+
+  if (ltoken_getCode (nextToken) != LEOFTOKEN)
+    {
+      LocalUserError (nextToken, "unexpected tokens after end-of-file");
+    }
+}
+
+static void
+InitLines (void)
+{
+  setCodePoint ();
+  InitReduce (INITLINES1);
+
+  
+
+  if (ltoken_getCode (nextToken) != LEOFTOKEN)
+    {
+      InitLine ();
+      InitReduce (INITLINES2);
+    }
+
+  while (ltoken_getCode (nextToken) != LEOFTOKEN)
+    {
+      InitLine ();
+      InitReduce (INITLINES3);
+    }
+}
+
+static void
+InitLine (void)
+{
+  
+  if (ltoken_getCode (nextToken) == LLT_EOL)
+    {
+      /* Nothing on line. */
+            InitReduce (INITLINE1);
+    }
+  else
+    {
+            Classification ();
+      InitReduce (INITLINE2);
+    }
+
+  if (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      LocalUserError (nextToken, "Unexpected tokens on line");
+    }
+
+  nextToken = LCLScanNextToken (); /* Discard EOL	*/
+  }
+
+static void
+Classification (void)
+{
+  lsymbol ntext = ltoken_getRawText (nextToken);  
+
+    
+  if (ntext == ltoken_getText (endCommentCharToken)
+      || ntext == ltoken_getText (idCharToken)
+      || ntext == ltoken_getText (opCharToken)
+      || ntext == ltoken_getText (extensionCharToken)
+      || ntext == ltoken_getText (singleCharToken)
+      || ntext == ltoken_getText (whiteCharToken))
+    {
+      CharClass ();
+      InitReduce (CLASSIFICATION1);
+    }
+  else if (ntext == ltoken_getText (quantifierSymToken)
+	   || ntext == ltoken_getText (logicalOpToken)
+	   || ntext == ltoken_getText (eqOpToken)
+	   || ntext == ltoken_getText (equationSymToken)
+	   || ntext == ltoken_getText (eqSepSymToken)
+	   || ntext == ltoken_getText (selectSymToken)
+	   || ntext == ltoken_getText (openSymToken)
+	   || ntext == ltoken_getText (sepSymToken)
+	   || ntext == ltoken_getText (closeSymToken)
+	   || ntext == ltoken_getText (simpleIdToken)
+	   || ntext == ltoken_getText (mapSymToken)
+	   || ntext == ltoken_getText (markerSymToken)
+	   || ntext == ltoken_getText (commentSymToken))
+    {
+      TokenClass ();
+      InitReduce (CLASSIFICATION2);
+    }
+  else if (ntext == ltoken_getText (synonymToken))
+    {
+      SynClass ();
+      InitReduce (CLASSIFICATION3);
+    }
+  else
+    {
+      llbug (message ("Expected character, token, or synonym classification: %s",
+		      ltoken_getRawString (nextToken)));
+     /* pop off all tokens on this line */
+    }
+}
+
+static void
+CharClass (void)
+{
+  ltoken charClassToken;
+
+  charClassToken = nextToken;
+
+  nextToken = LCLScanNextToken ();		/* Discard char class keyword. */
+
+  if (ltoken_getRawText (charClassToken) == ltoken_getText (endCommentCharToken))
+    {
+      EndCommentChars ();
+      InitReduce (CHARCLASS1);
+    }
+  else if (ltoken_getRawText (charClassToken) == ltoken_getText (idCharToken))
+    {
+      IdChars ();
+      InitReduce (CHARCLASS2);
+    }
+  else if (ltoken_getRawText (charClassToken) == ltoken_getText (opCharToken))
+    {
+      OpChars ();
+      InitReduce (CHARCLASS3);
+    }
+  else if (ltoken_getRawText (charClassToken)
+	   == ltoken_getText (extensionCharToken))
+    {
+      ExtensionChar ();
+      InitReduce (CHARCLASS4);
+    }
+  else if (ltoken_getRawText (charClassToken) == ltoken_getText (singleCharToken))
+    {
+      SingChars ();
+      InitReduce (CHARCLASS5);
+    }
+  else if (ltoken_getRawText (charClassToken) == ltoken_getText (whiteCharToken))
+    {
+      WhiteChars ();
+      InitReduce (CHARCLASS6);
+    }
+  else
+    {
+      LocalUserError (nextToken, "expected character classification");
+    }
+}
+
+static void
+EndCommentChars (void)
+{
+  EndCommentChar ();
+  InitReduce (LRC_ENDCOMMENT1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      EndCommentChar ();
+      InitReduce (LRC_ENDCOMMENT2);
+    }
+
+}
+
+static void IdChars (void) /*@modifies nextToken@*/
+{
+  IdChar ();
+  InitReduce (IDCHARS1);
+  
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      IdChar ();
+      InitReduce (IDCHARS2);
+    }
+}
+
+static void OpChars (void) /*@modifies nextToken@*/
+{
+  OpChar ();
+  InitReduce (OPCHARS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      OpChar ();
+      InitReduce (OPCHARS2);
+    }
+}
+
+static void ExtensionChar (void) /*@modifies nextToken@*/
+{
+  if (hasFirstChar (nextToken))
+    {
+      LSLGenShift (nextToken);
+      nextToken = LCLScanNextToken ();
+      InitReduce (LRC_EXTENSIONCHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken, "expected only one character");
+    }
+}
+
+static void SingChars (void) /*@modifies nextToken@*/
+{
+  SingChar ();
+  InitReduce (SINGCHARS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      SingChar ();
+      InitReduce (SINGCHARS2);
+    }
+}
+
+static void WhiteChars (void) /*@modifies nextToken@*/
+{
+  WhiteChar ();
+  InitReduce (WHITECHARS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      WhiteChar ();
+      InitReduce (WHITECHARS2);
+    }
+}
+
+static void EndCommentChar (void) /*@modifies nextToken@*/
+{
+  if (ltoken_isChar (nextToken))
+    {
+      LSLGenShift (nextToken);
+      nextToken = LCLScanNextToken ();
+      InitReduce (LRC_ENDCOMMENTCHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken, "expected only one character");
+    }
+}
+
+static void IdChar (void) /*@modifies nextToken@*/
+{
+  if (hasFirstChar (nextToken))
+    {
+      LSLGenShift (nextToken);
+      nextToken = LCLScanNextToken ();
+      InitReduce (IDCHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken,
+		      "Character is already defined, cannot redefine");
+    }
+}
+
+static void OpChar (void) /*@modifies nextToken@*/
+{
+  if (hasFirstChar (nextToken))
+    {
+      LSLGenShift (nextToken);
+      nextToken = LCLScanNextToken ();
+      InitReduce (OPCHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken, 
+		      "Character is already defined, cannot redefine");
+    }
+}
+
+static void SingChar (void) /*@modifies nextToken@*/
+{
+  if (hasFirstChar (nextToken))
+    {
+      LSLGenShift (nextToken);
+      nextToken = LCLScanNextToken ();
+      InitReduce (SINGCHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken, 
+		      "Character is already defined, cannot redefine");
+    }
+}
+
+static void WhiteChar (void) /*@modifies nextToken@*/
+{
+  if (hasFirstChar (nextToken))
+    {
+      LSLGenShift (nextToken);
+      nextToken = LCLScanNextToken ();
+      InitReduce (WHITECHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken, "Character is already defined, cannot redefine");
+    }
+}
+
+static void
+  TokenClass (void) /*@modifies nextToken@*/
+{
+  ltoken tokenClassToken;
+  lsymbol ttext = ltoken_getRawText (nextToken);
+
+  tokenClassToken = nextToken;
+
+  /* Discard token class keyword. */
+  nextToken = LCLScanNextToken ();
+
+  if (ttext == ltoken_getText (quantifierSymToken))
+    {
+      QuantifierSymToks ();
+      InitReduce (TOKENCLASS1);
+    }
+  else if (ttext == ltoken_getText (logicalOpToken))
+    {
+      LogicalOpToks ();
+      InitReduce (TOKENCLASS2);
+    }
+  else if (ttext == ltoken_getText (eqOpToken))
+    {
+      EqOpToks ();
+      InitReduce (TOKENCLASS3);
+    }
+  else if (ttext == ltoken_getText (equationSymToken))
+    {
+      EquationSymToks ();
+      InitReduce (TOKENCLASS4);
+    }
+  else if (ttext == ltoken_getText (eqSepSymToken))
+    {
+      EqSepSymToks ();
+      InitReduce (TOKENCLASS5);
+    }
+  else if (ttext == ltoken_getText (selectSymToken))
+    {
+      SelectSymToks ();
+      InitReduce (TOKENCLASS6);
+    }
+  else if (ttext == ltoken_getText (openSymToken))
+    {
+      OpenSymToks ();
+      InitReduce (TOKENCLASS7);
+    }
+  else if (ttext == ltoken_getText (sepSymToken))
+    {
+      SepSymToks ();
+      InitReduce (TOKENCLASS8);
+    }
+  else if (ttext == ltoken_getText (closeSymToken))
+    {
+      CloseSymToks ();
+      InitReduce (TOKENCLASS9);
+    }
+  else if (ttext == ltoken_getText (simpleIdToken))
+    {
+      SimpleIdToks ();
+      InitReduce (TOKENCLASS10);
+    }
+  else if (ttext == ltoken_getText (mapSymToken))
+    {
+      MapSymToks ();
+      InitReduce (TOKENCLASS11);
+    }
+  else if (ttext == ltoken_getText (markerSymToken))
+    {
+      MarkerSymToks ();
+      InitReduce (TOKENCLASS12);
+    }
+  else if (ttext == ltoken_getText (commentSymToken))
+    {
+            CommentSymToks ();
+      InitReduce (TOKENCLASS13);
+    }
+  else
+    {
+      LocalUserError (nextToken, "expected token classification");
+    }
+}
+
+static void
+QuantifierSymToks (void) /*@modifies nextToken@*/
+{
+  QuantifierSymTok ();
+  InitReduce (QUANTIFIERSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      QuantifierSymTok ();
+      InitReduce (QUANTIFIERSYMTOKS2);
+    }
+}
+
+static void
+LogicalOpToks (void) /*@modifies nextToken@*/
+{
+  LogicalOpTok ();
+  InitReduce (LOGICALOPTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      LogicalOpTok ();
+      InitReduce (LOGICALOPTOKS2);
+    }
+}
+
+static void
+EqOpToks (void) /*@modifies nextToken@*/
+{
+  EqOpTok ();
+  InitReduce (LRC_EQOPTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      EqOpTok ();
+      InitReduce (LRC_EQOPTOKS2);
+    }
+}
+
+static void
+EquationSymToks (void) /*@modifies nextToken@*/
+{
+  EquationSymTok ();
+  InitReduce (LRC_EQUATIONSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      EquationSymTok ();
+      InitReduce (LRC_EQUATIONSYMTOKS2);
+    }
+}
+
+static void
+EqSepSymToks (void) /*@modifies nextToken@*/
+{
+  EqSepSymTok ();
+  InitReduce (LRC_EQSEPSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      EqSepSymTok ();
+      InitReduce (LRC_EQSEPSYMTOKS2);
+    }
+}
+
+static void
+SelectSymToks (void) /*@modifies nextToken@*/
+{
+  SelectSymTok ();
+  InitReduce (SELECTSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      SelectSymTok ();
+      InitReduce (SELECTSYMTOKS2);
+    }
+}
+
+static void
+OpenSymToks (void) /*@modifies nextToken@*/
+{
+  OpenSymTok ();
+  InitReduce (OPENSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      OpenSymTok ();
+      InitReduce (OPENSYMTOKS2);
+    }
+}
+
+static void
+SepSymToks (void) /*@modifies nextToken@*/
+{
+  SepSymTok ();
+  InitReduce (SEPSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      SepSymTok ();
+      InitReduce (SEPSYMTOKS2);
+    }
+}
+
+static void
+CloseSymToks (void) /*@modifies nextToken@*/
+{
+  CloseSymTok ();
+  InitReduce (CLOSESYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      CloseSymTok ();
+      InitReduce (CLOSESYMTOKS2);
+    }
+}
+
+static void
+SimpleIdToks (void) /*@modifies nextToken@*/
+{ 
+  SimpleIdTok ();
+  InitReduce (SIMPLEIDTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      SimpleIdTok ();
+      InitReduce (SIMPLEIDTOKS2);
+    }
+}
+
+static void
+MapSymToks (void) /*@modifies nextToken@*/
+{
+  MapSymTok ();
+  InitReduce (MAPSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      MapSymTok ();
+      InitReduce (MAPSYMTOKS2);
+    }
+}
+
+static void
+MarkerSymToks (void) /*@modifies nextToken@*/
+{
+  MarkerSymTok ();
+  InitReduce (MARKERSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+      MarkerSymTok ();
+      InitReduce (MARKERSYMTOKS2);
+    }
+}
+
+static void
+CommentSymToks (void) /*@modifies nextToken@*/
+{
+  CommentSymTok ();
+    InitReduce (COMMENTSYMTOKS1);
+  
+  while (ltoken_getCode (nextToken) != LLT_EOL)
+    {
+            CommentSymTok ();
+            InitReduce (COMMENTSYMTOKS2);
+    }
+}
+
+static void
+QuantifierSymTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (QUANTIFIERSYMTOK1);
+}
+
+static void
+LogicalOpTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (LOGICALOPTOK1);
+}
+
+static void
+EqOpTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (LRC_EQOPTOK1);
+}
+
+static void EquationSymTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (LRC_EQUATIONSYMTOK1);
+}
+
+static void EqSepSymTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (LRC_EQSEPSYMTOK1);
+
+}
+
+static void SelectSymTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (SELECTSYMTOK1);
+}
+
+static void OpenSymTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (OPENSYMTOK1);
+}
+
+static void SepSymTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (SEPSYMTOK1);
+}
+
+static void CloseSymTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (CLOSESYMTOK1);
+}
+
+static void SimpleIdTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (SIMPLEIDTOK1);
+}
+
+static void
+MapSymTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (MAPSYMTOK1);
+}
+
+static void
+MarkerSymTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (MARKERSYMTOK1);
+
+}
+
+static void
+CommentSymTok (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (COMMENTSYMTOK1);
+}
+
+
+static void
+SynClass (void) /*@modifies nextToken@*/
+{
+  if (ltoken_getRawText (nextToken) == ltoken_getText (synonymToken))
+    {
+      nextToken = LCLScanNextToken ();
+
+      OldToken ();
+      NewToken ();
+
+      InitReduce (SYNCLASS1);
+    }
+  else
+    {
+      LocalUserError (nextToken, "expected synonym classification");
+    }
+
+}
+
+static void
+OldToken (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (OLDTOKEN1);
+
+}
+
+static void
+NewToken (void) /*@modifies nextToken@*/
+{
+  Token ();
+  InitReduce (NEWTOKEN1);
+
+}
+
+static void
+Token (void) /*@modifies nextToken@*/
+{
+  if (ltoken_getCode (nextToken) == LLT_EOL
+      || ltoken_getCode (nextToken) == LEOFTOKEN)
+    {
+      LocalUserError (nextToken, "unexpected end-of-line or end-of-file");
+    }
+  else
+    {
+      LSLGenShift (nextToken);
+      nextToken = LCLScanNextToken ();
+    }
+}
+
+/*
+** Init File Processing Routines, these routines use the shift-reduce sequence
+** produced by the init file parser and update the necessary tables for the
+** scanner.
+**
+** The same shift stack is used that LSL parser uses.  A different reduce
+** procedure is used because the init file grammar is different from the LSL
+** grammar.
+*/
+
+static void
+InitReduce (LCLInitRuleCode rule) /*@modifies nextToken@*/
+{
+  switch (rule)
+    {
+    case INITFILE1:
+      TRACE ("INITFILE1");
+      break;
+      
+    case INITLINES1:
+      TRACE ("INITLINES1");
+      break;
+      
+    case INITLINES2:
+      TRACE ("INITLINES2");
+      break;
+
+    case INITLINES3:
+      TRACE ("INITLINES3");
+      break;
+
+    case INITLINE1:
+      TRACE ("INITLINE1");
+      break;
+
+    case INITLINE2:
+      TRACE ("INITLINE2");
+      break;
+
+    case CLASSIFICATION1:
+      TRACE ("CLASSIFICATION1");
+      break;
+
+    case CLASSIFICATION2:
+      TRACE ("CLASSIFICATION2");
+      break;
+
+    case CLASSIFICATION3:
+      TRACE ("CLASSIFICATION3");
+      break;
+
+    case CHARCLASS1:
+      TRACE ("CHARCLASS1");
+      break;
+
+    case CHARCLASS2:
+      TRACE ("CHARCLASS2");
+      break;
+
+    case CHARCLASS3:
+      TRACE ("CHARCLASS3");
+      break;
+
+    case CHARCLASS4:
+      TRACE ("CHARCLASS4");
+      break;
+
+    case CHARCLASS5:
+      TRACE ("CHARCLASS5");
+      break;
+
+    case CHARCLASS6:
+      TRACE ("CHARCLASS6");
+      break;
+
+    case LRC_ENDCOMMENT1:
+      TRACE ("LRC_ENDCOMMENT1");
+      break;
+
+    case LRC_ENDCOMMENT2:
+      TRACE ("LRC_ENDCOMMENT2");
+      break;
+
+    case IDCHARS1:
+      TRACE ("IDCHARS1");
+      break;
+
+    case IDCHARS2:
+      TRACE ("IDCHARS2");
+      break;
+
+    case OPCHARS1:
+      TRACE ("OPCHARS1");
+      break;
+
+    case OPCHARS2:
+      TRACE ("OPCHARS2");
+      break;
+
+    case LRC_EXTENSIONCHAR1:
+      TRACE ("LRC_EXTENSIONCHAR1");
+      ProcessExtensionChar ();
+      break;
+
+    case SINGCHARS1:
+      TRACE ("SINGCHARS1");
+      break;
+
+    case SINGCHARS2:
+      TRACE ("SINGCHARS2");
+      break;
+
+    case WHITECHARS1:
+      TRACE ("WHITECHARS1");
+      break;
+
+    case WHITECHARS2:
+      TRACE ("WHITECHARS2");
+      break;
+
+    case LRC_ENDCOMMENTCHAR1:
+      TRACE ("LRC_ENDCOMMENTCHAR1");
+      ProcessEndCommentChar ();
+      break;
+
+    case IDCHAR1:
+      TRACE ("IDCHAR1");
+      ProcessSingleChar (IDCHAR);
+      break;
+
+    case OPCHAR1:
+      TRACE ("OPCHAR1");
+      ProcessSingleChar (OPCHAR);
+      break;
+
+    case SINGCHAR1:
+      TRACE ("SINGCHAR1");
+      ProcessSingleChar (SINGLECHAR);
+      break;
+
+    case WHITECHAR1:
+      TRACE ("CHAR1");
+      ProcessSingleChar (WHITECHAR);
+      break;
+
+    case TOKENCLASS1:
+      TRACE ("TOKENCLASS1");
+      break;
+
+    case TOKENCLASS2:
+      TRACE ("TOKENCLASS2");
+      break;
+
+    case TOKENCLASS3:
+      TRACE ("TOKENCLASS3");
+      break;
+
+    case TOKENCLASS4:
+      TRACE ("TOKENCLASS4");
+      break;
+
+    case TOKENCLASS5:
+      TRACE ("TOKENCLASS5");
+      break;
+
+    case TOKENCLASS6:
+      TRACE ("TOKENCLASS6");
+      break;
+
+    case TOKENCLASS7:
+      TRACE ("TOKENCLASS7");
+      break;
+
+    case TOKENCLASS8:
+      TRACE ("TOKENCLASS8");
+      break;
+
+    case TOKENCLASS9:
+      TRACE ("TOKENCLASS9");
+      break;
+
+    case TOKENCLASS10:
+      TRACE ("TOKENCLASS10");
+      break;
+
+    case TOKENCLASS11:
+      TRACE ("TOKENCLASS11");
+      break;
+
+    case TOKENCLASS12:
+      TRACE ("TOKENCLASS12");
+      break;
+
+    case TOKENCLASS13:
+      TRACE ("TOKENCLASS13");
+      break;
+
+    case QUANTIFIERSYMTOKS1:
+      TRACE ("QUALIFERSYMTOKS1");
+      break;
+
+    case QUANTIFIERSYMTOKS2:
+      TRACE ("QUANTIFIERSYMTOKS2");
+      break;
+
+    case LOGICALOPTOKS1:
+      TRACE ("LOGICALOPTOKS1");
+      break;
+
+    case LOGICALOPTOKS2:
+      TRACE ("LOGICALOPTOKS2");
+      break;
+
+    case LRC_EQOPTOKS1:
+      TRACE ("LRC_EQOPTOKS1");
+      break;
+
+    case LRC_EQOPTOKS2:
+      TRACE ("LRC_EQOPTOKS2");
+      break;
+
+    case LRC_EQUATIONSYMTOKS1:
+      TRACE ("LRC_EQUATIONSYMTOKS1");
+      break;
+
+    case LRC_EQUATIONSYMTOKS2:
+      TRACE ("LRC_EQUATIONSYMTOKS2");
+      break;
+
+    case LRC_EQSEPSYMTOKS1:
+      TRACE ("LRC_EQSEPSYMTOKS1");
+      break;
+
+    case LRC_EQSEPSYMTOKS2:
+      TRACE ("LRC_EQSEPSYMTOKS2");
+      break;
+
+    case SELECTSYMTOKS1:
+      TRACE ("SELECTSYMTOKS1");
+      break;
+
+    case SELECTSYMTOKS2:
+      TRACE ("SELECTSYMTOKS2");
+      break;
+
+    case OPENSYMTOKS1:
+      TRACE ("OPENSYMTOKS1");
+      break;
+
+    case OPENSYMTOKS2:
+      TRACE ("OPENSYMTOKS2");
+      break;
+
+    case SEPSYMTOKS1:
+      TRACE ("SEPSYMTOKS1");
+      break;
+
+    case SEPSYMTOKS2:
+      TRACE ("SEPSYMTOKS2");
+      break;
+
+    case CLOSESYMTOKS1:
+      TRACE ("CLOSESYMTOKS1");
+      break;
+
+    case CLOSESYMTOKS2:
+      TRACE ("CLOSESYMTOKS2");
+      break;
+
+    case SIMPLEIDTOKS1:
+      TRACE ("SIMPLEIDTOKS1");
+      break;
+
+    case SIMPLEIDTOKS2:
+      TRACE ("SIMPLEIDTOKS2");
+      break;
+
+    case MAPSYMTOKS1:
+      TRACE ("MAPSYMTOKS1");
+      break;
+
+    case MAPSYMTOKS2:
+      TRACE ("MAPSYMTOKS2");
+      break;
+
+    case MARKERSYMTOKS1:
+      TRACE ("MARKERSYMTOKS1");
+      break;
+
+    case MARKERSYMTOKS2:
+      TRACE ("MARKERSYMTOKS2");
+      break;
+
+    case COMMENTSYMTOKS1:
+      TRACE ("COMMENTSYMTOKS1");
+      break;
+
+    case COMMENTSYMTOKS2:
+      TRACE ("COMMENTSYMTOKS2");
+      break;
+
+    case QUANTIFIERSYMTOK1:
+      TRACE ("QUANTIFERSYMTOK1");
+      ProcessToken (quantifierSym);
+      break;
+
+    case LOGICALOPTOK1:
+      TRACE ("LOGICALOPTOK1");
+      ProcessToken (logicalOp);
+      break;
+
+    case LRC_EQOPTOK1:
+      TRACE ("LRC_EQOPTOK1");
+      ProcessToken (eqOp);
+      break;
+
+    case LRC_EQUATIONSYMTOK1:
+      TRACE ("LRC_EQUATIONSYMTOK1");
+      ProcessToken (equationSym);
+      break;
+
+    case LRC_EQSEPSYMTOK1:
+      TRACE ("LRC_EQSEPSYMTOK1");
+      ProcessToken (eqSepSym);
+      break;
+
+    case SELECTSYMTOK1:
+      TRACE ("SELECTSYMTOK1");
+      ProcessToken (selectSym);
+      break;
+
+    case OPENSYMTOK1:
+      TRACE ("OPENSYMTOK1");
+      ProcessToken (openSym);
+      break;
+
+    case SEPSYMTOK1:
+      TRACE ("SEPSYMTOK1");
+      ProcessToken (sepSym);
+      break;
+
+    case CLOSESYMTOK1:
+      TRACE ("CLOSESYMTOK1");
+      ProcessToken (closeSym);
+      break;
+
+    case SIMPLEIDTOK1:
+      TRACE ("SIMPLEIDTOK1");
+      ProcessToken (simpleId);
+      break;
+
+    case MAPSYMTOK1:
+      TRACE ("MAPSYMTOK1");
+      ProcessToken (mapSym);
+      break;
+
+    case MARKERSYMTOK1:
+      TRACE ("MARKERSYMTOK1");
+      ProcessToken (markerSym);
+      break;
+
+    case COMMENTSYMTOK1:
+      TRACE ("COMMENTSYMTOK1");
+      ProcessToken (commentSym);
+      break;
+
+    case SYNCLASS1:
+      TRACE ("SYNCLASS1");
+      ProcessSynonym ();
+      break;
+
+    case OLDTOKEN1:
+      TRACE ("OLDTOKEN1");
+      break;
+
+    case NEWTOKEN1:
+      TRACE ("NEWTOKEN1");
+      break;
+
+    default:
+      llcontbuglit ("InitReduce: bad case");
+      break;
+    }
+}	
+
+/*
+** Reset the first character of the predefined extensionChar keywords when  
+** the extensionChar changes.  e.g. "extensionChar @" changes "\forall" to  
+** "@forall".								    
+*/
+
+static void
+UpdateXCharKeywords (charCode xChar)
+{
+  char *str;
+  char xchar = (char)xChar;
+
+  str = ltoken_getTextChars (ltoken_forall);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_and);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_or);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_implies);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_eq);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_neq);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_equals);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_eqsep);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_select);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_open);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_sep);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_close);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_id);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_arrow);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_marker);
+  *str = xchar;
+
+  str = ltoken_getTextChars (ltoken_comment);
+  *str = xchar;
+}
+
+/* Different from ProcessCharClass because only allow one extension	    */
+/* character. Therefore, the present extension character must be set to a   */
+/* singleChar.								    */
+
+static void
+ProcessExtensionChar (void)
+{
+  ltoken stackToken = LSLGenTopPopShiftStack ();
+  char firstChar = cstring_firstChar (ltoken_unparse (stackToken));
+
+  if (!defineSingleChar[(int)firstChar]
+      && ltoken_isSingleChar (firstChar))
+    {
+      /*
+      ** Is a single character that has not been defined before.	   
+      ** Can only have one extension char.  Release old one. 
+      */
+
+      LCLSetCharClass (firstChar, CHC_EXTENSION);
+      LCLSetCharClass ((char) currentExtensionChar, SINGLECHAR);
+      currentExtensionChar = (charCode) firstChar;
+      UpdateXCharKeywords (currentExtensionChar);
+    }
+  else
+    {
+      /* Already redefined.  Don't allow to be redefined. */
+      LocalUserError (stackToken, "Character is already defined, cannot redefine");
+    }
+
+  ltoken_free (stackToken);
+}
+
+/* Different from ProcessSingleChar because allow any characters to be	    */
+/* endCommentChar and also set a different part of the scanner structure.   */
+
+static void
+ProcessEndCommentChar (void)
+{
+  ltoken stackToken = LSLGenTopPopShiftStack ();
+  char firstChar = cstring_firstChar (ltoken_unparse (stackToken));
+
+  if (LCLIsEndComment (firstChar))
+    {
+      LocalUserError (stackToken,
+		    "already defined as a endCommentChar, cannot redefine");
+    }
+  else
+    {
+      LCLSetEndCommentChar (firstChar, TRUE);
+    }
+  ltoken_free (stackToken);
+}
+
+static void
+ProcessSingleChar (charCode code)
+{
+  ltoken stackToken = LSLGenTopPopShiftStack ();
+  char firstChar = cstring_firstChar (ltoken_unparse (stackToken));
+
+  if (!defineSingleChar[(int)firstChar]
+      && ltoken_isSingleChar (firstChar))
+    {
+      /* Is a single character that has not been defined before.	    */
+      /* It's OK to redefine once. */
+      LCLSetCharClass (firstChar, code);
+      /* OK to mark as a defined singleChar even if not.  Only check	    */
+      /* defineSingleChar[] if defining a singleChar.			    */
+      defineSingleChar[(int)(firstChar)] = TRUE;
+    }
+  else
+    {
+      LocalUserError (stackToken, "Character is already defined, cannot redefine");
+    }
+  
+  ltoken_free (stackToken);
+}
+
+static void
+ProcessToken (ltokenCode code)
+{
+  ltoken stackToken, ptok;
+
+  stackToken = LSLGenTopPopShiftStack ();
+
+  
+  if (LCLIsSyn (ltoken_getText (stackToken)))
+    {
+      LocalUserError (stackToken, "already defined as a synonym, cannot redefine");
+    }
+
+  /*
+  ** Get the token from the token table, so can check if the token    
+  ** was updated by a previous token.				    
+  */
+
+  ptok = LCLGetToken (ltoken_getText (stackToken));
+
+  if (ltoken_isStateDefined (ptok))
+    {
+            LocalUserError (stackToken, "already defined, cannot redefine");
+    }
+
+    LCLUpdateToken (code, ltoken_getText (stackToken), TRUE);
+  ltoken_free (stackToken);
+}
+
+
+static void
+ProcessSynonym (void)
+{
+  ltoken newtok;
+  ltoken oldtok;
+
+  
+  newtok = LSLGenTopPopShiftStack ();
+  oldtok = LSLGenTopPopShiftStack ();
+
+  
+ /* ignore synonyms: Bool -> bool
+    and:             bool -> Bool */
+ /*
+     if ((ltoken_getText (newtok) == lsymbol_Bool ||
+          ltoken_getText (newtok) == lsymbol_bool) &&
+         (ltoken_getText (oldtok) == lsymbol_Bool ||
+          ltoken_getText (oldtok) == lsymbol_bool)) return;
+ */
+
+  if (ltoken_wasSyn (newtok))
+    {
+     /*
+     ** The token has a synonym.  This means that the synonym was in the 
+     ** init file, so complain about redefining as a synonym again	 
+     */
+
+      LocalUserError (newtok, "already is a synonym, cannot redefine");
+    }
+
+  if (ltoken_hasSyn (newtok))
+    {
+      /*
+      ** newtok already has a synonym defined for it.  Do not allow	   
+      ** synonyms to be chained.					    
+      */
+
+      LocalUserError (newtok,
+		      "newtok already has a synonym, cannot chain synonyms");
+    }
+
+  if (ltoken_isStateDefined (newtok))
+    {
+      LocalUserError (newtok, "newtok already defined, cannot redefine");
+    }
+
+    LCLAddSyn (ltoken_getText (newtok), ltoken_getText (oldtok));
+
+  ltoken_free (newtok);
+  ltoken_free (oldtok); 
+}
+
+
+/*
+** Utilities, in alphabetical order
+*/
+
+static void
+  LocalUserError (ltoken t, char *msg)
+{
+  lclplainerror (message ("%s %s in the LCL init file.  Ignoring line.", 
+			  ltoken_unparse (t), cstring_fromChars (msg)));
+
+  /* discard the whole current line */
+
+  nextToken = LCLScanNextToken ();		/* Discard bad token	*/
+
+  while (ltoken_getCode (nextToken) != LLT_EOL 
+	 && ltoken_getCode (nextToken) != LEOFTOKEN)
+    {
+      nextToken = LCLScanNextToken ();
+    }
+}
+
+
+/*
+ *  Required initialization and cleanup routines
+ */
+
+void
+LCLProcessInitFileInit (void)
+{
+  int i;
+
+  LSLGenInit (FALSE);		/* parsing LCLinit, not LSLinit */
+  
+  /*
+  ** Insert the init file keywords into the token table as undefined	    
+  ** SIMPLEIDs.  They are defined as simpleIds since they must be treated 
+  ** that way if they do not appear as the first token on a line, and	    
+  ** they must be treated that way for the actual LSL parsing. Save the   
+  ** tokens so can recognize as init file keywords when necessary.	    
+  */
+
+  endCommentCharToken = insertSimpleToken ("endCommentChar");
+  idCharToken = insertSimpleToken ("idChar");
+  opCharToken = insertSimpleToken ("opChar");
+  extensionCharToken = insertSimpleToken ("extensionChar");
+  singleCharToken = insertSimpleToken ("singleChar");
+  whiteCharToken = insertSimpleToken ("whiteChar");
+
+  quantifierSymToken = insertSimpleToken ("quantifierSym");
+  logicalOpToken = insertSimpleToken ("logicalOp");
+  eqOpToken = insertSimpleToken ("eqOp");
+  equationSymToken = insertSimpleToken ("equationSym");
+  eqSepSymToken = insertSimpleToken ("eqSepSym");
+  selectSymToken = insertSimpleToken ("selectSym");
+  openSymToken = insertSimpleToken ("openSym");
+  sepSymToken = insertSimpleToken ("sepSym");
+  closeSymToken = insertSimpleToken ("closeSym");
+  simpleIdToken = insertSimpleToken ("simpleId");
+  mapSymToken = insertSimpleToken ("mapSym");
+  markerSymToken = insertSimpleToken ("markerSym");
+  commentSymToken = insertSimpleToken ("commentSym");
+
+  synonymToken = insertSimpleToken ("synonym");
+
+  /*
+  ** Initialize defineSingleChar array to all FALSE to signal that no	    
+  ** characters have been redefined as singleChar. 
+  */
+
+  for (i = 0; i <= LASTCHAR; i++)
+    {
+      defineSingleChar[i] = FALSE;
+    }
+
+  /* 
+  ** Record the current extension character so can redefine back to	    
+  ** singleChar if a new extension character is redefined.		    
+  */
+
+  currentExtensionChar = (charCode) CHAREXTENDER;
+  
+  /* Init file processing needs to have EOL reported. */
+
+  LCLReportEolTokens (TRUE);
+
+  /* Not: context_getBoolName () */
+
+  LCLAddSyn (lsymbol_fromChars ("Bool"),
+	     lsymbol_fromChars ("bool"));
+}
+
+void
+LCLProcessInitFileReset (void)
+{
+  nextToken = LCLScanNextToken ();	  
+}
+
+void
+LCLProcessInitFileCleanup (void)
+{
+}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/lclint.lcd b/src/lclint.lcd
new file mode 100644
index 0000000..3c1c207
--- /dev/null
+++ b/src/lclint.lcd
@@ -0,0 +1,20118 @@
+;;LCLint Dump: lclint.lcd
+;;LCLint 2.5m --- 20 May 2000
+;;lib:171
+;;ctTable
+0 u-2 19 38
+0 p1|-2 20 39
+0 b-2 21 40
+0 p3|-2 22 41
+0 p4|-2 23 42
+0 p5|-2 24 43
+0 p6|-2 25 44
+0 p7|-2 26 45
+0 p8|-2 27 46
+0 p9|-2 28 47
+0 p10|-2 29 48
+0 p11|-2 30 49
+0 p12|-2 31 50
+0 p13|-2 32 51
+0 p14|-2 33 52
+0 p15|-2 34 53
+0 p16|-2 35 54
+0 p17|-2 36 55
+0 p18|-2 37 56
+1 t0|0 314 855
+1 t1|1&
+1 t2|2&
+1 t3|3&
+1 t4|4 315 856
+1 t5|5&
+1 t6|6&
+1 t7|7&
+1 t8|8&
+1 t9|9&
+1 t10|10&
+1 t11|11&
+1 t12|12&
+1 t13|13&
+1 t14|14&
+1 t15|15&
+1 t16|16&
+1 t17|17&
+1 t18|18&
+2 y0|0&
+2 y1|1&
+2 y2|2&
+2 y3|3&
+2 y4|4&
+2 y5|5&
+2 y6|6&
+2 y7|7&
+2 y8|8&
+2 y9|9&
+2 y10|10&
+2 y11|11&
+2 y12|12&
+2 y13|13&
+2 y14|14&
+2 y15|15&
+2 y16|16&
+2 y17|17&
+2 y18|18&
+-2 ?!
+0 s2|&
+0 s18|&
+0 s19|&
+0 s20|&
+0 s21|&
+0 s38|-1 7690 -1
+0 s39|&
+0 s22|-1 383 -1
+0 s23|&
+0 a0|-1 401 -1
+3 C0.5/20|!
+3 C0.68/2|!
+3 C0.2/5|!
+3 f0 (70|@7|$#,)!
+3 f1 (70|@7|$#,)!
+3 C0.4/5|!
+3 C0.3/5|!
+3 f0 (74|$#,)!
+3 f2 (74|$#,)!
+3 f70 (74|$#,)!
+3 f0 (74|$#,)!
+3 f2 (74|$#,)!
+3 f70 (74|$#,)!
+3 f0 (74|$#,)!
+3 f2 (74|$#,)!
+3 f70 (74|$#,)!
+3 f0 (74|$#,)!
+3 f2 (74|$#,)!
+3 f70 (74|$#,)!
+3 C0.2/5|!
+3 f0 (74|$#,)!
+3 f2 (74|$#,)!
+3 f87 (74|$#,)!
+3 C0.4/5|!
+3 C0.3/5|!
+3 f0 (92|$#,)!
+3 f2 (92|$#,)!
+3 f87 (92|$#,)!
+3 f0 (92|$#,)!
+3 f2 (92|$#,)!
+3 f87 (92|$#,)!
+3 f0 (92|$#,)!
+3 f2 (92|$#,)!
+3 f87 (92|$#,)!
+3 f0 (92|$#,)!
+3 f2 (92|$#,)!
+3 C0.2/5|!
+3 f104 (92|$#,)!
+3 f0 (92|$#,)!
+3 f2 (92|$#,)!
+3 f104 (92|$#,)!
+3 C0.4/5|!
+3 C0.3/5|!
+3 f0 (110|$#,)!
+3 f2 (110|$#,)!
+3 f104 (110|$#,)!
+3 f0 (110|$#,)!
+3 f4 (110|$#,)!
+3 f109 (110|$#,)!
+3 f0 (110|$#,)!
+3 f4 (110|$#,)!
+3 f109 (110|$#,)!
+3 Slconv{23|@1|0@0@3&#decimal_point,23|@1|0@0@3&#thousands_sep,23|@1|0@0@3&#grouping,23|@1|0@0@3&#int_curr_symbol,23|@1|0@0@3&#currency_symbol,23|@1|0@0@3&#mon_decimal_point,23|@1|0@0@3&#mon_thousands_sep,23|@1|0@0@3&#mon_grouping,23|@1|0@0@3&#positive_sign,23|@1|0@0@3&#negative_sign,4|@1|$#int_frac_digits,4|@1|$#frac_digits,4|@1|$#p_cs_precedes,4|@1|$#p_sep_by_space,4|@1|$#n_cs_precedes,4|@1|$#n_sep_by_space,4|@1|$#p_sign_posn,4|@1|$#n_sign_posn,}!
+0 s6544|-1 127 -1
+3 f0 (5|$#,23|0@5@7&#,)!
+3 f19 (5|$#,23|0@5@7&#,)!
+3 f23 (5|$#,23|0@5@7&#,)!
+3 f0 ()!
+3 f19 ()!
+1 t121|121&
+3 f127 ()!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,17|$#,)!
+3 f17 (17|$#,17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,5|$#,)!
+3 f17 (17|$#,5|$#,)!
+3 f0 (17|$#,24|4@0@7&#,)!
+3 f17 (17|$#,24|4@0@7&#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,17|$#,)!
+3 f17 (17|$#,17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,36|4@0@7&#,)!
+3 f17 (17|$#,36|4@0@7&#,)!
+3 f0 (17|$#,17|$#,)!
+3 f17 (17|$#,17|$#,)!
+0 a40|&
+3 f0 (173|4@0@7&#,)!
+3 f5 (173|4@0@7&#,)!
+3 f0 (173|$#,5|$#,)!
+3 f1 (173|$#,5|$#,)!
+0 s24|&
+3 ?!
+3 f179 (5|$#,)!
+3 f1 (5|$#,)^182
+1 t181|181&
+3 ?!
+3 f183 (5|$#,)!
+3 f1 (5|$#,)^186
+1 t185|185&
+3 ?!
+3 f187 (5|$#,)!
+3 f1 (5|$#,)^190
+1 t189|189&
+3 ?!
+3 f191 (5|$#,)!
+3 f1 (5|$#,)^194
+1 t193|193&
+3 f0 (5|$#,194|0@5@7&#,)!
+3 f19 (5|$#,194|0@5@7&#,)^197
+1 t196|196&
+3 ?!
+3 f198 (5|$#,)!
+3 f19 (5|$#,)!
+3 f1 (5|$#,194|0@5@7&#,)!
+3 f1 (5|$#,)!
+3 f202 (5|$#,194|0@5@7&#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+0 a41|&
+3 f0 (206|4@0@7&#,!.,)!
+3 f1 (206|4@0@7&#,!.,)!
+3 f0 (206|$#,)!
+3 f1 (206|$#,)!
+0 a42|-1 213 -1
+0 a43|-1 289 -1
+1 t211|211&
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f5 (23|$#,23|$#,)!
+3 f0 ()!
+3 f19 ()!
+3 f213 ()!
+3 f0 (23|@5|4@5@7&#,)!
+3 f19 (23|@5|4@5@7&#,)!
+3 f23 (23|@5|4@5@7&#,)!
+3 f0 (213|$#,)!
+3 f5 (213|$#,)!
+3 f0 (213|0@5@7&#,)!
+3 f5 (213|0@5@7&#,)!
+3 f0 (23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,)!
+3 f213 (23|$#,23|$#,)!
+3 f0 (23|$#,23|$#,213|$#,)!
+3 f19 (23|$#,23|$#,213|$#,)!
+3 f213 (23|$#,23|$#,213|$#,)!
+3 f0 (213|$#,23|0@5@19@2@0#,)!
+3 f1 (213|$#,23|0@5@19@2@0#,)!
+3 f0 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)!
+3 f5 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)!
+3 C0.5/1|!
+3 f0 (213|$#,23|$#,!.,)!
+3 f5 (213|$#,23|$#,!.,)!
+3 f238 (213|$#,23|$#,!.,)!
+3 f0 (213|$#,23|$#,!.,)!
+3 f5 (213|$#,23|$#,!.,)!
+3 f0 (23|$#,!.,)!
+3 f5 (23|$#,!.,)!
+3 f238 (23|$#,!.,)!
+3 f0 (23|$#,!.,)!
+3 f5 (23|$#,!.,)!
+3 f0 (23|4@0@7&#,23|$#,!.,)!
+3 f5 (23|4@0@7&#,23|$#,!.,)!
+3 f238 (23|4@0@7&#,23|$#,!.,)!
+3 f0 (23|4@0@7&#,23|$#,!.,)!
+3 f5 (23|4@0@7&#,23|$#,!.,)!
+3 f0 (213|$#,23|$#,206|$#,)!
+3 f5 (213|$#,23|$#,206|$#,)!
+3 f0 (23|$#,206|$#,)!
+3 f5 (23|$#,206|$#,)!
+3 f0 (23|4@0@7&#,23|$#,206|$#,)!
+3 f5 (23|4@0@7&#,23|$#,206|$#,)!
+3 f0 (213|$#,)!
+3 f5 (213|$#,)!
+3 f0 (23|@5|4@0@7&#,5|$#,213|$#,)!
+3 f19 (23|@5|4@0@7&#,5|$#,213|$#,)!
+3 f23 (23|@5|4@0@7&#,5|$#,213|$#,)!
+3 C0.5/4|!
+3 f0 (265|$#,213|$#,)!
+3 f5 (265|$#,213|$#,)!
+3 f0 (23|$#,213|$#,)!
+3 f5 (23|$#,213|$#,)!
+3 f0 (213|@7|$#,)!
+3 f5 (213|@7|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (23|4@0@7&#,)!
+3 f19 (23|4@0@7&#,)!
+3 f23 (23|4@0@7&#,)!
+3 f0 (265|$#,213|@7|$#,)!
+3 f5 (265|$#,213|@7|$#,)!
+3 f0 (265|$#,)!
+3 f5 (265|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (265|$#,213|$#,)!
+3 f5 (265|$#,213|$#,)!
+3 f0 (20|4@0@7&#,63|$#,63|$#,213|$#,)!
+3 f63 (20|4@0@7&#,63|$#,63|$#,213|$#,)!
+3 f0 (20|$#,63|$#,63|$#,213|$#,)!
+3 f63 (20|$#,63|$#,63|$#,213|$#,)!
+1 t212|212&
+3 f0 (213|$#,289|4@0@7&#,)!
+3 f5 (213|$#,289|4@0@7&#,)!
+3 f0 (213|$#,9|$#,5|$#,)!
+3 f5 (213|$#,9|$#,5|$#,)!
+3 f0 (213|$#,289|$#,)!
+3 f5 (213|$#,289|$#,)!
+3 f0 (213|$#,)!
+3 f9 (213|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (213|$#,)!
+3 f5 (213|$#,)!
+3 f0 (213|$#,)!
+3 f5 (213|$#,)!
+3 f0 (23|0@5@7&#,)!
+3 f1 (23|0@5@7&#,)!
+3 f0 (23|$#,)!
+3 f17 (23|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (23|$#,)!
+3 f9 (23|$#,)!
+1 t19|19&
+1 t23|23&
+3 f0 (23|$#,315|4@5@7&#,)!
+3 f17 (23|$#,315|4@5@7&#,)!
+3 f0 (23|$#,315|4@5@7&#,5|$#,)!
+3 f9 (23|$#,315|4@5@7&#,5|$#,)!
+3 f0 (23|$#,315|4@5@7&#,5|$#,)!
+3 f10 (23|$#,315|4@5@7&#,5|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (6|$#,)!
+3 f1 (6|$#,)!
+3 f0 (63|$#,63|$#,)!
+3 f19 (63|$#,63|$#,)!
+3 f20 (63|$#,63|$#,)!
+3 f0 (63|$#,)!
+3 f19 (63|$#,)!
+3 f20 (63|$#,)!
+3 f0 (20|@5|4@5@2&#,63|$#,)!
+3 f19 (20|@5|4@5@2&#,63|$#,)!
+3 f20 (20|@5|4@5@2&#,63|$#,)!
+3 f0 (20|4@5@2&#,)!
+3 f1 (20|4@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 ?!
+3 f341 ()!
+3 f1 ()^344
+1 t343|343&
+3 f0 (344|$#,)!
+3 f5 (344|$#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (23|0@5@7&#,)!
+3 f5 (23|0@5@7&#,)!
+3 ?!
+3 f352 (20|$#,20|$#,)!
+3 f5 (20|$#,20|$#,)^355
+1 t354|354&
+3 f0 (20|$#,20|$#,63|$#,63|$#,355|$#,)!
+3 f19 (20|$#,20|$#,63|$#,63|$#,355|$#,)!
+3 f20 (20|$#,20|$#,63|$#,63|$#,355|$#,)!
+3 ?!
+3 f359 (20|$#,20|$#,)!
+3 f5 (20|$#,20|$#,)^362
+1 t361|361&
+3 f0 (20|$#,63|$#,63|$#,362|$#,)!
+3 f1 (20|$#,63|$#,63|$#,362|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 S!2{5|@1|$#quot,5|@1|$#rem,}!
+0 s6386|&
+0 s365|&
+3 f0 (5|$#,5|$#,)!
+3 f369 (5|$#,5|$#,)!
+3 f0 (9|$#,)!
+3 f9 (9|$#,)!
+3 S!3{9|@1|$#quot,9|@1|$#rem,}!
+0 s6387|&
+0 s366|&
+3 f0 (9|$#,9|$#,)!
+3 f376 (9|$#,9|$#,)!
+3 f0 (5|$#,)!
+3 f66 (5|$#,)!
+3 f0 (213|$#,)!
+3 f66 (213|$#,)!
+1 t65|65 465 -1
+3 f0 (383|@5|$#,5|$#,213|$#,)!
+3 f19 (383|@5|$#,5|$#,213|$#,)!
+3 f383 (383|@5|$#,5|$#,213|$#,)!
+3 f0 (65|$#,213|$#,)!
+3 f66 (65|$#,213|$#,)!
+3 f0 (383|$#,213|$#,)!
+3 f5 (383|$#,213|$#,)!
+3 f0 (213|$#,5|$#,)!
+3 f5 (213|$#,5|$#,)!
+3 f0 (213|$#,383|$#,!.,)!
+3 f5 (213|$#,383|$#,!.,)!
+3 f0 (213|$#,383|$#,!.,)!
+3 f5 (213|$#,383|$#,!.,)!
+3 f0 (213|@7|$#,)!
+3 f66 (213|@7|$#,)!
+3 f0 ()!
+3 f66 ()!
+1 t67|67&
+3 f0 (23|$#,63|$#,401|0@5@7&#,)!
+3 f63 (23|$#,63|$#,401|0@5@7&#,)!
+3 f0 (383|0@5@7&#,23|$#,63|$#,401|0@5@7&#,)!
+3 f63 (383|0@5@7&#,23|$#,63|$#,401|0@5@7&#,)!
+3 f0 (401|0@5@7&#,)!
+3 f5 (401|0@5@7&#,)!
+3 f0 (383|0@5@7&#,315|$#,63|$#,401|0@5@7&#,)!
+3 f63 (383|0@5@7&#,315|$#,63|$#,401|0@5@7&#,)!
+3 f0 (65|$#,213|@7|$#,)!
+3 f66 (65|$#,213|@7|$#,)!
+3 f0 (65|$#,)!
+3 f66 (65|$#,)!
+3 f0 (383|$#,63|$#,383|$#,!.,)!
+3 f5 (383|$#,63|$#,383|$#,!.,)!
+3 f0 (383|$#,383|$#,!.,)!
+3 f5 (383|$#,383|$#,!.,)!
+3 f0 (66|$#,213|$#,)!
+3 f66 (66|$#,213|$#,)!
+3 f0 (213|$#,383|$#,206|$#,)!
+3 f5 (213|$#,383|$#,206|$#,)!
+3 f0 (383|$#,63|$#,383|$#,206|$#,)!
+3 f5 (383|$#,63|$#,383|$#,206|$#,)!
+3 f0 (383|$#,206|$#,)!
+3 f5 (383|$#,206|$#,)!
+3 f0 (23|4@5@7&#,65|$#,401|0@5@7&#,)!
+3 f63 (23|4@5@7&#,65|$#,401|0@5@7&#,)!
+3 C0.1/383|!
+3 f0 (383|@5|4@0@9&#,383|$#,)!
+3 f1 (383|@5|4@0@9&#,383|$#,)!
+3 f428 (383|@5|4@0@9&#,383|$#,)!
+3 f0 (383|@5|$#,65|$#,)!
+3 f19 (383|@5|$#,65|$#,)!
+3 f383 (383|@5|$#,65|$#,)!
+3 f0 (383|$#,383|$#,)!
+3 f5 (383|$#,383|$#,)!
+3 f0 (383|$#,383|$#,)!
+3 f5 (383|$#,383|$#,)!
+3 f0 (383|@5|4@0@9&#,383|$#,)!
+3 f1 (383|@5|4@0@9&#,383|$#,)!
+3 f428 (383|@5|4@0@9&#,383|$#,)!
+3 f0 (383|$#,383|$#,)!
+3 f63 (383|$#,383|$#,)!
+0 s6530|-1 445 -1
+1 t444|444&
+3 f0 (383|4@0@7&#,63|$#,383|$#,445|$#,)!
+3 f63 (383|4@0@7&#,63|$#,383|$#,445|$#,)!
+3 f0 (383|$#,)!
+3 f63 (383|$#,)!
+3 C0.1/383|!
+3 f0 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f1 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f450 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f0 (383|$#,383|$#,63|$#,)!
+3 f5 (383|$#,383|$#,63|$#,)!
+3 f0 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f1 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f450 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f0 (383|@5|$#,383|$#,)!
+3 f19 (383|@5|$#,383|$#,)!
+3 f383 (383|@5|$#,383|$#,)!
+3 f0 (383|@5|$#,65|$#,)!
+3 f19 (383|@5|$#,65|$#,)!
+3 f383 (383|@5|$#,65|$#,)!
+1 t383|383&
+3 f0 (23|0@5@7&#,465|$#,63|$#,401|0@5@7&#,)!
+3 f63 (23|0@5@7&#,465|$#,63|$#,401|0@5@7&#,)!
+3 f0 (383|$#,383|$#,)!
+3 f63 (383|$#,383|$#,)!
+3 f0 (383|$#,383|$#,)!
+3 f19 (383|$#,383|$#,)!
+3 f383 (383|$#,383|$#,)!
+3 f0 (383|$#,465|0@5@7&#,)!
+3 f17 (383|$#,465|0@5@7&#,)!
+3 f0 (383|0@5@7&#,383|$#,465|$#,)!
+3 f19 (383|0@5@7&#,383|$#,465|$#,)!
+3 f383 (383|0@5@7&#,383|$#,465|$#,)!
+3 f0 (383|$#,465|0@5@7&#,5|$#,)!
+3 f9 (383|$#,465|0@5@7&#,5|$#,)!
+3 f0 (383|$#,465|0@5@7&#,5|$#,)!
+3 f10 (383|$#,465|0@5@7&#,5|$#,)!
+3 f0 (383|0@5@7&#,383|$#,63|$#,)!
+3 f63 (383|0@5@7&#,383|$#,63|$#,)!
+3 f0 (66|$#,)!
+3 f5 (66|$#,)!
+3 f0 (383|$#,65|$#,63|$#,)!
+3 f19 (383|$#,65|$#,63|$#,)!
+3 f383 (383|$#,65|$#,63|$#,)!
+3 f0 (383|$#,383|$#,63|$#,)!
+3 f5 (383|$#,383|$#,63|$#,)!
+3 f0 (383|@5|$#,383|$#,63|$#,)!
+3 f19 (383|@5|$#,383|$#,63|$#,)!
+3 f383 (383|@5|$#,383|$#,63|$#,)!
+3 f0 (383|@5|$#,383|$#,63|$#,)!
+3 f19 (383|@5|$#,383|$#,63|$#,)!
+3 f383 (383|@5|$#,383|$#,63|$#,)!
+3 f0 (383|@5|$#,65|$#,63|$#,)!
+3 f19 (383|@5|$#,65|$#,63|$#,)!
+3 f383 (383|@5|$#,65|$#,63|$#,)!
+3 f0 (383|$#,!.,)!
+3 f5 (383|$#,!.,)!
+3 f0 (383|$#,!.,)!
+3 f5 (383|$#,!.,)!
+0 s25|&
+0 s26|&
+3 C0.2/5|!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f506 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f506 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f506 (66|$#,)!
+3 f0 (66|$#,504|$#,)!
+3 f2 (66|$#,504|$#,)!
+3 f506 (66|$#,504|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f506 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 C0.2/5|!
+3 f524 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f524 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f524 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f524 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f524 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f524 (66|$#,)!
+3 C0.2/5|!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f541 (66|$#,)!
+3 C0.66/5|!
+3 f0 (66|$#,505|$#,)!
+3 f66 (66|$#,505|$#,)!
+3 f545 (66|$#,505|$#,)!
+3 f0 (66|$#,)!
+3 f66 (66|$#,)!
+3 f545 (66|$#,)!
+3 f0 (66|$#,)!
+3 f66 (66|$#,)!
+3 f545 (66|$#,)!
+3 f0 (23|$#,)!
+3 f505 (23|$#,)!
+3 f0 (23|$#,)!
+3 f504 (23|$#,)!
+3 f0 (23|$#,63|$#,)!
+3 f5 (23|$#,63|$#,)!
+3 f0 (383|0@5@7&#,23|0@5@7&#,63|$#,)!
+3 f5 (383|0@5@7&#,23|0@5@7&#,63|$#,)!
+3 f0 (23|4@5@7&#,65|$#,)!
+3 f5 (23|4@5@7&#,65|$#,)!
+3 f0 (383|4@0@7&#,23|$#,63|$#,)!
+3 f63 (383|4@0@7&#,23|$#,63|$#,)!
+3 f0 (23|4@0@7&#,383|$#,63|$#,)!
+3 f63 (23|4@0@7&#,383|$#,63|$#,)!
+3 C0.1/20|!
+3 f0 (20|@5|4@0@9&#,20|$#,63|$#,)!
+3 f1 (20|@5|4@0@9&#,20|$#,63|$#,)!
+3 f569 (20|@5|4@0@9&#,20|$#,63|$#,)!
+3 f0 (20|@5|4@0@7&#,20|$#,63|$#,)!
+3 f1 (20|@5|4@0@7&#,20|$#,63|$#,)!
+3 f569 (20|@5|4@0@7&#,20|$#,63|$#,)!
+3 C0.1/23|!
+3 f0 (23|@5|4@0@9&#,23|$#,)!
+3 f1 (23|@5|4@0@9&#,23|$#,)!
+3 f576 (23|@5|4@0@9&#,23|$#,)!
+3 f0 (23|@5|4@0@9&#,23|$#,63|$#,)!
+3 f1 (23|@5|4@0@9&#,23|$#,63|$#,)!
+3 f576 (23|@5|4@0@9&#,23|$#,63|$#,)!
+3 f0 (23|@5|4@0@9&#,23|$#,)!
+3 f1 (23|@5|4@0@9&#,23|$#,)!
+3 f576 (23|@5|4@0@9&#,23|$#,)!
+3 f0 (23|@5|4@0@9&#,23|$#,5|$#,)!
+3 f1 (23|@5|4@0@9&#,23|$#,5|$#,)!
+3 f576 (23|@5|4@0@9&#,23|$#,5|$#,)!
+3 f0 (20|$#,20|$#,63|$#,)!
+3 f5 (20|$#,20|$#,63|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f5 (23|$#,23|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f5 (23|$#,23|$#,)!
+3 f0 (23|$#,23|$#,63|$#,)!
+3 f5 (23|$#,23|$#,63|$#,)!
+3 f0 (23|4@5@7&#,23|$#,63|$#,)!
+3 f63 (23|4@5@7&#,23|$#,63|$#,)!
+3 f0 (20|$#,5|$#,63|$#,)!
+3 f19 (20|$#,5|$#,63|$#,)!
+3 f20 (20|$#,5|$#,63|$#,)!
+3 f0 (23|@5|$#,265|$#,)!
+3 f19 (23|@5|$#,265|$#,)!
+3 f23 (23|@5|$#,265|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f63 (23|$#,23|$#,)!
+3 f0 (23|@5|$#,23|$#,)!
+3 f19 (23|@5|$#,23|$#,)!
+3 f23 (23|@5|$#,23|$#,)!
+3 f0 (23|@5|$#,265|$#,)!
+3 f19 (23|@5|$#,265|$#,)!
+3 f23 (23|@5|$#,265|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f63 (23|$#,23|$#,)!
+3 f0 (23|@5|0@0@9&#,23|$#,)!
+3 f19 (23|@5|0@0@9&#,23|$#,)!
+3 f23 (23|@5|0@0@9&#,23|$#,)!
+3 f0 (23|@5|0@5@7&#,23|$#,)!
+3 f19 (23|@5|0@5@7&#,23|$#,)!
+3 f23 (23|@5|0@5@7&#,23|$#,)!
+3 C0.1/20|!
+3 f0 (20|@5|4@0@7&#,5|$#,63|$#,)!
+3 f1 (20|@5|4@0@7&#,5|$#,63|$#,)!
+3 f621 (20|@5|4@0@7&#,5|$#,63|$#,)!
+3 f0 (5|$#,)!
+3 f19 (5|$#,)!
+3 f23 (5|$#,)!
+3 f0 (23|$#,)!
+3 f63 (23|$#,)!
+0 s27|&
+0 s28|-1 639 -1
+3 Stm{5|@1|$#tm_sec,5|@1|$#tm_min,5|@1|$#tm_hour,5|@1|$#tm_mday,5|@1|$#tm_mon,5|@1|$#tm_year,5|@1|$#tm_wday,5|@1|$#tm_yday,5|@1|$#tm_isdst,}!
+3 f0 ()!
+3 f630 ()!
+3 f0 (631|$#,631|$#,)!
+3 f17 (631|$#,631|$#,)!
+3 f0 (445|$#,)!
+3 f631 (445|$#,)!
+1 t631|631&
+3 f0 (639|4@5@7&#,)!
+3 f631 (639|4@5@7&#,)!
+3 f0 (445|$#,)!
+3 f19 (445|$#,)!
+3 f23 (445|$#,)!
+3 f0 (639|$#,)!
+3 f19 (639|$#,)!
+3 f23 (639|$#,)!
+3 f0 (639|$#,)!
+3 f19 (639|$#,)!
+3 f445 (639|$#,)!
+3 f0 (639|$#,)!
+3 f19 (639|$#,)!
+3 f445 (639|$#,)!
+3 f0 (23|4@0@7&#,63|$#,23|$#,445|$#,)!
+3 f63 (23|4@0@7&#,63|$#,23|$#,445|$#,)!
+0 s29|&
+0 s30|-1 -1 876
+0 s31|&
+0 s32|-1 7689 -1
+0 s33|&
+0 s34|&
+0 s35|&
+0 s36|&
+0 a44|-1 667 -1
+3 Sdirent{42|@1|$#d_name,}!
+0 s6339|-1 675 -1
+1 t664|664&
+3 f0 (667|$#,)!
+3 f5 (667|$#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f667 (23|$#,)!
+3 f0 (667|$#,)!
+3 f19 (667|$#,)!
+1 t666|666&
+3 f675 (667|$#,)!
+3 f0 (667|$#,)!
+3 f1 (667|$#,)!
+3 Sflock{7|@1|$#l_type,7|@1|$#l_whence,661|@1|$#l_start,661|@1|$#l_len,662|@1|$#l_pid,}!
+0 s6510|&
+3 f0 (23|$#,659|$#,)!
+3 f5 (23|$#,659|$#,)!
+3 f0 (5|$#,5|$#,!.,)!
+3 f5 (5|$#,5|$#,!.,)!
+3 f0 (23|$#,5|$#,!.,)!
+3 f5 (23|$#,5|$#,!.,)!
+3 Sgroup{23|@1|0@0@3&#gr_name,657|@1|$#gr_gid,315|@1|0@0@3&#gr_mem,}!
+0 s6421|-1 691 -1
+3 f0 (657|$#,)!
+3 f19 (657|$#,)!
+1 t688|688&
+3 f691 (657|$#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f691 (23|$#,)!
+3 Spasswd{23|@1|0@0@3&#pw_name,663|@1|$#pw_uid,657|@1|$#pw_gid,23|@1|0@0@3&#pw_dir,23|@1|0@0@3&#pw_shell,}!
+0 s6514|-1 700 -1
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+1 t697|697&
+3 f700 (23|$#,)!
+3 f0 (663|$#,)!
+3 f19 (663|$#,)!
+3 f700 (663|$#,)!
+0 a45|&
+3 f0 (705|$#,5|$#,)!
+3 f1 (705|$#,5|$#,)!
+3 f0 (705|4@0@7&#,5|$#,)!
+3 f5 (705|4@0@7&#,5|$#,)!
+0 a1|-1 722 -1
+3 ?!
+3 f711 ()!
+3 f1 ()^714
+1 t713|713&
+3 Ssigaction{!714$$$@0#sa_handler,710|@1|0@0@3&#sa_mask,5|@1|$#sa_flags,}!
+0 s6468|-1 719 -1
+3 f0 (662|$#,5|$#,)!
+3 f5 (662|$#,5|$#,)!
+1 t716|716&
+3 f0 (5|$#,719|$#,719|4@5@7&#,)!
+3 f5 (5|$#,719|$#,719|4@5@7&#,)!
+1 t710|710&
+3 f0 (722|$#,5|$#,)!
+3 f5 (722|$#,5|$#,)!
+3 f0 (722|$#,5|$#,)!
+3 f5 (722|$#,5|$#,)!
+3 f0 (722|4@0@7&#,)!
+3 f5 (722|4@0@7&#,)!
+3 f0 (722|4@0@7&#,)!
+3 f5 (722|4@0@7&#,)!
+3 f0 (722|$#,5|$#,)!
+3 f5 (722|$#,5|$#,)!
+3 f0 (722|4@0@7&#,)!
+3 f5 (722|4@0@7&#,)!
+3 f0 (5|$#,722|0@5@7&#,722|4@5@7&#,)!
+3 f5 (5|$#,722|0@5@7&#,722|4@5@7&#,)!
+3 f0 (722|$#,)!
+3 f5 (722|$#,)!
+3 f0 (5|$#,23|$#,)!
+3 f19 (5|$#,23|$#,)!
+3 f213 (5|$#,23|$#,)!
+3 f0 (213|$#,)!
+3 f5 (213|$#,)!
+3 Sstat{659|@1|$#st_mode,658|@1|$#st_ino,656|@1|$#st_dev,660|@1|$#st_nlink,663|@1|$#st_uid,657|@1|$#st_gid,661|@1|$#st_size,631|@1|$#st_st_atime,631|@1|$#st_st_mtime,631|@1|$#st_st_ctime,}!
+0 s6534|-1 758 -1
+3 f0 (659|@7|$#,)!
+3 f2 (659|@7|$#,)!
+3 f0 (659|@7|$#,)!
+3 f2 (659|@7|$#,)!
+3 f0 (659|@7|$#,)!
+3 f2 (659|@7|$#,)!
+3 f0 (659|@7|$#,)!
+3 f2 (659|@7|$#,)!
+3 f0 (659|@7|$#,)!
+3 f2 (659|@7|$#,)!
+3 f0 (23|$#,659|$#,)!
+3 f5 (23|$#,659|$#,)!
+1 t745|745&
+3 f0 (5|$#,758|4@0@7&#,)!
+3 f5 (5|$#,758|4@0@7&#,)!
+3 f0 (23|$#,659|$#,)!
+3 f5 (23|$#,659|$#,)!
+3 f0 (23|$#,659|$#,)!
+3 f5 (23|$#,659|$#,)!
+3 f0 (23|$#,758|4@0@7&#,)!
+3 f5 (23|$#,758|4@0@7&#,)!
+3 f0 (659|$#,)!
+3 f5 (659|$#,)!
+3 Stms{630|@1|$#tms_utime,630|@1|$#tms_stime,630|@1|$#tms_cutime,630|@1|$#tms_cstime,}!
+0 s6497|-1 771 -1
+1 t770|770&
+3 f0 (771|4@0@7&#,)!
+3 f630 (771|4@0@7&#,)!
+3 Sutsname{42|@1|$#sysname,42|@1|$#nodename,42|@1|$#release,42|@1|$#version,42|@1|$#machine,}!
+0 s6515|-1 776 -1
+1 t775|775&
+3 f0 (776|4@0@7&#,)!
+3 f5 (776|4@0@7&#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (24|4@5@7&#,)!
+3 f662 (24|4@5@7&#,)!
+3 f0 (662|$#,24|4@0@7&#,5|$#,)!
+3 f662 (662|$#,24|4@0@7&#,5|$#,)!
+3 C0.4/8|!
+3 C0.3/8|!
+0 s372|&
+3 C0.9/9|!
+3 C0.10/9|!
+0 s373|&
+0 s374|&
+3 Stermios{801|@1|$#c_iflag,801|@1|$#c_oflag,801|@1|$#c_cflag,801|@1|$#c_lflag,797|@1|$#c_cc,}!
+0 s6506|-1 804 -1
+1 t803|803&
+3 f0 (804|$#,)!
+3 f800 (804|$#,)!
+3 f0 (804|$#,)!
+3 f800 (804|$#,)!
+3 f0 (804|$#,)!
+3 f5 (804|$#,)!
+3 f0 (804|$#,)!
+3 f5 (804|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (5|$#,5|$#,)!
+3 f5 (5|$#,5|$#,)!
+3 f0 (5|$#,5|$#,)!
+3 f5 (5|$#,5|$#,)!
+3 f0 (5|$#,804|4@0@7&#,)!
+3 f5 (5|$#,804|4@0@7&#,)!
+3 f0 (5|$#,5|$#,)!
+3 f5 (5|$#,5|$#,)!
+3 f0 (5|$#,5|$#,804|$#,)!
+3 f5 (5|$#,5|$#,804|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 (23|$#,5|$#,)!
+3 f5 (23|$#,5|$#,)!
+3 f0 (6|$#,)!
+3 f6 (6|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (23|$#,663|$#,657|$#,)!
+3 f5 (23|$#,663|$#,657|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (23|@5|4@5@7&#,)!
+3 f19 (23|@5|4@5@7&#,)!
+3 f23 (23|@5|4@5@7&#,)!
+3 f0 (23|4@5@7&#,)!
+3 f19 (23|4@5@7&#,)!
+3 f23 (23|4@5@7&#,)!
+3 f0 (5|$#,5|$#,)!
+3 f5 (5|$#,5|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (23|$#,23|$#,!.,)!
+3 f5 (23|$#,23|$#,!.,)!
+3 f0 (23|$#,23|$#,!.,)!
+3 f5 (23|$#,23|$#,!.,)!
+3 f0 (23|$#,23|$#,!.,)!
+3 f5 (23|$#,23|$#,!.,)!
+2 y19|19&
+2 y23|23&
+3 f0 (23|$#,856|$#,)!
+3 f5 (23|$#,856|$#,)!
+3 f0 (23|$#,856|$#,315|$#,)!
+3 f5 (23|$#,856|$#,315|$#,)!
+3 f0 (23|$#,856|$#,)!
+3 f5 (23|$#,856|$#,)!
+3 f0 ()!
+3 f662 ()!
+3 f0 (5|$#,5|$#,)!
+3 f9 (5|$#,5|$#,)!
+3 f0 (23|@5|4@0@7&#,63|$#,)!
+3 f19 (23|@5|4@0@7&#,63|$#,)!
+3 f23 (23|@5|4@0@7&#,63|$#,)!
+3 f0 ()!
+3 f657 ()!
+3 f0 ()!
+3 f663 ()!
+3 f0 ()!
+3 f657 ()!
+2 y657|657&
+3 f0 (5|$#,876|4@0@7&#,)!
+3 f5 (5|$#,876|4@0@7&#,)!
+3 f0 ()!
+3 f19 ()!
+3 f23 ()!
+3 f0 ()!
+3 f662 ()!
+3 f0 ()!
+3 f662 ()!
+3 f0 ()!
+3 f662 ()!
+3 f0 ()!
+3 f663 ()!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f5 (23|$#,23|$#,)!
+3 f0 (5|$#,661|$#,5|$#,)!
+3 f661 (5|$#,661|$#,5|$#,)!
+3 f0 (23|$#,5|$#,)!
+3 f9 (23|$#,5|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (43|4@0@7&#,)!
+3 f5 (43|4@0@7&#,)!
+3 f0 (5|$#,20|4@0@7&#,63|$#,)!
+3 f64 (5|$#,20|4@0@7&#,63|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (657|$#,)!
+3 f5 (657|$#,)!
+3 f0 (662|$#,662|$#,)!
+3 f5 (662|$#,662|$#,)!
+3 f0 ()!
+3 f662 ()!
+3 f0 (663|$#,)!
+3 f5 (663|$#,)!
+3 f0 (6|$#,)!
+3 f6 (6|$#,)!
+3 f0 (5|$#,)!
+3 f9 (5|$#,)!
+3 f0 (5|$#,)!
+3 f662 (5|$#,)!
+3 f0 (5|$#,662|$#,)!
+3 f5 (5|$#,662|$#,)!
+3 f0 (5|$#,)!
+3 f19 (5|$#,)!
+3 f23 (5|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (5|$#,20|$#,63|$#,)!
+3 f64 (5|$#,20|$#,63|$#,)!
+3 Sutimbuf{631|@1|$#actime,631|@1|$#modtime,}!
+0 s6346|-1 931 -1
+1 t930|930&
+3 f0 (23|$#,931|0@5@7&#,)!
+3 f5 (23|$#,931|0@5@7&#,)!
+0 s37|&
+0 s6540|-1 936 -1
+1 t935|935&
+0 s52|-1 13724 -1
+0 s6482|-1 939 -1
+1 t938|938&
+0 s54|&
+0 s6518|-1 942 -1
+1 t941|941&
+0 a56|&
+0 s11|-1 2252 -1
+0 s15|-1 2535 -1
+0 s6505|-1 947 -1
+1 t946|946&
+0 s57|&
+0 s6531|-1 950 -1
+1 t949|949&
+0 a59|-1 13759 -1
+0 s12|&
+0 s6543|-1 954 -1
+1 t953|953&
+0 a61|-1 4075 -1
+0 s6541|-1 957 -1
+1 t956|956&
+0 a64|-1 5567 -1
+0 a5|&
+0 s65|-1 4246 -1
+0 s6358|-1 962 -1
+1 t961|961&
+0 a66|-1 13230 -1
+0 s6537|-1 965 -1
+1 t964|964&
+0 a68|&
+0 s6542|-1 968 -1
+1 t967|967&
+0 a69|-1 13027 -1
+0 s6394|-1 971 -1
+1 t970|970&
+0 a72|&
+0 s6416|-1 974 -1
+1 t973|973&
+0 a73|-1 10642 -1
+0 s6492|-1 977 -1
+1 t976|976&
+0 a77|&
+0 s6481|-1 980 -1
+1 t979|979&
+0 a78|-1 12901 -1
+0 s3|-1 15346 -1
+0 a47|-1 1186 -1
+0 s81|-1 1830 -1
+0 a6|-1 4363 -1
+3 ?!
+3 f986 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)^989
+1 t988|988&
+0 s83|&
+3 ?!
+3 f991 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)^994
+1 t993|993&
+0 s84|&
+3 ?!
+3 f996 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)^999
+1 t998|998&
+0 s85|&
+3 f0 (20|4@5@2&#,)!
+3 f1 (20|4@5@2&#,)!
+0 s13|&
+0 s16|&
+3 f0 (5|$#,)!
+3 f19 (5|$#,)!
+3 f23 (5|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f2 (23|$#,23|$#,)!
+3 f0 (20|@7|15@0@1&#,)!
+3 f1 (20|@7|15@0@1&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,)!
+3 f23 (23|$#,23|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,)!
+3 f23 (23|$#,23|$#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (23|0@0@2&#,)!
+3 f19 (23|0@0@2&#,)!
+3 f23 (23|0@0@2&#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (315|$#,)!
+3 f5 (315|$#,)!
+3 f0 (315|$#,)!
+3 f4 (315|$#,)!
+3 f0 (315|$#,)!
+3 f17 (315|$#,)!
+3 f0 (315|$#,4|$#,23|$#,5|$#,)!
+3 f1 (315|$#,4|$#,23|$#,5|$#,)!
+3 f0 (315|$#,4|$#,)!
+3 f2 (315|$#,4|$#,)!
+3 f0 (315|$#,4|$#,)!
+3 f1 (315|$#,4|$#,)!
+3 f0 (315|$#,)!
+3 f19 (315|$#,)!
+3 f23 (315|$#,)!
+3 f0 (315|$#,)!
+3 f983 (315|$#,)!
+3 f0 (63|$#,)!
+3 f5 (63|$#,)!
+3 f0 (63|$#,)!
+3 f9 (63|$#,)!
+3 f0 (5|$#,)!
+3 f63 (5|$#,)!
+3 f0 (10|$#,)!
+3 f5 (10|$#,)!
+3 f0 (9|$#,)!
+3 f5 (9|$#,)!
+3 f0 (5|$#,)!
+3 f10 (5|$#,)!
+0 s46|&
+0 s50|-1 10067 7861
+0 s51|-1 -1 12629
+3 f0 (1060|@5|0@5@7&#,)!
+3 f19 (1060|@5|0@5@7&#,)!
+3 f23 (1060|@5|0@5@7&#,)!
+3 f0 (5|$#,)!
+3 f19 (5|$#,)!
+3 f23 (5|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,)!
+3 f23 (23|$#,23|$#,)!
+3 f0 (23|0@0@2&#,23|0@0@2&#,)!
+3 f19 (23|0@0@2&#,23|0@0@2&#,)!
+3 f23 (23|0@0@2&#,23|0@0@2&#,)!
+3 f0 (23|0@0@2&#,23|$#,)!
+3 f19 (23|0@0@2&#,23|$#,)!
+3 f23 (23|0@0@2&#,23|$#,)!
+3 f0 (23|0@0@2&#,4|$#,)!
+3 f19 (23|0@0@2&#,4|$#,)!
+3 f23 (23|0@0@2&#,4|$#,)!
+3 f0 (23|0@5@7&#,)!
+3 f19 (23|0@5@7&#,)!
+3 f23 (23|0@5@7&#,)!
+3 f0 (23|$#,23|$#,)!
+3 f2 (23|$#,23|$#,)!
+3 f0 (23|0@5@7&#,23|0@5@7&#,)!
+3 f2 (23|0@5@7&#,23|0@5@7&#,)!
+3 f0 (23|@7|0@5@7&#,)!
+3 f5 (23|@7|0@5@7&#,)!
+3 f0 (23|@7|0@5@7&#,)!
+3 f2 (23|@7|0@5@7&#,)!
+3 f0 (23|@7|0@5@7&#,)!
+3 f2 (23|@7|0@5@7&#,)!
+3 f0 (23|0@0@17&#,)!
+3 f1 (23|0@0@17&#,)!
+3 f0 (5|$#,)!
+3 f19 (5|$#,)!
+3 f23 (5|$#,)!
+3 f0 ()!
+3 f19 ()!
+3 f23 ()!
+3 f0 (23|4@5@2&#,)!
+3 f1 (23|4@5@2&#,)!
+3 f0 (5|@7|$#,5|@7|$#,)!
+3 f5 (5|@7|$#,5|@7|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (213|$#,23|$#,)!
+3 f1 (213|$#,23|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (5|$#,)!
+3 f4 (5|$#,)!
+3 f0 (23|@5|$#,)!
+3 f19 (23|@5|$#,)!
+3 f23 (23|@5|$#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (5|$#,213|$#,)!
+3 f1 (5|$#,213|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (5|$#,)!
+3 f983 (5|$#,)!
+3 f0 (983|0@5@2&#,4|$#,)!
+3 f983 (983|0@5@2&#,4|$#,)!
+3 f0 (983|0@5@2&#,23|$#,5|$#,)!
+3 f983 (983|0@5@2&#,23|$#,5|$#,)!
+3 f0 (4|$#,983|0@5@6&#,)!
+3 f983 (4|$#,983|0@5@6&#,)!
+3 f0 (4|$#,983|0@5@2&#,)!
+3 f983 (4|$#,983|0@5@2&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (23|$#,5|$#,)!
+3 f983 (23|$#,5|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f5 (983|0@5@7&#,)!
+3 e!4{CGE_SAME,CGE_DISTINCT,CGE_CASE,CGE_LOOKALIKE}!
+0 s6576|&
+0 s88|&
+3 f0 (983|0@5@7&#,983|0@5@7&#,5|$#,2|$#,2|$#,)!
+3 f1146 (983|0@5@7&#,983|0@5@7&#,5|$#,2|$#,2|$#,)!
+3 f0 (983|0@5@9&#,23|$#,23|$#,)!
+3 f1 (983|0@5@9&#,23|$#,23|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f4 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f4 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f4 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f4 (983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,5|$#,4|$#,)!
+3 f1 (983|0@5@7&#,5|$#,4|$#,)!
+3 f0 (983|@5|0@5@6@2@0#,)!
+3 f19 (983|@5|0@5@6@2@0#,)!
+3 f23 (983|@5|0@5@6@2@0#,)!
+3 f0 (983|0@5@7&#,)!
+3 f5 (983|0@5@7&#,)!
+3 f0 (983|0@5@9&#,983|0@5@7&#,)!
+3 f2 (983|0@5@9&#,983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,4|$#,)!
+3 f2 (983|0@5@7&#,4|$#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f2 (983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f2 (983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,23|$#,)!
+3 f2 (983|0@5@7&#,23|$#,)!
+3 f0 (983|0@5@7&#,23|$#,)!
+3 f2 (983|0@5@7&#,23|$#,)!
+3 f0 (983|0@5@7&#,23|$#,)!
+3 f2 (983|0@5@7&#,23|$#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,)!
+3 f5 (983|0@5@7&#,983|0@5@7&#,)!
+1 t983|983&
+3 f0 (1186|$#,1186|$#,)!
+3 f5 (1186|$#,1186|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,)!
+3 f0 (983|@5|0@5@7&#,5|$#,)!
+3 f983 (983|@5|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,23|$#,)!
+3 f1 (983|0@5@7&#,23|$#,)!
+3 f0 (983|0@5@7&#,315|$#,5|$#,)!
+3 f983 (983|0@5@7&#,315|$#,5|$#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,983|0@5@7&#,)!
+3 f0 (983|0@5@2&#,983|0@5@2&#,)!
+3 f2 (983|0@5@2&#,983|0@5@2&#,)!
+3 f0 (23|@5|0@5@6@2@0#,)!
+3 f983 (23|@5|0@5@6@2@0#,)!
+3 f0 (23|0@5@2&#,)!
+3 f983 (23|0@5@2&#,)!
+3 f0 (23|0@5@7&#,)!
+3 f983 (23|0@5@7&#,)!
+3 f0 (983|@5|0@5@2@2@0#,)!
+3 f19 (983|@5|0@5@2@2@0#,)!
+3 f23 (983|@5|0@5@2@2@0#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (23|$#,)!
+3 f983 (23|$#,)!
+3 f0 (23|$#,)!
+3 f983 (23|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f983 (983|0@5@2&#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,983|0@5@7&#,)!
+3 f0 (983|0@5@2&#,983|0@5@2&#,)!
+3 f983 (983|0@5@2&#,983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,983|0@5@7&#,)!
+3 f983 (983|0@5@2&#,983|0@5@7&#,)!
+3 f0 (983|0@5@2&#,23|$#,)!
+3 f983 (983|0@5@2&#,23|$#,)!
+3 f0 (983|0@5@2&#,)!
+3 f945 (983|0@5@2&#,)!
+3 f0 (983|0@5@17&#,)!
+3 f1 (983|0@5@17&#,)!
+3 f0 (983|0@5@7&#,4|$#,)!
+3 f983 (983|0@5@7&#,4|$#,)!
+3 f1 (983|@7|6@5@7&#,4|@3|&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@9&#,23|$#,)!
+3 f2 (983|0@5@9&#,23|$#,)!
+3 f0 (2|$#,)!
+3 f983 (2|$#,)!
+3 f0 (2|$#,)!
+3 f983 (2|$#,)!
+3 f0 (2|$#,)!
+3 f2 (2|$#,)!
+3 f0 (2|$#,2|$#,)!
+3 f2 (2|$#,2|$#,)!
+3 f0 (2|$#,2|$#,)!
+3 f5 (2|$#,2|$#,)!
+3 f0 (5|$#,)!
+3 f2 (5|$#,)!
+3 f0 (2|$#,)!
+3 f5 (2|$#,)!
+3 f0 (63|$#,23|$#,5|$#,)!
+3 f19 (63|$#,23|$#,5|$#,)!
+3 f20 (63|$#,23|$#,5|$#,)!
+3 f0 (63|$#,63|$#,23|$#,5|$#,)!
+3 f19 (63|$#,63|$#,23|$#,5|$#,)!
+3 f20 (63|$#,63|$#,23|$#,5|$#,)!
+3 f0 (20|@5|4@5@2&#,63|$#,23|$#,5|$#,)!
+3 f19 (20|@5|4@5@2&#,63|$#,23|$#,5|$#,)!
+3 f20 (20|@5|4@5@2&#,63|$#,23|$#,5|$#,)!
+3 f0 (20|@7|15@5@1&#,63|@7|$#,)!
+3 f19 (20|@7|15@5@1&#,63|@7|$#,)!
+3 f20 (20|@7|15@5@1&#,63|@7|$#,)!
+3 f0 (63|@7|$#,)!
+3 f19 (63|@7|$#,)!
+3 f20 (63|@7|$#,)!
+3 f0 (20|0@5@17&#,)!
+3 f1 (20|0@5@17&#,)!
+0 s48|-1 9162 -1
+3 e!5{NO,YES,MAYBE}!
+0 s6578|&
+0 s89|&
+3 f0 (1289|@7|$#,)!
+3 f983 (1289|@7|$#,)!
+3 f0 (1289|@7|$#,)!
+3 f983 (1289|@7|$#,)!
+3 f0 (1289|$#,)!
+3 f2 (1289|$#,)!
+3 f0 (1289|$#,)!
+3 f2 (1289|$#,)!
+3 f0 (2|$#,)!
+3 f1289 (2|$#,)!
+3 f0 (1289|$#,)!
+3 f2 (1289|$#,)!
+3 f0 (1289|$#,)!
+3 f2 (1289|$#,)!
+3 f0 (1289|$#,)!
+3 f2 (1289|$#,)!
+3 f0 (1289|$#,1289|$#,)!
+3 f5 (1289|$#,1289|$#,)!
+3 f0 (4|$#,)!
+3 f1289 (4|$#,)!
+3 f0 (23|0@0@6&#,!.,)!
+3 f983 (23|0@0@6&#,!.,)!
+0 a7|-1 16980 -1
+3 f0 (1312|$#,)!
+3 f2 (1312|$#,)!
+3 f0 (1312|$#,)!
+3 f2 (1312|$#,)!
+3 f0 (1312|$#,1312|$#,)!
+3 f2 (1312|$#,1312|$#,)!
+3 f0 (1312|@7|$#,1312|@7|$#,)!
+3 f5 (1312|@7|$#,1312|@7|$#,)!
+3 e!6{FL_NORMAL,FL_SPEC,FL_LIB,FL_STDLIB,FL_STDHDR,FL_IMPORT,FL_BUILTIN,FL_PREPROC,FL_RC,FL_EXTERNAL}!
+0 s6577|&
+0 s90|&
+3 S__fileloc{1323|@1|^#kind,1312|@1|^#fid,5|@1|^#lineno,5|@1|^#column,}!
+0 s79|-1 3850 -1
+3 f0 (981|0@5@2&#,981|0@5@7&#,)!
+3 f981 (981|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1312|$#,5|$#,5|$#,)!
+3 f981 (1312|$#,5|$#,5|$#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (1312|$#,5|$#,5|$#,)!
+3 f981 (1312|$#,5|$#,5|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f981 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f981 (983|0@5@7&#,)!
+3 f0 (981|0@5@7&#,5|$#,)!
+3 f981 (981|0@5@7&#,5|$#,)!
+3 f0 (981|0@5@7&#,5|$#,)!
+3 f1 (981|0@5@7&#,5|$#,)!
+3 f0 ()!
+3 f981 ()!
+3 f0 ()!
+3 f981 ()!
+3 f0 ()!
+3 f981 ()!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f981 (983|0@5@7&#,5|$#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f983 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f5 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f983 (981|0@5@7&#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,5|$#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,5|$#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@2&#,)!
+3 f1 (981|0@5@2&#,)!
+3 f0 (981|0@5@2&#,)!
+3 f1 (981|0@5@2&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f5 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f5 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f983 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f981 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f983 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f981 (981|0@5@7&#,)!
+3 f0 ()!
+3 f981 ()!
+3 f0 ()!
+3 f981 ()!
+3 f0 (981|@7|0@5@7&#,)!
+3 f2 (981|@7|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|@7|0@5@7&#,)!
+3 f2 (981|@7|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f981 (951|0@5@7&#,)!
+3 f0 (981|@7|0@5@7&#,)!
+3 f2 (981|@7|0@5@7&#,)!
+3 f0 (981|@7|0@5@7&#,)!
+3 f2 (981|@7|0@5@7&#,)!
+3 f0 (981|@7|0@5@7&#,)!
+3 f1 (981|@7|0@5@7&#,)!
+3 f0 (981|@7|0@5@7&#,)!
+3 f2 (981|@7|0@5@7&#,)!
+3 f0 (981|@7|0@5@7&#,)!
+3 f2 (981|@7|0@5@7&#,)!
+3 f0 (981|@7|0@5@7&#,)!
+3 f2 (981|@7|0@5@7&#,)!
+3 f0 (981|@7|0@5@7&#,5|$#,)!
+3 f1 (981|@7|0@5@7&#,5|$#,)!
+3 f0 (981|@7|0@5@7&#,)!
+3 f1 (981|@7|0@5@7&#,)!
+3 f0 (981|@7|0@5@7&#,5|$#,)!
+3 f1 (981|@7|0@5@7&#,5|$#,)!
+3 f0 (981|@7|0@5@7&#,)!
+3 f1312 (981|@7|0@5@7&#,)!
+3 f0 (981|@7|0@5@7&#,5|$#,)!
+3 f1 (981|@7|0@5@7&#,5|$#,)!
+3 f0 (981|@7|0@5@7&#,5|$#,)!
+3 f1 (981|@7|0@5@7&#,5|$#,)!
+3 f0 (981|@7|0@5@7&#,)!
+3 f1 (981|@7|0@5@7&#,)!
+3 f0 (981|@7|0@5@7&#,)!
+3 f2 (981|@7|0@5@7&#,)!
+3 f0 (981|0@5@2&#,1312|$#,)!
+3 f981 (981|0@5@2&#,1312|$#,)!
+3 f0 (981|0@5@7&#,)!
+3 f981 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f981 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f983 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,5|$#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,5|$#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1312 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 (1312|$#,)!
+3 f1 (1312|$#,)!
+3 f0 (1312|$#,5|$#,)!
+3 f1 (1312|$#,5|$#,)!
+3 e_quals{QU_UNKNOWN,QU_CONST,QU_VOLATILE,QU_INLINE,QU_EXTERN,QU_STATIC,QU_AUTO,QU_REGISTER,QU_SHORT,QU_LONG,QU_SIGNED,QU_UNSIGNED,QU_OUT,QU_IN,QU_ONLY,QU_IMPONLY,QU_TEMP,QU_SHARED,QU_KEEP,QU_KEPT,QU_PARTIAL,QU_SPECIAL,QU_NULL,QU_RELNULL,QU_EXPOSED,QU_RETURNED,QU_OBSERVER,QU_UNIQUE,QU_OWNED,QU_DEPENDENT,QU_RELDEF,QU_YIELD,QU_NEVEREXIT,QU_EXITS,QU_MAYEXIT,QU_TRUEEXIT,QU_FALSEEXIT,QU_UNUSED,QU_EXTERNAL,QU_SEF,QU_NOTNULL,QU_ABSTRACT,QU_CONCRETE,QU_MUTABLE,QU_IMMUTABLE,QU_REFCOUNTED,QU_REFS,QU_NEWREF,QU_KILLREF,QU_TEMPREF,QU_TRUENULL,QU_FALSENULL,QU_CHECKED,QU_UNCHECKED,QU_CHECKEDSTRICT,QU_CHECKMOD,QU_UNDEF,QU_KILLED,QU_PRINTFLIKE,QU_SCANFLIKE,QU_MESSAGELIKE,QU_LAST}!
+0 s6579|&
+0 s91|-1 2104 -1
+3 f0 (5|$#,)!
+3 f1490 (5|$#,)!
+3 f0 (1490|$#,)!
+3 f983 (1490|$#,)!
+3 f0 (1490|$#,1490|$#,)!
+3 f2 (1490|$#,1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f2 (1490|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 ()!
+3 f1490 ()!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 f0 (1490|@7|$#,)!
+3 f2 (1490|@7|$#,)!
+3 S_lltok{5|@1|^#tok,981|@1|0@5@3&#loc,}!
+0 s6395|&
+0 s92|-1 6305 -1
+3 f0 (5|$#,981|0@5@2&#,)!
+3 f1763 (5|$#,981|0@5@2&#,)!
+3 f0 (1763|$#,)!
+3 f983 (1763|$#,)!
+3 f0 (1763|15@0@1&#,)!
+3 f1 (1763|15@0@1&#,)!
+3 f0 (1763|$#,)!
+3 f981 (1763|$#,)!
+3 f0 (1763|$#,)!
+3 f5 (1763|$#,)!
+3 f0 (1763|$#,)!
+3 f2 (1763|$#,)!
+3 e!7{NOCLAUSE,TRUECLAUSE,FALSECLAUSE,ANDCLAUSE,ORCLAUSE,WHILECLAUSE,DOWHILECLAUSE,FORCLAUSE,CASECLAUSE,SWITCHCLAUSE,CONDCLAUSE,ITERCLAUSE,TRUEEXITCLAUSE,FALSEEXITCLAUSE}!
+0 s6580|&
+0 s93|-1 6879 -1
+3 f0 (1778|$#,)!
+3 f983 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f983 (1778|$#,)!
+3 f0 (1778|$#,2|$#,)!
+3 f983 (1778|$#,2|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f983 (1778|$#,)!
+0 s82|-1 1800 -1
+1 t1799|1799&
+3 S_cstringSList{5|@1|^#nelements,5|@1|^#nspace,1800|@1|11@3@3&#elements,}!
+0 s6435|-1 1803 -1
+1 t1802|1802&
+0 a94|-1 16665 -1
+3 f0 (1804|0@5@7&#,)!
+3 f2 (1804|0@5@7&#,)!
+3 f0 (1804|@7|0@5@7&#,)!
+3 f5 (1804|@7|0@5@7&#,)!
+3 f0 (1804|@7|0@5@7&#,)!
+3 f2 (1804|@7|0@5@7&#,)!
+3 f0 (1804|0@5@7&#,983|0@5@7&#,)!
+3 f983 (1804|0@5@7&#,983|0@5@7&#,)!
+3 f0 ()!
+3 f1804 ()!
+3 f0 (983|0@5@19@2@0#,)!
+3 f1804 (983|0@5@19@2@0#,)!
+3 f0 (1804|@5|0@5@7&#,983|0@5@19@2@0#,)!
+3 f1804 (1804|@5|0@5@7&#,983|0@5@19@2@0#,)!
+3 f0 (1804|0@5@7&#,)!
+3 f1 (1804|0@5@7&#,)!
+3 f0 (1804|0@5@7&#,)!
+3 f983 (1804|0@5@7&#,)!
+3 f0 (1804|0@5@7&#,)!
+3 f983 (1804|0@5@7&#,)!
+3 f0 (1804|0@5@2&#,)!
+3 f1 (1804|0@5@2&#,)!
+3 f0 (1804|0@5@7&#,5|$#,5|$#,5|$#,)!
+3 f1 (1804|0@5@7&#,5|$#,5|$#,5|$#,)!
+3 f1 (1804|@7|6@5@7&#,983|@3|6@5@19@2@0#,)!
+1 t984|984&
+3 S_cstringList{5|@1|^#nelements,5|@1|^#nspace,1830|@1|11@3@3&#elements,}!
+0 s6436|-1 1833 -1
+1 t1832|1832&
+0 a95|&
+3 f0 (1834|0@5@7&#,)!
+3 f2 (1834|0@5@7&#,)!
+3 f0 (1834|@7|0@5@7&#,)!
+3 f5 (1834|@7|0@5@7&#,)!
+3 f0 (1834|@7|0@5@7&#,)!
+3 f2 (1834|@7|0@5@7&#,)!
+3 f0 (1834|0@5@7&#,983|0@5@7&#,)!
+3 f983 (1834|0@5@7&#,983|0@5@7&#,)!
+3 f0 ()!
+3 f1834 ()!
+3 f0 (983|0@5@4&#,)!
+3 f1834 (983|0@5@4&#,)!
+3 f0 (1834|@5|0@5@7&#,983|0@5@4&#,)!
+3 f1834 (1834|@5|0@5@7&#,983|0@5@4&#,)!
+3 f0 (1834|0@5@7&#,)!
+3 f1 (1834|0@5@7&#,)!
+3 f0 (1834|0@5@7&#,)!
+3 f983 (1834|0@5@7&#,)!
+3 f0 (1834|0@5@7&#,)!
+3 f983 (1834|0@5@7&#,)!
+3 f0 (1834|0@5@2&#,)!
+3 f1 (1834|0@5@2&#,)!
+3 f0 (1834|0@5@7&#,5|$#,5|$#,5|$#,)!
+3 f1 (1834|0@5@7&#,5|$#,5|$#,5|$#,)!
+3 f1 (1834|@7|6@5@7&#,983|@3|6@5@19@2@0#,)!
+3 e!8{SKIP_FLAG,INVALID_FLAG,FLG_ABSTRACTBOOL,FLG_LIKELYBOOL,FLG_IMPABSTRACT,FLG_ACCESSALL,FLG_ACCESSMODULE,FLG_ACCESSFILE,FLG_ACCESSCZECH,FLG_ACCESSSLOVAK,FLG_ACCESSCZECHOSLOVAK,FLG_ABSTRACT,FLG_MUTREP,FLG_GLOBALIAS,FLG_CHECKSTRICTGLOBALIAS,FLG_CHECKEDGLOBALIAS,FLG_CHECKMODGLOBALIAS,FLG_UNCHECKEDGLOBALIAS,FLG_ALIASUNIQUE,FLG_MAYALIASUNIQUE,FLG_MUSTNOTALIAS,FLG_RETALIAS,FLG_NOPARAMS,FLG_OLDSTYLE,FLG_GNUEXTENSIONS,FLG_USEVARARGS,FLG_WARNPOSIX,FLG_EXITARG,FLG_EVALORDER,FLG_EVALORDERUNCON,FLG_BOOLFALSE,FLG_BOOLTYPE,FLG_BOOLTRUE,FLG_NOACCESS,FLG_NOCOMMENTS,FLG_UNRECOGCOMMENTS,FLG_CONTINUECOMMENT,FLG_NESTCOMMENT,FLG_TMPCOMMENTS,FLG_LINTCOMMENTS,FLG_WARNLINTCOMMENTS,FLG_DECLUNDEF,FLG_SPECUNDEF,FLG_SPECUNDECL,FLG_LOOPEXEC,FLG_CONTROL,FLG_INFLOOPS,FLG_INFLOOPSUNCON,FLG_DEEPBREAK,FLG_LOOPLOOPBREAK,FLG_SWITCHLOOPBREAK,FLG_LOOPSWITCHBREAK,FLG_SWITCHSWITCHBREAK,FLG_LOOPLOOPCONTINUE,FLG_UNREACHABLE,FLG_WHILEEMPTY,FLG_WHILEBLOCK,FLG_FOREMPTY,FLG_FORBLOCK,FLG_IFEMPTY,FLG_IFBLOCK,FLG_ALLEMPTY,FLG_ALLBLOCK,FLG_ELSEIFCOMPLETE,FLG_NORETURN,FLG_CASEBREAK,FLG_MISSCASE,FLG_FIRSTCASE,FLG_GRAMMAR,FLG_NOPP,FLG_SHADOW,FLG_INCONDEFSLIB,FLG_WARNOVERLOAD,FLG_NESTEDEXTERN,FLG_REDECL,FLG_REDEF,FLG_INCONDEFS,FLG_IMPTYPE,FLG_MATCHFIELDS,FLG_USEDEF,FLG_IMPOUTS,FLG_TMPDIR,FLG_LARCHPATH,FLG_LCLIMPORTDIR,FLG_SYSTEMDIRS,FLG_SKIPANSIHEADERS,FLG_SKIPPOSIXHEADERS,FLG_SYSTEMDIRERRORS,FLG_SYSTEMDIREXPAND,FLG_INCLUDEPATH,FLG_SPECPATH,FLG_QUIET,FLG_USESTDERR,FLG_SHOWSUMMARY,FLG_SHOWSCAN,FLG_STATS,FLG_TIMEDIST,FLG_SHOWUSES,FLG_NOEFFECT,FLG_NOEFFECTUNCON,FLG_EXPORTANY,FLG_EXPORTFCN,FLG_EXPORTMACRO,FLG_EXPORTTYPE,FLG_EXPORTVAR,FLG_EXPORTCONST,FLG_EXPORTITER,FLG_REPEXPOSE,FLG_RETEXPOSE,FLG_ASSIGNEXPOSE,FLG_CASTEXPOSE,FLG_LINELEN,FLG_SHOWCOL,FLG_PARENFILEFORMAT,FLG_SHOWFUNC,FLG_SHOWALLCONJS,FLG_IMPCONJ,FLG_EXPECT,FLG_LCLEXPECT,FLG_PARTIAL,FLG_GLOBALS,FLG_USEALLGLOBS,FLG_INTERNALGLOBS,FLG_INTERNALGLOBSNOGLOBS,FLG_WARNMISSINGGLOBALS,FLG_WARNMISSINGGLOBALSNOGLOBS,FLG_GLOBUNSPEC,FLG_ALLGLOBALS,FLG_CHECKSTRICTGLOBALS,FLG_IMPCHECKEDSPECGLOBALS,FLG_IMPCHECKMODSPECGLOBALS,FLG_IMPCHECKEDSTRICTSPECGLOBALS,FLG_IMPCHECKEDGLOBALS,FLG_IMPCHECKMODGLOBALS,FLG_IMPCHECKEDSTRICTGLOBALS,FLG_IMPCHECKEDSTATICS,FLG_IMPCHECKMODSTATICS,FLG_IMPCHECKMODINTERNALS,FLG_IMPCHECKEDSTRICTSTATICS,FLG_MODGLOBS,FLG_MODGLOBSUNSPEC,FLG_MODSTRICTGLOBSUNSPEC,FLG_MODGLOBSUNCHECKED,FLG_KEEP,FLG_DOLH,FLG_DOLCS,FLG_SINGLEINCLUDE,FLG_NEVERINCLUDE,FLG_SKIPSYSHEADERS,FLG_WARNFLAGS,FLG_WARNUNIXLIB,FLG_BADFLAG,FLG_FORCEHINTS,FLG_HELP,FLG_HINTS,FLG_RETVAL,FLG_RETVALOTHER,FLG_RETVALBOOL,FLG_RETVALINT,FLG_OPTF,FLG_INIT,FLG_NOF,FLG_NEEDSPEC,FLG_NEWDECL,FLG_ITER,FLG_HASYIELD,FLG_DUMP,FLG_MERGE,FLG_NOLIB,FLG_ANSILIB,FLG_STRICTLIB,FLG_UNIXLIB,FLG_UNIXSTRICTLIB,FLG_POSIXLIB,FLG_POSIXSTRICTLIB,FLG_WHICHLIB,FLG_COMMENTCHAR,FLG_ALLMACROS,FLG_LIBMACROS,FLG_SPECMACROS,FLG_FCNMACROS,FLG_CONSTMACROS,FLG_MACROMATCHNAME,FLG_MACRONEXTLINE,FLG_MACROSTMT,FLG_MACROEMPTY,FLG_MACROPARAMS,FLG_MACROASSIGN,FLG_SEFPARAMS,FLG_SEFUNSPEC,FLG_MACROPARENS,FLG_MACRODECL,FLG_MACROFCNDECL,FLG_MACROCONSTDECL,FLG_MACROREDEF,FLG_MACROUNDEF,FLG_RETSTACK,FLG_USERELEASED,FLG_STRICTUSERELEASED,FLG_COMPDEF,FLG_COMPMEMPASS,FLG_MUSTDEFINE,FLG_UNIONDEF,FLG_MEMIMPLICIT,FLG_PARAMIMPTEMP,FLG_ALLIMPONLY,FLG_CODEIMPONLY,FLG_SPECALLIMPONLY,FLG_GLOBIMPONLY,FLG_RETIMPONLY,FLG_STRUCTIMPONLY,FLG_SPECGLOBIMPONLY,FLG_SPECRETIMPONLY,FLG_SPECSTRUCTIMPONLY,FLG_DEPARRAYS,FLG_COMPDESTROY,FLG_STRICTDESTROY,FLG_MUSTFREE,FLG_BRANCHSTATE,FLG_STRICTBRANCHSTATE,FLG_MEMCHECKS,FLG_MEMTRANS,FLG_EXPOSETRANS,FLG_OBSERVERTRANS,FLG_DEPENDENTTRANS,FLG_NEWREFTRANS,FLG_ONLYTRANS,FLG_ONLYUNQGLOBALTRANS,FLG_OWNEDTRANS,FLG_FRESHTRANS,FLG_SHAREDTRANS,FLG_TEMPTRANS,FLG_KEPTTRANS,FLG_KEEPTRANS,FLG_IMMEDIATETRANS,FLG_REFCOUNTTRANS,FLG_STATICTRANS,FLG_UNKNOWNTRANS,FLG_STATICINITTRANS,FLG_UNKNOWNINITTRANS,FLG_READONLYSTRINGS,FLG_READONLYTRANS,FLG_PASSUNKNOWN,FLG_MODIFIES,FLG_MUSTMOD,FLG_MODOBSERVER,FLG_MODOBSERVERUNCON,FLG_MODINTERNALSTRICT,FLG_MODFILESYSTEM,FLG_MODUNSPEC,FLG_MODNOMODS,FLG_MODUNCON,FLG_MODUNCONNOMODS,FLG_GLOBALSIMPMODIFIESNOTHING,FLG_MODIFIESIMPNOGLOBALS,FLG_NAMECHECKS,FLG_CZECH,FLG_CZECHFUNCTIONS,FLG_CZECHVARS,FLG_CZECHMACROS,FLG_CZECHCONSTANTS,FLG_CZECHTYPES,FLG_SLOVAK,FLG_SLOVAKFUNCTIONS,FLG_SLOVAKMACROS,FLG_SLOVAKVARS,FLG_SLOVAKCONSTANTS,FLG_SLOVAKTYPES,FLG_CZECHOSLOVAK,FLG_CZECHOSLOVAKFUNCTIONS,FLG_CZECHOSLOVAKMACROS,FLG_CZECHOSLOVAKVARS,FLG_CZECHOSLOVAKCONSTANTS,FLG_CZECHOSLOVAKTYPES,FLG_ANSIRESERVED,FLG_CPPNAMES,FLG_ANSIRESERVEDLOCAL,FLG_DISTINCTEXTERNALNAMES,FLG_EXTERNALNAMELEN,FLG_EXTERNALNAMECASEINSENSITIVE,FLG_DISTINCTINTERNALNAMES,FLG_INTERNALNAMELEN,FLG_INTERNALNAMECASEINSENSITIVE,FLG_INTERNALNAMELOOKALIKE,FLG_MACROVARPREFIX,FLG_MACROVARPREFIXEXCLUDE,FLG_TAGPREFIX,FLG_TAGPREFIXEXCLUDE,FLG_ENUMPREFIX,FLG_ENUMPREFIXEXCLUDE,FLG_FILESTATICPREFIX,FLG_FILESTATICPREFIXEXCLUDE,FLG_GLOBPREFIX,FLG_GLOBPREFIXEXCLUDE,FLG_TYPEPREFIX,FLG_TYPEPREFIXEXCLUDE,FLG_EXTERNALPREFIX,FLG_EXTERNALPREFIXEXCLUDE,FLG_LOCALPREFIX,FLG_LOCALPREFIXEXCLUDE,FLG_UNCHECKEDMACROPREFIX,FLG_UNCHECKEDMACROPREFIXEXCLUDE,FLG_CONSTPREFIX,FLG_CONSTPREFIXEXCLUDE,FLG_ITERPREFIX,FLG_ITERPREFIXEXCLUDE,FLG_DECLPARAMPREFIX,FLG_DECLPARAMNAME,FLG_DECLPARAMMATCH,FLG_DECLPARAMPREFIXEXCLUDE,FLG_CONTROLNESTDEPTH,FLG_STRINGLITERALLEN,FLG_NUMSTRUCTFIELDS,FLG_NUMENUMMEMBERS,FLG_INCLUDENEST,FLG_ANSILIMITS,FLG_NAME,FLG_SPECIAL,FLG_NULL,FLG_NULLDEREF,FLG_FCNDEREF,FLG_NULLPASS,FLG_NULLRET,FLG_NULLSTATE,FLG_NULLASSIGN,FLG_BOOLCOMPARE,FLG_REALCOMPARE,FLG_POINTERARITH,FLG_NULLPOINTERARITH,FLG_PTRNUMCOMPARE,FLG_STRICTOPS,FLG_BITWISEOPS,FLG_SHIFTSIGNED,FLG_BOOLOPS,FLG_PTRNEGATE,FLG_SIZEOFTYPE,FLG_SIZEOFFORMALARRAY,FLG_FIXEDFORMALARRAY,FLG_INCOMPLETETYPE,FLG_FORMALARRAY,FLG_PREDASSIGN,FLG_PREDBOOL,FLG_PREDBOOLINT,FLG_PREDBOOLOTHERS,FLG_PREDBOOLPTR,FLG_DEFINE,FLG_UNDEFINE,FLG_GLOBSTATE,FLG_SUPCOUNTS,FLG_LIMIT,FLG_SYNTAX,FLG_TRYTORECOVER,FLG_PREPROC,FLG_TYPE,FLG_FULLINITBLOCK,FLG_ENUMMEMBERS,FLG_MAINTYPE,FLG_FORMATTYPE,FLG_FORMATCODE,FLG_FORWARDDECL,FLG_ABSTVOIDP,FLG_CASTFCNPTR,FLG_CHARINDEX,FLG_ENUMINDEX,FLG_BOOLINT,FLG_CHARINT,FLG_ENUMINT,FLG_FLOATDOUBLE,FLG_IGNOREQUALS,FLG_DUPLICATEQUALS,FLG_IGNORESIGNS,FLG_NUMLITERAL,FLG_CHARINTLITERAL,FLG_RELAXQUALS,FLG_RELAXTYPES,FLG_CHARUNSIGNEDCHAR,FLG_MATCHANYINTEGRAL,FLG_LONGUNSIGNEDINTEGRAL,FLG_LONGINTEGRAL,FLG_LONGUNSIGNEDUNSIGNEDINTEGRAL,FLG_LONGSIGNEDINTEGRAL,FLG_ZEROPTR,FLG_REPEATUNRECOG,FLG_SYSTEMUNRECOG,FLG_UNRECOG,FLG_TOPUNUSED,FLG_EXPORTLOCAL,FLG_EXPORTHEADER,FLG_EXPORTHEADERVAR,FLG_FIELDUNUSED,FLG_ENUMMEMUNUSED,FLG_CONSTUNUSED,FLG_FUNCUNUSED,FLG_PARAMUNUSED,FLG_TYPEUNUSED,FLG_VARUNUSED,FLG_UNUSEDSPECIAL,LAST_FLAG}!
+0 s6581|&
+0 s96|-1 -1 10041
+3 f1 (1862|@3|&#,)!
+3 e!9{FK_ABSTRACT,FK_ANSI,FK_BEHAVIOR,FK_COMMENTS,FK_COMPLETE,FK_CONTROL,FK_DEBUG,FK_DECL,FK_DEF,FK_DIRECT,FK_DISPLAY,FK_EFFECT,FK_EXPORT,FK_EXPOSURE,FK_FORMAT,FK_GLOBAL,FK_GLOBALS,FK_HEADERS,FK_HELP,FK_IGNORERET,FK_INIT,FK_ITER,FK_LIBS,FK_LIMITS,FK_MACROS,FK_MEMORY,FK_MODIFIES,FK_NAMES,FK_NONE,FK_NULL,FK_OPS,FK_PRED,FK_PREPROC,FK_SECRET,FK_SUPPRESS,FK_SYNTAX,FK_TYPE,FK_TYPEEQ,FK_NUMBERS,FK_POINTER,FK_UNRECOG,FK_USE,FK_BOOL,FK_ALIAS,FK_PROTOS,FK_SPEC,FK_IMPLICIT,FK_FILES,FK_ERRORS,FK_UNSPEC,FK_SPEED,FK_PARAMS,FK_DEAD,FK_LEAK,FK_ARRAY,FK_OBSOLETE,FK_PREFIX}!
+0 s6582|&
+0 s97|&
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (2|$#,2|$#,)!
+3 f1 (2|$#,2|$#,)!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f5 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1862 (983|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@7&#,)!
+3 f1 (1862|$#,983|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,)!
+3 f1 (1862|$#,983|0@5@2&#,)!
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f5 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f5 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1866 (983|0@5@7&#,)!
+3 f0 (1866|$#,)!
+3 f1 (1866|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|@7|$#,)!
+3 f2 (1862|@7|$#,)!
+3 f0 (1862|@7|$#,)!
+3 f2 (1862|@7|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 C1.2/1|!
+3 f0 (2|$#,)!
+3 f2 (2|$#,)!
+3 f1937 (2|$#,)!
+3 f0 (2|$#,983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f2 (2|$#,983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f0 (2|@7|$#,)!
+3 f1 (2|@7|$#,)!
+3 f0 (2|@7|$#,)!
+3 f1 (2|@7|$#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,983|0@5@2&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,)!
+3 f1 (1862|$#,983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,981|0@5@7&#,)!
+3 f1 (983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (23|0@0@6&#,)!
+3 f1 (23|0@0@6&#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (951|0@5@7&#,983|0@5@2&#,)!
+3 f1 (951|0@5@7&#,983|0@5@2&#,)!
+3 f0 (951|0@5@7&#,983|0@5@2&#,)!
+3 f1 (951|0@5@7&#,983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 f0 (983|0@5@19@3@0#,)!
+3 f1 (983|0@5@19@3@0#,)!
+3 f0 (983|0@5@7&#,5|$#,983|0@5@2&#,)!
+3 f1 (983|0@5@7&#,5|$#,983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,983|0@5@7&#,5|$#,)!
+3 f1 (983|0@5@2&#,983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (1862|$#,1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1862|$#,1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (985|$#,969|0@5@7&#,985|$#,969|0@5@7&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (985|$#,969|0@5@7&#,985|$#,969|0@5@7&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (985|$#,969|0@5@7&#,985|$#,969|0@5@7&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (985|$#,969|0@5@7&#,985|$#,969|0@5@7&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (985|@7|$#,969|@7|0@5@7&#,985|@7|$#,969|@7|0@5@7&#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f2 (985|@7|$#,969|@7|0@5@7&#,985|@7|$#,969|@7|0@5@7&#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f0 (1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f2 (1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f0 (1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f1 (1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f0 (1862|@7|$#,1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f1 (1862|@7|$#,1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f0 (1862|@7|$#,1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f1 (1862|@7|$#,1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f0 (1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f1 (1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f0 (1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f1 (1862|@7|$#,983|@7|0@5@2&#,981|@7|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,983|0@5@2&#,981|@7|0@5@7&#,)!
+3 f1 (1862|$#,983|0@5@2&#,983|0@5@2&#,981|@7|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f1 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1862|$#,23|$#,)!
+3 f1 (1862|$#,23|$#,)!
+3 f0 (983|0@5@2&#,981|0@5@7&#,)!
+3 f1 (983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (1862|$#,983|0@5@2&#,983|0@5@2&#,)!
+3 f1 (1862|$#,983|0@5@2&#,983|0@5@2&#,)!
+3 f0 (1862|$#,983|0@5@2&#,)!
+3 f1 (1862|$#,983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (5|$#,)!
+3 f983 (5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+2 F0/0|0&
+2 F4/0|4&
+3 S!10{23|@1|0@0@3&#name,213|@1|0@5@18&#file,2072|@1|^#buffer,6|@1|^#lineNo,2|@1|^#echo,2|@1|^#fromString,23|@1|0@5@17&#stringSource,23|@1|0@5@18&#stringSourceTail,}!
+0 s6528|&
+0 s369|-1 2076 -1
+1 t2075|2075&
+3 f0 (2076|0@5@2&#,)!
+3 f1 (2076|0@5@2&#,)!
+3 f0 (2076|$#,)!
+3 f2 (2076|$#,)!
+3 f0 (23|0@0@6&#,23|$#,2|$#,)!
+3 f19 (23|0@0@6&#,23|$#,2|$#,)!
+3 f2076 (23|0@0@6&#,23|$#,2|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,)!
+3 f2076 (23|$#,23|$#,)!
+3 f0 (2076|$#,)!
+3 f19 (2076|$#,)!
+3 f23 (2076|$#,)!
+3 f0 (2076|$#,)!
+3 f2 (2076|$#,)!
+3 f0 (23|$#,2076|$#,)!
+3 f2 (23|$#,2076|$#,)!
+3 f0 (2076|$#,)!
+3 f19 (2076|$#,)!
+3 f23 (2076|$#,)!
+3 f0 (2076|@7|$#,)!
+3 f2 (2076|@7|$#,)!
+3 f0 (2076|$#,)!
+3 f6 (2076|$#,)!
+3 f0 (23|$#,315|4@0@7&#,)!
+3 f19 (23|$#,315|4@0@7&#,)!
+3 f23 (23|$#,315|4@0@7&#,)!
+1 t1490|1490&
+3 S_qualList{5|@1|^#nelements,5|@1|^#free,2104|@1|11@3@3&#elements,}!
+0 s6432|-1 2107 -1
+1 t2106|2106&
+0 a98|&
+3 f0 (2108|0@5@7&#,)!
+3 f2 (2108|0@5@7&#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f2 (2108|0@5@7&#,)!
+3 f1 (2108|@7|6@5@7&#,1490|@3|&#,)!
+3 f0 (2108|@7|0@5@7&#,)!
+3 f5 (2108|@7|0@5@7&#,)!
+3 f0 (2108|@7|0@5@7&#,)!
+3 f2 (2108|@7|0@5@7&#,)!
+3 f0 ()!
+3 f2108 ()!
+3 f0 (2108|@5|0@5@7&#,1490|$#,)!
+3 f2108 (2108|@5|0@5@7&#,1490|$#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f983 (2108|0@5@7&#,)!
+3 f0 (2108|0@5@2&#,)!
+3 f1 (2108|0@5@2&#,)!
+3 f0 (2108|@5|0@5@7&#,2108|0@5@7&#,)!
+3 f2108 (2108|@5|0@5@7&#,2108|0@5@7&#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f2108 (2108|0@5@7&#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f983 (2108|0@5@7&#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f1 (2108|0@5@7&#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f2 (2108|0@5@7&#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f2 (2108|0@5@7&#,)!
+0 s6410|-1 2139 -1
+1 t2138|2138&
+3 S_mappair{945|@1|^#domain,945|@1|^#range,2139|@1|0@5@3&#next,}!
+0 s99|-1 2142 -1
+1 t2141|2141 16062 -1
+0 s100|-1 2144 -1
+1 t2143|2143&
+3 S!11{6|@1|^#count,2144|@1|0@3@2&#buckets,}!
+0 s6349|&
+0 s359|-1 2150 -1
+3 f0 ()!
+3 f19 ()!
+1 t2147|2147&
+3 f2150 ()!
+3 f0 (2150|$#,945|$#,)!
+3 f945 (2150|$#,945|$#,)!
+3 f0 (2150|$#,945|$#,945|$#,)!
+3 f1 (2150|$#,945|$#,945|$#,)!
+3 f0 (2150|0@0@2&#,)!
+3 f1 (2150|0@0@2&#,)!
+3 e!12{SRT_FIRST,SRT_NONE,SRT_HOF,SRT_PRIM,SRT_SYN,SRT_PTR,SRT_OBJ,SRT_ARRAY,SRT_VECTOR,SRT_STRUCT,SRT_TUPLE,SRT_UNION,SRT_UNIONVAL,SRT_ENUM,SRT_LAST}!
+0 s6583|&
+0 s101|&
+0 s6485|-1 2162 -1
+1 t2161|2161&
+3 S_smemberInfo{945|@1|^#name,944|@1|^#sort,945|@1|11@0@0&#sortname,2162|@1|0@5@18&#next,}!
+0 s102|-1 2165 -1
+1 t2164|2164&
+3 S_sortNode{2160|@1|^#kind,944|@1|^#handle,945|@1|^#name,945|@1|11@0@0&#tag,2|@1|11@0@0&#realtag,944|@1|^#baseSort,944|@1|11@0@0&#objSort,2165|@1|0@5@3&#members,2|@1|^#export,2|@1|^#mutable,2|@1|^#abstract,2|@1|^#imported,}!
+0 s6536|&
+0 s103|-1 15363 -1
+3 f0 (944|$#,)!
+3 f983 (944|$#,)!
+3 f0 (944|$#,)!
+3 f983 (944|$#,)!
+3 f0 (951|0@5@7&#,945|$#,)!
+3 f944 (951|0@5@7&#,945|$#,)!
+3 f0 (951|0@5@7&#,944|$#,945|$#,)!
+3 f944 (951|0@5@7&#,944|$#,945|$#,)!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 (951|0@5@7&#,944|$#,)!
+3 f944 (951|0@5@7&#,944|$#,)!
+3 f0 (944|$#,5|$#,)!
+3 f944 (944|$#,5|$#,)!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (951|0@5@7&#,944|$#,)!
+3 f944 (951|0@5@7&#,944|$#,)!
+3 f0 (951|0@5@7&#,944|$#,)!
+3 f944 (951|0@5@7&#,944|$#,)!
+3 f0 (951|0@5@7&#,945|$#,)!
+3 f944 (951|0@5@7&#,945|$#,)!
+3 f0 (951|0@5@7&#,945|$#,)!
+3 f944 (951|0@5@7&#,945|$#,)!
+3 f0 (951|0@5@7&#,)!
+3 f944 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f944 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f944 (951|0@5@7&#,)!
+3 f0 (944|$#,2165|0@5@2&#,)!
+3 f2 (944|$#,2165|0@5@2&#,)!
+3 f0 (944|$#,2165|0@5@2&#,)!
+3 f2 (944|$#,2165|0@5@2&#,)!
+3 f0 (944|$#,2165|0@5@2&#,)!
+3 f2 (944|$#,2165|0@5@2&#,)!
+3 f0 (951|0@5@7&#,944|$#,)!
+3 f944 (951|0@5@7&#,944|$#,)!
+3 f0 (951|0@5@7&#,944|$#,)!
+3 f944 (951|0@5@7&#,944|$#,)!
+3 f0 (944|$#,)!
+3 f945 (944|$#,)!
+3 f0 (944|$#,)!
+3 f19 (944|$#,)!
+3 f23 (944|$#,)!
+3 f0 (944|$#,)!
+3 f2168 (944|$#,)!
+3 f0 (944|$#,)!
+3 f2168 (944|$#,)!
+3 f0 (945|$#,)!
+3 f944 (945|$#,)!
+3 f0 (213|$#,2|$#,)!
+3 f1 (213|$#,2|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (944|$#,944|$#,)!
+3 f2 (944|$#,944|$#,)!
+3 f0 (944|$#,944|$#,)!
+3 f2 (944|$#,944|$#,)!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 (944|$#,)!
+3 f2 (944|$#,)!
+3 f0 ()!
+3 f944 ()!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 (944|$#,)!
+3 f2 (944|$#,)!
+3 f0 (944|$#,)!
+3 f2 (944|$#,)!
+3 f0 (944|$#,)!
+3 f2 (944|$#,)!
+3 f0 (2|$#,)!
+3 f2 (2|$#,)!
+3 f0 ()!
+3 f1 ()!
+1 t944|944&
+3 f0 (2252|$#,2252|$#,)!
+3 f2 (2252|$#,2252|$#,)!
+3 f0 (945|$#,)!
+3 f944 (945|$#,)!
+3 f0 (2076|$#,951|0@5@7&#,2150|$#,)!
+3 f1 (2076|$#,951|0@5@7&#,2150|$#,)!
+3 e!13{TS_UNKNOWN,TS_VOID,TS_CHAR,TS_INT,TS_SIGNED,TS_UNSIGNED,TS_SHORT,TS_LONG,TS_FLOAT,TS_DOUBLE,TS_ENUM,TS_STRUCT,TS_UNION,TS_TYPEDEF}!
+0 s6584|&
+0 s104|&
+3 e!14{TYS_NONE,TYS_VOID,TYS_CHAR,TYS_SCHAR,TYS_UCHAR,TYS_SSINT,TYS_USINT,TYS_INT,TYS_SINT,TYS_UINT,TYS_SLINT,TYS_ULINT,TYS_FLOAT,TYS_DOUBLE,TYS_LDOUBLE,TYS_ENUM,TYS_STRUCT,TYS_UNION,TYS_TYPENAME}!
+0 s6585|&
+0 s105|&
+0 s86|&
+3 f0 (2261|$#,2265|$#,)!
+3 f2265 (2261|$#,2265|$#,)!
+3 f0 (2265|$#,)!
+3 f945 (2265|$#,)!
+3 f0 (2265|$#,)!
+3 f945 (2265|$#,)!
+3 e_paramtype{PNORMAL,PYIELD,PELIPSIS}!
+0 s6586|&
+0 s106|&
+3 S_paramNode{940|@1|0@5@3&#type,947|@1|0@5@3&#paramdecl,2274|@1|^#kind,}!
+0 s6476|-1 2277 -1
+1 t2276|2276&
+0 s107|-1 13836 -1
+3 f0 (2278|0@5@2&#,)!
+3 f1 (2278|0@5@2&#,)!
+3 f0 (2278|0@5@7&#,)!
+3 f2278 (2278|0@5@7&#,)!
+3 f0 (2278|$#,)!
+3 f983 (2278|$#,)!
+3 f0 (2278|$#,)!
+3 f983 (2278|$#,)!
+3 f0 (2278|$#,)!
+3 f2 (2278|$#,)!
+3 f0 (2278|$#,)!
+3 f2 (2278|$#,)!
+0 s108|-1 2292 -1
+1 t2291|2291&
+3 S_paramNodeList{5|@1|^#nelements,5|@1|^#nspace,2292|@1|11@3@3&#elements,}!
+0 s6437|-1 2295 -1
+1 t2294|2294&
+0 a109|&
+3 f1 (2296|@7|6@5@7&#,2278|@3|6@0@19@2@0#,)!
+3 f0 (2296|@7|0@5@7&#,)!
+3 f5 (2296|@7|0@5@7&#,)!
+3 f0 (2296|@7|0@5@7&#,)!
+3 f2 (2296|@7|0@5@7&#,)!
+3 f0 (2278|0@0@4&#,)!
+3 f2296 (2278|0@0@4&#,)!
+3 f0 (2296|0@5@7&#,)!
+3 f2 (2296|0@5@7&#,)!
+3 f0 ()!
+3 f2296 ()!
+3 f0 (2296|@5|0@5@7&#,2278|0@5@2&#,)!
+3 f2296 (2296|@5|0@5@7&#,2278|0@5@2&#,)!
+3 f0 (2296|0@5@7&#,)!
+3 f983 (2296|0@5@7&#,)!
+3 f0 (2296|0@5@2&#,)!
+3 f1 (2296|0@5@2&#,)!
+3 f0 (2296|0@5@7&#,)!
+3 f2296 (2296|0@5@7&#,)!
+3 f0 (2296|0@5@7&#,)!
+3 f983 (2296|0@5@7&#,)!
+3 f0 (2296|0@5@7&#,)!
+3 f2 (2296|0@5@7&#,)!
+3 f0 (945|$#,)!
+3 f2 (945|$#,)!
+3 f0 (945|$#,)!
+3 f2 (945|$#,)!
+3 f0 (23|0@0@6&#,)!
+3 f945 (23|0@0@6&#,)!
+3 f0 (983|0@5@6&#,)!
+3 f945 (983|0@5@6&#,)!
+3 f0 (945|$#,)!
+3 f19 (945|$#,)!
+3 f23 (945|$#,)!
+3 f0 (945|$#,)!
+3 f19 (945|$#,)!
+3 f23 (945|$#,)!
+3 f0 (945|$#,)!
+3 f983 (945|$#,)!
+3 f0 (945|$#,945|$#,)!
+3 f2 (945|$#,945|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 e!15{SID_VAR,SID_TYPE,SID_OP,SID_SORT}!
+0 s6587|&
+0 s110|&
+3 S_ltoken{6|@1|^#code,6|@1|^#col,6|@1|^#line,945|@1|^#text,945|@1|^#fname,945|@1|^#rawText,2|@1|^#defined,2|@1|^#hasSyn,2346|@1|11@0@0&#idtype,6|@1|11@0@0&#intfield,}!
+0 s60|-1 2427 -1
+3 f0 (951|0@5@7&#,)!
+3 f2 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f2 (951|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,)!
+3 f2 (951|@7|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,2|$#,)!
+3 f1 (951|@7|0@5@7&#,2|$#,)!
+3 f0 (6|$#,2346|$#,945|$#,)!
+3 f951 (6|$#,2346|$#,945|$#,)!
+3 f0 (6|$#,945|$#,)!
+3 f951 (6|$#,945|$#,)!
+3 f0 (951|@7|0@5@7&#,6|$#,)!
+3 f1 (951|@7|0@5@7&#,6|$#,)!
+3 f0 (951|@7|0@5@7&#,)!
+3 f6 (951|@7|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,6|$#,)!
+3 f1 (951|@7|0@5@7&#,6|$#,)!
+3 f0 (951|@7|0@5@7&#,)!
+3 f6 (951|@7|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,6|$#,)!
+3 f1 (951|@7|0@5@7&#,6|$#,)!
+3 f0 (951|@7|0@5@7&#,)!
+3 f6 (951|@7|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,)!
+3 f6 (951|@7|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,)!
+3 f945 (951|@7|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,)!
+3 f19 (951|@7|0@5@7&#,)!
+3 f23 (951|@7|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,)!
+3 f2 (951|@7|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,)!
+3 f2 (951|@7|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f983 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f983 (951|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,6|$#,)!
+3 f1 (951|@7|0@5@7&#,6|$#,)!
+3 f0 (951|@7|0@5@7&#,945|$#,)!
+3 f1 (951|@7|0@5@7&#,945|$#,)!
+3 f0 (951|@7|0@5@7&#,2346|$#,)!
+3 f1 (951|@7|0@5@7&#,2346|$#,)!
+3 f0 (951|@7|0@5@7&#,945|$#,)!
+3 f1 (951|@7|0@5@7&#,945|$#,)!
+3 f0 (951|0@5@7&#,)!
+3 f945 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,951|0@5@7&#,)!
+3 f2 (951|0@5@7&#,951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f19 (951|0@5@7&#,)!
+3 f23 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f983 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f951 (951|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,)!
+3 f983 (951|@7|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,23|$#,)!
+3 f1 (951|@7|0@5@7&#,23|$#,)!
+3 f0 (951|0@5@7&#,)!
+3 f2 (951|0@5@7&#,)!
+3 f0 (951|@7|0@5@7&#,2|$#,)!
+3 f1 (951|@7|0@5@7&#,2|$#,)!
+3 f0 (951|0@5@2&#,)!
+3 f1 (951|0@5@2&#,)!
+3 f0 (6|$#,945|$#,983|0@5@7&#,6|$#,6|$#,)!
+3 f951 (6|$#,945|$#,983|0@5@7&#,6|$#,6|$#,)!
+3 f0 (6|$#,945|$#,)!
+3 f951 (6|$#,945|$#,)!
+3 f0 (951|0@5@7&#,)!
+3 f983 (951|0@5@7&#,)!
+3 f0 (951|0@5@17&#,)!
+3 f1 (951|0@5@17&#,)!
+3 f0 (4|$#,)!
+3 f2 (4|$#,)!
+1 t2348|2348&
+3 S_ltokenList{5|@1|^#nelements,5|@1|^#nspace,5|@1|^#current,2427|@1|11@3@3&#elements,}!
+0 s6488|-1 2430 -1
+1 t2429|2429&
+0 a111|&
+3 f1 (2431|@7|6@5@7&#,951|@3|6@5@19@2@0#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f2 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f2 (2431|0@5@7&#,)!
+3 f0 (2431|@7|0@5@7&#,)!
+3 f5 (2431|@7|0@5@7&#,)!
+3 f0 (2431|@7|0@5@7&#,)!
+3 f2 (2431|@7|0@5@7&#,)!
+3 f0 (2431|@7|0@5@7&#,)!
+3 f2 (2431|@7|0@5@7&#,)!
+3 f0 ()!
+3 f2431 ()!
+3 f0 (2431|0@5@7&#,951|0@5@2&#,)!
+3 f1 (2431|0@5@7&#,951|0@5@2&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f1 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f1 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f983 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@2&#,)!
+3 f1 (2431|0@5@2&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f951 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f951 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f2431 (2431|0@5@7&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f2431 (951|0@5@2&#,)!
+3 f0 (2431|@5|0@5@7&#,951|0@5@2&#,)!
+3 f2431 (2431|@5|0@5@7&#,951|0@5@2&#,)!
+3 f0 (2431|0@5@7&#,2431|0@5@7&#,)!
+3 f2 (2431|0@5@7&#,2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f2 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f1 (2431|0@5@7&#,)!
+0 s6516|-1 3040 -1
+0 s6509|-1 3007 -1
+0 s6428|-1 2804 -1
+0 s6473|-1 2834 -1
+0 s6422|-1 2613 -1
+0 s6475|-1 2614 -1
+0 s6336|&
+0 s6494|-1 3079 -1
+0 s6498|-1 3085 -1
+0 s6359|-1 3135 -1
+0 s6363|-1 2490 -1
+0 s6391|-1 2592 -1
+3 e!16{TAG_ENUM,TAG_STRUCT,TAG_UNION,TAG_FWDSTRUCT,TAG_FWDUNION}!
+0 s6588|&
+0 s112|&
+3 e!17{IMPPLAIN,IMPBRACKET,IMPQUOTE}!
+0 s6589|&
+0 s113|&
+3 S_importNode{2488|@1|^#kind,951|@1|0@5@3&#val,}!
+1 t2481|2481&
+0 s114|-1 13912 -1
+3 f0 (2491|0@5@2&#,)!
+3 f1 (2491|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f2491 (951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f2491 (951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f2491 (951|0@5@2&#,)!
+0 s115|-1 2501 -1
+1 t2500|2500&
+3 S_importNodeList{5|@1|^#nelements,5|@1|^#nspace,2501|@1|11@3@3&#elements,}!
+0 s6438|-1 2504 -1
+1 t2503|2503&
+0 a116|&
+3 f1 (2505|@7|&#,2491|@3|6@0@19@2@0#,)!
+3 f0 ()!
+3 f2505 ()!
+3 f0 (2505|@5|$#,2491|0@0@2&#,)!
+3 f2505 (2505|@5|$#,2491|0@0@2&#,)!
+3 f0 (2505|$#,)!
+3 f983 (2505|$#,)!
+3 f0 (2505|0@0@2&#,)!
+3 f1 (2505|0@0@2&#,)!
+3 f0 (951|0@5@7&#,951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,951|0@5@7&#,)!
+3 S_sortList{5|@1|^#nelements,5|@1|^#nspace,5|@1|^#current,2252|@1|11@3@3&#elements,}!
+0 s6487|-1 2519 -1
+1 t2518|2518&
+0 a117|&
+3 f0 ()!
+3 f2520 ()!
+3 f0 (2520|$#,944|$#,)!
+3 f1 (2520|$#,944|$#,)!
+3 f0 (2520|$#,)!
+3 f1 (2520|$#,)!
+3 f0 (2520|$#,)!
+3 f1 (2520|$#,)!
+3 f0 (2520|$#,)!
+3 f983 (2520|$#,)!
+3 f0 (2520|0@0@2&#,)!
+3 f1 (2520|0@0@2&#,)!
+3 f0 (2520|$#,)!
+3 f944 (2520|$#,)!
+1 t945|945&
+3 S_lsymbolList{5|@1|^#nelements,5|@1|^#nspace,2535|@1|11@3@3&#elements,}!
+0 s6439|-1 2538 -1
+1 t2537|2537&
+0 a119|&
+3 f1 (2539|@7|&#,945|@3|&#,)!
+3 f0 ()!
+3 f2539 ()!
+3 f0 (2539|$#,945|$#,)!
+3 f1 (2539|$#,945|$#,)!
+3 f0 (2539|0@0@2&#,)!
+3 f1 (2539|0@0@2&#,)!
+3 S_lsymbolSet{5|@1|^#entries,5|@1|^#nspace,2535|@1|11@3@3&#elements,}!
+0 s6413|-1 2549 -1
+1 t2548|2548&
+0 a120|&
+3 f0 (2550|0@5@7&#,)!
+3 f2 (2550|0@5@7&#,)!
+3 f1 (2550|@7|6@5@7&#,945|@3|&#,)!
+3 f0 ()!
+3 f2550 ()!
+3 f0 (2550|0@5@7&#,945|$#,)!
+3 f2 (2550|0@5@7&#,945|$#,)!
+3 f0 (2550|0@5@7&#,945|$#,)!
+3 f2 (2550|0@5@7&#,945|$#,)!
+3 f0 (2550|0@5@7&#,)!
+3 f983 (2550|0@5@7&#,)!
+3 f0 (2550|0@5@2&#,)!
+3 f1 (2550|0@5@2&#,)!
+3 S_sortSet{5|@1|^#entries,5|@1|^#nspace,2252|@1|11@3@3&#elements,}!
+0 s6412|-1 2566 -1
+1 t2565|2565&
+0 a121|-1 13637 -1
+3 f1 (2567|@7|6@5@7&#,944|@3|&#,)!
+3 f0 (2567|0@5@7&#,)!
+3 f2 (2567|0@5@7&#,)!
+3 f0 (2567|@7|0@5@7&#,)!
+3 f5 (2567|@7|0@5@7&#,)!
+3 f0 ()!
+3 f2567 ()!
+3 f0 (2567|0@5@7&#,944|$#,)!
+3 f2 (2567|0@5@7&#,944|$#,)!
+3 f0 (2567|0@5@7&#,944|$#,)!
+3 f2 (2567|0@5@7&#,944|$#,)!
+3 f0 (2567|0@5@7&#,)!
+3 f983 (2567|0@5@7&#,)!
+3 f0 (2567|0@5@7&#,)!
+3 f983 (2567|0@5@7&#,)!
+3 f0 (2567|0@5@7&#,)!
+3 f983 (2567|0@5@7&#,)!
+3 f0 (2567|0@5@2&#,)!
+3 f1 (2567|0@5@2&#,)!
+3 f0 (2567|0@5@7&#,)!
+3 f944 (2567|0@5@7&#,)!
+3 f0 (2567|0@5@7&#,)!
+3 f2567 (2567|0@5@7&#,)!
+3 S_pairNode{944|@1|^#sort,951|@1|0@5@3&#tok,}!
+1 t2482|2482&
+0 s123|-1 13801 -1
+3 f0 (2593|0@5@2&#,)!
+3 f1 (2593|0@5@2&#,)!
+0 s124|-1 2597 -1
+1 t2596|2596&
+3 S_pairNodeList{5|@1|^#nelements,5|@1|^#nspace,2597|@1|11@3@3&#elements,}!
+0 s6440|-1 2600 -1
+1 t2599|2599&
+0 a125|&
+3 f1 (2601|@7|6@5@7&#,2593|@3|6@0@19@2@0#,)!
+3 f0 (2601|0@5@7&#,)!
+3 f2 (2601|0@5@7&#,)!
+3 f0 ()!
+3 f2601 ()!
+3 f0 (2601|0@5@7&#,2593|0@0@4&#,)!
+3 f1 (2601|0@5@7&#,2593|0@0@4&#,)!
+3 f0 (2601|0@5@7&#,)!
+3 f983 (2601|0@5@7&#,)!
+3 f0 (2601|0@5@2&#,)!
+3 f1 (2601|0@5@2&#,)!
+1 t2475|2475&
+1 t2476|2476&
+3 S_declaratorInvNode{2613|@1|0@0@3&#declarator,2614|@1|0@0@3&#body,}!
+0 s6351|-1 2617 -1
+1 t2616|2616&
+0 s128|-1 13615 -1
+3 f0 (2618|0@5@2&#,)!
+3 f1 (2618|0@5@2&#,)!
+3 f0 (2618|$#,)!
+3 f983 (2618|$#,)!
+0 s129|-1 2624 -1
+1 t2623|2623&
+3 S_declaratorInvNodeList{5|@1|^#nelements,5|@1|^#nspace,2624|@1|11@3@3&#elements,}!
+0 s6441|-1 2627 -1
+1 t2626|2626&
+0 a130|&
+3 f1 (2628|@7|&#,2618|@3|6@0@19@2@0#,)!
+3 f0 (2628|$#,)!
+3 f5 (2628|$#,)!
+3 f0 ()!
+3 f2628 ()!
+3 f0 (2628|@5|$#,2618|0@0@2&#,)!
+3 f2628 (2628|@5|$#,2618|0@0@2&#,)!
+3 f0 (2628|$#,)!
+3 f983 (2628|$#,)!
+3 f0 (2628|0@0@2&#,)!
+3 f1 (2628|0@0@2&#,)!
+3 e!18{TEXPR_BASE,TEXPR_PTR,TEXPR_ARRAY,TEXPR_FCN}!
+0 s6590|&
+0 s131|&
+3 S!19{948|@1|0@5@3&#elementtype,937|@1|0@5@3&#size,}!
+0 s6353|&
+3 S!20{948|@1|0@5@3&#returntype,2296|@1|0@5@3&#args,}!
+0 s6390|&
+3 U!21{951|@1|0@5@3&#base,948|@1|0@5@3&#pointer,2643|@1|^#array,2645|@1|^#function,}!
+0 s6562|&
+3 S_typeExpr{5|@1|^#wrapped,2642|@1|^#kind,2647|@1|^#content,944|@1|^#sort,}!
+3 f0 (948|0@5@2&#,)!
+3 f1 (948|0@5@2&#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+0 s58|&
+3 f0 (2656|0@5@2&#,)!
+3 f1 (2656|0@5@2&#,)!
+3 S_declaratorNode{951|@1|0@5@3&#id,948|@1|0@5@3&#type,2|@1|^#isRedecl,}!
+0 s126|-1 13656 -1
+3 f0 (2660|$#,)!
+3 f983 (2660|$#,)!
+3 f0 (2660|0@5@2&#,)!
+3 f1 (2660|0@5@2&#,)!
+0 s132|-1 2666 -1
+1 t2665|2665&
+3 S_declaratorNodeList{5|@1|^#nelements,5|@1|^#nspace,2666|@1|11@3@3&#elements,}!
+0 s6442|-1 2669 -1
+1 t2668|2668&
+0 a133|&
+3 f1 (2670|@7|&#,2660|@3|6@0@19@2@0#,)!
+3 f0 ()!
+3 f2670 ()!
+3 f0 (2670|@5|$#,2660|0@0@2&#,)!
+3 f2670 (2670|@5|$#,2660|0@0@2&#,)!
+3 f0 (2670|$#,)!
+3 f983 (2670|$#,)!
+3 f0 (2670|0@0@2&#,)!
+3 f1 (2670|0@0@2&#,)!
+3 f0 (2670|$#,)!
+3 f2670 (2670|$#,)!
+3 S_arrayQualNode{951|@1|0@5@3&#tok,936|@1|0@5@3&#term,}!
+0 s6396|-1 2684 -1
+1 t2683|2683&
+0 s134|&
+3 S_varNode{951|@1|0@5@3&#varid,2|@1|^#isObj,940|@1|0@5@3&#type,944|@1|^#sort,}!
+0 s6503|-1 2688 -1
+1 t2687|2687&
+0 s135|-1 13875 -1
+3 f0 (2689|$#,)!
+3 f2689 (2689|$#,)!
+3 f0 (2689|0@5@2&#,)!
+3 f1 (2689|0@5@2&#,)!
+0 s136|-1 2695 -1
+1 t2694|2694&
+3 S_varNodeList{5|@1|^#nelements,5|@1|^#nspace,2695|@1|11@3@3&#elements,}!
+0 s6443|-1 2698 -1
+1 t2697|2697&
+0 a137|&
+3 f1 (2699|@7|&#,2689|@3|6@0@19@2@0#,)!
+3 f0 ()!
+3 f2699 ()!
+3 f0 (2699|@5|$#,2689|0@0@2&#,)!
+3 f2699 (2699|@5|$#,2689|0@0@2&#,)!
+3 f0 (2699|$#,)!
+3 f2699 (2699|$#,)!
+3 f0 (2699|$#,)!
+3 f983 (2699|$#,)!
+3 f0 (2699|0@0@2&#,)!
+3 f1 (2699|0@0@2&#,)!
+3 S_quantifierNode{951|@1|0@5@3&#quant,2699|@1|0@0@3&#vars,2|@1|^#isForall,}!
+0 s6466|-1 2713 -1
+1 t2712|2712&
+0 s138|-1 13888 -1
+3 f0 (2714|$#,)!
+3 f2714 (2714|$#,)!
+3 f0 (2714|0@5@2&#,)!
+3 f1 (2714|0@5@2&#,)!
+0 s139|-1 2720 -1
+1 t2719|2719&
+3 S_quantifierNodeList{5|@1|^#nelements,5|@1|^#nspace,2720|@1|11@3@3&#elements,}!
+0 s6444|-1 2723 -1
+1 t2722|2722&
+0 a140|&
+3 f1 (2724|@7|&#,2714|@3|6@0@19@2@0#,)!
+3 f0 ()!
+3 f2724 ()!
+3 f0 (2724|@5|$#,2714|0@0@2&#,)!
+3 f2724 (2724|@5|$#,2714|0@0@2&#,)!
+3 f0 (2724|$#,)!
+3 f983 (2724|$#,)!
+3 f0 (2724|0@0@2&#,)!
+3 f1 (2724|0@0@2&#,)!
+3 f0 (2724|$#,)!
+3 f2724 (2724|$#,)!
+3 e!22{SRN_TERM,SRN_TYPE,SRN_OBJ,SRN_SPECIAL}!
+0 s6591|&
+0 s141|&
+3 U!23{936|@1|0@0@3&#term,940|@1|0@5@3&#type,955|@1|0@5@18&#ref,}!
+0 s6561|&
+3 S_storeRefNode{2738|@1|^#kind,2739|@1|^#content,}!
+0 s6364|-1 2743 -1
+1 t2742|2742&
+0 s142|-1 13703 -1
+3 f0 (2744|$#,)!
+3 f2744 (2744|$#,)!
+3 f0 (2744|$#,)!
+3 f2 (2744|$#,)!
+3 f0 (2744|$#,)!
+3 f2 (2744|$#,)!
+3 f0 (2744|$#,)!
+3 f2 (2744|$#,)!
+3 f0 (2744|$#,)!
+3 f2 (2744|$#,)!
+3 f0 (2744|0@5@2&#,)!
+3 f1 (2744|0@5@2&#,)!
+0 s143|-1 2758 -1
+1 t2757|2757&
+3 S_storeRefNodeList{5|@1|^#nelements,5|@1|^#nspace,2758|@1|11@3@3&#elements,}!
+0 s6445|-1 2761 -1
+1 t2760|2760&
+0 a144|&
+3 f1 (2762|@7|&#,2744|@3|6@0@19@2@0#,)!
+3 f0 ()!
+3 f2762 ()!
+3 f0 (2762|@5|$#,2744|0@0@2&#,)!
+3 f2762 (2762|@5|$#,2744|0@0@2&#,)!
+3 f0 (2762|$#,)!
+3 f983 (2762|$#,)!
+3 f0 (2762|0@0@2&#,)!
+3 f1 (2762|0@0@2&#,)!
+3 f0 (2762|$#,)!
+3 f2762 (2762|$#,)!
+3 S_modifyNode{951|@1|0@5@3&#tok,2|@1|^#modifiesNothing,2|@1|^#hasStoreRefList,2762|@1|11@0@3&#list,}!
+0 s6500|-1 2776 -1
+1 t2775|2775&
+0 s145|&
+3 f0 (2777|0@5@7&#,)!
+3 f983 (2777|0@5@7&#,)!
+3 S_letDeclNode{951|@1|0@5@3&#varid,940|@1|0@5@3&#sortspec,936|@1|0@0@3&#term,944|@1|^#sort,}!
+0 s6504|-1 2782 -1
+1 t2781|2781&
+0 s146|-1 13669 -1
+3 f0 (2783|0@5@2&#,)!
+3 f1 (2783|0@5@2&#,)!
+0 s147|-1 2787 -1
+1 t2786|2786&
+3 S_letDeclNodeList{5|@1|^#nelements,5|@1|^#nspace,2787|@1|11@3@3&#elements,}!
+0 s6446|-1 2790 -1
+1 t2789|2789&
+0 a148|&
+3 f1 (2791|@7|&#,2783|@3|6@0@19@2@0#,)!
+3 f0 ()!
+3 f2791 ()!
+3 f0 (2791|@5|$#,2783|0@0@2&#,)!
+3 f2791 (2791|@5|$#,2783|0@0@2&#,)!
+3 f0 (2791|$#,)!
+3 f983 (2791|$#,)!
+3 f0 (2791|0@0@2&#,)!
+3 f1 (2791|0@0@2&#,)!
+3 e!24{ACT_SELF,ACT_ITER,ACT_ALTERNATE,ACT_SEQUENCE}!
+0 s6592|&
+0 s149|&
+1 t2473|2473&
+0 s6447|-1 2806 -1
+1 t2805|2805&
+3 U!25{2804|@1|0@0@3&#self,2806|@1|0@0@3&#args,}!
+0 s6554|&
+3 S_programNode{5|@1|^#wrapped,2803|@1|^#kind,2807|@1|^#content,}!
+0 s6477|-1 2811 -1
+1 t2810|2810&
+0 s152|-1 13853 -1
+3 f0 (2812|0@5@2&#,)!
+3 f1 (2812|0@5@2&#,)!
+3 f0 (2812|$#,)!
+3 f983 (2812|$#,)!
+0 s153|-1 2818 -1
+1 t2817|2817&
+3 S_programNodeList{5|@1|^#nelements,5|@1|^#nspace,2818|@1|11@3@3&#elements,}!
+0 a151|&
+3 f1 (2820|@7|&#,2812|@3|6@0@19@2@0#,)!
+3 f0 ()!
+3 f2820 ()!
+3 f0 (2820|$#,2812|0@0@4&#,)!
+3 f1 (2820|$#,2812|0@0@4&#,)!
+3 f0 (2820|$#,)!
+3 f983 (2820|$#,)!
+3 f0 (2820|0@0@2&#,)!
+3 f1 (2820|0@0@2&#,)!
+3 e!26{LPD_PLAIN,LPD_CHECKS,LPD_REQUIRES,LPD_ENSURES,LPD_INTRACLAIM,LPD_CONSTRAINT,LPD_INITIALLY}!
+0 s6594|&
+0 s154|&
+3 S_lclPredicateNode{951|@1|0@5@3&#tok,2832|@1|^#kind,936|@1|0@0@3&#predicate,}!
+1 t2474|2474&
+0 s155|&
+3 S_exposedNode{951|@1|0@5@3&#tok,940|@1|0@5@3&#type,2628|@1|0@0@3&#decls,}!
+0 s6474|-1 2838 -1
+1 t2837|2837&
+0 s156|&
+3 f0 (2839|$#,)!
+3 f983 (2839|$#,)!
+3 e!27{TK_ABSTRACT,TK_EXPOSED,TK_UNION}!
+0 s6595|&
+0 s157|&
+3 S_CTypesNode{1003|@1|^#intfield,944|@1|^#sort,2431|@1|0@5@3&#ctypes,}!
+0 s6424|-1 2847 -1
+1 t2846|2846&
+0 s158|&
+3 S_initDeclNode{2660|@1|0@0@3&#declarator,936|@1|0@5@3&#value,}!
+0 s6352|-1 2851 -1
+1 t2850|2850&
+0 s159|-1 13588 -1
+3 f0 (2852|$#,)!
+3 f2 (2852|$#,)!
+3 f0 (2852|0@5@2&#,)!
+3 f1 (2852|0@5@2&#,)!
+0 s160|-1 2858 -1
+1 t2857|2857&
+3 S_initDeclNodeList{5|@1|^#nelements,5|@1|^#nspace,2858|@1|11@3@3&#elements,}!
+0 s6448|-1 2861 -1
+1 t2860|2860&
+0 a161|&
+3 f1 (2862|@7|&#,2852|@3|6@0@19@2@0#,)!
+3 f0 ()!
+3 f2862 ()!
+3 f0 (2862|@5|$#,2852|0@0@2&#,)!
+3 f2862 (2862|@5|$#,2852|0@0@2&#,)!
+3 f0 (2862|$#,)!
+3 f983 (2862|$#,)!
+3 f0 (2862|0@0@2&#,)!
+3 f1 (2862|0@0@2&#,)!
+3 S_constDeclarationNode{940|@1|0@5@3&#type,2862|@1|0@0@3&#decls,}!
+0 s6398|-1 2874 -1
+1 t2873|2873&
+0 s162|&
+3 f0 (2875|0@5@7&#,)!
+3 f983 (2875|0@5@7&#,)!
+3 e!28{QLF_NONE,QLF_CONST,QLF_VOLATILE}!
+0 s6596|&
+0 s163|&
+3 S_varDeclarationNode{2|@1|^#isSpecial,955|@1|11@5@18&#sref,2|@1|^#isGlobal,2|@1|^#isPrivate,2880|@1|^#qualifier,940|@1|0@5@3&#type,2862|@1|0@0@3&#decls,}!
+0 s6523|-1 2883 -1
+1 t2882|2882&
+0 s164|-1 13864 -1
+3 f0 (2884|0@5@2&#,)!
+3 f1 (2884|0@5@2&#,)!
+3 f0 (2884|0@5@7&#,)!
+3 f983 (2884|0@5@7&#,)!
+0 s165|-1 2890 -1
+1 t2889|2889&
+3 S_varDeclarationNodeList{5|@1|^#nelements,5|@1|^#nspace,2890|@1|11@3@3&#elements,}!
+0 s6449|-1 2893 -1
+1 t2892|2892&
+0 a166|&
+3 f1 (2894|@7|&#,2884|@3|6@0@19@2@0#,)!
+3 f0 ()!
+3 f2894 ()!
+3 f0 (2894|$#,2884|0@0@4&#,)!
+3 f1 (2894|$#,2884|0@0@4&#,)!
+3 f0 (2894|$#,)!
+3 f983 (2894|$#,)!
+3 f0 (2894|0@0@2&#,)!
+3 f1 (2894|0@0@2&#,)!
+0 s167|&
+3 f0 (2904|$#,)!
+3 f983 (2904|$#,)!
+3 f0 (2904|0@0@2&#,)!
+3 f1 (2904|0@0@2&#,)!
+3 S_claimNode{951|@1|0@5@3&#name,2296|@1|0@5@3&#params,2904|@1|0@5@3&#globals,2791|@1|0@5@3&#lets,2835|@1|0@5@3&#require,2812|@1|0@5@3&#body,2835|@1|0@5@3&#ensures,}!
+0 s6525|-1 2911 -1
+1 t2910|2910&
+0 s168|&
+3 f0 (2912|$#,)!
+3 f983 (2912|$#,)!
+3 S_fcnNode{951|@1|0@5@3&#name,940|@1|0@5@3&#typespec,2660|@1|0@0@3&#declarator,2904|@1|0@0@3&#globals,2894|@1|0@0@3&#inits,2791|@1|0@0@3&#lets,2835|@1|0@5@3&#checks,2835|@1|0@5@3&#require,2777|@1|0@5@3&#modify,2835|@1|0@5@3&#ensures,2835|@1|0@5@3&#claim,1490|@1|^#special,}!
+0 s6538|-1 2917 -1
+1 t2916|2916&
+0 s169|-1 13825 -1
+3 f0 (2918|0@5@2&#,)!
+3 f1 (2918|0@5@2&#,)!
+3 f0 (2918|0@5@7&#,)!
+3 f983 (2918|0@5@7&#,)!
+0 s170|-1 2924 -1
+1 t2923|2923&
+3 S_fcnNodeList{5|@1|^#nelements,5|@1|^#nspace,2924|@1|11@3@3&#elements,}!
+0 s6450|-1 2927 -1
+1 t2926|2926&
+0 a171|&
+3 f1 (2928|@7|6@5@7&#,2918|@3|6@0@19@2@0#,)!
+3 f0 (2928|0@5@7&#,)!
+3 f2 (2928|0@5@7&#,)!
+3 f0 (2928|0@5@7&#,)!
+3 f2 (2928|0@5@7&#,)!
+3 f0 (2928|@7|0@5@7&#,)!
+3 f5 (2928|@7|0@5@7&#,)!
+3 f0 (2928|@7|0@5@7&#,)!
+3 f2 (2928|@7|0@5@7&#,)!
+3 f0 ()!
+3 f2928 ()!
+3 f0 (2928|@5|0@5@7&#,2918|0@0@4&#,)!
+3 f2928 (2928|@5|0@5@7&#,2918|0@0@4&#,)!
+3 f0 (2928|0@5@7&#,)!
+3 f983 (2928|0@5@7&#,)!
+3 f0 (2928|0@5@2&#,)!
+3 f1 (2928|0@5@2&#,)!
+3 S_iterNode{951|@1|0@5@3&#name,2296|@1|0@5@3&#params,}!
+0 s6377|-1 2948 -1
+1 t2947|2947&
+0 s172|&
+3 f0 (2949|0@5@7&#,)!
+3 f983 (2949|0@5@7&#,)!
+3 S_abstBodyNode{951|@1|0@5@3&#tok,2834|@1|0@5@3&#typeinv,2928|@1|0@5@3&#fcns,}!
+0 s127|&
+3 f0 (2953|$#,)!
+3 f983 (2953|$#,)!
+3 S_abstractNode{951|@1|0@5@3&#tok,2|@1|^#isMutable,2|@1|^#isRefCounted,951|@1|0@5@3&#name,944|@1|^#sort,2953|@1|0@0@3&#body,}!
+0 s6521|-1 2958 -1
+1 t2957|2957&
+0 s173|&
+3 f0 (2959|$#,)!
+3 f983 (2959|$#,)!
+3 S_stDeclNode{940|@1|0@5@3&#lcltypespec,2670|@1|0@0@3&#declarators,}!
+0 s6372|-1 2964 -1
+1 t2963|2963&
+0 s174|-1 13680 -1
+3 f0 (2965|0@5@2&#,)!
+3 f1 (2965|0@5@2&#,)!
+3 f0 (2965|$#,)!
+3 f2965 (2965|$#,)!
+0 s175|-1 2971 -1
+1 t2970|2970&
+3 S_stDeclNodeList{5|@1|^#nelements,5|@1|^#nspace,2971|@1|11@3@3&#elements,}!
+0 s6451|-1 2974 -1
+1 t2973|2973&
+0 a176|&
+3 f1 (2975|@7|&#,2965|@3|6@0@19@2@0#,)!
+3 f0 (2975|$#,)!
+3 f5 (2975|$#,)!
+3 f0 ()!
+3 f2975 ()!
+3 f0 (2975|@5|$#,2965|0@0@2&#,)!
+3 f2975 (2975|@5|$#,2965|0@0@2&#,)!
+3 f0 (2975|$#,)!
+3 f983 (2975|$#,)!
+3 f0 (2975|0@0@2&#,)!
+3 f1 (2975|0@0@2&#,)!
+3 f0 (2975|$#,)!
+3 f2975 (2975|$#,)!
+3 S_taggedUnionNode{2975|@1|0@0@3&#structdecls,2660|@1|0@0@3&#declarator,}!
+0 s6392|-1 2991 -1
+1 t2990|2990&
+0 s177|&
+3 f0 (2992|$#,)!
+3 f983 (2992|$#,)!
+3 U!29{2959|@1|0@0@3&#abstract,2839|@1|0@0@3&#exposed,2992|@1|0@0@3&#taggedunion,}!
+0 s6556|&
+3 S_typeNode{2844|@1|^#kind,2995|@1|^#content,}!
+0 s6365|-1 2999 -1
+1 t2998|2998&
+0 s178|&
+3 f0 (3000|0@5@7&#,)!
+3 f983 (3000|0@5@7&#,)!
+3 e!30{SU_STRUCT,SU_UNION}!
+0 s6597|&
+0 s179|&
+3 S_strOrUnionNode{3005|@1|^#kind,951|@1|0@5@3&#tok,951|@1|0@5@3&#opttagid,944|@1|^#sort,2975|@1|0@0@17&#structdecls,}!
+1 t2472|2472&
+0 s180|&
+3 f0 (3008|0@5@7&#,)!
+3 f983 (3008|0@5@7&#,)!
+3 S_enumSpecNode{951|@1|0@5@3&#tok,951|@1|0@5@3&#opttagid,2431|@1|0@5@17&#enums,944|@1|^#sort,}!
+0 s6501|-1 3013 -1
+1 t3012|3012&
+0 s181|&
+3 f0 (3014|0@5@7&#,)!
+3 f983 (3014|0@5@7&#,)!
+3 e!31{LTS_TYPE,LTS_STRUCTUNION,LTS_ENUM,LTS_CONJ}!
+0 s6598|&
+0 s182|&
+0 s55|&
+3 S_lclconj{3020|@1|0@5@3&#a,3020|@1|0@5@3&#b,}!
+0 s6345|-1 3023 -1
+1 t3022|3022&
+0 s183|&
+3 U!32{2848|@1|0@5@3&#type,3008|@1|0@5@3&#structorunion,3014|@1|0@5@3&#enumspec,3024|@1|0@0@3&#conj,}!
+0 s6567|&
+3 S_lclTypeSpecNode{3019|@1|^#kind,2108|@1|0@5@3&#quals,3025|@1|^#content,5|@1|^#pointers,}!
+3 f0 (940|0@5@7&#,)!
+3 f2 (940|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f940 (940|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f983 (940|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f983 (940|0@5@7&#,)!
+3 S_typeNamePack{2|@1|^#isObj,940|@1|0@5@3&#type,2656|@1|0@0@3&#abst,}!
+0 s6425|-1 3038 -1
+1 t3037|3037&
+0 s184|&
+1 t2471|2471&
+3 S_typeNameNode{2|@1|^#isTypeName,3039|@1|0@5@3&#typename,3040|@1|0@5@3&#opform,}!
+0 s6426|-1 3043 -1
+1 t3042|3042&
+0 s186|-1 13812 -1
+3 f0 (3044|0@5@2&#,)!
+3 f1 (3044|0@5@2&#,)!
+3 f0 (3044|0@5@7&#,)!
+3 f983 (3044|0@5@7&#,)!
+0 s187|-1 3050 -1
+1 t3049|3049&
+3 S_typeNameNodeList{5|@1|^#nelements,5|@1|^#nspace,3050|@1|11@3@3&#elements,}!
+0 s6452|-1 3053 -1
+1 t3052|3052&
+0 a188|&
+3 f1 (3054|@7|&#,3044|@3|6@0@19@2@0#,)!
+3 f0 (3054|$#,)!
+3 f5 (3054|$#,)!
+3 f0 (3054|$#,)!
+3 f2 (3054|$#,)!
+3 f0 ()!
+3 f3054 ()!
+3 f0 (3054|@5|$#,3044|0@0@2&#,)!
+3 f3054 (3054|@5|$#,3044|0@0@2&#,)!
+3 f0 (3054|$#,)!
+3 f983 (3054|$#,)!
+3 f0 (3054|0@0@2&#,)!
+3 f1 (3054|0@0@2&#,)!
+3 e!33{OPF_IF,OPF_ANYOP,OPF_MANYOP,OPF_ANYOPM,OPF_MANYOPM,OPF_MIDDLE,OPF_MMIDDLE,OPF_MIDDLEM,OPF_MMIDDLEM,OPF_BMIDDLE,OPF_BMMIDDLE,OPF_BMIDDLEM,OPF_BMMIDDLEM,OPF_SELECT,OPF_MAP,OPF_MSELECT,OPF_MMAP}!
+0 s6599|&
+0 s189|&
+3 U!34{5|@1|^#middle,951|@1|0@5@3&#anyop,951|@1|0@5@3&#id,}!
+0 s6559|&
+0 s371|&
+3 S_opFormNode{951|@1|0@5@3&#tok,3070|@1|^#kind,3073|@1|^#content,6|@1|^#key,951|@1|0@5@3&#close,}!
+0 s185|&
+3 f0 (3075|0@5@7&#,)!
+3 f983 (3075|0@5@7&#,)!
+3 S_quantifiedTermNode{2724|@1|0@0@3&#quantifiers,951|@1|0@5@3&#open,936|@1|0@0@3&#body,951|@1|0@5@3&#close,}!
+1 t2478|2478&
+0 s190|&
+3 e!35{TRM_LITERAL,TRM_CONST,TRM_VAR,TRM_ZEROARY,TRM_APPLICATION,TRM_QUANTIFIER,TRM_UNCHANGEDALL,TRM_UNCHANGEDOTHERS,TRM_SIZEOF}!
+0 s6593|&
+0 s191|&
+3 S_sigNode{951|@1|0@5@3&#tok,2431|@1|0@5@3&#domain,951|@1|0@5@3&#range,6|@1|^#key,}!
+1 t2479|2479&
+0 s192|-1 13522 -1
+3 f0 (3086|0@5@7&#,)!
+3 f983 (3086|0@5@7&#,)!
+3 f0 (3086|0@5@2&#,)!
+3 f1 (3086|0@5@2&#,)!
+3 f0 (3086|$#,)!
+3 f3086 (3086|$#,)!
+3 f0 (3086|0@0@17&#,)!
+3 f1 (3086|0@0@17&#,)!
+0 s193|-1 3096 -1
+1 t3095|3095&
+3 S_sigNodeSet{5|@1|^#entries,5|@1|^#nspace,3096|@1|11@3@3&#elements,}!
+0 s6414|-1 3099 -1
+1 t3098|3098&
+0 a194|&
+3 f1 (3100|@7|6@5@7&#,3086|@3|6@0@19@2@0#,)!
+3 f0 (3100|0@5@7&#,)!
+3 f2 (3100|0@5@7&#,)!
+3 f0 (3100|0@5@7&#,)!
+3 f2 (3100|0@5@7&#,)!
+3 f0 (3100|@7|0@5@7&#,)!
+3 f2 (3100|@7|0@5@7&#,)!
+3 f0 (3100|@7|0@5@7&#,)!
+3 f5 (3100|@7|0@5@7&#,)!
+3 f0 ()!
+3 f3100 ()!
+3 f0 (3086|0@0@17&#,)!
+3 f3100 (3086|0@0@17&#,)!
+3 f0 (3100|0@5@7&#,3086|0@0@17&#,)!
+3 f2 (3100|0@5@7&#,3086|0@0@17&#,)!
+3 f0 (3100|0@5@7&#,)!
+3 f983 (3100|0@5@7&#,)!
+3 f0 (3100|0@5@7&#,)!
+3 f983 (3100|0@5@7&#,)!
+3 f0 (3100|0@5@2&#,)!
+3 f1 (3100|0@5@2&#,)!
+3 f0 (3100|0@5@7&#,)!
+3 f983 (3100|0@5@7&#,)!
+3 S_signNode{951|@1|0@5@3&#tok,2520|@1|0@0@3&#domain,944|@1|^#range,6|@1|^#key,}!
+0 s6499|-1 3126 -1
+1 t3125|3125&
+0 s195|&
+3 f0 (3127|$#,)!
+3 f983 (3127|$#,)!
+3 f0 (3127|0@0@2&#,)!
+3 f1 (3127|0@0@2&#,)!
+3 U!36{951|@1|0@5@3&#opid,3075|@1|0@5@3&#opform,}!
+0 s6551|&
+3 S_nameNode{2|@1|^#isOpId,3132|@1|^#content,}!
+1 t2480|2480&
+0 s196|&
+3 f0 (3136|0@5@2&#,)!
+3 f1 (3136|0@5@2&#,)!
+3 f0 (3136|0@5@7&#,)!
+3 f3136 (3136|0@5@7&#,)!
+3 f0 (3136|0@5@7&#,)!
+3 f983 (3136|0@5@7&#,)!
+3 f0 (3136|$#,)!
+3 f3136 (3136|$#,)!
+3 S_lslOp{3136|@1|0@5@2&#name,3086|@1|0@0@18&#signature,}!
+0 s6380|-1 3147 -1
+1 t3146|3146&
+0 s197|-1 13549 -1
+0 s198|-1 3154 -1
+3 f0 (3148|0@0@2&#,)!
+3 f1 (3148|0@0@2&#,)!
+3 f0 (3148|$#,)!
+3 f3148 (3148|$#,)!
+1 t3149|3149&
+3 S_lslOpSet{5|@1|^#entries,5|@1|^#nspace,3154|@1|11@3@3&#elements,}!
+0 s6415|-1 3157 -1
+1 t3156|3156&
+0 a200|&
+3 f1 (3158|@7|6@5@7&#,3148|@3|6@0@19@2@0#,)!
+3 f0 (3158|0@5@7&#,)!
+3 f2 (3158|0@5@7&#,)!
+3 f0 (3158|@7|0@5@7&#,)!
+3 f5 (3158|@7|0@5@7&#,)!
+3 f0 ()!
+3 f3158 ()!
+3 f0 (3158|0@5@7&#,3148|0@0@2&#,)!
+3 f2 (3158|0@5@7&#,3148|0@0@2&#,)!
+3 f0 (3158|0@5@7&#,)!
+3 f983 (3158|0@5@7&#,)!
+3 f0 (3158|0@5@2&#,)!
+3 f1 (3158|0@5@2&#,)!
+3 f0 (3158|0@5@7&#,)!
+3 f3158 (3158|0@5@7&#,)!
+3 S!37{3136|@1|0@5@3&#name,3086|@1|0@5@3&#signature,}!
+0 s6381|&
+3 U!38{3174|@1|^#renamesortname,951|@1|0@5@3&#ctype,}!
+0 s6552|&
+3 S_replaceNode{951|@1|0@5@3&#tok,3044|@1|0@0@3&#typename,2|@1|^#isCType,3176|@1|^#content,}!
+0 s6502|-1 3180 -1
+1 t3179|3179&
+0 s201|-1 13901 -1
+3 f0 (3181|0@5@2&#,)!
+3 f1 (3181|0@5@2&#,)!
+3 f0 (3181|0@5@7&#,)!
+3 f983 (3181|0@5@7&#,)!
+0 s202|-1 3187 -1
+1 t3186|3186&
+3 S_replaceNodeList{5|@1|^#nelements,5|@1|^#nspace,3187|@1|11@3@3&#elements,}!
+0 s6453|-1 3190 -1
+1 t3189|3189&
+0 a203|&
+3 f1 (3191|@7|&#,3181|@3|6@0@19@2@0#,)!
+3 f0 (3191|$#,)!
+3 f5 (3191|$#,)!
+3 f0 (3191|$#,)!
+3 f2 (3191|$#,)!
+3 f0 ()!
+3 f3191 ()!
+3 f0 (3191|@5|$#,3181|0@0@2&#,)!
+3 f3191 (3191|@5|$#,3181|0@0@2&#,)!
+3 f0 (3191|$#,)!
+3 f983 (3191|$#,)!
+3 f0 (3191|0@0@2&#,)!
+3 f1 (3191|0@0@2&#,)!
+3 S_nameAndReplaceNode{3054|@1|0@0@3&#namelist,3191|@1|0@0@3&#replacelist,}!
+0 s6382|-1 3207 -1
+1 t3206|3206&
+0 s204|&
+3 U!39{3191|@1|0@0@3&#replace,3208|@1|0@0@3&#name,}!
+0 s6553|&
+3 S_renamingNode{2|@1|^#is_replace,3209|@1|^#content,}!
+0 s6360|-1 3213 -1
+1 t3212|3212&
+0 s205|&
+3 f0 (3214|0@5@7&#,)!
+3 f983 (3214|0@5@7&#,)!
+3 S_traitRefNode{2431|@1|0@5@3&#traitid,3214|@1|0@5@3&#rename,}!
+0 s6397|-1 3219 -1
+1 t3218|3218&
+0 s206|-1 13790 -1
+3 f0 (3220|0@5@2&#,)!
+3 f1 (3220|0@5@2&#,)!
+0 s207|-1 3224 -1
+1 t3223|3223&
+3 S_traitRefNodeList{5|@1|^#nelements,5|@1|^#nspace,3224|@1|11@3@3&#elements,}!
+0 s6454|-1 3227 -1
+1 t3226|3226&
+0 a208|&
+3 f1 (3228|@7|&#,3220|@3|6@0@19@2@0#,)!
+3 f0 ()!
+3 f3228 ()!
+3 f0 (3228|@5|$#,3220|0@0@2&#,)!
+3 f3228 (3228|@5|$#,3220|0@0@2&#,)!
+3 f0 (3228|$#,)!
+3 f983 (3228|$#,)!
+3 f0 (3228|0@0@2&#,)!
+3 f1 (3228|0@0@2&#,)!
+3 e!40{XPK_CONST,XPK_VAR,XPK_TYPE,XPK_FCN,XPK_CLAIM,XPK_ITER}!
+0 s6602|&
+0 s209|&
+3 U!41{2875|@1|0@0@3&#constdeclaration,2884|@1|0@0@3&#vardeclaration,3000|@1|0@0@3&#type,2918|@1|0@0@3&#fcn,2912|@1|0@0@3&#claim,2949|@1|0@0@3&#iter,}!
+0 s6568|&
+3 S_exportNode{3240|@1|^#kind,3241|@1|^#content,}!
+0 s6366|-1 3245 -1
+1 t3244|3244&
+0 s210|&
+3 f0 (3246|$#,)!
+3 f983 (3246|$#,)!
+3 e!42{PRIV_CONST,PRIV_VAR,PRIV_TYPE,PRIV_FUNCTION}!
+0 s6600|&
+0 s211|&
+3 U!43{2875|@1|0@0@3&#constdeclaration,2884|@1|0@0@3&#vardeclaration,3000|@1|0@0@3&#type,2918|@1|0@0@3&#fcn,}!
+0 s6563|&
+3 S_privateNode{3251|@1|^#kind,3252|@1|^#content,}!
+0 s6367|-1 3256 -1
+1 t3255|3255&
+0 s212|&
+3 f0 (3257|$#,)!
+3 f983 (3257|$#,)!
+3 e!44{INF_IMPORTS,INF_USES,INF_EXPORT,INF_PRIVATE}!
+0 s6601|&
+0 s213|&
+3 U!45{2505|@1|0@0@3&#imports,3228|@1|0@0@3&#uses,3246|@1|0@0@3&#export,3257|@1|0@0@3&#private,}!
+0 s6565|&
+3 S_interfaceNode{3262|@1|^#kind,3263|@1|^#content,}!
+0 s6368|-1 3267 -1
+1 t3266|3266&
+0 s214|-1 13626 -1
+3 f0 (3268|$#,)!
+3 f983 (3268|$#,)!
+3 f0 (3268|0@5@2&#,)!
+3 f1 (3268|0@5@2&#,)!
+0 s215|-1 3274 -1
+1 t3273|3273&
+3 S_interfaceNodeList{5|@1|^#nelements,5|@1|^#nspacehigh,5|@1|^#nspacelow,3274|@1|11@3@18&#elements,3274|@1|11@3@2&#elementsroot,}!
+0 s6511|-1 3277 -1
+1 t3276|3276&
+0 a216|&
+3 f1 (3278|@7|&#,3268|@3|6@0@19@2@0#,)!
+3 f0 ()!
+3 f3278 ()!
+3 f0 (3278|@5|$#,3268|0@0@2&#,)!
+3 f3278 (3278|@5|$#,3268|0@0@2&#,)!
+3 f0 (3278|$#,3268|0@0@4&#,)!
+3 f1 (3278|$#,3268|0@0@4&#,)!
+3 f0 (3278|0@0@2&#,)!
+3 f1 (3278|0@0@2&#,)!
+3 S_termNode{5|@1|^#wrapped,3083|@1|^#kind,944|@1|^#sort,944|@1|11@0@0&#given,2567|@1|0@5@3&#possibleSorts,2|@1|^#error_reported,3158|@1|0@5@3&#possibleOps,3135|@1|0@5@3&#name,943|@1|0@0@3&#args,951|@1|11@5@3&#literal,2762|@1|11@0@3&#unchanged,3080|@1|11@0@3&#quantified,940|@1|11@5@3&#sizeofField,}!
+3 f0 (937|0@5@7&#,)!
+3 f2 (937|0@5@7&#,)!
+3 f0 (937|$#,)!
+3 f937 (937|$#,)!
+3 f0 (937|0@5@7&#,)!
+3 f983 (937|0@5@7&#,)!
+3 f0 (937|0@5@2&#,)!
+3 f1 (937|0@5@2&#,)!
+0 s53|-1 3298 -1
+1 t3297|3297&
+3 S_termNodeList{5|@1|^#nelements,5|@1|^#nspacehigh,5|@1|^#nspacelow,5|@1|^#current,3298|@1|11@3@18&#elements,3298|@1|11@3@2&#elementsroot,}!
+3 f1 (943|@7|&#,937|@3|6@0@19@2@0#,)!
+3 f0 (943|@7|$#,)!
+3 f5 (943|@7|$#,)!
+3 f0 (943|@7|$#,)!
+3 f2 (943|@7|$#,)!
+3 f0 (943|$#,)!
+3 f2 (943|$#,)!
+3 f0 ()!
+3 f943 ()!
+3 f0 (943|@5|$#,937|0@0@4&#,)!
+3 f943 (943|@5|$#,937|0@0@4&#,)!
+3 f0 (943|$#,937|0@0@4&#,)!
+3 f1 (943|$#,937|0@0@4&#,)!
+3 f0 (943|$#,937|0@0@4&#,)!
+3 f1 (943|$#,937|0@0@4&#,)!
+3 f0 (943|$#,)!
+3 f1 (943|$#,)!
+3 f0 (943|$#,)!
+3 f1 (943|$#,)!
+3 f0 (943|$#,)!
+3 f1 (943|$#,)!
+3 f0 (943|$#,5|$#,)!
+3 f937 (943|$#,5|$#,)!
+3 f0 (943|$#,)!
+3 f983 (943|$#,)!
+3 f0 (943|$#,)!
+3 f983 (943|$#,)!
+3 f0 (943|$#,)!
+3 f983 (943|$#,)!
+3 f0 (943|$#,)!
+3 f983 (943|$#,)!
+3 f0 (943|0@0@2&#,)!
+3 f1 (943|0@0@2&#,)!
+3 f0 (943|$#,)!
+3 f937 (943|$#,)!
+3 f0 (943|$#,)!
+3 f937 (943|$#,)!
+3 f0 (943|$#,)!
+3 f943 (943|$#,)!
+3 S_stmtNode{951|@1|0@5@3&#lhs,951|@1|0@5@3&#operator,943|@1|0@0@3&#args,}!
+0 s150|&
+3 f0 (3340|$#,)!
+3 f983 (3340|$#,)!
+0 s122|-1 3344 -1
+1 t3343|3343&
+3 S_sortSetList{5|@1|^#nelements,5|@1|^#free,5|@1|^#current,3344|@1|11@3@2&#elements,}!
+0 s6486|-1 3347 -1
+1 t3346|3346&
+0 a217|&
+3 f1 (3348|@7|&#,2567|@3|6@5@19@2@0#,)!
+3 f0 (3348|$#,)!
+3 f5 (3348|$#,)!
+3 f0 ()!
+3 f3348 ()!
+3 f0 (3348|$#,2567|0@5@18@2@0#,)!
+3 f1 (3348|$#,2567|0@5@18@2@0#,)!
+3 f0 (3348|$#,)!
+3 f1 (3348|$#,)!
+3 f0 (3348|$#,)!
+3 f1 (3348|$#,)!
+3 f0 (3348|$#,)!
+3 f983 (3348|$#,)!
+3 f0 (3348|0@0@2&#,)!
+3 f1 (3348|0@0@2&#,)!
+3 f0 (3348|$#,)!
+3 f2567 (3348|$#,)!
+3 f0 (3348|$#,)!
+3 f2567 (3348|$#,)!
+0 s199|-1 3369 -1
+1 t3368|3368&
+3 S_lslOpList{5|@1|^#nelements,5|@1|^#nspace,3369|@1|11@3@2&#elements,}!
+0 s6455|-1 3372 -1
+1 t3371|3371&
+0 a218|&
+3 f0 ()!
+3 f3373 ()!
+3 f0 (3373|$#,3148|0@0@19@2@0#,)!
+3 f1 (3373|$#,3148|0@0@19@2@0#,)!
+3 f0 (3373|$#,)!
+3 f983 (3373|$#,)!
+3 f0 (3373|0@0@2&#,)!
+3 f1 (3373|0@0@2&#,)!
+3 f0 (3136|0@5@2&#,3086|0@0@18&#,)!
+3 f3148 (3136|0@5@2&#,3086|0@0@18&#,)!
+3 f0 (3148|$#,)!
+3 f983 (3148|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 (3268|0@0@2&#,3278|@5|$#,)!
+3 f3278 (3268|0@0@2&#,3278|@5|$#,)!
+3 f0 (2505|0@0@2&#,)!
+3 f3268 (2505|0@0@2&#,)!
+3 f0 (3075|0@5@2&#,)!
+3 f3136 (3075|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f3136 (951|0@5@2&#,)!
+3 f0 (3228|0@0@2&#,)!
+3 f3268 (3228|0@0@2&#,)!
+3 f0 (2875|0@0@2&#,)!
+3 f3268 (2875|0@0@2&#,)!
+3 f0 (2884|0@0@2&#,)!
+3 f3268 (2884|0@0@2&#,)!
+3 f0 (3000|0@0@2&#,)!
+3 f3268 (3000|0@0@2&#,)!
+3 f0 (2918|0@0@2&#,)!
+3 f3268 (2918|0@0@2&#,)!
+3 f0 (2912|0@0@2&#,)!
+3 f3268 (2912|0@0@2&#,)!
+3 f0 (2949|0@0@2&#,)!
+3 f3268 (2949|0@0@2&#,)!
+3 f0 (2875|0@0@2&#,)!
+3 f3268 (2875|0@0@2&#,)!
+3 f0 (2884|0@0@2&#,)!
+3 f3268 (2884|0@0@2&#,)!
+3 f0 (3000|0@0@2&#,)!
+3 f3268 (3000|0@0@2&#,)!
+3 f0 (2918|0@0@2&#,)!
+3 f3268 (2918|0@0@2&#,)!
+3 f0 (2959|0@0@2&#,)!
+3 f3000 (2959|0@0@2&#,)!
+3 f0 (2839|0@0@2&#,)!
+3 f3000 (2839|0@0@2&#,)!
+3 f0 (2431|0@5@2&#,3214|0@5@2&#,)!
+3 f3220 (2431|0@5@2&#,3214|0@5@2&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f983 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f983 (2431|0@5@7&#,)!
+3 f0 (3086|0@5@7&#,)!
+3 f983 (3086|0@5@7&#,)!
+3 f0 (3054|0@0@2&#,3191|0@0@2&#,)!
+3 f3214 (3054|0@0@2&#,3191|0@0@2&#,)!
+3 f0 (951|0@5@2&#,3044|0@0@2&#,2|$#,951|0@5@2&#,3136|0@5@2&#,3086|0@5@2&#,)!
+3 f3181 (951|0@5@2&#,3044|0@0@2&#,2|$#,951|0@5@2&#,3136|0@5@2&#,3086|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2431|0@5@2&#,951|0@5@2&#,)!
+3 f3086 (951|0@5@2&#,2431|0@5@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,3044|0@0@2&#,3136|0@0@2&#,)!
+3 f3181 (951|0@5@2&#,3044|0@0@2&#,3136|0@0@2&#,)!
+3 f0 (951|0@5@2&#,3070|$#,3073|$#,951|0@5@2&#,)!
+3 f3075 (951|0@5@2&#,3070|$#,3073|$#,951|0@5@2&#,)!
+3 f0 (2|$#,940|0@5@2&#,2656|0@0@2&#,)!
+3 f3044 (2|$#,940|0@5@2&#,2656|0@0@2&#,)!
+3 f0 (3075|0@0@2&#,)!
+3 f3044 (3075|0@0@2&#,)!
+3 f0 (940|0@5@2&#,940|0@5@2&#,)!
+3 f940 (940|0@5@2&#,940|0@5@2&#,)!
+3 f0 (2848|0@5@2&#,)!
+3 f940 (2848|0@5@2&#,)!
+3 f0 (3008|0@5@2&#,)!
+3 f940 (3008|0@5@2&#,)!
+3 f0 (3014|0@5@2&#,)!
+3 f940 (3014|0@5@2&#,)!
+3 f0 (940|0@5@2&#,1490|$#,)!
+3 f940 (940|0@5@2&#,1490|$#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,2431|0@5@17&#,)!
+3 f3014 (951|0@5@2&#,951|0@5@2&#,2431|0@5@17&#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,)!
+3 f3014 (951|0@5@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,3005|$#,951|0@5@2&#,2975|0@0@2&#,)!
+3 f3008 (951|0@5@2&#,3005|$#,951|0@5@2&#,2975|0@0@2&#,)!
+3 f0 (951|0@5@2&#,3005|$#,951|0@5@2&#,)!
+3 f3008 (951|0@5@2&#,3005|$#,951|0@5@2&#,)!
+3 f0 (940|0@5@2&#,2670|0@0@2&#,)!
+3 f2965 (940|0@5@2&#,2670|0@0@2&#,)!
+3 f0 (940|0@5@2&#,2862|0@0@2&#,)!
+3 f2875 (940|0@5@2&#,2862|0@0@2&#,)!
+3 f0 (940|0@5@2&#,2862|0@0@2&#,2|$#,2|$#,)!
+3 f2884 (940|0@5@2&#,2862|0@0@2&#,2|$#,2|$#,)!
+3 f0 ()!
+3 f2884 ()!
+3 f0 ()!
+3 f2884 ()!
+3 f0 (2660|0@0@2&#,937|0@5@2&#,)!
+3 f2852 (2660|0@0@2&#,937|0@5@2&#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,2|$#,2|$#,2953|0@0@2&#,)!
+3 f2959 (951|0@5@2&#,951|0@5@2&#,2|$#,2|$#,2953|0@0@2&#,)!
+3 f0 (2953|$#,)!
+3 f983 (2953|$#,)!
+3 f0 (951|0@5@2&#,940|0@5@2&#,2628|0@0@2&#,)!
+3 f2839 (951|0@5@2&#,940|0@5@2&#,2628|0@0@2&#,)!
+3 f0 (2660|0@0@2&#,2953|0@0@2&#,)!
+3 f2618 (2660|0@0@2&#,2953|0@0@2&#,)!
+3 f0 (940|0@5@2&#,2660|0@0@2&#,)!
+3 f2918 (940|0@5@2&#,2660|0@0@2&#,)!
+3 f0 (1490|$#,940|0@5@2&#,2660|0@0@2&#,2904|0@5@2&#,2894|0@5@2&#,2791|0@5@2&#,2835|0@5@2&#,2835|0@5@2&#,2777|0@5@2&#,2835|0@5@2&#,2835|0@5@2&#,)!
+3 f2918 (1490|$#,940|0@5@2&#,2660|0@0@2&#,2904|0@5@2&#,2894|0@5@2&#,2791|0@5@2&#,2835|0@5@2&#,2835|0@5@2&#,2777|0@5@2&#,2835|0@5@2&#,2835|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2296|0@5@2&#,)!
+3 f2949 (951|0@5@2&#,2296|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2296|0@5@2&#,2904|0@5@2&#,2791|0@5@2&#,2835|0@5@2&#,2812|0@5@2&#,2835|0@5@2&#,)!
+3 f2912 (951|0@5@2&#,2296|0@5@2&#,2904|0@5@2&#,2791|0@5@2&#,2835|0@5@2&#,2812|0@5@2&#,2835|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f2835 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f0 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f2835 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f0 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f2835 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f0 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f2835 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f0 (951|0@5@2&#,937|0@0@2&#,2832|$#,)!
+3 f2835 (951|0@5@2&#,937|0@0@2&#,2832|$#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,943|0@0@2&#,)!
+3 f3340 (951|0@5@2&#,951|0@5@2&#,943|0@0@2&#,)!
+3 f0 (2820|0@0@2&#,2803|$#,)!
+3 f2812 (2820|0@0@2&#,2803|$#,)!
+3 f0 (3340|0@0@2&#,)!
+3 f2812 (3340|0@0@2&#,)!
+3 f0 (937|0@0@2&#,)!
+3 f2744 (937|0@0@2&#,)!
+3 f0 (940|0@5@2&#,2|$#,)!
+3 f2744 (940|0@5@2&#,2|$#,)!
+3 f0 (951|0@5@2&#,2|$#,)!
+3 f2777 (951|0@5@2&#,2|$#,)!
+3 f0 ()!
+3 f2744 ()!
+3 f0 ()!
+3 f2744 ()!
+3 f0 (951|0@5@2&#,2762|0@0@2&#,)!
+3 f2777 (951|0@5@2&#,2762|0@0@2&#,)!
+3 f0 (951|0@5@2&#,940|0@5@2&#,937|0@0@2&#,)!
+3 f2783 (951|0@5@2&#,940|0@5@2&#,937|0@0@2&#,)!
+3 f0 (951|0@5@2&#,2928|0@5@2&#,)!
+3 f2953 (951|0@5@2&#,2928|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f2953 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f0 (951|0@5@2&#,2431|0@5@2&#,)!
+3 f2953 (951|0@5@2&#,2431|0@5@2&#,)!
+3 f0 (2278|@5|$#,)!
+3 f2278 (2278|@5|$#,)!
+3 f0 (951|0@5@2&#,937|0@5@2&#,)!
+3 f2685 (951|0@5@2&#,937|0@5@2&#,)!
+3 f0 (2699|0@0@2&#,951|0@5@2&#,)!
+3 f2714 (2699|0@0@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2|$#,940|0@5@2&#,)!
+3 f2689 (951|0@5@2&#,2|$#,940|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f948 (951|0@5@2&#,)!
+3 f0 (948|0@0@2&#,)!
+3 f2660 (948|0@0@2&#,)!
+3 f0 (948|0@5@2&#,2296|0@5@2&#,)!
+3 f948 (948|0@5@2&#,2296|0@5@2&#,)!
+3 f0 (951|0@5@2&#,948|@5|0@5@2&#,)!
+3 f948 (951|0@5@2&#,948|@5|0@5@2&#,)!
+3 f0 (948|@5|0@5@2&#,2685|0@0@2&#,)!
+3 f948 (948|@5|0@5@2&#,2685|0@0@2&#,)!
+3 f0 (940|0@5@2&#,948|0@0@2&#,)!
+3 f2278 (940|0@5@2&#,948|0@0@2&#,)!
+3 f0 (951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,)!
+3 f937 (951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,)!
+3 f0 (2724|0@0@2&#,951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,)!
+3 f937 (2724|0@0@2&#,951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,)!
+3 f0 (937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,)!
+3 f937 (937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,)!
+3 f0 (937|@5|0@0@2&#,2431|0@5@2&#,)!
+3 f937 (937|@5|0@0@2&#,2431|0@5@2&#,)!
+3 f0 (937|@5|0@0@2&#,951|0@5@2&#,)!
+3 f937 (937|@5|0@0@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,937|0@0@2&#,)!
+3 f937 (951|0@5@2&#,937|0@0@2&#,)!
+3 f0 (937|@5|$#,943|$#,)!
+3 f937 (937|@5|$#,943|$#,)!
+3 f0 (951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f937 (951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f937 (951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f0 (937|0@5@2&#,937|@5|0@0@2&#,937|0@5@2&#,)!
+3 f937 (937|0@5@2&#,937|@5|0@0@2&#,937|0@5@2&#,)!
+3 f0 (937|0@5@2&#,937|@5|$#,937|0@5@2&#,)!
+3 f937 (937|0@5@2&#,937|@5|$#,937|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f937 (951|0@5@2&#,)!
+3 f0 (937|0@0@2&#,951|0@5@2&#,951|0@5@18&#,)!
+3 f937 (937|0@0@2&#,951|0@5@2&#,951|0@5@18&#,)!
+3 f0 (937|0@0@2&#,951|0@5@2&#,951|0@5@18&#,)!
+3 f937 (937|0@0@2&#,951|0@5@2&#,951|0@5@18&#,)!
+3 f0 (951|0@5@2&#,944|$#,)!
+3 f937 (951|0@5@2&#,944|$#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,)!
+3 f937 (951|0@5@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2762|0@0@2&#,)!
+3 f937 (951|0@5@2&#,2762|0@0@2&#,)!
+3 f0 (951|0@5@2&#,940|0@5@2&#,)!
+3 f937 (951|0@5@2&#,940|0@5@2&#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f937 (951|0@5@2&#,951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f0 (3086|$#,)!
+3 f944 (3086|$#,)!
+3 f0 (3086|$#,)!
+3 f2520 (3086|$#,)!
+3 f0 (3136|0@5@7&#,3136|0@5@7&#,)!
+3 f2 (3136|0@5@7&#,3136|0@5@7&#,)!
+3 f0 (2848|0@5@2&#,951|0@5@2&#,)!
+3 f2848 (2848|0@5@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f2848 (951|0@5@2&#,)!
+3 f0 (3086|$#,3086|$#,)!
+3 f2 (3086|$#,3086|$#,)!
+3 f0 (940|0@5@7&#,)!
+3 f944 (940|0@5@7&#,)!
+3 f0 (944|$#,948|0@5@7&#,)!
+3 f944 (944|$#,948|0@5@7&#,)!
+3 f0 (2485|$#,951|0@5@2&#,)!
+3 f945 (2485|$#,951|0@5@2&#,)!
+3 f0 (940|0@5@7&#,2660|$#,2904|$#,)!
+3 f1 (940|0@5@7&#,2660|$#,2904|$#,)!
+3 f0 (2296|0@5@7&#,2904|$#,)!
+3 f1 (2296|0@5@7&#,2904|$#,)!
+3 f0 (3136|0@5@7&#,)!
+3 f951 (3136|0@5@7&#,)!
+3 f0 (937|0@5@7&#,)!
+3 f951 (937|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f951 (940|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f3073 (951|0@5@7&#,)!
+3 f0 (5|$#,)!
+3 f3073 (5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2278 ()!
+3 f0 (943|@5|$#,951|0@5@2&#,937|0@0@2&#,)!
+3 f943 (943|@5|$#,951|0@5@2&#,937|0@0@2&#,)!
+3 f0 (2660|$#,)!
+3 f983 (2660|$#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f1 (940|0@5@7&#,)!
+3 f0 (2660|$#,)!
+3 f1 (2660|$#,)!
+3 f0 (2660|$#,)!
+3 f2660 (2660|$#,)!
+3 f0 (3148|$#,3148|$#,)!
+3 f2 (3148|$#,3148|$#,)!
+3 f0 (945|$#,)!
+3 f1 (945|$#,)!
+3 f0 ()!
+3 f945 ()!
+3 f0 ()!
+3 f945 ()!
+3 f0 ()!
+3 f945 ()!
+3 f0 ()!
+3 f945 ()!
+0 s17|&
+3 S_fctInfo{951|@1|0@5@3&#id,2|@1|^#export,3127|@1|0@0@2&#signature,2601|@1|0@5@2&#globals,}!
+0 s6479|-1 3649 -1
+1 t3648|3648&
+0 s219|-1 15695 -1
+3 S_typeInfo{951|@1|0@5@3&#id,944|@1|^#basedOn,2|@1|^#abstract,2|@1|^#modifiable,2|@1|^#export,}!
+0 s6507|-1 3653 -1
+1 t3652|3652&
+0 s221|&
+3 e!46{VRK_CONST,VRK_ENUM,VRK_VAR,VRK_PRIVATE,VRK_GLOBAL,VRK_LET,VRK_PARAM,VRK_QUANT}!
+0 s6603|&
+0 s222|&
+3 S_varInfo{951|@1|0@5@3&#id,944|@1|^#sort,3657|@1|^#kind,2|@1|^#export,}!
+0 s6480|-1 3660 -1
+1 t3659|3659&
+0 s223|&
+3 S_opInfo{3136|@1|0@0@2&#name,3100|@1|0@5@2&#signatures,}!
+0 s6379|-1 3664 -1
+1 t3663|3663&
+0 s224|&
+3 U!47{2431|@1|0@5@18&#enums,2975|@1|0@5@3&#decls,}!
+0 s6550|&
+3 S_tagInfo{951|@1|0@5@3&#id,2485|@1|^#kind,2|@1|^#imported,944|@1|^#sort,3666|@1|11@0@0&#content,}!
+0 s6508|-1 3670 -1
+1 t3669|3669&
+0 s225|&
+3 e!48{IK_SORT,IK_OP,IK_TAG}!
+0 s6605|&
+0 s226|&
+3 U!49{3671|@1|0@0@3&#tag,944|@1|^#sort,3665|@1|0@0@3&#op,}!
+0 s6560|&
+3 S!50{3674|@1|^#kind,3675|@1|^#content,}!
+0 s6369|&
+0 s362|-1 3687 -1
+3 e!51{SPE_GLOBAL,SPE_FCN,SPE_QUANT,SPE_CLAIM,SPE_ABSTRACT,SPE_INVALID}!
+0 s6604|&
+0 s227|&
+3 S_scopeInfo{3682|@1|^#kind,}!
+0 s6340|-1 3685 -1
+1 t3684|3684&
+0 s228|&
+1 t3679|3679&
+0 s6350|-1 3689 -1
+1 t3688|3688&
+3 S_htEntry{3687|@1|0@0@2&#data,3689|@1|0@0@2&#next,}!
+0 s229|-1 15668 -1
+0 s230|-1 3693 -1
+1 t3692|3692 15720 -1
+0 s231|-1 3695 -1
+1 t3694|3694&
+3 S!52{6|@1|^#count,6|@1|^#size,3695|@1|0@3@2&#buckets,}!
+0 s6408|&
+0 s367|-1 15547 -1
+0 s6423|-1 3700 -1
+1 t3699|3699&
+0 s232|&
+3 f0 (3654|0@5@7&#,)!
+3 f2 (3654|0@5@7&#,)!
+3 f0 (3661|0@5@7&#,)!
+3 f2 (3661|0@5@7&#,)!
+3 f0 (3671|0@5@7&#,)!
+3 f2 (3671|0@5@7&#,)!
+3 f0 (3665|0@5@7&#,)!
+3 f2 (3665|0@5@7&#,)!
+3 f0 ()!
+3 f3701 ()!
+3 f0 (3701|$#,3686|0@0@4&#,)!
+3 f1 (3701|$#,3686|0@0@4&#,)!
+3 f0 (3701|$#,)!
+3 f1 (3701|$#,)!
+3 f0 (3701|$#,3650|0@0@2&#,)!
+3 f2 (3701|$#,3650|0@0@2&#,)!
+3 f0 (3701|$#,3654|0@0@2&#,)!
+3 f1 (3701|$#,3654|0@0@2&#,)!
+3 f0 (3701|$#,3661|0@0@6&#,)!
+3 f2 (3701|$#,3661|0@0@6&#,)!
+3 f0 (3701|$#,3136|0@2@2&#,3086|0@0@17&#,)!
+3 f1 (3701|$#,3136|0@2@2&#,3086|0@0@17&#,)!
+3 f0 (3701|$#,3671|0@0@2&#,)!
+3 f2 (3701|$#,3671|0@0@2&#,)!
+3 f0 (3701|$#,3671|0@0@2&#,)!
+3 f2 (3701|$#,3671|0@0@2&#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f2 (3701|$#,945|$#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f3654 (3701|$#,945|$#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f3661 (3701|$#,945|$#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f3661 (3701|$#,945|$#,)!
+3 f0 (3701|$#,3136|0@2@7&#,)!
+3 f3665 (3701|$#,3136|0@2@7&#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f3671 (3701|$#,945|$#,)!
+3 f0 (3701|$#,2|$#,)!
+3 f1 (3701|$#,2|$#,)!
+3 f0 (3701|$#,213|$#,2|$#,)!
+3 f1 (3701|$#,213|$#,2|$#,)!
+3 f0 (2076|$#,951|0@5@7&#,2150|$#,)!
+3 f1 (2076|$#,951|0@5@7&#,2150|$#,)!
+3 f0 (3701|$#,)!
+3 f1 (3701|$#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f945 (3701|$#,945|$#,)!
+3 f0 (2485|$#,)!
+3 f983 (2485|$#,)!
+3 f0 (2150|$#,945|$#,)!
+3 f945 (2150|$#,945|$#,)!
+3 f0 (3661|0@0@2&#,)!
+3 f1 (3661|0@0@2&#,)!
+3 f0 (3701|$#,3136|0@5@6&#,3348|$#,944|$#,)!
+3 f3158 (3701|$#,3136|0@5@6&#,3348|$#,944|$#,)!
+3 f0 (3701|$#,3136|$#,)!
+3 f3100 (3701|$#,3136|$#,)!
+3 f0 (3701|$#,3136|$#,5|$#,)!
+3 f2 (3701|$#,3136|$#,5|$#,)!
+3 f0 (3701|0@0@2&#,)!
+3 f1 (3701|0@0@2&#,)!
+0 s70|-1 3765 -1
+1 t3764|3764&
+3 S_exprNodeList{5|@1|^#nelements,5|@1|^#nspace,5|@1|^#current,3765|@1|11@3@3&#elements,}!
+0 s6489|-1 3768 -1
+1 t3767|3767&
+0 a233|&
+3 f1 (3769|@7|&#,969|@3|6@5@19@2@0#,)!
+3 f0 (3769|$#,)!
+3 f5 (3769|$#,)!
+3 f0 (3769|$#,)!
+3 f2 (3769|$#,)!
+3 f0 ()!
+3 f3769 ()!
+3 f0 (3769|$#,5|$#,)!
+3 f969 (3769|$#,5|$#,)!
+3 f0 (3769|@5|$#,969|0@5@2&#,)!
+3 f3769 (3769|@5|$#,969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f3769 (969|0@5@2&#,)!
+3 f0 (3769|$#,969|0@5@2&#,)!
+3 f1 (3769|$#,969|0@5@2&#,)!
+3 f0 (3769|$#,)!
+3 f1 (3769|$#,)!
+3 f0 (3769|$#,)!
+3 f1 (3769|$#,)!
+3 f0 (3769|$#,)!
+3 f983 (3769|$#,)!
+3 f0 (3769|0@0@2&#,)!
+3 f1 (3769|0@0@2&#,)!
+3 f0 (3769|0@0@2&#,)!
+3 f1 (3769|0@0@2&#,)!
+3 f0 (3769|$#,)!
+3 f969 (3769|$#,)!
+3 f0 (3769|$#,)!
+3 f969 (3769|$#,)!
+3 f0 (3769|$#,5|$#,)!
+3 f969 (3769|$#,5|$#,)!
+0 a8|&
+3 f0 (3801|@7|$#,)!
+3 f2 (3801|@7|$#,)!
+3 f0 (3801|@7|$#,)!
+3 f2 (3801|@7|$#,)!
+3 f0 (3801|@7|$#,)!
+3 f2 (3801|@7|$#,)!
+3 f0 (3801|@7|$#,)!
+3 f2 (3801|@7|$#,)!
+3 f0 (3801|@7|$#,)!
+3 f2 (3801|@7|$#,)!
+3 f0 (3801|$#,3801|$#,)!
+3 f2 (3801|$#,3801|$#,)!
+3 f0 (3801|$#,3801|$#,)!
+3 f2 (3801|$#,3801|$#,)!
+3 f0 (3801|$#,)!
+3 f983 (3801|$#,)!
+3 f0 (5|$#,)!
+3 f3801 (5|$#,)!
+3 f0 (3801|$#,)!
+3 f2 (3801|$#,)!
+0 s6469|-1 3823 -1
+1 t3822|3822&
+0 s234|&
+3 S_hentry{983|@1|0@5@18&#key,5|@1|^#val,}!
+0 s6362|&
+0 s235|-1 3828 -1
+1 t3827|3827&
+3 S_hbucket{5|@1|^#size,5|@1|^#nspace,3828|@1|0@0@2&#entries,}!
+0 s6470|-1 3831 -1
+1 t3830|3830&
+0 s236|-1 10435 -1
+0 s237|-1 3834 -1
+1 t3833|3833&
+3 S_hashTable{5|@1|^#size,5|@1|^#nentries,3834|@1|0@0@2&#buckets,}!
+3 f0 (5|$#,)!
+3 f3824 (5|$#,)!
+3 f0 (3824|$#,983|0@5@7&#,5|$#,)!
+3 f1 (3824|$#,983|0@5@7&#,5|$#,)!
+3 f0 (3824|$#,983|0@5@7&#,)!
+3 f5 (3824|$#,983|0@5@7&#,)!
+3 f0 (3824|$#,)!
+3 f983 (3824|$#,)!
+3 f0 (3824|0@0@2&#,)!
+3 f1 (3824|0@0@2&#,)!
+3 f0 (3824|$#,983|0@5@7&#,)!
+3 f1 (3824|$#,983|0@5@7&#,)!
+3 f0 (3824|$#,983|0@5@7&#,983|0@5@18&#,)!
+3 f1 (3824|$#,983|0@5@7&#,983|0@5@18&#,)!
+1 t1325|1325&
+3 S_filelocList{5|@1|^#nelements,5|@1|^#free,3850|@1|11@3@3&#elements,}!
+0 s6433|-1 3853 -1
+1 t3852|3852&
+0 a238|&
+3 f0 (3854|0@5@7&#,)!
+3 f2 (3854|0@5@7&#,)!
+3 f0 (3854|0@5@7&#,)!
+3 f2 (3854|0@5@7&#,)!
+3 f1 (3854|@7|6@5@7&#,981|@3|6@5@19@2@0#,)!
+3 f0 (3854|0@5@7&#,)!
+3 f5 (3854|0@5@7&#,)!
+3 f0 (3854|@7|0@5@7&#,)!
+3 f5 (3854|@7|0@5@7&#,)!
+3 f0 (3854|@7|0@5@7&#,)!
+3 f2 (3854|@7|0@5@7&#,)!
+3 f0 (3854|@5|0@5@7&#,3854|0@5@2&#,)!
+3 f3854 (3854|@5|0@5@7&#,3854|0@5@2&#,)!
+3 f0 ()!
+3 f3854 ()!
+3 f0 (3854|@5|0@5@7&#,981|0@5@2&#,)!
+3 f3854 (3854|@5|0@5@7&#,981|0@5@2&#,)!
+3 f0 (3854|@5|0@5@7&#,981|0@5@7&#,981|0@5@7&#,)!
+3 f3854 (3854|@5|0@5@7&#,981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (3854|@5|0@5@7&#,)!
+3 f3854 (3854|@5|0@5@7&#,)!
+3 f0 (3854|0@5@7&#,)!
+3 f983 (3854|0@5@7&#,)!
+3 f0 (3854|0@5@7&#,)!
+3 f983 (3854|0@5@7&#,)!
+3 f0 (3854|0@5@2&#,)!
+3 f1 (3854|0@5@2&#,)!
+0 s80|-1 12996 -1
+3 f0 (983|0@5@2&#,)!
+3 f3882 (983|0@5@2&#,)!
+0 s239|-1 3886 -1
+1 t3885|3885&
+3 S_enumNameList{5|@1|^#nelements,5|@1|^#nspace,3886|@1|11@3@3&#elements,}!
+0 s6456|-1 3889 -1
+1 t3888|3888&
+0 a240|&
+3 f1 (3890|@7|&#,3882|@3|6@5@19@2@0#,)!
+3 f0 (3890|$#,)!
+3 f5 (3890|$#,)!
+3 f0 ()!
+3 f3890 ()!
+3 f0 (3890|$#,983|0@5@7&#,)!
+3 f2 (3890|$#,983|0@5@7&#,)!
+3 f0 (3890|@5|$#,3882|0@5@2&#,)!
+3 f3890 (3890|@5|$#,3882|0@5@2&#,)!
+3 f0 (3890|$#,3882|0@5@4&#,)!
+3 f1 (3890|$#,3882|0@5@4&#,)!
+3 f0 (3890|$#,)!
+3 f983 (3890|$#,)!
+3 f0 (3890|0@0@2&#,)!
+3 f1 (3890|0@0@2&#,)!
+3 f0 (3890|$#,3890|$#,)!
+3 f2 (3890|$#,3890|$#,)!
+3 f0 (3882|0@5@4&#,)!
+3 f3890 (3882|0@5@4&#,)!
+3 f0 (3890|$#,3890|$#,)!
+3 f3890 (3890|$#,3890|$#,)!
+3 f0 (3890|$#,)!
+3 f3890 (3890|$#,)!
+3 f0 (315|$#,)!
+3 f3890 (315|$#,)!
+3 f0 (3890|$#,)!
+3 f983 (3890|$#,)!
+3 f0 (3890|$#,)!
+3 f983 (3890|$#,)!
+0 a241|&
+3 f0 (3920|$#,)!
+3 f5 (3920|$#,)!
+3 f0 (3890|$#,3920|$#,)!
+3 f3920 (3890|$#,3920|$#,)!
+3 f0 ()!
+3 f3920 ()!
+3 f0 (3920|$#,983|0@5@7&#,)!
+3 f2 (3920|$#,983|0@5@7&#,)!
+3 f0 (3920|$#,3882|0@5@18&#,)!
+3 f1 (3920|$#,3882|0@5@18&#,)!
+3 f0 (3920|0@0@2&#,)!
+3 f1 (3920|0@0@2&#,)!
+3 f0 (3920|$#,)!
+3 f983 (3920|$#,)!
+3 e!53{SS_UNKNOWN,SS_UNUSEABLE,SS_UNDEFINED,SS_MUNDEFINED,SS_ALLOCATED,SS_PDEFINED,SS_DEFINED,SS_PARTIAL,SS_DEAD,SS_HOFFA,SS_FIXED,SS_RELDEF,SS_UNDEFGLOB,SS_KILLED,SS_UNDEFKILLED,SS_SPECIAL,SS_LAST}!
+0 s6606|&
+0 s242|&
+3 e!54{SCNONE,SCEXTERN,SCSTATIC}!
+0 s6607|&
+0 s243|&
+3 e_nstate{NS_ERROR,NS_UNKNOWN,NS_NOTNULL,NS_MNOTNULL,NS_RELNULL,NS_CONSTNULL,NS_POSNULL,NS_DEFNULL,NS_ABSNULL}!
+0 s6608|&
+0 s244|&
+3 f0 (3943|$#,)!
+3 f2 (3943|$#,)!
+3 e!55{AK_UNKNOWN,AK_ERROR,AK_ONLY,AK_IMPONLY,AK_KEEP,AK_KEPT,AK_TEMP,AK_IMPTEMP,AK_SHARED,AK_UNIQUE,AK_RETURNED,AK_FRESH,AK_STACK,AK_REFCOUNTED,AK_REFS,AK_KILLREF,AK_NEWREF,AK_OWNED,AK_DEPENDENT,AK_IMPDEPENDENT,AK_STATIC,AK_LOCAL}!
+0 s6609|&
+0 s245|&
+3 e!56{XO_UNKNOWN,XO_NORMAL,XO_EXPOSED,XO_OBSERVER}!
+0 s6610|&
+0 s246|&
+3 f0 (3937|$#,)!
+3 f2 (3937|$#,)!
+3 f0 (3937|$#,)!
+3 f2 (3937|$#,)!
+3 f0 (3951|$#,)!
+3 f2 (3951|$#,)!
+3 f0 (3951|@7|$#,)!
+3 f2 (3951|@7|$#,)!
+3 f0 (3948|@7|$#,)!
+3 f2 (3948|@7|$#,)!
+3 f0 (3948|@7|$#,)!
+3 f2 (3948|@7|$#,)!
+3 f0 (3948|@7|$#,)!
+3 f2 (3948|@7|$#,)!
+3 f0 (3948|@7|$#,)!
+3 f2 (3948|@7|$#,)!
+3 f0 (3948|$#,3948|$#,)!
+3 f2 (3948|$#,3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3937|$#,)!
+3 f983 (3937|$#,)!
+3 f0 (1490|$#,)!
+3 f3948 (1490|$#,)!
+3 f0 (3948|$#,3948|$#,)!
+3 f3948 (3948|$#,3948|$#,)!
+3 f0 (3948|$#,)!
+3 f983 (3948|$#,)!
+3 f0 (3948|$#,)!
+3 f983 (3948|$#,)!
+3 f0 (5|$#,)!
+3 f3948 (5|$#,)!
+3 f0 (5|$#,)!
+3 f3943 (5|$#,)!
+3 f0 (3943|$#,)!
+3 f983 (3943|$#,)!
+3 f0 (3943|$#,3943|$#,)!
+3 f5 (3943|$#,3943|$#,)!
+3 f0 (3943|$#,)!
+3 f2 (3943|$#,)!
+3 f0 (3943|$#,)!
+3 f2 (3943|$#,)!
+3 f0 (5|$#,)!
+3 f3937 (5|$#,)!
+3 f0 (5|$#,)!
+3 f3951 (5|$#,)!
+3 f0 (1490|$#,)!
+3 f3951 (1490|$#,)!
+3 f0 (3951|$#,)!
+3 f983 (3951|$#,)!
+3 f0 (3951|$#,)!
+3 f983 (3951|$#,)!
+3 f0 (3951|$#,)!
+3 f983 (3951|$#,)!
+3 f0 (1490|$#,)!
+3 f3937 (1490|$#,)!
+3 f0 (3948|$#,3948|$#,)!
+3 f2 (3948|$#,3948|$#,)!
+3 f0 (3948|$#,)!
+3 f3948 (3948|$#,)!
+3 e_exitkind{XK_ERROR,XK_UNKNOWN,XK_NEVERESCAPE,XK_GOTO,XK_MAYGOTO,XK_MAYEXIT,XK_MUSTEXIT,XK_TRUEEXIT,XK_FALSEEXIT,XK_MUSTRETURN,XK_MAYRETURN,XK_MAYRETURNEXIT,XK_MUSTRETURNEXIT}!
+0 s6611|&
+0 s247|&
+3 f0 (1490|$#,)!
+3 f4044 (1490|$#,)!
+3 f0 (4044|$#,)!
+3 f2 (4044|$#,)!
+3 f0 (4044|$#,4044|$#,)!
+3 f2 (4044|$#,4044|$#,)!
+3 f0 (4044|$#,)!
+3 f2 (4044|$#,)!
+3 f0 (4044|$#,)!
+3 f2 (4044|$#,)!
+3 f0 (5|$#,)!
+3 f4044 (5|$#,)!
+3 f0 (4044|$#,)!
+3 f983 (4044|$#,)!
+3 f0 (4044|$#,)!
+3 f2 (4044|$#,)!
+3 f0 (4044|$#,)!
+3 f2 (4044|$#,)!
+3 f0 (4044|@7|$#,)!
+3 f2 (4044|@7|$#,)!
+3 f0 (4044|@7|$#,)!
+3 f2 (4044|@7|$#,)!
+3 f0 (4044|@7|$#,)!
+3 f2 (4044|@7|$#,)!
+3 f0 (4044|@7|$#,)!
+3 f2 (4044|@7|$#,)!
+3 f0 (4044|$#,)!
+3 f4044 (4044|$#,)!
+3 f0 (4044|$#,4044|$#,)!
+3 f4044 (4044|$#,4044|$#,)!
+1 t955|955&
+3 S_sRefSet{5|@1|^#entries,5|@1|^#nspace,4075|@1|11@3@3&#elements,}!
+3 f1 (975|@7|6@5@7&#,955|@3|6@5@18@2@0#,)!
+3 f1 (975|@7|6@5@7&#,955|@3|6@5@18@2@0#,)!
+3 f1 (975|@7|6@5@7&#,955|@3|6@5@18@2@0#,)!
+3 f0 (975|0@5@7&#,)!
+3 f2 (975|0@5@7&#,)!
+3 f0 (975|@7|0@5@7&#,)!
+3 f2 (975|@7|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f2 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,975|0@5@7&#,)!
+3 f2 (975|0@5@7&#,975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f2 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f2 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f1 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f955 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@6@2@0#,)!
+3 f975 (975|0@5@6@2@0#,)!
+3 f0 (975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f5 (975|0@5@7&#,)!
+3 f0 (975|@5|0@5@7&#,975|0@5@19@2@0#,)!
+3 f975 (975|@5|0@5@7&#,975|0@5@19@2@0#,)!
+3 f0 (975|@5|0@5@7&#,975|0@5@2&#,)!
+3 f975 (975|@5|0@5@7&#,975|0@5@2&#,)!
+3 f0 ()!
+3 f975 ()!
+3 f0 (955|0@5@18@2@0#,)!
+3 f975 (955|0@5@18@2@0#,)!
+3 f0 (975|@5|0@5@7&#,955|0@5@18@2@0#,)!
+3 f975 (975|@5|0@5@7&#,955|0@5@18@2@0#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f1 (975|0@5@2&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f1 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,)!
+3 f0 (975|@5|0@5@7&#,975|0@5@19@2@0#,)!
+3 f975 (975|@5|0@5@7&#,975|0@5@19@2@0#,)!
+3 f0 (975|0@5@7&#,5|$#,)!
+3 f1 (975|0@5@7&#,5|$#,)!
+3 f0 (975|0@5@7&#,)!
+3 f1 (975|0@5@7&#,)!
+3 f0 (975|@5|0@5@7&#,975|0@5@7&#,5|$#,)!
+3 f975 (975|@5|0@5@7&#,975|0@5@7&#,5|$#,)!
+3 f0 (975|0@5@7&#,975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,5|$#,)!
+3 f975 (975|0@5@7&#,5|$#,)!
+3 f0 (975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,983|0@5@19@3@0#,)!
+3 f975 (975|0@5@7&#,983|0@5@19@3@0#,)!
+3 f0 (975|0@5@7&#,975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,975|0@5@7&#,)!
+3 f5 (975|0@5@7&#,975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (315|$#,)!
+3 f975 (315|$#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f955 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f955 (975|0@5@7&#,)!
+3 f0 (975|0@5@19@2@0#,5|$#,)!
+3 f975 (975|0@5@19@2@0#,5|$#,)!
+3 f0 (975|@5|0@5@7&#,975|0@5@7&#,955|0@5@18&#,)!
+3 f975 (975|@5|0@5@7&#,975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f2 (975|0@5@7&#,)!
+3 e!57{KINVALID,KDATATYPE,KCONST,KENUMCONST,KVAR,KFCN,KITER,KENDITER,KSTRUCTTAG,KUNIONTAG,KENUMTAG,KELIPSMARKER}!
+0 s6612|&
+0 a248|&
+3 f0 (4180|$#,4180|$#,)!
+3 f2 (4180|$#,4180|$#,)!
+3 f0 (5|$#,)!
+3 f4180 (5|$#,)!
+3 f0 (4180|$#,)!
+3 f5 (4180|$#,)!
+3 f0 (4180|$#,)!
+3 f2 (4180|$#,)!
+3 f0 (4180|$#,)!
+3 f2 (4180|$#,)!
+3 f0 (4180|$#,)!
+3 f2 (4180|$#,)!
+3 f0 (4180|$#,)!
+3 f2 (4180|$#,)!
+3 f0 (4180|$#,)!
+3 f2 (4180|$#,)!
+3 f0 (4180|$#,)!
+3 f983 (4180|$#,)!
+3 f0 (4180|$#,)!
+3 f983 (4180|$#,)!
+3 f0 (4180|$#,)!
+3 f983 (4180|$#,)!
+0 s9|-1 4207 -1
+0 s249|&
+3 f0 (4203|$#,4203|$#,)!
+3 f2 (4203|$#,4203|$#,)!
+1 t4203|4203&
+3 S_usymIdSet{5|@1|^#entries,5|@1|^#nspace,4207|@1|11@3@3&#elements,}!
+0 s6417|-1 4210 -1
+1 t4209|4209&
+0 a250|-1 13285 -1
+3 f0 ()!
+3 f4211 ()!
+3 f0 (4211|0@5@7&#,4203|$#,)!
+3 f2 (4211|0@5@7&#,4203|$#,)!
+3 f0 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f4211 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f0 (4211|0@5@2&#,)!
+3 f1 (4211|0@5@2&#,)!
+3 f0 (4211|0@5@7&#,)!
+3 f983 (4211|0@5@7&#,)!
+3 f0 (4211|0@5@7&#,)!
+3 f983 (4211|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f4211 (315|$#,)!
+3 f0 (4203|$#,)!
+3 f4211 (4203|$#,)!
+3 f0 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f5 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f0 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f4211 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f0 (4211|0@5@7&#,4203|$#,)!
+3 f4211 (4211|0@5@7&#,4203|$#,)!
+3 f0 (4211|0@5@6&#,4203|$#,)!
+3 f4211 (4211|0@5@6&#,4203|$#,)!
+3 f0 (4211|0@5@7&#,)!
+3 f2 (4211|0@5@7&#,)!
+3 f0 (4211|0@5@7&#,)!
+3 f2 (4211|0@5@7&#,)!
+3 f1 (4211|@7|6@5@7&#,4203|@3|&#,)!
+3 f0 (4211|@7|0@5@7&#,)!
+3 f5 (4211|@7|0@5@7&#,)!
+0 s6490|-1 4244 -1
+1 t4243|4243&
+0 a252|&
+1 t960|960&
+3 S_uentryList{5|@1|^#nelements,5|@1|^#nspace,5|@1|^#current,4246|@1|11@3@3&#elements,}!
+3 f1 (4245|@7|6@5@7&#,958|@3|6@5@19@2@0#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f5 (4245|0@5@7&#,)!
+3 f0 ()!
+3 f4245 ()!
+3 f0 (4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,)!
+3 f0 ()!
+3 f4245 ()!
+3 f0 (4245|@5|0@5@7&#,958|0@5@4&#,)!
+3 f4245 (4245|@5|0@5@7&#,958|0@5@4&#,)!
+3 f0 (958|0@5@4&#,)!
+3 f4245 (958|0@5@4&#,)!
+3 f0 (4245|0@5@7&#,5|$#,)!
+3 f958 (4245|0@5@7&#,5|$#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@2&#,)!
+3 f1 (4245|0@5@2&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f4245 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f5 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f5 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f5 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f4245 (315|$#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f958 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,983|0@5@7&#,)!
+3 f5 (4245|0@5@7&#,983|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,983|0@5@7&#,)!
+3 f958 (4245|0@5@7&#,983|0@5@7&#,)!
+3 f0 (4245|0@5@2&#,4245|0@5@2&#,)!
+3 f4245 (4245|0@5@2&#,4245|0@5@2&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f0 (315|$#,981|0@5@7&#,)!
+3 f4245 (315|$#,981|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,2|$#,2|$#,)!
+3 f2 (4245|0@5@7&#,4245|0@5@7&#,2|$#,2|$#,)!
+0 a74|&
+3 f1 (4327|@7|6@5@7&#,955|@3|6@5@18@2@0#,)!
+3 f0 (4327|@7|0@5@7&#,)!
+3 f5 (4327|@7|0@5@7&#,)!
+3 f0 (4327|@7|0@5@7&#,)!
+3 f2 (4327|@7|0@5@7&#,)!
+3 f0 ()!
+3 f4327 ()!
+3 f0 (4327|@5|0@5@7&#,955|0@5@18&#,)!
+3 f4327 (4327|@5|0@5@7&#,955|0@5@18&#,)!
+3 f0 (4327|0@5@7&#,955|0@5@18&#,)!
+3 f2 (4327|0@5@7&#,955|0@5@18&#,)!
+3 f0 (4327|0@5@7&#,955|0@5@18&#,)!
+3 f955 (4327|0@5@7&#,955|0@5@18&#,)!
+3 f0 (4327|0@5@2&#,)!
+3 f1 (4327|0@5@2&#,)!
+3 f0 (4327|0@5@7&#,)!
+3 f983 (4327|0@5@7&#,)!
+3 f0 (4327|0@5@7&#,)!
+3 f983 (4327|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f4327 (315|$#,)!
+3 f0 (4327|@5|0@5@7&#,4327|0@5@19@2@0#,)!
+3 f4327 (4327|@5|0@5@7&#,4327|0@5@19@2@0#,)!
+3 f0 (4327|0@5@7&#,)!
+3 f4327 (4327|0@5@7&#,)!
+3 f0 (4327|0@5@7&#,)!
+3 f2 (4327|0@5@7&#,)!
+3 f0 (4327|0@5@7&#,4327|0@5@7&#,)!
+3 f5 (4327|0@5@7&#,4327|0@5@7&#,)!
+3 f0 (4327|0@5@7&#,)!
+3 f1 (4327|0@5@7&#,)!
+3 f0 (4327|0@5@7&#,)!
+3 f2 (4327|0@5@7&#,)!
+3 f0 (4327|0@5@7&#,)!
+3 f2 (4327|0@5@7&#,)!
+1 t985|985&
+3 S_ctypeList{5|@1|^#nelements,5|@1|^#nspace,4363|@1|11@3@3&#elements,}!
+0 s6457|-1 4366 -1
+1 t4365|4365&
+0 a253|&
+3 f0 (4367|@7|0@5@7&#,)!
+3 f5 (4367|@7|0@5@7&#,)!
+3 f0 ()!
+3 f4367 ()!
+3 f0 (4367|0@5@7&#,985|$#,)!
+3 f1 (4367|0@5@7&#,985|$#,)!
+3 f0 (4367|0@5@7&#,)!
+3 f983 (4367|0@5@7&#,)!
+3 f0 (4367|0@5@2&#,)!
+3 f1 (4367|0@5@2&#,)!
+3 f0 (4367|0@5@7&#,)!
+3 f2 (4367|0@5@7&#,)!
+3 f0 (4367|0@5@7&#,)!
+3 f2 (4367|0@5@7&#,)!
+0 s75|-1 4385 -1
+0 s63|-1 4384 -1
+1 t4383|4383&
+1 t4382|4382&
+3 S_aliasTable{5|@1|^#nelements,5|@1|^#nspace,4384|@1|11@0@2&#keys,4385|@1|11@0@2&#values,}!
+3 f0 (978|0@5@7&#,)!
+3 f2 (978|0@5@7&#,)!
+3 f0 (978|@7|0@5@7&#,)!
+3 f2 (978|@7|0@5@7&#,)!
+3 f0 (978|0@5@7&#,)!
+3 f2 (978|0@5@7&#,)!
+3 f0 (978|@7|0@5@7&#,)!
+3 f5 (978|@7|0@5@7&#,)!
+3 f1 (978|@7|6@5@7&#,955|@3|6@5@18@2@0#,975|@3|6@5@19@2@0#,)!
+3 f0 ()!
+3 f978 ()!
+3 f0 (978|0@5@7&#,955|0@5@18&#,)!
+3 f1 (978|0@5@7&#,955|0@5@18&#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,)!
+3 f975 (978|0@5@7&#,955|0@5@18&#,)!
+3 f0 (978|0@5@7&#,)!
+3 f978 (978|0@5@7&#,)!
+3 f0 (978|0@5@7&#,)!
+3 f983 (978|0@5@7&#,)!
+3 f0 (978|0@5@2&#,)!
+3 f1 (978|0@5@2&#,)!
+3 f0 (978|@5|0@5@7&#,955|0@5@18@2@0#,955|0@5@18&#,)!
+3 f978 (978|@5|0@5@7&#,955|0@5@18@2@0#,955|0@5@18&#,)!
+3 f0 (978|@5|0@5@7&#,978|0@5@7&#,5|$#,)!
+3 f978 (978|@5|0@5@7&#,978|0@5@7&#,5|$#,)!
+3 f0 (978|0@5@7&#,978|0@5@7&#,5|$#,)!
+3 f978 (978|0@5@7&#,978|0@5@7&#,5|$#,)!
+3 f0 (978|0@5@7&#,)!
+3 f1 (978|0@5@7&#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,)!
+3 f975 (978|0@5@7&#,955|0@5@18&#,)!
+3 f0 (978|0@5@7&#,)!
+3 f1 (978|0@5@7&#,)!
+3 f0 (978|@5|0@5@7&#,978|0@5@2&#,5|$#,)!
+3 f978 (978|@5|0@5@7&#,978|0@5@2&#,5|$#,)!
+3 e!58{US_GLOBAL,US_NORMAL,US_TBRANCH,US_FBRANCH,US_CBRANCH,US_SWITCH}!
+0 s6613|&
+0 s255|&
+3 S_refentry{5|@1|^#level,5|@1|^#index,}!
+0 s6373|-1 4427 -1
+1 t4426|4426&
+0 s256|-1 10835 -1
+0 s257|-1 4430 -1
+1 t4429|4429&
+0 s258|&
+3 S_usymtab{4424|@1|^#kind,5|@1|^#nentries,5|@1|^#nspace,5|@1|^#lexlevel,2|@1|^#mustBreak,4044|@1|^#exitCode,4246|@1|11@0@2&#entries,3824|@1|0@5@2&#htable,4431|@1|0@5@2&#reftable,972|@1|0@5@2&#guards,978|@1|0@5@3&#aliases,966|@1|0@5@17&#env,}!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (2|$#,)!
+3 f1 (2|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (5|$#,4203|$#,)!
+3 f958 (5|$#,4203|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (5|$#,)!
+3 f958 (5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f985 (983|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (958|0@5@2&#,2|$#,)!
+3 f4203 (958|0@5@2&#,2|$#,)!
+3 f0 (958|0@5@2&#,)!
+3 f985 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f958 (958|0@5@2&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (4203|$#,)!
+3 f958 (4203|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f4203 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f4203 (983|0@5@7&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f958 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f4203 (958|0@5@2&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f985 (983|0@5@7&#,)!
+3 f0 (4203|$#,4203|$#,)!
+3 f2 (4203|$#,4203|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (5|$#,)!
+3 f4203 (5|$#,)!
+3 f0 (4203|$#,)!
+3 f2 (4203|$#,)!
+3 f0 (4203|$#,)!
+3 f2 (4203|$#,)!
+3 f0 (4204|$#,)!
+3 f2 (4204|$#,)!
+3 f0 (4204|$#,)!
+3 f2 (4204|$#,)!
+3 f0 (4204|$#,4204|$#,)!
+3 f2 (4204|$#,4204|$#,)!
+3 f0 (5|$#,)!
+3 f4204 (5|$#,)!
+3 f1 (966|@7|6@5@7&#,958|@3|6@5@19@2@0#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f1 (981|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (972|0@5@7&#,)!
+3 f1 (972|0@5@7&#,)!
+3 f0 (4044|$#,)!
+3 f1 (4044|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (4203|$#,)!
+3 f4203 (4203|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4245|0@5@7&#,)!
+3 f985 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f985 (4245|0@5@7&#,)!
+3 f0 (3890|$#,)!
+3 f985 (3890|$#,)!
+3 f0 (4203|$#,)!
+3 f958 (4203|$#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (972|0@5@2&#,)!
+3 f1 (972|0@5@2&#,)!
+3 f0 (972|0@5@2&#,)!
+3 f1 (972|0@5@2&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,1778|$#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,1778|$#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,1778|$#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,1778|$#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,2|$#,1778|$#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,2|$#,1778|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (4203|$#,)!
+3 f2 (4203|$#,)!
+3 f0 (4203|$#,)!
+3 f983 (4203|$#,)!
+3 f0 (4203|$#,)!
+3 f958 (4203|$#,)!
+3 f0 (958|0@5@2&#,2|$#,)!
+3 f4203 (958|0@5@2&#,2|$#,)!
+3 f0 (958|0@5@2&#,)!
+3 f985 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f958 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f958 (958|0@5@2&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f5 (958|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 (969|0@5@7&#,2|$#,)!
+3 f1 (969|0@5@7&#,2|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f975 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f975 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 (958|0@5@2&#,)!
+3 f958 (958|0@5@2&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f975 (955|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (966|0@5@7&#,)!
+3 f2 (966|0@5@7&#,)!
+3 f0 (958|0@5@7&#,5|$#,)!
+3 f1 (958|0@5@7&#,5|$#,)!
+3 e!59{CT_UNKNOWN,CT_PRIM,CT_USER,CT_ABST,CT_ENUM,CT_PTR,CT_ARRAY,CT_FIXEDARRAY,CT_FCN,CT_STRUCT,CT_UNION,CT_ENUMLIST,CT_BOOL,CT_CONJ,CT_EXPFCN}!
+0 s6614|&
+0 s259|&
+3 e!60{CTK_UNKNOWN,CTK_INVALID,CTK_DNE,CTK_PLAIN,CTK_PTR,CTK_ARRAY,CTK_COMPLEX}!
+0 s6615|&
+0 s260|&
+3 f0 (4675|$#,)!
+3 f5 (4675|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,2|$#,2|$#,2|$#,)!
+3 f2 (985|$#,985|$#,2|$#,2|$#,2|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (4363|$#,)!
+3 f2 (4363|$#,)!
+3 f0 (4363|$#,)!
+3 f2 (4363|$#,)!
+3 f0 (4363|$#,)!
+3 f2 (4363|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f983 (985|$#,)!
+3 f0 (985|$#,)!
+3 f983 (985|$#,)!
+3 f0 (985|$#,)!
+3 f983 (985|$#,)!
+3 f0 (985|$#,)!
+3 f983 (985|$#,)!
+3 f0 (985|$#,)!
+3 f983 (985|$#,)!
+3 f0 (5|$#,)!
+3 f4675 (5|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (315|$#,)!
+3 f985 (315|$#,)!
+3 f0 (5|$#,985|$#,)!
+3 f985 (5|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (4204|$#,)!
+3 f985 (4204|$#,)!
+3 f0 (983|0@5@4&#,3890|0@0@4&#,)!
+3 f985 (983|0@5@4&#,3890|0@0@4&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f985 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f985 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f985 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f0 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f985 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f0 (4245|0@5@2&#,)!
+3 f985 (4245|0@5@2&#,)!
+3 f0 (4245|0@5@2&#,)!
+3 f985 (4245|0@5@2&#,)!
+3 f0 (4204|$#,)!
+3 f985 (4204|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,9|$#,)!
+3 f985 (985|$#,9|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (985|$#,4245|0@5@2&#,)!
+3 f985 (985|$#,4245|0@5@2&#,)!
+3 f0 (985|$#,4245|0@5@2&#,)!
+3 f985 (985|$#,4245|0@5@2&#,)!
+3 f0 (985|$#,4245|0@5@2&#,)!
+3 f985 (985|$#,4245|0@5@2&#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,4245|0@5@18&#,)!
+3 f985 (985|$#,4245|0@5@18&#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f4245 (985|$#,)!
+3 f0 (985|$#,)!
+3 f4245 (985|$#,)!
+3 f0 (985|$#,)!
+3 f3890 (985|$#,)!
+3 f0 (985|$#,)!
+3 f4245 (985|$#,)!
+3 f0 (985|$#,)!
+3 f3801 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f5 (985|$#,985|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f4204 (985|$#,)!
+3 f0 (1490|$#,)!
+3 f985 (1490|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|@7|$#,)!
+3 f2 (985|@7|$#,)!
+3 f0 (985|$#,983|0@5@2&#,)!
+3 f983 (985|$#,983|0@5@2&#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 S_qtype{985|@1|^#type,2108|@1|0@5@3&#quals,}!
+0 s6399|-1 4940 -1
+1 t4939|4939&
+0 a261|&
+3 f0 (4941|0@5@7&#,)!
+3 f2 (4941|0@5@7&#,)!
+3 f0 (4941|0@5@7&#,)!
+3 f2 (4941|0@5@7&#,)!
+3 f0 (4941|@7|0@5@7&#,)!
+3 f985 (4941|@7|0@5@7&#,)!
+3 f0 (4941|@7|0@5@7&#,)!
+3 f2108 (4941|@7|0@5@7&#,)!
+3 f0 (4941|@7|0@5@7&#,985|$#,)!
+3 f1 (4941|@7|0@5@7&#,985|$#,)!
+3 f0 (4941|@5|0@5@7&#,2108|0@5@7&#,)!
+3 f4941 (4941|@5|0@5@7&#,2108|0@5@7&#,)!
+3 f0 (4941|@5|0@5@7&#,4941|0@5@2&#,)!
+3 f4941 (4941|@5|0@5@7&#,4941|0@5@2&#,)!
+3 f0 (4941|0@5@7&#,)!
+3 f4941 (4941|0@5@7&#,)!
+3 f0 (985|$#,)!
+3 f4941 (985|$#,)!
+3 f0 ()!
+3 f4941 ()!
+3 f0 (4941|@5|0@5@7&#,1490|$#,)!
+3 f4941 (4941|@5|0@5@7&#,1490|$#,)!
+3 f0 (4941|@5|0@5@7&#,985|$#,)!
+3 f4941 (4941|@5|0@5@7&#,985|$#,)!
+3 f0 (4941|@5|0@5@7&#,4941|0@5@2&#,)!
+3 f4941 (4941|@5|0@5@7&#,4941|0@5@2&#,)!
+3 f0 (4941|@5|0@5@7&#,)!
+3 f4941 (4941|@5|0@5@7&#,)!
+3 f0 (5|$#,4941|@5|0@5@7&#,)!
+3 f1 (5|$#,4941|@5|0@5@7&#,)!
+3 f0 (4941|0@5@7&#,)!
+3 f983 (4941|0@5@7&#,)!
+3 f0 (4941|@5|0@5@7&#,985|$#,)!
+3 f4941 (4941|@5|0@5@7&#,985|$#,)!
+3 f0 (4941|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f4941 (4941|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f0 (4941|0@5@2&#,)!
+3 f1 (4941|0@5@2&#,)!
+3 S_idDecl{983|@1|0@5@3&#id,4941|@1|0@5@3&#typ,}!
+3 f0 (963|0@5@7&#,)!
+3 f2 (963|0@5@7&#,)!
+3 f0 (963|0@5@2&#,)!
+3 f1 (963|0@5@2&#,)!
+3 f0 (983|0@5@2&#,4941|0@5@2&#,)!
+3 f963 (983|0@5@2&#,4941|0@5@2&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f983 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f4941 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,4941|0@5@2&#,)!
+3 f1 (963|0@5@7&#,4941|0@5@2&#,)!
+3 f0 (963|@5|0@5@7&#,)!
+3 f963 (963|@5|0@5@7&#,)!
+3 f0 (963|@5|0@5@7&#,985|$#,)!
+3 f963 (963|@5|0@5@7&#,985|$#,)!
+3 f0 (963|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f963 (963|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f0 (963|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f963 (963|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f985 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f2108 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f983 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f983 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,1490|$#,)!
+3 f1 (963|0@5@7&#,1490|$#,)!
+3 e!61{MVLONG,MVCHAR,MVDOUBLE,MVSTRING}!
+0 s6618|&
+0 s262|&
+3 U_mval{9|@1|^#ival,4|@1|^#cval,17|@1|^#fval,983|@1|0@5@2&#sval,}!
+0 s6566|&
+3 S_multiVal{5013|@1|^#kind,5015|@1|^#value,}!
+0 s6370|-1 5018 -1
+1 t5017|5017&
+0 s263|&
+3 f0 (5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f983 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f17 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f4 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f9 (5019|0@5@7&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f5019 (983|0@5@2&#,)!
+3 f0 (17|$#,)!
+3 f5019 (17|$#,)!
+3 f0 (4|$#,)!
+3 f5019 (4|$#,)!
+3 f0 (9|$#,)!
+3 f5019 (9|$#,)!
+3 f0 ()!
+3 f5019 ()!
+3 f0 (5019|0@5@7&#,)!
+3 f5019 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@2&#,)!
+3 f1 (5019|0@5@2&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f5019 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f5019 (315|$#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f983 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f983 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,5019|0@5@7&#,)!
+3 f5 (5019|0@5@7&#,5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,5019|0@5@7&#,)!
+3 e!62{SP_USES,SP_DEFINES,SP_ALLOCATES,SP_RELEASES,SP_SETS,SP_ISNULL,SP_ISNOTNULL,SP_ISONLY,SP_ISSHARED,SP_ISDEPENDENT,SP_ISOWNED,SP_ISOBSERVER,SP_ISEXPOSED}!
+0 s6616|&
+0 s264|&
+3 e!63{TK_BEFORE,TK_AFTER,TK_BOTH}!
+0 s6617|&
+0 s265|&
+3 S!64{5073|@1|^#state,5070|@1|^#kind,975|@1|0@5@3&#refs,}^5076
+0 s6472|&
+1 t5074|5074&
+0 a266|-1 8911 -1
+0 s267|-1 5093 -1
+3 f0 (5077|$#,)!
+3 f983 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f995 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f995 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f995 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f2 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f2 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f975 (5077|$#,)!
+1 t5078|5078&
+3 S!65{5|@1|^#nelements,5|@1|^#nspace,5093|@1|11@3@3&#elements,}^5096
+0 s6458|&
+1 t5094|5094&
+0 a268|&
+3 f1 (5097|@7|6@5@7&#,5077|@3|6@0@19@2@0#,)!
+3 f1 (5097|@7|6@5@7&#,5077|@3|6@0@19@2@0#,)!
+3 f1 (5097|@7|6@5@7&#,5077|@3|6@0@19@2@0#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (5077|$#,)!
+3 f1862 (5077|$#,)!
+3 f0 (5077|$#,955|0@5@18&#,)!
+3 f983 (5077|$#,955|0@5@18&#,)!
+3 f0 (5077|$#,)!
+3 f1862 (5077|$#,)!
+3 f0 (5077|$#,955|0@5@18&#,)!
+3 f983 (5077|$#,955|0@5@18&#,)!
+3 f0 (5077|$#,)!
+3 f990 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f990 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f1000 (5077|$#,)!
+3 f0 (5073|$#,5070|$#,975|0@5@2&#,)!
+3 f5077 (5073|$#,5070|$#,975|0@5@2&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f5077 (975|0@5@2&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f5077 (975|0@5@2&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f5077 (975|0@5@2&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f5077 (975|0@5@2&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f5077 (975|0@5@2&#,)!
+3 f0 (5097|0@5@7&#,)!
+3 f2 (5097|0@5@7&#,)!
+3 f0 (5097|0@5@7&#,)!
+3 f2 (5097|0@5@7&#,)!
+3 f0 (5097|@7|0@5@7&#,)!
+3 f5 (5097|@7|0@5@7&#,)!
+3 f0 (5077|$#,)!
+3 f983 (5077|$#,)!
+3 f0 (5097|@5|0@5@7&#,5077|0@0@2&#,)!
+3 f5097 (5097|@5|0@5@7&#,5077|0@0@2&#,)!
+3 f0 (5097|0@5@7&#,)!
+3 f983 (5097|0@5@7&#,)!
+3 f0 (5097|0@5@2&#,)!
+3 f1 (5097|0@5@2&#,)!
+3 f0 (5097|0@5@7&#,)!
+3 f5097 (5097|0@5@7&#,)!
+3 f0 (5097|0@5@7&#,)!
+3 f983 (5097|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f5097 (315|$#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,)!
+3 S_ucinfo{5019|@1|0@5@2&#val,959|@1|^#access,}!
+0 s6401|-1 5153 -1
+1 t5152|5152&
+0 s269|&
+3 e!66{VKSPEC,VKNORMAL,VKPARAM,VKYIELDPARAM,VKREFYIELDPARAM,VKRETPARAM,VKREFPARAM,VKSEFPARAM,VKREFSEFPARAM,VKSEFRETPARAM,VKREFSEFRETPARAM,VKEXPMACRO}!
+0 s6619|&
+0 s270|&
+3 e!67{CH_UNKNOWN,CH_UNCHECKED,CH_CHECKED,CH_CHECKMOD,CH_CHECKEDSTRICT}!
+0 s6620|&
+0 s271|&
+3 S_uvinfo{5157|@1|^#kind,5160|@1|^#checked,3937|@1|^#defstate,3943|@1|^#nullstate,}!
+0 s6483|-1 5163 -1
+1 t5162|5162&
+0 s272|&
+3 S_udinfo{1289|@1|^#abs,1289|@1|^#mut,985|@1|^#type,}!
+0 s6404|-1 5167 -1
+1 t5166|5166&
+0 s273|&
+3 e!68{SPC_NONE,SPC_PRINTFLIKE,SPC_SCANFLIKE,SPC_MESSAGELIKE,SPC_LAST}!
+0 s6621|&
+0 s274|&
+3 S_ufinfo{1490|@1|^#nullPred,5171|@1|^#specialCode,4044|@1|^#exitCode,959|@1|^#access,4327|@1|0@5@17&#globs,975|@1|0@5@17&#mods,5097|@1|0@5@3&#specclauses,4245|@1|0@5@18&#defparams,2|@1|^#hasGlobs,2|@1|^#hasMods,}!
+0 s6533|-1 5174 -1
+1 t5173|5173&
+0 s275|&
+3 S_uiinfo{959|@1|^#access,4327|@1|0@5@17&#globs,975|@1|0@5@17&#mods,}!
+0 s6405|-1 5178 -1
+1 t5177|5177&
+0 s276|&
+3 S_ueinfo{959|@1|^#access,}!
+0 s6338|-1 5182 -1
+1 t5181|5181&
+0 s277|&
+3 U_uinfo{5154|@1|0@0@3&#uconst,5164|@1|0@0@3&#var,5168|@1|0@0@3&#datatype,5175|@1|0@0@3&#fcn,5179|@1|0@0@3&#iter,5183|@1|0@0@3&#enditer,}!
+0 s6569|-1 5186 -1
+1 t5185|5185&
+0 s278|&
+3 S_uentry{4180|@1|^#ukind,983|@1|0@5@3&#uname,985|@1|^#utype,981|@1|0@5@3&#whereSpecified,981|@1|0@5@3&#whereDefined,981|@1|0@5@3&#whereDeclared,955|@1|0@5@18@2@0#sref,3854|@1|0@5@3&#uses,2|@1|^#used,2|@1|^#lset,2|@1|^#isPrivate,2|@1|^#hasNameError,3940|@1|^#storageclass,5187|@1|0@3@3&#info,}!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f5 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f1 (958|@7|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,4204|$#,)!
+3 f1 (958|0@5@7&#,4204|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,3937|$#,)!
+3 f1 (958|0@5@7&#,3937|$#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f1 (958|@7|0@5@7&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (958|0@5@7&#,5019|0@5@2&#,)!
+3 f1 (958|0@5@7&#,5019|0@5@2&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f983 (958|15@5@1&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f985 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f985 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f985 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f4180 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f5 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@6&#,)!
+3 f955 (958|0@5@6&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f975 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f959 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (983|0@5@7&#,981|0@5@6&#,)!
+3 f958 (983|0@5@7&#,981|0@5@6&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,5|$#,969|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,5|$#,969|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f5097 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,983|0@5@2&#,)!
+3 f1 (958|0@5@7&#,983|0@5@2&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (985|$#,)!
+3 f958 (985|$#,)!
+3 f0 (983|0@5@7&#,985|$#,959|$#,981|0@5@4&#,)!
+3 f958 (983|0@5@7&#,985|$#,959|$#,981|0@5@4&#,)!
+3 f0 (983|0@5@7&#,985|$#,959|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@4&#,)!
+3 f958 (983|0@5@7&#,985|$#,959|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@4&#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@4&#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@4&#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,959|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,959|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,959|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@4&#,)!
+3 f958 (983|0@5@7&#,985|$#,959|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@4&#,)!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (983|0@5@7&#,985|$#,969|0@5@7&#,)!
+3 f958 (983|0@5@7&#,985|$#,969|0@5@7&#,)!
+3 f0 (983|0@5@6&#,985|$#,981|0@5@4&#,)!
+3 f958 (983|0@5@6&#,985|$#,981|0@5@4&#,)!
+3 f0 (983|0@5@6&#,985|$#,981|0@5@4&#,2|$#,5019|0@5@2&#,)!
+3 f958 (983|0@5@6&#,985|$#,981|0@5@4&#,2|$#,5019|0@5@2&#,)!
+3 f0 (983|0@5@6&#,985|$#,1289|$#,1289|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@6&#,985|$#,1289|$#,1289|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@6&#,985|$#,1289|$#,1289|$#,981|0@5@4&#,2|$#,)!
+3 f958 (983|0@5@6&#,985|$#,1289|$#,1289|$#,981|0@5@4&#,2|$#,)!
+3 f0 ()!
+3 f958 ()!
+3 f0 (958|0@5@6&#,)!
+3 f1 (958|0@5@6&#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f2 (958|@7|0@5@7&#,)!
+3 f0 (983|0@5@7&#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (983|0@5@7&#,4204|$#,981|0@5@6&#,)!
+3 f958 (983|0@5@7&#,4204|$#,981|0@5@6&#,)!
+3 f0 (983|0@5@7&#,985|$#,4204|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,985|$#,4204|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f0 (963|0@5@7&#,5|$#,)!
+3 f958 (963|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@4&#,2|$#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@4&#,2|$#,)!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (983|0@5@7&#,985|$#,955|0@5@18&#,)!
+3 f958 (983|0@5@7&#,985|$#,955|0@5@18&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 (1289|$#,)!
+3 f958 (1289|$#,)!
+3 f0 (958|0@5@7&#,958|0@5@2&#,)!
+3 f1 (958|0@5@7&#,958|0@5@2&#,)!
+3 f0 (958|0@5@7&#,958|0@5@2&#,)!
+3 f1 (958|0@5@7&#,958|0@5@2&#,)!
+3 f0 (983|0@5@2&#,958|0@5@7&#,)!
+3 f958 (983|0@5@2&#,958|0@5@7&#,)!
+3 f0 (4180|$#,981|0@5@7&#,315|$#,)!
+3 f958 (4180|$#,981|0@5@7&#,315|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f4245 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,4245|0@5@2&#,)!
+3 f1 (958|0@5@7&#,4245|0@5@2&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f4327 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1490 (958|0@5@7&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (958|0@5@7&#,4203|$#,)!
+3 f1 (958|0@5@7&#,4203|$#,)!
+3 f0 (958|15@5@1&#,981|0@5@7&#,)!
+3 f1 (958|15@5@1&#,981|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,981|0@5@2&#,)!
+3 f1 (958|0@5@7&#,981|0@5@2&#,)!
+3 f0 (958|0@5@7&#,981|0@5@2&#,)!
+3 f1 (958|0@5@7&#,981|0@5@2&#,)!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,983|0@5@2&#,)!
+3 f1 (958|0@5@7&#,983|0@5@2&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,955|0@5@18@2@0#,)!
+3 f1 (958|0@5@7&#,955|0@5@18@2@0#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,975|0@5@17&#,)!
+3 f1 (958|0@5@7&#,975|0@5@17&#,)!
+3 f0 (958|0@5@7&#,5097|0@5@2&#,)!
+3 f1 (958|0@5@7&#,5097|0@5@2&#,)!
+3 f0 (958|0@5@7&#,985|$#,)!
+3 f1 (958|0@5@7&#,985|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,983|0@5@2&#,)!
+3 f1 (958|0@5@7&#,983|0@5@2&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f958 (958|0@5@7&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,981|0@5@7&#,2|$#,2|$#,2|$#,1778|$#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,981|0@5@7&#,2|$#,2|$#,2|$#,1778|$#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f4044 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,2108|0@5@7&#,)!
+3 f1 (958|0@5@7&#,2108|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f985 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f3948 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f3951 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f5019 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,4327|0@5@17&#,)!
+3 f1 (958|0@5@7&#,4327|0@5@17&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+1 t958|958&
+3 f0 (5567|$#,5567|$#,)!
+3 f5 (5567|$#,5567|$#,)!
+3 f0 (5567|$#,5567|$#,)!
+3 f5 (5567|$#,5567|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,3769|$#,)!
+3 f955 (958|0@5@7&#,3769|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f3937 (958|0@5@7&#,)!
+3 f0 (958|0@5@17&#,)!
+3 f1 (958|0@5@17&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f955 (958|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@17&#,)!
+3 f1 (958|0@5@17&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,5|$#,)!
+3 f1 (958|0@5@7&#,5|$#,)!
+3 f0 (958|@7|0@5@7&#,)!
+3 f3854 (958|@7|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (983|0@5@7&#,981|0@5@4&#,)!
+3 f958 (983|0@5@7&#,981|0@5@4&#,)!
+3 e!69{SR_NOTHING,SR_INTERNAL,SR_SPECSTATE,SR_SYSTEM}!
+0 s6622|&
+0 s279|&
+3 e!70{SK_PARAM,SK_ARRAYFETCH,SK_FIELD,SK_PTR,SK_ADR,SK_CONST,SK_CVAR,SK_UNCONSTRAINED,SK_OBJECT,SK_CONJ,SK_EXTERNAL,SK_DERIVED,SK_NEW,SK_TYPE,SK_RESULT,SK_SPECIAL,SK_UNKNOWN}!
+0 s6623|&
+0 s280|&
+3 S_cref{5|@1|^#lexlevel,4203|@1|^#index,}!
+0 s6374|-1 5634 -1
+1 t5633|5633&
+0 s281|&
+3 S_ainfo{955|@1|0@2@18@2@0#arr,2|@1|^#indknown,5|@1|^#ind,}!
+0 s6406|-1 5638 -1
+1 t5637|5637&
+0 s282|&
+3 S_fldinfo{955|@1|0@2@18@2@0#rec,983|@1|0@5@18@3@0#field,}!
+0 s6388|-1 5642 -1
+1 t5641|5641&
+0 s283|&
+3 S_cjinfo{955|@1|0@2@18@2@0#a,955|@1|0@2@18@2@0#b,}!
+0 s6342|-1 5646 -1
+1 t5645|5645&
+0 s284|&
+3 U_sinfo{5635|@1|0@0@2&#cvar,5|@1|^#paramno,5639|@1|0@0@2&#arrayfetch,5643|@1|0@0@2&#field,985|@1|^#object,983|@1|0@5@18@3@0#fname,955|@1|0@2@18@2@0#ref,5647|@1|0@0@2&#conj,5628|@1|^#spec,}!
+0 s6572|-1 5650 -1
+1 t5649|5649&
+0 s285|&
+3 S_alinfo{981|@1|0@5@2&#loc,955|@1|0@5@18@3@0#ref,958|@1|0@5@18@3@0#ue,}!
+0 s6429|-1 5654 -1
+1 t5653|5653&
+0 s286|&
+3 S_sRef{2|@1|^#safe,2|@1|^#modified,5631|@1|^#kind,985|@1|^#type,3937|@1|^#defstate,3943|@1|^#nullstate,3948|@1|^#aliaskind,3948|@1|^#oaliaskind,3951|@1|^#expkind,3951|@1|^#oexpkind,5655|@1|0@5@2&#expinfo,5655|@1|0@5@2&#aliasinfo,5655|@1|0@5@2&#definfo,5655|@1|0@5@2&#nullinfo,5651|@1|0@3@2&#info,975|@1|0@5@2&#deriv,}!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3943|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3943|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3943|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3943|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f3943 (955|@7|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f1 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f3948 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f3948 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|0@5@18&#,983|0@5@18&#,)!
+3 f955 (955|0@5@18&#,983|0@5@18&#,)!
+3 f0 (955|0@5@18&#,983|0@5@18&#,)!
+3 f955 (955|0@5@18&#,983|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f975 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 ?!
+3 f5757 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)^5760
+1 t5759|5759&
+3 f0 (5760|$#,955|0@5@18&#,)!
+3 f2 (5760|$#,955|0@5@18&#,)!
+3 ?!
+3 f5763 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)^5766
+1 t5765|5765&
+3 f0 (5766|$#,955|0@5@18&#,)!
+3 f2 (5766|$#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,4245|0@5@7&#,)!
+3 f985 (955|0@5@18&#,4245|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f985 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,985|$#,)!
+3 f1 (955|0@5@18&#,985|$#,)!
+3 f0 (955|0@5@18&#,985|$#,)!
+3 f1 (955|0@5@18&#,985|$#,)!
+3 f0 (955|0@5@18&#,3943|$#,)!
+3 f1 (955|0@5@18&#,3943|$#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,)!
+3 f0 (955|@5|0@5@18&#,)!
+3 f955 (955|@5|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,3948|$#,)!
+3 f1 (955|0@5@18&#,3948|$#,)!
+3 f0 (955|@5|0@5@18&#,955|@5|0@5@18&#,)!
+3 f955 (955|@5|0@5@18&#,955|@5|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18@2@0#,5|$#,)!
+3 f955 (955|0@5@18@2@0#,5|$#,)!
+3 f0 (955|0@5@18&#,983|0@5@18&#,)!
+3 f955 (955|0@5@18&#,983|0@5@18&#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (983|0@5@19@2@0#,)!
+3 f955 (983|0@5@19@2@0#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,5|$#,)!
+3 f955 (955|0@5@18&#,5|$#,)!
+3 f0 (955|@5|0@5@18@2@0#,955|0@5@18@2@0#,)!
+3 f955 (955|@5|0@5@18@2@0#,955|0@5@18@2@0#,)!
+3 f0 (5|$#,4203|$#,985|$#,)!
+3 f955 (5|$#,4203|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f955 (985|$#,)!
+3 f0 (955|0@5@18&#,983|0@5@18&#,)!
+3 f955 (955|0@5@18&#,983|0@5@18&#,)!
+3 f0 (4203|$#,985|$#,)!
+3 f955 (4203|$#,985|$#,)!
+3 f0 (955|0@5@18&#,983|0@5@18&#,)!
+3 f955 (955|0@5@18&#,983|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (985|$#,)!
+3 f955 (985|$#,)!
+3 f0 (985|$#,)!
+3 f955 (985|$#,)!
+3 f0 (5|$#,985|$#,)!
+3 f955 (5|$#,985|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 ()!
+3 f955 ()!
+3 f0 ()!
+3 f955 ()!
+3 f0 ()!
+3 f955 ()!
+3 f0 ()!
+3 f955 ()!
+3 f0 ()!
+3 f955 ()!
+3 f0 ()!
+3 f955 ()!
+3 f0 (955|@5|0@5@18&#,985|$#,958|0@5@7&#,)!
+3 f955 (955|@5|0@5@18&#,985|$#,958|0@5@7&#,)!
+3 f0 (955|0@5@18&#,5|$#,)!
+3 f1 (955|0@5@18&#,5|$#,)!
+3 f0 (985|$#,955|0@5@18&#,983|0@5@19@2@0#,)!
+3 f955 (985|$#,955|0@5@18&#,983|0@5@19@2@0#,)!
+3 f0 (955|0@5@18&#,)!
+3 f4203 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f958 (955|0@5@18&#,)!
+3 f0 (955|@5|0@5@18&#,3769|$#,)!
+3 f955 (955|@5|0@5@18&#,3769|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f958 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (315|$#,)!
+3 f955 (315|$#,)!
+3 f0 (315|$#,)!
+3 f955 (315|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1289 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1289 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,985|$#,)!
+3 f1 (955|0@5@18&#,985|$#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (955|0@5@18&#,)!
+3 f3951 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f3951 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,3951|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3951|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,1778|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,1778|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,958|0@5@7&#,)!
+3 f1 (955|0@5@18&#,958|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,3943|$#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,3943|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18&#,)!
+3 f3937 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,3937|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3937|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 ?!
+3 f6185 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f2 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)^6188
+1 t6187|6187&
+3 ?!
+3 f6189 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)^6192
+1 t6191|6191&
+3 f0 (6188|$#,6192|0@5@7&#,955|0@5@18&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (6188|$#,6192|0@5@7&#,955|0@5@18&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (990|$#,955|0@5@18&#,)!
+3 f2 (990|$#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@2&#,)!
+3 f1 (955|0@5@2&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 S_guardSet{975|@1|0@5@2&#tguard,975|@1|0@5@2&#fguard,}!
+3 f0 (972|0@5@7&#,)!
+3 f2 (972|0@5@7&#,)!
+3 f0 (972|0@5@7&#,)!
+3 f2 (972|0@5@7&#,)!
+3 f0 ()!
+3 f972 ()!
+3 f0 (972|@5|0@5@7&#,955|0@5@18&#,)!
+3 f972 (972|@5|0@5@7&#,955|0@5@18&#,)!
+3 f0 (972|@5|0@5@7&#,955|0@5@18&#,)!
+3 f972 (972|@5|0@5@7&#,955|0@5@18&#,)!
+3 f0 (972|@5|0@5@9&#,972|0@5@7&#,)!
+3 f972 (972|@5|0@5@9&#,972|0@5@7&#,)!
+3 f0 (972|@5|0@5@9&#,972|0@5@7&#,)!
+3 f972 (972|@5|0@5@9&#,972|0@5@7&#,)!
+3 f0 (972|0@5@7&#,955|0@5@18&#,)!
+3 f1 (972|0@5@7&#,955|0@5@18&#,)!
+3 f0 (972|0@5@7&#,)!
+3 f983 (972|0@5@7&#,)!
+3 f0 (972|0@5@2&#,)!
+3 f1 (972|0@5@2&#,)!
+3 f0 (972|0@5@7&#,)!
+3 f975 (972|0@5@7&#,)!
+3 f0 (972|0@5@7&#,)!
+3 f975 (972|0@5@7&#,)!
+3 f0 (972|0@5@2&#,972|0@5@7&#,)!
+3 f972 (972|0@5@2&#,972|0@5@7&#,)!
+3 f0 (972|0@5@6&#,)!
+3 f972 (972|0@5@6&#,)!
+3 f0 (972|0@5@6&#,)!
+3 f972 (972|0@5@6&#,)!
+3 f0 (972|0@5@7&#,955|0@5@18&#,)!
+3 f2 (972|0@5@7&#,955|0@5@18&#,)!
+3 f0 (972|0@5@7&#,955|0@5@18&#,)!
+3 f2 (972|0@5@7&#,955|0@5@18&#,)!
+3 f0 (972|0@5@2&#,972|0@5@7&#,5|$#,)!
+3 f972 (972|0@5@2&#,972|0@5@7&#,5|$#,)!
+3 f0 (972|@5|0@5@9&#,972|0@5@2&#,5|$#,)!
+3 f972 (972|@5|0@5@9&#,972|0@5@2&#,5|$#,)!
+3 f0 (972|0@5@7&#,)!
+3 f1 (972|0@5@7&#,)!
+3 e!71{XPR_PARENS,XPR_ASSIGN,XPR_CALL,XPR_EMPTY,XPR_VAR,XPR_OP,XPR_POSTOP,XPR_PREOP,XPR_SIZEOFT,XPR_SIZEOF,XPR_ALIGNOFT,XPR_ALIGNOF,XPR_OFFSETOF,XPR_CAST,XPR_FETCH,XPR_VAARG,XPR_ITER,XPR_FOR,XPR_FORPRED,XPR_GOTO,XPR_CONTINUE,XPR_BREAK,XPR_RETURN,XPR_NULLRETURN,XPR_COMMA,XPR_COND,XPR_IF,XPR_IFELSE,XPR_DOWHILE,XPR_WHILE,XPR_STMT,XPR_STMTLIST,XPR_SWITCH,XPR_INIT,XPR_FACCESS,XPR_ARROW,XPR_CONST,XPR_STRINGLITERAL,XPR_NUMLIT,XPR_BODY,XPR_NODE,XPR_ITERCALL,XPR_TOK,XPR_WHILEPRED,XPR_CASE,XPR_FTCASE,XPR_DEFAULT,XPR_FTDEFAULT,XPR_BLOCK,XPR_INITBLOCK,XPR_LABEL}!
+0 s6624|&
+0 s287|&
+3 S_exprOffsetof{4941|@1|0@5@2&#q,1834|@1|0@5@2&#field,}!
+0 s6385|-1 6263 -1
+1 t6262|6262&
+0 s288|&
+3 S_exprPair{969|@1|0@5@2&#a,969|@1|0@5@2&#b,}!
+0 s6343|-1 6267 -1
+1 t6266|6266&
+0 s289|&
+3 S_exprTriple{969|@1|0@5@2&#pred,969|@1|0@5@2&#tbranch,969|@1|0@5@2&#fbranch,}!
+0 s6465|-1 6271 -1
+1 t6270|6270&
+0 s290|&
+3 S_exprIter{958|@1|0@5@18@3@0#sname,3769|@1|0@0@2&#args,969|@1|0@5@2&#body,958|@1|0@5@18@3@0#ename,}!
+0 s6496|-1 6275 -1
+1 t6274|6274&
+0 s291|&
+3 S_exprCall{969|@1|0@5@2&#fcn,3769|@1|0@0@2&#args,}!
+0 s6356|-1 6279 -1
+1 t6278|6278&
+0 s292|&
+3 S_exprIterCall{958|@1|0@5@18@2@0#iter,3769|@1|0@0@2&#args,}!
+0 s6361|-1 6283 -1
+1 t6282|6282&
+0 s293|&
+3 S_exprOp{969|@1|0@5@2&#a,969|@1|0@5@2&#b,1763|@1|^#op,}!
+0 s6402|-1 6287 -1
+1 t6286|6286&
+0 s294|&
+3 S_exprField{969|@1|0@5@2&#rec,983|@1|0@5@2&#field,}!
+0 s6389|-1 6291 -1
+1 t6290|6290&
+0 s295|&
+3 S_exprUop{969|@1|0@5@2&#a,1763|@1|^#op,}!
+0 s6344|-1 6295 -1
+1 t6294|6294&
+0 s296|&
+3 S_exprCast{969|@1|0@5@2&#exp,1763|@1|^#tok,4941|@1|0@5@3&#q,}!
+0 s6419|-1 6299 -1
+1 t6298|6298&
+0 s297|&
+3 S_exprInit{969|@1|0@5@2&#exp,963|@1|0@5@3&#id,}!
+0 s6354|-1 6303 -1
+1 t6302|6302&
+0 s298|&
+1 t1763|1763&
+3 U_exprData{983|@1|0@5@3&#literal,983|@1|0@5@3&#id,6305|@1|0@0@3&#tok,4941|@1|0@5@3&#qt,6268|@1|0@0@3&#pair,6288|@1|0@0@3&#op,6296|@1|0@0@3&#uop,6304|@1|0@0@3&#init,6276|@1|0@0@3&#iter,6280|@1|0@0@3&#call,6284|@1|0@0@3&#itercall,6300|@1|0@0@3&#cast,969|@1|0@5@3&#single,6292|@1|0@0@3&#field,6272|@1|0@0@3&#triple,6264|@1|0@0@3&#offset,}!
+0 s6573|-1 6308 -1
+1 t6307|6307&
+0 s299|&
+3 S_exprNode{2|@1|^#isJumpPoint,2|@1|^#canBreak,2|@1|^#mustBreak,985|@1|^#typ,4044|@1|^#exitCode,5019|@1|0@5@3&#val,955|@1|0@5@18@2@0#sref,975|@1|0@5@3&#uses,975|@1|0@5@3&#sets,975|@1|0@5@3&#msets,972|@1|0@5@3&#guards,6260|@1|^#kind,981|@1|0@5@3&#loc,6309|@1|0@3@3&#edata,983|@1|0@5@3&#etext,}!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|@7|0@5@7&#,)!
+3 f972 (969|@7|0@5@7&#,)!
+3 f0 (969|@7|0@5@7&#,)!
+3 f985 (969|@7|0@5@7&#,)!
+3 f0 (969|@7|0@5@7&#,)!
+3 f2 (969|@7|0@5@7&#,)!
+3 f0 (969|@7|0@5@7&#,)!
+3 f2 (969|@7|0@5@7&#,)!
+3 f0 (969|@7|0@5@7&#,)!
+3 f2 (969|@7|0@5@7&#,)!
+3 f0 (969|@7|0@5@7&#,)!
+3 f2 (969|@7|0@5@7&#,)!
+3 f0 (969|@7|0@5@7&#,)!
+3 f2 (969|@7|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f5019 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f983 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f972 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f955 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f958 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f981 (969|0@5@7&#,)!
+3 f0 (4|$#,983|0@5@7&#,981|0@5@2&#,)!
+3 f969 (4|$#,983|0@5@7&#,981|0@5@2&#,)!
+3 f0 ()!
+3 f969 ()!
+3 f0 (969|0@5@4&#,969|0@5@4&#,969|0@5@4&#,)!
+3 f969 (969|0@5@4&#,969|0@5@4&#,969|0@5@4&#,)!
+3 f0 ()!
+3 f969 ()!
+3 f0 (1763|$#,3769|0@0@2&#,)!
+3 f969 (1763|$#,3769|0@0@2&#,)!
+3 f0 (969|0@5@2&#,3769|0@0@2&#,)!
+3 f969 (969|0@5@2&#,3769|0@0@2&#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f969 (958|0@5@19@3@0#,)!
+3 f0 (983|0@5@7&#,)!
+3 f969 (983|0@5@7&#,)!
+3 f0 (969|0@5@2&#,983|0@5@2&#,)!
+3 f969 (969|0@5@2&#,983|0@5@2&#,)!
+3 f0 (969|0@5@2&#,983|0@5@2&#,)!
+3 f969 (969|0@5@2&#,983|0@5@2&#,)!
+3 f0 (969|0@5@2&#,1763|0@0@2&#,)!
+3 f969 (969|0@5@2&#,1763|0@0@2&#,)!
+3 f0 (969|0@5@2&#,1763|0@0@2&#,)!
+3 f969 (969|0@5@2&#,1763|0@0@2&#,)!
+3 f0 (1763|0@0@2&#,969|0@5@2&#,)!
+3 f969 (1763|0@0@2&#,969|0@5@2&#,)!
+3 f0 (4941|0@5@2&#,1834|0@5@2&#,)!
+3 f969 (4941|0@5@2&#,1834|0@5@2&#,)!
+3 f0 (4941|0@5@2&#,)!
+3 f969 (4941|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (4941|0@5@2&#,)!
+3 f969 (4941|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,969|0@5@4&#,1763|0@0@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@4&#,1763|0@0@2&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,1763|0@0@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,1763|0@0@2&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f1 (969|0@5@2&#,)!
+3 f0 (1763|0@0@2&#,969|0@5@2&#,4941|0@5@2&#,)!
+3 f969 (1763|0@0@2&#,969|0@5@2&#,4941|0@5@2&#,)!
+3 f0 (983|0@5@2&#,981|0@5@2&#,)!
+3 f969 (983|0@5@2&#,981|0@5@2&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f969 (983|0@5@2&#,)!
+3 f0 (969|@5|0@5@7&#,)!
+3 f969 (969|@5|0@5@7&#,)!
+3 f0 (969|0@5@2&#,2|$#,)!
+3 f969 (969|0@5@2&#,2|$#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (1763|0@0@2&#,)!
+3 f969 (1763|0@0@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (969|0@5@4&#,969|0@5@4&#,)!
+3 f969 (969|0@5@4&#,969|0@5@4&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f969 (983|0@5@2&#,)!
+3 f0 (1763|0@0@2&#,5|$#,)!
+3 f969 (1763|0@0@2&#,5|$#,)!
+3 f0 (1763|0@0@2&#,5|$#,)!
+3 f969 (1763|0@0@2&#,5|$#,)!
+3 f0 (1763|0@0@2&#,)!
+3 f969 (1763|0@0@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f983 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (963|0@5@2&#,969|0@5@2&#,)!
+3 f969 (963|0@5@2&#,969|0@5@2&#,)!
+3 f0 (985|$#,969|0@5@7&#,)!
+3 f2 (985|$#,969|0@5@7&#,)!
+3 f0 (1763|0@0@2&#,2|$#,)!
+3 f969 (1763|0@0@2&#,2|$#,)!
+3 f0 (958|0@5@19@3@0#,3769|0@0@2&#,969|0@5@2&#,958|0@5@19@3@0#,)!
+3 f969 (958|0@5@19@3@0#,3769|0@0@2&#,969|0@5@2&#,958|0@5@19@3@0#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f969 (958|0@5@19@3@0#,)!
+3 f0 (969|@5|0@5@7&#,)!
+3 f969 (969|@5|0@5@7&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f969 (983|0@5@2&#,)!
+3 f0 (958|0@5@19@3@0#,3769|0@0@2&#,)!
+3 f969 (958|0@5@19@3@0#,3769|0@0@2&#,)!
+3 f0 (985|$#,983|0@5@6&#,981|0@5@2&#,9|$#,)!
+3 f969 (985|$#,983|0@5@6&#,981|0@5@2&#,9|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@4&#,969|0@5@4&#,)!
+3 f969 (969|0@5@4&#,969|0@5@4&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (17|$#,985|$#,983|0@5@7&#,981|0@5@2&#,)!
+3 f969 (17|$#,985|$#,983|0@5@7&#,981|0@5@2&#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f969 (958|0@5@19@3@0#,)!
+3 f0 (1763|0@0@2&#,969|0@5@2&#,4941|0@5@2&#,)!
+3 f969 (1763|0@0@2&#,969|0@5@2&#,4941|0@5@2&#,)!
+3 f0 (985|$#,969|0@5@7&#,)!
+3 f2 (985|$#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,)!
+3 f0 (969|@5|0@5@7&#,)!
+3 f969 (969|@5|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|@5|0@5@7&#,981|0@5@6&#,)!
+3 f969 (969|@5|0@5@7&#,981|0@5@6&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f1 (969|0@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 ()!
+3 f959 ()!
+3 f0 (959|$#,4204|$#,)!
+3 f2 (959|$#,4204|$#,)!
+3 f0 (959|@7|$#,)!
+3 f2 (959|@7|$#,)!
+3 f0 (4204|$#,)!
+3 f959 (4204|$#,)!
+3 f0 (4204|$#,)!
+3 f959 (4204|$#,)!
+3 f0 (959|$#,4204|$#,)!
+3 f959 (959|$#,4204|$#,)!
+3 f0 (959|$#,4204|$#,)!
+3 f959 (959|$#,4204|$#,)!
+3 f0 (959|$#,)!
+3 f983 (959|$#,)!
+3 f0 (959|$#,959|$#,)!
+3 f959 (959|$#,959|$#,)!
+3 f0 (959|$#,959|$#,)!
+3 f5 (959|$#,959|$#,)!
+3 f0 (959|$#,)!
+3 f983 (959|$#,)!
+3 f0 (315|$#,)!
+3 f959 (315|$#,)!
+3 f0 (959|$#,959|$#,)!
+3 f959 (959|$#,959|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+0 s67|-1 6534 -1
+1 t6533|6533&
+3 S_idDeclList{5|@1|^#nelements,5|@1|^#nspace,6534|@1|11@3@3&#elements,}!
+0 s6459|-1 6537 -1
+1 t6536|6536&
+0 a300|&
+3 f1 (6538|@7|&#,963|@3|6@5@19@2@0#,)!
+3 f0 (963|0@5@2&#,)!
+3 f6538 (963|0@5@2&#,)!
+3 f0 (6538|@5|$#,963|0@5@2&#,)!
+3 f6538 (6538|@5|$#,963|0@5@2&#,)!
+3 f0 (6538|$#,)!
+3 f983 (6538|$#,)!
+3 f0 (6538|0@0@2&#,)!
+3 f1 (6538|0@0@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (1490|$#,)!
+3 f1 (1490|$#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (983|0@5@2&#,3890|0@0@2&#,)!
+3 f985 (983|0@5@2&#,3890|0@0@2&#,)!
+3 f0 (983|0@5@6&#,4245|0@5@2&#,)!
+3 f985 (983|0@5@6&#,4245|0@5@2&#,)!
+3 f0 (4245|0@5@2&#,)!
+3 f985 (4245|0@5@2&#,)!
+3 f0 (983|0@5@6&#,4245|0@5@2&#,)!
+3 f985 (983|0@5@6&#,4245|0@5@2&#,)!
+3 f0 (4245|0@5@2&#,)!
+3 f985 (4245|0@5@2&#,)!
+3 f0 (1763|$#,975|0@5@2&#,1763|$#,)!
+3 f1 (1763|$#,975|0@5@2&#,1763|$#,)!
+3 f0 (1763|$#,5070|$#,975|0@5@2&#,1763|$#,)!
+3 f1 (1763|$#,5070|$#,975|0@5@2&#,1763|$#,)!
+3 f0 (3890|0@0@2&#,)!
+3 f985 (3890|0@0@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f985 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f985 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f985 (983|0@5@2&#,)!
+3 f0 (4245|@5|0@5@18&#,)!
+3 f4245 (4245|@5|0@5@18&#,)!
+3 f0 (4245|@5|0@5@18&#,)!
+3 f4245 (4245|@5|0@5@18&#,)!
+3 f0 (6538|0@0@2&#,4941|0@5@7&#,)!
+3 f4245 (6538|0@0@2&#,4941|0@5@7&#,)!
+3 f0 (4941|0@5@7&#,)!
+3 f4245 (4941|0@5@7&#,)!
+3 f0 ()!
+3 f958 ()!
+3 f0 (963|0@5@7&#,)!
+3 f1 (963|0@5@7&#,)!
+3 f0 (963|0@5@2&#,)!
+3 f1 (963|0@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4245|0@5@18&#,)!
+3 f1 (4245|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,)!
+3 f955 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f955 (983|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (4941|0@5@2&#,)!
+3 f1 (4941|0@5@2&#,)!
+3 f0 (4941|0@5@2&#,)!
+3 f1 (4941|0@5@2&#,)!
+3 f0 (3940|$#,)!
+3 f1 (3940|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,983|0@5@2&#,)!
+3 f955 (955|0@5@18&#,983|0@5@2&#,)!
+3 f0 (955|0@5@18&#,983|0@5@2&#,)!
+3 f955 (955|0@5@18&#,983|0@5@2&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f955 (983|0@5@7&#,)!
+3 f0 (955|0@5@18&#,2108|0@5@7&#,)!
+3 f1 (955|0@5@18&#,2108|0@5@7&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f1 (975|0@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,4245|0@5@17&#,)!
+3 f1 (983|0@5@7&#,4245|0@5@17&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f955 (958|0@5@7&#,)!
+3 f0 (4941|0@5@7&#,963|0@5@7&#,)!
+3 f1 (4941|0@5@7&#,963|0@5@7&#,)!
+3 f0 (4941|0@5@7&#,963|0@5@7&#,969|0@5@7&#,)!
+3 f1 (4941|0@5@7&#,963|0@5@7&#,969|0@5@7&#,)!
+3 f0 (963|0@5@2&#,)!
+3 f1 (963|0@5@2&#,)!
+0 s76|-1 6675 -1
+1 t6674|6674&
+3 S_sRefSetList{5|@1|^#nelements,5|@1|^#nspace,6675|@1|11@3@3&#elements,}!
+0 s6460|-1 6678 -1
+1 t6677|6677&
+0 a301|&
+3 f1 (6679|@7|6@5@7&#,975|@3|6@5@19@2@0#,)!
+3 f0 (6679|0@5@7&#,)!
+3 f2 (6679|0@5@7&#,)!
+3 f0 (6679|0@5@7&#,)!
+3 f2 (6679|0@5@7&#,)!
+3 f0 (6679|@5|0@5@7&#,975|0@5@19@2@0#,)!
+3 f6679 (6679|@5|0@5@7&#,975|0@5@19@2@0#,)!
+3 f0 (6679|0@5@2&#,)!
+3 f1 (6679|0@5@2&#,)!
+3 f0 (6679|0@5@7&#,)!
+3 f1 (6679|0@5@7&#,)!
+3 e!72{FMK_LOCALSET,FMK_IGNOREON,FMK_IGNORECOUNT,FMK_IGNOREOFF,FMK_SUPPRESS}!
+0 s6625|&
+0 s302|&
+3 U!73{1289|@1|^#set,5|@1|^#nerrors,}!
+0 s6555|&
+3 S_flagMarker{6693|@1|^#kind,1862|@1|^#code,6694|@1|11@0@0&#info,981|@1|0@5@3&#loc,}!
+0 s6484|-1 6698 -1
+1 t6697|6697&
+0 s303|-1 13209 -1
+3 f0 (6699|$#,)!
+3 f2 (6699|$#,)!
+3 f0 (6699|$#,)!
+3 f2 (6699|$#,)!
+3 f0 (6699|$#,)!
+3 f2 (6699|$#,)!
+3 f0 (6699|$#,)!
+3 f2 (6699|$#,)!
+3 f0 (6699|$#,)!
+3 f2 (6699|$#,)!
+3 f0 (1862|$#,1289|$#,981|0@5@7&#,)!
+3 f6699 (1862|$#,1289|$#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f6699 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f6699 (981|0@5@7&#,)!
+3 f0 (5|$#,981|0@5@7&#,)!
+3 f6699 (5|$#,981|0@5@7&#,)!
+3 f0 (1862|$#,981|0@5@7&#,)!
+3 f6699 (1862|$#,981|0@5@7&#,)!
+3 f0 (6699|0@0@2&#,)!
+3 f1 (6699|0@0@2&#,)!
+3 f0 (6699|$#,981|0@5@7&#,)!
+3 f2 (6699|$#,981|0@5@7&#,)!
+3 f0 (6699|$#,)!
+3 f983 (6699|$#,)!
+3 f0 (6699|$#,981|0@5@7&#,)!
+3 f2 (6699|$#,981|0@5@7&#,)!
+3 f0 (6699|$#,)!
+3 f1289 (6699|$#,)!
+3 f0 (6699|$#,)!
+3 f1862 (6699|$#,)!
+3 f0 (6699|$#,)!
+3 f5 (6699|$#,)!
+3 f0 (6699|$#,)!
+3 f981 (6699|$#,)!
+0 s304|-1 6737 -1
+1 t6736|6736&
+3 S_flagMarkerList{5|@1|^#nelements,5|@1|^#nspace,6737|@1|11@3@3&#elements,}!
+0 s6461|-1 6740 -1
+1 t6739|6739&
+0 a305|&
+3 f0 ()!
+3 f6741 ()!
+3 f0 (6741|$#,)!
+3 f983 (6741|$#,)!
+3 f0 (6741|0@0@2&#,)!
+3 f1 (6741|0@0@2&#,)!
+3 f0 (6741|$#,6699|0@0@2&#,)!
+3 f1 (6741|$#,6699|0@0@2&#,)!
+3 f0 (6741|$#,1862|$#,981|0@5@7&#,)!
+3 f1289 (6741|$#,1862|$#,981|0@5@7&#,)!
+3 f0 (6741|$#,)!
+3 f1 (6741|$#,)!
+3 f0 (6741|$#,981|0@5@7&#,)!
+3 f2 (6741|$#,981|0@5@7&#,)!
+3 S_mce{981|@1|0@5@3&#fl,983|@1|0@5@3&#def,2|@1|^#defined,2|@1|^#scomment,}!
+0 s6478|-1 6758 -1
+1 t6757|6757&
+0 s306|-1 8782 -1
+0 s307|-1 6761 -1
+1 t6760|6760&
+3 S_mcelist{5|@1|^#nspace,5|@1|^#entries,6761|@1|11@0@2&#contents,}!
+0 s6464|-1 6764 -1
+1 t6763|6763&
+0 s308|&
+3 f0 (6765|$#,)!
+3 f1 (6765|$#,)!
+3 f0 (6765|$#,983|0@5@7&#,)!
+3 f981 (6765|$#,983|0@5@7&#,)!
+3 f0 (6765|$#,)!
+3 f983 (6765|$#,)!
+3 f0 ()!
+3 f6765 ()!
+3 f0 (6765|$#,981|0@5@2&#,983|0@5@2&#,)!
+3 f1 (6765|$#,981|0@5@2&#,983|0@5@2&#,)!
+3 f0 (6765|$#,981|0@5@2&#,983|0@5@2&#,)!
+3 f1 (6765|$#,981|0@5@2&#,983|0@5@2&#,)!
+3 f0 (6765|0@0@2&#,)!
+3 f1 (6765|0@0@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 e!74{FILE_NORMAL,FILE_LSLTEMP,FILE_NODELETE,FILE_HEADER,FILE_MACROS}!
+0 s6626|&
+0 s309|&
+3 S_ftentry{2|@1|^#ftemp,2|@1|^#fsystem,2|@1|^#fspecial,983|@1|0@5@3&#fname,983|@1|0@5@3&#basename,6784|@1|^#ftype,1312|@1|^#fder,}!
+0 s6522|-1 6787 -1
+1 t6786|6786&
+0 s310|-1 10343 -1
+0 s311|-1 6790 -1
+1 t6789|6789&
+3 S_fileTable{5|@1|^#nentries,5|@1|^#nspace,3824|@1|0@0@3&#htable,6790|@1|11@0@2&#elements,}!
+0 s6493|-1 6793 -1
+1 t6792|6792&
+0 a312|&
+3 f0 (6794|0@5@7&#,)!
+3 f2 (6794|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,)!
+3 f2 (6794|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f983 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f983 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,)!
+3 f0 ()!
+3 f6794 ()!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f1312 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,983|0@5@2&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@2&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f983 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f2 (6794|0@5@7&#,1312|$#,)!
+3 f0 (1312|$#,)!
+3 f2 (1312|$#,)!
+3 f0 (6794|0@5@7&#,1312|$#,1312|$#,)!
+3 f2 (6794|0@5@7&#,1312|$#,1312|$#,)!
+3 f0 (6794|0@5@7&#,)!
+3 f1 (6794|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,)!
+3 f1 (6794|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,)!
+3 f983 (6794|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f2 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@2&#,)!
+3 f1 (6794|0@5@2&#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f2 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f2 (6794|0@5@7&#,1312|$#,)!
+3 f0 (1312|$#,)!
+3 f983 (1312|$#,)!
+3 f0 (1312|$#,)!
+3 f983 (1312|$#,)!
+3 f0 (1312|$#,)!
+3 f983 (1312|$#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (1312|@7|$#,1312|@7|$#,)!
+3 f2 (1312|@7|$#,1312|@7|$#,)!
+3 S_msgentry{981|@1|0@5@3&#loc,983|@1|0@5@3&#msg,}!
+0 s6375|-1 6861 -1
+1 t6860|6860&
+0 s313|-1 10589 -1
+0 s314|-1 6864 -1
+1 t6863|6863&
+3 S_messageLog{5|@1|^#nelements,5|@1|^#nspace,6864|@1|11@0@2&#elements,}!
+0 s6462|-1 6867 -1
+1 t6866|6866&
+0 a315|&
+3 f0 (6868|0@5@7&#,)!
+3 f2 (6868|0@5@7&#,)!
+3 f0 ()!
+3 f6868 ()!
+3 f0 (6868|0@5@7&#,981|0@5@7&#,983|0@5@7&#,)!
+3 f2 (6868|0@5@7&#,981|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6868|0@5@7&#,)!
+3 f983 (6868|0@5@7&#,)!
+3 f0 (6868|0@5@2&#,)!
+3 f1 (6868|0@5@2&#,)!
+1 t1778|1778&
+3 S_clauseStack{5|@1|^#nelements,5|@1|^#nspace,5|@1|^#current,6879|@1|11@0@3&#elements,}!
+0 s6491|-1 6882 -1
+1 t6881|6881&
+0 a316|&
+3 f1 (6883|@7|&#,1778|@3|&#,)!
+3 f0 (6883|$#,)!
+3 f5 (6883|$#,)!
+3 f0 (6883|$#,)!
+3 f2 (6883|$#,)!
+3 f0 ()!
+3 f6883 ()!
+3 f0 (6883|$#,1778|$#,)!
+3 f1 (6883|$#,1778|$#,)!
+3 f0 (6883|$#,)!
+3 f1 (6883|$#,)!
+3 f0 (6883|$#,)!
+3 f1778 (6883|$#,)!
+3 f0 (6883|$#,)!
+3 f983 (6883|$#,)!
+3 f0 (6883|0@0@2&#,)!
+3 f1 (6883|0@0@2&#,)!
+3 f0 (6883|$#,)!
+3 f1 (6883|$#,)!
+3 f0 (6883|$#,1778|$#,)!
+3 f1 (6883|$#,1778|$#,)!
+3 f0 (6883|$#,1778|$#,)!
+3 f1 (6883|$#,1778|$#,)!
+3 f0 (6883|$#,)!
+3 f5 (6883|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 ()!
+3 f19 ()!
+3 f23 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1862 ()!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 (975|0@5@18&#,)!
+3 f1 (975|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (4204|$#,)!
+3 f2 (4204|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f6794 ()!
+3 f0 ()!
+3 f6868 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f959 ()!
+3 f0 (4204|$#,)!
+3 f1 (4204|$#,)!
+3 f0 (4204|$#,)!
+3 f1 (4204|$#,)!
+3 f0 ()!
+3 f4245 ()!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f985 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@18@2@0#,)!
+3 f1 (958|0@5@18@2@0#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f1 (958|0@5@19@3@0#,)!
+3 f0 (958|0@5@19@2@0#,)!
+3 f1 (958|0@5@19@2@0#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 ()!
+3 f4327 ()!
+3 f0 (4204|$#,)!
+3 f2 (4204|$#,)!
+3 f0 (4204|$#,)!
+3 f2 (4204|$#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 (981|0@5@7&#,)!
+3 f1 (981|0@5@7&#,)!
+3 f0 (1862|$#,2|$#,)!
+3 f1 (1862|$#,2|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (1862|$#,)!
+3 f5 (1862|$#,)!
+3 f0 (1862|$#,5|$#,)!
+3 f1 (1862|$#,5|$#,)!
+3 f0 (1862|$#,)!
+3 f5 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 (1862|$#,983|0@5@2&#,)!
+3 f1 (1862|$#,983|0@5@2&#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,2|$#,)!
+3 f1 (1862|$#,2|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f975 ()!
+3 f0 ()!
+3 f958 ()!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f985 ()!
+3 f0 ()!
+3 f985 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@18@3@0#,)!
+3 f1 (958|0@5@18@3@0#,)!
+3 f0 ()!
+3 f4 ()!
+3 f0 (4|$#,)!
+3 f1 (4|$#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f981 ()!
+3 f0 (1312|$#,)!
+3 f1 (1312|$#,)!
+3 f0 (1312|$#,5|$#,)!
+3 f1 (1312|$#,5|$#,)!
+3 f0 (1862|$#,1289|$#,)!
+3 f1 (1862|$#,1289|$#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f985 ()!
+3 f0 (958|0@5@19@3@0#,)!
+3 f1 (958|0@5@19@3@0#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f1 (958|0@5@19@3@0#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f4327 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (1862|$#,981|0@5@7&#,)!
+3 f2 (1862|$#,981|0@5@7&#,)!
+3 f0 (1862|$#,981|0@5@7&#,)!
+3 f2 (1862|$#,981|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,2|$#,)!
+3 f1 (969|0@5@7&#,2|$#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (955|0@5@18@3@0#,955|0@5@18@3@0#,)!
+3 f1 (955|0@5@18@3@0#,955|0@5@18@3@0#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1778 ()!
+3 f0 ()!
+3 f1778 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 (4327|0@5@18&#,)!
+3 f1 (4327|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+0 s6545|&
+0 s317|-1 7364 -1
+0 s6547|-1 7551 -1
+0 s318|-1 7393 -1
+0 s6527|-1 7487 -1
+0 s319|-1 7499 -1
+3 ecpp_token{CPP_EOF,CPP_OTHER,CPP_COMMENT,CPP_HSPACE,CPP_VSPACE,CPP_NAME,CPP_NUMBER,CPP_CHAR,CPP_STRING,CPP_DIRECTIVE,CPP_LPAREN,CPP_RPAREN,CPP_LBRACE,CPP_RBRACE,CPP_COMMA,CPP_SEMICOLON,CPP_3DOTS,CPP_POP}!
+0 s6627|&
+0 s6546|&
+0 s321|-1 7358 -1
+3 f0 (983|0@5@18&#,983|0@5@18&#,)!
+3 f5 (983|0@5@18&#,983|0@5@18&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+0 s320|-1 7385 -1
+3 ?!
+1 t7341|7341&
+3 f7357 (7358|$#,)!
+3 f7339 (7358|$#,)^7361
+1 t7360|7360&
+0 s322|&
+3 ?!
+1 t7333|7333&
+3 f7363 (7364|$#,7358|$#,)!
+3 f1 (7364|$#,7358|$#,)^7367
+1 t7366|7366&
+0 s323|&
+0 s6407|-1 7370 -1
+1 t7369|7369 7957 -1
+3 Sparse_marker{7364|@1|0@0@18&#buf,7370|@1|0@5@18&#next,5|@1|^#position,}!
+0 s6512|-1 7373 -1
+1 t7372|7372&
+3 Sarglist{7373|@1|0@5@3&#next,23|@1|0@0@18&#name,5|@1|^#length,5|@1|^#argno,5|@1|^#rest_args,}!
+3 f0 (7358|$#,)!
+3 f7339 (7358|$#,)!
+3 C1.5/1|!
+3 f0 (7358|$#,)!
+3 f5 (7358|$#,)!
+3 f7377 (7358|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+0 s6519|-1 7384 -1
+1 t7383|7383&
+1 t7356|7356 7897 -1
+0 s6520|-1 7387 -1
+1 t7386|7386&
+3 ScppBuffer{23|@1|0@5@2&#buf,23|@1|0@5@18@2@0#cur,23|@1|0@5@18@2@0#rlimit,23|@1|0@5@18@2@0#alimit,23|@1|0@5@18@2@0#prev,983|@1|0@5@18&#fname,983|@1|0@5@18@2@0#nominal_fname,7384|@1|0@5@18&#dir,9|@1|^#line_base,5|@1|^#lineno,5|@1|^#colno,7362|@1|0@0@3&#underflow,7368|@1|0@0@3&#cleanup,7385|@1|0@0@18&#hnode,7370|@1|0@5@18&#marks,7387|@1|0@5@18@2@0#if_stack,4|@1|^#system_header_p,4|@1|^#seen_eof,2|@1|^#has_escapes,}!
+0 s6337|&
+0 s6430|-1 7422 -1
+2 F0/0|0&
+2 F7333/0|7333&
+1 t7335|7335&
+3 ScppReader{7362|@1|0@0@3&#get_token,7364|@1|0@5@18&#buffer,7392|@1|^#buffer_stack,5|@1|^#errors,7393|@1|0@0@3&#opts,23|@1|0@3@3&#token_buffer,63|@1|^#token_buffer_size,23|@1|0@0@18@2@0#limit,5|@1|^#multiline_string_line,5|@1|^#system_include_depth,7384|@1|0@5@17&#all_include_files,5|@1|^#max_include_len,7387|@1|0@5@3&#if_stack,4|@1|^#pcp_inside_if,4|@1|^#input_stack_listing_current,2|@1|^#no_macro_expand,2|@1|^#show_column,4|@1|^#parsing_include_directive,4|@1|^#output_escapes,4|@1|^#only_seen_white,5|@1|^#lineno,445|@1|0@5@18@3@0#timebuf,}!
+3 f0 (7358|$#,)!
+3 f2 (7358|$#,)!
+3 f0 (7364|$#,)!
+3 f5 (7364|$#,)!
+3 f0 (7358|@7|$#,)!
+3 f63 (7358|@7|$#,)!
+3 f0 (7358|$#,)!
+3 f19 (7358|$#,)!
+3 f23 (7358|$#,)!
+3 f0 (7358|@7|$#,63|@7|$#,)!
+3 f1 (7358|@7|$#,63|@7|$#,)!
+3 f0 (7358|@7|$#,23|0@0@9&#,63|@7|$#,)!
+3 f1 (7358|@7|$#,23|0@0@9&#,63|@7|$#,)!
+3 f0 (7358|@7|15@0@1&#,63|$#,)!
+3 f1 (7358|@7|15@0@1&#,63|$#,)!
+3 f0 (7358|15@0@1&#,)!
+3 f19 (7358|15@0@1&#,)!
+3 f7393 (7358|15@0@1&#,)!
+3 f0 (7358|15@0@1&#,)!
+3 f19 (7358|15@0@1&#,)!
+3 f7364 (7358|15@0@1&#,)!
+3 f0 (7364|$#,)!
+3 f19 (7364|$#,)!
+3 f7364 (7364|$#,)!
+3 f0 (7358|15@0@1&#,)!
+3 f19 (7358|15@0@1&#,)!
+3 f7364 (7358|15@0@1&#,)!
+1 t7390|7390&
+3 e!75{DUMP_NONE,DUMP_NAMES,DUMP_DEFINITIONS}!
+0 s6629|&
+3 ScppOptions{983|@1|0@5@18&#in_fname,983|@1|0@5@18&#out_fname,7422|@1|0@0@3&#map_list,2|@1|^#verbose,2|@1|^#cplusplus,2|@1|^#cplusplus_comments,5|@1|^#lang_asm,2|@1|^#for_lint,2|@1|^#chill,2|@1|^#put_out_comments,2|@1|^#no_trigraphs,2|@1|^#print_include_names,2|@1|^#pedantic_errors,2|@1|^#inhibit_warnings,2|@1|^#warn_comments,2|@1|^#warn_stringify,2|@1|^#warnings_are_errors,2|@1|^#no_output,2|@1|^#no_line_commands,4|@1|^#output_conditionals,4|@1|^#ignore_srcdir,2|@1|^#dollars_in_ident,2|@1|^#traditional,2|@1|^#c89,2|@1|^#pedantic,2|@1|^#done_initializing,7384|@1|0@0@17&#include,7384|@1|0@0@18&#first_bracket_include,7384|@1|0@0@18&#first_system_include,7384|@1|0@0@18@2@0#last_include,7384|@1|0@0@3&#after_include,7384|@1|0@0@18@2@0#last_after_include,7384|@1|0@0@3&#before_system,7384|@1|0@0@18@2@0#last_before_system,23|@1|0@0@3&#include_prefix,4|@1|^#inhibit_predefs,4|@1|^#no_standard_includes,4|@1|^#no_standard_cplusplus_includes,7424|@1|^#dump_macros,5|@1|^#debug_output,}!
+3 f0 (7358|15@0@1&#,)!
+3 f2 (7358|15@0@1&#,)!
+3 f0 (7358|$#,)!
+3 f2 (7358|$#,)!
+3 enode_type{T_NONE,T_DEFINE,T_INCLUDE,T_INCLUDE_NEXT,T_IFDEF,T_IFNDEF,T_IF,T_ELSE,T_PRAGMA,T_ELIF,T_UNDEF,T_LINE,T_ERROR,T_WARNING,T_ENDIF,T_IDENT,T_SPECLINE,T_DATE,T_FILE,T_BASE_FILE,T_INCLUDE_LEVEL,T_VERSION,T_SIZE_TYPE,T_PTRDIFF_TYPE,T_WCHAR_TYPE,T_USER_LABEL_PREFIX_TYPE,T_REGISTER_PREFIX_TYPE,T_TIME,T_CONST,T_MACRO,T_DISABLED,T_SPEC_DEFINED,T_PCSTRING,T_UNUSED}!
+0 s6628|&
+0 s6409|&
+0 s326|&
+0 s6532|-1 7435 -1
+1 t7434|7434&
+3 Smacrodef{7435|@1|0@5@3&#defn,23|@1|0@3@18&#symnam,5|@1|^#symlen,}!
+0 s327|-1 7484 -1
+0 s6526|-1 7439 -1
+1 t7438|7438 8055 -1
+3 Sreflist{7439|@1|0@5@18&#next,2|@1|^#stringify,2|@1|^#raw_before,2|@1|^#raw_after,2|@1|^#rest_args,5|@1|^#nchars,5|@1|^#argno,}!
+3 U!76{23|@1|0@5@3&#argnames,}!
+0 s6549|&
+3 Sdefinition{5|@1|^#nargs,63|@1|^#length,2|@1|^#predefined,23|@1|0@0@18&#expansion,9|@1|^#line,983|@1|0@5@18@2@0#file,2|@1|^#noExpand,2|@1|^#rest_args,7439|@1|0@5@3&#pattern,7441|@1|^#args,}!
+3 Sif_stack{7387|@1|0@5@3&#next,983|@1|0@5@18@3@0#fname,5|@1|^#lineno,5|@1|^#if_succeeded,23|@1|0@5@18&#control_macro,7431|@1|^#type,}!
+0 s325|-1 7918 -1
+3 f0 (7364|0@5@7&#,24|4@0@7&#,24|4@5@7&#,)!
+3 f1 (7364|0@5@7&#,24|4@0@7&#,24|4@5@7&#,)!
+3 f0 (7358|$#,)!
+3 f19 (7358|$#,)!
+3 f7364 (7358|$#,)!
+3 f0 (7358|$#,63|$#,)!
+3 f1 (7358|$#,63|$#,)!
+3 f0 (7358|$#,315|$#,)!
+3 f5 (7358|$#,315|$#,)!
+3 f0 (7358|$#,)!
+3 f19 (7358|$#,)!
+3 f7364 (7358|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+0 s6431|-1 7461 -1
+1 t7460|7460&
+3 Sfile_name_list{7384|@1|0@5@17&#next,983|@1|0@5@18&#fname,23|@1|0@5@18&#control_macro,2|@1|^#c_system_include_path,7461|@1|11@3@18@2@0#name_map,2|@1|^#got_name_map,}!
+3 f0 (7358|15@0@1&#,7384|0@0@4&#,)!
+3 f1 (7358|15@0@1&#,7384|0@0@4&#,)!
+3 f0 (7358|$#,23|$#,)!
+3 f1 (7358|$#,23|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|4@0@7&#,)!
+3 f1 (7358|4@0@7&#,)!
+3 f0 (7393|4@0@7&#,)!
+3 f1 (7393|4@0@7&#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f5 (7358|$#,983|0@5@7&#,)!
+3 f0 (4|$#,)!
+3 f2 (4|$#,)!
+3 f0 (7358|$#,23|$#,983|0@5@7&#,)!
+3 f5 (7358|$#,23|$#,983|0@5@7&#,)!
+0 s6513|-1 8030 -1
+3 f0 (7358|$#,23|$#,5|$#,)!
+3 f7481 (7358|$#,23|$#,5|$#,)!
+1 t7437|7437&
+3 Uhashval{5|@1|^#ival,23|@1|0@0@17&#cpval,7484|@1|0@0@17&#defn,}!
+0 s6558|&
+1 t7336|7336 7488 -1
+1 t7487|7487&
+3 Shashnode{7487|@1|0@5@2&#next,7487|@1|0@5@18&#prev,7488|@1|0@0@18&#bucket_hdr,7431|@1|^#type,5|@1|^#length,983|@1|0@5@3&#name,7486|@1|^#value,}!
+3 f0 (7385|0@0@19@2@0#,)!
+3 f1 (7385|0@0@19@2@0#,)!
+3 f0 (23|$#,5|$#,7431|$#,5|$#,23|0@5@2&#,5|$#,)!
+3 f19 (23|$#,5|$#,7431|$#,5|$#,23|0@5@2&#,5|$#,)!
+3 f7385 (23|$#,5|$#,7431|$#,5|$#,23|0@5@2&#,5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (23|$#,5|$#,5|$#,)!
+3 f19 (23|$#,5|$#,5|$#,)!
+1 t7337|7337&
+3 f7499 (23|$#,5|$#,5|$#,)!
+3 f0 (23|$#,5|$#,5|$#,)!
+3 f19 (23|$#,5|$#,5|$#,)!
+3 f7499 (23|$#,5|$#,5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (23|$#,5|$#,5|$#,)!
+3 f5 (23|$#,5|$#,5|$#,)!
+3 f0 (23|$#,5|$#,7435|0@0@2&#,5|$#,)!
+3 f19 (23|$#,5|$#,7435|0@0@2&#,5|$#,)!
+3 f7385 (23|$#,5|$#,7435|0@0@2&#,5|$#,)!
+3 f0 (7358|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f1 (7358|$#,983|0@5@7&#,)!
+3 f0 (7358|$#,983|0@5@19@3@0#,)!
+3 f1 (7358|$#,983|0@5@19@3@0#,)!
+3 f0 (7358|$#,5|$#,5|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,5|$#,5|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,983|0@5@19@3@0#,)!
+3 f1 (7358|$#,983|0@5@19@3@0#,)!
+3 f0 (7358|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,983|0@5@19@3@0#,)!
+3 f1 (7358|$#,983|0@5@19@3@0#,)!
+3 f0 (7358|$#,9|$#,9|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,9|$#,9|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f1 (7358|$#,983|0@5@7&#,)!
+3 f0 (5|$#,856|$#,)!
+3 f5 (5|$#,856|$#,)!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f1 ()!
+1 t7334|7334&
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@18&#,983|0@5@18&#,)!
+3 f5 (983|0@5@18&#,983|0@5@18&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (7358|$#,)!
+3 f9 (7358|$#,)!
+3 e!77{OSD_FILEFOUND,OSD_FILENOTFOUND,OSD_PATHTOOLONG}!
+0 s6630|&
+0 s328|&
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (23|$#,23|$#,315|4@0@7&#,)!
+3 f7576 (23|$#,23|$#,315|4@0@7&#,)!
+3 f0 (23|$#,23|$#,315|4@0@7&#,)!
+3 f7576 (23|$#,23|$#,315|4@0@7&#,)!
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 (23|$#,23|@5|$#,)!
+3 f19 (23|$#,23|@5|$#,)!
+3 f23 (23|$#,23|@5|$#,)!
+3 f0 (23|$#,315|4@0@7&#,)!
+3 f7576 (23|$#,315|4@0@7&#,)!
+3 f0 ()!
+3 f19 ()!
+3 f23 ()!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (23|$#,)!
+3 f983 (23|$#,)!
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 (4|$#,)!
+3 f2 (4|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (7358|$#,5|$#,)!
+3 f1 (7358|$#,5|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|$#,7370|$#,)!
+3 f7339 (7358|$#,7370|$#,)!
+3 f0 (7358|$#,23|$#,)!
+3 f2 (7358|$#,23|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+2 F0/256|0&
+2 F2/256|982&
+2 F0/256|0&
+2 F2/256|982&
+2 F0/256|0&
+2 F2/256|982&
+2 F0/256|0&
+2 F2/256|982&
+3 f0 (7358|15@0@1&#,)!
+3 f19 (7358|15@0@1&#,)!
+3 f7364 (7358|15@0@1&#,)!
+3 f0 (7358|$#,5|$#,)!
+3 f5 (7358|$#,5|$#,)!
+3 f0 (7364|@7|$#,)!
+3 f5 (7364|@7|$#,)!
+3 f0 (7358|@7|$#,23|$#,63|@7|$#,)!
+3 f1 (7358|@7|$#,23|$#,63|@7|$#,)!
+3 f0 (7358|$#,4|$#,)!
+3 f1 (7358|$#,4|$#,)!
+3 f0 (7358|@7|$#,4|$#,)!
+3 f1 (7358|@7|$#,4|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|@7|$#,)!
+3 f1 (7358|@7|$#,)!
+3 f0 (7358|$#,63|$#,)!
+3 f1 (7358|$#,63|$#,)!
+3 f0 (7358|$#,)!
+3 f2 (7358|$#,)!
+3 f0 (7358|$#,)!
+3 f19 (7358|$#,)!
+3 f23 (7358|$#,)!
+3 f0 (7364|$#,5|$#,)!
+3 f1 (7364|$#,5|$#,)!
+3 f0 (7358|$#,5|$#,)!
+3 f1 (7358|$#,5|$#,)!
+3 f0 (7358|$#,)!
+3 f5 (7358|$#,)!
+3 f0 (7358|$#,)!
+3 f5 (7358|$#,)!
+3 f0 (7370|4@0@7&#,7358|$#,)!
+3 f1 (7370|4@0@7&#,7358|$#,)!
+3 f0 (7370|$#,)!
+3 f1 (7370|$#,)!
+3 f0 (7370|$#,7358|$#,)!
+3 f1 (7370|$#,7358|$#,)!
+3 f0 (7370|$#,7358|$#,)!
+3 f1 (7370|$#,7358|$#,)!
+3 f0 (7364|@7|$#,)!
+3 f19 (7364|@7|$#,)!
+3 f23 (7364|@7|$#,)!
+3 f0 (7358|$#,23|0@5@17&#,63|$#,)!
+3 f19 (7358|$#,23|0@5@17&#,63|$#,)!
+3 f7364 (7358|$#,23|0@5@17&#,63|$#,)!
+3 f0 (7358|$#,7384|0@0@4&#,7384|0@0@18&#,)!
+3 f1 (7358|$#,7384|0@0@4&#,7384|0@0@18&#,)!
+3 f0 (7364|$#,7358|$#,)!
+3 f1 (7364|$#,7358|$#,)!
+3 f0 (7358|$#,)!
+3 f7339 (7358|$#,)!
+3 f0 (7364|$#,7358|$#,)!
+3 f1 (7364|$#,7358|$#,)!
+3 f0 (7364|$#,7358|$#,)!
+3 f1 (7364|$#,7358|$#,)!
+3 f0 (7358|$#,)!
+3 f5 (7358|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+1 t659|659&
+1 t63|63&
+3 f0 (5|$#,7689|4@0@7&#,7690|4@0@7&#,)!
+3 f5 (5|$#,7689|4@0@7&#,7690|4@0@7&#,)!
+3 f0 (5|$#,23|4@0@7&#,5|$#,)!
+3 f5 (5|$#,23|4@0@7&#,5|$#,)!
+3 f0 (7364|0@5@7&#,)!
+3 f2 (7364|0@5@7&#,)!
+3 f0 (7358|$#,23|$#,)!
+3 f1 (7358|$#,23|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7551|$#,)!
+3 f1 (7551|$#,)!
+3 C1.5/1|!
+3 f0 (7358|$#,5|$#,983|0@5@7&#,2|$#,7384|0@5@18&#,)!
+3 f5 (7358|$#,5|$#,983|0@5@7&#,2|$#,7384|0@5@18&#,)!
+3 f7703 (7358|$#,5|$#,983|0@5@7&#,2|$#,7384|0@5@18&#,)!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f1 (7358|$#,983|0@5@7&#,)!
+3 f0 (7358|$#,5|$#,7431|$#,23|0@5@18&#,)!
+3 f1 (7358|$#,5|$#,7431|$#,23|0@5@18&#,)!
+3 f0 (7358|$#,23|$#,5|$#,)!
+3 f9 (7358|$#,23|$#,5|$#,)!
+3 f0 (7358|$#,5|$#,)!
+3 f1 (7358|$#,5|$#,)!
+3 f0 (2|$#,23|$#,5|$#,23|$#,5|$#,2|$#,)!
+3 f2 (2|$#,23|$#,5|$#,23|$#,5|$#,2|$#,)!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f2 (7358|$#,983|0@5@7&#,)!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f2 (7358|$#,983|0@5@7&#,)!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f19 (7358|$#,983|0@5@7&#,)!
+3 f7461 (7358|$#,983|0@5@7&#,)!
+3 f0 (5|$#,213|$#,)!
+3 f983 (5|$#,213|$#,)!
+3 f0 (7358|$#,983|0@5@17&#,7384|0@5@7&#,)!
+3 f5 (7358|$#,983|0@5@17&#,7384|0@5@7&#,)!
+3 f0 (7358|$#,23|0@0@17&#,63|$#,7385|0@0@18&#,)!
+3 f1 (7358|$#,23|0@0@17&#,63|$#,7385|0@0@18&#,)!
+3 efile_change_code{same_file,enter_file,leave_file}!
+0 s6631|&
+3 ?!
+3 f7732 ()!
+3 f5 ()^7735
+1 t7734|7734&
+3 Sdirective{5|@1|^#length,!7735@6@5@1@0@0$$@0#func,983|@1|0@5@18@3@0#name,7431|@1|^#type,2|@1|^#command_reads_line,2|@1|^#traditional_comments,2|@1|^#pass_thru,}!
+0 s6524|-1 7738 7770
+1 t7737|7737&
+3 f0 (7358|$#,7738|0@5@7&#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|0@5@7&#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|0@5@7&#,23|$#,23|$#,2|$#,)!
+3 f5 (7358|$#,7738|0@5@7&#,23|$#,23|$#,2|$#,)!
+3 f0 (7358|$#,7738|0@5@7&#,)!
+3 f5 (7358|$#,7738|0@5@7&#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 Sdefault_include{983|@1|0@5@18@3@0#fname,5|@1|^#cplusplus,5|@1|^#cxx_aware,}!
+0 s6420|-1 7964 7769
+2 y7768|7768&
+2 y7737|7737&
+3 f0 (7551|$#,)!
+3 f1 (7551|$#,)!
+3 f0 (4|$#,)!
+3 f2 (4|$#,)!
+3 f0 (7358|$#,23|$#,)!
+3 f1 (7358|$#,23|$#,)!
+3 f0 (7358|$#,63|$#,)!
+3 f1 (7358|$#,63|$#,)!
+3 f0 (7358|$#,23|$#,)!
+3 f1 (7358|$#,23|$#,)!
+3 f0 (7358|$#,7384|0@0@4&#,7384|0@0@18&#,)!
+3 f1 (7358|$#,7384|0@0@4&#,7384|0@0@18&#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|15@0@1&#,7384|0@0@4&#,)!
+3 f1 (7358|15@0@1&#,7384|0@0@4&#,)!
+3 f0 (7358|$#,23|$#,)!
+3 f1 (7358|$#,23|$#,)!
+3 f0 (7393|4@0@7&#,)!
+3 f1 (7393|4@0@7&#,)!
+3 f0 (7358|$#,)!
+3 f7339 (7358|$#,)!
+3 f0 (7364|$#,7358|$#,)!
+3 f1 (7364|$#,7358|$#,)!
+3 f0 (7364|$#,7358|$#,)!
+3 f1 (7364|$#,7358|$#,)!
+3 f0 (7364|$#,7358|$#,)!
+3 f1 (7364|$#,7358|$#,)!
+3 f0 (7358|$#,28|0@5@7&#,)!
+3 f5 (7358|$#,28|0@5@7&#,)!
+3 C1.5/1|!
+3 f0 (7358|$#,)!
+3 f5 (7358|$#,)!
+3 f7801 (7358|$#,)!
+3 f7377 (7358|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|$#,)!
+3 f5 (7358|$#,)!
+3 f0 (23|$#,23|$#,7358|$#,7738|$#,)!
+3 f1 (23|$#,23|$#,7358|$#,7738|$#,)!
+3 f0 (7358|$#,23|$#,23|$#,5|$#,7373|0@5@7&#,)!
+3 f19 (7358|$#,23|$#,23|$#,5|$#,7373|0@5@7&#,)!
+3 f7484 (7358|$#,23|$#,23|$#,5|$#,7373|0@5@7&#,)!
+3 f0 (23|$#,23|$#,7358|$#,2|$#,2|$#,)!
+3 f7433 (23|$#,23|$#,7358|$#,2|$#,2|$#,)!
+3 f0 (7358|$#,23|$#,983|0@5@7&#,)!
+3 f5 (7358|$#,23|$#,983|0@5@7&#,)!
+3 f0 (7484|$#,7484|$#,)!
+3 f2 (7484|$#,7484|$#,)!
+3 f0 (2|$#,23|$#,5|$#,23|$#,5|$#,2|$#,)!
+3 f2 (2|$#,23|$#,5|$#,23|$#,5|$#,2|$#,)!
+3 f0 (7358|$#,7738|0@5@7&#,23|$#,23|$#,2|$#,)!
+3 f5 (7358|$#,7738|0@5@7&#,23|$#,23|$#,2|$#,)!
+3 f0 (7358|$#,7738|0@5@7&#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|0@5@7&#,23|$#,23|$#,)!
+3 Sargdata{9|@1|^#raw,63|@1|^#expanded,63|@1|^#stringified,5|@1|^#raw_length,5|@1|^#expand_length,5|@1|^#stringified_length,2|@1|^#newlines,5|@1|^#use_count,}!
+0 s6529|-1 7876 -1
+3 f0 (7358|$#,23|$#,63|$#,)!
+3 f19 (7358|$#,23|0@5@17&#,63|$#,)!
+3 f7364 (7358|$#,23|0@5@17&#,63|$#,)!
+3 f0 (7358|$#,)!
+3 f19 (7358|$#,)!
+3 f7364 (7358|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|$#,23|$#,63|$#,)!
+3 f1 (7358|$#,23|$#,63|$#,)!
+3 f0 (23|$#,23|$#,24|$#,24|$#,)!
+3 f1 (23|$#,23|$#,24|$#,24|$#,)!
+3 f0 (7364|$#,)!
+3 f1 (7364|$#,)!
+3 f0 (7364|0@5@7&#,24|4@0@7&#,24|4@5@7&#,)!
+3 f1 (7364|0@5@7&#,24|4@0@7&#,24|4@5@7&#,)!
+3 f0 (7358|$#,)!
+3 f19 (7358|$#,)!
+3 f7364 (7358|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f9 (23|$#,23|$#,)!
+3 f0 (7358|$#,2|$#,7731|$#,)!
+3 f1 (7358|$#,2|$#,7731|$#,)!
+3 f0 (7358|$#,5|$#,)!
+3 f7339 (7358|$#,5|$#,)!
+3 f0 (23|$#,5|$#,)!
+3 f5 (23|$#,5|$#,)!
+3 f0 (7358|@5|$#,)!
+3 f19 (7358|@5|$#,)!
+3 f445 (7358|@5|$#,)!
+2 y1061|1061&
+3 f0 (7385|$#,7358|$#,)!
+3 f1 (7385|$#,7358|$#,)!
+3 f0 (7358|$#,23|$#,)!
+3 f1 (7358|$#,23|$#,)!
+3 f0 (23|0@0@19@3@0#,985|$#,5|$#,7431|$#,5|$#,23|0@5@2&#,5|$#,)!
+3 f1 (23|0@0@19@3@0#,985|$#,5|$#,7431|$#,5|$#,23|0@5@2&#,5|$#,)!
+3 f0 (23|0@0@19@3@0#,985|$#,5|$#,7431|$#,5|$#,23|0@5@2&#,5|$#,)!
+3 f1 (23|0@0@19@3@0#,985|$#,5|$#,7431|$#,5|$#,23|0@5@2&#,5|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (4|$#,4|$#,)!
+3 f2 (4|$#,4|$#,)!
+3 f0 (7358|$#,7385|0@0@18&#,)!
+3 f1 (7358|$#,7385|0@0@18&#,)!
+1 t7830|7830&
+3 f0 (7358|$#,23|0@0@17&#,63|$#,7385|0@0@18&#,)!
+3 f1 (7358|$#,23|0@0@17&#,63|$#,7385|0@0@18&#,)!
+3 f0 (7358|$#,)!
+3 f7339 (7358|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+2 F0/1|0&
+2 F7383/1|7383&
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f2 (7358|$#,983|0@5@7&#,)!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f2 (7358|$#,983|0@5@7&#,)!
+3 f0 (7358|$#,23|@5|$#,23|$#,23|$#,5|$#,)!
+3 f19 (7358|$#,23|@5|$#,23|$#,23|$#,5|$#,)!
+3 f23 (7358|$#,23|@5|$#,23|$#,23|$#,5|$#,)!
+3 f0 (7358|$#,7738|0@5@7&#,)!
+3 f5 (7358|$#,7738|0@5@7&#,)!
+2 F0/0|0&
+2 F19/0|19&
+2 F7385/0|7385&
+1 t7385|7385&
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,23|$#,5|$#,)!
+3 f9 (7358|$#,23|$#,5|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,5|$#,7431|$#,23|0@5@18&#,)!
+3 f1 (7358|$#,5|$#,7431|$#,23|0@5@18&#,)!
+1 t7445|7445&
+3 f0 (7358|$#,5|$#,)!
+3 f1 (7358|$#,5|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f5 (7358|$#,7738|$#,23|$#,23|$#,)!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f1 (7358|$#,983|0@5@7&#,)!
+3 f0 (7358|$#,)!
+3 f7339 (7358|$#,)!
+3 f0 (7358|$#,5|$#,)!
+3 f1 (7358|$#,5|$#,)!
+3 Sfile_name_map{7461|@1|0@0@3&#map_next,983|@1|0@5@3&#map_from,983|@1|0@5@3&#map_to,}!
+3 f0 (5|$#,213|$#,)!
+3 f983 (5|$#,213|$#,)!
+3 Sfile_name_map_list{7422|@1|0@0@3&#map_list_next,983|@1|0@5@3&#map_list_name,7461|@1|0@0@3&#map_list_map,}!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f19 (7358|$#,983|0@5@7&#,)!
+3 f7461 (7358|$#,983|0@5@7&#,)!
+3 f0 (7358|$#,983|0@5@17&#,7384|0@5@7&#,)!
+3 f5 (7358|$#,983|0@5@17&#,7384|0@5@7&#,)!
+3 f0 (7358|$#,5|$#,983|0@5@7&#,2|$#,7384|0@5@18&#,)!
+3 f5 (7358|$#,5|$#,983|0@5@7&#,2|$#,7384|0@5@18&#,)!
+3 f7703 (7358|$#,5|$#,983|0@5@7&#,2|$#,7384|0@5@18&#,)!
+3 f0 (7358|4@0@7&#,)!
+3 f1 (7358|4@0@7&#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (5|$#,7689|4@0@7&#,7690|4@0@7&#,)!
+3 f5 (5|$#,7689|4@0@7&#,7690|4@0@7&#,)!
+3 f0 (5|$#,23|4@0@7&#,5|$#,)!
+3 f5 (5|$#,23|4@0@7&#,5|$#,)!
+3 f0 (7370|4@0@7&#,7358|$#,)!
+3 f1 (7370|4@0@7&#,7358|$#,)!
+3 f0 (7370|$#,)!
+3 f1 (7370|$#,)!
+1 t7370|7370&
+3 f0 (7370|$#,7358|$#,)!
+3 f1 (7370|$#,7358|$#,)!
+3 f0 (7370|$#,7358|$#,)!
+3 f1 (7370|$#,7358|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+1 t7768|7768&
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f5 (7358|$#,983|0@5@7&#,)!
+3 f0 (7358|$#,)!
+3 f19 (7358|15@0@1&#,)!
+3 f7364 (7358|15@0@1&#,)!
+3 f0 (7358|$#,)!
+3 f19 (7358|15@0@1&#,)!
+3 f7364 (7358|15@0@1&#,)!
+3 f0 (7364|$#,)!
+3 f19 (7364|@7|$#,)!
+3 f23 (7364|@7|$#,)!
+3 f0 (7364|$#,)!
+3 f5 (7364|$#,)!
+3 f0 (7364|0@5@7&#,)!
+3 f2 (7364|0@5@7&#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|$#,23|$#,)!
+3 f2 (7358|$#,23|$#,)!
+3 f0 (7358|$#,7370|$#,)!
+3 f7339 (7358|$#,7370|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (7358|$#,5|$#,)!
+3 f5 (7358|$#,5|$#,)!
+3 f0 (7364|$#,)!
+3 f19 (7364|$#,)!
+3 f7364 (7364|$#,)!
+3 f0 (7364|$#,5|$#,)!
+3 f1 (7364|$#,5|$#,)!
+3 f0 (5|@7|$#,5|$#,5|$#,)!
+3 f2 (5|@7|$#,5|$#,5|$#,)!
+3 f0 (7358|$#,)!
+3 f7481 (7358|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|$#,9|$#,2|$#,63|$#,)!
+3 f9 (7358|$#,9|$#,2|$#,63|$#,)!
+3 f0 (9|$#,2|$#,10|$#,)!
+3 f9 (9|$#,2|$#,10|$#,)!
+3 Soperation{7|@1|^#op,4|@1|11@0@0&#rprio,4|@1|11@0@0&#flags,2|@1|11@0@0&#unsignedp,9|@1|11@0@0&#value,}!
+3 f0 (7358|$#,23|$#,5|$#,)!
+3 f7481 (7358|$#,23|$#,5|$#,)!
+3 Stoken{23|@1|0@5@18@3@0#operator,5|@1|^#token,}!
+0 s6383|-1 8015 8012
+2 y8011|8011&
+3 f0 (7358|$#,)!
+3 f7481 (7358|$#,)!
+1 t8011|8011&
+2 F0/0|0&
+2 F4/0|4&
+3 f0 (7358|$#,315|$#,)!
+3 f5 (7358|$#,315|$#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|$#,9|$#,2|$#,63|$#,)!
+3 f9 (7358|$#,9|$#,2|$#,63|$#,)!
+3 f0 (9|$#,2|$#,10|$#,)!
+3 f9 (9|$#,2|$#,10|$#,)!
+3 f0 (7358|$#,)!
+3 f9 (7358|$#,)!
+2 F0/0|0&
+2 F7481/0|7481&
+1 t7481|7481&
+0 s324|-1 8047 -1
+2 F0/0|0&
+2 F8031/0|8031&
+2 F0/0|0&
+2 F8031/0|8031&
+3 f0 (7385|0@5@2&#,)!
+3 f1 (7385|0@5@2&#,)!
+3 f0 (6|$#,4|$#,)!
+3 f6 (6|$#,4|$#,)!
+3 f0 (6|$#,)!
+3 f6 (6|$#,)!
+3 f0 (7385|0@5@7&#,7897|0@0@18&#,7385|15@5@18&#,)!
+3 f19 (7385|0@5@7&#,7897|0@0@18&#,7385|15@5@18&#,)!
+3 f7385 (7385|0@5@7&#,7897|0@0@18&#,7385|15@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+1 t8031|8031&
+3 f0 ()!
+3 f1 ()!
+3 f0 (7385|0@5@2&#,)!
+3 f1 (7385|0@5@2&#,)!
+3 f0 (7385|$#,7897|$#,7385|0@0@18&#,)!
+3 f19 (7385|0@5@7&#,7897|0@0@18&#,7385|15@5@18&#,)!
+3 f7385 (7385|0@5@7&#,7897|0@0@18&#,7385|15@5@18&#,)!
+1 t7439|7439&
+3 f0 (23|$#,5|$#,5|$#,)!
+3 f5 (23|$#,5|$#,5|$#,)!
+3 f0 (23|$#,5|$#,5|$#,)!
+3 f19 (23|$#,5|$#,5|$#,)!
+3 f7385 (23|$#,5|$#,5|$#,)!
+3 f0 (23|$#,5|$#,5|$#,)!
+3 f19 (23|$#,5|$#,5|$#,)!
+3 f7385 (23|$#,5|$#,5|$#,)!
+3 f0 (7385|0@0@19@2@0#,)!
+3 f1 (7385|0@0@19@2@0#,)!
+3 f0 (23|$#,5|$#,7431|$#,5|$#,23|$#,5|$#,)!
+3 f19 (23|$#,5|$#,7431|$#,5|$#,23|0@5@2&#,5|$#,)!
+3 f7385 (23|$#,5|$#,7431|$#,5|$#,23|0@5@2&#,5|$#,)!
+3 f0 (23|$#,5|$#,7435|$#,5|$#,)!
+3 f19 (23|$#,5|$#,7435|0@0@2&#,5|$#,)!
+3 f7385 (23|$#,5|$#,7435|0@0@2&#,5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|$#,5|$#,5|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,5|$#,5|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (983|0@5@7&#,9|$#,9|$#,)!
+3 f1 (983|0@5@7&#,9|$#,9|$#,)!
+3 f0 (7358|$#,5|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,5|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f1 (7358|$#,983|0@5@7&#,)!
+3 f0 (7358|$#,)!
+3 f1 (7358|$#,)!
+3 f0 (7358|$#,983|0@5@19@3@0#,)!
+3 f1 (7358|$#,983|0@5@19@3@0#,)!
+3 f0 (7358|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,983|0@5@19@3@0#,)!
+3 f1 (7358|$#,983|0@5@19@3@0#,)!
+3 f0 (7358|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,983|0@5@19@3@0#,)!
+3 f1 (7358|$#,983|0@5@19@3@0#,)!
+3 f0 (7358|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,9|$#,9|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,9|$#,9|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,5|$#,5|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,5|$#,5|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,5|$#,5|$#,983|0@5@2&#,)!
+3 f1 (7358|$#,5|$#,5|$#,983|0@5@2&#,)!
+3 f0 (7358|$#,983|0@5@7&#,)!
+3 f1 (7358|$#,983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (6|$#,)!
+3 f1 (6|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,981|0@5@7&#,)!
+3 f2 (983|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (983|0@5@7&#,981|0@5@7&#,)!
+3 f2 (983|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@2@7&#,975|0@5@7&#,)!
+3 f1 (958|0@2@7&#,975|0@5@7&#,)!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,2|$#,)!
+3 f983 (958|0@5@7&#,2|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@2@2&#,)!
+3 f1 (958|0@2@2&#,)!
+3 f0 (958|15@5@1&#,981|0@5@4&#,)!
+3 f1 (958|15@5@1&#,981|0@5@4&#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (5160|$#,)!
+3 f983 (5160|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,985|$#,958|0@2@7&#,958|0@2@7&#,985|$#,5|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,985|$#,958|0@2@7&#,958|0@2@7&#,985|$#,5|$#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@4&#,955|0@5@18@2@0#,2|$#,5157|$#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@4&#,955|0@5@18@2@0#,2|$#,5157|$#,)!
+3 f0 ()!
+3 f958 ()!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|4@5@9&#,958|0@5@7&#,)!
+3 f1 (958|4@5@9&#,958|0@5@7&#,)!
+3 f0 (958|0@2@7&#,3943|$#,)!
+3 f1 (958|0@2@7&#,3943|$#,)!
+3 f0 (958|0@2@7&#,3948|$#,)!
+3 f1 (958|0@2@7&#,3948|$#,)!
+3 f0 (5187|$#,4180|$#,)!
+3 f5187 (5187|$#,4180|$#,)!
+3 f0 (5187|0@0@2&#,4180|$#,)!
+3 f1 (5187|0@0@2&#,4180|$#,)!
+3 f0 (5164|0@0@2&#,)!
+3 f1 (5164|0@0@2&#,)!
+3 f0 (5171|$#,)!
+3 f983 (5171|$#,)!
+3 f0 (5|$#,)!
+3 f5171 (5|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 ()!
+3 f981 ()!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (983|0@5@7&#,985|$#,969|0@5@7&#,)!
+3 f958 (983|0@5@7&#,985|$#,969|0@5@7&#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@4&#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@4&#,)!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (985|$#,)!
+3 f958 (985|$#,)!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@2@7&#,2|$#,)!
+3 f1 (958|0@2@7&#,2|$#,)!
+3 f0 (983|0@5@7&#,985|$#,959|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@4&#,2|$#,2|$#,)!
+3 f958 (983|0@5@7&#,985|$#,959|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@4&#,2|$#,2|$#,)!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 (958|0@2@7&#,)!
+3 f1 (958|0@2@7&#,)!
+3 f0 (983|0@5@7&#,985|$#,955|0@5@18&#,3937|$#,)!
+3 f958 (983|0@5@7&#,985|$#,955|0@5@18&#,3937|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,5|$#,)!
+3 f1 (958|0@5@7&#,5|$#,)!
+3 f0 (958|0@2@7&#,975|0@5@7&#,)!
+3 f1 (958|0@2@7&#,975|0@5@7&#,)!
+3 f0 (983|0@5@7&#,985|$#,955|0@5@18&#,)!
+3 f958 (983|0@5@7&#,985|$#,955|0@5@18&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,5097|0@5@2&#,)!
+3 f1 (958|0@5@7&#,5097|0@5@2&#,)!
+3 f0 (958|0@5@7&#,975|0@5@17&#,)!
+3 f1 (958|0@5@7&#,975|0@5@17&#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (1490|$#,)!
+3 f5160 (1490|$#,)!
+3 f0 (958|0@2@7&#,1490|$#,)!
+3 f1 (958|0@2@7&#,1490|$#,)!
+3 f0 (958|0@5@7&#,2108|0@5@7&#,)!
+3 f1 (958|0@5@7&#,2108|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@2@7&#,3948|$#,)!
+3 f1 (958|0@2@7&#,3948|$#,)!
+3 f0 (958|0@2@7&#,3943|$#,)!
+3 f1 (958|0@2@7&#,3943|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@2@7&#,)!
+3 f1 (958|0@2@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (963|0@5@7&#,5|$#,)!
+3 f958 (963|0@5@7&#,5|$#,)!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (983|0@5@6&#,985|$#,981|0@5@4&#,2|$#,5019|0@5@2&#,)!
+3 f958 (983|0@5@6&#,985|$#,981|0@5@4&#,2|$#,5019|0@5@2&#,)!
+3 f0 (983|0@5@6&#,985|$#,981|0@5@4&#,)!
+3 f958 (983|0@5@6&#,985|$#,981|0@5@4&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 (958|0@5@7&#,3937|$#,)!
+3 f1 (958|0@5@7&#,3937|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@4&#,955|0@5@18@2@0#,2|$#,5157|$#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@4&#,955|0@5@18@2@0#,2|$#,5157|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@4&#,2|$#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@4&#,2|$#,)!
+3 f0 (958|0@5@6&#,)!
+3 f1 (958|0@5@6&#,)!
+3 f0 (958|0@5@7&#,4327|0@5@17&#,)!
+3 f1 (958|0@5@7&#,4327|0@5@17&#,)!
+3 f0 (958|0@5@7&#,4204|$#,)!
+3 f1 (958|0@5@7&#,4204|$#,)!
+3 f0 (983|0@5@7&#,985|$#,4204|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,985|$#,4204|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,959|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@4&#,)!
+3 f958 (983|0@5@7&#,985|$#,959|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@4&#,)!
+3 f0 (983|0@5@7&#,985|$#,959|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@4&#,)!
+3 f958 (983|0@5@7&#,985|$#,959|$#,4327|0@5@2&#,975|0@5@2&#,981|0@5@4&#,)!
+3 f0 (983|0@5@7&#,981|0@5@6&#,)!
+3 f958 (983|0@5@7&#,981|0@5@6&#,)!
+3 f0 (983|0@5@7&#,4204|$#,981|0@5@6&#,)!
+3 f958 (983|0@5@7&#,4204|$#,981|0@5@6&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (983|0@5@7&#,959|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,959|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,959|$#,981|0@5@4&#,)!
+3 f958 (983|0@5@7&#,985|$#,959|$#,981|0@5@4&#,)!
+3 f0 (983|0@5@6&#,985|$#,1289|$#,1289|$#,981|0@5@4&#,2|$#,)!
+3 f958 (983|0@5@6&#,985|$#,1289|$#,1289|$#,981|0@5@4&#,2|$#,)!
+3 f0 (983|0@5@6&#,985|$#,1289|$#,1289|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@6&#,985|$#,1289|$#,1289|$#,981|0@5@2&#,)!
+3 f0 (1289|$#,)!
+3 f958 (1289|$#,)!
+3 f0 (983|0@5@7&#,959|$#,985|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,959|$#,985|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,959|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,959|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@2&#,2|$#,4180|$#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@2&#,2|$#,4180|$#,)!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@7&#,985|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (983|0@5@7&#,985|$#,)!
+3 f958 (983|0@5@7&#,985|$#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f958 ()!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (5567|$#,5567|$#,)!
+3 f5 (5567|$#,5567|$#,)!
+3 f0 (5567|$#,5567|$#,)!
+3 f5 (5567|$#,5567|$#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f5 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f5 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f1 (315|$#,)!
+3 f0 (315|$#,)!
+3 f1 (315|$#,)!
+3 f0 (5|$#,)!
+3 f5157 (5|$#,)!
+3 f0 (983|0@5@2&#,985|$#,959|$#,3943|$#,981|0@5@4&#,5019|0@5@2&#,)!
+3 f958 (983|0@5@2&#,985|$#,959|$#,3943|$#,981|0@5@4&#,5019|0@5@2&#,)!
+3 f0 (983|0@5@2&#,985|$#,5157|$#,3937|$#,3943|$#,3948|$#,3951|$#,5160|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@2&#,985|$#,5157|$#,3937|$#,3943|$#,3948|$#,3951|$#,5160|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@2&#,985|$#,1289|$#,1289|$#,985|$#,3948|$#,3951|$#,3937|$#,3943|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@2&#,985|$#,1289|$#,1289|$#,985|$#,3948|$#,3951|$#,3937|$#,3943|$#,981|0@5@2&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f5097 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (983|0@5@2&#,985|$#,959|$#,2|$#,4327|0@5@2&#,2|$#,975|0@5@2&#,3948|$#,3951|$#,3937|$#,3943|$#,4044|$#,5171|$#,1490|$#,5097|0@5@2&#,981|0@5@2&#,)!
+3 f958 (983|0@5@2&#,985|$#,959|$#,2|$#,4327|0@5@2&#,2|$#,975|0@5@2&#,3948|$#,3951|$#,3937|$#,3943|$#,4044|$#,5171|$#,1490|$#,5097|0@5@2&#,981|0@5@2&#,)!
+3 f0 (983|0@5@2&#,4180|$#,985|$#,985|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@2&#,4180|$#,985|$#,985|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@2&#,959|$#,985|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@2&#,959|$#,985|$#,981|0@5@2&#,)!
+3 f0 (983|0@5@2&#,959|$#,981|0@5@2&#,)!
+3 f958 (983|0@5@2&#,959|$#,981|0@5@2&#,)!
+3 f0 (958|0@5@17&#,)!
+3 f1 (958|0@5@17&#,)!
+3 f0 (4180|$#,981|0@5@7&#,315|$#,)!
+3 f958 (4180|$#,981|0@5@7&#,315|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,2|$#,)!
+3 f983 (958|0@5@7&#,2|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f959 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f3937 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f4044 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1490 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f3948 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f3951 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f4327 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f975 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f4180 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f5019 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f4245 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f983 (958|15@5@1&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f985 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f981 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,981|0@5@2&#,)!
+3 f1 (958|0@5@7&#,981|0@5@2&#,)!
+3 f0 (958|0@5@7&#,981|0@5@2&#,)!
+3 f1 (958|0@5@7&#,981|0@5@2&#,)!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,981|0@5@7&#,)!
+3 f1 (958|15@5@1&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|15@5@1&#,)!
+3 f2 (958|15@5@1&#,)!
+3 f0 (958|0@5@6&#,)!
+3 f955 (958|0@5@6&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f955 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,983|0@5@2&#,)!
+3 f1 (958|0@5@7&#,983|0@5@2&#,)!
+3 f0 (958|0@5@7&#,985|$#,)!
+3 f1 (958|0@5@7&#,985|$#,)!
+3 f0 (958|0@5@7&#,4245|0@5@2&#,)!
+3 f1 (958|0@5@7&#,4245|0@5@2&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,955|0@5@18@2@0#,)!
+3 f1 (958|0@5@7&#,955|0@5@18@2@0#,)!
+3 f0 (958|0@5@7&#,)!
+3 f985 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f985 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f985 (958|0@5@7&#,)!
+3 f0 (983|0@5@2&#,958|0@5@7&#,)!
+3 f958 (983|0@5@2&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,4203|$#,)!
+3 f1 (958|0@5@7&#,4203|$#,)!
+3 f0 (958|15@5@1&#,981|0@5@4&#,)!
+3 f1 (958|15@5@1&#,981|0@5@4&#,)!
+3 f0 (5154|0@0@2&#,)!
+3 f1 (5154|0@0@2&#,)!
+3 f0 (5164|0@0@2&#,)!
+3 f1 (5164|0@0@2&#,)!
+3 f0 (5168|0@0@2&#,)!
+3 f1 (5168|0@0@2&#,)!
+3 f0 (5175|0@0@2&#,)!
+3 f1 (5175|0@0@2&#,)!
+3 f0 (5179|0@0@2&#,)!
+3 f1 (5179|0@0@2&#,)!
+3 f0 (5183|0@0@2&#,)!
+3 f1 (5183|0@0@2&#,)!
+3 f0 (5154|$#,)!
+3 f5154 (5154|$#,)!
+3 f0 (5164|$#,)!
+3 f5164 (5164|$#,)!
+3 f0 (5168|$#,)!
+3 f5168 (5168|$#,)!
+3 f0 (5175|$#,)!
+3 f5175 (5175|$#,)!
+3 f0 (5179|$#,)!
+3 f5179 (5179|$#,)!
+3 f0 (5183|$#,)!
+3 f5183 (5183|$#,)!
+3 f0 (5187|0@0@2&#,4180|$#,)!
+3 f1 (5187|0@0@2&#,4180|$#,)!
+3 f0 (5187|$#,4180|$#,)!
+3 f5187 (5187|$#,4180|$#,)!
+3 f0 (958|0@2@2&#,)!
+3 f1 (958|0@2@2&#,)!
+3 f0 (958|0@5@17&#,)!
+3 f1 (958|0@5@17&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (958|0@5@9&#,958|0@5@7&#,2|$#,)!
+3 f1 (958|0@5@9&#,958|0@5@7&#,2|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,983|0@5@2&#,)!
+3 f1 (958|0@5@7&#,983|0@5@2&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,983|0@5@7&#,)!
+3 f1 (958|0@5@7&#,983|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,983|0@5@2&#,)!
+3 f1 (958|0@5@7&#,983|0@5@2&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,985|$#,958|0@2@7&#,958|0@2@7&#,985|$#,5|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,985|$#,958|0@2@7&#,958|0@2@7&#,985|$#,5|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (5160|$#,)!
+3 f983 (5160|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,5|$#,969|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,5|$#,969|0@5@7&#,)!
+3 f0 (958|0@2@9&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@9&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@5@7&#,5019|0@5@2&#,)!
+3 f1 (958|0@5@7&#,5019|0@5@2&#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,)!
+3 f2 (958|0@2@7&#,958|0@2@7&#,2|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@2@9&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f1 (958|0@2@9&#,958|0@2@7&#,2|$#,2|$#,)!
+3 f0 (958|0@5@7&#,958|0@5@2&#,)!
+3 f1 (958|0@5@7&#,958|0@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@7&#,958|0@5@2&#,)!
+3 f1 (958|0@5@7&#,958|0@5@2&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|4@5@9&#,958|0@5@7&#,)!
+3 f1 (958|4@5@9&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f958 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (958|0@2@7&#,958|0@2@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f1 (958|0@2@7&#,958|0@2@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,2|$#,)!
+3 f2 (955|0@5@18&#,2|$#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,981|0@5@7&#,2|$#,2|$#,2|$#,1778|$#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,981|0@5@7&#,2|$#,2|$#,2|$#,1778|$#,)!
+3 f0 (958|0@5@7&#,981|0@5@7&#,)!
+3 f1 (958|0@5@7&#,981|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,3769|$#,)!
+3 f955 (958|0@5@7&#,3769|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f983 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (983|0@5@7&#,981|0@5@4&#,)!
+3 f958 (983|0@5@7&#,981|0@5@4&#,)!
+3 f0 (3801|$#,)!
+3 f2 (3801|$#,)!
+3 f0 (3801|$#,)!
+3 f2 (3801|$#,)!
+3 f0 (5|$#,)!
+3 f3801 (5|$#,)!
+3 f0 (3801|$#,3801|$#,)!
+3 f2 (3801|$#,3801|$#,)!
+3 f0 (3801|$#,)!
+3 f983 (3801|$#,)!
+3 f0 (3801|$#,)!
+3 f2 (3801|$#,)!
+3 f0 (6765|$#,)!
+3 f1 (6765|$#,)!
+3 f0 (6765|$#,981|0@5@7&#,)!
+3 f5 (6765|$#,981|0@5@7&#,)!
+3 f0 (6765|$#,5|$#,)!
+3 f1 (6765|$#,5|$#,)!
+3 f0 (981|0@5@2&#,983|0@5@2&#,2|$#,)!
+3 f6759 (981|0@5@2&#,983|0@5@2&#,2|$#,)!
+3 f0 (6759|0@0@2&#,)!
+3 f1 (6759|0@0@2&#,)!
+3 f0 ()!
+3 f6765 ()!
+1 t6759|6759&
+3 f0 (6765|0@0@2&#,)!
+3 f1 (6765|0@0@2&#,)!
+3 f0 (6765|$#,)!
+3 f1 (6765|$#,)!
+3 f0 (6765|$#,981|0@5@2&#,983|0@5@2&#,2|$#,)!
+3 f1 (6765|$#,981|0@5@2&#,983|0@5@2&#,2|$#,)!
+3 f0 (6765|$#,981|0@5@2&#,983|0@5@2&#,)!
+3 f1 (6765|$#,981|0@5@2&#,983|0@5@2&#,)!
+3 f0 (6765|$#,981|0@5@2&#,983|0@5@2&#,)!
+3 f1 (6765|$#,981|0@5@2&#,983|0@5@2&#,)!
+3 f0 (6765|$#,981|0@5@7&#,)!
+3 f5 (6765|$#,981|0@5@7&#,)!
+3 f0 (6765|$#,)!
+3 f983 (6765|$#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (6765|$#,5|$#,)!
+3 f1 (6765|$#,5|$#,)!
+3 f0 (6765|$#,)!
+3 f1 (6765|$#,)!
+3 f0 (6765|$#,983|0@5@7&#,)!
+3 f981 (6765|$#,983|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (5|$#,)!
+3 f2 (5|$#,)!
+3 f0 (5|$#,)!
+3 f1490 (5|$#,)!
+3 f0 (1490|$#,)!
+3 f983 (1490|$#,)!
+3 f0 (985|$#,)!
+3 f4941 (985|$#,)!
+3 f0 (4941|0@5@2&#,)!
+3 f1 (4941|0@5@2&#,)!
+3 f0 ()!
+3 f4941 ()!
+3 f0 (4941|@5|0@5@7&#,1490|$#,)!
+3 f4941 (4941|@5|0@5@7&#,1490|$#,)!
+3 f0 (4941|@5|0@5@7&#,2108|0@5@7&#,)!
+3 f4941 (4941|@5|0@5@7&#,2108|0@5@7&#,)!
+3 f0 (4941|0@5@7&#,)!
+3 f1 (4941|0@5@7&#,)!
+3 f0 (4941|@5|0@5@7&#,4941|0@5@2&#,)!
+3 f4941 (4941|@5|0@5@7&#,4941|0@5@2&#,)!
+3 f0 (4941|@5|0@5@7&#,4941|0@5@2&#,)!
+3 f4941 (4941|@5|0@5@7&#,4941|0@5@2&#,)!
+3 f0 (4941|@5|0@5@7&#,985|$#,)!
+3 f4941 (4941|@5|0@5@7&#,985|$#,)!
+3 f0 (4941|@5|0@5@7&#,)!
+3 f4941 (4941|@5|0@5@7&#,)!
+3 f0 (4941|0@5@7&#,)!
+3 f983 (4941|0@5@7&#,)!
+3 f0 (4941|@5|0@5@7&#,985|$#,)!
+3 f4941 (4941|@5|0@5@7&#,985|$#,)!
+3 f0 (4941|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f4941 (4941|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f0 (5|$#,4941|@5|0@5@7&#,)!
+3 f1 (5|$#,4941|@5|0@5@7&#,)!
+3 f0 (4941|0@5@7&#,)!
+3 f4941 (4941|0@5@7&#,)!
+3 f0 (5077|$#,)!
+3 f2 (5077|$#,)!
+3 f0 (5077|0@0@2&#,)!
+3 f1 (5077|0@0@2&#,)!
+3 f0 (5077|$#,)!
+3 f983 (5077|$#,)!
+3 f0 (315|$#,)!
+3 f5077 (315|$#,)!
+3 f0 (5077|$#,)!
+3 f5077 (5077|$#,)!
+3 f0 (5077|$#,5077|$#,)!
+3 f2 (5077|$#,5077|$#,)!
+3 f0 (5073|$#,5070|$#,975|0@5@2&#,)!
+3 f5077 (5073|$#,5070|$#,975|0@5@2&#,)!
+3 f0 (5077|$#,)!
+3 f2 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f2 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f2 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f990 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f990 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f1000 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f995 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f995 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f995 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f1862 (5077|$#,)!
+3 f0 (5077|$#,955|0@5@18&#,)!
+3 f983 (5077|$#,955|0@5@18&#,)!
+3 f0 (5077|$#,)!
+3 f1862 (5077|$#,)!
+3 f0 (5077|$#,955|0@5@18&#,)!
+3 f983 (5077|$#,955|0@5@18&#,)!
+3 f0 (5077|$#,)!
+3 f983 (5077|$#,)!
+3 f0 (315|$#,)!
+3 f5077 (315|$#,)!
+3 f0 (5077|$#,)!
+3 f5077 (5077|$#,)!
+3 f0 (5077|$#,5077|$#,)!
+3 f2 (5077|$#,5077|$#,)!
+3 f0 (5077|0@0@2&#,)!
+3 f1 (5077|0@0@2&#,)!
+3 f0 (5070|$#,)!
+3 f983 (5070|$#,)!
+3 f0 (5077|$#,)!
+3 f983 (5077|$#,)!
+3 f0 (5077|$#,)!
+3 f983 (5077|$#,)!
+3 f0 (975|0@5@2&#,)!
+3 f5077 (975|0@5@2&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f5077 (975|0@5@2&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f5077 (975|0@5@2&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f5077 (975|0@5@2&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f5077 (975|0@5@2&#,)!
+3 f0 ()!
+3 f5097 ()!
+1 t5077|5077&
+3 f0 (5097|0@5@7&#,)!
+3 f1 (5097|0@5@7&#,)!
+3 f0 (5097|@5|0@5@7&#,5077|0@0@2&#,)!
+3 f5097 (5097|@5|0@5@7&#,5077|0@0@2&#,)!
+3 f0 (5097|0@5@7&#,)!
+3 f983 (5097|0@5@7&#,)!
+3 f0 (5097|0@5@7&#,)!
+3 f5097 (5097|0@5@7&#,)!
+3 f0 (5097|0@5@2&#,)!
+3 f1 (5097|0@5@2&#,)!
+3 f0 (5097|0@5@7&#,)!
+3 f983 (5097|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f5097 (315|$#,)!
+3 f0 (5097|0@5@7&#,5073|$#,5070|$#,)!
+3 f975 (5097|0@5@7&#,5073|$#,5070|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,958|0@5@7&#,)!
+3 f0 (985|$#,)!
+3 f1 (985|$#,)!
+0 s6400|-1 8935 -1
+1 t8934|8934&
+0 s329|&
+3 S_ctentry{4675|@1|^#kind,8936|@1|0@5@3&#ctbase,985|@1|^#base,985|@1|^#ptr,985|@1|^#array,983|@1|0@5@3&#unparse,}!
+0 s6517|-1 8939 -1
+1 t8938|8938&
+0 s330|-1 9305 -1
+0 s331|-1 8942 -1
+1 t8941|8941&
+3 S_cttable{5|@1|^#size,5|@1|^#nspace,8942|@1|0@3@2&#entries,}!
+0 s6471|&
+0 s332|&
+3 f0 (8940|@7|$#,)!
+3 f2 (8940|@7|$#,)!
+3 f0 (4204|$#,)!
+3 f8936 (4204|$#,)!
+3 f0 (8940|$#,)!
+3 f983 (8940|$#,)!
+3 f0 (4675|$#,8936|0@5@4&#,985|$#,985|$#,985|$#,983|0@5@4&#,)!
+3 f8940 (4675|$#,8936|0@5@4&#,985|$#,985|$#,985|$#,983|0@5@4&#,)!
+3 f0 (4675|$#,8936|0@5@2&#,)!
+3 f8940 (4675|$#,8936|0@5@2&#,)!
+3 f0 (8940|$#,)!
+3 f983 (8940|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4675|$#,8936|0@5@4&#,985|$#,)!
+3 f985 (4675|$#,8936|0@5@4&#,985|$#,)!
+3 f0 (8940|0@0@4&#,)!
+3 f985 (8940|0@0@4&#,)!
+3 f0 (8940|$#,)!
+3 f2 (8940|$#,)!
+3 f0 (985|$#,9|$#,)!
+3 f8936 (985|$#,9|$#,)!
+3 f0 (8936|0@2@2&#,)!
+3 f985 (8936|0@2@2&#,)!
+3 f0 (985|$#,)!
+3 f8936 (985|$#,)!
+3 f0 (985|$#,985|$#,2|$#,)!
+3 f985 (985|$#,985|$#,2|$#,)!
+3 f0 (985|$#,)!
+3 f8936 (985|$#,)!
+3 f0 (985|$#,)!
+3 f8940 (985|$#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f8936 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f2 (8936|0@2@18&#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f2 (8936|0@2@18&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f3890 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f983 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f983 (8936|0@5@7&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f8936 (8936|0@2@7&#,)!
+3 f0 (8936|0@5@2&#,)!
+3 f1 (8936|0@5@2&#,)!
+3 f0 (3801|$#,)!
+3 f8936 (3801|$#,)!
+3 f0 ()!
+3 f8936 ()!
+3 f0 ()!
+3 f8936 ()!
+3 f0 (4204|$#,)!
+3 f8936 (4204|$#,)!
+3 f0 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f8936 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f0 (983|0@5@4&#,4245|0@5@2&#,)!
+3 f8936 (983|0@5@4&#,4245|0@5@2&#,)!
+3 f0 (983|0@5@4&#,3890|0@0@4&#,)!
+3 f8936 (983|0@5@4&#,3890|0@0@4&#,)!
+3 f0 ()!
+3 f8936 ()!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,2|$#,2|$#,2|$#,)!
+3 f2 (8936|0@5@7&#,8936|0@5@7&#,2|$#,2|$#,2|$#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f2 (8936|0@2@7&#,)!
+3 f0 (985|$#,)!
+3 f8936 (985|$#,)!
+3 f0 (985|$#,)!
+3 f8936 (985|$#,)!
+3 f0 (985|$#,4245|0@5@2&#,)!
+3 f985 (985|$#,4245|0@5@2&#,)!
+3 f0 (985|$#,4245|0@5@18&#,)!
+3 f8936 (985|$#,4245|0@5@18&#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f8936 (8936|0@2@18&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f985 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f985 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f4245 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f4245 (8936|0@2@7&#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f2 (8936|0@2@7&#,)!
+3 f0 ()!
+3 f5 ()!
+3 S_cfcn{985|@1|^#rval,4245|@1|0@5@18&#params,2|@1|^#liveparams,}!
+0 s6467|-1 9046 -1
+1 t9045|9045&
+0 s333|&
+3 S_tsu{983|@1|0@5@3&#name,4245|@1|0@5@3&#fields,}!
+0 s6378|-1 9050 -1
+1 t9049|9049&
+0 s334|&
+3 S_tconj{985|@1|^#a,985|@1|^#b,2|@1|^#isExplicit,}!
+0 s6403|-1 9054 -1
+1 t9053|9053&
+0 s335|&
+3 S_tenum{983|@1|0@5@3&#tag,3890|@1|0@0@3&#members,}!
+0 s6393|-1 9058 -1
+1 t9057|9057&
+0 s336|&
+3 S_tfixed{985|@1|^#base,9|@1|^#size,}!
+0 s6347|-1 9062 -1
+1 t9061|9061&
+0 s337|&
+3 U_uconts{3801|@1|^#prim,4204|@1|^#tid,985|@1|^#base,9047|@1|0@0@3&#fcn,9051|@1|0@0@3&#su,9059|@1|0@0@3&#cenum,9055|@1|0@0@3&#conj,9063|@1|0@0@3&#farray,}!
+0 s6571|&
+0 s338|&
+3 S__ctbase{4672|@1|^#type,9066|@1|^#contents,}!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f4204 (8936|0@5@7&#,)!
+3 f0 (8936|0@2@7&#,4672|$#,)!
+3 f2 (8936|0@2@7&#,4672|$#,)!
+3 f0 (8936|0@2@7&#,4672|$#,4672|$#,)!
+3 f2 (8936|0@2@7&#,4672|$#,4672|$#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f8936 (8936|0@2@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (985|$#,)!
+3 f4675 (985|$#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (4672|$#,)!
+3 f2 (4672|$#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f4204 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f983 (8936|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f8936 (315|$#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,2|$#,)!
+3 f5 (8936|0@5@7&#,8936|0@5@7&#,2|$#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f0 (985|$#,985|$#,2|$#,)!
+3 f8936 (985|$#,985|$#,2|$#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f985 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f985 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f2 (8936|0@2@7&#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f0 (985|$#,)!
+3 f8936 (985|$#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f2 (8936|0@2@18&#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f2 (8936|0@2@18&#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f2 (8936|0@2@18&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f983 (8936|0@2@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f983 (8936|0@5@7&#,)!
+3 f0 ()!
+3 f8936 ()!
+3 f0 (985|$#,4245|0@5@17&#,)!
+3 f8936 (985|$#,4245|0@5@17&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f8936 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f2 (8936|0@2@18&#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f2 (8936|0@2@18&#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f2 (8936|0@2@18&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f2 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f2 (8936|0@2@18&#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f2 (8936|0@2@18&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f4204 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f4204 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f983 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f983 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f983 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,983|0@5@2&#,)!
+3 f983 (8936|0@5@7&#,983|0@5@2&#,)!
+1 t1286|1286&
+3 f0 (9162|$#,)!
+3 f8936 (9162|$#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f983 (8936|0@5@7&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f8936 (8936|0@2@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f3890 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@2&#,)!
+3 f1 (8936|0@5@2&#,)!
+3 f0 (985|$#,)!
+3 f8936 (985|$#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,2|$#,2|$#,2|$#,)!
+3 f2 (8936|0@5@7&#,8936|0@5@7&#,2|$#,2|$#,2|$#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f0 ()!
+3 f8936 ()!
+3 f0 (3801|$#,)!
+3 f8936 (3801|$#,)!
+3 f0 ()!
+3 f8936 ()!
+3 f0 ()!
+3 f8936 ()!
+3 f0 (4204|$#,)!
+3 f8936 (4204|$#,)!
+3 f0 (983|0@5@4&#,3890|0@0@4&#,)!
+3 f8936 (983|0@5@4&#,3890|0@0@4&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f983 (8936|0@2@7&#,)!
+3 f0 (4204|$#,)!
+3 f8936 (4204|$#,)!
+3 f0 ()!
+3 f8936 ()!
+3 f0 (985|$#,)!
+3 f8936 (985|$#,)!
+3 f0 (985|$#,)!
+3 f8936 (985|$#,)!
+3 f0 (985|$#,9|$#,)!
+3 f8936 (985|$#,9|$#,)!
+3 f0 (985|$#,4245|0@5@2&#,)!
+3 f985 (985|$#,4245|0@5@2&#,)!
+3 f0 (985|$#,4245|0@5@2&#,)!
+3 f985 (985|$#,4245|0@5@2&#,)!
+3 f0 (985|$#,4245|0@5@17&#,)!
+3 f8936 (985|$#,4245|0@5@17&#,)!
+3 f0 (985|$#,4245|0@5@18&#,)!
+3 f8936 (985|$#,4245|0@5@18&#,)!
+3 f0 (8936|0@2@18&#,)!
+3 f8936 (8936|0@2@18&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (985|$#,985|$#,2|$#,)!
+3 f8936 (985|$#,985|$#,2|$#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f985 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f985 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f2 (8936|0@2@7&#,)!
+3 f0 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f8936 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f4245 (8936|0@2@7&#,)!
+3 f0 (983|0@5@4&#,4245|0@5@2&#,)!
+3 f8936 (983|0@5@4&#,4245|0@5@2&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f985 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f985 (8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f4245 (8936|0@2@7&#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f8936 (8936|0@2@7&#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,2|$#,)!
+3 f5 (8936|0@5@7&#,8936|0@5@7&#,2|$#,)!
+3 f0 (8936|0@2@7&#,8936|0@2@7&#,)!
+3 f5 (8936|0@2@7&#,8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,8936|0@2@7&#,)!
+3 f2 (8936|0@2@7&#,8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,8936|0@2@7&#,)!
+3 f2 (8936|0@2@7&#,8936|0@2@7&#,)!
+3 f0 (8936|0@2@7&#,4672|$#,)!
+3 f2 (8936|0@2@7&#,4672|$#,)!
+3 f0 (8936|0@2@7&#,4672|$#,4672|$#,)!
+3 f2 (8936|0@2@7&#,4672|$#,4672|$#,)!
+3 f0 (8936|0@2@7&#,)!
+3 f2 (8936|0@2@7&#,)!
+3 f0 (8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,)!
+3 f0 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f2 (8936|0@5@7&#,8936|0@5@7&#,)!
+3 f0 (8940|0@0@2&#,)!
+3 f1 (8940|0@0@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (985|$#,)!
+3 f8936 (985|$#,)!
+3 f0 (985|$#,)!
+3 f8936 (985|$#,)!
+3 f0 (985|$#,)!
+3 f8940 (985|$#,)!
+3 f0 (4675|$#,8936|0@5@2&#,)!
+3 f8940 (4675|$#,8936|0@5@2&#,)!
+3 f0 (4675|$#,8936|0@5@4&#,985|$#,985|$#,985|$#,983|0@5@4&#,)!
+3 f8940 (4675|$#,8936|0@5@4&#,985|$#,985|$#,985|$#,983|0@5@4&#,)!
+3 f0 (8940|$#,)!
+3 f983 (8940|$#,)!
+3 f0 (8940|$#,)!
+3 f2 (8940|$#,)!
+3 f0 (8940|$#,)!
+3 f983 (8940|$#,)!
+3 f0 (23|0@0@18&#,)!
+3 f8940 (23|0@0@18&#,)!
+3 f0 (8940|$#,)!
+3 f983 (8940|$#,)!
+3 f0 (8940|$#,)!
+3 f983 (8940|$#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+1 t8940|8940&
+3 f0 (4675|$#,8936|0@5@4&#,985|$#,)!
+3 f985 (4675|$#,8936|0@5@4&#,985|$#,)!
+3 f0 (8936|0@2@2&#,)!
+3 f985 (8936|0@2@2&#,)!
+3 f0 (8940|0@0@4&#,)!
+3 f985 (8940|0@0@4&#,)!
+3 f0 (8940|0@0@2&#,)!
+3 f985 (8940|0@0@2&#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (5|$#,)!
+3 f4675 (5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (4204|$#,)!
+3 f985 (4204|$#,)!
+3 f0 (4204|$#,)!
+3 f985 (4204|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,9|$#,)!
+3 f985 (985|$#,9|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f4245 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f5 (985|$#,985|$#,)!
+3 f0 (985|$#,4245|0@5@2&#,)!
+3 f985 (985|$#,4245|0@5@2&#,)!
+3 f0 (985|$#,4245|0@5@2&#,)!
+3 f985 (985|$#,4245|0@5@2&#,)!
+3 f0 (985|$#,4245|0@5@2&#,)!
+3 f985 (985|$#,4245|0@5@2&#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,4245|0@5@18&#,)!
+3 f985 (985|$#,4245|0@5@18&#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 ?!
+3 f9448 (985|$#,)!
+3 f2 (985|$#,)^9451
+1 t9450|9450&
+3 f0 (4363|$#,9451|$#,)!
+3 f2 (4363|$#,9451|$#,)!
+3 f0 (4363|$#,)!
+3 f2 (4363|$#,)!
+3 f0 (4363|$#,)!
+3 f2 (4363|$#,)!
+3 f0 (4363|$#,)!
+3 f2 (4363|$#,)!
+3 f0 (985|$#,985|$#,2|$#,)!
+3 f985 (985|$#,985|$#,2|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f1 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f985 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f0 (985|$#,)!
+3 f4245 (985|$#,)!
+3 f0 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f985 (983|0@5@2&#,4245|0@5@2&#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,2|$#,2|$#,2|$#,)!
+3 f2 (985|$#,985|$#,2|$#,2|$#,2|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f4204 (985|$#,)!
+3 f0 (985|$#,983|0@5@2&#,)!
+3 f983 (985|$#,983|0@5@2&#,)!
+3 f0 (985|$#,)!
+3 f983 (985|$#,)!
+3 f0 (985|$#,)!
+3 f983 (985|$#,)!
+3 f0 (985|$#,)!
+3 f983 (985|$#,)!
+3 f0 (315|$#,)!
+3 f985 (315|$#,)!
+3 f0 (985|$#,)!
+3 f983 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (5|$#,985|$#,)!
+3 f985 (5|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f3890 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (983|0@5@4&#,3890|0@0@4&#,)!
+3 f985 (983|0@5@4&#,3890|0@0@4&#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f983 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (4245|0@5@2&#,)!
+3 f985 (4245|0@5@2&#,)!
+3 f0 (4245|0@5@2&#,)!
+3 f985 (4245|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f985 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f985 (983|0@5@2&#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (985|$#,)!
+3 f985 (985|$#,)!
+3 f0 (1490|$#,)!
+3 f985 (1490|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,)!
+3 f2 (985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f2 (985|$#,985|$#,)!
+3 f0 (985|$#,985|$#,)!
+3 f985 (985|$#,985|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 (2875|$#,2|$#,)!
+3 f1 (2875|$#,2|$#,)!
+3 f0 (2884|$#,2|$#,)!
+3 f1 (2884|$#,2|$#,)!
+3 f0 (3000|$#,2|$#,)!
+3 f1 (3000|$#,2|$#,)!
+3 f0 (2918|$#,4204|$#,2|$#,2|$#,)!
+3 f1 (2918|$#,4204|$#,2|$#,2|$#,)!
+3 f0 (2949|$#,)!
+3 f1 (2949|$#,)!
+3 f0 (2875|$#,)!
+3 f1 (2875|$#,)!
+3 f0 (2884|$#,)!
+3 f1 (2884|$#,)!
+3 f0 (3000|$#,)!
+3 f1 (3000|$#,)!
+3 f0 (2918|$#,4204|$#,)!
+3 f1 (2918|$#,4204|$#,)!
+3 f0 (2875|$#,)!
+3 f1 (2875|$#,)!
+3 f0 (2884|$#,)!
+3 f1 (2884|$#,)!
+3 f0 (3000|$#,)!
+3 f1 (3000|$#,)!
+3 f0 (2918|$#,4204|$#,)!
+3 f1 (2918|$#,4204|$#,)!
+3 U!78{1763|@1|^#tok,5|@1|^#count,5070|@1|^#sck,1490|@1|^#typequal,2108|@1|0@5@3&#tquallist,985|@1|^#ctyp,955|@1|0@5@18&#sr,4941|@1|0@5@2&#qtyp,983|@1|0@5@2&#cname,963|@1|0@5@2&#ntyp,6538|@1|0@0@2&#ntyplist,4245|@1|0@5@2&#flist,4245|@1|0@5@17&#entrylist,958|@1|0@5@18@3@0#entry,958|@1|0@5@2&#oentry,969|@1|0@5@2&#expr,3890|@1|0@0@2&#enumnamelist,3769|@1|0@0@2&#alist,975|@1|0@5@2&#srset,1804|@1|0@5@2&#cstringslist,}!
+0 s6574|&
+0 s339|-1 13957 -1
+3 f0 (963|@5|0@5@7&#,)!
+3 f963 (963|@5|0@5@7&#,)!
+3 f0 (958|0@5@7&#,985|$#,)!
+3 f1 (958|0@5@7&#,985|$#,)!
+3 f0 (3890|0@0@6&#,985|$#,981|0@5@7&#,)!
+3 f1 (3890|0@0@6&#,985|$#,981|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (1490|$#,)!
+3 f1 (1490|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (1763|$#,5070|$#,975|0@5@2&#,1763|$#,)!
+3 f1 (1763|$#,5070|$#,975|0@5@2&#,1763|$#,)!
+3 f0 (1763|$#,975|0@5@2&#,1763|$#,)!
+3 f1 (1763|$#,975|0@5@2&#,1763|$#,)!
+3 f0 (975|0@5@2&#,)!
+3 f1 (975|0@5@2&#,)!
+3 f0 (955|0@5@18&#,2108|0@5@7&#,)!
+3 f1 (955|0@5@18&#,2108|0@5@7&#,)!
+3 f0 (955|0@5@18&#,2108|0@5@7&#,)!
+3 f1 (955|0@5@18&#,2108|0@5@7&#,)!
+3 f0 (983|0@5@7&#,4245|0@5@17&#,)!
+3 f1 (983|0@5@7&#,4245|0@5@17&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 (3890|0@0@2&#,)!
+3 f985 (3890|0@0@2&#,)!
+3 f0 (983|0@5@2&#,3890|0@0@2&#,)!
+3 f985 (983|0@5@2&#,3890|0@0@2&#,)!
+3 f0 (3890|0@0@6&#,985|$#,981|0@5@7&#,)!
+3 f1 (3890|0@0@6&#,985|$#,981|0@5@7&#,)!
+3 f0 (4245|0@5@18&#,)!
+3 f1 (4245|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f958 (963|0@5@7&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (963|0@5@2&#,)!
+3 f1 (963|0@5@2&#,)!
+3 f0 (963|0@5@2&#,)!
+3 f1 (963|0@5@2&#,)!
+3 f0 (958|0@5@7&#,985|$#,)!
+3 f1 (958|0@5@7&#,985|$#,)!
+3 f0 (6538|0@0@2&#,4941|0@5@7&#,)!
+3 f4245 (6538|0@0@2&#,4941|0@5@7&#,)!
+3 f0 (4941|0@5@7&#,)!
+3 f4245 (4941|0@5@7&#,)!
+3 f0 (3940|$#,)!
+3 f1 (3940|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4941|0@5@2&#,)!
+3 f1 (4941|0@5@2&#,)!
+3 f0 (4245|0@5@18&#,)!
+3 f1 (4245|0@5@18&#,)!
+3 f0 (4941|0@5@2&#,)!
+3 f1 (4941|0@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4941|0@5@7&#,963|0@5@7&#,)!
+3 f1 (4941|0@5@7&#,963|0@5@7&#,)!
+3 f0 (4941|0@5@7&#,963|0@5@7&#,969|0@5@7&#,)!
+3 f1 (4941|0@5@7&#,963|0@5@7&#,969|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f1 (963|0@5@7&#,)!
+3 f0 (963|@5|0@5@7&#,)!
+3 f963 (963|@5|0@5@7&#,)!
+3 f0 (4245|0@5@2&#,)!
+3 f985 (4245|0@5@2&#,)!
+3 f0 (4245|0@5@2&#,)!
+3 f985 (4245|0@5@2&#,)!
+3 f0 (983|0@5@6&#,4245|0@5@2&#,)!
+3 f985 (983|0@5@6&#,4245|0@5@2&#,)!
+3 f0 (983|0@5@6&#,4245|0@5@2&#,)!
+3 f985 (983|0@5@6&#,4245|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f985 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f985 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f985 (983|0@5@2&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f958 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4245|@5|0@5@18&#,)!
+3 f4245 (4245|@5|0@5@18&#,)!
+3 f0 (4245|@5|0@5@18&#,)!
+3 f4245 (4245|@5|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,983|0@5@2&#,)!
+3 f955 (955|0@5@18&#,983|0@5@2&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f955 (983|0@5@7&#,)!
+3 f0 (955|0@5@18&#,983|0@5@2&#,)!
+3 f955 (955|0@5@18&#,983|0@5@2&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f955 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f955 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f955 (983|0@5@7&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (983|0@5@2&#,4941|0@5@2&#,)!
+3 f963 (983|0@5@2&#,4941|0@5@2&#,)!
+3 f0 (963|0@5@2&#,)!
+3 f1 (963|0@5@2&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f983 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f983 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f4941 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f985 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,)!
+3 f2108 (963|0@5@7&#,)!
+3 f0 (963|0@5@7&#,1490|$#,)!
+3 f1 (963|0@5@7&#,1490|$#,)!
+3 f0 (963|0@5@7&#,4941|0@5@2&#,)!
+3 f1 (963|0@5@7&#,4941|0@5@2&#,)!
+3 f0 (963|@5|0@5@7&#,985|$#,)!
+3 f963 (963|@5|0@5@7&#,985|$#,)!
+3 f0 (963|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f963 (963|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f0 (963|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f963 (963|@5|0@5@7&#,4941|0@5@7&#,)!
+3 f0 (963|@5|0@5@7&#,)!
+3 f963 (963|@5|0@5@7&#,)!
+3 f0 (1778|$#,)!
+3 f983 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f983 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f983 (1778|$#,)!
+3 f0 (1778|$#,2|$#,)!
+3 f983 (1778|$#,2|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (1778|$#,)!
+3 f2 (1778|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (6|$#,)!
+3 f1 (6|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 (3948|$#,3948|$#,)!
+3 f3948 (3948|$#,3948|$#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f2 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,958|0@5@7&#,2|$#,969|0@5@18&#,5|$#,5|$#,)!
+3 f1 (969|0@5@7&#,958|0@5@7&#,2|$#,969|0@5@18&#,5|$#,5|$#,)!
+3 f0 (969|0@5@7&#,958|0@5@7&#,)!
+3 f1 (969|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f2 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 e!79{TT_FCNRETURN,TT_DOASSIGN,TT_FIELDASSIGN,TT_FCNPASS,TT_GLOBPASS,TT_GLOBRETURN,TT_PARAMRETURN,TT_LEAVETRANS,TT_GLOBINIT}!
+0 s6632|&
+0 s340|&
+3 f0 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,9877|$#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,9877|$#,)!
+3 f0 (958|0@5@7&#,9877|$#,)!
+3 f1 (958|0@5@7&#,9877|$#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,9877|$#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,9877|$#,)!
+3 f0 (958|0@5@7&#,9877|$#,)!
+3 f1 (958|0@5@7&#,9877|$#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,2|$#,2|$#,2|$#,981|0@5@7&#,9877|$#,5|$#,2|$#,)!
+3 f1289 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,2|$#,2|$#,2|$#,981|0@5@7&#,9877|$#,5|$#,2|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f2 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (3948|$#,3948|$#,)!
+3 f3948 (3948|$#,3948|$#,)!
+3 f0 (9877|$#,3948|$#,)!
+3 f983 (9877|$#,3948|$#,)!
+3 f0 (9877|$#,3951|$#,)!
+3 f983 (9877|$#,3951|$#,)!
+3 f0 (9877|$#,)!
+3 f983 (9877|$#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,955|0@5@18&#,9877|$#,)!
+3 f983 (969|0@5@7&#,969|0@5@7&#,955|0@5@18&#,9877|$#,)!
+3 f0 (9877|$#,)!
+3 f983 (9877|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,2|$#,2|$#,2|$#,981|0@5@7&#,9877|$#,5|$#,2|$#,)!
+3 f1289 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,2|$#,2|$#,2|$#,981|0@5@7&#,9877|$#,5|$#,2|$#,)!
+3 e!80{DSC_GLOB,DSC_LOCAL,DSC_PARAM,DSC_STRUCT}!
+0 s6633|&
+0 s341|&
+3 f0 (9912|$#,)!
+3 f983 (9912|$#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,2|$#,981|0@5@7&#,5|$#,9912|$#,)!
+3 f2 (969|0@5@7&#,955|0@5@18&#,2|$#,981|0@5@7&#,5|$#,9912|$#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f2 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,2|$#,981|0@5@7&#,5|$#,9912|$#,)!
+3 f2 (969|0@5@7&#,955|0@5@18&#,2|$#,981|0@5@7&#,5|$#,9912|$#,)!
+3 f0 (969|0@5@7&#,958|0@5@7&#,)!
+3 f1 (969|0@5@7&#,958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,969|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f1 (958|0@5@7&#,969|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f0 (969|0@5@7&#,958|0@5@7&#,2|$#,969|0@5@18&#,5|$#,5|$#,)!
+3 f1 (969|0@5@7&#,958|0@5@7&#,2|$#,969|0@5@18&#,5|$#,5|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,9877|$#,)!
+3 f1 (958|0@5@7&#,9877|$#,)!
+3 f0 (958|0@5@7&#,9877|$#,)!
+3 f1 (958|0@5@7&#,9877|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,9877|$#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,9877|$#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f1 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f1 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f1 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f1 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f1 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f1 (955|0@5@18&#,969|0@5@7&#,2|$#,955|0@5@18&#,969|0@5@7&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,2|$#,969|0@5@7&#,955|0@5@18&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,2|$#,969|0@5@7&#,955|0@5@18&#,2|$#,981|0@5@7&#,9877|$#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,9877|$#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,9877|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f2 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f2 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (5|$#,)!
+3 f3948 (5|$#,)!
+3 f0 (5|$#,)!
+3 f3943 (5|$#,)!
+3 f0 (5|$#,)!
+3 f3937 (5|$#,)!
+3 f0 (5|$#,)!
+3 f3951 (5|$#,)!
+3 f0 (3937|$#,)!
+3 f983 (3937|$#,)!
+3 f0 (3943|$#,)!
+3 f2 (3943|$#,)!
+3 f0 (3943|$#,)!
+3 f2 (3943|$#,)!
+3 f0 (3943|$#,)!
+3 f983 (3943|$#,)!
+3 f0 (3943|$#,3943|$#,)!
+3 f5 (3943|$#,3943|$#,)!
+3 f0 (3948|$#,3948|$#,)!
+3 f3948 (3948|$#,3948|$#,)!
+3 f0 (3948|$#,)!
+3 f983 (3948|$#,)!
+3 f0 (3951|$#,)!
+3 f983 (3951|$#,)!
+3 f0 (3951|$#,)!
+3 f983 (3951|$#,)!
+3 f0 (3951|$#,)!
+3 f983 (3951|$#,)!
+3 f0 (3948|$#,)!
+3 f983 (3948|$#,)!
+3 f0 (1490|$#,)!
+3 f3951 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f3937 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f4044 (1490|$#,)!
+3 f0 (1490|$#,)!
+3 f3948 (1490|$#,)!
+3 f0 (3948|$#,)!
+3 f2 (3948|$#,)!
+3 f0 (3948|$#,3948|$#,)!
+3 f2 (3948|$#,3948|$#,)!
+3 f0 (3948|$#,3948|$#,)!
+3 f2 (3948|$#,3948|$#,)!
+3 f0 (3948|$#,)!
+3 f3948 (3948|$#,)!
+3 f0 (4044|$#,)!
+3 f983 (4044|$#,)!
+3 f0 (4044|$#,)!
+3 f4044 (4044|$#,)!
+3 f0 (4044|$#,4044|$#,)!
+3 f4044 (4044|$#,4044|$#,)!
+3 f0 (4044|$#,)!
+3 f2 (4044|$#,)!
+3 f0 (4044|$#,)!
+3 f2 (4044|$#,)!
+3 f0 (4044|$#,)!
+3 f2 (4044|$#,)!
+3 f0 (4044|$#,)!
+3 f2 (4044|$#,)!
+3 f0 (5|$#,)!
+3 f4044 (5|$#,)!
+3 f0 (958|0@5@7&#,1862|$#,2|$#,)!
+3 f2 (958|0@5@7&#,1862|$#,2|$#,)!
+3 f0 (958|0@5@7&#,1862|$#,2|$#,)!
+3 f2 (958|0@5@7&#,1862|$#,2|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+2 y1862|1862&
+3 f1 (1862|@3|&#,)!
+3 f0 (5|$#,5|$#,)!
+3 f2 (5|$#,5|$#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,983|0@5@7&#,)!
+3 f0 (1862|$#,)!
+3 f1862 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,1862|$#,2|$#,)!
+3 f2 (958|0@5@7&#,1862|$#,2|$#,)!
+3 f0 (958|0@5@7&#,1862|$#,2|$#,)!
+3 f2 (958|0@5@7&#,1862|$#,2|$#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (983|0@5@7&#,981|0@5@7&#,)!
+3 f2 (983|0@5@7&#,981|0@5@7&#,)!
+2 F0/0|0&
+2 F1061/0|1061&
+1 t1061|1061&
+3 f0 (983|0@5@7&#,981|0@5@7&#,)!
+3 f2 (983|0@5@7&#,981|0@5@7&#,)!
+2 F0/0|0&
+2 F1061/0|1061&
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 (983|0@5@7&#,)!
+3 f4 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f4 (983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f5 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,4|$#,)!
+3 f983 (983|0@5@7&#,4|$#,)!
+3 f0 (983|0@5@7&#,5|$#,4|$#,)!
+3 f1 (983|0@5@7&#,5|$#,4|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f4 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (23|$#,5|$#,)!
+3 f983 (23|$#,5|$#,)!
+3 f0 (983|0@5@7&#,4|$#,)!
+3 f2 (983|0@5@7&#,4|$#,)!
+3 f0 (983|0@5@9&#,23|$#,23|$#,)!
+3 f1 (983|0@5@9&#,23|$#,23|$#,)!
+3 f0 (983|0@5@7&#,23|$#,)!
+3 f1 (983|0@5@7&#,23|$#,)!
+3 f0 (983|0@5@9&#,983|0@5@7&#,)!
+3 f2 (983|0@5@9&#,983|0@5@7&#,)!
+3 f0 (4|$#,)!
+3 f4 (4|$#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,5|$#,2|$#,2|$#,)!
+3 f1146 (983|0@5@7&#,983|0@5@7&#,5|$#,2|$#,2|$#,)!
+3 f0 (983|0@5@2&#,983|0@5@2&#,)!
+3 f2 (983|0@5@2&#,983|0@5@2&#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f2 (983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f2 (983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,23|$#,)!
+3 f2 (983|0@5@7&#,23|$#,)!
+3 f0 (983|0@5@7&#,23|$#,)!
+3 f2 (983|0@5@7&#,23|$#,)!
+3 f0 (1186|$#,1186|$#,)!
+3 f5 (1186|$#,1186|$#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,)!
+3 f5 (983|0@5@7&#,983|0@5@7&#,)!
+3 f0 (983|0@5@17&#,)!
+3 f1 (983|0@5@17&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (23|@5|0@5@6@2@0#,)!
+3 f983 (23|@5|0@5@6@2@0#,)!
+3 f0 (983|0@5@7&#,)!
+3 f19 (983|@5|0@5@6@2@0#,)!
+3 f23 (983|@5|0@5@6@2@0#,)!
+3 f0 (983|0@5@7&#,)!
+3 f5 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f983 (983|0@5@2&#,)!
+3 f0 (983|@5|0@5@7&#,5|$#,)!
+3 f983 (983|@5|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 (983|0@5@2&#,4|$#,)!
+3 f983 (983|0@5@2&#,4|$#,)!
+3 f0 (983|0@5@2&#,983|0@5@2&#,)!
+3 f983 (983|0@5@2&#,983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,983|0@5@7&#,)!
+3 f983 (983|0@5@2&#,983|0@5@7&#,)!
+3 f0 (983|0@5@2&#,23|$#,)!
+3 f983 (983|0@5@2&#,23|$#,)!
+3 f0 (983|0@5@2&#,23|$#,5|$#,)!
+3 f983 (983|0@5@2&#,23|$#,5|$#,)!
+3 f0 (983|0@5@7&#,983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,983|0@5@7&#,)!
+3 f0 (4|$#,983|0@5@2&#,)!
+3 f983 (4|$#,983|0@5@2&#,)!
+3 f0 (4|$#,983|0@5@6&#,)!
+3 f983 (4|$#,983|0@5@6&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (5|$#,)!
+3 f983 (5|$#,)!
+3 f0 (983|0@5@2&#,)!
+3 f945 (983|0@5@2&#,)!
+3 f0 (983|0@5@7&#,315|$#,5|$#,)!
+3 f983 (983|0@5@7&#,315|$#,5|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+0 a254|&
+3 f0 (10175|0@5@7&#,)!
+3 f2 (10175|0@5@7&#,)!
+3 f1 (10175|@7|6@5@7&#,1312|@3|&#,)!
+3 f0 ()!
+3 f10175 ()!
+3 f0 (10175|@7|0@5@7&#,)!
+3 f2 (10175|@7|0@5@7&#,)!
+3 f0 (10175|0@5@7&#,1312|$#,)!
+3 f1 (10175|0@5@7&#,1312|$#,)!
+3 f0 (10175|@7|0@5@7&#,)!
+3 f5 (10175|@7|0@5@7&#,)!
+3 f0 (10175|0@5@2&#,)!
+3 f1 (10175|0@5@2&#,)!
+3 f0 (1323|$#,1312|$#,5|$#,5|$#,)!
+3 f981 (1323|$#,1312|$#,5|$#,5|$#,)!
+3 f0 (1312|$#,)!
+3 f1323 (1312|$#,)!
+3 f0 (981|0@5@7&#,5|$#,)!
+3 f981 (981|0@5@7&#,5|$#,)!
+3 f0 (981|0@5@7&#,)!
+3 f981 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,5|$#,)!
+3 f1 (981|0@5@7&#,5|$#,)!
+3 f0 (981|0@5@7&#,)!
+3 f981 (981|0@5@7&#,)!
+3 f0 (981|0@5@2&#,981|0@5@7&#,)!
+3 f981 (981|0@5@2&#,981|0@5@7&#,)!
+3 f0 (981|0@5@2&#,1312|$#,)!
+3 f981 (981|0@5@2&#,1312|$#,)!
+3 f0 (981|0@5@2&#,)!
+3 f1 (981|0@5@2&#,)!
+3 f0 (981|0@5@2&#,)!
+3 f1 (981|0@5@2&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f983 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f5 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,5|$#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,5|$#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f981 (951|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f981 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f981 (983|0@5@7&#,)!
+3 f0 ()!
+3 f981 ()!
+3 f0 ()!
+3 f981 ()!
+3 f0 ()!
+3 f981 ()!
+3 f0 ()!
+3 f981 ()!
+3 f0 (981|0@5@7&#,)!
+3 f981 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f981 (981|0@5@7&#,)!
+3 f0 ()!
+3 f981 ()!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f981 (983|0@5@7&#,5|$#,)!
+3 f0 (1323|$#,1312|$#,5|$#,5|$#,)!
+3 f981 (1323|$#,1312|$#,5|$#,5|$#,)!
+3 f0 (1312|$#,5|$#,5|$#,)!
+3 f981 (1312|$#,5|$#,5|$#,)!
+3 f0 (1312|$#,5|$#,5|$#,)!
+3 f981 (1312|$#,5|$#,5|$#,)!
+3 f0 (981|0@5@7&#,)!
+3 f983 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f983 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f5 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f5 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f983 (981|0@5@7&#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,5|$#,5|$#,)!
+3 f983 (983|0@5@7&#,5|$#,5|$#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f983 (981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+2 F0/64|0&
+2 F4/64|4&
+3 e!81{XINVALID,XCHAR,XSTRING,XSTRINGFREE,XTSTRINGFREE,XINT,XFLOAT,XBOOL,XUENTRY,XPERCENT,XCTYPE,XPLURAL,XREPREFIX,XFILELOC}!
+0 s6634|&
+0 s342|&
+3 f0 (315|$#,)!
+3 f10297 (315|$#,)!
+3 f0 (23|0@0@6&#,!.,)!
+3 f983 (23|0@0@6&#,!.,)!
+3 f0 (2076|$#,)!
+3 f2 (2076|$#,)!
+3 f0 (2076|0@5@2&#,)!
+3 f1 (2076|0@5@2&#,)!
+3 f0 (23|$#,23|$#,2|$#,)!
+3 f19 (23|0@0@6&#,23|$#,2|$#,)!
+3 f2076 (23|0@0@6&#,23|$#,2|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,)!
+3 f2076 (23|$#,23|$#,)!
+3 f0 (2076|$#,)!
+3 f19 (2076|$#,)!
+3 f23 (2076|$#,)!
+3 f0 (2076|$#,)!
+3 f2 (2076|$#,)!
+3 f0 (23|$#,2076|$#,)!
+3 f2 (23|$#,2076|$#,)!
+3 f0 (23|$#,315|4@0@7&#,)!
+3 f19 (23|$#,315|4@0@7&#,)!
+3 f23 (23|$#,315|4@0@7&#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f2 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,6788|0@0@2&#,)!
+3 f1312 (6794|0@5@7&#,6788|0@0@2&#,)!
+3 f0 (23|$#,23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,23|$#,)!
+3 f23 (23|$#,23|$#,23|$#,)!
+3 f0 (6784|$#,)!
+3 f983 (6784|$#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f5 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,)!
+3 f983 (6794|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,)!
+3 f1 (6794|0@5@7&#,)!
+3 f0 (983|0@5@4&#,2|$#,6784|$#,1312|$#,)!
+3 f6788 (983|0@5@4&#,2|$#,6784|$#,1312|$#,)!
+3 f0 (6788|0@0@2&#,)!
+3 f1 (6788|0@0@2&#,)!
+3 f0 ()!
+3 f6794 ()!
+1 t6788|6788&
+3 f0 (6794|0@5@7&#,)!
+3 f1 (6794|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,6788|0@0@2&#,)!
+3 f1312 (6794|0@5@7&#,6788|0@0@2&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@2&#,2|$#,6784|$#,1312|$#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@2&#,2|$#,6784|$#,1312|$#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@2&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@2&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f2 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f2 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f2 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f1312 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f2 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f1312 (6794|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f983 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f983 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,1312|$#,)!
+3 f983 (6794|0@5@7&#,1312|$#,)!
+3 f0 (6794|0@5@7&#,1312|$#,1312|$#,)!
+3 f2 (6794|0@5@7&#,1312|$#,1312|$#,)!
+3 f0 (6794|0@5@7&#,)!
+3 f1 (6794|0@5@7&#,)!
+3 f0 (6794|0@5@2&#,)!
+3 f1 (6794|0@5@2&#,)!
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 (23|$#,23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,23|$#,)!
+3 f23 (23|$#,23|$#,23|$#,)!
+3 f0 (3832|0@5@7&#,)!
+3 f2 (3832|0@5@7&#,)!
+3 f0 (983|0@5@7&#,5|$#,)!
+3 f3827 (983|0@5@7&#,5|$#,)!
+3 f0 (3832|0@5@7&#,)!
+3 f2 (3832|0@5@7&#,)!
+3 f0 (3832|0@5@7&#,)!
+3 f983 (3832|0@5@7&#,)!
+3 f0 (3827|$#,)!
+3 f3832 (3827|$#,)!
+3 f0 (3832|0@2@7&#,)!
+3 f1 (3832|0@2@7&#,)!
+3 f0 (3832|0@5@7&#,983|0@5@7&#,)!
+3 f5 (3832|0@5@7&#,983|0@5@7&#,)!
+3 f0 (3832|0@2@7&#,3827|$#,)!
+3 f1 (3832|0@2@7&#,3827|$#,)!
+3 f0 (3832|0@5@7&#,)!
+3 f5 (3832|0@5@7&#,)!
+3 f0 (3832|0@5@7&#,983|0@5@7&#,)!
+3 f5 (3832|0@5@7&#,983|0@5@7&#,)!
+3 f0 (3832|0@5@2&#,)!
+3 f1 (3832|0@5@2&#,)!
+3 f0 (3824|0@0@2&#,)!
+3 f1 (3824|0@0@2&#,)!
+3 f0 (3824|$#,)!
+3 f5 (3824|$#,)!
+3 f0 (3824|$#,)!
+3 f5 (3824|$#,)!
+2 F0/256|0&
+2 F6/256|6&
+3 f0 (3824|$#,983|0@5@7&#,)!
+3 f6 (3824|$#,983|0@5@7&#,)!
+3 f0 (3824|$#,983|0@5@7&#,)!
+3 f3832 (3824|$#,983|0@5@7&#,)!
+3 f0 (5|$#,)!
+3 f3824 (5|$#,)!
+1 t3832|3832&
+3 f0 (3824|$#,)!
+3 f1 (3824|$#,)!
+3 f0 (3824|$#,)!
+3 f983 (3824|$#,)!
+3 f0 (3824|$#,3827|$#,)!
+3 f1 (3824|$#,3827|$#,)!
+3 f0 (3824|$#,983|0@5@7&#,5|$#,)!
+3 f1 (3824|$#,983|0@5@7&#,5|$#,)!
+3 f0 (3824|$#,983|0@5@7&#,)!
+3 f5 (3824|$#,983|0@5@7&#,)!
+3 f0 (3824|$#,983|0@5@7&#,983|0@5@18&#,)!
+3 f1 (3824|$#,983|0@5@7&#,983|0@5@18&#,)!
+3 f0 (3824|$#,983|0@5@7&#,)!
+3 f1 (3824|$#,983|0@5@7&#,)!
+3 f0 (213|$#,983|0@5@2&#,5|$#,)!
+3 f1 (213|$#,983|0@5@2&#,5|$#,)!
+3 f0 (983|0@5@2&#,981|0@5@7&#,2|$#,2|$#,)!
+3 f2 (983|0@5@2&#,981|0@5@7&#,2|$#,2|$#,)!
+3 f0 (983|0@5@2&#,981|0@5@7&#,2|$#,2|$#,)!
+3 f2 (983|0@5@2&#,981|0@5@7&#,2|$#,2|$#,)!
+3 f0 (213|$#,983|0@5@2&#,)!
+3 f1 (213|$#,983|0@5@2&#,)!
+3 f0 (213|$#,983|0@5@2&#,)!
+3 f1 (213|$#,983|0@5@2&#,)!
+3 f0 (23|@5|0@5@7&#,23|@5|0@5@7&#,)!
+3 f19 (23|@5|0@5@7&#,23|@5|0@5@7&#,)!
+3 f23 (23|@5|0@5@7&#,23|@5|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@19@3@0#,)!
+3 f1 (983|0@5@19@3@0#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 (4|$#,1862|$#,)!
+3 f1 (4|$#,1862|$#,)!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+0 s49|-1 10488 -1
+1 t10487|10487&
+3 f0 (315|@5|$#,10488|4@0@7&#,5|$#,24|&#,)!
+3 f1 (315|@5|$#,10488|4@0@7&#,5|$#,24|&#,)!
+3 f0 (983|0@5@2&#,981|0@5@7&#,)!
+3 f1 (983|0@5@2&#,981|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@2&#,981|0@5@7&#,)!
+3 f1 (983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (983|0@5@2&#,981|0@5@7&#,)!
+3 f1 (983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (1862|$#,985|$#,969|0@5@7&#,985|$#,969|0@5@7&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,985|$#,969|0@5@7&#,985|$#,969|0@5@7&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (985|$#,969|0@5@7&#,985|$#,969|0@5@7&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (985|$#,969|0@5@7&#,985|$#,969|0@5@7&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (985|$#,969|0@5@7&#,985|$#,969|0@5@7&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (985|$#,969|0@5@7&#,985|$#,969|0@5@7&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,983|0@5@2&#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (983|0@5@2&#,981|0@5@7&#,2|$#,2|$#,)!
+3 f2 (983|0@5@2&#,981|0@5@7&#,2|$#,2|$#,)!
+3 f0 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f1 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (983|0@5@2&#,981|0@5@7&#,2|$#,2|$#,)!
+3 f2 (983|0@5@2&#,981|0@5@7&#,2|$#,2|$#,)!
+3 f0 (213|$#,983|0@5@2&#,)!
+3 f1 (213|$#,983|0@5@2&#,)!
+3 f0 (213|$#,983|0@5@2&#,5|$#,)!
+3 f1 (213|$#,983|0@5@2&#,5|$#,)!
+3 f0 (213|$#,983|0@5@2&#,)!
+3 f1 (213|$#,983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (23|0@0@6&#,)!
+3 f1 (23|0@0@6&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,5|$#,983|0@5@2&#,)!
+3 f1 (983|0@5@7&#,5|$#,983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 (951|0@5@7&#,983|0@5@2&#,)!
+3 f1 (951|0@5@7&#,983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (951|0@5@7&#,983|0@5@2&#,)!
+3 f1 (951|0@5@7&#,983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,)!
+3 f1 (1862|$#,983|0@5@2&#,)!
+3 f0 (1862|$#,983|0@5@2&#,983|0@5@2&#,)!
+3 f1 (1862|$#,983|0@5@2&#,983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1862|$#,1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1862|$#,1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f2 (1862|$#,983|0@5@2&#,981|0@5@7&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (2|$#,983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f2 (2|$#,983|0@5@7&#,983|0@5@7&#,5|$#,)!
+3 f0 (5|$#,)!
+3 f983 (5|$#,)!
+3 f0 (983|0@5@2&#,983|0@5@7&#,5|$#,)!
+3 f1 (983|0@5@2&#,983|0@5@7&#,5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f6868 ()!
+1 t6862|6862&
+3 f0 (981|0@5@7&#,983|0@5@7&#,)!
+3 f6862 (981|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6862|0@0@2&#,)!
+3 f1 (6862|0@0@2&#,)!
+3 f0 (6862|$#,6862|$#,)!
+3 f2 (6862|$#,6862|$#,)!
+3 f0 (6862|$#,6862|$#,)!
+3 f2 (6862|$#,6862|$#,)!
+3 f0 (6868|0@5@7&#,6862|$#,)!
+3 f5 (6868|0@5@7&#,6862|$#,)!
+3 f0 (6868|0@2@7&#,)!
+3 f1 (6868|0@2@7&#,)!
+3 f0 (6868|0@5@7&#,981|0@5@7&#,983|0@5@7&#,)!
+3 f2 (6868|0@5@7&#,981|0@5@7&#,983|0@5@7&#,)!
+3 f0 (6868|0@5@7&#,)!
+3 f983 (6868|0@5@7&#,)!
+3 f0 (6868|0@5@2&#,)!
+3 f1 (6868|0@5@2&#,)!
+3 f0 (1862|$#,1289|$#,981|0@5@7&#,)!
+3 f6699 (1862|$#,1289|$#,981|0@5@7&#,)!
+3 f0 (1862|$#,981|0@5@7&#,)!
+3 f6699 (1862|$#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f6699 (981|0@5@7&#,)!
+3 f0 (5|$#,981|0@5@7&#,)!
+3 f6699 (5|$#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f6699 (981|0@5@7&#,)!
+3 f0 (6699|$#,)!
+3 f1289 (6699|$#,)!
+3 f0 (6699|$#,)!
+3 f1862 (6699|$#,)!
+3 f0 (6699|$#,)!
+3 f5 (6699|$#,)!
+3 f0 (6699|$#,)!
+3 f983 (6699|$#,)!
+3 f0 (6699|0@0@2&#,)!
+3 f1 (6699|0@0@2&#,)!
+3 f0 (6699|$#,981|0@5@7&#,)!
+3 f2 (6699|$#,981|0@5@7&#,)!
+3 f0 (6699|$#,981|0@5@7&#,)!
+3 f2 (6699|$#,981|0@5@7&#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f975 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f975 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f975 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f0 ()!
+3 f978 ()!
+3 f0 ()!
+3 f978 ()!
+1 t975|975&
+3 f0 (978|0@2@7&#,)!
+3 f1 (978|0@2@7&#,)!
+3 f0 (978|0@2@7&#,955|0@5@18&#,)!
+3 f5 (978|0@2@7&#,955|0@5@18&#,)!
+3 f0 (978|@5|0@5@7&#,955|0@5@18@2@0#,955|0@5@18&#,)!
+3 f978 (978|@5|0@5@7&#,955|0@5@18@2@0#,955|0@5@18&#,)!
+3 f0 (978|@5|0@5@7&#,955|0@5@18@2@0#,975|0@5@2&#,)!
+3 f978 (978|@5|0@5@7&#,955|0@5@18@2@0#,975|0@5@2&#,)!
+3 f0 (978|0@2@7&#,955|0@5@18&#,)!
+3 f1 (978|0@2@7&#,955|0@5@18&#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,)!
+3 f1 (978|0@5@7&#,955|0@5@18&#,)!
+3 f0 (978|0@2@7&#,955|0@5@18&#,)!
+3 f1 (978|0@2@7&#,955|0@5@18&#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f975 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f975 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,)!
+3 f975 (978|0@5@7&#,955|0@5@18&#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,)!
+3 f975 (978|0@5@7&#,955|0@5@18&#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f975 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f0 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f975 (978|0@5@7&#,955|0@5@18&#,5|$#,)!
+3 f0 (978|0@5@7&#,)!
+3 f978 (978|0@5@7&#,)!
+3 f0 (978|0@5@7&#,5|$#,)!
+3 f1 (978|0@5@7&#,5|$#,)!
+3 f0 (978|@5|0@5@7&#,978|0@5@2&#,5|$#,)!
+3 f978 (978|@5|0@5@7&#,978|0@5@2&#,5|$#,)!
+3 f0 (978|@5|0@5@7&#,978|0@5@7&#,5|$#,)!
+3 f978 (978|@5|0@5@7&#,978|0@5@7&#,5|$#,)!
+3 f0 (978|0@5@7&#,978|0@5@7&#,5|$#,)!
+3 f978 (978|0@5@7&#,978|0@5@7&#,5|$#,)!
+3 f0 (978|0@5@7&#,)!
+3 f983 (978|0@5@7&#,)!
+3 f0 (978|0@5@7&#,)!
+3 f1 (978|0@5@7&#,)!
+3 f0 (978|0@5@2&#,)!
+3 f1 (978|0@5@2&#,)!
+3 f0 (978|0@5@7&#,)!
+3 f1 (978|0@5@7&#,)!
+3 f0 (4|$#,)!
+3 f1289 (4|$#,)!
+3 f0 (1289|$#,1289|$#,)!
+3 f5 (1289|$#,1289|$#,)!
+0 s62|-1 10692 -1
+1 t10691|10691&
+3 S_sRefTable{5|@1|^#entries,5|@1|^#nspace,10692|@1|11@3@3&#elements,}!
+0 s6418|-1 10695 -1
+1 t10694|10694&
+0 a343|&
+3 f0 (10696|0@5@7&#,)!
+3 f2 (10696|0@5@7&#,)!
+3 f0 (10696|@7|0@5@7&#,)!
+3 f2 (10696|@7|0@5@7&#,)!
+3 f0 (10696|0@5@7&#,)!
+3 f2 (10696|0@5@7&#,)!
+3 f0 (10696|0@5@7&#,)!
+3 f983 (10696|0@5@7&#,)!
+3 f0 (10696|0@5@2&#,)!
+3 f1 (10696|0@5@2&#,)!
+3 f0 (10696|0@5@7&#,)!
+3 f1 (10696|0@5@7&#,)!
+3 f0 (10696|@5|0@5@7&#,955|15@5@17&#,)!
+3 f10696 (10696|@5|0@5@7&#,955|15@5@17&#,)!
+3 f0 ()!
+3 f10696 ()!
+3 f0 (10696|0@2@7&#,)!
+3 f1 (10696|0@2@7&#,)!
+3 f0 (10696|@5|0@5@7&#,955|15@5@17&#,)!
+3 f10696 (10696|@5|0@5@7&#,955|15@5@17&#,)!
+3 f0 (10696|0@5@7&#,)!
+3 f1 (10696|0@5@7&#,)!
+3 f0 (10696|0@5@7&#,)!
+3 f5 (10696|0@5@7&#,)!
+3 f0 (10696|0@5@7&#,)!
+3 f983 (10696|0@5@7&#,)!
+3 f0 (10696|0@5@2&#,)!
+3 f1 (10696|0@5@2&#,)!
+3 f0 (5|$#,)!
+3 f4180 (5|$#,)!
+3 f0 (4180|$#,)!
+3 f983 (4180|$#,)!
+3 f0 (4180|$#,)!
+3 f983 (4180|$#,)!
+3 f0 (4180|$#,)!
+3 f983 (4180|$#,)!
+3 f0 (985|$#,985|@7|$#,)!
+3 f2 (985|$#,985|@7|$#,)!
+3 f0 (975|0@5@7&#,958|0@5@7&#,)!
+3 f1 (975|0@5@7&#,958|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3769|$#,969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3769|$#,969|0@5@7&#,969|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,969|0@5@2&#,)!
+3 f1 (958|0@5@7&#,969|0@5@2&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f1 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f1 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f1 (969|0@5@2&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f1 (981|0@5@7&#,)!
+3 f0 (983|0@5@7&#,969|0@5@7&#,)!
+3 f1 (983|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (4327|0@5@7&#,4327|0@5@7&#,)!
+3 f1 (4327|0@5@7&#,4327|0@5@7&#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (4431|0@5@2&#,5|$#,)!
+3 f1 (4431|0@5@2&#,5|$#,)!
+3 f0 (4245|0@5@7&#,2|$#,)!
+3 f985 (4245|0@5@7&#,2|$#,)!
+3 f0 (966|0@2@2&#,)!
+3 f1 (966|0@2@2&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (966|0@5@7&#,)!
+3 f983 (966|0@5@7&#,)!
+3 f0 (966|0@2@7&#,5|$#,4203|$#,)!
+3 f958 (966|0@2@7&#,5|$#,4203|$#,)!
+3 f0 (966|0@2@7&#,)!
+3 f983 (966|0@2@7&#,)!
+3 f0 (966|0@2@7&#,)!
+3 f983 (966|0@2@7&#,)!
+3 f0 (966|0@2@7&#,)!
+3 f983 (966|0@2@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (966|0@2@7&#,983|0@5@7&#,)!
+3 f958 (966|0@2@7&#,983|0@5@7&#,)!
+3 f0 (966|0@2@7&#,)!
+3 f966 (966|0@2@7&#,)!
+3 f0 (966|0@2@7&#,5|$#,4203|$#,)!
+3 f958 (966|0@2@7&#,5|$#,4203|$#,)!
+3 f0 (966|0@5@7&#,983|0@5@7&#,)!
+3 f958 (966|0@5@7&#,983|0@5@7&#,)!
+3 f0 (966|0@5@7&#,)!
+3 f1 (966|0@5@7&#,)!
+3 f0 (966|0@2@7&#,983|0@5@7&#,)!
+3 f5 (966|0@2@7&#,983|0@5@7&#,)!
+3 f0 (966|0@2@7&#,5|$#,)!
+3 f958 (966|0@2@7&#,5|$#,)!
+3 f0 (966|0@5@7&#,983|0@5@7&#,)!
+3 f958 (966|0@5@7&#,983|0@5@7&#,)!
+3 f0 ()!
+3 f966 ()!
+3 f0 (966|0@2@7&#,5|$#,5|$#,)!
+3 f5 (966|0@2@7&#,5|$#,5|$#,)!
+3 f0 (966|0@5@7&#,)!
+3 f2 (966|0@5@7&#,)!
+3 f0 (966|0@5@7&#,)!
+3 f2 (966|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (966|0@5@7&#,)!
+3 f2 (966|0@5@7&#,)!
+3 f0 (966|0@5@7&#,)!
+3 f2 (966|0@5@7&#,)!
+3 f0 (966|0@5@7&#,)!
+3 f2 (966|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4044|$#,)!
+3 f1 (4044|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (4424|$#,966|0@5@4&#,2|$#,)!
+3 f966 (4424|$#,966|0@5@4&#,2|$#,)!
+1 t4428|4428&
+3 f0 ()!
+3 f966 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (966|0@2@7&#,)!
+3 f1 (966|0@2@7&#,)!
+3 f0 (966|0@2@7&#,958|0@5@4&#,)!
+3 f1 (966|0@2@7&#,958|0@5@4&#,)!
+3 C1.958/1|!
+3 f0 (966|0@2@7&#,958|0@5@2&#,)!
+3 f958 (966|0@2@7&#,958|0@5@2&#,)!
+3 f10846 (966|0@2@7&#,958|0@5@2&#,)!
+3 f0 (966|0@2@7&#,958|0@5@4&#,2|$#,)!
+3 f4203 (966|0@2@7&#,958|0@5@4&#,2|$#,)!
+3 f0 (958|0@5@2&#,)!
+3 f4203 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (966|0@2@7&#,958|0@5@2&#,2|$#,)!
+3 f4203 (966|0@2@7&#,958|0@5@2&#,2|$#,)!
+3 f0 (966|0@2@7&#,958|0@5@2&#,)!
+3 f1 (966|0@2@7&#,958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (966|0@2@7&#,958|0@5@2&#,2|$#,)!
+3 f958 (966|0@2@7&#,958|0@5@2&#,2|$#,)!
+3 f0 (958|0@5@2&#,)!
+3 f958 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f958 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f958 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f985 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f958 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,2|$#,)!
+3 f4203 (958|0@5@2&#,2|$#,)!
+3 f0 (958|0@5@2&#,2|$#,)!
+3 f4203 (958|0@5@2&#,2|$#,)!
+3 f0 (958|0@5@2&#,)!
+3 f985 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (958|0@5@2&#,)!
+3 f958 (958|0@5@2&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 (966|0@2@7&#,983|0@5@7&#,)!
+3 f5 (966|0@2@7&#,983|0@5@7&#,)!
+3 f0 (966|0@2@7&#,5|$#,)!
+3 f958 (966|0@2@7&#,5|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f4203 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f4203 (983|0@5@7&#,)!
+3 f0 (966|0@2@7&#,4203|$#,)!
+3 f958 (966|0@2@7&#,4203|$#,)!
+3 f0 (4203|$#,)!
+3 f958 (4203|$#,)!
+3 f0 (4203|$#,)!
+3 f958 (4203|$#,)!
+3 f0 (4203|$#,)!
+3 f958 (4203|$#,)!
+3 f0 (4203|$#,)!
+3 f2 (4203|$#,)!
+3 f0 (4203|$#,)!
+3 f983 (4203|$#,)!
+3 f0 (966|0@2@7&#,)!
+3 f1 (966|0@2@7&#,)!
+3 f0 (966|0@2@7&#,)!
+3 f966 (966|0@2@7&#,)!
+3 f0 (966|0@2@2&#,)!
+3 f1 (966|0@2@2&#,)!
+3 f0 (4203|$#,)!
+3 f4203 (4203|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 ?!
+3 f10924 (20|6@5@21&#,20|2@0@2&#,)!
+3 f5 (20|6@5@21&#,20|2@0@2&#,)^10927
+1 t10926|10926&
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (972|0@5@2&#,)!
+3 f1 (972|0@5@2&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,1778|$#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,1778|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,969|0@5@7&#,1778|$#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,1778|$#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,2|$#,)!
+3 f1 (969|0@5@7&#,2|$#,)!
+3 f0 (955|0@5@18&#,966|0@2@7&#,966|0@2@7&#,2|$#,)!
+3 f1 (955|0@5@18&#,966|0@2@7&#,966|0@2@7&#,2|$#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,2|$#,1778|$#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,2|$#,1778|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (972|0@5@2&#,)!
+3 f1 (972|0@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@7&#,955|0@5@18&#,)!
+3 f1 (958|0@5@7&#,955|0@5@18&#,)!
+3 f0 (2|$#,)!
+3 f1 (2|$#,)!
+3 f0 (981|0@5@7&#,)!
+3 f1 (981|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f5 (958|0@5@7&#,)!
+3 f0 (5|$#,)!
+3 f958 (5|$#,)!
+3 f0 (966|0@2@7&#,5|$#,4203|$#,)!
+3 f958 (966|0@2@7&#,5|$#,4203|$#,)!
+3 f0 (966|0@2@7&#,)!
+3 f966 (966|0@2@7&#,)!
+3 f0 (5|$#,4203|$#,)!
+3 f958 (5|$#,4203|$#,)!
+3 f0 (966|0@2@7&#,5|$#,4203|$#,)!
+3 f958 (966|0@2@7&#,5|$#,4203|$#,)!
+3 f0 (966|0@2@7&#,5|$#,5|$#,)!
+3 f5 (966|0@2@7&#,5|$#,5|$#,)!
+3 f0 (5|$#,5|$#,)!
+3 f4428 (5|$#,5|$#,)!
+3 f0 (966|0@2@7&#,983|0@5@7&#,)!
+3 f958 (966|0@2@7&#,983|0@5@7&#,)!
+3 f0 (966|0@5@7&#,983|0@5@7&#,)!
+3 f958 (966|0@5@7&#,983|0@5@7&#,)!
+3 f0 (966|0@5@7&#,983|0@5@7&#,)!
+3 f958 (966|0@5@7&#,983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f985 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f985 (983|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f985 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f985 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,2|$#,)!
+3 f985 (4245|0@5@7&#,2|$#,)!
+3 f0 (3890|$#,)!
+3 f985 (3890|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (4431|0@5@2&#,5|$#,)!
+3 f1 (4431|0@5@2&#,5|$#,)!
+3 f0 (966|0@2@2&#,)!
+3 f1 (966|0@2@2&#,)!
+3 f0 (966|0@5@2&#,)!
+3 f1 (966|0@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (958|0@5@2&#,)!
+3 f1 (958|0@5@2&#,)!
+3 f0 (4203|$#,4203|$#,)!
+3 f2 (4203|$#,4203|$#,)!
+3 f0 (972|0@5@7&#,)!
+3 f1 (972|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 ?!
+3 f11094 (20|3@0@2&#,20|3@0@2&#,)!
+3 f5 (20|3@0@2&#,20|3@0@2&#,)^11097
+1 t11096|11096&
+3 f0 ()!
+3 f966 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 (966|0@5@7&#,)!
+3 f983 (966|0@5@7&#,)!
+3 f0 (966|0@2@7&#,)!
+3 f983 (966|0@2@7&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f975 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f975 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f975 (955|0@5@18&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (966|0@5@7&#,)!
+3 f1 (966|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (966|0@2@7&#,)!
+3 f983 (966|0@2@7&#,)!
+3 f0 (966|0@2@7&#,)!
+3 f983 (966|0@2@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,5|$#,)!
+3 f1 (958|0@5@7&#,5|$#,)!
+3 f0 ()!
+3 f5019 ()!
+3 f0 (5013|$#,)!
+3 f5019 (5013|$#,)!
+3 f0 (9|$#,)!
+3 f5019 (9|$#,)!
+3 f0 (4|$#,)!
+3 f5019 (4|$#,)!
+3 f0 (17|$#,)!
+3 f5019 (17|$#,)!
+3 f0 (983|0@5@2&#,)!
+3 f5019 (983|0@5@2&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f5019 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f5019 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f9 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f4 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f17 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f983 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f2 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f983 (5019|0@5@7&#,)!
+3 f0 (5019|0@5@7&#,)!
+3 f983 (5019|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f5019 (315|$#,)!
+3 f0 (5019|0@5@7&#,5019|0@5@7&#,)!
+3 f5 (5019|0@5@7&#,5019|0@5@7&#,)!
+3 f0 (5019|0@5@2&#,)!
+3 f1 (5019|0@5@2&#,)!
+3 f0 (1763|$#,)!
+3 f2 (1763|$#,)!
+3 f0 (1763|$#,)!
+3 f983 (1763|$#,)!
+3 f0 (5|$#,981|0@5@2&#,)!
+3 f1763 (5|$#,981|0@5@2&#,)!
+3 f0 (1763|15@0@1&#,)!
+3 f1 (1763|15@0@1&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 ?!
+3 f11200 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)^11203
+1 t11202|11202&
+3 f0 (11203|$#,955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (11203|$#,955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,)!
+3 ?!
+3 f11208 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)^11211
+1 t11210|11210&
+3 f0 (11211|$#,955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (11211|$#,955|0@5@18&#,981|0@5@7&#,)!
+3 ?!
+3 f11214 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)^11217
+1 t11216|11216&
+3 f0 (11217|$#,955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (11217|$#,955|0@5@18&#,955|0@5@18&#,)!
+3 ?!
+3 f11220 (955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3948|$#,981|0@5@7&#,)^11223
+1 t11222|11222&
+3 f0 (11223|$#,955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f1 (11223|$#,955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f0 (5|$#,)!
+3 f5628 (5|$#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,)!
+3 f0 (985|$#,)!
+3 f955 (985|$#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (5631|$#,)!
+3 f2 (5631|$#,)!
+3 f0 (955|15@2@6&#,)!
+3 f1 (955|15@2@6&#,)!
+3 f0 (955|0@2@18&#,)!
+3 f5651 (955|0@2@18&#,)!
+3 f0 (955|0@5@18&#,958|0@5@7&#,)!
+3 f1 (955|0@5@18&#,958|0@5@7&#,)!
+3 f0 (955|0@2@18&#,2|$#,981|0@5@7&#,)!
+3 f2 (955|0@2@18&#,2|$#,981|0@5@7&#,)!
+3 f0 (955|0@2@18@2@0#,)!
+3 f955 (955|0@2@18@2@0#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,1778|$#,981|0@5@7&#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,)!
+3 f0 (955|0@5@18&#,958|0@5@7&#,)!
+3 f1 (955|0@5@18&#,958|0@5@7&#,)!
+3 f0 (955|0@2@18@2@0#,955|0@2@18@2@0#,)!
+3 f1 (955|0@2@18@2@0#,955|0@2@18@2@0#,)!
+3 f0 (955|0@5@18@2@0#,981|0@5@7&#,)!
+3 f5655 (955|0@5@18@2@0#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,2|$#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,2|$#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3937|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3937|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18@2@0#,983|0@5@19@2@0#,)!
+3 f955 (955|0@5@18@2@0#,983|0@5@19@2@0#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,1778|$#,2|$#,981|0@5@7&#,2|$#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,1778|$#,2|$#,981|0@5@7&#,2|$#,)!
+3 f0 (955|0@2@18&#,)!
+3 f5651 (955|0@2@18&#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (975|0@5@2&#,975|0@5@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f975 (975|0@5@2&#,975|0@5@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f0 (975|0@5@2&#,975|0@5@19@2@0#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f975 (975|0@5@2&#,975|0@5@19@2@0#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f0 (975|0@5@2&#,975|0@5@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f975 (975|0@5@2&#,975|0@5@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,4245|0@5@7&#,)!
+3 f983 (955|0@5@18&#,4245|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@2@18&#,983|0@5@7&#,)!
+3 f955 (955|0@2@18&#,983|0@5@7&#,)!
+3 f0 (955|@5|0@2@18&#,955|0@5@18&#,)!
+3 f955 (955|@5|0@2@18&#,955|0@5@18&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f5655 (981|0@5@7&#,)!
+3 f0 (5655|0@5@7&#,)!
+3 f5655 (5655|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,)!
+3 ?!
+3 f11310 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)^11313
+1 t11312|11312&
+3 f0 (11313|$#,955|0@5@18&#,)!
+3 f2 (11313|$#,955|0@5@18&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 (955|0@5@18&#,985|$#,)!
+3 f1 (955|0@5@18&#,985|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (5655|0@5@2&#,)!
+3 f1 (5655|0@5@2&#,)!
+3 f0 (5655|0@5@2&#,5655|0@5@7&#,)!
+3 f5655 (5655|0@5@2&#,5655|0@5@7&#,)!
+3 f0 (5655|0@5@2&#,981|0@5@7&#,)!
+3 f5655 (5655|0@5@2&#,981|0@5@7&#,)!
+3 f0 (5655|0@5@2&#,955|0@5@18&#,981|0@5@7&#,)!
+3 f5655 (5655|0@5@2&#,955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (5655|0@5@7&#,)!
+3 f5655 (5655|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f981 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f981 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f981 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f981 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (981|0@5@7&#,)!
+3 f5655 (981|0@5@7&#,)!
+3 f0 (955|0@5@18@2@0#,981|0@5@7&#,)!
+3 f5655 (955|0@5@18@2@0#,981|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f955 ()!
+3 f0 ()!
+3 f955 ()!
+3 f0 (955|0@2@18&#,)!
+3 f955 (955|0@2@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f958 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f958 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (955|0@5@18&#,975|0@5@7&#,)!
+3 f2 (955|0@5@18&#,975|0@5@7&#,)!
+3 f0 (955|0@5@18@2@0#,955|0@5@18&#,)!
+3 f955 (955|0@5@18@2@0#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (5635|$#,5635|$#,)!
+3 f2 (5635|$#,5635|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|@5|0@5@18&#,3769|$#,)!
+3 f955 (955|@5|0@5@18&#,3769|$#,)!
+3 f0 (315|$#,)!
+3 f955 (315|$#,)!
+3 f0 (315|$#,)!
+3 f955 (315|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,4245|0@5@7&#,)!
+3 f985 (955|0@5@18&#,4245|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f985 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,4245|0@5@7&#,)!
+3 f983 (955|0@5@18&#,4245|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (983|0@5@19@2@0#,)!
+3 f955 (983|0@5@19@2@0#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (5|$#,4203|$#,985|$#,)!
+3 f955 (5|$#,4203|$#,985|$#,)!
+3 f0 (5|$#,4203|$#,985|$#,)!
+3 f955 (5|$#,4203|$#,985|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,)!
+3 f0 (4203|$#,985|$#,)!
+3 f955 (4203|$#,985|$#,)!
+3 f0 (955|0@5@18&#,5|$#,)!
+3 f1 (955|0@5@18&#,5|$#,)!
+3 f0 (5|$#,985|$#,)!
+3 f955 (5|$#,985|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,)!
+3 f0 (955|0@2@18&#,)!
+3 f2 (955|0@2@18&#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,5|$#,)!
+3 f955 (955|0@5@18&#,5|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,)!
+3 f0 (985|$#,)!
+3 f955 (985|$#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,1778|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,1778|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,1778|$#,2|$#,981|0@5@7&#,2|$#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,1778|$#,2|$#,981|0@5@7&#,2|$#,)!
+3 f0 (975|0@5@2&#,975|0@5@19@2@0#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f975 (975|0@5@2&#,975|0@5@19@2@0#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f0 (975|0@5@2&#,975|0@5@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f975 (975|0@5@2&#,975|0@5@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|0@2@18&#,2|$#,981|0@5@7&#,)!
+3 f2 (955|0@2@18&#,2|$#,981|0@5@7&#,)!
+3 f0 (955|0@2@18&#,2|$#,981|0@5@7&#,)!
+3 f1 (955|0@2@18&#,2|$#,981|0@5@7&#,)!
+3 f0 (975|0@5@2&#,975|0@5@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f975 (975|0@5@2&#,975|0@5@7&#,2|$#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|@5|0@5@18@2@0#,955|0@5@18@2@0#,)!
+3 f955 (955|@5|0@5@18@2@0#,955|0@5@18@2@0#,)!
+3 f0 ()!
+3 f955 ()!
+3 f0 (5628|$#,)!
+3 f955 (5628|$#,)!
+3 f0 ()!
+3 f955 ()!
+3 f0 ()!
+3 f955 ()!
+3 f0 ()!
+3 f955 ()!
+3 f0 ()!
+3 f955 ()!
+3 f0 (985|$#,)!
+3 f955 (985|$#,)!
+3 f0 ()!
+3 f955 ()!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f4203 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1289 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1289 (955|0@5@18&#,)!
+3 f0 (955|0@5@18@2@0#,5|$#,)!
+3 f955 (955|0@5@18@2@0#,5|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f3937 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,3937|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3937|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3948|$#,)!
+3 f1 (955|0@5@18&#,3948|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f3951 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f3951 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3951|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3951|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,2|$#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,2|$#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3937|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3937|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@2@18&#,3943|$#,981|0@5@7&#,)!
+3 f1 (955|0@2@18&#,3943|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3943|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3943|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3943|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3943|$#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@2&#,)!
+3 f1 (955|0@5@2&#,)!
+3 f0 (955|0@5@18&#,985|$#,)!
+3 f1 (955|0@5@18&#,985|$#,)!
+3 f0 (955|0@5@18&#,985|$#,)!
+3 f1 (955|0@5@18&#,985|$#,)!
+3 f0 (955|0@5@18&#,983|0@5@18&#,)!
+3 f955 (955|0@5@18&#,983|0@5@18&#,)!
+3 f0 (955|0@2@18&#,983|0@5@7&#,)!
+3 f955 (955|0@2@18&#,983|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f975 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@2@18&#,2|$#,5|$#,2|$#,)!
+3 f955 (955|0@2@18&#,2|$#,5|$#,2|$#,)!
+3 f0 (955|0@5@18@2@0#,983|0@5@19@2@0#,)!
+3 f955 (955|0@5@18@2@0#,983|0@5@19@2@0#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@2@18@2@0#,955|0@2@18@2@0#,)!
+3 f1 (955|0@2@18@2@0#,955|0@2@18@2@0#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18@2@0#,5|$#,)!
+3 f955 (955|0@5@18@2@0#,5|$#,)!
+3 f0 (955|0@5@18&#,958|0@5@7&#,)!
+3 f1 (955|0@5@18&#,958|0@5@7&#,)!
+3 f0 (955|0@5@18&#,958|0@5@7&#,)!
+3 f1 (955|0@5@18&#,958|0@5@7&#,)!
+3 f0 (955|0@5@18&#,958|0@5@7&#,)!
+3 f1 (955|0@5@18&#,958|0@5@7&#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,2|$#,)!
+3 f955 (955|0@5@18&#,2|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@2@18@2@0#,)!
+3 f955 (955|0@2@18@2@0#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18@2@0#,)!
+3 f955 (955|0@5@18@2@0#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,5|$#,)!
+3 f955 (955|0@5@18&#,5|$#,)!
+3 f0 (955|0@5@18&#,983|0@5@18&#,)!
+3 f955 (955|0@5@18&#,983|0@5@18&#,)!
+3 f0 (955|0@5@18&#,983|0@5@18&#,)!
+3 f955 (955|0@5@18&#,983|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (985|$#,955|0@5@18&#,983|0@5@19@2@0#,)!
+3 f955 (985|$#,955|0@5@18&#,983|0@5@19@2@0#,)!
+3 f0 (985|$#,)!
+3 f955 (985|$#,)!
+3 f0 (985|$#,)!
+3 f955 (985|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|@5|0@5@18&#,)!
+3 f955 (955|@5|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|@5|0@5@18&#,955|@5|0@5@18&#,)!
+3 f955 (955|@5|0@5@18&#,955|@5|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,3943|$#,)!
+3 f1 (955|0@5@18&#,3943|$#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f5 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,3943|$#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,3943|$#,)!
+3 f0 (955|@5|0@2@18&#,955|0@5@18&#,)!
+3 f955 (955|@5|0@2@18&#,955|0@5@18&#,)!
+3 ?!
+3 f11888 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f2 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)^11891
+1 t11890|11890&
+3 ?!
+3 f11892 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)^11895
+1 t11894|11894&
+3 f0 (11891|$#,11895|0@5@7&#,955|0@5@18&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (11891|$#,11895|0@5@7&#,955|0@5@18&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (990|$#,955|0@5@18&#,)!
+3 f2 (990|$#,955|0@5@18&#,)!
+3 ?!
+3 f11900 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)^11903
+1 t11902|11902&
+3 f0 (11903|$#,955|0@5@18&#,)!
+3 f2 (11903|$#,955|0@5@18&#,)!
+3 ?!
+3 f11906 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)^11909
+1 t11908|11908&
+3 f0 (11909|$#,955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (11909|$#,955|0@5@18&#,981|0@5@7&#,)!
+3 ?!
+3 f11912 (955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3948|$#,981|0@5@7&#,)^11915
+1 t11914|11914&
+3 f0 (11915|$#,955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 f1 (11915|$#,955|0@5@18&#,3948|$#,981|0@5@7&#,)!
+3 ?!
+3 f11918 (955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (955|0@5@18&#,981|0@5@7&#,)^11921
+1 t11920|11920&
+3 f0 (11921|$#,955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (11921|$#,955|0@5@18&#,981|0@5@7&#,)!
+3 ?!
+3 f11924 (955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,)^11927
+1 t11926|11926&
+3 f0 (11927|$#,955|0@5@18&#,955|0@5@18&#,)!
+3 f1 (11927|$#,955|0@5@18&#,955|0@5@18&#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,1778|$#,981|0@5@7&#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,1778|$#,981|0@5@7&#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,1778|$#,981|0@5@7&#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f955 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,983|0@5@18&#,)!
+3 f955 (955|0@5@18&#,983|0@5@18&#,)!
+3 f0 (955|0@5@18&#,983|0@5@18&#,)!
+3 f955 (955|0@5@18&#,983|0@5@18&#,)!
+3 f0 (955|0@2@18&#,)!
+3 f5651 (955|0@2@18&#,)!
+3 f0 (955|0@2@18&#,)!
+3 f5651 (955|0@2@18&#,)!
+3 f0 (955|0@2@18@2@0#,955|0@2@18@2@0#,)!
+3 f1 (955|0@2@18@2@0#,955|0@2@18@2@0#,)!
+3 f0 (955|15@2@6&#,)!
+3 f1 (955|15@2@6&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (5|$#,)!
+3 f5628 (5|$#,)!
+3 f0 (955|0@2@18&#,955|0@2@18&#,)!
+3 f1 (955|0@2@18&#,955|0@2@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f983 (955|0@5@18&#,)!
+3 f0 (955|@5|0@5@18&#,985|$#,958|0@5@7&#,)!
+3 f955 (955|@5|0@5@18&#,985|$#,958|0@5@7&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|@7|0@5@18&#,)!
+3 f2 (955|@7|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 U!82{951|@1|0@5@3&#ltok,1490|@1|^#typequal,6|@1|^#count,2431|@1|0@5@2&#ltokenList,2656|@1|0@0@2&#abstDecl,2660|@1|0@0@2&#declare,2670|@1|0@0@2&#declarelist,948|@1|0@0@2&#typeexpr,2685|@1|0@0@2&#array,2714|@1|0@0@2&#quantifier,2724|@1|0@0@2&#quantifiers,2689|@1|0@0@2&#var,2699|@1|0@0@2&#vars,2744|@1|0@0@2&#storeref,2762|@1|0@0@2&#storereflist,937|@1|0@0@2&#term,943|@1|0@0@2&#termlist,2812|@1|0@0@2&#program,3340|@1|0@0@2&#stmt,2912|@1|0@0@2&#claim,3000|@1|0@0@2&#type,2949|@1|0@0@2&#iter,2918|@1|0@0@2&#fcn,2928|@1|0@5@2&#fcns,2783|@1|0@0@2&#letdecl,2791|@1|0@0@2&#letdecls,2835|@1|0@0@2&#lclpredicate,2777|@1|0@0@2&#modify,2278|@1|0@0@2&#param,2296|@1|0@5@2&#paramlist,2628|@1|0@0@2&#declaratorinvs,2618|@1|0@0@2&#declaratorinv,2953|@1|0@0@2&#abstbody,2959|@1|0@0@2&#abstract,2839|@1|0@0@2&#exposed,2904|@1|0@0@2&#globals,2875|@1|0@0@2&#constdeclaration,2884|@1|0@0@2&#vardeclaration,2894|@1|0@0@2&#vardeclarationlist,2862|@1|0@0@2&#initdecls,2852|@1|0@0@2&#initdecl,2975|@1|0@0@2&#structdecls,2965|@1|0@0@2&#structdecl,3008|@1|0@0@2&#structorunion,3014|@1|0@0@2&#enumspec,940|@1|0@5@2&#lcltypespec,3044|@1|0@0@2&#typname,3075|@1|0@0@2&#opform,3086|@1|0@0@2&#signature,3136|@1|0@0@2&#name,3054|@1|0@0@2&#namelist,3181|@1|0@0@2&#replace,3191|@1|0@0@2&#replacelist,3214|@1|0@0@2&#renaming,3220|@1|0@0@2&#traitref,3228|@1|0@0@2&#traitreflist,2491|@1|0@0@2&#import,2505|@1|0@0@2&#importlist,3268|@1|0@0@2&#iface,3278|@1|0@0@2&#interfacelist,2848|@1|0@0@2&#ctypes,}!
+0 s6575|&
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 ()!
+3 f952 ()!
+3 f0 ()!
+3 f951 ()!
+3 f0 (951|0@5@2&#,)!
+3 f1 (951|0@5@2&#,)!
+3 f0 ()!
+3 f19 ()!
+3 f2076 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (2076|$#,)!
+3 f1 (2076|$#,)!
+3 f0 ()!
+3 f1 ()!
+2 F0/0|0&
+2 F1061/0|1061&
+2 F0/0|0&
+2 F1061/0|1061&
+3 f0 (213|$#,983|0@5@7&#,)!
+3 f2 (213|$#,983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 (213|$#,983|0@5@7&#,)!
+3 f2 (213|$#,983|0@5@7&#,)!
+2 F0/0|0&
+2 F4/0|4&
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 S_filelocStack{5|@1|^#nelements,5|@1|^#free,3850|@1|11@3@3&#elements,}!
+0 s6434|-1 12041 -1
+1 t12040|12040&
+0 a344|&
+3 f0 (12042|0@5@7&#,)!
+3 f2 (12042|0@5@7&#,)!
+3 f0 (12042|@7|0@5@7&#,)!
+3 f5 (12042|@7|0@5@7&#,)!
+3 f0 (12042|0@5@7&#,)!
+3 f5 (12042|0@5@7&#,)!
+3 f0 (12042|0@5@7&#,)!
+3 f1 (12042|0@5@7&#,)!
+3 f0 (12042|0@5@7&#,)!
+3 f1 (12042|0@5@7&#,)!
+3 f0 ()!
+3 f12042 ()!
+3 f0 (12042|0@5@7&#,)!
+3 f981 (12042|0@5@7&#,)!
+3 f0 (12042|0@5@7&#,981|0@5@2&#,)!
+3 f2 (12042|0@5@7&#,981|0@5@2&#,)!
+3 f0 (12042|0@5@7&#,)!
+3 f983 (12042|0@5@7&#,)!
+3 f0 (12042|0@5@2&#,)!
+3 f1 (12042|0@5@2&#,)!
+3 S_intSet{5|@1|^#entries,5|@1|^#nspace,24|@1|11@3@3&#elements,}!
+0 s6411|-1 12065 -1
+1 t12064|12064&
+0 a345|&
+3 f1 (12066|@7|&#,5|@3|&#,)!
+3 f0 ()!
+3 f12066 ()!
+3 f0 (12066|$#,)!
+3 f2 (12066|$#,)!
+3 f0 (12066|$#,)!
+3 f5 (12066|$#,)!
+3 f0 (12066|$#,5|$#,)!
+3 f2 (12066|$#,5|$#,)!
+3 f0 (12066|$#,5|$#,)!
+3 f2 (12066|$#,5|$#,)!
+3 f0 (12066|$#,)!
+3 f983 (12066|$#,)!
+3 f0 (12066|0@0@2&#,)!
+3 f1 (12066|0@0@2&#,)!
+3 f0 (12066|$#,)!
+3 f983 (12066|$#,)!
+3 S!83{983|@1|0@5@3&#file,959|@1|^#daccess,}!
+0 s6357|&
+0 s361|-1 12090 -1
+3 e!84{CX_GLOBAL,CX_INNER,CX_FUNCTION,CX_FCNDECL,CX_MACROFCN,CX_MACROCONST,CX_UNKNOWNMACRO,CX_ITERDEF,CX_ITEREND,CX_LCL,CX_LCLLIB}!
+0 s6635|&
+0 s346|&
+1 t12086|12086&
+2 F0/0|0&
+2 F2/0|982&
+2 F0/0|0&
+2 F2/0|982&
+2 F0/0|0&
+2 F2/0|982&
+2 F0/0|0&
+2 F2/0|982&
+2 F0/0|0&
+2 F5/0|5&
+2 F0/0|0&
+2 F5/0|5&
+2 F0/0|0&
+2 F984/0|984&
+3 U!85{2|@1|^#glob,5|@1|^#cdepth,958|@1|0@5@18@2@0#fcn,}!
+0 s6557|&
+3 S_context{5|@1|^#linesprocessed,5|@1|^#speclinesprocessed,6741|@1|0@0@3&#markers,2|@1|^#macroMissingParams,2|@1|^#preprocessing,2|@1|^#incommandline,2|@1|^#insuppressregion,2|@1|^#inDerivedFile,2|@1|^#instandardlib,2|@1|^#inimport,2|@1|^#inheader,2|@1|^#inmacrocache,2|@1|^#protectVars,2|@1|^#neednl,2|@1|^#showfunction,2|@1|^#savedFlags,2|@1|^#justpopped,2|@1|^#anyExports,1862|@1|^#library,1289|@1|^#isNullGuarded,981|@1|0@5@3&#saveloc,981|@1|0@5@3&#pushloc,6883|@1|0@0@3&#clauses,1778|@1|^#inclause,5|@1|^#numerrors,12042|@1|0@5@3&#locstack,6794|@1|0@5@3&#ftab,983|@1|0@5@3&#msgAnnote,955|@1|0@5@18@3@0#aliasAnnote,955|@1|0@5@18@3@0#aliasAnnoteAls,6868|@1|0@5@3&#msgLog,6765|@1|0@0@3&#mc,975|@1|0@5@18@3@0#mods,959|@1|^#facct,959|@1|^#acct,959|@1|^#nacct,4327|@1|0@5@18@3@0#globs,4327|@1|0@5@2&#globs_used,5|@1|^#nmods,5|@1|^#maxmods,12090|@1|11@0@3&#moduleaccess,12089|@1|^#kind,985|@1|^#boolType,12092|@1|^#flags,12094|@1|^#saveflags,12096|@1|^#setGlobally,12098|@1|^#setLocally,12100|@1|^#values,12102|@1|^#counters,12104|@1|^#strings,6679|@1|0@5@3&#modrecs,12105|@1|^#cont,}!
+0 s6548|&
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (1862|$#,5|$#,)!
+3 f1 (1862|$#,5|$#,)!
+3 f0 (1862|$#,2|$#,)!
+3 f1 (1862|$#,2|$#,)!
+3 f0 (1862|$#,2|$#,2|$#,2|$#,)!
+3 f1 (1862|$#,2|$#,2|$#,2|$#,)!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (1778|$#,)!
+3 f1 (1778|$#,)!
+3 f0 (6883|$#,)!
+3 f1778 (6883|$#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (981|0@5@7&#,1862|$#,)!
+3 f2 (981|0@5@7&#,1862|$#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 (1862|$#,981|0@5@7&#,)!
+3 f2 (1862|$#,981|0@5@7&#,)!
+3 f0 (1862|$#,981|0@5@7&#,)!
+3 f2 (1862|$#,981|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f2 (981|0@5@7&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (1862|$#,1289|$#,)!
+3 f1 (1862|$#,1289|$#,)!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@2&#,959|$#,)!
+3 f1 (983|0@5@2&#,959|$#,)!
+3 f0 (983|0@5@7&#,4204|$#,)!
+3 f1 (983|0@5@7&#,4204|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1862 ()!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 ()!
+3 f19 ()!
+3 f23 ()!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 ()!
+3 f959 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (4204|$#,)!
+3 f1 (4204|$#,)!
+3 f0 (4204|$#,)!
+3 f1 (4204|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (958|0@5@19@3@0#,)!
+3 f1 (958|0@5@19@3@0#,)!
+3 f0 (958|0@5@18@3@0#,)!
+3 f1 (958|0@5@18@3@0#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1778 ()!
+3 f0 ()!
+3 f1778 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (1778|$#,)!
+3 f1 (1778|$#,)!
+3 f0 (969|0@5@7&#,1778|$#,)!
+3 f1 (969|0@5@7&#,1778|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,2|$#,)!
+3 f1 (969|0@5@7&#,2|$#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,1778|$#,)!
+3 f1 (969|0@5@7&#,1778|$#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (958|0@5@18@2@0#,)!
+3 f1 (958|0@5@18@2@0#,)!
+3 f0 ()!
+3 f958 ()!
+3 f0 (981|0@5@7&#,)!
+3 f1 (981|0@5@7&#,)!
+3 f0 (958|0@5@19@2@0#,)!
+3 f1 (958|0@5@19@2@0#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f2 (958|0@5@7&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,)!
+3 f0 ()!
+3 f975 ()!
+3 f0 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)!
+3 f0 (4204|$#,)!
+3 f2 (4204|$#,)!
+3 f0 (4204|$#,)!
+3 f2 (4204|$#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 (4204|$#,)!
+3 f2 (4204|$#,)!
+3 f0 ()!
+3 f985 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f4245 ()!
+3 f0 ()!
+3 f4327 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f4327 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 (955|0@5@18@3@0#,955|0@5@18@3@0#,)!
+3 f1 (955|0@5@18@3@0#,955|0@5@18@3@0#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 (975|0@5@18&#,)!
+3 f1 (975|0@5@18&#,)!
+3 f0 (4327|0@5@18&#,)!
+3 f1 (4327|0@5@18&#,)!
+3 f0 (4|$#,)!
+3 f1 (4|$#,)!
+3 f0 ()!
+3 f4 ()!
+3 f0 (1862|$#,5|$#,)!
+3 f1 (1862|$#,5|$#,)!
+3 f0 (1862|$#,5|$#,)!
+3 f1 (1862|$#,5|$#,)!
+3 f0 (1862|$#,)!
+3 f5 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f5 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 (1862|$#,983|0@5@2&#,)!
+3 f1 (1862|$#,983|0@5@2&#,)!
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f985 ()!
+3 f0 ()!
+3 f985 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f985 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f981 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 (1862|$#,2|$#,)!
+3 f1 (1862|$#,2|$#,)!
+3 f0 (1862|$#,1289|$#,)!
+3 f1 (1862|$#,1289|$#,)!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 (1862|$#,2|$#,)!
+3 f1 (1862|$#,2|$#,)!
+3 f0 (1862|$#,2|$#,)!
+3 f1 (1862|$#,2|$#,)!
+3 f0 (1862|$#,2|$#,2|$#,2|$#,)!
+3 f1 (1862|$#,2|$#,2|$#,2|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (1312|$#,5|$#,)!
+3 f1 (1312|$#,5|$#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f1 (958|0@5@19@3@0#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f1 (958|0@5@19@3@0#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f6794 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f6868 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (1312|$#,)!
+3 f1 (1312|$#,)!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 ()!
+3 f1 ()!
+3 S!86{1866|@1|^#kind,23|@1|0@5@18@3@0#name,23|@1|0@5@18@3@0#describe,}!
+0 s6427|&
+0 s368|-1 -1 12619
+2 y12618|12618&
+3 e!87{ARG_NONE,ARG_VALUE,ARG_STRING,ARG_SPECIAL}!
+0 s6636|&
+0 s347|&
+3 S!88{1866|@1|^#main,1866|@1|^#sub,2|@1|^#isSpecial,2|@1|^#isIdem,2|@1|^#isGlobal,2|@1|^#isModeFlag,12622|@1|^#argtype,23|@1|0@0@18@3@0#flag,1862|@1|^#code,23|@1|0@5@18@3@0#desc,1062|@1|0@5@3@3@0#hint,5|@1|^#nreported,5|@1|^#nsuppressed,}!
+0 s6539|&
+0 s370|-1 -1 12626
+2 y12625|12625&
+0 s348|&
+3 f1 (12625|@3|6@0@19@3@0#,)!
+2 y1062|1062&
+3 f1 (1062|@3|6@5@19@3@0#,)!
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 ()!
+3 f1804 ()!
+3 f0 (1866|$#,)!
+3 f983 (1866|$#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f1 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f5 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 (1866|$#,)!
+3 f5 (1866|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1866 (983|0@5@7&#,)!
+3 f0 (1866|$#,)!
+3 f983 (1866|$#,)!
+3 f0 (1866|$#,)!
+3 f5 (1866|$#,)!
+3 f0 (1866|$#,)!
+3 f1 (1866|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (2|$#,2|$#,)!
+3 f1 (2|$#,2|$#,)!
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f983 (983|0@5@7&#,)!
+3 f0 ()!
+3 f1804 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (1862|$#,)!
+3 f983 (1862|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1862 (983|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@7&#,)!
+3 f1 (1862|$#,983|0@5@7&#,)!
+3 f0 (1862|$#,983|0@5@2&#,)!
+3 f1 (1862|$#,983|0@5@2&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 ()!
+3 f983 ()!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (1862|$#,)!
+3 f5 (1862|$#,)!
+2 F0/0|0&
+2 F1862/0|1862&
+3 f0 (1862|$#,)!
+3 f5 (1862|$#,)!
+2 F0/0|0&
+2 F1862/0|1862&
+3 f0 (1862|$#,)!
+3 f2 (1862|$#,)!
+3 f0 (20|4@5@2&#,)!
+3 f1 (20|4@5@2&#,)!
+3 f0 (20|0@5@17&#,)!
+3 f1 (20|0@5@17&#,)!
+3 f0 (63|$#,)!
+3 f10 (63|$#,)!
+3 f0 (63|$#,23|$#,5|$#,)!
+3 f19 (63|$#,23|$#,5|$#,)!
+3 f20 (63|$#,23|$#,5|$#,)!
+3 f0 (63|$#,63|$#,23|$#,5|$#,)!
+3 f19 (63|$#,63|$#,23|$#,5|$#,)!
+3 f20 (63|$#,63|$#,23|$#,5|$#,)!
+3 f0 (20|4@5@7&#,63|$#,23|$#,5|$#,)!
+3 f19 (20|@5|4@5@2&#,63|$#,23|$#,5|$#,)!
+3 f20 (20|@5|4@5@2&#,63|$#,23|$#,5|$#,)!
+3 f0 (5|$#,)!
+3 f19 (5|$#,)!
+3 f23 (5|$#,)!
+2 F0/255|0&
+2 F4/255|4&
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (23|0@0@6&#,23|$#,)!
+3 f19 (23|0@0@6&#,23|$#,)!
+3 f23 (23|0@0@6&#,23|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f2 (23|$#,23|$#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (23|0@0@2&#,)!
+3 f19 (23|0@0@2&#,)!
+3 f23 (23|0@0@2&#,)!
+3 f0 (23|0@0@17&#,)!
+3 f1 (23|0@0@17&#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,)!
+3 f23 (23|$#,23|$#,)!
+3 f0 (315|$#,)!
+3 f5 (315|$#,)!
+3 f0 (315|$#,)!
+3 f4 (315|$#,)!
+3 f0 (315|$#,)!
+3 f17 (315|$#,)!
+3 f0 (315|$#,)!
+3 f19 (315|$#,)!
+3 f23 (315|$#,)!
+3 f0 (315|$#,4|$#,)!
+3 f2 (315|$#,4|$#,)!
+3 f0 (315|$#,4|$#,23|$#,5|$#,)!
+3 f1 (315|$#,4|$#,23|$#,5|$#,)!
+3 f0 (5|$#,)!
+3 f19 (5|$#,)!
+3 f23 (5|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,)!
+3 f23 (23|$#,23|$#,)!
+3 f0 (23|0@0@2&#,23|0@0@2&#,)!
+3 f19 (23|0@0@2&#,23|0@0@2&#,)!
+3 f23 (23|0@0@2&#,23|0@0@2&#,)!
+3 f0 (23|0@0@2&#,23|$#,)!
+3 f19 (23|0@0@2&#,23|$#,)!
+3 f23 (23|0@0@2&#,23|$#,)!
+3 f0 (23|0@0@2&#,4|$#,)!
+3 f19 (23|0@0@2&#,4|$#,)!
+3 f23 (23|0@0@2&#,4|$#,)!
+3 f0 (23|$#,)!
+3 f19 (23|0@5@7&#,)!
+3 f23 (23|0@5@7&#,)!
+3 f0 (23|$#,)!
+3 f19 (23|@5|0@5@7&#,)!
+3 f23 (23|@5|0@5@7&#,)!
+3 f0 (5|$#,)!
+3 f19 (5|$#,)!
+3 f23 (5|$#,)!
+3 f0 (213|$#,23|$#,)!
+3 f1 (213|$#,23|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (5|$#,)!
+3 f10 (5|$#,)!
+3 f0 (5|$#,)!
+3 f63 (5|$#,)!
+3 f0 (63|$#,)!
+3 f5 (63|$#,)!
+3 f0 (63|$#,)!
+3 f9 (63|$#,)!
+3 f0 (5|$#,)!
+3 f4 (5|$#,)!
+3 f0 (10|$#,)!
+3 f5 (10|$#,)!
+3 f0 (9|$#,)!
+3 f5 (9|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f2 (23|$#,23|$#,)!
+3 f0 (23|0@5@7&#,23|0@5@7&#,)!
+3 f2 (23|0@5@7&#,23|0@5@7&#,)!
+3 f0 (23|@5|$#,)!
+3 f19 (23|@5|$#,)!
+3 f23 (23|@5|$#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (5|$#,213|$#,)!
+3 f1 (5|$#,213|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (23|$#,758|4@0@7&#,)!
+3 f5 (23|$#,758|4@0@7&#,)!
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 (315|$#,315|4@0@7&#,7690|4@0@7&#,)!
+3 f2 (315|$#,315|4@0@7&#,7690|4@0@7&#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (23|$#,23|@5|$#,)!
+3 f19 (23|$#,23|@5|$#,)!
+3 f23 (23|$#,23|@5|$#,)!
+3 f0 ()!
+3 f19 ()!
+3 f23 ()!
+3 f0 (23|$#,315|4@0@7&#,)!
+3 f7576 (23|$#,315|4@0@7&#,)!
+3 f0 (23|$#,23|$#,315|4@0@7&#,)!
+3 f7576 (23|$#,23|$#,315|4@0@7&#,)!
+2 F0/0|0&
+2 F4/0|4&
+3 f0 (23|$#,23|$#,315|4@0@7&#,)!
+3 f7576 (23|$#,23|$#,315|4@0@7&#,)!
+2 F0/0|0&
+2 F4/0|4&
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 (9162|$#,9162|4@0@7&#,7690|4@0@7&#,)!
+3 f2 (9162|$#,9162|4@0@7&#,7690|4@0@7&#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (23|0@5@7&#,)!
+3 f5 (23|0@5@7&#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (23|$#,)!
+3 f983 (23|$#,)!
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 (4|$#,)!
+3 f2 (4|$#,)!
+3 f0 ()!
+3 f6883 ()!
+3 f0 (6883|$#,)!
+3 f1 (6883|$#,)!
+3 f0 (6883|$#,1778|$#,)!
+3 f1 (6883|$#,1778|$#,)!
+3 f0 (6883|$#,)!
+3 f1 (6883|$#,)!
+3 f0 (6883|$#,)!
+3 f1778 (6883|$#,)!
+3 f0 (6883|$#,1778|$#,)!
+3 f1 (6883|$#,1778|$#,)!
+3 f0 (6883|$#,1778|$#,)!
+3 f1 (6883|$#,1778|$#,)!
+3 f0 (6883|$#,)!
+3 f5 (6883|$#,)!
+3 f0 (6883|$#,)!
+3 f983 (6883|$#,)!
+3 f0 (6883|$#,)!
+3 f1 (6883|$#,)!
+3 f0 (6883|0@0@2&#,)!
+3 f1 (6883|0@0@2&#,)!
+3 f0 ()!
+3 f12042 ()!
+1 t981|981&
+3 f0 ()!
+3 f12042 ()!
+3 f0 (12042|0@2@7&#,)!
+3 f1 (12042|0@2@7&#,)!
+3 f0 (12042|@5|0@5@7&#,981|0@5@4&#,)!
+3 f1 (12042|@5|0@5@7&#,981|0@5@4&#,)!
+3 f0 (12042|0@5@7&#,)!
+3 f981 (12042|0@5@7&#,)!
+3 f0 (12042|0@5@7&#,)!
+3 f1 (12042|0@5@7&#,)!
+3 f0 (12042|0@5@7&#,981|0@5@2&#,)!
+3 f2 (12042|0@5@7&#,981|0@5@2&#,)!
+3 f0 (12042|0@5@7&#,)!
+3 f983 (12042|0@5@7&#,)!
+3 f0 (12042|0@5@7&#,)!
+3 f5 (12042|0@5@7&#,)!
+3 f0 (12042|0@5@7&#,)!
+3 f1 (12042|0@5@7&#,)!
+3 f0 (12042|0@5@2&#,)!
+3 f1 (12042|0@5@2&#,)!
+3 f0 ()!
+3 f1834 ()!
+3 f0 ()!
+3 f1834 ()!
+3 f0 (1834|0@2@7&#,)!
+3 f1 (1834|0@2@7&#,)!
+3 f0 (983|0@5@4&#,)!
+3 f1834 (983|0@5@4&#,)!
+3 f0 (1834|@5|0@5@7&#,983|0@5@4&#,)!
+3 f1834 (1834|@5|0@5@7&#,983|0@5@4&#,)!
+3 f0 (1834|0@5@7&#,)!
+3 f983 (1834|0@5@7&#,)!
+3 f0 (1834|0@5@7&#,983|0@5@7&#,)!
+3 f983 (1834|0@5@7&#,983|0@5@7&#,)!
+3 f0 (1834|0@5@7&#,5|$#,5|$#,5|$#,)!
+3 f1 (1834|0@5@7&#,5|$#,5|$#,5|$#,)!
+3 f0 (1834|0@5@7&#,)!
+3 f983 (1834|0@5@7&#,)!
+3 f0 (1834|0@5@2&#,)!
+3 f1 (1834|0@5@2&#,)!
+3 f0 (1834|0@5@7&#,)!
+3 f1 (1834|0@5@7&#,)!
+3 ?!
+3 f12944 (20|0@5@7&#,20|6@5@19@2@0#,)!
+3 f5 (20|0@5@7&#,20|6@5@19@2@0#,)^12947
+1 t12946|12946&
+3 f0 ()!
+3 f1804 ()!
+3 f0 ()!
+3 f1804 ()!
+3 f0 (1804|0@2@7&#,)!
+3 f1 (1804|0@2@7&#,)!
+3 f0 (983|0@5@19@2@0#,)!
+3 f1804 (983|0@5@19@2@0#,)!
+3 f0 (1804|@5|0@5@7&#,983|0@5@19@2@0#,)!
+3 f1804 (1804|@5|0@5@7&#,983|0@5@19@2@0#,)!
+3 f0 (1804|0@5@7&#,)!
+3 f983 (1804|0@5@7&#,)!
+3 f0 (1804|0@5@7&#,983|0@5@7&#,)!
+3 f983 (1804|0@5@7&#,983|0@5@7&#,)!
+3 f0 (1804|0@5@7&#,5|$#,5|$#,5|$#,)!
+3 f1 (1804|0@5@7&#,5|$#,5|$#,5|$#,)!
+3 f0 (1804|0@5@7&#,)!
+3 f983 (1804|0@5@7&#,)!
+3 f0 (1804|0@5@2&#,)!
+3 f1 (1804|0@5@2&#,)!
+3 f0 (1804|0@5@7&#,)!
+3 f1 (1804|0@5@7&#,)!
+3 ?!
+3 f12970 (20|6@1@11&#,20|6@0@0&#,)!
+3 f5 (20|6@1@11&#,20|6@0@0&#,)^12973
+1 t12972|12972&
+3 f0 ()!
+3 f6679 ()!
+3 f0 (6679|0@2@7&#,)!
+3 f1 (6679|0@2@7&#,)!
+3 f0 (6679|@5|0@5@7&#,975|0@5@18@2@0#,)!
+3 f6679 (6679|@5|0@5@7&#,975|0@5@18@2@0#,)!
+3 f0 (6679|0@5@7&#,)!
+3 f1 (6679|0@5@7&#,)!
+3 f0 (6679|0@5@2&#,)!
+3 f1 (6679|0@5@2&#,)!
+3 f0 ()!
+3 f4367 ()!
+3 f0 (4367|0@2@7&#,)!
+3 f1 (4367|0@2@7&#,)!
+3 f0 (4367|0@5@7&#,985|$#,)!
+3 f1 (4367|0@5@7&#,985|$#,)!
+3 f0 (4367|0@5@7&#,)!
+3 f983 (4367|0@5@7&#,)!
+3 f0 (4367|0@5@2&#,)!
+3 f1 (4367|0@5@2&#,)!
+3 f0 ()!
+3 f3890 ()!
+1 t3882|3882&
+3 f0 (3882|0@5@4&#,)!
+3 f3890 (3882|0@5@4&#,)!
+3 f0 (3890|$#,3890|$#,)!
+3 f2 (3890|$#,3890|$#,)!
+3 f0 (3890|$#,)!
+3 f1 (3890|$#,)!
+3 f0 (3890|$#,3882|0@5@4&#,)!
+3 f1 (3890|$#,3882|0@5@4&#,)!
+3 f0 (3890|@5|$#,3882|0@5@2&#,)!
+3 f3890 (3890|@5|$#,3882|0@5@2&#,)!
+3 f0 (3890|$#,)!
+3 f3890 (3890|$#,)!
+3 f0 (3890|$#,983|0@5@7&#,)!
+3 f2 (3890|$#,983|0@5@7&#,)!
+3 f0 (3890|$#,3890|$#,)!
+3 f3890 (3890|$#,3890|$#,)!
+3 f0 (3890|$#,)!
+3 f983 (3890|$#,)!
+3 f0 (3890|$#,)!
+3 f983 (3890|$#,)!
+3 f0 (3890|$#,)!
+3 f983 (3890|$#,)!
+3 f0 (9162|$#,)!
+3 f3890 (9162|$#,)!
+3 f0 (3890|0@0@2&#,)!
+3 f1 (3890|0@0@2&#,)!
+3 f0 (3920|0@0@2&#,)!
+3 f1 (3920|0@0@2&#,)!
+3 f0 ()!
+3 f3769 ()!
+1 t969|969&
+3 f0 (3769|$#,)!
+3 f1 (3769|$#,)!
+3 f0 (3769|$#,969|0@5@2&#,)!
+3 f1 (3769|$#,969|0@5@2&#,)!
+3 f0 (3769|$#,)!
+3 f1 (3769|$#,)!
+3 f0 (3769|$#,)!
+3 f1 (3769|$#,)!
+3 f0 (3769|$#,)!
+3 f969 (3769|$#,)!
+3 f0 (3769|$#,)!
+3 f969 (3769|$#,)!
+3 f0 (3769|$#,5|$#,)!
+3 f969 (3769|$#,5|$#,)!
+3 f0 (969|0@5@2&#,)!
+3 f3769 (969|0@5@2&#,)!
+3 f0 (3769|@5|$#,969|0@5@2&#,)!
+3 f3769 (3769|@5|$#,969|0@5@2&#,)!
+3 f0 (3769|$#,5|$#,)!
+3 f969 (3769|$#,5|$#,)!
+3 f0 (3769|$#,)!
+3 f983 (3769|$#,)!
+3 f0 (3769|0@0@2&#,)!
+3 f1 (3769|0@0@2&#,)!
+3 f0 (3769|0@0@2&#,)!
+3 f1 (3769|0@0@2&#,)!
+0 s71|-1 13055 -1
+1 t13054|13054&
+3 S_exprNodeSList{5|@1|^#nelements,5|@1|^#nspace,13055|@1|11@3@3&#elements,}!
+0 s6463|-1 13058 -1
+1 t13057|13057&
+0 a349|&
+3 f1 (13059|@7|&#,969|@3|6@5@19@2@0#,)!
+3 f0 ()!
+3 f13059 ()!
+3 f0 (969|0@5@18@2@0#,)!
+3 f13059 (969|0@5@18@2@0#,)!
+3 f0 (13059|$#,969|0@5@18@2@0#,)!
+3 f1 (13059|$#,969|0@5@18@2@0#,)!
+3 f0 (13059|$#,)!
+3 f983 (13059|$#,)!
+3 f0 (13059|0@0@2&#,)!
+3 f1 (13059|0@0@2&#,)!
+3 f0 (13059|@5|$#,13059|0@0@2&#,)!
+3 f13059 (13059|@5|$#,13059|0@0@2&#,)!
+3 f0 ()!
+3 f13059 ()!
+3 f0 (13059|$#,)!
+3 f1 (13059|$#,)!
+3 f0 (13059|$#,969|0@5@18@2@0#,)!
+3 f1 (13059|$#,969|0@5@18@2@0#,)!
+3 f0 (13059|@5|$#,13059|0@0@2&#,)!
+3 f13059 (13059|@5|$#,13059|0@0@2&#,)!
+3 f0 (969|0@5@18@2@0#,)!
+3 f13059 (969|0@5@18@2@0#,)!
+3 f0 (13059|$#,)!
+3 f983 (13059|$#,)!
+3 f0 (13059|0@0@2&#,)!
+3 f1 (13059|0@0@2&#,)!
+3 f0 ()!
+3 f4245 ()!
+3 f0 (958|0@5@4&#,)!
+3 f4245 (958|0@5@4&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 (4245|@5|0@5@7&#,958|0@5@4&#,)!
+3 f4245 (4245|@5|0@5@7&#,958|0@5@4&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,2|$#,2|$#,)!
+3 f2 (4245|0@5@7&#,4245|0@5@7&#,2|$#,2|$#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,983|0@5@7&#,)!
+3 f5 (4245|0@5@7&#,983|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,983|0@5@7&#,)!
+3 f5 (4245|0@5@7&#,983|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f4245 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@2&#,)!
+3 f1 (4245|0@5@2&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,5|$#,)!
+3 f958 (4245|0@5@7&#,5|$#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f5 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f5 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f5 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f958 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f983 (4245|0@5@7&#,)!
+3 f0 (315|$#,981|0@5@7&#,)!
+3 f4245 (315|$#,981|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f4245 (315|$#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f5 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,983|0@5@7&#,)!
+3 f958 (4245|0@5@7&#,983|0@5@7&#,)!
+3 f0 (4245|0@5@2&#,4245|0@5@2&#,)!
+3 f4245 (4245|0@5@2&#,4245|0@5@2&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f1 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f0 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f2 (4245|0@5@7&#,4245|0@5@7&#,)!
+3 f0 ()!
+3 f3854 ()!
+3 f0 ()!
+3 f3854 ()!
+3 f0 (3854|0@2@7&#,)!
+3 f1 (3854|0@2@7&#,)!
+3 f0 (3854|@5|0@5@7&#,3854|0@5@2&#,)!
+3 f3854 (3854|@5|0@5@7&#,3854|0@5@2&#,)!
+3 f0 (3854|@5|0@5@7&#,)!
+3 f3854 (3854|@5|0@5@7&#,)!
+3 f0 (3854|0@5@7&#,)!
+3 f2 (3854|0@5@7&#,)!
+3 f0 (3854|@5|0@5@7&#,981|0@5@7&#,981|0@5@7&#,)!
+3 f3854 (3854|@5|0@5@7&#,981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (3854|@5|0@5@7&#,981|0@5@2&#,)!
+3 f3854 (3854|@5|0@5@7&#,981|0@5@2&#,)!
+3 f0 (3854|0@5@7&#,)!
+3 f983 (3854|0@5@7&#,)!
+3 f0 (3854|0@5@7&#,)!
+3 f5 (3854|0@5@7&#,)!
+3 f0 (3854|0@5@7&#,)!
+3 f983 (3854|0@5@7&#,)!
+3 f0 (3854|0@5@2&#,)!
+3 f1 (3854|0@5@2&#,)!
+3 f0 ()!
+3 f2108 ()!
+3 f0 ()!
+3 f2108 ()!
+3 f0 (2108|0@5@7&#,)!
+3 f1 (2108|0@5@7&#,)!
+3 f0 (2108|0@2@7&#,)!
+3 f1 (2108|0@2@7&#,)!
+3 f0 (2108|@5|0@5@7&#,1490|$#,)!
+3 f2108 (2108|@5|0@5@7&#,1490|$#,)!
+3 f0 (2108|@5|0@5@7&#,2108|0@5@7&#,)!
+3 f2108 (2108|@5|0@5@7&#,2108|0@5@7&#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f2108 (2108|0@5@7&#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f983 (2108|0@5@7&#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f983 (2108|0@5@7&#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f2 (2108|0@5@7&#,)!
+3 f0 (2108|0@5@7&#,)!
+3 f2 (2108|0@5@7&#,)!
+3 f0 (2108|0@5@2&#,)!
+3 f1 (2108|0@5@2&#,)!
+3 f0 ()!
+3 f6741 ()!
+1 t6699|6699&
+3 f0 (6741|$#,)!
+3 f1 (6741|$#,)!
+3 f0 (6741|$#,6699|0@0@2&#,)!
+3 f1 (6741|$#,6699|0@0@2&#,)!
+3 f0 (6741|$#,)!
+3 f1 (6741|$#,)!
+3 f0 (6741|$#,5|$#,6699|0@0@4&#,)!
+3 f1 (6741|$#,5|$#,6699|0@0@4&#,)!
+3 f0 (6741|$#,)!
+3 f983 (6741|$#,)!
+3 f0 (6741|0@0@2&#,)!
+3 f1 (6741|0@0@2&#,)!
+3 f0 (6741|$#,981|0@5@7&#,)!
+3 f5 (6741|$#,981|0@5@7&#,)!
+3 f0 (6741|$#,1862|$#,981|0@5@7&#,)!
+3 f1289 (6741|$#,1862|$#,981|0@5@7&#,)!
+3 f0 (6741|$#,981|0@5@7&#,)!
+3 f2 (6741|$#,981|0@5@7&#,)!
+3 f0 (963|0@5@2&#,)!
+3 f6538 (963|0@5@2&#,)!
+1 t963|963&
+3 f0 (6538|$#,)!
+3 f1 (6538|$#,)!
+3 f0 (6538|@5|$#,963|0@5@2&#,)!
+3 f6538 (6538|@5|$#,963|0@5@2&#,)!
+3 f0 (6538|$#,)!
+3 f983 (6538|$#,)!
+3 f0 (6538|0@0@2&#,)!
+3 f1 (6538|0@0@2&#,)!
+3 f0 ()!
+3 f4327 ()!
+3 f0 (4327|0@5@7&#,)!
+3 f1 (4327|0@5@7&#,)!
+3 f0 (4327|@5|0@5@7&#,955|0@5@18&#,)!
+3 f4327 (4327|@5|0@5@7&#,955|0@5@18&#,)!
+3 f0 (4327|@5|0@5@7&#,4327|0@5@19@2@0#,)!
+3 f4327 (4327|@5|0@5@7&#,4327|0@5@19@2@0#,)!
+3 f0 (4327|0@5@7&#,)!
+3 f4327 (4327|0@5@7&#,)!
+3 f0 (4327|0@5@7&#,955|0@5@18&#,)!
+3 f2 (4327|0@5@7&#,955|0@5@18&#,)!
+3 f0 (4327|0@5@7&#,955|0@5@18&#,)!
+3 f955 (4327|0@5@7&#,955|0@5@18&#,)!
+3 f0 (4327|0@5@7&#,)!
+3 f2 (4327|0@5@7&#,)!
+3 f0 (4327|0@5@2&#,)!
+3 f1 (4327|0@5@2&#,)!
+3 f0 (4327|0@5@7&#,)!
+3 f983 (4327|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f4327 (315|$#,)!
+3 f0 (4327|0@5@7&#,)!
+3 f983 (4327|0@5@7&#,)!
+3 f0 (4327|0@5@7&#,4327|0@5@7&#,)!
+3 f5 (4327|0@5@7&#,4327|0@5@7&#,)!
+3 f0 ()!
+3 f12066 ()!
+3 f0 (12066|$#,)!
+3 f1 (12066|$#,)!
+3 f0 (12066|$#,5|$#,)!
+3 f2 (12066|$#,5|$#,)!
+3 f0 (12066|$#,5|$#,)!
+3 f2 (12066|$#,5|$#,)!
+3 f0 (12066|$#,)!
+3 f983 (12066|$#,)!
+3 f0 (12066|$#,)!
+3 f983 (12066|$#,)!
+3 f0 (12066|0@0@2&#,)!
+3 f1 (12066|0@0@2&#,)!
+0 s251|-1 13280 -1
+1 t13279|13279&
+3 f0 (4211|0@5@2&#,)!
+3 f1 (4211|0@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+1 t4211|4211&
+3 f0 ()!
+3 f1 ()!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4211|0@5@2&#,)!
+3 f1 (4211|0@5@2&#,)!
+3 f0 (4211|0@5@2&#,)!
+3 f5 (4211|0@5@2&#,)!
+3 f0 (959|$#,)!
+3 f4211 (959|$#,)!
+3 f0 ()!
+3 f959 ()!
+3 f0 (959|$#,4204|$#,)!
+3 f2 (959|$#,4204|$#,)!
+3 f0 (959|@7|$#,)!
+3 f2 (959|@7|$#,)!
+3 f0 (4204|$#,)!
+3 f959 (4204|$#,)!
+3 f0 (4204|$#,)!
+3 f959 (4204|$#,)!
+3 f0 (959|$#,4204|$#,)!
+3 f959 (959|$#,4204|$#,)!
+3 f0 (959|$#,4204|$#,)!
+3 f959 (959|$#,4204|$#,)!
+3 f0 (959|$#,)!
+3 f983 (959|$#,)!
+3 f0 (959|$#,959|$#,)!
+3 f5 (959|$#,959|$#,)!
+3 f0 (959|$#,959|$#,)!
+3 f959 (959|$#,959|$#,)!
+3 f0 (959|$#,)!
+3 f983 (959|$#,)!
+3 f0 (315|$#,)!
+3 f959 (315|$#,)!
+3 f0 (959|$#,959|$#,)!
+3 f959 (959|$#,959|$#,)!
+3 f0 ()!
+3 f972 ()!
+3 f0 ()!
+3 f972 ()!
+3 f0 (972|0@5@7&#,)!
+3 f975 (972|0@5@7&#,)!
+3 f0 (972|0@5@7&#,955|0@5@18&#,)!
+3 f1 (972|0@5@7&#,955|0@5@18&#,)!
+3 f0 (972|0@5@7&#,)!
+3 f975 (972|0@5@7&#,)!
+3 f0 (972|@5|0@5@9&#,972|0@5@7&#,)!
+3 f972 (972|@5|0@5@9&#,972|0@5@7&#,)!
+3 f0 (972|@5|0@5@9&#,972|0@5@7&#,)!
+3 f972 (972|@5|0@5@9&#,972|0@5@7&#,)!
+3 f0 (972|0@5@2&#,972|0@5@7&#,)!
+3 f972 (972|0@5@2&#,972|0@5@7&#,)!
+3 f0 (972|0@5@2&#,972|0@5@7&#,5|$#,)!
+3 f972 (972|0@5@2&#,972|0@5@7&#,5|$#,)!
+3 f0 (972|@5|0@5@9&#,972|0@5@2&#,5|$#,)!
+3 f972 (972|@5|0@5@9&#,972|0@5@2&#,5|$#,)!
+3 f0 (972|0@5@7&#,)!
+3 f1 (972|0@5@7&#,)!
+3 f0 (972|0@5@6&#,)!
+3 f972 (972|0@5@6&#,)!
+3 f0 (972|0@5@6&#,)!
+3 f972 (972|0@5@6&#,)!
+3 f0 (972|@5|0@5@7&#,955|0@5@18&#,)!
+3 f972 (972|@5|0@5@7&#,955|0@5@18&#,)!
+3 f0 (972|@5|0@5@7&#,955|0@5@18&#,)!
+3 f972 (972|@5|0@5@7&#,955|0@5@18&#,)!
+3 f0 (972|0@5@7&#,)!
+3 f983 (972|0@5@7&#,)!
+3 f0 (972|0@5@2&#,)!
+3 f1 (972|0@5@2&#,)!
+3 f0 (972|0@5@7&#,955|0@5@18&#,)!
+3 f2 (972|0@5@7&#,955|0@5@18&#,)!
+3 f0 (972|0@5@7&#,955|0@5@18&#,)!
+3 f2 (972|0@5@7&#,955|0@5@18&#,)!
+3 f0 (972|0@5@7&#,)!
+3 f2 (972|0@5@7&#,)!
+3 f0 ()!
+3 f4211 ()!
+3 f0 ()!
+3 f4211 ()!
+3 f0 (4211|0@2@7&#,)!
+3 f1 (4211|0@2@7&#,)!
+3 f0 (4203|$#,)!
+3 f4211 (4203|$#,)!
+3 f0 (4211|@5|0@5@7&#,4203|$#,)!
+3 f4211 (4211|@5|0@5@7&#,4203|$#,)!
+3 f0 (4211|0@2@7&#,)!
+3 f4211 (4211|0@2@7&#,)!
+3 f0 (4211|0@5@7&#,4203|$#,)!
+3 f4211 (4211|0@5@7&#,4203|$#,)!
+3 f0 (4211|0@5@6&#,4203|$#,)!
+3 f4211 (4211|0@5@6&#,4203|$#,)!
+3 f0 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f4211 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f0 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f4211 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f0 (4211|0@5@7&#,4203|$#,)!
+3 f2 (4211|0@5@7&#,4203|$#,)!
+3 f0 (4211|0@5@2&#,)!
+3 f1 (4211|0@5@2&#,)!
+3 f0 (4211|0@5@7&#,)!
+3 f983 (4211|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f4211 (315|$#,)!
+3 f0 (4211|0@5@7&#,)!
+3 f983 (4211|0@5@7&#,)!
+3 f0 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f5 (4211|0@5@7&#,4211|0@5@7&#,)!
+3 f0 ()!
+3 f975 ()!
+3 f0 ()!
+3 f975 ()!
+3 f0 (955|0@5@18@2@0#,)!
+3 f975 (955|0@5@18@2@0#,)!
+3 f0 (975|0@2@7&#,)!
+3 f1 (975|0@2@7&#,)!
+3 f0 (975|@5|0@5@7&#,955|0@5@18@2@0#,)!
+3 f975 (975|@5|0@5@7&#,955|0@5@18@2@0#,)!
+3 f0 (975|0@5@7&#,)!
+3 f1 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f1 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f955 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f955 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|@5|0@5@7&#,975|0@5@2&#,)!
+3 f975 (975|@5|0@5@7&#,975|0@5@2&#,)!
+3 f0 (975|@5|0@5@7&#,975|0@5@19@2@0#,)!
+3 f975 (975|@5|0@5@7&#,975|0@5@19@2@0#,)!
+3 f0 (975|@5|0@5@7&#,975|0@5@7&#,955|0@5@18&#,)!
+3 f975 (975|@5|0@5@7&#,975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,975|0@5@7&#,)!
+3 f0 (975|@5|0@5@7&#,975|0@5@7&#,5|$#,)!
+3 f975 (975|@5|0@5@7&#,975|0@5@7&#,5|$#,)!
+3 f0 (975|0@5@7&#,5|$#,)!
+3 f1 (975|0@5@7&#,5|$#,)!
+3 f0 (975|@5|0@5@7&#,975|0@5@19@2@0#,)!
+3 f975 (975|@5|0@5@7&#,975|0@5@19@2@0#,)!
+3 f0 (975|0@5@6@2@0#,)!
+3 f975 (975|0@5@6@2@0#,)!
+3 f0 (975|0@5@19@2@0#,5|$#,)!
+3 f975 (975|0@5@19@2@0#,5|$#,)!
+3 f0 (975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,)!
+3 ?!
+3 f13444 (955|0@5@18&#,955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,955|0@5@18&#,)^13447
+1 t13446|13446&
+3 f0 (13447|$#,975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (13447|$#,975|0@5@7&#,955|0@5@18&#,)!
+3 ?!
+3 f13450 (955|0@5@18&#,)!
+3 f2 (955|0@5@18&#,)^13453
+1 t13452|13452&
+3 f0 (13453|$#,975|0@5@7&#,)!
+3 f2 (13453|$#,975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f2 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f2 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f2 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f2 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,955|0@5@18&#,)!
+3 f955 (975|0@5@7&#,955|0@5@18&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f5 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f1 (975|0@5@7&#,)!
+3 f0 (975|0@5@2&#,)!
+3 f1 (975|0@5@2&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,983|0@5@19@3@0#,)!
+3 f975 (975|0@5@7&#,983|0@5@19@3@0#,)!
+3 f0 (975|0@5@7&#,)!
+3 f975 (975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,5|$#,)!
+3 f975 (975|0@5@7&#,5|$#,)!
+3 f0 (975|0@5@7&#,975|0@5@7&#,)!
+3 f5 (975|0@5@7&#,975|0@5@7&#,)!
+3 f0 (975|0@5@7&#,975|0@5@7&#,)!
+3 f2 (975|0@5@7&#,975|0@5@7&#,)!
+3 f0 (315|$#,)!
+3 f975 (315|$#,)!
+3 f0 (975|0@5@7&#,)!
+3 f983 (975|0@5@7&#,)!
+3 f0 ()!
+3 f2550 ()!
+3 f0 (2550|0@5@7&#,)!
+3 f1 (2550|0@5@7&#,)!
+3 f0 (2550|0@5@7&#,945|$#,)!
+3 f2 (2550|0@5@7&#,945|$#,)!
+3 f0 (2550|0@5@7&#,945|$#,)!
+3 f2 (2550|0@5@7&#,945|$#,)!
+3 f0 (2550|0@5@7&#,)!
+3 f983 (2550|0@5@7&#,)!
+3 f0 (2550|0@5@2&#,)!
+3 f1 (2550|0@5@2&#,)!
+3 f0 (3100|0@5@7&#,3086|$#,)!
+3 f2 (3100|0@5@7&#,3086|$#,)!
+3 f0 ()!
+3 f3100 ()!
+1 t3086|3086&
+3 f0 (3086|0@0@17&#,)!
+3 f3100 (3086|0@0@17&#,)!
+3 f0 (3100|0@2@7&#,)!
+3 f1 (3100|0@2@7&#,)!
+3 f0 (3100|0@5@7&#,3086|0@0@17&#,)!
+3 f2 (3100|0@5@7&#,3086|0@0@17&#,)!
+3 f0 (3100|0@5@7&#,3086|$#,)!
+3 f2 (3100|0@5@7&#,3086|$#,)!
+3 f0 (3100|0@5@7&#,)!
+3 f983 (3100|0@5@7&#,)!
+3 f0 (3100|0@5@7&#,)!
+3 f983 (3100|0@5@7&#,)!
+3 f0 (3100|0@5@7&#,)!
+3 f983 (3100|0@5@7&#,)!
+3 f0 (3100|0@5@2&#,)!
+3 f1 (3100|0@5@2&#,)!
+3 f0 (937|@5|$#,)!
+3 f937 (937|@5|$#,)!
+3 f0 (937|@5|0@5@7&#,)!
+3 f937 (937|@5|0@5@7&#,)!
+3 f0 (951|0@5@7&#,2835|$#,)!
+3 f1 (951|0@5@7&#,2835|$#,)!
+3 f0 (3158|0@5@7&#,3148|$#,)!
+3 f2 (3158|0@5@7&#,3148|$#,)!
+3 f0 ()!
+3 f3158 ()!
+1 t3148|3148&
+3 f0 (5|$#,)!
+3 f3158 (5|$#,)!
+3 f0 (3158|0@2@7&#,)!
+3 f1 (3158|0@2@7&#,)!
+3 f0 (3158|0@5@7&#,3148|0@0@2&#,)!
+3 f2 (3158|0@5@7&#,3148|0@0@2&#,)!
+3 f0 (3158|0@5@7&#,3148|$#,)!
+3 f2 (3158|0@5@7&#,3148|$#,)!
+3 f0 (3158|0@5@7&#,)!
+3 f983 (3158|0@5@7&#,)!
+3 f0 (3158|0@5@7&#,)!
+3 f3158 (3158|0@5@7&#,)!
+3 f0 (3158|0@5@2&#,)!
+3 f1 (3158|0@5@2&#,)!
+3 f0 ()!
+3 f2567 ()!
+3 f0 (5|$#,)!
+3 f2567 (5|$#,)!
+3 f0 (2567|0@2@7&#,)!
+3 f1 (2567|0@2@7&#,)!
+3 f0 (2567|0@5@7&#,944|$#,)!
+3 f2 (2567|0@5@7&#,944|$#,)!
+3 f0 (2567|0@5@7&#,)!
+3 f944 (2567|0@5@7&#,)!
+3 f0 (2567|0@5@7&#,944|$#,)!
+3 f2 (2567|0@5@7&#,944|$#,)!
+3 f0 (2567|0@5@7&#,)!
+3 f983 (2567|0@5@7&#,)!
+3 f0 (2567|0@5@7&#,)!
+3 f983 (2567|0@5@7&#,)!
+3 f0 (2567|0@5@7&#,)!
+3 f983 (2567|0@5@7&#,)!
+3 f0 (2567|0@5@2&#,)!
+3 f1 (2567|0@5@2&#,)!
+3 f0 (2567|0@5@7&#,)!
+3 f2567 (2567|0@5@7&#,)!
+3 f0 ()!
+3 f2862 ()!
+1 t2852|2852&
+3 f0 (2862|$#,)!
+3 f1 (2862|$#,)!
+3 f0 (2862|@5|$#,2852|0@0@2&#,)!
+3 f2862 (2862|@5|$#,2852|0@0@2&#,)!
+3 f0 (2862|$#,)!
+3 f983 (2862|$#,)!
+3 f0 (2862|0@0@2&#,)!
+3 f1 (2862|0@0@2&#,)!
+3 f0 ()!
+3 f2520 ()!
+3 f0 (2520|$#,)!
+3 f1 (2520|$#,)!
+3 f0 (2520|$#,944|$#,)!
+3 f1 (2520|$#,944|$#,)!
+3 f0 (2520|$#,)!
+3 f1 (2520|$#,)!
+3 f0 (2520|$#,)!
+3 f1 (2520|$#,)!
+3 f0 (2520|$#,)!
+3 f944 (2520|$#,)!
+3 f0 (2520|$#,)!
+3 f983 (2520|$#,)!
+3 f0 (2520|0@0@2&#,)!
+3 f1 (2520|0@0@2&#,)!
+3 f0 ()!
+3 f2628 ()!
+1 t2618|2618&
+3 f0 (2628|$#,)!
+3 f1 (2628|$#,)!
+3 f0 (2628|@5|$#,2618|0@0@2&#,)!
+3 f2628 (2628|@5|$#,2618|0@0@2&#,)!
+3 f0 (2628|$#,)!
+3 f983 (2628|$#,)!
+3 f0 (2628|0@0@2&#,)!
+3 f1 (2628|0@0@2&#,)!
+3 f0 ()!
+3 f3278 ()!
+1 t3268|3268&
+3 f0 (3278|$#,)!
+3 f1 (3278|$#,)!
+3 f0 (3278|@5|$#,3268|0@0@2&#,)!
+3 f3278 (3278|@5|$#,3268|0@0@2&#,)!
+3 f0 (3278|$#,3268|0@0@4&#,)!
+3 f1 (3278|$#,3268|0@0@4&#,)!
+3 f0 (3278|0@0@2&#,)!
+3 f1 (3278|0@0@2&#,)!
+3 f0 ()!
+3 f3348 ()!
+1 t2567|2567&
+3 f0 (3348|$#,)!
+3 f1 (3348|$#,)!
+3 f0 (3348|$#,2567|0@5@18@2@0#,)!
+3 f1 (3348|$#,2567|0@5@18@2@0#,)!
+3 f0 (3348|$#,)!
+3 f1 (3348|$#,)!
+3 f0 (3348|$#,)!
+3 f1 (3348|$#,)!
+3 f0 (3348|$#,)!
+3 f2567 (3348|$#,)!
+3 f0 (3348|$#,)!
+3 f2567 (3348|$#,)!
+3 f0 (3348|$#,)!
+3 f983 (3348|$#,)!
+3 f0 (3348|0@0@2&#,)!
+3 f1 (3348|0@0@2&#,)!
+3 f0 ()!
+3 f2670 ()!
+1 t2660|2660&
+3 f0 (2670|$#,)!
+3 f1 (2670|$#,)!
+3 f0 (2670|@5|$#,2660|0@0@2&#,)!
+3 f2670 (2670|@5|$#,2660|0@0@2&#,)!
+3 f0 (2670|$#,)!
+3 f983 (2670|$#,)!
+3 f0 (2670|$#,)!
+3 f2670 (2670|$#,)!
+3 f0 (2670|0@0@2&#,)!
+3 f1 (2670|0@0@2&#,)!
+3 f0 ()!
+3 f2791 ()!
+1 t2783|2783&
+3 f0 (2791|$#,)!
+3 f1 (2791|$#,)!
+3 f0 (2791|@5|$#,2783|0@0@2&#,)!
+3 f2791 (2791|@5|$#,2783|0@0@2&#,)!
+3 f0 (2791|$#,)!
+3 f983 (2791|$#,)!
+3 f0 (2791|0@0@2&#,)!
+3 f1 (2791|0@0@2&#,)!
+3 f0 ()!
+3 f2975 ()!
+1 t2965|2965&
+3 f0 (2975|$#,)!
+3 f1 (2975|$#,)!
+3 f0 (2975|@5|$#,2965|0@0@2&#,)!
+3 f2975 (2975|@5|$#,2965|0@0@2&#,)!
+3 f0 (2975|$#,)!
+3 f2975 (2975|$#,)!
+3 f0 (2975|$#,)!
+3 f983 (2975|$#,)!
+3 f0 (2975|0@0@2&#,)!
+3 f1 (2975|0@0@2&#,)!
+3 f0 ()!
+3 f3373 ()!
+3 f0 (3373|$#,)!
+3 f1 (3373|$#,)!
+3 f0 (3373|$#,3148|0@0@19@2@0#,)!
+3 f1 (3373|$#,3148|0@0@19@2@0#,)!
+3 f0 (3373|$#,)!
+3 f983 (3373|$#,)!
+3 f0 (3373|0@0@2&#,)!
+3 f1 (3373|0@0@2&#,)!
+3 f0 ()!
+3 f2762 ()!
+1 t2744|2744&
+3 f0 (2762|$#,)!
+3 f1 (2762|$#,)!
+3 f0 (2762|@5|$#,2744|0@0@2&#,)!
+3 f2762 (2762|@5|$#,2744|0@0@2&#,)!
+3 f0 (2762|$#,)!
+3 f2762 (2762|$#,)!
+3 f0 (2762|$#,)!
+3 f983 (2762|$#,)!
+3 f0 (2762|0@0@2&#,)!
+3 f1 (2762|0@0@2&#,)!
+3 f0 ()!
+3 f2539 ()!
+3 f0 (2539|$#,)!
+3 f1 (2539|$#,)!
+3 f0 (2539|$#,945|$#,)!
+3 f1 (2539|$#,945|$#,)!
+3 f0 (2539|0@0@2&#,)!
+3 f1 (2539|0@0@2&#,)!
+3 f0 ()!
+3 f943 ()!
+1 t937|937&
+3 f0 (943|$#,)!
+3 f1 (943|$#,)!
+3 f0 (943|$#,937|0@0@4&#,)!
+3 f1 (943|$#,937|0@0@4&#,)!
+3 f0 (943|@5|$#,937|0@0@4&#,)!
+3 f943 (943|@5|$#,937|0@0@4&#,)!
+3 f0 (943|$#,937|0@0@4&#,)!
+3 f1 (943|$#,937|0@0@4&#,)!
+3 f0 (943|$#,)!
+3 f1 (943|$#,)!
+3 f0 (943|$#,)!
+3 f1 (943|$#,)!
+3 f0 (943|$#,)!
+3 f1 (943|$#,)!
+3 f0 (943|$#,)!
+3 f937 (943|$#,)!
+3 f0 (943|$#,)!
+3 f943 (943|$#,)!
+3 f0 (943|$#,)!
+3 f937 (943|$#,)!
+3 f0 (943|$#,5|$#,)!
+3 f937 (943|$#,5|$#,)!
+3 f0 (943|$#,)!
+3 f983 (943|$#,)!
+3 f0 (943|$#,)!
+3 f983 (943|$#,)!
+3 f0 (943|$#,)!
+3 f983 (943|$#,)!
+3 f0 (943|$#,)!
+3 f983 (943|$#,)!
+3 f0 (943|0@0@2&#,)!
+3 f1 (943|0@0@2&#,)!
+3 f0 ()!
+3 f2431 ()!
+1 t951|951&
+3 f0 (951|0@5@2&#,)!
+3 f2431 (951|0@5@2&#,)!
+3 f0 (2431|0@2@7&#,)!
+3 f1 (2431|0@2@7&#,)!
+3 f0 (2431|@5|0@5@7&#,951|0@5@2&#,)!
+3 f2431 (2431|@5|0@5@7&#,951|0@5@2&#,)!
+3 f0 (2431|0@5@7&#,951|0@5@2&#,)!
+3 f1 (2431|0@5@7&#,951|0@5@2&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f1 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f2 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f1 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f951 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,2431|0@5@7&#,)!
+3 f2 (2431|0@5@7&#,2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f2431 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f1 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f951 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f983 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@2&#,)!
+3 f1 (2431|0@5@2&#,)!
+3 f0 ()!
+3 f3228 ()!
+1 t3220|3220&
+3 f0 (3228|$#,)!
+3 f1 (3228|$#,)!
+3 f0 (3228|@5|$#,3220|0@0@2&#,)!
+3 f3228 (3228|@5|$#,3220|0@0@2&#,)!
+3 f0 (3228|$#,)!
+3 f983 (3228|$#,)!
+3 f0 (3228|0@0@2&#,)!
+3 f1 (3228|0@0@2&#,)!
+3 f0 ()!
+3 f2601 ()!
+1 t2593|2593&
+3 f0 (2601|0@2@7&#,)!
+3 f1 (2601|0@2@7&#,)!
+3 f0 (2601|0@5@7&#,2593|0@0@4&#,)!
+3 f1 (2601|0@5@7&#,2593|0@0@4&#,)!
+3 f0 (2601|0@5@7&#,)!
+3 f983 (2601|0@5@7&#,)!
+3 f0 (2601|0@5@2&#,)!
+3 f1 (2601|0@5@2&#,)!
+3 f0 ()!
+3 f3054 ()!
+1 t3044|3044&
+3 f0 (3054|$#,)!
+3 f1 (3054|$#,)!
+3 f0 (3054|@5|$#,3044|0@0@2&#,)!
+3 f3054 (3054|@5|$#,3044|0@0@2&#,)!
+3 f0 (3054|$#,)!
+3 f983 (3054|$#,)!
+3 f0 (3054|0@0@2&#,)!
+3 f1 (3054|0@0@2&#,)!
+3 f0 ()!
+3 f2928 ()!
+3 f0 ()!
+3 f2928 ()!
+1 t2918|2918&
+3 f0 (2928|0@2@7&#,)!
+3 f1 (2928|0@2@7&#,)!
+3 f0 (2928|@5|0@5@7&#,2918|0@0@4&#,)!
+3 f2928 (2928|@5|0@5@7&#,2918|0@0@4&#,)!
+3 f0 (2928|0@5@7&#,)!
+3 f983 (2928|0@5@7&#,)!
+3 f0 (2928|0@5@2&#,)!
+3 f1 (2928|0@5@2&#,)!
+3 f0 ()!
+3 f2296 ()!
+1 t2278|2278&
+3 f0 (2278|0@0@4&#,)!
+3 f2296 (2278|0@0@4&#,)!
+3 f0 (2296|0@2@7&#,)!
+3 f1 (2296|0@2@7&#,)!
+3 f0 (2296|@5|0@5@7&#,2278|0@5@2&#,)!
+3 f2296 (2296|@5|0@5@7&#,2278|0@5@2&#,)!
+3 f0 (2296|0@5@7&#,)!
+3 f2296 (2296|0@5@7&#,)!
+3 f0 (2296|0@5@7&#,)!
+3 f983 (2296|0@5@7&#,)!
+3 f0 (2296|0@5@7&#,)!
+3 f983 (2296|0@5@7&#,)!
+3 f0 (2296|0@5@2&#,)!
+3 f1 (2296|0@5@2&#,)!
+3 f0 ()!
+3 f2820 ()!
+1 t2812|2812&
+3 f0 (2820|$#,)!
+3 f1 (2820|$#,)!
+3 f0 (2820|$#,2812|0@0@4&#,)!
+3 f1 (2820|$#,2812|0@0@4&#,)!
+3 f0 (2820|$#,)!
+3 f983 (2820|$#,)!
+3 f0 (2820|0@0@2&#,)!
+3 f1 (2820|0@0@2&#,)!
+3 f0 ()!
+3 f2894 ()!
+1 t2884|2884&
+3 f0 (2894|$#,)!
+3 f1 (2894|$#,)!
+3 f0 (2894|$#,2884|0@0@4&#,)!
+3 f1 (2894|$#,2884|0@0@4&#,)!
+3 f0 (2894|$#,)!
+3 f983 (2894|$#,)!
+3 f0 (2894|0@0@2&#,)!
+3 f1 (2894|0@0@2&#,)!
+3 f0 ()!
+3 f2699 ()!
+1 t2689|2689&
+3 f0 (2699|$#,)!
+3 f1 (2699|$#,)!
+3 f0 (2699|@5|$#,2689|0@0@2&#,)!
+3 f2699 (2699|@5|$#,2689|0@0@2&#,)!
+3 f0 (2699|$#,)!
+3 f983 (2699|$#,)!
+3 f0 (2699|0@0@2&#,)!
+3 f1 (2699|0@0@2&#,)!
+3 f0 (2699|$#,)!
+3 f2699 (2699|$#,)!
+3 f0 ()!
+3 f2724 ()!
+1 t2714|2714&
+3 f0 (2724|$#,)!
+3 f1 (2724|$#,)!
+3 f0 (2724|@5|$#,2714|0@0@2&#,)!
+3 f2724 (2724|@5|$#,2714|0@0@2&#,)!
+3 f0 (2724|$#,)!
+3 f2724 (2724|$#,)!
+3 f0 (2724|$#,)!
+3 f983 (2724|$#,)!
+3 f0 (2724|0@0@2&#,)!
+3 f1 (2724|0@0@2&#,)!
+3 f0 ()!
+3 f3191 ()!
+1 t3181|3181&
+3 f0 (3191|$#,)!
+3 f1 (3191|$#,)!
+3 f0 (3191|@5|$#,3181|0@0@2&#,)!
+3 f3191 (3191|@5|$#,3181|0@0@2&#,)!
+3 f0 (3191|$#,)!
+3 f983 (3191|$#,)!
+3 f0 (3191|0@0@2&#,)!
+3 f1 (3191|0@0@2&#,)!
+3 f0 ()!
+3 f2505 ()!
+1 t2491|2491&
+3 f0 (2505|$#,)!
+3 f1 (2505|$#,)!
+3 f0 (2505|@5|$#,2491|0@0@2&#,)!
+3 f2505 (2505|@5|$#,2491|0@0@2&#,)!
+3 f0 (2505|$#,)!
+3 f983 (2505|$#,)!
+3 f0 (2505|0@0@2&#,)!
+3 f1 (2505|0@0@2&#,)!
+3 f0 (952|$#,945|$#,945|$#,2|$#,)!
+3 f951 (952|$#,945|$#,945|$#,2|$#,)!
+3 f0 (952|$#,945|$#,2|$#,)!
+3 f1 (952|$#,945|$#,2|$#,)!
+3 f0 (945|$#,)!
+3 f951 (945|$#,)!
+3 f0 (952|$#,23|$#,)!
+3 f951 (952|$#,23|$#,)!
+3 f0 (945|$#,2|$#,)!
+3 f1 (945|$#,2|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (952|$#,945|$#,945|$#,2|$#,)!
+3 f951 (952|$#,945|$#,945|$#,2|$#,)!
+3 f0 (952|$#,945|$#,2|$#,)!
+3 f1 (952|$#,945|$#,2|$#,)!
+3 f0 (945|$#,2|$#,)!
+3 f1 (945|$#,2|$#,)!
+3 f0 (945|$#,)!
+3 f951 (945|$#,)!
+3 f0 (952|$#,23|$#,)!
+3 f951 (952|$#,23|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 U!89{951|@1|0@5@3&#ltok,6|@1|^#count,2431|@1|0@5@2&#ltokenList,3075|@1|0@0@2&#opform,3086|@1|0@0@17&#signature,3136|@1|0@0@2&#name,3148|@1|0@0@17&#operator,3373|@1|0@0@2&#operators,}!
+0 s6570|&
+1 t9620|9620&
+3 f0 (13957|$#,)!
+3 f6 (13957|$#,)!
+3 f0 ()!
+3 f951 ()!
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 f0 ()!
+3 f19 ()!
+3 f2076 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (2076|$#,)!
+3 f1 (2076|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 e!90{CHC_NULL,IDCHAR,OPCHAR,SLASHCHAR,WHITECHAR,CHC_EXTENSION,SINGLECHAR,PERMCHAR}!
+0 s6637|&
+0 s350|&
+3 S!91{13975|@1|^#code,2|@1|^#endCommentChar,}!
+0 s6348|&
+0 s358|-1 -1 14038
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 ()!
+3 f951 ()!
+3 f0 (2|$#,)!
+3 f1 (2|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4|$#,)!
+3 f13975 (4|$#,)!
+3 f0 (4|$#,)!
+3 f2 (4|$#,)!
+3 f0 (4|$#,13975|$#,)!
+3 f1 (4|$#,13975|$#,)!
+3 f0 (4|$#,2|$#,)!
+3 f1 (4|$#,2|$#,)!
+3 f0 ()!
+3 f951 ()!
+2 F0/0|0&
+2 F2348/0|2348&
+3 f0 (13957|$#,)!
+3 f6 (13957|$#,)!
+3 f0 ()!
+3 f951 ()!
+3 f0 ()!
+3 f951 ()!
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 f0 ()!
+3 f19 ()!
+3 f2076 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (2076|$#,)!
+3 f1 (2076|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (945|$#,945|$#,)!
+3 f1 (945|$#,945|$#,)!
+3 f0 (945|$#,)!
+3 f951 (945|$#,)!
+3 f0 (945|$#,)!
+3 f2 (945|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (23|0@0@6&#,)!
+3 f1 (23|0@0@6&#,)!
+2 F0/0|0&
+2 F13978/0|13978&
+2 F0/0|0&
+2 F4/0|4&
+2 y13978|13978&
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 ()!
+3 f951 ()!
+3 f0 (2|$#,)!
+3 f1 (2|$#,)!
+3 f0 (23|0@0@6&#,)!
+3 f1 (23|0@0@6&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4|$#,)!
+3 f13975 (4|$#,)!
+3 f0 (4|$#,)!
+3 f2 (4|$#,)!
+3 f0 (4|$#,13975|$#,)!
+3 f1 (4|$#,13975|$#,)!
+3 f0 (4|$#,2|$#,)!
+3 f1 (4|$#,2|$#,)!
+3 e!92{INITFILE1,INITLINES1,INITLINES2,INITLINES3,INITLINE1,INITLINE2,CLASSIFICATION1,CLASSIFICATION2,CLASSIFICATION3,CHARCLASS1,CHARCLASS2,CHARCLASS3,CHARCLASS4,CHARCLASS5,CHARCLASS6,LRC_ENDCOMMENT1,LRC_ENDCOMMENT2,IDCHARS1,IDCHARS2,OPCHARS1,OPCHARS2,LRC_EXTENSIONCHAR1,SINGCHARS1,SINGCHARS2,WHITECHARS1,WHITECHARS2,LRC_ENDCOMMENTCHAR1,IDCHAR1,OPCHAR1,SINGCHAR1,WHITECHAR1,TOKENCLASS1,TOKENCLASS2,TOKENCLASS3,TOKENCLASS4,TOKENCLASS5,TOKENCLASS6,TOKENCLASS7,TOKENCLASS8,TOKENCLASS9,TOKENCLASS10,TOKENCLASS11,TOKENCLASS12,TOKENCLASS13,QUANTIFIERSYMTOKS1,QUANTIFIERSYMTOKS2,LOGICALOPTOKS1,LOGICALOPTOKS2,LRC_EQOPTOKS1,LRC_EQOPTOKS2,LRC_EQUATIONSYMTOKS1,LRC_EQUATIONSYMTOKS2,LRC_EQSEPSYMTOKS1,LRC_EQSEPSYMTOKS2,SELECTSYMTOKS1,SELECTSYMTOKS2,OPENSYMTOKS1,OPENSYMTOKS2,SEPSYMTOKS1,SEPSYMTOKS2,CLOSESYMTOKS1,CLOSESYMTOKS2,SIMPLEIDTOKS1,SIMPLEIDTOKS2,MAPSYMTOKS1,MAPSYMTOKS2,MARKERSYMTOKS1,MARKERSYMTOKS2,COMMENTSYMTOKS1,COMMENTSYMTOKS2,QUANTIFIERSYMTOK1,LOGICALOPTOK1,LRC_EQOPTOK1,LRC_EQUATIONSYMTOK1,LRC_EQSEPSYMTOK1,SELECTSYMTOK1,OPENSYMTOK1,SEPSYMTOK1,CLOSESYMTOK1,SIMPLEIDTOK1,MAPSYMTOK1,MARKERSYMTOK1,COMMENTSYMTOK1,SYNCLASS1,OLDTOKEN1,NEWTOKEN1}!
+0 s6638|&
+0 s351|&
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (945|$#,)!
+3 f945 (945|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f5 (983|0@5@7&#,)!
+3 f0 (23|$#,23|$#,)!
+3 f3148 (23|$#,23|$#,)!
+3 f0 (3268|$#,)!
+3 f1 (3268|$#,)!
+3 f0 (23|$#,23|0@0@2&#,)!
+3 f1 (23|$#,23|0@0@2&#,)!
+3 f0 (23|$#,23|$#,2|$#,)!
+3 f1 (23|$#,23|$#,2|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f5 (983|0@5@7&#,)!
+3 f0 (23|$#,23|$#,)!
+3 f3148 (23|$#,23|$#,)!
+3 f0 (945|$#,)!
+3 f945 (945|$#,)!
+3 f0 (3044|$#,)!
+3 f983 (3044|$#,)!
+3 f0 (3181|$#,)!
+3 f983 (3181|$#,)!
+3 f0 (3191|$#,)!
+3 f983 (3191|$#,)!
+3 f0 (3054|$#,)!
+3 f983 (3054|$#,)!
+3 f0 (3214|$#,)!
+3 f983 (3214|$#,)!
+3 f0 (3228|$#,)!
+3 f983 (3228|$#,)!
+3 f0 (23|$#,23|0@0@2&#,)!
+3 f1 (23|$#,23|0@0@2&#,)!
+3 f0 (23|$#,23|$#,2|$#,)!
+3 f1 (23|$#,23|$#,2|$#,)!
+3 f0 (3268|$#,)!
+3 f1 (3268|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (2076|$#,)!
+3 f1 (2076|$#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (3278|$#,)!
+3 f1 (3278|$#,)!
+3 f0 (940|0@5@7&#,2862|$#,2880|$#,)!
+3 f983 (940|0@5@7&#,2862|$#,2880|$#,)!
+3 f0 (3000|$#,)!
+3 f983 (3000|$#,)!
+3 f0 (940|0@5@7&#,2660|$#,)!
+3 f983 (940|0@5@7&#,2660|$#,)!
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 S!93{213|@1|11@5@18&#f,23|@1|11@0@3&#name,}!
+0 s6355|&
+0 s360|&
+3 f0 (940|0@5@7&#,)!
+3 f983 (940|0@5@7&#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+3 f0 (2660|$#,)!
+3 f983 (2660|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,)!
+3 f213 (23|$#,23|$#,)!
+3 f0 (940|0@5@7&#,2660|$#,)!
+3 f983 (940|0@5@7&#,2660|$#,)!
+3 f0 (2660|$#,)!
+3 f983 (2660|$#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 f0 (3000|$#,)!
+3 f983 (3000|$#,)!
+3 f0 (940|0@5@7&#,)!
+3 f983 (940|0@5@7&#,)!
+3 f0 (940|0@5@7&#,2862|$#,2880|$#,)!
+3 f983 (940|0@5@7&#,2862|$#,2880|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (2076|$#,)!
+3 f1 (2076|$#,)!
+3 f0 (983|0@5@2&#,)!
+3 f1 (983|0@5@2&#,)!
+3 f0 (3278|$#,)!
+3 f1 (3278|$#,)!
+3 f0 (3348|$#,)!
+3 f983 (3348|$#,)!
+3 f0 (3136|0@5@7&#,3348|$#,944|$#,)!
+3 f2567 (3136|0@5@7&#,3348|$#,944|$#,)!
+3 f0 (3136|0@5@7&#,)!
+3 f2 (3136|0@5@7&#,)!
+3 f0 (937|$#,944|$#,)!
+3 f1 (937|$#,944|$#,)!
+3 f0 (937|@5|0@5@7&#,)!
+3 f937 (937|@5|0@5@7&#,)!
+3 f0 (3348|$#,)!
+3 f983 (3348|$#,)!
+3 f0 (937|@5|$#,)!
+3 f937 (937|@5|$#,)!
+3 f0 (937|$#,944|$#,)!
+3 f1 (937|$#,944|$#,)!
+3 f0 (951|0@5@7&#,2835|$#,)!
+3 f1 (951|0@5@7&#,2835|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 (3136|0@5@7&#,)!
+3 f2 (3136|0@5@7&#,)!
+3 f0 (3136|0@5@7&#,3348|$#,944|$#,)!
+3 f2567 (3136|0@5@7&#,3348|$#,944|$#,)!
+3 S!94{1003|@1|^#pt,2264|@1|^#ts,}!
+0 s6384|&
+0 s364|-1 -1 14193
+2 y14192|14192&
+3 f0 (1003|$#,)!
+3 f945 (1003|$#,)!
+3 f0 (1003|$#,)!
+3 f945 (1003|$#,)!
+3 f0 (945|$#,951|0@5@7&#,2488|$#,)!
+3 f1 (945|$#,951|0@5@7&#,2488|$#,)!
+3 f0 (23|$#,23|$#,23|$#,)!
+3 f1 (23|$#,23|$#,23|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (23|$#,23|$#,23|$#,)!
+3 f1 (23|$#,23|$#,23|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (945|$#,951|0@5@7&#,2488|$#,)!
+3 f1 (945|$#,951|0@5@7&#,2488|$#,)!
+2 F0/0|0&
+2 F4/0|4&
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f1 (951|0@5@2&#,)!
+3 f0 ()!
+3 f951 ()!
+3 f0 (2|$#,)!
+3 f1 (2|$#,)!
+3 f0 (951|0@5@7&#,23|0@0@6&#,)!
+3 f1 (951|0@5@7&#,23|0@0@6&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (14063|$#,)!
+3 f1 (14063|$#,)!
+3 f0 (13975|$#,)!
+3 f1 (13975|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (13975|$#,)!
+3 f1 (13975|$#,)!
+3 f0 (952|$#,)!
+3 f1 (952|$#,)!
+3 f0 ()!
+3 f1 ()!
+2 F0/0|0&
+2 F2/0|982&
+3 f0 (951|0@5@7&#,)!
+3 f2 (951|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (14063|$#,)!
+3 f1 (14063|$#,)!
+3 f0 (13975|$#,)!
+3 f1 (13975|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (13975|$#,)!
+3 f1 (13975|$#,)!
+3 f0 (952|$#,)!
+3 f1 (952|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (951|0@5@7&#,23|0@0@6&#,)!
+3 f1 (951|0@5@7&#,23|0@0@6&#,)!
+3 f0 (23|$#,)!
+3 f951 (23|$#,)!
+3 f0 ()!
+3 f1 ()!
+0 s118|&
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 (945|$#,945|$#,)!
+3 f1 (945|$#,945|$#,)!
+3 f0 (945|$#,)!
+3 f951 (945|$#,)!
+3 f0 (945|$#,)!
+3 f2 (945|$#,)!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (945|$#,945|$#,)!
+3 f1 (945|$#,945|$#,)!
+3 f0 (945|$#,)!
+3 f951 (945|$#,)!
+3 f0 (945|$#,)!
+3 f2 (945|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (2918|$#,4941|0@5@2&#,985|$#,4204|$#,2|$#,2|$#,)!
+3 f1 (2918|$#,4941|0@5@2&#,985|$#,4204|$#,2|$#,2|$#,)!
+3 f0 (2296|0@5@7&#,)!
+3 f4245 (2296|0@5@7&#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f4941 (940|0@5@7&#,)!
+3 f0 (985|$#,948|0@5@7&#,)!
+3 f985 (985|$#,948|0@5@7&#,)!
+3 f0 (985|$#,948|0@5@7&#,)!
+3 f985 (985|$#,948|0@5@7&#,)!
+3 f0 (937|$#,2918|$#,4245|0@5@7&#,)!
+3 f955 (937|$#,2918|$#,4245|0@5@7&#,)!
+3 f0 (2918|$#,4245|0@5@7&#,)!
+3 f975 (2918|$#,4245|0@5@7&#,)!
+3 f0 (2975|$#,)!
+3 f4245 (2975|$#,)!
+3 f0 (2296|0@5@7&#,)!
+3 f4245 (2296|0@5@7&#,)!
+3 f0 (985|$#,948|0@5@7&#,)!
+3 f985 (985|$#,948|0@5@7&#,)!
+3 f0 (985|$#,948|0@5@7&#,)!
+3 f985 (985|$#,948|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f985 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f3890 (2431|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f4941 (940|0@5@7&#,)!
+3 f0 (985|$#,951|0@5@7&#,)!
+3 f5019 (985|$#,951|0@5@7&#,)!
+3 f0 (2875|$#,2|$#,)!
+3 f1 (2875|$#,2|$#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+3 f0 (2884|$#,2|$#,)!
+3 f1 (2884|$#,2|$#,)!
+3 f0 (4327|@5|0@5@7&#,2884|$#,)!
+3 f4327 (4327|@5|0@5@7&#,2884|$#,)!
+3 f0 (2959|$#,2|$#,)!
+3 f1 (2959|$#,2|$#,)!
+3 f0 (2839|$#,2|$#,)!
+3 f1 (2839|$#,2|$#,)!
+3 f0 (3000|$#,2|$#,)!
+3 f1 (3000|$#,2|$#,)!
+3 f0 (2949|$#,)!
+3 f1 (2949|$#,)!
+3 f0 (2918|$#,4941|0@5@2&#,985|$#,4204|$#,2|$#,2|$#,)!
+3 f1 (2918|$#,4941|0@5@2&#,985|$#,4204|$#,2|$#,2|$#,)!
+3 f0 (2918|$#,4204|$#,2|$#,2|$#,)!
+3 f1 (2918|$#,4204|$#,2|$#,2|$#,)!
+3 f0 (983|0@5@7&#,2918|$#,)!
+3 f5 (983|0@5@7&#,2918|$#,)!
+3 f0 (983|0@5@7&#,2918|$#,)!
+3 f937 (983|0@5@7&#,2918|$#,)!
+3 f0 (3075|0@5@7&#,943|$#,2918|$#,4245|0@5@7&#,)!
+3 f955 (3075|0@5@7&#,943|$#,2918|$#,4245|0@5@7&#,)!
+3 f0 (937|$#,2918|$#,4245|0@5@7&#,)!
+3 f955 (937|$#,2918|$#,4245|0@5@7&#,)!
+3 f0 (2918|$#,4245|0@5@7&#,)!
+3 f975 (2918|$#,4245|0@5@7&#,)!
+3 f0 (2278|$#,)!
+3 f983 (2278|$#,)!
+3 f0 (2278|$#,)!
+3 f958 (2278|$#,)!
+3 f0 (2296|0@5@7&#,)!
+3 f4245 (2296|0@5@7&#,)!
+3 f0 (2835|0@5@2&#,)!
+3 f1 (2835|0@5@2&#,)!
+3 f0 (2839|0@5@2&#,)!
+3 f1 (2839|0@5@2&#,)!
+3 f0 (2848|0@5@2&#,)!
+3 f1 (2848|0@5@2&#,)!
+3 f0 (2848|0@5@7&#,)!
+3 f2848 (2848|0@5@7&#,)!
+3 f0 (2875|0@5@2&#,)!
+3 f1 (2875|0@5@2&#,)!
+3 f0 (2912|0@5@2&#,)!
+3 f1 (2912|0@5@2&#,)!
+3 f0 (2949|0@5@2&#,)!
+3 f1 (2949|0@5@2&#,)!
+3 f0 (2953|0@5@2&#,)!
+3 f1 (2953|0@5@2&#,)!
+3 f0 (2959|0@5@2&#,)!
+3 f1 (2959|0@5@2&#,)!
+3 f0 (2992|0@5@2&#,)!
+3 f1 (2992|0@5@2&#,)!
+3 f0 (3000|0@5@2&#,)!
+3 f1 (3000|0@5@2&#,)!
+3 f0 (3008|0@5@7&#,)!
+3 f3008 (3008|0@5@7&#,)!
+3 f0 (3008|0@5@2&#,)!
+3 f1 (3008|0@5@2&#,)!
+3 f0 (3014|0@5@2&#,)!
+3 f1 (3014|0@5@2&#,)!
+3 f0 (3014|0@5@7&#,)!
+3 f3014 (3014|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f940 (940|0@5@7&#,)!
+3 f0 (940|0@5@2&#,)!
+3 f1 (940|0@5@2&#,)!
+3 f0 (3039|0@5@2&#,)!
+3 f1 (3039|0@5@2&#,)!
+3 f0 (3075|0@5@2&#,)!
+3 f1 (3075|0@5@2&#,)!
+3 f0 (3080|$#,)!
+3 f3080 (3080|$#,)!
+3 f0 (3208|0@5@2&#,)!
+3 f1 (3208|0@5@2&#,)!
+3 f0 (3214|0@5@2&#,)!
+3 f1 (3214|0@5@2&#,)!
+3 f0 (3246|0@5@2&#,)!
+3 f1 (3246|0@5@2&#,)!
+3 f0 (3257|0@5@2&#,)!
+3 f1 (3257|0@5@2&#,)!
+3 f0 (937|0@5@7&#,)!
+3 f937 (937|0@5@7&#,)!
+3 f0 (3340|0@5@2&#,)!
+3 f1 (3340|0@5@2&#,)!
+3 f0 (948|0@5@7&#,)!
+3 f948 (948|0@5@7&#,)!
+3 f0 (2656|$#,)!
+3 f983 (2656|$#,)!
+3 f0 (948|0@5@7&#,)!
+3 f2601 (948|0@5@7&#,)!
+3 f0 (940|0@5@7&#,2660|$#,)!
+3 f944 (940|0@5@7&#,2660|$#,)!
+3 f0 (937|$#,951|0@5@7&#,)!
+3 f1 (937|$#,951|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (5|$#,)!
+3 f983 (5|$#,)!
+3 f0 (940|0@5@7&#,948|$#,)!
+3 f1 (940|0@5@7&#,948|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f1 (983|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (2660|$#,)!
+3 f1 (2660|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (3268|0@0@2&#,3278|@5|$#,)!
+3 f3278 (3268|0@0@2&#,3278|@5|$#,)!
+3 f0 (2505|0@0@2&#,)!
+3 f3268 (2505|0@0@2&#,)!
+3 f0 (3228|0@0@2&#,)!
+3 f3268 (3228|0@0@2&#,)!
+3 f0 (2875|0@0@2&#,)!
+3 f3268 (2875|0@0@2&#,)!
+3 f0 (2884|0@0@2&#,)!
+3 f3268 (2884|0@0@2&#,)!
+3 f0 (3000|0@0@2&#,)!
+3 f3268 (3000|0@0@2&#,)!
+3 f0 (2918|0@0@2&#,)!
+3 f3268 (2918|0@0@2&#,)!
+3 f0 (2912|0@0@2&#,)!
+3 f3268 (2912|0@0@2&#,)!
+3 f0 (2949|0@0@2&#,)!
+3 f3268 (2949|0@0@2&#,)!
+3 f0 (2875|0@0@2&#,)!
+3 f3268 (2875|0@0@2&#,)!
+3 f0 (2884|0@0@2&#,)!
+3 f3268 (2884|0@0@2&#,)!
+3 f0 (3000|0@0@2&#,)!
+3 f3268 (3000|0@0@2&#,)!
+3 f0 (2918|0@0@2&#,)!
+3 f3268 (2918|0@0@2&#,)!
+3 f0 (3246|$#,)!
+3 f983 (3246|$#,)!
+3 f0 (3257|$#,)!
+3 f983 (3257|$#,)!
+3 f0 (2835|0@5@2&#,)!
+3 f1 (2835|0@5@2&#,)!
+3 f0 (2835|0@5@7&#,)!
+3 f983 (2835|0@5@7&#,)!
+3 f0 (951|0@5@7&#,951|0@5@7&#,)!
+3 f2 (951|0@5@7&#,951|0@5@7&#,)!
+3 f0 (2949|0@5@7&#,)!
+3 f983 (2949|0@5@7&#,)!
+3 f0 (2918|0@5@7&#,)!
+3 f983 (2918|0@5@7&#,)!
+3 f0 (2884|0@5@7&#,)!
+3 f983 (2884|0@5@7&#,)!
+3 f0 (3000|0@5@7&#,)!
+3 f983 (3000|0@5@7&#,)!
+3 f0 (2875|0@5@7&#,)!
+3 f983 (2875|0@5@7&#,)!
+3 f0 (937|0@0@2&#,)!
+3 f2744 (937|0@0@2&#,)!
+3 f0 (940|0@5@2&#,2|$#,)!
+3 f2744 (940|0@5@2&#,2|$#,)!
+3 f0 ()!
+3 f2744 ()!
+3 f0 ()!
+3 f2744 ()!
+3 f0 (951|0@5@2&#,2|$#,)!
+3 f2777 (951|0@5@2&#,2|$#,)!
+3 f0 (951|0@5@2&#,2762|0@0@2&#,)!
+3 f2777 (951|0@5@2&#,2762|0@0@2&#,)!
+3 f0 (937|0@5@7&#,)!
+3 f951 (937|0@5@7&#,)!
+3 f0 (3136|0@5@7&#,)!
+3 f951 (3136|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f951 (940|0@5@7&#,)!
+3 f0 (944|$#,937|0@5@7&#,)!
+3 f2 (944|$#,937|0@5@7&#,)!
+3 f0 (951|0@5@2&#,940|0@5@2&#,937|0@0@2&#,)!
+3 f2783 (951|0@5@2&#,940|0@5@2&#,937|0@0@2&#,)!
+3 f0 (2820|0@0@2&#,2803|$#,)!
+3 f2812 (2820|0@0@2&#,2803|$#,)!
+3 f0 (3340|0@0@2&#,)!
+3 f2812 (3340|0@0@2&#,)!
+3 f0 (2959|0@0@2&#,)!
+3 f3000 (2959|0@0@2&#,)!
+3 f0 (2839|0@0@2&#,)!
+3 f3000 (2839|0@0@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f2491 (951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f2491 (951|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f983 (983|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f2491 (951|0@5@2&#,)!
+3 f0 (23|0@0@2&#,)!
+3 f1 (23|0@0@2&#,)!
+3 f0 (951|0@5@7&#,951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,951|0@5@7&#,)!
+3 f0 (2431|0@5@2&#,3214|0@5@2&#,)!
+3 f3220 (2431|0@5@2&#,3214|0@5@2&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f983 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f983 (2431|0@5@7&#,)!
+3 f0 (2431|0@5@7&#,)!
+3 f983 (2431|0@5@7&#,)!
+3 f0 (3054|0@0@2&#,3191|0@0@2&#,)!
+3 f3214 (3054|0@0@2&#,3191|0@0@2&#,)!
+3 f0 (3214|0@5@7&#,)!
+3 f983 (3214|0@5@7&#,)!
+3 f0 (951|0@5@2&#,3044|0@0@2&#,3136|0@0@2&#,)!
+3 f3181 (951|0@5@2&#,3044|0@0@2&#,3136|0@0@2&#,)!
+3 f0 (951|0@5@2&#,3044|0@0@2&#,2|$#,951|0@5@2&#,3136|0@5@2&#,3086|0@5@2&#,)!
+3 f3181 (951|0@5@2&#,3044|0@0@2&#,2|$#,951|0@5@2&#,3136|0@5@2&#,3086|0@5@2&#,)!
+3 f0 (3181|0@5@7&#,)!
+3 f983 (3181|0@5@7&#,)!
+3 f0 (3075|0@5@2&#,)!
+3 f3136 (3075|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f3136 (951|0@5@2&#,)!
+3 f0 (3136|0@5@7&#,)!
+3 f983 (3136|0@5@7&#,)!
+3 f0 (951|0@5@2&#,2431|0@5@2&#,951|0@5@2&#,)!
+3 f3086 (951|0@5@2&#,2431|0@5@2&#,951|0@5@2&#,)!
+3 f0 (3086|0@5@7&#,)!
+3 f983 (3086|0@5@7&#,)!
+3 f0 (3086|0@0@17&#,)!
+3 f1 (3086|0@0@17&#,)!
+3 f0 (3086|0@5@7&#,)!
+3 f983 (3086|0@5@7&#,)!
+3 f0 (3075|$#,3070|$#,)!
+3 f6 (3075|$#,3070|$#,)!
+3 f0 (951|0@5@2&#,3070|$#,3073|$#,951|0@5@2&#,)!
+3 f3075 (951|0@5@2&#,3070|$#,3073|$#,951|0@5@2&#,)!
+3 f0 (5|$#,)!
+3 f983 (5|$#,)!
+3 f0 (3075|0@5@7&#,)!
+3 f983 (3075|0@5@7&#,)!
+3 f0 (2|$#,940|0@5@2&#,2656|0@0@2&#,)!
+3 f3044 (2|$#,940|0@5@2&#,2656|0@0@2&#,)!
+3 f0 (3075|0@0@2&#,)!
+3 f3044 (3075|0@0@2&#,)!
+3 f0 (3044|0@5@7&#,)!
+3 f983 (3044|0@5@7&#,)!
+3 f0 (940|0@5@2&#,940|0@5@2&#,)!
+3 f940 (940|0@5@2&#,940|0@5@2&#,)!
+3 f0 (2848|0@5@2&#,)!
+3 f940 (2848|0@5@2&#,)!
+3 f0 (3008|0@5@2&#,)!
+3 f940 (3008|0@5@2&#,)!
+3 f0 (3014|0@5@2&#,)!
+3 f940 (3014|0@5@2&#,)!
+3 f0 (940|0@5@2&#,1490|$#,)!
+3 f940 (940|0@5@2&#,1490|$#,)!
+3 f0 (940|0@5@7&#,)!
+3 f983 (940|0@5@7&#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,2431|0@5@17&#,)!
+3 f3014 (951|0@5@2&#,951|0@5@2&#,2431|0@5@17&#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,)!
+3 f3014 (951|0@5@2&#,951|0@5@2&#,)!
+3 f0 (3014|0@5@7&#,)!
+3 f983 (3014|0@5@7&#,)!
+3 f0 (951|0@5@2&#,3005|$#,951|0@5@2&#,2975|0@0@2&#,)!
+3 f3008 (951|0@5@2&#,3005|$#,951|0@5@2&#,2975|0@0@2&#,)!
+3 f0 (951|0@5@2&#,3005|$#,951|0@5@2&#,)!
+3 f3008 (951|0@5@2&#,3005|$#,951|0@5@2&#,)!
+3 f0 (3008|0@5@7&#,)!
+3 f983 (3008|0@5@7&#,)!
+3 f0 (940|0@5@2&#,2670|0@0@2&#,)!
+3 f2965 (940|0@5@2&#,2670|0@0@2&#,)!
+3 f0 (948|0@5@2&#,2296|0@5@2&#,)!
+3 f948 (948|0@5@2&#,2296|0@5@2&#,)!
+3 f0 (948|0@5@7&#,)!
+3 f951 (948|0@5@7&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f948 (951|0@5@2&#,)!
+3 f0 (948|0@0@2&#,)!
+3 f2660 (948|0@0@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f2660 (951|0@5@2&#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+3 f0 (2660|$#,)!
+3 f983 (2660|$#,)!
+3 f0 (2660|$#,)!
+3 f2660 (2660|$#,)!
+3 f0 (948|0@5@7&#,)!
+3 f948 (948|0@5@7&#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+3 f0 (948|0@5@2&#,)!
+3 f1 (948|0@5@2&#,)!
+3 f0 (2660|$#,)!
+3 f983 (2660|$#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+3 f0 (948|0@5@7&#,)!
+3 f983 (948|0@5@7&#,)!
+3 f0 (951|0@5@2&#,948|@5|0@5@2&#,)!
+3 f948 (951|0@5@2&#,948|@5|0@5@2&#,)!
+3 f0 (948|@5|0@5@2&#,2685|0@0@2&#,)!
+3 f948 (948|@5|0@5@2&#,2685|0@0@2&#,)!
+3 f0 (940|0@5@2&#,2862|0@0@2&#,)!
+3 f2875 (940|0@5@2&#,2862|0@0@2&#,)!
+3 f0 ()!
+3 f2884 ()!
+3 f0 ()!
+3 f2884 ()!
+3 f0 (940|0@5@2&#,2862|0@0@2&#,2|$#,2|$#,)!
+3 f2884 (940|0@5@2&#,2862|0@0@2&#,2|$#,2|$#,)!
+3 f0 (2660|0@0@2&#,937|0@5@2&#,)!
+3 f2852 (2660|0@0@2&#,937|0@5@2&#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,2|$#,2|$#,2953|0@0@2&#,)!
+3 f2959 (951|0@5@2&#,951|0@5@2&#,2|$#,2|$#,2953|0@0@2&#,)!
+3 f0 (2959|$#,)!
+3 f983 (2959|$#,)!
+3 f0 (940|0@5@7&#,)!
+3 f1 (940|0@5@7&#,)!
+3 f0 (951|0@5@2&#,940|0@5@2&#,2628|0@0@2&#,)!
+3 f2839 (951|0@5@2&#,940|0@5@2&#,2628|0@0@2&#,)!
+3 f0 (2839|$#,)!
+3 f983 (2839|$#,)!
+3 f0 (2660|0@0@2&#,2953|0@0@2&#,)!
+3 f2618 (2660|0@0@2&#,2953|0@0@2&#,)!
+3 f0 (2618|$#,)!
+3 f983 (2618|$#,)!
+3 f0 (2953|$#,)!
+3 f983 (2953|$#,)!
+3 f0 (2953|$#,)!
+3 f983 (2953|$#,)!
+3 f0 (2992|$#,)!
+3 f983 (2992|$#,)!
+3 f0 (948|0@5@7&#,)!
+3 f2296 (948|0@5@7&#,)!
+3 f0 (940|0@5@2&#,2660|0@0@2&#,)!
+3 f2918 (940|0@5@2&#,2660|0@0@2&#,)!
+3 f0 (951|0@5@2&#,2296|0@5@2&#,)!
+3 f2949 (951|0@5@2&#,2296|0@5@2&#,)!
+3 f0 (1490|$#,940|0@5@2&#,2660|0@0@2&#,2904|0@5@2&#,2894|0@5@2&#,2791|0@5@2&#,2835|0@5@2&#,2835|0@5@2&#,2777|0@5@2&#,2835|0@5@2&#,2835|0@5@2&#,)!
+3 f2918 (1490|$#,940|0@5@2&#,2660|0@0@2&#,2904|0@5@2&#,2894|0@5@2&#,2791|0@5@2&#,2835|0@5@2&#,2835|0@5@2&#,2777|0@5@2&#,2835|0@5@2&#,2835|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2296|0@5@2&#,2904|0@5@2&#,2791|0@5@2&#,2835|0@5@2&#,2812|0@5@2&#,2835|0@5@2&#,)!
+3 f2912 (951|0@5@2&#,2296|0@5@2&#,2904|0@5@2&#,2791|0@5@2&#,2835|0@5@2&#,2812|0@5@2&#,2835|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f2835 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f0 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f2835 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f0 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f2835 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f0 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f2835 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f0 (951|0@5@2&#,937|0@0@2&#,2832|$#,)!
+3 f2835 (951|0@5@2&#,937|0@0@2&#,2832|$#,)!
+3 f0 (2699|0@0@2&#,951|0@5@2&#,)!
+3 f2714 (2699|0@0@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,937|0@5@2&#,)!
+3 f2685 (951|0@5@2&#,937|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2|$#,940|0@5@2&#,)!
+3 f2689 (951|0@5@2&#,2|$#,940|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2928|0@5@2&#,)!
+3 f2953 (951|0@5@2&#,2928|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f2953 (951|0@5@2&#,2835|0@0@2&#,)!
+3 f0 (951|0@5@2&#,2431|0@5@2&#,)!
+3 f2953 (951|0@5@2&#,2431|0@5@2&#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,943|0@0@2&#,)!
+3 f3340 (951|0@5@2&#,951|0@5@2&#,943|0@0@2&#,)!
+3 f0 (2656|$#,)!
+3 f983 (2656|$#,)!
+3 f0 (940|0@5@2&#,948|0@0@2&#,)!
+3 f2278 (940|0@5@2&#,948|0@0@2&#,)!
+3 f0 ()!
+3 f2278 ()!
+3 f0 (948|$#,)!
+3 f951 (948|$#,)!
+3 f0 (940|0@5@7&#,948|$#,)!
+3 f1 (940|0@5@7&#,948|$#,)!
+3 f0 (2278|$#,)!
+3 f983 (2278|$#,)!
+3 f0 (940|0@5@7&#,)!
+3 f983 (940|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f983 (940|0@5@7&#,)!
+3 f0 (2278|$#,)!
+3 f983 (2278|$#,)!
+3 f0 (951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,)!
+3 f937 (951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,)!
+3 f0 (3136|$#,)!
+3 f951 (3136|$#,)!
+3 f0 (937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,)!
+3 f937 (937|0@0@2&#,951|0@5@2&#,937|0@0@2&#,)!
+3 f0 (3080|$#,)!
+3 f3080 (3080|$#,)!
+3 f0 (2724|0@0@2&#,951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,)!
+3 f937 (2724|0@0@2&#,951|0@5@2&#,937|0@0@2&#,951|0@5@2&#,)!
+3 f0 (937|@5|0@0@2&#,2431|0@5@2&#,)!
+3 f937 (937|@5|0@0@2&#,2431|0@5@2&#,)!
+3 f0 (937|@5|0@0@2&#,951|0@5@2&#,)!
+3 f937 (937|@5|0@0@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,937|0@0@2&#,)!
+3 f937 (951|0@5@2&#,937|0@0@2&#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f937 (951|0@5@2&#,951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f0 (937|@5|$#,943|$#,)!
+3 f937 (937|@5|$#,943|$#,)!
+3 f0 (937|$#,951|0@5@7&#,)!
+3 f1 (937|$#,951|0@5@7&#,)!
+3 f0 (943|@5|$#,951|0@5@2&#,937|0@0@2&#,)!
+3 f943 (943|@5|$#,951|0@5@2&#,937|0@0@2&#,)!
+3 f0 (937|0@5@2&#,937|@5|$#,937|0@5@2&#,)!
+3 f937 (937|0@5@2&#,937|@5|$#,937|0@5@2&#,)!
+3 f0 (937|0@5@2&#,937|@5|0@0@2&#,937|0@5@2&#,)!
+3 f937 (937|0@5@2&#,937|@5|0@0@2&#,937|0@5@2&#,)!
+3 f0 (951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f937 (951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f937 (951|0@5@2&#,943|0@0@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f937 (951|0@5@2&#,)!
+3 f0 (937|0@0@2&#,951|0@5@2&#,951|0@5@18&#,)!
+3 f937 (937|0@0@2&#,951|0@5@2&#,951|0@5@18&#,)!
+3 f0 (937|0@0@2&#,951|0@5@2&#,951|0@5@18&#,)!
+3 f937 (937|0@0@2&#,951|0@5@2&#,951|0@5@18&#,)!
+3 f0 (951|0@5@2&#,944|$#,)!
+3 f937 (951|0@5@2&#,944|$#,)!
+3 f0 (951|0@5@2&#,951|0@5@2&#,)!
+3 f937 (951|0@5@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,2762|0@0@2&#,)!
+3 f937 (951|0@5@2&#,2762|0@0@2&#,)!
+3 f0 (951|0@5@2&#,940|0@5@2&#,)!
+3 f937 (951|0@5@2&#,940|0@5@2&#,)!
+3 f0 (2912|$#,)!
+3 f983 (2912|$#,)!
+3 f0 (951|0@5@7&#,5|$#,5|$#,)!
+3 f1 (951|0@5@7&#,5|$#,5|$#,)!
+3 f0 (3075|0@5@7&#,943|$#,944|$#,)!
+3 f983 (3075|0@5@7&#,943|$#,944|$#,)!
+3 f0 (937|0@5@7&#,)!
+3 f983 (937|0@5@7&#,)!
+3 f0 (2777|0@5@2&#,)!
+3 f1 (2777|0@5@2&#,)!
+3 f0 (2777|0@5@7&#,)!
+3 f983 (2777|0@5@7&#,)!
+3 f0 (2812|$#,)!
+3 f983 (2812|$#,)!
+3 f0 (3340|$#,)!
+3 f983 (3340|$#,)!
+3 f0 (3136|0@5@2&#,3086|0@0@18&#,)!
+3 f3148 (3136|0@5@2&#,3086|0@0@18&#,)!
+3 f0 (3148|$#,)!
+3 f983 (3148|$#,)!
+3 f0 (3075|0@5@7&#,3075|0@5@7&#,)!
+3 f2 (3075|0@5@7&#,3075|0@5@7&#,)!
+3 f0 (3136|0@5@7&#,3136|0@5@7&#,)!
+3 f2 (3136|0@5@7&#,3136|0@5@7&#,)!
+3 f0 (2848|0@5@2&#,)!
+3 f1 (2848|0@5@2&#,)!
+3 f0 (2848|0@5@7&#,)!
+3 f2848 (2848|0@5@7&#,)!
+3 f0 (2848|0@5@2&#,951|0@5@2&#,)!
+3 f2848 (2848|0@5@2&#,951|0@5@2&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f2848 (951|0@5@2&#,)!
+3 f0 (3086|$#,3086|$#,)!
+3 f2 (3086|$#,3086|$#,)!
+3 f0 (944|$#,948|0@5@7&#,)!
+3 f944 (944|$#,948|0@5@7&#,)!
+3 f0 (944|$#,948|0@5@7&#,)!
+3 f944 (944|$#,948|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f944 (940|0@5@7&#,)!
+3 f0 (2485|$#,951|0@5@2&#,)!
+3 f945 (2485|$#,951|0@5@2&#,)!
+3 f0 (940|0@5@7&#,2660|$#,)!
+3 f944 (940|0@5@7&#,2660|$#,)!
+3 f0 (3127|0@0@2&#,)!
+3 f1 (3127|0@0@2&#,)!
+3 f0 (3127|$#,)!
+3 f983 (3127|$#,)!
+3 f0 (2904|$#,)!
+3 f2601 (2904|$#,)!
+3 f0 (940|0@5@7&#,2660|$#,2904|$#,)!
+3 f1 (940|0@5@7&#,2660|$#,2904|$#,)!
+3 f0 (2296|0@5@7&#,2904|$#,)!
+3 f1 (2296|0@5@7&#,2904|$#,)!
+3 f0 (948|0@5@7&#,)!
+3 f2601 (948|0@5@7&#,)!
+3 f0 (3086|$#,)!
+3 f944 (3086|$#,)!
+3 f0 (3086|$#,)!
+3 f2520 (3086|$#,)!
+3 f0 (951|0@5@6&#,)!
+3 f3073 (951|0@5@6&#,)!
+3 f0 (5|$#,)!
+3 f3073 (5|$#,)!
+3 f0 (2278|@5|$#,)!
+3 f2278 (2278|@5|$#,)!
+3 f0 (940|0@5@7&#,)!
+3 f940 (940|0@5@7&#,)!
+3 f0 (940|0@5@7&#,)!
+3 f940 (940|0@5@7&#,)!
+3 f0 (940|0@5@2&#,)!
+3 f1 (940|0@5@2&#,)!
+3 f0 (3075|0@5@7&#,)!
+3 f3075 (3075|0@5@7&#,)!
+3 f0 (3075|0@5@2&#,)!
+3 f1 (3075|0@5@2&#,)!
+3 f0 (3136|0@5@2&#,)!
+3 f1 (3136|0@5@2&#,)!
+3 f0 (3148|$#,3148|$#,)!
+3 f2 (3148|$#,3148|$#,)!
+3 f0 (3148|0@0@2&#,)!
+3 f1 (3148|0@0@2&#,)!
+3 f0 (3086|0@5@2&#,)!
+3 f1 (3086|0@5@2&#,)!
+3 f0 (2660|0@5@2&#,)!
+3 f1 (2660|0@5@2&#,)!
+3 f0 (2953|0@5@2&#,)!
+3 f1 (2953|0@5@2&#,)!
+3 f0 (2918|0@5@2&#,)!
+3 f1 (2918|0@5@2&#,)!
+3 f0 (2618|0@5@2&#,)!
+3 f1 (2618|0@5@2&#,)!
+3 f0 (3148|$#,)!
+3 f3148 (3148|$#,)!
+3 f0 (3086|$#,)!
+3 f3086 (3086|$#,)!
+3 f0 (3136|0@5@7&#,)!
+3 f3136 (3136|0@5@7&#,)!
+3 f0 (3136|$#,)!
+3 f3136 (3136|$#,)!
+3 f0 (2852|$#,)!
+3 f2 (2852|$#,)!
+3 f0 (937|0@5@2&#,)!
+3 f1 (937|0@5@2&#,)!
+3 f0 (937|$#,)!
+3 f937 (937|$#,)!
+3 f0 (937|0@5@7&#,)!
+3 f937 (937|0@5@7&#,)!
+3 f0 (2491|0@5@2&#,)!
+3 f1 (2491|0@5@2&#,)!
+3 f0 (2852|0@5@2&#,)!
+3 f1 (2852|0@5@2&#,)!
+3 f0 (2783|0@5@2&#,)!
+3 f1 (2783|0@5@2&#,)!
+3 f0 (2593|0@5@2&#,)!
+3 f1 (2593|0@5@2&#,)!
+3 f0 (2278|0@5@7&#,)!
+3 f2278 (2278|0@5@7&#,)!
+3 f0 (2278|0@5@2&#,)!
+3 f1 (2278|0@5@2&#,)!
+3 f0 (2812|0@5@2&#,)!
+3 f1 (2812|0@5@2&#,)!
+3 f0 (2714|$#,)!
+3 f2714 (2714|$#,)!
+3 f0 (2714|0@5@2&#,)!
+3 f1 (2714|0@5@2&#,)!
+3 f0 (3181|0@5@2&#,)!
+3 f1 (3181|0@5@2&#,)!
+3 f0 (2744|$#,)!
+3 f2744 (2744|$#,)!
+3 f0 (2744|0@5@2&#,)!
+3 f1 (2744|0@5@2&#,)!
+3 f0 (2965|$#,)!
+3 f2965 (2965|$#,)!
+3 f0 (2965|0@5@2&#,)!
+3 f1 (2965|0@5@2&#,)!
+3 f0 (3220|0@5@2&#,)!
+3 f1 (3220|0@5@2&#,)!
+3 f0 (3044|0@5@2&#,)!
+3 f1 (3044|0@5@2&#,)!
+3 f0 (2884|0@5@2&#,)!
+3 f1 (2884|0@5@2&#,)!
+3 f0 (2689|$#,)!
+3 f2689 (2689|$#,)!
+3 f0 (2689|0@5@2&#,)!
+3 f1 (2689|0@5@2&#,)!
+3 f0 (3340|0@5@2&#,)!
+3 f1 (3340|0@5@2&#,)!
+3 f0 (3214|0@5@2&#,)!
+3 f1 (3214|0@5@2&#,)!
+3 f0 (3208|0@5@2&#,)!
+3 f1 (3208|0@5@2&#,)!
+3 f0 (3039|0@5@2&#,)!
+3 f1 (3039|0@5@2&#,)!
+3 f0 (3268|$#,)!
+3 f983 (3268|$#,)!
+3 f0 (3268|0@5@2&#,)!
+3 f1 (3268|0@5@2&#,)!
+3 f0 (3246|0@5@2&#,)!
+3 f1 (3246|0@5@2&#,)!
+3 f0 (3257|0@5@2&#,)!
+3 f1 (3257|0@5@2&#,)!
+3 f0 (2875|0@5@2&#,)!
+3 f1 (2875|0@5@2&#,)!
+3 f0 (3000|0@5@2&#,)!
+3 f1 (3000|0@5@2&#,)!
+3 f0 (2912|0@5@2&#,)!
+3 f1 (2912|0@5@2&#,)!
+3 f0 (2949|0@5@2&#,)!
+3 f1 (2949|0@5@2&#,)!
+3 f0 (2959|0@5@2&#,)!
+3 f1 (2959|0@5@2&#,)!
+3 f0 (2839|0@5@2&#,)!
+3 f1 (2839|0@5@2&#,)!
+3 f0 (2992|0@5@2&#,)!
+3 f1 (2992|0@5@2&#,)!
+3 f0 (3008|0@5@7&#,)!
+3 f3008 (3008|0@5@7&#,)!
+3 f0 (3008|0@5@2&#,)!
+3 f1 (3008|0@5@2&#,)!
+3 f0 (3014|0@5@2&#,)!
+3 f1 (3014|0@5@2&#,)!
+3 f0 (3014|0@5@7&#,)!
+3 f3014 (3014|0@5@7&#,)!
+3 f0 (945|$#,)!
+3 f1 (945|$#,)!
+3 f0 ()!
+3 f945 ()!
+3 f0 ()!
+3 f945 ()!
+3 f0 ()!
+3 f945 ()!
+3 f0 ()!
+3 f945 ()!
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 ()!
+3 f951 ()!
+3 f0 (2|$#,)!
+3 f1 (2|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4|$#,)!
+3 f13975 (4|$#,)!
+3 f0 (4|$#,)!
+3 f2 (4|$#,)!
+3 f0 (4|$#,13975|$#,)!
+3 f1 (4|$#,13975|$#,)!
+3 f0 (4|$#,2|$#,)!
+3 f1 (4|$#,2|$#,)!
+3 f0 ()!
+3 f951 ()!
+3 f0 (6|$#,945|$#,)!
+3 f951 (6|$#,945|$#,)!
+3 f0 (6|$#,945|$#,)!
+3 f951 (6|$#,945|$#,)!
+3 f0 (6|$#,2346|$#,945|$#,)!
+3 f951 (6|$#,2346|$#,945|$#,)!
+3 f0 (6|$#,945|$#,983|0@5@7&#,6|$#,6|$#,)!
+3 f951 (6|$#,945|$#,983|0@5@7&#,6|$#,6|$#,)!
+3 f0 (6|$#,)!
+3 f983 (6|$#,)!
+3 f0 (951|0@5@7&#,)!
+3 f983 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f983 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f951 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f945 (951|0@5@7&#,)!
+3 f0 (951|0@5@7&#,)!
+3 f983 (951|0@5@7&#,)!
+3 f0 (951|0@5@17&#,)!
+3 f1 (951|0@5@17&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f1 (951|0@5@2&#,)!
+3 f0 (4|$#,)!
+3 f2 (4|$#,)!
+3 f0 (952|$#,945|$#,945|$#,2|$#,)!
+3 f951 (952|$#,945|$#,945|$#,2|$#,)!
+3 f0 (952|$#,945|$#,2|$#,)!
+3 f1 (952|$#,945|$#,2|$#,)!
+3 f0 (945|$#,2|$#,)!
+3 f1 (945|$#,2|$#,)!
+3 f0 (945|$#,)!
+3 f951 (945|$#,)!
+3 f0 (952|$#,23|$#,)!
+3 f951 (952|$#,23|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 e!95{STARTCNUM,STARTCNUMDOT,STARTCSTR,STARTCCHAR,STARTWIDE,STARTSLASH,STARTOTHER}!
+0 s6639|&
+0 s353|&
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (23|0@0@6&#,)!
+3 f1 (23|0@0@6&#,)!
+2 F0/0|0&
+2 F13978/0|13978&
+2 F0/0|0&
+2 F15205/0|15205&
+2 F0/0|0&
+2 F2/0|982&
+2 F0/0|0&
+2 F2/0|982&
+2 F0/0|0&
+2 F2/0|982&
+2 F0/0|0&
+2 F2/0|982&
+2 F0/0|0&
+2 F2/0|982&
+2 F0/0|0&
+2 F2/0|982&
+2 F0/0|0&
+2 F4/0|4&
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (952|$#,)!
+3 f2 (952|$#,)!
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 ()!
+3 f951 ()!
+3 f0 (2|$#,)!
+3 f1 (2|$#,)!
+3 f0 (23|0@0@6&#,)!
+3 f1 (23|0@0@6&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (4|$#,)!
+3 f2 (4|$#,)!
+3 f0 (4|$#,)!
+3 f13975 (4|$#,)!
+3 f0 (4|$#,13975|$#,)!
+3 f1 (4|$#,13975|$#,)!
+3 f0 (4|$#,2|$#,)!
+3 f1 (4|$#,2|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (945|$#,945|$#,)!
+3 f1 (945|$#,945|$#,)!
+3 f0 (945|$#,)!
+3 f951 (945|$#,)!
+3 f0 (945|$#,)!
+3 f2 (945|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (952|$#,945|$#,945|$#,2|$#,)!
+3 f951 (952|$#,945|$#,945|$#,2|$#,)!
+3 f0 (952|$#,945|$#,2|$#,)!
+3 f1 (952|$#,945|$#,2|$#,)!
+3 f0 (945|$#,2|$#,)!
+3 f1 (945|$#,2|$#,)!
+3 f0 (945|$#,)!
+3 f951 (945|$#,)!
+3 f0 (952|$#,23|$#,)!
+3 f951 (952|$#,23|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f945 ()!
+3 f0 ()!
+3 f945 ()!
+3 f0 ()!
+3 f945 ()!
+3 f0 (944|$#,944|$#,)!
+3 f1 (944|$#,944|$#,)!
+3 f0 (2168|$#,)!
+3 f2 (2168|$#,)!
+3 f0 (2168|15@0@1&#,)!
+3 f944 (2168|15@0@1&#,)!
+3 f0 (2168|$#,)!
+3 f944 (2168|$#,)!
+3 f0 (2168|15@0@1&#,)!
+3 f944 (2168|15@0@1&#,)!
+3 f0 (944|$#,944|$#,944|$#,)!
+3 f1 (944|$#,944|$#,944|$#,)!
+3 f0 (944|$#,944|$#,5|$#,944|$#,)!
+3 f1 (944|$#,944|$#,5|$#,944|$#,)!
+3 f0 (944|$#,944|$#,5|$#,)!
+3 f1 (944|$#,944|$#,5|$#,)!
+3 f0 (944|$#,)!
+3 f1 (944|$#,)!
+3 f0 (944|$#,)!
+3 f1 (944|$#,)!
+3 f0 (944|$#,944|$#,)!
+3 f1 (944|$#,944|$#,)!
+3 f0 (944|$#,)!
+3 f1 (944|$#,)!
+3 f0 (944|$#,)!
+3 f1 (944|$#,)!
+3 f0 (944|$#,5|$#,)!
+3 f1 (944|$#,5|$#,)!
+3 f0 (944|$#,)!
+3 f1 (944|$#,)!
+3 f0 (2160|$#,)!
+3 f983 (2160|$#,)!
+3 f0 (2168|$#,)!
+3 f983 (2168|$#,)!
+1 t2|982&
+3 f0 (23|$#,951|0@5@7&#,15346|4@0@7&#,)!
+3 f945 (23|$#,951|0@5@7&#,15346|4@0@7&#,)!
+3 f0 (3136|0@0@2&#,944|$#,951|0@5@2&#,)!
+3 f1 (3136|0@0@2&#,944|$#,951|0@5@2&#,)!
+3 f0 (3136|0@0@2&#,944|$#,944|$#,)!
+3 f1 (3136|0@0@2&#,944|$#,944|$#,)!
+3 f0 (3136|0@0@2&#,944|$#,951|0@5@2&#,944|$#,)!
+3 f1 (3136|0@0@2&#,944|$#,951|0@5@2&#,944|$#,)!
+3 f0 (945|$#,)!
+3 f3136 (945|$#,)!
+3 f0 (945|$#,)!
+3 f3136 (945|$#,)!
+3 f0 (945|$#,945|$#,)!
+3 f945 (945|$#,945|$#,)!
+3 f0 (951|0@5@7&#,944|$#,2168|$#,)!
+3 f1 (951|0@5@7&#,944|$#,2168|$#,)!
+1 t2168|2168&
+3 f0 (2165|0@5@2&#,)!
+3 f1 (2165|0@5@2&#,)!
+3 f0 (2168|15@0@1&#,)!
+3 f1 (2168|15@0@1&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f944 ()!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 (945|$#,2160|$#,944|$#,945|$#,2|$#,944|$#,2165|0@5@7&#,)!
+3 f944 (945|$#,2160|$#,944|$#,945|$#,2|$#,944|$#,2165|0@5@7&#,)!
+3 f0 (945|$#,2|$#,944|$#,)!
+3 f944 (945|$#,2|$#,944|$#,)!
+3 f0 (951|0@5@7&#,945|$#,)!
+3 f944 (951|0@5@7&#,945|$#,)!
+3 f0 (951|0@5@7&#,945|$#,)!
+3 f944 (951|0@5@7&#,945|$#,)!
+3 f0 (951|0@5@7&#,945|$#,)!
+3 f944 (951|0@5@7&#,945|$#,)!
+3 f0 (951|0@5@7&#,944|$#,945|$#,)!
+3 f944 (951|0@5@7&#,944|$#,945|$#,)!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 (951|0@5@7&#,944|$#,)!
+3 f944 (951|0@5@7&#,944|$#,)!
+3 f0 (944|$#,5|$#,)!
+3 f944 (944|$#,5|$#,)!
+3 f0 (951|0@5@7&#,944|$#,)!
+3 f944 (951|0@5@7&#,944|$#,)!
+3 f0 (951|0@5@7&#,944|$#,)!
+3 f944 (951|0@5@7&#,944|$#,)!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 (951|0@5@7&#,945|$#,)!
+3 f944 (951|0@5@7&#,945|$#,)!
+3 f0 (951|0@5@7&#,945|$#,)!
+3 f944 (951|0@5@7&#,945|$#,)!
+3 f0 (951|0@5@7&#,)!
+3 f944 (951|0@5@7&#,)!
+3 f0 (944|$#,2165|0@5@2&#,)!
+3 f2 (944|$#,2165|0@5@2&#,)!
+3 f0 (951|0@5@7&#,944|$#,)!
+3 f944 (951|0@5@7&#,944|$#,)!
+3 f0 (944|$#,944|$#,)!
+3 f1 (944|$#,944|$#,)!
+3 f0 (944|$#,)!
+3 f1 (944|$#,)!
+3 f0 (944|$#,)!
+3 f1 (944|$#,)!
+3 f0 (944|$#,944|$#,)!
+3 f1 (944|$#,944|$#,)!
+3 f0 (951|0@5@7&#,)!
+3 f944 (951|0@5@7&#,)!
+3 f0 (944|$#,2165|0@5@2&#,)!
+3 f2 (944|$#,2165|0@5@2&#,)!
+3 f0 (951|0@5@7&#,944|$#,)!
+3 f944 (951|0@5@7&#,944|$#,)!
+3 f0 ()!
+3 f945 ()!
+3 f0 ()!
+3 f945 ()!
+3 f0 ()!
+3 f945 ()!
+3 f0 (951|0@5@7&#,)!
+3 f944 (951|0@5@7&#,)!
+3 f0 (944|$#,2165|0@5@2&#,)!
+3 f2 (944|$#,2165|0@5@2&#,)!
+3 f0 (944|$#,)!
+3 f1 (944|$#,)!
+3 f0 (944|$#,944|$#,944|$#,)!
+3 f1 (944|$#,944|$#,944|$#,)!
+3 f0 (944|$#,944|$#,5|$#,944|$#,)!
+3 f1 (944|$#,944|$#,5|$#,944|$#,)!
+3 f0 (944|$#,)!
+3 f1 (944|$#,)!
+3 f0 (944|$#,944|$#,5|$#,)!
+3 f1 (944|$#,944|$#,5|$#,)!
+3 f0 (944|$#,5|$#,)!
+3 f1 (944|$#,5|$#,)!
+3 f0 (3136|0@0@2&#,944|$#,951|0@5@2&#,)!
+3 f1 (3136|0@0@2&#,944|$#,951|0@5@2&#,)!
+3 f0 (944|$#,)!
+3 f1 (944|$#,)!
+3 f0 (3136|0@0@2&#,944|$#,944|$#,)!
+3 f1 (3136|0@0@2&#,944|$#,944|$#,)!
+3 f0 (3136|0@0@2&#,944|$#,951|0@5@2&#,944|$#,)!
+3 f1 (3136|0@0@2&#,944|$#,951|0@5@2&#,944|$#,)!
+3 f0 (945|$#,)!
+3 f3136 (945|$#,)!
+3 f0 (945|$#,)!
+3 f3136 (945|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (945|$#,)!
+3 f944 (945|$#,)!
+3 f0 (2168|$#,)!
+3 f2 (2168|$#,)!
+3 f0 (2168|$#,)!
+3 f944 (2168|$#,)!
+3 f0 (2168|15@0@1&#,)!
+3 f944 (2168|15@0@1&#,)!
+3 f0 (2168|15@0@1&#,)!
+3 f944 (2168|15@0@1&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (944|$#,)!
+3 f2168 (944|$#,)!
+3 f0 (944|$#,)!
+3 f2168 (944|$#,)!
+3 f0 (2165|0@5@7&#,)!
+3 f983 (2165|0@5@7&#,)!
+3 f0 (2165|0@5@7&#,)!
+3 f983 (2165|0@5@7&#,)!
+3 f0 (944|$#,)!
+3 f983 (944|$#,)!
+3 f0 (945|$#,945|$#,)!
+3 f945 (945|$#,945|$#,)!
+2 F0/0|0&
+2 F4/0|4&
+3 f0 (23|$#,951|0@5@7&#,15346|4@0@7&#,)!
+3 f945 (23|$#,951|0@5@7&#,15346|4@0@7&#,)!
+3 f0 (944|$#,5|$#,)!
+3 f944 (944|$#,5|$#,)!
+3 f0 (944|$#,)!
+3 f944 (944|$#,)!
+3 f0 (2168|$#,)!
+3 f945 (2168|$#,)!
+3 f0 (2168|$#,)!
+3 f2168 (2168|$#,)!
+3 f0 (944|$#,)!
+3 f2 (944|$#,)!
+3 f0 (2|$#,)!
+3 f2 (2|$#,)!
+3 f0 (2160|$#,)!
+3 f983 (2160|$#,)!
+3 f0 (944|$#,)!
+3 f2 (944|$#,)!
+3 f0 (213|$#,2|$#,)!
+3 f1 (213|$#,2|$#,)!
+3 f0 (23|$#,945|$#,944|$#,)!
+3 f1 (23|$#,945|$#,944|$#,)!
+3 f0 (23|$#,951|0@5@7&#,2076|$#,2150|$#,2539|$#,)!
+3 f1 (23|$#,951|0@5@7&#,2076|$#,2150|$#,2539|$#,)!
+2 F0/0|0&
+2 F4/0|4&
+2 F0/10|0&
+2 F4/10|4&
+2 F0/0|0&
+2 F4/0|4&
+2 F0/0|0&
+2 F4/0|4&
+3 f0 (2076|$#,951|0@5@7&#,2150|$#,)!
+3 f1 (2076|$#,951|0@5@7&#,2150|$#,)!
+3 f0 (2252|$#,2252|$#,)!
+3 f2 (2252|$#,2252|$#,)!
+3 f0 (944|$#,944|$#,)!
+3 f2 (944|$#,944|$#,)!
+3 f0 (944|$#,944|$#,)!
+3 f2 (944|$#,944|$#,)!
+3 f0 (944|$#,)!
+3 f945 (944|$#,)!
+3 f0 (944|$#,)!
+3 f19 (944|$#,)!
+3 f23 (944|$#,)!
+3 f0 (944|$#,)!
+3 f983 (944|$#,)!
+3 f0 (951|0@5@7&#,944|$#,2168|$#,)!
+3 f1 (951|0@5@7&#,944|$#,2168|$#,)!
+3 f0 (2168|$#,)!
+3 f983 (2168|$#,)!
+3 f0 (945|$#,)!
+3 f944 (945|$#,)!
+3 f0 (944|$#,)!
+3 f2 (944|$#,)!
+3 f0 (944|$#,)!
+3 f2 (944|$#,)!
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+1 t3698|3698&
+3 f0 (15547|$#,213|$#,2|$#,)!
+3 f1 (15547|$#,213|$#,2|$#,)!
+3 f0 (3671|0@0@2&#,)!
+3 f1 (3671|0@0@2&#,)!
+3 f0 (3701|$#,)!
+3 f3686 (3701|$#,)!
+3 f0 (3701|$#,213|$#,2|$#,)!
+3 f1 (3701|$#,213|$#,2|$#,)!
+3 f0 (3136|$#,)!
+3 f945 (3136|$#,)!
+3 e!96{SYMK_FCN,SYMK_SCOPE,SYMK_TYPE,SYMK_VAR}!
+0 s6640|&
+0 s354|&
+3 U!97{3650|@1|0@0@2&#fct,3686|@1|0@0@2&#scope,3654|@1|0@0@2&#type,3661|@1|0@0@2&#var,}!
+0 s6564|&
+3 S!98{15560|@1|^#kind,15561|@1|^#info,}!
+0 s6371|&
+0 s363|-1 15566 -1
+1 t15565|15565&
+3 S_idTable{6|@1|^#size,6|@1|^#allocated,15566|@1|0@3@3&#entries,2|@1|^#exporting,}!
+0 s6495|&
+0 s355|-1 15570 -1
+1 t15569|15569&
+3 S_symtableStruct{15570|@1|0@0@3&#idTable,15547|@1|0@0@3&#hTable,2150|@1|0@0@3&#type2sort,}!
+3 f0 (15566|$#,)!
+3 f951 (15566|$#,)!
+3 f0 (15570|$#,)!
+3 f19 (15570|$#,)!
+3 f15566 (15570|$#,)!
+3 f0 (15570|$#,945|$#,)!
+3 f19 (15570|$#,945|$#,)!
+3 f15566 (15570|$#,945|$#,)!
+3 f0 (15570|$#,945|$#,)!
+3 f19 (15570|$#,945|$#,)!
+3 f15566 (15570|$#,945|$#,)!
+3 f0 ()!
+3 f19 ()!
+3 f15570 ()!
+3 f0 (15565|$#,)!
+3 f1 (15565|$#,)!
+3 f0 (3687|$#,)!
+3 f3646 (3687|$#,)!
+3 f0 (15547|0@0@2&#,)!
+3 f1 (15547|0@0@2&#,)!
+3 f0 (6|$#,)!
+3 f19 (6|$#,)!
+3 f15547 (6|$#,)!
+3 f0 (15547|$#,3646|$#,3674|$#,3136|0@5@7&#,)!
+3 f19 (15547|$#,3646|$#,3674|$#,3136|0@5@7&#,)!
+3 f3687 (15547|$#,3646|$#,3674|$#,3136|0@5@7&#,)!
+3 f0 (15547|$#,3687|0@0@2&#,)!
+3 f2 (15547|$#,3687|0@0@2&#,)!
+3 f0 (15547|$#,3687|0@0@2&#,)!
+3 f19 (15547|$#,3687|0@0@2&#,)!
+3 f3687 (15547|$#,3687|0@0@2&#,)!
+3 f0 (15570|0@0@2&#,)!
+3 f1 (15570|0@0@2&#,)!
+3 f0 (3661|0@0@2&#,)!
+3 f1 (3661|0@0@2&#,)!
+3 f0 (3661|$#,)!
+3 f3661 (3661|$#,)!
+3 f0 (3701|0@0@2&#,)!
+3 f1 (3701|0@0@2&#,)!
+3 f0 (15570|0@0@2&#,)!
+3 f1 (15570|0@0@2&#,)!
+3 f0 (3650|0@0@2&#,)!
+3 f1 (3650|0@0@2&#,)!
+3 f0 (3654|0@0@2&#,)!
+3 f1 (3654|0@0@2&#,)!
+3 f0 (3686|0@0@2&#,)!
+3 f1 (3686|0@0@2&#,)!
+3 f0 (15565|$#,)!
+3 f1 (15565|$#,)!
+3 f0 (15566|$#,)!
+3 f951 (15566|$#,)!
+3 f0 ()!
+3 f3701 ()!
+3 f0 ()!
+3 f19 ()!
+3 f15570 ()!
+3 f0 (3136|$#,)!
+3 f945 (3136|$#,)!
+3 f0 (3687|$#,3086|0@0@17&#,)!
+3 f2 (3687|$#,3086|0@0@17&#,)!
+3 f0 (3701|$#,3136|0@2@2&#,3086|0@0@17&#,)!
+3 f1 (3701|$#,3136|0@2@2&#,3086|0@0@17&#,)!
+3 f0 (3701|$#,3671|0@0@2&#,)!
+3 f2 (3701|$#,3671|0@0@2&#,)!
+3 f0 (3701|$#,3671|0@0@2&#,)!
+3 f2 (3701|$#,3671|0@0@2&#,)!
+3 f0 (3701|$#,3136|0@2@7&#,)!
+3 f3665 (3701|$#,3136|0@2@7&#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f3671 (3701|$#,945|$#,)!
+3 f0 (3701|$#,3686|0@0@4&#,)!
+3 f1 (3701|$#,3686|0@0@4&#,)!
+3 f0 (3701|$#,)!
+3 f1 (3701|$#,)!
+3 f0 (3701|$#,3650|0@0@2&#,)!
+3 f2 (3701|$#,3650|0@0@2&#,)!
+3 f0 (3701|$#,3654|0@0@2&#,)!
+3 f1 (3701|$#,3654|0@0@2&#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f945 (3701|$#,945|$#,)!
+3 f0 (3701|$#,3661|0@0@6&#,)!
+3 f2 (3701|$#,3661|0@0@6&#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f2 (3701|$#,945|$#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f3654 (3701|$#,945|$#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f3661 (3701|$#,945|$#,)!
+3 f0 (3701|$#,945|$#,)!
+3 f3661 (3701|$#,945|$#,)!
+3 f0 (3701|$#,)!
+3 f3686 (3701|$#,)!
+3 f0 (3701|$#,2|$#,)!
+3 f1 (3701|$#,2|$#,)!
+3 f0 (15547|$#,213|$#,2|$#,)!
+3 f1 (15547|$#,213|$#,2|$#,)!
+1 t3691|3691&
+3 f0 (3701|$#,213|$#,2|$#,)!
+3 f1 (3701|$#,213|$#,2|$#,)!
+3 f0 (2150|$#,945|$#,)!
+3 f945 (2150|$#,945|$#,)!
+3 f0 (2150|$#,3148|@5|0@5@7&#,)!
+3 f3148 (2150|$#,3148|@5|0@5@7&#,)!
+3 f0 (3086|$#,)!
+3 f3127 (3086|$#,)!
+3 f0 (23|$#,2076|$#,)!
+3 f2601 (23|$#,2076|$#,)!
+2 F0/0|0&
+2 F4/0|4&
+2 F0/0|0&
+2 F4/0|4&
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+0 s220|-1 15688 -1
+3 f0 (23|$#,2076|$#,2150|$#,)!
+3 f1 (23|$#,2076|$#,2150|$#,)!
+1 t15685|15685&
+2 F0/0|0&
+2 F4/0|4&
+2 F0/20|0&
+2 F4/20|4&
+2 F0/0|0&
+2 F4/0|4&
+1 t3650|3650&
+3 f0 (2076|$#,951|0@5@7&#,2150|$#,)!
+3 f1 (2076|$#,951|0@5@7&#,2150|$#,)!
+3 f0 (3701|$#,213|$#,2|$#,)!
+3 f1 (3701|$#,213|$#,2|$#,)!
+3 f0 (15570|$#,)!
+3 f19 (15570|$#,)!
+3 f15566 (15570|$#,)!
+3 f0 (15570|$#,945|$#,)!
+3 f19 (15570|$#,945|$#,)!
+3 f15566 (15570|$#,945|$#,)!
+3 f0 (15570|$#,945|$#,)!
+3 f19 (15570|$#,945|$#,)!
+3 f15566 (15570|$#,945|$#,)!
+3 f0 (3687|$#,)!
+3 f3646 (3687|$#,)!
+3 f0 (3687|0@5@2&#,)!
+3 f1 (3687|0@5@2&#,)!
+3 f0 (3693|0@5@2&#,)!
+3 f1 (3693|0@5@2&#,)!
+3 f0 (15547|0@0@2&#,)!
+3 f1 (15547|0@0@2&#,)!
+3 f0 (6|$#,)!
+3 f19 (6|$#,)!
+3 f15547 (6|$#,)!
+1 t3693|3693&
+3 f0 (15547|$#,3646|$#,3674|$#,3136|0@5@7&#,)!
+3 f19 (15547|$#,3646|$#,3674|$#,3136|0@5@7&#,)!
+3 f3687 (15547|$#,3646|$#,3674|$#,3136|0@5@7&#,)!
+3 f0 (15547|$#,3687|0@0@2&#,)!
+3 f2 (15547|$#,3687|0@0@2&#,)!
+3 f0 (15547|$#,3687|0@0@2&#,)!
+3 f19 (15547|$#,3687|0@0@2&#,)!
+3 f3687 (15547|$#,3687|0@0@2&#,)!
+3 f0 (15547|$#,)!
+3 f1 (15547|$#,)!
+3 f0 (3701|$#,)!
+3 f1 (3701|$#,)!
+3 f0 (2485|$#,)!
+3 f983 (2485|$#,)!
+3 f0 (3671|0@0@2&#,)!
+3 f1 (3671|0@0@2&#,)!
+3 f0 (3701|$#,3136|$#,)!
+3 f3100 (3701|$#,3136|$#,)!
+3 f0 (3701|$#,3136|$#,5|$#,)!
+3 f2 (3701|$#,3136|$#,5|$#,)!
+3 f0 (2431|0@5@7&#,3348|$#,)!
+3 f2 (2431|0@5@7&#,3348|$#,)!
+3 f0 (3701|$#,3136|0@5@6&#,3348|$#,944|$#,)!
+3 f3158 (3701|$#,3136|0@5@6&#,3348|$#,944|$#,)!
+0 s352|&
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (15745|$#,)!
+3 f1 (15745|$#,)!
+3 f0 (13975|$#,)!
+3 f1 (13975|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (13975|$#,)!
+3 f1 (13975|$#,)!
+3 f0 (952|$#,)!
+3 f1 (952|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (951|0@5@7&#,23|0@0@6&#,)!
+3 f1 (951|0@5@7&#,23|0@0@6&#,)!
+2 F0/0|0&
+2 F2/0|982&
+3 f0 (23|$#,)!
+3 f951 (23|$#,)!
+3 f0 (951|0@5@7&#,)!
+3 f2 (951|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (15745|$#,)!
+3 f1 (15745|$#,)!
+3 f0 (13975|$#,)!
+3 f1 (13975|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (13975|$#,)!
+3 f1 (13975|$#,)!
+3 f0 (952|$#,)!
+3 f1 (952|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (951|0@5@7&#,23|0@0@6&#,)!
+3 f1 (951|0@5@7&#,23|0@0@6&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+2 F0/0|0&
+2 F2348/0|2348&
+3 f0 ()!
+3 f2 ()!
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 f0 (951|0@5@2&#,)!
+3 f1 (951|0@5@2&#,)!
+3 f0 ()!
+3 f951 ()!
+3 f0 (2|$#,)!
+3 f1 (2|$#,)!
+2 F0/0|0&
+2 F2348/0|2348&
+3 f0 ()!
+3 f952 ()!
+3 f0 ()!
+3 f951 ()!
+3 f0 ()!
+3 f951 ()!
+3 f0 (951|0@5@2&#,)!
+3 f1 (951|0@5@2&#,)!
+3 f0 ()!
+3 f19 ()!
+3 f2076 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (2076|$#,)!
+3 f1 (2076|$#,)!
+3 f0 ()!
+3 f1 ()!
+0 s87|&
+3 S!99{945|@1|^#HashNext,16015|@1|^#i,}!
+0 s6341|&
+0 s357|-1 16027 -1
+3 f0 (6|$#,)!
+3 f1 (6|$#,)!
+3 f0 (23|0@0@9&#,)!
+3 f16015 (23|0@0@9&#,)!
+3 f0 (6|$#,)!
+3 f1 (6|$#,)!
+3 f0 (23|$#,10|$#,)!
+3 f945 (23|$#,10|$#,)!
+1 t16018|16018&
+3 f0 (983|0@5@6&#,)!
+3 f945 (983|0@5@6&#,)!
+3 f0 (23|0@0@6&#,)!
+3 f945 (23|0@0@6&#,)!
+3 f0 (945|$#,)!
+3 f983 (945|$#,)!
+3 f0 (945|$#,)!
+3 f19 (945|$#,)!
+3 f23 (945|$#,)!
+3 f0 (945|$#,)!
+3 f19 (945|$#,)!
+3 f23 (945|$#,)!
+3 f0 (6|$#,)!
+3 f1 (6|$#,)!
+3 f0 (23|0@0@9&#,)!
+3 f16015 (23|0@0@9&#,)!
+3 f0 (6|$#,)!
+3 f1 (6|$#,)!
+3 f0 (23|$#,10|$#,)!
+3 f945 (23|$#,10|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (0|$#,)!
+3 f0 (2142|0@5@2&#,)!
+3 f1 (2142|0@5@2&#,)!
+3 f0 (2150|0@0@2&#,)!
+3 f1 (2150|0@0@2&#,)!
+3 f0 ()!
+3 f19 ()!
+3 f2150 ()!
+1 t2142|2142&
+3 f0 (2150|$#,945|$#,)!
+3 f945 (2150|$#,945|$#,)!
+3 f0 (2150|$#,945|$#,945|$#,)!
+3 f1 (2150|$#,945|$#,945|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 (23|^#,23|^#,5|^#,)!
+3 f1 (23|^#,23|^#,5|^#,)!
+3 f1 (23|^#,23|^#,5|^#,)!
+3 f0 ()!
+3 f5 ()!
+2 F0/200|0&
+2 F7/200|7&
+2 F0/200|0&
+2 F9620/200|9620&
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 (213|$#,5|$#,9620|$#,)!
+3 f1 (213|$#,5|$#,9620|$#,)!
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (23|^#,23|^#,6|^#,)!
+3 f1 (23|^#,23|^#,6|^#,)!
+3 f1 (23|^#,23|^#,6|^#,)!
+3 f0 ()!
+3 f5 ()!
+2 F0/200|0&
+2 F7/200|7&
+2 F0/200|0&
+2 F9620/200|9620&
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 (213|$#,5|$#,9620|$#,)!
+3 f1 (213|$#,5|$#,9620|$#,)!
+3 f0 (951|0@5@7&#,)!
+3 f1 (951|0@5@7&#,)!
+3 f0 (6309|0@5@2&#,6260|$#,)!
+3 f1 (6309|0@5@2&#,6260|$#,)!
+3 f0 (6309|0@5@2&#,6260|$#,)!
+3 f1 (6309|0@5@2&#,6260|$#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f963 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f1763 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f958 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f3769 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f958 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f3769 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f958 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f3769 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f983 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f1763 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f1763 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f4941 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f983 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f983 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f1763 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f4941 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f4941 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f1834 (6309|0@5@7&#,)!
+3 f0 (6309|0@5@7&#,)!
+3 f969 (6309|0@5@7&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f6309 (983|0@5@2&#,)!
+3 f0 (958|0@5@6&#,)!
+3 f6309 (958|0@5@6&#,)!
+3 f0 (969|0@5@4&#,969|0@5@4&#,)!
+3 f6309 (969|0@5@4&#,969|0@5@4&#,)!
+3 f0 (969|0@5@4&#,969|0@5@4&#,1763|0@0@4&#,)!
+3 f6309 (969|0@5@4&#,969|0@5@4&#,1763|0@0@4&#,)!
+3 f0 (969|0@5@4&#,1763|0@0@4&#,)!
+3 f6309 (969|0@5@4&#,1763|0@0@4&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f6309 (969|0@5@2&#,)!
+3 f0 (1763|0@0@2&#,)!
+3 f6309 (1763|0@0@2&#,)!
+3 f0 (958|0@5@19@2@0#,3769|0@0@4&#,969|0@5@4&#,958|0@5@19@2@0#,)!
+3 f6309 (958|0@5@19@2@0#,3769|0@0@4&#,969|0@5@4&#,958|0@5@19@2@0#,)!
+3 f0 (969|0@5@4&#,969|0@5@4&#,969|0@5@4&#,)!
+3 f6309 (969|0@5@4&#,969|0@5@4&#,969|0@5@4&#,)!
+3 f0 (969|0@5@4&#,3769|0@0@4&#,)!
+3 f6309 (969|0@5@4&#,3769|0@0@4&#,)!
+3 f0 (958|0@5@18&#,3769|0@0@4&#,)!
+3 f6309 (958|0@5@18&#,3769|0@0@4&#,)!
+3 f0 (969|0@5@4&#,983|0@5@4&#,)!
+3 f6309 (969|0@5@4&#,983|0@5@4&#,)!
+3 f0 (4941|0@5@2&#,1834|0@5@4&#,)!
+3 f6309 (4941|0@5@2&#,1834|0@5@4&#,)!
+3 f0 (4941|0@5@2&#,)!
+3 f6309 (4941|0@5@2&#,)!
+3 f0 (1763|0@0@4&#,969|0@5@4&#,4941|0@5@2&#,)!
+3 f6309 (1763|0@0@4&#,969|0@5@4&#,4941|0@5@2&#,)!
+3 f0 (963|0@5@4&#,969|0@5@4&#,)!
+3 f6309 (963|0@5@4&#,969|0@5@4&#,)!
+3 f0 (969|0@5@4&#,969|0@5@4&#,969|0@5@4&#,)!
+3 f6309 (969|0@5@4&#,969|0@5@4&#,969|0@5@4&#,)!
+3 f0 (969|0@5@4&#,969|0@5@4&#,969|0@5@4&#,)!
+3 f6309 (969|0@5@4&#,969|0@5@4&#,969|0@5@4&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|@5|0@5@7&#,)!
+3 f969 (969|@5|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (958|0@5@7&#,2|$#,969|0@2@7&#,)!
+3 f1 (958|0@5@7&#,2|$#,969|0@2@7&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,)!
+3 f0 (985|$#,969|0@5@7&#,)!
+3 f2 (985|$#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f969 (969|0@5@7&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@2@7&#,3769|$#,5|$#,958|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@2@7&#,3769|$#,5|$#,958|0@5@7&#,)!
+3 f0 (969|0@2@7&#,969|0@2@7&#,)!
+3 f1 (969|0@2@7&#,969|0@2@7&#,)!
+3 f0 (985|$#,985|$#,1763|$#,969|0@2@7&#,969|0@2@7&#,981|0@5@7&#,981|0@5@7&#,)!
+3 f1 (985|$#,985|$#,1763|$#,969|0@2@7&#,969|0@2@7&#,981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (985|$#,985|$#,985|$#,985|$#,969|0@2@7&#,969|0@2@7&#,1763|$#,)!
+3 f985 (985|$#,985|$#,985|$#,985|$#,969|0@2@7&#,969|0@2@7&#,1763|$#,)!
+3 f0 (969|0@2@7&#,969|0@2@7&#,2|$#,)!
+3 f1 (969|0@2@7&#,969|0@2@7&#,2|$#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,)!
+3 f0 (969|0@2@7&#,2|$#,)!
+3 f1 (969|0@2@7&#,2|$#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@18&#,)!
+3 f13059 (969|0@5@18&#,)!
+3 f0 (969|0@5@7&#,983|0@5@18&#,)!
+3 f1 (969|0@5@7&#,983|0@5@18&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f969 (958|0@5@19@3@0#,)!
+3 f0 (969|0@2@18&#,983|0@5@18&#,4245|0@5@7&#,3769|$#,2|$#,975|0@5@7&#,2|$#,5|$#,)!
+3 f1 (969|0@2@18&#,983|0@5@18&#,4245|0@5@7&#,3769|$#,2|$#,975|0@5@7&#,2|$#,5|$#,)!
+3 f0 (958|0@5@7&#,969|0@2@7&#,969|0@5@18&#,2|$#,5|$#,5|$#,)!
+3 f1 (958|0@5@7&#,969|0@2@7&#,969|0@5@18&#,2|$#,5|$#,5|$#,)!
+3 f0 (969|0@2@18&#,4245|0@5@7&#,3769|$#,)!
+3 f1 (969|0@2@18&#,4245|0@5@7&#,3769|$#,)!
+3 f0 (969|0@5@7&#,)!
+3 f969 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f983 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f983 (969|0@5@7&#,)!
+3 f0 (969|@5|0@5@7&#,)!
+3 f969 (969|@5|0@5@7&#,)!
+3 f0 (958|0@5@7&#,969|0@5@18&#,4245|0@5@7&#,3769|$#,2|$#,969|0@5@7&#,)!
+3 f5 (958|0@5@7&#,969|0@5@18&#,4245|0@5@7&#,3769|$#,2|$#,969|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@2@7&#,)!
+3 f1 (969|0@2@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f969 (969|0@5@7&#,)!
+3 f0 (4|$#,)!
+3 f2 (4|$#,)!
+3 f0 (969|0@2@7&#,969|0@2@7&#,969|0@2@7&#,)!
+3 f1 (969|0@2@7&#,969|0@2@7&#,969|0@2@7&#,)!
+3 f0 (6260|$#,)!
+3 f2 (6260|$#,)!
+3 f0 (969|0@5@2&#,)!
+3 f1 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f1 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f1 (969|0@5@2&#,)!
+3 f0 ()!
+3 f969 ()!
+3 f0 ()!
+3 f969 ()!
+3 f0 (985|$#,)!
+3 f969 (985|$#,)!
+3 f0 ()!
+3 f969 ()!
+3 f0 (985|$#,)!
+3 f969 (985|$#,)!
+3 f0 ()!
+3 f969 ()!
+3 f0 (985|$#,981|0@5@4&#,)!
+3 f969 (985|$#,981|0@5@4&#,)!
+3 f0 (969|15@2@1&#,969|0@5@7&#,)!
+3 f1 (969|15@2@1&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,981|0@5@2&#,)!
+3 f969 (969|0@5@7&#,981|0@5@2&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f969 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f969 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f969 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@2@7&#,)!
+3 f2 (969|0@2@7&#,)!
+3 f0 (985|$#,983|0@5@6&#,981|0@5@2&#,9|$#,)!
+3 f969 (985|$#,983|0@5@6&#,981|0@5@2&#,9|$#,)!
+3 f0 (4|$#,983|0@5@7&#,981|0@5@2&#,)!
+3 f969 (4|$#,983|0@5@7&#,981|0@5@2&#,)!
+3 f0 (17|$#,985|$#,983|0@5@7&#,981|0@5@2&#,)!
+3 f969 (17|$#,985|$#,983|0@5@7&#,981|0@5@2&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f5019 (969|0@5@7&#,)!
+3 f0 (983|0@5@2&#,981|0@5@2&#,)!
+3 f969 (983|0@5@2&#,981|0@5@2&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f969 (983|0@5@7&#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f969 (958|0@5@19@3@0#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f969 (958|0@5@19@3@0#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f969 (958|0@5@19@3@0#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (958|0@5@7&#,969|0@5@18&#,985|$#,3769|$#,969|0@5@7&#,)!
+3 f5 (958|0@5@7&#,969|0@5@18&#,985|$#,3769|$#,969|0@5@7&#,)!
+3 f0 (969|0@2@18&#,958|0@5@7&#,3769|$#,969|0@5@7&#,5|$#,)!
+3 f1 (969|0@2@18&#,958|0@5@7&#,3769|$#,969|0@5@7&#,5|$#,)!
+3 f0 (969|0@2@18&#,958|0@5@7&#,3769|$#,969|0@5@7&#,5|$#,)!
+3 f1 (969|0@2@18&#,958|0@5@7&#,3769|$#,969|0@5@7&#,5|$#,)!
+3 f0 (969|0@2@18&#,958|0@5@7&#,3769|$#,5|$#,)!
+3 f1 (969|0@2@18&#,958|0@5@7&#,3769|$#,5|$#,)!
+3 f0 (969|0@2@7&#,969|0@2@7&#,975|0@5@7&#,975|0@5@7&#,1763|$#,1862|$#,)!
+3 f1 (969|0@2@7&#,969|0@2@7&#,975|0@5@7&#,975|0@5@7&#,1763|$#,1862|$#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,1763|$#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,1763|$#,)!
+3 f0 (969|0@5@7&#,3769|$#,)!
+3 f1 (969|0@5@7&#,3769|$#,)!
+3 f0 (958|0@5@7&#,969|0@5@18&#,4245|0@5@7&#,3769|$#,2|$#,969|0@5@7&#,)!
+3 f5 (958|0@5@7&#,969|0@5@18&#,4245|0@5@7&#,3769|$#,2|$#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,3769|$#,969|0@2@7&#,5|$#,)!
+3 f1 (969|0@5@7&#,3769|$#,969|0@2@7&#,5|$#,)!
+3 f0 (969|0@5@7&#,3769|$#,)!
+3 f1 (969|0@5@7&#,3769|$#,)!
+3 f0 (969|0@2@18&#,958|0@5@7&#,3769|$#,969|0@2@7&#,5|$#,)!
+3 f1 (969|0@2@18&#,958|0@5@7&#,3769|$#,969|0@2@7&#,5|$#,)!
+3 f0 (958|0@5@7&#,2|$#,969|0@2@7&#,)!
+3 f1 (958|0@5@7&#,2|$#,969|0@2@7&#,)!
+3 f0 (969|0@2@2&#,985|$#,3769|0@0@4&#,)!
+3 f969 (969|0@2@2&#,985|$#,3769|0@0@4&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f958 (969|0@5@7&#,)!
+3 f0 (1763|$#,3769|0@0@2&#,)!
+3 f969 (1763|$#,3769|0@0@2&#,)!
+3 f0 (969|0@5@2&#,3769|0@0@2&#,)!
+3 f969 (969|0@5@2&#,3769|0@0@2&#,)!
+3 f0 (969|0@5@2&#,983|0@5@2&#,)!
+3 f969 (969|0@5@2&#,983|0@5@2&#,)!
+3 f0 (1763|0@0@2&#,969|0@5@2&#,)!
+3 f969 (1763|0@0@2&#,969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,983|0@5@2&#,)!
+3 f969 (969|0@5@2&#,983|0@5@2&#,)!
+3 f0 (969|0@5@2&#,1763|0@0@2&#,)!
+3 f969 (969|0@5@2&#,1763|0@0@2&#,)!
+3 f0 (969|0@5@2&#,1763|0@0@2&#,)!
+3 f969 (969|0@5@2&#,1763|0@0@2&#,)!
+3 f0 ()!
+3 f985 ()!
+3 f0 (4941|0@5@2&#,)!
+3 f969 (4941|0@5@2&#,)!
+3 f0 (4941|0@5@2&#,)!
+3 f969 (4941|0@5@2&#,)!
+3 f0 (4941|0@5@2&#,1834|0@5@2&#,)!
+3 f969 (4941|0@5@2&#,1834|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (1763|0@0@2&#,969|0@5@2&#,4941|0@5@2&#,)!
+3 f969 (1763|0@0@2&#,969|0@5@2&#,4941|0@5@2&#,)!
+3 f0 (1763|$#,)!
+3 f2 (1763|$#,)!
+3 f0 (969|0@2@7&#,969|0@2@7&#,969|0@2@7&#,1763|$#,)!
+3 f2 (969|0@2@7&#,969|0@2@7&#,969|0@2@7&#,1763|$#,)!
+3 f0 (969|0@5@4&#,969|0@5@4&#,1763|0@0@4&#,)!
+3 f969 (969|0@5@4&#,969|0@5@4&#,1763|0@0@4&#,)!
+3 f0 (969|0@5@2&#,969|0@5@4&#,1763|0@0@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@4&#,1763|0@0@2&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,1763|0@0@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,1763|0@0@2&#,)!
+3 f0 (969|0@5@4&#,969|0@5@4&#,969|0@5@4&#,)!
+3 f969 (969|0@5@4&#,969|0@5@4&#,969|0@5@4&#,)!
+3 f0 (1763|0@0@2&#,969|0@5@2&#,4941|0@5@2&#,)!
+3 f969 (1763|0@0@2&#,969|0@5@2&#,4941|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f969 (983|0@5@2&#,)!
+3 f0 (969|@5|0@5@7&#,)!
+3 f969 (969|@5|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@2&#,2|$#,)!
+3 f969 (969|0@5@2&#,2|$#,)!
+3 f0 (1763|0@0@2&#,2|$#,)!
+3 f969 (1763|0@0@2&#,2|$#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (1763|0@0@2&#,)!
+3 f969 (1763|0@0@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|@5|0@5@7&#,)!
+3 f969 (969|@5|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (969|0@5@7&#,969|0@5@18&#,15346|4@0@7&#,)!
+3 f2 (969|0@5@7&#,969|0@5@18&#,15346|4@0@7&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (969|0@2@7&#,969|0@2@7&#,)!
+3 f1 (969|0@2@7&#,969|0@2@7&#,)!
+3 f0 (969|0@5@4&#,969|0@5@4&#,)!
+3 f969 (969|0@5@4&#,969|0@5@4&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (969|0@5@4&#,969|0@5@4&#,)!
+3 f969 (969|0@5@4&#,969|0@5@4&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f972 (969|0@5@7&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f969 (983|0@5@2&#,)!
+3 f0 (1763|0@0@2&#,5|$#,)!
+3 f969 (1763|0@0@2&#,5|$#,)!
+3 f0 (1763|0@0@2&#,5|$#,)!
+3 f969 (1763|0@0@2&#,5|$#,)!
+3 f0 (1763|0@0@2&#,)!
+3 f969 (1763|0@0@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,969|0@5@2&#,)!
+3 f969 (969|0@5@2&#,969|0@5@2&#,)!
+3 f0 (969|0@2@7&#,969|0@5@7&#,)!
+3 f2 (969|0@2@7&#,969|0@5@7&#,)!
+3 f0 (963|0@5@2&#,969|0@5@2&#,)!
+3 f969 (963|0@5@2&#,969|0@5@2&#,)!
+3 f0 (958|0@5@19@3@0#,3769|0@0@2&#,969|0@5@2&#,958|0@5@19@3@0#,)!
+3 f969 (958|0@5@19@3@0#,3769|0@0@2&#,969|0@5@2&#,958|0@5@19@3@0#,)!
+3 f0 (983|0@5@2&#,)!
+3 f969 (983|0@5@2&#,)!
+3 f0 (969|@5|0@5@7&#,)!
+3 f969 (969|@5|0@5@7&#,)!
+3 f0 (958|0@5@19@3@0#,)!
+3 f969 (958|0@5@19@3@0#,)!
+3 f0 (958|0@5@19@3@0#,3769|0@0@2&#,)!
+3 f969 (958|0@5@19@3@0#,3769|0@0@2&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f955 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f983 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f983 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f981 (969|0@5@7&#,)!
+3 f0 (3769|$#,)!
+3 f3769 (3769|$#,)!
+3 f0 (969|0@5@7&#,)!
+3 f969 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f983 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f983 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,)!
+3 f0 (985|$#,969|0@5@7&#,)!
+3 f2 (985|$#,969|0@5@7&#,)!
+3 f0 (985|$#,969|0@5@7&#,)!
+3 f2 (985|$#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f2 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (985|$#,969|0@5@7&#,)!
+3 f2 (985|$#,969|0@5@7&#,)!
+3 f0 (969|0@5@18&#,)!
+3 f13059 (969|0@5@18&#,)!
+3 f0 (969|@5|0@5@7&#,)!
+3 f969 (969|@5|0@5@7&#,)!
+3 f0 (969|@5|0@5@7&#,)!
+3 f969 (969|@5|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,981|0@5@7&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,)!
+3 f0 (969|0@5@7&#,983|0@5@18&#,)!
+3 f1 (969|0@5@7&#,983|0@5@18&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,)!
+3 f0 (969|0@5@7&#,955|0@5@18&#,)!
+3 f1 (969|0@5@7&#,955|0@5@18&#,)!
+3 f0 (969|0@2@18&#,4245|0@5@7&#,3769|$#,)!
+3 f1 (969|0@2@18&#,4245|0@5@7&#,3769|$#,)!
+3 f0 (958|0@5@7&#,969|0@2@7&#,969|0@5@18&#,2|$#,5|$#,5|$#,)!
+3 f1 (958|0@5@7&#,969|0@2@7&#,969|0@5@18&#,2|$#,5|$#,5|$#,)!
+3 f0 (969|0@2@18&#,983|0@5@18&#,4245|0@5@7&#,3769|$#,2|$#,975|0@5@7&#,2|$#,5|$#,)!
+3 f1 (969|0@2@18&#,983|0@5@18&#,4245|0@5@7&#,3769|$#,2|$#,975|0@5@7&#,2|$#,5|$#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (985|$#,985|$#,985|$#,985|$#,969|0@2@7&#,969|0@2@7&#,1763|$#,)!
+3 f985 (985|$#,985|$#,985|$#,985|$#,969|0@2@7&#,969|0@2@7&#,1763|$#,)!
+3 f0 (985|$#,985|$#,1763|$#,969|0@2@7&#,969|0@2@7&#,981|0@5@7&#,981|0@5@7&#,)!
+3 f1 (985|$#,985|$#,1763|$#,969|0@2@7&#,969|0@2@7&#,981|0@5@7&#,981|0@5@7&#,)!
+3 f0 (955|0@5@18&#,955|0@5@18&#,969|0@2@7&#,969|0@2@7&#,985|$#,955|0@5@18&#,)!
+3 f1 (955|0@5@18&#,955|0@5@18&#,969|0@2@7&#,969|0@2@7&#,985|$#,955|0@5@18&#,)!
+3 f0 (969|0@2@7&#,969|0@2@7&#,2|$#,)!
+3 f1 (969|0@2@7&#,969|0@2@7&#,2|$#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (969|0@2@7&#,2|$#,)!
+3 f1 (969|0@2@7&#,2|$#,)!
+3 f0 (969|0@2@7&#,969|0@2@7&#,)!
+3 f1 (969|0@2@7&#,969|0@2@7&#,)!
+3 f0 (969|@5|0@5@7&#,981|0@5@6&#,)!
+3 f969 (969|@5|0@5@7&#,981|0@5@6&#,)!
+3 f0 (969|0@5@7&#,969|0@2@7&#,3769|$#,5|$#,958|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@2@7&#,3769|$#,5|$#,958|0@5@7&#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f2 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f2 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f2 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f0 (969|0@2@7&#,)!
+3 f1 (969|0@2@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (955|0@5@18&#,969|0@2@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f2 (955|0@5@18&#,969|0@2@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f0 (955|0@5@18&#,969|0@2@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f2 (955|0@5@18&#,969|0@2@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (981|0@5@7&#,)!
+3 f1 (981|0@5@7&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (983|0@5@7&#,969|0@5@7&#,)!
+3 f1 (983|0@5@7&#,969|0@5@7&#,)!
+3 f0 (4327|0@5@7&#,4327|0@5@7&#,)!
+3 f1 (4327|0@5@7&#,4327|0@5@7&#,)!
+3 f0 (975|0@5@7&#,958|0@5@7&#,)!
+3 f1 (975|0@5@7&#,958|0@5@7&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f1 (969|0@5@2&#,)!
+3 f0 (969|0@5@7&#,)!
+3 f1 (969|0@5@7&#,)!
+3 f0 (958|0@5@7&#,969|0@5@2&#,)!
+3 f1 (958|0@5@7&#,969|0@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (969|0@5@2&#,)!
+3 f1 (969|0@5@2&#,)!
+3 f0 (969|0@5@2&#,)!
+3 f1 (969|0@5@2&#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f2 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f2 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f2 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f0 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f2 (955|0@5@18&#,969|0@5@7&#,955|0@5@18&#,969|0@5@7&#,)!
+3 f0 (955|0@5@18&#,3769|$#,969|0@5@7&#,969|0@5@7&#,)!
+3 f1 (955|0@5@18&#,3769|$#,969|0@5@7&#,969|0@5@7&#,)!
+3 f0 (958|0@5@7&#,)!
+3 f1 (958|0@5@7&#,)!
+3 f0 (969|0@2@7&#,)!
+3 f1 (969|0@2@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+1 t1804|1804&
+3 f0 (213|$#,16665|$#,)!
+3 f1 (213|$#,16665|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 (10175|0@5@7&#,)!
+3 f10175 (10175|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (10175|0@5@7&#,)!
+3 f1 (10175|0@5@7&#,)!
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (10175|0@5@7&#,983|0@5@2&#,)!
+3 f1 (10175|0@5@7&#,983|0@5@2&#,)!
+3 f0 (5|$#,856|$#,)!
+3 f5 (5|$#,856|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 (213|$#,16665|$#,)!
+3 f1 (213|$#,16665|$#,)!
+3 C0.4/3|!
+3 f0 (10175|0@5@7&#,)!
+3 f10175 (10175|0@5@7&#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 (23|^#,23|^#,5|^#,)!
+3 f1 (23|^#,23|^#,5|^#,)!
+3 f1 (23|^#,23|^#,5|^#,)!
+3 f0 ()!
+3 f5 ()!
+2 F0/200|0&
+2 F7/200|7&
+2 F0/200|0&
+2 F9620/200|9620&
+3 f0 (23|$#,)!
+3 f1 (23|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f5 ()!
+0 s6535|-1 16743 -1
+1 t16742|16742&
+0 s356|&
+0 s14|&
+3 Syy_buffer_state{213|@1|0@0@3&#yy_input_file,23|@1|0@0@3&#yy_ch_buf,23|@1|0@0@3&#yy_buf_pos,16745|@1|^#yy_buf_size,5|@1|^#yy_n_chars,5|@1|^#yy_is_our_buffer,5|@1|^#yy_is_interactive,5|@1|^#yy_at_bol,5|@1|^#yy_fill_buffer,5|@1|^#yy_buffer_status,}!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f16744 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f16744 ()!
+3 f0 ()!
+3 f16744 ()!
+3 f0 ()!
+3 f16744 ()!
+3 f0 ()!
+3 f19 ()!
+3 f20 ()!
+3 f0 ()!
+3 f19 ()!
+3 f20 ()!
+3 f0 ()!
+3 f1 ()!
+0 s4|&
+0 s10|&
+3 f0 ()!
+3 f16776 ()!
+3 f0 ()!
+3 f16776 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f1 ()!
+2 F0/509|0&
+2 F7/509|7&
+2 F0/256|0&
+2 F5/256|5&
+2 F0/79|0&
+2 F5/79|5&
+2 F0/516|0&
+2 F7/516|7&
+2 F0/516|0&
+2 F7/516|7&
+2 F0/739|0&
+2 F7/739|7&
+2 F0/739|0&
+2 F7/739|7&
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f4 ()!
+3 f0 ()!
+3 f17 ()!
+3 f0 ()!
+3 f969 ()!
+3 f0 ()!
+3 f9 ()!
+3 f0 ()!
+3 f9 ()!
+3 f0 ()!
+3 f9 ()!
+3 f0 (983|0@5@2&#,)!
+3 f5 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f2 (983|0@5@2&#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (23|$#,)!
+3 f983 (23|$#,)!
+3 f0 (985|$#,9|$#,)!
+3 f5 (985|$#,9|$#,)!
+3 f0 (985|$#,17|$#,)!
+3 f5 (985|$#,17|$#,)!
+3 f0 (4|$#,)!
+3 f5 (4|$#,)!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 (63|$#,)!
+3 f1 (63|$#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 f0 (63|$#,)!
+3 f1 (63|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f16776 ()!
+3 f0 (16776|^#,)!
+3 f16776 (16776|^#,)!
+3 f16776 (16776|^#,)!
+3 f0 (5|^#,23|^#,)!
+3 f1 (5|^#,23|^#,)!
+3 f1 (5|^#,23|^#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (213|^#,)!
+3 f1 (213|^#,)!
+3 f1 (213|^#,)!
+3 f0 (16744|^#,)!
+3 f1 (16744|^#,)!
+3 f1 (16744|^#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (213|^#,5|^#,)!
+3 f16744 (213|^#,5|^#,)!
+3 f16744 (213|^#,5|^#,)!
+3 f0 (16744|^#,)!
+3 f1 (16744|^#,)!
+3 f1 (16744|^#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (16744|^#,213|^#,)!
+3 f1 (16744|^#,213|^#,)!
+3 f1 (16744|^#,213|^#,)!
+3 f0 (16744|^#,)!
+3 f1 (16744|^#,)!
+3 f1 (16744|^#,)!
+3 f0 (23|^#,16745|^#,)!
+3 f16744 (23|^#,16745|^#,)!
+3 f16744 (23|^#,16745|^#,)!
+3 f0 (23|^#,)!
+3 f16744 (23|^#,)!
+3 f16744 (23|^#,)!
+3 f0 (23|^#,5|^#,)!
+3 f16744 (23|^#,5|^#,)!
+3 f16744 (23|^#,5|^#,)!
+3 f0 (42|^#,)!
+3 f1 (42|^#,)!
+3 f1 (42|^#,)!
+3 f0 (16745|^#,)!
+3 f19 (5|$#,)!
+3 f20 (5|$#,)!
+3 f20 (16745|^#,)!
+3 f0 (20|^#,16745|^#,)!
+3 f19 (5|$#,5|$#,)!
+3 f20 (5|$#,5|$#,)!
+3 f20 (20|^#,16745|^#,)!
+3 f0 (20|^#,)!
+3 f1 (20|^#,)!
+3 f1 (20|^#,)!
+3 Sskeyword{23|@1|0@5@18@3@0#name,5|@1|^#token,}!
+0 s6376|-1 -1 16918
+2 y16917|16917&
+3 f0 (983|0@5@7&#,)!
+3 f2 (983|0@5@7&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (983|0@5@7&#,)!
+3 f5 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f5 (983|0@5@7&#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (4|$#,)!
+3 f1 (4|$#,)!
+3 f0 (985|$#,17|$#,)!
+3 f5 (985|$#,17|$#,)!
+3 f0 (985|$#,9|$#,)!
+3 f5 (985|$#,9|$#,)!
+3 f0 (4|$#,)!
+3 f5 (4|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 ()!
+3 f4 ()!
+3 f0 ()!
+3 f4 ()!
+3 f0 ()!
+3 f4 ()!
+3 f0 ()!
+3 f1 ()!
+3 f0 ()!
+3 f2 ()!
+3 f0 (23|$#,)!
+3 f2 (23|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (23|$#,)!
+3 f983 (23|$#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 (983|0@5@7&#,)!
+3 f958 (983|0@5@7&#,)!
+3 f0 ()!
+3 f983 ()!
+3 f0 (983|0@5@2&#,)!
+3 f5 (983|0@5@2&#,)!
+3 f0 (983|0@5@2&#,)!
+3 f2 (983|0@5@2&#,)!
+3 f0 ()!
+3 f969 ()!
+3 f0 ()!
+3 f4 ()!
+3 f0 ()!
+3 f17 ()!
+3 f0 ()!
+3 f9 ()!
+3 f0 ()!
+3 f9 ()!
+3 f0 ()!
+3 f9 ()!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 f0 (0|$#,0|$#,)!
+1 t1312|1312&
+;;tistable
+0
+0,40
+40
+0,40,41
+41
+0,40,41,42
+42
+0,40,41,42,43
+43
+44
+44,45
+45
+44,45,1
+1
+56
+56,59
+59
+61
+61,64
+64
+61,64,5
+5
+61,64,5,66
+66
+61,64,5,66,68
+68
+61,64,5,66,68,69
+69
+61,64,5,66,68,69,72
+72
+61,64,5,66,68,69,72,73
+73
+61,64,5,66,68,69,72,73,77
+77
+61,64,5,66,68,69,72,73,77,78
+78
+61,64,5,66,68,69,72,73,77,78,47
+47
+61,64,5,66,68,69,72,73,77,78,47,6
+6
+3
+7
+94
+95
+98
+11
+109
+15
+111
+116
+117
+119
+120
+121
+125
+130
+57
+133
+137
+140
+144
+148
+151
+161
+166
+171
+176
+54
+188
+194
+200
+203
+208
+216
+52
+217
+218
+233
+8
+238
+240
+241
+248
+250
+252
+74
+253
+6,8
+261
+266
+266,268
+268
+300
+301
+305
+312
+315
+316
+64,248
+64,248,47
+248,47
+64,248,9
+248,47,9
+9
+47,9
+64,248,47,9
+308
+308,47
+91
+268,266
+8,47
+332
+332,6
+332,6,329
+6,329
+329
+332,6,8
+6,329,8
+329,8
+6,47
+93
+6,7
+6,7,253
+6,7,253,254
+254
+7,253,254
+253,254
+78,7
+312,7
+312,7,47
+234
+303
+89
+343
+68,248
+68,248,9
+248,9
+68,248,9,64
+248,9,64
+68,248,9,47
+248,9,64,47
+64,47
+68,248,9,61
+248,9,64,47,61
+64,47,61
+68,248,9,64,47,61
+263
+92
+61,47
+344
+345
+78,47
+78,47,74
+241,240
+349
+254,6,7,253
+5,250
+232
+359
+299
+69,47
+69,233
+47,233
+69,61
+47,233,61
+69,47,233,61
+107
+142
+167
+329,8,47
+332,6,329,8
+254,7,253
+254,253
+;;symTable
+*0 (Datatype)
+0@+@=@0@7@0@0@67#mbstate_t
+0@+@=@0@7@0@0@710#sigset_t
+2@-@-@0@0@0@0@2#lltX_bool
+2@-@-@0@0@0@0@2#bool
+3@-@-@0@0@0@0@16775#YY_CHAR
+5@+@-@0@0@0@0@959#typeIdSet
+5@+@-@0@0@0@0@985#ctype
+5@+@-@0@0@0@0@1312#fileId
+5@+@-@0@0@0@0@3801#cprim
+5@-@-@0@0@0@0@4203#usymId
+5@-@-@0@0@0@0@16776#yy_state_type
+6@-@-@0@0@0@0@944#sort
+6@-@-@0@0@0@0@952#ltokenCode
+6@-@-@0@0@0@0@1003#bits
+6@-@-@0@0@0@0@16745#yy_size_t
+10@-@-@0@0@0@0@945#lsymbol
+10@-@-@0@0@0@0@1004#Handle
+10@-@-@0@0@0@0@3646#symbolKey
+13@-@-@0@0@0@0@59#__SIZE_TYPE__
+13@-@-@0@0@0@0@60#__PTRDIFF_TYPE__
+13@-@-@0@0@0@0@61#__WCHAR_TYPE__
+13@-@-@0@0@0@0@62#ptrdiff_t
+13@-@-@0@0@0@0@65#wchar_t
+13@-@-@0@0@0@0@66#wint_t
+13@-@-@0@0@0@0@178#sig_atomic_t
+13@-@-@0@0@0@0@504#wctype_t
+13@-@-@0@0@0@0@505#wctrans_t
+13@-@-@0@0@0@0@630#clock_t
+13@-@-@0@0@0@0@631#time_t
+13@-@-@0@0@0@0@656#dev_t
+13@-@-@0@0@0@0@657#gid_t
+13@-@-@0@0@0@0@658#ino_t
+13@-@-@0@0@0@0@659#mode_t
+13@-@-@0@0@0@0@660#nlink_t
+13@-@-@0@0@0@0@661#off_t
+13@-@-@0@0@0@0@662#pid_t
+13@-@-@0@0@0@0@663#uid_t
+13@-@-@0@0@0@0@934#__PTRDIFF_TYPE__ 
+14@-@-@0@0@0@0@63#size_t
+15@-@-@0@0@0@0@64#ssize_t
+20@+@+@0@0@0@0@173#jmp_buf
+20@+@+@0@0@0@0@206#va_list
+20@+@+@0@0@0@0@211#FILE
+20@+@+@0@0@0@0@212#fpos_t
+20@+@+@0@0@0@0@664#DIR
+20@+@+@0@0@0@0@705#sigjmp_buf
+23@-@+@0@0@0@0@1060#mstring
+23@+@=@0@5@0@0@983#cstring
+23@-@+@0@0@18@0@1286#d_char
+23@-@+@0@5@18@0@10487#nd_charp
+23@-@+@0@0@19@3@1061#ob_mstring
+23@-@+@0@5@19@3@1062#bn_mstring
+936@-@+@0@0@0@0@937#termNode
+937@-@+@0@0@2@0@3297#o_termNode
+939@-@+@0@5@0@0@940#lclTypeSpecNode
+940@-@+@0@5@0@0@3020#lcltsp
+942@+@=@0@0@0@0@943#termNodeList
+947@-@+@0@0@0@0@948#typeExpr
+948@-@+@0@0@0@0@2656#abstDeclaratorNode
+950@+@=@0@5@0@0@951#ltoken
+951@-@+@0@5@2@0@2348#o_ltoken
+954@+@=@0@5@18@0@955#sRef
+955@-@+@0@5@17@0@10691#ow_sRef
+955@-@+@0@5@18@2@4383#e_sRef
+957@+@=@0@5@0@0@958#uentry
+958@-@+@0@5@2@0@960#o_uentry
+962@+@=@0@5@0@0@963#idDecl
+963@-@+@0@5@2@0@6533#o_idDecl
+965@+@=@0@5@0@0@966#usymtab
+968@+@=@0@5@0@0@969#exprNode
+969@-@+@0@5@2@0@3764#o_exprNode
+969@-@+@0@5@18@0@13054#d_exprNode
+971@+@=@0@5@0@0@972#guardSet
+974@+@=@0@5@0@0@975#sRefSet
+975@+@=@0@5@0@0@4327#globSet
+975@-@+@0@5@2@0@4382#o_sRefSet
+975@-@+@0@5@18@0@6674#d_sRefSet
+977@+@=@0@5@0@0@978#aliasTable
+980@+@=@0@5@0@0@981#fileloc
+981@-@+@0@5@2@0@1325#o_fileloc
+983@-@+@0@5@0@0@3882#enumName
+983@-@+@0@5@2@0@984#o_cstring
+983@-@+@0@5@19@3@1799#ob_cstring
+989@-@+@0@0@0@0@990#sRefTest
+994@-@+@0@0@0@0@995#sRefMod
+999@-@+@0@0@0@0@1000#sRefShower
+1003@-@-@0@0@0@0@2265#lclctype
+1004@-@-@0@0@0@0@16015#CharIndex
+1145@-@-@0@0@0@0@1146#cmpcode
+1288@-@-@0@0@0@0@1289#ynm
+1322@-@-@0@0@0@0@1323#flkind
+1489@-@-@0@0@0@0@1490#qual
+1762@-@+@0@0@0@0@1763#lltok
+1777@-@-@0@0@0@0@1778#clause
+1803@+@=@0@5@0@0@1804#cstringSList
+1833@+@=@0@5@0@0@1834#cstringList
+1861@-@-@0@0@0@0@1862#flagcode
+1865@-@-@0@0@0@0@1866#flagkind
+2107@+@=@0@5@0@0@2108#qualList
+2138@-@+@0@0@0@0@2141#mappair
+2142@-@+@0@3@2@0@2143#o_mappair
+2159@-@-@0@0@0@0@2160#sortKind
+2161@-@+@0@0@0@0@2164#smemberInfo
+2167@-@+@0@0@0@0@2168#sortNode
+2260@-@-@0@0@0@0@2261#TypeSpecification
+2263@-@-@0@0@0@0@2264#TypeSpec
+2273@-@-@0@0@0@0@2274#paramkind
+2277@-@+@0@0@0@0@2278#paramNode
+2278@-@+@0@5@2@0@2291#o_paramNode
+2295@+@=@0@5@0@0@2296#paramNodeList
+2345@-@-@0@0@0@0@2346#SimpleIdCode
+2430@+@=@0@5@0@0@2431#ltokenList
+2484@-@-@0@0@0@0@2485#tagKind
+2487@-@-@0@0@0@0@2488#impkind
+2490@-@+@0@0@0@0@2491#importNode
+2491@-@+@0@0@2@0@2500#o_importNode
+2504@+@=@0@0@0@0@2505#importNodeList
+2519@+@=@0@0@0@0@2520#sortList
+2535@-@+@0@0@0@0@14450#lsymbolTable
+2538@+@=@0@0@0@0@2539#lsymbolList
+2549@+@=@0@5@0@0@2550#lsymbolSet
+2566@+@=@0@5@0@0@2567#sortSet
+2567@-@+@0@5@18@0@3343#o_sortSet
+2592@-@+@0@0@0@0@2593#pairNode
+2593@-@+@0@0@2@0@2596#o_pairNode
+2600@+@=@0@5@0@0@2601#pairNodeList
+2613@-@+@0@0@0@0@2660#declaratorNode
+2614@-@+@0@0@0@0@2953#abstBodyNode
+2617@-@+@0@0@0@0@2618#declaratorInvNode
+2618@-@+@0@0@2@0@2623#o_declaratorInvNode
+2627@+@=@0@0@0@0@2628#declaratorInvNodeList
+2641@-@-@0@0@0@0@2642#typeExprKind
+2660@-@+@0@0@2@0@2665#o_declaratorNode
+2669@+@=@0@0@0@0@2670#declaratorNodeList
+2684@-@+@0@0@0@0@2685#arrayQualNode
+2688@-@+@0@0@0@0@2689#varNode
+2689@-@+@0@0@2@0@2694#o_varNode
+2698@+@=@0@0@0@0@2699#varNodeList
+2713@-@+@0@0@0@0@2714#quantifierNode
+2714@-@+@0@0@2@0@2719#o_quantifierNode
+2723@+@=@0@0@0@0@2724#quantifierNodeList
+2737@-@-@0@0@0@0@2738#storeRefNodeKind
+2743@-@+@0@0@0@0@2744#storeRefNode
+2744@-@+@0@0@2@0@2757#o_storeRefNode
+2761@+@=@0@0@0@0@2762#storeRefNodeList
+2776@-@+@0@0@0@0@2777#modifyNode
+2782@-@+@0@0@0@0@2783#letDeclNode
+2783@-@+@0@0@2@0@2786#o_letDeclNode
+2790@+@=@0@0@0@0@2791#letDeclNodeList
+2802@-@-@0@0@0@0@2803#actionKind
+2804@-@+@0@0@0@0@3340#stmtNode
+2806@+@=@0@0@0@0@2820#programNodeList
+2811@-@+@0@0@0@0@2812#programNode
+2812@-@+@0@0@2@0@2817#o_programNode
+2831@-@-@0@0@0@0@2832#lclPredicateKind
+2834@-@+@0@0@0@0@2835#lclPredicateNode
+2838@-@+@0@0@0@0@2839#exposedNode
+2843@-@-@0@0@0@0@2844#typeKind
+2847@-@+@0@0@0@0@2848#CTypesNode
+2851@-@+@0@0@0@0@2852#initDeclNode
+2852@-@+@0@0@2@0@2857#o_initDeclNode
+2861@+@=@0@0@0@0@2862#initDeclNodeList
+2874@-@+@0@0@0@0@2875#constDeclarationNode
+2879@-@-@0@0@0@0@2880#qualifierKind
+2883@-@+@0@0@0@0@2884#varDeclarationNode
+2884@-@+@0@0@2@0@2889#o_varDeclarationNode
+2893@+@=@0@0@0@0@2894#varDeclarationNodeList
+2894@-@+@0@0@0@0@2904#globalList
+2911@-@+@0@0@0@0@2912#claimNode
+2917@-@+@0@0@0@0@2918#fcnNode
+2918@-@+@0@0@2@0@2923#o_fcnNode
+2927@+@=@0@5@0@0@2928#fcnNodeList
+2948@-@+@0@0@0@0@2949#iterNode
+2958@-@+@0@0@0@0@2959#abstractNode
+2964@-@+@0@0@0@0@2965#stDeclNode
+2965@-@+@0@0@2@0@2970#o_stDeclNode
+2974@+@=@0@0@0@0@2975#stDeclNodeList
+2991@-@+@0@0@0@0@2992#taggedUnionNode
+2999@-@+@0@0@0@0@3000#typeNode
+3004@-@-@0@0@0@0@3005#suKind
+3007@-@+@0@0@0@0@3008#strOrUnionNode
+3013@-@+@0@0@0@0@3014#enumSpecNode
+3018@-@-@0@0@0@0@3019#lclTypeSpecKind
+3023@-@+@0@0@0@0@3024#lclconj
+3038@-@+@0@0@0@0@3039#typeNamePack
+3040@-@+@0@0@0@0@3075#opFormNode
+3043@-@+@0@0@0@0@3044#typeNameNode
+3044@-@+@0@0@2@0@3049#o_typeNameNode
+3053@+@=@0@0@0@0@3054#typeNameNodeList
+3069@-@-@0@0@0@0@3070#opFormKind
+3079@-@+@0@0@0@0@3080#quantifiedTermNode
+3082@-@-@0@0@0@0@3083#termKIND
+3085@-@+@0@0@0@0@3086#sigNode
+3086@-@+@0@0@17@0@3095#o_sigNode
+3099@+@=@0@5@0@0@3100#sigNodeSet
+3126@-@+@0@0@0@0@3127#signNode
+3135@-@+@0@0@0@0@3136#nameNode
+3147@-@+@0@0@0@0@3148#lslOp
+3148@-@+@0@0@2@0@3149#o_lslOp
+3148@-@+@0@0@19@2@3368#e_lslOp
+3157@+@=@0@5@0@0@3158#lslOpSet
+3180@-@+@0@0@0@0@3181#replaceNode
+3181@-@+@0@0@2@0@3186#o_replaceNode
+3190@+@=@0@0@0@0@3191#replaceNodeList
+3207@-@+@0@0@0@0@3208#nameAndReplaceNode
+3213@-@+@0@0@0@0@3214#renamingNode
+3219@-@+@0@0@0@0@3220#traitRefNode
+3220@-@+@0@0@2@0@3223#o_traitRefNode
+3227@+@=@0@0@0@0@3228#traitRefNodeList
+3239@-@-@0@0@0@0@3240#exportKind
+3245@-@+@0@0@0@0@3246#exportNode
+3250@-@-@0@0@0@0@3251#privateKind
+3256@-@+@0@0@0@0@3257#privateNode
+3261@-@-@0@0@0@0@3262#interfaceNodeKind
+3267@-@+@0@0@0@0@3268#interfaceNode
+3268@-@+@0@0@2@0@3273#o_interfaceNode
+3277@+@=@0@0@0@0@3278#interfaceNodeList
+3347@+@=@0@0@0@0@3348#sortSetList
+3372@+@=@0@0@0@0@3373#lslOpList
+3649@-@+@0@0@0@0@3650#fctInfo
+3650@-@+@0@0@2@0@15685#o_fctInfo
+3653@-@+@0@0@0@0@3654#typeInfo
+3656@-@-@0@0@0@0@3657#varKind
+3660@-@+@0@0@0@0@3661#varInfo
+3664@-@+@0@0@0@0@3665#opInfo
+3670@-@+@0@0@0@0@3671#tagInfo
+3673@-@-@0@0@0@0@3674#infoKind
+3681@-@-@0@0@0@0@3682#scopeKind
+3685@-@+@0@0@0@0@3686#scopeInfo
+3688@-@+@0@0@0@0@3691#htEntry
+3691@-@+@0@0@0@0@3692#bucket
+3693@-@+@0@3@2@0@3694#o_bucket
+3700@-@+@0@0@0@0@3701#symtable
+3768@+@=@0@0@0@0@3769#exprNodeList
+3823@-@+@0@0@0@0@3824#hashTable
+3826@-@+@0@0@0@0@3827#hentry
+3831@-@+@0@5@0@0@3832#hbucket
+3832@-@+@0@5@2@0@3833#o_hbucket
+3853@+@=@0@5@0@0@3854#filelocList
+3882@-@+@0@5@2@0@3885#o_enumName
+3889@+@=@0@0@0@0@3890#enumNameList
+3890@+@=@0@0@0@0@3920#enumNameSList
+3936@-@-@0@0@0@0@3937#sstate
+3939@-@-@0@0@0@0@3940#storageClassCode
+3942@-@-@0@0@0@0@3943#nstate
+3947@-@-@0@0@0@0@3948#alkind
+3950@-@-@0@0@0@0@3951#exkind
+4043@-@-@0@0@0@0@4044#exitkind
+4179@+@-@0@0@0@0@4180#ekind
+4203@-@-@0@0@0@0@4204#typeId
+4210@+@=@0@5@0@0@4211#usymIdSet
+4211@-@+@0@5@2@0@13279#o_usymIdSet
+4244@+@=@0@5@0@0@4245#uentryList
+4366@+@=@0@5@0@0@4367#ctypeList
+4367@+@=@0@5@0@0@10175#fileIdList
+4423@-@-@0@0@0@0@4424#uskind
+4427@-@+@0@0@0@0@4428#refentry
+4428@-@+@0@0@2@0@4429#o_refentry
+4430@-@+@0@0@0@0@4431#refTable
+4671@-@-@0@0@0@0@4672#ctuid
+4674@-@-@0@0@0@0@4675#ctkind
+4940@+@=@0@5@0@0@4941#qtype
+5012@-@-@0@0@0@0@5013#mvkind
+5018@-@+@0@5@0@0@5019#multiVal
+5069@-@-@0@0@0@0@5070#specialClauseKind
+5072@-@-@0@0@0@0@5073#stateConstraint
+5076@+@=@0@0@0@0@5077#specialClause
+5077@-@+@0@0@2@0@5078#o_specialClause
+5096@+@=@0@5@0@0@5097#specialClauses
+5153@-@+@0@0@0@0@5154#ucinfo
+5156@-@-@0@0@0@0@5157#vkind
+5159@-@-@0@0@0@0@5160#chkind
+5163@-@+@0@0@0@0@5164#uvinfo
+5167@-@+@0@0@0@0@5168#udinfo
+5170@-@-@0@0@0@0@5171#specCode
+5174@-@+@0@0@0@0@5175#ufinfo
+5178@-@+@0@0@0@0@5179#uiinfo
+5182@-@+@0@0@0@0@5183#ueinfo
+5186@-@+@0@0@0@0@5187#uinfo
+5627@-@-@0@0@0@0@5628#speckind
+5630@-@-@0@0@0@0@5631#skind
+5634@-@+@0@0@0@0@5635#cref
+5638@-@+@0@0@0@0@5639#ainfo
+5642@-@+@0@0@0@0@5643#fldinfo
+5646@-@+@0@0@0@0@5647#cjinfo
+5650@-@+@0@0@0@0@5651#sinfo
+5654@-@+@0@5@0@0@5655#alinfo
+6259@-@-@0@0@0@0@6260#exprKind
+6263@-@+@0@0@0@0@6264#exprOffsetof
+6267@-@+@0@0@0@0@6268#exprPair
+6271@-@+@0@0@0@0@6272#exprTriple
+6275@-@+@0@0@0@0@6276#exprIter
+6279@-@+@0@0@0@0@6280#exprCall
+6283@-@+@0@0@0@0@6284#exprIterCall
+6287@-@+@0@0@0@0@6288#exprOp
+6291@-@+@0@0@0@0@6292#exprField
+6295@-@+@0@0@0@0@6296#exprUop
+6299@-@+@0@0@0@0@6300#exprCast
+6303@-@+@0@0@0@0@6304#exprInit
+6308@-@+@0@5@0@0@6309#exprData
+6537@+@=@0@0@0@0@6538#idDeclList
+6678@+@=@0@5@0@0@6679#sRefSetList
+6692@-@-@0@0@0@0@6693#flagMarkerKind
+6698@-@+@0@0@0@0@6699#flagMarker
+6699@-@+@0@0@2@0@6736#o_flagMarker
+6740@+@=@0@0@0@0@6741#flagMarkerList
+6758@-@+@0@0@0@0@6759#mce
+6759@-@+@0@0@2@0@6760#o_mce
+6764@-@+@0@0@0@0@6765#macrocache
+6783@-@-@0@0@0@0@6784#fileType
+6787@-@+@0@0@0@0@6788#ftentry
+6788@-@+@0@0@2@0@6789#o_ftentry
+6793@+@=@0@5@0@0@6794#fileTable
+6861@-@+@0@0@0@0@6862#msgentry
+6862@-@+@0@0@2@0@6863#o_msgentry
+6867@+@=@0@5@0@0@6868#messageLog
+6882@+@=@0@0@0@0@6883#clauseStack
+7332@-@+@0@0@0@0@7333#cppBuffer
+7334@-@+@0@0@0@0@7335#cppOptions
+7336@-@+@0@0@0@0@7337#cppHashNode
+7336@-@+@0@0@0@0@7356#HASHNODE
+7340@-@+@0@0@0@0@7341#cppReader
+7361@-@+@0@0@0@0@7362#parseUnderflow
+7367@-@+@0@0@0@0@7368#parseCleanup
+7385@-@+@0@0@2@0@8031#o_HASHNODE
+7386@-@+@0@0@0@0@7445#cppIfStackFrame
+7432@-@+@0@0@0@0@7433#MACRODEF
+7434@-@+@0@0@0@0@7437#DEFINITION
+7575@-@-@0@0@0@0@7576#filestatus
+8935@-@+@0@5@0@0@8936#ctbase
+8939@-@+@0@0@0@0@8940#ctentry
+8940@-@+@0@0@2@0@8941#o_ctentry
+8944@-@+@0@0@0@0@8945#cttable
+9046@-@+@0@0@0@0@9047#cfcn
+9050@-@+@0@0@0@0@9051#tsu
+9054@-@+@0@0@0@0@9055#tconj
+9058@-@+@0@0@0@0@9059#tenum
+9062@-@+@0@0@0@0@9063#tfixed
+9065@-@+@0@0@0@0@9066#uconts
+9619@-@+@0@0@0@0@9620#YYSTYPE
+9876@-@-@0@0@0@0@9877#transferKind
+9911@-@-@0@0@0@0@9912#dscCode
+10296@-@-@0@0@0@0@10297#ccode
+10695@+@=@0@5@0@0@10696#sRefTable
+12041@+@=@0@5@0@0@12042#filelocStack
+12065@+@=@0@0@0@0@12066#intSet
+12088@-@-@0@0@0@0@12089#kcontext
+12621@-@-@0@0@0@0@12622#argcode
+12626@-@-@0@0@0@0@12627#flaglist
+13058@+@=@0@0@0@0@13059#exprNodeSList
+13974@-@-@0@0@0@0@13975#charCode
+14062@-@-@0@0@0@0@14063#LSLInitRuleCode
+14063@-@-@0@0@0@0@15745#LCLInitRuleCode
+15204@-@-@0@0@0@0@15205#StartCharType
+15559@-@-@0@0@0@0@15560#symKind
+15568@-@+@0@0@0@0@15569#idTable
+16743@-@+@0@0@0@0@16744#YY_BUFFER_STATE
+16016@-@-@0@0@0@0@16018#StringEntry
+13976@-@-@0@0@0@0@13978#charClassData
+2145@-@-@0@0@0@0@2147#mapping
+14124@-@-@0@0@0@0@14126#outFile
+12084@-@-@0@0@0@0@12086#maccesst
+3677@-@-@0@0@0@0@3679#htData
+15563@-@-@0@0@0@0@15565#idTableEntry
+14190@-@-@0@0@0@0@14192#Lclctype2sortType
+367@-@-@0@0@0@0@369#div_t
+374@-@-@0@0@0@0@376#ldiv_t
+3696@-@-@0@0@0@0@3698#symHashTable
+12616@-@-@0@0@0@0@12618#flagcatinfo
+2073@-@-@0@0@0@0@2075#tsource
+12623@-@-@0@0@0@0@12625#fflag
+3071@-@-@0@0@0@0@3073#opFormUnion
+796@-@-@0@0@0@0@797#cc_t
+799@-@-@0@0@0@0@800#speed_t
+799@-@-@0@0@0@0@801#tcflag_t
+*1 (Constant)
+0$#ABSTRACT_H#BASIC_H#BOOL_H#CENTRY_H#CLABSTRACT_H#CONSTANTS_H#CONTEXT_H#CPPERROR_H#CPPHASH_H#CPP_H#CPRIM_H#CSTRING_H#CTYPE_H#CVAR_H#DECLARATORINVNODELIST_H#DECLARATORNODELIST_H#EKIND_H#EXPRNODE_H#FATAL_EXIT_CODE#FCNNODELIST_H#FILEIDLIST_H#FILELOCSTACK_H#FILELOC_H#FILETABLE_H#FLAGCODES_H#FLAGMARKER_H#FLAGS_H#FORWARDTYPES_H#GENERAL_H#GLOBALS_H#GUARDSET_H#HTABLE_H#IMPORTNODELIST_H#INITDECLNODELIST_H#LCLCTYPESX_H#LCLINTMACROS_H#LCLLIB_H#LCLMISC_H#LCLSCAN_H#LCL_CONSTANTS_H#LCL_FORWARDTYPES_H#LETDECLNODELIST_H#LLBASIC_H#LLERROR_H#LLGLOBALS_H#LLGRAMMAR_H#LLMAIN_H#LLTOK_H#LSYMBOLLIST_H#LSYMBOLSET_H#LSYMBOL_H#LTOKENLIST_H#LTOKEN_H#MACROCACHE_H#MAPPING_H#MESSAGE_H#MISC_H#MULTIVAL_H#NAMECHECKS_H#NO_SHORTNAMES#OSD_H#PAIRNODELIST_H#PARAMNODEH#PORTAB_H#PROGRAMNODELIST_H#QTYPEH#QUALH#QUALLIST_H#QUANTIFIERNODELIST_H#SIGNATURE2_H#SIGNATURE_H#SIGNODESET_H#SORTLIST_H#SORTSET_H#SPECIALCLAUSES_H#STOREREFNODELIST_H#STOREREF_H#STRUCTDECLNODELIST_H#STRUCTNAMES#SYMTABLE_H#SYSTEM_CONSTANTS_H#TSOURCE_H#TYPENAMENODELIST_H#TYPENODE_H#UENTRY_H#USYMIDSET_H#USYMID_H#USYMTAB_H#USYMTAB_INTERFACE_H#VARDECLARATIONNODELIST_H#VARDECLNODE_H#VARKINDSH#VARNODELIST_H#VARNODE_H#VERSION_H#YNM_H#aliasTable_H#clauseStack_H#cstringList_H#cstringSList_H#ctypeLIST_H#enumNameLIST_H#enumNameSLIST_H#exprNodeList_H#exprNodeSList_H#fileId_H#filelocLIST_H#flagMarkerList_H#globSet_H#idDeclLIST_H#idDecl_H#intSET_H#interfaceNodeLIST_H#lslOpLIST_H#lslOpSET_H#messageLog_H#paramNodeLIST_H#replaceNodeLIST_H#sRefSET_H#sRefSetLIST_H#sRefTABLE_H#sortSetLIST_H#sort_H#termNodeLIST_H#traitRefNodeLIST_H#typeIdSET_H#uentryLIST_H
+0@i0@0@6#NULL
+2$#NDEBUG
+2@i1@0@0#TRUE
+2@i0@0@6#FALSE
+3$#UCHAR_MAX#UCHAR_MIN
+4$#CHAREXTENDER#CHAR_MAX#CHAR_MIN#CONNECTCHAR#DEFAULT_COMMENTCHAR#MARKCHAR_ENUM#MARKCHAR_PARAM#MARKCHAR_STRUCT#MARKCHAR_UNION#PATH_SEPARATOR#PFX_ANY#PFX_ANYLETTER#PFX_ANYLETTERDIGIT#PFX_DIGIT#PFX_LOWERCASE#PFX_NOTLOWER#PFX_NOTUPPER#PFX_UPPERCASE#SCHAR_MAX#SCHAR_MIN#SEPCHAR#TARGET_BELL#TARGET_BS#TARGET_CR#TARGET_FF#TARGET_NEWLINE#TARGET_TAB#TARGET_VT
+5$#ALIASSEARCHLIMIT#ANDAND#ANDAND_PRIO#AND_PRIO#ATINVALID#B0#B110#B1200#B134#B150#B1800#B19200#B200#B2400#B300#B38400#B4800#B50#B600#B75#B9600#BIGBASESIZE#BITS_PER_UNIT#BRKINT#BUFLEN#BUFSIZ#CALL_SUCCESS#CBASESIZE#CGLOBBASESIZE#CGLOBHASHSIZE#CHARSIZE#CHAR_BIT#CLK_TCK#CLOCAL#CLOCKS_PER_SEC#COMMA_PRIO#COND_PRIO#CPP_EQUALTOK#CPP_EQUAL_PRIO#CPP_HASHSIZE#CPP_STACK_MAX#CREAD#CS5#CS6#CS7#CS8#CSIZE#CSTOPB#CTK_BASESIZE#CTK_ELIPS#CTK_MISSINGPARAMS#CTK_PREDEFINED#CTK_PREDEFINED2#CTP_CHAR#CTP_VOID#CTX_ANYINTEGRAL#CTX_BOOL#CTX_CHAR#CTX_DOUBLE#CTX_FLOAT#CTX_INT#CTX_LAST#CTX_LDOUBLE#CTX_LINT#CTX_LLINT#CTX_SIGNEDINTEGRAL#CTX_SINT#CTX_UCHAR#CTX_UINT#CTX_ULINT#CTX_ULLINT#CTX_UNKNOWN#CTX_UNSIGNEDINTEGRAL#CTX_USINT#CTX_VOID#CT_FIRST#DEFAULTMAXMODS#DEFAULT_CONTROLNESTDEPTH#DEFAULT_EXTERNALNAMELEN#DEFAULT_INCLUDENEST#DEFAULT_INTERNALNAMELEN#DEFAULT_LIMIT#DEFAULT_LINELEN#DEFAULT_NUMENUMMEMBERS#DEFAULT_NUMSTRUCTFIELDS#DEFAULT_OPTLEVEL#DEFAULT_STRINGLITERALLEN#DELTACHARSTRING#DELTASTRINGENTRY#DNE#E2BIG#EACCES#EAGAIN#EBADF#EBUSY#ECHILD#ECHO#ECHOE#ECHOK#ECHONL#EDEADLK#EDOM#EEXIST#EFAULT#EFBIG#EILSEQ#EINTR#EINVAL#EIO#EISDIR#EMFILE#EMLINK#ENAMETOOLONG#ENFILE#ENODEV#ENOENT#ENOEXEC#ENOLCK#ENOMEM#ENOSPC#ENOSYS#ENOTDIR#ENOTEMPTY#ENOTTY#ENXIO#EOF#EPERM#EPIPE#ERANGE#EROFS#ESPIPE#ESRCH#EXDEV#EXIT_FAILURE#EXIT_SUCCESS#FD_CLOEXEC#FILENAME_MAX#FLT_RADIX#FNAME_HASHSIZE#FOPEN_MAX#FTBASESIZE#FTHASHSIZE#F_DUPFD#F_GETFD#F_GETFL#F_GETLK#F_OK#F_RDLCK#F_SETFD#F_SETFL#F_SETLK#F_SETLKW#F_UNLCK#F_WRLCK#GEQ#GIVEUPPARSE#HASHMASK#HASHSIZE#HAVE_VALUE#HBUCKET_BASESIZE#HBUCKET_DNE#HT_MAXINDEX#HUGEBASESIZE#HUPCL#ICANON#ICRNL#IEXTEN#IGNBRK#IGNCR#IGNLCR#IGNPAR#IMPORT_FOUND#IMPORT_NOT_FOUND#INCLUDE_LEN_FUDGE#INITCHARSTRING#INITSTRINGENTRY#INIT_STACK_SIZE#INPCK#INT_MAX#INT_MIN#ISIG#ISTRIP#IXOFF#IXON#LARGEBASESIZE#LASTCHAR#LAST_PREDEFINED#LC_ALL#LC_COLLATE#LC_CTYPE#LC_MONETARY#LC_NUMERIC#LC_TIME#LEFT_OPERAND_REQUIRED#LEQ#LESS_PRIO#LLFAILURE#LLGIVEUP#LLHASHSIZE#LLINTERRUPT#LLSUCCESS#LSH#L_ctermid#L_cuserid#L_tmpnam#MAPPING_SIZE#MAXBASEDEPTH#MAXDEPTH#MAXLINE#MAXPATHLEN#MAXSEARCH#MAX_DUMP_LINE_LENGTH#MAX_LINE_LENGTH#MAX_NAME_LENGTH#MAX_PRAGMA_LEN#MCEBASESIZE#MIDBASESIZE#MINLINE#MINLINELEN#MUL_PRIO#NAME#NCCS#NCPPNAMES#NOFLSH#NOTEQUAL#NOT_FOUND#NRESERVEDNAMES#NULLFACTOR#NUMLIBS#NUMPOSIXLIBS#NUMSTRINGFLAGS#NUMVALUEFLAGS#OPOST#OROR#OROR_PRIO#OR_PRIO#O_ACCMODE#O_APPEND#O_CREAT#O_EXCL#O_NOCTTY#O_NONBLOCK#O_RDONLY#O_RDWR#O_TRUNC#O_WRONLY#PARAMUNKNOWN#PARENB#PAREN_INNER_PRIO#PAREN_OUTER_PRIO#PARMRK#PARODD#PLUS_PRIO#PRAGMA_LEN_EXPAND#PRINTBREADTH#RAND_MAX#RIGHT_OPERAND_REQUIRED#RSH#R_OK#SA_NOCLDSTOP#SEEK_CUR#SEEK_END#SEEK_SET#SHIFT_PRIO#SIGABRT#SIGALRM#SIGCHLD#SIGCONT#SIGFPE#SIGHUP#SIGILL#SIGINT#SIGKILL#SIGPIPE#SIGQUIT#SIGSEGV#SIGSTOP#SIGTERM#SIGTSTP#SIGTTIN#SIGTTOU#SIGUSR1#SIGUSR2#SIG_BLOCK#SIG_SETMASK#SIG_UNBLOCK#SKIP_INCLUDE#SMALLBASESIZE#STDC_VALUE#STDERR_FILENO#STDIN_FILENO#STDOUT_FILENO#STUBMAXRECORDSIZE#SYNTABLE_BASESIZE#S_IRGRP#S_IROTH#S_ISGID#S_ISUID#S_IUSR#S_IWGRP#S_IWOTH#S_IWUSR#S_IWXG#S_IWXO#S_IWXU#S_IXGRP#S_IXOTH#S_IXUSR#TCIFLUSH#TCIOFF#TCIOFLUSH#TCION#TCOFLUSH#TCSADRAIN#TCSAFLUSH#TCSANOW#TISTABLEBASESIZE#TMP_MAX#TOSTOP#UNARY_PRIO#UNKNOWN_COLUMN#UNKNOWN_LINE#VEOF#VEOL#VERASE#VINTR#VKILL#VMIN#VQUIT#VSTART#VSTOP#VSUSP#VTIME#WCHAR_MAX#WCHAR_MIN#WUNTRACED#W_OK#XOR_PRIO#X_OK#YYDEBUG#_IOFBF#_IOLBF#_IONBF#_PC_CHOWN_RESTRUCTED#_PC_MAX_CANON#_PC_MAX_INPUT#_PC_NAME_MAX#_PC_NO_TRUNC#_PC_PATH_MAX#_PC_PIPE_BUF#_PC_VDISABLE#_POSIX_CHOWN_RESTRICTED#_POSIX_JOB_CONTROL#_POSIX_NO_TRUNC#_POSIX_SAVED_IDS#_POSIX_VDISABLE#_POSIX_VERSION#_SC_ARG_MAX#_SC_CHILD_MAX#_SC_CLK_TCK#_SC_JOB_CONTROL#_SC_NGROUPS_MAX#_SC_OPEN_MAX#_SC_SAVED_IDS#_SC_STREAM_MAX#_SC_TZNAME_MAX#_SC_VERSION#__INCLUDE_LEVEL__#__LCLINT__#__LINE__#aliasTableBASESIZE#clauseStackBASESIZE#cppReader_fatalErrorLimit#cstringListBASESIZE#cstringSListBASESIZE#ctypeListBASESIZE#declaratorInvNodeListBASESIZE#declaratorNodeListBASESIZE#enumNameListBASESIZE#exprNodeListBASESIZE#exprNodeSListBASESIZE#fcnNodeListBASESIZE#fileScope#filelocListBASESIZE#filelocStackBASESIZE#flagMarkerListBASESIZE#functionScope#globScope#idDeclListBASESIZE#importNodeListBASESIZE#initDeclNodeListBASESIZE#intSetBASESIZE#interfaceNodeListBASESIZE#interfaceNodeListGROWHI#interfaceNodeListGROWLOW#letDeclNodeListBASESIZE#lslOpListBASESIZE#lslOpSetBASESIZE#lsymbolListBASESIZE#lsymbolSetBASESIZE#ltokenListBASESIZE#messageLogBASESIZE#pairNodeListBASESIZE#paramNodeListBASESIZE#paramsScope#programNodeListBASESIZE#qualListBASESIZE#quantifierNodeListBASESIZE#replaceNodeListBASESIZE#sRefSetBASESIZE#sRefSetListBASESIZE#sRefTableBASESIZE#sigNodeSetBASESIZE#sortListBASESIZE#sortSetBASESIZE#sortSetListBASESIZE#specialClausesBASESIZE#stDeclNodeListBASESIZE#storeRefNodeListBASESIZE#termNodeListBASESIZE#termNodeListGROWHI#termNodeListGROWLOW#traitRefNodeListBASESIZE#typeNameNodeListBASESIZE#uentryListBASESIZE#usymIdSetBASESIZE#varDeclarationNodeListBASESIZE#varNodeListBASESIZE
+6$#UINT_MAX
+7$#CPPEXP_CHAR#CPPEXP_INT#CPPREADER_ERRORTOK#SHRT_MAX#SHRT_MIN
+8$#USHRT_MAX
+9$#ARG_MAX#CHILD_MAX#LINK_MAX#LONG_MAX#LONG_MIN#MAX_CANON#MAX_INPUT#MB_LEN_MAX#NAME_MAX#NGROUPS_MAX#OPEN_MAX#PIPE_BUF#SSIZE_MAX#STREAM_MAX#TZNAME_MAX#_POSIX_ARG_MAX#_POSIX_CHILD_MAX#_POSIX_LINK_MAX#_POSIX_MAX_CANON#_POSIX_MAX_INPUT#_POSIX_NAME_MAX#_POSIX_NGROUPS_MAX#_POSIX_OPEN_MAX#_POSIX_PATH_MAX#_POSIX_PIPE_BUF#_POSIX_SSIZE#_POSIX_STREAM#_POSIX_TZNAME_MAX
+10$#INITSYNTABLE#INITTOKENTABLE#ULONG_MAX
+16$#LCL_MIN_VERSION
+17$#DELTASYNTABLE#DELTATOKENTABLE#HUGE_VAL
+23$#__BASE_FILE__#__DATE__#__FILE__#__REGISTER_PREFIX__#__TIME__#__USER_LABEL_PREFIX__#__VERSION__
+23$#AFTER_COMMENT_MARKER#BEFORE_COMMENT_MARKER#BEGINSORTTABLE#BEGINSYMTABLE#CONNECTSTR#CPP_VERSION#CTRAITFILENAMEN#CTRAITSPECNAME#CTRAITSYMSNAME#C_SUFFIX#DEFAULT_BOOLTYPE#DEFAULT_LARCHPATH#DEFAULT_LCLIMPORTDIR#DEFAULT_SYSTEMDIR#DEFAULT_TMPDIR#DUMP_SUFFIX#FILE_NAME_MAP_FILE#GCC_INCLUDE_DIR#GCC_INCLUDE_DIR2#INCLUDE_VAR#INITFILENAME#IO_SUFFIX#LARCH_PATH#LCLIMPORTDIR#LCLINIT_SUFFIX#LCLINT_MAINTAINER#LCL_COMPILE#LCL_PARSE_VERSION#LCL_SUFFIX#LCL_VERSION#LH_SUFFIX#LLMRCODE#LLPOSIXLIBS_NAME#LLPOSIXSTRICTLIBS_NAME#LLSTDLIBS_NAME#LLSTRICTLIBS_NAME#LLUNIXLIBS_NAME#LLUNIXSTRICTLIBS_NAME#PPMRCODE#PRAGMA_EXPAND#PTRDIFF_TYPE#RCFILE#REGISTER_PREFIX#SIZE_TYPE#SORTTABLEEND#SYMTABLEEND#SYSTEM_LIBDIR#USER_LABEL_PREFIX#WCHAR_TYPE
+63$#BITS_PER_CHAR#BITS_PER_WORD#CHAR_TYPE_SIZE#HOST_BITS_PER_INT#HOST_BITS_PER_LONG#INT_TYPE_SIZE#LONG_TYPE_SIZE#MAX_CHAR_TYPE_SIZE#MAX_LONG_TYPE_SIZE#MAX_WCHAR_TYPE_SIZE#MB_CUR_MAX#WCHAR_TYPE_SIZE
+66$#WEOF
+182$#SIG_DFL
+186$#SIG_ERR
+190$#SIG_IGN
+940@i0@0@6#lclTypeSpecNode_undefined
+945@@0@6#lsymbol_undefined
+951@i0@0@4#ltoken_undefined
+952$#LEOFTOKEN#NOTTOKEN
+955@i0@0@4#sRef_undefined
+958@i0@0@4#uentry_undefined
+959$#typeIdSet_empty#typeIdSet_undefined
+963@i0@0@4#idDecl_undefined
+966@@0@4#GLOBAL_ENV
+966@i0@0@4#usymtab_undefined
+969@i0@0@4#exprNode_undefined
+972@i0@0@4#guardSet_undefined
+975@i0@0@4#sRefSet_undefined
+978@i0@0@4#aliasTable_undefined
+981@i0@0@4#fileloc_undefined
+983@i0@0@4#cstring_undefined
+983@@0@5#DEFAULT_MODE#REFSNAME
+985$#ctype_anyintegral#ctype_bool#ctype_char#ctype_dne#ctype_double#ctype_elipsMarker#ctype_float#ctype_int#ctype_ldouble#ctype_lint#ctype_llint#ctype_missingParamsMarker#ctype_signedintegral#ctype_sint#ctype_string#ctype_uchar#ctype_uint#ctype_ulint#ctype_ullint#ctype_undefined#ctype_unknown#ctype_unsignedintegral#ctype_usint#ctype_void#ctype_voidPointer
+1312$#fileId_invalid
+1804@i0@0@4#cstringSList_undefined
+1834@i0@0@4#cstringList_undefined
+1862$#NUMFLAGS
+2108@i0@0@4#qualList_undefined
+2165@@0@6#smemberInfo_undefined
+2296@i0@0@4#paramNodeList_undefined
+2431@i0@0@4#ltokenList_undefined
+2550@i0@0@4#lsymbolSet_undefined
+2567@i0@0@4#sortSet_undefined
+2601@i0@0@4#pairNodeList_undefined
+2928@i0@0@4#fcnNodeList_undefined
+3100@i0@0@4#sigNodeSet_undefined
+3158@i0@0@4#lslOpSet_undefined
+3801$#cprim_int
+3832@i0@0@6#hbucket_undefined
+3854@i0@0@4#filelocList_undefined
+4044$#XK_LAST
+4180$#KELAST#ekind_function#ekind_variable
+4203$#USYMIDINVALID
+4204$#typeId_invalid
+4211@i0@0@4#usymIdSet_undefined
+4245@i0@0@4#uentryList_undefined
+4245@@0@4#uentryList_missingParams
+4327@@0@4#globSet_undefined
+4367@i0@0@4#ctypeList_undefined
+4941@i0@0@4#qtype_undefined
+5019@i0@0@6#multiVal_undefined
+5097@i0@0@4#specialClauses_undefined
+5157$#VKFIRST#VKLAST
+5655@i0@0@6#alinfo_undefined
+6309@i0@0@6#exprData_undefined
+6679@i0@0@4#sRefSetList_undefined
+6794@i0@0@4#fileTable_undefined
+6868@i0@0@4#messageLog_undefined
+7384$#SELF_DIR_DUMMY
+8936@i0@0@6#ctbase_undefined
+10696@i0@0@4#sRefTable_undefined
+12042@i0@0@4#filelocStack_undefined
+*2 (Enum member)
+1144$#CGE_CASE#CGE_DISTINCT#CGE_LOOKALIKE#CGE_SAME
+1321$#FL_BUILTIN#FL_EXTERNAL#FL_IMPORT#FL_LIB#FL_NORMAL#FL_PREPROC#FL_RC#FL_SPEC#FL_STDHDR#FL_STDLIB
+1287$#MAYBE#NO#YES
+1488$#QU_ABSTRACT#QU_AUTO#QU_CHECKED#QU_CHECKEDSTRICT#QU_CHECKMOD#QU_CONCRETE#QU_CONST#QU_DEPENDENT#QU_EXITS#QU_EXPOSED#QU_EXTERN#QU_EXTERNAL#QU_FALSEEXIT#QU_FALSENULL#QU_IMMUTABLE#QU_IMPONLY#QU_IN#QU_INLINE#QU_KEEP#QU_KEPT#QU_KILLED#QU_KILLREF#QU_LAST#QU_LONG#QU_MAYEXIT#QU_MESSAGELIKE#QU_MUTABLE#QU_NEVEREXIT#QU_NEWREF#QU_NOTNULL#QU_NULL#QU_OBSERVER#QU_ONLY#QU_OUT#QU_OWNED#QU_PARTIAL#QU_PRINTFLIKE#QU_REFCOUNTED#QU_REFS#QU_REGISTER#QU_RELDEF#QU_RELNULL#QU_RETURNED#QU_SCANFLIKE#QU_SEF#QU_SHARED#QU_SHORT#QU_SIGNED#QU_SPECIAL#QU_STATIC#QU_TEMP#QU_TEMPREF#QU_TRUEEXIT#QU_TRUENULL#QU_UNCHECKED#QU_UNDEF#QU_UNIQUE#QU_UNKNOWN#QU_UNSIGNED#QU_UNUSED#QU_VOLATILE#QU_YIELD
+1776$#ANDCLAUSE#CASECLAUSE#CONDCLAUSE#DOWHILECLAUSE#FALSECLAUSE#FALSEEXITCLAUSE#FORCLAUSE#ITERCLAUSE#NOCLAUSE#ORCLAUSE#SWITCHCLAUSE#TRUECLAUSE#TRUEEXITCLAUSE#WHILECLAUSE
+1860$#FLG_ABSTRACT#FLG_ABSTRACTBOOL#FLG_ABSTVOIDP#FLG_ACCESSALL#FLG_ACCESSCZECH#FLG_ACCESSCZECHOSLOVAK#FLG_ACCESSFILE#FLG_ACCESSMODULE#FLG_ACCESSSLOVAK#FLG_ALIASUNIQUE#FLG_ALLBLOCK#FLG_ALLEMPTY#FLG_ALLGLOBALS#FLG_ALLIMPONLY#FLG_ALLMACROS#FLG_ANSILIB#FLG_ANSILIMITS#FLG_ANSIRESERVED#FLG_ANSIRESERVEDLOCAL#FLG_ASSIGNEXPOSE#FLG_BADFLAG#FLG_BITWISEOPS#FLG_BOOLCOMPARE#FLG_BOOLFALSE#FLG_BOOLINT#FLG_BOOLOPS#FLG_BOOLTRUE#FLG_BOOLTYPE#FLG_BRANCHSTATE#FLG_CASEBREAK#FLG_CASTEXPOSE#FLG_CASTFCNPTR#FLG_CHARINDEX#FLG_CHARINT#FLG_CHARINTLITERAL#FLG_CHARUNSIGNEDCHAR#FLG_CHECKEDGLOBALIAS#FLG_CHECKMODGLOBALIAS#FLG_CHECKSTRICTGLOBALIAS#FLG_CHECKSTRICTGLOBALS#FLG_CODEIMPONLY#FLG_COMMENTCHAR#FLG_COMPDEF#FLG_COMPDESTROY#FLG_COMPMEMPASS#FLG_CONSTMACROS#FLG_CONSTPREFIX#FLG_CONSTPREFIXEXCLUDE#FLG_CONSTUNUSED#FLG_CONTINUECOMMENT#FLG_CONTROL#FLG_CONTROLNESTDEPTH#FLG_CPPNAMES#FLG_CZECH#FLG_CZECHCONSTANTS#FLG_CZECHFUNCTIONS#FLG_CZECHMACROS#FLG_CZECHOSLOVAK#FLG_CZECHOSLOVAKCONSTANTS#FLG_CZECHOSLOVAKFUNCTIONS#FLG_CZECHOSLOVAKMACROS#FLG_CZECHOSLOVAKTYPES#FLG_CZECHOSLOVAKVARS#FLG_CZECHTYPES#FLG_CZECHVARS#FLG_DECLPARAMMATCH#FLG_DECLPARAMNAME#FLG_DECLPARAMPREFIX#FLG_DECLPARAMPREFIXEXCLUDE#FLG_DECLUNDEF#FLG_DEEPBREAK#FLG_DEFINE#FLG_DEPARRAYS#FLG_DEPENDENTTRANS#FLG_DISTINCTEXTERNALNAMES#FLG_DISTINCTINTERNALNAMES#FLG_DOLCS#FLG_DOLH#FLG_DUMP#FLG_DUPLICATEQUALS#FLG_ELSEIFCOMPLETE#FLG_ENUMINDEX#FLG_ENUMINT#FLG_ENUMMEMBERS#FLG_ENUMMEMUNUSED#FLG_ENUMPREFIX#FLG_ENUMPREFIXEXCLUDE#FLG_EVALORDER#FLG_EVALORDERUNCON#FLG_EXITARG#FLG_EXPECT#FLG_EXPORTANY#FLG_EXPORTCONST#FLG_EXPORTFCN#FLG_EXPORTHEADER#FLG_EXPORTHEADERVAR#FLG_EXPORTITER#FLG_EXPORTLOCAL#FLG_EXPORTMACRO#FLG_EXPORTTYPE#FLG_EXPORTVAR#FLG_EXPOSETRANS#FLG_EXTERNALNAMECASEINSENSITIVE#FLG_EXTERNALNAMELEN#FLG_EXTERNALPREFIX#FLG_EXTERNALPREFIXEXCLUDE#FLG_FCNDEREF#FLG_FCNMACROS#FLG_FIELDUNUSED#FLG_FILESTATICPREFIX#FLG_FILESTATICPREFIXEXCLUDE#FLG_FIRSTCASE#FLG_FIXEDFORMALARRAY#FLG_FLOATDOUBLE#FLG_FORBLOCK#FLG_FORCEHINTS#FLG_FOREMPTY#FLG_FORMALARRAY#FLG_FORMATCODE#FLG_FORMATTYPE#FLG_FORWARDDECL#FLG_FRESHTRANS#FLG_FULLINITBLOCK#FLG_FUNCUNUSED#FLG_GLOBALIAS#FLG_GLOBALS#FLG_GLOBALSIMPMODIFIESNOTHING#FLG_GLOBIMPONLY#FLG_GLOBPREFIX#FLG_GLOBPREFIXEXCLUDE#FLG_GLOBSTATE#FLG_GLOBUNSPEC#FLG_GNUEXTENSIONS#FLG_GRAMMAR#FLG_HASYIELD#FLG_HELP#FLG_HINTS#FLG_IFBLOCK#FLG_IFEMPTY#FLG_IGNOREQUALS#FLG_IGNORESIGNS#FLG_IMMEDIATETRANS#FLG_IMPABSTRACT#FLG_IMPCHECKEDGLOBALS#FLG_IMPCHECKEDSPECGLOBALS#FLG_IMPCHECKEDSTATICS#FLG_IMPCHECKEDSTRICTGLOBALS#FLG_IMPCHECKEDSTRICTSPECGLOBALS#FLG_IMPCHECKEDSTRICTSTATICS#FLG_IMPCHECKMODGLOBALS#FLG_IMPCHECKMODINTERNALS#FLG_IMPCHECKMODSPECGLOBALS#FLG_IMPCHECKMODSTATICS#FLG_IMPCONJ#FLG_IMPOUTS#FLG_IMPTYPE#FLG_INCLUDENEST#FLG_INCLUDEPATH#FLG_INCOMPLETETYPE#FLG_INCONDEFS#FLG_INCONDEFSLIB#FLG_INFLOOPS#FLG_INFLOOPSUNCON#FLG_INIT#FLG_INTERNALGLOBS#FLG_INTERNALGLOBSNOGLOBS#FLG_INTERNALNAMECASEINSENSITIVE#FLG_INTERNALNAMELEN#FLG_INTERNALNAMELOOKALIKE#FLG_ITER#FLG_ITERPREFIX#FLG_ITERPREFIXEXCLUDE#FLG_KEEP#FLG_KEEPTRANS#FLG_KEPTTRANS#FLG_LARCHPATH#FLG_LCLEXPECT#FLG_LCLIMPORTDIR#FLG_LIBMACROS#FLG_LIKELYBOOL#FLG_LIMIT#FLG_LINELEN#FLG_LINTCOMMENTS#FLG_LOCALPREFIX#FLG_LOCALPREFIXEXCLUDE#FLG_LONGINTEGRAL#FLG_LONGSIGNEDINTEGRAL#FLG_LONGUNSIGNEDINTEGRAL#FLG_LONGUNSIGNEDUNSIGNEDINTEGRAL#FLG_LOOPEXEC#FLG_LOOPLOOPBREAK#FLG_LOOPLOOPCONTINUE#FLG_LOOPSWITCHBREAK#FLG_MACROASSIGN#FLG_MACROCONSTDECL#FLG_MACRODECL#FLG_MACROEMPTY#FLG_MACROFCNDECL#FLG_MACROMATCHNAME#FLG_MACRONEXTLINE#FLG_MACROPARAMS#FLG_MACROPARENS#FLG_MACROREDEF#FLG_MACROSTMT#FLG_MACROUNDEF#FLG_MACROVARPREFIX#FLG_MACROVARPREFIXEXCLUDE#FLG_MAINTYPE#FLG_MATCHANYINTEGRAL#FLG_MATCHFIELDS#FLG_MAYALIASUNIQUE#FLG_MEMCHECKS#FLG_MEMIMPLICIT#FLG_MEMTRANS#FLG_MERGE#FLG_MISSCASE#FLG_MODFILESYSTEM#FLG_MODGLOBS#FLG_MODGLOBSUNCHECKED#FLG_MODGLOBSUNSPEC#FLG_MODIFIES#FLG_MODIFIESIMPNOGLOBALS#FLG_MODINTERNALSTRICT#FLG_MODNOMODS#FLG_MODOBSERVER#FLG_MODOBSERVERUNCON#FLG_MODSTRICTGLOBSUNSPEC#FLG_MODUNCON#FLG_MODUNCONNOMODS#FLG_MODUNSPEC#FLG_MUSTDEFINE#FLG_MUSTFREE#FLG_MUSTMOD#FLG_MUSTNOTALIAS#FLG_MUTREP#FLG_NAME#FLG_NAMECHECKS#FLG_NEEDSPEC#FLG_NESTCOMMENT#FLG_NESTEDEXTERN#FLG_NEVERINCLUDE#FLG_NEWDECL#FLG_NEWREFTRANS#FLG_NOACCESS#FLG_NOCOMMENTS#FLG_NOEFFECT#FLG_NOEFFECTUNCON#FLG_NOF#FLG_NOLIB#FLG_NOPARAMS#FLG_NOPP#FLG_NORETURN#FLG_NULL#FLG_NULLASSIGN#FLG_NULLDEREF#FLG_NULLPASS#FLG_NULLPOINTERARITH#FLG_NULLRET#FLG_NULLSTATE#FLG_NUMENUMMEMBERS#FLG_NUMLITERAL#FLG_NUMSTRUCTFIELDS#FLG_OBSERVERTRANS#FLG_OLDSTYLE#FLG_ONLYTRANS#FLG_ONLYUNQGLOBALTRANS#FLG_OPTF#FLG_OWNEDTRANS#FLG_PARAMIMPTEMP#FLG_PARAMUNUSED#FLG_PARENFILEFORMAT#FLG_PARTIAL#FLG_PASSUNKNOWN#FLG_POINTERARITH#FLG_POSIXLIB#FLG_POSIXSTRICTLIB#FLG_PREDASSIGN#FLG_PREDBOOL#FLG_PREDBOOLINT#FLG_PREDBOOLOTHERS#FLG_PREDBOOLPTR#FLG_PREPROC#FLG_PTRNEGATE#FLG_PTRNUMCOMPARE#FLG_QUIET#FLG_READONLYSTRINGS#FLG_READONLYTRANS#FLG_REALCOMPARE#FLG_REDECL#FLG_REDEF#FLG_REFCOUNTTRANS#FLG_RELAXQUALS#FLG_RELAXTYPES#FLG_REPEATUNRECOG#FLG_REPEXPOSE#FLG_RETALIAS#FLG_RETEXPOSE#FLG_RETIMPONLY#FLG_RETSTACK#FLG_RETVAL#FLG_RETVALBOOL#FLG_RETVALINT#FLG_RETVALOTHER#FLG_SEFPARAMS#FLG_SEFUNSPEC#FLG_SHADOW#FLG_SHAREDTRANS#FLG_SHIFTSIGNED#FLG_SHOWALLCONJS#FLG_SHOWCOL#FLG_SHOWFUNC#FLG_SHOWSCAN#FLG_SHOWSUMMARY#FLG_SHOWUSES#FLG_SINGLEINCLUDE#FLG_SIZEOFFORMALARRAY#FLG_SIZEOFTYPE#FLG_SKIPANSIHEADERS#FLG_SKIPPOSIXHEADERS#FLG_SKIPSYSHEADERS#FLG_SLOVAK#FLG_SLOVAKCONSTANTS#FLG_SLOVAKFUNCTIONS#FLG_SLOVAKMACROS#FLG_SLOVAKTYPES#FLG_SLOVAKVARS#FLG_SPECALLIMPONLY#FLG_SPECGLOBIMPONLY#FLG_SPECIAL#FLG_SPECMACROS#FLG_SPECPATH#FLG_SPECRETIMPONLY#FLG_SPECSTRUCTIMPONLY#FLG_SPECUNDECL#FLG_SPECUNDEF#FLG_STATICINITTRANS#FLG_STATICTRANS#FLG_STATS#FLG_STRICTBRANCHSTATE#FLG_STRICTDESTROY#FLG_STRICTLIB#FLG_STRICTOPS#FLG_STRICTUSERELEASED#FLG_STRINGLITERALLEN#FLG_STRUCTIMPONLY#FLG_SUPCOUNTS#FLG_SWITCHLOOPBREAK#FLG_SWITCHSWITCHBREAK#FLG_SYNTAX#FLG_SYSTEMDIRERRORS#FLG_SYSTEMDIREXPAND#FLG_SYSTEMDIRS#FLG_SYSTEMUNRECOG#FLG_TAGPREFIX#FLG_TAGPREFIXEXCLUDE#FLG_TEMPTRANS#FLG_TIMEDIST#FLG_TMPCOMMENTS#FLG_TMPDIR#FLG_TOPUNUSED#FLG_TRYTORECOVER#FLG_TYPE#FLG_TYPEPREFIX#FLG_TYPEPREFIXEXCLUDE#FLG_TYPEUNUSED#FLG_UNCHECKEDGLOBALIAS#FLG_UNCHECKEDMACROPREFIX#FLG_UNCHECKEDMACROPREFIXEXCLUDE#FLG_UNDEFINE#FLG_UNIONDEF#FLG_UNIXLIB#FLG_UNIXSTRICTLIB#FLG_UNKNOWNINITTRANS#FLG_UNKNOWNTRANS#FLG_UNREACHABLE#FLG_UNRECOG#FLG_UNRECOGCOMMENTS#FLG_UNUSEDSPECIAL#FLG_USEALLGLOBS#FLG_USEDEF#FLG_USERELEASED#FLG_USESTDERR#FLG_USEVARARGS#FLG_VARUNUSED#FLG_WARNFLAGS#FLG_WARNLINTCOMMENTS#FLG_WARNMISSINGGLOBALS#FLG_WARNMISSINGGLOBALSNOGLOBS#FLG_WARNOVERLOAD#FLG_WARNPOSIX#FLG_WARNUNIXLIB#FLG_WHICHLIB#FLG_WHILEBLOCK#FLG_WHILEEMPTY#FLG_ZEROPTR#INVALID_FLAG#LAST_FLAG#SKIP_FLAG
+1864$#FK_ABSTRACT#FK_ALIAS#FK_ANSI#FK_ARRAY#FK_BEHAVIOR#FK_BOOL#FK_COMMENTS#FK_COMPLETE#FK_CONTROL#FK_DEAD#FK_DEBUG#FK_DECL#FK_DEF#FK_DIRECT#FK_DISPLAY#FK_EFFECT#FK_ERRORS#FK_EXPORT#FK_EXPOSURE#FK_FILES#FK_FORMAT#FK_GLOBAL#FK_GLOBALS#FK_HEADERS#FK_HELP#FK_IGNORERET#FK_IMPLICIT#FK_INIT#FK_ITER#FK_LEAK#FK_LIBS#FK_LIMITS#FK_MACROS#FK_MEMORY#FK_MODIFIES#FK_NAMES#FK_NONE#FK_NULL#FK_NUMBERS#FK_OBSOLETE#FK_OPS#FK_PARAMS#FK_POINTER#FK_PRED#FK_PREFIX#FK_PREPROC#FK_PROTOS#FK_SECRET#FK_SPEC#FK_SPEED#FK_SUPPRESS#FK_SYNTAX#FK_TYPE#FK_TYPEEQ#FK_UNRECOG#FK_UNSPEC#FK_USE
+2158$#SRT_ARRAY#SRT_ENUM#SRT_FIRST#SRT_HOF#SRT_LAST#SRT_NONE#SRT_OBJ#SRT_PRIM#SRT_PTR#SRT_STRUCT#SRT_SYN#SRT_TUPLE#SRT_UNION#SRT_UNIONVAL#SRT_VECTOR
+2259$#TS_CHAR#TS_DOUBLE#TS_ENUM#TS_FLOAT#TS_INT#TS_LONG#TS_SHORT#TS_SIGNED#TS_STRUCT#TS_TYPEDEF#TS_UNION#TS_UNKNOWN#TS_UNSIGNED#TS_VOID
+2262$#TYS_CHAR#TYS_DOUBLE#TYS_ENUM#TYS_FLOAT#TYS_INT#TYS_LDOUBLE#TYS_NONE#TYS_SCHAR#TYS_SINT#TYS_SLINT#TYS_SSINT#TYS_STRUCT#TYS_TYPENAME#TYS_UCHAR#TYS_UINT#TYS_ULINT#TYS_UNION#TYS_USINT#TYS_VOID
+2272$#PELIPSIS#PNORMAL#PYIELD
+2344$#SID_OP#SID_SORT#SID_TYPE#SID_VAR
+2483$#TAG_ENUM#TAG_FWDSTRUCT#TAG_FWDUNION#TAG_STRUCT#TAG_UNION
+2486$#IMPBRACKET#IMPPLAIN#IMPQUOTE
+2640$#TEXPR_ARRAY#TEXPR_BASE#TEXPR_FCN#TEXPR_PTR
+2736$#SRN_OBJ#SRN_SPECIAL#SRN_TERM#SRN_TYPE
+2801$#ACT_ALTERNATE#ACT_ITER#ACT_SELF#ACT_SEQUENCE
+3081$#TRM_APPLICATION#TRM_CONST#TRM_LITERAL#TRM_QUANTIFIER#TRM_SIZEOF#TRM_UNCHANGEDALL#TRM_UNCHANGEDOTHERS#TRM_VAR#TRM_ZEROARY
+2830$#LPD_CHECKS#LPD_CONSTRAINT#LPD_ENSURES#LPD_INITIALLY#LPD_INTRACLAIM#LPD_PLAIN#LPD_REQUIRES
+2842$#TK_ABSTRACT#TK_EXPOSED#TK_UNION
+2878$#QLF_CONST#QLF_NONE#QLF_VOLATILE
+3003$#SU_STRUCT#SU_UNION
+3017$#LTS_CONJ#LTS_ENUM#LTS_STRUCTUNION#LTS_TYPE
+3068$#OPF_ANYOP#OPF_ANYOPM#OPF_BMIDDLE#OPF_BMIDDLEM#OPF_BMMIDDLE#OPF_BMMIDDLEM#OPF_IF#OPF_MANYOP#OPF_MANYOPM#OPF_MAP#OPF_MIDDLE#OPF_MIDDLEM#OPF_MMAP#OPF_MMIDDLE#OPF_MMIDDLEM#OPF_MSELECT#OPF_SELECT
+3249$#PRIV_CONST#PRIV_FUNCTION#PRIV_TYPE#PRIV_VAR
+3260$#INF_EXPORT#INF_IMPORTS#INF_PRIVATE#INF_USES
+3238$#XPK_CLAIM#XPK_CONST#XPK_FCN#XPK_ITER#XPK_TYPE#XPK_VAR
+3655$#VRK_CONST#VRK_ENUM#VRK_GLOBAL#VRK_LET#VRK_PARAM#VRK_PRIVATE#VRK_QUANT#VRK_VAR
+3680$#SPE_ABSTRACT#SPE_CLAIM#SPE_FCN#SPE_GLOBAL#SPE_INVALID#SPE_QUANT
+3672$#IK_OP#IK_SORT#IK_TAG
+3935$#SS_ALLOCATED#SS_DEAD#SS_DEFINED#SS_FIXED#SS_HOFFA#SS_KILLED#SS_LAST#SS_MUNDEFINED#SS_PARTIAL#SS_PDEFINED#SS_RELDEF#SS_SPECIAL#SS_UNDEFGLOB#SS_UNDEFINED#SS_UNDEFKILLED#SS_UNKNOWN#SS_UNUSEABLE
+3938$#SCEXTERN#SCNONE#SCSTATIC
+3941$#NS_ABSNULL#NS_CONSTNULL#NS_DEFNULL#NS_ERROR#NS_MNOTNULL#NS_NOTNULL#NS_POSNULL#NS_RELNULL#NS_UNKNOWN
+3946$#AK_DEPENDENT#AK_ERROR#AK_FRESH#AK_IMPDEPENDENT#AK_IMPONLY#AK_IMPTEMP#AK_KEEP#AK_KEPT#AK_KILLREF#AK_LOCAL#AK_NEWREF#AK_ONLY#AK_OWNED#AK_REFCOUNTED#AK_REFS#AK_RETURNED#AK_SHARED#AK_STACK#AK_STATIC#AK_TEMP#AK_UNIQUE#AK_UNKNOWN
+3949$#XO_EXPOSED#XO_NORMAL#XO_OBSERVER#XO_UNKNOWN
+4042$#XK_ERROR#XK_FALSEEXIT#XK_GOTO#XK_MAYEXIT#XK_MAYGOTO#XK_MAYRETURN#XK_MAYRETURNEXIT#XK_MUSTEXIT#XK_MUSTRETURN#XK_MUSTRETURNEXIT#XK_NEVERESCAPE#XK_TRUEEXIT#XK_UNKNOWN
+4178$#KCONST#KDATATYPE#KELIPSMARKER#KENDITER#KENUMCONST#KENUMTAG#KFCN#KINVALID#KITER#KSTRUCTTAG#KUNIONTAG#KVAR
+4422$#US_CBRANCH#US_FBRANCH#US_GLOBAL#US_NORMAL#US_SWITCH#US_TBRANCH
+4670$#CT_ABST#CT_ARRAY#CT_BOOL#CT_CONJ#CT_ENUM#CT_ENUMLIST#CT_EXPFCN#CT_FCN#CT_FIXEDARRAY#CT_PRIM#CT_PTR#CT_STRUCT#CT_UNION#CT_UNKNOWN#CT_USER
+4673$#CTK_ARRAY#CTK_COMPLEX#CTK_DNE#CTK_INVALID#CTK_PLAIN#CTK_PTR#CTK_UNKNOWN
+5068$#SP_ALLOCATES#SP_DEFINES#SP_ISDEPENDENT#SP_ISEXPOSED#SP_ISNOTNULL#SP_ISNULL#SP_ISOBSERVER#SP_ISONLY#SP_ISOWNED#SP_ISSHARED#SP_RELEASES#SP_SETS#SP_USES
+5071$#TK_AFTER#TK_BEFORE#TK_BOTH
+5011$#MVCHAR#MVDOUBLE#MVLONG#MVSTRING
+5155$#VKEXPMACRO#VKNORMAL#VKPARAM#VKREFPARAM#VKREFSEFPARAM#VKREFSEFRETPARAM#VKREFYIELDPARAM#VKRETPARAM#VKSEFPARAM#VKSEFRETPARAM#VKSPEC#VKYIELDPARAM
+5158$#CH_CHECKED#CH_CHECKEDSTRICT#CH_CHECKMOD#CH_UNCHECKED#CH_UNKNOWN
+5169$#SPC_LAST#SPC_MESSAGELIKE#SPC_NONE#SPC_PRINTFLIKE#SPC_SCANFLIKE
+5626$#SR_INTERNAL#SR_NOTHING#SR_SPECSTATE#SR_SYSTEM
+5629$#SK_ADR#SK_ARRAYFETCH#SK_CONJ#SK_CONST#SK_CVAR#SK_DERIVED#SK_EXTERNAL#SK_FIELD#SK_NEW#SK_OBJECT#SK_PARAM#SK_PTR#SK_RESULT#SK_SPECIAL#SK_TYPE#SK_UNCONSTRAINED#SK_UNKNOWN
+6258$#XPR_ALIGNOF#XPR_ALIGNOFT#XPR_ARROW#XPR_ASSIGN#XPR_BLOCK#XPR_BODY#XPR_BREAK#XPR_CALL#XPR_CASE#XPR_CAST#XPR_COMMA#XPR_COND#XPR_CONST#XPR_CONTINUE#XPR_DEFAULT#XPR_DOWHILE#XPR_EMPTY#XPR_FACCESS#XPR_FETCH#XPR_FOR#XPR_FORPRED#XPR_FTCASE#XPR_FTDEFAULT#XPR_GOTO#XPR_IF#XPR_IFELSE#XPR_INIT#XPR_INITBLOCK#XPR_ITER#XPR_ITERCALL#XPR_LABEL#XPR_NODE#XPR_NULLRETURN#XPR_NUMLIT#XPR_OFFSETOF#XPR_OP#XPR_PARENS#XPR_POSTOP#XPR_PREOP#XPR_RETURN#XPR_SIZEOF#XPR_SIZEOFT#XPR_STMT#XPR_STMTLIST#XPR_STRINGLITERAL#XPR_SWITCH#XPR_TOK#XPR_VAARG#XPR_VAR#XPR_WHILE#XPR_WHILEPRED
+6691$#FMK_IGNORECOUNT#FMK_IGNOREOFF#FMK_IGNOREON#FMK_LOCALSET#FMK_SUPPRESS
+6782$#FILE_HEADER#FILE_LSLTEMP#FILE_MACROS#FILE_NODELETE#FILE_NORMAL
+7338$#CPP_3DOTS#CPP_CHAR#CPP_COMMA#CPP_COMMENT#CPP_DIRECTIVE#CPP_EOF#CPP_HSPACE#CPP_LBRACE#CPP_LPAREN#CPP_NAME#CPP_NUMBER#CPP_OTHER#CPP_POP#CPP_RBRACE#CPP_RPAREN#CPP_SEMICOLON#CPP_STRING#CPP_VSPACE
+7430$#T_BASE_FILE#T_CONST#T_DATE#T_DEFINE#T_DISABLED#T_ELIF#T_ELSE#T_ENDIF#T_ERROR#T_FILE#T_IDENT#T_IF#T_IFDEF#T_IFNDEF#T_INCLUDE#T_INCLUDE_LEVEL#T_INCLUDE_NEXT#T_LINE#T_MACRO#T_NONE#T_PCSTRING#T_PRAGMA#T_PTRDIFF_TYPE#T_REGISTER_PREFIX_TYPE#T_SIZE_TYPE#T_SPECLINE#T_SPEC_DEFINED#T_TIME#T_UNDEF#T_UNUSED#T_USER_LABEL_PREFIX_TYPE#T_VERSION#T_WARNING#T_WCHAR_TYPE
+7423$#DUMP_DEFINITIONS#DUMP_NAMES#DUMP_NONE
+7574$#OSD_FILEFOUND#OSD_FILENOTFOUND#OSD_PATHTOOLONG
+7730$#enter_file#leave_file#same_file
+9875$#TT_DOASSIGN#TT_FCNPASS#TT_FCNRETURN#TT_FIELDASSIGN#TT_GLOBINIT#TT_GLOBPASS#TT_GLOBRETURN#TT_LEAVETRANS#TT_PARAMRETURN
+9910$#DSC_GLOB#DSC_LOCAL#DSC_PARAM#DSC_STRUCT
+10295$#XBOOL#XCHAR#XCTYPE#XFILELOC#XFLOAT#XINT#XINVALID#XPERCENT#XPLURAL#XREPREFIX#XSTRING#XSTRINGFREE#XTSTRINGFREE#XUENTRY
+12087$#CX_FCNDECL#CX_FUNCTION#CX_GLOBAL#CX_INNER#CX_ITERDEF#CX_ITEREND#CX_LCL#CX_LCLLIB#CX_MACROCONST#CX_MACROFCN#CX_UNKNOWNMACRO
+12620$#ARG_NONE#ARG_SPECIAL#ARG_STRING#ARG_VALUE
+13973$#CHC_EXTENSION#CHC_NULL#IDCHAR#OPCHAR#PERMCHAR#SINGLECHAR#SLASHCHAR#WHITECHAR
+14061$#CHARCLASS1#CHARCLASS2#CHARCLASS3#CHARCLASS4#CHARCLASS5#CHARCLASS6#CLASSIFICATION1#CLASSIFICATION2#CLASSIFICATION3#CLOSESYMTOK1#CLOSESYMTOKS1#CLOSESYMTOKS2#COMMENTSYMTOK1#COMMENTSYMTOKS1#COMMENTSYMTOKS2#IDCHAR1#IDCHARS1#IDCHARS2#INITFILE1#INITLINE1#INITLINE2#INITLINES1#INITLINES2#INITLINES3#LOGICALOPTOK1#LOGICALOPTOKS1#LOGICALOPTOKS2#LRC_ENDCOMMENT1#LRC_ENDCOMMENT2#LRC_ENDCOMMENTCHAR1#LRC_EQOPTOK1#LRC_EQOPTOKS1#LRC_EQOPTOKS2#LRC_EQSEPSYMTOK1#LRC_EQSEPSYMTOKS1#LRC_EQSEPSYMTOKS2#LRC_EQUATIONSYMTOK1#LRC_EQUATIONSYMTOKS1#LRC_EQUATIONSYMTOKS2#LRC_EXTENSIONCHAR1#MAPSYMTOK1#MAPSYMTOKS1#MAPSYMTOKS2#MARKERSYMTOK1#MARKERSYMTOKS1#MARKERSYMTOKS2#NEWTOKEN1#OLDTOKEN1#OPCHAR1#OPCHARS1#OPCHARS2#OPENSYMTOK1#OPENSYMTOKS1#OPENSYMTOKS2#QUANTIFIERSYMTOK1#QUANTIFIERSYMTOKS1#QUANTIFIERSYMTOKS2#SELECTSYMTOK1#SELECTSYMTOKS1#SELECTSYMTOKS2#SEPSYMTOK1#SEPSYMTOKS1#SEPSYMTOKS2#SIMPLEIDTOK1#SIMPLEIDTOKS1#SIMPLEIDTOKS2#SINGCHAR1#SINGCHARS1#SINGCHARS2#SYNCLASS1#TOKENCLASS1#TOKENCLASS10#TOKENCLASS11#TOKENCLASS12#TOKENCLASS13#TOKENCLASS2#TOKENCLASS3#TOKENCLASS4#TOKENCLASS5#TOKENCLASS6#TOKENCLASS7#TOKENCLASS8#TOKENCLASS9#WHITECHAR1#WHITECHARS1#WHITECHARS2
+15203$#STARTCCHAR#STARTCNUM#STARTCNUMDOT#STARTCSTR#STARTOTHER#STARTSLASH#STARTWIDE
+15558$#SYMK_FCN#SYMK_SCOPE#SYMK_TYPE#SYMK_VAR
+*3 (Variable)
+0|@11|^#ADD_ASSIGN#AND#AND_ASSIGN#AND_OP#ARG_BASE#ARROW_OP#BADBRANCH#BADBRANCHCONT#BADDEFAULT#BADEXIT#BADTOK#BEGIN#BOOLBITS#BREAK#CALIGNOF#CASE#CBOOL#CCONSTANT#CDOUBLE#CELSE#CENUM#CFOR#CGCHAR#CGFLOAT#CIF#CINT#COFFSETOF#COMPARE#COMPARERETURN#CONTINUE#CPPBUFFER#CPP_OUT_BUFFER#CSIZEOF#CSTRUCT#CTOK_ELIPSIS#CTYPEDEF#CUNION#CVOID#DEC_OP#DEFAULT#DEFFILENO#DIV_ASSIGN#DO#DOSET#DPRINTF#EOB_ACT_CONTINUE_SCAN#EOB_ACT_END_OF_FILE#EOB_ACT_LAST_MATCH#EQ_OP#FLEX_SCANNER#GET#GETPRINTF#GE_OP#GOTO#HOST_BITS_PER_WIDE_INT#HOST_WIDE_INT#IDENTIFIER#INC_OP#INITIAL#INTCOMPARERETURN#ISTR#ITERATION_OP#ITER_ENDNAME#ITER_NAME#LCLMOVECHAR#LCLSCANLINE_H#LEFT_ASSIGN#LEFT_OP#LE_OP#LLGRAMMAR2_H#LLMACRO#LLMACROEND#LLMACROITER#LLT_ALL#LLT_ANYTHING#LLT_BE#LLT_BODY#LLT_CCHAR#LLT_CFLOAT#LLT_CHAR#LLT_CHECKED#LLT_CHECKEDSTRICT#LLT_CHECKMOD#LLT_CHECKS#LLT_CINTEGER#LLT_CLAIMS#LLT_COLON#LLT_COMMA#LLT_CONST#LLT_CONSTANT#LLT_CONSTRAINT#LLT_DEPENDENT#LLT_DOUBLE#LLT_ELSE#LLT_ENSURES#LLT_ENUM#LLT_EOL#LLT_EQUALS#LLT_EXITS#LLT_EXPOSED#LLT_FALSEEXIT#LLT_FALSENULL#LLT_FILESYS#LLT_FLOAT#LLT_FOR#LLT_FRESH#LLT_IF#LLT_IF_THEN_ELSE#LLT_IMMUTABLE#LLT_IMPORTS#LLT_INT#LLT_INTERNAL#LLT_ISSUB#LLT_ITER#LLT_KEEP#LLT_KEPT#LLT_KILLED#LLT_KILLREF#LLT_LBRACE#LLT_LBRACKET#LLT_LCSTRING#LLT_LET#LLT_LNOTNULL#LLT_LNULL#LLT_LONG#LLT_LPAR#LLT_MAYEXIT#LLT_MESSAGELIKE#LLT_MODIFIES#LLT_MULOP#LLT_MUTABLE#LLT_NEVEREXIT#LLT_NEWREF#LLT_NOTHING#LLT_OBJ#LLT_OBSERVER#LLT_ONLY#LLT_OUT#LLT_OWNED#LLT_PARTIAL#LLT_PRINTFLIKE#LLT_PRIVATE#LLT_QUOTE#LLT_RBRACE#LLT_RBRACKET#LLT_REFCOUNTED#LLT_REFS#LLT_RELDEF#LLT_RELNULL#LLT_REQUIRES#LLT_RESULT#LLT_RETURNED#LLT_RPAR#LLT_SCANFLIKE#LLT_SEF#LLT_SEMI#LLT_SHARED#LLT_SHORT#LLT_SIGNED#LLT_SIZEOF#LLT_SPEC#LLT_STRUCT#LLT_TAGGEDUNION#LLT_TELIPSIS#LLT_TEMP#LLT_TEMPREF#LLT_THEN#LLT_TRUEEXIT#LLT_TRUENULL#LLT_TYPE#LLT_TYPEDEF#LLT_TYPEDEF_NAME#LLT_UNCHANGED#LLT_UNCHECKED#LLT_UNDEF#LLT_UNION#LLT_UNIQUE#LLT_UNKNOWN#LLT_UNSIGNED#LLT_UNUSED#LLT_USES#LLT_VERTICALBAR#LLT_VOID#LLT_VOLATILE#LLT_WHITESPACE#LLT_YIELD#LOGICAL#LOOKAHEADCHAR#LOOKAHEADTWICECHAR#LST_BADTOKEN#LST_CLOSESYM#LST_COLON#LST_COMMA#LST_COMMENTSYM#LST_COMPOSESYM#LST_EOL#LST_EQOP#LST_EQSEPSYM#LST_EQUATIONSYM#LST_FIELDMAPSYM#LST_LBRACKET#LST_LOGICALOP#LST_LPAR#LST_MAPSYM#LST_MARKERSYM#LST_OPENSYM#LST_QUANTIFIERSYM#LST_RBRACKET#LST_RPAR#LST_SELECTSYM#LST_SEPSYM#LST_SIMPLEID#LST_SIMPLEOP#LST_WHITESPACE#LST_assertsTOKEN#LST_assumesTOKEN#LST_byTOKEN#LST_convertsTOKEN#LST_elseTOKEN#LST_enumerationTOKEN#LST_equationsTOKEN#LST_exemptingTOKEN#LST_forTOKEN#LST_generatedTOKEN#LST_ifTOKEN#LST_impliesTOKEN#LST_includesTOKEN#LST_introducesTOKEN#LST_ofTOKEN#LST_partitionedTOKEN#LST_thenTOKEN#LST_traitTOKEN#LST_tupleTOKEN#LST_unionTOKEN#LTRACE#MASH#MAX_SORT_DEPTH#MOD_ASSIGN#MOVECHAR#MUL_ASSIGN#NEWLINE_FIX#NEWLINE_FIX1#NEW_IDENTIFIER#NE_OP#NOALIAS#OR#OR_ASSIGN#OR_OP#PARAMS#PASTE#POSTFIX_OP#PREDTEST#PREFIX_OP#QABSTRACT#QALLOCATES#QALT#QANYTYPE#QARGSUSED#QAUTO#QCHECKED#QCHECKEDSTRICT#QCHECKMOD#QCONCRETE#QCONST#QCONSTANT#QDEFINES#QDEPENDENT#QENDMACRO#QEXITS#QEXPOSED#QEXTENSION#QEXTERN#QEXTERNAL#QFALLTHROUGH#QFALSEEXIT#QFALSENULL#QFUNCTION#QGLOBALS#QIMMUTABLE#QIN#QINLINE#QINNERBREAK#QINNERCONTINUE#QINTEGRALTYPE#QISNULL#QITER#QKEEP#QKEPT#QKILLED#QKILLREF#QLINTFALLTHROUGH#QLINTFALLTHRU#QLINTNOTREACHED#QLINTPRINTFLIKE#QLONG#QLOOPBREAK#QMAYEXIT#QMESSAGELIKE#QMODIFIES#QMUTABLE#QNEVEREXIT#QNEWREF#QNOMODS#QNOTNULL#QNOTREACHED#QNULL#QOBSERVER#QONLY#QOUT#QOWNED#QPARTIAL#QPOSTCLAUSE#QPRECLAUSE#QPRINTFLIKE#QREF#QREFCOUNTED#QREFS#QREGISTER#QRELDEF#QRELEASES#QRELNULL#QRETURNED#QSAFEBREAK#QSCANFLIKE#QSEF#QSETS#QSHARED#QSHORT#QSIGNED#QSIGNEDINTEGRALTYPE#QSPECIAL#QSTATIC#QSWITCHBREAK#QTEMP#QTEMPREF#QTRUEEXIT#QTRUENULL#QUNCHECKED#QUNDEF#QUNIQUE#QUNSIGNED#QUNSIGNEDINTEGRALTYPE#QUNUSED#QUSES#QVOLATILE#QYIELD#REJECT#REST_EXTENSION_LENGTH#RETURN#RETURN_CHAR#RETURN_EXPR#RETURN_FLOAT#RETURN_INT#RETURN_STRING#RETURN_TOK#RETURN_TYPE#RIGHT_ASSIGN#RIGHT_OP#SCANLINE_H#SETFLAGS#SHOWCSYM#SKIPTOK#SKIP_ALL_WHITE_SPACE#SKIP_WHITE_SPACE#STR#SUB_ASSIGN#SWITCH#TAMPERSAND#TASSIGN#TBAR#TCIRC#TCOLON#TCOMMA#TDIV#TDOT#TENDMACRO#TEXCL#TGT#TLBRACE#TLPAREN#TLSQBR#TLT#TMINUS#TMULT#TPERCENT#TPLUS#TPRINTF#TQUEST#TRACE#TRBRACE#TRPAREN#TRSQBR#TSEMI#TTILDE#TYPE_NAME#TYPE_NAME_OR_ID#VA_ARG#VA_DCL#WHILE#XOR_ASSIGN#YYABORT#YYACCEPT#YYBACKUP#YYBISON#YYEMPTY#YYEOF#YYERRCODE#YYERROR#YYFAIL#YYFINAL#YYFLAG#YYINITDEPTH#YYLAST#YYLEX#YYMAXDEPTH#YYNTBASE#YYPARSE_PARAM_ARG#YYPARSE_PARAM_DECL#YYPOPSTACK#YYPRINT#YYPURE#YYRECOVERING#YYSTACK_ALLOC#YYSTATE#YYTERROR#YYTRANSLATE#YY_AT_BOL#YY_BREAK#YY_BUFFER_EOF_PENDING#YY_BUFFER_NEW#YY_BUFFER_NORMAL#YY_BUF_SIZE#YY_CURRENT_BUFFER#YY_DECL#YY_DO_BEFORE_ACTION#YY_END_OF_BUFFER#YY_END_OF_BUFFER_CHAR#YY_EXIT_FAILURE#YY_FATAL_ERROR#YY_FLEX_MAJOR_VERSION#YY_FLEX_MINOR_VERSION#YY_FLUSH_BUFFER#YY_INPUT#YY_MORE_ADJ#YY_NEW_FILE#YY_NO_POP_STATE#YY_NO_PUSH_STATE#YY_NO_TOP_STATE#YY_NULL#YY_NUM_RULES#YY_PROTO#YY_READ_BUF_SIZE#YY_RESTORE_YY_MORE_OFFSET#YY_RULE_SETUP#YY_SC_TO_UI#YY_START#YY_START_STACK_INCR#YY_STATE_EOF#YY_USER_ACTION#abst_typedef#anySym#closeSym#commentSym#const#ctbase_fixUser#ctentry_getArray#ctentry_getBase#ctentry_getKind#ctentry_getPtr#ctentry_isArray#ctentry_isComplex#ctentry_isPlain#ctentry_isPointer#ctentry_setArray#ctentry_setPtr#debugFlag#eqOp#eqSepSym#equationSym#extraArgFlag#globalExtraArgFlag#globalFlag#globalStringFlag#globalValueFlag#idemGlobalFlag#idemSpecialFlag#idemStringFlag#immut_typedef#llassertprint#llassertprintret#logicalOp#mapSym#markerSym#modeFlag#modeValueFlag#openSym#plainFlag#plainSpecialFlag#postSym#preSym#quantifierSym#regStringFlag#selectSym#sepSym#simpleId#simpleOp#specialDebugFlag#specialFlag#specialValueFlag#unput#valueFlag#yy_new_buffer#yy_set_bol#yy_set_interactive#yychar#yyclearin#yyconst#yyerrok#yyerror#yyinput#yyless#yylex#yymore#yynerrs#yyterminate#yytext_ptr
+5|@1|^#g_codeLine#g_prevCodeLine#lsldebug#ylchar#ylnerrs#yyleng
+5|@1|0@0@0@0@1#DBL_DIG#DBL_MANT_DIG#DBL_MAX_10_EXP#DBL_MAX_EXP#DBL_MIN_10_EXP#DBL_MIN_EXP#FLT_DIG#FLT_MANT_DIG#FLT_MAX_10_EXP#FLT_MAX_EXP#FLT_MIN_10_EXP#FLT_MIN_EXP#FLT_ROUNDS#LDBL_DIG#LDBL_MANT_DIG#LDBL_MAX_10_EXP#LDBL_MAX_EXP#LDBL_MIN_10_EXP#LDBL_MIN_EXP#errno
+5|@11|^#yydebug
+16|@1|0@0@0@0@1#FLT_EPSILON#FLT_MAX#FLT_MIN
+17|@1|0@0@0@0@1#DBL_EPSILON#DBL_MAX#DBL_MIN
+18|@1|0@0@0@0@1#LDBL_EPSILON#LDBL_MAX#LDBL_MIN
+23|@1|^#yytext
+23|@1|0@5@2&#g_currentSpecName
+23|@1|0@0@19@3@0#g_localSpecPath
+213|@1|^#g_msgstream
+213|@1|0@0@0@0@1#stderr#stdin#stdout
+213|@1|0@0@18&#yyin#yyout
+315|@1|0@0@0@0@1#environ
+944|@1|^#sort_bool#sort_capBool#sort_char#sort_cstring#sort_double#sort_float#sort_int
+951|@1|0@5@18&#ltoken_and#ltoken_any#ltoken_arrow#ltoken_bool#ltoken_close#ltoken_comment#ltoken_compose#ltoken_eq#ltoken_eqsep#ltoken_equals#ltoken_exists#ltoken_false#ltoken_farrow#ltoken_forall#ltoken_id#ltoken_if#ltoken_implies#ltoken_lbracked#ltoken_marker#ltoken_neq#ltoken_not#ltoken_open#ltoken_or#ltoken_post#ltoken_pre#ltoken_rbracket#ltoken_result#ltoken_select#ltoken_sep#ltoken_true#ltoken_typename
+981|@1|0@5@17&#g_currentloc
+2|@1|^#g_expectingTypeName#g_inTypeDef#g_lslParsingTraits
+983|@1|0@5@2&#g_currentSpec
+983|@1|0@5@19@3@0#g_codeFile#g_prevCodeFile
+2550|@1|0@5@2&#g_currentImports
+3148|@1|0@5@18&#g_importedlslOp#importedlslOp
+3701|@1|0@0@2&#g_symtab
+7341|@1|^#g_cppState
+9620|@1|^#lsllval#yllval
+9620|@11|^#yylval
+16918|@1|^#s_keytable#s_parsetable
+*4 (Function)
+0$$$@0#cppBuffer_get#cppReader_adjustWritten#cppReader_forward#cppReader_getC#cppReader_isC89#cppReader_nullTerminate#cppReader_nullTerminateQ#cppReader_peekC#cppReader_putChar#cppReader_putCharQ#cppReader_puts#cppReader_wcharType#hashStep#makePositive#possibleSumSign
+16979$$$@0#generic_compare
+16054$$$@0#MMASH
+8739$@0@@1@p0,p1$@0#uentry_mergeState
+9930$$$@0#checkPassTransfer
+10965$@0@s1@1@s1$@0#usymtab_popBranches
+11897$$$@0#sRef_aliasCheckPred
+364$@0@g2855@0@0@1@tp0,g2855$@0#qsort
+12770$@0@@1@tp0$@0#docheckChar
+11509$@0@@1@p0,p1$@0#sRef_mergeOptState#sRef_mergeState
+16638$$$@28#exprNode_checkCallModifyVal
+8697$@0@g2869@0@0@1@g2869$@0#uentry_checkMatchParam
+9650$$$@0#setFunctionStateSpecialClause
+12963$$$@0#cstringSList_printSpaced
+12937$$$@0#cstringList_printSpaced
+2034$$$@0#vgenhinterror
+2026$$$@0#voptgenerror2#voptgenerror2n
+14530$$$@0#doDeclareFcn
+8107$$$@0#cppReader_pedwarnWithLine
+8103$$$@0#cppReader_errorWithLine
+14205$$$@0#outputLCSFile
+14998$$$@0#enteringFcnScope
+14209$$$@0#processImport
+15293$@0@s1@1@s1$@0#LCLUpdateToken#LSLUpdateToken
+11651$$$@0#sRef_setLastReference
+11885$@0@@1@p0$@0#sRef_setDerivNullState
+11585$$$@0#sRef_setDefState
+11657$$$@0#sRef_setNullState#sRef_setNullStateInnerComplete
+11593$@0@@1@p0$@0#sRef_setAliasKind
+11591$$$@0#sRef_setAliasKindComplete
+11609$@0@@1@p0$@0#sRef_setExKind
+12343$$$@0#context_exitClause
+10949$@0@s1@1@s1$@0#usymtab_popTrueBranch#usymtab_popTrueExecBranch
+10584$@0@g2869@0@0@1@tg2869$@0#llquietbugaux
+10089$$$@0#cstring_setChar
+10532@6@0@6@0@0@1@g2869@0@0,g2914@0@5@1@tg2869$@0#llbugaux
+10099$$$@0#cstring_replaceLit
+9652$$$@0#setFunctionSpecialClause
+10516$@0@g2869@0@0@1@g2869$@0#llforceerror
+10560$$$@0#genppllerrorhint
+2030$$$@0#noptgenerror#vnoptgenerror
+2024$@0@g2869@0@0,s1@1@tg2869,s1$@0#voptgenerror
+15521$@0@s1@1@tp0,s1$@0#sort_import
+15697$$$@0#symtable_import
+16066$$$@0#mapping_bind
+15670$$$@0#symtable_dump
+15633$$$@0#symtable_enterOp
+10443$$$@0#hashTable_insert
+10447$$$@0#hashTable_replaceKey
+9732$$$@0#checkValueConstant
+8792$$$@0#macrocache_addComment#macrocache_addEntry
+7407$@0@@1@tp0$@0#cppReader_putStrN
+7846$$$@0#cppBuffer_lineAndColumn
+15271$@0@s1@1@s1$@0#LCLSetEndCommentChar
+14060$$$@0#lsetEndCommentChar
+15269$@0@s1@1@s1$@0#LCLSetCharClass
+14058$$$@0#lsetCharClass
+12824$@0@@1@tp1$@0#checkUngetc
+8840$$$@0#qtype_adjustPointers
+14099$$$@0#callLSL
+177@6@0@5@0@0@1@@1@s0$@0#longjmp
+208$@0@@1@p0$@0#va_start
+12796$@0@@1@p0$@0#fputline
+15507$@0@@1@p0$@0#sort_dump
+235$@0@s3@1@s3,tp0,tp1$@0#setbuf
+1042$@0@@1@tp0$@0#checkChar
+707@6@0@5@0@0@1@@1@s0$@0#siglongjmp
+13728$$$@0#termNodeList_addh#termNodeList_addl
+14454$@0@s1@1@s1$@0#LSLAddSyn
+15275$$$@0#LCLAddSyn
+15295$@0@s1@1@s1$@0#LCLSetTokenHasSyn#LSLSetTokenHasSyn
+14712$$$@0#checkBrackets
+10548$$$@0#lclerror#lclfatalerror
+14179$$$@0#checkLclPredicate
+2389$$$@0#ltoken_setCode#ltoken_setIntField#ltoken_setLine
+2370$@0@@1@p0$@0#ltoken_setCol
+2410$$$@0#ltoken_setFileName
+2391$$$@0#ltoken_setRawText#ltoken_setText
+2356$$$@0#ltoken_setDefined#ltoken_setHasSyn
+2393$$$@0#ltoken_setIdType
+11471$@0@@1@p0$@0#sRef_setParamNo
+11109$@0@s1@1@s1$@0#usymtab_addForceMustAlias#usymtab_addMustAlias
+11613$@0@@1@p0$@0#sRef_copyRealDerivedComplete#sRef_copyState#sRef_mergeStateQuiet#sRef_mergeStateQuietReverse
+11777$@0@@1@p0$@0#sRef_setStateFromUentry
+9920$@0@g2869@0@0@1@g2869$@0#checkLocalDestroyed
+11589$@0@@1@p0$@0#sRef_clearAliasState#sRef_kill#sRef_killComplete#sRef_maybeKill#sRef_setAllocated#sRef_setAllocatedComplete#sRef_setAllocatedShallowComplete#sRef_setDefined#sRef_setDependent#sRef_setExposed#sRef_setFresh#sRef_setKept#sRef_setKeptComplete#sRef_setObserver#sRef_setOnly#sRef_setOwned#sRef_setPartial#sRef_setPdefined#sRef_setShared#sRef_setUndefined
+9922$$$@0#checkStructDestroyed#sRef_clearExKindComplete#sRef_setDefNull#sRef_setDefinedComplete#sRef_setDefinedNCComplete#sRef_setDependentComplete#sRef_setNotNull#sRef_setNullUnknown#sRef_setPartialDefinedComplete#sRef_setPosNull
+11319$@0@@1@p0$@0#sRef_setStateFromType
+11747$$$@0#sRef_setType#sRef_setTypeFull
+9658$$$@0#globListAdd
+11855$$$@0#sRef_mergeNullState
+11595$$$@0#sRef_setOrigAliasKind
+12371$$$@0#context_setAliasAnnote
+11141$@1@s1,g2869@0@0@1@tg2869,p0$@0#usymtab_checkDistinctName
+8241$@0@@1@p0$@0#uentry_setParamNo
+8595$$$@0#uentry_setSref
+8717$$$@0#uentry_mergeDefinition#uentry_mergeEntries
+8931$@0@g2869@0@0@1@g2869$@0#specialClauses_checkEqual
+8727$@0@@1@p0,p1$@0#uentry_setState
+8749$$$@0#uentry_checkYieldParam#uentry_copyState#uentry_mergeUses
+16622$$$@28#exprNode_checkFunction
+8251$@0@@1@p0,p1$@0#uentry_setModifies
+8567$$$@0#uentry_setDeclaredForceOnly#uentry_setDeclaredOnly
+8565$@0@@1@p0$@0#uentry_setDeclaredForce
+8571$$$@0#uentry_setDeclared#uentry_setFunctionDefined#uentry_setUsed#uentry_showDefSpecInfo
+8651$@0@g2869@0@0@1@g2869$@0#uentry_showWhereLastExtra#uentry_showWhereSpecifiedExtra
+8585$$$@0#uentry_setName
+8587$$$@0#uentry_setType
+8267$@0@@1@p0$@0#uentry_reflectQualifiers
+8313$$$@0#uentry_setDefState
+8605$$$@0#uentry_setDatatype
+8347$@0@@1@p0$@0#uentry_addAccessType
+8589$@0@@1@p0$@0#uentry_resetParams
+8345$@0@@1@p0$@0#uentry_setGlobals
+8701$$$@0#uentry_mergeConstantValue
+8249$@0@@1@p0$@0#uentry_setSpecialClauses
+8575$@0@@1@p0$@0@2.0.fwhereDefined.tp0,fukind.tp0,funame.tp0,finfo.tp0$#uentry_setDefined
+9802$$$@0#idDecl_addQual
+9804$$$@0#idDecl_setTyp
+16562$$$@0#exprNode_checkMSet#exprNode_checkSet
+9926$$$@0#checkReturnTransfer
+10959$@0@s1@1@s1$@0#usymtab_popAndBranch#usymtab_popOrBranch
+9948$$$@0#checkAssignTransfer#checkInitTransfer#context_exitAndClause#context_exitForClause#context_exitOrClause#context_exitTrueClause#context_exitWhileClause
+16604$$$@28#exprNode_checkModify#exprNode_checkModifyVal
+10961$@0@s1@1@s1$@0#usymtab_exitSwitch
+12265$$$@0#context_exitSwitch
+13335$@0@@1@p0$@0#guardSet_delete
+13435$@0@@1@p0$@0#sRefSet_levelPrune
+16616$$$@28#exprNode_checkAllMods
+10654$@0@@1@p0,p1$@0#aliasTable_clearAliases
+10198$@0@@1@p0$@0#fileloc_subColumn
+1437$@0@@1@p0$@0#fileloc_addColumn#fileloc_addLine#fileloc_setColumn#fileloc_setLineno
+12674$$$@0#printAllFlags
+10498$@0@g2869@0@0@1@g2869$@0#llgenindentmsg#llgenmsg
+10101$@0@@1@p0$@0#cstring_stripChars
+16612$$$@28#exprNode_checkPred
+9660$$$@0#declareCIter
+12481$@1@g2914@0@5@1@g2914$@0#context_setFilename#setFileLine
+12389$@0@s1@1@s1$@0#context_setValueAndFlag
+2038$$$@0#llerrorlit
+12469$$$@0#context_setFlagTemp#context_userSetFlag
+12401$@0@s1@1@s1$@0#context_setString
+1964$@1@g2869@0@0,g2914@0@5@1@g2869$@0#llerror
+10558$$$@0#genppllerror#setStringFlag
+12690$$$@0#setValueFlag
+12463$$$@0#context_fileSetFlag
+15000$$$@0#enteringClaimScope
+13767$@0@@1@p0$@0#ltokenList_addh
+13602$$$@0#sortList_addh
+13719$$$@0#lsymbolList_addh
+13805$@0@@1@p0$@0#pairNodeList_addh
+13857$$$@0#programNodeList_addh
+14512$$$@0#doDeclareConstant
+14516$$$@0#doDeclareVar
+13868$@0@@1@p0$@0#varDeclarationNodeList_addh
+9609$$$@0#declareFcn#declarePrivFcn
+14524$$$@0#doDeclareType
+13632$$$@0#interfaceNodeList_addl
+13641$$$@0#sortSetList_addh
+13696$$$@0#lslOpList_add
+15665$$$@0#symtable_export
+15649$$$@0#symtable_enterType
+15643$$$@0#symtable_enterScope
+13031$$$@0#exprNodeList_addh
+10449$@0@@1@p0$@0#hashTable_remove
+13004$@0@@1@p0$@0#enumNameList_addh
+3930$$$@0#enumNameSList_addh
+13156$$$@0#uentryList_showFieldDifference
+16614$$$@0#exprChecks_checkUsedGlobs
+12989$@0@@1@p0$@0#ctypeList_addh
+9730$$$@0#checkConstant
+4951$$$@0#qtype_setType
+13213$@0@@1@p0$@0#flagMarkerList_add
+10349$$$@0#fileTable_noDelete
+12882$@0@@1@p0$@0#clauseStack_push#clauseStack_removeFirst#clauseStack_switchTop
+7780$$$@0#cppReader_define
+7778$$$@0#cppReader_growBuffer
+8093$$$@0#cppReader_error#cppReader_fatalError#cppReader_pedwarn#cppReader_warning
+8109$$$@0#cppReader_perrorWithName#cppReader_pfatalWithName
+8091$$$@0#cppReader_errorLit#cppReader_pedwarnLit#cppReader_warningLit
+7405$$$@0#cppReader_reserve
+7786$@0@@1@p0,p1$@0@2.0.fopts.tp0,fmax_include_len.tp0$#cppReader_addIncludeChain
+7409$@0@@1@tp0$@0@2.0.p0,tp0,ftoken_buffer.tp0$2.4.flimit.tp0$#cppReader_setWritten
+10184$@0@@1@p0$@0#fileIdList_add
+13078$$$@0#exprNodeSList_addh
+16889$$$@0#yy_init_buffer
+12383$$$@0#context_setCommentMarkerChar
+1479$@1@g2914@0@5@1@g2914$@0#addColumn#setColumn#setLine
+12170$$$@0#context_enterSuppressLine#llexit
+828@6@0@6@0@0@1@@1@s0$@0#_exit#exit
+9846$$$@0#setTagNo
+325$@0@s1@1@s1$@0#srand
+12718$@0@s1@1@s1$@0#sfreeEventually
+12716$@0@@1@tp0$@0#sfree
+1011$$$@0@2.4.p0,tp0$#assertSet
+336$@0@@1@tp0$@0#free
+10528@6@0@6@0@0@0@g2869@0@0@1@g2869$@0#lclfatalbug
+16081$@0@g2869@0@0@1@tg2869$@0#ylerror
+15251$@0@s1@1@s1,p0$@0#LCLScanLine
+2042@6@0@6@0@0$$@0#llbugexitlit#llbuglit#llcontbuglit#llmsglit#lscanLine#lslerror
+12751$@0@@1@tp0$@0#mstring_markFree
+1103$$$@0#mstring_free
+307$@1@g2855@0@0,g2870@0@0,s3@1@s3,tg2870$@0#perror
+210$@0@@1@p0$@0#va_end
+16873$$$@0#yyrestart
+10931$@1@s1@1@p0,s1,tp0$@0#usymtab_load
+13293$@0@s1@1@tp0,s1$@0#typeIdSet_loadTable
+10929$@1@s1@1@tp0$@0#usymtab_dump
+13289$@0@@1@tp0$@0#typeIdSet_dumpTable
+12186$$$@0#context_dumpModuleAccess#context_loadModuleAccess#ctype_dumpTable#ctype_loadTable
+301$@0@@1@tp0$@0#clearerr#rewind
+678$@1@@1@s0$@0#rewinddir
+15050$$$@0#termNode_free
+14834$$$@0#setExposedType
+13756$$$@0#termNodeList_free
+13738$@0@@1@p0$@0#termNodeList_advance#termNodeList_finish#termNodeList_reset
+15132$@0@s1@1@s1$@0#lsymbol_setbool
+14806$$$@0#typeExpr_free
+16005$@0@s1@1@s1$@0#LCLScanFreshToken
+15991$$$@0#LSLGenShiftOnly#ltoken_free
+14010$@0@s1@1@s1$@0#LSLScanFreshToken#lhForwardStruct#lhForwardUnion
+15989$$$@0#LSLGenShift#PrintToken#lclRedeclarationError
+15184$$$@0#ltoken_markOwned
+11745$$$@0#sRef_free
+11853$@0@g2869@0@0@1@g2869$@0#sRef_showAliasInfo#sRef_showNotReallyDefined#sRef_showStateInfo
+11111$@0@s1@1@s1,p0$@0#usymtab_clearAlias
+11849$@0@g2869@0@0@1@g2869$@0#sRef_showExpInfo
+11081$@0@s1@1@s1$@0#usymtab_unguard
+11851$@0@g2869@0@0@1@g2869$@0#sRef_showNullInfo
+11555$@0@@1@p0$@0#sRef_makeSafe#sRef_makeUnsafe
+12301$$$@0#context_usedGlobal#sRef_clearDerived#sRef_clearDerivedComplete#sRef_resetState#sRef_resetStateComplete#sRef_setModified#sRef_setNullError#sRef_showRefKilled#sRef_showRefLost#sRef_showStateInconsistent#sRef_storeState
+5714$@0@@1@p0$@0#sRef_clearAliasKind
+10855$@0@s1@1@s1,p0$@0#usymtab_addGlobalEntry#usymtab_replaceEntry#usymtab_supEntry#usymtab_supEntrySref#usymtab_supGlobalEntry
+8641$$$@0#uentry_free#uentry_freeComplete
+8343$@0@@1@p0$@0#uentry_makeVarFunction
+10073$@0@g2869@0@0@1@g2869$@0#checkParamNames
+10941$@1@s1@1@s1$@0#usymtab_enterFunctionScope
+8929$@0@g2869@0@0@1@p0,g2869$@0#specialClauses_checkAll#uentry_checkName
+8655$@0@g2869@0@0@1@g2869$@0#uentry_showWhereAny#uentry_showWhereDeclared#uentry_showWhereLast#uentry_showWhereLastPlain#uentry_showWhereSpecified
+8573$@0@@1@p0$@0#uentry_clearDefined#uentry_fixupSref#uentry_setAbstract#uentry_setCheckMod#uentry_setChecked#uentry_setCheckedStrict#uentry_setConcrete#uentry_setHasNameError#uentry_setMessageLike#uentry_setMutable#uentry_setPrintfLike#uentry_setRefParam#uentry_setScanfLike#uentry_setUnchecked
+9932$$$@0#checkGlobReturn#checkGlobalName#checkLocalName#checkLoseRef#checkModifiesId#checkParamReturn#checkPrefix#exprChecks_checkExport#setProcessingIterVars#uentry_checkParams#uentry_setExtern#uentry_setParam#uentry_setRefCounted#uentry_setStatic#uentry_showWhereDefined
+5234$$$@0#uentry_setLset#uentry_setNotUsed
+8447$$$@0#uentry_markFree#uentry_markOwned
+12273$$$@0#context_enterConstantMacro
+12227$$$@0#context_enterUnknownMacro
+12279$$$@0#context_enterFunction
+12483$$$@0#context_enterIterDef#context_enterIterEnd#context_enterMacro
+9690$@1@s1@1@$@0#declareFunction#declareStaticFunction
+9790$$$@0#idDecl_free
+9734$$$@0#processNamedDecl
+16296$$$@0#exprNode_free#exprNode_freeShallow
+16626$$$@28#exprNode_checkIterBody#exprNode_checkIterEnd#exprNode_checkMacroBody
+10987$@1@s1@1@s1$@0#usymtab_exitScope#usymtab_switchBranch
+16454$@0@@1@p0$@0#exprNode_produceGuards
+12229$$$@0#context_enterAndClause#context_enterCaseClause#context_enterFalseClause#context_enterForClause#context_enterOrClause#context_enterSwitch#context_enterTrueClause#context_enterWhileClause#context_exitDoWhileClause#context_exitInner#context_exitIterClause#exprNode_checkUseParam
+16620$$$@28#exprNode_checkFunctionBody#exprNode_checkReturn#exprNode_checkStatement
+10969$@0@s1@1@s1$@0#usymtab_altBranch#usymtab_trueBranch
+13361$$$@0#guardSet_free
+11077$@0@s1@1@s1$@0#usymtab_addGuards
+13349$$$@0#guardSet_flip
+13487$@0@@1@p0$@0#sRefSet_free
+9654$$$@0#setFunctionModifies
+13411$@0@@1@p0$@0#sRefSet_clear#sRefSet_clearStatics
+13485$$$@0#sRefSet_fixSrefs
+12379$$$@0#context_recordFileModifies
+10684$$$@0#aliasTable_free
+10686$@0@g2869@0@0@1@g2869$@0#aliasTable_checkGlobs
+10682$$$@0#aliasTable_fixSrefs
+10206$$$@0#fileloc_free#fileloc_reallyFree
+10983$@1@s1@1@s1$@0#usymtab_quietExitScope
+12277$$$@0#context_setFunctionDefined#exprChecks_checkNullReturn
+1439$@0@@1@p0$@0#fileloc_incColumn#fileloc_nextLine#fileloc_setColumnUndefined
+10981$@1@s1,g2869@0@0@1@tg2869$@0#usymtab_checkFinalScope
+15255$@0@s1@1@s1$@0#LCLReportEolTokens
+15995$$$@0#LSLGenInit#LSLReportEolTokens
+1944@6@0@8@0@0$$@0#llassert#llassertfatal
+10526@6@0@6@0@0@1@g2914@0@5,g2870@0@0@1@g2870$@0#llfatalbug
+10480$@1@g2914@0@5,g2869@0@0@1@g2869$@0#llhint
+1998@6@0@6@0@0@1@g2869@0@0,g2914@0@5@1@tg2869$@0#llbug
+14159$@0@s1@1@s1$@0#lhOutLine
+10538@6@0@6@0@0@1@g2914@0@5,g2870@0@0@1@g2870$@0#llfatalerrorLoc
+10472$@0@g2870@0@0@1@g2870$@0#lldiagmsg
+10578$@1@g2869@0@0,g2914@0@5@1@g2869$@0#llparseerror
+2004$@0@g2869@0@0@1@tg2869$@0#llcontbug
+10554@6@0@6@0@0@0@g2869@0@0@1@g2869$@0#lclplainfatalerror
+2002$@0@g2869@0@0@1@tg2869$@0#llquietbug
+10536@6@0@6@0@0@0@g2869@0@0@1@g2869$@0#llfatalerror#llgloberror#llmsg#llmsgplain
+12152$$$@0#context_addComment#context_addMacroCache#context_setMessageAnnote#cstring_free#lclbug#lclplainerror#llgenindentmsgnoloc#loadllmsg#pplldiagmsg#ppllerror
+12209$$$@0#context_setMode#cppAddIncludeDir#cppDoDefine#cppDoUndefine#dumpState#loadState#resetImports
+10127$@0@@1@p0$@0#cstring_markOwned
+10476$@0@g2869@0@0@1@g2869$@0#flagWarning
+1485$@1@g2914@0@5@1@g2914$@0#setSpecFileId
+12587$$$@0#context_setFileId
+9636$@0@s1@1@s1$@0#setSpecialFunction
+11191$$$@0@2.3.floc.p0$#lltok_release
+12967$$$@0#cstringSList_free
+12969$$$@0#cstringSList_alphabetize
+12941$$$@0#cstringList_free
+12943$$$@0#cstringList_alphabetize
+12397$@0@s1@1@s1$@0#context_decCounter#context_incCounter#context_setLibrary
+12654$$$@0#flagcode_recordError#flagcode_recordSuppressed
+12670$@0@g2869@0@0@1@g2869$@0#printCategory
+10305$$$@0#tsource_free
+14157$@1@s1,s3@1@s1,s3$@0#lhInit
+16012$@0@s1@1@s1$@0#LCLScanReset#LSLScanReset
+13206$$$@0#qualList_free
+13188$$$@0#qualList_clear
+16058$$$@0#mapping_free
+15066$$$@0#paramNode_free
+13850$$$@0#paramNodeList_free
+13787$$$@0#ltokenList_free
+13773$@0@@1@p0$@0#ltokenList_advance#ltokenList_removeCurrent#ltokenList_reset
+15056$$$@0#importNode_free
+13920$$$@0#importNodeList_free
+13612$$$@0#sortList_free
+13606$$$@0#sortList_advance#sortList_reset
+13721$$$@0#lsymbolList_free
+13517$$$@0#lsymbolSet_free
+13583$$$@0#sortSet_free
+15062$$$@0#pairNode_free
+13809$$$@0#pairNodeList_free
+15038$$$@0#declaratorInvNode_free
+13623$$$@0#declaratorInvNodeList_free
+2658$$$@0#abstDeclaratorNode_free
+15032$$$@0#declaratorNode_free
+14620$$$@0#declareForwardType
+13666$$$@0#declaratorNodeList_free
+15092$$$@0#varNode_free
+13883$$$@0#varNodeList_free
+15072$$$@0#quantifierNode_free
+13898$$$@0#quantifierNodeList_free
+15078$$$@0#storeRefNode_free
+13713$$$@0#storeRefNodeList_free
+15060$$$@0#letDeclNode_free
+13677$$$@0#letDeclNodeList_free
+15068$$$@0#programNode_free
+13861$$$@0#programNodeList_free
+15058$$$@0#initDeclNode_free
+13596$$$@0#initDeclNodeList_free
+9603$$$@0#declareConstant#declarePrivConstant
+15088$$$@0#varDeclarationNode_free
+9613$$$@0#declarePrivVar#declareVar
+13872$$$@0#varDeclarationNodeList_free
+2908$$$@0#globalList_free
+15036$$$@0#fcnNode_free
+13833$$$@0#fcnNodeList_free
+14526$$$@0#declareIter
+15082$$$@0#stDeclNode_free
+13690$$$@0#stDeclNodeList_free
+9615$$$@0#declarePrivType#declareType
+15086$$$@0#typeNameNode_free
+13820$$$@0#typeNameNodeList_free
+15030$$$@0#sigNode_free
+14742$$$@0#sigNode_markOwned
+13538$$$@0#sigNodeSet_free
+14992$$$@0#signNode_free
+15024$$$@0#nameNode_free
+15028$$$@0#lslOp_free
+13563$$$@0#lslOpSet_free
+15074$$$@0#replaceNode_free
+13909$$$@0#replaceNodeList_free
+15084$$$@0#traitRefNode_free
+13798$$$@0#traitRefNodeList_free
+15104$$$@0#interfaceNode_free
+14103$$$@0#readlsignatures
+13634$$$@0#interfaceNodeList_free
+14161$@0@s1@1@s1$@0#lhExternals
+13653$$$@0#sortSetList_free
+13645$$$@0#sortSetList_advance#sortSetList_reset
+13700$$$@0#lslOpList_free
+15606$$$@0#varInfo_free
+15610$$$@0#symtable_free
+15645$$$@0#symtable_exitScope#symtable_printStats
+13051$$$@0#exprNodeList_free#exprNodeList_freeShallow
+13035$$$@0#exprNodeList_advance#exprNodeList_reset
+10422$$$@0#hashTable_free
+13182$$$@0#filelocList_free
+13022$$$@0#enumNameList_free
+13024$$$@0#enumNameSList_free
+9700$$$@0#setStorageClass
+10828$@0@s1@1@s1$@0#usymtab_setExitCode
+12215$$$@0#context_addFileAccessType#context_removeFileAccessType
+13391$$$@0#usymIdSet_free
+13114$$$@0#uentryList_free
+13144$@0@@1@p0$@0#uentryList_advanceSafe#uentryList_clear#uentryList_fixMissingNames#uentryList_reset
+13122$$$@0#uentryList_fixImpParams
+9674$$$@0#setCurrentParams
+13256$$$@0#globSet_free
+13242$$$@0#globSet_clear
+12381$$$@0#context_recordFileGlobals
+12993$@0@@1@p0$@0#ctypeList_free
+8816$$$@0#qtype_free#setProcessingTypedef#setProcessingVars
+11183$$$@0#multiVal_free
+8921$$$@0#specialClauses_free
+13238$$$@0#idDeclList_free
+12983$$$@0#sRefSetList_free
+12981$$$@0#sRefSetList_clear
+10627$$$@0#flagMarker_free
+13221$$$@0#flagMarkerList_free
+13215$@0@g2869@0@0@1@g2869$@0#flagMarkerList_checkSuppressCounts
+8784$$$@0#macrocache_free
+8802$$$@0#macrocache_processUndefinedElements
+10393$$$@0#fileTable_free
+10391$@0@s3@1@s3$@0#fileTable_cleanup
+10336$@0@g2869@0@0@1@g2869$@0#fileTable_printTemps
+10607$$$@0#messageLog_free
+12898$$$@0#clauseStack_free
+12896$@0@@1@p0$@0#clauseStack_clear#clauseStack_pop
+7963$@0@@1@p0$@0#cppReader_initializeReader
+7948$$$@0#cppCleanup#cppReader_finish#cppReader_skipRestOfLine
+7944$$$@0#cppReader_init
+8065$@0@s1@1@s1,tp0$@0#cppReader_deleteMacro
+7790$$$@0#cppOptions_init
+10188$@0@@1@p0$@0#fileIdList_free
+10724$@0@@1@p0$@0#sRefTable_free
+10718$@0@@1@p0$@0#sRefTable_clear
+12921$$$@0#filelocStack_free
+12919$@0@g2869@0@0@1@g2869$@0#filelocStack_printIncludes
+12911$@0@@1@p0$@0#filelocStack_clear
+13278$$$@0#intSet_free
+13086$$$@0#exprNodeSList_free
+16884$$$@0#yy_delete_buffer#yy_flush_buffer#yy_switch_to_buffer
+72@6@0@8@0@0@1@@1@s0$@0#assert
+1477$@1@g2914@0@5@1@g2914$@0#beginLine#decColumn#decLine#incLine
+14153$@0@s1,s3@1@s1,s3$@0#lhCleanup
+1469$@1@g2914@0@5@1@g2914$@0#incColumn
+11135$@1@s1,g2872@0@0@1@g2872$@0#usymtab_printLocal
+2006$@1@g2869@0@0,g2914@0@5,s1@1@g2869,s1$@0#cleanupMessages
+4434$@1@s1,g2869@0@0@1@g2869$@0#usymtab_printTypes
+4613$@1@s1,g2872@0@0@1@tg2872$@0#usymtab_printComplete
+10971$@1@s1,g2869@0@0@1@tg2869$@0#usymtab_allDefined
+10468$@0@s1,g2869@0@0@1@s1,g2869$@0#closeMessage#prepareMessage
+10586$@0@s3@1@s3$@0#llflush
+10977$@1@s1,g2869@0@0@1@tg2869$@0#usymtab_allUsed#usymtab_displayAllUses#usymtab_printAll#usymtab_printGuards#usymtab_printOut
+16014$@0@s1@1@s1$@0#LCLScanCleanup#LCLScanInit#LCLScanLineCleanup#LCLScanLineInit#LCLScanLineReset
+12172$@0@g2869@0@0@1@g2869$@0#context_checkSuppressCounts#sort_printStats
+14019$@0@s1@1@s1$@0#LSLScanCleanup#LSLScanInit#context_clearInCommandLine#context_clearPreprocessing#context_destroyMod#context_enterDoWhileClause#context_enterFunctionDecl#context_exitFunctionDecl#context_exitInnerPlain#context_hasError#context_initMod#context_processedSpecLine#context_resetSpecLines#context_setInCommandLine#context_setPreprocessing#exprNode_destroyMod#exprNode_initMod#lhIncludeBool#lsymbol_destroyMod#lsymbol_initMod#lsynTableCleanup#lsynTableInit#lsynTableReset#ltokenTableCleanup#ltokenTableInit#macrocache_finalize#sRef_clearGlobalScope#sRef_clearProtectDerivs#sRef_destroyMod#sRef_protectDerivs#setArgsUsed#sort_destroyMod#sort_init#typeIdSet_destroyMod#typeIdSet_initMod#uentry_destroyMod#usymtab_enterFile#usymtab_enterScope#usymtab_exitFile#usymtab_exportHeader#usymtab_exportLocal#usymtab_free#usymtab_initBool#usymtab_initMod#usymtab_popCaseBranch#usymtab_prepareDump#usymtab_quietPlainExitScope#usymtab_setMustBreak
+14622$$$@0#LCLBuiltins#LCLProcessInitFile#LCLProcessInitFileCleanup#LCLProcessInitFileInit#LCLProcessInitFileReset#LCLSynTableCleanup#LCLSynTableInit#LCLSynTableReset#LCLTokenTableCleanup#LCLTokenTableInit#LSLProcessInitFile#LSLProcessInitFileInit#abstract_init#checkDoneParams#checkParseError#clearCurrentParams#clearProcessingGlobMods#context_addBoolAccess#context_clearAliasAnnote#context_clearJustPopped#context_clearMessageAnnote#context_enterFile#context_enterImport#context_enterInnerContext#context_enterIterClause#context_enterLCLfile#context_enterMacroFile#context_enterStructInnerContext#context_enterSuppressRegion#context_exitAllClauses#context_exitFile#context_exitFunction#context_exitInnerSafe#context_exitLCLfile#context_exitMacroCache#context_exitStructInnerContext#context_exitSuppressRegion#context_hideShowscan#context_incLineno#context_leaveImport#context_popLoc#context_processAllMacros#context_pushLoc#context_quietExitFunction#context_releaseVars#context_resetAllFlags#context_resetErrors#context_resetMacroMissingParams#context_resetModeFlags#context_returnFunction#context_saveLocation#context_setMacroMissingParams#context_setNeednl#context_setProtectVars#context_setShownFunction#context_sizeofReleaseVars#context_unhideShowscan#cppReader_hashCleanup#cppReader_initMod#cppReader_initialize#cppReader_restoreHashtab#cppReader_saveDefinitions#cppReader_saveHashtab#ctype_destroyMod#ctype_initTable#ctype_printTable#doVaDcl#doneParams#enterParamsTemp#exitParamsTemp#exprChecks_checkEmptyMacroBody#flags_initMod#importCTrait#listAllCategories#lscanLineCleanup#lscanLineInit#lscanLineReset#lsymbol_printStats#nextIterParam#printAlphaFlags#printCodePoint#sRef_clearGlobalScopeSafe#sRef_enterFunctionScope#sRef_exitFunctionScope#sRef_setGlobalScope#sRef_setGlobalScopeSafe#setCodePoint#setFlipOldStyle#setFunctionNoGlobals#setNewStyle#setProcessingGlobMods#setProcessingGlobalsList#showHerald#storeLoc#summarizeErrors#swallowMacro#uentry_checkDecl#uentry_clearDecl#unsetProcessingGlobals#unsetProcessingTypedef#unsetProcessingVars
+826$@1@g2875@0@0,s1@1@s1$@0#tzset
+338@6@0@6@0@0@1@@1@s0$@0#abort
+9296$$$@0#cttable_print
+16752$$$@0#yy_load_buffer_state
+747$@1@@1@s0$@0#S_ISBLK#S_ISCHR#S_ISDIR#S_ISFIFO#S_ISREG
+10079$$$@0#cstring_getChar
+12808$@1@@1@s0$@0#char_fromInt
+12761$@0@@1@tp0$@0#loadChar
+10091$@1@@1@s0$@0#cstring_lastChar
+10077$$$@0#cstring_firstChar#cstring_secondChar
+11161$@1@@1@s0$@0#multiVal_forceChar
+12385$$$@0#context_getCommentMarkerChar
+237$@0@s3@1@s3,tp0,tp1$@0#setvbuf
+423$@0@@1@tp0$@0#vswprintf
+415@6@0@1@1@0@0@@1@tp0$@0#swprintf
+824$@0@g2855@0@0@1@g2855$@0#tcsetattr
+684$@0@g2855@0@0@1@g2855$@0#fcntl
+721$@0@g2855@0@0,s1@1@tp2,g2855,s1$@0#sigaction
+736$@0@g2855@0@0,s1@1@tp2,g2855,s1$@0#sigprocmask
+590$@1@@1@s0$@0#memcmp
+8057$$$@0#hashf
+686$@0@g2855@0@0@1@g2855$@0#open
+596$@1@@1@s0$@0#strncmp
+850@6@0@5@0@0@0@g2855@0@0@1@g2855$@0#execl#execle#execlp
+836$@0@s3,g2855@0@0@1@s3,g2855$@0#chown
+860@6@0@5@0@0@0@g2855@0@0@1@g2855$@0#execve
+259$@0@@1@tp0,p2$@0#vsprintf
+253@6@0@1@2@0@1@@1@s0$@0#sscanf
+293$@0@s3,g2855@0@0@1@s3,tp0,g2855$@0#fseek
+255$@0@s3,g2855@0@0@1@s3,tp0,p2,g2855$@0#vfprintf
+243@6@0@1@2@0@0@s3@1@s3,tp0$@0#fscanf
+421$@0@s3@1@s3,tp0$@0#vfwprintf
+394@6@0@1@1@0@0@s3@1@tp0,s3$@0#fwprintf
+396@6@0@1@2@0@0@s3@1@tp0,s3$@0#fwscanf
+455$@1@@1@s0$@0#wcsncmp#wmemcmp
+417@6@0@1@2@0@0@g2871@0@0@1@tg2871$@0#swscanf
+562$@0@@1@tp0$@0#mbtowc
+7820$$$@0#cppReader_checkMacroName
+16687$@1@g2914@14@5,g2868@13@0,g2918@14@5,g2867@14@5,g2873@14@0,g2869@12@0,s1,s3@1@g2914,g2868,g2918,g2867,g2873,s1,s3$@0#main
+1105$@1@@1@s0$@0#int_compare
+846$@0@g2855@0@0,s3@1@g2855,s3$@0#dup2
+816$@0@g2855@0@0@1@g2855$@0#tcflow#tcflush#tcsendbreak
+921$@0@g2855@0@0,s1@1@g2855,s1$@0#tcsetpgrp
+760$@0@g2855@0@0@1@g2855,tp1$@0#fstat
+820$@0@g2855@0@0@1@g2855,tp1$@0#tcgetattr
+878$@0@g2855@0@0@1@g2855,ap1$@0#getgroups
+12828$@0@g2855@0@0@1@g2855,tp1$@0#stat
+830$@0@g2855@0@0@1@g2855$@0#access
+893$@0@g2855@0@0,s3@1@g2855,s3$@0#link#rename
+592$@1@@1@s0$@0#strcmp#strcoll
+560$@1@@1@s0$@0#mblen
+257$@1@g2872@0@0,s3@1@s3,p1,tg2872$@0#vprintf
+269$@0@s3@1@s3,tp1$@0#fputs
+757$@0@s3,g2855@0@0@1@s3,g2855$@0#chmod#mkdir#mkfifo
+682$@0@g2855@0@0@1@g2855$@0#creat
+858@6@0@5@0@0@0@g2855@0@0@1@g2855$@0#execv#execvp
+933$@0@s3,g2855@0@0@1@s3,g2855$@0#utime
+248@6@0@1@2@0@1@g2871@0@0,s3@1@s3,tg2871$@0#scanf
+564$@0@@1@tp0$@0#wctomb
+392$@1@@1@s0$@0#fwide
+295$@0@s3,g2855@0@0@1@s3,tp0,g2855$@0#fsetpos
+291$@0@g2855@0@0@1@tp1,g2855$@0#fgetpos
+425$@0@s3,g2872@0@0@1@s3,tg2872$@0#vwprintf
+390$@0@s3@1@s3,tp1$@0#fputws
+436$@1@@1@s0$@0#wcscmp#wcscoll
+503@6@0@1@2@0@1@g2871@0@0,g2855@0@0@1@g2855,tg2871$@0#wscanf
+501@6@0@1@1@0@1@g2872@0@0,g2855@0@0@1@g2855,tg2872$@0#wprintf
+718@6@0@5@0@0@0@g2855@0@0@1@g2855$@0#kill
+909$@0@g2855@0@0,s1@1@g2855,s1$@0#setpgid
+709$@0@@1@p0$@0#sigsetjmp
+724$@0@g2855@0@0@1@tp0,g2855$@0#sigaddset#sigdelset
+732$@0@g2855@0@0@1@g2855$@0#sigismember
+11411$@1@@1@s0$@0#sRef_compare
+8413$$$@0#uentry_compare#uentry_compareStrict
+13319$$$@0#typeIdSet_compare
+13499$@1@@1@s0$@0#sRefSet_compare
+10214$@1@@1@s0$@0#fileloc_compare
+1264$@1@@1@s0$@0#bool_compare
+10125$@1@@1@s0$@0#cstring_compare
+7555$$$@0#cppProcess
+9379$@1@@1@s0$@0#ctype_compare
+10123$@1@@1@s0$@0#cstring_xcompare
+10690$@1@@1@s0$@0#ynm_compare
+1320$@1@@1@s0$@0#fileId_compare
+10445$$$@0#hashTable_lookup
+9988$@1@@1@s0$@0#nstate_compare
+13399$$$@0#usymIdSet_compare
+13110$@1@@1@s0$@0#uentryList_lookupRealName
+13128$@1@@1@s0$@0#uentryList_compareFields#uentryList_compareParams#uentryList_compareStrict
+13264$$$@0#globSet_compare
+11181$@1@@1@s0$@0#multiVal_compare
+8407$@1@@1@s0$@0#uentry_xcomparealpha#uentry_xcompareuses
+8019$$$@0#cppReader_parseEscape
+7966$$$@0#cppReader_startProcess
+267$@0@s3,g2855@0@0@1@s3,tp1,g2855$@0#fputc#ungetc
+278$@0@s3@1@s3,tp1$@0#putc
+12798$@1@@1@s0$@0#int_log#isatty
+838$@0@s3,g2855@0@0,s1@1@s3,g2855,s1$@0#close
+848$@0@g2855@0@0,s3@1@g2855,s3$@0#dup
+814$@0@g2855@0@0@1@g2855$@0#tcdrain
+780$@1@@1@s0$@0#WEXITSTATUS#WIFEXITED#WIFSIGNALED#WIFSTOPPED#WSTOPSIG#WTERMSIG#abs
+205@6@0@5@0@0$$@0#raise
+12812$@1@@1@s0$@0#long_toInt
+12810$@1@@1@s0$@0#longUnsigned_toInt
+12866$@0@s3,g2855@0@0@1@s3,g2855$@0#unlink
+12864$@0@s3@1@s3$@0#osd_system#osd_unlink
+12862$@0@s3@1@s3$@0#system
+1089$@1@@1@s0$@0#mstring_length
+215$@0@s3,g2855@0@0@1@s3,g2855$@0#remove
+282$@1@g2872@0@0,s3@1@s3,tg2872$@0#puts
+215$@0@s3,g2855@0@0@1@s3,g2855$@0#rmdir
+834$@0@g2855@0@0@1@g2855$@0#chdir
+311$@1@@1@s0$@0#atoi
+901$@0@g2855@0@0@1@g2855$@0#pipe
+12804$@1@@1@s0$@0#size_toInt
+485$@1@@1@s0$@0#wctob
+175$@0@@1@p0$@0#setjmp
+303$@0@g2855@0@0@1@g2855$@0#fileno
+225$@0@g2855@0@0,s3@1@tp0,g2855,s3$@0#fclose#fgetc
+303$@0@g2855@0@0@1@g2855$@0#feof#ferror
+271$@0@s3@1@s3,tp0$@0#getc
+227$@0@g2855@0@0,s3@1@tp0,g2855,s3$@0#fflush
+12759$@0@@1@tp0$@0#getInt
+346$@0@s1@1@s1$@0#atexit
+407$@1@@1@s0$@0#mbsinit
+907$@0@g2855@0@0,s1@1@g2855,s1$@0#setgid
+768$@0@s1@1@s1$@0#umask
+913$@0@g2855@0@0,s1@1@g2855,s1$@0#setuid
+669$@0@g2855@0@0@1@g2855$@0#closedir
+738$@0@g2855@0@0,s1@1@g2855,s1$@0#sigsuspend
+728$@0@g2855@0@0@1@tp0,g2855$@0#sigemptyset#sigfillset#sigpending
+778$@0@g2855@0@0@1@tp0,g2855$@0#uname
+810$@0@@1@tp0$@0#cfsetispeed#cfsetospeed
+3302$$$@0#termNodeList_size
+11477$@1@@1@s0$@0#sRef_getIndex#sRef_getParam#sRef_getScope#sRef_lexLevel
+10989$@1@s1@1@$@20#uentry_directParamNo
+13477$@1@@1@s0$@0#sRefSet_size
+4394$$$@0#aliasTable_size
+10268$@1@@1@s0$@0#fileloc_column#fileloc_lineno
+1268$@1@@1@s0$@0#bool_toInt
+10136$@1@@1@s0$@0#cstring_length#cstring_toPosInt
+14081$$$@0#parseSignatures
+1773$@1@@1@s0$@0#lltok_getTok
+1808$@1@@1@s0$@0#cstringSList_size
+1838$@1@@1@s0$@0#cstringList_size
+12393$@1@@1@s0$@0#context_getCounter#context_getValue#flagcode_stringIndex#flagcode_valueIndex
+12658$$$@0#flagcode_numReported
+2115$$$@0#qualList_size
+2299$$$@0#paramNodeList_size
+2438$@1@@1@s0$@0#ltokenList_size
+2572$$$@0#sortSet_size
+2631$$$@0#declaratorInvNodeList_size
+2935$$$@0#fcnNodeList_size
+2978$$$@0#stDeclNodeList_size
+3057$$$@0#typeNameNodeList_size
+3109$@1@@1@s0$@0#sigNodeSet_size
+3163$@1@@1@s0$@0#lslOpSet_size
+3194$$$@0#replaceNodeList_size
+3351$$$@0#sortSetList_size
+3772$@1@@1@s0$@0#exprNodeList_size
+13178$@1@@1@s0$@0#filelocList_realSize
+3863$@1@@1@s0$@0#filelocList_size
+3893$$$@0#enumNameList_size
+3922$@1@@1@s0$@0#enumNameSList_size
+4186$@1@@1@s0$@0#ekind_toInt
+4242$$$@0#usymIdSet_size
+13146$@1@@1@s0$@0#uentryList_size
+4330$$$@0#globSet_size
+4369$@1@@1@s0$@0#ctypeList_size
+4677$$$@0#ctkind_toInt
+5134$@1@@1@s0$@0#specialClauses_size
+10623$@1@@1@s0$@0#flagMarker_getCount
+12892$@1@@1@s0$@0#clauseStack_controlDepth#clauseStack_size
+7977$@1@@1@s0$@0#cppBufPeek
+10186$$$@0#fileIdList_size
+12917$$$@0#filelocStack_includeDepth
+12046$@1@@1@s0$@0#filelocStack_size
+12073$$$@0#intSet_size
+280$@1@g2872@0@0,s3@1@s3,tg2872$@0#putchar
+1467$@1@g2914@0@5@1@$@0#currentColumn
+12515$@1@s1@1@$@0#context_numErrors
+12521$@1@@1@s0$@0#context_getExpect#context_getLCLExpect#context_getLimit#context_getLineLen#context_getLinesProcessed#context_getSpecLinesProcessed#lclNumberErrors
+9345$$$@0#ctype_count#iterParamNo#lsllex#lslparse#osd_getPid#ylparse#yyparse#yywrap
+323$@0@s1@1@s1$@0#rand
+899$@0@g2855@0@0@1@g2855$@0#pause
+273$@1@g2871@0@0,s3@1@s3,tg2871$@0#getchar
+9043$$$@0#cttable_lastIndex
+832$@0@s1@1@s1$@0#alarm
+915$@1@@1@s0$@0#sleep
+2372$@1@@1@s0$@0#ltoken_getCode#ltoken_getIntField
+2368$$$@0#ltoken_getCol#ltoken_getLine
+2100$@1@@1@s0$@0#tsource_thisLineNumber
+319$@0@g2855@0@0@1@tp1,g2855$@0#strtol
+479$@0@@1@tp1$@0#wcstol
+866$@0@g2855@0@0@1@g2855$@0#fpathconf
+897$@0@g2855@0@0@1@g2855$@0#pathconf
+917$@0@g2855@0@0@1@g2855$@0#sysconf
+373$@1@@1@s0$@0#labs
+313$@1@@1@s0$@0#atol
+12806$@1@@1@s0$@0#size_toLong
+297$@0@g2855@0@0@1@g2855$@0#ftell
+11159$@1@@1@s0$@0#multiVal_forceInt
+8027$$$@0#cppReader_parseExpression
+321$@0@g2855@0@0@1@tp1,g2855$@0#strtoul
+481$@0@@1@tp1$@0#wcstoul
+12800$@1@@1@s0$@0#longUnsigned_fromInt
+152$@0@g2855@0@0@1@g2855$@0#ldexp
+160$@0@g2855@0@0@1@g2855$@0#pow
+142$@1@@1@s0$@0#atan2#fmod
+154$@0@@1@tp1$@0#frexp
+170$@0@@1@tp1$@0#modf
+317$@0@g2855@0@0@1@tp1,g2855$@0#strtod
+474$@0@@1@tp1$@0#wcstod
+636$@1@@1@s0$@0#difftime
+138$@0@g2855@0@0@1@g2855$@0#acos#asin#cosh#exp#log#log10#sqrt
+140$@1@@1@s0$@0#atan#ceil#cos#fabs#floor#sin#sinh#tan#tanh
+309$@1@@1@s0$@0#atof
+12763$@0@@1@tp0$@0#getDouble
+11163$@1@@1@s0$@0#multiVal_forceDouble
+358@6@5@1@0@0@1@@1@s0@18@0@0#bsearch
+12729@4@2@1@0@0$@2@0@0#direalloc
+12726$$@2@0@0#dicalloc
+601@6@5@1@0@0@1@@1@s0@3@0@0#memchr
+12723@4@0@1@0@0$@2@0@0#dimalloc
+1280$@0@@1@tp0@2@0@0@2.3.p0$#drealloc
+334@6@5@1@0@0@0@@1@tp0@2@0@0#realloc
+328@6@5@1@0@0@1@@1@s0@2@0@0#calloc
+1283@4@0@1@0@0@1@@1@s0@2@0@0#dmalloc
+331@4@5@1@0@0@1@@1@s0@2@0@0#malloc
+264@6@5@1@0@0@0@s3,g2855@0@0@1@s3,tp0,tp2,g2855$@0#fgets
+124@6@5@1@0@0@0@s1,g2855@0@0@1@s1,g2855@19@3@0#setlocale
+12785$$@3@0@0#mstring_append
+12779$@0@@1@tp0,tp1@3@0@0#mstring_concatFree
+12782$$@3@0@0#mstring_concatFree1
+12741$@1@@1@s0@3@0@0#removeExtension
+12776$@1@@1@s0@3@0@0#mstring_concat
+12757$$@3@0@0#addExtension
+12838$@1@@1@s0@19@3@0#osd_getEnvironment
+10321$@0@@1@tp1@3@0@0#specFullName
+609@6@5@1@0@0@1@@1@s0@19@2@0#strpbrk
+604@6@5@1@0@0@1@@1@s0@19@2@0#strchr#strrchr
+620@6@5@1@0@0@0@s1,g2855@0@0@1@tp0,s1,g2855@19@2@0#strtok
+617@6@5@1@0@0@1@@1@s0@19@2@0#strstr
+869$@0@g2855@0@0@1@g2855,tp0$@0#getcwd
+12794@6@2@1@0@0@1@@1@s0@2@0@0#mstring_create
+12732$@1@@1@s0@3@0@0#FormatInt#mstring_spaces
+627$@1@@1@s0@19@3@0#strerror
+924@6@5@1@0@0@0@g2855@0@0@1@g2855@19@3@0#ttyname
+12749$@1@@1@s0@3@0@0#removePathFree
+12835$@1@@1@s0@2@0@0#LSLRootName
+12754$@1@@1@s0@3@0@0#removeAnyExtension#removePath
+12822$$@19@2@0#removePreDirs
+12860@6@5@1@0@0$@19@3@0#osd_getEnvironmentVariable
+12819@6@5@1@0@0@1@@1@s0@19@3@0#filenameExtension
+12788$@1@@1@s0@3@0@0#mstring_copy
+12791@6@2@1@0@0@1@@1@s0@19@3@0#mstring_safePrint
+349@6@5@1@0@0@1@@1@s0@19@3@0#getenv
+276@6@5@1@0@0@1@g2871@0@0,s3,g2855@0@0@1@s3,tp0,tg2871,g2855@3@0@0#gets
+844$@0@@1@tp0@3@0@0#cuserid
+841$@0@s1@1@tp0,s1$@0#ctermid
+223$@0@s1@1@tp0,s1@19@3@0#tmpnam
+12766@6@5@1@0@0@0@@1@tp0@2@0@0#getWord
+644$@0@g2855@0@0@1@g2855@19@3@0#asctime
+647$@1@@1@s0@19@3@0#ctime
+15532$@1@@1@s0@19@3@0#sort_getName
+16036$@1@@1@s0@19@2@0#lsymbol_toCharsSafe
+16039@6@5@1@0@0@1@@1@s0@19@2@0#lsymbol_toChars
+2402$@1@@1@s0@19@3@0#ltoken_getRawTextChars
+2379$@1@@1@s0@19@2@0#ltoken_getTextChars
+1211@6@2@1@0@0$@19@2@0#cstring_toCharsSafeO
+10134@6@2@1@0@0@1@@1@s0@19@2@0#cstring_toCharsSafe
+10314@6@5@1@0@0@0@@1@tp0@18@0@0#tsource_nextLine
+2096$@1@@1@s0@19@3@0#tsource_fileName
+7403$@1@@1@s0@19@2@0#cppReader_getPWritten
+1101@6@2@1@0@0@1@@1@s0@2@0@0#mstring_createEmpty
+6929$@1@@1@s0@19@3@0#context_selectedLibrary
+7593@6@5@1@0@0@1@@1@s0@19@3@0#osd_getHomeDir
+881$@1@@1@s0@19@3@0#getlogin
+288$@0@s3,g2855@0@0@1@s3,tp3,g2855$@0#fwrite
+286$@0@s3,g2855@0@0@1@s3,tp0,tp3,g2855$@0#fread
+467$@0@@1@tp1$@0#wcsrtombs
+655$@0@@1@tp0$@0#strftime
+405$@0@@1@tp0$@0#mbrtowc
+409$@0@@1@tp0$@0#mbsrtowcs
+447$@0@@1@tp0$@0#wcsftime
+403$@1@@1@s0$@0#mbrlen
+568$@0@@1@tp0$@0#wcstombs
+598$@0@@1@tp0$@0#strxfrm
+427$@0@@1@tp0$@0#wcrtomb
+483$@0@@1@tp0$@0#wcsxfrm
+566$@0@@1@tp0$@0#mbstowcs
+606$@1@@1@s0$@0#strcspn#strspn
+443$@1@@1@s0$@0#wcscspn#wcsspn
+12802$@1@@1@s0$@0#size_fromInt
+629$@1@@1@s0$@0#strlen
+449$@1@@1@s0$@0#wcslen
+7400$@1@@1@s0$@0#cppReader_getWritten
+928$@0@g2855@0@0@1@g2855$@0#write
+903$@0@g2855@0@0@1@g2855,tp1$@0#read
+388$@0@s3@1@s3,tp1$@0#fputwc
+411$@0@s3@1@s3,tp1$@0#putwc
+419$@0@s3@1@s3,tp1$@0#ungetwc
+380$@1@@1@s0$@0#btowc
+413$@0@s3,g2872@0@0@1@s3,tg2872$@0#putwchar
+382$@0@s3@1@s3,tp0$@0#fgetwc
+398$@0@s3@1@s3,tp0$@0#getwc
+400$@0@s3,g2871@0@0@1@s3,tg2871$@0#getwchar
+128$@1@@1@s0@3@0@0#localeconv
+233@6@5@1@0@0@0@s3,g2855@0@0@1@tp2,s3,g2855@3@0@0#freopen
+741@6@5@1@0@0@0@g2855@0@0,s3@1@g2855,s3@18@0@0#fdopen
+230@6@5@1@0@0@0@s3@1@s3@18@0@0#fopen
+220@6@5@1@0@0@0@s3@1@s3@3@0@0#tmpfile
+371$@1@@1@s0$@0#div
+378$@1@@1@s0$@0#ldiv
+488@6@5@1@0@0@1@@1@s0@3@0@0#wmemchr
+386@6@5@1@0@0@0@s3@1@s3,tp0,tp2$@0#fgetws
+499$@0@@1@tp0$@0#wmemset
+493$@0@@1@tp0$@0#wmemcpy#wmemmove
+477@6@5@1@0@0@0@@1@tp2@3@0@0#wcstok
+472@6@5@1@0@0@1@@1@s0@3@0@0#wcsstr
+464@6@5@1@0@0@1@@1@s0$@0#wcsrchr
+434@6@5@1@0@0@1@@1@s0@19@2@0#wcschr
+461@6@5@1@0@0@1@@1@s0$@0#wcspbrk
+653@6@5@1@0@0@0@g2855@0@0@1@g2855@19@3@0#localtime
+650@6@5@1@0@0@1@@1@s0@19@3@0#gmtime
+558$@1@@1@s0$@0#wctype
+556$@1@@1@s0$@0#wctrans
+773$@0@@1@tp0$@0#times
+634$@0@s1@1@s1$@0#clock
+638$@1@@1@s0$@0#mktime
+641$@0@@1@tp0$@0#time
+871$@1@@1@s0$@0#getegid#getgid
+895$@0@g2855@0@0@1@g2855$@0#lseek
+794$@0@g2855@0@0@1@tp1,g2855$@0#waitpid
+919$@0@g2855@0@0@1@g2855$@0#tcgetpgrp
+792$@0@g2855@0@0@1@tp0,g2855$@0#wait
+864$@0@s3,g2855@0@0@1@s3,g2855$@0#fork
+883$@1@@1@s0$@0#getpgrp#getpid#getppid#setsid
+873$@1@@1@s0$@0#geteuid#getuid
+672@6@5@1@0@0@0@g2855@0@0@1@g2855@3@0@0#opendir
+676@6@5@1@0@0@0@g2855@0@0@1@g2855@3@0@0#readdir
+695@6@5@1@0@0@0@g2855@0@0@1@g2855@3@0@0#getgrnam
+692@6@5@1@0@0@0@g2855@0@0@1@g2855@3@0@0#getgrgid
+701@6@5@1@0@0@0@g2855@0@0@1@g2855@19@3@0#getpwnam
+704@6@5@1@0@0@0@g2855@0@0@1@g2855@19@3@0#getpwuid
+806$@1@@1@s0$@0#cfgetispeed#cfgetospeed
+14902$$@2@0@0#makeIfTermNode
+14918$$@2@0@0#makeOpCallTermNode
+14910$$@2@0@0#makeQuantifiedTermNode
+14906$$@2@0@0#makeInfixTermNode
+14938$$@2@0@0#makeMapTermNode#makeSelectTermNode
+14928$$@2@0@0#updateSqBracketedNode
+14926$$$@0#updateMatchedNode
+14932$$@2@0@0#makeMatchedNode#makeSqBracketedNode
+14914$$@2@0@0#makePostfixTermNode2
+14912$$@2@0@0#makePostfixTermNode
+14920$$@19@2@0#CollapseInfixTermNode
+13746$@1@@1@s0@19@2@0#termNodeList_getN
+14916$$@2@0@0#makePrefixTermNode
+14946$$@2@0@0#makeSizeofTermNode
+14940$$@2@0@0#makeLiteralTermNode
+14942$$@2@0@0#makeUnchangedTermNode1
+14944$$@2@0@0#makeUnchangedTermNode2
+15052$@1@@1@s0@3@0@0#termNode_copySafe
+14175$$$@0#checkSort
+14171@6@5@1@0@0$$@0#computePossibleSorts
+13744$$@19@2@0#termNodeList_current#termNodeList_head
+14934$$@2@0@0#makeSimpleTermNode
+14760@6@5@1@0@0@1@@1@s0@2@0@0#makeLclTypeSpecNodeConj
+14768@6@5@1@0@0@0@@1@p0@2@0@0#lclTypeSpecNode_addQual
+15016@6@5@1@0@0@1@@1@s0@2@0@0#lclTypeSpecNode_copy
+14762@6@5@1@0@0@1@@1@s0@2@0@0#makeLclTypeSpecNodeType
+14764@6@5@1@0@0@1@@1@s0@2@0@0#makeLclTypeSpecNodeSU
+14766@6@5@1@0@0@1@@1@s0@2@0@0#makeLclTypeSpecNodeEnum
+14924$$$@0#pushInfixOpPartNode
+13730$$$@0#termNodeList_push
+13742$$@2@0@0#termNodeList_copy
+3308$$@2@0@0#termNodeList_new
+15385$@1@@1@s0$@0#sort_makeSyn
+15395$@1@@1@s0$@0#sort_makePtrN
+14982$$$@0#typeExpr2ptrSort
+15411$@0@s1@1@s1$@0#sort_makeTuple#sort_makeUnionVal
+15397$@1@@1@s0$@0#sort_makeArr#sort_makePtr#sort_makeVec
+15403$@1@@1@s0$@0#sort_makeImmutable#sort_makeMutable#sort_makeSort
+14986$$$@0#lclTypeSpecNode2sort
+15493$@1@@1@s0$@0#sort_getUnderlying#sort_makeFormal#sort_makeGlobal#sort_makeHOFSort#sort_makeObj#sort_makeVal
+15540$@0@s1@1@s1$@0#sort_fromLsymbol
+15463$@1@@1@s0$@0#sort_lookupName
+15433$@1@@1@s0$@0#sort_makeEnum#sort_makeStr#sort_makeUnion
+13608$$$@0#sortList_current
+13573$$$@0#sortSet_choose
+15004$$$@0#sigNode_rangeSort
+15371$@0@s1@1@s1$@0#sort_makeNoSort
+15672$$$@0#lsymbol_translateSort#mapping_find
+14988$$$@0#checkAndEnterTag
+15651$$$@0#lsymbol_sortFromType
+16031$@1@@1@s0$@0#lsymbol_fromChars
+15529$@1@@1@s0$@0#sort_getLsymbol
+14085$$$@0#processTraitSortId
+15180$@1@@1@s0$@0#ltoken_getRawText
+2376$@1@@1@s0$@0#ltoken_getText
+10170$@1@@1@s0$@0#cstring_toSymbol
+16029$@1@@1@s0$@0#lsymbol_fromString
+14197$$$@0#lclctype_toSort#lclctype_toSortDebug
+3641$$$@0#lsymbol_getBool#lsymbol_getFALSE#lsymbol_getTRUE#lsymbol_getbool
+14786$$@2@0@0#makeFunctionNode
+14818$$@2@0@0#makeArrayNode
+14816$$@2@0@0#makePointerNode
+14790$$@2@0@0#makeTypeExpr
+15170@6@5@1@0@0@1@@1@s0@3@0@0#ltoken_createFull
+15291@6@5@1@0@0@0@s1@1@s1@19@2@0#LCLInsertToken#LSLInsertToken
+15168@6@5@1@0@0@1@@1@s0@3@0@0#ltoken_createType
+15164@6@5@1@0@0@1@@1@s0@3@0@0#ltoken_create#ltoken_createRaw
+15299@6@5@1@0@0@0@s1@1@s1@19@2@0#LCLReserveToken#LSLReserveToken
+14684@6@5@1@0@0$@19@3@0#termNode_errorToken
+14688@6@5@1@0@0$@19@3@0#lclTypeSpecNode_errorToken
+14456@6@5@1@0@0@1@s1@1@@19@2@0#LSLGetTokenForSyn
+15297@6@5@1@0@0@1@@1@s0@19@2@0#LCLGetToken#LSLGetToken
+15277@6@5@1@0@0$@19@2@0#LCLGetTokenForSyn
+15178@6@5@1@0@0@1@@1@s0@3@0@0#ltoken_copy
+13783@6@5@1@0@0@1@@1@s0@19@3@0#ltokenList_current#ltokenList_head
+14686@6@5@1@0@0$@19@3@0#nameNode_errorToken
+15993@6@5@1@0@0$@2@0@0#LSLGenTopPopShiftStack
+14006@6@5@1@0@0@0@s1@1@s1@3@0@0#LSLScanNextToken
+14042@6@5@1@0@0$@3@0@0#LSLScanEofToken
+16001@6@5@1@0@0@0@s1@1@s1@18@2@0#LCLScanNextToken
+15253@6@5@1@0@0@1@@1@s0@19@2@0#LCLScanEofToken
+15999$@1@s1@1@s1$@0#yllex
+11465@6@2@1@0@0$@18@0@0#sRef_makeCvar
+11969@6@5@1@0@0@0@@1@p0@18@2@0#sRef_fixResultType
+11815@6@2@1@0@0$@18@0@0#sRef_makeNew
+11473@6@2@1@0@0@1@@1@s0@18@0@0#sRef_makeParam
+11803@6@2@1@0@0$@18@2@0#sRef_makeArrayFetchKnown
+9786@6@5@1@0@0$@18@2@0#modListArrayFetch
+9776@6@5@1@0@0$@18@2@0#modListArrowAccess#modListFieldAccess
+11807@6@5@1@0@0@1@@1@s0@18@2@0#sRef_makeNCField
+11751@6@5@1@0@0@0@@1@p0@18@2@0#sRef_buildField
+11945@6@5@1@0@0$@18@2@0#sRef_buildArrow#sRef_makeArrow#sRef_makeField
+11771@6@2@1@0@0$@18@2@0#sRef_buildArrayFetchKnown
+11835@6@5@1@0@0@0@@1@p0,p1@18@2@0#sRef_fixBase
+11431@6@5@1@0@0@0@@1@p0@18@2@0#sRef_fixBaseParam
+11523@6@2@1@0@0$@18@0@0#sRef_makeConj
+8745@6@5@1@0@0$@18@2@0#uentry_returnedRef
+13475@6@5@1@0@0$@18@2@0#sRefSet_lookupMember
+11469@6@2@1@0@0$@18@0@0#sRef_makeGlobal
+13252@6@5@1@0@0@1@@1@s0@18@2@0#globSet_lookup
+11435@6@5@1@0@0@0@@1@tp0@18@2@0#sRef_undump#sRef_undumpGlobal
+11699@6@5@1@0@0$@2@0@0#sRef_saveCopy
+11939@6@2@1@0@0@1@@1@s0@18@2@0#sRef_getConjA#sRef_getConjB#sRef_makeArrayFetch
+11787@6@5@1@0@0@0@@1@p0@18@2@0#sRef_constructDeadDeref#sRef_constructDeref#sRef_constructPointer#sRef_makePointer
+11485@6@5@1@0@0@1@@1@s0@18@2@0#sRef_getBase#sRef_getRootBase
+9770@6@5@1@0@0$@18@2@0#modListPointer#sRef_copy#sRef_getBaseSafe#sRef_updateSref
+11769@6@2@1@0@0$@18@2@0#sRef_buildArrayFetch
+11351@6@5@1@0@0@1@@1@s0@18@3@0#sRef_getAliasInfoRef#sRef_makeExternal
+11779@6@5@1@0@0@0@@1@p0@18@2@0#sRef_buildPointer
+11481@6@5@1@0@0$@18@2@0#sRef_makeAddress#sRef_makeAnyArrayFetch#sRef_makeDerived
+11825@6@5@1@0@0$@18@0@0#sRef_fixOuterRef
+8581@6@5@1@0@0@1@@1@s0@18@2@0#uentry_getSref
+9778@6@5@1@0@0$@18@2@0#checkSpecClausesId#uentry_getOrigSref
+16512@6@5@1@0@0@1@@1@s0@18@2@0#exprNode_getSref
+13417@6@5@1@0@0@1@@1@s0@18@2@0#sRefSet_choose#sRefSet_mergeIntoOne
+9782@6@5@1@0@0$@18@2@0#fixModifiesId#fixSpecClausesId#globListUnrecognized
+11457@6@2@1@0@0@1@@1@s0@18@0@0#sRef_makeUnconstrained
+11497@6@2@1@0@0@1@@1@s0@18@0@0#sRef_makeObject#sRef_makeType
+11819@6@2@1@0@0$@18@0@0#sRef_makeConst
+5936@6@2@1@0@0@1@@1@s0@18@0@0#sRef_makeResult
+11531@6@5@1@0@0@1@@1@s0@18@0@0#sRef_makeInternalState#sRef_makeNothing#sRef_makeSpecState#sRef_makeSystemState#sRef_makeUnknown
+8365@6@2@1@0@0@1@@1@s0@2@0@0#uentry_makeDatatypeAux
+8351@6@2@1@0@0$@3@0@0#uentry_makePrivFunction2#uentry_makeSpecFunction
+8349@6@2@1@0@0$@3@0@0#uentry_makeFunction
+8307@6@2@1@0@0@1@@1@s0@2@0@0#uentry_makeConstantAux
+8367@6@2@1@0@0@1@@1@s0@2@0@0#uentry_makeDatatype
+8363@6@2@1@0@0$@3@0@0#uentry_makeUnspecFunction
+8341@6@2@1@0@0$@3@0@0#uentry_makeVariable
+8309@6@2@1@0@0@1@@1@s0@2@0@0#uentry_makeConstant
+8361@6@2@1@0@0@1@@1@s0@3@0@0#uentry_makeTypeListFunction
+8245@6@2@1@0@0$@2@0@0#uentry_makeVariableSrefParam
+8213@6@2@1@0@0@1@@1@s0@3@0@0#uentry_makeEnumInitializedConstant
+8387@6@2@1@0@0@1@@1@s0@3@0@0#uentry_makeEnumTag#uentry_makeIter
+8383@6@2@1@0@0$@3@0@0#uentry_makeStructTag#uentry_makeUnionTag
+8215@6@2@1@0@0@1@@1@s0@3@0@0#uentry_makeSpecEnumConstant
+8357@6@2@1@0@0@1@@1@s0@3@0@0#uentry_makeForwardFunction
+8449@6@5@1@0@0$@3@0@0#uentry_undump
+10997@6@5@1@0@0@1@s1@1@@18@2@0#usymtab_getRefQuiet
+8301@6@2@1@0@0@1@@1@s0@3@0@0#uentry_makeParam
+8603@6@5@1@0@0$@3@0@0#uentry_nameCopy
+8377@6@2@1@0@0@1@@1@s0@3@0@0#uentry_makeEndIter
+8757@6@5@1@0@0$@19@2@0#uentry_makeUnrecognized
+8355@6@2@1@0@0@1@@1@s0@3@0@0#uentry_makeExpandedMacro
+8217@6@2@1@0@0$@2@0@0#uentry_makeVariableLoc#uentry_makeVariableParam
+8211@6@2@1@0@0@1@@1@s0@3@0@0#uentry_makeEnumConstant#uentry_makeEnumTagLoc
+8381@6@2@1@0@0$@3@0@0#uentry_makeStructTagLoc#uentry_makeUnionTagLoc
+13118@6@5@1@0@0@1@@1@s0@19@2@0#uentryList_getN
+13152@6@5@1@0@0@1@@1@s0@19@2@0#uentryList_lookupField
+10991@6@5@1@0@0@1@s1@1@@18@2@0#usymtab_getParam
+11381@6@5@1@0@0$@19@2@0#sRef_getBaseUentry#sRef_getUentry
+10865@6@5@1@0@0@1@s1@1@s1,p0@19@2@0#usymtab_supEntryReturn#usymtab_supEntrySrefReturn#usymtab_supGlobalEntryReturn#usymtab_supReturnFileEntry
+10873@6@5@1@0@0@1@s1@1@s1@19@2@0#usymtab_supReturnTypeEntry
+8725@6@5@1@0@0@1@@1@s0@3@0@0#uentry_copy
+8303@6@2@1@0@0@1@@1@s0@2@0@0#uentry_makeIdVariable
+8221@6@2@1@0@0$@2@0@0#uentry_makeIdDatatype#uentry_makeIdFunction
+9666@6@5@1@0@0$@2@0@0#makeCurrentParam
+8311@6@2@1@0@0@1@@1@s0@3@0@0#uentry_makeIdConstant
+16376@6@5@1@0@0@1@s1@1@@19@3@0#exprNode_getUentry
+16956@6@5@1@0@0$@18@3@0#coerceId
+4468@6@5@1@0@0@1@s1@1@@19@3@0#usymtab_lookup#usymtab_lookupEither#usymtab_lookupEnumTag#usymtab_lookupExpose#usymtab_lookupExposeGlob#usymtab_lookupGlob#usymtab_lookupGlobSafe#usymtab_lookupSafe#usymtab_lookupStructTag#usymtab_lookupUnionTag
+16958@6@5@1@0@0$@19@3@0#coerceIterId
+8219@6@2@1@0@0$@2@0@0#uentry_makeUnnamedVariable
+8369@6@2@1@0@0$@2@0@0#uentry_makeBoolDatatype
+10905@6@5@1@0@0@1@s1@1@@19@3@0#usymtab_getGlobalEntry#usymtab_getTypeEntry#usymtab_getTypeEntrySafe
+13130@6@5@1@0@0@1@@1@s0@19@2@0#uentryList_current
+8403@6@2@1@0@0@1@@1@s0@3@0@0#uentry_makeElipsisMarker
+12275@6@5@1@0@0@1@@1@s0@19@2@0#context_getHeader
+9754@6@5@1@0@0$@19@2@0#getCurrentIter
+13321$@0@s1@1@s1$@0#typeIdSet_subtract
+13327$@1@@1@s0$@0#typeIdSet_union
+13313$@0@s1@1@s1$@0#typeIdSet_insert#typeIdSet_removeFresh
+13325$@0@s1@1@s1,tp0$@0#typeIdSet_undump
+8465$@1@@1@s0$@0#uentry_accessType
+13309$@0@s1@1@s1$@0#typeIdSet_single#typeIdSet_singleOpt
+13303$@0@s1@1@s1$@0#typeIdSet_emptySet
+12201$$$@0#context_fileAccessTypes
+9806@6@5@1@0@0$$@0#idDecl_replaceCtype
+9808@6@5@1@0@0$$@0#idDecl_fixBase#idDecl_fixParamBase
+9788@6@5@1@0@0$@2@0@0#idDecl_create
+9812@6@5@1@0@0$$@0#idDecl_expectFunction
+16330@6@5@1@0@0$@3@0@0#exprNode_floatLiteral
+16502@6@5@1@0@0$@3@0@0#exprNode_iter
+16326@6@5@1@0@0$@3@0@0#exprNode_numLiteral
+16328@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_charLiteral
+16484@6@5@1@0@0$@3@0@0#exprNode_forPred#exprNode_ifelse
+16416@6@5@1@0@0$@3@0@0#exprNode_assign
+16412@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_op
+16418@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_cond
+16420@6@5@1@0@0@1@s1@1@@3@0@0#exprNode_vaArg
+16404@6@5@1@0@0$@3@0@0#exprNode_cast
+16510@6@5@1@0@0$@3@0@0#exprNode_iterStart
+16500@6@5@1@0@0$@3@0@0#exprNode_makeInitialization
+16348@6@5@1@0@0@0@@1@p0,p1@3@0@0#exprNode_arrayFetch
+16496@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_comma
+16444@6@5@1@0@0$@3@0@0#exprNode_concat#exprNode_doWhile#exprNode_if#exprNode_switch
+16432@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_caseMarker
+16386@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_arrowAccess#exprNode_fieldAccess
+16388@6@5@1@0@0@0@@1@p0@3@0@0#exprNode_postOp
+16390@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_preOp
+16380@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_functionCall
+16478@6@5@1@0@0$@3@0@0#exprNode_for#exprNode_while
+16586@6@5@1@0@0$$@0#exprNode_updateLocation
+16334@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_stringLiteral
+16490@6@5@1@0@0$@3@0@0#exprNode_break#exprNode_continue
+16384@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_addParens
+16434@6@2@1@0@0$@2@0@0#exprNode_defaultMarker
+16378@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_makeInitBlock
+13041@6@5@1@0@0@1@@1@s0@19@2@0#exprNodeList_getN#exprNodeList_nth
+16398@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_offsetof
+16340@6@2@1@0@0@1@s1@1@@3@0@0#exprNode_fromIdentifier
+16338@6@2@1@0@0$@3@0@0#exprNode_createId
+16508@6@5@1@0@0$@3@0@0#exprNode_iterId
+16402@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_alignofExpr#exprNode_sizeofExpr
+16456@6@5@1@0@0$@3@0@0#exprNode_makeBlock#exprNode_return#exprNode_statement#exprNode_whilePred
+16452@6@5@1@0@0$$@0#exprNode_checkExpr#exprNode_iterExpr#exprNode_notReached
+16486@6@2@1@0@0$@2@0@0#exprNode_goto
+16504@6@5@1@0@0$@3@0@0#exprNode_iterNewId#exprNode_labelMarker
+16336@6@5@1@0@0@1@s1@1@@3@0@0#exprNode_fromUIO
+16446@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_createTok
+16492@6@5@1@0@0$@3@0@0#exprNode_nullReturn
+13039@6@5@1@0@0@1@@1@s0@19@3@0#exprNodeList_current
+13037@6@5@1@0@0$@19@3@0#exprNodeList_head
+16396@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_alignofType#exprNode_sizeofType
+6354@6@5@1@0@0@1@@1@s0@3@0@0#exprNode_makeError
+16304@6@5@1@0@0@1@@1@s0@19@3@0#exprNode_makeMustExit
+13345@6@5@1@0@0@0@@1@p0@3@0@0#guardSet_levelUnion
+13347@6@5@1@0@0@0@@1@p1,p0$@0#guardSet_levelUnionFree
+13343@6@5@1@0@0@0@@1@p0@3@0@0#guardSet_union
+13357@6@5@1@0@0$$@0#guardSet_addFalseGuard#guardSet_addTrueGuard
+13341@6@5@1@0@0$$@0#guardSet_and#guardSet_or
+16480@6@5@1@0@0@1@@1@s0@19@3@0#exprNode_getForGuards
+6318@6@5@1@0@0@1@@1@s0@18@2@0#exprNode_getGuards
+13353@6@5@1@0@0@1@@1@s0@2@0@0#guardSet_copy#guardSet_invert
+6223@6@5@1@0@0$@2@0@0#guardSet_new
+13433@6@5@1@0@0$$@0#sRefSet_levelUnion
+13427@6@5@1@0@0@0@@1@p0$@0#sRefSet_unionExcept
+13497@6@5@1@0@0$@2@0@0#sRefSet_fetchKnown
+13431@6@5@1@0@0$@2@0@0#sRefSet_intersect#sRefSet_realNewUnion
+13493@6@5@1@0@0$@2@0@0#sRefSet_accessField
+13409@6@5@1@0@0$$@0#sRefSet_insert
+13423@6@5@1@0@0$$@0#sRefSet_unionFree
+13437@6@5@1@0@0@0@@1@p0$@0#sRefSet_copy
+13425@6@5@1@0@0$$@0#sRefSet_union
+13441@6@5@1@0@0@1@@1@s0@2@0@0#sRefSet_levelCopy
+10662@6@5@1@0@0@1@@1@s0@2@0@0#aliasTable_aliasedBy#aliasTable_canAlias
+13503@6@5@1@0@0@0@@1@tp0@2@0@0#sRefSet_undump
+11117@6@5@1@0@0@1@s1@1@@2@0@0#usymtab_aliasedBy#usymtab_allAliases#usymtab_canAlias
+11755@6@5@1@0@0@1@@1@s0@19@3@0#sRef_derivedFields
+13405@6@5@1@0@0$@2@0@0#sRefSet_single
+8531@6@5@1@0@0@1@@1@s0@19@3@0#uentry_getMods
+13337@6@5@1@0@0@1@@1@s0@18@2@0#guardSet_getFalseGuards#guardSet_getTrueGuards
+13439@6@5@1@0@0$@2@0@0#sRefSet_newCopy
+13491@6@5@1@0@0@1@@1@s0@2@0@0#sRefSet_addIndirection#sRefSet_removeIndirection
+13495@6@5@1@0@0$@2@0@0#sRefSet_fetchUnknown#sRefSet_newDeepCopy
+5092@6@5@1@0@0@1@@1@s0@19@3@0#specialClause_getRefs
+4119@6@5@1@0@0@1@@1@s0@2@0@0#sRefSet_new
+12303@6@5@1@0@0$@19@3@0#context_modList
+10678@6@5@1@0@0@0@@1@s0@3@0@0#aliasTable_levelUnionNew
+10648@6@5@1@0@0@0@@1@p0$@0#aliasTable_addMustAlias
+10674@6@5@1@0@0$$@0#aliasTable_levelUnionSeq
+10676@6@5@1@0@0@0@@1@p0$@0#aliasTable_levelUnion
+10670@6@5@1@0@0@1@@1@s0@3@0@0#aliasTable_copy
+4397@6@5@1@0@0@1@@1@s0@3@0@0#aliasTable_new
+10260@6@5@1@0@0@1@@1@s0@3@0@0#fileloc_create#fileloc_createSpec
+10202@6@5@1@0@0@0@@1@p0@3@0@0#fileloc_update
+10204@6@5@1@0@0@1@@1@s0@3@0@0#fileloc_updateFileId
+10194@6@5@1@0@0@1@@1@s0@3@0@0#fileloc_decColumn
+10254@6@5@1@0@0@1@@1@s0@3@0@0#fileloc_createImport
+8804@6@5@1@0@0$@19@3@0#macrocache_processFileElements
+10234@6@5@1@0@0@1@@1@s0@3@0@0#fileloc_fromTok
+8557@6@5@1@0@0@1@@1@s0@19@3@0#uentry_whereDeclared#uentry_whereDefined#uentry_whereEarliest#uentry_whereEither#uentry_whereLast#uentry_whereSpecified
+16518@6@5@1@0@0@1@@1@s0@19@3@0#exprNode_loc
+10200@6@5@1@0@0@1@@1@s0@3@0@0#fileloc_copy#fileloc_makePreproc#fileloc_makePreprocPrevious#fileloc_noColumn
+10236@6@5@1@0@0@1@@1@s0@3@0@0#fileloc_createLib#fileloc_createRc
+1771@6@5@1@0@0@1@@1@s0@18@2@0#lltok_getLoc
+6735@6@5@1@0@0@1@@1@s0@19@3@0#flagMarker_getLoc
+12909@6@5@1@0@0@1@@1@s0@19@3@0#filelocStack_nextTop
+12457@6@5@1@0@0$@2@0@0#context_getSaveLocation
+1347@6@5@1@0@0@1@@1@s0@3@0@0#fileloc_createBuiltin#fileloc_createExternal#fileloc_getBuiltin
+10242@6@5@1@0@0@1@@1@s0@19@3@0#fileloc_getExternal#fileloc_observeBuiltin
+10506$@0@g2869@0@0,s1@1@tg2869,s1$@0#llgenformattypeerror#llgentypeerror
+2020$@0@g2869@0@0,s1@1@tg2869,s1$@0#gentypeerror
+9485$$$@0#ctype_genMatch
+10580$$$@0#doCheck
+10510$@0@g2869@0@0@1@g2869$@0#llgenhinterror
+10572$@0@g2869@0@0,s1@1@tg2869,s1$@0#optgenerror2#optgenerror2n
+13104$$$@0#uentryList_matchParams
+10216$@1@@1@s0$@0#fileloc_withinLines
+10113$@1@@1@s0$@0#cstring_equalLen#cstring_equalLenCaseInsensitive
+10576$@0@g2869@0@0,s1@1@tg2869,s1$@0#llnoptgenerror#lloptgenerror
+10508$@0@g2869@0@0@1@g2869$@0#llgenerror
+2022$@0@g2869@0@0,s1@1@tg2869,s1$@0#optgenerror
+15740$$$@0#symtable_opExistsWithArity
+10389$$$@0#fileTable_sameBase
+10603$@0@@1@p0$@0#messageLog_add
+12814$@1@@1@s0$@0#mstring_equalPrefix
+12743$$$@0#firstWord
+10318$@0@@1@tp1$@0#tsource_getPath
+12816$@1@@1@s0$@0#mstring_equal
+12768$@0@@1@tp0$@0#optCheckChar
+15525$@1@@1@s0$@0#sort_compatible#sort_compatible_modulo_cstring
+15435$@0@s1@1@s1$@0#sort_updateEnum#sort_updateStr#sort_updateUnion
+2337$@1@@1@s0$@0#lsymbol_equal
+14660$@1@@1@s0$@17#ltoken_similar
+11423$@1@@1@s0$@0#sRef_includedBy#sRef_realSame#sRef_same#sRef_sameName#sRef_similar#sRef_similarRelaxed
+11395$@0@@1@p0$@0#sRef_canModify#sRef_canModifyVal
+9918$@0@g2869@0@0@1@g2869$@0#checkGlobalDestroyed
+9968$$$@0#canLoseReference
+5252$$$@0#uentry_sameObject
+8405$@1@@1@s0$@0#uentry_equiv
+8721$$$@0#uentry_sameKind
+13305$@1@@1@s0$@0#typeIdSet_member
+10957$@0@s1@1@s1$@0#usymtab_newCase
+13363$@1@@1@s0$@0#guardSet_isGuarded#guardSet_isProbableNull
+13473$@0@@1@p1$@0#sRefSet_modifyMember
+13421$@0@@1@p0$@0#sRefSet_deleteBase
+13459$@1@@1@s0$@0#sRefSet_isSameMember#sRefSet_isSameNameMember#sRefSet_member
+13415$$$@0#sRefSet_delete
+13501$@1@@1@s0$@0#sRefSet_equal
+10232$@1@@1@s0$@0#fileloc_almostSameFile#fileloc_equal#fileloc_lessthan#fileloc_notAfter#fileloc_sameBaseFile#fileloc_sameFile#fileloc_sameModule
+1262$@1@@1@s0$@0#bool_equal
+10109$$$@0#cstring_equalFree
+10097$@1@@1@s0$@0#cstring_containsChar
+1183$@1@@1@s0$@0#cstring_equalLit
+10121$@1@@1@s0$@0#cstring_equalCanonicalPrefix#cstring_equalPrefix
+10064$@0@g2869@0@0@1@g2869$@0#checkCppName
+10069$$$@0#checkAnsiName
+1200$@1@@1@s0$@0#cstring_lessthan
+10111$@1@@1@s0$@0#cstring_equal#cstring_equalCaseInsensitive
+1254$@1@@1@s0$@0#cstring_containsLit
+10103$@1@@1@s0$@0#cstring_contains
+16534$$$@0#exprNode_matchLiteral#exprNode_matchType
+4901$$$@0#ctype_equal
+10734$$$@0#anyAbstract
+9493$@1@@1@s0$@0#ctype_match#ctype_matchArg#ctype_matchDef#ctype_sameAltTypes#ctype_sameName
+9489$$$@0#ctype_almostEqual#ctype_forceMatch
+11899$$$@0#sRef_aliasCheckSimplePred
+1318$@1@@1@s0$@0#fileId_equal
+6858$@1@@1@s0$@42#fileId_baseEqual
+1496$@1@@1@s0$@0#qual_equal
+12158$$$@0#context_suppressFlagMsg#context_suppressNotFlagMsg
+15523$@1@@1@s0$@0#sort_equal
+13777$@1@@1@s0$@0#ltokenList_equal
+13513$@1@@1@s0$@0#lsymbolSet_member
+13511$@0@@1@p0$@0#lsymbolSet_insert
+13571$$$@0#sortSet_insert#sortSet_member
+14980$$$@0#sigNode_equal
+13528$@0@@1@p0$@0#sigNodeSet_insert
+14970$$$@0#sameNameNode
+15026$$$@0#lslOp_equal
+13555$@0@@1@p0$@0#lslOpSet_insert
+15655$$$@0#symtable_exists
+15647$$$@0#symtable_enterFct
+15653$$$@0#symtable_enterVar
+15635$$$@0#symtable_enterTag#symtable_enterTagForce
+3813$$$@0#cprim_equal
+8765$$$@0#cprim_closeEnough
+13010$$$@0#enumNameList_member
+13000$@1@@1@s0$@0#enumNameList_match
+3928$$$@0#enumNameSList_member
+10012$@1@@1@s0$@0#alkind_compatible#alkind_equal
+4050$@1@@1@s0$@0#exitkind_equal
+4182$@1@@1@s0$@0#ekind_equal
+4206$@1@@1@s0$@0#usymId_equal
+11075$@1@s1@1@$@0#usymtab_matchForwardStruct
+4546$@1@@1@s0$@0#typeId_equal
+13389$@1@@1@s0$@0#usymIdSet_member
+4322$$$@0#uentryList_sameObject
+13158$$$@0#uentryList_matchFields
+13250$@1@@1@s0$@0#globSet_member
+5067$@1@@1@s0$@0#multiVal_equiv
+10631$@1@@1@s0$@0#flagMarker_beforeMarker#flagMarker_sameFile
+13227$@1@@1@s0$@0#flagMarkerList_inIgnore
+10377$@1@@1@s0$@0#fileTable_exists
+10359$@1@@1@s0$@0#fileTable_isHeader#fileTable_isSpecialFile#fileTable_isSystemFile
+11315$$$@0#sRef_deepPred
+11905$$$@0#sRef_aliasCompleteSimplePred
+12913$@0@@1@p0$@0#filelocStack_popPushFile
+13270$$$@0#intSet_insert#intSet_member
+15265$@1@@1@s0$@0#LCLIsEndComment#isIdentifierChar#ltoken_isSingleChar#osd_isConnectChar
+14056$$$@0#LSLIsEndComment
+1266$@1@@1@s0$@0#bool_fromInt
+12736$@1@@1@s0$@0#isCext#osd_fileExists
+12874$$$@0#osd_fileIsReadable
+1093@6@0@1@0@50@1@@1@s0$@0#mstring_isEmpty
+1091@6@0@1@0@51@1@@1@s0$@0#mstring_isDefined
+3290@6@0@1@0@51@1@@1@s0$@0#termNode_isDefined
+3029@6@0@1@0@51@1@@1@s0$@0#lclTypeSpecNode_isDefined
+3306@6@0@1@0@51$$@0#termNodeList_isDefined
+3304$$$@0#termNodeList_empty
+15542$@1@@1@s0$@0#sort_isHOFSortKind#sort_isNoSort#sort_isValidSort#sort_mutable
+14458$@1@s1@1@$@0#LSLIsSyn
+15279$$$@0#LCLIsSyn#lsymbol_isDefined#lsymbol_isUndefined
+2412$$$@0#ltoken_isChar
+2352@6@0@1@0@50$$@0#ltoken_isUndefined
+2350@6@0@1@0@51$$@0#ltoken_isValid
+2381$@1@@1@s0$@0#ltoken_hasSyn#ltoken_isStateDefined
+2383$$$@0#ltoken_wasSyn
+10830$@1@s1@1@$@0#usymtab_isAltProbablyDeepNull#usymtab_isGuarded#usymtab_isProbableDeepNull#usymtab_isProbableNull
+12299$@1@@1@s0$@0#context_checkGlobMod#sRef_hasAliasInfoRef#sRef_hasDerived#sRef_hasLastReference#sRef_hasName#sRef_hasNoStorage#sRef_isAliasCheckedGlobal#sRef_isAllocIndexRef#sRef_isAnyParam#sRef_isDefinitelyNull#sRef_isDependent#sRef_isDirectParam#sRef_isExposed#sRef_isExternal#sRef_isExternallyVisible#sRef_isFresh#sRef_isGlobal#sRef_isIReference#sRef_isIndexKnown#sRef_isInternalState#sRef_isJustAllocated#sRef_isLocalState#sRef_isMacroParamRef#sRef_isModified#sRef_isNotNull#sRef_isNotUndefined#sRef_isNothing#sRef_isObject#sRef_isObserver#sRef_isOnly#sRef_isReallyDefined#sRef_isRecursiveField#sRef_isReference#sRef_isResult#sRef_isShared#sRef_isSpecInternalState#sRef_isSpecState#sRef_isStack#sRef_isStackAllocated#sRef_isStateLive#sRef_isStrictReadable#sRef_isSystemState#sRef_isTemp#sRef_isThroughArrayFetch#sRef_isUnique#sRef_isUnknownArrayFetch#sRef_isUnuseable
+12305$$$@0#context_globAccess#sRef_definitelyNull#sRef_isUnionField#sRef_perhapsNull#sRef_possiblyNull
+5678@6@0@1@0@50@1@@1@s0$@0#sRef_isInvalid#sRef_isStateUndefined
+11703@6@0@1@0@51@1@@1@s0$@0#sRef_isAddress#sRef_isAllocated#sRef_isArrayFetch#sRef_isConst#sRef_isCvar#sRef_isDead#sRef_isDeadStorage#sRef_isField#sRef_isFileStatic#sRef_isLocalParamVar#sRef_isLocalVar#sRef_isNSLocalVar#sRef_isParam#sRef_isPointer#sRef_isPossiblyDead#sRef_isRealGlobal#sRef_isRealLocalVar#sRef_isUnconstrained#sRef_isValid
+6066$@1@@1@s0$@0#sRef_isAnyDefined#sRef_isKeep#sRef_isKept#sRef_isKilledGlob#sRef_isMeaningful#sRef_isNew#sRef_isOwned#sRef_isPartial#sRef_isRefsField#sRef_isRelDef#sRef_isSafe#sRef_isStateDefined#sRef_isStateSpecial#sRef_isStateUnknown#sRef_isType#sRef_isUndefGlob#sRef_isUnsafe#sRef_stateKnown
+5722@6@0@1@0@51@1@@1@s0$@0#sRef_isConj#sRef_isKillRef#sRef_isKindSpecial#sRef_isKnown#sRef_isNewRef#sRef_isPdefined#sRef_isRefCounted
+12291$@1@@1@s0$@0#context_checkExport#uentry_hasGlobs#uentry_hasMods#uentry_hasSpecialClauses#uentry_isCheckMod#uentry_isChecked#uentry_isCheckedModify#uentry_isCheckedStrict#uentry_isCheckedUnknown#uentry_isForward#uentry_isGlobal#uentry_isMaybeAbstract#uentry_isMessageLike#uentry_isNonLocal#uentry_isOnly#uentry_isOut#uentry_isPartial#uentry_isPrintfLike#uentry_isRefParam#uentry_isScanfLike#uentry_isSpecialFunction#uentry_isStateSpecial#uentry_isUnchecked#uentry_isUnique#uentry_isYield#uentry_possiblyNull
+12295$$$@0#context_checkAliasGlob#context_checkGlobUse#uentry_hasAccessType#uentry_isRefCountedDatatype#uentry_isReturned
+8525@6@0@1@0@51@1@@1@s0$@0#uentry_hasName#uentry_hasRealName#uentry_isAbstractDatatype#uentry_isAbstractType#uentry_isCodeDefined#uentry_isDatatype#uentry_isEndIter#uentry_isExpandedMacro#uentry_isExported#uentry_isFakeTag#uentry_isFileStatic#uentry_isIter#uentry_isMutableDatatype#uentry_isParam#uentry_isRealFunction#uentry_isSefParam#uentry_isSpecified
+5406$@1@@1@s0$@0#uentry_isElipsisMarker
+5270$$$@0#uentry_wasUsed
+5212@6@0@1@0@51@1@@1@s0$@0#uentry_isConstant#uentry_isEitherConstant#uentry_isEnumConstant#uentry_isExtern#uentry_isExternal#uentry_isFunction#uentry_isPriv#uentry_isStatic
+5206@6@0@1@0@51$$@0#uentry_isLset#uentry_isUsed
+5192@6@0@1@0@50@1@@1@s0$@0#uentry_isInvalid#uentry_isUndefined
+8499@6@0@1@0@51@1@@1@s0$@0@2.0.fukind.tp0,finfo.tp0$#uentry_isAnyParam#uentry_isAnyTag#uentry_isDeclared#uentry_isEnumTag#uentry_isStructTag#uentry_isUnionTag#uentry_isValid#uentry_isVar#uentry_isVariable
+13307$@1@@1@s0$@0#typeIdSet_isEmpty
+4982@6@0@1@0@51@1@@1@s0$@0#idDecl_isDefined
+4667@6@0@1@0@51@1@@1@s0$@0#usymtab_isDefined
+16460$@1@@1@s0$@0#exprNode_isAssign#exprNode_isCaseMarker#exprNode_isCharLit#exprNode_isDefaultMarker#exprNode_isLabelMarker#exprNode_isNullValue#exprNode_isNumLit
+16442$$$@0#exprNode_errorEscape#exprNode_mayEscape#exprNode_mustEscape
+6316@6@0@1@0@50@1@@1@s0$@0#exprNode_isError#exprNode_isUndefined
+6312@6@0@1@0@51@1@@1@s0$@0#exprNode_isDefined
+6330$@1@@1@s0$@0#exprNode_hasValue#exprNode_knownIntValue#exprNode_knownStringValue
+6324$$$@0#exprNode_isStringLiteral
+6322@6@0@1@0@51@1@@1@s0$@0#exprNode_isInParens
+6219@6@0@1@0@51@1@@1@s0$@0#guardSet_isDefined
+13367@6@0@1@0@51$$@0#guardSet_isEmpty
+13457$@1@@1@s0$@0#sRefSet_hasRealElement#sRefSet_hasStatic#sRefSet_hasUnconstrained
+4081@6@0@1@0@50@1@@1@s0$@0#sRefSet_isUndefined
+4085@6@0@1@0@51@1@@1@s0$@0#sRefSet_isDefined
+4083@6@0@1@0@50@1@@1@s0$@0#sRefSet_isEmpty
+4388@6@0@1@0@50$$@0#aliasTable_isUndefined
+4392@6@0@1@0@51$$@0#aliasTable_isDefined
+4390@6@0@1@0@50$$@0#aliasTable_isEmpty
+12162$@1@@1@s0$@0#context_inSuppressZone#fileloc_isHeader#fileloc_isLib#fileloc_isRealLib#fileloc_isRealSpec#fileloc_isSpec#fileloc_isSpecialFile#fileloc_isStandardLib#fileloc_isStandardLibrary#fileloc_isSystemFile#fileloc_isUser
+1405@6@0@1@0@50@1@@1@s0$@0#fileloc_isUndefined
+1403@6@0@1@0@51@1@@1@s0$@0#fileloc_isDefined
+1417$@1@@1@s0$@0#fileloc_columnDefined#fileloc_isBuiltin#fileloc_isExternal#fileloc_isInvalid#fileloc_linenoDefined
+1423$$$@0#fileloc_isImport#fileloc_isPreproc
+1421@6@0@1@0@51$$@0#fileloc_isValid
+15501$@0@s1@1@s1$@0#sort_setExporting
+1260$@1@@1@s0$@0#bool_not
+11035$@1@s1@1@$@0#usymtab_exists#usymtab_existsEither#usymtab_existsEnumTag#usymtab_existsGlob#usymtab_existsGlobEither#usymtab_existsReal#usymtab_existsStructTag#usymtab_existsType#usymtab_existsTypeEither#usymtab_existsUnionTag#usymtab_existsVar
+12213$@1@@1@s0$@0#context_isSystemDir#cstring_hasNonAlphaNumBar#cstring_isEmpty#isHeaderFile#isLCLfile
+12211$$$@0#context_isSpecialFile#isFakeTag#isMode#lcllib_isSkipHeader
+1217@6@0@1@0@50@1@@1@s0$@0#cstring_isUndefined
+1215@6@0@1@0@51@1@@1@s0$@0#cstring_isDefined#cstring_isNonEmpty
+4907$@1@@1@s0$@0#ctype_isAP#ctype_isAbstract#ctype_isArbitraryIntegral#ctype_isArray#ctype_isArrayPtr#ctype_isBool#ctype_isChar#ctype_isConj#ctype_isDefined#ctype_isDirectBool#ctype_isDirectInt#ctype_isDouble#ctype_isElips#ctype_isEnum#ctype_isExpFcn#ctype_isFirstVoid#ctype_isFixedArray#ctype_isFloat#ctype_isFunction#ctype_isIncompleteArray#ctype_isInt#ctype_isKnown#ctype_isMissingParamsMarker#ctype_isMutable#ctype_isNumeric#ctype_isPointer#ctype_isReal#ctype_isRealAP#ctype_isRealAbstract#ctype_isRealArray#ctype_isRealBool#ctype_isRealFunction#ctype_isRealInt#ctype_isRealNumeric#ctype_isRealPointer#ctype_isRealSU#ctype_isRealVoid#ctype_isRefCounted#ctype_isRegularInt#ctype_isSU#ctype_isSigned#ctype_isSignedChar#ctype_isSignedIntegral#ctype_isSimple#ctype_isString#ctype_isStruct#ctype_isStructorUnion#ctype_isUA#ctype_isUndefined#ctype_isUnion#ctype_isUnknown#ctype_isUnsigned#ctype_isUnsignedChar#ctype_isUnsignedIntegral#ctype_isUser#ctype_isUserBool#ctype_isVisiblySharable#ctype_isVoid#ctype_isVoidPointer
+9571$$$@0#ctype_isAnyFloat#ctype_isStackAllocated
+4919$@1@@1@s0$@0#ctype_isBogus
+1305$@1@@1@s0$@0#ynm_isMaybe#ynm_isOff#ynm_isOn#ynm_toBoolRelaxed#ynm_toBoolStrict
+1316$@1@@1@s0$@0#fileId_isInvalid#fileId_isValid
+6830$@1@@1@s0$@42#fileId_isHeader
+1602$@1@@1@s0$@0#qual_isAbstract#qual_isAuto#qual_isCheckMod#qual_isChecked#qual_isCheckedStrict#qual_isConcrete#qual_isConst#qual_isDependent#qual_isExits#qual_isExposed#qual_isExtern#qual_isExternal#qual_isFalseExit#qual_isFalseNull#qual_isImmutable#qual_isImpOnly#qual_isIn#qual_isInline#qual_isKeep#qual_isKept#qual_isKillRef#qual_isLong#qual_isMayExit#qual_isMutable#qual_isNeverExit#qual_isNewRef#qual_isNotNull#qual_isNull#qual_isObserver#qual_isOnly#qual_isOut#qual_isOwned#qual_isPartial#qual_isRefCounted#qual_isRefs#qual_isRegister#qual_isRelDef#qual_isRelNull#qual_isReturned#qual_isSef#qual_isShared#qual_isShort#qual_isSigned#qual_isSpecial#qual_isStatic#qual_isTemp#qual_isTempRef#qual_isTrueExit#qual_isTrueNull#qual_isUnchecked#qual_isUnique#qual_isUnknown#qual_isUnsigned#qual_isUnused#qual_isVolatile#qual_isYield
+1634$@1@@1@s0$@0#qual_isAliasQual#qual_isAllocQual#qual_isCQual#qual_isControlQual#qual_isExQual#qual_isExitQual#qual_isGlobCheck#qual_isGlobalQual#qual_isImplied#qual_isKilled#qual_isNullPred#qual_isRefQual#qual_isStorageClass#qual_isTypeQual#qual_isUndef
+11185$$$@0#lltok_isSemi
+9822$@1@@1@s0$@0#clause_isBreakable#clause_isCase#clause_isConditional#clause_isLoop#clause_isNone#clause_isSwitch
+1806@6@0@1@0@51@1@@1@s0$@0#cstringSList_isDefined
+1810@6@0@1@0@51@1@@1@s0$@0#cstringSList_empty
+1836@6@0@1@0@51@1@@1@s0$@0#cstringList_isDefined
+1840@6@0@1@0@51@1@@1@s0$@0#cstringList_empty
+12475$@1@@1@s0$@0#context_getFlag#context_maybeSet
+7123$$$@0#context_getDebug#flagcode_hasArgument#flagcode_hasString#flagcode_hasValue#flagcode_isGlobalFlag#flagcode_isIdemFlag#flagcode_isInvalid#flagcode_isModeFlag#flagcode_isNameChecksFlag#flagcode_isNamePrefixFlag#flagcode_isSkip#flagcode_isSpecialFlag#flagcode_isValid
+1912$$$@0#flagcode_isLibraryFlag#flagcode_isPassThrough
+10303$@0@s3@1@tp0,s3$@0#tsource_close
+10316$@0@s3@1@p0,s3$@0#tsource_open
+2098$@1@@1@s0$@0#tsource_isOpen
+13202$$$@0#qualList_hasAliasQualifier#qualList_hasExposureQualifier
+2112@6@0@1@0@50$$@0#qualList_isUndefined
+2110@6@0@1@0@51$$@0#qualList_isDefined
+2117$$$@0#qualList_isEmpty
+2288$$$@0#paramNode_isElipsis#paramNode_isYield
+2319@6@0@1@0@50$$@0#paramNodeList_isNull
+2305@6@0@1@0@51@1@@1@s0$@0#paramNodeList_isDefined
+2301$$$@0#paramNodeList_empty
+13771$@1@@1@s0$@0#ltokenList_isFinished
+2436@6@0@1@0@50@1@@1@s0$@0#ltokenList_isUndefined
+2434@6@0@1@0@51@1@@1@s0$@0#ltokenList_isDefined
+2440$@1@@1@s0$@0#ltokenList_empty#ltokenList_isEmpty
+2552@6@0@1@0@51@1@@1@s0$@0#lsymbolSet_isDefined
+2570@6@0@1@0@51@1@@1@s0$@0#sortSet_isDefined
+2604@6@0@1@0@51@1@@1@s0$@0#pairNodeList_isDefined
+2750$$$@0#storeRefNode_isObj#storeRefNode_isSpecial#storeRefNode_isTerm#storeRefNode_isType
+15048$$$@0#initDeclNode_isRedeclaration
+2933@6@0@1@0@50$$@0#fcnNodeList_isUndefined
+2931@6@0@1@0@51$$@0#fcnNodeList_isDefined
+2937$$$@0#fcnNodeList_isEmpty
+3059$$$@0#typeNameNodeList_empty
+3105@6@0@1@0@50@1@@1@s0$@0#sigNodeSet_isUndefined
+3103@6@0@1@0@51@1@@1@s0$@0#sigNodeSet_isDefined
+3107$@1@@1@s0$@0#sigNodeSet_isEmpty
+3161@6@0@1@0@51@1@@1@s0$@0#lslOpSet_isDefined
+3196$$$@0#replaceNodeList_isDefined
+3703@6@0@1@0@51$$@0#typeInfo_exists
+3705@6@0@1@0@51$$@0#varInfo_exists
+3709@6@0@1@0@51$$@0#opInfo_exists
+3707@6@0@1@0@51$$@0#tagInfo_exists
+3774$@1@@1@s0$@0#exprNodeList_isEmpty
+8769$$$@0#cprim_isInt
+3807$$$@0#cprim_isAnyChar#cprim_isAnyInt#cprim_isAnyReal#cprim_isSignedChar#cprim_isUnsignedChar
+3856@6@0@1@0@50@1@@1@s0$@0#filelocList_isUndefined
+3858@6@0@1@0@51$$@0#filelocList_isDefined
+3865$$$@0#filelocList_isEmpty
+3953$@1@@1@s0$@0#sstate_isKnown#sstate_isUnknown
+3945$@1@@1@s0$@0#nstate_isKnown#nstate_perhapsNull#nstate_possiblyNull
+3983$@1@@1@s0$@0#alkind_isError#alkind_isFresh#alkind_isKeep#alkind_isKept#alkind_isKillRef#alkind_isKnown#alkind_isLocal#alkind_isNewRef#alkind_isOwned#alkind_isRefCounted#alkind_isRefs#alkind_isShared#alkind_isStack#alkind_isStatic#alkind_isUnique#alkind_isUnknown
+3963$@1@@1@s0$@0#alkind_isDependent#alkind_isImplicit#alkind_isOnly#alkind_isTemp
+3957$@1@@1@s0$@0#exkind_isUnknown
+3959$@1@@1@s0$@0#exkind_isKnown
+10030$@1@@1@s0$@0#exitkind_couldEscape#exitkind_couldExit#exitkind_isKnown#exitkind_isMustExit#exitkind_isTrueExit
+4064$@1@@1@s0$@0#exitkind_isConditionalExit#exitkind_isError#exitkind_mustEscape#exitkind_mustExit
+4194$@1@@1@s0$@0#ekind_isConst#ekind_isElipsis#ekind_isEnumConst#ekind_isFunction#ekind_isVariable
+10911$@1@s1@1@$@0#usymtab_isBoolType
+4538$@1@@1@s0$@0#usymId_isInvalid#usymId_isValid
+4542$@1@@1@s0$@0#typeId_isInvalid#typeId_isValid
+12315$$$@0#context_couldHaveAccess#context_hasAccess#context_hasFileAccess
+4239@6@0@1@0@50@1@@1@s0$@0#usymIdSet_isUndefined
+4237@6@0@1@0@51@1@@1@s0$@0#usymIdSet_isDefined
+13150$@1@@1@s0$@0#uentryList_hasReturned#uentryList_isFinished#uentryList_isVoid
+4260@6@0@1@0@50@1@@1@s0$@0#uentryList_isEmpty#uentryList_isMissingParams#uentryList_isUndefined
+4262@6@0@1@0@51@1@@1@s0$@0#uentryList_isDefined
+13254$@1@@1@s0$@0#globSet_hasStatic
+4362@6@0@1@0@50@1@@1@s0$@0#globSet_isUndefined
+4360@6@0@1@0@51@1@@1@s0$@0#globSet_isDefined
+4332$$$@0#globSet_isEmpty
+9459$@1@@1@s0$@0#ctype_isForceRealBool#ctype_isForceRealInt#ctype_isForceRealNumeric
+4381@6@0@1@0@50@1@@1@s0$@0#ctypeList_isUndefined
+4379@6@0@1@0@51@1@@1@s0$@0#ctypeList_isDefined
+4943@6@0@1@0@50$$@0#qtype_isUndefined
+4945@6@0@1@0@51$$@0#qtype_isDefined
+5023@6@0@1@0@50@1@@1@s0$@0#multiVal_isUndefined#multiVal_isUnknown
+11169@6@0@1@0@51@1@@1@s0$@0#multiVal_isChar#multiVal_isDefined#multiVal_isDouble#multiVal_isInt#multiVal_isString
+8860$@1@@1@s0$@0#specialClause_isAfter#specialClause_isBefore
+5132@6@0@1@0@50@1@@1@s0$@0#specialClauses_isUndefined
+5130@6@0@1@0@51@1@@1@s0$@0#specialClauses_isDefined
+6684@6@0@1@0@50$$@0#sRefSetList_isUndefined
+6682@6@0@1@0@51$$@0#sRefSetList_isDefined
+6709$@1@@1@s0$@0#flagMarker_isIgnoreCount#flagMarker_isIgnoreOff#flagMarker_isIgnoreOn#flagMarker_isLocalSet#flagMarker_isSuppress
+6796@6@0@1@0@50@1@@1@s0$@0#fileTable_isUndefined
+6798@6@0@1@0@51@1@@1@s0$@0#fileTable_isDefined
+6870@6@0@1@0@51@1@@1@s0$@0#messageLog_isDefined
+6888$@1@@1@s0$@0#clauseStack_isEmpty
+7396$@1@@1@s0$@0#cppFatalErrors#cppReader_isPedantic
+7427$@0@@1@s0$@0@2.0.fopts.tp0$#cppReader_isTraditional
+8947$@1@@1@s0$@0#ctentry_isBogus
+10177@6@0@1@0@51$$@0#fileIdList_isDefined
+10182$@1@@1@s0$@0#fileIdList_isEmpty
+10698@6@0@1@0@50@1@@1@s0$@0#sRefTable_isNull
+10702@6@0@1@0@51@1@@1@s0$@0#sRefTable_isDefined
+10700@6@0@1@0@50@1@@1@s0$@0#sRefTable_isEmpty
+12044@6@0@1@0@51@1@@1@s0$@0#filelocStack_isDefined
+12071$$$@0#intSet_isEmpty
+10544$@0@s1@1@s1$@0#lclHadNewError
+12511$@1@s1@1@$@0#context_anyErrors#context_inConditional#context_inDeepLoop#context_inDeepLoopSwitch#context_inDeepSwitch#context_inFunctionDecl#context_inGlobalContext#context_inImport#context_inLCLLib#context_inMacroFunction#usymtab_inDeepScope#usymtab_inFileScope#usymtab_inFunctionScope#usymtab_inGlobalScope
+12439$@1@@1@s0$@0#context_inFunction#context_inFunctionLike#context_inIterDef#context_inIterEnd#context_inMacro#context_inMacroConstant#context_inMacroUnknown#context_inRealFunction#context_inSuppressRegion#context_isInCommandLine#context_isMacroMissingParams#context_isPreprocessing#context_msgBoolInt#context_msgCharInt#context_msgEnumInt#context_msgLh#context_msgPointerArith#context_msgStrictOps#context_setBoolName#context_unlimitedMessages#context_usingAnsiLibrary#context_usingPosixLibrary#isFlipOldStyle#isNewStyle#processingIterVars#sRef_modInFunction
+12361$$$@0#context_canAccessBool#context_checkInternalUse#context_doDump#context_doMerge#context_hasAliasAnnote#context_hasMessageAnnote#context_hasMods#context_inGlobalScope#context_inHeader#context_inInnerScope#context_inProtectVars#context_justPopped#context_neednl#context_processingMacros#context_showFunction#isProcessingGlobMods#lclHadError#loadStandardState
+14151@6@5@1@0@0$@3@0@0#lhVarDecl
+10158@6@5@1@0@0@1@@1@s0@3@0@0#cstring_concatLength
+10274@6@5@1@0@0@1@@1@s0@3@0@0#fileloc_unparseRawCol
+10172@6@5@1@0@0$@18@0@0#cstring_bsearch
+10162@6@2@1@0@0$@3@0@0#cstring_prependCharO
+10164@6@2@1@0@0$@3@0@0#cstring_prependChar
+10301@6@5@1@3@0@1@@1@s0@2@0@0#message
+10095@6@5@1@0@0@1@@1@s0@3@0@0#cstring_copyLength
+14137@6@5@1@0@0$@3@0@0#lhFunction
+10150@6@2@1@0@0$@3@0@0#cstring_appendChar
+10156@6@5@1@0@0@0@@1@p0@3@0@0#cstring_concatChars
+10152@6@5@1@0@0@0@@1@p0,p1@3@0@0#cstring_concatFree
+10154@6@5@1@0@0@0@@1@p0@3@0@0#cstring_concatFree1
+10087@6@5@1@0@0@1@@1@s0@3@0@0#cstring_beforeChar
+10144@6@5@1@0@0@1@@1@s0@3@0@0#cstring_elide#cstring_fill#cstring_prefix#fileloc_unparseRaw
+10081@6@5@1@0@0@1@@1@s0@19@3@0#cstring_suffix
+10160@6@5@1@0@0@1@@1@s0@3@0@0#cstring_concat
+10142@6@5@1@0@0@0@@1@p0$@0#cstring_clip
+9513@6@5@1@0@0$@3@0@0#ctype_unparseDeclaration
+9820@6@5@1@0@0@1@@1@s0@19@3@0#clause_nameFlip
+12961@6@5@1@0@0@1@@1@s0@3@0@0#cstringSList_unparseSep
+12935@6@5@1@0@0@1@@1@s0@3@0@0#cstringList_unparseSep
+8882@6@5@1@0@0@1@@1@s0@19@3@0#specialClause_postErrorString#specialClause_preErrorString
+10383@6@5@1@0@0@1@@1@s0@19@3@0#fileTable_getName#fileTable_getRootName
+10387@6@5@1@0@0$@19@3@0#fileTable_getNameBase
+10168@6@2@1@0@0@1@@1@s0@3@0@0#cstring_create
+10582@6@5@1@0@0@1@@1@s0@19@3@0#lldecodeerror
+1206@6@5@1@0@0@1@@1@s0@3@0@0#cstring_fromCharsO
+10131@6@5@1@0@0@1@@1@s0$@0#cstring_fromChars
+1223@6@5@1@0@0@1@@1@s0@3@0@0#cstring_makeLiteral
+12872@6@5@1@0@0$@3@0@0#osd_fixDefine
+1225@6@5@1@0@0@1@@1@s0@18@3@0#cstring_makeLiteralTemp
+1208@6@5@1@0@0@1@@1@s0@3@0@0#cstring_fromCharsNew
+1047@6@5@1@0@0@0@@1@tp0@3@0@0#getStringWord
+14954@6@5@1@0@0@1@@1@s0@3@0@0#termNode_unparse
+14770@6@5@1@0@0@1@@1@s0@2@0@0#lclTypeSpecNode_unparse#lclTypeSpecNode_unparseComments
+13748@6@5@1@0@0$@2@0@0#termNodeList_unparse#termNodeList_unparseSecondToCurrent#termNodeList_unparseTail#termNodeList_unparseToCurrent
+15483@6@5@1@0@0@1@@1@s0@3@0@0#sort_unparse
+15534@6@5@1@0@0@1@@1@s0@19@2@0#sort_unparseName
+16033@6@5@1@0@0@1@@1@s0@19@3@0#lsymbol_toString
+14814@6@5@1@0@0$@2@0@0#typeExpr_name#typeExpr_unparse#typeExpr_unparseNoBase
+15174@6@5@1@0@0@1@@1@s0@3@0@0#ltoken_unparseCodeName#ltoken_unparseLoc
+2404@6@5@1@0@0@1@@1@s0@19@3@0#ltoken_getRawString
+15176@6@5@1@0@0$@19@3@0#ltoken_unparse
+2408@6@5@1@0@0$@19@3@0#ltoken_fileName
+11449@6@5@1@0@0@1@@1@s0@2@0@0#sRef_unparse#sRef_unparseDebug#sRef_unparseKindName#sRef_unparseKindNamePlain#sRef_unparseOpt#sRef_unparsePreOpt
+11437@6@5@1@0@0@1@@1@s0@3@0@0#sRef_dump#sRef_dumpGlobal#sRef_unparseDeep#sRef_unparseFull#sRef_unparseState
+11483@6@5@1@0@0@1@@1@s0@19@3@0#sRef_getField#sRef_getScopeName#sRef_nullMessage#sRef_stateAltVerb#sRef_stateVerb#sRef_unconstrainedName#sRef_unparseScope
+8459@6@5@1@0@0@1@@1@s0@3@0@0#uentry_unparse#uentry_unparseAbbrev#uentry_unparseFull
+8451@6@5@1@0@0$@3@0@0#uentry_dump#uentry_dumpParam
+8751@6@5@1@0@0@1@@1@s0@19@3@0#uentry_ekindName#uentry_getRealName#uentry_rawName#uentry_specDeclName#uentry_specOrDefName
+8681@6@5@1@0@0$@19@3@0#uentry_checkedName
+8543@6@5@1@0@0@1@@1@s0@3@0@0@2.0.fukind.tp0,finfo.tp0,funame.tp0$#uentry_getName
+13317@6@5@1@0@0@1@@1@s0@3@0@0#typeIdSet_unparse
+13323@6@5@1@0@0$@3@0@0#typeIdSet_dump
+9792@6@5@1@0@0$@2@0@0#idDecl_unparse
+5006@6@5@1@0@0@1@@1@s0@18@3@0#idDecl_getName
+9794@6@5@1@0@0@1@@1@s0@19@3@0#idDecl_observeId
+16516@6@5@1@0@0@1@@1@s0@18@3@0#exprNode_unparse
+16514@6@5@1@0@0@1@@1@s0@19@3@0#exprNode_unparseFirst
+13359@6@5@1@0@0$@2@0@0#guardSet_unparse
+13505@6@5@1@0@0@1@@1@s0@2@0@0#sRefSet_dump#sRefSet_unparse#sRefSet_unparseDebug
+4157@6@5@1@0@0@1@@1@s0@3@0@0#sRefSet_unparseFull#sRefSet_unparsePlain#sRefSet_unparseUnconstrained#sRefSet_unparseUnconstrainedPlain
+10680@6@5@1@0@0@1@@1@s0@2@0@0#aliasTable_unparse
+10270@6@5@1@0@0@1@@1@s0@3@0@0#fileloc_unparse#fileloc_unparseDirect#fileloc_unparseFilename
+10262@6@5@1@0@0@1@@1@s0@19@3@0#fileloc_filename#fileloc_getBase
+1258@6@5@1@0@0@1@@1@s0@19@3@0#bool_dump#bool_unparse
+10140@6@5@1@0@0@0@@1@p0@3@0@0#cstring_capitalizeFree
+12678@6@5@1@0@0$@2@0@0#describeFlag#fixTagName#makeEnum#makeParam#makeStruct#makeUnion
+10138@6@5@1@0@0@1@@1@s0@3@0@0#cstring_capitalize#cstring_copy#cstring_downcase
+10174@6@5@1@0@0@1@@1@s0@19@3@0#cstring_advanceWhiteSpace
+9838@6@5@1@0@0$@19@3@0#fixParamName
+9523@6@5@1@0@0@1@@1@s0@2@0@0#ctype_dump
+9537@6@5@1@0@0@1@@1@s0@19@3@0#ctype_enumTag#ctype_unparse#ctype_unparseDeep#ctype_unparseSafe
+1291@6@5@1@0@0@1@@1@s0@19@3@0#ynm_unparse#ynm_unparseCode
+6850@6@5@1@0@0@1@@1@s0@19@3@0#fileName#fileNameBase#rootFileName
+8812@6@5@1@0@0@1@@1@s0@19@3@0#qual_unparse
+11187@6@5@1@0@0@1@@1@s0@19@3@0#lltok_unparse
+9818@6@5@1@0@0@1@@1@s0@19@3@0#clause_nameAlternate#clause_nameTaken#clause_unparse
+12965@6@5@1@0@0@1@@1@s0@2@0@0#cstringSList_unparseAbbrev
+12959@6@5@1@0@0$@2@0@0#cstringSList_unparse
+12939@6@5@1@0@0@1@@1@s0@2@0@0#cstringList_unparseAbbrev
+12933@6@5@1@0@0$@2@0@0#cstringList_unparse
+12405@6@5@1@0@0@1@@1@s0@19@3@0#context_getString#flagcode_name#flagcode_unparse
+12660@6@5@1@0@0$@19@3@0#flagcodeHint
+13198@6@5@1@0@0@1@@1@s0@2@0@0#qualList_unparse
+13200@6@5@1@0@0$@2@0@0#qualList_toCComments
+14894@6@5@1@0@0$@2@0@0#paramNode_unparse#paramNode_unparseComments
+13846@6@5@1@0@0$@2@0@0#paramNodeList_unparse#paramNodeList_unparseComments
+13785@6@5@1@0@0@1@@1@s0@2@0@0#ltokenList_unparse#printLeaves2#printRawLeaves2
+15734@6@5@1@0@0$@3@0@0#tagKind_unparse
+13918@6@5@1@0@0$@2@0@0#importNodeList_unparse
+13610@6@5@1@0@0$@2@0@0#sortList_unparse
+13515@6@5@1@0@0@1@@1@s0@2@0@0#lsymbolSet_unparse
+13577@6@5@1@0@0$@2@0@0#sortSet_unparse#sortSet_unparseClean#sortSet_unparseOr
+13807@6@5@1@0@0@1@@1@s0@2@0@0#pairNodeList_unparse
+14842@6@5@1@0@0$@2@0@0#declaratorInvNode_unparse
+13621@6@5@1@0@0$@2@0@0#declaratorInvNodeList_unparse
+14798@6@5@1@0@0$@2@0@0#declaratorNode_unparse#declaratorNode_unparseCode
+13662@6@5@1@0@0$@2@0@0#declaratorNodeList_unparse
+13881@6@5@1@0@0$@2@0@0#varNodeList_unparse
+13896@6@5@1@0@0$@2@0@0#quantifierNodeList_unparse
+13711@6@5@1@0@0$@2@0@0#storeRefNodeList_unparse
+14958@6@5@1@0@0$@2@0@0#modifyNode_unparse
+13675@6@5@1@0@0$@2@0@0#letDeclNodeList_unparse
+14960@6@5@1@0@0$@2@0@0#programNode_unparse
+13859@6@5@1@0@0$@2@0@0#programNodeList_unparse
+14838@6@5@1@0@0$@2@0@0#exposedNode_unparse
+13594@6@5@1@0@0$@2@0@0#initDeclNodeList_unparse
+14670@6@5@1@0@0$@2@0@0#constDeclarationNode_unparse
+14666@6@5@1@0@0@1@@1@s0@2@0@0#varDeclarationNode_unparse
+13870@6@5@1@0@0@1@@1@s0@2@0@0#varDeclarationNodeList_unparse
+2906@6@5@1@0@0$@3@0@0#globalList_unparse
+14948@6@5@1@0@0$@2@0@0#claimNode_unparse
+14664@6@5@1@0@0$@2@0@0#fcnNode_unparse
+13831@6@5@1@0@0$@2@0@0#fcnNodeList_unparse
+14662@6@5@1@0@0@1@@1@s0@2@0@0#iterNode_unparse
+14844@6@5@1@0@0$@2@0@0#abstBodyNode_unparse#abstBodyNode_unparseExposed
+14832@6@5@1@0@0$@2@0@0#abstractNode_unparse
+13688@6@5@1@0@0$@2@0@0#stDeclNodeList_unparse
+14848@6@5@1@0@0@1@@1@s0@2@0@0#taggedUnionNode_unparse
+14147@6@5@1@0@0$@3@0@0#lhType
+14668@6@5@1@0@0@1@@1@s0@2@0@0#typeNode_unparse
+14782@6@5@1@0@0$@3@0@0#strOrUnionNode_unparse
+14776@6@5@1@0@0@1@@1@s0@2@0@0#enumSpecNode_unparse
+14758@6@5@1@0@0$@2@0@0#typeNameNode_unparse
+13818@6@5@1@0@0$@2@0@0#typeNameNodeList_unparse
+14752@6@5@1@0@0@1@@1@s0@2@0@0#opFormNode_unparse
+14740@6@5@1@0@0@1@@1@s0@2@0@0#sigNode_unparse#sigNode_unparseText
+13532@6@5@1@0@0@1@@1@s0@2@0@0#sigNodeSet_unparse#sigNodeSet_unparsePossibleAritys#sigNodeSet_unparseSomeSigs
+14994@6@5@1@0@0@1@@1@s0@2@0@0#signNode_unparse
+14736@6@5@1@0@0@1@@1@s0@2@0@0#nameNode_unparse
+14966@6@5@1@0@0$@2@0@0#lslOp_unparse
+13559@6@5@1@0@0@1@@1@s0@2@0@0#lslOpSet_unparse
+14730@6@5@1@0@0$@2@0@0#replaceNode_unparse
+13907@6@5@1@0@0$@2@0@0#replaceNodeList_unparse
+14724@6@5@1@0@0$@2@0@0#renamingNode_unparse
+13796@6@5@1@0@0$@2@0@0#traitRefNodeList_unparse
+14652@6@5@1@0@0$@2@0@0#exportNode_unparse
+14654@6@5@1@0@0$@2@0@0#privateNode_unparse
+15102@6@5@1@0@0$@3@0@0#interfaceNode_unparse
+14962@6@2@1@0@0$@2@0@0#stmtNode_unparse
+13651@6@5@1@0@0$@2@0@0#sortSetList_unparse
+13698@6@5@1@0@0$@2@0@0#lslOpList_unparse
+13049@6@5@1@0@0@1@@1@s0@2@0@0#exprNodeList_unparse
+8767@6@5@1@0@0$@2@0@0#cprim_unparse
+10439@6@5@1@0@0$@2@0@0#hashTable_stats
+13176@6@5@1@0@0$@2@0@0#filelocList_unparse#filelocList_unparseUses
+13014@6@5@1@0@0@1@@1@s0@2@0@0#enumNameList_unparse
+13018@6@5@1@0@0$@2@0@0#enumNameList_dump#enumNameList_unparseBrief
+3934@6@5@1@0@0@1@@1@s0@2@0@0#enumNameSList_unparse
+9980@6@5@1@0@0@1@@1@s0@19@3@0#sstate_unparse
+9986@6@5@1@0@0@1@@1@s0@19@3@0#nstate_unparse
+10000@6@5@1@0@0@1@@1@s0@19@3@0#alkind_capName#alkind_unparse
+9996@6@5@1@0@0@1@@1@s0@19@3@0#exkind_capName#exkind_unparse#exkind_unparseError
+10018@6@5@1@0@0@1@@1@s0@19@3@0#exitkind_unparse
+10732@6@5@1@0@0@1@@1@s0@19@3@0#ekind_capName#ekind_unparse#ekind_unparseLong
+10913@6@5@1@0@0@1@s1@1@@2@0@0#usymtab_getTypeEntryName
+13393@6@5@1@0@0$@2@0@0#usymIdSet_dump#usymIdSet_unparse
+13134@6@5@1@0@0$@2@0@0#uentryList_dumpFields
+13132@6@5@1@0@0@1@@1@s0@3@0@0#uentryList_dumpParams#uentryList_unparse#uentryList_unparseAbbrev#uentryList_unparseFull#uentryList_unparseParams
+13258@6@5@1@0@0@1@@1@s0@2@0@0#globSet_dump#globSet_unparse
+12991@6@5@1@0@0@1@@1@s0@2@0@0#ctypeList_unparse
+8834@6@5@1@0@0@1@@1@s0@2@0@0#qtype_unparse
+11177@6@5@1@0@0@1@@1@s0@2@0@0#multiVal_dump#multiVal_unparse
+11165@6@5@1@0@0@1@@1@s0@18@3@0#multiVal_forceString
+8898@6@5@1@0@0@1@@1@s0@3@0@0#specialClause_unparse#specialClause_unparseKind
+8923@6@5@1@0@0@1@@1@s0@3@0@0#specialClauses_dump#specialClauses_unparse
+13236@6@5@1@0@0$@2@0@0#idDeclList_unparse
+10625@6@5@1@0@0@1@@1@s0@2@0@0#flagMarker_unparse
+13219@6@5@1@0@0@1@@1@s0@2@0@0#flagMarkerList_unparse
+8796@6@5@1@0@0@1@@1@s0@2@0@0#macrocache_unparse
+10334@6@5@1@0@0@1@@1@s0@2@0@0#fileTable_unparse
+10605@6@5@1@0@0@1@@1@s0@2@0@0#messageLog_unparse
+12894@6@5@1@0@0@1@@1@s0@2@0@0#clauseStack_unparse
+10722@6@5@1@0@0@1@@1@s0@2@0@0#sRefTable_unparse
+12915@6@5@1@0@0@1@@1@s0@2@0@0#filelocStack_unparse
+13276@6@5@1@0@0$@2@0@0#intSet_unparse#intSet_unparseText
+13084@6@5@1@0@0$@2@0@0#exprNodeSList_unparse
+4653@6@5@1@0@0@1@s1@1@@2@0@0#usymtab_unparseAliases#usymtab_unparseStack
+12311@6@5@1@0@0@1@@1@s0@2@0@0#context_unparseAccess#context_unparseClauses
+12369@6@5@1@0@0$@2@0@0#context_getMessageAnnote#context_unparse#ctype_unparseTable#describeModes#fakeTag
+6920@6@5@1@0@0@1@@1@s0@3@0@0#context_unparseFlagMarkers
+12377@6@5@1@0@0$@3@0@0#context_getAliasAnnote
+12543@6@5@1@0@0$@18@3@0#context_tmpdir
+12593@6@5@1@0@0@1@@1@s0@19@3@0#context_getBoolName#context_getDump#context_getFalseName#context_getLCLImportDir#context_getLarchPath#context_getMerge#context_getTrueName#context_inFunctionName#context_moduleName#context_printBoolName
+9591@6@5@1@0@0$@19@3@0#LastIdentifier
+9527$$$@0#ctype_adjustPointers
+11441$@1@@1@s0$@0#sRef_deriveType
+9670$$$@0#declareEnum
+9477$$$@0#ctype_createStruct#ctype_createUnion
+9533$$$@0#ctype_createEnum
+9742$$$@0#declareStruct#declareUnion
+9365$$$@0#ctype_makeFixedArray
+9375$@1@@1@s0$@0#ctype_newBase#ctype_resolveNumerics#ctype_widest
+9565$$$@0#ctype_combine#ctype_makeConj#ctype_makeExplicitConj
+9385$@1@@1@s0$@0#ctype_makeFunction#ctype_makeNFParamsFunction
+9381$$$@0#ctype_makeParamsFunction
+9389$$$@0#ctype_makeRealFunction
+9521$$$@0#ctype_undump
+11443$@1@@1@s0$@0#sRef_getType
+10879$@1@s1@1@s1,p0$@0#usymtab_supForwardTypeEntry#usymtab_supTypeEntry
+8601$@1@s1@1@$@0#uentry_getForceRealType#uentry_getRealType
+8597$@1@@1@s0$@0#uentry_getAbstractType#uentry_getType
+9798$@1@@1@s0$@0#idDecl_getCtype
+6320$@1@@1@s0$@0#exprNode_getType
+9553$@1@@1@s0$@0#ctype_createForwardStruct#ctype_createForwardUnion
+9750$$$@0#handleEnum#handleStruct#handleUnion
+11025$@1@s1@1@$@0#usymtab_lookupAbstractType#usymtab_lookupType
+9369$@1@@1@s0$@0#ctype_baseArrayPtr#ctype_getBaseType#ctype_realType#ctype_realishType#ctype_removePointers#ctype_resolve#ctype_returnValue
+9387$$$@0#ctype_expectFunction#ctype_fixArrayPtr#ctype_forceRealType#ctype_makeArray#ctype_makePointer
+9569$$$@0#ctype_fromQual
+9668$$$@0#declareUnnamedEnum
+11033$@1@s1@1@$@0#usymtab_enumEnumNameListType
+9343$@1@@1@s0$@0#ctype_createAbstract
+9341$$$@0#ctype_createUser
+9549$$$@0#ctype_createUnnamedStruct#ctype_createUnnamedUnion#declareUnnamedStruct#declareUnnamedUnion
+11027$@1@s1@1@$@0#usymtab_structFieldsType#usymtab_unionFieldsType
+4947$$$@0#qtype_getType
+12417$@1@@1@s0$@0#context_currentFunctionType#context_getRetType
+12413$$$@0#context_typeofOne#context_typeofZero
+8866$@1@@1@s0@3@0@0#specialClause_getPostTestFunction#specialClause_getPreTestFunction
+8872@6@5@1@0@0@1@@1@s0@3@0@0#specialClause_getEffectFunction#specialClause_getEntryFunction#specialClause_getReturnEffectFunction
+8868$@1@@1@s0@3@0@0#specialClause_getPostTestShower
+10107$@1@@1@s0$@0#cstring_genericEqual
+13225$@1@@1@s0$@0#flagMarkerList_suppressError
+10688$@1@@1@s0$@0#ynm_fromCodeChar
+11573$@1@@1@s0$@0#sRef_isReadable#sRef_isWriteable
+1299$@1@@1@s0$@0#ynm_fromBool
+10619$@1@@1@s0$@0#flagMarker_getSet
+10355$@0@@1@p0$@0#fileTable_addFileOnly
+10353$@0@@1@p0$@0#fileTable_addFile#fileTable_addHeaderFile#fileTable_addImportFile#fileTable_addLCLFile#fileTable_addLibraryFile#fileTable_lookupBase
+10379$@1@@1@s0$@0#fileTable_lookup
+10373$@0@@1@p0$@0#fileTable_addCTempFile
+1433$@1@@1@s0$@0#fileloc_fileId
+10371$@0@@1@p0$@0#fileTable_addMacrosFile
+10375$$$@0#fileTable_addltemp
+1465$@1@g2914@0@5@1@$@0#currentFile
+8810$@1@@1@s0$@0#qual_fromInt
+8511$$$@0#uentry_nullPred
+1652$@1@@1@s0$@0#qual_createAbstract#qual_createAuto#qual_createCheckMod#qual_createChecked#qual_createCheckedStrict#qual_createConcrete#qual_createConst#qual_createDependent#qual_createExits#qual_createExposed#qual_createExtern#qual_createExternal#qual_createFalseExit#qual_createFalseNull#qual_createImmutable#qual_createImpOnly#qual_createIn#qual_createInline#qual_createKeep#qual_createKept#qual_createKillRef#qual_createKilled#qual_createLong#qual_createMayExit#qual_createMessageLike#qual_createMutable#qual_createNeverExit#qual_createNewRef#qual_createNotNull#qual_createNull#qual_createObserver#qual_createOnly#qual_createOut#qual_createOwned#qual_createPartial#qual_createPrintfLike#qual_createRefCounted#qual_createRefs#qual_createRegister#qual_createRelDef#qual_createRelNull#qual_createReturned#qual_createScanfLike#qual_createSef#qual_createShared#qual_createShort#qual_createSigned#qual_createSpecial#qual_createStatic#qual_createTemp#qual_createTempRef#qual_createTrueExit#qual_createTrueNull#qual_createUnchecked#qual_createUndef#qual_createUnique#qual_createUnknown#qual_createUnsigned#qual_createUnused#qual_createVolatile#qual_createYield
+11189$@0@@1@s0$@0#lltok_create
+12886$@1@@1@s0$@0#clauseStack_top
+12239$$$@0#context_breakClause#context_nextBreakClause
+12957@6@5@1@0@0@0@@1@p0$@0#cstringSList_add
+12955@6@5@1@0@0@1@@1@s0@2@0@0#cstringSList_single
+1814@6@5@1@0@0@1@@1@s0@2@0@0#cstringSList_new
+12931@6@5@1@0@0@0@@1@p0$@0#cstringList_add
+12929@6@5@1@0@0@1@@1@s0@2@0@0#cstringList_single
+1844@6@5@1@0@0@1@@1@s0@2@0@0#cstringList_new
+12688$$$@0#identifyFlag
+8880$@1@@1@s0$@0#specialClause_postErrorCode#specialClause_preErrorCode
+10621$@1@@1@s0$@0#flagMarker_getCode
+6935$@1@@1@s0$@0#context_getLibrary
+12664$@1@@1@s0$@0#identifyCategory
+10308$@1@@1@s0@3@0@0#tsource_create
+10311$@1@@1@s0@3@0@0#tsource_fromString
+16008$@1@@1@s0@19@2@0#LCLScanSource#LSLScanSource
+13192@6@5@1@0@0@0@@1@p0$@0#qualList_add
+13194@6@5@1@0@0$$@0#qualList_appendList
+9800@6@5@1@0@0@1@@1@s0@19@2@0#idDecl_getQuals
+13196@6@5@1@0@0$@3@0@0#qualList_copy
+4949@6@5@1@0@0$@19@2@0#qtype_getQuals
+2119@6@5@1@0@0@1@@1@s0@3@0@0#qualList_new
+16061$$@2@0@0#mapping_create
+15475$@1@@1@s0@19@3@0#sort_lookup#sort_quietLookup
+2267$$$@0#fixBits
+14886$$@2@0@0#makeParamNode
+15012$$$@0#markYieldParamNode
+15064@6@5@1@0@0$@3@0@0#paramNode_copy
+14888$$@2@0@0#paramNode_elipsis
+13842@6@5@1@0@0$$@0#paramNodeList_add
+13838@6@5@1@0@0$@2@0@0#paramNodeList_single
+13844@6@5@1@0@0$@2@0@0#paramNodeList_copy
+2307@6@5@1@0@0$@2@0@0#paramNodeList_new
+13765@6@5@1@0@0$$@0#ltokenList_push
+13761@6@2@1@0@0$@2@0@0#ltokenList_singleton
+13779@6@5@1@0@0@1@@1@s0@2@0@0#ltokenList_copy
+2444@6@2@1@0@0@1@@1@s0@2@0@0#ltokenList_new
+14704$$@2@0@0#importNode_makeBracketed#importNode_makePlain#importNode_makeQuoted
+13916$$$@0#importNodeList_add
+2508$$@2@0@0#importNodeList_new
+15006$$@2@0@0#sigNode_domain
+2522$$@2@0@0#sortList_new
+2542$$@2@0@0#lsymbolList_new
+2555@6@5@1@0@0@1@@1@s0@2@0@0#lsymbolSet_new
+13585@6@5@1@0@0$@2@0@0#sortSet_copy
+13649@6@5@1@0@0$@19@3@0#sortSetList_current#sortSetList_head
+2574@6@5@1@0@0$@2@0@0#sortSet_new
+2606@6@5@1@0@0@1@@1@s0@2@0@0#pairNodeList_new
+14840$$@2@0@0#makeDeclaratorInvNode
+13619$$$@0#declaratorInvNodeList_add
+2633$$@2@0@0#declaratorInvNodeList_new
+14792$$@2@0@0#makeDeclaratorNode
+14800$$@2@0@0#declaratorNode_copy
+13660$$$@0#declaratorNodeList_add
+13664$$@3@0@0#declaratorNodeList_copy
+2673$$@2@0@0#declaratorNodeList_new
+14872$$@2@0@0#makeArrayQualNode
+14874$$@2@0@0#makeVarNode
+15090$$@3@0@0#varNode_copy
+13879$$$@0#varNodeList_add
+13885$$@3@0@0#varNodeList_copy
+2702$$@2@0@0#varNodeList_new
+14870$$@2@0@0#makeQuantifierNode
+15070$$@3@0@0#quantifierNode_copy
+13892$$$@0#quantifierNodeList_add
+13894$$@2@0@0#quantifierNodeList_copy
+2727$$@2@0@0#quantifierNodeList_new
+14674$$@2@0@0#makeStoreRefNodeType
+14672$$@2@0@0#makeStoreRefNodeTerm
+15076$$@3@0@0#storeRefNode_copy
+14676$$@3@0@0#makeStoreRefNodeInternal#makeStoreRefNodeSystem
+13707$$$@0#storeRefNodeList_add
+13709$$@2@0@0#storeRefNodeList_copy
+2765$$@2@0@0#storeRefNodeList_new
+14680$$@2@0@0#makeModifyNodeSpecial
+14682$$@2@0@0#makeModifyNodeRef
+14692$$@2@0@0#makeLetDeclNode
+13673$$$@0#letDeclNodeList_add
+2794$$@2@0@0#letDeclNodeList_new
+14694$$@2@0@0#makeProgramNodeAction
+14696$$@2@0@0#makeProgramNode
+2823$$@2@0@0#programNodeList_new
+14868$$@2@0@0#makeLclPredicateNode
+14864$$@2@0@0#makeChecksNode#makeEnsuresNode#makeIntraClaimNode#makeRequiresNode
+14836$$@2@0@0#makeExposedNode
+14976$$@2@0@0#makeCTypesNode
+14978$$@2@0@0#makeTypeSpecifier
+14828$$@2@0@0#makeInitDeclNode
+13592$$$@0#initDeclNodeList_add
+2865$$@2@0@0#initDeclNodeList_new
+14820$$@2@0@0#makeConstDeclarationNode
+14826$$@2@0@0#makeVarDeclarationNode
+14824$$@3@0@0#makeFileSystemNode#makeInternalStateNode
+2897$@1@@1@s0@2@0@0#varDeclarationNodeList_new
+14858$$@2@0@0#makeClaimNode
+14856$$@2@0@0#makeFcnNode
+14852$$@2@0@0#fcnNode_fromDeclarator
+13829@6@5@1@0@0$$@0#fcnNodeList_add
+2939@6@5@1@0@0$@2@0@0#fcnNodeList_new
+14854$$@2@0@0#makeIterNode
+14880$$@2@0@0#makeAbstBodyNode2
+14878$$@2@0@0#makeExposedBodyNode
+14876$$@2@0@0#makeAbstBodyNode
+14830$$@2@0@0#makeAbstractNode
+14784$$@2@0@0#makestDeclNode
+15080$$@3@0@0#stDeclNode_copy
+13684$$$@0#stDeclNodeList_add
+13686$$@2@0@0#stDeclNodeList_copy
+2980$$@2@0@0#stDeclNodeList_new
+14700$@1@@1@s0@2@0@0#makeExposedTypeNode
+14698$@1@@1@s0@2@0@0#makeAbstractTypeNode
+14778$$@2@0@0#makestrOrUnionNode
+14780$$@2@0@0#makeForwardstrOrUnionNode
+14772$$@2@0@0#makeEnumSpecNode
+14774$$@2@0@0#makeEnumSpecNode2
+14754$@1@@1@s0@2@0@0#makeTypeNameNode
+14756$@1@@1@s0@2@0@0#makeTypeNameNodeOp
+13816$$$@0#typeNameNodeList_add
+3061$$@2@0@0#typeNameNodeList_new
+15010$$$@0#opFormUnion_createMiddle
+15008$$$@0#opFormUnion_createAnyOp
+14748$@1@@1@s0@2@0@0#makeOpFormNode
+14738$@1@@1@s0@2@0@0#makesigNode
+15042$@1@@1@s0@2@0@0#sigNode_copy
+15738@6@5@1@0@0$@19@3@0#symtable_possibleOps
+13524@6@5@1@0@0@1@@1@s0@2@0@0#sigNodeSet_singleton
+3111@6@5@1@0@0@1@@1@s0@2@0@0#sigNodeSet_new
+14734$@1@@1@s0@2@0@0#makeNameNodeId
+14732$@1@@1@s0@2@0@0#makeNameNodeForm
+15046$@1@@1@s0@2@0@0#nameNode_copySafe
+15044@6@5@1@0@0@1@@1@s0@2@0@0#nameNode_copy
+14083$$@2@0@0#parseOpLine
+14964$$@2@0@0#makelslOpNode
+15040$$@2@0@0#lslOp_copy
+15744@6@5@1@0@0$@2@0@0#symtable_opsWithLegalDomain
+13561@6@5@1@0@0@1@@1@s0@2@0@0#lslOpSet_copy
+3165@6@5@1@0@0@1@@1@s0@2@0@0#lslOpSet_new
+14728$@1@@1@s0@2@0@0#makeReplaceNode
+14726$@1@@1@s0@2@0@0#makeReplaceNameNode
+13905$$$@0#replaceNodeList_add
+3198$$@2@0@0#replaceNodeList_new
+14722$@1@@1@s0@2@0@0#makeRenamingNode
+14714$@1@@1@s0@2@0@0#makeTraitRefNode
+13794$$$@0#traitRefNodeList_add
+3231$$@2@0@0#traitRefNodeList_new
+14628$$@2@0@0#makeInterfaceNodeImports
+14632$@1@@1@s0@2@0@0#interfaceNode_makeConst#interfaceNode_makePrivConst
+14646$@1@@1@s0@2@0@0#interfaceNode_makePrivVar#interfaceNode_makeVar
+14640$@1@@1@s0@2@0@0#interfaceNode_makeClaim
+14638$@1@@1@s0@2@0@0#interfaceNode_makeFcn#interfaceNode_makePrivFcn
+14642$@1@@1@s0@2@0@0#interfaceNode_makeIter
+14648$@1@@1@s0@2@0@0#interfaceNode_makePrivType#interfaceNode_makeType
+14630$@1@@1@s0@2@0@0#makeInterfaceNodeUses
+14626$$$@0#consInterfaceNode
+13630$$$@0#interfaceNodeList_addh
+3281$$@2@0@0#interfaceNodeList_new
+14882$$@2@0@0#makeStmtNode
+3353$$@2@0@0#sortSetList_new
+3375$$@2@0@0#lslOpList_new
+15657@6@5@1@0@0$@19@3@0#symtable_typeInfo
+15659@6@5@1@0@0$@19@3@0#symtable_varInfo#symtable_varInfoInScope
+15639@6@5@1@0@0$@19@3@0#symtable_opInfo
+15641@6@5@1@0@0$@19@3@0#symtable_tagInfo
+15624$@1@@1@s0@2@0@0#symtable_new
+13045$$$@0#exprNodeList_push
+13043$$@2@0@0#exprNodeList_singleton
+3776$$@2@0@0#exprNodeList_new
+8763$$$@0#cprim_fromInt
+4883$@1@@1@s0$@0#ctype_toCprim
+10434$$@2@0@0#hashTable_create
+13172@6@5@1@0@0@0@@1@p0$@0#filelocList_addDifferentFile
+13174@6@5@1@0@0@0@@1@p0$@0#filelocList_add
+13166@6@5@1@0@0$$@0#filelocList_append
+5601@6@5@1@0@0@1@@1@s0@19@3@0#uentry_getUses
+13168@6@5@1@0@0@0@@1@p0$@0#filelocList_addUndefined
+3869@6@5@1@0@0@1@@1@s0@2@0@0#filelocList_new
+3884@6@5@1@0@0@1@@1@s0@2@0@0#enumName_create
+13012$@1@@1@s0@2@0@0#enumNameList_subtract
+13006$$$@0#enumNameList_push
+9529$@1@@1@s0@19@3@0#ctype_elist
+12998$@1@@1@s0@2@0@0#enumNameList_single
+13008$@1@@1@s0@2@0@0#enumNameList_copy
+13020$$@2@0@0#enumNameList_undump
+3895$$@2@0@0#enumNameList_new
+3924$$@2@0@0#enumNameSList_subtract
+3926$$@2@0@0#enumNameSList_new
+9976$@1@@1@s0$@0#sstate_fromInt
+11583$@1@@1@s0$@0#sRef_getDefState
+8501$$$@0#uentry_getDefState
+10004$@1@@1@s0$@0#sstate_fromQual
+9974$@1@@1@s0$@0#nstate_fromInt
+5686$@1@@1@s0$@0#sRef_getNullState
+9990$@1@@1@s0$@0#alkind_derive#alkind_resolve
+9972$@1@@1@s0$@0#alkind_fromInt
+5718$@1@@1@s0$@0#sRef_getAliasKind#sRef_getOrigAliasKind
+8515$@1@@1@s0$@0#uentry_getAliasKind
+10008$@1@@1@s0$@0#alkind_fromQual
+10016$@1@@1@s0$@0#alkind_fixImplicit
+9978$@1@@1@s0$@0#exkind_fromInt
+11597$@1@@1@s0$@0#sRef_getExKind#sRef_getOrigExKind
+8517$@1@@1@s0$@0#uentry_getExpKind
+10002$@1@@1@s0$@0#exkind_fromQual
+10022$@1@@1@s0$@0#exitkind_combine
+10032$@1@@1@s0$@0#exitkind_fromInt
+8509$@1@@1@s0$@0#uentry_getExitCode
+10006$@1@@1@s0$@0#exitkind_fromQual
+10020$@1@@1@s0$@0#exitkind_makeConditional
+10726$@1@@1@s0$@0#ekind_fromInt
+8533$@1@@1@s0$@0#uentry_getKind
+10875$@1@s1@1@s1,p0$@0#usymtab_supAbstractTypeEntry#usymtab_supExposedTypeEntry
+4536$@1@@1@s0$@0#usymId_fromInt
+11553$@1@@1@s0$@0#sRef_getScopeIndex
+10853$@1@s1@1@s1,p0$@0#usymtab_addEntry
+10901$@1@s1@1@$@0#usymtab_getId#usymtab_getTypeId
+10921$@1@s1@1@$@0#usymtab_convertId
+4548$$$@0#typeId_fromInt
+9511$$$@0#ctype_typeId
+13383@6@5@1@0@0$@2@0@0#usymIdSet_removeFresh
+13381@6@5@1@0@0@1@@1@s0@3@0@0#usymIdSet_add
+13385@6@5@1@0@0@1@@1@s0@3@0@0#usymIdSet_newUnion
+13387@6@5@1@0@0$@3@0@0#usymIdSet_subtract
+13395@6@5@1@0@0$@3@0@0#usymIdSet_undump
+13375@6@5@1@0@0$@2@0@0#usymIdSet_single
+4213@6@5@1@0@0$@3@0@0#usymIdSet_new
+13136@6@5@1@0@0$@2@0@0#uentryList_undumpFields
+13154@6@5@1@0@0$@3@0@0#uentryList_mergeFields
+13096@6@5@1@0@0@0@@1@p0$@0#uentryList_add
+9696@6@5@1@0@0$@3@0@0#fixUentryList
+13138@6@5@1@0@0@0@@1@tp0@3@0@0#uentryList_undump
+13090@6@5@1@0@0@1@@1@s0@2@0@0#uentryList_single
+8537@6@5@1@0@0@1@@1@s0@19@3@0#uentry_getParams
+9373@6@5@1@0@0@1@@1@s0@19@3@0#ctype_argsFunction#ctype_getFields#ctype_getParams
+13112@6@5@1@0@0@1@@1@s0@2@0@0#uentryList_copy
+9764@6@5@1@0@0$@18@0@0#handleParamIdList#handleParamTypeList
+9698@6@5@1@0@0@1@@1@s0@3@0@0#fixUnnamedDecl
+4264@6@2@1@0@0$@2@0@0#uentryList_new
+4254@6@5@1@0@0$@2@0@0#uentryList_makeMissingParams
+12351@6@5@1@0@0$@19@3@0#context_getParams
+13244@6@5@1@0@0@0@@1@p0$@0#globSet_insert
+13246@6@5@1@0@0@0@@1@p0$@0#globSet_copy
+13260@6@5@1@0@0@0@@1@tp0@2@0@0#globSet_undump
+8529@6@5@1@0@0@1@@1@s0@19@3@0#uentry_getGlobs
+13248@6@5@1@0@0@1@@1@s0@2@0@0#globSet_newCopy
+4334@6@5@1@0@0@1@@1@s0@2@0@0#globSet_new
+12357@6@5@1@0@0@1@@1@s0@19@3@0#context_getGlobs
+12353@6@5@1@0@0$@19@3@0#context_getUsedGlobs
+4371@6@5@1@0@0$@2@0@0#ctypeList_new
+9325$@1@@1@s0$@0#ctkind_fromInt
+8830@6@5@1@0@0$$@0#qtype_combine#qtype_newBase
+8820@6@5@1@0@0$$@0#qtype_addQual
+8822@6@5@1@0@0$$@0#qtype_addQualList
+8828@6@5@1@0@0$$@0#qtype_mergeAlt#qtype_mergeImplicitAlt
+8838@6@5@1@0@0$$@0#qtype_newQbase
+9796@6@5@1@0@0$@19@2@0#idDecl_getTyp
+8814@6@2@1@0@0@1@@1@s0@3@0@0#qtype_create
+8842@6@5@1@0@0$@2@0@0#qtype_copy
+8832@6@5@1@0@0$$@0#qtype_resolve
+4961@6@5@1@0@0@1@@1@s0@2@0@0#qtype_unknown
+11149@6@5@1@0@0@1@@1@s0@2@0@0#multiVal_makeChar
+11147@6@5@1@0@0@1@@1@s0@2@0@0#multiVal_makeInt
+11151@6@5@1@0@0@1@@1@s0@2@0@0#multiVal_makeDouble
+11179@6@5@1@0@0@0@@1@tp0@2@0@0#multiVal_undump
+8535@6@5@1@0@0@1@@1@s0@19@3@0#uentry_getConstantValue
+16332@6@5@1@0@0@1@@1@s0@19@2@0#exprNode_getValue
+11153@6@5@1@0@0@1@@1@s0@2@0@0#multiVal_makeString
+11155@6@5@1@0@0@1@@1@s0@2@0@0#multiVal_copy
+11157@6@5@1@0@0@1@@1@s0@3@0@0#multiVal_invert
+5043@6@5@1@0@0@1@@1@s0@2@0@0#multiVal_unknown
+8856$@1@@1@s0@3@0@0#specialClause_create
+8908$@1@@1@s0@3@0@0#specialClause_createAllocates#specialClause_createDefines#specialClause_createReleases#specialClause_createSets#specialClause_createUses
+8915@6@5@1@0@0@0@@1@p0$@0#specialClauses_add
+8925@6@5@1@0@0@0@@1@tp0@3@0@0#specialClauses_undump
+8435@6@5@1@0@0@1@@1@s0@19@3@0#uentry_getSpecialClauses
+8919@6@5@1@0@0@1@@1@s0@2@0@0#specialClauses_copy
+16182@6@5@1@0@0$@2@0@0#exprData_makePair
+16180@6@5@1@0@0$@2@0@0#exprData_makeId
+16178@6@5@1@0@0$@2@0@0#exprData_makeLiteral
+13234$$$@0#idDeclList_add
+13229$$@2@0@0#idDeclList_singleton
+12979@6@5@1@0@0@0@@1@p0$@0#sRefSetList_add
+10609$@1@@1@s0@3@0@0#flagMarker_createLocalSet
+10615$@1@@1@s0@3@0@0#flagMarker_createIgnoreCount
+10611$@1@@1@s0@3@0@0#flagMarker_createSuppress
+10617$@1@@1@s0@3@0@0#flagMarker_createIgnoreOff#flagMarker_createIgnoreOn
+6743$@1@@1@s0@2@0@0#flagMarkerList_new
+8781$@1@@1@s0@2@0@0#macrocache_create
+6814@6@2@1@0@0@1@@1@s0@2@0@0#fileTable_create
+12541@6@5@1@0@0@1@@1@s0@18@2@0#context_fileTable
+6872@6@5@1@0@0@1@@1@s0@2@0@0#messageLog_new
+12545@6@5@1@0@0$@19@2@0#context_messageLog
+6890$@1@@1@s0@2@0@0#clauseStack_new
+7928$$$@0#cppGetToken
+7836$@0@@1@p0@19@2@0#cppReader_popBuffer
+7849@6@5@1@0@0$@19@2@0#cppReader_fileBuffer
+7972$@0@@1@s0@19@2@0@2.0.fbuffer.tp0$#cppReader_getBufferSafe#cppReader_nullBuffer
+7994$@1@@1@s0@19@2@0#cppBuffer_prevBuffer
+8068$$@19@2@0#cppReader_install
+8071$$@19@2@0#cppReader_installMacro
+8060@6@5@1@0@0$@19@2@0#cppReader_lookup#cppReader_lookupExpand
+7412$$@18@2@0@2.0.fopts.tp0$#CPPOPTIONS
+8009$$@3@0@0#cppReader_parseNumber
+12849$@0@@1@tp2$@0#osd_getExePath#osd_getPath
+12843$@0@@1@tp1$@0#osd_findOnLarchPath
+10180@6@5@1@0@0$@3@0@0#fileIdList_create
+10716@6@5@1@0@0@0@@1@p0$@0#sRefTable_add
+12054@6@5@1@0@0@1@@1@s0@2@0@0#filelocStack_new
+12069$$@2@0@0#intSet_new
+13080$$$@0#exprNodeSList_append
+13082$$@2@0@0#exprNodeSList_singleton
+13062$$@2@0@0#exprNodeSList_new
+15267$@1@@1@s0$@0#LCLScanCharClass
+14054$$$@0#lscanCharClass
+16901$$@3@0@0#yy_scan_bytes
+16895$$@3@0@0#yy_scan_buffer
+16881$$@3@0@0#yy_create_buffer
+16898$$@3@0@0#yy_scan_string
+203@6@5@1@0@0@0@s1,g2855@0@0@1@s1,g2855$@0#signal
+624$@0@@1@tp0$@0#memset
+575$@0@@1@tp0$@0#memmove
+572$@0@@1@tp0$@0#memcpy
+588$@0@@1@tp0$@0#strncat
+582$@0@@1@tp0$@0#strncpy
+585$@0@@1@tp0$@0#strcat#strcpy
+453$@0@@1@tp0$@0#wcsncat#wcsncpy
+431$@0@@1@tp0$@0#wcscat#wcscpy
+518$@1@@1@s0$@0#iswctype
+509$@1@@1@s0$@0#iswalnum#iswalpha#iswcntrl#iswdigit#iswgraph#iswlower#iswprint#iswpunct#iswspace#iswupper#iswxdigit
+77$@1@@1@s0$@0#isalnum#isalpha#iscntrl#isdigit#isgraph#islower#isprint#ispunct#isspace#isupper#isxdigit
+116$@1@@1@s0$@0#tolower#toupper
+251@6@0@1@1@0@0@@1@tp0$@0#sprintf
+241@6@0@1@1@0@0@s3@1@s3,tp0$@0#fprintf
+246@6@0@1@1@0@1@g2872@0@0,s3@1@s3,tg2872$@0#printf
+7805$$$@0#cppSkipHspace
+548$@1@@1@s0$@0#towctrans
+551$@1@@1@s0$@0#towlower#towupper
+1940$$$@0#check
+*5 (Iterator)
+4395@34#aliasTable_elements
+3300@15#termNodeList_elements
+4549@26#usymtab_entries
+4079@32#sRefSet_allElements#sRefSet_elements#sRefSet_realElements
+1250@38#cstring_chars
+1829@43#cstringSList_elements
+1859@44#cstringList_elements
+2113@45#qualList_elements
+2297@47#paramNodeList_elements
+2432@49#ltokenList_elements
+2506@50#importNodeList_elements
+2540@52#lsymbolList_elements
+2553@53#lsymbolSet_elements
+2568@54#sortSet_elements
+2602@55#pairNodeList_elements
+2629@56#declaratorInvNodeList_elements
+2671@58#declaratorNodeList_elements
+2700@59#varNodeList_elements
+2725@60#quantifierNodeList_elements
+2763@61#storeRefNodeList_elements
+2792@62#letDeclNodeList_elements
+2821@63#programNodeList_elements
+2863@64#initDeclNodeList_elements
+2895@65#varDeclarationNodeList_elements
+2929@66#fcnNodeList_elements
+2976@67#stDeclNodeList_elements
+3055@69#typeNameNodeList_elements
+3101@70#sigNodeSet_elements
+3159@71#lslOpSet_elements
+3192@72#replaceNodeList_elements
+3229@73#traitRefNodeList_elements
+3279@74#interfaceNodeList_elements
+3349@76#sortSetList_elements
+3770@78#exprNodeList_elements
+3859@80#filelocList_elements
+3891@81#enumNameList_elements
+4240@84#usymIdSet_elements
+4248@85#uentryList_elements
+4328@86#globSet_allElements
+5098@91#specialClauses_elements#specialClauses_postElements#specialClauses_preElements
+6539@93#idDeclList_elements
+6680@94#sRefSetList_elements
+6884@98#clauseStack_elements
+10178@124#fileIdList_elements
+12067@151#intSet_elements
+13060@155#exprNodeSList_elements
+12630@0#allModes
+1863@0#allFlagCodes#excludeFlagCodes
+12628@0#allFlags
+*6 (Iterator finalizer)
+0@0#end_allFlagCodes#end_allFlags#end_allModes#end_excludeFlagCodes
+0@15#end_termNodeList_elements
+0@26#end_usymtab_entries
+0@32#end_sRefSet_allElements#end_sRefSet_elements#end_sRefSet_realElements
+0@34#end_aliasTable_elements
+0@38#end_cstring_chars
+0@43#end_cstringSList_elements
+0@44#end_cstringList_elements
+0@45#end_qualList_elements
+0@47#end_paramNodeList_elements
+0@49#end_ltokenList_elements
+0@50#end_importNodeList_elements
+0@52#end_lsymbolList_elements
+0@53#end_lsymbolSet_elements
+0@54#end_sortSet_elements
+0@55#end_pairNodeList_elements
+0@56#end_declaratorInvNodeList_elements
+0@58#end_declaratorNodeList_elements
+0@59#end_varNodeList_elements
+0@60#end_quantifierNodeList_elements
+0@61#end_storeRefNodeList_elements
+0@62#end_letDeclNodeList_elements
+0@63#end_programNodeList_elements
+0@64#end_initDeclNodeList_elements
+0@65#end_varDeclarationNodeList_elements
+0@66#end_fcnNodeList_elements
+0@67#end_stDeclNodeList_elements
+0@69#end_typeNameNodeList_elements
+0@70#end_sigNodeSet_elements
+0@71#end_lslOpSet_elements
+0@72#end_replaceNodeList_elements
+0@73#end_traitRefNodeList_elements
+0@74#end_interfaceNodeList_elements
+0@76#end_sortSetList_elements
+0@78#end_exprNodeList_elements
+0@80#end_filelocList_elements
+0@81#end_enumNameList_elements
+0@84#end_usymIdSet_elements
+0@85#end_uentryList_elements
+0@86#end_globSet_allElements
+0@91#end_specialClauses_elements#end_specialClauses_postElements#end_specialClauses_preElements
+0@93#end_idDeclList_elements
+0@94#end_sRefSetList_elements
+0@98#end_clauseStack_elements
+0@124#end_fileIdList_elements
+0@151#end_intSet_elements
+0@155#end_exprNodeSList_elements
+*7 (Struct tag)
+0@2477#@_functionTermNode
+0@7389#@cpp_pending
+5180@5181#@_ueinfo
+665@666#@dirent
+3683@3684#@_scopeInfo
+16016@16017#@!99
+5644@5645#@_cjinfo
+6265@6266#@_exprPair
+6293@6294#@_exprUop
+3021@3022#@_lclconj
+929@930#@utimbuf
+9060@9061#@_tfixed
+13976@13977#@!91
+2145@2146#@!11
+3690@3688#@_htEntry
+2615@2616#@_declaratorInvNode
+2849@2850#@_initDeclNode
+2643@2644#@!19
+6301@6302#@_exprInit
+14124@14125#@!93
+6277@6278#@_exprCall
+12084@12085#@!83
+4980@961#@_idDecl
+3134@2480#@_nameNode
+3211@3212#@_renamingNode
+6281@6282#@_exprIterCall
+3825@3826#@_hentry
+2489@2481#@_importNode
+2741@2742#@_storeRefNode
+2997@2998#@_typeNode
+3243@3244#@_exportNode
+3254@3255#@_privateNode
+3265@3266#@_interfaceNode
+3677@3678#@!50
+5016@5017#@_multiVal
+15563@15564#@!98
+2962@2963#@_stDeclNode
+4425@4426#@_refentry
+5632@5633#@_cref
+6859@6860#@_msgentry
+16916@16917#@skeyword
+2946@2947#@_iterNode
+9048@9049#@_tsu
+3662@3663#@_opInfo
+3145@3146#@_lslOp
+3174@3175#@!37
+3205@3206#@_nameAndReplaceNode
+8010@8011#@token
+14190@14191#@!94
+6261@6262#@_exprOffsetof
+367@368#@!2
+374@375#@!3
+5640@5641#@_fldinfo
+6289@6290#@_exprField
+2645@2646#@!20
+2591@2482#@_pairNode
+2989@2990#@_taggedUnionNode
+9056@9057#@_tenum
+6217@970#@_guardSet
+1761@1762#@_lltok
+2682@2683#@_arrayQualNode
+3217@3218#@_traitRefNode
+2872@2873#@_constDeclarationNode
+4938@4939#@_qtype
+9067@8934#@__ctbase
+5151@5152#@_ucinfo
+6285@6286#@_exprOp
+9052@9053#@_tconj
+5165@5166#@_udinfo
+5176@5177#@_uiinfo
+5636@5637#@_ainfo
+7371@7369#@parse_marker
+3696@3697#@!52
+7436@7432#@macrodef
+2140@2138#@_mappair
+12063@12064#@_intSet
+2564@2565#@_sortSet
+2547@2548#@_lsymbolSet
+3097@3098#@_sigNodeSet
+3155@3156#@_lslOpSet
+4076@973#@_sRefSet
+4208@4209#@_usymIdSet
+10693@10694#@_sRefTable
+6297@6298#@_exprCast
+7767@7768#@default_include
+687@688#@group
+2659@2475#@_declaratorNode
+15571@3699#@_symtableStruct
+2845@2846#@_CTypesNode
+3036@3037#@_typeNamePack
+3041@3042#@_typeNameNode
+12616@12617#@!86
+3339@2473#@_stmtNode
+5652@5653#@_alinfo
+7934@7390#@file_name_map_list
+7931@7460#@file_name_map
+2105@2106#@_qualList
+3851@3852#@_filelocList
+12039@12040#@_filelocStack
+1801@1802#@_cstringSList
+1831@1832#@_cstringList
+2293@2294#@_paramNodeList
+2502@2503#@_importNodeList
+2536@2537#@_lsymbolList
+2598@2599#@_pairNodeList
+2625@2626#@_declaratorInvNodeList
+2667@2668#@_declaratorNodeList
+2696@2697#@_varNodeList
+2721@2722#@_quantifierNodeList
+2759@2760#@_storeRefNodeList
+2788@2789#@_letDeclNodeList
+2819@2805#@_programNodeList
+2859@2860#@_initDeclNodeList
+2891@2892#@_varDeclarationNodeList
+2925@2926#@_fcnNodeList
+2972@2973#@_stDeclNodeList
+3051@3052#@_typeNameNodeList
+3188@3189#@_replaceNodeList
+3225@3226#@_traitRefNodeList
+3370@3371#@_lslOpList
+3887@3888#@_enumNameList
+4364@4365#@_ctypeList
+5094@5095#@!65
+6535@6536#@_idDeclList
+6676@6677#@_sRefSetList
+6738@6739#@_flagMarkerList
+6865@6866#@_messageLog
+13056@13057#@_exprNodeSList
+6762@6763#@_mcelist
+6269@6270#@_exprTriple
+2711@2712#@_quantifierNode
+9044@9045#@_cfcn
+715@716#@sigaction
+3835@3822#@_hashTable
+3829@3830#@_hbucket
+8943@8944#@_cttable
+5074@5075#@!64
+2833@2474#@_lclPredicateNode
+2836@2837#@_exposedNode
+2952@2476#@_abstBodyNode
+2275@2276#@_paramNode
+2809@2810#@_programNode
+6756@6757#@_mce
+3647@3648#@_fctInfo
+3658@3659#@_varInfo
+1324@979#@__fileloc
+3027@938#@_lclTypeSpecNode
+5161@5162#@_uvinfo
+6696@6697#@_flagMarker
+2163@2161#@_smemberInfo
+3345@3346#@_sortSetList
+2517@2518#@_sortList
+2428@2429#@_ltokenList
+3766@3767#@_exprNodeList
+4247@4243#@_uentryList
+6880@6881#@_clauseStack
+4386@976#@_aliasTable
+6791@6792#@_fileTable
+3078@2478#@_quantifiedTermNode
+15567@15568#@_idTable
+6273@6274#@_exprIter
+769@770#@tms
+3084@2479#@_sigNode
+3124@3125#@_signNode
+2774@2775#@_modifyNode
+3011@3012#@_enumSpecNode
+3178@3179#@_replaceNode
+2686@2687#@_varNode
+2780@2781#@_letDeclNode
+2649@946#@_typeExpr
+802@803#@termios
+3651@3652#@_typeInfo
+3668@3669#@_tagInfo
+3006@2472#@_strOrUnionNode
+679@680#@flock
+3275@3276#@_interfaceNodeList
+7374@7372#@arglist
+8007@7481#@operation
+696@697#@passwd
+774@775#@utsname
+3074@2471#@_opFormNode
+8937@8938#@_ctentry
+3299@941#@_termNodeList
+7462@7383#@file_name_list
+7444@7386#@if_stack
+2956@2957#@_abstractNode
+6785@6786#@_ftentry
+2881@2882#@_varDeclarationNode
+7736@7737#@directive
+2909@2910#@_claimNode
+7440@7438#@reflist
+7489@7336#@hashnode
+2073@2074#@!10
+7829@7830#@argdata
+632@444#@tm
+2347@949#@_ltoken
+7443@7434#@definition
+5172@5173#@_ufinfo
+744@745#@stat
+16746@16742#@yy_buffer_state
+2166@2167#@_sortNode
+4432@964#@_usymtab
+2915@2916#@_fcnNode
+12623@12624#@!88
+3288@935#@_termNode
+5188@956#@_uentry
+6310@967#@_exprNode
+5656@953#@_sRef
+120@121#@lconv
+7388@7332#@cppBuffer
+7394@7340#@cppReader
+7425@7334#@cppOptions
+12107@12108#@_context
+*8 (Union tag)
+7441@7442#$!76
+3666@3667#$!47
+3132@3133#$!36
+3176@3177#$!38
+3209@3210#$!39
+2807@2808#$!25
+6694@6695#$!73
+2995@2996#$!29
+12105@12106#$!85
+7485@7486#$hashval
+3071@3072#$!34
+3675@3676#$!49
+2739@2740#$!23
+2647@2648#$!21
+3252@3253#$!43
+15561@15562#$!97
+3263@3264#$!45
+5014@5015#$_mval
+3025@3026#$!32
+3241@3242#$!41
+5184@5185#$_uinfo
+13955@13956#$!89
+9064@9065#$_uconts
+5648@5649#$_sinfo
+6306@6307#$_exprData
+9618@9619#$!78
+12000@12001#$!82
+*9 (Enum tag)
+1144@1145#&!4
+1321@1322#&!6
+1287@1288#&!5
+1488@1489#&_quals
+1776@1777#&!7
+1860@1861#&!8
+1864@1865#&!9
+2158@2159#&!12
+2259@2260#&!13
+2262@2263#&!14
+2272@2273#&_paramtype
+2344@2345#&!15
+2483@2484#&!16
+2486@2487#&!17
+2640@2641#&!18
+2736@2737#&!22
+2801@2802#&!24
+3081@3082#&!35
+2830@2831#&!26
+2842@2843#&!27
+2878@2879#&!28
+3003@3004#&!30
+3017@3018#&!31
+3068@3069#&!33
+3249@3250#&!42
+3260@3261#&!44
+3238@3239#&!40
+3655@3656#&!46
+3680@3681#&!51
+3672@3673#&!48
+3935@3936#&!53
+3938@3939#&!54
+3941@3942#&_nstate
+3946@3947#&!55
+3949@3950#&!56
+4042@4043#&_exitkind
+4178@4179#&!57
+4422@4423#&!58
+4670@4671#&!59
+4673@4674#&!60
+5068@5069#&!62
+5071@5072#&!63
+5011@5012#&!61
+5155@5156#&!66
+5158@5159#&!67
+5169@5170#&!68
+5626@5627#&!69
+5629@5630#&!70
+6258@6259#&!71
+6691@6692#&!72
+6782@6783#&!74
+7338@7339#&cpp_token
+7430@7431#&node_type
+7423@7424#&!75
+7574@7575#&!77
+7730@7731#&file_change_code
+9875@9876#&!79
+9910@9911#&!80
+10295@10296#&!81
+12087@12088#&!84
+12620@12621#&!87
+13973@13974#&!90
+14061@14062#&!92
+15203@15204#&!95
+15558@15559#&!96
+;; Modules access
+ansi#8@
+posix#13@
+lclForwardTypes#16@
+forwardTypes#39@
+bool#41@
+fileId#42@
+cstringSList#43@
+cstringList#44@
+qualList#45@
+paramNodeList#47@
+ltokenList#49@
+importNodeList#50@
+sortList#51@
+lsymbolList#52@
+lsymbolSet#53@
+sortSet#54@
+pairNodeList#55@
+declaratorInvNodeList#56@
+declaratorNodeList#58@
+varNodeList#59@
+quantifierNodeList#60@
+storeRefNodeList#61@
+letDeclNodeList#62@
+programNodeList#63@
+initDeclNodeList#64@
+varDeclarationNodeList#65@
+fcnNodeList#66@
+stDeclNodeList#67@
+typeNameNodeList#69@
+sigNodeSet#70@
+lslOpSet#71@
+replaceNodeList#72@
+traitRefNodeList#73@
+interfaceNodeList#74@
+sortSetList#76@
+lslOpList#77@
+exprNodeList#78@
+cprim#79@
+filelocList#80@
+enumNameList#81@
+enumNameSList#154@
+ekind#83@
+usymIdSet#84@
+uentryList#85@
+globSet#86@
+ctypeList#87@
+lctype#88@
+qtype#89@
+specialClauses#91@
+idDeclList#93@
+sRefSetList#94@
+flagMarkerList#95@
+fileTable#130@
+messageLog#97@
+clauseStack#98@
+cppmain#38@
+cpplib#38@
+cpphash#38@
+uentry#103@
+macrocache#38@
+ctbase#111@
+cttable#118@
+ctype#38@
+clabstract#38@
+aliasChecks#38@
+fileIdList#124@
+fileloc#42@
+source#38@
+llerror#38@
+sRefTable#134@
+usymtab#144@
+sRef#38@
+filelocStack#150@
+intSet#151@
+context#153@
+exprNodeSList#155@
+typeIdSet#84@
+imports#38@
+exprNode#165@
+exprChecks#161@
+llmain#38@
+cscanner#38@
+;;End
diff --git a/src/lclint.lclintrc b/src/lclint.lclintrc
new file mode 100644
index 0000000..8381c7a
--- /dev/null
+++ b/src/lclint.lclintrc
@@ -0,0 +1,82 @@
+-IHeaders 
+-DDEBUGPRINT
+
+## -systemdirs /usr/include:/usr/local/lib/
+
++allmacros # check all macros
++checks    # checks mode (moderately strict checking)
+
+### Display Flags
++showscan 
++showsummary 
++stats 
++timedist 
+
++charindex 
+-allglobals 
+-export 
++voidabstract 
++forwarddecl 
++relaxquals 
++allmacros
+
+### Assume all while and for loops execute at least once
++loopexec
+
+### Naming Convention
+
++czech 
+-czechconstants
+-enumprefix ~~* 
+-uncheckedmacroprefix ~* 
+
+### global variables should start with g_
+-globalprefix g_
++globalprefixexclude
+
+### parameters in declarations should start with p_
+-protoparamprefix p_
++protoparamprefixexclude
+
+### these flags slow down checking a lot,
+### only use on special occasions.
+###
+
++distinctinternalnames -internalnamecaseinsensitive 
++internalnamelookalike
+
+# -externalnamelen 24 
+
++sizeoftype 
++repeatunrecog 
++topuse 
++deepbreak 
++needspec 
++evalorderuncon 
+-mustmod 
++ansilimits 
++allempty 
++whileblock 
++forblock 
++elseifcomplete 
+
+### Limit maximimum include nesting
+
+-includenest 5
+
+### Some ANSI limits exceeded (tsk, tsk, tsk...)
+
+-controlnestdepth 25 
+-numenummembers 400 
+
++posixlib
+     
+### this should be builtin to pp?
+-D__i386__
+-D_M_IX86
+
+-booltype bool
+-booltrue TRUE
+-boolfalse FALSE
+
++numliteral
diff --git a/src/lcllib.c b/src/lcllib.c
new file mode 100644
index 0000000..a7a5140
--- /dev/null
+++ b/src/lcllib.c
@@ -0,0 +1,565 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lcllib.c
+**
+** routines for loading and creating library files
+**
+** this is a brute-force implementation, a more efficient
+** representation should be designed.
+**
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+# include "osd.h"
+
+# ifndef NOLCL
+# include "gram.h"
+
+# include "lclscan.h"
+# endif
+
+
+# include "herald.h"
+# include "lcllib.h"
+# include "llmain.h"
+# include "portab.h"
+
+/*@-incondefs@*/ /*@-redecl@*/
+extern /*@dependent@*/ FILE *yyin;
+/*@=incondefs@*/ /*@=redecl@*/
+
+/*@constant int NUMLIBS; @*/
+# define NUMLIBS 17
+
+/*@constant int NUMPOSIXLIBS; @*/
+# define NUMPOSIXLIBS 12
+
+static ob_mstring posixlibs[NUMPOSIXLIBS] = 
+{
+  "sys/stat",
+  "sys/types",
+  "dirent",
+  "fcntl",
+  "grp",
+  "pwd",
+  "sys/times",
+  "sys/utsname",
+  "sys/wait",
+  "termios",
+  "unistd",
+  "utime"
+} ;
+
+static ob_mstring stdlibs[NUMLIBS] =
+{
+  "assert", 
+  "ctype",
+  "errno",
+  "float", 
+  "limits",
+  "locale",
+  "math", 
+  "setjmp",
+  "signal",
+  "stdarg",
+  "stddef",
+  "stdio",
+  "stdlib",
+  "strings", 
+  "string",
+  "time",
+  "wchar"
+} ;
+
+static bool loadStateFile (FILE * p_f, cstring p_name);
+
+bool
+lcllib_isSkipHeader (cstring sname)
+{
+  int i;
+  bool posixlib = FALSE;
+  char *libname;
+  char *name = cstring_toCharsSafe (sname);
+  char *matchname;
+
+  llassert (cstring_isDefined (sname));
+  name = removeExtension (name, ".h");
+
+  libname = strrchr (name, CONNECTCHAR);
+  matchname = libname;
+
+  if (libname == NULL) 
+    {
+      libname = name;
+    }
+  else
+    {
+      libname++;
+      /*@-branchstate@*/
+    }
+  /*@=branchstate@*/
+
+  if (mstring_equal (libname, "varargs"))
+    {
+      fileloc tmp = fileloc_makePreprocPrevious (g_currentloc);
+      
+      voptgenerror 
+	(FLG_USEVARARGS,
+	 message ("Include file <%s> is inconsistent with "
+		  "ANSI library (should use )",
+		  cstring_fromChars (libname)),
+	 tmp);
+      
+      fileloc_free (tmp);
+      sfree (name);
+      return TRUE;
+    }
+
+  if (context_getFlag (FLG_SKIPANSIHEADERS)
+      && context_usingAnsiLibrary ())
+    {
+      
+      for (i = 0; i < NUMLIBS; i++)
+	{
+	  if (mstring_equal (libname, stdlibs[i]))
+	    {
+	      sfree (name);
+	      return TRUE;
+	    }
+	}
+    }
+
+  for (i = 0; i < NUMPOSIXLIBS; i++)
+    {
+      if (strchr (posixlibs[i], CONNECTCHAR) != NULL)
+	{
+	  char *ptr;
+	  
+	  if ((ptr = strstr (name, posixlibs[i])) != NULL) 
+	    {
+	      if (ptr[strlen (posixlibs[i])] == '\0')
+		{
+		  posixlib = TRUE;
+		  matchname = ptr;
+		  break;
+		}
+	      else
+		{
+		  ; /* no match */
+		}
+	    }
+	}
+      else
+	{
+	  if (mstring_equal (libname, posixlibs[i]))
+	    {
+	      posixlib = TRUE;
+	      matchname = libname;
+	      break;
+	    }
+	  /*@-branchstate@*/ 
+	}
+    } /*@=branchstate@*/
+  
+  if (posixlib)
+    {
+      if (context_usingPosixLibrary ())
+	{
+	  if (context_getFlag (FLG_SKIPPOSIXHEADERS))
+	    {
+	      sfree (name);
+	      return TRUE;
+	    }
+	}
+      else
+	{	
+	  fileloc tmp = fileloc_makePreprocPrevious (g_currentloc);	      
+	  
+	  voptgenerror 
+	    (FLG_WARNPOSIX,
+	     message ("Include file <%s> matches the name of a "
+		      "POSIX library, but the POSIX library is "
+		      "not being used.  Consider using +posixlib "
+		      "or +posixstrictlib to select the POSIX "
+		      "library, or -warnposix "
+		      "to suppress this message.",
+		      cstring_fromChars (matchname)),
+	     tmp);
+	  
+	  fileloc_free (tmp);
+	}
+    }
+
+  sfree (name);
+  return FALSE;
+}
+
+static void printDot (void)
+{
+  if (context_getFlag (FLG_SHOWSCAN)) 
+    {
+      (void) fflush (g_msgstream);
+      fprintf (stderr, "."); 
+      (void) fflush (stderr);
+    }
+}
+
+void
+dumpState (cstring cfname)
+{
+  FILE *f;
+  char *fname = cstring_toCharsSafe (cfname);
+  
+  fname = addExtension (fname, DUMP_SUFFIX);
+  
+  f = fopen (fname, "w");
+
+  if (context_getFlag (FLG_SHOWSCAN))
+    {
+      fprintf (stderr, "< Dumping to %s ", fname); 
+    }
+  
+  if (f == NULL)
+    {
+      llgloberror (message ("Cannot open dump file for writing: %s", cfname));
+    }
+  else
+    {
+      /*
+      ** sequence is convulted --- must call usymtab_prepareDump before
+      **    dumping ctype table to convert type uid's
+      */
+
+      printDot ();
+
+      usymtab_prepareDump ();
+
+      /*
+      ** Be careful, these lines must match loadStateFile checking.
+      */
+
+      fprintf (f, ";;LCLint Dump: %s\n", fname);
+      fprintf (f, ";;%s\n", LCL_VERSION);
+      fprintf (f, ";;lib:%d\n", (int) context_getLibrary ());
+      fprintf (f, ";;ctTable\n");
+
+      printDot ();
+            ctype_dumpTable (f);
+      printDot ();
+
+      fprintf (f, ";;tistable\n");
+      typeIdSet_dumpTable (f);
+      printDot ();
+
+            fprintf (f, ";;symTable\n");
+      usymtab_dump (f);
+      printDot ();
+
+      fprintf (f, ";; Modules access\n");
+      context_dumpModuleAccess (f);
+      fprintf (f, ";;End\n");
+      check (fclose (f) == 0);
+    }
+
+  if (context_getFlag (FLG_SHOWSCAN))
+    {
+      fprintf (g_msgstream, " >\n");
+    }
+
+  sfree (fname);
+}
+
+bool
+loadStandardState ()
+{
+  char *fpath;
+  FILE *stdlib;
+  bool result;
+  char *libname = addExtension (context_selectedLibrary (), DUMP_SUFFIX);
+  
+  
+  if (osd_findOnLarchPath (libname, &fpath) != OSD_FILEFOUND)
+    {
+      lldiagmsg (message ("Cannot find %sstandard library: %s", 
+			  cstring_makeLiteralTemp 
+			  (context_getFlag (FLG_STRICTLIB) ? "strict " 
+			   : (context_getFlag (FLG_UNIXLIB) ? "unix " : "")),
+			  cstring_makeLiteralTemp (libname)));
+      lldiagmsg (cstring_makeLiteral ("     Check LARCH_PATH environment variable."));
+      result = FALSE;
+    }
+  else
+    {
+      stdlib = fopen (fpath, "r");
+
+      if (stdlib == NULL)
+	{
+	  lldiagmsg (message ("Cannot read standard library: %s",
+			  cstring_fromChars (fpath)));
+	  lldiagmsg (cstring_makeLiteral ("     Check LARCH_PATH environment variable."));
+
+	  result = FALSE;
+	}
+      else
+	{
+	  if (context_getFlag (FLG_WHICHLIB))
+	    {
+	      char *t = mstring_create (MAX_NAME_LENGTH);
+	      char *ot = t;
+
+	      if (fgets (t, MAX_NAME_LENGTH, stdlib) == NULL)
+		{
+		  llfatalerror (cstring_makeLiteral ("Standard library format invalid"));
+		}
+
+	      if (fgets (t, MAX_NAME_LENGTH, stdlib) != NULL)
+		{
+		  if (*t == ';' && *(t + 1) == ';') 
+		    {
+		      t += 2;
+		    }
+		}
+
+	      if (t == NULL)
+		{
+		  lldiagmsg (message ("Standard library: %s ", 
+				  cstring_fromChars (fpath)));
+		}
+	      else
+		{
+		  char *tt;
+
+		  tt = strrchr (t, '\n');
+		  if (tt != NULL)
+		    *tt = '\0';
+
+		  lldiagmsg (message ("Standard library: %s", cstring_fromChars (fpath)));
+		  lldiagmsg (message ("   (created using %s)", cstring_fromChars (t)));
+		}
+
+	      sfree (ot);
+	      
+	      check (fclose (stdlib) == 0);
+	      stdlib = fopen (fpath, "r");
+	    }
+
+	  llassert (stdlib != NULL);
+
+	  fileloc_reallyFree (g_currentloc);
+	  g_currentloc = fileloc_createLib (cstring_makeLiteralTemp (libname));
+
+	  if (context_getDebug (FLG_SHOWSCAN))
+	    {
+	      context_hideShowscan ();
+	      result = loadStateFile (stdlib, cstring_fromChars (fpath));
+	      context_unhideShowscan ();
+	    }
+	  else
+	    {
+	      result = loadStateFile (stdlib, cstring_fromChars (fpath));
+	    }
+
+	  check (fclose (stdlib) == 0);
+	}
+    }
+
+  sfree (libname);
+  return result;
+}
+
+/*@constant int BUFLEN;@*/
+# define BUFLEN 128
+
+static bool
+loadStateFile (FILE *f, cstring name)
+{
+  char buf[BUFLEN];
+  
+  /*
+  ** Check version.  Should be >= LCL_MIN_VERSION
+  */
+
+  if ((fgets (buf, BUFLEN, f) == NULL)
+      || !mstring_equalPrefix (buf, ";;LCLint Dump:"))
+    {
+      loadllmsg (message ("Load library %s is not in LCLint library format.  Attempting "
+		      "to continue without library.", name));
+      return FALSE;
+    }
+  
+  if (fgets (buf, BUFLEN, f) != NULL)
+    {
+      if (!mstring_equalPrefix (buf, ";;"))
+	{
+	  loadllmsg (message ("Load library %s is not in LCLint library format.  Attempting "
+			  "to continue without library.", name));
+	  return FALSE;
+	}
+      else if (mstring_equalPrefix (buf, ";;ctTable"))
+	{
+	  loadllmsg (message ("Load library %s is in obsolete LCLint library format.  Attempting "
+			  "to continue anyway, but results may be incorrect.  Rebuild "
+			  "the library with this version of lclint.", 
+			  name));
+	}
+      else 
+	{
+	  float version = 0.0;
+
+	  if (sscanf (buf, ";;LCLint %f", &version) != 1)
+	    {
+	      loadllmsg (message ("Load library %s is not in LCLint library format (missing version "
+			      "number).  Attempting "
+			      "to continue without library.", name));
+	      return FALSE;
+	    }
+	  else
+	    {
+	      if ((LCL_MIN_VERSION - version) >= FLT_EPSILON)
+		{
+		  cstring vname;
+		  char *nl = strchr (buf, '\n');
+
+		  *nl = '\0';
+
+		  vname = cstring_fromChars (buf + 9);
+
+		  loadllmsg (message ("Load library %s is in obsolete LCLint library "
+				      "format (version %s).  Attempting "
+				      "to continue anyway, but results may be incorrect.  Rebuild "
+				      "the library with this version of lclint.", 
+				      name, vname));
+		}
+	      else
+		{
+		  if ((fgets (buf, BUFLEN, f) == NULL))
+		    {
+		      loadllmsg (message ("Load library %s is not in LCLint library "
+					  "format (missing library code). Attempting "
+					  "to continue without library.", name));
+		      return FALSE;
+		    }
+		  else 
+		    {
+		      int lib;
+		      
+		      if (sscanf (buf, ";;lib:%d", &lib) != 1)
+			{
+			  loadllmsg (message ("Load library %s is not in LCLint library "
+					      "format (missing library code). Attempting "
+					      "to continue without library.", name));
+			  return FALSE;
+			}
+		      else
+			{
+			  flagcode code = (flagcode) lib;
+
+			  if (flagcode_isLibraryFlag (code))
+			    {
+			      if (context_doMerge ()) 
+				{
+				  context_setLibrary (code);
+				}
+			    }
+			  else
+			    {
+			      loadllmsg (message ("Load library %s has invalid library code.  "
+						  "Attempting to continue without library.",
+						  name));
+			      
+			      return FALSE;
+			    }
+			}
+		    }
+		}
+	    }
+	}
+    }
+  else
+    {
+      loadllmsg (message ("Load library %s is not in LCLint library format (missing lines).  "
+			  "Attempting to continue without library.", name));
+      return FALSE;
+    }
+  
+  ctype_loadTable (f);
+  printDot ();
+  
+  typeIdSet_loadTable (f);
+  printDot ();
+  
+  usymtab_load (f);
+  printDot ();
+  
+  context_loadModuleAccess (f);
+  printDot ();
+  
+  return TRUE;
+}
+
+/*
+** load state from file created by dumpState
+*/
+
+void
+loadState (cstring cfname)
+{
+  FILE *f;
+  char *fname = cstring_toCharsSafe (cfname);
+  cstring ofname = cstring_copy (cfname);
+
+  fname = addExtension (fname, DUMP_SUFFIX);
+
+  f = fopen (fname, "r");
+
+  if (f == NULL)
+    {
+      if (context_getDebug (FLG_SHOWSCAN))
+	fprintf (g_msgstream, " >\n");
+
+      llfatalerror (message ("Cannot open dump file for loading: %s", cfname));
+    }
+  else
+    {
+      fileloc_reallyFree (g_currentloc);
+      g_currentloc = fileloc_createLib (ofname);
+
+      if (!loadStateFile (f, ofname)) 
+	{
+	  if (!loadStandardState ()) 
+	    {
+	      ctype_initTable ();
+	    }
+	}
+      
+      check (fclose (f) == 0);
+    }
+
+  cstring_free (ofname);
+  sfree (fname);
+}
+
diff --git a/src/lclscan.c b/src/lclscan.c
new file mode 100644
index 0000000..86abdd9
--- /dev/null
+++ b/src/lclscan.c
@@ -0,0 +1,212 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lclscan.c
+**
+** Deliver tokens one at a time
+**
+**	METHOD:
+**	The input arrives via LSLScanFreshToken ().
+**	The output is reported via LSLScanNextToken ().
+**
+**	The tokens are built in module ScanLine.
+**	The tokens are delivered from this module.
+**	Meantimes, they are saved in a static array.
+**
+**	The tokenizing is split off from the delivery of tokens
+**	to facilitate incremental scanning at a later date.
+**	The essential is that scanline () can be called or not
+**	if the input text is dirty or not.  Clean lines cause
+**	tokens to be played out from the saved token list (not
+**	yet implemented in this version).
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@-redecl@*/ /* from llgrammar.y */
+extern bool g_inTypeDef;
+/*@=redecl@*/
+
+/*@ignore@*/
+# include "llgrammar2.h" /* hack to force real include */
+/*@end@*/
+
+# include "lclscan.h"
+# include "scanline.h"
+# include "lclscanline.h"
+# include "lcltokentable.h"
+
+static tsource *scanFile;	/* file to scan		*/
+static o_ltoken TokenList[MAXLINE];	/* available tokens	*/
+static bool restore = FALSE;      /* wasn't static! */
+static YYSTYPE restoretok;
+static int nextToken;	        /* next available token */
+static int lastToken;		/* next available slot	*/
+
+static /*@dependent@*/ /*@null@*/ char *line;  /* input text */
+static unsigned int lineNumber;	               /* current line number */
+
+ltokenCode yllex (void)
+  /*@globals killed restoretok@*/ 
+{
+  lsymbol tokenSym;
+
+  if (restore)
+    {
+      yllval = restoretok;
+      restore = FALSE;
+    }
+  else
+    {
+      yllval.ltok = ltoken_copy (LCLScanNextToken ());
+    }
+
+  tokenSym = ltoken_getText (yllval.ltok);
+
+  if (ltoken_getCode (yllval.ltok) == simpleId)
+    {
+      if (g_inTypeDef)
+	{
+	  ltoken_setCode (yllval.ltok, LLT_TYPEDEF_NAME);
+	  LCLUpdateToken (LLT_TYPEDEF_NAME, tokenSym, 
+			  ltoken_isStateDefined (yllval.ltok));
+	}
+      else
+	{
+	 /* or if it is already declared as a type, so
+            typedef int foo; typedef foo bar;      works*/
+	  if (symtable_exists (g_symtab, tokenSym))
+	    {
+	      if (typeInfo_exists (symtable_typeInfo (g_symtab, tokenSym)))
+		{
+		  ltoken_setCode (yllval.ltok, LLT_TYPEDEF_NAME);
+		  LCLUpdateToken (LLT_TYPEDEF_NAME, tokenSym, 
+				  ltoken_isStateDefined (yllval.ltok));
+		}
+	    }
+	}
+    }
+
+  return (ltoken_getCode (yllval.ltok));
+}
+
+/* useful for scanning LCL init files and LSL init files ? */
+
+/*@dependent@*/ ltoken
+LCLScanNextToken (void)
+{
+  ltoken ret;
+
+  if (nextToken < lastToken)
+    {			
+      ret = TokenList[nextToken++];
+    }
+  else
+    {
+      lastToken = 0;
+      lineNumber++;
+      line = tsource_nextLine (scanFile);	
+
+      if (line != (char *) 0)
+	{
+	  
+	  LCLScanLine (line);	
+	  nextToken = 0;
+	  ret = LCLScanNextToken ();	
+	  return ret;
+	}
+      else
+	{
+	  ret = LCLScanEofToken ();
+	}
+    }
+
+
+    return ret;
+}
+
+static /*@exposed@*/ /*@dependent@*/ ltoken
+LCLScanLookAhead (void)
+{
+  if (nextToken < lastToken)
+    {			
+      return TokenList[nextToken];
+    }
+  else
+    {
+      lastToken = 0;	
+      line = tsource_nextLine (scanFile);
+      if (line != (char *) 0)
+	{
+	  LCLScanLine (line);	
+	  nextToken = 0;	
+	  return LCLScanLookAhead ();
+	}
+      else
+	{
+	  return LCLScanEofToken ();	
+	}
+    }
+}
+
+void
+LCLScanFreshToken (/*@only@*/ ltoken tok)
+{
+  if (lastToken < MAXLINE)
+    {		
+      TokenList[lastToken++] = tok;
+    }
+  else
+    {
+      llbugexitlit ("LCLScanFreshToken: out of range");
+    }
+}
+
+tsource *LCLScanSource (void)
+{
+  return scanFile;
+}
+
+
+void
+LCLScanInit (void)
+{
+}
+
+void
+LCLScanReset (tsource * s)
+{
+  scanFile = s;
+  lastToken = 0;
+  nextToken = lastToken + 1;	
+  lineNumber = 0;
+}
+
+void
+LCLScanCleanup (void)
+{
+}
+
+
diff --git a/src/lclscanline.c b/src/lclscanline.c
new file mode 100644
index 0000000..d79bdd3
--- /dev/null
+++ b/src/lclscanline.c
@@ -0,0 +1,1944 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** scanline.c
+**
+**  MODULE DESCRIPTION:
+**
+**	This module scans one line of Larch C Interface Language (LCL) input at
+**	a time.
+**
+**	The input is source text, line at a time.   The output is a sequence
+**	of tokens, reported by call-out LSLScanFreshToken.
+**
+**	This organization allows implementation of line-at-a-time incremental
+**	scanning.  The incremental mechanism is in the driving module scan.c.
+**
+**	The main loop of the scanner keys on the leading character.
+**	Within the loop are actions which collect the rest of the
+**	token starting with the character.  Various careful hacks
+**	show up to disambiguate tokens that break the general pattern
+**	(Examples, \/ and /\).  White space is passed and the loop
+**	goes once again without calling LSLScanFreshToken ().
+**	The line ends with a null.
+**
+**  AUTHORS:
+**
+**    JPW, GAF, Yang Meng Tan
+*/
+
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "gram.h"
+# include "lclscan.h"
+# include "scanline.h"
+# include "lclscanline.h"
+# include "lcltokentable.h"
+# include "lclsyntable.h"
+
+/*@constant int CHARSIZE;@*/
+# define CHARSIZE    256		/* on an 8-bit machine  */
+
+/*@notfunction@*/
+# define LCLMOVECHAR() \
+   do { *bufPtr++ = currentChar; currentChar = *currentLine++; \
+	colNumber++; } while (FALSE)
+
+/*@notfunction@*/
+# define LOOKAHEADCHAR()      (*currentLine)
+
+/*@notfunction@*/
+# define LOOKAHEADTWICECHAR() (*(currentLine + 1))
+
+/*@constant static int MAXCHAR;@*/
+# define MAXCHAR     512	/* storage for a lexeme     */
+
+/*
+** Printname for the TokenCode NOTTOKEN   (also 1st one reserved)
+** Printname for the TokenCode BADTOKEN   (also last one reserved)
+*/
+
+/*@constant static observer char *FIRSTRESERVEDNAME;@*/
+# define FIRSTRESERVEDNAME "?"
+
+/*
+** The scanner establishes lexical boundaries by first switching	    
+** on the leading character of the pending lexeme.			    
+*/
+
+typedef enum
+{
+  STARTCNUM,			/* First character of a C number. */
+  STARTCNUMDOT,			/* "." only starts a C number if digit follows*/
+  STARTCSTR,			/* First character of a C string. */
+  STARTCCHAR,			/* First character of a C character. */
+  STARTWIDE,			/* slash L starts both string and character. */
+  STARTSLASH,			/* "/" starts caret, comment comment, operator */
+  STARTOTHER			/* Everything else. */
+} StartCharType;
+
+static void ScanCComment (void);
+static void ScanEscape (void);
+static void ScanCString (void);
+static void ScanCChar (void);
+static void ScanCNumber (void);
+static void LocalUserError (/*@temp@*/ char *);
+
+/*
+** Array to store character class defintions and record end-of-comment	    
+** characters.								    
+*/
+
+static charClassData LCLcharClass[LASTCHAR + 1];
+
+/*
+** Data shared between routines LCLScanLine, ScanCString, ScanCChar,	    
+** ScanCNumber.  LCLScanLine was getting too big for one routine and	    
+** passing this data was rather cumbersome.  Making this data global seemed 
+** to be the simpliest solution.					    
+*/
+
+/* evs - sounds bogus to me! */
+
+static unsigned int colNumber;	
+static unsigned int startCol;	
+static char *currentLine;      
+static char currentChar;	
+static ltokenCode tokenCode;	
+static lsymbol tokenSym;	
+static char *bufPtr;		
+
+static bool inComment;	
+static /*@only@*/ ltoken commentTok;	
+static ltokenCode prevTokenCode; /* to disambiguate '        */
+
+static StartCharType startClass[CHARSIZE] =
+{
+  STARTOTHER,			/*	^@			    00x */
+  STARTOTHER,			/*	^a			    01x */
+  STARTOTHER,			/*	^b			    02x */
+  STARTOTHER,			/*	^c			    03x */
+  STARTOTHER,			/*	^d			    04x */
+  STARTOTHER,			/*	^e			    05x */
+  STARTOTHER,			/*	^f			    06x */
+  STARTOTHER,			/*	^g  BELL		    07x */
+
+  STARTOTHER,			/*	^h  BACKSPACE		    08x */
+  STARTOTHER,			/*	^i  TAB			    09x */
+  STARTOTHER,			/*	^j  NEWLINE		    0Ax */
+  STARTOTHER,			/*	^k			    0Bx */
+  STARTOTHER,			/*	^l  FORMFEED		    0Cx */
+  STARTOTHER,			/*	^m  RETURN		    0Dx */
+  STARTOTHER,			/*	^n			    0Ex */
+  STARTOTHER,			/*	^o			    0Fx */
+
+  STARTOTHER,			/*	^p			    10x */
+  STARTOTHER,			/*	^q			    11x */
+  STARTOTHER,			/*	^r			    12x */
+  STARTOTHER,			/*	^s			    13x */
+  STARTOTHER,			/*	^t			    14x */
+  STARTOTHER,			/*	^u			    15x */
+  STARTOTHER,			/*	^v			    16x */
+  STARTOTHER,			/*	^w			    17x */
+
+  STARTOTHER,			/*	^x			    18x */
+  STARTOTHER,			/*	^y			    19x */
+  STARTOTHER,			/*	^z			    1Ax */
+  STARTOTHER,			/*	^[ ESC			    1Bx */
+  STARTOTHER,			/*	^slash			    1Cx */
+  STARTOTHER,			/*	^]			    1Dx */
+  STARTOTHER,			/*	^^			    1Ex */
+  STARTOTHER,			/*	^_			    1Fx */
+
+  STARTOTHER,			/*	BLANK			    20x */
+  STARTOTHER,			/*	!			    21x */
+  STARTCSTR,			/*	"			    22x */
+  STARTOTHER,			/*	#			    23x */
+  STARTOTHER,			/*	$ (may be changed in reset) 24x */
+  STARTOTHER,			/*	%			    25x */
+  STARTOTHER,			/*	&			    26x */
+  STARTCCHAR,			/*	'			    27x */
+
+  STARTOTHER,			/*	(			    28x */
+  STARTOTHER,			/*	)			    29x */
+  STARTOTHER,			/*	*			    2Ax */
+  STARTOTHER,			/*	+			    2Bx */
+  STARTOTHER,			/*	,			    2Cx */
+  STARTOTHER,			/*	-			    2Dx */
+  STARTCNUMDOT,			/*	.			    2Ex */
+  STARTSLASH,			/*	/			    2Fx */
+
+  STARTCNUM,			/*	0			    30x */
+  STARTCNUM,			/*	1			    31x */
+  STARTCNUM,			/*	2			    32x */
+  STARTCNUM,			/*	3			    33x */
+  STARTCNUM,			/*	4			    34x */
+  STARTCNUM,			/*	5			    35x */
+  STARTCNUM,			/*	6			    36x */
+  STARTCNUM,			/*	7			    37x */
+
+  STARTCNUM,			/*	8			    38x */
+  STARTCNUM,			/*	9			    39x */
+  STARTOTHER,			/*	:			    3Ax */
+  STARTOTHER,			/*	;			    3Bx */
+  STARTOTHER,			/*	<			    3Cx */
+  STARTOTHER,			/*	=			    3Dx */
+  STARTOTHER,			/*	>			    3Ex */
+  STARTOTHER,			/*	?			    3Fx */
+
+  STARTOTHER,			/*	@			    40x */
+  STARTOTHER,			/*	A			    41x */
+  STARTOTHER,			/*	B			    42x */
+  STARTOTHER,			/*	C			    43x */
+  STARTOTHER,			/*	D			    44x */
+  STARTOTHER,			/*	E			    45x */
+  STARTOTHER,			/*	F			    46x */
+  STARTOTHER,			/*	G			    47x */
+
+  STARTOTHER,			/*	H			    48x */
+  STARTOTHER,			/*	I			    49x */
+  STARTOTHER,			/*	J			    4Ax */
+  STARTOTHER,			/*	K			    4Bx */
+  STARTOTHER,			/*	L			    4Cx */
+  STARTOTHER,			/*	M			    4Dx */
+  STARTOTHER,			/*	N			    4Ex */
+  STARTOTHER,			/*	O			    4Fx */
+
+  STARTOTHER,			/*	P			    50x */
+  STARTOTHER,			/*	Q			    51x */
+  STARTOTHER,			/*	R			    52x */
+  STARTOTHER,			/*	S			    53x */
+  STARTOTHER,			/*	T			    54x */
+  STARTOTHER,			/*	U			    55x */
+  STARTOTHER,			/*	V			    56x */
+  STARTOTHER,			/*	W			    57x */
+
+  STARTOTHER,			/*	X			    58x */
+  STARTOTHER,			/*	Y			    59x */
+  STARTOTHER,			/*	Z			    5Ax */
+  STARTOTHER,			/*	[			    5Bx */
+  STARTWIDE,			/*	slash			    5Cx */
+  STARTOTHER,			/*	]			    5Dx */
+  STARTOTHER,			/*	^			    5Ex */
+  STARTOTHER,			/*	_			    5Fx */
+
+  STARTOTHER,			/*	`			    60x */
+  STARTOTHER,			/*	a			    61x */
+  STARTOTHER,			/*	b			    62x */
+  STARTOTHER,			/*	c			    63x */
+  STARTOTHER,			/*	d			    64x */
+  STARTOTHER,			/*	e			    65x */
+  STARTOTHER,			/*	f			    66x */
+  STARTOTHER,			/*	g			    67x */
+
+  STARTOTHER,			/*	h			    68x */
+  STARTOTHER,			/*	i			    69x */
+  STARTOTHER,			/*	j			    6Ax */
+  STARTOTHER,			/*	k			    6Bx */
+  STARTOTHER,			/*	l			    6Cx */
+  STARTOTHER,			/*	m			    6Dx */
+  STARTOTHER,			/*	n			    6Ex */
+  STARTOTHER,			/*	o			    6Fx */
+
+  STARTOTHER,			/*	p			    70x */
+  STARTOTHER,			/*	q			    71x */
+  STARTOTHER,			/*	r			    72x */
+  STARTOTHER,			/*	s			    73x */
+  STARTOTHER,			/*	t			    74x */
+  STARTOTHER,			/*	u			    75x */
+  STARTOTHER,			/*	v			    76x */
+  STARTOTHER,			/*	w			    77x */
+
+  STARTOTHER,			/*	x			    78x */
+  STARTOTHER,			/*	y			    79x */
+  STARTOTHER,			/*	z			    7Ax */
+  STARTOTHER,			/*	{			    7Dx */
+  STARTOTHER,			/*	|			    7Cx */
+  STARTOTHER,			/*	}			    7Dx */
+  STARTOTHER,			/*	~			    7Ex */
+  STARTOTHER,
+  STARTOTHER			/*	RUBOUT			    7Fx */
+};
+
+/*
+** Given a character code, its status as part of an decimal escape sequence
+** can be derived from this table.  Digits 0-9 allowed.
+*/
+
+static bool isDigit[CHARSIZE] =
+{
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE
+};
+
+/*
+ * Given a character code, its status as part of an octal escape sequence
+ * can be derived from this table.  Digits 0-7 allowed.
+ */
+
+static bool isOigit[CHARSIZE] =
+{
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE
+};
+
+/*
+ * Given a character code, its status as part of a hex escape sequence
+ * can be derived from this table.  Digits, a-f, A-F allowed.
+ */
+
+static bool isXigit[CHARSIZE] =
+{
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+  TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+
+  FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+
+  FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE
+};
+
+
+/*
+ * Given a character code, its status as part of a C string
+ * can be derived from this table.  Everything but quotes and newline
+ * are allowed.
+ */
+
+static bool isStrChar[CHARSIZE] =
+{
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+  TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE,
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
+};
+
+/*
+ * Given a character code, its status as part of a C Character
+ * can be derived from this table.  Everything but quotes and newline
+ * are allowed.
+ */
+
+static bool isCharChar[CHARSIZE] =
+{
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE,
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE,
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
+};
+
+/*
+** Given a character code, its status as part of a string or character
+** simple escape sequence ('slash'', 'slash"', 'slash?', 'slashslash', 
+** 'slasha', 'slashb', 'slashf', 'slashn', 'slasht', and 'slashv')
+** can be derived from this table.  ''', '"', '?', 'slash', 'a',
+** 'b', 'f', 'n', 't', and 'v' are allowed.
+*/
+
+static bool isSimpleEscape[CHARSIZE] =
+{
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE,
+  FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE,
+  FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE
+};
+
+static bool reportEOL;		
+static bool reportComments;	
+static lsymbol firstReserved;  
+
+static char tokenBuffer[MAXCHAR];
+
+static const charClassData charClassDef[] =
+{
+  /* Control characters	*/
+
+  { SINGLECHAR, FALSE },		/*	 0 NULL			    */
+  { SINGLECHAR, FALSE },		/*	 1 CTRL-A		    */
+  { SINGLECHAR, FALSE },		/*	 2 CTRL-B		    */
+  { SINGLECHAR, FALSE },		/*	 3 CTRL-C		    */
+  { SINGLECHAR, FALSE },		/*	 4 CTRL-D		    */
+  { SINGLECHAR, FALSE },		/*	 5 CTRL-E		    */
+  { SINGLECHAR, FALSE },		/*	 6 CTRL-F		    */
+  { SINGLECHAR, FALSE },		/*	 7 CTRL-G		    */
+  { SINGLECHAR, FALSE },		/*	 8 CTRL-H		    */
+
+  /* defined formatting characters */
+  { WHITECHAR, FALSE },		        /*	 9 CTRL-I   TAB		    */
+  { CHC_NULL, TRUE },		/*	10 CTRL-J   EOL		    */
+
+  /* more control characters */
+  { SINGLECHAR, FALSE },		/*	11 CTRL-K		    */
+  { WHITECHAR, FALSE },		        /*	12 CTRL-L		    */
+  { SINGLECHAR, FALSE },		/*	13 CTRL-M		    */
+  { SINGLECHAR, FALSE },		/*	14 CTRL-N		    */
+  { SINGLECHAR, FALSE },		/*	15 CTRL-O		    */
+  { SINGLECHAR, FALSE },		/*	16 CTRL-P		    */
+  { SINGLECHAR, FALSE },		/*	17 CTRL-Q		    */
+  { SINGLECHAR, FALSE },		/*	18 CTRL-R		    */
+  { SINGLECHAR, FALSE },		/*	19 CTRL-S		    */
+  { SINGLECHAR, FALSE },		/*	20 CTRL-T		    */
+  { SINGLECHAR, FALSE },		/*	21 CTRL-U		    */
+  { SINGLECHAR, FALSE },		/*	22 CTRL-V		    */
+  { SINGLECHAR, FALSE },		/*	23 CTRL-W		    */
+  { SINGLECHAR, FALSE },		/*	24 CTRL-X		    */
+  { SINGLECHAR, FALSE },		/*	25 CTRL-Y		    */
+  { SINGLECHAR, FALSE },		/*	26 CTRL-Z		    */
+  { SINGLECHAR, FALSE },		/*	27 CTRL-[   ESC		    */
+  { SINGLECHAR, FALSE },		/*	28 CTRL-slash   FS    	    */
+  { SINGLECHAR, FALSE },		/*	29 CTRL-]   GS		    */
+  { SINGLECHAR, FALSE },		/*	30 CTRL-^   RS		    */
+  { SINGLECHAR, FALSE },		/*	31 CTRL-_   US		    */
+
+  /* Special printing characters */
+  { WHITECHAR, FALSE },		        /*	32 space		    */
+  { SINGLECHAR, FALSE },		/*	33 !			    */
+  { SINGLECHAR, FALSE },		/*	34 "			    */
+  { SINGLECHAR, FALSE },		/*	35 #			    */
+  { SINGLECHAR, FALSE },		/*	36 $			    */
+  { SINGLECHAR, FALSE },		/*	37 %			    */
+  { SINGLECHAR, FALSE },		/*	38 &			    */
+  { SINGLECHAR, FALSE },		/*	39 '			    */
+
+  /* Reserved characters */
+  { PERMCHAR, FALSE },		        /*	40 (			    */
+  { PERMCHAR, FALSE },		        /*	41 )			    */
+  { PERMCHAR, FALSE },		        /*	42 *			    */
+  { OPCHAR, FALSE },		        /*	43 +			    */
+  { PERMCHAR, FALSE },		        /*	44 ,			    */
+  { OPCHAR, FALSE },		        /*	45 -			    */
+  { OPCHAR, FALSE },		        /*	46 .			    */
+  { OPCHAR, FALSE },		        /*	47 /			    */
+
+/* Numbers							    */
+  { IDCHAR, FALSE },		/*	48 0			    */
+  { IDCHAR, FALSE },		/*	49 1			    */
+  { IDCHAR, FALSE },		/*	50 2			    */
+  { IDCHAR, FALSE },		/*	51 3			    */
+  { IDCHAR, FALSE },		/*	52 4			    */
+  { IDCHAR, FALSE },		/*	53 5			    */
+  { IDCHAR, FALSE },		/*	54 6			    */
+  { IDCHAR, FALSE },		/*	55 7			    */
+  { IDCHAR, FALSE },		/*	56 8			    */
+  { IDCHAR, FALSE },		/*	57 9			    */
+
+  /* More reserved and special printing characters		    */
+  { PERMCHAR, FALSE },		/*	58 :			    */
+  { PERMCHAR, FALSE },		/*	59;			    */
+  { OPCHAR, FALSE },		/*	60 <			    */
+  { OPCHAR, FALSE },		/*	61 =			    */
+  { OPCHAR, FALSE },		/*	62 >			    */
+  { SINGLECHAR, FALSE },	/*	63 ?			    */
+  { SINGLECHAR, FALSE },	/*	64 @			    */
+
+  /* Uppercase Alphabetics					    */
+  { IDCHAR, FALSE },		/*      65 A			    */
+  { IDCHAR, FALSE },		/*      66 B			    */
+  { IDCHAR, FALSE },		/*      67 C			    */
+  { IDCHAR, FALSE },		/*      68 D			    */
+  { IDCHAR, FALSE },		/*      69 E			    */
+  { IDCHAR, FALSE },		/*	70 F			    */
+  { IDCHAR, FALSE },		/*	71 G			    */
+  { IDCHAR, FALSE },		/*	72 H			    */
+  { IDCHAR, FALSE },		/*	73 I			    */
+  { IDCHAR, FALSE },		/*	74 J			    */
+  { IDCHAR, FALSE },		/*	75 K			    */
+  { IDCHAR, FALSE },		/*	76 L			    */
+  { IDCHAR, FALSE },		/*	77 M			    */
+  { IDCHAR, FALSE },		/*	78 N			    */
+  { IDCHAR, FALSE },		/*	79 O			    */
+  { IDCHAR, FALSE },		/*	80 P			    */
+  { IDCHAR, FALSE },		/*	81 Q			    */
+  { IDCHAR, FALSE },		/*	82 R			    */
+  { IDCHAR, FALSE },		/*	83 S			    */
+  { IDCHAR, FALSE },		/*	84 T			    */
+  { IDCHAR, FALSE },		/*	85 U			    */
+  { IDCHAR, FALSE },		/*	86 V			    */
+  { IDCHAR, FALSE },		/*	87 W			    */
+  { IDCHAR, FALSE },		/*	88 X			    */
+  { IDCHAR, FALSE },		/*	89 Y			    */
+  { IDCHAR, FALSE },		/*	90 Z			    */
+
+  /* Still more reserved and special printing characters	    */
+  { PERMCHAR, FALSE },		/*	91 [			    */
+  { CHC_EXTENSION, FALSE },	/*	92 slash	            */
+  { PERMCHAR, FALSE },		/*	93 ]			    */
+  { SINGLECHAR, FALSE },	/*	94 ^			    */
+  { IDCHAR, FALSE },		/*	95 _			    */
+  { SINGLECHAR, FALSE },	/*	96 `			    */
+
+  /* Lowercase alphabetics					    */
+  { IDCHAR, FALSE },		/*	97 a			    */
+  { IDCHAR, FALSE },		/*	98 b			    */
+  { IDCHAR, FALSE },		/*	99 c			    */
+  { IDCHAR, FALSE },		/*	100 d			    */
+  { IDCHAR, FALSE },		/*	101 e			    */
+  { IDCHAR, FALSE },		/*	102 f			    */
+  { IDCHAR, FALSE },		/*	103 g			    */
+  { IDCHAR, FALSE },		/*	104 h			    */
+  { IDCHAR, FALSE },		/*	105 i			    */
+  { IDCHAR, FALSE },		/*	106 j			    */
+  { IDCHAR, FALSE },		/*	107 k			    */
+  { IDCHAR, FALSE },		/*	108 l			    */
+  { IDCHAR, FALSE },		/*	109 m			    */
+  { IDCHAR, FALSE },		/*	110 n			    */
+  { IDCHAR, FALSE },		/*	111 o			    */
+  { IDCHAR, FALSE },		/*	112 p			    */
+  { IDCHAR, FALSE },		/*	113 q			    */
+  { IDCHAR, FALSE },		/*	114 r			    */
+  { IDCHAR, FALSE },		/*	115 s			    */
+  { IDCHAR, FALSE },		/*	116 t			    */
+  { IDCHAR, FALSE },		/*	117 u			    */
+  { IDCHAR, FALSE },		/*	118 v			    */
+  { IDCHAR, FALSE },		/*	119 w			    */
+  { IDCHAR, FALSE },		/*	120 x			    */
+  { IDCHAR, FALSE },		/*	121 y			    */
+  { IDCHAR, FALSE },		/*      122 z			    */
+
+  { SINGLECHAR, FALSE },	/*	123 {			    */
+  { SINGLECHAR, FALSE },	/*	124 |			    */
+  { SINGLECHAR, FALSE },	/*	125 }			    */
+  { SINGLECHAR, FALSE },	/*	126 ~			    */
+  { SINGLECHAR, FALSE },	/*	127 DEL			    */
+
+  /* MCS - unused in English					    */
+  { SINGLECHAR, FALSE },	/*	128			    */
+  { SINGLECHAR, FALSE },	/*	129			    */
+  { SINGLECHAR, FALSE },	/*	130			    */
+  { SINGLECHAR, FALSE },	/*	131			    */
+  { SINGLECHAR, FALSE },	/*	132			    */
+  { SINGLECHAR, FALSE },	/*	133			    */
+  { SINGLECHAR, FALSE },	/*	134			    */
+  { SINGLECHAR, FALSE },	/*	135			    */
+  { SINGLECHAR, FALSE },	/*	136			    */
+  { SINGLECHAR, FALSE },	/*	137			    */
+  { SINGLECHAR, FALSE },	/*	138			    */
+  { SINGLECHAR, FALSE },	/*	139			    */
+  { SINGLECHAR, FALSE },	/*	140			    */
+  { SINGLECHAR, FALSE },	/*	141			    */
+  { SINGLECHAR, FALSE },	/*	142			    */
+  { SINGLECHAR, FALSE },	/*	143			    */
+  { SINGLECHAR, FALSE },	/*	144			    */
+  { SINGLECHAR, FALSE },	/*	145			    */
+  { SINGLECHAR, FALSE },	/*	146			    */
+  { SINGLECHAR, FALSE },	/*	147			    */
+  { SINGLECHAR, FALSE },	/*	148			    */
+  { SINGLECHAR, FALSE },	/*	149			    */
+  { SINGLECHAR, FALSE },	/*	150			    */
+  { SINGLECHAR, FALSE },	/*	151			    */
+  { SINGLECHAR, FALSE },	/*	152			    */
+  { SINGLECHAR, FALSE },	/*	153			    */
+  { SINGLECHAR, FALSE },	/*	154			    */
+  { SINGLECHAR, FALSE },	/*	155			    */
+  { SINGLECHAR, FALSE },	/*	156			    */
+  { SINGLECHAR, FALSE },	/*	157			    */
+  { SINGLECHAR, FALSE },	/*	158			    */
+  { SINGLECHAR, FALSE },	/*	159			    */
+  { SINGLECHAR, FALSE },	/*	160			    */
+  { SINGLECHAR, FALSE },	/*	161			    */
+  { SINGLECHAR, FALSE },	/*	162			    */
+  { SINGLECHAR, FALSE },	/*	163			    */
+  { SINGLECHAR, FALSE },	/*	164			    */
+  { SINGLECHAR, FALSE },	/*	165			    */
+  { SINGLECHAR, FALSE },	/*	166			    */
+  { SINGLECHAR, FALSE },	/*	167			    */
+  { SINGLECHAR, FALSE },	/*	168			    */
+  { SINGLECHAR, FALSE },	/*	169			    */
+  { SINGLECHAR, FALSE },	/*	170			    */
+  { SINGLECHAR, FALSE },	/*	171			    */
+  { SINGLECHAR, FALSE },	/*	172			    */
+  { SINGLECHAR, FALSE },	/*	173			    */
+  { SINGLECHAR, FALSE },	/*	174			    */
+  { SINGLECHAR, FALSE },	/*	175			    */
+  { SINGLECHAR, FALSE },	/*	176			    */
+  { SINGLECHAR, FALSE },	/*	177			    */
+  { SINGLECHAR, FALSE },	/*	178			    */
+  { SINGLECHAR, FALSE },	/*	179			    */
+  { SINGLECHAR, FALSE },	/*	180			    */
+  { SINGLECHAR, FALSE },	/*	181			    */
+  { SINGLECHAR, FALSE },	/*	182			    */
+  { SINGLECHAR, FALSE },	/*	183			    */
+  { SINGLECHAR, FALSE },	/*	184			    */
+  { SINGLECHAR, FALSE },	/*	185			    */
+  { SINGLECHAR, FALSE },	/*	186			    */
+  { SINGLECHAR, FALSE },	/*	187			    */
+  { SINGLECHAR, FALSE },	/*	188			    */
+  { SINGLECHAR, FALSE },	/*	189			    */
+  { SINGLECHAR, FALSE },	/*	190			    */
+  { SINGLECHAR, FALSE },	/*	191			    */
+  { SINGLECHAR, FALSE },	/*	192			    */
+  { SINGLECHAR, FALSE },	/*	193			    */
+  { SINGLECHAR, FALSE },	/*	194			    */
+  { SINGLECHAR, FALSE },	/*	195			    */
+  { SINGLECHAR, FALSE },	/*	196			    */
+  { SINGLECHAR, FALSE },	/*	197			    */
+  { SINGLECHAR, FALSE },	/*	198			    */
+  { SINGLECHAR, FALSE },	/*	199			    */
+  { SINGLECHAR, FALSE },	/*	200			    */
+  { SINGLECHAR, FALSE },	/*	201			    */
+  { SINGLECHAR, FALSE },	/*	202			    */
+  { SINGLECHAR, FALSE },	/*	203			    */
+  { SINGLECHAR, FALSE },	/*	204			    */
+  { SINGLECHAR, FALSE },	/*	205			    */
+  { SINGLECHAR, FALSE },	/*	206			    */
+  { SINGLECHAR, FALSE },	/*	207			    */
+  { SINGLECHAR, FALSE },	/*	208			    */
+  { SINGLECHAR, FALSE },	/*	209			    */
+  { SINGLECHAR, FALSE },	/*	210			    */
+  { SINGLECHAR, FALSE },	/*	211			    */
+  { SINGLECHAR, FALSE },	/*	212			    */
+  { SINGLECHAR, FALSE },	/*	213			    */
+  { SINGLECHAR, FALSE },	/*	214			    */
+  { SINGLECHAR, FALSE },	/*	215			    */
+  { SINGLECHAR, FALSE },	/*	216			    */
+  { SINGLECHAR, FALSE },	/*	217			    */
+  { SINGLECHAR, FALSE },	/*	218			    */
+  { SINGLECHAR, FALSE },	/*	219			    */
+  { SINGLECHAR, FALSE },	/*	220			    */
+  { SINGLECHAR, FALSE },	/*	221			    */
+  { SINGLECHAR, FALSE },	/*	222			    */
+  { SINGLECHAR, FALSE },	/*	223			    */
+  { SINGLECHAR, FALSE },	/*	224			    */
+  { SINGLECHAR, FALSE },	/*	225			    */
+  { SINGLECHAR, FALSE },	/*	226			    */
+  { SINGLECHAR, FALSE },	/*	227			    */
+  { SINGLECHAR, FALSE },	/*	228			    */
+  { SINGLECHAR, FALSE },	/*	229			    */
+  { SINGLECHAR, FALSE },	/*	230			    */
+  { SINGLECHAR, FALSE },	/*	231			    */
+  { SINGLECHAR, FALSE },	/*	232			    */
+  { SINGLECHAR, FALSE },	/*	233			    */
+  { SINGLECHAR, FALSE },	/*	234			    */
+  { SINGLECHAR, FALSE },	/*	235			    */
+  { SINGLECHAR, FALSE },	/*	236			    */
+  { SINGLECHAR, FALSE },	/*	237			    */
+  { SINGLECHAR, FALSE },	/*	238			    */
+  { SINGLECHAR, FALSE },	/*	239			    */
+  { SINGLECHAR, FALSE },	/*	240			    */
+  { SINGLECHAR, FALSE },	/*	241			    */
+  { SINGLECHAR, FALSE },	/*	242			    */
+  { SINGLECHAR, FALSE },	/*	243			    */
+  { SINGLECHAR, FALSE },	/*	244			    */
+  { SINGLECHAR, FALSE },	/*	245			    */
+  { SINGLECHAR, FALSE },	/*	246			    */
+  { SINGLECHAR, FALSE },	/*	247			    */
+  { SINGLECHAR, FALSE },	/*	248			    */
+  { SINGLECHAR, FALSE },	/*	249			    */
+  { SINGLECHAR, FALSE },	/*	250			    */
+  { SINGLECHAR, FALSE },	/*	251			    */
+  { SINGLECHAR, FALSE },	/*	252			    */
+  { SINGLECHAR, FALSE },	/*	253			    */
+  { SINGLECHAR, FALSE },	/*	254			    */
+  { SINGLECHAR, FALSE }		/*	255			    */
+};
+
+void
+ScanCComment (void)
+{
+  inComment = TRUE;
+  for (;;)
+    {
+      switch (currentChar)
+	{
+	case '*':
+	  LCLMOVECHAR ();
+	  if (currentChar == '/')
+	    {
+	      LCLMOVECHAR ();
+	      inComment = FALSE;
+	      return;
+	    }
+	  /*@switchbreak@*/ break;
+	case '\n':
+	  return;
+	default:
+	  LCLMOVECHAR ();
+	}
+    }
+}
+
+void
+ScanEscape (void)
+{
+  if (isSimpleEscape[(int)currentChar])
+    {
+      LCLMOVECHAR ();		/* discard simple escape character. */
+    }
+  else if (currentChar == 'x')
+    {
+      LCLMOVECHAR ();		/* discard 'x'. */
+      if (!isXigit[(int)currentChar])
+	{
+	  LocalUserError ("at least one hex digit must follow '\\x'");
+	}
+      while (isXigit[(int)currentChar])
+	{
+	  LCLMOVECHAR ();		/* discard hex digits. */
+	}
+    }
+  else if (isOigit[(int)currentChar])
+    {
+      LCLMOVECHAR ();		/* discard first hex digit. */
+      if (isOigit[(int)currentChar])
+	{
+	  LCLMOVECHAR ();		/* discard second hex digit. */
+	}
+      if (isOigit[(int)currentChar])
+	{
+	  LCLMOVECHAR ();		/* discard third hex digit. */
+	}
+    }
+  else
+    {
+      LocalUserError ("invalid escape sequence in a C string or character");
+    }
+}
+
+void
+ScanCString (void)
+{
+  if (currentChar == '\\' && LOOKAHEADCHAR () == 'L')
+    {
+      LCLMOVECHAR ();		/* discard slash */
+      LCLMOVECHAR ();		/* discard 'L'. */
+    }
+
+  if (currentChar == '\"')
+    {
+      LCLMOVECHAR ();		/* discard opening quote. */
+
+      while (currentChar != '\"')
+	{
+	  if (isStrChar[(int)currentChar])
+	    {
+	      LCLMOVECHAR ();	/* discard string character. */
+	    }
+	  else if (currentChar == '\\')
+	    {
+	      LCLMOVECHAR ();	/* discard slash */
+	      ScanEscape ();
+	    }
+	  else if (currentChar == '\n')
+	    {
+	      LocalUserError ("unterminated C string");
+	    }
+	  else
+	    {
+	      LocalUserError ("invalid character in C string");
+	    }
+	}
+      LCLMOVECHAR ();		/* discard closing quote */
+
+    }
+  else
+    {
+      LocalUserError ("C string must start with '\"'");
+    }
+
+
+  *bufPtr = '\0';		/* null terminate in buffer */
+  tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+  tokenCode = LLT_LCSTRING;
+}
+
+void
+ScanCChar (void)
+{
+  if (currentChar == '\\' && LOOKAHEADCHAR () == 'L')
+    {
+      LCLMOVECHAR ();		/* discard slash */
+      LCLMOVECHAR ();		/* discard 'L'. */
+    }
+
+  if (currentChar == '\'')
+    {
+      LCLMOVECHAR ();		/* discard opening quote */
+
+      while (currentChar != '\'')
+	{
+	  if (isCharChar[(int)currentChar])
+	    {
+	      LCLMOVECHAR ();	/* discard string character. */
+	    }
+	  else if (currentChar == '\\')
+	    {
+	      LCLMOVECHAR ();	/* discard slash */
+	      ScanEscape ();
+	    }
+	  else if (currentChar == '\n')
+	    {
+	      LocalUserError ("unterminated C character constant");
+	    }
+	  else
+	    {
+	      LocalUserError ("invalid character in C character");
+	    }
+	}
+      LCLMOVECHAR ();		/* discard closing quote */
+
+    }
+  else
+    {
+      LocalUserError ("invalid C character");
+    }
+
+
+  *bufPtr = '\0';		/* null terminate in buffer */
+  tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+  tokenCode = LLT_CCHAR;
+}
+
+void
+ScanCNumber (void)
+{
+  tokenCode = LLT_CINTEGER;
+  
+  switch (currentChar)
+    {
+    case '.':
+      LCLMOVECHAR ();		
+      tokenCode = LLT_CFLOAT;
+      if (!isDigit[(int)currentChar])
+	{
+	  LocalUserError ("at least one digit must follow '.'");
+	}
+      while (isDigit[(int)currentChar])
+	{
+	  LCLMOVECHAR ();
+	}
+      if (currentChar == 'e' || currentChar == 'E')
+	{
+	  LCLMOVECHAR ();		/* discard 'e' or 'E'. */
+	  if (currentChar == '+' || currentChar == '-')
+	    {
+	      LCLMOVECHAR ();
+	    }
+	  if (!isDigit[(int)currentChar])
+	    {
+	      LocalUserError ("digit must follow exponent");
+	    }
+	  while (isDigit[(int)currentChar])
+	    {
+	      LCLMOVECHAR ();
+	    }
+	}
+      if (currentChar == 'f' || currentChar == 'l' ||
+	  currentChar == 'F' || currentChar == 'L')
+	{
+	  LCLMOVECHAR ();
+	}
+      break;
+      
+    case '0':
+      LCLMOVECHAR ();		/* discard '0'. */
+      switch (currentChar)
+	{
+	case 'x':
+	case 'X':
+	  LCLMOVECHAR ();
+	  if (!isXigit[(int)currentChar])
+	    {
+	      LocalUserError ("hex digit must follow 'x' or 'X'");
+	    }
+	  while (isXigit[(int)currentChar])
+	    {
+	      LCLMOVECHAR ();
+	    }
+	  /*@switchbreak@*/ break;
+
+	default:
+	  /*
+	  ** Could either be an octal number or a floating point  
+	  ** number.  Scan decimal digits so don't run into	    
+	  ** problems if turns out problems if it is an fp	    
+	  ** number.  Let converter/parser catch bad octal	    
+	  ** numbers.   e.g. 018 not caught by scanner.	    
+	  */
+	  
+	  while (isDigit[(int)currentChar])
+	    {
+	      LCLMOVECHAR ();
+	    }
+	  switch (currentChar)
+	    {
+	    case '.':
+	      LCLMOVECHAR ();	/* discard '.'. */
+	      tokenCode = LLT_CFLOAT;
+	      while (isDigit[(int)currentChar])
+		{
+		  LCLMOVECHAR ();
+		}
+	      if (currentChar == 'e' || currentChar == 'E')
+		{
+		  LCLMOVECHAR ();	/* discard 'e' or 'E'. */
+		  if (currentChar == '+' || currentChar == '-')
+		    {
+		      LCLMOVECHAR ();
+		    }
+		  if (!isDigit[(int)currentChar])
+		    {
+		      LocalUserError ("digit must follow exponent");
+		    }
+		  while (isDigit[(int)currentChar])
+		    {
+		      LCLMOVECHAR ();
+		    }
+		}
+	      if (currentChar == 'f' ||
+		  currentChar == 'l' ||
+		  currentChar == 'F' ||
+		  currentChar == 'L')
+		{
+		  LCLMOVECHAR ();
+		}
+	      /*@switchbreak@*/ break;
+
+	    case 'e':
+	    case 'E':
+	      LCLMOVECHAR ();	
+	      tokenCode = LLT_CFLOAT;
+	      if (currentChar == '+' || currentChar == '-')
+		{
+		  LCLMOVECHAR ();
+		}
+	      if (!isDigit[(int)currentChar])
+		{
+		  LocalUserError ("digit must follow exponent");
+		}
+	      while (isDigit[(int)currentChar])
+		{
+		  LCLMOVECHAR ();
+		}
+	      if (currentChar == 'f' ||
+		  currentChar == 'l' ||
+		  currentChar == 'F' ||
+		  currentChar == 'L')
+		{
+		  LCLMOVECHAR ();
+		}
+	      /*@switchbreak@*/ break;
+
+	    default:
+	      /* Scan integer suffix. */
+	      switch (currentChar)
+		{
+		case 'u':
+		case 'U':
+		  LCLMOVECHAR ();	
+		  if (currentChar == 'l' || currentChar == 'L')
+		    {
+		      LCLMOVECHAR ();
+		    }
+		  /*@switchbreak@*/ break;
+		case 'l':
+		case 'L':
+		  LCLMOVECHAR ();	
+		  if (currentChar == 'u' || currentChar == 'U')
+		    {
+		      LCLMOVECHAR ();
+		    }
+		  
+		  /*@switchbreak@*/ break;
+		}	
+	      /*@switchbreak@*/ break;
+	    }		
+	}		       
+      
+      /* Scan integer suffix. */
+      switch (currentChar)
+	{
+	case 'u':
+	case 'U':
+	  LCLMOVECHAR ();		
+	  if (currentChar == 'l' || currentChar == 'L')
+	    {
+	      LCLMOVECHAR ();	
+	    }
+	  /*@switchbreak@*/ break;
+	case 'l':
+	case 'L':
+	  LCLMOVECHAR ();		
+	  if (currentChar == 'u' || currentChar == 'U')
+	    {
+	      LCLMOVECHAR ();	
+	    }
+	  /*@switchbreak@*/ break;
+	}		
+      break;
+      
+    default:
+      if (isDigit[(int)currentChar])
+	{
+	  while (isDigit[(int)currentChar])
+	    {
+	      LCLMOVECHAR ();
+	    }
+	  switch (currentChar)
+	    {
+	    case '.':
+	      LCLMOVECHAR ();	/* discard '.'. */
+	      tokenCode = LLT_CFLOAT;
+	      while (isDigit[(int)currentChar])
+		{
+		  LCLMOVECHAR ();
+		}
+	      if (currentChar == 'e' || currentChar == 'E')
+		{
+		  LCLMOVECHAR ();
+		  if (currentChar == '+' || currentChar == '-')
+		    {
+		      LCLMOVECHAR ();
+		    }
+		  if (!isDigit[(int)currentChar])
+		    {
+		      LocalUserError ("digit must follow exponent");
+		    }
+		  while (isDigit[(int)currentChar])
+		    {
+		      LCLMOVECHAR ();
+		    }
+		}
+	      if (currentChar == 'f' ||
+		  currentChar == 'l' ||
+		  currentChar == 'F' ||
+		  currentChar == 'L')
+		{
+		  LCLMOVECHAR ();
+		}
+	      /*@switchbreak@*/ break;
+
+	    case 'e':
+	    case 'E':
+	      LCLMOVECHAR ();	
+	      tokenCode = LLT_CFLOAT;
+	      if (currentChar == '+' || currentChar == '-')
+		{
+		  LCLMOVECHAR ();
+		}
+	      if (!isDigit[(int)currentChar])
+		{
+		  LocalUserError ("digit must follow exponent");
+		}
+	      while (isDigit[(int)currentChar])
+		{
+		  LCLMOVECHAR ();
+		}
+	      if (currentChar == 'f' ||
+		  currentChar == 'l' ||
+		  currentChar == 'F' ||
+		  currentChar == 'L')
+		{
+		  LCLMOVECHAR ();
+		}
+
+	      /*@switchbreak@*/ break;
+	    default:
+	      switch (currentChar)
+		{
+		case 'u':
+		case 'U':
+		  LCLMOVECHAR (); 
+		  if (currentChar == 'l' || currentChar == 'L')
+		    {
+		      LCLMOVECHAR ();
+		    }
+		  /*@switchbreak@*/ break;
+		case 'l':
+		case 'L':
+		  LCLMOVECHAR ();	
+		  if (currentChar == 'u' || currentChar == 'U')
+		    {
+		      LCLMOVECHAR ();
+		    }
+		  /*@switchbreak@*/ break;
+		}		
+	      /*@switchbreak@*/ break;
+	    }			
+	}
+      else
+	{
+	  LocalUserError ("invalid C number");
+	}
+      break;
+
+
+    }	
+
+  *bufPtr = '\0';
+  tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+}
+
+static void ScanOther (void)
+{
+  switch (LCLScanCharClass (currentChar))
+    {			      
+    case CHC_NULL:	
+      tokenSym = lsymbol_fromChars ("E O L");
+      tokenCode = LLT_EOL;
+      break;
+      
+      /* identifiers */
+      
+    case IDCHAR:
+      
+      while (LCLScanCharClass (currentChar) == IDCHAR)
+	{			/* identifier: find end	    */
+	  LCLMOVECHAR ();
+	}
+      
+      *bufPtr = '\0';		/* null terminate in buffer */
+      tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+      tokenCode = simpleId;
+            break;
+      
+      /* one-character tokens */
+      
+    case SINGLECHAR:
+    case PERMCHAR:		
+      LCLMOVECHAR ();
+      *bufPtr = '\0';		
+      tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+      tokenCode = simpleOp;
+      break;
+
+     /* operator symbols */
+
+    case OPCHAR:
+
+      if (currentChar == '.' &&  LOOKAHEADCHAR () == '.'  &&
+	  LOOKAHEADTWICECHAR () == '.')
+	{
+	  LCLMOVECHAR ();
+	  LCLMOVECHAR ();
+	  LCLMOVECHAR ();
+	  *bufPtr = '\0';
+	  tokenSym = lsymbol_fromChars ("...");
+	  tokenCode = LLT_TELIPSIS;
+	}
+      else
+	{
+	  if (currentChar == '/' && LOOKAHEADCHAR () == '\\')
+	    {			
+	      LCLMOVECHAR ();
+	      LCLMOVECHAR ();
+	    }
+	  else
+	    {			
+	      while (LCLScanCharClass (currentChar) == OPCHAR)
+		{	
+		  LCLMOVECHAR ();
+		}
+	    }
+	  
+	  *bufPtr = '\0';
+	  tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+	  tokenCode = simpleOp;
+	}
+      break;
+      
+      /* white space */
+    case WHITECHAR:
+      /*@-loopswitchbreak@*/
+      /*@-switchswitchbreak@*/
+      switch (currentChar)
+	{
+	case '\t':
+	  LCLMOVECHAR (); /* tabs only count as one character */
+	  break;
+
+	case '\v':
+	case '\f':
+	  LCLMOVECHAR ();
+	  colNumber--;		/* does not change column   */
+	  break;
+
+	default:
+	  LCLMOVECHAR ();
+	  break;
+	}
+      /*@=switchswitchbreak@*/
+
+      *bufPtr = '\0';	
+      tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+      tokenCode = LLT_WHITESPACE;
+      break;
+
+     /* symbols */
+
+    case CHC_EXTENSION:	
+      LCLMOVECHAR ();
+
+      /*@-switchswitchbreak@*/
+      switch (currentChar)
+	{		
+	 /* open and close */
+	case '(':		
+	  LCLMOVECHAR ();
+	  while (LCLScanCharClass (currentChar) == IDCHAR)
+	    {			
+	      LCLMOVECHAR ();
+	    }
+	  *bufPtr = '\0';	
+	  tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+	  tokenCode = openSym;
+	  break;
+
+	case ')':		
+	  LCLMOVECHAR ();
+	  while (LCLScanCharClass (currentChar) == IDCHAR)
+	    {			
+	      LCLMOVECHAR ();
+	    }
+	  *bufPtr = '\0';	
+	  tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+	  tokenCode = closeSym;
+	  break;
+
+	 /* separator */
+	case ',':	
+	  LCLMOVECHAR ();
+	  while (LCLScanCharClass (currentChar) == IDCHAR)
+	    {		
+	      LCLMOVECHAR ();
+	    }
+	  *bufPtr = '\0';
+	  tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+	  tokenCode = sepSym;
+	  break;
+
+	 /* simpleid */
+	case ':':	
+	  LCLMOVECHAR ();
+	  while (LCLScanCharClass (currentChar) == IDCHAR)
+	    {		
+	      LCLMOVECHAR ();
+	    }
+	  *bufPtr = '\0';
+	  tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+	  tokenCode = simpleId;
+	  break;
+
+	default:		
+	  if (LCLScanCharClass (currentChar) == IDCHAR)
+	    {
+	      do
+		{
+		  LCLMOVECHAR ();
+		}
+	      while (LCLScanCharClass (currentChar) == IDCHAR);
+	      *bufPtr = '\0';	
+	      tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+	      tokenCode = simpleOp;
+	    }
+	  else
+	    {
+	      /*
+	      ** Meets none of the above.  Take the extension	    
+	      ** character and the character following and treat	   
+	      ** together as a SINGLECHAR.  SINGLECHARs tranlate into 
+	      ** SIMPLEOPs.					    
+	      */
+
+	      LCLMOVECHAR ();
+	      *bufPtr = '\0';	
+	      tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
+	      tokenCode = simpleOp;
+	    }
+	  break;
+	  /*@=switchswitchbreak@*/
+	}
+      break;			
+
+    default:
+      LocalUserError ("unexpected character in input");
+      return;
+    }
+  /*@=loopswitchbreak@*/
+}
+
+static bool
+nextCanBeCharLiteral (ltokenCode c)
+{
+  switch (c)
+    {
+      /* A ' following these tokens starts a C character literal. */
+    case logicalOp:		
+    case equationSym:		
+    case eqSepSym:		
+    case openSym:		
+    case sepSym:		
+    case simpleOp:		
+    case LLT_COMMA:		        
+    case LLT_EQUALS:		
+    case LLT_LBRACE:		
+    case LLT_LBRACKET:		
+    case LLT_LPAR:			
+    case eqOp:			
+    case LLT_BE:			
+    case LLT_ELSE:			
+    case LLT_ENSURES:		
+    case LLT_IF:			
+    case LLT_CONSTRAINT:		
+    case LLT_REQUIRES:		
+    case LLT_CHECKS:                
+    case LLT_BODY:			
+    case LLT_THEN:			
+      return (TRUE);
+
+     /* A ' following these tokens means post */
+    case selectSym:		
+    case closeSym:		
+    case simpleId:		
+    case preSym:		
+    case anySym:		
+    case postSym:		
+    case LLT_QUOTE:		        
+    case LLT_RBRACE:		
+    case LLT_RBRACKET:		
+    case LLT_RPAR:			
+    case LLT_RESULT:		
+      return (FALSE);
+
+     /* Neither a C character literal nor post should follow these tokens */
+    case quantifierSym:	        
+    case mapSym:		
+    case markerSym:		
+    case LLT_COLON:	        	
+    case LLT_SEMI:			
+    case LLT_VERTICALBAR:		
+    case LLT_MULOP:  		
+    case LLT_CCHAR:		        
+    case LLT_CFLOAT:		
+    case LLT_CINTEGER:		
+    case LLT_LCSTRING:		
+    case LLT_ALL:			
+    case LLT_ANYTHING:		
+    case LLT_CONSTANT:		
+    case LLT_FOR:			
+    case LLT_IMMUTABLE:		
+    case LLT_OBJ:			
+    case LLT_OUT:			
+    case LLT_IMPORTS:		
+    case LLT_ISSUB: 		
+    case LLT_LET:			
+    case LLT_MODIFIES:
+    case LLT_CLAIMS:
+    case LLT_MUTABLE:		
+    case LLT_FRESH:
+    case LLT_NOTHING:		
+    case LLT_PRIVATE:		
+    case LLT_SPEC:			
+    case LLT_SIZEOF:		
+    case LLT_TAGGEDUNION:		
+    case LLT_TYPE:			
+    case LLT_UNCHANGED:		
+    case LLT_USES:			
+    case LLT_CHAR:			
+    case LLT_CONST:		        
+    case LLT_DOUBLE:		
+    case LLT_ENUM:			
+    case LLT_FLOAT:		        
+    case LLT_INT:			
+    case LLT_TYPEDEF_NAME:		
+    case LLT_LONG:			
+    case LLT_SHORT:		        
+    case LLT_STRUCT:		
+    case LLT_SIGNED:		
+    case LLT_UNKNOWN:		
+    case LLT_UNION:		        
+    case LLT_UNSIGNED:		
+    case LLT_VOID:			
+    case LLT_VOLATILE:		
+      return (FALSE);
+
+     /* These tokens should have been ignored */
+    case NOTTOKEN:
+    case commentSym:		
+    case LLT_WHITESPACE:
+    case LLT_EOL:
+    case LEOFTOKEN:
+      llcontbuglit ("scanline: nextCanBeChar");
+      return FALSE;
+    BADDEFAULT;
+    }
+
+  BADEXIT;
+}
+
+void
+LCLScanLine (char *line)
+{
+  ltoken newToken;
+  lsymbol CCommentSym = lsymbol_fromChars ("/*");
+  size_t linelength = strlen (line);
+  static bool inSpecComment = FALSE;
+
+    line[(int)linelength] = '\n';
+
+  currentLine = line;
+  currentChar = *currentLine++;	
+  context_processedSpecLine ();
+
+  incLine ();
+  colNumber = 1;		
+
+  if (inComment)
+    {
+      ScanCComment ();
+
+      if (reportComments)
+	{
+	  *bufPtr = '\0';
+	  newToken = ltoken_createRaw (simpleId, lsymbol_fromChars (&tokenBuffer[0]));
+	  LCLScanFreshToken (newToken);
+	}
+    }
+
+  if (inSpecComment)
+    {
+      if (currentChar == '*' &&
+	  LOOKAHEADCHAR () == '/')
+	{
+	  LCLMOVECHAR ();
+	  LCLMOVECHAR ();
+	  inSpecComment = FALSE;
+	}
+    }
+
+  /*@+loopexec@*/ 
+  for (;;)
+    {
+      if (inSpecComment && currentChar == '*' && LOOKAHEADCHAR () == '/')
+	{
+	  LCLMOVECHAR ();
+	  LCLMOVECHAR ();
+	  inSpecComment = FALSE;
+	}
+
+      bufPtr = &tokenBuffer[0];	
+      startCol = colNumber;	
+
+      
+      /*@-loopswitchbreak@*/
+      switch (startClass[(int)currentChar])
+	{
+	case STARTCNUM:
+	  ScanCNumber ();
+	  break;
+
+	case STARTCNUMDOT:
+	  if (isDigit[(int) LOOKAHEADCHAR ()])
+	    {
+	      ScanCNumber ();
+	    }
+	  else
+	    {
+	      ScanOther ();
+	    }
+	  break;
+
+	case STARTCSTR:
+	  ScanCString ();
+	  break;
+
+	case STARTCCHAR:
+	  	  if (nextCanBeCharLiteral (prevTokenCode))
+	    {
+	      ScanCChar ();
+	    }
+	  else
+	    {
+	      	      ScanOther ();
+	    }
+	  break;
+
+	case STARTWIDE:
+	  if (LOOKAHEADCHAR () == 'L' && LOOKAHEADTWICECHAR () == '\"')
+	    {
+	      ScanCString ();
+	    }
+	  else if (LOOKAHEADCHAR () == 'L' && LOOKAHEADTWICECHAR () == '\'')
+	    {
+	      ScanCChar ();
+	    }
+	  else
+	    {
+	      ScanOther ();
+	    }
+	  break;
+
+	case STARTSLASH:
+	  if (LOOKAHEADCHAR () == '*')
+	    {
+	      LCLMOVECHAR ();
+	      LCLMOVECHAR ();
+
+	      if (currentChar == '@')
+		{
+		  char *s = mstring_createEmpty ();
+
+		  LCLMOVECHAR ();
+
+		  while (currentChar != '\0' && currentChar != ' ' 
+			 && currentChar != '*' && currentChar != '\t' &&
+			 currentChar != '\n')
+		    {
+		      s = mstring_append (s, currentChar);
+		      LCLMOVECHAR ();
+		    }
+
+		  if (mstring_equal (s, "alt"))
+		    {
+		      tokenCode = LLT_VERTICALBAR;
+		      tokenSym = lsymbol_fromChars ("|");
+		      inSpecComment = TRUE;
+		    }
+		  else
+		    {
+		      ScanCComment ();
+		      tokenCode = commentSym;
+		      tokenSym = CCommentSym;
+		    }
+
+		  sfree (s);
+		  break;
+		}
+	      else
+		{
+		  ScanCComment ();
+		  tokenCode = commentSym;
+		  tokenSym = CCommentSym;
+		  break;
+		}
+	    }
+	  else
+	    {
+	      ScanOther ();
+	    } break;
+
+	case STARTOTHER:
+	  ScanOther ();
+	  break;
+
+	default:
+	  llcontbuglit ("LCLScanLine: bad case");
+	  break;
+
+	}
+      /*@=loopswitchbreak@*/
+      
+     /*
+     ** Above code only "guessed" at token type.  Insert it into the 
+     ** TokenTable.  If the token already exists, it is returned as	    
+     ** previously defined.  If it does not exist, it is inserted as the 
+     ** token code computed above.					    
+     */
+      
+      newToken = LCLInsertToken (tokenCode, tokenSym, lsymbol_undefined, FALSE);
+      
+                  
+      if (LCLIsSyn (ltoken_getText (newToken)))
+	{
+	  /*
+	  ** Token is a synonym.  Get the actual token and set the raw    
+	  ** text to the synonym name.				    
+	  */
+
+	  newToken = ltoken_copy (LCLGetTokenForSyn (ltoken_getText (newToken)));
+
+	  ltoken_setRawText (newToken, tokenSym);
+	}
+      else
+	{
+	  newToken = ltoken_copy (newToken);
+	}
+
+      ltoken_setCol (newToken, startCol);
+      ltoken_setLine (newToken, tsource_thisLineNumber (LCLScanSource ()));
+      ltoken_setFileName (newToken, tsource_fileName (LCLScanSource ()));
+
+      if (ltoken_getCode (newToken) == commentSym)
+	{
+	  if (tokenSym == CCommentSym)
+	    { /* C-style comment   */
+	      ltoken_free (commentTok);
+	      commentTok = ltoken_copy (newToken);
+
+	      if (!inComment && reportComments)
+		{
+		  *bufPtr = '\0';
+		  ltoken_setRawText (newToken, 
+				     lsymbol_fromChars (&tokenBuffer[0]));
+		  LCLScanFreshToken (newToken);
+		}
+	      else
+		{
+		  ltoken_free (newToken); 
+		}
+	    }
+	  else
+	    { /* LSL-style comment */
+	      bufPtr = &tokenBuffer[0];
+	      while (!LCLIsEndComment (currentChar))
+		{
+		  LCLMOVECHAR ();
+		}
+	      if (LCLScanCharClass (currentChar) != CHC_NULL)
+		{
+		  /* Not EOL character.  Toss it out. */
+		  LCLMOVECHAR ();
+		}
+
+	      if (reportComments)
+		{
+		  *bufPtr = '\0';
+		  ltoken_setRawText (newToken, 
+				     lsymbol_fromChars (&tokenBuffer[0]));
+		  LCLScanFreshToken (newToken);
+		}
+	      else
+		{
+		  ltoken_free (newToken);
+		}
+	    }
+	}
+      else if (ltoken_getCode (newToken) == LLT_EOL)
+	{
+	  if (reportEOL)
+	    {
+	      LCLScanFreshToken (newToken);
+	    }
+	  else
+	    {
+	      ltoken_free (newToken); 
+	    }
+
+	  line[(int) linelength] = '\0';
+	  return;
+	}
+      else if (ltoken_getCode (newToken) != LLT_WHITESPACE)
+	{
+	  prevTokenCode = ltoken_getCode (newToken);
+	  LCLScanFreshToken (newToken);
+	}
+      else
+	{
+	  ltoken_free (newToken);
+	}
+    } /*@=loopexec@*/
+}
+
+/*@exposed@*/ ltoken
+LCLScanEofToken (void)
+{
+  ltoken t = LCLInsertToken (LEOFTOKEN, lsymbol_fromChars ("E O F"), 0, TRUE);
+
+  if (inComment)
+    {
+      lclerror (commentTok, cstring_makeLiteral ("Unterminated comment"));
+    }
+
+  ltoken_setCol (t, colNumber);
+  ltoken_setLine (t, tsource_thisLineNumber (LCLScanSource ()));
+  ltoken_setFileName (t, tsource_fileName (LCLScanSource ()));
+
+  return t;
+}
+
+void
+LCLReportEolTokens (bool setting)
+{
+  reportEOL = setting;
+}
+
+static void
+LocalUserError (char *msg)
+{
+  tsource *s = LCLScanSource ();
+  llfatalerror (message ("%s:%u,%u: %s", 
+			 cstring_fromChars (tsource_fileName (s)), 
+			 tsource_thisLineNumber (s),
+			 colNumber,
+			 cstring_fromChars (msg)));
+}
+
+void
+LCLScanLineInit (void)
+{
+  int i;
+
+  setCodePoint ();
+  reportEOL = FALSE;
+  reportComments = FALSE;
+
+  for (i = 0; i <= LASTCHAR; i++)
+    {
+      LCLcharClass[i] = charClassDef[i];
+    }
+
+  setCodePoint ();
+
+  /*
+  ** Make sure first postion is never used because use the 0th index to   
+  ** mean empty. 
+  */
+
+  firstReserved = lsymbol_fromChars (FIRSTRESERVEDNAME);
+  setCodePoint ();
+
+  /* Predefined LSL Tokens */
+  
+  ltoken_forall = LCLReserveToken (quantifierSym, "\\forall");
+  setCodePoint ();
+  ltoken_exists = LCLReserveToken (quantifierSym, "\\exists");
+  ltoken_implies = LCLReserveToken (logicalOp, "\\implies");
+  ltoken_eqsep = LCLReserveToken (eqSepSym, "\\eqsep");
+  ltoken_select = LCLReserveToken (selectSym, "\\select");
+  ltoken_open = LCLReserveToken (openSym, "\\open");
+  ltoken_sep = LCLReserveToken (sepSym, "\\,");
+  ltoken_close = LCLReserveToken (closeSym, "\\close");
+  ltoken_id = LCLReserveToken (simpleId, "\\:");
+  ltoken_arrow = LCLReserveToken (mapSym, "\\arrow");
+  ltoken_marker = LCLReserveToken (markerSym, "\\marker");
+  ltoken_pre = LCLReserveToken (preSym, "\\pre");
+  ltoken_post = LCLReserveToken (postSym, "\\post");
+  ltoken_comment = LCLReserveToken (commentSym, "\\comment");
+  ltoken_any = LCLReserveToken (anySym, "\\any");
+
+  ltoken_result = LCLReserveToken (LLT_RESULT, "result");
+  ltoken_typename = LCLReserveToken (LLT_TYPEDEF_NAME, "TYPEDEF_NAME");
+  ltoken_setIdType (ltoken_typename, SID_TYPE);
+
+  /*
+  ** Not context_getBoolName () --- "bool" is built in to LCL.
+  ** This is bogus, but necessary for a lot of old lcl files.
+  */
+
+  ltoken_bool = LCLReserveToken (LLT_TYPEDEF_NAME, "bool");
+
+  ltoken_lbracked = LCLReserveToken (LLT_LBRACKET, "[");
+  ltoken_rbracket = LCLReserveToken (LLT_RBRACKET, "]");
+
+  (void) LCLReserveToken (LLT_COLON, ":");
+  (void) LCLReserveToken (LLT_COMMA, ",");
+
+  (void) LCLReserveToken (LLT_EQUALS, "=");
+  (void) LCLReserveToken (LLT_LBRACE, "{");
+  (void) LCLReserveToken (LLT_LPAR, "(");
+  (void) LCLReserveToken (LLT_RBRACE, "}");
+  (void) LCLReserveToken (LLT_RPAR, ")");
+  (void) LCLReserveToken (LLT_SEMI, ";");
+  (void) LCLReserveToken (LLT_VERTICALBAR, "|");
+
+  (void) LCLReserveToken (LLT_MULOP, "*");
+
+  (void) LCLReserveToken (LLT_WHITESPACE, " ");
+  (void) LCLReserveToken (LLT_WHITESPACE, "\t");
+  (void) LCLReserveToken (LLT_WHITESPACE, "\f");
+  (void) LCLReserveToken (LLT_WHITESPACE, "\n");
+
+  (void) LCLReserveToken (LEOFTOKEN, "E O F");
+  (void) LCLReserveToken (LLT_EOL, "E O L");
+
+  /* LSL Keywords */
+  ltoken_and = LCLReserveToken (logicalOp, "\\and");
+  ltoken_or = LCLReserveToken (logicalOp, "\\or");
+
+  ltoken_equals = LCLReserveToken (equationSym, "\\equals");
+
+  ltoken_eq = LCLReserveToken (eqOp, "\\eq");
+  ltoken_neq = LCLReserveToken (eqOp, "\\neq");
+
+  ltoken_not = LCLReserveToken (simpleOp, "\\not");
+  ltoken_true = LCLReserveToken (simpleId, "true");
+  ltoken_false = LCLReserveToken (simpleId, "false");
+
+  /* LCL Keywords */
+  (void) LCLReserveToken (LLT_ALL, "all");
+  (void) LCLReserveToken (LLT_ANYTHING, "anything");
+  (void) LCLReserveToken (LLT_BE, "be");
+  (void) LCLReserveToken (LLT_CONSTANT, "constant");
+  (void) LCLReserveToken (LLT_CHECKS, "checks");
+  (void) LCLReserveToken (LLT_ELSE, "else");
+  (void) LCLReserveToken (LLT_ENSURES, "ensures");
+  (void) LCLReserveToken (LLT_FOR, "for");
+  (void) LCLReserveToken (LLT_IF, "if");
+  (void) LCLReserveToken (LLT_IMMUTABLE, "immutable");
+  (void) LCLReserveToken (LLT_OBJ, "obj");
+  (void) LCLReserveToken (LLT_OUT, "out");
+  (void) LCLReserveToken (LLT_ITER, "iter"); 
+  (void) LCLReserveToken (LLT_YIELD, "yield"); 
+  (void) LCLReserveToken (LLT_PARTIAL, "partial");
+  (void) LCLReserveToken (LLT_ONLY, "only");
+  (void) LCLReserveToken (LLT_UNDEF, "undef");
+  (void) LCLReserveToken (LLT_KILLED, "killed");
+  (void) LCLReserveToken (LLT_OWNED, "owned");
+  (void) LCLReserveToken (LLT_DEPENDENT, "dependent");
+  (void) LCLReserveToken (LLT_PARTIAL, "partial");
+  (void) LCLReserveToken (LLT_RELDEF, "reldef");
+  (void) LCLReserveToken (LLT_KEEP, "keep");
+  (void) LCLReserveToken (LLT_KEPT, "kept");
+  (void) LCLReserveToken (LLT_TEMP, "temp");
+  (void) LCLReserveToken (LLT_SHARED, "shared");
+  (void) LCLReserveToken (LLT_RELNULL, "relnull");
+  (void) LCLReserveToken (LLT_RELDEF, "reldef");
+  (void) LCLReserveToken (LLT_CHECKED, "checked");
+  (void) LCLReserveToken (LLT_UNCHECKED, "unchecked");
+  (void) LCLReserveToken (LLT_CHECKEDSTRICT, "checkedstrict");
+  (void) LCLReserveToken (LLT_CHECKMOD, "checkmod");
+  (void) LCLReserveToken (LLT_TRUENULL, "truenull");
+  (void) LCLReserveToken (LLT_FALSENULL, "falsenull");
+  (void) LCLReserveToken (LLT_LNULL, "null");
+  (void) LCLReserveToken (LLT_LNOTNULL, "notnull");
+  (void) LCLReserveToken (LLT_RETURNED, "returned");
+  (void) LCLReserveToken (LLT_OBSERVER, "observer");
+  (void) LCLReserveToken (LLT_EXPOSED, "exposed");
+  (void) LCLReserveToken (LLT_REFCOUNTED, "refcounted");
+  (void) LCLReserveToken (LLT_REFS, "refs");
+  (void) LCLReserveToken (LLT_NEWREF, "newref");
+  (void) LCLReserveToken (LLT_TEMPREF, "tempref");
+  (void) LCLReserveToken (LLT_KILLREF, "killref");
+  (void) LCLReserveToken (LLT_EXITS, "exits");
+  (void) LCLReserveToken (LLT_MAYEXIT, "mayexit");
+  (void) LCLReserveToken (LLT_TRUEEXIT, "trueexit");
+  (void) LCLReserveToken (LLT_FALSEEXIT, "falseexit");
+  (void) LCLReserveToken (LLT_NEVEREXIT, "neverexit");
+  (void) LCLReserveToken (LLT_SEF, "sef");
+  (void) LCLReserveToken (LLT_UNUSED, "unused");
+  (void) LCLReserveToken (LLT_UNIQUE, "unique");
+  (void) LCLReserveToken (LLT_IMPORTS, "imports");
+  (void) LCLReserveToken (LLT_CONSTRAINT, "constraint");
+  (void) LCLReserveToken (LLT_LET, "let");
+  (void) LCLReserveToken (LLT_MODIFIES, "modifies");
+  (void) LCLReserveToken (LLT_CLAIMS, "claims");
+  (void) LCLReserveToken (LLT_BODY, "body");
+  (void) LCLReserveToken (LLT_MUTABLE, "mutable");
+  (void) LCLReserveToken (LLT_FRESH, "fresh");
+  (void) LCLReserveToken (LLT_NOTHING, "nothing");
+  (void) LCLReserveToken (LLT_INTERNAL, "internalState");
+  (void) LCLReserveToken (LLT_FILESYS, "fileSystem");
+  (void) LCLReserveToken (LLT_PRIVATE, "private");
+  (void) LCLReserveToken (LLT_SPEC, "spec");
+  (void) LCLReserveToken (LLT_REQUIRES, "requires");
+  (void) LCLReserveToken (LLT_SIZEOF, "sizeof");
+  (void) LCLReserveToken (LLT_TAGGEDUNION, "taggedunion");
+  (void) LCLReserveToken (LLT_THEN, "then");
+  (void) LCLReserveToken (LLT_TYPE, "type");
+  (void) LCLReserveToken (LLT_TYPEDEF, "typedef");
+  (void) LCLReserveToken (LLT_UNCHANGED, "unchanged");
+  (void) LCLReserveToken (LLT_USES, "uses");
+  (void) LCLReserveToken (LLT_PRINTFLIKE, "printflike");
+  (void) LCLReserveToken (LLT_SCANFLIKE, "scanflike");
+  (void) LCLReserveToken (LLT_MESSAGELIKE, "messagelike");
+
+  /* LCL C Keywords */
+  (void) LCLReserveToken (LLT_CHAR, "char");
+  (void) LCLReserveToken (LLT_CONST, "const");
+  (void) LCLReserveToken (LLT_DOUBLE, "double");
+  (void) LCLReserveToken (LLT_ENUM, "enum");
+
+  /* comment out so we can add in lclinit.lci: synonym double float */
+  /* LCLReserveToken (LLT_FLOAT,		    "float"); */
+  /* But we need to make the scanner parse "float" not as a simpleId, but
+     as a TYPEDEF_NAME.  This is done later in abstract_init  */
+  
+  (void) LCLReserveToken (LLT_INT, "int");
+  (void) LCLReserveToken (LLT_LONG, "long");
+  (void) LCLReserveToken (LLT_SHORT, "short");
+  (void) LCLReserveToken (LLT_STRUCT, "struct");
+  (void) LCLReserveToken (LLT_SIGNED, "signed");
+  (void) LCLReserveToken (LLT_UNION, "union");
+  (void) LCLReserveToken (LLT_UNKNOWN, "__unknown");
+  (void) LCLReserveToken (LLT_UNSIGNED, "unsigned");
+  (void) LCLReserveToken (LLT_VOID, "void");
+  (void) LCLReserveToken (LLT_VOLATILE, "volatile");
+  setCodePoint ();
+}
+
+void
+LCLScanLineReset (void)
+{
+  inComment = FALSE;
+  prevTokenCode = LLT_LPAR;		/* Presume first ' starts literal */
+}
+
+void
+LCLScanLineCleanup (void)
+{
+}
+
+bool LCLIsEndComment (char c)
+{
+  return LCLcharClass[(int)(c)].endCommentChar;
+}
+
+charCode LCLScanCharClass (char c)
+{
+  return LCLcharClass[(int)(c)].code;
+}
+
+void LCLSetCharClass (char c, charCode cod) 
+{
+  LCLcharClass[(int)(c)].code = (cod);
+}
+
+void LCLSetEndCommentChar (char c, bool flag) 
+{
+  LCLcharClass[(int)(c)].endCommentChar = flag;
+}
+
diff --git a/src/lclsyntable.c b/src/lclsyntable.c
new file mode 100644
index 0000000..01193b1
--- /dev/null
+++ b/src/lclsyntable.c
@@ -0,0 +1,181 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** syntable.c
+**
+** Larch/C Interface language synonym table
+**
+**	This table stores synonyms for the Larch/C Interface Language.  It is
+**	essentially an array of token-handles indexed by string-handles.
+**	Therefore, synonyms (strings) can be converted to the actual token.
+**
+**  AUTHORS:
+**	J.P. Wild
+**
+**
+**  CREATION DATE:  90.08.10
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "lcltokentable.h"
+# include "lclsyntable.h"
+
+static long unsigned MaxSyn;	/* size of SynTable[]              */
+static /*@only@*/ /*@reldef@*/ /*@null@*/ lsymbol *SynTable;
+static void
+  AllocSynTable (void)
+  /*@globals SynTable, MaxSyn@*/
+  /*@modifies *SynTable, MaxSyn@*/;
+
+void
+LCLAddSyn (lsymbol ntok, lsymbol otok)
+{
+  while (otok >= MaxSyn)
+    {
+      /* No more space available.  Allocate more. */
+      AllocSynTable ();
+    }
+
+  llassert (SynTable != NULL);
+
+  if (SynTable[ntok] == 0)
+    {
+     /* Entry is empty. Fill it in. */
+      SynTable[ntok] = otok;
+
+      /* Mark oldToken as having a synonym. */
+      LCLSetTokenHasSyn (otok, TRUE);
+    }
+  else
+    {
+      llbuglit ("LCLAddSyn: invalid argument");
+    }
+}
+
+/*@exposed@*/ ltoken
+LCLGetTokenForSyn (lsymbol ntok)
+{
+  llassert (SynTable != NULL);
+
+  if (!((ntok < MaxSyn) || (SynTable[ntok] != 0)))
+    llbuglit ("LCLGetSyn: bad argument");
+
+  return LCLGetToken (SynTable[ntok]);
+}
+
+bool
+LCLIsSyn (lsymbol str)
+{
+  if (MaxSyn == 0)
+    {
+      return FALSE;
+    }
+  else
+    {
+      llassert (SynTable != NULL);
+
+      if (str < MaxSyn)
+	{
+	  /* Check for synonym entry in table. */
+	  return (SynTable[str] != 0);
+	}
+      else
+	{
+	  /* No token for synonym.  Return FALSE. */
+	  return FALSE;
+	}
+    }
+}
+  
+static void
+AllocSynTable (void) /*@globals SynTable; @*/
+{
+  long unsigned newSize, oldSize;
+  long unsigned int i;
+
+  oldSize = MaxSyn;
+
+  if (oldSize == 0)
+    {
+      /* First time SynTable allocated.  Set initial size. */
+      newSize = INITSYNTABLE;
+      SynTable = (lsymbol *) dmalloc (newSize * sizeof (*SynTable));
+    }
+  else
+    {
+      lsymbol *oldSynTable = SynTable; 
+
+      llassert (oldSynTable != NULL);
+
+      /* Synonym table already allocated.  Calulate extension size. */
+      newSize = (unsigned long) (DELTASYNTABLE * oldSize);
+      SynTable = (lsymbol *) dmalloc (newSize * sizeof (*SynTable));
+
+      for (i = 0; i < oldSize; i++)
+	{
+	  SynTable[i] = oldSynTable[i];
+	}
+      
+      sfree (oldSynTable);
+    }
+
+  /* Zero out new allocated space.  Need to detect when cells are empty     */
+  /* and do this by checking that SynTable[x] == 0.			    */
+
+  /* ###  Should the "for" loop be replaced with the following?	            */
+  /* #if VMS								    */
+  /* # include ;						    */
+  /* #else								    */
+  /* # include ;						    */
+  /*									    */
+  /* memset (SynTable[oldSize], 0,					    */
+  /*	      (newSize - oldSize) * sizeof (*SynTable));		            */
+  
+  for (i = oldSize; i < newSize; i++)
+    {
+      SynTable[i] = 0;
+    }
+
+  MaxSyn = newSize;
+}
+
+
+void
+LCLSynTableInit (void)
+{
+  MaxSyn = 0;
+}
+
+void
+LCLSynTableReset (void)
+{
+}
+
+void
+LCLSynTableCleanup (void)
+{
+  sfree (SynTable);
+  SynTable = NULL;
+}
diff --git a/src/lcltokentable.c b/src/lcltokentable.c
new file mode 100644
index 0000000..b1e124d
--- /dev/null
+++ b/src/lcltokentable.c
@@ -0,0 +1,230 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** tokentable.c
+**
+** Larch processors token table
+** This table stores predefined tokens for LCL.
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "lcltokentable.h"
+
+static long unsigned MaxToken; 
+static /*@only@*/ /*@null@*/ o_ltoken *LCLTokenTable = NULL;    
+
+static void AllocTokenTable (void) 
+   /*@globals LCLTokenTable@*/
+   /*@modifies LCLTokenTable, MaxToken@*/;
+
+ltoken 
+  LCLInsertToken (ltokenCode cod, lsymbol sym, lsymbol rTxt,
+		  bool isPredefined)
+{
+  /*
+  ** If the token is already in the token table, it is returned.  Otherwise,
+  ** the token is inserted into the table and then returned.
+  **
+  ** A new TokenTable is allocated when:
+  **   . The TokenTable[] is empty (initial case)
+  **   . The location where to insert the token is not in TokenTable[]
+  */
+
+  setCodePoint ();
+
+  while (sym >= MaxToken)
+    {
+      setCodePoint ();
+      /* No more space available.  Allocate more. */
+      AllocTokenTable ();
+    }
+  
+  llassert (LCLTokenTable != NULL);
+
+  if (ltoken_isUndefined (LCLTokenTable[sym]))
+    {
+      LCLTokenTable[sym] = ltoken_create (cod, sym);      
+      ltoken_setRawText (LCLTokenTable[sym], rTxt);
+      ltoken_setDefined (LCLTokenTable[sym], isPredefined);
+            return LCLTokenTable[sym];
+    }
+
+    return LCLTokenTable[sym];
+}
+
+void LCLUpdateToken (ltokenCode cod, lsymbol sym, bool def)
+{
+  llassert (LCLTokenTable != NULL);
+
+  if (!ltoken_isUndefined (LCLTokenTable[sym]))
+    {
+      ltoken_setCode (LCLTokenTable[sym], cod);
+      ltoken_setDefined (LCLTokenTable[sym], def);
+    }
+  else
+    {
+      llfatalbug (message ("LCLUpdateToken: %s", 
+			   cstring_fromChars (lsymbol_toChars (sym))));
+    }
+}
+
+void LCLSetTokenHasSyn (lsymbol sym, bool syn)
+{
+  llassert (LCLTokenTable != NULL);
+
+  if (!ltoken_isUndefined (LCLTokenTable[sym]))
+    {
+      ltoken_setHasSyn (LCLTokenTable[sym], syn);
+    }
+  else
+    {
+      llfatalbug (message ("LCLSetTokenHasSyn: null token (%d)", (int)sym));
+    }
+}
+
+ltoken LCLGetToken (lsymbol sym)
+{
+  llassert (LCLTokenTable != NULL);
+  llassert (sym < MaxToken);
+
+  return LCLTokenTable[sym];
+}
+
+#if 0
+bool LCLTokenTableContainsToken (ltoken tok)
+{
+  unsigned long i;
+
+  if (LCLTokenTable != NULL) {
+    for (i = 0; i < MaxToken; i++) {
+      if (LCLTokenTable[i] == tok) {
+	return TRUE;
+      }
+    }
+  }
+
+  return FALSE;
+}
+# endif
+
+/*@exposed@*/ ltoken
+LCLReserveToken (ltokenCode cod, char *txt)
+{
+  /*
+  ** The same context that was active when the string-handle
+  ** was derived by a previous call to lsymbol_fromChars (),
+  ** must be established.
+  */
+  lsymbol sym;
+
+  setCodePoint ();
+  sym = lsymbol_fromChars (txt);
+  
+  /* 
+  ** Reserved tokens never have raw text like synonyms.
+  */
+
+    return (LCLInsertToken (cod, sym, lsymbol_undefined, TRUE));
+}
+
+static void
+  AllocTokenTable (void) /*@globals LCLTokenTable; @*/ 
+{
+  long unsigned oldSize, newSize;
+  long unsigned int i;
+  
+  oldSize = MaxToken;
+
+  if (oldSize == 0)
+    {
+      newSize = INITTOKENTABLE;
+      llassert (LCLTokenTable == NULL);
+      LCLTokenTable = (ltoken *) dmalloc (newSize * sizeof (*LCLTokenTable));
+    }
+  else
+    {
+      o_ltoken *oldLCLTokenTable = LCLTokenTable;
+
+      llassert (oldLCLTokenTable != NULL);
+
+      newSize = (long unsigned) (DELTATOKENTABLE * oldSize);
+      LCLTokenTable = (ltoken *) dmalloc (newSize * sizeof (*LCLTokenTable));
+
+      for (i = 0; i < oldSize; i++)
+	{
+	  LCLTokenTable[i] = oldLCLTokenTable[i];
+	}
+      
+      sfree (oldLCLTokenTable);
+    }
+
+  MaxToken = newSize;
+  
+  /*@+loopexec@*/
+  for (i = oldSize; i < newSize; i++)
+    {
+      LCLTokenTable[i] = ltoken_undefined;
+    }
+  /*@=loopexec@*/
+/*@-compdef@*/ } /*=compdef@*/
+
+void
+LCLTokenTableInit (void)
+{
+    MaxToken = 0;
+}
+
+void
+LCLTokenTableCleanup (void)
+{
+    
+  if (LCLTokenTable != NULL)
+    {
+      long unsigned i;
+      
+      for (i = 0; i < MaxToken; i++)
+	{
+	  ltoken tok = LCLTokenTable[i];
+	  
+	  LCLTokenTable[i] = NULL;
+	  /*@-dependenttrans@*/ ltoken_free (tok);
+	  /*@=dependenttrans@*/
+	}
+      
+      sfree (LCLTokenTable); 
+      LCLTokenTable = NULL;
+    }
+
+  }
+
+
+
+
+
+
+
+
+
+
diff --git a/src/letDeclNodeList.c b/src/letDeclNodeList.c
new file mode 100644
index 0000000..4bc9fb9
--- /dev/null
+++ b/src/letDeclNodeList.c
@@ -0,0 +1,117 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** letDeclNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ letDeclNodeList
+letDeclNodeList_new ()
+{
+  letDeclNodeList s = (letDeclNodeList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = letDeclNodeListBASESIZE;
+  s->elements = (letDeclNode *)
+    dmalloc (sizeof (*s->elements) * letDeclNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+letDeclNodeList_grow (letDeclNodeList s)
+{
+  int i;
+  letDeclNode *newelements;
+
+  s->nspace += letDeclNodeListBASESIZE;
+
+  newelements = (letDeclNode *) dmalloc (sizeof (*newelements)
+					 * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+letDeclNodeList
+letDeclNodeList_add (letDeclNodeList s, letDeclNode el)
+{
+  llassert (letDeclNodeListBASESIZE > 0);
+
+  if (s->nspace <= 0)
+    letDeclNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+/*@only@*/ cstring
+letDeclNodeList_unparse (letDeclNodeList s)
+{
+  cstring st = cstring_undefined;
+
+  letDeclNodeList_elements (s, current)
+  {
+    st = message ("%qlet %s", st, ltoken_getRawString (current->varid));
+
+    if (current->sortspec != NULL)
+      {
+	st = message ("%q: %q", st, lclTypeSpecNode_unparse (current->sortspec));
+      }
+    else
+      {
+	st = message ("%q ", st);
+      }
+    st = message ("%q = %q\n", st, termNode_unparse (current->term));
+  } end_letDeclNodeList_elements;
+
+  return st;
+}
+
+void
+letDeclNodeList_free (letDeclNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      letDeclNode_free (s->elements[i]); 
+    }
+
+  sfree (s->elements);
+  sfree (s);
+}
diff --git a/src/lex.yy.c b/src/lex.yy.c
new file mode 100644
index 0000000..5fef860
--- /dev/null
+++ b/src/lex.yy.c
@@ -0,0 +1,5352 @@
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header$
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#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 */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif	/* __STDC__ */
+#endif	/* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include 
+#include 
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* 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 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* 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 yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ * 	if ( condition_holds )
+ *		yyless( 5 );
+ *	else
+ *		do_something_else();
+ *
+ * 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 yyless() call.
+ */
+
+/* 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_RESTORE_YY_MORE_OFFSET \
+		yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via yyrestart()), so that the user can continue scanning by
+	 * just pointing yyin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+	};
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* 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 char yy_hold_char;
+
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (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;
+
+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 ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+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 yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	yytext_ptr = yy_bp; \
+	yyleng = (int) (yy_cp - yy_bp); \
+	yy_hold_char = *yy_cp; \
+	*yy_cp = '\0'; \
+	yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 177
+#define YY_END_OF_BUFFER 178
+static yyconst short int yy_accept[509] =
+    {   0,
+        0,    0,  178,  176,  156,  157,  144,  176,    3,   79,
+      150,  143,  176,  138,  139,  148,  147,  135,  146,  142,
+      149,   94,   94,  136,  132,  151,  137,  152,  155,  176,
+      140,  175,  141,  153,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,  133,  154,  134,  145,  131,
+        0,   42,    0,    2,   79,  117,  173,  174,  126,  118,
+        0,    0,  115,  123,  113,  124,  114,  125,    0,  107,
+        1,  116,  110,   87,    0,   96,   95,    0,   94,  122,
+      128,  130,  129,  121,    0,    0,    0,  119,   79,   79,
+
+       79,   79,   79,   79,   79,   79,    9,   79,   79,   79,
+       79,   79,   79,   79,   13,   44,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,  120,  127,    0,    0,    2,  101,
+        4,    0,  105,  106,  107,    0,  108,  109,   89,   88,
+        0,  104,   97,   98,   98,   80,  112,  111,  163,  164,
+      161,  166,  171,  162,  172,  167,  170,  165,  168,  169,
+        0,    0,   79,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,   79,   11,
+
+       79,   79,   27,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   43,   79,   79,   79,   79,   79,   79,
+       74,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,    0,   42,    0,    0,  107,    0,  105,  106,
+        0,  110,   90,   91,   91,  102,  103,  100,   99,   81,
+       83,  160,    0,    0,   79,   79,   39,   79,    6,   29,
+       79,   79,   79,   79,   79,   79,   10,   25,   79,   79,
+       79,   79,   12,   79,   79,   79,   51,   79,   31,   79,
+       79,   52,   79,   79,   68,   79,   79,   79,   79,   79,
+
+       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+       26,   79,   79,   79,    0,  107,   93,   92,   82,   84,
+       84,    0,  159,   79,   79,    5,   79,   36,   79,   79,
+       79,   79,   79,   79,   79,   30,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   69,   79,   79,   79,   79,
+       79,   79,   79,   32,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   77,   24,   79,   79,   79,   79,
+       79,   18,   76,   86,   85,  158,   79,   79,   79,   79,
+       79,   79,   79,   28,   79,   38,   79,   21,   79,   54,
+
+       78,   79,   60,   79,   79,   79,   79,   79,   79,   58,
+       79,   14,   75,   34,   15,   79,   41,   22,   17,   79,
+       79,   79,   79,   79,   72,   19,   20,   79,   37,   47,
+       64,   79,   79,    8,   79,   59,   79,   79,   79,   62,
+       53,   79,   79,   45,   79,   79,   57,   79,   46,   61,
+       79,   23,   79,   79,   79,   79,   65,    7,   79,   73,
+       79,   79,   70,   16,   79,   40,   79,   55,   79,   33,
+       35,   79,   71,   56,   79,   79,   79,   67,   79,   79,
+       79,   63,   79,   79,   79,   79,   79,   79,   79,   48,
+       79,   79,   66,   79,   79,   79,   79,   79,   79,   79,
+
+       79,   79,   79,   50,   79,   79,   49,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        4,    4,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    5,    6,    7,    8,    9,   10,   11,   12,
+       13,   14,   15,   16,   17,   18,   19,   20,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   22,   23,   24,
+       25,   26,   27,   28,   29,   30,   31,   30,   32,   33,
+       34,    8,    8,    8,   35,   36,   37,    8,    8,    8,
+       38,   39,   40,   41,   42,    8,   43,   44,    8,   45,
+       46,   47,   48,   49,   50,    1,   51,   52,   53,   54,
+
+       55,   56,   57,   58,   59,    8,   60,   61,   62,   63,
+       64,   65,    8,   66,   67,   68,   69,   70,   71,   72,
+       73,   74,   75,   76,   77,   78,    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 yyconst int yy_meta[79] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    2,    1,    1,
+        3,    1,    1,    1,    1,    1,    1,    1,    1,    4,
+        4,    1,    1,    1,    1,    1,    1,    1,    5,    5,
+        5,    5,    5,    2,    2,    2,    2,    2,    2,    2,
+        2,    2,    2,    2,    2,    1,    1,    1,    1,    2,
+        5,    5,    5,    5,    5,    5,    2,    2,    2,    2,
+        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+        2,    2,    2,    2,    1,    1,    1,    1
+    } ;
+
+static yyconst short int yy_base[516] =
+    {   0,
+        0,    0,  659,  660,  660,  660,  633,   73,    0,    0,
+       55,   71,  610,  660,  660,  631,   67,  660,   68,   66,
+       74,   80,   85,  660,  660,   65,  630,   82,  660,   91,
+      660,  660,  660,  629,  603,   28,  586,   67,   40,   65,
+       72,  587,   88,   55,  586,   79,  101,  598,  593,  103,
+       90,  584,   51,  588,  586,  660,  113,  660,  660,  660,
+      133,  163,  641,    0,    0,  660,  660,  660,  660,  660,
+      100,  139,  660,  660,  660,  660,  660,  660,  625,  155,
+      660,  660,  162,  172,  164,  160,  142,    0,  204,  617,
+      660,  660,  660,  616,  245,  603,  603,  660,  585,  564,
+
+      568,  580,  567,  122,  570,  141,  563,  564,  561,  144,
+      568,  564,  561,  558,    0,   99,  562,  569,  562,  559,
+      550,  552,  558,  551,  561,  555,  547,  551,  547,  174,
+      556,  135,  158,  556,  154,  551,  547,  539,  542,  184,
+      556,  167,  546,  549,  660,  660,  242,  153,    0,  660,
+      660,  235,  660,  660,  251,  243,  660,  660,  233,  230,
+      241,  272,  165,  660,  234,  261,  660,  660,  660,  562,
+      660,  660,  660,  660,  660,  660,  660,  660,  660,  660,
+      563,  564,  536,  531,  534,  546,  541,  529,  541,  200,
+      542,  537,  539,  535,  527,  524,  532,  519,  534,    0,
+
+      520,  524,  527,  512,  515,  518,  521,  511,  513,  514,
+      519,  506,  499,    0,  516,  502,  516,  509,  246,  498,
+        0,  500,  499,  501,  508,  509,  493,  491,  491,  493,
+      502,  501,  497,  499,  489,  493,  484,  203,  496,  498,
+      487,  486,  271,  308,  543,  278,  296,  304,  660,  660,
+      306,  314,  254,  660,  277,  660,  660,  660,  660,  295,
+      279,  660,  517,  505,  480,  469,    0,  481,    0,    0,
+      480,  471,  479,  468,  473,  474,    0,    0,  467,  467,
+      477,  463,    0,  467,  472,  467,    0,  287,    0,  472,
+      457,    0,  459,  469,    0,  469,  463,  457,  453,  464,
+
+      449,  451,  461,  447,  459,  449,  453,  452,  457,  456,
+      442,  444,  452,  450,  448,  440,  445,  446,  434,  446,
+        0,  430,  442,  442,  323,  325,  660,  660,  294,  660,
+      305,  467,  660,  427,  428,    0,  293,    0,  429,  430,
+      436,  434,  433,  424,  423,    0,  430,  418,  422,  428,
+      426,  424,  418,  408,  409,    0,  425,  406,  406,  417,
+      411,  408,  416,    0,  415,  412,  416,  413,  397,  406,
+      408,  393,  406,  407,    0,    0,  396,  404,  400,  395,
+      396,    0,    0,  660,  660,  660,  386,  398,  398,  387,
+      381,  381,  393,    0,  393,  395,  376,    0,  393,    0,
+
+        0,  387,    0,  381,  386,  376,  378,  375,  382,    0,
+      375,    0,    0,  376,    0,  373,    0,    0,    0,  377,
+      371,  375,  370,  374,    0,    0,    0,  367,    0,    0,
+      360,  372,  370,    0,  361,    0,  362,  361,  360,    0,
+        0,  354,  363,    0,  350,  351,    0,  353,    0,    0,
+      345,    0,  347,  343,  339,  325,    0,    0,  317,    0,
+      323,  315,    0,    0,  327,    0,  312,    0,  325,  319,
+        0,  311,    0,    0,  303,  320,  318,    0,  309,  312,
+      304,    0,  311,  299,  312,  307,  294,  304,  286,    0,
+      300,  292,    0,  278,  254,  236,  250,  176,  186,  174,
+
+      151,  158,  128,    0,   48,   28,    0,  660,  386,  390,
+      394,  399,  403,  405,  410
+    } ;
+
+static yyconst short int yy_def[516] =
+    {   0,
+      508,    1,  508,  508,  508,  508,  508,  509,  510,  511,
+      508,  508,  512,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  508,  508,  508,  508,  508,
+      509,  508,  509,  513,  511,  508,  508,  508,  508,  508,
+      512,  512,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  514,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  511,  511,
+
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  508,  508,  508,  515,  513,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  514,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  515,  508,  515,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  508,  508,  508,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+
+      511,  511,  511,  511,  511,  511,  511,    0,  508,  508,
+      508,  508,  508,  508,  508
+    } ;
+
+static yyconst short int yy_nxt[739] =
+    {   0,
+        4,    5,    6,    5,    7,    8,    9,   10,   11,   12,
+       13,   14,   15,   16,   17,   18,   19,   20,   21,   22,
+       23,   24,   25,   26,   27,   28,   29,   30,   10,   10,
+       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,
+       10,   10,   10,   10,   10,   31,   32,   33,   34,   35,
+       36,   37,   38,   39,   40,   41,   42,   10,   43,   44,
+       45,   10,   46,   47,   48,   49,   50,   51,   52,   53,
+       54,   10,   55,   10,   56,   57,   58,   59,   62,   66,
+       69,   74,  507,   79,   76,   80,   80,   81,   90,   91,
+      100,   75,   77,   78,  106,   70,  101,   83,   82,   84,
+
+       84,  141,   83,  107,   89,   89,   93,   94,   95,  118,
+      150,   85,  506,  119,  142,   86,   85,  103,   96,   63,
+       86,   87,  111,   88,  104,  108,   87,  109,   97,   67,
+      105,   68,  112,  121,   85,  113,  110,  145,   62,   85,
+       86,  508,  122,  115,  137,   86,   72,  123,   87,   71,
+      116,   88,  124,   87,  117,  138,  125,  131,  244,  202,
+      132,  133,  139,  126,  147,  147,  203,  134,  148,  127,
+      135,  128,  188,  136,   80,   80,  189,  165,  161,   63,
+      161,  155,  155,  162,  162,  222,  152,  153,  146,   83,
+      154,   84,   84,  156,  157,  163,  191,  158,  223,  245,
+
+      505,  164,  165,   85,  227,  192,  258,  159,  196,  152,
+      153,  197,  504,  160,  224,  154,  156,  157,  503,  228,
+      163,   83,  158,   89,   89,  239,   85,  240,  164,  217,
+      218,  225,  159,  258,  219,   85,  233,  234,  502,   86,
+      160,  220,  235,  147,  147,   87,  501,  148,  500,  246,
+      236,  246,  237,  319,  247,  247,  320,  251,   85,  251,
+      162,  162,  252,  252,   86,  255,  272,  273,  253,  259,
+      155,  155,   87,  169,  254,  170,  244,  171,  172,  173,
+      174,  175,  248,  249,  176,  177,  250,  178,  179,  180,
+      255,  162,  162,  253,  259,  327,  260,  247,  247,  300,
+
+      499,  254,  261,  498,  256,  248,  249,  257,  301,  147,
+      147,  250,  328,  148,  331,  247,  247,  245,  325,  497,
+      325,  260,  327,  326,  326,  252,  252,  256,  153,  261,
+      329,  154,  257,  252,  252,  384,  330,  328,  496,  331,
+      385,  350,  326,  326,  326,  326,  157,  389,  495,  158,
+      494,  153,  351,  493,  390,  329,  154,  249,  492,  491,
+      250,  490,  384,  330,  489,  385,  488,  487,  486,  157,
+      485,  484,  483,  482,  158,  481,  480,  479,  478,  477,
+      249,  476,  475,  474,  473,  250,   61,   61,   61,   61,
+       61,   64,  472,  471,   64,   65,  470,   65,   65,   71,
+
+       71,  469,   71,   71,  149,  468,  149,  149,  166,  166,
+      243,  243,  243,  243,  243,  467,  466,  465,  464,  463,
+      462,  461,  460,  459,  458,  457,  456,  455,  454,  453,
+      452,  451,  450,  449,  448,  447,  446,  445,  444,  443,
+      442,  441,  440,  439,  438,  437,  436,  435,  434,  433,
+      432,  431,  430,  429,  428,  427,  426,  425,  424,  423,
+      422,  421,  420,  419,  418,  417,  416,  415,  414,  413,
+      412,  411,  410,  409,  408,  407,  406,  405,  404,  403,
+      402,  401,  400,  399,  398,  397,  396,  395,  394,  393,
+      392,  391,  388,  387,  386,  383,  382,  381,  380,  379,
+
+      378,  377,  376,  375,  374,  373,  372,  371,  370,  369,
+      368,  367,  366,  365,  364,  363,  362,  361,  360,  359,
+      358,  357,  356,  355,  354,  353,  352,  349,  348,  347,
+      346,  345,  344,  343,  342,  341,  340,  339,  338,  337,
+      336,  335,  334,  333,  332,  508,  324,  323,  322,  321,
+      318,  317,  316,  315,  314,  313,  312,  311,  310,  309,
+      308,  307,  306,  305,  304,  303,  302,  299,  298,  297,
+      296,  295,  294,  293,  292,  291,  290,  289,  288,  287,
+      286,  285,  284,  283,  282,  281,  280,  279,  278,  277,
+      276,  275,  274,  271,  270,  269,  268,  267,  266,  265,
+
+      264,  263,  262,  242,  241,  238,  232,  231,  230,  229,
+      226,  221,  216,  215,  214,  213,  212,  211,  210,  209,
+      208,  207,  206,  205,  204,  201,  200,  199,  198,  195,
+      194,  193,  190,  187,  186,  185,  184,  183,  182,  181,
+      168,  167,  151,  508,  144,  143,  140,  130,  129,  120,
+      114,  102,   99,   98,   92,   73,   72,   60,  508,    3,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508
+    } ;
+
+static yyconst short int yy_chk[739] =
+    {   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,    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,    8,   11,
+       12,   17,  506,   20,   19,   20,   20,   21,   26,   26,
+       36,   17,   19,   19,   39,   12,   36,   22,   21,   22,
+
+       22,   53,   23,   39,   23,   23,   28,   28,   30,   44,
+       71,   22,  505,   44,   53,   22,   23,   38,   30,    8,
+       23,   22,   41,   22,   38,   40,   23,   40,   30,   11,
+       38,   11,   41,   46,   22,   41,   40,   57,   61,   23,
+       22,   72,   46,   43,   51,   23,   71,   46,   22,   72,
+       43,   22,   47,   23,   43,   51,   47,   50,  148,  116,
+       50,   50,   51,   47,   62,   62,  116,   50,   62,   47,
+       50,   47,  104,   50,   80,   80,  104,   87,   85,   61,
+       85,   83,   83,   85,   85,  132,   80,   80,   57,   84,
+       80,   84,   84,   83,   83,   86,  106,   83,  132,  148,
+
+      503,   86,   87,   84,  135,  106,  163,   84,  110,   80,
+       80,  110,  502,   84,  133,   80,   83,   83,  501,  135,
+       86,   89,   83,   89,   89,  142,   84,  142,   86,  130,
+      130,  133,   84,  163,  130,   89,  140,  140,  500,   89,
+       84,  130,  140,  147,  147,   89,  499,  147,  498,  152,
+      140,  152,  140,  238,  152,  152,  238,  156,   89,  156,
+      161,  161,  156,  156,   89,  160,  190,  190,  159,  165,
+      155,  155,   89,   95,  159,   95,  243,   95,   95,   95,
+       95,   95,  155,  155,   95,   95,  155,   95,   95,   95,
+      160,  162,  162,  159,  165,  253,  166,  246,  246,  219,
+
+      497,  159,  166,  496,  162,  155,  155,  162,  219,  244,
+      244,  155,  255,  244,  261,  247,  247,  243,  248,  495,
+      248,  166,  253,  248,  248,  251,  251,  162,  247,  166,
+      260,  247,  162,  252,  252,  329,  260,  255,  494,  261,
+      331,  288,  325,  325,  326,  326,  252,  337,  492,  252,
+      491,  247,  288,  489,  337,  260,  247,  326,  488,  487,
+      326,  486,  329,  260,  485,  331,  484,  483,  481,  252,
+      480,  479,  477,  476,  252,  475,  472,  470,  469,  467,
+      326,  465,  462,  461,  459,  326,  509,  509,  509,  509,
+      509,  510,  456,  455,  510,  511,  454,  511,  511,  512,
+
+      512,  453,  512,  512,  513,  451,  513,  513,  514,  514,
+      515,  515,  515,  515,  515,  448,  446,  445,  443,  442,
+      439,  438,  437,  435,  433,  432,  431,  428,  424,  423,
+      422,  421,  420,  416,  414,  411,  409,  408,  407,  406,
+      405,  404,  402,  399,  397,  396,  395,  393,  392,  391,
+      390,  389,  388,  387,  381,  380,  379,  378,  377,  374,
+      373,  372,  371,  370,  369,  368,  367,  366,  365,  363,
+      362,  361,  360,  359,  358,  357,  355,  354,  353,  352,
+      351,  350,  349,  348,  347,  345,  344,  343,  342,  341,
+      340,  339,  335,  334,  332,  324,  323,  322,  320,  319,
+
+      318,  317,  316,  315,  314,  313,  312,  311,  310,  309,
+      308,  307,  306,  305,  304,  303,  302,  301,  300,  299,
+      298,  297,  296,  294,  293,  291,  290,  286,  285,  284,
+      282,  281,  280,  279,  276,  275,  274,  273,  272,  271,
+      268,  266,  265,  264,  263,  245,  242,  241,  240,  239,
+      237,  236,  235,  234,  233,  232,  231,  230,  229,  228,
+      227,  226,  225,  224,  223,  222,  220,  218,  217,  216,
+      215,  213,  212,  211,  210,  209,  208,  207,  206,  205,
+      204,  203,  202,  201,  199,  198,  197,  196,  195,  194,
+      193,  192,  191,  189,  188,  187,  186,  185,  184,  183,
+
+      182,  181,  170,  144,  143,  141,  139,  138,  137,  136,
+      134,  131,  129,  128,  127,  126,  125,  124,  123,  122,
+      121,  120,  119,  118,  117,  114,  113,  112,  111,  109,
+      108,  107,  105,  103,  102,  101,  100,   99,   97,   96,
+       94,   90,   79,   63,   55,   54,   52,   49,   48,   45,
+       42,   37,   35,   34,   27,   16,   13,    7,    3,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508,  508,  508,
+      508,  508,  508,  508,  508,  508,  508,  508
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static 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
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "cscanner.l"
+#define INITIAL 0
+/*;-*-C-*-; 
+** Copyright (c) Massachusetts Institute of Technology 1994-1998.
+**          All Rights Reserved.
+**          Unpublished rights reserved under the copyright laws of
+**          the United States.
+**
+** THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+** OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+**
+** This code is distributed freely and may be used freely under the 
+** following conditions:
+**
+**     1. This notice may not be removed or altered.
+**
+**     2. Works derived from this code are not distributed for
+**        commercial gain without explicit permission from MIT 
+**        (for permission contact lclint-request@sds.lcs.mit.edu).
+*/
+/*
+ * Modified by Herbert 08/19/97:
+ * - added #include for IBM's OS/2 compiler.
+ * - fixed weird bug with lookup of tmp files (OS/2 and MSDOS only).
+ */
+/*
+ * Modified by Mike Smith 
+ * Corrected missing 'line' in scanf() calls in handleSpecial().
+ * Without this, I get an error when LCLint hits a '#line' directive
+ * in the pre-pre-processed source files. For safety, I have made these
+ * conditional on OS2 and MSDOS because I don't understand why noone else
+ * has seen this problem.
+ *
+ * Modified by Mike Smith, 4th June 1997
+ * Finally resolved the #line problem.  The scanf() calls have been fixed to
+ * allow the following #line forms:-
+ *
+ *        #line 123 "filename"
+ *        #line 123
+ *        # 123 "filename"
+ *        # 123
+ *
+ * The last two are generated by the GNU pre-processor, apparently
+ */
+#line 56 "cscanner.l"
+/*
+** based on original C lexer by Nate Osgood
+**    from hacrat@catfish.lcs.mit.edu Mon Jun 14 13:06:32 1993
+**
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+# ifdef SANITIZER
+# include "sgrammar.h"
+# include "sgrammar_tokens.h"
+# else
+# include "cgrammar.h"
+# include "cgrammar_tokens.h"
+# endif
+
+# include "fileIdList.h"
+# include "portab.h"
+
+# if defined(OS2) && defined(__IBMC__)
+   /* needed for isatty()... */
+# include 
+# endif
+
+static bool lastWasString = FALSE;
+static char savechar = '\0';
+
+/*@notfunction@*/
+# define yyinput() (incColumn (), getc (yyin))
+
+/*@-noparams@*/
+/*@-incondefs@*/
+extern /*@external@*/ int read ();
+/*@=incondefs@*/
+/*@=noparams@*/
+
+static /*@owned@*/ cstring lastidprocessed = cstring_undefined;
+
+static int lminput (void);
+static int tokLength = 0;
+static bool inSpecPart = FALSE;
+static bool continueLine = FALSE;
+
+static int ninput (void);
+static char processChar (void);
+static double processFloat (void);
+static /*@only@*/ exprNode processString (void);
+static long processDec (void);
+static long processHex (void);
+static long processOctal (void);
+static int processIdentifier (/*@only@*/ cstring)
+   /*@globals undef lastidprocessed@*/ ;
+static bool processHashIdentifier (/*@only@*/ cstring)
+   /*@globals undef lastidprocessed@*/ ;
+
+static int processSpec (int);
+static bool handleSpecial (char *);
+static int handleLlSpecial (void);
+static void handleMacro (void);
+static bool processMacro (void);
+static /*@only@*/ cstring makeIdentifier (char *);
+
+/* yes, this is exported! */
+bool g_expectingTypeName = TRUE; /* beginning of file can be type name! */
+
+static int returnInt (ctype, long);
+static int returnFloat (ctype, double);
+static int returnChar (char);
+static void setTokLength (int) /*@modifies g_currentloc@*/ ;
+static void setTokLengthT (size_t) /*@modifies g_currentloc@*/ ;
+
+static void advanceLine (void)
+{
+  tokLength = 0;
+  beginLine ();
+}
+    
+/*@-allmacros@*/
+# define RETURN_INT(c,i) \
+  do { lastWasString = FALSE; \
+       return (returnInt (c, i)); } while (FALSE)
+
+# define RETURN_FLOAT(c,f) \
+  do { lastWasString = FALSE; \
+       return (returnFloat (c, f)); \
+       } while (FALSE)
+
+# define RETURN_CHAR(c) \
+  do { lastWasString = FALSE; \
+       return (returnChar (c)); \
+     } while (FALSE)
+
+# define RETURN_TOK(t) \
+  do { yylval.tok = lltok_create (t, fileloc_decColumn (g_currentloc, tokLength)); \
+       tokLength = 0; \
+       lastWasString = FALSE; \
+       return (t); } while (FALSE)
+
+# define RETURN_TYPE(t, ct) \
+  do { yylval.ctyp = ct; tokLength = 0; return (t); } while (FALSE)
+
+/* don't fileloc_decColumn (g_currentloc, tokLength));  
+   the string could have \n's in it!
+*/
+
+# define RETURN_STRING(c) \
+ do { yylval.expr = exprNode_stringLiteral (c, fileloc_decColumn (g_currentloc, tokLength)); \
+      tokLength = 0; \
+      lastWasString = TRUE; \
+      return (CCONSTANT); } while (FALSE)
+
+# define RETURN_EXPR(e) \
+ do { yylval.expr = e; \
+      tokLength = 0; \
+      lastWasString = TRUE; \
+      return (CCONSTANT); } while (FALSE)
+
+/*@=allmacros@*/
+
+static void setTokLength (int len) 
+{
+  addColumn (len);
+  tokLength = len;
+}
+
+static void setTokLengthT (size_t len)
+{
+  setTokLength (size_toInt (len));
+}
+
+# include "flex.head"
+#line 872 "lex.yy.c"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include 
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	if ( yy_current_buffer->yy_is_interactive ) \
+		{ \
+		int c = '*', n; \
+		for ( n = 0; n < max_size && \
+			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+			buf[n] = (char) c; \
+		if ( c == '\n' ) \
+			buf[n++] = (char) c; \
+		if ( c == EOF && ferror( yyin ) ) \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+		result = n; \
+		} \
+	else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+		  && ferror( yyin ) ) \
+		YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* 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.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	YY_USER_ACTION
+
+YY_DECL
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+
+#line 190 "cscanner.l"
+
+
+#line 1026 "lex.yy.c"
+
+	if ( yy_init )
+		{
+		yy_init = 0;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! yy_start )
+			yy_start = 1;	/* first start state */
+
+		if ( ! yyin )
+			yyin = stdin;
+
+		if ( ! yyout )
+			yyout = stdout;
+
+		if ( ! yy_current_buffer )
+			yy_current_buffer =
+				yy_create_buffer( yyin, YY_BUF_SIZE );
+
+		yy_load_buffer_state();
+		}
+
+	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;
+yy_match:
+		do
+			{
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*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 = (int) yy_def[yy_current_state];
+				if ( yy_current_state >= 509 )
+					yy_c = yy_meta[(unsigned int) yy_c];
+				}
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+			++yy_cp;
+			}
+		while ( yy_base[yy_current_state] != 660 );
+
+yy_find_action:
+		yy_act = yy_accept[yy_current_state];
+		if ( yy_act == 0 )
+			{ /* have to back up */
+			yy_cp = yy_last_accepting_cpos;
+			yy_current_state = yy_last_accepting_state;
+			yy_act = yy_accept[yy_current_state];
+			}
+
+		YY_DO_BEFORE_ACTION;
+
+
+do_action:	/* This label is used only to access EOF actions. */
+
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+			case 0: /* must back up */
+			/* 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:
+YY_RULE_SETUP
+#line 192 "cscanner.l"
+{ llfatalbug (cstring_makeLiteral ("Comment in pre-processor output")); }
+	YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 194 "cscanner.l"
+{ 
+                 context_saveLocation (); 
+                 setTokLength (longUnsigned_toInt (mstring_length (yytext))); 
+
+                 if (processHashIdentifier (makeIdentifier (yytext + 1)))
+                   {
+		     if (lastWasString)
+		       {
+			 ;
+		       }
+		     else
+		       {
+			 RETURN_STRING (cstring_makeLiteral ("\"\""));
+		       }
+		   }
+                 else
+                   { 
+		     if (handleSpecial (yytext)) 
+                       { 
+			 setTokLength (1); 
+			 RETURN_TOK (0); 
+		       }
+		   }
+                } 
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 218 "cscanner.l"
+{ if (handleSpecial (yytext)) 
+                    { 
+                       setTokLength (1); RETURN_TOK (0); 
+                     }
+                }
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 223 "cscanner.l"
+{ setTokLength (3); RETURN_TOK (CTOK_ELIPSIS); }
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 224 "cscanner.l"
+{ setTokLength (5); RETURN_TOK (BREAK); }
+	YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 225 "cscanner.l"
+{ setTokLength (4); RETURN_TOK (CASE); }
+	YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 226 "cscanner.l"
+{ setTokLength (8); RETURN_TOK (CONTINUE); }
+	YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 227 "cscanner.l"
+{ setTokLength (7); RETURN_TOK (DEFAULT); }
+	YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 228 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (DO); }
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 229 "cscanner.l"
+{ setTokLength (4); RETURN_TOK (CELSE); }
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 230 "cscanner.l"
+{ setTokLength (3); RETURN_TOK (CFOR); }
+	YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 231 "cscanner.l"
+{ setTokLength (4); RETURN_TOK (GOTO); }
+	YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 232 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (CIF); }
+	YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 233 "cscanner.l"
+{ setTokLength (6); RETURN_TOK (RETURN); }
+	YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 234 "cscanner.l"
+{ setTokLength (6); RETURN_TOK (CSIZEOF); }
+	YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 235 "cscanner.l"
+{ setTokLength (8); RETURN_TOK (COFFSETOF); }
+	YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 236 "cscanner.l"
+{ setTokLength (6); RETURN_TOK (SWITCH); }
+	YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 237 "cscanner.l"
+{ setTokLength (5); RETURN_TOK (WHILE); }
+	YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 238 "cscanner.l"
+{ setTokLength (6); RETURN_TOK (VA_ARG); }   
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 239 "cscanner.l"
+{ setTokLength (6); RETURN_TOK (VA_DCL); }   
+	YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 240 "cscanner.l"
+{ 
+                  /* gcc extension...this might not be appropriate */
+                  setTokLength (6); RETURN_TOK (QINLINE); }
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 244 "cscanner.l"
+{ setTokLength (6); RETURN_TOK (CSTRUCT); }  
+	YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 245 "cscanner.l"
+{ setTokLength (7); RETURN_TOK (CTYPEDEF); }
+	YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 247 "cscanner.l"
+{ setTokLength (5); RETURN_TOK (CUNION); }
+	YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 248 "cscanner.l"
+{ setTokLength (4); RETURN_TOK (CENUM); }
+	YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 250 "cscanner.l"
+{ setTokLength (4); RETURN_TYPE (CVOID, ctype_void); }
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 251 "cscanner.l"
+{ setTokLength (3); RETURN_TYPE (CINT, ctype_int); }
+	YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 252 "cscanner.l"
+{ setTokLength (6); RETURN_TYPE (CDOUBLE, ctype_double); }
+	YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 253 "cscanner.l"
+{ setTokLength (4); RETURN_TYPE (CGCHAR, ctype_char); }
+	YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 254 "cscanner.l"
+{ setTokLength (5); RETURN_TYPE (CGFLOAT, ctype_float); }
+	YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 256 "cscanner.l"
+{ setTokLength (4); RETURN_TOK (QLONG); }
+	YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 257 "cscanner.l"
+{ setTokLength (5); RETURN_TOK (QSHORT); }
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 258 "cscanner.l"
+{ setTokLength (8); RETURN_TOK (QUNSIGNED); }
+	YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 259 "cscanner.l"
+{ setTokLength (6); RETURN_TOK (QSIGNED); }
+	YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 261 "cscanner.l"
+{ setTokLength (8); RETURN_TOK (QVOLATILE); }
+	YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 262 "cscanner.l"
+{ setTokLength (5); RETURN_TOK (QCONST); }
+	YY_BREAK
+/* some systems expect this! [gack!] */ 
+case 37:
+YY_RULE_SETUP
+#line 265 "cscanner.l"
+{ setTokLength (7); RETURN_TOK (QCONST); }
+	YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 267 "cscanner.l"
+{ setTokLength (6); RETURN_TOK (QEXTERN); }
+	YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 268 "cscanner.l"
+{ setTokLength (4); RETURN_TOK (QAUTO); }
+	YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 269 "cscanner.l"
+{ setTokLength (8); RETURN_TOK (QREGISTER); }
+	YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 270 "cscanner.l"
+{ setTokLength (6); RETURN_TOK (QSTATIC); }
+	YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 272 "cscanner.l"
+{ RETURN_EXPR (processString ()); }
+	YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 273 "cscanner.l"
+{ return (processSpec (QOUT)); }
+	YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 274 "cscanner.l"
+{ return (processSpec (QIN)); }
+	YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 275 "cscanner.l"
+{ return (processSpec (QPARTIAL)); }
+	YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 276 "cscanner.l"
+{ return (processSpec (QSPECIAL)); }
+	YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 277 "cscanner.l"
+{ return (processSpec (QANYTYPE)); }
+	YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 278 "cscanner.l"
+{ return (processSpec (QINTEGRALTYPE)); }
+	YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 279 "cscanner.l"
+{ return (processSpec (QUNSIGNEDINTEGRALTYPE)); }
+	YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 280 "cscanner.l"
+{ return (processSpec (QSIGNEDINTEGRALTYPE)); }
+	YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 281 "cscanner.l"
+{ return (processSpec (QKEEP)); }
+	YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 282 "cscanner.l"
+{ return (processSpec (QNULL)); } 
+	YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 283 "cscanner.l"
+{ return (processSpec (QNOTNULL)); } 
+	YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 284 "cscanner.l"
+{ return (processSpec (QISNULL)); } 
+	YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 285 "cscanner.l"
+{ return (processSpec (QTRUENULL)); } 
+	YY_BREAK
+case 56:
+YY_RULE_SETUP
+#line 286 "cscanner.l"
+{ return (processSpec (QFALSENULL)); } 
+	YY_BREAK
+case 57:
+YY_RULE_SETUP
+#line 287 "cscanner.l"
+{ return (processSpec (QRELNULL)); }
+	YY_BREAK
+case 58:
+YY_RULE_SETUP
+#line 288 "cscanner.l"
+{ return (processSpec (QRELDEF)); }
+	YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 289 "cscanner.l"
+{ return (processSpec (QEXPOSED)); }
+	YY_BREAK
+case 60:
+YY_RULE_SETUP
+#line 290 "cscanner.l"
+{ return (processSpec (QNEWREF)); }
+	YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 291 "cscanner.l"
+{ return (processSpec (QTEMPREF)); }
+	YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 292 "cscanner.l"
+{ return (processSpec (QKILLREF)); }
+	YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 293 "cscanner.l"
+{ return (processSpec (QREFCOUNTED)); }
+	YY_BREAK
+case 64:
+YY_RULE_SETUP
+#line 294 "cscanner.l"
+{ return (processSpec (QCHECKED)); }
+	YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 295 "cscanner.l"
+{ return (processSpec (QCHECKMOD)); }
+	YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 296 "cscanner.l"
+{ return (processSpec (QCHECKEDSTRICT)); }
+	YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 297 "cscanner.l"
+{ return (processSpec (QUNCHECKED)); }
+	YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 298 "cscanner.l"
+{ return (processSpec (QONLY)); }
+	YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 299 "cscanner.l"
+{ return (processSpec (QOWNED)); }
+	YY_BREAK
+case 70:
+YY_RULE_SETUP
+#line 300 "cscanner.l"
+{ return (processSpec (QOBSERVER)); }
+	YY_BREAK
+case 71:
+YY_RULE_SETUP
+#line 301 "cscanner.l"
+{ return (processSpec (QDEPENDENT)); }
+	YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 302 "cscanner.l"
+{ return (processSpec (QUNUSED)); }
+	YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 303 "cscanner.l"
+{ return (processSpec (QEXTERNAL)); }
+	YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 304 "cscanner.l"
+{ return (processSpec (QSEF)); }
+	YY_BREAK
+case 75:
+YY_RULE_SETUP
+#line 305 "cscanner.l"
+{ return (processSpec (QSHARED)); }
+	YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 306 "cscanner.l"
+{ return (processSpec (QYIELD)); }
+	YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 307 "cscanner.l"
+{ return (processSpec (QUNDEF)); }
+	YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 308 "cscanner.l"
+{ return (processSpec (QKILLED)); }
+	YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 309 "cscanner.l"
+{ int tok; 
+			      context_saveLocation (); 
+			      setTokLength (longUnsigned_toInt (mstring_length (yytext))); 
+			      tok = processIdentifier (makeIdentifier (yytext)); 
+			      if (tok != BADTOK)
+				{
+				  return (tok);
+				}
+			    }
+	YY_BREAK
+case 80:
+YY_RULE_SETUP
+#line 318 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+                          RETURN_INT (ctype_int, processHex ());  /* evs 2000-05-17 was ctype_uint */
+			}
+	YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 321 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+			  RETURN_INT (ctype_lint, processHex ()); }
+	YY_BREAK
+case 82:
+YY_RULE_SETUP
+#line 323 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+			  RETURN_INT (ctype_llint, processHex ()); }
+	YY_BREAK
+case 83:
+YY_RULE_SETUP
+#line 325 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+                          RETURN_INT (ctype_uint, processHex ()); }
+	YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 327 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+			  RETURN_INT (ctype_ulint, processHex ()); }
+	YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 329 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+			  RETURN_INT (ctype_ullint, processHex ()); }
+	YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 331 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+			  RETURN_INT (ctype_ullint, processHex ()); }
+	YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 333 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+			  RETURN_INT (ctype_int, processOctal ()); } 
+	YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 335 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+		 	  RETURN_INT (ctype_uint, processOctal ()); } 
+	YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 337 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+ 		          RETURN_INT (ctype_lint, processOctal ()); } 
+	YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 339 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+ 		          RETURN_INT (ctype_llint, processOctal ()); } 
+	YY_BREAK
+case 91:
+YY_RULE_SETUP
+#line 341 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+	   	          RETURN_INT (ctype_ulint, processOctal ()); } 
+	YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 343 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+	   	          RETURN_INT (ctype_ullint, processOctal ()); } 
+	YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 345 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+	   	          RETURN_INT (ctype_ullint, processOctal ()); } 
+	YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 347 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+		         RETURN_INT (ctype_int, processDec ()); } 
+	YY_BREAK
+case 95:
+YY_RULE_SETUP
+#line 349 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+		         RETURN_INT (ctype_uint, processDec ()); } 
+	YY_BREAK
+case 96:
+YY_RULE_SETUP
+#line 351 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+	      	         RETURN_INT (ctype_lint, processDec ()); } 
+	YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 353 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+	      	         RETURN_INT (ctype_llint, processDec ()); } 
+	YY_BREAK
+case 98:
+YY_RULE_SETUP
+#line 355 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+	    	         RETURN_INT (ctype_ulint, processDec ()); } 
+	YY_BREAK
+case 99:
+YY_RULE_SETUP
+#line 357 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+	    	         RETURN_INT (ctype_ullint, processDec ()); } 
+	YY_BREAK
+case 100:
+YY_RULE_SETUP
+#line 359 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+	    	         RETURN_INT (ctype_ullint, processDec ()); } 
+	YY_BREAK
+case 101:
+YY_RULE_SETUP
+#line 361 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+                         RETURN_CHAR (processChar ()); }
+	YY_BREAK
+case 102:
+YY_RULE_SETUP
+#line 363 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+			 RETURN_FLOAT (ctype_float, processFloat ()); }
+	YY_BREAK
+case 103:
+YY_RULE_SETUP
+#line 365 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+			 RETURN_FLOAT (ctype_ldouble, processFloat ()); }
+	YY_BREAK
+case 104:
+YY_RULE_SETUP
+#line 367 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+			 RETURN_FLOAT (ctype_double, processFloat ()); }
+	YY_BREAK
+case 105:
+YY_RULE_SETUP
+#line 370 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+				RETURN_FLOAT (ctype_float, processFloat ()); }
+	YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 372 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+				RETURN_FLOAT (ctype_ldouble, processFloat ()); }
+	YY_BREAK
+case 107:
+YY_RULE_SETUP
+#line 374 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+				RETURN_FLOAT (ctype_double, processFloat ()); }
+	YY_BREAK
+case 108:
+YY_RULE_SETUP
+#line 377 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+				  RETURN_FLOAT (ctype_float, processFloat ()); }
+	YY_BREAK
+case 109:
+YY_RULE_SETUP
+#line 379 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+				  RETURN_FLOAT (ctype_ldouble, processFloat ()); }
+	YY_BREAK
+case 110:
+YY_RULE_SETUP
+#line 381 "cscanner.l"
+{ setTokLengthT (mstring_length (yytext)); 
+				  RETURN_FLOAT (ctype_double, processFloat ()); }
+	YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 384 "cscanner.l"
+{ setTokLength (3); RETURN_TOK (RIGHT_ASSIGN); }
+	YY_BREAK
+case 112:
+YY_RULE_SETUP
+#line 385 "cscanner.l"
+{ setTokLength (3); RETURN_TOK (LEFT_ASSIGN); }
+	YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 386 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (ADD_ASSIGN); }
+	YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 387 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (SUB_ASSIGN); }
+	YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 388 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (MUL_ASSIGN); }
+	YY_BREAK
+case 116:
+YY_RULE_SETUP
+#line 389 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (DIV_ASSIGN); }
+	YY_BREAK
+case 117:
+YY_RULE_SETUP
+#line 390 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (MOD_ASSIGN); }
+	YY_BREAK
+case 118:
+YY_RULE_SETUP
+#line 391 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (AND_ASSIGN); }
+	YY_BREAK
+case 119:
+YY_RULE_SETUP
+#line 392 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (XOR_ASSIGN); }
+	YY_BREAK
+case 120:
+YY_RULE_SETUP
+#line 393 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (OR_ASSIGN); }
+	YY_BREAK
+case 121:
+YY_RULE_SETUP
+#line 394 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (RIGHT_OP); }
+	YY_BREAK
+case 122:
+YY_RULE_SETUP
+#line 395 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (LEFT_OP); }
+	YY_BREAK
+case 123:
+YY_RULE_SETUP
+#line 396 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (INC_OP); }
+	YY_BREAK
+case 124:
+YY_RULE_SETUP
+#line 397 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (DEC_OP); }
+	YY_BREAK
+case 125:
+YY_RULE_SETUP
+#line 398 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (ARROW_OP); }
+	YY_BREAK
+case 126:
+YY_RULE_SETUP
+#line 399 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (AND_OP); }
+	YY_BREAK
+case 127:
+YY_RULE_SETUP
+#line 400 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (OR_OP); }
+	YY_BREAK
+case 128:
+YY_RULE_SETUP
+#line 401 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (LE_OP); }
+	YY_BREAK
+case 129:
+YY_RULE_SETUP
+#line 402 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (GE_OP); }
+	YY_BREAK
+case 130:
+YY_RULE_SETUP
+#line 403 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (EQ_OP); }
+	YY_BREAK
+case 131:
+YY_RULE_SETUP
+#line 404 "cscanner.l"
+{ setTokLength (2); RETURN_TOK (NE_OP); }
+	YY_BREAK
+case 132:
+YY_RULE_SETUP
+#line 405 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TSEMI); }
+	YY_BREAK
+case 133:
+YY_RULE_SETUP
+#line 406 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TLBRACE); }
+	YY_BREAK
+case 134:
+YY_RULE_SETUP
+#line 407 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TRBRACE); }
+	YY_BREAK
+case 135:
+YY_RULE_SETUP
+#line 408 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TCOMMA); }
+	YY_BREAK
+case 136:
+YY_RULE_SETUP
+#line 409 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TCOLON); }
+	YY_BREAK
+case 137:
+YY_RULE_SETUP
+#line 410 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TASSIGN); }
+	YY_BREAK
+case 138:
+YY_RULE_SETUP
+#line 411 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TLPAREN); }
+	YY_BREAK
+case 139:
+YY_RULE_SETUP
+#line 412 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TRPAREN); }
+	YY_BREAK
+case 140:
+YY_RULE_SETUP
+#line 413 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TLSQBR); }
+	YY_BREAK
+case 141:
+YY_RULE_SETUP
+#line 414 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TRSQBR); }
+	YY_BREAK
+case 142:
+YY_RULE_SETUP
+#line 415 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TDOT); }
+	YY_BREAK
+case 143:
+YY_RULE_SETUP
+#line 416 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TAMPERSAND); }
+	YY_BREAK
+case 144:
+YY_RULE_SETUP
+#line 417 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TEXCL); }
+	YY_BREAK
+case 145:
+YY_RULE_SETUP
+#line 420 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TTILDE); }
+	YY_BREAK
+case 146:
+YY_RULE_SETUP
+#line 421 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TMINUS); }
+	YY_BREAK
+case 147:
+YY_RULE_SETUP
+#line 422 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TPLUS); }
+	YY_BREAK
+case 148:
+YY_RULE_SETUP
+#line 423 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TMULT); }
+	YY_BREAK
+case 149:
+YY_RULE_SETUP
+#line 424 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TDIV); }
+	YY_BREAK
+case 150:
+YY_RULE_SETUP
+#line 425 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TPERCENT); }
+	YY_BREAK
+case 151:
+YY_RULE_SETUP
+#line 426 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TLT); }
+	YY_BREAK
+case 152:
+YY_RULE_SETUP
+#line 427 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TGT); }
+	YY_BREAK
+case 153:
+YY_RULE_SETUP
+#line 428 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TCIRC); }
+	YY_BREAK
+case 154:
+YY_RULE_SETUP
+#line 429 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TBAR); }
+	YY_BREAK
+case 155:
+YY_RULE_SETUP
+#line 430 "cscanner.l"
+{ setTokLength (1); RETURN_TOK (TQUEST); }
+	YY_BREAK
+case 156:
+YY_RULE_SETUP
+#line 432 "cscanner.l"
+{ incColumn (); }
+	YY_BREAK
+case 157:
+YY_RULE_SETUP
+#line 433 "cscanner.l"
+{ context_incLineno ();
+		  if (continueLine)
+		    {
+		      continueLine = FALSE;
+		    }
+                 else 
+		   {
+		     if (context_inMacro ())
+		       {
+			 /* Don't use RETURN_TOK */
+			 yylval.tok = lltok_create (TENDMACRO, g_currentloc);
+			 lastWasString = FALSE;
+			 return (TENDMACRO);
+		       }  
+		   }
+		}
+	YY_BREAK
+case 158:
+YY_RULE_SETUP
+#line 449 "cscanner.l"
+{ setTokLength (6); 
+		  
+		  if (processMacro ()) {
+		    if (context_inIterDef ()) 
+		      { 
+			RETURN_TOK (LLMACROITER); 
+		      }
+		    if (context_inIterEnd ())
+		      {
+			RETURN_TOK (LLMACROEND); 
+		      }
+		    if (context_inMacro ())
+		      {
+			RETURN_TOK (LLMACRO); 
+		      }
+		  }
+		}
+	YY_BREAK
+case 159:
+YY_RULE_SETUP
+#line 466 "cscanner.l"
+{ if (context_inHeader () || context_inFunction ())
+		    { 
+		      handleMacro ();
+		    }
+                  else
+		    {
+		      int nspchar = ninput ();
+		      int nspaces;
+
+		      /* 
+		      ** This is a hack to get the column number correct.
+		      */
+
+		      llassert (nspchar >= '0' && nspchar <= '9');
+		      
+		      nspaces = nspchar - '0';
+
+		      setTokLength (5 + nspaces); 
+		      
+		      if (processMacro ()) 
+			{
+			  if (context_inIterDef ()) 
+			    {
+			      RETURN_TOK (LLMACROITER); 
+			    }
+			  if (context_inIterEnd ())
+			    {
+			      RETURN_TOK (LLMACROEND); 
+			    }
+			  if (context_inMacro ())
+			    { 
+			      RETURN_TOK (LLMACRO); 
+			    }
+			}
+		    }
+		}
+	YY_BREAK
+case 160:
+YY_RULE_SETUP
+#line 502 "cscanner.l"
+{ setTokLength (4); lldiagmsg (ctype_unparseTable ()); }
+	YY_BREAK
+case 161:
+YY_RULE_SETUP
+#line 503 "cscanner.l"
+{ setTokLength (3); 
+		  lldiagmsg (message ("%q: *** marker ***", fileloc_unparse (g_currentloc)));
+		}
+	YY_BREAK
+case 162:
+YY_RULE_SETUP
+#line 506 "cscanner.l"
+{ setTokLength (3); usymtab_printLocal (); }
+	YY_BREAK
+case 163:
+YY_RULE_SETUP
+#line 507 "cscanner.l"
+{ setTokLength (3); lldiagmsg (usymtab_unparseAliases ()); }
+	YY_BREAK
+case 164:
+YY_RULE_SETUP
+#line 508 "cscanner.l"
+{ setTokLength (3); lldiagmsg (context_unparse ()); }
+	YY_BREAK
+case 165:
+YY_RULE_SETUP
+#line 509 "cscanner.l"
+{ setTokLength (3); lldiagmsg (context_unparseClauses ()); }
+	YY_BREAK
+case 166:
+YY_RULE_SETUP
+#line 510 "cscanner.l"
+{ setTokLength (3); usymtab_printGuards (); }
+	YY_BREAK
+case 167:
+YY_RULE_SETUP
+#line 511 "cscanner.l"
+{ setTokLength (3); usymtab_printOut (); }
+	YY_BREAK
+case 168:
+YY_RULE_SETUP
+#line 512 "cscanner.l"
+{ setTokLength (3); usymtab_printAll (); }
+	YY_BREAK
+case 169:
+YY_RULE_SETUP
+#line 513 "cscanner.l"
+{ setTokLength (3); usymtab_printComplete (); }
+	YY_BREAK
+case 170:
+YY_RULE_SETUP
+#line 514 "cscanner.l"
+{ setTokLength (3); usymtab_printTypes (); }
+	YY_BREAK
+case 171:
+YY_RULE_SETUP
+#line 515 "cscanner.l"
+{ setTokLength (3); lldiagmsg (usymtab_unparseStack ()); }
+	YY_BREAK
+case 172:
+YY_RULE_SETUP
+#line 516 "cscanner.l"
+{ setTokLength (3); 
+		  lldiagmsg (message ("Can modify: %q", 
+				  sRefSet_unparse (context_modList ()))); 
+		}
+	YY_BREAK
+case 173:
+YY_RULE_SETUP
+#line 520 "cscanner.l"
+{ /* BEFORE_COMMENT_MARKER */
+                  int tok; 
+		  incColumn (); incColumn ();
+		  tok = handleLlSpecial (); 
+		  if (tok != BADTOK)
+		    {
+		      RETURN_TOK (tok); 
+		    }
+		}
+	YY_BREAK
+case 174:
+YY_RULE_SETUP
+#line 529 "cscanner.l"
+{ /* AFTER_COMMENT_MARKER */ 
+                  setTokLength (2);
+		  inSpecPart = FALSE;
+		  RETURN_TOK (QENDMACRO); }
+	YY_BREAK
+case 175:
+YY_RULE_SETUP
+#line 533 "cscanner.l"
+{ incColumn (); continueLine = TRUE; }
+	YY_BREAK
+case 176:
+YY_RULE_SETUP
+#line 534 "cscanner.l"
+{ incColumn (); 
+		  voptgenerror
+		    (FLG_SYNTAX, 
+		     message ("Invalid character (ascii: %d), skipping character",
+			      (int)(*yytext)),
+		     g_currentloc);
+		}
+	YY_BREAK
+case 177:
+YY_RULE_SETUP
+#line 541 "cscanner.l"
+ECHO;
+	YY_BREAK
+#line 2152 "lex.yy.c"
+case YY_STATE_EOF(INITIAL):
+	yyterminate();
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = yy_hold_char;
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed yyin at a new source and called
+			 * yylex().  If so, then we have to assure
+			 * consistency between yy_current_buffer and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			yy_n_chars = yy_current_buffer->yy_n_chars;
+			yy_current_buffer->yy_input_file = yyin;
+			yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* 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 input().
+		 */
+		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_ptr + 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_ptr + 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_c_buf_p;
+				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_ptr + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					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_ptr + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state();
+
+				yy_cp = yy_c_buf_p;
+				yy_bp = yytext_ptr + 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_ptr + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+	} /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new 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 char *dest = yy_current_buffer->yy_ch_buf;
+	register char *source = yytext_ptr;
+	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" );
+
+	if ( yy_current_buffer->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+	else
+		{
+		int num_to_read =
+			yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+			YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = yy_current_buffer;
+
+			int yy_c_buf_p_offset =
+				(int) (yy_c_buf_p - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					yy_flex_realloc( (void *) b->yy_ch_buf,
+							 b->yy_buf_size + 2 );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = yy_current_buffer->yy_buf_size -
+						number_to_move - 1;
+#endif
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+			yy_n_chars, num_to_read );
+
+		yy_current_buffer->yy_n_chars = yy_n_chars;
+		}
+
+	if ( yy_n_chars == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			yyrestart( yyin );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			yy_current_buffer->yy_buffer_status =
+				YY_BUFFER_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_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+	return ret_val;
+	}
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+
+	yy_current_state = yy_start;
+
+	for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+		{
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*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 = (int) yy_def[yy_current_state];
+			if ( yy_current_state >= 509 )
+				yy_c = yy_meta[(unsigned int) yy_c];
+			}
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) 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( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+	{
+	register int yy_is_jam;
+	register 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 = (int) yy_def[yy_current_state];
+		if ( yy_current_state >= 509 )
+			yy_c = yy_meta[(unsigned int) yy_c];
+		}
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+	yy_is_jam = (yy_current_state == 508);
+
+	return yy_is_jam ? 0 : yy_current_state;
+	}
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+	{
+	register 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 */
+		/* +2 for EOB chars. */
+		register int number_to_move = yy_n_chars + 2;
+		register char *dest = &yy_current_buffer->yy_ch_buf[
+					yy_current_buffer->yy_buf_size + 2];
+		register char *source =
+				&yy_current_buffer->yy_ch_buf[number_to_move];
+
+		while ( source > yy_current_buffer->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		yy_current_buffer->yy_n_chars =
+			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" );
+		}
+
+	*--yy_cp = (char) c;
+
+
+	yytext_ptr = yy_bp;
+	yy_hold_char = *yy_cp;
+	yy_c_buf_p = yy_cp;
+	}
+#endif	/* ifndef YY_NO_UNPUT */
+
+
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+	{
+	int c;
+
+	*yy_c_buf_p = 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 */
+			int offset = yy_c_buf_p - yytext_ptr;
+			++yy_c_buf_p;
+
+			switch ( yy_get_next_buffer() )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					yyrestart( yyin );
+
+					/* fall through */
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( yywrap() )
+						return EOF;
+
+					if ( ! yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					yy_c_buf_p = yytext_ptr + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) yy_c_buf_p;	/* cast for 8-bit char's */
+	*yy_c_buf_p = '\0';	/* preserve yytext */
+	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
+	{
+	if ( ! yy_current_buffer )
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+	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_ptr = 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) yy_flex_alloc( 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 = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	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 )
+		return;
+
+	if ( b == yy_current_buffer )
+		yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		yy_flex_free( (void *) b->yy_ch_buf );
+
+	yy_flex_free( (void *) b );
+	}
+
+
+#ifndef YY_ALWAYS_INTERACTIVE
+#ifndef YY_NEVER_INTERACTIVE
+extern int isatty YY_PROTO(( int ));
+#endif
+#endif
+
+#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
+
+
+	{
+	yy_flush_buffer( b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+	b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+	b->yy_is_interactive = 0;
+#else
+	b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+	{
+	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* 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[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == yy_current_buffer )
+		yy_load_buffer_state();
+	}
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+	{
+	YY_BUFFER_STATE b;
+
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	yy_switch_to_buffer( b );
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+	{
+	int len;
+	for ( len = 0; yy_str[len]; ++len )
+		;
+
+	return yy_scan_bytes( yy_str, len );
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+	{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = len + 2;
+	buf = (char *) yy_flex_alloc( n );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+	for ( i = 0; i < len; ++i )
+		buf[i] = bytes[i];
+
+	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = yy_scan_buffer( buf, n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+	{
+	if ( yy_start_stack_ptr >= yy_start_stack_depth )
+		{
+		yy_size_t new_size;
+
+		yy_start_stack_depth += YY_START_STACK_INCR;
+		new_size = yy_start_stack_depth * sizeof( int );
+
+		if ( ! yy_start_stack )
+			yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+		else
+			yy_start_stack = (int *) yy_flex_realloc(
+					(void *) yy_start_stack, new_size );
+
+		if ( ! yy_start_stack )
+			YY_FATAL_ERROR(
+			"out of memory expanding start-condition stack" );
+		}
+
+	yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+	BEGIN(new_state);
+	}
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+	{
+	if ( --yy_start_stack_ptr < 0 )
+		YY_FATAL_ERROR( "start-condition stack underflow" );
+
+	BEGIN(yy_start_stack[yy_start_stack_ptr]);
+	}
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+	{
+	return yy_start_stack[yy_start_stack_ptr - 1];
+	}
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+	{
+	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+	}
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#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 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+	{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+	}
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+	{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+	}
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+	{
+	return (void *) malloc( size );
+	}
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+	{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+	}
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+	{
+	free( ptr );
+	}
+
+#if YY_MAIN
+int main()
+	{
+	yylex();
+	return 0;
+	}
+#endif
+#line 541 "cscanner.l"
+
+
+struct skeyword
+{
+  /*@null@*/ /*@observer@*/ char *name;
+  int token;
+} ;
+
+/*
+** These tokens are followed by syntax that is parsed by the 
+** grammar proper.
+*/
+
+struct skeyword s_parsetable[] = {
+  { "modifies", QMODIFIES } ,
+  { "globals", QGLOBALS } ,
+  { "alt", QALT } ,
+  { "constant", QCONSTANT } ,
+  { "function", QFUNCTION } ,
+  { "iter", QITER } ,
+  { "defines", QDEFINES } ,
+  { "uses", QUSES } ,
+  { "allocates", QALLOCATES } ,
+  { "sets", QSETS } ,
+  { "releases", QRELEASES } ,
+  { "pre", QPRECLAUSE } ,
+  { "post", QPOSTCLAUSE } ,
+  { NULL, BADTOK } 
+} ;
+
+/*
+** These tokens are either stand-alone tokens, or followed by 
+** token-specific text.
+*/
+
+struct skeyword s_keytable[] = {
+  { "anytype", QANYTYPE } ,
+  { "integraltype", QINTEGRALTYPE } ,
+  { "unsignedintegraltype", QUNSIGNEDINTEGRALTYPE } ,
+  { "signedintegraltype", QSIGNEDINTEGRALTYPE } ,
+  { "out", QOUT } ,
+  { "in", QIN } ,
+  { "only", QONLY } , 
+  { "owned", QOWNED } ,
+  { "dependent", QDEPENDENT } ,
+  { "partial", QPARTIAL } ,
+  { "special", QSPECIAL } ,
+  { "truenull", QTRUENULL } ,
+  { "falsenull", QFALSENULL } ,
+  { "keep", QKEEP } ,
+  { "kept", QKEPT } ,
+  { "notnull", QNOTNULL } ,
+  { "abstract", QABSTRACT } ,
+  { "concrete", QCONCRETE } ,
+  { "mutable", QMUTABLE } ,
+  { "immutable", QIMMUTABLE } ,
+  { "unused", QUNUSED } ,
+  { "external", QEXTERNAL } ,
+  { "sef", QSEF } ,
+  { "unique", QUNIQUE } ,
+  { "returned", QRETURNED } ,
+  { "exposed", QEXPOSED } ,
+  { "refcounted", QREFCOUNTED } ,
+  { "refs", QREFS } ,
+  { "newref", QNEWREF } ,
+  { "tempref", QTEMPREF } ,
+  { "killref", QKILLREF } ,
+  { "null", QNULL } ,
+  { "relnull", QRELNULL } ,
+  { "reldef", QRELDEF } ,
+  { "observer", QOBSERVER } ,
+  { "exits", QEXITS } ,
+  { "mayexit", QMAYEXIT } ,
+  { "trueexit", QTRUEEXIT } ,
+  { "falseexit", QFALSEEXIT } ,
+  { "neverexit", QNEVEREXIT } ,
+  { "temp", QTEMP } ,
+  { "shared", QSHARED } ,
+  { "ref", QREF } ,
+  { "unchecked", QUNCHECKED } ,
+  { "checked", QCHECKED } ,
+  { "checkmod", QCHECKMOD } ,
+  { "checkedstrict", QCHECKEDSTRICT } ,
+  { "innercontinue", QINNERCONTINUE } ,
+  { "innerbreak", QINNERBREAK } ,
+  { "loopbreak", QLOOPBREAK } ,
+  { "switchbreak", QSWITCHBREAK } ,
+  { "safebreak", QSAFEBREAK } , 
+  { "fallthrough", QFALLTHROUGH } ,
+  { "l_fallthrou", QLINTFALLTHROUGH } , 
+  { "l_fallth", QLINTFALLTHRU } ,
+  { "notreached", QNOTREACHED } ,
+  { "l_notreach", QLINTNOTREACHED } ,
+  { "printflike", QPRINTFLIKE } ,
+  { "l_printfli", QLINTPRINTFLIKE } ,
+  { "scanflike", QSCANFLIKE } ,
+  { "messagelike", QMESSAGELIKE } ,
+  { "l_argsus", QARGSUSED } ,
+  { NULL, BADTOK } 
+} ;
+
+/*
+** would be better if these weren't hard coded...
+*/
+
+static bool isArtificial (cstring s)
+{
+  return (cstring_equalLit (s, "modifies") 
+	  || cstring_equalLit (s, "globals") 
+	  || cstring_equalLit (s, "alt"));
+}
+
+void swallowMacro (void)
+{
+  int i;
+  bool skipnext = FALSE;
+
+  while ((i = lminput ()) != EOF)
+    {
+      char c = (char) i;
+      
+      
+      if (c == '\\')
+	{
+	  skipnext = TRUE;
+	}
+      else if (c == '\n')
+	{
+	  if (skipnext)
+	    {
+	      skipnext = FALSE;
+	    }
+	  else
+	    {
+	      checkUngetc (i, yyin);
+	      return;
+	    }
+	}
+    }
+
+  if (i != EOF)
+    {
+      checkUngetc (i, yyin);
+    }
+}
+
+static int commentMarkerToken (cstring s)
+{
+  int i = 0;
+  
+  while (s_parsetable[i].name != NULL) 
+    {
+      if (cstring_equalLit (s, s_parsetable[i].name))
+	{
+	  return s_parsetable[i].token;
+	}
+
+      i++;
+    }
+
+  return BADTOK;
+}
+
+static int tokenMacroCode (cstring s)
+{
+  int i = 0;
+  
+  while (s_keytable[i].name != NULL) 
+    {
+      if (cstring_equalLit (s, s_keytable[i].name)) 
+	{
+	  if (s_keytable[i].token == QLINTFALLTHROUGH) 
+	    {
+	      voptgenerror
+		(FLG_WARNLINTCOMMENTS,
+		 cstring_makeLiteral
+		 ("Traditional lint comment /*FALLTHROUGH*/ used.  "
+		  "This is interpreted by "
+		  "LCLint in the same way as most Unix lints, but it is "
+		  "preferable to replace it with the /*@fallthrough@*/ "
+		  "stylized comment"),
+		 g_currentloc);
+	      return QFALLTHROUGH;	      
+	    }
+	  else if (s_keytable[i].token == QLINTFALLTHRU)
+	    {
+	      voptgenerror 
+		(FLG_WARNLINTCOMMENTS,
+		 cstring_makeLiteral
+		 ("Traditional lint comment /*FALLTHRU*/ used.  "
+		  "This is interpreted by "
+		  "LCLint in the same way as most Unix lints, but it is "
+		  "preferable to replace it with the /*@fallthrough@*/ "
+		  "stylized comment"),
+		 g_currentloc);
+	      return QFALLTHROUGH;
+	    }
+	  else if (s_keytable[i].token == QLINTNOTREACHED)
+	    {
+	      voptgenerror 
+		(FLG_WARNLINTCOMMENTS,
+		 cstring_makeLiteral
+		 ("Traditional lint comment /*NOTREACHED*/ used.  "
+		  "This is interpreted by "
+		  "LCLint in the same way as most Unix lints, but it is "
+		  "preferable to replace it with the /*@notreached@*/ "
+		  "stylized comment."),
+		 g_currentloc);
+	      
+	      return QNOTREACHED;
+	    }
+	  else if (s_keytable[i].token == QPRINTFLIKE)
+	    {
+	      setSpecialFunction (QU_PRINTFLIKE);
+	      return SKIPTOK;
+	    }
+	  else if (s_keytable[i].token == QLINTPRINTFLIKE)
+	    {	      
+	      voptgenerror 
+		(FLG_WARNLINTCOMMENTS,
+		 cstring_makeLiteral
+		 ("Traditional lint comment /*PRINTFLIKE*/ used.  "
+		  "This is interpreted by "
+		  "LCLint in the same way as most Unix lints, but it is "
+		  "preferable to replace it with either /*@printflike@*/, "
+		  "/*@scanflike@*/ or /*@messagelike@*/."),
+		 g_currentloc);
+	      
+	      setSpecialFunction (QU_PRINTFLIKE);
+	      return SKIPTOK;
+	    }
+	  else if (s_keytable[i].token == QSCANFLIKE)
+	    {
+	      setSpecialFunction (QU_SCANFLIKE);
+	      return SKIPTOK;
+	    }
+	  else if (s_keytable[i].token == QMESSAGELIKE)
+	    {
+	      setSpecialFunction (QU_MESSAGELIKE);
+	      return SKIPTOK;
+	    }
+	  else if (s_keytable[i].token == QARGSUSED)
+	    {
+	      voptgenerror
+		(FLG_WARNLINTCOMMENTS,
+		 cstring_makeLiteral
+		 ("Traditional lint comment /*ARGSUSED*/ used.  "
+		  "This is interpreted by "
+		  "LCLint in the same way as most Unix lints, but it is "
+		  "preferable to use /*@unused@*/ annotations on "
+		  "the unused parameters."),
+		 g_currentloc);
+	      
+	      setArgsUsed ();
+	      return SKIPTOK;
+	    }
+	  
+	  return s_keytable[i].token;
+	}
+      
+      i++;
+    }
+  
+  return BADTOK;
+}
+
+static int lminput ()
+{
+  if (savechar == '\0')
+    {
+      incColumn ();
+      return (input ());
+    }
+  else
+    {
+      int save = (int) savechar;
+      savechar = '\0';
+      return save;
+    }
+}
+
+static void lmsavechar (char c)
+{
+  if (savechar == '\0') savechar = c;
+  else
+    {
+      llbuglit ("lmsavechar: override");
+    }
+}
+
+static int returnFloat (ctype ct, double f)
+{
+  yylval.expr = exprNode_floatLiteral (f, ct, cstring_fromChars (yytext), 
+				       fileloc_decColumn (g_currentloc, tokLength));
+  tokLength = 0; 
+  return (CCONSTANT);
+}
+
+static int returnInt (ctype ct, long i)
+{
+  ctype c = ct;
+
+  if (ctype_equal (ct, ctype_int))
+    {
+      if (i == 0)
+	{
+	  c = context_typeofZero ();
+	}
+      else if (i == 1)
+	{
+	  c = context_typeofOne ();
+	}
+    }
+  
+  yylval.expr = exprNode_numLiteral (c, cstring_fromChars (yytext), 
+				     fileloc_decColumn (g_currentloc, tokLength), i);   
+  tokLength = 0; 
+  return (CCONSTANT);
+}
+
+static int returnChar (char c)
+{
+  yylval.expr = exprNode_charLiteral (c, cstring_fromChars (yytext), 
+				      fileloc_decColumn (g_currentloc, tokLength));
+  tokLength = 0; 
+  return (CCONSTANT);
+}
+
+static int ninput ()  
+{
+  int c = lminput ();
+
+  if (c != EOF && ((char)c == '\n'))
+    {
+      context_incLineno ();
+    }
+
+  return c;
+}
+
+static char macro_nextChar ()
+{
+  static bool in_quote = FALSE, in_escape = FALSE, in_char = FALSE;
+  int ic;
+  char c;
+
+  ic = lminput ();
+  c = char_fromInt (ic);
+  
+  if (!in_quote && !in_char && (c == '\\' || c == BEFORE_COMMENT_MARKER[0]))
+    {
+      if (c == '\\')
+	{
+	  while ((c = char_fromInt (lminput ())) != '\0' && c != '\n')
+	    {
+	      ; /* skip to newline */
+	    }
+	  
+	  context_incLineno ();
+	  
+	  if (c != '\0')
+	    {
+	      return macro_nextChar ();
+	    }
+	  else 
+	    {
+	      return c;
+	    }
+	}
+      else /* if (c == '@') */
+	{
+	  if (handleLlSpecial () != BADTOK)
+	    {
+	      llerrorlit (FLG_SYNTAX, "Macro cannot use special syntax");
+	    }
+
+	  return macro_nextChar ();
+	}
+    }
+  else if (!in_escape && c == '\"')
+    {
+      in_quote = !in_quote;
+    }
+  else if (!in_escape && c == '\'')
+    {
+      in_char = !in_char;
+    }
+  else if ((in_quote || in_char) && c == '\\')
+    {
+      in_escape = !in_escape;
+    }
+  else if ((in_quote || in_char) && in_escape)
+    {
+      in_escape = FALSE;
+    }
+  else if (!in_quote && c == '/')
+    {
+      char c2;
+      
+      if ((c2 = char_fromInt (lminput ())) == '*')
+	{
+	  while (c2 != '\0')
+	    {
+	      while ((c2 = char_fromInt (lminput ())) != '\0'
+		     && c2 != '\n' && c2 != '*')
+		{
+		  ;
+		}
+	      
+	      if (c2 == '*')
+		{
+		  while ((c2 = char_fromInt (lminput ())) != '\0' 
+			 && c2 == '*')
+		    {
+		      ;
+		    }
+
+		  if (c2 == '/')
+		    {
+		      goto outofcomment;
+		    }
+		}
+	      else 
+		{
+		  llfatalerror (cstring_makeLiteral ("Macro: bad comment!"));
+		}
+	    }
+	outofcomment:
+	  return macro_nextChar ();
+	}
+      else
+	{
+          /*** putchar does not work!  why?  puts to stdio...??! ***/
+          lmsavechar (c2);
+	}
+    }
+  return c;
+}
+
+/*
+** keeps stylized comments
+*/
+
+static char macro_nextCharC ()
+{
+  static bool in_quote = FALSE, in_escape = FALSE, in_char = FALSE;
+  char c;
+
+  c = char_fromInt (lminput ());
+
+  if (!in_quote && !in_char && c == '\\')
+    {
+      while ((c = char_fromInt (lminput ())) != '\0' && c != '\n')
+	{
+	  ; /* skip to newline */
+	}
+      
+      context_incLineno ();
+      
+      if (c != '\0')
+	{
+	  return macro_nextCharC ();
+	}
+      else
+	{
+	  return c;
+	}
+    }
+  else if (!in_escape && c == '\"')
+    {
+      in_quote = !in_quote;
+    }
+  else if (!in_escape && c == '\'')
+    {
+      in_char = !in_char;
+    }
+  else if ((in_quote || in_char) && c == '\\')
+    {
+      in_escape = !in_escape;
+    }
+  else if ((in_quote || in_char) && in_escape)
+    {
+      in_escape = FALSE;
+    }
+  else if (!in_quote && c == '/')
+    {
+      char c2;
+      
+      if ((c2 = char_fromInt (lminput ())) == '*')
+	{
+	  while (c2 != '\0')
+	    {
+	      while ((c2 = char_fromInt (lminput ())) != '\0' 
+		     && c2 != '\n' && c2 != '*')
+		{
+		  ;
+		}
+	      
+	      if (c2 == '*')
+		{
+		  while ((c2 = char_fromInt (lminput ())) != '\0'
+			 && c2 == '*')
+		    {
+		      ;
+		    }
+
+		  if (c2 == '/') 
+		    {
+		      goto outofcomment;
+		    }
+		}
+	      else 
+		{
+		  llfatalerror (cstring_makeLiteral ("Macro: bad comment!"));
+		}
+	    }
+	outofcomment:
+	  return macro_nextCharC ();
+	}
+      else
+	{
+	  lmsavechar (c2);
+	}
+    }
+  return c;
+}
+
+/*
+** skips whitespace (handles line continuations)
+** returns first non-whitespace character
+*/
+
+static char skip_whitespace ()
+{
+  char c;
+
+  while ((c = macro_nextChar ()) == ' ' || c == '\t')
+    {
+      ;
+    }
+
+  return c;
+}
+
+static void handleMacro ()
+{
+  cstring mac = cstring_undefined;
+  int macrocode;
+  char c;
+
+  while (currentColumn () > 2)
+    {
+      mac = cstring_appendChar (mac, ' ');
+      setTokLength (-1);
+    }
+
+  c = macro_nextCharC ();
+
+  if (c >= '0' && c <= '9')
+    {
+      int i;
+
+      for (i = 0; i < ((c - '0') + 1); i++)
+	{
+	  mac = cstring_appendChar (mac, ' ');
+	}
+    }
+  else
+    {
+      BADBRANCH;
+    }
+
+  while (((c = macro_nextCharC ()) != '\0') && (c != '\n'))
+    {
+      mac = cstring_appendChar (mac, c);
+    }
+
+  
+  macrocode = tokenMacroCode (mac);
+
+  if (macrocode == BADTOK && !isArtificial (mac))
+    {
+      DPRINTF (("Add macro: %s", mac));
+      context_addMacroCache (mac);
+    }
+  else
+    {
+      cstring_free (mac);
+    }
+
+  if (c == '\n')
+    {
+      context_incLineno ();
+    }
+}
+
+static bool processMacro (void)
+{
+  uentry e2;
+  ctype ct;
+  int noparams = 0;
+  cstring fname = cstring_undefined;
+  bool res = TRUE;
+  bool isspecfcn = FALSE;
+  bool isiter = FALSE;
+  bool skipparam = FALSE;
+  bool isenditer = FALSE;
+  bool unknownm = FALSE;
+  bool hasParams = FALSE;
+  bool emptyMacro = FALSE;
+  char c = skip_whitespace ();
+  fileloc loc = fileloc_noColumn (g_currentloc);
+
+  /* are both of these necessary?  what do they mean? */
+  uentryList specparams = uentryList_undefined;
+  uentryList pn = uentryList_undefined;
+
+  context_resetMacroMissingParams ();
+
+  if (c == '\0' || c == '\n')
+    {
+      llcontbug (cstring_makeLiteral ("Bad macro"));
+      fileloc_free (loc);
+      return FALSE;
+    }
+  
+  fname = cstring_appendChar (fname, c);  
+
+  while ((c = macro_nextChar ()) != '(' && c != '\0'
+	 && c != ' ' && c != '\t' && c != '\n')
+    {
+      fname = cstring_appendChar (fname, c);
+    }
+
+  if (c == ' ' || c == '\t' || c == '\n')
+    {
+      char oldc = c;
+
+      if (c != '\n')
+	{
+	  while (c == ' ' || c == '\t')
+	    {
+	      c = macro_nextChar ();
+	    }
+	  unput (c);
+	}
+
+      if (c == '\n')
+	{
+	  emptyMacro = TRUE;
+	  unput (c);
+	}
+
+      c = oldc;
+    }
+
+  hasParams = (c == '(');
+
+  
+  if (usymtab_exists (fname))
+    {
+      e2 = usymtab_lookupExpose (fname);
+      ct = uentry_getType (e2);
+
+      
+      if (uentry_isCodeDefined (e2) 
+	  && fileloc_isUser (uentry_whereDefined (e2)))
+	{
+	  if (optgenerror 
+	      (FLG_MACROREDEF,
+	       message ("Macro %s already defined", fname),
+	       loc))
+	    {
+	      uentry_showWhereDefined (e2);
+	      uentry_clearDefined (e2);
+	    }
+
+	  if (uentry_isFunction (e2))
+	    {
+	      uentry_setType (e2, ctype_unknown);
+	      ct = ctype_unknown;
+	      unknownm = TRUE;
+	      context_enterUnknownMacro (e2); 
+	    }
+	  else
+	    {
+	      context_enterConstantMacro (e2);
+	    }
+	}
+      else
+	{
+	  if (uentry_isForward (e2) && uentry_isFunction (e2))
+	    {
+	      unknownm = TRUE;
+
+	      voptgenerror 
+		(FLG_MACROFCNDECL,
+		 message
+		 ("Parameterized macro has no prototype or specification: %s ", 
+		  fname),
+		 loc);
+	      
+	      ct = ctype_unknown;
+	      uentry_setType (e2, ctype_unknown);
+	      uentry_setFunctionDefined (e2, loc); 
+	      uentry_setUsed (e2, fileloc_undefined);
+	      context_enterUnknownMacro (e2); 
+	    }
+	  else
+	    {
+	      if (uentry_isIter (e2))
+		{
+		  isiter = TRUE;
+		  specparams = uentry_getParams (e2);
+		  noparams = uentryList_size (specparams);
+		  uentry_setDefined (e2, loc);
+		  context_enterIterDef (e2); 
+		}
+	      else if (uentry_isEndIter (e2))
+		{
+		  isenditer = TRUE;
+		  uentry_setDefined (e2, loc);
+		  context_enterIterEnd (e2); /* don't care about it now */
+		  /* but should parse like an iter! */
+		}
+	      else if (uentry_isConstant (e2))
+		{
+		  if (hasParams)
+		    {
+		      voptgenerror 
+			(FLG_INCONDEFS, 
+			 message ("Constant %s implemented as parameterized macro",
+				  fname),
+			 g_currentloc);
+		      
+		      uentry_showWhereSpecified (e2);
+		      uentry_setType (e2, ctype_unknown);
+		      uentry_makeVarFunction (e2);
+		      uentry_setDefined (e2, g_currentloc);
+		      uentry_setFunctionDefined (e2, g_currentloc);
+		      context_enterUnknownMacro (e2); 
+		    }
+		  else
+		    {
+		      if (!uentry_isSpecified (e2))
+			{
+			  fileloc oloc = uentry_whereDeclared (e2);
+
+			  if (fileloc_isLib (oloc))
+			    {
+			      ;
+			    }
+			  else if (fileloc_isUndefined (oloc)
+				   || fileloc_isPreproc (oloc))
+			    {
+			      if (!emptyMacro)
+				{
+				  voptgenerror
+				    (FLG_MACROCONSTDECL,
+				     message 
+				     ("Macro constant %q not declared",
+				      uentry_getName (e2)),
+				     loc);			 
+				}
+			    }
+			  else if (!fileloc_withinLines (oloc, loc, 2))
+			    { /* bogus!  will give errors if there is too much whitespace */
+			      voptgenerror
+				(FLG_SYNTAX,
+				 message 
+				 ("Macro constant name %s does not match name in "
+				  "previous constant declaration.  This constant "
+				  "is declared at %q", fname, 
+				  fileloc_unparse (oloc)),
+				 loc);
+			    }
+			}
+
+		      context_enterConstantMacro (e2);	      
+		      cstring_free (fname);
+		      fileloc_free (loc);
+		      return res;
+		    }
+
+		}
+	      else if (ctype_isFunction (ct))
+		{
+		  isspecfcn = TRUE;
+		  specparams = ctype_argsFunction (ct);
+		  noparams = uentryList_size (specparams);
+		  
+		  uentry_setFunctionDefined (e2, loc); 
+		  context_enterMacro (e2);
+		}
+	      else if (uentry_isVar (e2))
+		{
+		  if (hasParams)
+		    {
+		      voptgenerror
+			(FLG_INCONDEFS,
+			 message ("Variable %s implemented as parameterized macro", 
+				  fname),
+			 loc);
+
+		      uentry_showWhereSpecified (e2);
+		      uentry_setType (e2, ctype_unknown);
+		      uentry_makeVarFunction (e2);
+		      uentry_setDefined (e2, g_currentloc);
+		      uentry_setFunctionDefined (e2, g_currentloc);
+		      context_enterUnknownMacro (e2); 
+		    }
+		  else
+		    {
+		      uentry ucons = uentry_makeConstant (fname,
+							  ctype_unknown,
+							  loc);
+		      if (uentry_isExpandedMacro (e2))
+			{
+			  ; /* okay */
+			}
+		      else
+			{
+			  if (optgenerror 
+			      (FLG_INCONDEFS,
+			       message ("Variable %s implemented by a macro",
+					fname),
+			       loc))
+			    {
+			      uentry_showWhereSpecified (e2);
+			    }
+			}
+
+		      uentry_setDefined (e2, loc);
+		      uentry_setUsed (ucons, loc);
+
+		      context_enterConstantMacro (ucons);
+		      uentry_markOwned (ucons);
+		      cstring_free (fname);
+		      return res;
+		    }
+		}
+	      else
+		{
+		  if (uentry_isDatatype (e2))
+		    {
+		      vgenhinterror 
+			(FLG_SYNTAX,
+			 message ("Type implemented as macro: %x", 
+				  uentry_getName (e2)),
+			 message ("A type is implemented using a macro definition.  A "
+				  "typedef should be used instead."),
+			 g_currentloc);
+
+		      swallowMacro ();
+		      /* Must exit scope (not sure why a new scope was entered?) */
+		      usymtab_quietExitScope (g_currentloc);
+		      uentry_setDefined (e2, g_currentloc);
+		      res = FALSE;
+		    }
+		  else
+		    {
+		      llcontbug 
+			(message ("Unexpanded macro not function or constant: %q", 
+				  uentry_unparse (e2)));
+		      uentry_setType (e2, ctype_unknown);
+		      
+		      if (hasParams)
+			{
+			  uentry_makeVarFunction (e2);
+			  uentry_setDefined (e2, g_currentloc);
+			  uentry_setFunctionDefined (e2, g_currentloc);
+			  context_enterUnknownMacro (e2); 
+			}
+		    }
+		}
+	    }
+	}
+    }
+  else
+    {
+      uentry ce;
+
+      voptgenerror 
+	(FLG_MACROMATCHNAME,
+	 message ("Unexpanded macro %s does not match name of a constant "
+		  "or iter declaration.  The name used in the control "
+		  "comment on the previous line should match.  "
+		  "(Assuming macro defines a constant.)", 
+		  fname),
+	 loc);
+
+
+      ce = uentry_makeConstant (fname, ctype_unknown, fileloc_undefined);      
+      uentry_setUsed (ce, loc); /* perhaps bogus? */
+      e2 = usymtab_supEntryReturn (ce);
+      
+      context_enterConstantMacro (e2);	      
+      cstring_free (fname);
+      fileloc_free (loc);
+      return res;
+    }
+  
+  /* in macros, ( must follow immediatetly after name */
+  
+  if (hasParams)
+    {
+      int paramno = 0;
+      
+      c = skip_whitespace ();
+
+      while (c != ')' && c != '\0')
+	{
+	  uentry  param;
+	  bool    suppress = context_inSuppressRegion ();
+	  cstring paramname = cstring_undefined;
+
+	  /*
+	  ** save the parameter location
+	  */
+
+	  decColumn ();
+	  context_saveLocation ();
+	  incColumn ();
+
+	  while (c != ' ' && c != '\t' && c != ',' && c != '\0' && c != ')')
+	    {
+	      paramname = cstring_appendChar (paramname, c);
+	      c = macro_nextChar ();
+	    }
+	  
+	  if (c == ' ' || c == '\t') c = skip_whitespace ();
+
+	  if (c == ',')
+	    {
+	      c = macro_nextChar ();
+	      if (c == ' ' || c == '\t') c = skip_whitespace ();
+	    }
+	  
+	  if (c == '\0')
+	    {
+	      llfatalerror (cstring_makeLiteral
+			    ("Bad macro syntax: uentryList"));
+	    }
+	  
+	  if ((isspecfcn || isiter) && (paramno < noparams)
+	      && !uentry_isElipsisMarker (uentryList_getN 
+					  (specparams, paramno)))
+	    {
+	      uentry decl = uentryList_getN (specparams, paramno);
+	      sRef sr;
+	      
+	      param = uentry_nameCopy (paramname, decl);
+
+	      	      	      
+	      uentry_setParam (param);
+	      sr = sRef_makeParam (paramno, uentry_getType (param));
+
+	      if (sRef_getNullState (sr) == NS_ABSNULL)
+		{
+		  ctype pt = ctype_realType (uentry_getType (param));
+
+		  if (ctype_isUser (pt))
+		    {
+		      uentry te = usymtab_getTypeEntrySafe (ctype_typeId (pt));
+		      
+		      if (uentry_isValid (te))
+			{
+			  sRef_setStateFromUentry (sr, te);
+			}
+		    }
+		  else
+		    {
+		      sRef_setNullState (sr, NS_UNKNOWN, g_currentloc);
+		    }
+		}
+
+	      uentry_setSref (param, sr);
+	      uentry_setDeclaredForceOnly (param, context_getSaveLocation ());
+
+	      skipparam = isiter && uentry_isOut (uentryList_getN (specparams, paramno));
+	    }
+	  else
+	    {
+	      fileloc sloc = context_getSaveLocation ();
+
+	      param = uentry_makeVariableSrefParam 
+		(paramname, ctype_unknown, sRef_makeParam (paramno, ctype_unknown));
+	      cstring_free (paramname);
+
+	      sRef_setPosNull  (uentry_getSref (param), sloc);
+
+	      uentry_setDeclaredForce (param, sloc);
+
+	      skipparam = FALSE;
+	      fileloc_free (sloc);
+	    }
+
+	  if (!skipparam)
+	    {
+	      llassert (!uentry_isElipsisMarker (param));
+
+	      if (!suppress)
+		{
+		  sRef_makeUnsafe (uentry_getSref (param));
+		}
+	      
+	      pn = uentryList_add (pn, uentry_copy (param));
+	      usymtab_supEntry (param);
+	    }
+	  else
+	    {
+	      /* don't add param */
+	      uentry_free (param);
+	    }
+
+	  if (c == ',') 
+	    {
+	      (void) macro_nextChar ();
+	      c = skip_whitespace ();
+	    }
+
+	  paramno++;
+	}
+      
+      if (c == ')')
+	{
+	  if (isspecfcn || isiter)
+	    {
+	      if (paramno != noparams && noparams >= 0)
+		{
+		  advanceLine ();
+
+		  voptgenerror 
+		    (FLG_INCONDEFS,
+		     message ("Macro %s specified with %d args, defined with %d", 
+			      fname, noparams, paramno),
+		     g_currentloc);
+
+		  uentry_showWhereSpecified (e2);
+		  uentry_resetParams (e2, pn);
+		}
+	    }
+	  else
+	    {
+	      uentry_resetParams (e2, pn);
+	    }
+	}
+    }
+  else
+    {
+      /*
+      ** the form should be:
+      **
+      ** # define newname oldname
+      ** where oldname refers to a function matching the specification
+      ** of newname.
+      */
+
+      if (unknownm)
+	{
+	  sRef_setGlobalScope ();
+	  usymtab_supGlobalEntry (uentry_makeVariableLoc (fname, ctype_unknown));
+	  sRef_clearGlobalScope ();
+	}
+      else
+	{
+	  context_setMacroMissingParams ();
+	}
+    }
+  
+  
+  /* context_setuentryList (pn); */
+  usymtab_enterScope ();
+
+  fileloc_free (loc);
+  cstring_free (fname);
+
+  return res;
+}
+
+static bool handleSpecial (char *yyt)
+{
+  char *l = mstring_create (MAX_NAME_LENGTH);
+  static bool reportcpp = FALSE;
+  int lineno = 0;
+  char c;
+  char *ol;
+  cstring olc;
+  
+  strcpy (l, yyt + 1);
+
+  /* Need to safe original l for deallocating. */
+  ol = l;
+
+  l += strlen (yyt) - 1;
+  
+  while ((c = char_fromInt (lminput ())) != '\n' && c != '\0')
+    {
+      *l++ = c;
+    }
+
+  *l = '\0';
+  olc = cstring_fromChars (ol);
+  
+  if (cstring_equalPrefix (olc, "pragma"))
+    {
+      char *pname = mstring_create (longUnsigned_fromInt (MAX_PRAGMA_LEN));
+      char *opname = pname;
+      char *ptr = ol + 6; /* pragma is six characters, plus space */
+      int len = 0;
+      
+      
+      /* skip whitespace */
+      while (((c = *ptr) != '\0') && isspace (c))
+	{
+	  ptr++;
+	}
+
+      
+      while (((c = *ptr) != '\0') && !isspace (c))
+	{
+	  len++;
+
+	  if (len > MAX_PRAGMA_LEN)
+	    {
+	      break;
+	    }
+
+	  ptr++;
+	  *pname++ = c;
+	}
+
+      *pname = '\0';
+      
+      if (len == PRAGMA_LEN_EXPAND 
+	  && mstring_equal (opname, PRAGMA_EXPAND))
+	{
+	  cstring exname = cstring_undefined;
+	  uentry ue;
+	  
+	  ptr++; 
+	  while (((c = *ptr) != '\0') && !isspace (c))
+	    {
+	      exname = cstring_appendChar (exname, c);
+	      ptr++;
+	    }
+	     
+	  
+	  ue = usymtab_lookupExposeGlob (exname);
+	  
+	  if (uentry_isExpandedMacro (ue))
+	    {
+	      if (fileloc_isPreproc (uentry_whereDefined (ue)))
+		{
+		  fileloc_setColumn (g_currentloc, 1);
+		  uentry_setDefined (ue, g_currentloc);
+		}
+	    }
+
+	  cstring_free (exname);
+	}
+    }
+  else if (cstring_equalPrefix (olc, "ident"))
+    {
+      /* Some pre-processors will leave these in the code.  Ignore rest of line */
+    }
+  /*
+  ** Yuk...Win32 filenames can have spaces in them...we need to read
+  ** to the matching end quote.
+  */
+  else if ((sscanf (ol, "line %d \"", &lineno) == 1)
+	   || (sscanf (ol, " %d \"", &lineno) == 1))
+    {
+      char *tmp = ol;
+      char *fname;
+      fileId fid;
+
+      while (*tmp != '\"' && *tmp != '\0')
+	{
+	  tmp++;
+	}
+
+      llassert (*tmp == '\"');
+
+      tmp++;
+      fname = tmp;
+      
+      while (*tmp != '\"' && *tmp != '\0')
+	{
+	  tmp++;
+	}
+
+      llassert (*tmp == '\"');
+
+      *tmp = '\0';
+
+      DPRINTF (("fname: %s", fname));
+
+# if defined(OS2) || defined(MSDOS) || defined(WIN32)
+
+      /*
+      ** DOS-like path delimiters get delivered in pairs, something like 
+      ** \"..\\\\file.h\", so we have to make it normal again. We do NOT
+      ** remove the pre dirs yet as we usually specify tmp paths relative
+      ** to the current directory, so tmp files would not get found in
+      ** the hash table.  If this method fails we try it again later. 
+      */
+
+      {
+	char *stmp = fname;
+	
+	/*
+	** Skip past the drive marker.
+	*/
+	
+	DPRINTF (("stmp: %s / %s", stmp, fname));
+	
+	if (strchr (stmp, ':') != NULL)
+	  {
+	    stmp = strchr (stmp, ':') + 1;
+	  }
+	
+	DPRINTF (("stmp: %s / %s", stmp, fname));
+	
+	while ((stmp = strchr (stmp, CONNECTCHAR)) != NULL )
+	  {
+	    if (*(stmp+1) == CONNECTCHAR)
+	      {
+		memmove (stmp, stmp+1, strlen (stmp));
+	      }
+	    
+	    stmp++;
+	    DPRINTF (("stmp: %s / %s", stmp, fname));
+	  }
+	
+	DPRINTF (("Now: base = %s", fname));
+	
+	fid = fileTable_lookupBase (context_fileTable (),
+				    cstring_fromChars (fname));
+	if (!(fileId_isValid (fid)))
+	  {
+	    fname = removePreDirs (fname);
+	    fid = fileTable_lookupBase (context_fileTable (),
+					cstring_fromChars (fname));
+	  }
+      }
+# else  /* !defined(OS2) && !defined(MSDOS) */
+      fname = removePreDirs (fname);
+      fid = fileTable_lookupBase (context_fileTable (),
+				  cstring_fromChars (fname));
+# endif /* !defined(OS2) && !defined(MSDOS) */
+      
+      if (!(fileId_isValid (fid)))
+	{
+	  if (isHeaderFile (cstring_fromChars (fname)))
+	    {
+	      fid = fileTable_addHeaderFile (context_fileTable (), 
+					     cstring_fromChars (fname));
+	    }
+	  else
+	    {
+	      fid = fileTable_addFile (context_fileTable (), 
+				       cstring_fromChars (fname));
+	    }
+	}
+      
+      setFileLine (fid, lineno);
+    }
+  else if ((sscanf (ol, "line %d", &lineno) == 1) 
+	   || (sscanf (ol, " %d", &lineno) == 1))
+    {
+      setLine (lineno); /* next line is  */
+    }
+  else
+    {
+      if (mstring_equal (ol, "")) {
+	DPRINTF (("Empty pp command!"));
+	/*
+	** evs 2000-05-16: This is a horrible kludge, to get around a bug (well, difficulty) in the pre-processor.
+	** We handle a plain # in the input file, by echoing it, and ignoring it in the post-pp-file.
+	*/
+	mstring_free (ol);
+	return FALSE;
+      } else {
+	if (!reportcpp)
+	  {
+	    
+	  } else {
+	    llbug (message ("File contains preprocessor command: #%s", 
+			    cstring_fromChars (ol)));
+	    reportcpp = TRUE;
+	  }
+      }
+      
+      sfree (ol);
+      return TRUE;
+    }
+
+  sfree (ol);
+  return FALSE;
+}
+  
+static int handleLlSpecial ()
+{ 
+  int ic; 
+  char c;
+  char *s = mstring_createEmpty ();
+  char *os; 
+  int tok;
+  int charsread = 0;
+
+  while (((ic = ninput ()) != 0) && isalpha (ic))
+    {
+      c = (char) ic;
+      s = mstring_append (s, c);
+      charsread++;
+    }
+
+  os = s;
+
+  if (charsread == 0 && ic == (int) AFTER_COMMENT_MARKER[0])
+    {
+      ic = ninput ();
+
+      llassert (ic == AFTER_COMMENT_MARKER[1]);
+
+            
+      if (isProcessingGlobMods () && (*s == '\0'))
+	{
+	  sfree (os);
+	  return QNOMODS; /* special token no modifications token */
+	}
+      else
+	{
+	  ;
+	}
+    }
+  
+  tok = commentMarkerToken (cstring_fromChars (os));
+
+  if (tok != BADTOK)
+    {
+      tokLength = charsread;
+      sfree (os);
+      inSpecPart = TRUE;
+      return tok;
+    }
+  
+  /* Add rest of the comment */
+  
+  if (ic != 0 && ic != EOF)
+    {
+      c = (char) ic;
+
+      
+      s = mstring_append (s, c);
+      charsread++;
+
+      while (((ic = ninput ()) != 0) && (ic != EOF)
+	     && (ic != AFTER_COMMENT_MARKER[0]))
+	{
+	  c = (char) ic;
+	  s = mstring_append (s, c);
+	  charsread++;
+	}
+    }
+
+  if (ic == AFTER_COMMENT_MARKER[0]) 
+    {
+      int nc = ninput ();
+      llassert ((char) nc ==  AFTER_COMMENT_MARKER[1]);
+      charsread++;
+    }
+
+  
+  os = s;
+
+  while (*s == ' ' || *s == '\t' || *s == '\n') 
+    {
+      s++;
+    }
+
+  if (*s == '-' || *s == '+' || *s == '=') /* setting flags */
+    {
+      c = *s;
+
+      while (c == '-' || c == '+' || c == '=')
+	{
+	  ynm set = ynm_fromCodeChar (c);
+	  cstring thisflag;
+
+	  s++;
+	  
+	  thisflag = cstring_fromChars (s);
+	  
+	  while ((c = *s) != '\0' && (c != '-') && (c != '=')
+		 && (c != '+') && (c != ' ') && (c != '\t') && (c != '\n'))
+	    {
+	      s++;
+	    }
+
+	  *s = '\0';
+
+	  if (!context_getFlag (FLG_NOCOMMENTS))
+	    {
+	      cstring flagname = thisflag;
+	      flagcode fflag = identifyFlag (flagname);
+
+	      if (flagcode_isSkip (fflag))
+		{
+		  ;
+		}
+	      else if (flagcode_isInvalid (fflag))
+		{
+		  if (isMode (flagname))
+		    {
+		      if (ynm_isMaybe (set))
+			{
+			  llerror
+			    (FLG_BADFLAG, 
+			     message 
+			     ("Stylized comment attempts to restore flag %s.  "
+			      "A mode flag cannot be restored.",
+			      flagname));
+			}
+		      else
+			{
+			  context_setMode (flagname);
+			}
+		    }
+		  else
+		    {
+		      llerror
+			(FLG_BADFLAG, 
+			 message ("Unrecognized option in stylized comment: %s", 
+				  flagname));
+		    }
+		}
+	      else if (flagcode_isGlobalFlag (fflag))
+		{
+		  llerror
+		    (FLG_BADFLAG, 
+		     message 
+		     ("Stylized comment attempts to set global flag %s.  "
+		      "A global flag cannot be set locally.",
+		      flagname));
+		}
+	      else
+		{
+		  context_fileSetFlag (fflag, set);
+
+		  if (flagcode_hasArgument (fflag))
+		    {
+		      if (ynm_isMaybe (set))
+			{
+			  llerror
+			    (FLG_BADFLAG, 
+			     message 
+			     ("Stylized comment attempts to restore flag %s.  "
+			      "A flag for setting a value cannot be restored.",
+			      flagname));
+			}
+		      else
+			{ /* cut-and-pastied from llmain...blecch */
+			  cstring extra = cstring_undefined;
+			  char *rest;
+			  char *orest;
+			  char rchar;
+			  
+			  *s = c;
+			  rest = mstring_copy (s);
+			  orest = rest;
+			  *s = '\0';
+			  
+			  while ((rchar = *rest) != '\0'
+				 && (isspace (rchar)))
+			    {
+			      rest++;
+			      s++;
+			    }
+			  
+			  while ((rchar = *rest) != '\0'
+				 && !isspace (rchar))
+			    {
+			      extra = cstring_appendChar (extra, rchar);
+			      rest++; 
+			      s++;
+			    }
+			  
+			  sfree (orest);
+
+			  if (cstring_isUndefined (extra))
+			    {
+			      llerror 
+				(FLG_BADFLAG,
+				 message
+				 ("Flag %s (in stylized comment) must be followed by an argument",
+				  flagcode_unparse (fflag)));
+			    }
+			  else
+			    {
+			      s--;
+			      
+			      if (flagcode_hasValue (fflag))
+				{
+				  setValueFlag (fflag, extra);
+				}
+			      else if (flagcode_hasString (fflag))
+				{
+				  setStringFlag (fflag, extra);
+				}
+			      else
+				{
+				  BADEXIT;
+				}
+			    }
+			}
+		    }
+		}
+	    }
+	  else
+	    {
+	      	    }
+
+	  *s = c;
+	  while ((c == ' ') || (c == '\t') || (c == '\n'))
+	    {
+	      c = *(++s);
+	    }
+	} 
+
+      if (context_inHeader () && !isArtificial (cstring_fromChars (os)))
+	{
+	  	  context_addComment (cstring_fromCharsNew (os));
+	}
+      else
+	{
+	  ;
+	}
+    }
+  else
+    {
+      char *t = s;
+      int macrocode;
+      char tchar = '\0';
+
+      while (*s != '\0' && *s != ' ' && *s != '\t' && *s != '\n') 
+	{
+	  s++;
+	}
+
+      if (*s != '\0') 
+	{
+	  tchar = *s;
+	  *s = '\0';
+	  s++;
+	}
+      
+      t = cstring_toCharsSafe (cstring_downcase (cstring_fromChars (t)));
+      macrocode = tokenMacroCode (cstring_fromChars (t));
+
+      if (macrocode != BADTOK)
+	{
+	  tokLength = mstring_length (t);
+
+	  
+	  sfree (t);
+	  sfree (os);
+
+	  if (macrocode == SKIPTOK)
+	    {
+	      return BADTOK;
+	    }
+
+	  return macrocode;
+	}
+      
+      if (context_inHeader ())
+	{
+	  if (tchar != '\0')
+	    {
+	      *(s-1) = tchar;
+	    }
+	  
+	  if ((context_inMacro () || context_inGlobalContext ())
+	      && macrocode != SKIPTOK
+	      && !isArtificial (cstring_fromChars (os))) 
+	    {
+	      context_addComment (cstring_fromCharsNew (os));
+	    }
+	  else
+	    {
+	      ; 
+	    }
+	  
+	  if (tchar != '\0')
+	    {
+	      *(s-1) = '\0';
+	    }
+	}
+
+      if (mstring_equal (t, "ignore"))
+	{
+	  if (!context_getFlag (FLG_NOCOMMENTS))
+	    {
+	      context_enterSuppressRegion ();
+	    }
+	}
+      else if ((*t == 'i' || *t == 't')
+	       && (*(t + 1) == '\0'))
+	{
+	  if (!context_getFlag (FLG_NOCOMMENTS)
+	      && (*t == 'i' || context_getFlag (FLG_TMPCOMMENTS)))
+	    {
+	      context_enterSuppressLine (-1); /* infinite suppression */
+	    }
+	}
+      else if (((*t == 'i') || (*t == 't'))
+	       && ((*(t + 1) >= '0' && *(t + 1) <= '9')))
+	{
+	  bool tmpcomment = (*t == 't');
+	  int val = -1; 
+	  char *tt = t; /* don't mangle t, since it is free'd */
+	  char lc = *(++tt);
+
+	  if (lc >= '0' && lc <= '9')
+	    {
+	      val = (int)(lc - '0');
+	      
+	      lc = *(++tt);	  
+	      while (lc >= '0' && lc <= '9')
+		{
+		  val *= 10;
+		  val += lc - '0';
+		  lc = *(++tt);
+		}
+	    }
+
+	  
+	  if (!context_getFlag (FLG_NOCOMMENTS)
+	      && (!tmpcomment || context_getFlag (FLG_TMPCOMMENTS)))
+	    {
+	      context_enterSuppressLine (val);
+	    }
+	}
+      else if (mstring_equal (t, "end"))
+	{
+	  if (!context_getFlag (FLG_NOCOMMENTS))
+	    {
+	      context_exitSuppressRegion ();
+	    }
+	}
+      else if (mstring_equal (t, "notfunction"))
+	{
+	 ; /* handled by pcpp */
+	}
+      else if (mstring_equal (t, "access"))
+	{
+	  cstring tname;
+	  
+	  while (TRUE)
+	    {
+	      while ((c = *s) && (c == ' ' || c == '\t' || c == '\n'))
+		{
+		  s++;
+		}
+	      
+	      if (c == '\0')
+		{
+                   break;
+		}
+
+	      tname = cstring_fromChars (s);
+	      
+	      while ((c = *s) != '\0' && c != ' ' 
+		     && c != '\t' && c != '\n' && c != ',') 
+		{
+		  s++;
+		}
+
+	      *s = '\0';
+
+	      
+	      if (!context_getFlag (FLG_NOCOMMENTS) 
+		  && !context_getFlag (FLG_NOACCESS))
+		{
+		  if (usymtab_existsType (tname))
+		    {
+		      usymId uid = usymtab_getTypeId (tname);
+
+		      		      context_addFileAccessType (uid);
+		    }
+		  else
+		    {
+		      if (!(context_inSuppressRegion ()
+			    || context_inSuppressZone (g_currentloc)))
+			{
+			  llmsg 
+			    (message
+			     ("%q: Unrecognized type %s used in access comment",
+			      fileloc_unparse (g_currentloc), tname));
+			}
+		    }
+		}
+	      
+	      if (c != '\0') 
+		{
+		  s++;
+		}
+	      
+	      if (c != ',' && c != ' ')
+		{
+		  break;
+		}
+	    }
+	}
+      else if (mstring_equal (t, "noaccess"))
+	{
+	  cstring tname;
+	  char lc;
+	  
+	  while (TRUE)
+	    {
+	      while ((lc = *s) && (lc == ' ' || lc == '\t' || lc == '\n')) 
+		{
+		  s++;
+		}
+	      
+	      if (lc == '\0')
+		{
+		 break;
+		}
+
+	      tname = cstring_fromChars (s);
+	      
+	      while ((lc = *s) != '\0' && lc != ' ' && lc != '\t' 
+		     && lc != '\n' && lc != ',') 
+		{
+		  s++;
+		}
+
+	      *s = '\0';
+
+	      if (!context_getFlag (FLG_NOCOMMENTS) 
+		  && !context_getFlag (FLG_NOACCESS))
+		{
+		  if (usymtab_existsType (tname))
+		    {
+		      typeId tuid = usymtab_getTypeId (tname);
+		      
+		      if (context_couldHaveAccess (tuid))
+			{
+			  context_removeFileAccessType (tuid);
+			}
+		      else
+			{
+			  if (!(context_inSuppressRegion () 
+				|| context_inSuppressZone (g_currentloc)))
+			    {
+			      uentry ue = usymtab_getTypeEntry (tuid);
+			      
+			      if (uentry_isAbstractDatatype (ue))
+				{
+				  llmsg
+				    (message
+				     ("%q: Non-accessible abstract type %s used in noaccess comment",
+				      fileloc_unparse (g_currentloc), tname));
+				}
+			      else
+				{
+				  llmsg
+				    (message
+				     ("%q: Non-abstract type %s used in noaccess comment",
+				      fileloc_unparse (g_currentloc), tname));
+				}
+			    }
+			}
+		    }
+		  else
+		    {
+		      if (!(context_inSuppressRegion () 
+			    || context_inSuppressZone (g_currentloc)))
+			{
+			  llmsg
+			    (message
+			     ("%q: Unrecognized type %s used in noaccess comment",
+			      fileloc_unparse (g_currentloc), tname));
+			}
+		    }
+		}
+	      
+	      if (lc != '\0') 
+		{
+		  s++;
+		}
+	      
+	      if (lc != ',' && lc != ' ')
+		{
+		  break;
+		}
+	    }
+	}
+      else
+	{
+	  setTokLength (- (2 + charsread));
+
+	  voptgenerror (FLG_UNRECOGCOMMENTS, 
+			message ("Stylized comment unrecognized: %s", 
+				 cstring_fromChars (os)), 
+			g_currentloc);
+	}
+
+      sfree (t);
+    }
+  
+  sfree (os); 
+  return BADTOK;
+}
+
+static /*@only@*/ cstring makeIdentifier (char *s)
+{
+  char *c = mstring_create (size_toInt (strlen (s)) + 1);
+  cstring id = cstring_fromChars (c);
+
+  while (isalnum (*s) || (*s == '_') || (*s == '$')) 
+    {
+      *c++ = *s++;
+    }
+
+  *c = '\0';
+  return (id);
+}
+
+/*@observer@*/ /*@dependent@*/ uentry coerceId (cstring cn)
+{
+  if (!(usymtab_exists (cn)))
+    {
+      fileloc loc = fileloc_createExternal ();
+      
+      /*
+      ** We need to put this in a global scope, otherwise the sRef will be deallocated.
+      */
+      
+      uentry ce = uentry_makeUnrecognized (cn, loc);
+      
+      if (!context_inIterEnd ())
+	{
+	  voptgenerror 
+	    (FLG_SYSTEMUNRECOG, 
+	     message ("Unrecognized (possibly system) identifier: %q", 
+		      uentry_getName (ce)), 
+	     g_currentloc);
+	}
+      
+      return ce;
+    }
+  
+  return (usymtab_lookup (cn));
+}
+
+/*
+** like, coerceId, but doesn't supercede for iters
+*/
+
+/*@observer@*/ uentry coerceIterId (cstring cn)
+{
+  if (!(usymtab_exists (cn)))
+    {
+      return uentry_undefined;
+    }
+  
+  return (usymtab_lookup (cn));
+}
+
+/*@observer@*/ cstring LastIdentifier ()
+{
+  return (lastidprocessed);
+}
+
+static int processIdentifier (cstring id)
+{
+  uentry le;
+
+  DPRINTF (("Process identifier: %s", id));
+
+  context_clearJustPopped ();
+  lastidprocessed = id; 
+
+  if (context_inFunctionDecl ())
+    {
+      int tok = commentMarkerToken (id);
+
+      if (tok != BADTOK)
+	{
+	  return tok;
+	}
+      else 
+	{
+	  tok = tokenMacroCode (id);
+
+	  if (tok != BADTOK)
+	    {
+	      return tok;
+	    }
+	}
+    }
+
+  /* Consider handling: Defined by C99 as static const char __func__[] */
+
+  if (context_getFlag (FLG_GNUEXTENSIONS))
+    {
+      int tok = BADTOK;
+      
+      if (cstring_equalLit (id, "__stdcall")
+	  || cstring_equalLit (id, "__cdecl")
+	  || cstring_equalLit (id, "__extension__"))
+	{
+	  return BADTOK;
+	}
+      else if (cstring_equalLit (id, "__volatile__"))
+	{
+	  tok = QVOLATILE;
+	}
+      else if (cstring_equalLit (id, "__signed"))
+	{
+	  tok = QSIGNED;
+	}
+      else if (cstring_equalLit (id, "__unsigned"))
+	{
+	  tok = QUNSIGNED;
+	}
+      else if (cstring_equalLit (id, "__const__"))
+	{
+	  tok = QCONST;
+	}
+      else if (cstring_equalLit (id, "__alignof__")) 
+	{
+	  tok = CALIGNOF; /* alignof is parsed like sizeof */
+	}
+      else if (cstring_equalLit (id, "__FUNCTION__")
+	       || cstring_equalLit (id, "__PRETTY_FUNCTION__")) 
+	{
+	  /* These tokens hold the name of the current function as strings */
+	  yylval.expr = exprNode_stringLiteral (id, fileloc_copy (g_currentloc));
+	  tokLength = 0;
+	  lastWasString = TRUE;
+	  tok = CCONSTANT;
+	  return tok;
+	}
+      else if (cstring_equalLit (id, "__attribute__")
+	       || cstring_equalLit (id, "__asm__")
+	       || cstring_equalLit (id, "_asm")
+	       || cstring_equalLit (id, "__asm")
+	       || cstring_equalLit (id, "__declspec"))
+	{
+	  int depth = 0;
+	  bool useparens = FALSE;
+	  bool usebraces = FALSE;
+	  bool inquote = FALSE;
+	  bool inescape = FALSE;
+	  int ic;
+
+	  while ((ic = input ()) != EOF)
+	    {
+	      		      
+	      if (inescape)
+		{
+		  inescape = FALSE;
+		}
+	      else if (ic == '\\')
+		{
+		  inescape = TRUE;
+		}
+	      else if (ic == '\"')
+		{
+		  inquote = !inquote;
+		}
+	      else if (!inquote)
+		{
+		  if (ic == '(')
+		    {
+		      if (!useparens)
+			{
+			  if (!usebraces)
+			    {
+			      useparens = TRUE;
+			    }
+			}
+
+		      if (useparens)
+			{
+			  depth++;
+			}
+		    }
+		  else if (ic == '{')
+		    {
+		      if (!usebraces)
+			{
+			  if (!useparens)
+			    {
+			      usebraces = TRUE;
+			    }
+			}
+
+		      if (usebraces)
+			{
+			  depth++;
+			}
+		    }
+		  else if (ic == ')' && useparens)
+		    {
+		      depth--;
+		      if (depth == 0) break;
+		    }
+		  else if (ic == '}' && usebraces)
+		    {
+		      depth--;
+		      if (depth == 0) break;
+		    }
+		  else if (ic == '}' 
+			   && !usebraces && !useparens
+			   && cstring_equalLit (id, "__asm"))
+		    {
+		      /*
+		      ** We need this because some MS VC++ include files
+		      ** have __asm mov ... }
+		      ** Its a kludge, but otherwise would need to parse
+		      ** the asm code!
+		      */ 
+		      return TRBRACE;
+		    }
+		}
+
+	      if (ic == '\n')
+		{
+		  context_incLineno ();
+
+		  if (cstring_equalLit (id, "__asm")
+		      && !useparens && !usebraces)
+		    {
+		      break;
+		    }
+		}
+	    }
+	  
+	  llassert ((useparens && ic == ')')
+		    || (usebraces && ic == '}')
+		    || (!useparens && !usebraces));
+
+	  return BADTOK;
+	}
+      else if (cstring_equalLit (id, "inline")
+	       || cstring_equalLit (id, "__inline")
+	       || cstring_equalLit (id, "_inline")
+	       || cstring_equalLit (id, "__inline__"))
+	{
+	  tok = QINLINE;
+	}
+      
+      if (tok != BADTOK)
+	{
+	  RETURN_TOK (tok);
+	}
+    }
+
+  le = usymtab_lookupSafe (id);
+
+  /*@-dependenttrans@*/
+  
+  if (uentry_isIter (le))
+    {
+      yylval.entry = le;
+      return (ITER_NAME);
+    }
+  else if (uentry_isEndIter (le))
+    {
+      yylval.entry = le;
+      return (ITER_ENDNAME);
+    }
+  else if (uentry_isUndefined (le))
+    {
+      yylval.cname = id;
+
+      /* avoid parse errors for certain system built ins */
+
+      if (g_expectingTypeName && (cstring_firstChar (id) == '_')
+	  && (cstring_secondChar (id) == '_'))
+	{
+	  return (TYPE_NAME_OR_ID);
+	}
+
+      return (NEW_IDENTIFIER);
+    }
+  else if (!uentry_isDeclared (le) && !uentry_isCodeDefined (le))
+    {
+      if (uentry_isDatatype (le))
+	{
+	  yylval.cname = id;
+	  return (NEW_IDENTIFIER);
+	}
+      else
+	{
+	  yylval.entry = le;	  	  
+	  return (IDENTIFIER); 
+	}
+    }
+  else if (uentry_isDatatype (le))
+    {
+      if (!g_expectingTypeName)
+	{
+	  yylval.cname = id;
+
+	  return (NEW_IDENTIFIER);
+	}
+      else
+	{
+	  yylval.ctyp = uentry_getAbstractType (le);
+	  
+	  uentry_setUsed (le, g_currentloc);
+	  return (TYPE_NAME);
+	}
+    }
+  else
+    {
+      yylval.entry = le;            
+      return (IDENTIFIER); 
+    }
+
+  /*@=dependenttrans@*/
+}
+
+static bool processHashIdentifier (/*@only@*/ cstring id)
+{
+  if (context_inMacro () || context_inIterDef () ||
+      context_inIterEnd ())
+    {
+      uentry le;
+      
+      context_clearJustPopped ();
+
+      lastidprocessed = id; 
+      le = usymtab_lookupSafe (id);
+
+      if (uentry_isParam (le) || uentry_isRefParam (le))
+	{
+	  return TRUE;
+	}
+      else
+	{
+	  return FALSE;
+	}
+    }
+  else
+    {
+      cstring_free (id);
+      return FALSE;
+    }
+}
+
+
+static /*@only@*/ exprNode processString ()
+{
+  exprNode res;
+  fileloc loc;
+  char *nl = strchr (yytext, '\n');
+  cstring ns = cstring_fromCharsNew (yytext);
+
+  if (nl == NULL)
+    {
+      loc = fileloc_copy (g_currentloc);
+      addColumn (cstring_length (ns));
+    }
+  else
+    {
+      char *lastnl = nl;
+
+      loc = fileloc_copy (g_currentloc);
+
+      context_incLineno ();
+      
+      while ((nl = strchr ((nl + 1), '\n')) != NULL)
+	{
+	  context_incLineno ();
+	  lastnl = nl;
+	}
+    }
+
+    
+  res = exprNode_stringLiteral (ns, loc);
+  return (res);
+}
+
+static 
+char processChar ()
+{
+  char fchar;
+  char next;
+
+  llassert (*yytext != '\0');
+  fchar = *(yytext + 1);
+  if (fchar != '\\') return fchar;
+  
+  next = *(yytext + 2);
+  
+  switch (next)
+    {
+    case 'n': return '\n';
+    case 't': return '\t';
+    case '\"': return '\"';
+    case '\'': return '\'';
+    case '\\': return '\\';
+    default: return '\0';
+    }
+}
+
+static
+double processFloat ()
+{
+  double ret = atof (yytext);
+
+    return (ret);
+}
+
+static
+long processHex ()
+{
+  int index = 2;
+  long val = 0;
+
+  llassert (yytext[0] == '0'
+	    && (yytext[1] == 'X' || yytext[1] == 'x'));
+
+  while (yytext[index] != '\0') {
+    int tval;
+    char c = yytext[index];
+
+    if (c >= '0' && c <= '9') {
+      tval = (int) c - (int) '0';
+    } else if (c >= 'A' && c <= 'F') {
+      tval = (int) c - (int) 'A' + 10;
+    } else if (c >= 'a' && c <= 'f') {
+      tval = (int) c - (int) 'a' + 10;
+    } else {
+      voptgenerror
+	(FLG_SYNTAX, 
+	 message ("Invalid character (%c) in hex constant: %s",
+		  c, cstring_fromChars (yytext)),
+	 g_currentloc);
+      break;
+    }
+
+    val = (val * 16) + tval;
+    index++;
+  }
+
+  DPRINTF (("Hex constant: %s = %ld", yytext, val));
+  return val;
+}
+
+static
+long processOctal ()
+{
+  int index = 1;
+  long val = 0;
+
+  llassert (yytext[0] == '0' && yytext[1] != 'X' && yytext[1] != 'x');
+    
+  while (yytext[index] != '\0') {
+    int tval;
+    char c = yytext[index];
+    
+    if (c >= '0' && c <= '7') {
+      tval = (int) c - (int) '0';
+    } else {
+      voptgenerror
+	(FLG_SYNTAX, 
+	 message ("Invalid character (%c) in octal constant: %s",
+		  c, cstring_fromChars (yytext)),
+	 g_currentloc);
+      break;
+    }
+
+    val = (val * 8) + tval;
+    index++;
+  }
+
+  DPRINTF (("Octal constant: %s = %ld", yytext, val));
+  return val;
+}
+
+static
+long processDec ()
+{
+  return (atol (yytext));
+}
+
+static int
+processSpec (int tok)
+{
+  size_t length = strlen (yytext);
+
+  
+  if (inSpecPart)
+    {
+      setTokLengthT (length);
+      RETURN_TOK (tok);
+    }
+  else
+    {
+      
+      context_saveLocation ();
+      setTokLengthT (length);
+      return (processIdentifier (makeIdentifier (yytext)));
+    }
+}
diff --git a/src/lh.c b/src/lh.c
new file mode 100644
index 0000000..bde0e58
--- /dev/null
+++ b/src/lh.c
@@ -0,0 +1,499 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lh.c
+**
+**  MODULE DESCRIPTION:
+**
+**      This module contains the I/O routines for writing out the .lh file
+**	generated from the .lcl file.
+**
+**  AUTHORS:
+**
+**      Gary Feldman, Technical Languages and Environments, DECspec project
+**      Yang Meng Tan, MIT.
+**
+**  CREATION DATE:  9 April 91
+**
+**	The lh.c module controls formatting policy.
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "osd.h"
+# include "herald.h"
+# include "lh.h"
+# include "llmain.h"
+
+/*@constant static char TABCH; @*/
+# define TABCH 		'\1'
+
+/*@constant static char TABINCH; @*/
+# define TABINCH 	'\2'
+
+/*@constant static char TABOUTCH; @*/
+# define TABOUTCH	'\3'
+
+/*@constant static observer char *LHTMP_SUFFIX; @*/
+# define LHTMP_SUFFIX ".lh_tmp"
+
+/*
+  # define TAB 		        fputc (TABCH, 	LhFile.f);
+  # define TABIN		fputc (TABINCH, 	LhFile.f);
+  # define TABOUT		fputc (TABOUTCH, LhFile.f);
+*/
+
+typedef struct
+{
+  /*@dependent@*/ /*@null@*/ /*@reldef@*/ FILE *f;
+  /*@reldef@*/ char *name;
+} outFile;
+
+static bool genLh;
+static outFile LhFile;
+static bool needIncludeBool = FALSE;
+
+/*
+**
+**  FORWARD FUNCTIONS
+**
+*/
+
+/* static int colpos (int startcol, cstring line); */
+
+static cstring lhTypeSpecNode (lclTypeSpecNode p_typespec);
+static /*@only@*/ cstring lhTypeExpr (/*@null@*/ typeExpr p_x);
+static /*@only@*/ cstring lhDeclaratorNode (declaratorNode p_x);
+
+static /*@dependent@*/ /*@null@*/ FILE *out_open (char *name, char *suffix) /*@modifies fileSystem@*/
+{
+  char *fullname = (char *)
+    mstring_create (size_toInt (strlen (name) + strlen (suffix)));
+  FILE *ret;
+
+  strcpy (fullname, name);
+  strcat (fullname, suffix);
+  ret = fopen (fullname, "w+");
+  sfree (fullname);
+  return ret;
+}
+
+/*@only@*/ cstring 
+lhFunction (lclTypeSpecNode lclTypeSpec, declaratorNode declarator)
+{
+  cstring s;
+
+  if (!genLh)
+    return cstring_undefined;
+  
+  s = message ("extern %q\1%q;", lhTypeSpecNode (lclTypeSpec),
+	       lhDeclaratorNode (declarator));
+  
+  return s;
+}
+
+static /*@only@*/ cstring
+lhDeclaratorNode (declaratorNode x)
+{
+  return (lhTypeExpr (x->type));
+}
+
+static /*@only@*/ cstring lhTypeExpr (/*@null@*/ typeExpr x)
+{
+  cstring s = cstring_undefined; /* print out types in order of appearance in source */
+  paramNodeList params;
+  int i;
+
+  if (x != (typeExpr) 0)
+    {
+      cstring front = cstring_undefined;
+      cstring back  = cstring_undefined;
+
+      for (i = x->wrapped; i >= 1; i--)
+	{
+	  front = cstring_appendChar (front, '(');
+	  back  = cstring_appendChar (back, ')');
+	}
+
+      switch (x->kind)
+	{
+	case TEXPR_BASE:
+	  s = message ("%q%s", s, ltoken_getRawString (x->content.base));
+	  break;
+	case TEXPR_PTR:
+	  s = message ("%q*%q", s, lhTypeExpr (x->content.pointer));
+	  break;
+	case TEXPR_ARRAY:
+	  s = message ("%q%q[%q]", s, 
+		       lhTypeExpr (x->content.array.elementtype),
+		       termNode_unparse (x->content.array.size));
+	  break;
+	case TEXPR_FCN:
+	  s = message ("%q%q (", s, lhTypeExpr (x->content.function.returntype));
+	  params = x->content.function.args;
+
+	  if (!paramNodeList_empty (params))
+	    {
+	      s = message ("%q%q", s, 
+			   paramNodeList_unparseComments (x->content.function.args));
+	    }
+
+	  s = message ("%q)", s);
+	  break;
+	}
+      s = message ("%q%q%q", front, s, back);
+    }
+  else
+    {
+      s = cstring_makeLiteral ("?");
+    }
+
+  return s;
+}
+
+extern void
+lhForwardStruct (ltoken t)
+{
+  if (!genLh)
+    return;
+
+  lhOutLine (message ("struct %s;", ltoken_unparse (t)));
+}
+
+
+extern void
+lhForwardUnion (ltoken t)
+{
+  if (!genLh)
+    return;
+
+  lhOutLine (message ("union %s;", ltoken_unparse (t)));
+}
+
+extern /*@only@*/ cstring 
+lhType (typeNode t)
+{
+  if (!genLh)
+    return cstring_undefined;
+
+  if (t->kind == TK_EXPOSED)
+    {
+      exposedNode n = t->content.exposed;
+
+      if (n != (exposedNode) 0)
+	{
+	  if (declaratorInvNodeList_size (n->decls) == 0)
+	    {
+	      /* 
+	      ** Forward struct or union declaration
+	      */
+
+	      return (cstring_appendChar (lhTypeSpecNode (n->type), ';'));
+	    }
+	  else
+	    {
+	      cstring s = cstring_undefined;
+
+	      declaratorInvNodeList_elements (n->decls, d)
+		{
+		  cstring name = declaratorNode_unparse (d->declarator);
+		  cstring pname = declaratorNode_unparseCode (d->declarator); 
+		  
+		  s = message ("%q\n# ifndef EXPOSED_TYPE_%q\ntypedef %q %q;\n# endif\n", 
+			       s, pname, lhTypeSpecNode (n->type), name);
+		} end_declaratorInvNodeList_elements;
+	      
+	      return s;
+	    }
+	}
+    }
+
+  return cstring_undefined;
+}
+
+static /*@only@*/ cstring 
+lhTypeSpecNode (lclTypeSpecNode typespec)
+{
+  if (!genLh)
+    {
+      return cstring_undefined;
+    }
+
+  return (lclTypeSpecNode_unparseComments (typespec));
+}
+
+/*@only@*/ cstring
+lhVarDecl (lclTypeSpecNode lclTypeSpec, initDeclNodeList initDecls,
+	   qualifierKind qualifier)
+{
+  bool first = TRUE;
+  cstring s;
+
+  if (!genLh)
+    return cstring_undefined;
+
+  s = cstring_makeLiteral ("extern");
+
+  switch (qualifier)
+    {
+    case QLF_NONE:
+      break;
+    case QLF_CONST:
+      s = message ("%q const", s);
+      break;
+    case QLF_VOLATILE:
+      s = message ("%q volatile", s);
+      break;
+    default:			/* ignore it */
+      break;
+    }
+  
+  s = message ("%q %q\1", s, lhTypeSpecNode (lclTypeSpec));
+
+  initDeclNodeList_elements (initDecls, i)
+  {
+    if (first)
+      {
+	s = message ("%q %q", s, declaratorNode_unparse (i->declarator));
+	first = FALSE;
+      }
+    else
+      {
+	s = message ("%q, %q", s, declaratorNode_unparse (i->declarator));
+      }
+  } end_initDeclNodeList_elements;
+  
+  return (message ("%q;", s));
+}
+
+extern void
+lhCleanup (void)
+   /*@modifies fileSystem@*/
+{
+  if (!genLh)
+    {
+      return;
+    }
+  else
+    {
+      FILE *f;
+      int c, col = 0, tabcol = 0;
+      char *fullname;
+
+      
+      fullname = mstring_create 
+	(size_toInt (strlen (LhFile.name) + strlen (LHTMP_SUFFIX)));
+
+      f = out_open (LhFile.name, LH_SUFFIX);
+      llassert (LhFile.f != NULL);
+
+      strcpy (fullname, LhFile.name);
+      strcat (fullname, LHTMP_SUFFIX);
+
+      if (f == NULL)
+	{
+	  lldiagmsg (message ("Cannot open lh file for output: %s", 
+			      cstring_fromChars (fullname)));
+	}
+      else
+	{
+	  fprintf (f, "/* Output from %s */\n", LCL_PARSE_VERSION);
+
+	  rewind (LhFile.f);
+
+	  while (EOF != (c = getc (LhFile.f)))
+	    {
+	      switch (c)
+		{
+		case TABCH:
+		  if (col == 0)
+		    {
+		      if (tabcol > 0)
+			fprintf (f, "%*s", tabcol, "");
+		    }
+		  else
+		    {
+		      check (fputc (' ', f) == (int) ' ');
+		    }
+		  /*@switchbreak@*/ break;
+		  
+		case TABINCH:
+		  tabcol += 4;
+		  /*@switchbreak@*/ break;
+		  
+		case TABOUTCH:
+		  tabcol -= 4;
+		  /*@switchbreak@*/ break;
+		  
+		case '\n':
+		  col = 0;
+		  check (fputc (c, f) == (int) c);
+		  /*@switchbreak@*/ break;
+		  
+		default:
+		  col++;
+		  check (fputc (c, f) == (int) c);
+		  /*@switchbreak@*/ break;
+		}
+	    }
+
+	  check (fclose (f) == 0);
+	  check (fclose (LhFile.f) == 0);
+
+	  (void) osd_unlink (fullname);
+	  LhFile.f = NULL;
+	}
+      
+      sfree (fullname);
+    }
+}
+
+/* Write an #include of bool.h if we have't done so already.  */
+extern void
+lhIncludeBool (void)
+{
+  needIncludeBool = TRUE;
+}
+
+/*
+**++
+**  FUNCTIONAL DESCRIPTION:
+**
+**      Initialize the .lh file processing.
+**
+**  FORMAL PARAMETERS:
+**
+**      source * f: The source file, from which we compute the name of
+**	the .lh file.
+**
+**	bool outputLh: If true, produce a .lh file, otherwise don't.
+**
+**  RETURN VALUE:
+**
+**      None
+**
+**  SIDE EFFECTS:
+**
+**      The .lh file may be opened.
+**
+**
+**--
+*/
+
+void lhInit (tsource * f) /*@globals undef LhFile; @*/
+{
+  static bool lherror = FALSE;
+  
+  genLh = context_msgLh ();
+  needIncludeBool = FALSE;
+
+  if (!genLh)
+    {
+      return;
+    }
+  
+  LhFile.name = LSLRootName (tsource_fileName (f));
+  LhFile.f = out_open (LhFile.name, LHTMP_SUFFIX);
+
+  if (LhFile.f == NULL)
+    {
+      genLh = FALSE;
+      if (!lherror)
+	{
+	  lclplainerror (message ("Cannot write .lh file: %s.lh", 
+				  cstring_fromChars (LhFile.name)));
+	  lherror = TRUE;
+	}
+    } 
+} 
+
+void lhOutLine (/*@only@*/ cstring s)
+{
+  if (genLh)
+    {
+      llassert (LhFile.f != NULL);
+
+      if (cstring_length (s) > 0) 
+	{
+	  check (fputs (cstring_toCharsSafe (s), LhFile.f) != EOF); 
+	}
+
+      check (fputc ('\n', LhFile.f) == (int) '\n'); 
+    }
+
+  cstring_free (s);
+}
+
+void lhExternals (interfaceNodeList x)
+{
+  if (genLh)
+    {
+      llassert (LhFile.f != NULL);
+
+      /*
+      ** Need to make sure all standard library includes come first.
+      */
+
+      interfaceNodeList_elements (x, el)
+	{
+	  if (el->kind == INF_IMPORTS)
+	    {
+	      importNodeList imps = el->content.imports;
+
+	      importNodeList_elements (imps, il)
+		{
+		  if (il->kind == IMPBRACKET)
+		    {
+		      lhOutLine (message ("# include <%s.h>", 
+					  ltoken_getRawString (il->val)));
+		    }
+		} end_importNodeList_elements ;
+	    }
+	} end_interfaceNodeList_elements;
+
+      lhOutLine (cstring_makeLiteral ("# include \"bool.h\""));
+      
+      interfaceNodeList_elements (x, el)
+	{
+	  if (el->kind == INF_IMPORTS)
+	    {
+	      importNodeList imps = el->content.imports;
+
+	      importNodeList_elements (imps, il)
+		{
+		  if (il->kind != IMPBRACKET)
+		    {
+		      lhOutLine (message ("# include \"%s.h\"", 
+					  ltoken_getRawString (il->val)));
+		    }
+		} end_importNodeList_elements ;
+	    }
+	} end_interfaceNodeList_elements;
+
+      lhOutLine (cstring_undefined);
+    }
+}
+
+
+
diff --git a/src/llerror.c b/src/llerror.c
new file mode 100644
index 0000000..56ff160
--- /dev/null
+++ b/src/llerror.c
@@ -0,0 +1,1657 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** llerror.c
+**
+** error reporting procedures
+*/
+
+# include "lclintMacros.nf"
+# include 
+# include 
+# include "llbasic.h"
+# include "llmain.h"
+# include "version.h"
+
+static void printIndentMessage (FILE *p_stream, /*@only@*/ cstring p_sc, int p_indent)
+   /*@modifies *p_stream@*/ ;
+
+# ifndef NOLCL
+static int lclerrors = 0;
+# endif
+
+static int lastfileloclen = 10;
+static /*@only@*/ cstring lastmsg = cstring_undefined;
+static int mcount = 0;
+static /*@only@*/ cstring saveOneMessage = cstring_undefined;
+static /*@only@*/ fileloc lastparseerror = fileloc_undefined;
+static /*@only@*/ fileloc lastbug = fileloc_undefined;
+static bool llgenerrorreal (/*@only@*/ cstring p_s, fileloc p_fl, bool p_iserror, bool p_indent)
+                 /*@modifies g_msgstream@*/ ;
+static bool llgenerroraux (/*@only@*/ cstring p_s, fileloc p_fl, bool p_iserror, bool p_indent)
+                 /*@modifies g_msgstream@*/ ;
+static void printError (FILE *p_stream, /*@only@*/ cstring p_sc)
+   /*@globals lastfileloclen @*/
+   /*@modifies *p_stream@*/ ;
+static void printMessage (FILE *p_stream, /*@only@*/ cstring p_s)
+   /*@modifies *p_stream@*/ ;
+
+static /*@null@*/ char *
+maxcp (/*@null@*/ /*@returned@*/ char *a, /*@null@*/ /*@returned@*/ char *b)
+{
+  if (a > b) return a;
+  else return b;
+}
+
+static void
+printBugReport (void)
+{
+  fprintf (stderr, "     *** Please report bug to %s ***\n",
+	   LCLINT_MAINTAINER);
+  llflush ();
+  /* don't exit (EXIT_FAILURE); */
+}
+
+static bool s_needsPrepare = TRUE;
+
+void prepareMessage (void)
+{
+  if (context_isPreprocessing ()
+      && s_needsPrepare
+      && context_getDebug (FLG_SHOWSCAN))
+    {
+      llflush ();
+      fprintf (stderr, " >\n");
+      s_needsPrepare = FALSE;
+    }
+
+  llflush ();
+}
+
+void closeMessage (void)
+{
+  if (context_isPreprocessing ()
+      && context_getDebug (FLG_SHOWSCAN))
+    {
+      llflush ();
+      fprintf (stderr, "< more preprocessing .");
+
+      llassert (!s_needsPrepare);
+      s_needsPrepare = TRUE;
+    }
+  else
+    {
+      llflush ();
+    }
+}
+
+void
+llmsg (/*@only@*/ cstring s)
+{
+  context_setNeednl ();
+  prepareMessage ();
+  printMessage (g_msgstream, s);
+  closeMessage ();
+}
+
+void
+lldiagmsg (/*@only@*/ cstring s)
+{
+  context_setNeednl ();
+  prepareMessage ();
+  printMessage (stderr, s);
+  closeMessage ();
+}
+
+void
+llmsgplain (/*@only@*/ cstring s)
+{
+  context_setNeednl ();
+  prepareMessage ();
+  printMessage (g_msgstream, s);
+  closeMessage ();
+}
+
+void flagWarning (cstring s)
+{
+  if (context_getFlag (FLG_WARNFLAGS))
+    {
+      showHerald ();
+
+      if (fileloc_isBuiltin (g_currentloc))
+	{
+	  llmsg (message ("Warning: %s", s));
+	}
+      else
+	{
+	  llgenmsg (message ("Warning: %s", s), g_currentloc);
+	}
+    }
+}
+
+static void
+llgenhint (/*@only@*/ cstring s) /*@modifies g_msgstream@*/
+{
+  context_setNeednl ();
+  printIndentMessage (g_msgstream, s, 2);
+}
+
+void
+llhint (cstring s)
+{
+  if (context_getFlag (FLG_HINTS) &&
+      !(context_inSuppressRegion () || context_inSuppressZone (g_currentloc)))
+    {
+      llgenhint (s);
+    }
+  else
+    {
+      cstring_free (s);
+    }
+}
+
+static void
+llshowhint (flagcode f)
+{
+  if (context_getFlag (FLG_HINTS))
+    {
+      if ((flagcode_numReported (f) == 0) || context_getFlag (FLG_FORCEHINTS))
+	{
+	  cstring desc = flagcodeHint (f);
+
+	  if (cstring_isDefined (desc))
+	    {
+	      llgenhint (cstring_copy (desc));
+	    }
+	}
+    }
+}
+
+
+static void
+llsuppresshint (char c, flagcode f)
+{
+
+  if (context_getFlag (FLG_HINTS))
+    {
+      if ((flagcode_numReported (f) == 0) || context_getFlag (FLG_FORCEHINTS))
+	{
+	  cstring desc = flagcodeHint (f);
+	  context_setNeednl ();
+	  lastfileloclen = 8;
+
+	  if (flagcode_isNamePrefixFlag (f))
+	    {
+	      f = FLG_NAMECHECKS;
+	    }
+
+	  if (cstring_isDefined (desc))
+	    {
+	      llgenhint (message ("%s (%h%s will suppress message)", desc, c,
+				  flagcode_name (f)));
+	    }
+	  else
+	    {
+	      llgenhint (message ("(%h%s will suppress message)", c,
+				  flagcode_name (f)));
+	    }
+	}
+    }
+}
+
+static void
+llnosuppresshint (flagcode f)
+{
+
+  if (context_getFlag (FLG_FORCEHINTS))
+    {
+      cstring desc = flagcodeHint (f);
+      context_setNeednl ();
+      lastfileloclen = 8;
+
+      if (cstring_isDefined (desc))
+	{
+	  printError (g_msgstream, message ("    %s", desc));
+	}
+    }
+}
+
+/*@constant int MAXSEARCH; @*/
+# define MAXSEARCH 20
+
+/*@constant int MINLINE; @*/
+# define MINLINE 35
+
+typedef /*@null@*/ /*@dependent@*/ char *nd_charp;
+
+static void
+mstring_split (/*@returned@*/ char **sp,
+	       /*@out@*/ nd_charp *tp,
+	       int maxline, /*@in@*/ int *indentchars)
+{
+  char *nl;
+  char *t;
+  char *s = *sp;
+
+  *tp = NULL;
+
+  if (maxline < MINLINELEN)
+    {
+      maxline = MINLINELEN;
+    }
+
+  if (*indentchars > 0)
+    {
+      s = *sp = mstring_concatFree1 (mstring_spaces (*indentchars), s);
+    }
+
+  nl = strchr (s, '\n');
+
+  /*
+  ** splitting:
+  **
+  **    if there is a newline in first maxline characters, split there
+  **    if line len is <= maxline, return no split
+  **    if there is a ':' or ';' followed by ' ' in first maxline characters,
+  **       split there unless the ' ' is followed by a '}', then
+  **       split after '}'
+  **       of the ';' is inside quotation marks
+  **    if there is a space or tab in last maxsearch characters, split there
+  **    else, split at maxline
+  **
+  **    special code: slash [1-9] after a newline means indent the rest  chars
+  **
+  */
+
+  if ((nl != NULL) && ((nl - s) < maxline))
+    {
+      *nl = '\0';
+      t = nl + 1;
+
+      if (*t == '\0')
+	{
+	  return;
+	}
+
+      if (*t >= '\1' && *t <= '\7')
+	{
+	  *indentchars += (int) (*t - '\1') + 1;
+	  t++;
+	  	}
+
+      *tp = t;
+      return;
+    }
+  else if (size_toInt (strlen (s)) < maxline)
+    {
+      return;
+    }
+  else
+    {
+      int i = 0;
+      char savechar;
+      char *lcolon, *lsemi, *splitat;
+
+      splitat = NULL;
+
+      t = s + maxline - 1;
+      savechar = *t;
+
+      *t = '\0';
+      lcolon = strrchr (s, ':');
+      lsemi = strrchr (s, ';');
+      *t = savechar;
+
+      splitat = maxcp (lcolon, lsemi);
+
+      if (splitat != NULL && ((int)(splitat - s) > MINLINE)
+	  && *(splitat + 1) == ' ' && *(splitat + 2) != '}')
+	{
+	  *(splitat + 1) = '\0';
+	  t = splitat + 2;
+	  *tp = t;
+	  return;
+	}
+
+      while (*t != ' ' && *t != '\t' && i < MAXSEARCH)
+	{
+	  t--;
+	  i++;
+	}
+
+      if (*t != ' ' && *t != '\t')
+	{
+	  t = mstring_copy (s + maxline);
+	  *(s + maxline) = '\0';
+
+	  if (*t == '\0')
+	    {
+	      sfree (t);
+	      return;
+	    }
+
+	  mstring_markFree (t);
+	  *tp = t;
+	  return;
+	}
+      else
+	{
+	  *t = '\0';
+	  t++;
+
+	  if (*t == '\0') return;
+
+	  /*
+	  ** returns unqualified as only
+	  */
+
+	  *tp = t;
+	  return;
+	}
+    }
+}
+
+static
+void limitmessage (/*@only@*/ cstring s, fileloc loc)
+{
+  if (mcount > context_getLimit () + 1)
+    {
+      cstring_free (s);
+    }
+  else
+    {
+      cstring flstring = fileloc_unparse (loc);
+
+      lastfileloclen = cstring_length (flstring);
+      cstring_free (saveOneMessage);
+      saveOneMessage = message ("%q: %q", flstring, s);
+    }
+}
+
+static int parseerrorcount = 0;
+
+void cleanupMessages ()
+{
+  parseerrorcount = 0;
+
+  if (context_unlimitedMessages ())
+    {
+     ;
+    }
+  else
+    {
+      int unprinted = mcount - context_getLimit ();
+
+      if (unprinted > 0)
+	{
+	  if (unprinted == 1 && cstring_isDefined (saveOneMessage))
+	    {
+	      prepareMessage ();
+	      printError (g_msgstream, saveOneMessage);
+	      closeMessage ();
+	      saveOneMessage = cstring_undefined;
+	    }
+	  else
+	    {
+	      if (cstring_isDefined (saveOneMessage))
+		{
+		  /* cstring_free (saveOneMessage); */
+		  saveOneMessage = cstring_undefined;
+		}
+
+	      fprintf (g_msgstream, "%s: (%d more similar errors unprinted)\n",
+		       cstring_toCharsSafe (fileloc_filename (g_currentloc)),
+		       mcount - context_getLimit ());
+	    }
+	}
+    }
+
+  mcount = 0;
+}
+
+void
+llgenmsg (/*@only@*/ cstring s, fileloc fl)
+{
+  cstring flstring = fileloc_unparse (fl);
+  lastfileloclen = cstring_length (flstring);
+
+  prepareMessage ();
+  (void) printError (g_msgstream, message ("%q: %q", flstring, s));
+  closeMessage ();
+}
+
+void
+llgenindentmsg (/*@only@*/ cstring s, fileloc fl)
+{
+  cstring flstring = fileloc_unparse (fl);
+
+  prepareMessage ();
+  (void) printIndentMessage (g_msgstream, message ("%q: %q", flstring, s), 3);
+  closeMessage ();
+}
+
+void
+llgenindentmsgnoloc (/*@only@*/ cstring s)
+{
+  prepareMessage ();
+  (void) printIndentMessage (g_msgstream, s, 3);
+  closeMessage ();
+}
+
+static bool
+  llgentypeerroraux (flagcode ocode, ctype t1, exprNode e1, ctype t2, exprNode e2,
+		     /*@only@*/ cstring s, fileloc fl)
+{
+  cstring hint = cstring_undefined;
+  flagcode code = ocode;
+  flagcode hcode = INVALID_FLAG;
+  ctype ut1 = t1;
+  ctype ut2 = t2;
+
+  /* 
+  ** Set the flag using the underlying types that didn't match.
+  */
+
+  while (ctype_isPointer (ut1) && ctype_isPointer (ut2)) {
+    ut1 = ctype_baseArrayPtr (ut1);
+    ut2 = ctype_baseArrayPtr (ut2);
+  }
+
+  if ((ctype_isFloat (ut1) && ctype_isDouble (ut2))
+      || (ctype_isFloat (ut1) && ctype_isDouble (ut2)))
+    {
+      hcode = FLG_FLOATDOUBLE;
+    }
+  else if ((exprNode_isCharLit (e1) && ctype_isInt (ut2))
+	   || (exprNode_isCharLit (e2) && ctype_isInt (ut1)))
+    {
+      hcode = FLG_CHARINTLITERAL;
+    }
+  else if ((exprNode_isNumLit (e1) && ctype_isReal (ut2))
+	   || (exprNode_isNumLit (e2) && ctype_isReal (ut1)))
+    {
+      hcode = FLG_NUMLITERAL;
+    }
+  else if ((ctype_isDirectBool (ut1) && ctype_isInt (ut2))
+	   || (ctype_isInt (ut1) && ctype_isDirectBool (ut2)))
+    {
+      hcode = FLG_BOOLINT;
+    }
+  else if (((ctype_isChar (ut1) && !ctype_isInt (ut1)) && ctype_isInt (ut2))
+	   || ((ctype_isInt (ut1) && (ctype_isChar (ut2) && !ctype_isInt (ut2)))))
+    {
+      hcode = FLG_CHARINT;
+    }
+  else if ((ctype_isInt (ut1) && ctype_isInt (ut2))
+	   || (ctype_isChar (ut1) && ctype_isChar (ut2))
+	   || (ctype_isDouble (ut1) && ctype_isDouble (ut2)))
+    {
+      if (!bool_equal (ctype_isSigned (ut1), ctype_isSigned (ut2)))
+	{
+	  hcode = FLG_IGNORESIGNS;
+	}
+      else
+	{
+	  hcode = FLG_IGNOREQUALS;
+	}
+    }
+  else if (ctype_isArbitraryIntegral (ctype_realType (ut1)))
+    {
+      if (ctype_isArbitraryIntegral (ctype_realType (ut2)))
+	{
+	  hcode = FLG_MATCHANYINTEGRAL;
+	}
+      else if (ctype_match (ut2, ctype_ulint))
+	{
+	  hcode = FLG_LONGUNSIGNEDINTEGRAL;
+	}
+      else if (ctype_match (ut2, ctype_lint))
+	{
+	  hcode = FLG_LONGINTEGRAL;
+	}
+      else if (ctype_isInt (ut2))
+	{
+	  hcode = FLG_MATCHANYINTEGRAL;
+	}
+      else
+	{
+	  ;
+	}
+    }
+  else if (ctype_isArbitraryIntegral (ctype_realType (ut2)))
+    {
+      ctype tr = ctype_realType (ut1);
+
+      if (ctype_isArbitraryIntegral (tr))
+	{
+	  hcode = FLG_MATCHANYINTEGRAL;
+	}
+      else if (ctype_match (ut1, ctype_ulint))
+	{
+	  if (ctype_isUnsignedIntegral (tr))
+	    {
+	      hcode = FLG_LONGUNSIGNEDUNSIGNEDINTEGRAL;
+	    }
+	  else if (ctype_isSignedIntegral (tr))
+	    {
+	      ;
+	    }
+	  else
+	    {
+	      hcode = FLG_LONGUNSIGNEDINTEGRAL;
+	    }
+	}
+      else if (ctype_match (ut1, ctype_lint))
+	{
+	  if (ctype_isSignedIntegral (tr))
+	    {
+	      hcode = FLG_LONGSIGNEDINTEGRAL;
+	    }
+	  else if (ctype_isSignedIntegral (tr))
+	    {
+	      ;
+	    }
+	  else
+	    {
+	      hcode = FLG_LONGINTEGRAL;
+	    }
+	}
+      else if (ctype_isInt (ut1))
+	{
+	  hcode = FLG_MATCHANYINTEGRAL;
+	}
+      else
+	{
+	  ;
+	}
+    }
+  else if (ctype_isAbstract (ut1) && !ctype_isAbstract (ut2))
+    {
+      uentry ue1 = usymtab_getTypeEntry (ctype_typeId (ut1));
+      ctype ct = uentry_getType (ue1);
+
+      if (ctype_match (ct, ut2))
+	{
+	  code = FLG_ABSTRACT;
+	  hint = message ("Underlying types match, but %s is an "
+			  "abstract type that is not accessible here.",
+			  ctype_unparse (t1));
+	}
+    }
+  else if (ctype_isAbstract (ut2) && !ctype_isAbstract (ut1))
+    {
+      uentry ue = usymtab_getTypeEntry (ctype_typeId (ut2));
+      ctype ct = uentry_getType (ue);
+
+      if (ctype_match (ct, ut1))
+	{
+	  code = FLG_ABSTRACT;
+	  hint = message ("Underlying types match, but %s is an "
+			  "abstract type that is not accessible here.",
+			  ctype_unparse (t2));
+	}
+    }
+  else if ((ctype_isEnum (ut1) && ctype_isArbitraryIntegral (ut2))
+	   || (ctype_isEnum (ut2) && ctype_isArbitraryIntegral (ut1))) 
+    {
+      code = FLG_ENUMINT;
+    }
+  else if ((ctype_isEnum (ut1) && ctype_isArbitraryIntegral (ut2))
+	   || (ctype_isEnum (ut2) && ctype_isArbitraryIntegral (ut1))) 
+    {
+      code = FLG_ENUMINT;
+    }
+  else if ((ctype_isSignedChar (ut1) && ctype_isUnsignedChar (ut2))
+	   || (ctype_isUnsignedChar (ut1) && ctype_isSignedChar (ut2)))
+    {
+      code = FLG_CHARUNSIGNEDCHAR;
+    }
+  else if (ctype_isNumeric (ut1) && ctype_isNumeric (ut2)) 
+    {
+      code = FLG_RELAXTYPES;
+    }
+  else
+    {
+      DPRINTF (("No special type rule: %s / %s", ctype_unparse (ut1),
+		ctype_unparse (ut2)));
+    }
+
+  if (cstring_isDefined (hint))
+    {
+      if (!context_suppressFlagMsg (ocode, fl))
+	{
+	  return llgenhinterror (code, s, hint, fl);
+	}
+      else
+	{
+	  cstring_free (s);
+	  cstring_free (hint);
+	  return FALSE;
+	}
+    }
+  else
+    {
+      if (llgenerroraux (s, fl, TRUE, FALSE))
+	{
+	  if (hcode != INVALID_FLAG && hcode != ocode)
+	    {
+	      code = hcode;
+	      llshowhint (code);
+
+	    }
+	  else
+	    {
+	      llsuppresshint ('-', code);
+	    }
+
+	  flagcode_recordError (code);
+	  return TRUE;
+	}
+
+      return FALSE;
+    }
+}
+
+bool
+llgentypeerror (ctype t1, exprNode e1, ctype t2, exprNode e2,
+		/*@only@*/ cstring s, fileloc fl)
+{
+  return llgentypeerroraux (FLG_TYPE, t1, e1, t2, e2, s, fl);
+}
+
+bool
+llgenformattypeerror (ctype t1, exprNode e1, ctype t2, exprNode e2,
+		      /*@only@*/ cstring s, fileloc fl)
+{
+  return llgentypeerroraux (FLG_FORMATTYPE, t1, e1, t2, e2, s, fl);
+}
+
+bool
+llgenerror (flagcode o, /*@only@*/ cstring s, fileloc fl)
+{
+  if (llgenerroraux (s, fl, TRUE, FALSE))
+    {
+      llnosuppresshint (o);
+      flagcode_recordError (o);
+      closeMessage ();
+      return TRUE;
+    }
+  else
+    {
+      flagcode_recordSuppressed (o);
+      return FALSE;
+    }
+}
+
+bool
+llgenhinterror (flagcode o, /*@only@*/ cstring s, /*@only@*/ cstring hint,
+		fileloc fl)
+{
+  if (!context_suppressFlagMsg (o, fl))
+    {
+      if (llgenerroraux (s, fl, TRUE, FALSE))
+	{
+	  flagcode_recordError (o);
+
+	  if (context_getFlag (FLG_HINTS))
+	    {
+	      llgenhint (hint);
+	    }
+	  else
+	    {
+	      cstring_free (hint);
+	    }
+
+	  closeMessage ();
+	  return TRUE;
+	}
+
+      cstring_free (hint);
+    }
+  else
+    {
+      cstring_free (hint);
+      cstring_free (s);
+    }
+
+  flagcode_recordSuppressed (o);
+  return FALSE;
+}
+
+static bool
+llrealerror (/*@only@*/ cstring s, fileloc fl)
+{
+  return (llgenerrorreal (s, fl, TRUE, FALSE));
+}
+
+static bool
+llgenerroraux (/*@only@*/ cstring s, fileloc fl, bool iserror, bool indent)
+{
+
+  if (context_inSuppressZone (fl))
+    {
+      cstring_free (s);
+      return FALSE;
+    }
+  else
+    {
+      ;
+    }
+
+  return (llgenerrorreal (s, fl, iserror, indent));
+}
+
+void
+llforceerror (flagcode code, /*@only@*/ cstring s, fileloc fl)
+{
+  flagcode_recordError (code);
+  (void) llgenerrorreal (s, fl, TRUE, FALSE);
+  closeMessage ();
+}
+
+static bool
+llgenerrorreal (/*@only@*/ cstring s, fileloc fl, bool iserror, bool indent)
+{
+  cstring flstring;
+
+  /* duplicate message (rescanning a header file */
+
+  if (!messageLog_add (context_messageLog (), fl, s))
+    {
+      cstring_free (s);
+      return FALSE;
+    }
+
+  if (iserror) context_hasError ();
+
+  if (context_unlimitedMessages ())
+    {
+      ;
+    }
+  else
+    {
+      /*
+      ** suppress excessive messages:
+      **    check up to ':'
+      **
+      */
+
+      char *sc = cstring_toCharsSafe (s);
+      char *tmpmsg = strchr (sc, ':');
+
+      if (tmpmsg == NULL)
+	{
+	  tmpmsg = sc;
+	}
+      else
+	{
+	  char *savechar = tmpmsg;
+	  *tmpmsg = '\0';
+	  tmpmsg = sc;
+	  *savechar = ':';
+	}
+
+      if (cstring_equal (lastmsg, cstring_fromChars (tmpmsg)))
+	{
+	  mcount++;
+	  if (mcount == (context_getLimit () + 1))
+	    {
+	      limitmessage (s, fl);
+	      return FALSE;
+	    }
+
+	  if (mcount > (context_getLimit ()))
+	    {
+	      cstring_free (s);
+	      return FALSE;
+	    }
+	}
+      else
+	{
+	  cleanupMessages ();
+	  mcount = 0;
+	  cstring_free (lastmsg);
+	  lastmsg = cstring_fromCharsNew (tmpmsg);
+	}
+    }
+
+  if (context_hasAliasAnnote ())
+    {
+      char *sc = cstring_toCharsSafe (s);
+      char *fcolon = strchr (sc, ':');
+      cstring a = context_getAliasAnnote ();
+
+
+      if (fcolon == NULL)
+	{
+	  s = message ("%q (%q)", s, a);
+	}
+      else
+	{
+	  cstring afterColon;
+
+	  *fcolon = '\0';
+	  afterColon = cstring_fromCharsNew (fcolon + 1);
+
+	  s = message ("%q (%q):%q", s, a, afterColon);
+	}
+          }
+
+  if (context_hasMessageAnnote ())
+    {
+      char *fcolon = strchr (cstring_toCharsSafe (s), ':');
+
+
+      if (fcolon == NULL)
+	{
+	  /*@-dependenttrans@*/ /* s becomes dependent for fcolon */
+	  s = message ("%q (%q)", s, context_getMessageAnnote ());
+	  /*@=dependenttrans@*/
+	}
+      else
+	{
+	  cstring afterColon;
+
+	  *fcolon = '\0';
+	  afterColon = cstring_fromCharsNew (fcolon + 1);
+
+	  /*@-dependenttrans@*/ /* s becomes dependent for fcolon */
+	  s = message ("%q (%q):%q", s,
+		       context_getMessageAnnote (), afterColon);
+	  /*@=dependenttrans@*/
+	}
+     }
+
+  context_setNeednl ();
+  prepareMessage ();
+
+  if (context_showFunction ())
+    {
+      cstring fname = fileloc_unparseFilename (g_currentloc);
+
+      if (context_inIterDef ())
+	{
+	  fprintf (g_msgstream, "%s: (in iter %s)\n",
+		   cstring_toCharsSafe (fname),
+		   cstring_toCharsSafe (context_inFunctionName ()));
+	}
+      else if (context_inIterEnd ())
+	{
+	  fprintf (g_msgstream, "%s: (in iter finalizer %s)\n",
+		   cstring_toCharsSafe (fname),
+		   cstring_toCharsSafe (context_inFunctionName ()));
+	}
+      else if (context_inMacro ())
+	{
+	  fprintf (g_msgstream, "%s: (in macro %s)\n", cstring_toCharsSafe (fname),
+		   cstring_toCharsSafe (context_inFunctionName ()));
+	}
+      else
+	{
+	  fprintf (g_msgstream, "%s: (in function %s)\n",
+		   cstring_toCharsSafe (fname),
+		   cstring_toCharsSafe (context_inFunctionName ()));
+	}
+
+      cstring_free (fname);
+      context_setShownFunction ();
+    }
+
+  flstring = fileloc_unparse (fl);
+
+  lastfileloclen = cstring_length (flstring);
+
+  if (indent)
+    {
+      printError (g_msgstream, message ("   %q: %q", flstring, s));
+    }
+  else
+    {
+      printError (g_msgstream, message ("%q: %q", flstring, s));
+    }
+
+  return TRUE;
+}
+
+/*
+** printMessage
+**
+** message contains no '\n'
+**    message fits in one line: print it
+**    message fits in two lines with 3-space indent after fileloc: print it
+**    split line with 5-space indent from left margin: print it
+**
+*/
+
+static
+void printMessage (FILE *stream, /*@only@*/ cstring s)
+{
+  printIndentMessage (stream, s, 0);
+}
+
+static
+void printIndentMessage (FILE *stream, /*@only@*/ cstring sc, int indent)
+{
+  int maxlen = context_getLineLen ();
+  char *s = cstring_toCharsSafe (sc);
+
+
+  do
+    {
+      char *t = NULL;
+      char *st = s;
+
+      mstring_split (&st, &t, maxlen, &indent);
+      fprintf (stream, "%s\n", st);
+      llassert (t != s);
+      s = t;
+    } while (s != NULL) ;
+
+  cstring_free (sc);
+}
+
+static
+void printError (FILE *stream, /*@only@*/ cstring sc)
+{
+  int maxlen = context_getLineLen ();
+  int nspaces = lastfileloclen + 5;
+  int nextlen = maxlen - nspaces;
+  int len = cstring_length (sc);
+  int indent = 0;
+  char *s = cstring_toCharsSafe (sc);
+  char *os = s;
+  char *t = NULL;
+
+  if (len < (maxlen + nextlen) && (strchr (s, '\n') == NULL))
+    {
+      mstring_split (&s, &t, maxlen, &indent);
+
+      fprintf (stream, "%s\n", s);
+
+      if (t != NULL)
+	{
+	  len = mstring_length (t);
+
+	  if (len < (maxlen - 3) && (strchr (t, '\n') == NULL)
+	      && len > (nextlen - 1))
+	    {
+	      fprintf (stream, "    %s\n", t);
+	    }
+	  else
+	    {
+	      char *spaces = (char *) dmalloc ((nspaces + 1) * sizeof (*spaces));
+	      int i;
+
+	      for (i = 0; i < nspaces; i++)
+		{
+		  spaces[i] = ' ';
+		}
+
+	      spaces[nspaces] = '\0';
+
+	      while (t != NULL)
+		{
+		  char *st = t;
+		  mstring_split (&st, &t, nextlen, &indent);
+		  fprintf (stream, "%s%s\n", spaces, st);
+		}
+
+	      sfree (spaces);
+	    }
+	}
+    }
+  else
+    {
+      if (len < (maxlen + maxlen - 1) && (strchr (s, '\n') != NULL))
+	{
+	  nspaces = ((maxlen + maxlen - 1) - len) / 2;
+
+	  if (nspaces < 1) nspaces = 1;
+
+	  nextlen = maxlen - nspaces;
+
+	  mstring_split (&s, &t, maxlen, &indent);
+
+	  fprintf (stream, "%s\n", s);
+
+	  if (t != NULL)
+	    {
+	      char *spaces = (char *) dmalloc ((nspaces + 1) * sizeof (*spaces));
+	      int i;
+
+	      for (i = 0; i < nspaces; i++)
+		{
+		  spaces[i] = ' ';
+		}
+
+	      spaces[nspaces] = '\0';
+
+	      while (t != NULL)
+		{
+		  char *st = t;
+
+		  mstring_split (&st, &t, nextlen, &indent);
+		  fprintf (stream, "%s%s\n", spaces, st);
+		}
+
+	      sfree (spaces);
+	    }
+	}
+      else
+	{
+	  nspaces = 4;
+	  nextlen = maxlen - nspaces;
+
+	  mstring_split (&s, &t, maxlen, &indent);
+
+	  fprintf (stream, "%s\n", s);
+
+	  if (t != NULL)
+	    {
+  	      char *spaces = (char *) dmalloc ((nspaces + 1) * sizeof (*spaces));
+	      int i;
+
+	      for (i = 0; i < nspaces; i++)
+		{
+		  spaces[i] = ' ';
+		}
+
+	      spaces[nspaces] = '\0';
+
+	      while (t != NULL)
+		{
+		  char *st = t;
+		  mstring_split (&st, &t, nextlen, &indent);
+		  fprintf (stream, "%s%s\n", spaces, st);
+		}
+
+	      sfree (spaces);
+	    }
+	}
+    }
+
+  sfree (os);
+}
+
+void
+llfatalbug (/*@only@*/ cstring s)
+{
+  prepareMessage ();
+  printError (stderr, message ("%q: *** Fatal bug: %q",
+			       fileloc_unparse (g_currentloc), s));
+  printCodePoint ();
+  printBugReport ();
+  llexit (LLFAILURE);
+}
+
+# ifndef NOLCL
+void
+lclfatalbug (char *msg)
+{
+  prepareMessage ();
+  printError (stderr,
+	      message ("*** Fatal Bug: %s", cstring_fromChars (msg)));
+  printCodePoint ();
+  printBugReport ();
+  llexit (LLFAILURE);
+}
+# endif
+
+void
+checkParseError (void)
+{
+  if (fileloc_withinLines (lastparseerror, g_currentloc, 10))
+    {
+      llfatalerror (message ("%q: Cannot recover from parse error.",
+			     fileloc_unparse (g_currentloc)));
+    }
+}
+
+void llbugaux (cstring file, int line, /*@only@*/ cstring s)
+{
+  /*@unchecked@*/
+  static int numbugs = 0;
+  static bool inbug = FALSE;
+
+  if (inbug)
+    {
+      cstring temps = fileloc_unparseRaw (file, line);
+
+      fprintf (stderr, "%s: Recursive bug detected: %s\n",
+	       cstring_toCharsSafe (temps),
+	       cstring_toCharsSafe (s));
+      cstring_free (temps);
+
+      llexit (LLFAILURE);
+    }
+
+  inbug = TRUE;
+
+  prepareMessage ();
+
+  if (fileloc_isRealLib (g_currentloc))
+    {
+      llfatalerror (message ("%q: Library file appears to be corrupted.  Error: %q:%s",
+			     fileloc_unparse (g_currentloc), 
+			     fileloc_unparseRaw (file, line), s));
+    }
+
+  if (fileloc_withinLines (lastparseerror, g_currentloc, 7))
+    {
+      llfatalerror (message ("%q: Cannot recover from parse error.",
+			     fileloc_unparse (g_currentloc)));
+    }
+
+  (void) fflush (g_msgstream);
+  printError (stderr, message ("%q: *** Internal Bug at %q: %q [errno: %d]",
+			       fileloc_unparse (g_currentloc),
+			       fileloc_unparseRaw (file, line),
+			       s, errno));
+  printCodePoint ();
+
+  (void) fflush (stderr);
+  perror ("Possible system error diagnostic: ");
+  (void) fflush (stderr);
+
+  printBugReport ();
+
+  numbugs++;
+
+  if (numbugs > 5 && fileloc_withinLines (lastbug, g_currentloc, 2))
+    {
+      llfatalerror (message ("%q: Cannot recover from last bug.",
+			     fileloc_unparse (g_currentloc)));
+    }
+
+  fprintf (stderr, "       (attempting to continue, results may be incorrect)\n");
+  fileloc_free (lastbug);
+  lastbug = fileloc_copy (g_currentloc);
+  closeMessage ();
+
+  (void) fflush (stderr);
+  inbug = FALSE;
+}
+
+# ifndef NOLCL
+void
+lclbug (/*@only@*/ cstring s)
+{
+  prepareMessage ();
+  printError (stderr, message ("*** Internal Bug: %q", s));
+  printCodePoint ();
+  printBugReport ();
+  fprintf (stderr, "       (attempting to continue, results may be incorrect)\n");
+  closeMessage ();
+}
+# endif
+
+void
+llfatalerror (cstring s)
+{
+  prepareMessage ();
+  printError (stderr, s);
+  printError (stderr, cstring_makeLiteral ("*** Cannot continue."));
+  llexit (LLFAILURE);
+}
+
+void
+llfatalerrorLoc (/*@only@*/ cstring s)
+{
+  prepareMessage ();
+  (void) fflush (g_msgstream);
+  printError (stderr, message ("%q: %q", fileloc_unparse (g_currentloc), s));
+  printError (stderr, cstring_makeLiteral ("*** Cannot continue."));
+  llexit (LLFAILURE);
+}
+
+/*
+** free's s!
+*/
+
+void
+llgloberror (/*@only@*/ cstring s)
+{
+  if (context_inSuppressRegion ())
+    {
+      cstring_free (s);
+    }
+  else
+    {
+      context_setNeednl ();
+      prepareMessage ();
+      context_hasError ();
+      flagcode_recordError (FLG_SPECIAL);
+      printError (g_msgstream, s);
+      closeMessage ();
+    }
+}
+
+# ifndef NOLCL
+bool
+lclHadError (void)
+{
+  return (lclerrors > 0);
+}
+
+bool
+lclHadNewError (void)
+{
+  static int lastcall = 0;
+
+  if (lclerrors > lastcall)
+    {
+      lastcall = lclerrors;
+      return TRUE;
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+int
+lclNumberErrors (void)
+{
+  return (lclerrors);
+}
+
+void
+lclerror (ltoken t, /*@only@*/ cstring msg)
+{
+  lclerrors++;
+
+  if (ltoken_getCode (t) != NOTTOKEN)
+    {
+      cstring loc = ltoken_unparseLoc (t);
+
+      lastfileloclen = cstring_length (loc);
+
+      printError (g_msgstream, message ("%q: %q", loc, msg));
+    }
+  else
+    {
+      printError (g_msgstream, msg);
+    }
+}
+
+void
+lclplainerror (/*@only@*/ cstring msg)
+{
+  lclerrors++;
+
+  printError (g_msgstream, msg);
+}
+
+void
+lclfatalerror (ltoken t, /*@only@*/ cstring msg)
+{
+  lclerror (t, msg);
+  (void) fflush (g_msgstream);
+  printError (stderr, cstring_makeLiteral ("*** Cannot continue"));
+  llexit (LLFAILURE);
+}
+
+void
+lclplainfatalerror (/*@only@*/ cstring msg)
+{
+  (void) fflush (g_msgstream);
+  printError (stderr, message ("*** Cannot continue: %q", msg));
+  llexit (LLFAILURE);
+}
+
+void
+lclRedeclarationError (ltoken id)
+{
+  cstring s = ltoken_getRawString (id);
+
+
+  if (usymtab_existsEither (s))
+    {
+      uentry le = usymtab_lookupEither (s);
+
+      lclerror (id, message ("Respecification of %s", s));
+      llgenindentmsg (message ("Previous specification of %q",
+			       uentry_getName (le)),
+		uentry_whereSpecified (le));
+    }
+  else
+    {
+      lclerror (id, message ("Identifier redeclared: %s", s));
+    }
+}
+# endif
+
+void genppllerror (flagcode code, /*@only@*/ cstring s)
+{
+  if (context_inSuppressZone (g_currentloc))
+    {
+      cstring_free (s);
+    }
+  else
+    {
+      if (context_getFlag (code))
+	{
+	  if (context_getFlag (FLG_SHOWSCAN) && !context_isInCommandLine ())
+	    {
+	      fprintf (g_msgstream, " >\n");
+	    }
+
+	  llerror (code, s);
+
+	  if (code != FLG_PREPROC)
+	    {
+	      llsuppresshint ('-', code);
+	    }
+
+	  if (context_getFlag (FLG_SHOWSCAN) && !context_isInCommandLine ())
+	    {
+	      fprintf (stderr, "< more preprocessing .");
+	    }
+	}
+      else
+	{
+	  cstring_free (s);
+	}
+    }
+}
+
+void genppllerrorhint (flagcode code, /*@only@*/ cstring s,
+		       /*@only@*/ cstring hint)
+{
+  if (context_inSuppressZone (g_currentloc))
+    {
+      cstring_free (s);
+      cstring_free (hint);
+    }
+  else
+    {
+      if (context_getFlag (code))
+	{
+	  prepareMessage ();
+	  context_clearPreprocessing ();
+	  llerror (code, s);
+	  llgenhint (hint);
+	  context_setPreprocessing ();
+	  closeMessage ();
+	}
+      else
+	{
+	  cstring_free (s);
+	  cstring_free (hint);
+	}
+    }
+}
+
+void ppllerror (/*@only@*/ cstring s)
+{
+  genppllerror (FLG_PREPROC, s);
+}
+
+void pplldiagmsg (cstring s)
+{
+  if (context_getDebug (FLG_SHOWSCAN) && !context_isInCommandLine ())
+    {
+      fprintf (stderr, " >\n");
+      lldiagmsg (s);
+      fprintf (stderr, "< more preprocessing .");
+    }
+  else
+    {
+      lldiagmsg (s);
+    }
+}
+
+void loadllmsg (cstring s)
+{
+  if (context_getDebug (FLG_SHOWSCAN))
+    {
+      fprintf (stderr, " >\n");
+      lldiagmsg (s);
+      fprintf (stderr, "< .");
+    }
+  else
+    {
+      lldiagmsg (s);
+    }
+}
+
+static void llreportparseerror (/*@only@*/ cstring s)
+{
+  if (fileloc_withinLines (lastparseerror, g_currentloc, 5))
+    {
+      cstring_free (s);
+    }
+  else
+    {
+      llerror (FLG_SYNTAX, s);
+
+      fileloc_free (lastparseerror);
+      lastparseerror = fileloc_copy (g_currentloc);
+    }
+}
+
+bool lloptgenerror (flagcode o, /*@only@*/ cstring s, fileloc loc)
+{
+  if (llrealerror (s, loc))
+    {
+      llsuppresshint ('-', o);
+      closeMessage ();
+      flagcode_recordError (o);
+      return TRUE;
+    }
+
+  flagcode_recordSuppressed (o);
+  return FALSE;
+}
+
+bool optgenerror2 (flagcode f1, flagcode f2, /*@only@*/ cstring s, fileloc loc)
+{
+  if (context_suppressFlagMsg (f1, loc))
+    {
+      flagcode_recordSuppressed (f1);
+      cstring_free (s);
+    }
+  else
+    {
+      if (context_suppressFlagMsg (f2, loc))
+	{
+	  flagcode_recordSuppressed (f2);
+	  cstring_free (s);
+	}
+      else
+	{
+	  if (llrealerror (s, loc))
+	    {
+	      llsuppresshint ('-', f2);
+	      flagcode_recordError (f2);
+	      closeMessage ();
+	      return TRUE;
+	    }
+
+	  flagcode_recordSuppressed (f2);
+	}
+    }
+  return FALSE;
+}
+
+bool optgenerror2n (flagcode f1, flagcode f2, /*@only@*/ cstring s, fileloc loc)
+{
+
+  if (context_suppressFlagMsg (f1, loc))
+    {
+      flagcode_recordSuppressed (f1);
+      cstring_free (s);
+    }
+  else
+    {
+      if (context_suppressNotFlagMsg (f2, loc))
+	{
+	  flagcode_recordSuppressed (f2);
+	  cstring_free (s);
+	}
+      else
+	{
+	  if (llrealerror (s, loc))
+	    {
+	      llsuppresshint ('+', f2);
+	      flagcode_recordError (f2);
+	      closeMessage ();
+	      return TRUE;
+	    }
+
+	  flagcode_recordSuppressed (f2);
+	}
+    }
+  return FALSE;
+}
+
+bool llnoptgenerror (flagcode o, /*@only@*/ cstring s, fileloc loc)
+{
+  if (llrealerror (s, loc))
+    {
+      llsuppresshint ('+', o);
+      flagcode_recordError (o);
+      closeMessage ();
+      return TRUE;
+    }
+
+  flagcode_recordSuppressed (o);
+  return FALSE;
+}
+
+void llparseerror (cstring s)
+{
+  if (context_getFlag (FLG_TRYTORECOVER))
+    {
+      parseerrorcount++;
+
+      if (parseerrorcount > GIVEUPPARSE)
+	{
+	  if (cstring_isDefined (s))
+	    {
+	      llfatalerror (message ("%q: Parse Error: %q.  "
+				     "Too many errors, giving up.",
+				     fileloc_unparse (g_currentloc), s));
+	    }
+	  else
+	    {
+	      llfatalerror (message ("%q: Parse Error.  Too many errors, giving up.",
+				     fileloc_unparse (g_currentloc)));
+	    }
+	}
+      else
+	{
+	  if (cstring_isDefined (s))
+	    {
+	      llreportparseerror (message ("Parse Error: %q. Attempting to continue.",
+					   s));
+	    }
+	  else
+	    {
+	      llreportparseerror (message ("Parse Error. Attempting to continue."));
+	    }
+	}
+    }
+  else
+    {
+      cstring msg;
+
+      if (cstring_isDefined (s))
+	{
+	  msg = message ("Parse Error: %q.", s);
+	}
+      else
+	{
+	  msg = message ("Parse Error.");
+	}
+
+      llfatalerror
+	(message ("%q: %s (For help on parse errors, "
+		  "see lclint -help parseerrors.)",
+		  fileloc_unparse (g_currentloc), msg));
+    }
+}
+
+bool doCheck (bool x, cstring pred, cstring file, int line)
+{
+  if (!x) {
+    llbug (message ("%q: Check Failed: %s",
+		    fileloc_unparseRaw (file, line),
+		    pred));
+  }
+
+  return x;
+}
+
+/*@observer@*/ cstring lldecodeerror (/*@unused@*/ int errnum)
+{
+  char *result;
+
+#ifndef VMS
+#ifndef HAVE_STRERROR
+  result = NULL;
+#else
+  result = strerror (errnum);
+#endif
+#else	/* VMS */
+  /* VAXCRTL's strerror() takes an optional second argument, which only
+     matters when the first argument is EVMSERR.  However, it's simplest
+     just to pass it unconditionally.  `vaxc$errno' is declared in
+     , and maintained by the library in parallel with `errno'.
+     We assume that caller's `errnum' either matches the last setting of
+     `errno' by the library or else does not have the value `EVMSERR'.  */
+
+  result = strerror (errnum, vaxc$errno);
+#endif
+
+  if (result == NULL)
+    {
+      result = cstring_toCharsSafe (message ("undocumented I/O error: %d", errnum));
+    }
+
+  return cstring_fromChars (result);
+}
+
+void llquietbugaux (cstring s, /*@unused@*/ cstring file, /*@unused@*/ int line)
+{
+# if 0
+# ifdef HOMEVERSION
+  llflush ();
+  printError (stderr, message ("%q: *** Internal Bug at %q: %q [errno: %d]",
+			       fileloc_unparse (g_currentloc),
+			       fileloc_unparseRaw (file, line),
+			       s, errno));
+  printCodePoint ();
+  llflush ();
+# endif
+# else
+  cstring_free (s);
+# endif
+}
+
+void llflush (void)
+{
+  (void) fflush (g_msgstream);
+  (void) fflush (stderr);
+}
diff --git a/src/llgrammar.c b/src/llgrammar.c
new file mode 100644
index 0000000..d7b1154
--- /dev/null
+++ b/src/llgrammar.c
@@ -0,0 +1,3852 @@
+/*
+** Inserted at beginning of c files generated by bison
+** REMEMBER:  Change bison.reset too.
+*/
+
+/*@-allmacros@*/
+/*@+boolint@*/
+/*@+charint@*/
+/*@-macroparams@*/
+/*@-macroundef@*/
+/*@-unreachable@*/
+/*@-macrospec@*/
+/*@-varuse@*/
+/*@+ignorequals@*/
+/*@-macrostmt@*/
+/*@-noeffect@*/
+/*@-shadow@*/
+/*@-exitarg@*/
+/*@-macroredef@*/
+/*@-uniondef@*/
+/*@-compdef@*/
+/*@-matchfields@*/
+/*@-exportlocal@*/
+/*@-evalorderuncon@*/
+/*@-exportheader@*/
+/*@-typeuse@*/
+/*@-redecl@*/
+/*@-redef@*/
+/*@-noparams@*/
+/*@-ansireserved@*/
+/*@-fielduse@*/
+/*@-ifblock@*/
+/*@-elseifcomplete@*/
+/*@-whileblock@*/
+/*@-forblock@*/
+/*@-branchstate@*/
+/*@-readonlytrans@*/
+/*@-namechecks@*/
+/*@-usedef@*/
+/*@-systemunrecog@*/
+/*@-dependenttrans@*/
+/*@-unqualifiedtrans@*/
+/*@-nullassign@*/
+
+/* < end of bison.head > */
+
+
+/*  A Bison parser, made from llgrammar.y
+ by  GNU Bison version 1.25
+  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define yyparse ylparse
+#define yylex yllex
+#define yyerror ylerror
+#define yylval yllval
+#define yychar ylchar
+#define yydebug yldebug
+#define yynerrs ylnerrs
+#define	simpleOp	258
+#define	PREFIX_OP	259
+#define	POSTFIX_OP	260
+#define	LLT_MULOP	261
+#define	LLT_SEMI	262
+#define	LLT_VERTICALBAR	263
+#define	ITERATION_OP	264
+#define	LLT_LPAR	265
+#define	LLT_LBRACKET	266
+#define	selectSym	267
+#define	LLT_IF_THEN_ELSE	268
+#define	logicalOp	269
+#define	eqSepSym	270
+#define	equationSym	271
+#define	commentSym	272
+#define	LLT_WHITESPACE	273
+#define	LLT_EOL	274
+#define	LLT_TYPEDEF_NAME	275
+#define	quantifierSym	276
+#define	openSym	277
+#define	closeSym	278
+#define	sepSym	279
+#define	simpleId	280
+#define	mapSym	281
+#define	markerSym	282
+#define	preSym	283
+#define	postSym	284
+#define	anySym	285
+#define	LLT_COLON	286
+#define	LLT_COMMA	287
+#define	LLT_EQUALS	288
+#define	LLT_LBRACE	289
+#define	LLT_RBRACE	290
+#define	LLT_RBRACKET	291
+#define	LLT_RPAR	292
+#define	LLT_QUOTE	293
+#define	eqOp	294
+#define	LLT_CCHAR	295
+#define	LLT_CFLOAT	296
+#define	LLT_CINTEGER	297
+#define	LLT_LCSTRING	298
+#define	LLT_ALL	299
+#define	LLT_ANYTHING	300
+#define	LLT_BE	301
+#define	LLT_BODY	302
+#define	LLT_CLAIMS	303
+#define	LLT_CHECKS	304
+#define	LLT_CONSTANT	305
+#define	LLT_ELSE	306
+#define	LLT_ENSURES	307
+#define	LLT_FOR	308
+#define	LLT_FRESH	309
+#define	LLT_IF	310
+#define	LLT_IMMUTABLE	311
+#define	LLT_IMPORTS	312
+#define	LLT_CONSTRAINT	313
+#define	LLT_ISSUB	314
+#define	LLT_LET	315
+#define	LLT_MODIFIES	316
+#define	LLT_MUTABLE	317
+#define	LLT_NOTHING	318
+#define	LLT_INTERNAL	319
+#define	LLT_FILESYS	320
+#define	LLT_OBJ	321
+#define	LLT_OUT	322
+#define	LLT_SEF	323
+#define	LLT_ONLY	324
+#define	LLT_PARTIAL	325
+#define	LLT_OWNED	326
+#define	LLT_DEPENDENT	327
+#define	LLT_KEEP	328
+#define	LLT_KEPT	329
+#define	LLT_TEMP	330
+#define	LLT_SHARED	331
+#define	LLT_UNIQUE	332
+#define	LLT_UNUSED	333
+#define	LLT_EXITS	334
+#define	LLT_MAYEXIT	335
+#define	LLT_NEVEREXIT	336
+#define	LLT_TRUEEXIT	337
+#define	LLT_FALSEEXIT	338
+#define	LLT_UNDEF	339
+#define	LLT_KILLED	340
+#define	LLT_CHECKMOD	341
+#define	LLT_CHECKED	342
+#define	LLT_UNCHECKED	343
+#define	LLT_CHECKEDSTRICT	344
+#define	LLT_TRUENULL	345
+#define	LLT_FALSENULL	346
+#define	LLT_LNULL	347
+#define	LLT_LNOTNULL	348
+#define	LLT_RETURNED	349
+#define	LLT_OBSERVER	350
+#define	LLT_EXPOSED	351
+#define	LLT_REFCOUNTED	352
+#define	LLT_REFS	353
+#define	LLT_RELNULL	354
+#define	LLT_RELDEF	355
+#define	LLT_KILLREF	356
+#define	LLT_TEMPREF	357
+#define	LLT_NEWREF	358
+#define	LLT_PRIVATE	359
+#define	LLT_REQUIRES	360
+#define	LLT_RESULT	361
+#define	LLT_SIZEOF	362
+#define	LLT_SPEC	363
+#define	LLT_TAGGEDUNION	364
+#define	LLT_THEN	365
+#define	LLT_TYPE	366
+#define	LLT_TYPEDEF	367
+#define	LLT_UNCHANGED	368
+#define	LLT_USES	369
+#define	LLT_CHAR	370
+#define	LLT_CONST	371
+#define	LLT_DOUBLE	372
+#define	LLT_ENUM	373
+#define	LLT_FLOAT	374
+#define	LLT_INT	375
+#define	LLT_ITER	376
+#define	LLT_YIELD	377
+#define	LLT_LONG	378
+#define	LLT_SHORT	379
+#define	LLT_SIGNED	380
+#define	LLT_UNKNOWN	381
+#define	LLT_STRUCT	382
+#define	LLT_TELIPSIS	383
+#define	LLT_UNION	384
+#define	LLT_UNSIGNED	385
+#define	LLT_VOID	386
+#define	LLT_VOLATILE	387
+#define	LLT_PRINTFLIKE	388
+#define	LLT_SCANFLIKE	389
+#define	LLT_MESSAGELIKE	390
+
+#line 36 "llgrammar.y"
+
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "lclscan.h"
+# include "checking.h"
+# include "lslparse.h" 
+# include "lh.h"
+# include "usymtab_interface.h"
+
+/*@-noparams@*/
+static /*@unused@*/ void yyprint ();
+/*@=noparams@*/
+
+/*@-redecl@*/
+void ylerror (char *) /*@modifies *g_msgstream@*/ ;
+/*@=redecl@*/
+
+bool g_inTypeDef = FALSE;
+
+/*@constant int YYDEBUG;@*/
+# define YYDEBUG 1
+
+/*@notfunction@*/
+# define YYPRINT(file, type, value) yyprint (file, type, value)
+
+/*
+** This is necessary, or else when the bison-generated code #include's malloc.h,
+** there will be a parse error.
+**
+** Unfortunately, it means the error checking on malloc, etc. is lost for allocations
+** in bison-generated files under Win32.
+*/
+
+# ifdef WIN32
+# undef malloc
+# undef calloc
+# undef realloc
+# endif
+
+
+#line 78 "llgrammar.y"
+typedef union 
+{
+  ltoken ltok;  /* a leaf is also an ltoken */
+  qual typequal;
+  unsigned int count;
+  /*@only@*/ ltokenList ltokenList;
+  /*@only@*/ abstDeclaratorNode abstDecl; 
+  /*@only@*/ declaratorNode declare;
+  /*@only@*/ declaratorNodeList declarelist;
+  /*@only@*/ typeExpr typeexpr;
+  /*@only@*/ arrayQualNode array;
+  /*@only@*/ quantifierNode quantifier;
+  /*@only@*/ quantifierNodeList quantifiers;
+  /*@only@*/ varNode var;
+  /*@only@*/ varNodeList vars;
+  /*@only@*/ storeRefNode storeref;
+  /*@only@*/ storeRefNodeList storereflist;
+  /*@only@*/ termNode term;
+  /*@only@*/ termNodeList termlist;
+  /*@only@*/ programNode program; 
+  /*@only@*/ stmtNode stmt;
+  /*@only@*/ claimNode claim;
+  /*@only@*/ typeNode type;
+  /*@only@*/ iterNode iter;
+  /*@only@*/ fcnNode fcn;
+  /*@only@*/ fcnNodeList fcns;
+  /*@only@*/ letDeclNode letdecl;
+  /*@only@*/ letDeclNodeList letdecls;
+  /*@only@*/ lclPredicateNode lclpredicate;
+  /*@only@*/ modifyNode modify;
+  /*@only@*/ paramNode param;
+  /*@only@*/ paramNodeList paramlist;
+  /*@only@*/ declaratorInvNodeList declaratorinvs;	
+  /*@only@*/ declaratorInvNode declaratorinv;	
+  /*@only@*/ abstBodyNode abstbody;
+  /*@only@*/ abstractNode abstract;
+  /*@only@*/ exposedNode exposed;
+  /*    taggedUnionNode taggedunion; */
+  /*@only@*/ globalList globals;
+  /*@only@*/ constDeclarationNode constdeclaration;
+  /*@only@*/ varDeclarationNode vardeclaration;
+  /*@only@*/ varDeclarationNodeList vardeclarationlist;
+  /*@only@*/ initDeclNodeList initdecls;
+  /*@only@*/ initDeclNode initdecl;
+  /*@only@*/ stDeclNodeList structdecls;
+  /*@only@*/ stDeclNode structdecl;
+  /*@only@*/ strOrUnionNode structorunion;
+  /*@only@*/ enumSpecNode enumspec; 
+  /*@only@*/ lclTypeSpecNode lcltypespec;
+  /*@only@*/ typeNameNode typname;
+  /*@only@*/ opFormNode opform;
+  /*@only@*/ sigNode signature;
+  /*@only@*/ nameNode name;
+  /*@only@*/ typeNameNodeList namelist;
+  /*@only@*/ replaceNode replace;	
+  /*@only@*/ replaceNodeList replacelist;
+  /*@only@*/ renamingNode renaming;
+  /*@only@*/ traitRefNode traitref;
+  /*@only@*/ traitRefNodeList traitreflist;
+  /*@only@*/ importNode import;
+  /*@only@*/ importNodeList importlist;
+  /*@only@*/ interfaceNode iface;
+  /*@only@*/ interfaceNodeList interfacelist; 
+  /*@only@*/ CTypesNode ctypes;
+} YYSTYPE;
+#ifndef YYDEBUG
+#define YYDEBUG 1
+#endif
+
+#include 
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define	YYFINAL		683
+#define	YYFLAG		-32768
+#define	YYNTBASE	136
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 390 ? yytranslate[x] : 290)
+
+static const short yytranslate[] = {     0,
+     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,     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,     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,     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,     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,     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,     1,     2,     3,     4,     5,
+     6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+    16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+    26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+    36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+    46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+    56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+    66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+    76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+    86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+    96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+   106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+   126,   127,   128,   129,   130,   131,   132,   133,   134,   135
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = {     0,
+     0,     1,     5,     6,     9,    11,    13,    14,    17,    20,
+    21,    24,    26,    28,    30,    34,    38,    40,    42,    44,
+    46,    48,    50,    57,    58,    60,    62,    66,    69,    71,
+    72,    76,    78,    80,    82,    84,    89,    93,    98,   103,
+   105,   107,   109,   111,   113,   114,   128,   129,   144,   145,
+   159,   164,   165,   166,   173,   174,   175,   183,   184,   185,
+   193,   194,   195,   202,   203,   204,   211,   214,   217,   219,
+   223,   225,   229,   231,   233,   237,   239,   241,   245,   247,
+   252,   256,   263,   265,   269,   271,   273,   277,   279,   283,
+   285,   289,   293,   297,   302,   304,   306,   308,   310,   312,
+   316,   318,   322,   323,   326,   330,   333,   336,   337,   340,
+   345,   346,   350,   352,   356,   362,   366,   368,   369,   373,
+   374,   378,   379,   383,   387,   391,   393,   397,   399,   401,
+   404,   406,   408,   409,   413,   414,   418,   419,   421,   423,
+   425,   429,   431,   435,   436,   441,   447,   449,   453,   456,
+   460,   464,   469,   473,   479,   486,   488,   492,   494,   496,
+   499,   502,   506,   510,   514,   519,   521,   525,   530,   534,
+   535,   538,   539,   541,   542,   549,   551,   555,   556,   560,
+   561,   565,   567,   569,   571,   573,   575,   577,   579,   581,
+   583,   585,   587,   590,   592,   594,   596,   598,   600,   602,
+   604,   606,   608,   610,   612,   614,   616,   618,   620,   622,
+   624,   626,   628,   630,   632,   634,   636,   638,   640,   642,
+   644,   646,   648,   650,   652,   654,   656,   658,   660,   662,
+   664,   666,   668,   670,   673,   679,   681,   684,   686,   689,
+   690,   697,   698,   705,   708,   711,   712,   714,   716,   719,
+   723,   725,   729,   730,   732,   739,   742,   744,   748,   750,
+   752,   754,   758,   761,   764,   768,   773,   775,   779,   782,
+   785,   789,   794,   796,   799,   802,   806,   811,   814,   817,
+   820,   823,   827,   829,   830,   832,   836,   839,   841,   843,
+   846,   850,   854,   859,   862,   866,   873,   875,   878,   881,
+   885,   889,   894,   899,   905,   909,   914,   919,   925,   928,
+   931,   935,   939,   941,   943,   945,   947,   949,   951,   953,
+   954,   956,   958,   962,   964,   966,   971,   972,   974,   976,
+   980,   982,   984,   991,   993,   997,   999,  1004,  1008,  1012,
+  1014,  1017,  1020,  1022,  1024,  1026,  1029,  1031,  1034,  1037,
+  1041,  1043,  1045,  1048,  1051,  1055,  1057,  1060,  1064,  1066,
+  1072,  1076,  1081,  1084,  1088,  1091,  1093,  1097,  1101,  1103,
+  1108,  1110,  1113,  1117,  1121,  1125,  1130,  1134,  1136,  1140,
+  1142,  1144,  1146,  1148,  1150,  1152,  1157,  1162,  1167,  1172,
+  1179,  1184,  1186,  1188,  1190,  1192,  1194,  1197,  1198,  1202,
+  1204,  1208,  1212,  1217,  1219,  1221,  1223,  1225,  1227,  1229,
+  1231,  1233
+};
+
+static const short yyrhs[] = {    -1,
+   138,   137,   140,     0,     0,   138,   139,     0,   143,     0,
+   144,     0,     0,   145,   141,     0,   150,   141,     0,     0,
+   141,   142,     0,   145,     0,   150,     0,   144,     0,    57,
+   174,     7,     0,   114,   178,     7,     0,   153,     0,   154,
+     0,   155,     0,   157,     0,   160,     0,   146,     0,   121,
+   284,    10,   147,    37,     7,     0,     0,   148,     0,   149,
+     0,   148,    32,   149,     0,   122,   243,     0,   243,     0,
+     0,   108,   151,   152,     0,   153,     0,   154,     0,   155,
+     0,   157,     0,    50,   226,   188,     7,     0,   226,   188,
+     7,     0,   116,   226,   188,     7,     0,   132,   226,   188,
+     7,     0,   162,     0,   171,     0,   133,     0,   134,     0,
+   135,     0,     0,   226,   239,   190,   158,    34,   192,   194,
+   198,   199,   200,   203,   204,    35,     0,     0,   156,   226,
+   239,   190,   159,    34,   192,   194,   198,   199,   200,   203,
+   204,    35,     0,     0,    48,   286,    10,   205,    37,   190,
+   161,    34,   194,   199,   208,   203,    35,     0,    48,   283,
+   286,     7,     0,     0,     0,    62,   163,   111,    20,   164,
+   213,     0,     0,     0,    62,   165,    97,   111,    20,   166,
+   213,     0,     0,     0,    97,    62,   167,   111,    20,   168,
+   213,     0,     0,     0,    56,   169,   111,    20,   170,   213,
+     0,     0,     0,   112,   226,   172,   218,   173,     7,     0,
+   229,     7,     0,   237,     7,     0,   175,     0,   174,    32,
+   175,     0,   177,     0,     3,   177,     3,     0,    43,     0,
+   177,     0,   176,    32,   177,     0,   282,     0,   179,     0,
+   178,    32,   179,     0,   288,     0,   288,    10,   181,    37,
+     0,    10,   180,    37,     0,    10,   180,    37,    10,   181,
+    37,     0,   288,     0,   180,    32,   288,     0,   183,     0,
+   182,     0,   182,    32,   183,     0,   244,     0,   182,    32,
+   244,     0,   184,     0,   183,    32,   184,     0,   244,    53,
+   222,     0,   244,    53,   185,     0,   244,    53,   185,   255,
+     0,   289,     0,   248,     0,   187,     0,   259,     0,   189,
+     0,   188,    32,   189,     0,   239,     0,   239,    33,   186,
+     0,     0,   190,   191,     0,   226,   188,     7,     0,    64,
+     7,     0,    65,     7,     0,     0,   192,   193,     0,   104,
+   226,   188,     7,     0,     0,    60,   195,     7,     0,   196,
+     0,   195,    32,   196,     0,   284,    31,   197,    46,   259,
+     0,   284,    46,   259,     0,   226,     0,     0,    49,   258,
+     7,     0,     0,   105,   258,     7,     0,     0,    61,    63,
+     7,     0,    61,    45,     7,     0,    61,   201,     7,     0,
+   202,     0,   201,    32,   202,     0,   259,     0,   227,     0,
+    66,   227,     0,    64,     0,    65,     0,     0,    52,   258,
+     7,     0,     0,    48,   258,     7,     0,     0,   206,     0,
+   207,     0,   128,     0,   207,    32,   128,     0,   243,     0,
+   207,    32,   243,     0,     0,    47,    34,   209,    35,     0,
+    47,    34,   209,     7,    35,     0,   210,     0,    10,   209,
+    37,     0,   209,     6,     0,   209,     8,   209,     0,   209,
+     7,   209,     0,   283,    10,   211,    37,     0,   283,    10,
+    37,     0,   284,    33,   283,    10,    37,     0,   284,    33,
+   283,    10,   211,    37,     0,   212,     0,   211,    32,   212,
+     0,   276,     0,   284,     0,     3,   212,     0,   212,     3,
+     0,   212,     3,   212,     0,    10,   212,    37,     0,   283,
+    10,    37,     0,   283,    10,   211,    37,     0,     7,     0,
+    34,   214,    35,     0,    34,   176,    35,     7,     0,    34,
+    35,     7,     0,     0,   214,   157,     0,     0,   216,     0,
+     0,    58,   217,   278,    10,   258,    37,     0,   219,     0,
+   218,    32,   219,     0,     0,   239,   220,   221,     0,     0,
+    34,   215,    35,     0,   131,     0,   115,     0,   117,     0,
+   119,     0,   120,     0,   123,     0,   124,     0,   125,     0,
+   130,     0,   126,     0,   222,     0,   223,   222,     0,    20,
+     0,   223,     0,    67,     0,    78,     0,    68,     0,    69,
+     0,    71,     0,    72,     0,    73,     0,    74,     0,    95,
+     0,    79,     0,    80,     0,    82,     0,    83,     0,    81,
+     0,    75,     0,    76,     0,    77,     0,    87,     0,    88,
+     0,    89,     0,    90,     0,    91,     0,    99,     0,   100,
+     0,    97,     0,    98,     0,   103,     0,   101,     0,    92,
+     0,    93,     0,    94,     0,    96,     0,    70,     0,    84,
+     0,    85,     0,   224,     0,   229,     0,   237,     0,   225,
+   226,     0,     8,   227,    31,   227,     8,     0,   226,     0,
+   226,   228,     0,     6,     0,   228,     6,     0,     0,   127,
+   232,   230,    34,   233,    35,     0,     0,   129,   232,   231,
+    34,   233,    35,     0,   127,   285,     0,   129,   285,     0,
+     0,   285,     0,   234,     0,   233,   234,     0,   226,   235,
+     7,     0,   239,     0,   235,    32,   239,     0,     0,    32,
+     0,   118,   232,    34,   238,   236,    35,     0,   118,   285,
+     0,    25,     0,   238,    32,    25,     0,   241,     0,   240,
+     0,   284,     0,    10,   240,    37,     0,     6,   240,     0,
+   240,   247,     0,   240,    10,    37,     0,   240,    10,   206,
+    37,     0,    20,     0,    10,   241,    37,     0,     6,   241,
+     0,   241,   247,     0,   241,    10,    37,     0,   241,    10,
+   206,    37,     0,    20,     0,     6,   242,     0,   242,   247,
+     0,   242,    10,    37,     0,   242,    10,   206,    37,     0,
+   226,   242,     0,   226,   240,     0,   226,   245,     0,   226,
+   245,     0,    66,   226,   245,     0,   248,     0,     0,   246,
+     0,    10,   246,    37,     0,     6,   246,     0,     6,     0,
+   247,     0,   246,   247,     0,   246,    10,    37,     0,    10,
+   206,    37,     0,   246,    10,   206,    37,     0,    11,    36,
+     0,    11,   187,    36,     0,    55,    27,   110,    27,    51,
+    27,     0,   251,     0,    27,   251,     0,   251,    27,     0,
+    27,   251,    27,     0,   249,   252,   250,     0,    27,   249,
+   252,   250,     0,   249,   252,   250,    27,     0,    27,   249,
+   252,   250,    27,     0,    11,   252,    36,     0,    11,   252,
+    36,    27,     0,    27,    11,   252,    36,     0,    27,    11,
+   252,    36,    27,     0,    12,   282,     0,    26,   282,     0,
+    27,    12,   282,     0,    27,    26,   282,     0,    22,     0,
+    34,     0,    23,     0,    35,     0,   263,     0,    14,     0,
+    39,     0,     0,   253,     0,    27,     0,   253,   254,    27,
+     0,    32,     0,    24,     0,    31,   256,    26,   287,     0,
+     0,   257,     0,   287,     0,   257,    32,   287,     0,   259,
+     0,   260,     0,    55,   260,   110,   260,    51,   260,     0,
+   261,     0,   260,    14,   260,     0,   262,     0,   277,    10,
+   258,    37,     0,   262,    39,   262,     0,   262,    33,   262,
+     0,   264,     0,   267,   265,     0,   267,   266,     0,     3,
+     0,     6,     0,   267,     0,   263,   264,     0,   263,     0,
+   265,   263,     0,   263,   267,     0,   266,   263,   267,     0,
+   272,     0,   268,     0,   268,   272,     0,   272,   268,     0,
+   272,   268,   272,     0,   269,     0,   269,   272,     0,   270,
+    31,   287,     0,   270,     0,    11,   271,    36,    31,   287,
+     0,    11,   271,    36,     0,    11,    36,    31,   287,     0,
+    11,    36,     0,   249,   271,   250,     0,   249,   250,     0,
+   259,     0,   271,   254,   259,     0,    10,   260,    37,     0,
+   284,     0,   289,    10,   273,    37,     0,   275,     0,   272,
+   274,     0,   272,    12,   282,     0,   272,    26,   282,     0,
+   272,    11,    36,     0,   272,    11,   273,    36,     0,   272,
+    31,   287,     0,   260,     0,   273,    32,   260,     0,    28,
+     0,    29,     0,    30,     0,    38,     0,   276,     0,   106,
+     0,    54,    10,   273,    37,     0,   113,    10,    44,    37,
+     0,   113,    10,   201,    37,     0,   107,    10,   259,    37,
+     0,    59,    10,   259,    32,   259,    37,     0,   107,    10,
+   226,    37,     0,    42,     0,    43,     0,    40,     0,    41,
+     0,   278,     0,   277,   278,     0,     0,    21,   279,   280,
+     0,   281,     0,   280,    32,   281,     0,   284,    31,   197,
+     0,   284,    31,    66,   197,     0,    25,     0,    20,     0,
+    25,     0,    25,     0,   282,     0,   282,     0,   282,     0,
+   282,     0,   282,     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+   382,   383,   386,   387,   390,   391,   394,   395,   396,   399,
+   400,   403,   404,   405,   408,   414,   418,   420,   422,   424,
+   426,   428,   432,   436,   437,   440,   442,   446,   447,   450,
+   451,   454,   456,   458,   460,   464,   468,   470,   472,   476,
+   477,   480,   481,   482,   485,   486,   493,   495,   506,   508,
+   511,   515,   515,   516,   517,   517,   519,   520,   521,   522,
+   523,   523,   524,   527,   528,   529,   530,   532,   548,   550,
+   554,   555,   557,   560,   561,   564,   568,   570,   574,   576,
+   578,   580,   584,   585,   588,   590,   592,   595,   597,   600,
+   602,   605,   606,   607,   611,   612,   614,   616,   619,   621,
+   625,   626,   629,   631,   635,   636,   637,   640,   641,   644,
+   648,   649,   652,   653,   656,   657,   659,   662,   663,   666,
+   667,   670,   671,   672,   673,   676,   677,   680,   681,   682,
+   683,   684,   687,   688,   691,   692,   695,   696,   699,   700,
+   701,   704,   705,   708,   709,   710,   713,   714,   717,   722,
+   728,   736,   738,   740,   742,   746,   747,   750,   751,   752,
+   753,   754,   755,   756,   758,   762,   763,   764,   765,   768,
+   769,   772,   773,   776,   776,   785,   786,   790,   791,   794,
+   795,   798,   799,   800,   801,   802,   803,   804,   805,   806,
+   807,   815,   816,   821,   823,   829,   830,   831,   832,   833,
+   834,   835,   836,   837,   838,   839,   840,   841,   842,   843,
+   844,   845,   846,   847,   848,   849,   850,   851,   852,   853,
+   854,   855,   856,   857,   858,   859,   860,   861,   862,   863,
+   866,   868,   870,   872,   874,   883,   884,   889,   890,   893,
+   895,   897,   899,   901,   903,   907,   908,   911,   912,   917,
+   920,   922,   926,   927,   930,   932,   936,   937,   947,   948,
+   951,   952,   953,   954,   955,   956,   959,   960,   961,   962,
+   963,   964,   973,   974,   975,   976,   977,   983,   984,   985,
+   995,   996,   997,  1002,  1003,  1006,  1007,  1008,  1009,  1010,
+  1011,  1012,  1013,  1016,  1017,  1020,  1022,  1024,  1026,  1028,
+  1031,  1033,  1035,  1037,  1039,  1041,  1049,  1051,  1053,  1056,
+  1059,  1062,  1067,  1068,  1071,  1072,  1075,  1076,  1077,  1080,
+  1081,  1084,  1085,  1088,  1089,  1092,  1095,  1096,  1099,  1100,
+  1103,  1106,  1112,  1114,  1115,  1118,  1119,  1124,  1126,  1130,
+  1131,  1132,  1135,  1136,  1139,  1140,  1143,  1144,  1147,  1148,
+  1151,  1152,  1153,  1154,  1155,  1156,  1157,  1160,  1161,  1164,
+  1167,  1169,  1173,  1177,  1178,  1181,  1182,  1185,  1187,  1189,
+  1191,  1192,  1194,  1196,  1198,  1201,  1203,  1207,  1208,  1211,
+  1212,  1213,  1214,  1217,  1218,  1219,  1220,  1221,  1222,  1227,
+  1233,  1243,  1244,  1245,  1246,  1249,  1251,  1255,  1259,  1262,
+  1263,  1266,  1267,  1270,  1271,  1274,  1275,  1276,  1277,  1278,
+  1279,  1280
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = {   "$","error","$undefined.","simpleOp",
+"PREFIX_OP","POSTFIX_OP","LLT_MULOP","LLT_SEMI","LLT_VERTICALBAR","ITERATION_OP",
+"LLT_LPAR","LLT_LBRACKET","selectSym","LLT_IF_THEN_ELSE","logicalOp","eqSepSym",
+"equationSym","commentSym","LLT_WHITESPACE","LLT_EOL","LLT_TYPEDEF_NAME","quantifierSym",
+"openSym","closeSym","sepSym","simpleId","mapSym","markerSym","preSym","postSym",
+"anySym","LLT_COLON","LLT_COMMA","LLT_EQUALS","LLT_LBRACE","LLT_RBRACE","LLT_RBRACKET",
+"LLT_RPAR","LLT_QUOTE","eqOp","LLT_CCHAR","LLT_CFLOAT","LLT_CINTEGER","LLT_LCSTRING",
+"LLT_ALL","LLT_ANYTHING","LLT_BE","LLT_BODY","LLT_CLAIMS","LLT_CHECKS","LLT_CONSTANT",
+"LLT_ELSE","LLT_ENSURES","LLT_FOR","LLT_FRESH","LLT_IF","LLT_IMMUTABLE","LLT_IMPORTS",
+"LLT_CONSTRAINT","LLT_ISSUB","LLT_LET","LLT_MODIFIES","LLT_MUTABLE","LLT_NOTHING",
+"LLT_INTERNAL","LLT_FILESYS","LLT_OBJ","LLT_OUT","LLT_SEF","LLT_ONLY","LLT_PARTIAL",
+"LLT_OWNED","LLT_DEPENDENT","LLT_KEEP","LLT_KEPT","LLT_TEMP","LLT_SHARED","LLT_UNIQUE",
+"LLT_UNUSED","LLT_EXITS","LLT_MAYEXIT","LLT_NEVEREXIT","LLT_TRUEEXIT","LLT_FALSEEXIT",
+"LLT_UNDEF","LLT_KILLED","LLT_CHECKMOD","LLT_CHECKED","LLT_UNCHECKED","LLT_CHECKEDSTRICT",
+"LLT_TRUENULL","LLT_FALSENULL","LLT_LNULL","LLT_LNOTNULL","LLT_RETURNED","LLT_OBSERVER",
+"LLT_EXPOSED","LLT_REFCOUNTED","LLT_REFS","LLT_RELNULL","LLT_RELDEF","LLT_KILLREF",
+"LLT_TEMPREF","LLT_NEWREF","LLT_PRIVATE","LLT_REQUIRES","LLT_RESULT","LLT_SIZEOF",
+"LLT_SPEC","LLT_TAGGEDUNION","LLT_THEN","LLT_TYPE","LLT_TYPEDEF","LLT_UNCHANGED",
+"LLT_USES","LLT_CHAR","LLT_CONST","LLT_DOUBLE","LLT_ENUM","LLT_FLOAT","LLT_INT",
+"LLT_ITER","LLT_YIELD","LLT_LONG","LLT_SHORT","LLT_SIGNED","LLT_UNKNOWN","LLT_STRUCT",
+"LLT_TELIPSIS","LLT_UNION","LLT_UNSIGNED","LLT_VOID","LLT_VOLATILE","LLT_PRINTFLIKE",
+"LLT_SCANFLIKE","LLT_MESSAGELIKE","interface","@1","externals","external","optDeclarations",
+"declarations","declaration","imports","uses","export","iter","iterParamList",
+"realIterParamList","iterParam","private","@2","private2","constDeclaration",
+"varDeclaration","type","special","fcn","@3","@4","claim","@5","abstract","@6",
+"@7","@8","@9","@10","@11","@12","@13","exposed","@14","@15","importNameList",
+"importName","interfaceNameList","interfaceName","traitRefNodeList","traitRef",
+"traitIdList","renaming","nameList","replaceNodeList","replace","name","initializer",
+"constLclExpr","initDecls","initDecl","globals","globalDecl","privateInits",
+"privateInit","optLetDecl","beDeclList","beDecl","sortSpec","optChecks","optRequire",
+"optModify","storeRefList","storeRef","optEnsure","optClaim","optParamList",
+"realParamList","paramList","optBody","callExpr","stmt","valueList","value",
+"abstBody","fcns","optTypeInv","typeInv","@16","declaratorInvs","declaratorInv",
+"@17","optExposedBody","CType","CTypes","typeSpecifier","specialQualifier","lclTypeSpec",
+"lclType","pointers","structOrUnionSpec","@18","@19","optTagId","structDecls",
+"structDecl","declaratorList","optCOMMA","enumSpec","enumeratorList","declarator",
+"notype_decl","after_type_decl","parameter_decl","param","typeName","optAbstDeclarator",
+"abstDeclarator","arrayQual","opForm","open","close","anyOp","middle","placeList",
+"separator","signature","domain","sortList","lclPredicate","term","term0","equalityTerm",
+"simpleOpTerm","simpleOp2","prefixOpTerm","postfixOps","infixOpPart","secondary",
+"bracketed","sqBracketed","matched","args","primary","termList","stateFcn","lclPrimary",
+"cLiteral","quantifiers","quantifier","@20","quantifiedList","quantified","simpleIdOrTypedefName",
+"fcnId","varId","tagId","claimId","sortId","traitId","opId", NULL
+};
+#endif
+
+static const short yyr1[] = {     0,
+   137,   136,   138,   138,   139,   139,   140,   140,   140,   141,
+   141,   142,   142,   142,   143,   144,   145,   145,   145,   145,
+   145,   145,   146,   147,   147,   148,   148,   149,   149,   151,
+   150,   152,   152,   152,   152,   153,   154,   154,   154,   155,
+   155,   156,   156,   156,   158,   157,   159,   157,   161,   160,
+   160,   163,   164,   162,   165,   166,   162,   167,   168,   162,
+   169,   170,   162,   172,   173,   171,   171,   171,   174,   174,
+   175,   175,   175,   176,   176,   177,   178,   178,   179,   179,
+   179,   179,   180,   180,   181,   181,   181,   182,   182,   183,
+   183,   184,   184,   184,   185,   185,   186,   187,   188,   188,
+   189,   189,   190,   190,   191,   191,   191,   192,   192,   193,
+   194,   194,   195,   195,   196,   196,   197,   198,   198,   199,
+   199,   200,   200,   200,   200,   201,   201,   202,   202,   202,
+   202,   202,   203,   203,   204,   204,   205,   205,   206,   206,
+   206,   207,   207,   208,   208,   208,   209,   209,   209,   209,
+   209,   210,   210,   210,   210,   211,   211,   212,   212,   212,
+   212,   212,   212,   212,   212,   213,   213,   213,   213,   214,
+   214,   215,   215,   217,   216,   218,   218,   220,   219,   221,
+   221,   222,   222,   222,   222,   222,   222,   222,   222,   222,
+   222,   223,   223,   224,   224,   225,   225,   225,   225,   225,
+   225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
+   225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
+   225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
+   226,   226,   226,   226,   226,   227,   227,   228,   228,   230,
+   229,   231,   229,   229,   229,   232,   232,   233,   233,   234,
+   235,   235,   236,   236,   237,   237,   238,   238,   239,   239,
+   240,   240,   240,   240,   240,   240,   241,   241,   241,   241,
+   241,   241,   242,   242,   242,   242,   242,   243,   243,   243,
+   244,   244,   244,   245,   245,   246,   246,   246,   246,   246,
+   246,   246,   246,   247,   247,   248,   248,   248,   248,   248,
+   248,   248,   248,   248,   248,   248,   248,   248,   248,   248,
+   248,   248,   249,   249,   250,   250,   251,   251,   251,   252,
+   252,   253,   253,   254,   254,   255,   256,   256,   257,   257,
+   258,   259,   260,   260,   260,   261,   261,   261,   261,   262,
+   262,   262,   263,   263,   264,   264,   265,   265,   266,   266,
+   267,   267,   267,   267,   267,   267,   267,   268,   268,   269,
+   269,   269,   269,   270,   270,   271,   271,   272,   272,   272,
+   272,   272,   272,   272,   272,   272,   272,   273,   273,   274,
+   274,   274,   274,   275,   275,   275,   275,   275,   275,   275,
+   275,   276,   276,   276,   276,   277,   277,   279,   278,   280,
+   280,   281,   281,   282,   282,   283,   284,   285,   286,   287,
+   288,   289
+};
+
+static const short yyr2[] = {     0,
+     0,     3,     0,     2,     1,     1,     0,     2,     2,     0,
+     2,     1,     1,     1,     3,     3,     1,     1,     1,     1,
+     1,     1,     6,     0,     1,     1,     3,     2,     1,     0,
+     3,     1,     1,     1,     1,     4,     3,     4,     4,     1,
+     1,     1,     1,     1,     0,    13,     0,    14,     0,    13,
+     4,     0,     0,     6,     0,     0,     7,     0,     0,     7,
+     0,     0,     6,     0,     0,     6,     2,     2,     1,     3,
+     1,     3,     1,     1,     3,     1,     1,     3,     1,     4,
+     3,     6,     1,     3,     1,     1,     3,     1,     3,     1,
+     3,     3,     3,     4,     1,     1,     1,     1,     1,     3,
+     1,     3,     0,     2,     3,     2,     2,     0,     2,     4,
+     0,     3,     1,     3,     5,     3,     1,     0,     3,     0,
+     3,     0,     3,     3,     3,     1,     3,     1,     1,     2,
+     1,     1,     0,     3,     0,     3,     0,     1,     1,     1,
+     3,     1,     3,     0,     4,     5,     1,     3,     2,     3,
+     3,     4,     3,     5,     6,     1,     3,     1,     1,     2,
+     2,     3,     3,     3,     4,     1,     3,     4,     3,     0,
+     2,     0,     1,     0,     6,     1,     3,     0,     3,     0,
+     3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+     1,     1,     2,     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,     5,     1,     2,     1,     2,     0,
+     6,     0,     6,     2,     2,     0,     1,     1,     2,     3,
+     1,     3,     0,     1,     6,     2,     1,     3,     1,     1,
+     1,     3,     2,     2,     3,     4,     1,     3,     2,     2,
+     3,     4,     1,     2,     2,     3,     4,     2,     2,     2,
+     2,     3,     1,     0,     1,     3,     2,     1,     1,     2,
+     3,     3,     4,     2,     3,     6,     1,     2,     2,     3,
+     3,     4,     4,     5,     3,     4,     4,     5,     2,     2,
+     3,     3,     1,     1,     1,     1,     1,     1,     1,     0,
+     1,     1,     3,     1,     1,     4,     0,     1,     1,     3,
+     1,     1,     6,     1,     3,     1,     4,     3,     3,     1,
+     2,     2,     1,     1,     1,     2,     1,     2,     2,     3,
+     1,     1,     2,     2,     3,     1,     2,     3,     1,     5,
+     3,     4,     2,     3,     2,     1,     3,     3,     1,     4,
+     1,     2,     3,     3,     3,     4,     3,     1,     3,     1,
+     1,     1,     1,     1,     1,     4,     4,     4,     4,     6,
+     4,     1,     1,     1,     1,     1,     2,     0,     3,     1,
+     3,     3,     4,     1,     1,     1,     1,     1,     1,     1,
+     1,     1
+};
+
+static const short yydefact[] = {     3,
+     1,     0,     0,     7,     4,     5,     6,     0,   405,   404,
+    73,     0,    69,    71,    76,     0,     0,    77,   411,    79,
+     0,   194,     0,     0,    61,    52,   196,   198,   199,   228,
+   200,   201,   202,   203,   210,   211,   212,   197,   205,   206,
+   209,   207,   208,   229,   230,   213,   214,   215,   216,   217,
+   224,   225,   226,   204,   227,   220,   221,   218,   219,   223,
+   222,    30,     0,   183,     0,   184,   246,   185,   186,     0,
+   187,   188,   189,   191,   246,   246,   190,   182,     0,    42,
+    43,    44,     2,    10,    22,    10,    17,    18,    19,     0,
+    20,    21,    40,    41,   192,   195,   231,     0,     0,   232,
+   233,     0,    15,     0,     0,    83,    16,     0,     0,   220,
+   236,     0,   232,   233,   406,   409,     0,     0,     0,     0,
+     0,     0,    58,     0,    64,     0,     0,   408,   256,   407,
+     0,   240,   244,   242,   245,     0,     8,     9,     0,   193,
+   234,     0,     0,   267,     0,    99,   103,   260,   259,   261,
+    67,    68,    72,    70,     0,    81,    78,   343,   344,   320,
+     0,   318,   313,     0,     0,   314,   319,     0,     0,     0,
+    86,    85,    90,   284,    88,   283,   320,   297,   317,   238,
+   237,     0,     0,   137,     0,   101,     0,     0,     0,     0,
+    31,    32,    33,    34,    35,     0,     0,     0,    24,     0,
+     0,     0,    11,    14,    12,    13,   103,   263,   269,     0,
+     0,    37,     0,     0,    45,     0,     0,   264,     0,   270,
+    84,     0,   322,     0,   321,   309,   310,   320,     0,     0,
+   320,   298,     0,   284,    80,     0,     0,   288,     0,   281,
+   285,   289,     0,     0,   299,   239,     0,    51,   140,     0,
+   138,   139,   284,   142,    36,    62,    53,     0,     0,    65,
+   176,   178,    38,   257,   253,     0,     0,    25,    26,    29,
+     0,     0,    39,    47,   262,   268,   100,     0,     0,   398,
+   407,   394,   395,   392,   393,     0,     0,     0,   385,     0,
+     0,   102,    97,     0,    98,   332,   334,   336,     0,   340,
+   345,   352,   356,   359,   351,   371,   384,     0,   396,   412,
+   369,     0,     0,     0,     0,   104,     0,   265,     0,   294,
+     0,   271,     0,     0,   305,   325,   324,     0,     0,   311,
+   312,     0,   300,     0,   282,    87,    89,    91,     0,   287,
+     0,     0,     0,   290,    93,    92,    96,    95,   315,   316,
+   301,   235,   103,     0,   288,     0,   273,   279,   278,   280,
+     0,     0,    56,    59,     0,     0,   180,   254,     0,    28,
+     0,     0,     0,     0,   248,     0,     0,     0,   363,   366,
+     0,     0,     0,     0,     0,     0,     0,   365,     0,     0,
+     0,     0,   346,   345,   347,   341,   342,   353,   357,     0,
+     0,     0,     0,   380,   381,   382,     0,   383,   354,   372,
+     0,   397,     0,   106,   107,   108,     0,   266,   295,   272,
+    82,   306,   323,   307,   302,     0,   292,   286,   291,     0,
+   327,    94,   303,    49,   141,   143,   274,   288,     0,   275,
+   166,   170,    63,    54,     0,     0,   177,    66,   172,   179,
+   258,   255,    23,    27,     0,   251,   241,   249,   243,   108,
+   368,     0,   361,     0,   399,   400,     0,   378,     0,     0,
+     0,   194,     0,     0,     0,   131,   132,     0,     0,   126,
+   129,   128,   364,   335,   339,   338,   349,   348,     0,   410,
+   358,   375,     0,   373,   374,   377,   355,     0,   331,     0,
+   111,   105,   308,   304,     0,   293,     0,   328,   329,     0,
+   276,     0,     0,     0,    74,     0,    57,    60,   174,     0,
+   173,   250,     0,   111,   362,     0,   367,     0,     0,     0,
+   386,     0,     0,   391,   389,   387,   130,     0,   388,   350,
+   376,   337,   370,     0,     0,   109,   118,   296,     0,     0,
+   111,   277,   169,     0,     0,   167,   171,     0,     0,   181,
+   252,   118,   360,   401,     0,   402,   117,   379,     0,     0,
+   127,     0,   113,     0,     0,     0,   120,   326,   330,   120,
+    75,   168,   103,     0,   120,   403,   333,   390,   112,     0,
+     0,     0,     0,     0,     0,   122,   144,     0,   122,   114,
+     0,   116,   110,   119,     0,     0,   133,     0,   133,     0,
+   133,     0,   121,     0,     0,     0,     0,   135,     0,     0,
+   175,   135,   115,   124,   123,   125,     0,     0,     0,     0,
+   407,     0,   147,     0,     0,    50,     0,   134,     0,    46,
+     0,   149,     0,     0,   145,     0,     0,    48,   136,     0,
+   148,   146,   151,   150,     0,     0,   153,     0,   156,   158,
+     0,   159,   406,     0,   160,     0,     0,   152,   161,     0,
+     0,   163,   157,   162,   164,     0,   154,     0,   165,   155,
+     0,     0,     0
+};
+
+static const short yydefgoto[] = {   681,
+     4,     1,     5,    83,   137,   203,     6,   204,   205,    85,
+   267,   268,   269,   206,   124,   191,    87,    88,    89,    90,
+    91,   315,   377,    92,   510,    93,   121,   362,   122,   445,
+   190,   446,   120,   361,    94,   196,   366,    12,    13,   514,
+    14,    17,    18,   105,   170,   171,   172,   173,   345,   292,
+   293,   145,   146,   215,   316,   501,   546,   547,   572,   573,
+   566,   577,   596,   607,   479,   480,   618,   629,   250,   341,
+   252,   609,   653,   633,   658,   659,   443,   516,   520,   521,
+   559,   260,   261,   367,   450,    95,    96,    97,    98,   253,
+   481,   181,   113,   200,   201,   127,   374,   375,   455,   369,
+   114,   265,   186,   148,   149,   359,   254,   175,   240,   241,
+   242,   176,   294,   351,   178,   224,   225,   464,   432,   507,
+   508,   498,   499,   296,   297,   298,   299,   300,   396,   397,
+   301,   302,   303,   304,   381,   305,   469,   410,   306,   307,
+   308,   309,   382,   465,   466,   310,   661,   311,   129,   118,
+   491,    20,   312
+};
+
+static const short yypact[] = {-32768,
+   -28,   224,   372,  1343,-32768,-32768,-32768,   132,-32768,-32768,
+-32768,    48,-32768,-32768,-32768,   132,   105,-32768,-32768,    49,
+  2880,-32768,   227,  2880,-32768,    17,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,   161,-32768,-32768,-32768,-32768,
+-32768,-32768,  2880,-32768,  2880,-32768,   132,-32768,-32768,   221,
+-32768,-32768,-32768,-32768,   132,   132,-32768,-32768,  2880,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  2880,
+-32768,-32768,-32768,-32768,-32768,  1065,-32768,  2880,   396,   247,
+   270,   280,-32768,   224,   311,-32768,-32768,   372,  1147,-32768,
+   310,   265,-32768,-32768,   343,-32768,   132,   345,   396,   209,
+   246,   264,-32768,  1437,-32768,   396,   340,-32768,   346,-32768,
+   378,-32768,   346,-32768,   346,   396,  1241,  1241,   396,-32768,
+-32768,   396,   396,-32768,   123,-32768,   118,   198,   294,-32768,
+-32768,-32768,-32768,-32768,   132,   431,-32768,-32768,-32768,   416,
+   132,-32768,-32768,   132,   488,-32768,-32768,   423,  2880,   427,
+   442,   444,-32768,   462,   417,-32768,   416,   466,-32768,-32768,
+   499,  2880,   502,  2302,   149,   484,   501,   512,   428,   429,
+-32768,-32768,-32768,-32768,-32768,   396,   156,   509,  2396,   504,
+   507,   165,-32768,-32768,-32768,-32768,-32768,   198,   294,    89,
+   112,-32768,   396,  3134,  1824,  1920,  3009,-32768,  2016,-32768,
+-32768,  1147,-32768,   500,    33,-32768,-32768,   416,   132,   132,
+   416,   516,   437,   462,-32768,  1147,  1147,   462,  1730,-32768,
+   329,-32768,   239,    93,-32768,-32768,   538,-32768,-32768,   513,
+-32768,   517,   379,-32768,-32768,-32768,-32768,   533,   534,   523,
+-32768,-32768,-32768,-32768,   526,  2880,   522,   532,-32768,-32768,
+  2880,  2880,-32768,  1824,-32768,-32768,-32768,  3134,  3036,-32768,
+   343,-32768,-32768,-32768,-32768,   555,  3134,   556,-32768,   559,
+   560,-32768,-32768,   412,-32768,   558,-32768,   121,   557,-32768,
+   436,   438,   438,   540,   761,-32768,-32768,   290,-32768,-32768,
+-32768,   563,   567,   568,   542,-32768,   396,-32768,   541,-32768,
+   544,-32768,   546,   547,   562,-32768,-32768,   566,   549,-32768,
+-32768,    93,-32768,   574,-32768,   444,   417,-32768,   417,   329,
+   550,   128,  2112,-32768,   564,-32768,-32768,-32768,-32768,-32768,
+   575,-32768,-32768,  2490,   379,  1634,-32768,   198,   376,-32768,
+    34,    34,-32768,-32768,   396,   579,   570,   565,   578,-32768,
+   587,  2396,   396,  2591,-32768,  2692,   576,   159,   583,-32768,
+   393,   221,  3134,    21,  3134,  1018,   760,-32768,   463,  3134,
+   557,   557,-32768,-32768,   288,   436,   436,   295,   295,   132,
+  3077,   132,   132,-32768,-32768,-32768,   132,-32768,   438,-32768,
+  3134,-32768,  3134,-32768,-32768,-32768,   211,-32768,-32768,-32768,
+-32768,-32768,-32768,   582,   588,   571,-32768,-32768,-32768,   586,
+   132,-32768,-32768,  1824,-32768,-32768,   376,   434,  2208,-32768,
+-32768,   373,-32768,-32768,    34,    34,-32768,-32768,   561,-32768,
+-32768,-32768,-32768,-32768,   249,-32768,-32768,-32768,-32768,-32768,
+-32768,   132,   594,  3134,   596,-32768,   595,   558,   419,  3134,
+   598,   625,   599,   601,   603,-32768,-32768,  2880,   425,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   288,-32768,
+-32768,-32768,    20,-32768,-32768,-32768,   295,   606,-32768,   445,
+    -7,-32768,-32768,-32768,   617,-32768,   619,   614,-32768,   613,
+-32768,   611,   642,   472,-32768,  1538,-32768,-32768,-32768,   615,
+-32768,-32768,   396,    -7,-32768,   132,-32768,   221,  2786,  3134,
+-32768,    28,  3134,-32768,-32768,-32768,-32768,   889,-32768,-32768,
+-32768,-32768,-32768,   221,  2880,-32768,   605,-32768,   132,   132,
+   597,-32768,-32768,   132,   648,-32768,-32768,   396,   637,-32768,
+-32768,   605,-32768,-32768,  2880,-32768,-32768,   558,  3134,   622,
+-32768,   277,-32768,   115,   396,  3134,   572,-32768,-32768,   572,
+-32768,-32768,-32768,   650,   572,-32768,   558,-32768,-32768,   221,
+  2880,  3134,   282,   654,  3134,   607,   620,  3134,   607,-32768,
+   616,-32768,-32768,-32768,   659,   631,   623,   635,   623,   641,
+   623,  3134,-32768,   672,   673,   334,  3134,   633,   192,   647,
+-32768,   633,-32768,-32768,-32768,-32768,   676,  3134,   649,   192,
+   677,   187,-32768,   678,   656,-32768,   657,-32768,   684,-32768,
+    65,-32768,   200,   192,-32768,   245,   668,-32768,-32768,   192,
+-32768,-32768,   709,-32768,   189,   189,-32768,   451,   730,-32768,
+   725,-32768,-32768,   726,-32768,    47,   189,-32768,   250,   309,
+   335,-32768,   730,-32768,-32768,   452,-32768,   464,-32768,-32768,
+   739,   740,-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,-32768,-32768,-32768,   655,-32768,-32768,   741,   743,-32768,
+-32768,-32768,   371,   748,-32768,-32768,   621,   629,   640,-32768,
+  -120,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   661,-32768,
+    -6,-32768,   651,-32768,   545,-32768,   539,   537,-32768,-32768,
+   552,  -114,   573,  -179,-32768,   316,-32768,  -434,-32768,   188,
+  -522,   215,   -77,   180,   178,   255,  -420,   166,-32768,  -165,
+-32768,-32768,  -406,-32768,  -251,  -288,  -326,-32768,-32768,-32768,
+-32768,-32768,   432,-32768,-32768,   -76,-32768,-32768,-32768,    -3,
+   -18,-32768,    45,-32768,-32768,   440,   524,   -79,-32768,-32768,
+    63,-32768,   -93,  -135,   369,   443,  -174,   287,  -189,  -212,
+  -101,   569,   -32,  -257,   643,  -137,-32768,   580,-32768,-32768,
+-32768,  -532,  -201,  -254,-32768,   137,   -95,   508,-32768,-32768,
+  -282,   505,-32768,-32768,   515,  -264,  -173,-32768,-32768,  -243,
+-32768,  -297,-32768,-32768,   278,     7,   -23,   -38,   455,   694,
+  -373,    15,   577
+};
+
+
+#define	YYLAST		3247
+
+
+static const short yytable[] = {   117,
+    99,   102,   112,   195,   185,   147,   208,   210,    15,    19,
+   412,   197,   295,   179,    15,   295,   394,   111,   251,   140,
+   119,   202,    19,   378,   270,   340,   342,   274,     2,   116,
+   106,   131,   384,   496,   390,   444,   388,   398,   399,   244,
+   441,   390,   586,   594,   335,   207,   218,   220,   100,   669,
+   319,   530,   544,   323,   103,   541,   326,   509,   109,   125,
+   150,   126,   605,   360,   327,   610,   101,   442,   601,   179,
+   642,   650,   644,   128,   425,   136,   177,   380,   569,   104,
+   150,   128,   128,   672,   627,     3,   139,   150,   525,   562,
+   329,   370,   380,   332,   141,   639,   545,   150,   216,   217,
+   150,   651,   262,   150,   150,   174,   218,   220,   218,   220,
+    15,   107,   487,   -55,    19,   349,   580,   358,   517,   518,
+    99,   219,   217,   116,  -101,   275,   179,   350,   468,   212,
+   470,   483,   231,    99,    99,   484,   108,   343,   217,   344,
+   179,   179,   340,   342,   497,   591,   468,   179,   276,  -101,
+   214,     9,   563,   391,   213,   255,    10,   150,   468,   392,
+   592,    19,   263,   247,   428,   234,   346,   226,   100,   221,
+   227,   273,   390,   434,   150,   578,   579,   430,   111,   436,
+   213,   100,   100,   471,   474,   482,   101,   213,   620,   177,
+   622,   655,   642,   643,   644,   461,   213,   270,   656,   101,
+   101,   630,   417,   177,   177,   395,   540,   216,   217,   630,
+   177,   317,   632,   631,   150,   532,   631,   502,   174,   208,
+   210,   645,   123,   641,   631,   340,     8,   493,   282,   283,
+   284,   285,   174,   174,   652,   330,   331,   654,   344,   500,
+   344,   158,   213,     9,   159,   130,     9,   655,    10,   160,
+   161,   115,   162,   151,   656,   522,   218,   440,     9,   656,
+   163,   584,   527,    10,   164,   165,    11,   373,   373,   631,
+   317,   262,   166,   512,   631,   568,   152,   167,   150,   456,
+   523,   657,   153,   589,   282,   283,   284,   285,   603,   282,
+   283,   284,   285,   168,   458,   182,   458,   278,   279,   411,
+   488,   489,   208,   219,   217,   401,   402,     9,   590,   163,
+   280,   655,   281,   213,   587,   180,   150,   150,   656,   187,
+   403,   166,   404,   405,   406,   407,   150,   282,   283,   284,
+   285,   570,   408,   631,   150,   440,   482,   655,   343,   217,
+   626,   286,   155,   467,   656,   675,   288,   156,   282,   283,
+   284,   285,  -404,    64,   184,    66,   188,    68,    69,   631,
+   189,    71,    72,    73,    74,   538,   665,   666,    77,    78,
+   373,   677,   373,   198,   282,   283,   284,   285,   673,  -247,
+   674,    16,   473,   111,   355,   439,   217,   199,   356,   217,
+   602,     9,     9,   289,   290,   557,    10,    10,   357,   150,
+   291,   142,   660,   130,   482,   143,   490,   513,   494,   495,
+   623,   660,   660,   490,   158,   144,   326,   159,   676,   678,
+   130,   278,   279,   660,   327,   660,   660,   660,   463,   561,
+   317,     9,   280,   163,   349,   515,   281,   490,   158,   438,
+   222,   159,   223,   356,   217,   166,   350,   278,    15,   233,
+   530,   282,   283,   284,   285,   531,   538,     9,   130,   537,
+   593,   539,   281,   235,   583,   286,   287,   238,   490,   243,
+   288,   239,   217,   236,   111,   237,   530,   282,   283,   284,
+   285,   543,   667,   667,   150,   349,   326,   668,   679,   467,
+   158,   286,   245,   159,   327,   667,   288,   350,   228,   229,
+   680,   162,   597,   554,   246,   574,   555,   599,   248,   163,
+   209,   211,   558,   230,   132,   134,   214,   289,   290,   150,
+   256,   166,   337,   339,   291,   567,   167,   485,   486,   133,
+   135,   257,   490,   264,   111,   325,   150,   271,   258,   259,
+   272,   575,   333,   289,   290,   352,   334,   581,   354,   353,
+   291,   574,   363,   364,   365,   490,   490,   368,   371,   158,
+    15,   567,   159,   372,   383,   385,   278,   279,   386,   387,
+   400,   390,   413,   414,   415,   416,     9,   418,   163,   419,
+   635,   281,   420,   421,   424,   448,   427,   567,   422,   451,
+   166,   635,   423,   453,   431,   634,   282,   283,   284,   285,
+   426,   433,   111,   449,   635,   635,   634,   662,   503,   460,
+   286,   635,   452,   462,   504,   288,   662,   662,   519,   634,
+   634,   505,   506,   664,   526,   529,   634,   528,   662,   533,
+   662,   662,   662,   158,  -405,   534,   159,   535,    21,   536,
+   278,   279,   542,   548,   549,   550,   551,   552,   553,   560,
+   472,   280,   163,   576,   582,   281,   544,   280,   588,   598,
+   604,   612,   289,   290,   166,   613,   608,   606,   619,   291,
+   282,   283,   284,   285,   617,   614,   595,   621,   624,   625,
+   628,   636,   638,   640,   286,   287,  -406,   646,   647,   288,
+   649,   648,   663,   615,   476,   477,   478,    27,    28,    29,
+    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+    40,    41,    42,    43,    44,    45,   644,    46,    47,    48,
+    49,    50,    51,    52,    53,    54,    55,   110,    57,    58,
+    59,    60,   669,    61,   670,   671,   289,   290,   682,   683,
+   138,     7,   454,   291,   192,    64,    84,    66,    67,    68,
+    69,    86,   193,    71,    72,    73,    74,    75,   157,    76,
+    77,    78,   158,   194,   154,   159,   324,    21,   321,   278,
+   279,   401,   402,   338,   336,   524,   585,   600,   611,   472,
+   280,   163,   163,   616,   281,   277,   403,   637,   404,   405,
+   406,   407,   571,   166,   166,   376,   447,   437,   408,   282,
+   283,   284,   285,   475,   328,   564,   393,   232,   389,   409,
+   183,   347,     0,   286,   287,     0,     0,     0,   288,   348,
+     0,     0,     0,   476,   477,   478,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,     0,     0,   289,   290,     0,     0,     0,
+     0,     0,   291,     0,    64,     0,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,     0,    76,    77,
+    78,   158,     0,     0,   159,     0,    21,     0,   278,   279,
+     0,     0,     0,     0,     0,     0,     0,     0,   472,   280,
+   163,     0,     0,   281,     0,     0,     0,     0,     0,     0,
+     0,     0,   166,     0,     0,     0,     0,     0,   282,   283,
+   284,   285,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   286,   287,     0,     0,     0,   288,     0,     0,
+     0,     0,   476,   477,   478,    27,    28,    29,    30,    31,
+    32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+    42,    43,    44,    45,     0,    46,    47,    48,    49,    50,
+    51,    52,    53,    54,    55,   110,    57,    58,    59,    60,
+     0,    61,     0,     0,   289,   290,     0,     0,     0,     0,
+     0,   291,     0,    64,     0,    66,    67,    68,    69,     0,
+     0,    71,    72,    73,    74,    75,     0,    76,    77,    78,
+   158,     0,     0,   159,     0,    21,     0,   278,   279,     0,
+     0,     0,     0,     0,     0,     0,     0,   472,   280,   163,
+     0,     0,   281,     0,     0,     0,     0,     0,     0,     0,
+     0,   166,     0,     0,     0,     0,     0,   282,   283,   284,
+   285,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,   286,   287,     0,     0,     0,   288,     0,     0,     0,
+     0,     0,     0,     0,    27,    28,    29,    30,    31,    32,
+    33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+    43,    44,    45,     0,    46,    47,    48,    49,    50,    51,
+    52,    53,    54,    55,   110,    57,    58,    59,    60,     0,
+    61,     0,     0,   289,   290,     0,     0,     0,     0,     0,
+   291,     0,    64,     0,    66,    67,    68,    69,     0,     0,
+    71,    72,    73,    74,    75,     0,    76,    77,    78,   158,
+     0,     0,   159,     0,    21,     0,     0,   160,   161,     0,
+   162,     0,     0,     0,     0,     0,    22,     0,   163,     0,
+     0,     0,   164,   165,     0,     0,     0,     0,     0,    64,
+   166,    66,     0,    68,    69,   167,     0,    71,    72,    73,
+    74,     0,     0,     0,    77,    78,     0,     0,     0,     0,
+     0,   168,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   169,    27,    28,    29,    30,    31,    32,    33,
+    34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+    44,    45,     0,    46,    47,    48,    49,    50,    51,    52,
+    53,    54,    55,   110,    57,    58,    59,    60,    21,    61,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    22,    64,     0,    66,    67,    68,    69,     0,     0,    71,
+    72,    73,    74,    75,     0,    76,    77,    78,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,    23,     0,
+    24,     0,     0,     0,     0,     0,    25,     0,     0,     0,
+     0,     0,    26,     0,     0,     0,     0,    27,    28,    29,
+    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+    40,    41,    42,    43,    44,    45,     0,    46,    47,    48,
+    49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+    59,    60,     0,    61,     0,     0,     0,     0,    62,     0,
+    21,     0,    63,     0,     3,    64,    65,    66,    67,    68,
+    69,    70,    22,    71,    72,    73,    74,    75,     0,    76,
+    77,    78,    79,    80,    81,    82,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    23,     0,    24,     0,     0,     0,     0,     0,    25,     0,
+     0,     0,     0,     0,    26,     0,     0,     0,     0,    27,
+    28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+    38,    39,    40,    41,    42,    43,    44,    45,     0,    46,
+    47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+    57,    58,    59,    60,    21,    61,     0,     0,     0,     0,
+    62,     0,     0,     0,    63,     0,    22,    64,    65,    66,
+    67,    68,    69,    70,     0,    71,    72,    73,    74,    75,
+     0,    76,    77,    78,    79,    80,    81,    82,     0,     0,
+     0,     0,     0,     0,     0,     0,    24,     0,     0,     0,
+     0,     0,    25,     0,     0,     0,     0,     0,    26,     0,
+     0,     0,     0,    27,    28,    29,    30,    31,    32,    33,
+    34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+    44,    45,     0,    46,    47,    48,    49,    50,    51,    52,
+    53,    54,    55,    56,    57,    58,    59,    60,     0,    61,
+     0,     0,     0,     0,     0,    21,     0,     0,    63,     0,
+     0,    64,    65,    66,    67,    68,    69,    22,     0,    71,
+    72,    73,    74,    75,     0,    76,    77,    78,    79,    80,
+    81,    82,   556,     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,    27,    28,    29,    30,    31,    32,
+    33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+    43,    44,    45,     0,    46,    47,    48,    49,    50,    51,
+    52,    53,    54,    55,   110,    57,    58,    59,    60,   438,
+    61,    21,     0,   356,   217,     0,     0,     0,     0,     0,
+     0,     0,    64,    22,    66,    67,    68,    69,   130,     0,
+    71,    72,    73,    74,    75,     0,    76,    77,    78,     0,
+    80,    81,    82,     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,
+    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+    37,    38,    39,    40,    41,    42,    43,    44,    45,     0,
+    46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+   110,    57,    58,    59,    60,   238,    61,    21,     0,   239,
+   217,     0,     0,     0,     0,     0,     0,     0,    64,    22,
+    66,    67,    68,    69,     0,     0,    71,    72,    73,    74,
+    75,   249,    76,    77,    78,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,    21,    61,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,    22,    64,     0,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,   249,    76,    77,
+    78,     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,   313,   314,     0,
+    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+    37,    38,    39,    40,    41,    42,    43,    44,    45,     0,
+    46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+   110,    57,    58,    59,    60,     0,    61,    21,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,    64,    22,
+    66,    67,    68,    69,     0,     0,    71,    72,    73,    74,
+    75,     0,    76,    77,    78,     0,   318,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,    21,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,    64,    22,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,   249,    76,    77,
+    78,     0,   322,     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,    27,    28,    29,    30,    31,    32,    33,    34,
+    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+    45,     0,    46,    47,    48,    49,    50,    51,    52,    53,
+    54,    55,   110,    57,    58,    59,    60,     0,    61,    21,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    64,    22,    66,    67,    68,    69,     0,     0,    71,    72,
+    73,    74,    75,   249,    76,    77,    78,     0,   429,     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,    27,    28,
+    29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+    39,    40,    41,    42,    43,    44,    45,     0,    46,    47,
+    48,    49,    50,    51,    52,    53,    54,    55,   110,    57,
+    58,    59,    60,     0,    61,    21,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,    64,    22,    66,    67,
+    68,    69,     0,     0,    71,    72,    73,    74,    75,   249,
+    76,    77,    78,     0,   511,     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,    27,    28,    29,    30,    31,    32,
+    33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+    43,    44,    45,     0,    46,    47,    48,    49,    50,    51,
+    52,    53,    54,    55,   110,    57,    58,    59,    60,    21,
+    61,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,    22,    64,     0,    66,    67,    68,    69,     0,     0,
+    71,    72,    73,    74,    75,   249,    76,    77,    78,     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,    27,    28,
+    29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+    39,    40,    41,    42,    43,    44,    45,     0,    46,    47,
+    48,    49,    50,    51,    52,    53,    54,    55,   110,    57,
+    58,    59,    60,    21,    61,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,    22,    64,     0,    66,    67,
+    68,    69,     0,     0,    71,    72,    73,    74,    75,   249,
+    76,    77,    78,     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,    27,    28,    29,    30,    31,    32,    33,    34,
+    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+    45,     0,    46,    47,    48,    49,    50,    51,    52,    53,
+    54,    55,   110,    57,    58,    59,    60,    21,    61,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,    22,
+    64,     0,    66,    67,    68,    69,     0,   266,    71,    72,
+    73,    74,    75,     0,    76,    77,    78,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,     0,     0,     0,     0,     0,    21,     0,
+     0,     0,     0,     0,    64,     0,    66,    67,    68,    69,
+    22,     0,    71,    72,    73,    74,    75,   435,    76,    77,
+    78,     0,     0,     0,     0,   457,     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,    27,    28,    29,
+    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+    40,    41,    42,    43,    44,    45,     0,    46,    47,    48,
+    49,    50,    51,    52,    53,    54,    55,   110,    57,    58,
+    59,    60,     0,    61,     0,     0,     0,     0,     0,    21,
+     0,     0,     0,     0,     0,    64,     0,    66,    67,    68,
+    69,    22,     0,    71,    72,    73,    74,    75,     0,    76,
+    77,    78,     0,     0,     0,     0,   459,     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,    27,    28,
+    29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+    39,    40,    41,    42,    43,    44,    45,     0,    46,    47,
+    48,    49,    50,    51,    52,    53,    54,    55,   110,    57,
+    58,    59,    60,    21,    61,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,    22,    64,     0,    66,    67,
+    68,    69,     0,     0,    71,    72,    73,    74,    75,     0,
+    76,    77,    78,     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,   565,    27,    28,    29,    30,    31,    32,    33,    34,
+    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+    45,     0,    46,    47,    48,    49,    50,    51,    52,    53,
+    54,    55,   110,    57,    58,    59,    60,    21,    61,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,    22,
+    64,     0,    66,    67,    68,    69,     0,     0,    71,    72,
+    73,    74,    75,     0,    76,    77,    78,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,    64,     0,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,     0,    76,    77,
+    78,   158,     0,     0,   159,     0,     0,     0,   278,   279,
+     0,     0,     0,     0,     0,     0,     0,     0,     9,   280,
+   163,     0,     0,   281,     0,     0,     0,     0,   158,     0,
+     0,   159,   166,     0,   320,   278,   279,     0,   282,   283,
+   284,   285,     0,     0,     0,     9,   280,   163,     0,     0,
+   281,     0,   286,   287,     0,     0,     0,   288,     0,   166,
+     0,   379,     0,     0,     0,   282,   283,   284,   285,   158,
+     0,     0,   159,     0,     0,     0,   278,   279,     0,   286,
+   287,     0,     0,     0,   288,     0,     9,   280,   163,     0,
+     0,   281,     0,     0,     0,     0,     0,     0,     0,     0,
+   166,     0,   492,     0,   289,   290,   282,   283,   284,   285,
+     0,   291,     0,     0,     0,     0,     0,     0,     0,     0,
+   286,   287,     0,     0,     0,   288,   158,     0,     0,   159,
+     0,   289,   290,   278,   279,     0,     0,     0,   291,     0,
+     0,     0,     0,     9,   280,   163,     0,     0,   281,     0,
+     0,     0,     0,     0,     0,     0,     0,   166,     0,     0,
+     0,     0,     0,   282,   283,   284,   285,     0,     0,     0,
+     0,     0,   289,   290,     0,     0,     0,   286,   287,   291,
+     0,     0,   288,     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,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   289,
+   290,     0,     0,     0,     0,     0,   291
+};
+
+static const short yycheck[] = {    23,
+     4,     8,    21,   124,   119,    99,   142,   143,     2,     3,
+   308,   126,   214,   109,     8,   217,   299,    21,   184,    96,
+    24,   136,    16,   278,   199,   238,   239,   207,    57,    23,
+    16,    70,   287,   407,    14,   362,   294,   302,   303,   177,
+     7,    14,   565,   576,   234,   139,   148,   149,     4,     3,
+   216,    32,    60,   219,     7,    36,    24,   431,    10,    63,
+    99,    65,   595,   253,    32,   598,     4,    34,   591,   165,
+     6,     7,     8,    67,   332,    79,   109,   279,    51,    32,
+   119,    75,    76,    37,   617,   114,    90,   126,   462,   524,
+   228,   266,   294,   231,    98,   628,   104,   136,    10,    11,
+   139,    37,   196,   142,   143,   109,   208,   209,   210,   211,
+   104,     7,   395,    97,   108,    23,   551,   253,   445,   446,
+   124,    10,    11,   117,     7,    37,   222,    35,   383,     7,
+   110,   389,   165,   137,   138,   390,    32,    10,    11,   241,
+   236,   237,   355,   356,   409,    31,   401,   243,    37,    32,
+    33,    20,   526,    33,    32,     7,    25,   196,   413,    39,
+    46,   155,     7,   182,    37,   169,   243,   161,   124,   155,
+   164,     7,    14,   353,   213,   549,   550,   343,   182,   354,
+    32,   137,   138,   385,   386,   387,   124,    32,   609,   222,
+   611,     3,     6,     7,     8,    37,    32,   372,    10,   137,
+   138,    10,   317,   236,   237,   301,   489,    10,    11,    10,
+   243,   215,   619,    25,   253,   470,    25,     7,   222,   355,
+   356,    35,    62,   630,    25,   438,     3,   401,    40,    41,
+    42,    43,   236,   237,    35,   229,   230,   644,   340,   413,
+   342,     3,    32,    20,     6,    25,    20,     3,    25,    11,
+    12,    25,    14,     7,    10,     7,   358,   359,    20,    10,
+    22,   559,   464,    25,    26,    27,    43,   271,   272,    25,
+   274,   365,    34,   439,    25,   530,     7,    39,   317,   373,
+    32,    37,     3,     7,    40,    41,    42,    43,     7,    40,
+    41,    42,    43,    55,   374,    31,   376,    10,    11,    10,
+   396,   397,   438,    10,    11,    11,    12,    20,    32,    22,
+    21,     3,    25,    32,   569,     6,   355,   356,    10,   111,
+    26,    34,    28,    29,    30,    31,   365,    40,    41,    42,
+    43,   533,    38,    25,   373,   437,   538,     3,    10,    11,
+     7,    54,    32,   382,    10,    37,    59,    37,    40,    41,
+    42,    43,    10,   115,    10,   117,   111,   119,   120,    25,
+    97,   123,   124,   125,   126,    32,   655,   656,   130,   131,
+   374,    37,   376,    34,    40,    41,    42,    43,   667,    34,
+   669,    10,   386,   387,     6,    10,    11,    10,    10,    11,
+   592,    20,    20,   106,   107,   516,    25,    25,    20,   438,
+   113,     6,   646,    25,   606,    10,   400,    35,   402,   403,
+   612,   655,   656,   407,     3,    20,    24,     6,   670,   671,
+    25,    10,    11,   667,    32,   669,   670,   671,    36,   523,
+   434,    20,    21,    22,    23,   442,    25,   431,     3,     6,
+    10,     6,    27,    10,    11,    34,    35,    10,   442,    27,
+    32,    40,    41,    42,    43,    37,    32,    20,    25,   478,
+   575,    37,    25,    37,   558,    54,    55,     6,   462,    53,
+    59,    10,    11,    32,   478,    32,    32,    40,    41,    42,
+    43,    37,    32,    32,   523,    23,    24,    37,    37,   528,
+     3,    54,    27,     6,    32,    32,    59,    35,    11,    12,
+    37,    14,   580,    32,     6,   544,    35,   585,     7,    22,
+   142,   143,   516,    26,    75,    76,    33,   106,   107,   558,
+    20,    34,   236,   237,   113,   529,    39,   391,   392,    75,
+    76,    20,   526,    25,   538,    36,   575,    34,   111,   111,
+    34,   545,    27,   106,   107,     8,   110,   554,    32,    37,
+   113,   590,    20,    20,    32,   549,   550,    32,    37,     3,
+   554,   565,     6,    32,    10,    10,    10,    11,    10,    10,
+    31,    14,    10,     7,     7,    34,    20,    37,    22,    36,
+   619,    25,    37,    37,    36,     7,    37,   591,    27,    25,
+    34,   630,    27,     7,    31,   619,    40,    41,    42,    43,
+    27,    27,   606,    34,   643,   644,   630,   646,    27,    34,
+    54,   650,    35,    31,    27,    59,   655,   656,    58,   643,
+   644,    51,    37,   647,    31,    31,   650,    32,   667,    32,
+   669,   670,   671,     3,    10,    37,     6,    37,     8,    37,
+    10,    11,    37,    27,    26,    32,    34,    37,     7,    35,
+    20,    21,    22,    49,     7,    25,    60,    21,    37,    10,
+     7,    46,   106,   107,    34,     7,    47,    61,    34,   113,
+    40,    41,    42,    43,    52,    45,   105,    37,     7,     7,
+    48,    35,     7,    35,    54,    55,    10,    10,    33,    59,
+     7,    35,    25,    63,    64,    65,    66,    67,    68,    69,
+    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+    80,    81,    82,    83,    84,    85,     8,    87,    88,    89,
+    90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+   100,   101,     3,   103,    10,    10,   106,   107,     0,     0,
+    86,     1,   372,   113,   124,   115,     4,   117,   118,   119,
+   120,     4,   124,   123,   124,   125,   126,   127,   108,   129,
+   130,   131,     3,   124,   104,     6,   222,     8,   217,    10,
+    11,    11,    12,   237,   236,   460,   562,   590,   599,    20,
+    21,    22,    22,   606,    25,   213,    26,   622,    28,    29,
+    30,    31,   538,    34,    34,   272,   365,   355,    38,    40,
+    41,    42,    43,    44,   225,   528,   299,   165,   294,   305,
+   117,   243,    -1,    54,    55,    -1,    -1,    -1,    59,   243,
+    -1,    -1,    -1,    64,    65,    66,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,    -1,    -1,   106,   107,    -1,    -1,    -1,
+    -1,    -1,   113,    -1,   115,    -1,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,    -1,   129,   130,
+   131,     3,    -1,    -1,     6,    -1,     8,    -1,    10,    11,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,    21,
+    22,    -1,    -1,    25,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    34,    -1,    -1,    -1,    -1,    -1,    40,    41,
+    42,    43,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    54,    55,    -1,    -1,    -1,    59,    -1,    -1,
+    -1,    -1,    64,    65,    66,    67,    68,    69,    70,    71,
+    72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+    82,    83,    84,    85,    -1,    87,    88,    89,    90,    91,
+    92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
+    -1,   103,    -1,    -1,   106,   107,    -1,    -1,    -1,    -1,
+    -1,   113,    -1,   115,    -1,   117,   118,   119,   120,    -1,
+    -1,   123,   124,   125,   126,   127,    -1,   129,   130,   131,
+     3,    -1,    -1,     6,    -1,     8,    -1,    10,    11,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,    21,    22,
+    -1,    -1,    25,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    34,    -1,    -1,    -1,    -1,    -1,    40,    41,    42,
+    43,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    54,    55,    -1,    -1,    -1,    59,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    67,    68,    69,    70,    71,    72,
+    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+    83,    84,    85,    -1,    87,    88,    89,    90,    91,    92,
+    93,    94,    95,    96,    97,    98,    99,   100,   101,    -1,
+   103,    -1,    -1,   106,   107,    -1,    -1,    -1,    -1,    -1,
+   113,    -1,   115,    -1,   117,   118,   119,   120,    -1,    -1,
+   123,   124,   125,   126,   127,    -1,   129,   130,   131,     3,
+    -1,    -1,     6,    -1,     8,    -1,    -1,    11,    12,    -1,
+    14,    -1,    -1,    -1,    -1,    -1,    20,    -1,    22,    -1,
+    -1,    -1,    26,    27,    -1,    -1,    -1,    -1,    -1,   115,
+    34,   117,    -1,   119,   120,    39,    -1,   123,   124,   125,
+   126,    -1,    -1,    -1,   130,   131,    -1,    -1,    -1,    -1,
+    -1,    55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    66,    67,    68,    69,    70,    71,    72,    73,
+    74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+    84,    85,    -1,    87,    88,    89,    90,    91,    92,    93,
+    94,    95,    96,    97,    98,    99,   100,   101,     8,   103,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    20,   115,    -1,   117,   118,   119,   120,    -1,    -1,   123,
+   124,   125,   126,   127,    -1,   129,   130,   131,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,    -1,
+    50,    -1,    -1,    -1,    -1,    -1,    56,    -1,    -1,    -1,
+    -1,    -1,    62,    -1,    -1,    -1,    -1,    67,    68,    69,
+    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+    80,    81,    82,    83,    84,    85,    -1,    87,    88,    89,
+    90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+   100,   101,    -1,   103,    -1,    -1,    -1,    -1,   108,    -1,
+     8,    -1,   112,    -1,   114,   115,   116,   117,   118,   119,
+   120,   121,    20,   123,   124,   125,   126,   127,    -1,   129,
+   130,   131,   132,   133,   134,   135,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    48,    -1,    50,    -1,    -1,    -1,    -1,    -1,    56,    -1,
+    -1,    -1,    -1,    -1,    62,    -1,    -1,    -1,    -1,    67,
+    68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+    78,    79,    80,    81,    82,    83,    84,    85,    -1,    87,
+    88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+    98,    99,   100,   101,     8,   103,    -1,    -1,    -1,    -1,
+   108,    -1,    -1,    -1,   112,    -1,    20,   115,   116,   117,
+   118,   119,   120,   121,    -1,   123,   124,   125,   126,   127,
+    -1,   129,   130,   131,   132,   133,   134,   135,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    -1,    -1,
+    -1,    -1,    56,    -1,    -1,    -1,    -1,    -1,    62,    -1,
+    -1,    -1,    -1,    67,    68,    69,    70,    71,    72,    73,
+    74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+    84,    85,    -1,    87,    88,    89,    90,    91,    92,    93,
+    94,    95,    96,    97,    98,    99,   100,   101,    -1,   103,
+    -1,    -1,    -1,    -1,    -1,     8,    -1,    -1,   112,    -1,
+    -1,   115,   116,   117,   118,   119,   120,    20,    -1,   123,
+   124,   125,   126,   127,    -1,   129,   130,   131,   132,   133,
+   134,   135,    35,    -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,    67,    68,    69,    70,    71,    72,
+    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+    83,    84,    85,    -1,    87,    88,    89,    90,    91,    92,
+    93,    94,    95,    96,    97,    98,    99,   100,   101,     6,
+   103,     8,    -1,    10,    11,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,   115,    20,   117,   118,   119,   120,    25,    -1,
+   123,   124,   125,   126,   127,    -1,   129,   130,   131,    -1,
+   133,   134,   135,    -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,
+    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+    77,    78,    79,    80,    81,    82,    83,    84,    85,    -1,
+    87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+    97,    98,    99,   100,   101,     6,   103,     8,    -1,    10,
+    11,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   115,    20,
+   117,   118,   119,   120,    -1,    -1,   123,   124,   125,   126,
+   127,   128,   129,   130,   131,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,     8,   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    20,   115,    -1,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,   128,   129,   130,
+   131,    -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,    64,    65,    -1,
+    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+    77,    78,    79,    80,    81,    82,    83,    84,    85,    -1,
+    87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+    97,    98,    99,   100,   101,    -1,   103,     8,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   115,    20,
+   117,   118,   119,   120,    -1,    -1,   123,   124,   125,   126,
+   127,    -1,   129,   130,   131,    -1,    37,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,     8,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   115,    20,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,   128,   129,   130,
+   131,    -1,    37,    -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,    67,    68,    69,    70,    71,    72,    73,    74,
+    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+    85,    -1,    87,    88,    89,    90,    91,    92,    93,    94,
+    95,    96,    97,    98,    99,   100,   101,    -1,   103,     8,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+   115,    20,   117,   118,   119,   120,    -1,    -1,   123,   124,
+   125,   126,   127,   128,   129,   130,   131,    -1,    37,    -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,    67,    68,
+    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+    79,    80,    81,    82,    83,    84,    85,    -1,    87,    88,
+    89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+    99,   100,   101,    -1,   103,     8,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,   115,    20,   117,   118,
+   119,   120,    -1,    -1,   123,   124,   125,   126,   127,   128,
+   129,   130,   131,    -1,    37,    -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,    67,    68,    69,    70,    71,    72,
+    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+    83,    84,    85,    -1,    87,    88,    89,    90,    91,    92,
+    93,    94,    95,    96,    97,    98,    99,   100,   101,     8,
+   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    20,   115,    -1,   117,   118,   119,   120,    -1,    -1,
+   123,   124,   125,   126,   127,   128,   129,   130,   131,    -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,    67,    68,
+    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+    79,    80,    81,    82,    83,    84,    85,    -1,    87,    88,
+    89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+    99,   100,   101,     8,   103,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    20,   115,    -1,   117,   118,
+   119,   120,    -1,    -1,   123,   124,   125,   126,   127,   128,
+   129,   130,   131,    -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,    67,    68,    69,    70,    71,    72,    73,    74,
+    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+    85,    -1,    87,    88,    89,    90,    91,    92,    93,    94,
+    95,    96,    97,    98,    99,   100,   101,     8,   103,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,
+   115,    -1,   117,   118,   119,   120,    -1,   122,   123,   124,
+   125,   126,   127,    -1,   129,   130,   131,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,    -1,    -1,    -1,    -1,    -1,     8,    -1,
+    -1,    -1,    -1,    -1,   115,    -1,   117,   118,   119,   120,
+    20,    -1,   123,   124,   125,   126,   127,   128,   129,   130,
+   131,    -1,    -1,    -1,    -1,    35,    -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,    67,    68,    69,
+    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+    80,    81,    82,    83,    84,    85,    -1,    87,    88,    89,
+    90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+   100,   101,    -1,   103,    -1,    -1,    -1,    -1,    -1,     8,
+    -1,    -1,    -1,    -1,    -1,   115,    -1,   117,   118,   119,
+   120,    20,    -1,   123,   124,   125,   126,   127,    -1,   129,
+   130,   131,    -1,    -1,    -1,    -1,    35,    -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,    67,    68,
+    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+    79,    80,    81,    82,    83,    84,    85,    -1,    87,    88,
+    89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+    99,   100,   101,     8,   103,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    20,   115,    -1,   117,   118,
+   119,   120,    -1,    -1,   123,   124,   125,   126,   127,    -1,
+   129,   130,   131,    -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,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+    85,    -1,    87,    88,    89,    90,    91,    92,    93,    94,
+    95,    96,    97,    98,    99,   100,   101,     8,   103,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,
+   115,    -1,   117,   118,   119,   120,    -1,    -1,   123,   124,
+   125,   126,   127,    -1,   129,   130,   131,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   115,    -1,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,    -1,   129,   130,
+   131,     3,    -1,    -1,     6,    -1,    -1,    -1,    10,    11,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,    21,
+    22,    -1,    -1,    25,    -1,    -1,    -1,    -1,     3,    -1,
+    -1,     6,    34,    -1,    36,    10,    11,    -1,    40,    41,
+    42,    43,    -1,    -1,    -1,    20,    21,    22,    -1,    -1,
+    25,    -1,    54,    55,    -1,    -1,    -1,    59,    -1,    34,
+    -1,    36,    -1,    -1,    -1,    40,    41,    42,    43,     3,
+    -1,    -1,     6,    -1,    -1,    -1,    10,    11,    -1,    54,
+    55,    -1,    -1,    -1,    59,    -1,    20,    21,    22,    -1,
+    -1,    25,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    34,    -1,    36,    -1,   106,   107,    40,    41,    42,    43,
+    -1,   113,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    54,    55,    -1,    -1,    -1,    59,     3,    -1,    -1,     6,
+    -1,   106,   107,    10,    11,    -1,    -1,    -1,   113,    -1,
+    -1,    -1,    -1,    20,    21,    22,    -1,    -1,    25,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    34,    -1,    -1,
+    -1,    -1,    -1,    40,    41,    42,    43,    -1,    -1,    -1,
+    -1,    -1,   106,   107,    -1,    -1,    -1,    54,    55,   113,
+    -1,    -1,    59,    -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,   106,
+   107,    -1,    -1,    -1,    -1,    -1,   113
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/share/misc/bison.simple"
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+#ifndef alloca
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
+#include 
+#else /* not sparc */
+#if defined (MSDOS) && !defined (__TURBOC__)
+#include 
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+#include 
+ #pragma alloca
+#else /* not MSDOS, __TURBOC__, or _AIX */
+#ifdef __hpux
+#ifdef __cplusplus
+extern "C" {
+void *alloca (unsigned int);
+};
+#else /* not __cplusplus */
+void *alloca ();
+#endif /* not __cplusplus */
+#endif /* __hpux */
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc.  */
+#endif /* not GNU C.  */
+#endif /* alloca not defined.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		-2
+#define YYEOF		0
+#define YYACCEPT	return(0)
+#define YYABORT 	return(1)
+#define YYERROR		goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL		goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    { yychar = (token), yylval = (value);			\
+      yychar1 = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    { yyerror ("syntax error: cannot back up"); YYERROR; }	\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+#ifndef YYPURE
+#define YYLEX		yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int	yychar;			/*  the lookahead symbol		*/
+YYSTYPE	yylval;			/*  the semantic value of the		*/
+				/*  lookahead symbol			*/
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;			/*  location data for the lookahead	*/
+				/*  symbol				*/
+#endif
+
+int yynerrs;			/*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug;			/*  nonzero means print parse trace	*/
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
+
+#ifndef	YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+int yyparse (void);
+#endif
+
+#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
+#define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
+#else				/* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (to, from, count)
+     char *to;
+     char *from;
+     int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (char *to, char *from, int count)
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 196 "/usr/share/misc/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
+  int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */
+
+  short	yyssa[YYINITDEPTH];	/*  the state stack			*/
+  YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/
+
+  short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+
+#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+
+#ifdef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;		/*  the variable used to return		*/
+				/*  semantic values from the action	*/
+				/*  routines				*/
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+	 the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+	 but that might be undefined if yyoverflow is a macro.  */
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yyls1, size * sizeof (*yylsp),
+		 &yystacksize);
+#else
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yystacksize);
+#endif
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+	{
+	  yyerror("parser stack overflow");
+	  return 2;
+	}
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+	yystacksize = YYMAXDEPTH;
+      yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+      __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
+      yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+      __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+      __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+	YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+  goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)		/* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;		/* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+	{
+	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+	  /* Give the individual parser a way to print the precise meaning
+	     of a token, for further debugging info.  */
+#ifdef YYPRINT
+	  YYPRINT (stderr, yychar, yylval);
+#endif
+	  fprintf (stderr, ")\n");
+	}
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  if (yylen > 0)
+    yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+	       yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 1:
+#line 382 "llgrammar.y"
+{ lhExternals (yyvsp[0].interfacelist); ;
+    break;}
+case 2:
+#line 383 "llgrammar.y"
+{ interfaceNodeList_free (yyvsp[-2].interfacelist); interfaceNodeList_free (yyvsp[0].interfacelist); ;
+    break;}
+case 3:
+#line 386 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_new (); ;
+    break;}
+case 4:
+#line 387 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_addh (yyvsp[-1].interfacelist, yyvsp[0].iface);;
+    break;}
+case 7:
+#line 394 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_new (); ;
+    break;}
+case 8:
+#line 395 "llgrammar.y"
+{ yyval.interfacelist = consInterfaceNode (yyvsp[-1].iface, yyvsp[0].interfacelist);;
+    break;}
+case 9:
+#line 396 "llgrammar.y"
+{ yyval.interfacelist = consInterfaceNode (yyvsp[-1].iface, yyvsp[0].interfacelist);;
+    break;}
+case 10:
+#line 399 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_new (); ;
+    break;}
+case 11:
+#line 400 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_addh (yyvsp[-1].interfacelist, yyvsp[0].iface);;
+    break;}
+case 15:
+#line 409 "llgrammar.y"
+{ yyval.iface = makeInterfaceNodeImports (yyvsp[-1].importlist);
+     /* assume subspecs are already processed, symbol table info in external file */
+   ;
+    break;}
+case 16:
+#line 415 "llgrammar.y"
+{ yyval.iface = makeInterfaceNodeUses (yyvsp[-1].traitreflist); readlsignatures (yyval.iface);;
+    break;}
+case 17:
+#line 419 "llgrammar.y"
+{ declareConstant (yyvsp[0].constdeclaration); yyval.iface = interfaceNode_makeConst (yyvsp[0].constdeclaration); ;
+    break;}
+case 18:
+#line 421 "llgrammar.y"
+{ declareVar (yyvsp[0].vardeclaration); yyval.iface = interfaceNode_makeVar (yyvsp[0].vardeclaration); ;
+    break;}
+case 19:
+#line 423 "llgrammar.y"
+{ declareType (yyvsp[0].type); yyval.iface = interfaceNode_makeType (yyvsp[0].type); ;
+    break;}
+case 20:
+#line 425 "llgrammar.y"
+{ declareFcn (yyvsp[0].fcn, typeId_invalid); yyval.iface = interfaceNode_makeFcn (yyvsp[0].fcn); ;
+    break;}
+case 21:
+#line 427 "llgrammar.y"
+{ yyval.iface = interfaceNode_makeClaim (yyvsp[0].claim); ;
+    break;}
+case 22:
+#line 429 "llgrammar.y"
+{ declareIter (yyvsp[0].iter); yyval.iface = interfaceNode_makeIter (yyvsp[0].iter); ;
+    break;}
+case 23:
+#line 433 "llgrammar.y"
+{ yyval.iter = makeIterNode (yyvsp[-4].ltok, yyvsp[-2].paramlist); ;
+    break;}
+case 24:
+#line 436 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_new (); ;
+    break;}
+case 25:
+#line 437 "llgrammar.y"
+{ yyval.paramlist = yyvsp[0].paramlist; ;
+    break;}
+case 26:
+#line 441 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (paramNodeList_new (), yyvsp[0].param); ;
+    break;}
+case 27:
+#line 443 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (yyvsp[-2].paramlist,yyvsp[0].param); ;
+    break;}
+case 28:
+#line 446 "llgrammar.y"
+{ yyval.param = markYieldParamNode (yyvsp[0].param); ;
+    break;}
+case 29:
+#line 447 "llgrammar.y"
+{ yyval.param = yyvsp[0].param; ;
+    break;}
+case 30:
+#line 450 "llgrammar.y"
+{ symtable_export (g_symtab, FALSE); ;
+    break;}
+case 31:
+#line 451 "llgrammar.y"
+{ yyval.iface = yyvsp[0].iface; symtable_export (g_symtab, TRUE); ;
+    break;}
+case 32:
+#line 455 "llgrammar.y"
+{ declarePrivConstant (yyvsp[0].constdeclaration); yyval.iface =  interfaceNode_makePrivConst (yyvsp[0].constdeclaration); ;
+    break;}
+case 33:
+#line 457 "llgrammar.y"
+{ declarePrivVar (yyvsp[0].vardeclaration); yyval.iface = interfaceNode_makePrivVar (yyvsp[0].vardeclaration); ;
+    break;}
+case 34:
+#line 459 "llgrammar.y"
+{ declarePrivType (yyvsp[0].type); yyval.iface = interfaceNode_makePrivType (yyvsp[0].type); ;
+    break;}
+case 35:
+#line 461 "llgrammar.y"
+{ declarePrivFcn (yyvsp[0].fcn, typeId_invalid); yyval.iface = interfaceNode_makePrivFcn (yyvsp[0].fcn); ;
+    break;}
+case 36:
+#line 465 "llgrammar.y"
+{ yyval.constdeclaration = makeConstDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls); ;
+    break;}
+case 37:
+#line 469 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, FALSE); yyval.vardeclaration->qualifier = QLF_NONE; ;
+    break;}
+case 38:
+#line 471 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, FALSE); yyval.vardeclaration->qualifier = QLF_CONST; ;
+    break;}
+case 39:
+#line 473 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, FALSE); yyval.vardeclaration->qualifier = QLF_VOLATILE; ;
+    break;}
+case 40:
+#line 476 "llgrammar.y"
+{ yyval.type = makeAbstractTypeNode (yyvsp[0].abstract); ;
+    break;}
+case 41:
+#line 477 "llgrammar.y"
+{ yyval.type = makeExposedTypeNode (yyvsp[0].exposed); ;
+    break;}
+case 42:
+#line 480 "llgrammar.y"
+{ yyval.typequal = qual_createPrintfLike (); ;
+    break;}
+case 43:
+#line 481 "llgrammar.y"
+{ yyval.typequal = qual_createScanfLike (); ;
+    break;}
+case 44:
+#line 482 "llgrammar.y"
+{ yyval.typequal = qual_createMessageLike (); ;
+    break;}
+case 45:
+#line 485 "llgrammar.y"
+{ enteringFcnScope (yyvsp[-2].lcltypespec, yyvsp[-1].declare, yyvsp[0].globals); ;
+    break;}
+case 46:
+#line 487 "llgrammar.y"
+{ yyval.fcn = makeFcnNode (qual_createUnknown (), yyvsp[-12].lcltypespec, yyvsp[-11].declare, yyvsp[-10].globals, yyvsp[-7].vardeclarationlist, yyvsp[-6].letdecls, 
+		       yyvsp[-5].lclpredicate, yyvsp[-4].lclpredicate, yyvsp[-3].modify, yyvsp[-2].lclpredicate, yyvsp[-1].lclpredicate); 
+     /* type, declarator, glovbls, privateinits,
+	lets, checks, requires, modifies, ensures, claims */
+     symtable_exitScope (g_symtab);
+   ;
+    break;}
+case 47:
+#line 493 "llgrammar.y"
+{ enteringFcnScope (yyvsp[-2].lcltypespec, yyvsp[-1].declare, yyvsp[0].globals); ;
+    break;}
+case 48:
+#line 497 "llgrammar.y"
+{ yyval.fcn = makeFcnNode (yyvsp[-13].typequal, yyvsp[-12].lcltypespec, yyvsp[-11].declare, yyvsp[-10].globals, yyvsp[-7].vardeclarationlist, 
+		       yyvsp[-6].letdecls, yyvsp[-5].lclpredicate, yyvsp[-4].lclpredicate, yyvsp[-3].modify, yyvsp[-2].lclpredicate, yyvsp[-1].lclpredicate); 
+     /* type, declarator, glovbls, privateinits,
+	lets, checks, requires, modifies, ensures, claims */
+     symtable_exitScope (g_symtab);
+   ;
+    break;}
+case 49:
+#line 507 "llgrammar.y"
+{ enteringClaimScope (yyvsp[-2].paramlist, yyvsp[0].globals); ;
+    break;}
+case 50:
+#line 509 "llgrammar.y"
+{      yyval.claim = makeClaimNode (yyvsp[-11].ltok, yyvsp[-9].paramlist, yyvsp[-7].globals, yyvsp[-4].letdecls, yyvsp[-3].lclpredicate, yyvsp[-2].program, yyvsp[-1].lclpredicate); 
+     symtable_exitScope (g_symtab); ;
+    break;}
+case 51:
+#line 512 "llgrammar.y"
+{ yyval.claim = (claimNode) 0; ;
+    break;}
+case 52:
+#line 515 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 53:
+#line 515 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 54:
+#line 516 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-5].ltok, yyvsp[-2].ltok, TRUE, FALSE, yyvsp[0].abstbody); ;
+    break;}
+case 55:
+#line 517 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 56:
+#line 518 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 57:
+#line 519 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-6].ltok, yyvsp[-2].ltok, TRUE, TRUE, yyvsp[0].abstbody); ;
+    break;}
+case 58:
+#line 520 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 59:
+#line 521 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 60:
+#line 522 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-5].ltok, yyvsp[-2].ltok, TRUE, TRUE, yyvsp[0].abstbody); ;
+    break;}
+case 61:
+#line 523 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 62:
+#line 523 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 63:
+#line 524 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-5].ltok, yyvsp[-2].ltok, FALSE, FALSE, yyvsp[0].abstbody); ;
+    break;}
+case 64:
+#line 527 "llgrammar.y"
+{ g_inTypeDef = TRUE; setExposedType (yyvsp[0].lcltypespec); ;
+    break;}
+case 65:
+#line 528 "llgrammar.y"
+{ g_inTypeDef = FALSE; ;
+    break;}
+case 66:
+#line 529 "llgrammar.y"
+{ yyval.exposed = makeExposedNode (yyvsp[-5].ltok, yyvsp[-4].lcltypespec, yyvsp[-2].declaratorinvs); /* to support mutually recursive types */ ;
+    break;}
+case 67:
+#line 531 "llgrammar.y"
+{ yyval.exposed = makeExposedNode (yyvsp[0].ltok, makeLclTypeSpecNodeSU (yyvsp[-1].structorunion), declaratorInvNodeList_new ()); ;
+    break;}
+case 68:
+#line 533 "llgrammar.y"
+{ yyval.exposed = makeExposedNode (yyvsp[0].ltok, makeLclTypeSpecNodeEnum (yyvsp[-1].enumspec), declaratorInvNodeList_new ()); ;
+    break;}
+case 69:
+#line 549 "llgrammar.y"
+{ yyval.importlist = importNodeList_add (importNodeList_new (), yyvsp[0].import); ;
+    break;}
+case 70:
+#line 551 "llgrammar.y"
+{ yyval.importlist = importNodeList_add (yyvsp[-2].importlist, yyvsp[0].import); ;
+    break;}
+case 71:
+#line 554 "llgrammar.y"
+{ yyval.import = importNode_makePlain (yyvsp[0].ltok); ;
+    break;}
+case 72:
+#line 556 "llgrammar.y"
+{ checkBrackets (yyvsp[-2].ltok, yyvsp[0].ltok); yyval.import = importNode_makeBracketed (yyvsp[-1].ltok); ;
+    break;}
+case 73:
+#line 557 "llgrammar.y"
+{ yyval.import = importNode_makeQuoted (yyvsp[0].ltok); ;
+    break;}
+case 74:
+#line 560 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 75:
+#line 561 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 77:
+#line 569 "llgrammar.y"
+{ yyval.traitreflist = traitRefNodeList_add (traitRefNodeList_new (), yyvsp[0].traitref); ;
+    break;}
+case 78:
+#line 571 "llgrammar.y"
+{ yyval.traitreflist = traitRefNodeList_add (yyvsp[-2].traitreflist, yyvsp[0].traitref); ;
+    break;}
+case 79:
+#line 575 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (ltokenList_singleton (yyvsp[0].ltok), (renamingNode)0); ;
+    break;}
+case 80:
+#line 577 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (ltokenList_singleton (yyvsp[-3].ltok), yyvsp[-1].renaming); ;
+    break;}
+case 81:
+#line 579 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (yyvsp[-1].ltokenList, (renamingNode)0); ;
+    break;}
+case 82:
+#line 581 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (yyvsp[-4].ltokenList, yyvsp[-1].renaming); ;
+    break;}
+case 83:
+#line 584 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 84:
+#line 585 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 85:
+#line 589 "llgrammar.y"
+{ yyval.renaming = makeRenamingNode (typeNameNodeList_new (), yyvsp[0].replacelist); ;
+    break;}
+case 86:
+#line 591 "llgrammar.y"
+{ yyval.renaming = makeRenamingNode (yyvsp[0].namelist, replaceNodeList_new ()); ;
+    break;}
+case 87:
+#line 592 "llgrammar.y"
+{ yyval.renaming = makeRenamingNode (yyvsp[-2].namelist, yyvsp[0].replacelist); ;
+    break;}
+case 88:
+#line 596 "llgrammar.y"
+{ yyval.namelist = typeNameNodeList_add (typeNameNodeList_new (), yyvsp[0].typname); ;
+    break;}
+case 89:
+#line 597 "llgrammar.y"
+{ yyval.namelist = typeNameNodeList_add (yyvsp[-2].namelist, yyvsp[0].typname); ;
+    break;}
+case 90:
+#line 601 "llgrammar.y"
+{ yyval.replacelist = replaceNodeList_add (replaceNodeList_new (), yyvsp[0].replace); ;
+    break;}
+case 91:
+#line 602 "llgrammar.y"
+{ yyval.replacelist = replaceNodeList_add (yyvsp[-2].replacelist, yyvsp[0].replace); ;
+    break;}
+case 92:
+#line 605 "llgrammar.y"
+{ yyval.replace = makeReplaceNode (yyvsp[-1].ltok, yyvsp[-2].typname, TRUE, yyvsp[0].ltok, NULL, NULL); ;
+    break;}
+case 93:
+#line 606 "llgrammar.y"
+{ yyval.replace = makeReplaceNameNode (yyvsp[-1].ltok, yyvsp[-2].typname, yyvsp[0].name); ;
+    break;}
+case 94:
+#line 607 "llgrammar.y"
+{ yyval.replace = makeReplaceNode (yyvsp[-2].ltok, yyvsp[-3].typname, FALSE, ltoken_undefined,
+							 yyvsp[-1].name, yyvsp[0].signature); ;
+    break;}
+case 95:
+#line 611 "llgrammar.y"
+{ yyval.name = makeNameNodeId (yyvsp[0].ltok); ;
+    break;}
+case 96:
+#line 612 "llgrammar.y"
+{ yyval.name = makeNameNodeForm (yyvsp[0].opform); ;
+    break;}
+case 99:
+#line 620 "llgrammar.y"
+{ yyval.initdecls = initDeclNodeList_add (initDeclNodeList_new (), yyvsp[0].initdecl); ;
+    break;}
+case 100:
+#line 622 "llgrammar.y"
+{ yyval.initdecls = initDeclNodeList_add (yyvsp[-2].initdecls, yyvsp[0].initdecl); ;
+    break;}
+case 101:
+#line 625 "llgrammar.y"
+{ yyval.initdecl = makeInitDeclNode (yyvsp[0].declare, (termNode)0); ;
+    break;}
+case 102:
+#line 626 "llgrammar.y"
+{ yyval.initdecl = makeInitDeclNode (yyvsp[-2].declare, yyvsp[0].term); ;
+    break;}
+case 103:
+#line 630 "llgrammar.y"
+{ yyval.globals = varDeclarationNodeList_new (); ;
+    break;}
+case 104:
+#line 632 "llgrammar.y"
+{ varDeclarationNodeList_addh (yyvsp[-1].globals, yyvsp[0].vardeclaration); yyval.globals = yyvsp[-1].globals; ;
+    break;}
+case 105:
+#line 635 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, TRUE, FALSE); ;
+    break;}
+case 106:
+#line 636 "llgrammar.y"
+{ yyval.vardeclaration = makeInternalStateNode (); ;
+    break;}
+case 107:
+#line 637 "llgrammar.y"
+{ yyval.vardeclaration = makeFileSystemNode (); ;
+    break;}
+case 108:
+#line 640 "llgrammar.y"
+{ yyval.vardeclarationlist = varDeclarationNodeList_new (); ;
+    break;}
+case 109:
+#line 641 "llgrammar.y"
+{ varDeclarationNodeList_addh (yyvsp[-1].vardeclarationlist, yyvsp[0].vardeclaration); yyval.vardeclarationlist = yyvsp[-1].vardeclarationlist; ;
+    break;}
+case 110:
+#line 645 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, TRUE); ;
+    break;}
+case 111:
+#line 648 "llgrammar.y"
+{ yyval.letdecls = letDeclNodeList_new (); ;
+    break;}
+case 112:
+#line 649 "llgrammar.y"
+{ yyval.letdecls = yyvsp[-1].letdecls; ;
+    break;}
+case 113:
+#line 652 "llgrammar.y"
+{ yyval.letdecls = letDeclNodeList_add (letDeclNodeList_new (), yyvsp[0].letdecl); ;
+    break;}
+case 114:
+#line 653 "llgrammar.y"
+{ yyval.letdecls = letDeclNodeList_add (yyvsp[-2].letdecls, yyvsp[0].letdecl); ;
+    break;}
+case 115:
+#line 656 "llgrammar.y"
+{ yyval.letdecl = makeLetDeclNode (yyvsp[-4].ltok, yyvsp[-2].lcltypespec, yyvsp[0].term); ;
+    break;}
+case 116:
+#line 657 "llgrammar.y"
+{ yyval.letdecl = makeLetDeclNode (yyvsp[-2].ltok, (lclTypeSpecNode)0, yyvsp[0].term); ;
+    break;}
+case 118:
+#line 662 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 119:
+#line 663 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeChecksNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); ;
+    break;}
+case 120:
+#line 666 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 121:
+#line 667 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeRequiresNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate);;
+    break;}
+case 122:
+#line 670 "llgrammar.y"
+{ yyval.modify = (modifyNode)0; ;
+    break;}
+case 123:
+#line 671 "llgrammar.y"
+{ yyval.modify = makeModifyNodeSpecial (yyvsp[-2].ltok, TRUE); ;
+    break;}
+case 124:
+#line 672 "llgrammar.y"
+{ yyval.modify = makeModifyNodeSpecial (yyvsp[-2].ltok, FALSE); ;
+    break;}
+case 125:
+#line 673 "llgrammar.y"
+{ yyval.modify = makeModifyNodeRef (yyvsp[-2].ltok, yyvsp[-1].storereflist); ;
+    break;}
+case 126:
+#line 676 "llgrammar.y"
+{ yyval.storereflist = storeRefNodeList_add (storeRefNodeList_new (), yyvsp[0].storeref); ;
+    break;}
+case 127:
+#line 677 "llgrammar.y"
+{ yyval.storereflist = storeRefNodeList_add (yyvsp[-2].storereflist, yyvsp[0].storeref); ;
+    break;}
+case 128:
+#line 680 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeTerm (yyvsp[0].term); ;
+    break;}
+case 129:
+#line 681 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeType (yyvsp[0].lcltypespec, FALSE); ;
+    break;}
+case 130:
+#line 682 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeType (yyvsp[0].lcltypespec, TRUE); ;
+    break;}
+case 131:
+#line 683 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeInternal (); ;
+    break;}
+case 132:
+#line 684 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeSystem (); ;
+    break;}
+case 133:
+#line 687 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 134:
+#line 688 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeEnsuresNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate);;
+    break;}
+case 135:
+#line 691 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 136:
+#line 692 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeIntraClaimNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate);;
+    break;}
+case 137:
+#line 695 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_new (); ;
+    break;}
+case 138:
+#line 696 "llgrammar.y"
+{ yyval.paramlist = yyvsp[0].paramlist; ;
+    break;}
+case 140:
+#line 700 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (paramNodeList_new (), paramNode_elipsis ()); ;
+    break;}
+case 141:
+#line 701 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (yyvsp[-2].paramlist, paramNode_elipsis ()); ;
+    break;}
+case 142:
+#line 704 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_single (yyvsp[0].param); ;
+    break;}
+case 143:
+#line 705 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (yyvsp[-2].paramlist, yyvsp[0].param); ;
+    break;}
+case 144:
+#line 708 "llgrammar.y"
+{ yyval.program = (programNode)0; ;
+    break;}
+case 145:
+#line 709 "llgrammar.y"
+{ yyval.program = yyvsp[-1].program; ;
+    break;}
+case 146:
+#line 710 "llgrammar.y"
+{ yyval.program = yyvsp[-2].program; ;
+    break;}
+case 147:
+#line 713 "llgrammar.y"
+{ yyval.program = makeProgramNode (yyvsp[0].stmt); ;
+    break;}
+case 148:
+#line 716 "llgrammar.y"
+{ yyval.program = yyvsp[-1].program; yyval.program->wrapped = yyval.program->wrapped + 1; ;
+    break;}
+case 149:
+#line 718 "llgrammar.y"
+{ programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, yyvsp[-1].program);
+     yyval.program = makeProgramNodeAction (x, ACT_ITER); 
+   ;
+    break;}
+case 150:
+#line 723 "llgrammar.y"
+{ programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, yyvsp[-2].program);
+     programNodeList_addh (x, yyvsp[0].program);
+     yyval.program = makeProgramNodeAction (x, ACT_ALTERNATE); 
+   ;
+    break;}
+case 151:
+#line 729 "llgrammar.y"
+{ programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, yyvsp[-2].program);
+     programNodeList_addh (x, yyvsp[0].program);
+     yyval.program = makeProgramNodeAction (x, ACT_SEQUENCE); 
+   ;
+    break;}
+case 152:
+#line 737 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (ltoken_undefined, yyvsp[-3].ltok, yyvsp[-1].termlist); ;
+    break;}
+case 153:
+#line 739 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (ltoken_undefined, yyvsp[-2].ltok, termNodeList_new ()); ;
+    break;}
+case 154:
+#line 741 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (yyvsp[-4].ltok, yyvsp[-2].ltok, termNodeList_new ()); ;
+    break;}
+case 155:
+#line 743 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (yyvsp[-5].ltok, yyvsp[-3].ltok, yyvsp[-1].termlist); ;
+    break;}
+case 156:
+#line 746 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (termNodeList_new (), yyvsp[0].term); ;
+    break;}
+case 157:
+#line 747 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (yyvsp[-2].termlist, yyvsp[0].term); ;
+    break;}
+case 159:
+#line 751 "llgrammar.y"
+{ yyval.term = makeSimpleTermNode (yyvsp[0].ltok); ;
+    break;}
+case 160:
+#line 752 "llgrammar.y"
+{ yyval.term = makePrefixTermNode (yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 161:
+#line 753 "llgrammar.y"
+{ yyval.term = makePostfixTermNode2 (yyvsp[-1].term, yyvsp[0].ltok); ;
+    break;}
+case 162:
+#line 754 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 163:
+#line 755 "llgrammar.y"
+{ yyval.term = yyvsp[-1].term; yyval.term->wrapped = yyval.term->wrapped + 1; ;
+    break;}
+case 164:
+#line 757 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-2].ltok, yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok); ;
+    break;}
+case 165:
+#line 759 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 166:
+#line 762 "llgrammar.y"
+{ yyval.abstbody = (abstBodyNode)0; ;
+    break;}
+case 167:
+#line 763 "llgrammar.y"
+{ yyval.abstbody = makeAbstBodyNode (yyvsp[-2].ltok, yyvsp[-1].fcns); ;
+    break;}
+case 168:
+#line 764 "llgrammar.y"
+{ yyval.abstbody = makeAbstBodyNode2 (yyvsp[-3].ltok, yyvsp[-2].ltokenList); ;
+    break;}
+case 169:
+#line 765 "llgrammar.y"
+{ yyval.abstbody = (abstBodyNode)0; ;
+    break;}
+case 170:
+#line 768 "llgrammar.y"
+{ yyval.fcns = fcnNodeList_new (); ;
+    break;}
+case 171:
+#line 769 "llgrammar.y"
+{ yyval.fcns = fcnNodeList_add (yyvsp[-1].fcns, yyvsp[0].fcn); ;
+    break;}
+case 172:
+#line 772 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 174:
+#line 776 "llgrammar.y"
+{ g_inTypeDef = FALSE; ;
+    break;}
+case 175:
+#line 777 "llgrammar.y"
+{ yyvsp[-1].lclpredicate->tok = yyvsp[-5].ltok; yyvsp[-1].lclpredicate->kind = LPD_CONSTRAINT;
+     checkLclPredicate (yyvsp[-5].ltok, yyvsp[-1].lclpredicate);
+     yyval.lclpredicate = yyvsp[-1].lclpredicate;
+     symtable_exitScope (g_symtab); 
+     g_inTypeDef = TRUE;
+   ;
+    break;}
+case 176:
+#line 785 "llgrammar.y"
+{ yyval.declaratorinvs = declaratorInvNodeList_add (declaratorInvNodeList_new (), yyvsp[0].declaratorinv); ;
+    break;}
+case 177:
+#line 787 "llgrammar.y"
+{ yyval.declaratorinvs = declaratorInvNodeList_add (yyvsp[-2].declaratorinvs, yyvsp[0].declaratorinv); ;
+    break;}
+case 178:
+#line 790 "llgrammar.y"
+{ declareForwardType (yyvsp[0].declare); ;
+    break;}
+case 179:
+#line 791 "llgrammar.y"
+{ yyval.declaratorinv = makeDeclaratorInvNode (yyvsp[-2].declare, yyvsp[0].abstbody); ;
+    break;}
+case 180:
+#line 794 "llgrammar.y"
+{ yyval.abstbody = (abstBodyNode)0; ;
+    break;}
+case 181:
+#line 795 "llgrammar.y"
+{ yyval.abstbody = makeExposedBodyNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); ;
+    break;}
+case 182:
+#line 798 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_VOID, 0)); ;
+    break;}
+case 183:
+#line 799 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_CHAR, 0)); ;
+    break;}
+case 184:
+#line 800 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_DOUBLE, 0)); ;
+    break;}
+case 185:
+#line 801 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_FLOAT, 0)); ;
+    break;}
+case 186:
+#line 802 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_INT, 0)); ;
+    break;}
+case 187:
+#line 803 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_LONG, 0)); ;
+    break;}
+case 188:
+#line 804 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_SHORT, 0)); ;
+    break;}
+case 189:
+#line 805 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_SIGNED, 0)); ;
+    break;}
+case 190:
+#line 806 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_UNSIGNED, 0)); ;
+    break;}
+case 191:
+#line 807 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_UNKNOWN, 0)); ;
+    break;}
+case 192:
+#line 815 "llgrammar.y"
+{ yyval.ctypes = makeCTypesNode ((CTypesNode)0, yyvsp[0].ltok); ;
+    break;}
+case 193:
+#line 816 "llgrammar.y"
+{ yyval.ctypes = makeCTypesNode (yyvsp[-1].ctypes, yyvsp[0].ltok); ;
+    break;}
+case 194:
+#line 822 "llgrammar.y"
+{ yyval.ctypes = makeTypeSpecifier (yyvsp[0].ltok); ;
+    break;}
+case 195:
+#line 824 "llgrammar.y"
+{ yyval.ctypes = yyvsp[0].ctypes; yyval.ctypes->sort = sort_lookupName (lclctype_toSort (yyvsp[0].ctypes->intfield)); ;
+    break;}
+case 196:
+#line 829 "llgrammar.y"
+{ yyval.typequal = qual_createOut (); ;
+    break;}
+case 197:
+#line 830 "llgrammar.y"
+{ yyval.typequal = qual_createUnused (); ;
+    break;}
+case 198:
+#line 831 "llgrammar.y"
+{ yyval.typequal = qual_createSef (); ;
+    break;}
+case 199:
+#line 832 "llgrammar.y"
+{ yyval.typequal = qual_createOnly (); ;
+    break;}
+case 200:
+#line 833 "llgrammar.y"
+{ yyval.typequal = qual_createOwned (); ;
+    break;}
+case 201:
+#line 834 "llgrammar.y"
+{ yyval.typequal = qual_createDependent (); ;
+    break;}
+case 202:
+#line 835 "llgrammar.y"
+{ yyval.typequal = qual_createKeep (); ;
+    break;}
+case 203:
+#line 836 "llgrammar.y"
+{ yyval.typequal = qual_createKept (); ;
+    break;}
+case 204:
+#line 837 "llgrammar.y"
+{ yyval.typequal = qual_createObserver (); ;
+    break;}
+case 205:
+#line 838 "llgrammar.y"
+{ yyval.typequal = qual_createExits (); ;
+    break;}
+case 206:
+#line 839 "llgrammar.y"
+{ yyval.typequal = qual_createMayExit (); ;
+    break;}
+case 207:
+#line 840 "llgrammar.y"
+{ yyval.typequal = qual_createTrueExit (); ;
+    break;}
+case 208:
+#line 841 "llgrammar.y"
+{ yyval.typequal = qual_createFalseExit (); ;
+    break;}
+case 209:
+#line 842 "llgrammar.y"
+{ yyval.typequal = qual_createNeverExit (); ;
+    break;}
+case 210:
+#line 843 "llgrammar.y"
+{ yyval.typequal = qual_createOnly (); ;
+    break;}
+case 211:
+#line 844 "llgrammar.y"
+{ yyval.typequal = qual_createShared (); ;
+    break;}
+case 212:
+#line 845 "llgrammar.y"
+{ yyval.typequal = qual_createUnique (); ;
+    break;}
+case 213:
+#line 846 "llgrammar.y"
+{ yyval.typequal = qual_createChecked (); ;
+    break;}
+case 214:
+#line 847 "llgrammar.y"
+{ yyval.typequal = qual_createUnchecked (); ;
+    break;}
+case 215:
+#line 848 "llgrammar.y"
+{ yyval.typequal = qual_createCheckedStrict (); ;
+    break;}
+case 216:
+#line 849 "llgrammar.y"
+{ yyval.typequal = qual_createTrueNull (); ;
+    break;}
+case 217:
+#line 850 "llgrammar.y"
+{ yyval.typequal = qual_createFalseNull (); ;
+    break;}
+case 218:
+#line 851 "llgrammar.y"
+{ yyval.typequal = qual_createRelNull (); ;
+    break;}
+case 219:
+#line 852 "llgrammar.y"
+{ yyval.typequal = qual_createRelDef (); ;
+    break;}
+case 220:
+#line 853 "llgrammar.y"
+{ yyval.typequal = qual_createRefCounted (); ;
+    break;}
+case 221:
+#line 854 "llgrammar.y"
+{ yyval.typequal = qual_createRefs (); ;
+    break;}
+case 222:
+#line 855 "llgrammar.y"
+{ yyval.typequal = qual_createNewRef (); ;
+    break;}
+case 223:
+#line 856 "llgrammar.y"
+{ yyval.typequal = qual_createKillRef (); ;
+    break;}
+case 224:
+#line 857 "llgrammar.y"
+{ yyval.typequal = qual_createNull (); ;
+    break;}
+case 225:
+#line 858 "llgrammar.y"
+{ yyval.typequal = qual_createNotNull (); ;
+    break;}
+case 226:
+#line 859 "llgrammar.y"
+{ yyval.typequal = qual_createReturned (); ;
+    break;}
+case 227:
+#line 860 "llgrammar.y"
+{ yyval.typequal = qual_createExposed (); ;
+    break;}
+case 228:
+#line 861 "llgrammar.y"
+{ yyval.typequal = qual_createPartial (); ;
+    break;}
+case 229:
+#line 862 "llgrammar.y"
+{ yyval.typequal = qual_createUndef (); ;
+    break;}
+case 230:
+#line 863 "llgrammar.y"
+{ yyval.typequal = qual_createKilled (); ;
+    break;}
+case 231:
+#line 867 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeType (yyvsp[0].ctypes); ;
+    break;}
+case 232:
+#line 869 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeSU (yyvsp[0].structorunion); ;
+    break;}
+case 233:
+#line 871 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeEnum (yyvsp[0].enumspec); ;
+    break;}
+case 234:
+#line 873 "llgrammar.y"
+{ yyval.lcltypespec = lclTypeSpecNode_addQual (yyvsp[0].lcltypespec, yyvsp[-1].typequal); ;
+    break;}
+case 235:
+#line 875 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeConj (yyvsp[-3].lcltypespec, yyvsp[-1].lcltypespec); ;
+    break;}
+case 237:
+#line 885 "llgrammar.y"
+{ llassert (lclTypeSpecNode_isDefined (yyvsp[-1].lcltypespec));
+     yyvsp[-1].lcltypespec->pointers = yyvsp[0].count; yyval.lcltypespec = yyvsp[-1].lcltypespec; ;
+    break;}
+case 238:
+#line 889 "llgrammar.y"
+{ yyval.count = 1; ;
+    break;}
+case 239:
+#line 890 "llgrammar.y"
+{ yyval.count = yyvsp[-1].count + 1; ;
+    break;}
+case 240:
+#line 894 "llgrammar.y"
+{ (void) checkAndEnterTag (TAG_FWDSTRUCT, ltoken_copy (yyvsp[0].ltok)); ;
+    break;}
+case 241:
+#line 896 "llgrammar.y"
+{ yyval.structorunion = makestrOrUnionNode (yyvsp[-5].ltok, SU_STRUCT, yyvsp[-4].ltok, yyvsp[-1].structdecls); ;
+    break;}
+case 242:
+#line 898 "llgrammar.y"
+{ (void) checkAndEnterTag (TAG_FWDUNION, ltoken_copy (yyvsp[0].ltok)); ;
+    break;}
+case 243:
+#line 900 "llgrammar.y"
+{ yyval.structorunion = makestrOrUnionNode (yyvsp[-5].ltok, SU_UNION, yyvsp[-4].ltok, yyvsp[-1].structdecls); ;
+    break;}
+case 244:
+#line 902 "llgrammar.y"
+{ yyval.structorunion = makeForwardstrOrUnionNode (yyvsp[-1].ltok, SU_STRUCT, yyvsp[0].ltok); ;
+    break;}
+case 245:
+#line 904 "llgrammar.y"
+{ yyval.structorunion = makeForwardstrOrUnionNode (yyvsp[-1].ltok, SU_UNION, yyvsp[0].ltok); ;
+    break;}
+case 246:
+#line 907 "llgrammar.y"
+{ yyval.ltok = ltoken_undefined; ;
+    break;}
+case 248:
+#line 911 "llgrammar.y"
+{ yyval.structdecls = stDeclNodeList_add (stDeclNodeList_new (), yyvsp[0].structdecl); ;
+    break;}
+case 249:
+#line 912 "llgrammar.y"
+{ yyval.structdecls = stDeclNodeList_add (yyvsp[-1].structdecls, yyvsp[0].structdecl); ;
+    break;}
+case 250:
+#line 917 "llgrammar.y"
+{ yyval.structdecl = makestDeclNode (yyvsp[-2].lcltypespec, yyvsp[-1].declarelist); ;
+    break;}
+case 251:
+#line 921 "llgrammar.y"
+{ yyval.declarelist = declaratorNodeList_add (declaratorNodeList_new (), yyvsp[0].declare); ;
+    break;}
+case 252:
+#line 923 "llgrammar.y"
+{ yyval.declarelist = declaratorNodeList_add (yyvsp[-2].declarelist, yyvsp[0].declare); ;
+    break;}
+case 253:
+#line 926 "llgrammar.y"
+{ ; ;
+    break;}
+case 254:
+#line 927 "llgrammar.y"
+{ ; ;
+    break;}
+case 255:
+#line 931 "llgrammar.y"
+{ yyval.enumspec = makeEnumSpecNode (yyvsp[-5].ltok, yyvsp[-4].ltok, yyvsp[-2].ltokenList); ;
+    break;}
+case 256:
+#line 933 "llgrammar.y"
+{ yyval.enumspec = makeEnumSpecNode2 (yyvsp[-1].ltok, yyvsp[0].ltok); ;
+    break;}
+case 257:
+#line 936 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 258:
+#line 937 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 259:
+#line 947 "llgrammar.y"
+{ yyval.declare = makeDeclaratorNode (yyvsp[0].typeexpr); ;
+    break;}
+case 260:
+#line 948 "llgrammar.y"
+{ yyval.declare = makeDeclaratorNode (yyvsp[0].typeexpr); ;
+    break;}
+case 261:
+#line 951 "llgrammar.y"
+{ yyval.typeexpr = makeTypeExpr (yyvsp[0].ltok); ;
+    break;}
+case 262:
+#line 952 "llgrammar.y"
+{ yyval.typeexpr = yyvsp[-1].typeexpr; yyval.typeexpr->wrapped = yyval.typeexpr->wrapped + 1; ;
+    break;}
+case 263:
+#line 953 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 264:
+#line 954 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 265:
+#line 955 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 266:
+#line 956 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 267:
+#line 959 "llgrammar.y"
+{ yyval.typeexpr = makeTypeExpr (yyvsp[0].ltok); ;
+    break;}
+case 268:
+#line 960 "llgrammar.y"
+{ yyval.typeexpr = yyvsp[-1].typeexpr; yyval.typeexpr->wrapped = yyval.typeexpr->wrapped + 1; ;
+    break;}
+case 269:
+#line 961 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 270:
+#line 962 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 271:
+#line 963 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 272:
+#line 964 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 273:
+#line 973 "llgrammar.y"
+{ yyval.typeexpr = makeTypeExpr (yyvsp[0].ltok); ;
+    break;}
+case 274:
+#line 974 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 275:
+#line 975 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 276:
+#line 976 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 277:
+#line 977 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 278:
+#line 983 "llgrammar.y"
+{ yyval.param = makeParamNode (yyvsp[-1].lcltypespec, yyvsp[0].typeexpr); ;
+    break;}
+case 279:
+#line 984 "llgrammar.y"
+{ yyval.param = makeParamNode (yyvsp[-1].lcltypespec, yyvsp[0].typeexpr); ;
+    break;}
+case 280:
+#line 985 "llgrammar.y"
+{ yyval.param = makeParamNode (yyvsp[-1].lcltypespec, yyvsp[0].abstDecl); ;
+    break;}
+case 281:
+#line 995 "llgrammar.y"
+{ yyval.typname = makeTypeNameNode (FALSE, yyvsp[-1].lcltypespec, yyvsp[0].abstDecl); ;
+    break;}
+case 282:
+#line 996 "llgrammar.y"
+{ yyval.typname = makeTypeNameNode (TRUE, yyvsp[-1].lcltypespec, yyvsp[0].abstDecl); ;
+    break;}
+case 283:
+#line 997 "llgrammar.y"
+{ yyval.typname = makeTypeNameNodeOp (yyvsp[0].opform); ;
+    break;}
+case 284:
+#line 1002 "llgrammar.y"
+{ yyval.abstDecl = (abstDeclaratorNode)0; ;
+    break;}
+case 285:
+#line 1003 "llgrammar.y"
+{ yyval.abstDecl = (abstDeclaratorNode)yyvsp[0].typeexpr; ;
+    break;}
+case 286:
+#line 1006 "llgrammar.y"
+{ yyval.typeexpr = yyvsp[-1].typeexpr; yyval.typeexpr->wrapped = yyval.typeexpr->wrapped + 1; ;
+    break;}
+case 287:
+#line 1007 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 288:
+#line 1008 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[0].ltok, (typeExpr)0); ;
+    break;}
+case 289:
+#line 1009 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode ((typeExpr)0, yyvsp[0].array); ;
+    break;}
+case 290:
+#line 1010 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 291:
+#line 1011 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 292:
+#line 1012 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode ((typeExpr)0, yyvsp[-1].paramlist); ;
+    break;}
+case 293:
+#line 1013 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 294:
+#line 1016 "llgrammar.y"
+{ yyval.array = makeArrayQualNode (yyvsp[-1].ltok, (termNode)0); ;
+    break;}
+case 295:
+#line 1017 "llgrammar.y"
+{ yyval.array = makeArrayQualNode (yyvsp[-2].ltok, yyvsp[-1].term); ;
+    break;}
+case 296:
+#line 1021 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-5].ltok, OPF_IF, opFormUnion_createMiddle (0), ltoken_undefined); ;
+    break;}
+case 297:
+#line 1023 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[0].ltok, OPF_ANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 298:
+#line 1025 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_MANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 299:
+#line 1027 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_ANYOPM, opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 300:
+#line 1029 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MANYOPM, 
+			  opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 301:
+#line 1032 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 302:
+#line 1034 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 303:
+#line 1036 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 304:
+#line 1038 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MMIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 305:
+#line 1040 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 306:
+#line 1042 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 307:
+#line 1050 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 308:
+#line 1052 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMMIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 309:
+#line 1054 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_SELECT, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 310:
+#line 1057 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_MAP, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 311:
+#line 1060 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MSELECT, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 312:
+#line 1063 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MMAP, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 320:
+#line 1080 "llgrammar.y"
+{ yyval.count = 0; ;
+    break;}
+case 322:
+#line 1084 "llgrammar.y"
+{ yyval.count = 1; ;
+    break;}
+case 323:
+#line 1085 "llgrammar.y"
+{ yyval.count = yyvsp[-2].count + 1; ;
+    break;}
+case 326:
+#line 1092 "llgrammar.y"
+{ yyval.signature = makesigNode (yyvsp[-3].ltok, yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 327:
+#line 1095 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_new (); ;
+    break;}
+case 329:
+#line 1099 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 330:
+#line 1100 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 331:
+#line 1103 "llgrammar.y"
+{ yyval.lclpredicate = makeLclPredicateNode (ltoken_undefined, yyvsp[0].term, LPD_PLAIN);;
+    break;}
+case 332:
+#line 1106 "llgrammar.y"
+{ yyval.term = checkSort (yyvsp[0].term); ;
+    break;}
+case 333:
+#line 1113 "llgrammar.y"
+{ yyval.term = makeIfTermNode (yyvsp[-5].ltok,yyvsp[-4].term,yyvsp[-3].ltok,yyvsp[-2].term,yyvsp[-1].ltok,yyvsp[0].term); ;
+    break;}
+case 335:
+#line 1115 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 337:
+#line 1121 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.term = makeQuantifiedTermNode (yyvsp[-3].quantifiers, yyvsp[-2].ltok, yyvsp[-1].lclpredicate->predicate, yyvsp[0].ltok);
+     symtable_exitScope (g_symtab); 
+   ;
+    break;}
+case 338:
+#line 1125 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term);;
+    break;}
+case 339:
+#line 1127 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term);;
+    break;}
+case 341:
+#line 1131 "llgrammar.y"
+{ yyval.term = makePostfixTermNode (yyvsp[-1].term, yyvsp[0].ltokenList); ;
+    break;}
+case 342:
+#line 1132 "llgrammar.y"
+{ yyval.term = CollapseInfixTermNode (yyvsp[-1].term, yyvsp[0].termlist); ;
+    break;}
+case 346:
+#line 1140 "llgrammar.y"
+{ yyval.term = makePrefixTermNode (yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 347:
+#line 1143 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 348:
+#line 1144 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-1].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 349:
+#line 1147 "llgrammar.y"
+{ yyval.termlist = pushInfixOpPartNode (termNodeList_new (), yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 350:
+#line 1148 "llgrammar.y"
+{ yyval.termlist = pushInfixOpPartNode (yyvsp[-2].termlist, yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 352:
+#line 1152 "llgrammar.y"
+{ yyval.term = computePossibleSorts (yyvsp[0].term); ;
+    break;}
+case 353:
+#line 1153 "llgrammar.y"
+{ yyval.term = updateMatchedNode ((termNode)0, yyvsp[-1].term, yyvsp[0].term); ;
+    break;}
+case 354:
+#line 1154 "llgrammar.y"
+{ yyval.term = updateMatchedNode (yyvsp[-1].term, yyvsp[0].term, (termNode)0); ;
+    break;}
+case 355:
+#line 1155 "llgrammar.y"
+{ yyval.term = updateMatchedNode (yyvsp[-2].term, yyvsp[-1].term, yyvsp[0].term); ;
+    break;}
+case 356:
+#line 1156 "llgrammar.y"
+{ yyval.term = computePossibleSorts (yyvsp[0].term); ;
+    break;}
+case 357:
+#line 1157 "llgrammar.y"
+{ yyval.term = updateSqBracketedNode ((termNode)0, yyvsp[-1].term, yyvsp[0].term); ;
+    break;}
+case 358:
+#line 1160 "llgrammar.y"
+{ yyval.term = yyvsp[-2].term; yyval.term->sort = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); ;
+    break;}
+case 360:
+#line 1165 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-4].ltok, yyvsp[-3].termlist, yyvsp[-2].ltok); 
+     yyval.term->given = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); ;
+    break;}
+case 361:
+#line 1168 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 362:
+#line 1170 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-3].ltok, termNodeList_new (), yyvsp[-2].ltok); 
+     yyval.term->given = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); 
+   ;
+    break;}
+case 363:
+#line 1174 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok); ;
+    break;}
+case 364:
+#line 1177 "llgrammar.y"
+{ yyval.term = makeMatchedNode (yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 365:
+#line 1178 "llgrammar.y"
+{ yyval.term = makeMatchedNode (yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok); ;
+    break;}
+case 366:
+#line 1181 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (termNodeList_new (), yyvsp[0].term); ;
+    break;}
+case 367:
+#line 1182 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (yyvsp[-2].termlist, yyvsp[0].term); ;
+    break;}
+case 368:
+#line 1186 "llgrammar.y"
+{ yyval.term = yyvsp[-1].term; yyval.term->wrapped = yyval.term->wrapped + 1; ;
+    break;}
+case 369:
+#line 1188 "llgrammar.y"
+{ yyval.term = makeSimpleTermNode (yyvsp[0].ltok); ;
+    break;}
+case 370:
+#line 1190 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 372:
+#line 1193 "llgrammar.y"
+{ yyval.term = makePostfixTermNode2 (yyvsp[-1].term, yyvsp[0].ltok); ;
+    break;}
+case 373:
+#line 1195 "llgrammar.y"
+{ ltoken_markOwned (yyvsp[0].ltok); yyval.term = makeSelectTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].ltok); ;
+    break;}
+case 374:
+#line 1197 "llgrammar.y"
+{ ltoken_markOwned (yyvsp[0].ltok); yyval.term = makeMapTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].ltok); ;
+    break;}
+case 375:
+#line 1199 "llgrammar.y"
+{ yyval.term = updateSqBracketedNode (yyvsp[-2].term, makeSqBracketedNode (yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok), 
+				(termNode)0); ;
+    break;}
+case 376:
+#line 1202 "llgrammar.y"
+{ yyval.term = updateSqBracketedNode (yyvsp[-3].term, makeSqBracketedNode (yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok), (termNode)0); ;
+    break;}
+case 377:
+#line 1204 "llgrammar.y"
+{ yyval.term = yyvsp[-2].term; yyval.term->given = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); ;
+    break;}
+case 378:
+#line 1207 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (termNodeList_new (), yyvsp[0].term); ;
+    break;}
+case 379:
+#line 1208 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (yyvsp[-2].termlist, yyvsp[0].term); ;
+    break;}
+case 385:
+#line 1218 "llgrammar.y"
+{ yyval.term = makeSimpleTermNode (yyvsp[0].ltok); ;
+    break;}
+case 386:
+#line 1219 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 387:
+#line 1220 "llgrammar.y"
+{ yyval.term = makeUnchangedTermNode1 (yyvsp[-3].ltok, yyvsp[-1].ltok); ;
+    break;}
+case 388:
+#line 1221 "llgrammar.y"
+{ yyval.term = makeUnchangedTermNode2 (yyvsp[-3].ltok, yyvsp[-1].storereflist); ;
+    break;}
+case 389:
+#line 1223 "llgrammar.y"
+{ termNodeList x = termNodeList_new (); 
+     termNodeList_addh (x, yyvsp[-1].term);
+     yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, x, yyvsp[0].ltok); 
+   ;
+    break;}
+case 390:
+#line 1228 "llgrammar.y"
+{ termNodeList x = termNodeList_new ();
+     termNodeList_addh (x, yyvsp[-3].term);
+     termNodeList_addh (x, yyvsp[-1].term);
+     yyval.term = makeOpCallTermNode (yyvsp[-5].ltok, yyvsp[-4].ltok, x, yyvsp[0].ltok); 
+   ;
+    break;}
+case 391:
+#line 1233 "llgrammar.y"
+{ yyval.term = makeSizeofTermNode (yyvsp[-3].ltok, yyvsp[-1].lcltypespec); ;
+    break;}
+case 392:
+#line 1243 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_int); ;
+    break;}
+case 393:
+#line 1244 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_cstring); ;
+    break;}
+case 394:
+#line 1245 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_char); ;
+    break;}
+case 395:
+#line 1246 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_double); ;
+    break;}
+case 396:
+#line 1250 "llgrammar.y"
+{ yyval.quantifiers = quantifierNodeList_add (quantifierNodeList_new (), yyvsp[0].quantifier); ;
+    break;}
+case 397:
+#line 1252 "llgrammar.y"
+{ yyval.quantifiers = quantifierNodeList_add (yyvsp[-1].quantifiers, yyvsp[0].quantifier); ;
+    break;}
+case 398:
+#line 1255 "llgrammar.y"
+{ scopeInfo si = (scopeInfo) dmalloc (sizeof (*si));
+		   si->kind = SPE_QUANT;
+		   symtable_enterScope (g_symtab, si); ;
+    break;}
+case 399:
+#line 1259 "llgrammar.y"
+{ yyval.quantifier = makeQuantifierNode (yyvsp[0].vars, yyvsp[-2].ltok); ;
+    break;}
+case 400:
+#line 1262 "llgrammar.y"
+{ yyval.vars = varNodeList_add (varNodeList_new (), yyvsp[0].var); ;
+    break;}
+case 401:
+#line 1263 "llgrammar.y"
+{ yyval.vars = varNodeList_add (yyvsp[-2].vars, yyvsp[0].var); ;
+    break;}
+case 402:
+#line 1266 "llgrammar.y"
+{ yyval.var = makeVarNode (yyvsp[-2].ltok, FALSE, yyvsp[0].lcltypespec); ;
+    break;}
+case 403:
+#line 1267 "llgrammar.y"
+{ yyval.var = makeVarNode (yyvsp[-3].ltok, TRUE, yyvsp[0].lcltypespec); ;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 498 "/usr/share/misc/bison.simple"
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+	{
+	  int size = 0;
+	  char *msg;
+	  int x, count;
+
+	  count = 0;
+	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
+	  for (x = (yyn < 0 ? -yyn : 0);
+	       x < (sizeof(yytname) / sizeof(char *)); x++)
+	    if (yycheck[x + yyn] == x)
+	      size += strlen(yytname[x]) + 15, count++;
+	  msg = (char *) malloc(size + 15);
+	  if (msg != 0)
+	    {
+	      strcpy(msg, "parse error");
+
+	      if (count < 5)
+		{
+		  count = 0;
+		  for (x = (yyn < 0 ? -yyn : 0);
+		       x < (sizeof(yytname) / sizeof(char *)); x++)
+		    if (yycheck[x + yyn] == x)
+		      {
+			strcat(msg, count == 0 ? ", expecting `" : " or `");
+			strcat(msg, yytname[x]);
+			strcat(msg, "'");
+			count++;
+		      }
+		}
+	      yyerror(msg);
+	      free(msg);
+	    }
+	  else
+	    yyerror ("parse error; also virtual memory exceeded");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror("parse error");
+    }
+
+  goto yyerrlab1;
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+	YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;		/* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+}
+#line 1282 "llgrammar.y"
+
+
+# include "bison.reset"
+
+/*
+** yytext is set in lex scanner 
+** extern YYSTYPE yylval;  
+** yylval is defined by code generated by bison 
+*/
+
+void ylerror (char *s) 
+{
+  /* 
+  ** This resetting of the left context is very important when multiple
+  ** files are to be parsed.  We do not want failures to propagate.
+  ** Lex/Yacc does not reset the flags when the parsing goes bad.  
+  ** BEGIN 0;        
+  **/
+
+  /*@-mustfree@*/
+  lclfatalerror (yllval.ltok,
+		 message ("%s: Token code: %s, Token String: %s", 
+			  cstring_fromChars (s), 
+			  ltoken_unparseCodeName (yllval.ltok), 
+			  ltoken_getRawString (yllval.ltok)));
+  /*@=mustfree@*/
+}
+
+static void yyprint (FILE *f, int t, YYSTYPE value) 
+{
+  fprintf (f, " type: %d (%s)", t, 
+	   cstring_toCharsSafe (ltoken_getRawString (value.ltok)));
+}
+
+
+
+
+
+
+
+/*
+** Resets all flags in bison.head
+*/
+
+
+/*@=allmacros@*/
+/*@=boolint@*/
+/*@=charint@*/
+/*@=macroparams@*/
+/*@=macroundef@*/
+/*@=unreachable@*/
+/*@=macrospec@*/
+/*@=varuse@*/
+/*@=ignorequals@*/
+/*@=macrostmt@*/
+/*@=noeffect@*/
+/*@=shadow@*/
+/*@=exitarg@*/
+/*@=macroredef@*/
+/*@=uniondef@*/
+/*@=compdef@*/
+/*@=matchfields@*/
+/*@=exportlocal@*/
+/*@=evalorderuncon@*/
+/*@=exportheader@*/
+/*@=typeuse@*/
+/*@=redecl@*/
+/*@=redef@*/
+/*@=noparams@*/
+/*@=ansireserved@*/
+/*@=fielduse@*/
+/*@=ifblock@*/
+/*@=elseifcomplete@*/
+/*@=whileblock@*/
+/*@=forblock@*/
+/*@=branchstate@*/
+/*@=readonlytrans@*/
+/*@=namechecks@*/
+/*@=usedef@*/
+/*@=systemunrecog@*/
+/*@=dependenttrans@*/
+/*@=unqualifiedtrans@*/
diff --git a/src/llgrammar.c.der b/src/llgrammar.c.der
new file mode 100644
index 0000000..d7b1154
--- /dev/null
+++ b/src/llgrammar.c.der
@@ -0,0 +1,3852 @@
+/*
+** Inserted at beginning of c files generated by bison
+** REMEMBER:  Change bison.reset too.
+*/
+
+/*@-allmacros@*/
+/*@+boolint@*/
+/*@+charint@*/
+/*@-macroparams@*/
+/*@-macroundef@*/
+/*@-unreachable@*/
+/*@-macrospec@*/
+/*@-varuse@*/
+/*@+ignorequals@*/
+/*@-macrostmt@*/
+/*@-noeffect@*/
+/*@-shadow@*/
+/*@-exitarg@*/
+/*@-macroredef@*/
+/*@-uniondef@*/
+/*@-compdef@*/
+/*@-matchfields@*/
+/*@-exportlocal@*/
+/*@-evalorderuncon@*/
+/*@-exportheader@*/
+/*@-typeuse@*/
+/*@-redecl@*/
+/*@-redef@*/
+/*@-noparams@*/
+/*@-ansireserved@*/
+/*@-fielduse@*/
+/*@-ifblock@*/
+/*@-elseifcomplete@*/
+/*@-whileblock@*/
+/*@-forblock@*/
+/*@-branchstate@*/
+/*@-readonlytrans@*/
+/*@-namechecks@*/
+/*@-usedef@*/
+/*@-systemunrecog@*/
+/*@-dependenttrans@*/
+/*@-unqualifiedtrans@*/
+/*@-nullassign@*/
+
+/* < end of bison.head > */
+
+
+/*  A Bison parser, made from llgrammar.y
+ by  GNU Bison version 1.25
+  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define yyparse ylparse
+#define yylex yllex
+#define yyerror ylerror
+#define yylval yllval
+#define yychar ylchar
+#define yydebug yldebug
+#define yynerrs ylnerrs
+#define	simpleOp	258
+#define	PREFIX_OP	259
+#define	POSTFIX_OP	260
+#define	LLT_MULOP	261
+#define	LLT_SEMI	262
+#define	LLT_VERTICALBAR	263
+#define	ITERATION_OP	264
+#define	LLT_LPAR	265
+#define	LLT_LBRACKET	266
+#define	selectSym	267
+#define	LLT_IF_THEN_ELSE	268
+#define	logicalOp	269
+#define	eqSepSym	270
+#define	equationSym	271
+#define	commentSym	272
+#define	LLT_WHITESPACE	273
+#define	LLT_EOL	274
+#define	LLT_TYPEDEF_NAME	275
+#define	quantifierSym	276
+#define	openSym	277
+#define	closeSym	278
+#define	sepSym	279
+#define	simpleId	280
+#define	mapSym	281
+#define	markerSym	282
+#define	preSym	283
+#define	postSym	284
+#define	anySym	285
+#define	LLT_COLON	286
+#define	LLT_COMMA	287
+#define	LLT_EQUALS	288
+#define	LLT_LBRACE	289
+#define	LLT_RBRACE	290
+#define	LLT_RBRACKET	291
+#define	LLT_RPAR	292
+#define	LLT_QUOTE	293
+#define	eqOp	294
+#define	LLT_CCHAR	295
+#define	LLT_CFLOAT	296
+#define	LLT_CINTEGER	297
+#define	LLT_LCSTRING	298
+#define	LLT_ALL	299
+#define	LLT_ANYTHING	300
+#define	LLT_BE	301
+#define	LLT_BODY	302
+#define	LLT_CLAIMS	303
+#define	LLT_CHECKS	304
+#define	LLT_CONSTANT	305
+#define	LLT_ELSE	306
+#define	LLT_ENSURES	307
+#define	LLT_FOR	308
+#define	LLT_FRESH	309
+#define	LLT_IF	310
+#define	LLT_IMMUTABLE	311
+#define	LLT_IMPORTS	312
+#define	LLT_CONSTRAINT	313
+#define	LLT_ISSUB	314
+#define	LLT_LET	315
+#define	LLT_MODIFIES	316
+#define	LLT_MUTABLE	317
+#define	LLT_NOTHING	318
+#define	LLT_INTERNAL	319
+#define	LLT_FILESYS	320
+#define	LLT_OBJ	321
+#define	LLT_OUT	322
+#define	LLT_SEF	323
+#define	LLT_ONLY	324
+#define	LLT_PARTIAL	325
+#define	LLT_OWNED	326
+#define	LLT_DEPENDENT	327
+#define	LLT_KEEP	328
+#define	LLT_KEPT	329
+#define	LLT_TEMP	330
+#define	LLT_SHARED	331
+#define	LLT_UNIQUE	332
+#define	LLT_UNUSED	333
+#define	LLT_EXITS	334
+#define	LLT_MAYEXIT	335
+#define	LLT_NEVEREXIT	336
+#define	LLT_TRUEEXIT	337
+#define	LLT_FALSEEXIT	338
+#define	LLT_UNDEF	339
+#define	LLT_KILLED	340
+#define	LLT_CHECKMOD	341
+#define	LLT_CHECKED	342
+#define	LLT_UNCHECKED	343
+#define	LLT_CHECKEDSTRICT	344
+#define	LLT_TRUENULL	345
+#define	LLT_FALSENULL	346
+#define	LLT_LNULL	347
+#define	LLT_LNOTNULL	348
+#define	LLT_RETURNED	349
+#define	LLT_OBSERVER	350
+#define	LLT_EXPOSED	351
+#define	LLT_REFCOUNTED	352
+#define	LLT_REFS	353
+#define	LLT_RELNULL	354
+#define	LLT_RELDEF	355
+#define	LLT_KILLREF	356
+#define	LLT_TEMPREF	357
+#define	LLT_NEWREF	358
+#define	LLT_PRIVATE	359
+#define	LLT_REQUIRES	360
+#define	LLT_RESULT	361
+#define	LLT_SIZEOF	362
+#define	LLT_SPEC	363
+#define	LLT_TAGGEDUNION	364
+#define	LLT_THEN	365
+#define	LLT_TYPE	366
+#define	LLT_TYPEDEF	367
+#define	LLT_UNCHANGED	368
+#define	LLT_USES	369
+#define	LLT_CHAR	370
+#define	LLT_CONST	371
+#define	LLT_DOUBLE	372
+#define	LLT_ENUM	373
+#define	LLT_FLOAT	374
+#define	LLT_INT	375
+#define	LLT_ITER	376
+#define	LLT_YIELD	377
+#define	LLT_LONG	378
+#define	LLT_SHORT	379
+#define	LLT_SIGNED	380
+#define	LLT_UNKNOWN	381
+#define	LLT_STRUCT	382
+#define	LLT_TELIPSIS	383
+#define	LLT_UNION	384
+#define	LLT_UNSIGNED	385
+#define	LLT_VOID	386
+#define	LLT_VOLATILE	387
+#define	LLT_PRINTFLIKE	388
+#define	LLT_SCANFLIKE	389
+#define	LLT_MESSAGELIKE	390
+
+#line 36 "llgrammar.y"
+
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "lclscan.h"
+# include "checking.h"
+# include "lslparse.h" 
+# include "lh.h"
+# include "usymtab_interface.h"
+
+/*@-noparams@*/
+static /*@unused@*/ void yyprint ();
+/*@=noparams@*/
+
+/*@-redecl@*/
+void ylerror (char *) /*@modifies *g_msgstream@*/ ;
+/*@=redecl@*/
+
+bool g_inTypeDef = FALSE;
+
+/*@constant int YYDEBUG;@*/
+# define YYDEBUG 1
+
+/*@notfunction@*/
+# define YYPRINT(file, type, value) yyprint (file, type, value)
+
+/*
+** This is necessary, or else when the bison-generated code #include's malloc.h,
+** there will be a parse error.
+**
+** Unfortunately, it means the error checking on malloc, etc. is lost for allocations
+** in bison-generated files under Win32.
+*/
+
+# ifdef WIN32
+# undef malloc
+# undef calloc
+# undef realloc
+# endif
+
+
+#line 78 "llgrammar.y"
+typedef union 
+{
+  ltoken ltok;  /* a leaf is also an ltoken */
+  qual typequal;
+  unsigned int count;
+  /*@only@*/ ltokenList ltokenList;
+  /*@only@*/ abstDeclaratorNode abstDecl; 
+  /*@only@*/ declaratorNode declare;
+  /*@only@*/ declaratorNodeList declarelist;
+  /*@only@*/ typeExpr typeexpr;
+  /*@only@*/ arrayQualNode array;
+  /*@only@*/ quantifierNode quantifier;
+  /*@only@*/ quantifierNodeList quantifiers;
+  /*@only@*/ varNode var;
+  /*@only@*/ varNodeList vars;
+  /*@only@*/ storeRefNode storeref;
+  /*@only@*/ storeRefNodeList storereflist;
+  /*@only@*/ termNode term;
+  /*@only@*/ termNodeList termlist;
+  /*@only@*/ programNode program; 
+  /*@only@*/ stmtNode stmt;
+  /*@only@*/ claimNode claim;
+  /*@only@*/ typeNode type;
+  /*@only@*/ iterNode iter;
+  /*@only@*/ fcnNode fcn;
+  /*@only@*/ fcnNodeList fcns;
+  /*@only@*/ letDeclNode letdecl;
+  /*@only@*/ letDeclNodeList letdecls;
+  /*@only@*/ lclPredicateNode lclpredicate;
+  /*@only@*/ modifyNode modify;
+  /*@only@*/ paramNode param;
+  /*@only@*/ paramNodeList paramlist;
+  /*@only@*/ declaratorInvNodeList declaratorinvs;	
+  /*@only@*/ declaratorInvNode declaratorinv;	
+  /*@only@*/ abstBodyNode abstbody;
+  /*@only@*/ abstractNode abstract;
+  /*@only@*/ exposedNode exposed;
+  /*    taggedUnionNode taggedunion; */
+  /*@only@*/ globalList globals;
+  /*@only@*/ constDeclarationNode constdeclaration;
+  /*@only@*/ varDeclarationNode vardeclaration;
+  /*@only@*/ varDeclarationNodeList vardeclarationlist;
+  /*@only@*/ initDeclNodeList initdecls;
+  /*@only@*/ initDeclNode initdecl;
+  /*@only@*/ stDeclNodeList structdecls;
+  /*@only@*/ stDeclNode structdecl;
+  /*@only@*/ strOrUnionNode structorunion;
+  /*@only@*/ enumSpecNode enumspec; 
+  /*@only@*/ lclTypeSpecNode lcltypespec;
+  /*@only@*/ typeNameNode typname;
+  /*@only@*/ opFormNode opform;
+  /*@only@*/ sigNode signature;
+  /*@only@*/ nameNode name;
+  /*@only@*/ typeNameNodeList namelist;
+  /*@only@*/ replaceNode replace;	
+  /*@only@*/ replaceNodeList replacelist;
+  /*@only@*/ renamingNode renaming;
+  /*@only@*/ traitRefNode traitref;
+  /*@only@*/ traitRefNodeList traitreflist;
+  /*@only@*/ importNode import;
+  /*@only@*/ importNodeList importlist;
+  /*@only@*/ interfaceNode iface;
+  /*@only@*/ interfaceNodeList interfacelist; 
+  /*@only@*/ CTypesNode ctypes;
+} YYSTYPE;
+#ifndef YYDEBUG
+#define YYDEBUG 1
+#endif
+
+#include 
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define	YYFINAL		683
+#define	YYFLAG		-32768
+#define	YYNTBASE	136
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 390 ? yytranslate[x] : 290)
+
+static const short yytranslate[] = {     0,
+     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,     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,     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,     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,     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,     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,     1,     2,     3,     4,     5,
+     6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+    16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+    26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+    36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+    46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+    56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+    66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+    76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+    86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+    96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+   106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+   126,   127,   128,   129,   130,   131,   132,   133,   134,   135
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = {     0,
+     0,     1,     5,     6,     9,    11,    13,    14,    17,    20,
+    21,    24,    26,    28,    30,    34,    38,    40,    42,    44,
+    46,    48,    50,    57,    58,    60,    62,    66,    69,    71,
+    72,    76,    78,    80,    82,    84,    89,    93,    98,   103,
+   105,   107,   109,   111,   113,   114,   128,   129,   144,   145,
+   159,   164,   165,   166,   173,   174,   175,   183,   184,   185,
+   193,   194,   195,   202,   203,   204,   211,   214,   217,   219,
+   223,   225,   229,   231,   233,   237,   239,   241,   245,   247,
+   252,   256,   263,   265,   269,   271,   273,   277,   279,   283,
+   285,   289,   293,   297,   302,   304,   306,   308,   310,   312,
+   316,   318,   322,   323,   326,   330,   333,   336,   337,   340,
+   345,   346,   350,   352,   356,   362,   366,   368,   369,   373,
+   374,   378,   379,   383,   387,   391,   393,   397,   399,   401,
+   404,   406,   408,   409,   413,   414,   418,   419,   421,   423,
+   425,   429,   431,   435,   436,   441,   447,   449,   453,   456,
+   460,   464,   469,   473,   479,   486,   488,   492,   494,   496,
+   499,   502,   506,   510,   514,   519,   521,   525,   530,   534,
+   535,   538,   539,   541,   542,   549,   551,   555,   556,   560,
+   561,   565,   567,   569,   571,   573,   575,   577,   579,   581,
+   583,   585,   587,   590,   592,   594,   596,   598,   600,   602,
+   604,   606,   608,   610,   612,   614,   616,   618,   620,   622,
+   624,   626,   628,   630,   632,   634,   636,   638,   640,   642,
+   644,   646,   648,   650,   652,   654,   656,   658,   660,   662,
+   664,   666,   668,   670,   673,   679,   681,   684,   686,   689,
+   690,   697,   698,   705,   708,   711,   712,   714,   716,   719,
+   723,   725,   729,   730,   732,   739,   742,   744,   748,   750,
+   752,   754,   758,   761,   764,   768,   773,   775,   779,   782,
+   785,   789,   794,   796,   799,   802,   806,   811,   814,   817,
+   820,   823,   827,   829,   830,   832,   836,   839,   841,   843,
+   846,   850,   854,   859,   862,   866,   873,   875,   878,   881,
+   885,   889,   894,   899,   905,   909,   914,   919,   925,   928,
+   931,   935,   939,   941,   943,   945,   947,   949,   951,   953,
+   954,   956,   958,   962,   964,   966,   971,   972,   974,   976,
+   980,   982,   984,   991,   993,   997,   999,  1004,  1008,  1012,
+  1014,  1017,  1020,  1022,  1024,  1026,  1029,  1031,  1034,  1037,
+  1041,  1043,  1045,  1048,  1051,  1055,  1057,  1060,  1064,  1066,
+  1072,  1076,  1081,  1084,  1088,  1091,  1093,  1097,  1101,  1103,
+  1108,  1110,  1113,  1117,  1121,  1125,  1130,  1134,  1136,  1140,
+  1142,  1144,  1146,  1148,  1150,  1152,  1157,  1162,  1167,  1172,
+  1179,  1184,  1186,  1188,  1190,  1192,  1194,  1197,  1198,  1202,
+  1204,  1208,  1212,  1217,  1219,  1221,  1223,  1225,  1227,  1229,
+  1231,  1233
+};
+
+static const short yyrhs[] = {    -1,
+   138,   137,   140,     0,     0,   138,   139,     0,   143,     0,
+   144,     0,     0,   145,   141,     0,   150,   141,     0,     0,
+   141,   142,     0,   145,     0,   150,     0,   144,     0,    57,
+   174,     7,     0,   114,   178,     7,     0,   153,     0,   154,
+     0,   155,     0,   157,     0,   160,     0,   146,     0,   121,
+   284,    10,   147,    37,     7,     0,     0,   148,     0,   149,
+     0,   148,    32,   149,     0,   122,   243,     0,   243,     0,
+     0,   108,   151,   152,     0,   153,     0,   154,     0,   155,
+     0,   157,     0,    50,   226,   188,     7,     0,   226,   188,
+     7,     0,   116,   226,   188,     7,     0,   132,   226,   188,
+     7,     0,   162,     0,   171,     0,   133,     0,   134,     0,
+   135,     0,     0,   226,   239,   190,   158,    34,   192,   194,
+   198,   199,   200,   203,   204,    35,     0,     0,   156,   226,
+   239,   190,   159,    34,   192,   194,   198,   199,   200,   203,
+   204,    35,     0,     0,    48,   286,    10,   205,    37,   190,
+   161,    34,   194,   199,   208,   203,    35,     0,    48,   283,
+   286,     7,     0,     0,     0,    62,   163,   111,    20,   164,
+   213,     0,     0,     0,    62,   165,    97,   111,    20,   166,
+   213,     0,     0,     0,    97,    62,   167,   111,    20,   168,
+   213,     0,     0,     0,    56,   169,   111,    20,   170,   213,
+     0,     0,     0,   112,   226,   172,   218,   173,     7,     0,
+   229,     7,     0,   237,     7,     0,   175,     0,   174,    32,
+   175,     0,   177,     0,     3,   177,     3,     0,    43,     0,
+   177,     0,   176,    32,   177,     0,   282,     0,   179,     0,
+   178,    32,   179,     0,   288,     0,   288,    10,   181,    37,
+     0,    10,   180,    37,     0,    10,   180,    37,    10,   181,
+    37,     0,   288,     0,   180,    32,   288,     0,   183,     0,
+   182,     0,   182,    32,   183,     0,   244,     0,   182,    32,
+   244,     0,   184,     0,   183,    32,   184,     0,   244,    53,
+   222,     0,   244,    53,   185,     0,   244,    53,   185,   255,
+     0,   289,     0,   248,     0,   187,     0,   259,     0,   189,
+     0,   188,    32,   189,     0,   239,     0,   239,    33,   186,
+     0,     0,   190,   191,     0,   226,   188,     7,     0,    64,
+     7,     0,    65,     7,     0,     0,   192,   193,     0,   104,
+   226,   188,     7,     0,     0,    60,   195,     7,     0,   196,
+     0,   195,    32,   196,     0,   284,    31,   197,    46,   259,
+     0,   284,    46,   259,     0,   226,     0,     0,    49,   258,
+     7,     0,     0,   105,   258,     7,     0,     0,    61,    63,
+     7,     0,    61,    45,     7,     0,    61,   201,     7,     0,
+   202,     0,   201,    32,   202,     0,   259,     0,   227,     0,
+    66,   227,     0,    64,     0,    65,     0,     0,    52,   258,
+     7,     0,     0,    48,   258,     7,     0,     0,   206,     0,
+   207,     0,   128,     0,   207,    32,   128,     0,   243,     0,
+   207,    32,   243,     0,     0,    47,    34,   209,    35,     0,
+    47,    34,   209,     7,    35,     0,   210,     0,    10,   209,
+    37,     0,   209,     6,     0,   209,     8,   209,     0,   209,
+     7,   209,     0,   283,    10,   211,    37,     0,   283,    10,
+    37,     0,   284,    33,   283,    10,    37,     0,   284,    33,
+   283,    10,   211,    37,     0,   212,     0,   211,    32,   212,
+     0,   276,     0,   284,     0,     3,   212,     0,   212,     3,
+     0,   212,     3,   212,     0,    10,   212,    37,     0,   283,
+    10,    37,     0,   283,    10,   211,    37,     0,     7,     0,
+    34,   214,    35,     0,    34,   176,    35,     7,     0,    34,
+    35,     7,     0,     0,   214,   157,     0,     0,   216,     0,
+     0,    58,   217,   278,    10,   258,    37,     0,   219,     0,
+   218,    32,   219,     0,     0,   239,   220,   221,     0,     0,
+    34,   215,    35,     0,   131,     0,   115,     0,   117,     0,
+   119,     0,   120,     0,   123,     0,   124,     0,   125,     0,
+   130,     0,   126,     0,   222,     0,   223,   222,     0,    20,
+     0,   223,     0,    67,     0,    78,     0,    68,     0,    69,
+     0,    71,     0,    72,     0,    73,     0,    74,     0,    95,
+     0,    79,     0,    80,     0,    82,     0,    83,     0,    81,
+     0,    75,     0,    76,     0,    77,     0,    87,     0,    88,
+     0,    89,     0,    90,     0,    91,     0,    99,     0,   100,
+     0,    97,     0,    98,     0,   103,     0,   101,     0,    92,
+     0,    93,     0,    94,     0,    96,     0,    70,     0,    84,
+     0,    85,     0,   224,     0,   229,     0,   237,     0,   225,
+   226,     0,     8,   227,    31,   227,     8,     0,   226,     0,
+   226,   228,     0,     6,     0,   228,     6,     0,     0,   127,
+   232,   230,    34,   233,    35,     0,     0,   129,   232,   231,
+    34,   233,    35,     0,   127,   285,     0,   129,   285,     0,
+     0,   285,     0,   234,     0,   233,   234,     0,   226,   235,
+     7,     0,   239,     0,   235,    32,   239,     0,     0,    32,
+     0,   118,   232,    34,   238,   236,    35,     0,   118,   285,
+     0,    25,     0,   238,    32,    25,     0,   241,     0,   240,
+     0,   284,     0,    10,   240,    37,     0,     6,   240,     0,
+   240,   247,     0,   240,    10,    37,     0,   240,    10,   206,
+    37,     0,    20,     0,    10,   241,    37,     0,     6,   241,
+     0,   241,   247,     0,   241,    10,    37,     0,   241,    10,
+   206,    37,     0,    20,     0,     6,   242,     0,   242,   247,
+     0,   242,    10,    37,     0,   242,    10,   206,    37,     0,
+   226,   242,     0,   226,   240,     0,   226,   245,     0,   226,
+   245,     0,    66,   226,   245,     0,   248,     0,     0,   246,
+     0,    10,   246,    37,     0,     6,   246,     0,     6,     0,
+   247,     0,   246,   247,     0,   246,    10,    37,     0,    10,
+   206,    37,     0,   246,    10,   206,    37,     0,    11,    36,
+     0,    11,   187,    36,     0,    55,    27,   110,    27,    51,
+    27,     0,   251,     0,    27,   251,     0,   251,    27,     0,
+    27,   251,    27,     0,   249,   252,   250,     0,    27,   249,
+   252,   250,     0,   249,   252,   250,    27,     0,    27,   249,
+   252,   250,    27,     0,    11,   252,    36,     0,    11,   252,
+    36,    27,     0,    27,    11,   252,    36,     0,    27,    11,
+   252,    36,    27,     0,    12,   282,     0,    26,   282,     0,
+    27,    12,   282,     0,    27,    26,   282,     0,    22,     0,
+    34,     0,    23,     0,    35,     0,   263,     0,    14,     0,
+    39,     0,     0,   253,     0,    27,     0,   253,   254,    27,
+     0,    32,     0,    24,     0,    31,   256,    26,   287,     0,
+     0,   257,     0,   287,     0,   257,    32,   287,     0,   259,
+     0,   260,     0,    55,   260,   110,   260,    51,   260,     0,
+   261,     0,   260,    14,   260,     0,   262,     0,   277,    10,
+   258,    37,     0,   262,    39,   262,     0,   262,    33,   262,
+     0,   264,     0,   267,   265,     0,   267,   266,     0,     3,
+     0,     6,     0,   267,     0,   263,   264,     0,   263,     0,
+   265,   263,     0,   263,   267,     0,   266,   263,   267,     0,
+   272,     0,   268,     0,   268,   272,     0,   272,   268,     0,
+   272,   268,   272,     0,   269,     0,   269,   272,     0,   270,
+    31,   287,     0,   270,     0,    11,   271,    36,    31,   287,
+     0,    11,   271,    36,     0,    11,    36,    31,   287,     0,
+    11,    36,     0,   249,   271,   250,     0,   249,   250,     0,
+   259,     0,   271,   254,   259,     0,    10,   260,    37,     0,
+   284,     0,   289,    10,   273,    37,     0,   275,     0,   272,
+   274,     0,   272,    12,   282,     0,   272,    26,   282,     0,
+   272,    11,    36,     0,   272,    11,   273,    36,     0,   272,
+    31,   287,     0,   260,     0,   273,    32,   260,     0,    28,
+     0,    29,     0,    30,     0,    38,     0,   276,     0,   106,
+     0,    54,    10,   273,    37,     0,   113,    10,    44,    37,
+     0,   113,    10,   201,    37,     0,   107,    10,   259,    37,
+     0,    59,    10,   259,    32,   259,    37,     0,   107,    10,
+   226,    37,     0,    42,     0,    43,     0,    40,     0,    41,
+     0,   278,     0,   277,   278,     0,     0,    21,   279,   280,
+     0,   281,     0,   280,    32,   281,     0,   284,    31,   197,
+     0,   284,    31,    66,   197,     0,    25,     0,    20,     0,
+    25,     0,    25,     0,   282,     0,   282,     0,   282,     0,
+   282,     0,   282,     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+   382,   383,   386,   387,   390,   391,   394,   395,   396,   399,
+   400,   403,   404,   405,   408,   414,   418,   420,   422,   424,
+   426,   428,   432,   436,   437,   440,   442,   446,   447,   450,
+   451,   454,   456,   458,   460,   464,   468,   470,   472,   476,
+   477,   480,   481,   482,   485,   486,   493,   495,   506,   508,
+   511,   515,   515,   516,   517,   517,   519,   520,   521,   522,
+   523,   523,   524,   527,   528,   529,   530,   532,   548,   550,
+   554,   555,   557,   560,   561,   564,   568,   570,   574,   576,
+   578,   580,   584,   585,   588,   590,   592,   595,   597,   600,
+   602,   605,   606,   607,   611,   612,   614,   616,   619,   621,
+   625,   626,   629,   631,   635,   636,   637,   640,   641,   644,
+   648,   649,   652,   653,   656,   657,   659,   662,   663,   666,
+   667,   670,   671,   672,   673,   676,   677,   680,   681,   682,
+   683,   684,   687,   688,   691,   692,   695,   696,   699,   700,
+   701,   704,   705,   708,   709,   710,   713,   714,   717,   722,
+   728,   736,   738,   740,   742,   746,   747,   750,   751,   752,
+   753,   754,   755,   756,   758,   762,   763,   764,   765,   768,
+   769,   772,   773,   776,   776,   785,   786,   790,   791,   794,
+   795,   798,   799,   800,   801,   802,   803,   804,   805,   806,
+   807,   815,   816,   821,   823,   829,   830,   831,   832,   833,
+   834,   835,   836,   837,   838,   839,   840,   841,   842,   843,
+   844,   845,   846,   847,   848,   849,   850,   851,   852,   853,
+   854,   855,   856,   857,   858,   859,   860,   861,   862,   863,
+   866,   868,   870,   872,   874,   883,   884,   889,   890,   893,
+   895,   897,   899,   901,   903,   907,   908,   911,   912,   917,
+   920,   922,   926,   927,   930,   932,   936,   937,   947,   948,
+   951,   952,   953,   954,   955,   956,   959,   960,   961,   962,
+   963,   964,   973,   974,   975,   976,   977,   983,   984,   985,
+   995,   996,   997,  1002,  1003,  1006,  1007,  1008,  1009,  1010,
+  1011,  1012,  1013,  1016,  1017,  1020,  1022,  1024,  1026,  1028,
+  1031,  1033,  1035,  1037,  1039,  1041,  1049,  1051,  1053,  1056,
+  1059,  1062,  1067,  1068,  1071,  1072,  1075,  1076,  1077,  1080,
+  1081,  1084,  1085,  1088,  1089,  1092,  1095,  1096,  1099,  1100,
+  1103,  1106,  1112,  1114,  1115,  1118,  1119,  1124,  1126,  1130,
+  1131,  1132,  1135,  1136,  1139,  1140,  1143,  1144,  1147,  1148,
+  1151,  1152,  1153,  1154,  1155,  1156,  1157,  1160,  1161,  1164,
+  1167,  1169,  1173,  1177,  1178,  1181,  1182,  1185,  1187,  1189,
+  1191,  1192,  1194,  1196,  1198,  1201,  1203,  1207,  1208,  1211,
+  1212,  1213,  1214,  1217,  1218,  1219,  1220,  1221,  1222,  1227,
+  1233,  1243,  1244,  1245,  1246,  1249,  1251,  1255,  1259,  1262,
+  1263,  1266,  1267,  1270,  1271,  1274,  1275,  1276,  1277,  1278,
+  1279,  1280
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = {   "$","error","$undefined.","simpleOp",
+"PREFIX_OP","POSTFIX_OP","LLT_MULOP","LLT_SEMI","LLT_VERTICALBAR","ITERATION_OP",
+"LLT_LPAR","LLT_LBRACKET","selectSym","LLT_IF_THEN_ELSE","logicalOp","eqSepSym",
+"equationSym","commentSym","LLT_WHITESPACE","LLT_EOL","LLT_TYPEDEF_NAME","quantifierSym",
+"openSym","closeSym","sepSym","simpleId","mapSym","markerSym","preSym","postSym",
+"anySym","LLT_COLON","LLT_COMMA","LLT_EQUALS","LLT_LBRACE","LLT_RBRACE","LLT_RBRACKET",
+"LLT_RPAR","LLT_QUOTE","eqOp","LLT_CCHAR","LLT_CFLOAT","LLT_CINTEGER","LLT_LCSTRING",
+"LLT_ALL","LLT_ANYTHING","LLT_BE","LLT_BODY","LLT_CLAIMS","LLT_CHECKS","LLT_CONSTANT",
+"LLT_ELSE","LLT_ENSURES","LLT_FOR","LLT_FRESH","LLT_IF","LLT_IMMUTABLE","LLT_IMPORTS",
+"LLT_CONSTRAINT","LLT_ISSUB","LLT_LET","LLT_MODIFIES","LLT_MUTABLE","LLT_NOTHING",
+"LLT_INTERNAL","LLT_FILESYS","LLT_OBJ","LLT_OUT","LLT_SEF","LLT_ONLY","LLT_PARTIAL",
+"LLT_OWNED","LLT_DEPENDENT","LLT_KEEP","LLT_KEPT","LLT_TEMP","LLT_SHARED","LLT_UNIQUE",
+"LLT_UNUSED","LLT_EXITS","LLT_MAYEXIT","LLT_NEVEREXIT","LLT_TRUEEXIT","LLT_FALSEEXIT",
+"LLT_UNDEF","LLT_KILLED","LLT_CHECKMOD","LLT_CHECKED","LLT_UNCHECKED","LLT_CHECKEDSTRICT",
+"LLT_TRUENULL","LLT_FALSENULL","LLT_LNULL","LLT_LNOTNULL","LLT_RETURNED","LLT_OBSERVER",
+"LLT_EXPOSED","LLT_REFCOUNTED","LLT_REFS","LLT_RELNULL","LLT_RELDEF","LLT_KILLREF",
+"LLT_TEMPREF","LLT_NEWREF","LLT_PRIVATE","LLT_REQUIRES","LLT_RESULT","LLT_SIZEOF",
+"LLT_SPEC","LLT_TAGGEDUNION","LLT_THEN","LLT_TYPE","LLT_TYPEDEF","LLT_UNCHANGED",
+"LLT_USES","LLT_CHAR","LLT_CONST","LLT_DOUBLE","LLT_ENUM","LLT_FLOAT","LLT_INT",
+"LLT_ITER","LLT_YIELD","LLT_LONG","LLT_SHORT","LLT_SIGNED","LLT_UNKNOWN","LLT_STRUCT",
+"LLT_TELIPSIS","LLT_UNION","LLT_UNSIGNED","LLT_VOID","LLT_VOLATILE","LLT_PRINTFLIKE",
+"LLT_SCANFLIKE","LLT_MESSAGELIKE","interface","@1","externals","external","optDeclarations",
+"declarations","declaration","imports","uses","export","iter","iterParamList",
+"realIterParamList","iterParam","private","@2","private2","constDeclaration",
+"varDeclaration","type","special","fcn","@3","@4","claim","@5","abstract","@6",
+"@7","@8","@9","@10","@11","@12","@13","exposed","@14","@15","importNameList",
+"importName","interfaceNameList","interfaceName","traitRefNodeList","traitRef",
+"traitIdList","renaming","nameList","replaceNodeList","replace","name","initializer",
+"constLclExpr","initDecls","initDecl","globals","globalDecl","privateInits",
+"privateInit","optLetDecl","beDeclList","beDecl","sortSpec","optChecks","optRequire",
+"optModify","storeRefList","storeRef","optEnsure","optClaim","optParamList",
+"realParamList","paramList","optBody","callExpr","stmt","valueList","value",
+"abstBody","fcns","optTypeInv","typeInv","@16","declaratorInvs","declaratorInv",
+"@17","optExposedBody","CType","CTypes","typeSpecifier","specialQualifier","lclTypeSpec",
+"lclType","pointers","structOrUnionSpec","@18","@19","optTagId","structDecls",
+"structDecl","declaratorList","optCOMMA","enumSpec","enumeratorList","declarator",
+"notype_decl","after_type_decl","parameter_decl","param","typeName","optAbstDeclarator",
+"abstDeclarator","arrayQual","opForm","open","close","anyOp","middle","placeList",
+"separator","signature","domain","sortList","lclPredicate","term","term0","equalityTerm",
+"simpleOpTerm","simpleOp2","prefixOpTerm","postfixOps","infixOpPart","secondary",
+"bracketed","sqBracketed","matched","args","primary","termList","stateFcn","lclPrimary",
+"cLiteral","quantifiers","quantifier","@20","quantifiedList","quantified","simpleIdOrTypedefName",
+"fcnId","varId","tagId","claimId","sortId","traitId","opId", NULL
+};
+#endif
+
+static const short yyr1[] = {     0,
+   137,   136,   138,   138,   139,   139,   140,   140,   140,   141,
+   141,   142,   142,   142,   143,   144,   145,   145,   145,   145,
+   145,   145,   146,   147,   147,   148,   148,   149,   149,   151,
+   150,   152,   152,   152,   152,   153,   154,   154,   154,   155,
+   155,   156,   156,   156,   158,   157,   159,   157,   161,   160,
+   160,   163,   164,   162,   165,   166,   162,   167,   168,   162,
+   169,   170,   162,   172,   173,   171,   171,   171,   174,   174,
+   175,   175,   175,   176,   176,   177,   178,   178,   179,   179,
+   179,   179,   180,   180,   181,   181,   181,   182,   182,   183,
+   183,   184,   184,   184,   185,   185,   186,   187,   188,   188,
+   189,   189,   190,   190,   191,   191,   191,   192,   192,   193,
+   194,   194,   195,   195,   196,   196,   197,   198,   198,   199,
+   199,   200,   200,   200,   200,   201,   201,   202,   202,   202,
+   202,   202,   203,   203,   204,   204,   205,   205,   206,   206,
+   206,   207,   207,   208,   208,   208,   209,   209,   209,   209,
+   209,   210,   210,   210,   210,   211,   211,   212,   212,   212,
+   212,   212,   212,   212,   212,   213,   213,   213,   213,   214,
+   214,   215,   215,   217,   216,   218,   218,   220,   219,   221,
+   221,   222,   222,   222,   222,   222,   222,   222,   222,   222,
+   222,   223,   223,   224,   224,   225,   225,   225,   225,   225,
+   225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
+   225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
+   225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
+   226,   226,   226,   226,   226,   227,   227,   228,   228,   230,
+   229,   231,   229,   229,   229,   232,   232,   233,   233,   234,
+   235,   235,   236,   236,   237,   237,   238,   238,   239,   239,
+   240,   240,   240,   240,   240,   240,   241,   241,   241,   241,
+   241,   241,   242,   242,   242,   242,   242,   243,   243,   243,
+   244,   244,   244,   245,   245,   246,   246,   246,   246,   246,
+   246,   246,   246,   247,   247,   248,   248,   248,   248,   248,
+   248,   248,   248,   248,   248,   248,   248,   248,   248,   248,
+   248,   248,   249,   249,   250,   250,   251,   251,   251,   252,
+   252,   253,   253,   254,   254,   255,   256,   256,   257,   257,
+   258,   259,   260,   260,   260,   261,   261,   261,   261,   262,
+   262,   262,   263,   263,   264,   264,   265,   265,   266,   266,
+   267,   267,   267,   267,   267,   267,   267,   268,   268,   269,
+   269,   269,   269,   270,   270,   271,   271,   272,   272,   272,
+   272,   272,   272,   272,   272,   272,   272,   273,   273,   274,
+   274,   274,   274,   275,   275,   275,   275,   275,   275,   275,
+   275,   276,   276,   276,   276,   277,   277,   279,   278,   280,
+   280,   281,   281,   282,   282,   283,   284,   285,   286,   287,
+   288,   289
+};
+
+static const short yyr2[] = {     0,
+     0,     3,     0,     2,     1,     1,     0,     2,     2,     0,
+     2,     1,     1,     1,     3,     3,     1,     1,     1,     1,
+     1,     1,     6,     0,     1,     1,     3,     2,     1,     0,
+     3,     1,     1,     1,     1,     4,     3,     4,     4,     1,
+     1,     1,     1,     1,     0,    13,     0,    14,     0,    13,
+     4,     0,     0,     6,     0,     0,     7,     0,     0,     7,
+     0,     0,     6,     0,     0,     6,     2,     2,     1,     3,
+     1,     3,     1,     1,     3,     1,     1,     3,     1,     4,
+     3,     6,     1,     3,     1,     1,     3,     1,     3,     1,
+     3,     3,     3,     4,     1,     1,     1,     1,     1,     3,
+     1,     3,     0,     2,     3,     2,     2,     0,     2,     4,
+     0,     3,     1,     3,     5,     3,     1,     0,     3,     0,
+     3,     0,     3,     3,     3,     1,     3,     1,     1,     2,
+     1,     1,     0,     3,     0,     3,     0,     1,     1,     1,
+     3,     1,     3,     0,     4,     5,     1,     3,     2,     3,
+     3,     4,     3,     5,     6,     1,     3,     1,     1,     2,
+     2,     3,     3,     3,     4,     1,     3,     4,     3,     0,
+     2,     0,     1,     0,     6,     1,     3,     0,     3,     0,
+     3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+     1,     1,     2,     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,     5,     1,     2,     1,     2,     0,
+     6,     0,     6,     2,     2,     0,     1,     1,     2,     3,
+     1,     3,     0,     1,     6,     2,     1,     3,     1,     1,
+     1,     3,     2,     2,     3,     4,     1,     3,     2,     2,
+     3,     4,     1,     2,     2,     3,     4,     2,     2,     2,
+     2,     3,     1,     0,     1,     3,     2,     1,     1,     2,
+     3,     3,     4,     2,     3,     6,     1,     2,     2,     3,
+     3,     4,     4,     5,     3,     4,     4,     5,     2,     2,
+     3,     3,     1,     1,     1,     1,     1,     1,     1,     0,
+     1,     1,     3,     1,     1,     4,     0,     1,     1,     3,
+     1,     1,     6,     1,     3,     1,     4,     3,     3,     1,
+     2,     2,     1,     1,     1,     2,     1,     2,     2,     3,
+     1,     1,     2,     2,     3,     1,     2,     3,     1,     5,
+     3,     4,     2,     3,     2,     1,     3,     3,     1,     4,
+     1,     2,     3,     3,     3,     4,     3,     1,     3,     1,
+     1,     1,     1,     1,     1,     4,     4,     4,     4,     6,
+     4,     1,     1,     1,     1,     1,     2,     0,     3,     1,
+     3,     3,     4,     1,     1,     1,     1,     1,     1,     1,
+     1,     1
+};
+
+static const short yydefact[] = {     3,
+     1,     0,     0,     7,     4,     5,     6,     0,   405,   404,
+    73,     0,    69,    71,    76,     0,     0,    77,   411,    79,
+     0,   194,     0,     0,    61,    52,   196,   198,   199,   228,
+   200,   201,   202,   203,   210,   211,   212,   197,   205,   206,
+   209,   207,   208,   229,   230,   213,   214,   215,   216,   217,
+   224,   225,   226,   204,   227,   220,   221,   218,   219,   223,
+   222,    30,     0,   183,     0,   184,   246,   185,   186,     0,
+   187,   188,   189,   191,   246,   246,   190,   182,     0,    42,
+    43,    44,     2,    10,    22,    10,    17,    18,    19,     0,
+    20,    21,    40,    41,   192,   195,   231,     0,     0,   232,
+   233,     0,    15,     0,     0,    83,    16,     0,     0,   220,
+   236,     0,   232,   233,   406,   409,     0,     0,     0,     0,
+     0,     0,    58,     0,    64,     0,     0,   408,   256,   407,
+     0,   240,   244,   242,   245,     0,     8,     9,     0,   193,
+   234,     0,     0,   267,     0,    99,   103,   260,   259,   261,
+    67,    68,    72,    70,     0,    81,    78,   343,   344,   320,
+     0,   318,   313,     0,     0,   314,   319,     0,     0,     0,
+    86,    85,    90,   284,    88,   283,   320,   297,   317,   238,
+   237,     0,     0,   137,     0,   101,     0,     0,     0,     0,
+    31,    32,    33,    34,    35,     0,     0,     0,    24,     0,
+     0,     0,    11,    14,    12,    13,   103,   263,   269,     0,
+     0,    37,     0,     0,    45,     0,     0,   264,     0,   270,
+    84,     0,   322,     0,   321,   309,   310,   320,     0,     0,
+   320,   298,     0,   284,    80,     0,     0,   288,     0,   281,
+   285,   289,     0,     0,   299,   239,     0,    51,   140,     0,
+   138,   139,   284,   142,    36,    62,    53,     0,     0,    65,
+   176,   178,    38,   257,   253,     0,     0,    25,    26,    29,
+     0,     0,    39,    47,   262,   268,   100,     0,     0,   398,
+   407,   394,   395,   392,   393,     0,     0,     0,   385,     0,
+     0,   102,    97,     0,    98,   332,   334,   336,     0,   340,
+   345,   352,   356,   359,   351,   371,   384,     0,   396,   412,
+   369,     0,     0,     0,     0,   104,     0,   265,     0,   294,
+     0,   271,     0,     0,   305,   325,   324,     0,     0,   311,
+   312,     0,   300,     0,   282,    87,    89,    91,     0,   287,
+     0,     0,     0,   290,    93,    92,    96,    95,   315,   316,
+   301,   235,   103,     0,   288,     0,   273,   279,   278,   280,
+     0,     0,    56,    59,     0,     0,   180,   254,     0,    28,
+     0,     0,     0,     0,   248,     0,     0,     0,   363,   366,
+     0,     0,     0,     0,     0,     0,     0,   365,     0,     0,
+     0,     0,   346,   345,   347,   341,   342,   353,   357,     0,
+     0,     0,     0,   380,   381,   382,     0,   383,   354,   372,
+     0,   397,     0,   106,   107,   108,     0,   266,   295,   272,
+    82,   306,   323,   307,   302,     0,   292,   286,   291,     0,
+   327,    94,   303,    49,   141,   143,   274,   288,     0,   275,
+   166,   170,    63,    54,     0,     0,   177,    66,   172,   179,
+   258,   255,    23,    27,     0,   251,   241,   249,   243,   108,
+   368,     0,   361,     0,   399,   400,     0,   378,     0,     0,
+     0,   194,     0,     0,     0,   131,   132,     0,     0,   126,
+   129,   128,   364,   335,   339,   338,   349,   348,     0,   410,
+   358,   375,     0,   373,   374,   377,   355,     0,   331,     0,
+   111,   105,   308,   304,     0,   293,     0,   328,   329,     0,
+   276,     0,     0,     0,    74,     0,    57,    60,   174,     0,
+   173,   250,     0,   111,   362,     0,   367,     0,     0,     0,
+   386,     0,     0,   391,   389,   387,   130,     0,   388,   350,
+   376,   337,   370,     0,     0,   109,   118,   296,     0,     0,
+   111,   277,   169,     0,     0,   167,   171,     0,     0,   181,
+   252,   118,   360,   401,     0,   402,   117,   379,     0,     0,
+   127,     0,   113,     0,     0,     0,   120,   326,   330,   120,
+    75,   168,   103,     0,   120,   403,   333,   390,   112,     0,
+     0,     0,     0,     0,     0,   122,   144,     0,   122,   114,
+     0,   116,   110,   119,     0,     0,   133,     0,   133,     0,
+   133,     0,   121,     0,     0,     0,     0,   135,     0,     0,
+   175,   135,   115,   124,   123,   125,     0,     0,     0,     0,
+   407,     0,   147,     0,     0,    50,     0,   134,     0,    46,
+     0,   149,     0,     0,   145,     0,     0,    48,   136,     0,
+   148,   146,   151,   150,     0,     0,   153,     0,   156,   158,
+     0,   159,   406,     0,   160,     0,     0,   152,   161,     0,
+     0,   163,   157,   162,   164,     0,   154,     0,   165,   155,
+     0,     0,     0
+};
+
+static const short yydefgoto[] = {   681,
+     4,     1,     5,    83,   137,   203,     6,   204,   205,    85,
+   267,   268,   269,   206,   124,   191,    87,    88,    89,    90,
+    91,   315,   377,    92,   510,    93,   121,   362,   122,   445,
+   190,   446,   120,   361,    94,   196,   366,    12,    13,   514,
+    14,    17,    18,   105,   170,   171,   172,   173,   345,   292,
+   293,   145,   146,   215,   316,   501,   546,   547,   572,   573,
+   566,   577,   596,   607,   479,   480,   618,   629,   250,   341,
+   252,   609,   653,   633,   658,   659,   443,   516,   520,   521,
+   559,   260,   261,   367,   450,    95,    96,    97,    98,   253,
+   481,   181,   113,   200,   201,   127,   374,   375,   455,   369,
+   114,   265,   186,   148,   149,   359,   254,   175,   240,   241,
+   242,   176,   294,   351,   178,   224,   225,   464,   432,   507,
+   508,   498,   499,   296,   297,   298,   299,   300,   396,   397,
+   301,   302,   303,   304,   381,   305,   469,   410,   306,   307,
+   308,   309,   382,   465,   466,   310,   661,   311,   129,   118,
+   491,    20,   312
+};
+
+static const short yypact[] = {-32768,
+   -28,   224,   372,  1343,-32768,-32768,-32768,   132,-32768,-32768,
+-32768,    48,-32768,-32768,-32768,   132,   105,-32768,-32768,    49,
+  2880,-32768,   227,  2880,-32768,    17,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,   161,-32768,-32768,-32768,-32768,
+-32768,-32768,  2880,-32768,  2880,-32768,   132,-32768,-32768,   221,
+-32768,-32768,-32768,-32768,   132,   132,-32768,-32768,  2880,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  2880,
+-32768,-32768,-32768,-32768,-32768,  1065,-32768,  2880,   396,   247,
+   270,   280,-32768,   224,   311,-32768,-32768,   372,  1147,-32768,
+   310,   265,-32768,-32768,   343,-32768,   132,   345,   396,   209,
+   246,   264,-32768,  1437,-32768,   396,   340,-32768,   346,-32768,
+   378,-32768,   346,-32768,   346,   396,  1241,  1241,   396,-32768,
+-32768,   396,   396,-32768,   123,-32768,   118,   198,   294,-32768,
+-32768,-32768,-32768,-32768,   132,   431,-32768,-32768,-32768,   416,
+   132,-32768,-32768,   132,   488,-32768,-32768,   423,  2880,   427,
+   442,   444,-32768,   462,   417,-32768,   416,   466,-32768,-32768,
+   499,  2880,   502,  2302,   149,   484,   501,   512,   428,   429,
+-32768,-32768,-32768,-32768,-32768,   396,   156,   509,  2396,   504,
+   507,   165,-32768,-32768,-32768,-32768,-32768,   198,   294,    89,
+   112,-32768,   396,  3134,  1824,  1920,  3009,-32768,  2016,-32768,
+-32768,  1147,-32768,   500,    33,-32768,-32768,   416,   132,   132,
+   416,   516,   437,   462,-32768,  1147,  1147,   462,  1730,-32768,
+   329,-32768,   239,    93,-32768,-32768,   538,-32768,-32768,   513,
+-32768,   517,   379,-32768,-32768,-32768,-32768,   533,   534,   523,
+-32768,-32768,-32768,-32768,   526,  2880,   522,   532,-32768,-32768,
+  2880,  2880,-32768,  1824,-32768,-32768,-32768,  3134,  3036,-32768,
+   343,-32768,-32768,-32768,-32768,   555,  3134,   556,-32768,   559,
+   560,-32768,-32768,   412,-32768,   558,-32768,   121,   557,-32768,
+   436,   438,   438,   540,   761,-32768,-32768,   290,-32768,-32768,
+-32768,   563,   567,   568,   542,-32768,   396,-32768,   541,-32768,
+   544,-32768,   546,   547,   562,-32768,-32768,   566,   549,-32768,
+-32768,    93,-32768,   574,-32768,   444,   417,-32768,   417,   329,
+   550,   128,  2112,-32768,   564,-32768,-32768,-32768,-32768,-32768,
+   575,-32768,-32768,  2490,   379,  1634,-32768,   198,   376,-32768,
+    34,    34,-32768,-32768,   396,   579,   570,   565,   578,-32768,
+   587,  2396,   396,  2591,-32768,  2692,   576,   159,   583,-32768,
+   393,   221,  3134,    21,  3134,  1018,   760,-32768,   463,  3134,
+   557,   557,-32768,-32768,   288,   436,   436,   295,   295,   132,
+  3077,   132,   132,-32768,-32768,-32768,   132,-32768,   438,-32768,
+  3134,-32768,  3134,-32768,-32768,-32768,   211,-32768,-32768,-32768,
+-32768,-32768,-32768,   582,   588,   571,-32768,-32768,-32768,   586,
+   132,-32768,-32768,  1824,-32768,-32768,   376,   434,  2208,-32768,
+-32768,   373,-32768,-32768,    34,    34,-32768,-32768,   561,-32768,
+-32768,-32768,-32768,-32768,   249,-32768,-32768,-32768,-32768,-32768,
+-32768,   132,   594,  3134,   596,-32768,   595,   558,   419,  3134,
+   598,   625,   599,   601,   603,-32768,-32768,  2880,   425,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   288,-32768,
+-32768,-32768,    20,-32768,-32768,-32768,   295,   606,-32768,   445,
+    -7,-32768,-32768,-32768,   617,-32768,   619,   614,-32768,   613,
+-32768,   611,   642,   472,-32768,  1538,-32768,-32768,-32768,   615,
+-32768,-32768,   396,    -7,-32768,   132,-32768,   221,  2786,  3134,
+-32768,    28,  3134,-32768,-32768,-32768,-32768,   889,-32768,-32768,
+-32768,-32768,-32768,   221,  2880,-32768,   605,-32768,   132,   132,
+   597,-32768,-32768,   132,   648,-32768,-32768,   396,   637,-32768,
+-32768,   605,-32768,-32768,  2880,-32768,-32768,   558,  3134,   622,
+-32768,   277,-32768,   115,   396,  3134,   572,-32768,-32768,   572,
+-32768,-32768,-32768,   650,   572,-32768,   558,-32768,-32768,   221,
+  2880,  3134,   282,   654,  3134,   607,   620,  3134,   607,-32768,
+   616,-32768,-32768,-32768,   659,   631,   623,   635,   623,   641,
+   623,  3134,-32768,   672,   673,   334,  3134,   633,   192,   647,
+-32768,   633,-32768,-32768,-32768,-32768,   676,  3134,   649,   192,
+   677,   187,-32768,   678,   656,-32768,   657,-32768,   684,-32768,
+    65,-32768,   200,   192,-32768,   245,   668,-32768,-32768,   192,
+-32768,-32768,   709,-32768,   189,   189,-32768,   451,   730,-32768,
+   725,-32768,-32768,   726,-32768,    47,   189,-32768,   250,   309,
+   335,-32768,   730,-32768,-32768,   452,-32768,   464,-32768,-32768,
+   739,   740,-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,-32768,-32768,-32768,   655,-32768,-32768,   741,   743,-32768,
+-32768,-32768,   371,   748,-32768,-32768,   621,   629,   640,-32768,
+  -120,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   661,-32768,
+    -6,-32768,   651,-32768,   545,-32768,   539,   537,-32768,-32768,
+   552,  -114,   573,  -179,-32768,   316,-32768,  -434,-32768,   188,
+  -522,   215,   -77,   180,   178,   255,  -420,   166,-32768,  -165,
+-32768,-32768,  -406,-32768,  -251,  -288,  -326,-32768,-32768,-32768,
+-32768,-32768,   432,-32768,-32768,   -76,-32768,-32768,-32768,    -3,
+   -18,-32768,    45,-32768,-32768,   440,   524,   -79,-32768,-32768,
+    63,-32768,   -93,  -135,   369,   443,  -174,   287,  -189,  -212,
+  -101,   569,   -32,  -257,   643,  -137,-32768,   580,-32768,-32768,
+-32768,  -532,  -201,  -254,-32768,   137,   -95,   508,-32768,-32768,
+  -282,   505,-32768,-32768,   515,  -264,  -173,-32768,-32768,  -243,
+-32768,  -297,-32768,-32768,   278,     7,   -23,   -38,   455,   694,
+  -373,    15,   577
+};
+
+
+#define	YYLAST		3247
+
+
+static const short yytable[] = {   117,
+    99,   102,   112,   195,   185,   147,   208,   210,    15,    19,
+   412,   197,   295,   179,    15,   295,   394,   111,   251,   140,
+   119,   202,    19,   378,   270,   340,   342,   274,     2,   116,
+   106,   131,   384,   496,   390,   444,   388,   398,   399,   244,
+   441,   390,   586,   594,   335,   207,   218,   220,   100,   669,
+   319,   530,   544,   323,   103,   541,   326,   509,   109,   125,
+   150,   126,   605,   360,   327,   610,   101,   442,   601,   179,
+   642,   650,   644,   128,   425,   136,   177,   380,   569,   104,
+   150,   128,   128,   672,   627,     3,   139,   150,   525,   562,
+   329,   370,   380,   332,   141,   639,   545,   150,   216,   217,
+   150,   651,   262,   150,   150,   174,   218,   220,   218,   220,
+    15,   107,   487,   -55,    19,   349,   580,   358,   517,   518,
+    99,   219,   217,   116,  -101,   275,   179,   350,   468,   212,
+   470,   483,   231,    99,    99,   484,   108,   343,   217,   344,
+   179,   179,   340,   342,   497,   591,   468,   179,   276,  -101,
+   214,     9,   563,   391,   213,   255,    10,   150,   468,   392,
+   592,    19,   263,   247,   428,   234,   346,   226,   100,   221,
+   227,   273,   390,   434,   150,   578,   579,   430,   111,   436,
+   213,   100,   100,   471,   474,   482,   101,   213,   620,   177,
+   622,   655,   642,   643,   644,   461,   213,   270,   656,   101,
+   101,   630,   417,   177,   177,   395,   540,   216,   217,   630,
+   177,   317,   632,   631,   150,   532,   631,   502,   174,   208,
+   210,   645,   123,   641,   631,   340,     8,   493,   282,   283,
+   284,   285,   174,   174,   652,   330,   331,   654,   344,   500,
+   344,   158,   213,     9,   159,   130,     9,   655,    10,   160,
+   161,   115,   162,   151,   656,   522,   218,   440,     9,   656,
+   163,   584,   527,    10,   164,   165,    11,   373,   373,   631,
+   317,   262,   166,   512,   631,   568,   152,   167,   150,   456,
+   523,   657,   153,   589,   282,   283,   284,   285,   603,   282,
+   283,   284,   285,   168,   458,   182,   458,   278,   279,   411,
+   488,   489,   208,   219,   217,   401,   402,     9,   590,   163,
+   280,   655,   281,   213,   587,   180,   150,   150,   656,   187,
+   403,   166,   404,   405,   406,   407,   150,   282,   283,   284,
+   285,   570,   408,   631,   150,   440,   482,   655,   343,   217,
+   626,   286,   155,   467,   656,   675,   288,   156,   282,   283,
+   284,   285,  -404,    64,   184,    66,   188,    68,    69,   631,
+   189,    71,    72,    73,    74,   538,   665,   666,    77,    78,
+   373,   677,   373,   198,   282,   283,   284,   285,   673,  -247,
+   674,    16,   473,   111,   355,   439,   217,   199,   356,   217,
+   602,     9,     9,   289,   290,   557,    10,    10,   357,   150,
+   291,   142,   660,   130,   482,   143,   490,   513,   494,   495,
+   623,   660,   660,   490,   158,   144,   326,   159,   676,   678,
+   130,   278,   279,   660,   327,   660,   660,   660,   463,   561,
+   317,     9,   280,   163,   349,   515,   281,   490,   158,   438,
+   222,   159,   223,   356,   217,   166,   350,   278,    15,   233,
+   530,   282,   283,   284,   285,   531,   538,     9,   130,   537,
+   593,   539,   281,   235,   583,   286,   287,   238,   490,   243,
+   288,   239,   217,   236,   111,   237,   530,   282,   283,   284,
+   285,   543,   667,   667,   150,   349,   326,   668,   679,   467,
+   158,   286,   245,   159,   327,   667,   288,   350,   228,   229,
+   680,   162,   597,   554,   246,   574,   555,   599,   248,   163,
+   209,   211,   558,   230,   132,   134,   214,   289,   290,   150,
+   256,   166,   337,   339,   291,   567,   167,   485,   486,   133,
+   135,   257,   490,   264,   111,   325,   150,   271,   258,   259,
+   272,   575,   333,   289,   290,   352,   334,   581,   354,   353,
+   291,   574,   363,   364,   365,   490,   490,   368,   371,   158,
+    15,   567,   159,   372,   383,   385,   278,   279,   386,   387,
+   400,   390,   413,   414,   415,   416,     9,   418,   163,   419,
+   635,   281,   420,   421,   424,   448,   427,   567,   422,   451,
+   166,   635,   423,   453,   431,   634,   282,   283,   284,   285,
+   426,   433,   111,   449,   635,   635,   634,   662,   503,   460,
+   286,   635,   452,   462,   504,   288,   662,   662,   519,   634,
+   634,   505,   506,   664,   526,   529,   634,   528,   662,   533,
+   662,   662,   662,   158,  -405,   534,   159,   535,    21,   536,
+   278,   279,   542,   548,   549,   550,   551,   552,   553,   560,
+   472,   280,   163,   576,   582,   281,   544,   280,   588,   598,
+   604,   612,   289,   290,   166,   613,   608,   606,   619,   291,
+   282,   283,   284,   285,   617,   614,   595,   621,   624,   625,
+   628,   636,   638,   640,   286,   287,  -406,   646,   647,   288,
+   649,   648,   663,   615,   476,   477,   478,    27,    28,    29,
+    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+    40,    41,    42,    43,    44,    45,   644,    46,    47,    48,
+    49,    50,    51,    52,    53,    54,    55,   110,    57,    58,
+    59,    60,   669,    61,   670,   671,   289,   290,   682,   683,
+   138,     7,   454,   291,   192,    64,    84,    66,    67,    68,
+    69,    86,   193,    71,    72,    73,    74,    75,   157,    76,
+    77,    78,   158,   194,   154,   159,   324,    21,   321,   278,
+   279,   401,   402,   338,   336,   524,   585,   600,   611,   472,
+   280,   163,   163,   616,   281,   277,   403,   637,   404,   405,
+   406,   407,   571,   166,   166,   376,   447,   437,   408,   282,
+   283,   284,   285,   475,   328,   564,   393,   232,   389,   409,
+   183,   347,     0,   286,   287,     0,     0,     0,   288,   348,
+     0,     0,     0,   476,   477,   478,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,     0,     0,   289,   290,     0,     0,     0,
+     0,     0,   291,     0,    64,     0,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,     0,    76,    77,
+    78,   158,     0,     0,   159,     0,    21,     0,   278,   279,
+     0,     0,     0,     0,     0,     0,     0,     0,   472,   280,
+   163,     0,     0,   281,     0,     0,     0,     0,     0,     0,
+     0,     0,   166,     0,     0,     0,     0,     0,   282,   283,
+   284,   285,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   286,   287,     0,     0,     0,   288,     0,     0,
+     0,     0,   476,   477,   478,    27,    28,    29,    30,    31,
+    32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+    42,    43,    44,    45,     0,    46,    47,    48,    49,    50,
+    51,    52,    53,    54,    55,   110,    57,    58,    59,    60,
+     0,    61,     0,     0,   289,   290,     0,     0,     0,     0,
+     0,   291,     0,    64,     0,    66,    67,    68,    69,     0,
+     0,    71,    72,    73,    74,    75,     0,    76,    77,    78,
+   158,     0,     0,   159,     0,    21,     0,   278,   279,     0,
+     0,     0,     0,     0,     0,     0,     0,   472,   280,   163,
+     0,     0,   281,     0,     0,     0,     0,     0,     0,     0,
+     0,   166,     0,     0,     0,     0,     0,   282,   283,   284,
+   285,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,   286,   287,     0,     0,     0,   288,     0,     0,     0,
+     0,     0,     0,     0,    27,    28,    29,    30,    31,    32,
+    33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+    43,    44,    45,     0,    46,    47,    48,    49,    50,    51,
+    52,    53,    54,    55,   110,    57,    58,    59,    60,     0,
+    61,     0,     0,   289,   290,     0,     0,     0,     0,     0,
+   291,     0,    64,     0,    66,    67,    68,    69,     0,     0,
+    71,    72,    73,    74,    75,     0,    76,    77,    78,   158,
+     0,     0,   159,     0,    21,     0,     0,   160,   161,     0,
+   162,     0,     0,     0,     0,     0,    22,     0,   163,     0,
+     0,     0,   164,   165,     0,     0,     0,     0,     0,    64,
+   166,    66,     0,    68,    69,   167,     0,    71,    72,    73,
+    74,     0,     0,     0,    77,    78,     0,     0,     0,     0,
+     0,   168,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   169,    27,    28,    29,    30,    31,    32,    33,
+    34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+    44,    45,     0,    46,    47,    48,    49,    50,    51,    52,
+    53,    54,    55,   110,    57,    58,    59,    60,    21,    61,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    22,    64,     0,    66,    67,    68,    69,     0,     0,    71,
+    72,    73,    74,    75,     0,    76,    77,    78,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,    23,     0,
+    24,     0,     0,     0,     0,     0,    25,     0,     0,     0,
+     0,     0,    26,     0,     0,     0,     0,    27,    28,    29,
+    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+    40,    41,    42,    43,    44,    45,     0,    46,    47,    48,
+    49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+    59,    60,     0,    61,     0,     0,     0,     0,    62,     0,
+    21,     0,    63,     0,     3,    64,    65,    66,    67,    68,
+    69,    70,    22,    71,    72,    73,    74,    75,     0,    76,
+    77,    78,    79,    80,    81,    82,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    23,     0,    24,     0,     0,     0,     0,     0,    25,     0,
+     0,     0,     0,     0,    26,     0,     0,     0,     0,    27,
+    28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+    38,    39,    40,    41,    42,    43,    44,    45,     0,    46,
+    47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+    57,    58,    59,    60,    21,    61,     0,     0,     0,     0,
+    62,     0,     0,     0,    63,     0,    22,    64,    65,    66,
+    67,    68,    69,    70,     0,    71,    72,    73,    74,    75,
+     0,    76,    77,    78,    79,    80,    81,    82,     0,     0,
+     0,     0,     0,     0,     0,     0,    24,     0,     0,     0,
+     0,     0,    25,     0,     0,     0,     0,     0,    26,     0,
+     0,     0,     0,    27,    28,    29,    30,    31,    32,    33,
+    34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+    44,    45,     0,    46,    47,    48,    49,    50,    51,    52,
+    53,    54,    55,    56,    57,    58,    59,    60,     0,    61,
+     0,     0,     0,     0,     0,    21,     0,     0,    63,     0,
+     0,    64,    65,    66,    67,    68,    69,    22,     0,    71,
+    72,    73,    74,    75,     0,    76,    77,    78,    79,    80,
+    81,    82,   556,     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,    27,    28,    29,    30,    31,    32,
+    33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+    43,    44,    45,     0,    46,    47,    48,    49,    50,    51,
+    52,    53,    54,    55,   110,    57,    58,    59,    60,   438,
+    61,    21,     0,   356,   217,     0,     0,     0,     0,     0,
+     0,     0,    64,    22,    66,    67,    68,    69,   130,     0,
+    71,    72,    73,    74,    75,     0,    76,    77,    78,     0,
+    80,    81,    82,     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,
+    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+    37,    38,    39,    40,    41,    42,    43,    44,    45,     0,
+    46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+   110,    57,    58,    59,    60,   238,    61,    21,     0,   239,
+   217,     0,     0,     0,     0,     0,     0,     0,    64,    22,
+    66,    67,    68,    69,     0,     0,    71,    72,    73,    74,
+    75,   249,    76,    77,    78,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,    21,    61,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,    22,    64,     0,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,   249,    76,    77,
+    78,     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,   313,   314,     0,
+    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+    37,    38,    39,    40,    41,    42,    43,    44,    45,     0,
+    46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+   110,    57,    58,    59,    60,     0,    61,    21,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,    64,    22,
+    66,    67,    68,    69,     0,     0,    71,    72,    73,    74,
+    75,     0,    76,    77,    78,     0,   318,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,    21,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,    64,    22,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,   249,    76,    77,
+    78,     0,   322,     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,    27,    28,    29,    30,    31,    32,    33,    34,
+    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+    45,     0,    46,    47,    48,    49,    50,    51,    52,    53,
+    54,    55,   110,    57,    58,    59,    60,     0,    61,    21,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    64,    22,    66,    67,    68,    69,     0,     0,    71,    72,
+    73,    74,    75,   249,    76,    77,    78,     0,   429,     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,    27,    28,
+    29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+    39,    40,    41,    42,    43,    44,    45,     0,    46,    47,
+    48,    49,    50,    51,    52,    53,    54,    55,   110,    57,
+    58,    59,    60,     0,    61,    21,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,    64,    22,    66,    67,
+    68,    69,     0,     0,    71,    72,    73,    74,    75,   249,
+    76,    77,    78,     0,   511,     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,    27,    28,    29,    30,    31,    32,
+    33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+    43,    44,    45,     0,    46,    47,    48,    49,    50,    51,
+    52,    53,    54,    55,   110,    57,    58,    59,    60,    21,
+    61,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,    22,    64,     0,    66,    67,    68,    69,     0,     0,
+    71,    72,    73,    74,    75,   249,    76,    77,    78,     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,    27,    28,
+    29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+    39,    40,    41,    42,    43,    44,    45,     0,    46,    47,
+    48,    49,    50,    51,    52,    53,    54,    55,   110,    57,
+    58,    59,    60,    21,    61,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,    22,    64,     0,    66,    67,
+    68,    69,     0,     0,    71,    72,    73,    74,    75,   249,
+    76,    77,    78,     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,    27,    28,    29,    30,    31,    32,    33,    34,
+    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+    45,     0,    46,    47,    48,    49,    50,    51,    52,    53,
+    54,    55,   110,    57,    58,    59,    60,    21,    61,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,    22,
+    64,     0,    66,    67,    68,    69,     0,   266,    71,    72,
+    73,    74,    75,     0,    76,    77,    78,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,     0,     0,     0,     0,     0,    21,     0,
+     0,     0,     0,     0,    64,     0,    66,    67,    68,    69,
+    22,     0,    71,    72,    73,    74,    75,   435,    76,    77,
+    78,     0,     0,     0,     0,   457,     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,    27,    28,    29,
+    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+    40,    41,    42,    43,    44,    45,     0,    46,    47,    48,
+    49,    50,    51,    52,    53,    54,    55,   110,    57,    58,
+    59,    60,     0,    61,     0,     0,     0,     0,     0,    21,
+     0,     0,     0,     0,     0,    64,     0,    66,    67,    68,
+    69,    22,     0,    71,    72,    73,    74,    75,     0,    76,
+    77,    78,     0,     0,     0,     0,   459,     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,    27,    28,
+    29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+    39,    40,    41,    42,    43,    44,    45,     0,    46,    47,
+    48,    49,    50,    51,    52,    53,    54,    55,   110,    57,
+    58,    59,    60,    21,    61,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,    22,    64,     0,    66,    67,
+    68,    69,     0,     0,    71,    72,    73,    74,    75,     0,
+    76,    77,    78,     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,   565,    27,    28,    29,    30,    31,    32,    33,    34,
+    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+    45,     0,    46,    47,    48,    49,    50,    51,    52,    53,
+    54,    55,   110,    57,    58,    59,    60,    21,    61,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,    22,
+    64,     0,    66,    67,    68,    69,     0,     0,    71,    72,
+    73,    74,    75,     0,    76,    77,    78,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,    64,     0,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,     0,    76,    77,
+    78,   158,     0,     0,   159,     0,     0,     0,   278,   279,
+     0,     0,     0,     0,     0,     0,     0,     0,     9,   280,
+   163,     0,     0,   281,     0,     0,     0,     0,   158,     0,
+     0,   159,   166,     0,   320,   278,   279,     0,   282,   283,
+   284,   285,     0,     0,     0,     9,   280,   163,     0,     0,
+   281,     0,   286,   287,     0,     0,     0,   288,     0,   166,
+     0,   379,     0,     0,     0,   282,   283,   284,   285,   158,
+     0,     0,   159,     0,     0,     0,   278,   279,     0,   286,
+   287,     0,     0,     0,   288,     0,     9,   280,   163,     0,
+     0,   281,     0,     0,     0,     0,     0,     0,     0,     0,
+   166,     0,   492,     0,   289,   290,   282,   283,   284,   285,
+     0,   291,     0,     0,     0,     0,     0,     0,     0,     0,
+   286,   287,     0,     0,     0,   288,   158,     0,     0,   159,
+     0,   289,   290,   278,   279,     0,     0,     0,   291,     0,
+     0,     0,     0,     9,   280,   163,     0,     0,   281,     0,
+     0,     0,     0,     0,     0,     0,     0,   166,     0,     0,
+     0,     0,     0,   282,   283,   284,   285,     0,     0,     0,
+     0,     0,   289,   290,     0,     0,     0,   286,   287,   291,
+     0,     0,   288,     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,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   289,
+   290,     0,     0,     0,     0,     0,   291
+};
+
+static const short yycheck[] = {    23,
+     4,     8,    21,   124,   119,    99,   142,   143,     2,     3,
+   308,   126,   214,   109,     8,   217,   299,    21,   184,    96,
+    24,   136,    16,   278,   199,   238,   239,   207,    57,    23,
+    16,    70,   287,   407,    14,   362,   294,   302,   303,   177,
+     7,    14,   565,   576,   234,   139,   148,   149,     4,     3,
+   216,    32,    60,   219,     7,    36,    24,   431,    10,    63,
+    99,    65,   595,   253,    32,   598,     4,    34,   591,   165,
+     6,     7,     8,    67,   332,    79,   109,   279,    51,    32,
+   119,    75,    76,    37,   617,   114,    90,   126,   462,   524,
+   228,   266,   294,   231,    98,   628,   104,   136,    10,    11,
+   139,    37,   196,   142,   143,   109,   208,   209,   210,   211,
+   104,     7,   395,    97,   108,    23,   551,   253,   445,   446,
+   124,    10,    11,   117,     7,    37,   222,    35,   383,     7,
+   110,   389,   165,   137,   138,   390,    32,    10,    11,   241,
+   236,   237,   355,   356,   409,    31,   401,   243,    37,    32,
+    33,    20,   526,    33,    32,     7,    25,   196,   413,    39,
+    46,   155,     7,   182,    37,   169,   243,   161,   124,   155,
+   164,     7,    14,   353,   213,   549,   550,   343,   182,   354,
+    32,   137,   138,   385,   386,   387,   124,    32,   609,   222,
+   611,     3,     6,     7,     8,    37,    32,   372,    10,   137,
+   138,    10,   317,   236,   237,   301,   489,    10,    11,    10,
+   243,   215,   619,    25,   253,   470,    25,     7,   222,   355,
+   356,    35,    62,   630,    25,   438,     3,   401,    40,    41,
+    42,    43,   236,   237,    35,   229,   230,   644,   340,   413,
+   342,     3,    32,    20,     6,    25,    20,     3,    25,    11,
+    12,    25,    14,     7,    10,     7,   358,   359,    20,    10,
+    22,   559,   464,    25,    26,    27,    43,   271,   272,    25,
+   274,   365,    34,   439,    25,   530,     7,    39,   317,   373,
+    32,    37,     3,     7,    40,    41,    42,    43,     7,    40,
+    41,    42,    43,    55,   374,    31,   376,    10,    11,    10,
+   396,   397,   438,    10,    11,    11,    12,    20,    32,    22,
+    21,     3,    25,    32,   569,     6,   355,   356,    10,   111,
+    26,    34,    28,    29,    30,    31,   365,    40,    41,    42,
+    43,   533,    38,    25,   373,   437,   538,     3,    10,    11,
+     7,    54,    32,   382,    10,    37,    59,    37,    40,    41,
+    42,    43,    10,   115,    10,   117,   111,   119,   120,    25,
+    97,   123,   124,   125,   126,    32,   655,   656,   130,   131,
+   374,    37,   376,    34,    40,    41,    42,    43,   667,    34,
+   669,    10,   386,   387,     6,    10,    11,    10,    10,    11,
+   592,    20,    20,   106,   107,   516,    25,    25,    20,   438,
+   113,     6,   646,    25,   606,    10,   400,    35,   402,   403,
+   612,   655,   656,   407,     3,    20,    24,     6,   670,   671,
+    25,    10,    11,   667,    32,   669,   670,   671,    36,   523,
+   434,    20,    21,    22,    23,   442,    25,   431,     3,     6,
+    10,     6,    27,    10,    11,    34,    35,    10,   442,    27,
+    32,    40,    41,    42,    43,    37,    32,    20,    25,   478,
+   575,    37,    25,    37,   558,    54,    55,     6,   462,    53,
+    59,    10,    11,    32,   478,    32,    32,    40,    41,    42,
+    43,    37,    32,    32,   523,    23,    24,    37,    37,   528,
+     3,    54,    27,     6,    32,    32,    59,    35,    11,    12,
+    37,    14,   580,    32,     6,   544,    35,   585,     7,    22,
+   142,   143,   516,    26,    75,    76,    33,   106,   107,   558,
+    20,    34,   236,   237,   113,   529,    39,   391,   392,    75,
+    76,    20,   526,    25,   538,    36,   575,    34,   111,   111,
+    34,   545,    27,   106,   107,     8,   110,   554,    32,    37,
+   113,   590,    20,    20,    32,   549,   550,    32,    37,     3,
+   554,   565,     6,    32,    10,    10,    10,    11,    10,    10,
+    31,    14,    10,     7,     7,    34,    20,    37,    22,    36,
+   619,    25,    37,    37,    36,     7,    37,   591,    27,    25,
+    34,   630,    27,     7,    31,   619,    40,    41,    42,    43,
+    27,    27,   606,    34,   643,   644,   630,   646,    27,    34,
+    54,   650,    35,    31,    27,    59,   655,   656,    58,   643,
+   644,    51,    37,   647,    31,    31,   650,    32,   667,    32,
+   669,   670,   671,     3,    10,    37,     6,    37,     8,    37,
+    10,    11,    37,    27,    26,    32,    34,    37,     7,    35,
+    20,    21,    22,    49,     7,    25,    60,    21,    37,    10,
+     7,    46,   106,   107,    34,     7,    47,    61,    34,   113,
+    40,    41,    42,    43,    52,    45,   105,    37,     7,     7,
+    48,    35,     7,    35,    54,    55,    10,    10,    33,    59,
+     7,    35,    25,    63,    64,    65,    66,    67,    68,    69,
+    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+    80,    81,    82,    83,    84,    85,     8,    87,    88,    89,
+    90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+   100,   101,     3,   103,    10,    10,   106,   107,     0,     0,
+    86,     1,   372,   113,   124,   115,     4,   117,   118,   119,
+   120,     4,   124,   123,   124,   125,   126,   127,   108,   129,
+   130,   131,     3,   124,   104,     6,   222,     8,   217,    10,
+    11,    11,    12,   237,   236,   460,   562,   590,   599,    20,
+    21,    22,    22,   606,    25,   213,    26,   622,    28,    29,
+    30,    31,   538,    34,    34,   272,   365,   355,    38,    40,
+    41,    42,    43,    44,   225,   528,   299,   165,   294,   305,
+   117,   243,    -1,    54,    55,    -1,    -1,    -1,    59,   243,
+    -1,    -1,    -1,    64,    65,    66,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,    -1,    -1,   106,   107,    -1,    -1,    -1,
+    -1,    -1,   113,    -1,   115,    -1,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,    -1,   129,   130,
+   131,     3,    -1,    -1,     6,    -1,     8,    -1,    10,    11,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,    21,
+    22,    -1,    -1,    25,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    34,    -1,    -1,    -1,    -1,    -1,    40,    41,
+    42,    43,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    54,    55,    -1,    -1,    -1,    59,    -1,    -1,
+    -1,    -1,    64,    65,    66,    67,    68,    69,    70,    71,
+    72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+    82,    83,    84,    85,    -1,    87,    88,    89,    90,    91,
+    92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
+    -1,   103,    -1,    -1,   106,   107,    -1,    -1,    -1,    -1,
+    -1,   113,    -1,   115,    -1,   117,   118,   119,   120,    -1,
+    -1,   123,   124,   125,   126,   127,    -1,   129,   130,   131,
+     3,    -1,    -1,     6,    -1,     8,    -1,    10,    11,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,    21,    22,
+    -1,    -1,    25,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    34,    -1,    -1,    -1,    -1,    -1,    40,    41,    42,
+    43,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    54,    55,    -1,    -1,    -1,    59,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    67,    68,    69,    70,    71,    72,
+    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+    83,    84,    85,    -1,    87,    88,    89,    90,    91,    92,
+    93,    94,    95,    96,    97,    98,    99,   100,   101,    -1,
+   103,    -1,    -1,   106,   107,    -1,    -1,    -1,    -1,    -1,
+   113,    -1,   115,    -1,   117,   118,   119,   120,    -1,    -1,
+   123,   124,   125,   126,   127,    -1,   129,   130,   131,     3,
+    -1,    -1,     6,    -1,     8,    -1,    -1,    11,    12,    -1,
+    14,    -1,    -1,    -1,    -1,    -1,    20,    -1,    22,    -1,
+    -1,    -1,    26,    27,    -1,    -1,    -1,    -1,    -1,   115,
+    34,   117,    -1,   119,   120,    39,    -1,   123,   124,   125,
+   126,    -1,    -1,    -1,   130,   131,    -1,    -1,    -1,    -1,
+    -1,    55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    66,    67,    68,    69,    70,    71,    72,    73,
+    74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+    84,    85,    -1,    87,    88,    89,    90,    91,    92,    93,
+    94,    95,    96,    97,    98,    99,   100,   101,     8,   103,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    20,   115,    -1,   117,   118,   119,   120,    -1,    -1,   123,
+   124,   125,   126,   127,    -1,   129,   130,   131,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,    -1,
+    50,    -1,    -1,    -1,    -1,    -1,    56,    -1,    -1,    -1,
+    -1,    -1,    62,    -1,    -1,    -1,    -1,    67,    68,    69,
+    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+    80,    81,    82,    83,    84,    85,    -1,    87,    88,    89,
+    90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+   100,   101,    -1,   103,    -1,    -1,    -1,    -1,   108,    -1,
+     8,    -1,   112,    -1,   114,   115,   116,   117,   118,   119,
+   120,   121,    20,   123,   124,   125,   126,   127,    -1,   129,
+   130,   131,   132,   133,   134,   135,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    48,    -1,    50,    -1,    -1,    -1,    -1,    -1,    56,    -1,
+    -1,    -1,    -1,    -1,    62,    -1,    -1,    -1,    -1,    67,
+    68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+    78,    79,    80,    81,    82,    83,    84,    85,    -1,    87,
+    88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+    98,    99,   100,   101,     8,   103,    -1,    -1,    -1,    -1,
+   108,    -1,    -1,    -1,   112,    -1,    20,   115,   116,   117,
+   118,   119,   120,   121,    -1,   123,   124,   125,   126,   127,
+    -1,   129,   130,   131,   132,   133,   134,   135,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    -1,    -1,
+    -1,    -1,    56,    -1,    -1,    -1,    -1,    -1,    62,    -1,
+    -1,    -1,    -1,    67,    68,    69,    70,    71,    72,    73,
+    74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+    84,    85,    -1,    87,    88,    89,    90,    91,    92,    93,
+    94,    95,    96,    97,    98,    99,   100,   101,    -1,   103,
+    -1,    -1,    -1,    -1,    -1,     8,    -1,    -1,   112,    -1,
+    -1,   115,   116,   117,   118,   119,   120,    20,    -1,   123,
+   124,   125,   126,   127,    -1,   129,   130,   131,   132,   133,
+   134,   135,    35,    -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,    67,    68,    69,    70,    71,    72,
+    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+    83,    84,    85,    -1,    87,    88,    89,    90,    91,    92,
+    93,    94,    95,    96,    97,    98,    99,   100,   101,     6,
+   103,     8,    -1,    10,    11,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,   115,    20,   117,   118,   119,   120,    25,    -1,
+   123,   124,   125,   126,   127,    -1,   129,   130,   131,    -1,
+   133,   134,   135,    -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,
+    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+    77,    78,    79,    80,    81,    82,    83,    84,    85,    -1,
+    87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+    97,    98,    99,   100,   101,     6,   103,     8,    -1,    10,
+    11,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   115,    20,
+   117,   118,   119,   120,    -1,    -1,   123,   124,   125,   126,
+   127,   128,   129,   130,   131,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,     8,   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    20,   115,    -1,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,   128,   129,   130,
+   131,    -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,    64,    65,    -1,
+    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+    77,    78,    79,    80,    81,    82,    83,    84,    85,    -1,
+    87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+    97,    98,    99,   100,   101,    -1,   103,     8,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   115,    20,
+   117,   118,   119,   120,    -1,    -1,   123,   124,   125,   126,
+   127,    -1,   129,   130,   131,    -1,    37,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,     8,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   115,    20,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,   128,   129,   130,
+   131,    -1,    37,    -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,    67,    68,    69,    70,    71,    72,    73,    74,
+    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+    85,    -1,    87,    88,    89,    90,    91,    92,    93,    94,
+    95,    96,    97,    98,    99,   100,   101,    -1,   103,     8,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+   115,    20,   117,   118,   119,   120,    -1,    -1,   123,   124,
+   125,   126,   127,   128,   129,   130,   131,    -1,    37,    -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,    67,    68,
+    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+    79,    80,    81,    82,    83,    84,    85,    -1,    87,    88,
+    89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+    99,   100,   101,    -1,   103,     8,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,   115,    20,   117,   118,
+   119,   120,    -1,    -1,   123,   124,   125,   126,   127,   128,
+   129,   130,   131,    -1,    37,    -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,    67,    68,    69,    70,    71,    72,
+    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+    83,    84,    85,    -1,    87,    88,    89,    90,    91,    92,
+    93,    94,    95,    96,    97,    98,    99,   100,   101,     8,
+   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    20,   115,    -1,   117,   118,   119,   120,    -1,    -1,
+   123,   124,   125,   126,   127,   128,   129,   130,   131,    -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,    67,    68,
+    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+    79,    80,    81,    82,    83,    84,    85,    -1,    87,    88,
+    89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+    99,   100,   101,     8,   103,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    20,   115,    -1,   117,   118,
+   119,   120,    -1,    -1,   123,   124,   125,   126,   127,   128,
+   129,   130,   131,    -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,    67,    68,    69,    70,    71,    72,    73,    74,
+    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+    85,    -1,    87,    88,    89,    90,    91,    92,    93,    94,
+    95,    96,    97,    98,    99,   100,   101,     8,   103,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,
+   115,    -1,   117,   118,   119,   120,    -1,   122,   123,   124,
+   125,   126,   127,    -1,   129,   130,   131,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,    -1,    -1,    -1,    -1,    -1,     8,    -1,
+    -1,    -1,    -1,    -1,   115,    -1,   117,   118,   119,   120,
+    20,    -1,   123,   124,   125,   126,   127,   128,   129,   130,
+   131,    -1,    -1,    -1,    -1,    35,    -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,    67,    68,    69,
+    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+    80,    81,    82,    83,    84,    85,    -1,    87,    88,    89,
+    90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+   100,   101,    -1,   103,    -1,    -1,    -1,    -1,    -1,     8,
+    -1,    -1,    -1,    -1,    -1,   115,    -1,   117,   118,   119,
+   120,    20,    -1,   123,   124,   125,   126,   127,    -1,   129,
+   130,   131,    -1,    -1,    -1,    -1,    35,    -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,    67,    68,
+    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+    79,    80,    81,    82,    83,    84,    85,    -1,    87,    88,
+    89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+    99,   100,   101,     8,   103,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    20,   115,    -1,   117,   118,
+   119,   120,    -1,    -1,   123,   124,   125,   126,   127,    -1,
+   129,   130,   131,    -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,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+    85,    -1,    87,    88,    89,    90,    91,    92,    93,    94,
+    95,    96,    97,    98,    99,   100,   101,     8,   103,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,
+   115,    -1,   117,   118,   119,   120,    -1,    -1,   123,   124,
+   125,   126,   127,    -1,   129,   130,   131,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   115,    -1,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,    -1,   129,   130,
+   131,     3,    -1,    -1,     6,    -1,    -1,    -1,    10,    11,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,    21,
+    22,    -1,    -1,    25,    -1,    -1,    -1,    -1,     3,    -1,
+    -1,     6,    34,    -1,    36,    10,    11,    -1,    40,    41,
+    42,    43,    -1,    -1,    -1,    20,    21,    22,    -1,    -1,
+    25,    -1,    54,    55,    -1,    -1,    -1,    59,    -1,    34,
+    -1,    36,    -1,    -1,    -1,    40,    41,    42,    43,     3,
+    -1,    -1,     6,    -1,    -1,    -1,    10,    11,    -1,    54,
+    55,    -1,    -1,    -1,    59,    -1,    20,    21,    22,    -1,
+    -1,    25,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    34,    -1,    36,    -1,   106,   107,    40,    41,    42,    43,
+    -1,   113,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    54,    55,    -1,    -1,    -1,    59,     3,    -1,    -1,     6,
+    -1,   106,   107,    10,    11,    -1,    -1,    -1,   113,    -1,
+    -1,    -1,    -1,    20,    21,    22,    -1,    -1,    25,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    34,    -1,    -1,
+    -1,    -1,    -1,    40,    41,    42,    43,    -1,    -1,    -1,
+    -1,    -1,   106,   107,    -1,    -1,    -1,    54,    55,   113,
+    -1,    -1,    59,    -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,   106,
+   107,    -1,    -1,    -1,    -1,    -1,   113
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/share/misc/bison.simple"
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+#ifndef alloca
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
+#include 
+#else /* not sparc */
+#if defined (MSDOS) && !defined (__TURBOC__)
+#include 
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+#include 
+ #pragma alloca
+#else /* not MSDOS, __TURBOC__, or _AIX */
+#ifdef __hpux
+#ifdef __cplusplus
+extern "C" {
+void *alloca (unsigned int);
+};
+#else /* not __cplusplus */
+void *alloca ();
+#endif /* not __cplusplus */
+#endif /* __hpux */
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc.  */
+#endif /* not GNU C.  */
+#endif /* alloca not defined.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		-2
+#define YYEOF		0
+#define YYACCEPT	return(0)
+#define YYABORT 	return(1)
+#define YYERROR		goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL		goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    { yychar = (token), yylval = (value);			\
+      yychar1 = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    { yyerror ("syntax error: cannot back up"); YYERROR; }	\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+#ifndef YYPURE
+#define YYLEX		yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int	yychar;			/*  the lookahead symbol		*/
+YYSTYPE	yylval;			/*  the semantic value of the		*/
+				/*  lookahead symbol			*/
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;			/*  location data for the lookahead	*/
+				/*  symbol				*/
+#endif
+
+int yynerrs;			/*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug;			/*  nonzero means print parse trace	*/
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
+
+#ifndef	YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+int yyparse (void);
+#endif
+
+#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
+#define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
+#else				/* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (to, from, count)
+     char *to;
+     char *from;
+     int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (char *to, char *from, int count)
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 196 "/usr/share/misc/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
+  int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */
+
+  short	yyssa[YYINITDEPTH];	/*  the state stack			*/
+  YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/
+
+  short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+
+#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+
+#ifdef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;		/*  the variable used to return		*/
+				/*  semantic values from the action	*/
+				/*  routines				*/
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+	 the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+	 but that might be undefined if yyoverflow is a macro.  */
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yyls1, size * sizeof (*yylsp),
+		 &yystacksize);
+#else
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yystacksize);
+#endif
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+	{
+	  yyerror("parser stack overflow");
+	  return 2;
+	}
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+	yystacksize = YYMAXDEPTH;
+      yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+      __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
+      yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+      __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+      __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+	YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+  goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)		/* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;		/* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+	{
+	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+	  /* Give the individual parser a way to print the precise meaning
+	     of a token, for further debugging info.  */
+#ifdef YYPRINT
+	  YYPRINT (stderr, yychar, yylval);
+#endif
+	  fprintf (stderr, ")\n");
+	}
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  if (yylen > 0)
+    yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+	       yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 1:
+#line 382 "llgrammar.y"
+{ lhExternals (yyvsp[0].interfacelist); ;
+    break;}
+case 2:
+#line 383 "llgrammar.y"
+{ interfaceNodeList_free (yyvsp[-2].interfacelist); interfaceNodeList_free (yyvsp[0].interfacelist); ;
+    break;}
+case 3:
+#line 386 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_new (); ;
+    break;}
+case 4:
+#line 387 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_addh (yyvsp[-1].interfacelist, yyvsp[0].iface);;
+    break;}
+case 7:
+#line 394 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_new (); ;
+    break;}
+case 8:
+#line 395 "llgrammar.y"
+{ yyval.interfacelist = consInterfaceNode (yyvsp[-1].iface, yyvsp[0].interfacelist);;
+    break;}
+case 9:
+#line 396 "llgrammar.y"
+{ yyval.interfacelist = consInterfaceNode (yyvsp[-1].iface, yyvsp[0].interfacelist);;
+    break;}
+case 10:
+#line 399 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_new (); ;
+    break;}
+case 11:
+#line 400 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_addh (yyvsp[-1].interfacelist, yyvsp[0].iface);;
+    break;}
+case 15:
+#line 409 "llgrammar.y"
+{ yyval.iface = makeInterfaceNodeImports (yyvsp[-1].importlist);
+     /* assume subspecs are already processed, symbol table info in external file */
+   ;
+    break;}
+case 16:
+#line 415 "llgrammar.y"
+{ yyval.iface = makeInterfaceNodeUses (yyvsp[-1].traitreflist); readlsignatures (yyval.iface);;
+    break;}
+case 17:
+#line 419 "llgrammar.y"
+{ declareConstant (yyvsp[0].constdeclaration); yyval.iface = interfaceNode_makeConst (yyvsp[0].constdeclaration); ;
+    break;}
+case 18:
+#line 421 "llgrammar.y"
+{ declareVar (yyvsp[0].vardeclaration); yyval.iface = interfaceNode_makeVar (yyvsp[0].vardeclaration); ;
+    break;}
+case 19:
+#line 423 "llgrammar.y"
+{ declareType (yyvsp[0].type); yyval.iface = interfaceNode_makeType (yyvsp[0].type); ;
+    break;}
+case 20:
+#line 425 "llgrammar.y"
+{ declareFcn (yyvsp[0].fcn, typeId_invalid); yyval.iface = interfaceNode_makeFcn (yyvsp[0].fcn); ;
+    break;}
+case 21:
+#line 427 "llgrammar.y"
+{ yyval.iface = interfaceNode_makeClaim (yyvsp[0].claim); ;
+    break;}
+case 22:
+#line 429 "llgrammar.y"
+{ declareIter (yyvsp[0].iter); yyval.iface = interfaceNode_makeIter (yyvsp[0].iter); ;
+    break;}
+case 23:
+#line 433 "llgrammar.y"
+{ yyval.iter = makeIterNode (yyvsp[-4].ltok, yyvsp[-2].paramlist); ;
+    break;}
+case 24:
+#line 436 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_new (); ;
+    break;}
+case 25:
+#line 437 "llgrammar.y"
+{ yyval.paramlist = yyvsp[0].paramlist; ;
+    break;}
+case 26:
+#line 441 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (paramNodeList_new (), yyvsp[0].param); ;
+    break;}
+case 27:
+#line 443 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (yyvsp[-2].paramlist,yyvsp[0].param); ;
+    break;}
+case 28:
+#line 446 "llgrammar.y"
+{ yyval.param = markYieldParamNode (yyvsp[0].param); ;
+    break;}
+case 29:
+#line 447 "llgrammar.y"
+{ yyval.param = yyvsp[0].param; ;
+    break;}
+case 30:
+#line 450 "llgrammar.y"
+{ symtable_export (g_symtab, FALSE); ;
+    break;}
+case 31:
+#line 451 "llgrammar.y"
+{ yyval.iface = yyvsp[0].iface; symtable_export (g_symtab, TRUE); ;
+    break;}
+case 32:
+#line 455 "llgrammar.y"
+{ declarePrivConstant (yyvsp[0].constdeclaration); yyval.iface =  interfaceNode_makePrivConst (yyvsp[0].constdeclaration); ;
+    break;}
+case 33:
+#line 457 "llgrammar.y"
+{ declarePrivVar (yyvsp[0].vardeclaration); yyval.iface = interfaceNode_makePrivVar (yyvsp[0].vardeclaration); ;
+    break;}
+case 34:
+#line 459 "llgrammar.y"
+{ declarePrivType (yyvsp[0].type); yyval.iface = interfaceNode_makePrivType (yyvsp[0].type); ;
+    break;}
+case 35:
+#line 461 "llgrammar.y"
+{ declarePrivFcn (yyvsp[0].fcn, typeId_invalid); yyval.iface = interfaceNode_makePrivFcn (yyvsp[0].fcn); ;
+    break;}
+case 36:
+#line 465 "llgrammar.y"
+{ yyval.constdeclaration = makeConstDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls); ;
+    break;}
+case 37:
+#line 469 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, FALSE); yyval.vardeclaration->qualifier = QLF_NONE; ;
+    break;}
+case 38:
+#line 471 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, FALSE); yyval.vardeclaration->qualifier = QLF_CONST; ;
+    break;}
+case 39:
+#line 473 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, FALSE); yyval.vardeclaration->qualifier = QLF_VOLATILE; ;
+    break;}
+case 40:
+#line 476 "llgrammar.y"
+{ yyval.type = makeAbstractTypeNode (yyvsp[0].abstract); ;
+    break;}
+case 41:
+#line 477 "llgrammar.y"
+{ yyval.type = makeExposedTypeNode (yyvsp[0].exposed); ;
+    break;}
+case 42:
+#line 480 "llgrammar.y"
+{ yyval.typequal = qual_createPrintfLike (); ;
+    break;}
+case 43:
+#line 481 "llgrammar.y"
+{ yyval.typequal = qual_createScanfLike (); ;
+    break;}
+case 44:
+#line 482 "llgrammar.y"
+{ yyval.typequal = qual_createMessageLike (); ;
+    break;}
+case 45:
+#line 485 "llgrammar.y"
+{ enteringFcnScope (yyvsp[-2].lcltypespec, yyvsp[-1].declare, yyvsp[0].globals); ;
+    break;}
+case 46:
+#line 487 "llgrammar.y"
+{ yyval.fcn = makeFcnNode (qual_createUnknown (), yyvsp[-12].lcltypespec, yyvsp[-11].declare, yyvsp[-10].globals, yyvsp[-7].vardeclarationlist, yyvsp[-6].letdecls, 
+		       yyvsp[-5].lclpredicate, yyvsp[-4].lclpredicate, yyvsp[-3].modify, yyvsp[-2].lclpredicate, yyvsp[-1].lclpredicate); 
+     /* type, declarator, glovbls, privateinits,
+	lets, checks, requires, modifies, ensures, claims */
+     symtable_exitScope (g_symtab);
+   ;
+    break;}
+case 47:
+#line 493 "llgrammar.y"
+{ enteringFcnScope (yyvsp[-2].lcltypespec, yyvsp[-1].declare, yyvsp[0].globals); ;
+    break;}
+case 48:
+#line 497 "llgrammar.y"
+{ yyval.fcn = makeFcnNode (yyvsp[-13].typequal, yyvsp[-12].lcltypespec, yyvsp[-11].declare, yyvsp[-10].globals, yyvsp[-7].vardeclarationlist, 
+		       yyvsp[-6].letdecls, yyvsp[-5].lclpredicate, yyvsp[-4].lclpredicate, yyvsp[-3].modify, yyvsp[-2].lclpredicate, yyvsp[-1].lclpredicate); 
+     /* type, declarator, glovbls, privateinits,
+	lets, checks, requires, modifies, ensures, claims */
+     symtable_exitScope (g_symtab);
+   ;
+    break;}
+case 49:
+#line 507 "llgrammar.y"
+{ enteringClaimScope (yyvsp[-2].paramlist, yyvsp[0].globals); ;
+    break;}
+case 50:
+#line 509 "llgrammar.y"
+{      yyval.claim = makeClaimNode (yyvsp[-11].ltok, yyvsp[-9].paramlist, yyvsp[-7].globals, yyvsp[-4].letdecls, yyvsp[-3].lclpredicate, yyvsp[-2].program, yyvsp[-1].lclpredicate); 
+     symtable_exitScope (g_symtab); ;
+    break;}
+case 51:
+#line 512 "llgrammar.y"
+{ yyval.claim = (claimNode) 0; ;
+    break;}
+case 52:
+#line 515 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 53:
+#line 515 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 54:
+#line 516 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-5].ltok, yyvsp[-2].ltok, TRUE, FALSE, yyvsp[0].abstbody); ;
+    break;}
+case 55:
+#line 517 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 56:
+#line 518 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 57:
+#line 519 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-6].ltok, yyvsp[-2].ltok, TRUE, TRUE, yyvsp[0].abstbody); ;
+    break;}
+case 58:
+#line 520 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 59:
+#line 521 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 60:
+#line 522 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-5].ltok, yyvsp[-2].ltok, TRUE, TRUE, yyvsp[0].abstbody); ;
+    break;}
+case 61:
+#line 523 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 62:
+#line 523 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 63:
+#line 524 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-5].ltok, yyvsp[-2].ltok, FALSE, FALSE, yyvsp[0].abstbody); ;
+    break;}
+case 64:
+#line 527 "llgrammar.y"
+{ g_inTypeDef = TRUE; setExposedType (yyvsp[0].lcltypespec); ;
+    break;}
+case 65:
+#line 528 "llgrammar.y"
+{ g_inTypeDef = FALSE; ;
+    break;}
+case 66:
+#line 529 "llgrammar.y"
+{ yyval.exposed = makeExposedNode (yyvsp[-5].ltok, yyvsp[-4].lcltypespec, yyvsp[-2].declaratorinvs); /* to support mutually recursive types */ ;
+    break;}
+case 67:
+#line 531 "llgrammar.y"
+{ yyval.exposed = makeExposedNode (yyvsp[0].ltok, makeLclTypeSpecNodeSU (yyvsp[-1].structorunion), declaratorInvNodeList_new ()); ;
+    break;}
+case 68:
+#line 533 "llgrammar.y"
+{ yyval.exposed = makeExposedNode (yyvsp[0].ltok, makeLclTypeSpecNodeEnum (yyvsp[-1].enumspec), declaratorInvNodeList_new ()); ;
+    break;}
+case 69:
+#line 549 "llgrammar.y"
+{ yyval.importlist = importNodeList_add (importNodeList_new (), yyvsp[0].import); ;
+    break;}
+case 70:
+#line 551 "llgrammar.y"
+{ yyval.importlist = importNodeList_add (yyvsp[-2].importlist, yyvsp[0].import); ;
+    break;}
+case 71:
+#line 554 "llgrammar.y"
+{ yyval.import = importNode_makePlain (yyvsp[0].ltok); ;
+    break;}
+case 72:
+#line 556 "llgrammar.y"
+{ checkBrackets (yyvsp[-2].ltok, yyvsp[0].ltok); yyval.import = importNode_makeBracketed (yyvsp[-1].ltok); ;
+    break;}
+case 73:
+#line 557 "llgrammar.y"
+{ yyval.import = importNode_makeQuoted (yyvsp[0].ltok); ;
+    break;}
+case 74:
+#line 560 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 75:
+#line 561 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 77:
+#line 569 "llgrammar.y"
+{ yyval.traitreflist = traitRefNodeList_add (traitRefNodeList_new (), yyvsp[0].traitref); ;
+    break;}
+case 78:
+#line 571 "llgrammar.y"
+{ yyval.traitreflist = traitRefNodeList_add (yyvsp[-2].traitreflist, yyvsp[0].traitref); ;
+    break;}
+case 79:
+#line 575 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (ltokenList_singleton (yyvsp[0].ltok), (renamingNode)0); ;
+    break;}
+case 80:
+#line 577 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (ltokenList_singleton (yyvsp[-3].ltok), yyvsp[-1].renaming); ;
+    break;}
+case 81:
+#line 579 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (yyvsp[-1].ltokenList, (renamingNode)0); ;
+    break;}
+case 82:
+#line 581 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (yyvsp[-4].ltokenList, yyvsp[-1].renaming); ;
+    break;}
+case 83:
+#line 584 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 84:
+#line 585 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 85:
+#line 589 "llgrammar.y"
+{ yyval.renaming = makeRenamingNode (typeNameNodeList_new (), yyvsp[0].replacelist); ;
+    break;}
+case 86:
+#line 591 "llgrammar.y"
+{ yyval.renaming = makeRenamingNode (yyvsp[0].namelist, replaceNodeList_new ()); ;
+    break;}
+case 87:
+#line 592 "llgrammar.y"
+{ yyval.renaming = makeRenamingNode (yyvsp[-2].namelist, yyvsp[0].replacelist); ;
+    break;}
+case 88:
+#line 596 "llgrammar.y"
+{ yyval.namelist = typeNameNodeList_add (typeNameNodeList_new (), yyvsp[0].typname); ;
+    break;}
+case 89:
+#line 597 "llgrammar.y"
+{ yyval.namelist = typeNameNodeList_add (yyvsp[-2].namelist, yyvsp[0].typname); ;
+    break;}
+case 90:
+#line 601 "llgrammar.y"
+{ yyval.replacelist = replaceNodeList_add (replaceNodeList_new (), yyvsp[0].replace); ;
+    break;}
+case 91:
+#line 602 "llgrammar.y"
+{ yyval.replacelist = replaceNodeList_add (yyvsp[-2].replacelist, yyvsp[0].replace); ;
+    break;}
+case 92:
+#line 605 "llgrammar.y"
+{ yyval.replace = makeReplaceNode (yyvsp[-1].ltok, yyvsp[-2].typname, TRUE, yyvsp[0].ltok, NULL, NULL); ;
+    break;}
+case 93:
+#line 606 "llgrammar.y"
+{ yyval.replace = makeReplaceNameNode (yyvsp[-1].ltok, yyvsp[-2].typname, yyvsp[0].name); ;
+    break;}
+case 94:
+#line 607 "llgrammar.y"
+{ yyval.replace = makeReplaceNode (yyvsp[-2].ltok, yyvsp[-3].typname, FALSE, ltoken_undefined,
+							 yyvsp[-1].name, yyvsp[0].signature); ;
+    break;}
+case 95:
+#line 611 "llgrammar.y"
+{ yyval.name = makeNameNodeId (yyvsp[0].ltok); ;
+    break;}
+case 96:
+#line 612 "llgrammar.y"
+{ yyval.name = makeNameNodeForm (yyvsp[0].opform); ;
+    break;}
+case 99:
+#line 620 "llgrammar.y"
+{ yyval.initdecls = initDeclNodeList_add (initDeclNodeList_new (), yyvsp[0].initdecl); ;
+    break;}
+case 100:
+#line 622 "llgrammar.y"
+{ yyval.initdecls = initDeclNodeList_add (yyvsp[-2].initdecls, yyvsp[0].initdecl); ;
+    break;}
+case 101:
+#line 625 "llgrammar.y"
+{ yyval.initdecl = makeInitDeclNode (yyvsp[0].declare, (termNode)0); ;
+    break;}
+case 102:
+#line 626 "llgrammar.y"
+{ yyval.initdecl = makeInitDeclNode (yyvsp[-2].declare, yyvsp[0].term); ;
+    break;}
+case 103:
+#line 630 "llgrammar.y"
+{ yyval.globals = varDeclarationNodeList_new (); ;
+    break;}
+case 104:
+#line 632 "llgrammar.y"
+{ varDeclarationNodeList_addh (yyvsp[-1].globals, yyvsp[0].vardeclaration); yyval.globals = yyvsp[-1].globals; ;
+    break;}
+case 105:
+#line 635 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, TRUE, FALSE); ;
+    break;}
+case 106:
+#line 636 "llgrammar.y"
+{ yyval.vardeclaration = makeInternalStateNode (); ;
+    break;}
+case 107:
+#line 637 "llgrammar.y"
+{ yyval.vardeclaration = makeFileSystemNode (); ;
+    break;}
+case 108:
+#line 640 "llgrammar.y"
+{ yyval.vardeclarationlist = varDeclarationNodeList_new (); ;
+    break;}
+case 109:
+#line 641 "llgrammar.y"
+{ varDeclarationNodeList_addh (yyvsp[-1].vardeclarationlist, yyvsp[0].vardeclaration); yyval.vardeclarationlist = yyvsp[-1].vardeclarationlist; ;
+    break;}
+case 110:
+#line 645 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, TRUE); ;
+    break;}
+case 111:
+#line 648 "llgrammar.y"
+{ yyval.letdecls = letDeclNodeList_new (); ;
+    break;}
+case 112:
+#line 649 "llgrammar.y"
+{ yyval.letdecls = yyvsp[-1].letdecls; ;
+    break;}
+case 113:
+#line 652 "llgrammar.y"
+{ yyval.letdecls = letDeclNodeList_add (letDeclNodeList_new (), yyvsp[0].letdecl); ;
+    break;}
+case 114:
+#line 653 "llgrammar.y"
+{ yyval.letdecls = letDeclNodeList_add (yyvsp[-2].letdecls, yyvsp[0].letdecl); ;
+    break;}
+case 115:
+#line 656 "llgrammar.y"
+{ yyval.letdecl = makeLetDeclNode (yyvsp[-4].ltok, yyvsp[-2].lcltypespec, yyvsp[0].term); ;
+    break;}
+case 116:
+#line 657 "llgrammar.y"
+{ yyval.letdecl = makeLetDeclNode (yyvsp[-2].ltok, (lclTypeSpecNode)0, yyvsp[0].term); ;
+    break;}
+case 118:
+#line 662 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 119:
+#line 663 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeChecksNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); ;
+    break;}
+case 120:
+#line 666 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 121:
+#line 667 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeRequiresNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate);;
+    break;}
+case 122:
+#line 670 "llgrammar.y"
+{ yyval.modify = (modifyNode)0; ;
+    break;}
+case 123:
+#line 671 "llgrammar.y"
+{ yyval.modify = makeModifyNodeSpecial (yyvsp[-2].ltok, TRUE); ;
+    break;}
+case 124:
+#line 672 "llgrammar.y"
+{ yyval.modify = makeModifyNodeSpecial (yyvsp[-2].ltok, FALSE); ;
+    break;}
+case 125:
+#line 673 "llgrammar.y"
+{ yyval.modify = makeModifyNodeRef (yyvsp[-2].ltok, yyvsp[-1].storereflist); ;
+    break;}
+case 126:
+#line 676 "llgrammar.y"
+{ yyval.storereflist = storeRefNodeList_add (storeRefNodeList_new (), yyvsp[0].storeref); ;
+    break;}
+case 127:
+#line 677 "llgrammar.y"
+{ yyval.storereflist = storeRefNodeList_add (yyvsp[-2].storereflist, yyvsp[0].storeref); ;
+    break;}
+case 128:
+#line 680 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeTerm (yyvsp[0].term); ;
+    break;}
+case 129:
+#line 681 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeType (yyvsp[0].lcltypespec, FALSE); ;
+    break;}
+case 130:
+#line 682 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeType (yyvsp[0].lcltypespec, TRUE); ;
+    break;}
+case 131:
+#line 683 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeInternal (); ;
+    break;}
+case 132:
+#line 684 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeSystem (); ;
+    break;}
+case 133:
+#line 687 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 134:
+#line 688 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeEnsuresNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate);;
+    break;}
+case 135:
+#line 691 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 136:
+#line 692 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeIntraClaimNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate);;
+    break;}
+case 137:
+#line 695 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_new (); ;
+    break;}
+case 138:
+#line 696 "llgrammar.y"
+{ yyval.paramlist = yyvsp[0].paramlist; ;
+    break;}
+case 140:
+#line 700 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (paramNodeList_new (), paramNode_elipsis ()); ;
+    break;}
+case 141:
+#line 701 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (yyvsp[-2].paramlist, paramNode_elipsis ()); ;
+    break;}
+case 142:
+#line 704 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_single (yyvsp[0].param); ;
+    break;}
+case 143:
+#line 705 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (yyvsp[-2].paramlist, yyvsp[0].param); ;
+    break;}
+case 144:
+#line 708 "llgrammar.y"
+{ yyval.program = (programNode)0; ;
+    break;}
+case 145:
+#line 709 "llgrammar.y"
+{ yyval.program = yyvsp[-1].program; ;
+    break;}
+case 146:
+#line 710 "llgrammar.y"
+{ yyval.program = yyvsp[-2].program; ;
+    break;}
+case 147:
+#line 713 "llgrammar.y"
+{ yyval.program = makeProgramNode (yyvsp[0].stmt); ;
+    break;}
+case 148:
+#line 716 "llgrammar.y"
+{ yyval.program = yyvsp[-1].program; yyval.program->wrapped = yyval.program->wrapped + 1; ;
+    break;}
+case 149:
+#line 718 "llgrammar.y"
+{ programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, yyvsp[-1].program);
+     yyval.program = makeProgramNodeAction (x, ACT_ITER); 
+   ;
+    break;}
+case 150:
+#line 723 "llgrammar.y"
+{ programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, yyvsp[-2].program);
+     programNodeList_addh (x, yyvsp[0].program);
+     yyval.program = makeProgramNodeAction (x, ACT_ALTERNATE); 
+   ;
+    break;}
+case 151:
+#line 729 "llgrammar.y"
+{ programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, yyvsp[-2].program);
+     programNodeList_addh (x, yyvsp[0].program);
+     yyval.program = makeProgramNodeAction (x, ACT_SEQUENCE); 
+   ;
+    break;}
+case 152:
+#line 737 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (ltoken_undefined, yyvsp[-3].ltok, yyvsp[-1].termlist); ;
+    break;}
+case 153:
+#line 739 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (ltoken_undefined, yyvsp[-2].ltok, termNodeList_new ()); ;
+    break;}
+case 154:
+#line 741 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (yyvsp[-4].ltok, yyvsp[-2].ltok, termNodeList_new ()); ;
+    break;}
+case 155:
+#line 743 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (yyvsp[-5].ltok, yyvsp[-3].ltok, yyvsp[-1].termlist); ;
+    break;}
+case 156:
+#line 746 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (termNodeList_new (), yyvsp[0].term); ;
+    break;}
+case 157:
+#line 747 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (yyvsp[-2].termlist, yyvsp[0].term); ;
+    break;}
+case 159:
+#line 751 "llgrammar.y"
+{ yyval.term = makeSimpleTermNode (yyvsp[0].ltok); ;
+    break;}
+case 160:
+#line 752 "llgrammar.y"
+{ yyval.term = makePrefixTermNode (yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 161:
+#line 753 "llgrammar.y"
+{ yyval.term = makePostfixTermNode2 (yyvsp[-1].term, yyvsp[0].ltok); ;
+    break;}
+case 162:
+#line 754 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 163:
+#line 755 "llgrammar.y"
+{ yyval.term = yyvsp[-1].term; yyval.term->wrapped = yyval.term->wrapped + 1; ;
+    break;}
+case 164:
+#line 757 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-2].ltok, yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok); ;
+    break;}
+case 165:
+#line 759 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 166:
+#line 762 "llgrammar.y"
+{ yyval.abstbody = (abstBodyNode)0; ;
+    break;}
+case 167:
+#line 763 "llgrammar.y"
+{ yyval.abstbody = makeAbstBodyNode (yyvsp[-2].ltok, yyvsp[-1].fcns); ;
+    break;}
+case 168:
+#line 764 "llgrammar.y"
+{ yyval.abstbody = makeAbstBodyNode2 (yyvsp[-3].ltok, yyvsp[-2].ltokenList); ;
+    break;}
+case 169:
+#line 765 "llgrammar.y"
+{ yyval.abstbody = (abstBodyNode)0; ;
+    break;}
+case 170:
+#line 768 "llgrammar.y"
+{ yyval.fcns = fcnNodeList_new (); ;
+    break;}
+case 171:
+#line 769 "llgrammar.y"
+{ yyval.fcns = fcnNodeList_add (yyvsp[-1].fcns, yyvsp[0].fcn); ;
+    break;}
+case 172:
+#line 772 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 174:
+#line 776 "llgrammar.y"
+{ g_inTypeDef = FALSE; ;
+    break;}
+case 175:
+#line 777 "llgrammar.y"
+{ yyvsp[-1].lclpredicate->tok = yyvsp[-5].ltok; yyvsp[-1].lclpredicate->kind = LPD_CONSTRAINT;
+     checkLclPredicate (yyvsp[-5].ltok, yyvsp[-1].lclpredicate);
+     yyval.lclpredicate = yyvsp[-1].lclpredicate;
+     symtable_exitScope (g_symtab); 
+     g_inTypeDef = TRUE;
+   ;
+    break;}
+case 176:
+#line 785 "llgrammar.y"
+{ yyval.declaratorinvs = declaratorInvNodeList_add (declaratorInvNodeList_new (), yyvsp[0].declaratorinv); ;
+    break;}
+case 177:
+#line 787 "llgrammar.y"
+{ yyval.declaratorinvs = declaratorInvNodeList_add (yyvsp[-2].declaratorinvs, yyvsp[0].declaratorinv); ;
+    break;}
+case 178:
+#line 790 "llgrammar.y"
+{ declareForwardType (yyvsp[0].declare); ;
+    break;}
+case 179:
+#line 791 "llgrammar.y"
+{ yyval.declaratorinv = makeDeclaratorInvNode (yyvsp[-2].declare, yyvsp[0].abstbody); ;
+    break;}
+case 180:
+#line 794 "llgrammar.y"
+{ yyval.abstbody = (abstBodyNode)0; ;
+    break;}
+case 181:
+#line 795 "llgrammar.y"
+{ yyval.abstbody = makeExposedBodyNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); ;
+    break;}
+case 182:
+#line 798 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_VOID, 0)); ;
+    break;}
+case 183:
+#line 799 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_CHAR, 0)); ;
+    break;}
+case 184:
+#line 800 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_DOUBLE, 0)); ;
+    break;}
+case 185:
+#line 801 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_FLOAT, 0)); ;
+    break;}
+case 186:
+#line 802 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_INT, 0)); ;
+    break;}
+case 187:
+#line 803 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_LONG, 0)); ;
+    break;}
+case 188:
+#line 804 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_SHORT, 0)); ;
+    break;}
+case 189:
+#line 805 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_SIGNED, 0)); ;
+    break;}
+case 190:
+#line 806 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_UNSIGNED, 0)); ;
+    break;}
+case 191:
+#line 807 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_UNKNOWN, 0)); ;
+    break;}
+case 192:
+#line 815 "llgrammar.y"
+{ yyval.ctypes = makeCTypesNode ((CTypesNode)0, yyvsp[0].ltok); ;
+    break;}
+case 193:
+#line 816 "llgrammar.y"
+{ yyval.ctypes = makeCTypesNode (yyvsp[-1].ctypes, yyvsp[0].ltok); ;
+    break;}
+case 194:
+#line 822 "llgrammar.y"
+{ yyval.ctypes = makeTypeSpecifier (yyvsp[0].ltok); ;
+    break;}
+case 195:
+#line 824 "llgrammar.y"
+{ yyval.ctypes = yyvsp[0].ctypes; yyval.ctypes->sort = sort_lookupName (lclctype_toSort (yyvsp[0].ctypes->intfield)); ;
+    break;}
+case 196:
+#line 829 "llgrammar.y"
+{ yyval.typequal = qual_createOut (); ;
+    break;}
+case 197:
+#line 830 "llgrammar.y"
+{ yyval.typequal = qual_createUnused (); ;
+    break;}
+case 198:
+#line 831 "llgrammar.y"
+{ yyval.typequal = qual_createSef (); ;
+    break;}
+case 199:
+#line 832 "llgrammar.y"
+{ yyval.typequal = qual_createOnly (); ;
+    break;}
+case 200:
+#line 833 "llgrammar.y"
+{ yyval.typequal = qual_createOwned (); ;
+    break;}
+case 201:
+#line 834 "llgrammar.y"
+{ yyval.typequal = qual_createDependent (); ;
+    break;}
+case 202:
+#line 835 "llgrammar.y"
+{ yyval.typequal = qual_createKeep (); ;
+    break;}
+case 203:
+#line 836 "llgrammar.y"
+{ yyval.typequal = qual_createKept (); ;
+    break;}
+case 204:
+#line 837 "llgrammar.y"
+{ yyval.typequal = qual_createObserver (); ;
+    break;}
+case 205:
+#line 838 "llgrammar.y"
+{ yyval.typequal = qual_createExits (); ;
+    break;}
+case 206:
+#line 839 "llgrammar.y"
+{ yyval.typequal = qual_createMayExit (); ;
+    break;}
+case 207:
+#line 840 "llgrammar.y"
+{ yyval.typequal = qual_createTrueExit (); ;
+    break;}
+case 208:
+#line 841 "llgrammar.y"
+{ yyval.typequal = qual_createFalseExit (); ;
+    break;}
+case 209:
+#line 842 "llgrammar.y"
+{ yyval.typequal = qual_createNeverExit (); ;
+    break;}
+case 210:
+#line 843 "llgrammar.y"
+{ yyval.typequal = qual_createOnly (); ;
+    break;}
+case 211:
+#line 844 "llgrammar.y"
+{ yyval.typequal = qual_createShared (); ;
+    break;}
+case 212:
+#line 845 "llgrammar.y"
+{ yyval.typequal = qual_createUnique (); ;
+    break;}
+case 213:
+#line 846 "llgrammar.y"
+{ yyval.typequal = qual_createChecked (); ;
+    break;}
+case 214:
+#line 847 "llgrammar.y"
+{ yyval.typequal = qual_createUnchecked (); ;
+    break;}
+case 215:
+#line 848 "llgrammar.y"
+{ yyval.typequal = qual_createCheckedStrict (); ;
+    break;}
+case 216:
+#line 849 "llgrammar.y"
+{ yyval.typequal = qual_createTrueNull (); ;
+    break;}
+case 217:
+#line 850 "llgrammar.y"
+{ yyval.typequal = qual_createFalseNull (); ;
+    break;}
+case 218:
+#line 851 "llgrammar.y"
+{ yyval.typequal = qual_createRelNull (); ;
+    break;}
+case 219:
+#line 852 "llgrammar.y"
+{ yyval.typequal = qual_createRelDef (); ;
+    break;}
+case 220:
+#line 853 "llgrammar.y"
+{ yyval.typequal = qual_createRefCounted (); ;
+    break;}
+case 221:
+#line 854 "llgrammar.y"
+{ yyval.typequal = qual_createRefs (); ;
+    break;}
+case 222:
+#line 855 "llgrammar.y"
+{ yyval.typequal = qual_createNewRef (); ;
+    break;}
+case 223:
+#line 856 "llgrammar.y"
+{ yyval.typequal = qual_createKillRef (); ;
+    break;}
+case 224:
+#line 857 "llgrammar.y"
+{ yyval.typequal = qual_createNull (); ;
+    break;}
+case 225:
+#line 858 "llgrammar.y"
+{ yyval.typequal = qual_createNotNull (); ;
+    break;}
+case 226:
+#line 859 "llgrammar.y"
+{ yyval.typequal = qual_createReturned (); ;
+    break;}
+case 227:
+#line 860 "llgrammar.y"
+{ yyval.typequal = qual_createExposed (); ;
+    break;}
+case 228:
+#line 861 "llgrammar.y"
+{ yyval.typequal = qual_createPartial (); ;
+    break;}
+case 229:
+#line 862 "llgrammar.y"
+{ yyval.typequal = qual_createUndef (); ;
+    break;}
+case 230:
+#line 863 "llgrammar.y"
+{ yyval.typequal = qual_createKilled (); ;
+    break;}
+case 231:
+#line 867 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeType (yyvsp[0].ctypes); ;
+    break;}
+case 232:
+#line 869 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeSU (yyvsp[0].structorunion); ;
+    break;}
+case 233:
+#line 871 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeEnum (yyvsp[0].enumspec); ;
+    break;}
+case 234:
+#line 873 "llgrammar.y"
+{ yyval.lcltypespec = lclTypeSpecNode_addQual (yyvsp[0].lcltypespec, yyvsp[-1].typequal); ;
+    break;}
+case 235:
+#line 875 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeConj (yyvsp[-3].lcltypespec, yyvsp[-1].lcltypespec); ;
+    break;}
+case 237:
+#line 885 "llgrammar.y"
+{ llassert (lclTypeSpecNode_isDefined (yyvsp[-1].lcltypespec));
+     yyvsp[-1].lcltypespec->pointers = yyvsp[0].count; yyval.lcltypespec = yyvsp[-1].lcltypespec; ;
+    break;}
+case 238:
+#line 889 "llgrammar.y"
+{ yyval.count = 1; ;
+    break;}
+case 239:
+#line 890 "llgrammar.y"
+{ yyval.count = yyvsp[-1].count + 1; ;
+    break;}
+case 240:
+#line 894 "llgrammar.y"
+{ (void) checkAndEnterTag (TAG_FWDSTRUCT, ltoken_copy (yyvsp[0].ltok)); ;
+    break;}
+case 241:
+#line 896 "llgrammar.y"
+{ yyval.structorunion = makestrOrUnionNode (yyvsp[-5].ltok, SU_STRUCT, yyvsp[-4].ltok, yyvsp[-1].structdecls); ;
+    break;}
+case 242:
+#line 898 "llgrammar.y"
+{ (void) checkAndEnterTag (TAG_FWDUNION, ltoken_copy (yyvsp[0].ltok)); ;
+    break;}
+case 243:
+#line 900 "llgrammar.y"
+{ yyval.structorunion = makestrOrUnionNode (yyvsp[-5].ltok, SU_UNION, yyvsp[-4].ltok, yyvsp[-1].structdecls); ;
+    break;}
+case 244:
+#line 902 "llgrammar.y"
+{ yyval.structorunion = makeForwardstrOrUnionNode (yyvsp[-1].ltok, SU_STRUCT, yyvsp[0].ltok); ;
+    break;}
+case 245:
+#line 904 "llgrammar.y"
+{ yyval.structorunion = makeForwardstrOrUnionNode (yyvsp[-1].ltok, SU_UNION, yyvsp[0].ltok); ;
+    break;}
+case 246:
+#line 907 "llgrammar.y"
+{ yyval.ltok = ltoken_undefined; ;
+    break;}
+case 248:
+#line 911 "llgrammar.y"
+{ yyval.structdecls = stDeclNodeList_add (stDeclNodeList_new (), yyvsp[0].structdecl); ;
+    break;}
+case 249:
+#line 912 "llgrammar.y"
+{ yyval.structdecls = stDeclNodeList_add (yyvsp[-1].structdecls, yyvsp[0].structdecl); ;
+    break;}
+case 250:
+#line 917 "llgrammar.y"
+{ yyval.structdecl = makestDeclNode (yyvsp[-2].lcltypespec, yyvsp[-1].declarelist); ;
+    break;}
+case 251:
+#line 921 "llgrammar.y"
+{ yyval.declarelist = declaratorNodeList_add (declaratorNodeList_new (), yyvsp[0].declare); ;
+    break;}
+case 252:
+#line 923 "llgrammar.y"
+{ yyval.declarelist = declaratorNodeList_add (yyvsp[-2].declarelist, yyvsp[0].declare); ;
+    break;}
+case 253:
+#line 926 "llgrammar.y"
+{ ; ;
+    break;}
+case 254:
+#line 927 "llgrammar.y"
+{ ; ;
+    break;}
+case 255:
+#line 931 "llgrammar.y"
+{ yyval.enumspec = makeEnumSpecNode (yyvsp[-5].ltok, yyvsp[-4].ltok, yyvsp[-2].ltokenList); ;
+    break;}
+case 256:
+#line 933 "llgrammar.y"
+{ yyval.enumspec = makeEnumSpecNode2 (yyvsp[-1].ltok, yyvsp[0].ltok); ;
+    break;}
+case 257:
+#line 936 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 258:
+#line 937 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 259:
+#line 947 "llgrammar.y"
+{ yyval.declare = makeDeclaratorNode (yyvsp[0].typeexpr); ;
+    break;}
+case 260:
+#line 948 "llgrammar.y"
+{ yyval.declare = makeDeclaratorNode (yyvsp[0].typeexpr); ;
+    break;}
+case 261:
+#line 951 "llgrammar.y"
+{ yyval.typeexpr = makeTypeExpr (yyvsp[0].ltok); ;
+    break;}
+case 262:
+#line 952 "llgrammar.y"
+{ yyval.typeexpr = yyvsp[-1].typeexpr; yyval.typeexpr->wrapped = yyval.typeexpr->wrapped + 1; ;
+    break;}
+case 263:
+#line 953 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 264:
+#line 954 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 265:
+#line 955 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 266:
+#line 956 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 267:
+#line 959 "llgrammar.y"
+{ yyval.typeexpr = makeTypeExpr (yyvsp[0].ltok); ;
+    break;}
+case 268:
+#line 960 "llgrammar.y"
+{ yyval.typeexpr = yyvsp[-1].typeexpr; yyval.typeexpr->wrapped = yyval.typeexpr->wrapped + 1; ;
+    break;}
+case 269:
+#line 961 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 270:
+#line 962 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 271:
+#line 963 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 272:
+#line 964 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 273:
+#line 973 "llgrammar.y"
+{ yyval.typeexpr = makeTypeExpr (yyvsp[0].ltok); ;
+    break;}
+case 274:
+#line 974 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 275:
+#line 975 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 276:
+#line 976 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 277:
+#line 977 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 278:
+#line 983 "llgrammar.y"
+{ yyval.param = makeParamNode (yyvsp[-1].lcltypespec, yyvsp[0].typeexpr); ;
+    break;}
+case 279:
+#line 984 "llgrammar.y"
+{ yyval.param = makeParamNode (yyvsp[-1].lcltypespec, yyvsp[0].typeexpr); ;
+    break;}
+case 280:
+#line 985 "llgrammar.y"
+{ yyval.param = makeParamNode (yyvsp[-1].lcltypespec, yyvsp[0].abstDecl); ;
+    break;}
+case 281:
+#line 995 "llgrammar.y"
+{ yyval.typname = makeTypeNameNode (FALSE, yyvsp[-1].lcltypespec, yyvsp[0].abstDecl); ;
+    break;}
+case 282:
+#line 996 "llgrammar.y"
+{ yyval.typname = makeTypeNameNode (TRUE, yyvsp[-1].lcltypespec, yyvsp[0].abstDecl); ;
+    break;}
+case 283:
+#line 997 "llgrammar.y"
+{ yyval.typname = makeTypeNameNodeOp (yyvsp[0].opform); ;
+    break;}
+case 284:
+#line 1002 "llgrammar.y"
+{ yyval.abstDecl = (abstDeclaratorNode)0; ;
+    break;}
+case 285:
+#line 1003 "llgrammar.y"
+{ yyval.abstDecl = (abstDeclaratorNode)yyvsp[0].typeexpr; ;
+    break;}
+case 286:
+#line 1006 "llgrammar.y"
+{ yyval.typeexpr = yyvsp[-1].typeexpr; yyval.typeexpr->wrapped = yyval.typeexpr->wrapped + 1; ;
+    break;}
+case 287:
+#line 1007 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 288:
+#line 1008 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[0].ltok, (typeExpr)0); ;
+    break;}
+case 289:
+#line 1009 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode ((typeExpr)0, yyvsp[0].array); ;
+    break;}
+case 290:
+#line 1010 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 291:
+#line 1011 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 292:
+#line 1012 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode ((typeExpr)0, yyvsp[-1].paramlist); ;
+    break;}
+case 293:
+#line 1013 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 294:
+#line 1016 "llgrammar.y"
+{ yyval.array = makeArrayQualNode (yyvsp[-1].ltok, (termNode)0); ;
+    break;}
+case 295:
+#line 1017 "llgrammar.y"
+{ yyval.array = makeArrayQualNode (yyvsp[-2].ltok, yyvsp[-1].term); ;
+    break;}
+case 296:
+#line 1021 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-5].ltok, OPF_IF, opFormUnion_createMiddle (0), ltoken_undefined); ;
+    break;}
+case 297:
+#line 1023 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[0].ltok, OPF_ANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 298:
+#line 1025 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_MANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 299:
+#line 1027 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_ANYOPM, opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 300:
+#line 1029 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MANYOPM, 
+			  opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 301:
+#line 1032 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 302:
+#line 1034 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 303:
+#line 1036 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 304:
+#line 1038 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MMIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 305:
+#line 1040 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 306:
+#line 1042 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 307:
+#line 1050 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 308:
+#line 1052 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMMIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 309:
+#line 1054 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_SELECT, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 310:
+#line 1057 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_MAP, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 311:
+#line 1060 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MSELECT, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 312:
+#line 1063 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MMAP, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 320:
+#line 1080 "llgrammar.y"
+{ yyval.count = 0; ;
+    break;}
+case 322:
+#line 1084 "llgrammar.y"
+{ yyval.count = 1; ;
+    break;}
+case 323:
+#line 1085 "llgrammar.y"
+{ yyval.count = yyvsp[-2].count + 1; ;
+    break;}
+case 326:
+#line 1092 "llgrammar.y"
+{ yyval.signature = makesigNode (yyvsp[-3].ltok, yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 327:
+#line 1095 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_new (); ;
+    break;}
+case 329:
+#line 1099 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 330:
+#line 1100 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 331:
+#line 1103 "llgrammar.y"
+{ yyval.lclpredicate = makeLclPredicateNode (ltoken_undefined, yyvsp[0].term, LPD_PLAIN);;
+    break;}
+case 332:
+#line 1106 "llgrammar.y"
+{ yyval.term = checkSort (yyvsp[0].term); ;
+    break;}
+case 333:
+#line 1113 "llgrammar.y"
+{ yyval.term = makeIfTermNode (yyvsp[-5].ltok,yyvsp[-4].term,yyvsp[-3].ltok,yyvsp[-2].term,yyvsp[-1].ltok,yyvsp[0].term); ;
+    break;}
+case 335:
+#line 1115 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 337:
+#line 1121 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.term = makeQuantifiedTermNode (yyvsp[-3].quantifiers, yyvsp[-2].ltok, yyvsp[-1].lclpredicate->predicate, yyvsp[0].ltok);
+     symtable_exitScope (g_symtab); 
+   ;
+    break;}
+case 338:
+#line 1125 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term);;
+    break;}
+case 339:
+#line 1127 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term);;
+    break;}
+case 341:
+#line 1131 "llgrammar.y"
+{ yyval.term = makePostfixTermNode (yyvsp[-1].term, yyvsp[0].ltokenList); ;
+    break;}
+case 342:
+#line 1132 "llgrammar.y"
+{ yyval.term = CollapseInfixTermNode (yyvsp[-1].term, yyvsp[0].termlist); ;
+    break;}
+case 346:
+#line 1140 "llgrammar.y"
+{ yyval.term = makePrefixTermNode (yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 347:
+#line 1143 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 348:
+#line 1144 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-1].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 349:
+#line 1147 "llgrammar.y"
+{ yyval.termlist = pushInfixOpPartNode (termNodeList_new (), yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 350:
+#line 1148 "llgrammar.y"
+{ yyval.termlist = pushInfixOpPartNode (yyvsp[-2].termlist, yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 352:
+#line 1152 "llgrammar.y"
+{ yyval.term = computePossibleSorts (yyvsp[0].term); ;
+    break;}
+case 353:
+#line 1153 "llgrammar.y"
+{ yyval.term = updateMatchedNode ((termNode)0, yyvsp[-1].term, yyvsp[0].term); ;
+    break;}
+case 354:
+#line 1154 "llgrammar.y"
+{ yyval.term = updateMatchedNode (yyvsp[-1].term, yyvsp[0].term, (termNode)0); ;
+    break;}
+case 355:
+#line 1155 "llgrammar.y"
+{ yyval.term = updateMatchedNode (yyvsp[-2].term, yyvsp[-1].term, yyvsp[0].term); ;
+    break;}
+case 356:
+#line 1156 "llgrammar.y"
+{ yyval.term = computePossibleSorts (yyvsp[0].term); ;
+    break;}
+case 357:
+#line 1157 "llgrammar.y"
+{ yyval.term = updateSqBracketedNode ((termNode)0, yyvsp[-1].term, yyvsp[0].term); ;
+    break;}
+case 358:
+#line 1160 "llgrammar.y"
+{ yyval.term = yyvsp[-2].term; yyval.term->sort = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); ;
+    break;}
+case 360:
+#line 1165 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-4].ltok, yyvsp[-3].termlist, yyvsp[-2].ltok); 
+     yyval.term->given = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); ;
+    break;}
+case 361:
+#line 1168 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 362:
+#line 1170 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-3].ltok, termNodeList_new (), yyvsp[-2].ltok); 
+     yyval.term->given = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); 
+   ;
+    break;}
+case 363:
+#line 1174 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok); ;
+    break;}
+case 364:
+#line 1177 "llgrammar.y"
+{ yyval.term = makeMatchedNode (yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 365:
+#line 1178 "llgrammar.y"
+{ yyval.term = makeMatchedNode (yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok); ;
+    break;}
+case 366:
+#line 1181 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (termNodeList_new (), yyvsp[0].term); ;
+    break;}
+case 367:
+#line 1182 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (yyvsp[-2].termlist, yyvsp[0].term); ;
+    break;}
+case 368:
+#line 1186 "llgrammar.y"
+{ yyval.term = yyvsp[-1].term; yyval.term->wrapped = yyval.term->wrapped + 1; ;
+    break;}
+case 369:
+#line 1188 "llgrammar.y"
+{ yyval.term = makeSimpleTermNode (yyvsp[0].ltok); ;
+    break;}
+case 370:
+#line 1190 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 372:
+#line 1193 "llgrammar.y"
+{ yyval.term = makePostfixTermNode2 (yyvsp[-1].term, yyvsp[0].ltok); ;
+    break;}
+case 373:
+#line 1195 "llgrammar.y"
+{ ltoken_markOwned (yyvsp[0].ltok); yyval.term = makeSelectTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].ltok); ;
+    break;}
+case 374:
+#line 1197 "llgrammar.y"
+{ ltoken_markOwned (yyvsp[0].ltok); yyval.term = makeMapTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].ltok); ;
+    break;}
+case 375:
+#line 1199 "llgrammar.y"
+{ yyval.term = updateSqBracketedNode (yyvsp[-2].term, makeSqBracketedNode (yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok), 
+				(termNode)0); ;
+    break;}
+case 376:
+#line 1202 "llgrammar.y"
+{ yyval.term = updateSqBracketedNode (yyvsp[-3].term, makeSqBracketedNode (yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok), (termNode)0); ;
+    break;}
+case 377:
+#line 1204 "llgrammar.y"
+{ yyval.term = yyvsp[-2].term; yyval.term->given = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); ;
+    break;}
+case 378:
+#line 1207 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (termNodeList_new (), yyvsp[0].term); ;
+    break;}
+case 379:
+#line 1208 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (yyvsp[-2].termlist, yyvsp[0].term); ;
+    break;}
+case 385:
+#line 1218 "llgrammar.y"
+{ yyval.term = makeSimpleTermNode (yyvsp[0].ltok); ;
+    break;}
+case 386:
+#line 1219 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 387:
+#line 1220 "llgrammar.y"
+{ yyval.term = makeUnchangedTermNode1 (yyvsp[-3].ltok, yyvsp[-1].ltok); ;
+    break;}
+case 388:
+#line 1221 "llgrammar.y"
+{ yyval.term = makeUnchangedTermNode2 (yyvsp[-3].ltok, yyvsp[-1].storereflist); ;
+    break;}
+case 389:
+#line 1223 "llgrammar.y"
+{ termNodeList x = termNodeList_new (); 
+     termNodeList_addh (x, yyvsp[-1].term);
+     yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, x, yyvsp[0].ltok); 
+   ;
+    break;}
+case 390:
+#line 1228 "llgrammar.y"
+{ termNodeList x = termNodeList_new ();
+     termNodeList_addh (x, yyvsp[-3].term);
+     termNodeList_addh (x, yyvsp[-1].term);
+     yyval.term = makeOpCallTermNode (yyvsp[-5].ltok, yyvsp[-4].ltok, x, yyvsp[0].ltok); 
+   ;
+    break;}
+case 391:
+#line 1233 "llgrammar.y"
+{ yyval.term = makeSizeofTermNode (yyvsp[-3].ltok, yyvsp[-1].lcltypespec); ;
+    break;}
+case 392:
+#line 1243 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_int); ;
+    break;}
+case 393:
+#line 1244 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_cstring); ;
+    break;}
+case 394:
+#line 1245 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_char); ;
+    break;}
+case 395:
+#line 1246 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_double); ;
+    break;}
+case 396:
+#line 1250 "llgrammar.y"
+{ yyval.quantifiers = quantifierNodeList_add (quantifierNodeList_new (), yyvsp[0].quantifier); ;
+    break;}
+case 397:
+#line 1252 "llgrammar.y"
+{ yyval.quantifiers = quantifierNodeList_add (yyvsp[-1].quantifiers, yyvsp[0].quantifier); ;
+    break;}
+case 398:
+#line 1255 "llgrammar.y"
+{ scopeInfo si = (scopeInfo) dmalloc (sizeof (*si));
+		   si->kind = SPE_QUANT;
+		   symtable_enterScope (g_symtab, si); ;
+    break;}
+case 399:
+#line 1259 "llgrammar.y"
+{ yyval.quantifier = makeQuantifierNode (yyvsp[0].vars, yyvsp[-2].ltok); ;
+    break;}
+case 400:
+#line 1262 "llgrammar.y"
+{ yyval.vars = varNodeList_add (varNodeList_new (), yyvsp[0].var); ;
+    break;}
+case 401:
+#line 1263 "llgrammar.y"
+{ yyval.vars = varNodeList_add (yyvsp[-2].vars, yyvsp[0].var); ;
+    break;}
+case 402:
+#line 1266 "llgrammar.y"
+{ yyval.var = makeVarNode (yyvsp[-2].ltok, FALSE, yyvsp[0].lcltypespec); ;
+    break;}
+case 403:
+#line 1267 "llgrammar.y"
+{ yyval.var = makeVarNode (yyvsp[-3].ltok, TRUE, yyvsp[0].lcltypespec); ;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 498 "/usr/share/misc/bison.simple"
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+	{
+	  int size = 0;
+	  char *msg;
+	  int x, count;
+
+	  count = 0;
+	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
+	  for (x = (yyn < 0 ? -yyn : 0);
+	       x < (sizeof(yytname) / sizeof(char *)); x++)
+	    if (yycheck[x + yyn] == x)
+	      size += strlen(yytname[x]) + 15, count++;
+	  msg = (char *) malloc(size + 15);
+	  if (msg != 0)
+	    {
+	      strcpy(msg, "parse error");
+
+	      if (count < 5)
+		{
+		  count = 0;
+		  for (x = (yyn < 0 ? -yyn : 0);
+		       x < (sizeof(yytname) / sizeof(char *)); x++)
+		    if (yycheck[x + yyn] == x)
+		      {
+			strcat(msg, count == 0 ? ", expecting `" : " or `");
+			strcat(msg, yytname[x]);
+			strcat(msg, "'");
+			count++;
+		      }
+		}
+	      yyerror(msg);
+	      free(msg);
+	    }
+	  else
+	    yyerror ("parse error; also virtual memory exceeded");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror("parse error");
+    }
+
+  goto yyerrlab1;
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+	YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;		/* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+}
+#line 1282 "llgrammar.y"
+
+
+# include "bison.reset"
+
+/*
+** yytext is set in lex scanner 
+** extern YYSTYPE yylval;  
+** yylval is defined by code generated by bison 
+*/
+
+void ylerror (char *s) 
+{
+  /* 
+  ** This resetting of the left context is very important when multiple
+  ** files are to be parsed.  We do not want failures to propagate.
+  ** Lex/Yacc does not reset the flags when the parsing goes bad.  
+  ** BEGIN 0;        
+  **/
+
+  /*@-mustfree@*/
+  lclfatalerror (yllval.ltok,
+		 message ("%s: Token code: %s, Token String: %s", 
+			  cstring_fromChars (s), 
+			  ltoken_unparseCodeName (yllval.ltok), 
+			  ltoken_getRawString (yllval.ltok)));
+  /*@=mustfree@*/
+}
+
+static void yyprint (FILE *f, int t, YYSTYPE value) 
+{
+  fprintf (f, " type: %d (%s)", t, 
+	   cstring_toCharsSafe (ltoken_getRawString (value.ltok)));
+}
+
+
+
+
+
+
+
+/*
+** Resets all flags in bison.head
+*/
+
+
+/*@=allmacros@*/
+/*@=boolint@*/
+/*@=charint@*/
+/*@=macroparams@*/
+/*@=macroundef@*/
+/*@=unreachable@*/
+/*@=macrospec@*/
+/*@=varuse@*/
+/*@=ignorequals@*/
+/*@=macrostmt@*/
+/*@=noeffect@*/
+/*@=shadow@*/
+/*@=exitarg@*/
+/*@=macroredef@*/
+/*@=uniondef@*/
+/*@=compdef@*/
+/*@=matchfields@*/
+/*@=exportlocal@*/
+/*@=evalorderuncon@*/
+/*@=exportheader@*/
+/*@=typeuse@*/
+/*@=redecl@*/
+/*@=redef@*/
+/*@=noparams@*/
+/*@=ansireserved@*/
+/*@=fielduse@*/
+/*@=ifblock@*/
+/*@=elseifcomplete@*/
+/*@=whileblock@*/
+/*@=forblock@*/
+/*@=branchstate@*/
+/*@=readonlytrans@*/
+/*@=namechecks@*/
+/*@=usedef@*/
+/*@=systemunrecog@*/
+/*@=dependenttrans@*/
+/*@=unqualifiedtrans@*/
diff --git a/src/llgrammar.tab.c b/src/llgrammar.tab.c
new file mode 100644
index 0000000..4683db6
--- /dev/null
+++ b/src/llgrammar.tab.c
@@ -0,0 +1,3754 @@
+
+/*  A Bison parser, made from llgrammar.y
+ by  GNU Bison version 1.25
+  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define yyparse ylparse
+#define yylex yllex
+#define yyerror ylerror
+#define yylval yllval
+#define yychar ylchar
+#define yydebug yldebug
+#define yynerrs ylnerrs
+#define	simpleOp	258
+#define	PREFIX_OP	259
+#define	POSTFIX_OP	260
+#define	LLT_MULOP	261
+#define	LLT_SEMI	262
+#define	LLT_VERTICALBAR	263
+#define	ITERATION_OP	264
+#define	LLT_LPAR	265
+#define	LLT_LBRACKET	266
+#define	selectSym	267
+#define	LLT_IF_THEN_ELSE	268
+#define	logicalOp	269
+#define	eqSepSym	270
+#define	equationSym	271
+#define	commentSym	272
+#define	LLT_WHITESPACE	273
+#define	LLT_EOL	274
+#define	LLT_TYPEDEF_NAME	275
+#define	quantifierSym	276
+#define	openSym	277
+#define	closeSym	278
+#define	sepSym	279
+#define	simpleId	280
+#define	mapSym	281
+#define	markerSym	282
+#define	preSym	283
+#define	postSym	284
+#define	anySym	285
+#define	LLT_COLON	286
+#define	LLT_COMMA	287
+#define	LLT_EQUALS	288
+#define	LLT_LBRACE	289
+#define	LLT_RBRACE	290
+#define	LLT_RBRACKET	291
+#define	LLT_RPAR	292
+#define	LLT_QUOTE	293
+#define	eqOp	294
+#define	LLT_CCHAR	295
+#define	LLT_CFLOAT	296
+#define	LLT_CINTEGER	297
+#define	LLT_LCSTRING	298
+#define	LLT_ALL	299
+#define	LLT_ANYTHING	300
+#define	LLT_BE	301
+#define	LLT_BODY	302
+#define	LLT_CLAIMS	303
+#define	LLT_CHECKS	304
+#define	LLT_CONSTANT	305
+#define	LLT_ELSE	306
+#define	LLT_ENSURES	307
+#define	LLT_FOR	308
+#define	LLT_FRESH	309
+#define	LLT_IF	310
+#define	LLT_IMMUTABLE	311
+#define	LLT_IMPORTS	312
+#define	LLT_CONSTRAINT	313
+#define	LLT_ISSUB	314
+#define	LLT_LET	315
+#define	LLT_MODIFIES	316
+#define	LLT_MUTABLE	317
+#define	LLT_NOTHING	318
+#define	LLT_INTERNAL	319
+#define	LLT_FILESYS	320
+#define	LLT_OBJ	321
+#define	LLT_OUT	322
+#define	LLT_SEF	323
+#define	LLT_ONLY	324
+#define	LLT_PARTIAL	325
+#define	LLT_OWNED	326
+#define	LLT_DEPENDENT	327
+#define	LLT_KEEP	328
+#define	LLT_KEPT	329
+#define	LLT_TEMP	330
+#define	LLT_SHARED	331
+#define	LLT_UNIQUE	332
+#define	LLT_UNUSED	333
+#define	LLT_EXITS	334
+#define	LLT_MAYEXIT	335
+#define	LLT_NEVEREXIT	336
+#define	LLT_TRUEEXIT	337
+#define	LLT_FALSEEXIT	338
+#define	LLT_UNDEF	339
+#define	LLT_KILLED	340
+#define	LLT_CHECKMOD	341
+#define	LLT_CHECKED	342
+#define	LLT_UNCHECKED	343
+#define	LLT_CHECKEDSTRICT	344
+#define	LLT_TRUENULL	345
+#define	LLT_FALSENULL	346
+#define	LLT_LNULL	347
+#define	LLT_LNOTNULL	348
+#define	LLT_RETURNED	349
+#define	LLT_OBSERVER	350
+#define	LLT_EXPOSED	351
+#define	LLT_REFCOUNTED	352
+#define	LLT_REFS	353
+#define	LLT_RELNULL	354
+#define	LLT_RELDEF	355
+#define	LLT_KILLREF	356
+#define	LLT_TEMPREF	357
+#define	LLT_NEWREF	358
+#define	LLT_PRIVATE	359
+#define	LLT_REQUIRES	360
+#define	LLT_RESULT	361
+#define	LLT_SIZEOF	362
+#define	LLT_SPEC	363
+#define	LLT_TAGGEDUNION	364
+#define	LLT_THEN	365
+#define	LLT_TYPE	366
+#define	LLT_TYPEDEF	367
+#define	LLT_UNCHANGED	368
+#define	LLT_USES	369
+#define	LLT_CHAR	370
+#define	LLT_CONST	371
+#define	LLT_DOUBLE	372
+#define	LLT_ENUM	373
+#define	LLT_FLOAT	374
+#define	LLT_INT	375
+#define	LLT_ITER	376
+#define	LLT_YIELD	377
+#define	LLT_LONG	378
+#define	LLT_SHORT	379
+#define	LLT_SIGNED	380
+#define	LLT_UNKNOWN	381
+#define	LLT_STRUCT	382
+#define	LLT_TELIPSIS	383
+#define	LLT_UNION	384
+#define	LLT_UNSIGNED	385
+#define	LLT_VOID	386
+#define	LLT_VOLATILE	387
+#define	LLT_PRINTFLIKE	388
+#define	LLT_SCANFLIKE	389
+#define	LLT_MESSAGELIKE	390
+
+#line 36 "llgrammar.y"
+
+
+# include "bison.reset"
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "lclscan.h"
+# include "checking.h"
+# include "lslparse.h" 
+# include "lh.h"
+# include "usymtab_interface.h"
+
+/*@-noparams@*/
+static /*@unused@*/ void yyprint ();
+/*@=noparams@*/
+
+/*@-redecl@*/
+void ylerror (char *) /*@modifies *g_msgstream@*/ ;
+/*@=redecl@*/
+
+bool g_inTypeDef = FALSE;
+
+/*@constant int YYDEBUG;@*/
+# define YYDEBUG 1
+
+/*@notfunction@*/
+# define YYPRINT(file, type, value) yyprint (file, type, value)
+
+# include "bison.head"
+
+
+#line 68 "llgrammar.y"
+typedef union 
+{
+  ltoken ltok;  /* a leaf is also an ltoken */
+  qual typequal;
+  unsigned int count;
+  /*@only@*/ ltokenList ltokenList;
+  /*@only@*/ abstDeclaratorNode abstDecl; 
+  /*@only@*/ declaratorNode declare;
+  /*@only@*/ declaratorNodeList declarelist;
+  /*@only@*/ typeExpr typeexpr;
+  /*@only@*/ arrayQualNode array;
+  /*@only@*/ quantifierNode quantifier;
+  /*@only@*/ quantifierNodeList quantifiers;
+  /*@only@*/ varNode var;
+  /*@only@*/ varNodeList vars;
+  /*@only@*/ storeRefNode storeref;
+  /*@only@*/ storeRefNodeList storereflist;
+  /*@only@*/ termNode term;
+  /*@only@*/ termNodeList termlist;
+  /*@only@*/ programNode program; 
+  /*@only@*/ stmtNode stmt;
+  /*@only@*/ claimNode claim;
+  /*@only@*/ typeNode type;
+  /*@only@*/ iterNode iter;
+  /*@only@*/ fcnNode fcn;
+  /*@only@*/ fcnNodeList fcns;
+  /*@only@*/ letDeclNode letdecl;
+  /*@only@*/ letDeclNodeList letdecls;
+  /*@only@*/ lclPredicateNode lclpredicate;
+  /*@only@*/ modifyNode modify;
+  /*@only@*/ paramNode param;
+  /*@only@*/ paramNodeList paramlist;
+  /*@only@*/ declaratorInvNodeList declaratorinvs;	
+  /*@only@*/ declaratorInvNode declaratorinv;	
+  /*@only@*/ abstBodyNode abstbody;
+  /*@only@*/ abstractNode abstract;
+  /*@only@*/ exposedNode exposed;
+  /*    taggedUnionNode taggedunion; */
+  /*@only@*/ globalList globals;
+  /*@only@*/ constDeclarationNode constdeclaration;
+  /*@only@*/ varDeclarationNode vardeclaration;
+  /*@only@*/ varDeclarationNodeList vardeclarationlist;
+  /*@only@*/ initDeclNodeList initdecls;
+  /*@only@*/ initDeclNode initdecl;
+  /*@only@*/ stDeclNodeList structdecls;
+  /*@only@*/ stDeclNode structdecl;
+  /*@only@*/ strOrUnionNode structorunion;
+  /*@only@*/ enumSpecNode enumspec; 
+  /*@only@*/ lclTypeSpecNode lcltypespec;
+  /*@only@*/ typeNameNode typname;
+  /*@only@*/ opFormNode opform;
+  /*@only@*/ sigNode signature;
+  /*@only@*/ nameNode name;
+  /*@only@*/ typeNameNodeList namelist;
+  /*@only@*/ replaceNode replace;	
+  /*@only@*/ replaceNodeList replacelist;
+  /*@only@*/ renamingNode renaming;
+  /*@only@*/ traitRefNode traitref;
+  /*@only@*/ traitRefNodeList traitreflist;
+  /*@only@*/ importNode import;
+  /*@only@*/ importNodeList importlist;
+  /*@only@*/ interfaceNode iface;
+  /*@only@*/ interfaceNodeList interfacelist; 
+  /*@only@*/ CTypesNode ctypes;
+} YYSTYPE;
+#ifndef YYDEBUG
+#define YYDEBUG 1
+#endif
+
+#include 
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define	YYFINAL		683
+#define	YYFLAG		-32768
+#define	YYNTBASE	136
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 390 ? yytranslate[x] : 290)
+
+static const short yytranslate[] = {     0,
+     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,     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,     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,     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,     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,     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,     1,     2,     3,     4,     5,
+     6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+    16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+    26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+    36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+    46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+    56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+    66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+    76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+    86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+    96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+   106,   107,   108,   109,   110,   111,   112,   113,   114,   115,
+   116,   117,   118,   119,   120,   121,   122,   123,   124,   125,
+   126,   127,   128,   129,   130,   131,   132,   133,   134,   135
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = {     0,
+     0,     1,     5,     6,     9,    11,    13,    14,    17,    20,
+    21,    24,    26,    28,    30,    34,    38,    40,    42,    44,
+    46,    48,    50,    57,    58,    60,    62,    66,    69,    71,
+    72,    76,    78,    80,    82,    84,    89,    93,    98,   103,
+   105,   107,   109,   111,   113,   114,   128,   129,   144,   145,
+   159,   164,   165,   166,   173,   174,   175,   183,   184,   185,
+   193,   194,   195,   202,   203,   204,   211,   214,   217,   219,
+   223,   225,   229,   231,   233,   237,   239,   241,   245,   247,
+   252,   256,   263,   265,   269,   271,   273,   277,   279,   283,
+   285,   289,   293,   297,   302,   304,   306,   308,   310,   312,
+   316,   318,   322,   323,   326,   330,   333,   336,   337,   340,
+   345,   346,   350,   352,   356,   362,   366,   368,   369,   373,
+   374,   378,   379,   383,   387,   391,   393,   397,   399,   401,
+   404,   406,   408,   409,   413,   414,   418,   419,   421,   423,
+   425,   429,   431,   435,   436,   441,   447,   449,   453,   456,
+   460,   464,   469,   473,   479,   486,   488,   492,   494,   496,
+   499,   502,   506,   510,   514,   519,   521,   525,   530,   534,
+   535,   538,   539,   541,   542,   549,   551,   555,   556,   560,
+   561,   565,   567,   569,   571,   573,   575,   577,   579,   581,
+   583,   585,   587,   590,   592,   594,   596,   598,   600,   602,
+   604,   606,   608,   610,   612,   614,   616,   618,   620,   622,
+   624,   626,   628,   630,   632,   634,   636,   638,   640,   642,
+   644,   646,   648,   650,   652,   654,   656,   658,   660,   662,
+   664,   666,   668,   670,   673,   679,   681,   684,   686,   689,
+   690,   697,   698,   705,   708,   711,   712,   714,   716,   719,
+   723,   725,   729,   730,   732,   739,   742,   744,   748,   750,
+   752,   754,   758,   761,   764,   768,   773,   775,   779,   782,
+   785,   789,   794,   796,   799,   802,   806,   811,   814,   817,
+   820,   823,   827,   829,   830,   832,   836,   839,   841,   843,
+   846,   850,   854,   859,   862,   866,   873,   875,   878,   881,
+   885,   889,   894,   899,   905,   909,   914,   919,   925,   928,
+   931,   935,   939,   941,   943,   945,   947,   949,   951,   953,
+   954,   956,   958,   962,   964,   966,   971,   972,   974,   976,
+   980,   982,   984,   991,   993,   997,   999,  1004,  1008,  1012,
+  1014,  1017,  1020,  1022,  1024,  1026,  1029,  1031,  1034,  1037,
+  1041,  1043,  1045,  1048,  1051,  1055,  1057,  1060,  1064,  1066,
+  1072,  1076,  1081,  1084,  1088,  1091,  1093,  1097,  1101,  1103,
+  1108,  1110,  1113,  1117,  1121,  1125,  1130,  1134,  1136,  1140,
+  1142,  1144,  1146,  1148,  1150,  1152,  1157,  1162,  1167,  1172,
+  1179,  1184,  1186,  1188,  1190,  1192,  1194,  1197,  1198,  1202,
+  1204,  1208,  1212,  1217,  1219,  1221,  1223,  1225,  1227,  1229,
+  1231,  1233
+};
+
+static const short yyrhs[] = {    -1,
+   138,   137,   140,     0,     0,   138,   139,     0,   143,     0,
+   144,     0,     0,   145,   141,     0,   150,   141,     0,     0,
+   141,   142,     0,   145,     0,   150,     0,   144,     0,    57,
+   174,     7,     0,   114,   178,     7,     0,   153,     0,   154,
+     0,   155,     0,   157,     0,   160,     0,   146,     0,   121,
+   284,    10,   147,    37,     7,     0,     0,   148,     0,   149,
+     0,   148,    32,   149,     0,   122,   243,     0,   243,     0,
+     0,   108,   151,   152,     0,   153,     0,   154,     0,   155,
+     0,   157,     0,    50,   226,   188,     7,     0,   226,   188,
+     7,     0,   116,   226,   188,     7,     0,   132,   226,   188,
+     7,     0,   162,     0,   171,     0,   133,     0,   134,     0,
+   135,     0,     0,   226,   239,   190,   158,    34,   192,   194,
+   198,   199,   200,   203,   204,    35,     0,     0,   156,   226,
+   239,   190,   159,    34,   192,   194,   198,   199,   200,   203,
+   204,    35,     0,     0,    48,   286,    10,   205,    37,   190,
+   161,    34,   194,   199,   208,   203,    35,     0,    48,   283,
+   286,     7,     0,     0,     0,    62,   163,   111,    20,   164,
+   213,     0,     0,     0,    62,   165,    97,   111,    20,   166,
+   213,     0,     0,     0,    97,    62,   167,   111,    20,   168,
+   213,     0,     0,     0,    56,   169,   111,    20,   170,   213,
+     0,     0,     0,   112,   226,   172,   218,   173,     7,     0,
+   229,     7,     0,   237,     7,     0,   175,     0,   174,    32,
+   175,     0,   177,     0,     3,   177,     3,     0,    43,     0,
+   177,     0,   176,    32,   177,     0,   282,     0,   179,     0,
+   178,    32,   179,     0,   288,     0,   288,    10,   181,    37,
+     0,    10,   180,    37,     0,    10,   180,    37,    10,   181,
+    37,     0,   288,     0,   180,    32,   288,     0,   183,     0,
+   182,     0,   182,    32,   183,     0,   244,     0,   182,    32,
+   244,     0,   184,     0,   183,    32,   184,     0,   244,    53,
+   222,     0,   244,    53,   185,     0,   244,    53,   185,   255,
+     0,   289,     0,   248,     0,   187,     0,   259,     0,   189,
+     0,   188,    32,   189,     0,   239,     0,   239,    33,   186,
+     0,     0,   190,   191,     0,   226,   188,     7,     0,    64,
+     7,     0,    65,     7,     0,     0,   192,   193,     0,   104,
+   226,   188,     7,     0,     0,    60,   195,     7,     0,   196,
+     0,   195,    32,   196,     0,   284,    31,   197,    46,   259,
+     0,   284,    46,   259,     0,   226,     0,     0,    49,   258,
+     7,     0,     0,   105,   258,     7,     0,     0,    61,    63,
+     7,     0,    61,    45,     7,     0,    61,   201,     7,     0,
+   202,     0,   201,    32,   202,     0,   259,     0,   227,     0,
+    66,   227,     0,    64,     0,    65,     0,     0,    52,   258,
+     7,     0,     0,    48,   258,     7,     0,     0,   206,     0,
+   207,     0,   128,     0,   207,    32,   128,     0,   243,     0,
+   207,    32,   243,     0,     0,    47,    34,   209,    35,     0,
+    47,    34,   209,     7,    35,     0,   210,     0,    10,   209,
+    37,     0,   209,     6,     0,   209,     8,   209,     0,   209,
+     7,   209,     0,   283,    10,   211,    37,     0,   283,    10,
+    37,     0,   284,    33,   283,    10,    37,     0,   284,    33,
+   283,    10,   211,    37,     0,   212,     0,   211,    32,   212,
+     0,   276,     0,   284,     0,     3,   212,     0,   212,     3,
+     0,   212,     3,   212,     0,    10,   212,    37,     0,   283,
+    10,    37,     0,   283,    10,   211,    37,     0,     7,     0,
+    34,   214,    35,     0,    34,   176,    35,     7,     0,    34,
+    35,     7,     0,     0,   214,   157,     0,     0,   216,     0,
+     0,    58,   217,   278,    10,   258,    37,     0,   219,     0,
+   218,    32,   219,     0,     0,   239,   220,   221,     0,     0,
+    34,   215,    35,     0,   131,     0,   115,     0,   117,     0,
+   119,     0,   120,     0,   123,     0,   124,     0,   125,     0,
+   130,     0,   126,     0,   222,     0,   223,   222,     0,    20,
+     0,   223,     0,    67,     0,    78,     0,    68,     0,    69,
+     0,    71,     0,    72,     0,    73,     0,    74,     0,    95,
+     0,    79,     0,    80,     0,    82,     0,    83,     0,    81,
+     0,    75,     0,    76,     0,    77,     0,    87,     0,    88,
+     0,    89,     0,    90,     0,    91,     0,    99,     0,   100,
+     0,    97,     0,    98,     0,   103,     0,   101,     0,    92,
+     0,    93,     0,    94,     0,    96,     0,    70,     0,    84,
+     0,    85,     0,   224,     0,   229,     0,   237,     0,   225,
+   226,     0,     8,   227,    31,   227,     8,     0,   226,     0,
+   226,   228,     0,     6,     0,   228,     6,     0,     0,   127,
+   232,   230,    34,   233,    35,     0,     0,   129,   232,   231,
+    34,   233,    35,     0,   127,   285,     0,   129,   285,     0,
+     0,   285,     0,   234,     0,   233,   234,     0,   226,   235,
+     7,     0,   239,     0,   235,    32,   239,     0,     0,    32,
+     0,   118,   232,    34,   238,   236,    35,     0,   118,   285,
+     0,    25,     0,   238,    32,    25,     0,   241,     0,   240,
+     0,   284,     0,    10,   240,    37,     0,     6,   240,     0,
+   240,   247,     0,   240,    10,    37,     0,   240,    10,   206,
+    37,     0,    20,     0,    10,   241,    37,     0,     6,   241,
+     0,   241,   247,     0,   241,    10,    37,     0,   241,    10,
+   206,    37,     0,    20,     0,     6,   242,     0,   242,   247,
+     0,   242,    10,    37,     0,   242,    10,   206,    37,     0,
+   226,   242,     0,   226,   240,     0,   226,   245,     0,   226,
+   245,     0,    66,   226,   245,     0,   248,     0,     0,   246,
+     0,    10,   246,    37,     0,     6,   246,     0,     6,     0,
+   247,     0,   246,   247,     0,   246,    10,    37,     0,    10,
+   206,    37,     0,   246,    10,   206,    37,     0,    11,    36,
+     0,    11,   187,    36,     0,    55,    27,   110,    27,    51,
+    27,     0,   251,     0,    27,   251,     0,   251,    27,     0,
+    27,   251,    27,     0,   249,   252,   250,     0,    27,   249,
+   252,   250,     0,   249,   252,   250,    27,     0,    27,   249,
+   252,   250,    27,     0,    11,   252,    36,     0,    11,   252,
+    36,    27,     0,    27,    11,   252,    36,     0,    27,    11,
+   252,    36,    27,     0,    12,   282,     0,    26,   282,     0,
+    27,    12,   282,     0,    27,    26,   282,     0,    22,     0,
+    34,     0,    23,     0,    35,     0,   263,     0,    14,     0,
+    39,     0,     0,   253,     0,    27,     0,   253,   254,    27,
+     0,    32,     0,    24,     0,    31,   256,    26,   287,     0,
+     0,   257,     0,   287,     0,   257,    32,   287,     0,   259,
+     0,   260,     0,    55,   260,   110,   260,    51,   260,     0,
+   261,     0,   260,    14,   260,     0,   262,     0,   277,    10,
+   258,    37,     0,   262,    39,   262,     0,   262,    33,   262,
+     0,   264,     0,   267,   265,     0,   267,   266,     0,     3,
+     0,     6,     0,   267,     0,   263,   264,     0,   263,     0,
+   265,   263,     0,   263,   267,     0,   266,   263,   267,     0,
+   272,     0,   268,     0,   268,   272,     0,   272,   268,     0,
+   272,   268,   272,     0,   269,     0,   269,   272,     0,   270,
+    31,   287,     0,   270,     0,    11,   271,    36,    31,   287,
+     0,    11,   271,    36,     0,    11,    36,    31,   287,     0,
+    11,    36,     0,   249,   271,   250,     0,   249,   250,     0,
+   259,     0,   271,   254,   259,     0,    10,   260,    37,     0,
+   284,     0,   289,    10,   273,    37,     0,   275,     0,   272,
+   274,     0,   272,    12,   282,     0,   272,    26,   282,     0,
+   272,    11,    36,     0,   272,    11,   273,    36,     0,   272,
+    31,   287,     0,   260,     0,   273,    32,   260,     0,    28,
+     0,    29,     0,    30,     0,    38,     0,   276,     0,   106,
+     0,    54,    10,   273,    37,     0,   113,    10,    44,    37,
+     0,   113,    10,   201,    37,     0,   107,    10,   259,    37,
+     0,    59,    10,   259,    32,   259,    37,     0,   107,    10,
+   226,    37,     0,    42,     0,    43,     0,    40,     0,    41,
+     0,   278,     0,   277,   278,     0,     0,    21,   279,   280,
+     0,   281,     0,   280,    32,   281,     0,   284,    31,   197,
+     0,   284,    31,    66,   197,     0,    25,     0,    20,     0,
+    25,     0,    25,     0,   282,     0,   282,     0,   282,     0,
+   282,     0,   282,     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+   372,   373,   376,   377,   380,   381,   384,   385,   386,   389,
+   390,   393,   394,   395,   398,   404,   408,   410,   412,   414,
+   416,   418,   422,   426,   427,   430,   432,   436,   437,   440,
+   441,   444,   446,   448,   450,   454,   458,   460,   462,   466,
+   467,   470,   471,   472,   475,   476,   483,   485,   496,   498,
+   501,   505,   505,   506,   507,   507,   509,   510,   511,   512,
+   513,   513,   514,   517,   518,   519,   520,   522,   538,   540,
+   544,   545,   547,   550,   551,   554,   558,   560,   564,   566,
+   568,   570,   574,   575,   578,   580,   582,   585,   587,   590,
+   592,   595,   596,   597,   601,   602,   604,   606,   609,   611,
+   615,   616,   619,   621,   625,   626,   627,   630,   631,   634,
+   638,   639,   642,   643,   646,   647,   649,   652,   653,   656,
+   657,   660,   661,   662,   663,   666,   667,   670,   671,   672,
+   673,   674,   677,   678,   681,   682,   685,   686,   689,   690,
+   691,   694,   695,   698,   699,   700,   703,   704,   707,   712,
+   718,   726,   728,   730,   732,   736,   737,   740,   741,   742,
+   743,   744,   745,   746,   748,   752,   753,   754,   755,   758,
+   759,   762,   763,   766,   766,   775,   776,   780,   781,   784,
+   785,   788,   789,   790,   791,   792,   793,   794,   795,   796,
+   797,   805,   806,   811,   813,   819,   820,   821,   822,   823,
+   824,   825,   826,   827,   828,   829,   830,   831,   832,   833,
+   834,   835,   836,   837,   838,   839,   840,   841,   842,   843,
+   844,   845,   846,   847,   848,   849,   850,   851,   852,   853,
+   856,   858,   860,   862,   864,   873,   874,   879,   880,   883,
+   885,   887,   889,   891,   893,   897,   898,   901,   902,   907,
+   910,   912,   916,   917,   920,   922,   926,   927,   937,   938,
+   941,   942,   943,   944,   945,   946,   949,   950,   951,   952,
+   953,   954,   963,   964,   965,   966,   967,   973,   974,   975,
+   985,   986,   987,   992,   993,   996,   997,   998,   999,  1000,
+  1001,  1002,  1003,  1006,  1007,  1010,  1012,  1014,  1016,  1018,
+  1021,  1023,  1025,  1027,  1029,  1031,  1039,  1041,  1043,  1046,
+  1049,  1052,  1057,  1058,  1061,  1062,  1065,  1066,  1067,  1070,
+  1071,  1074,  1075,  1078,  1079,  1082,  1085,  1086,  1089,  1090,
+  1093,  1096,  1102,  1104,  1105,  1108,  1109,  1114,  1116,  1120,
+  1121,  1122,  1125,  1126,  1129,  1130,  1133,  1134,  1137,  1138,
+  1141,  1142,  1143,  1144,  1145,  1146,  1147,  1150,  1151,  1154,
+  1157,  1159,  1163,  1167,  1168,  1171,  1172,  1175,  1177,  1179,
+  1181,  1182,  1184,  1186,  1188,  1191,  1193,  1197,  1198,  1201,
+  1202,  1203,  1204,  1207,  1208,  1209,  1210,  1211,  1212,  1217,
+  1223,  1233,  1234,  1235,  1236,  1239,  1241,  1245,  1249,  1252,
+  1253,  1256,  1257,  1260,  1261,  1264,  1265,  1266,  1267,  1268,
+  1269,  1270
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = {   "$","error","$undefined.","simpleOp",
+"PREFIX_OP","POSTFIX_OP","LLT_MULOP","LLT_SEMI","LLT_VERTICALBAR","ITERATION_OP",
+"LLT_LPAR","LLT_LBRACKET","selectSym","LLT_IF_THEN_ELSE","logicalOp","eqSepSym",
+"equationSym","commentSym","LLT_WHITESPACE","LLT_EOL","LLT_TYPEDEF_NAME","quantifierSym",
+"openSym","closeSym","sepSym","simpleId","mapSym","markerSym","preSym","postSym",
+"anySym","LLT_COLON","LLT_COMMA","LLT_EQUALS","LLT_LBRACE","LLT_RBRACE","LLT_RBRACKET",
+"LLT_RPAR","LLT_QUOTE","eqOp","LLT_CCHAR","LLT_CFLOAT","LLT_CINTEGER","LLT_LCSTRING",
+"LLT_ALL","LLT_ANYTHING","LLT_BE","LLT_BODY","LLT_CLAIMS","LLT_CHECKS","LLT_CONSTANT",
+"LLT_ELSE","LLT_ENSURES","LLT_FOR","LLT_FRESH","LLT_IF","LLT_IMMUTABLE","LLT_IMPORTS",
+"LLT_CONSTRAINT","LLT_ISSUB","LLT_LET","LLT_MODIFIES","LLT_MUTABLE","LLT_NOTHING",
+"LLT_INTERNAL","LLT_FILESYS","LLT_OBJ","LLT_OUT","LLT_SEF","LLT_ONLY","LLT_PARTIAL",
+"LLT_OWNED","LLT_DEPENDENT","LLT_KEEP","LLT_KEPT","LLT_TEMP","LLT_SHARED","LLT_UNIQUE",
+"LLT_UNUSED","LLT_EXITS","LLT_MAYEXIT","LLT_NEVEREXIT","LLT_TRUEEXIT","LLT_FALSEEXIT",
+"LLT_UNDEF","LLT_KILLED","LLT_CHECKMOD","LLT_CHECKED","LLT_UNCHECKED","LLT_CHECKEDSTRICT",
+"LLT_TRUENULL","LLT_FALSENULL","LLT_LNULL","LLT_LNOTNULL","LLT_RETURNED","LLT_OBSERVER",
+"LLT_EXPOSED","LLT_REFCOUNTED","LLT_REFS","LLT_RELNULL","LLT_RELDEF","LLT_KILLREF",
+"LLT_TEMPREF","LLT_NEWREF","LLT_PRIVATE","LLT_REQUIRES","LLT_RESULT","LLT_SIZEOF",
+"LLT_SPEC","LLT_TAGGEDUNION","LLT_THEN","LLT_TYPE","LLT_TYPEDEF","LLT_UNCHANGED",
+"LLT_USES","LLT_CHAR","LLT_CONST","LLT_DOUBLE","LLT_ENUM","LLT_FLOAT","LLT_INT",
+"LLT_ITER","LLT_YIELD","LLT_LONG","LLT_SHORT","LLT_SIGNED","LLT_UNKNOWN","LLT_STRUCT",
+"LLT_TELIPSIS","LLT_UNION","LLT_UNSIGNED","LLT_VOID","LLT_VOLATILE","LLT_PRINTFLIKE",
+"LLT_SCANFLIKE","LLT_MESSAGELIKE","interface","@1","externals","external","optDeclarations",
+"declarations","declaration","imports","uses","export","iter","iterParamList",
+"realIterParamList","iterParam","private","@2","private2","constDeclaration",
+"varDeclaration","type","special","fcn","@3","@4","claim","@5","abstract","@6",
+"@7","@8","@9","@10","@11","@12","@13","exposed","@14","@15","importNameList",
+"importName","interfaceNameList","interfaceName","traitRefNodeList","traitRef",
+"traitIdList","renaming","nameList","replaceNodeList","replace","name","initializer",
+"constLclExpr","initDecls","initDecl","globals","globalDecl","privateInits",
+"privateInit","optLetDecl","beDeclList","beDecl","sortSpec","optChecks","optRequire",
+"optModify","storeRefList","storeRef","optEnsure","optClaim","optParamList",
+"realParamList","paramList","optBody","callExpr","stmt","valueList","value",
+"abstBody","fcns","optTypeInv","typeInv","@16","declaratorInvs","declaratorInv",
+"@17","optExposedBody","CType","CTypes","typeSpecifier","specialQualifier","lclTypeSpec",
+"lclType","pointers","structOrUnionSpec","@18","@19","optTagId","structDecls",
+"structDecl","declaratorList","optCOMMA","enumSpec","enumeratorList","declarator",
+"notype_decl","after_type_decl","parameter_decl","param","typeName","optAbstDeclarator",
+"abstDeclarator","arrayQual","opForm","open","close","anyOp","middle","placeList",
+"separator","signature","domain","sortList","lclPredicate","term","term0","equalityTerm",
+"simpleOpTerm","simpleOp2","prefixOpTerm","postfixOps","infixOpPart","secondary",
+"bracketed","sqBracketed","matched","args","primary","termList","stateFcn","lclPrimary",
+"cLiteral","quantifiers","quantifier","@20","quantifiedList","quantified","simpleIdOrTypedefName",
+"fcnId","varId","tagId","claimId","sortId","traitId","opId", NULL
+};
+#endif
+
+static const short yyr1[] = {     0,
+   137,   136,   138,   138,   139,   139,   140,   140,   140,   141,
+   141,   142,   142,   142,   143,   144,   145,   145,   145,   145,
+   145,   145,   146,   147,   147,   148,   148,   149,   149,   151,
+   150,   152,   152,   152,   152,   153,   154,   154,   154,   155,
+   155,   156,   156,   156,   158,   157,   159,   157,   161,   160,
+   160,   163,   164,   162,   165,   166,   162,   167,   168,   162,
+   169,   170,   162,   172,   173,   171,   171,   171,   174,   174,
+   175,   175,   175,   176,   176,   177,   178,   178,   179,   179,
+   179,   179,   180,   180,   181,   181,   181,   182,   182,   183,
+   183,   184,   184,   184,   185,   185,   186,   187,   188,   188,
+   189,   189,   190,   190,   191,   191,   191,   192,   192,   193,
+   194,   194,   195,   195,   196,   196,   197,   198,   198,   199,
+   199,   200,   200,   200,   200,   201,   201,   202,   202,   202,
+   202,   202,   203,   203,   204,   204,   205,   205,   206,   206,
+   206,   207,   207,   208,   208,   208,   209,   209,   209,   209,
+   209,   210,   210,   210,   210,   211,   211,   212,   212,   212,
+   212,   212,   212,   212,   212,   213,   213,   213,   213,   214,
+   214,   215,   215,   217,   216,   218,   218,   220,   219,   221,
+   221,   222,   222,   222,   222,   222,   222,   222,   222,   222,
+   222,   223,   223,   224,   224,   225,   225,   225,   225,   225,
+   225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
+   225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
+   225,   225,   225,   225,   225,   225,   225,   225,   225,   225,
+   226,   226,   226,   226,   226,   227,   227,   228,   228,   230,
+   229,   231,   229,   229,   229,   232,   232,   233,   233,   234,
+   235,   235,   236,   236,   237,   237,   238,   238,   239,   239,
+   240,   240,   240,   240,   240,   240,   241,   241,   241,   241,
+   241,   241,   242,   242,   242,   242,   242,   243,   243,   243,
+   244,   244,   244,   245,   245,   246,   246,   246,   246,   246,
+   246,   246,   246,   247,   247,   248,   248,   248,   248,   248,
+   248,   248,   248,   248,   248,   248,   248,   248,   248,   248,
+   248,   248,   249,   249,   250,   250,   251,   251,   251,   252,
+   252,   253,   253,   254,   254,   255,   256,   256,   257,   257,
+   258,   259,   260,   260,   260,   261,   261,   261,   261,   262,
+   262,   262,   263,   263,   264,   264,   265,   265,   266,   266,
+   267,   267,   267,   267,   267,   267,   267,   268,   268,   269,
+   269,   269,   269,   270,   270,   271,   271,   272,   272,   272,
+   272,   272,   272,   272,   272,   272,   272,   273,   273,   274,
+   274,   274,   274,   275,   275,   275,   275,   275,   275,   275,
+   275,   276,   276,   276,   276,   277,   277,   279,   278,   280,
+   280,   281,   281,   282,   282,   283,   284,   285,   286,   287,
+   288,   289
+};
+
+static const short yyr2[] = {     0,
+     0,     3,     0,     2,     1,     1,     0,     2,     2,     0,
+     2,     1,     1,     1,     3,     3,     1,     1,     1,     1,
+     1,     1,     6,     0,     1,     1,     3,     2,     1,     0,
+     3,     1,     1,     1,     1,     4,     3,     4,     4,     1,
+     1,     1,     1,     1,     0,    13,     0,    14,     0,    13,
+     4,     0,     0,     6,     0,     0,     7,     0,     0,     7,
+     0,     0,     6,     0,     0,     6,     2,     2,     1,     3,
+     1,     3,     1,     1,     3,     1,     1,     3,     1,     4,
+     3,     6,     1,     3,     1,     1,     3,     1,     3,     1,
+     3,     3,     3,     4,     1,     1,     1,     1,     1,     3,
+     1,     3,     0,     2,     3,     2,     2,     0,     2,     4,
+     0,     3,     1,     3,     5,     3,     1,     0,     3,     0,
+     3,     0,     3,     3,     3,     1,     3,     1,     1,     2,
+     1,     1,     0,     3,     0,     3,     0,     1,     1,     1,
+     3,     1,     3,     0,     4,     5,     1,     3,     2,     3,
+     3,     4,     3,     5,     6,     1,     3,     1,     1,     2,
+     2,     3,     3,     3,     4,     1,     3,     4,     3,     0,
+     2,     0,     1,     0,     6,     1,     3,     0,     3,     0,
+     3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+     1,     1,     2,     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,     5,     1,     2,     1,     2,     0,
+     6,     0,     6,     2,     2,     0,     1,     1,     2,     3,
+     1,     3,     0,     1,     6,     2,     1,     3,     1,     1,
+     1,     3,     2,     2,     3,     4,     1,     3,     2,     2,
+     3,     4,     1,     2,     2,     3,     4,     2,     2,     2,
+     2,     3,     1,     0,     1,     3,     2,     1,     1,     2,
+     3,     3,     4,     2,     3,     6,     1,     2,     2,     3,
+     3,     4,     4,     5,     3,     4,     4,     5,     2,     2,
+     3,     3,     1,     1,     1,     1,     1,     1,     1,     0,
+     1,     1,     3,     1,     1,     4,     0,     1,     1,     3,
+     1,     1,     6,     1,     3,     1,     4,     3,     3,     1,
+     2,     2,     1,     1,     1,     2,     1,     2,     2,     3,
+     1,     1,     2,     2,     3,     1,     2,     3,     1,     5,
+     3,     4,     2,     3,     2,     1,     3,     3,     1,     4,
+     1,     2,     3,     3,     3,     4,     3,     1,     3,     1,
+     1,     1,     1,     1,     1,     4,     4,     4,     4,     6,
+     4,     1,     1,     1,     1,     1,     2,     0,     3,     1,
+     3,     3,     4,     1,     1,     1,     1,     1,     1,     1,
+     1,     1
+};
+
+static const short yydefact[] = {     3,
+     1,     0,     0,     7,     4,     5,     6,     0,   405,   404,
+    73,     0,    69,    71,    76,     0,     0,    77,   411,    79,
+     0,   194,     0,     0,    61,    52,   196,   198,   199,   228,
+   200,   201,   202,   203,   210,   211,   212,   197,   205,   206,
+   209,   207,   208,   229,   230,   213,   214,   215,   216,   217,
+   224,   225,   226,   204,   227,   220,   221,   218,   219,   223,
+   222,    30,     0,   183,     0,   184,   246,   185,   186,     0,
+   187,   188,   189,   191,   246,   246,   190,   182,     0,    42,
+    43,    44,     2,    10,    22,    10,    17,    18,    19,     0,
+    20,    21,    40,    41,   192,   195,   231,     0,     0,   232,
+   233,     0,    15,     0,     0,    83,    16,     0,     0,   220,
+   236,     0,   232,   233,   406,   409,     0,     0,     0,     0,
+     0,     0,    58,     0,    64,     0,     0,   408,   256,   407,
+     0,   240,   244,   242,   245,     0,     8,     9,     0,   193,
+   234,     0,     0,   267,     0,    99,   103,   260,   259,   261,
+    67,    68,    72,    70,     0,    81,    78,   343,   344,   320,
+     0,   318,   313,     0,     0,   314,   319,     0,     0,     0,
+    86,    85,    90,   284,    88,   283,   320,   297,   317,   238,
+   237,     0,     0,   137,     0,   101,     0,     0,     0,     0,
+    31,    32,    33,    34,    35,     0,     0,     0,    24,     0,
+     0,     0,    11,    14,    12,    13,   103,   263,   269,     0,
+     0,    37,     0,     0,    45,     0,     0,   264,     0,   270,
+    84,     0,   322,     0,   321,   309,   310,   320,     0,     0,
+   320,   298,     0,   284,    80,     0,     0,   288,     0,   281,
+   285,   289,     0,     0,   299,   239,     0,    51,   140,     0,
+   138,   139,   284,   142,    36,    62,    53,     0,     0,    65,
+   176,   178,    38,   257,   253,     0,     0,    25,    26,    29,
+     0,     0,    39,    47,   262,   268,   100,     0,     0,   398,
+   407,   394,   395,   392,   393,     0,     0,     0,   385,     0,
+     0,   102,    97,     0,    98,   332,   334,   336,     0,   340,
+   345,   352,   356,   359,   351,   371,   384,     0,   396,   412,
+   369,     0,     0,     0,     0,   104,     0,   265,     0,   294,
+     0,   271,     0,     0,   305,   325,   324,     0,     0,   311,
+   312,     0,   300,     0,   282,    87,    89,    91,     0,   287,
+     0,     0,     0,   290,    93,    92,    96,    95,   315,   316,
+   301,   235,   103,     0,   288,     0,   273,   279,   278,   280,
+     0,     0,    56,    59,     0,     0,   180,   254,     0,    28,
+     0,     0,     0,     0,   248,     0,     0,     0,   363,   366,
+     0,     0,     0,     0,     0,     0,     0,   365,     0,     0,
+     0,     0,   346,   345,   347,   341,   342,   353,   357,     0,
+     0,     0,     0,   380,   381,   382,     0,   383,   354,   372,
+     0,   397,     0,   106,   107,   108,     0,   266,   295,   272,
+    82,   306,   323,   307,   302,     0,   292,   286,   291,     0,
+   327,    94,   303,    49,   141,   143,   274,   288,     0,   275,
+   166,   170,    63,    54,     0,     0,   177,    66,   172,   179,
+   258,   255,    23,    27,     0,   251,   241,   249,   243,   108,
+   368,     0,   361,     0,   399,   400,     0,   378,     0,     0,
+     0,   194,     0,     0,     0,   131,   132,     0,     0,   126,
+   129,   128,   364,   335,   339,   338,   349,   348,     0,   410,
+   358,   375,     0,   373,   374,   377,   355,     0,   331,     0,
+   111,   105,   308,   304,     0,   293,     0,   328,   329,     0,
+   276,     0,     0,     0,    74,     0,    57,    60,   174,     0,
+   173,   250,     0,   111,   362,     0,   367,     0,     0,     0,
+   386,     0,     0,   391,   389,   387,   130,     0,   388,   350,
+   376,   337,   370,     0,     0,   109,   118,   296,     0,     0,
+   111,   277,   169,     0,     0,   167,   171,     0,     0,   181,
+   252,   118,   360,   401,     0,   402,   117,   379,     0,     0,
+   127,     0,   113,     0,     0,     0,   120,   326,   330,   120,
+    75,   168,   103,     0,   120,   403,   333,   390,   112,     0,
+     0,     0,     0,     0,     0,   122,   144,     0,   122,   114,
+     0,   116,   110,   119,     0,     0,   133,     0,   133,     0,
+   133,     0,   121,     0,     0,     0,     0,   135,     0,     0,
+   175,   135,   115,   124,   123,   125,     0,     0,     0,     0,
+   407,     0,   147,     0,     0,    50,     0,   134,     0,    46,
+     0,   149,     0,     0,   145,     0,     0,    48,   136,     0,
+   148,   146,   151,   150,     0,     0,   153,     0,   156,   158,
+     0,   159,   406,     0,   160,     0,     0,   152,   161,     0,
+     0,   163,   157,   162,   164,     0,   154,     0,   165,   155,
+     0,     0,     0
+};
+
+static const short yydefgoto[] = {   681,
+     4,     1,     5,    83,   137,   203,     6,   204,   205,    85,
+   267,   268,   269,   206,   124,   191,    87,    88,    89,    90,
+    91,   315,   377,    92,   510,    93,   121,   362,   122,   445,
+   190,   446,   120,   361,    94,   196,   366,    12,    13,   514,
+    14,    17,    18,   105,   170,   171,   172,   173,   345,   292,
+   293,   145,   146,   215,   316,   501,   546,   547,   572,   573,
+   566,   577,   596,   607,   479,   480,   618,   629,   250,   341,
+   252,   609,   653,   633,   658,   659,   443,   516,   520,   521,
+   559,   260,   261,   367,   450,    95,    96,    97,    98,   253,
+   481,   181,   113,   200,   201,   127,   374,   375,   455,   369,
+   114,   265,   186,   148,   149,   359,   254,   175,   240,   241,
+   242,   176,   294,   351,   178,   224,   225,   464,   432,   507,
+   508,   498,   499,   296,   297,   298,   299,   300,   396,   397,
+   301,   302,   303,   304,   381,   305,   469,   410,   306,   307,
+   308,   309,   382,   465,   466,   310,   661,   311,   129,   118,
+   491,    20,   312
+};
+
+static const short yypact[] = {-32768,
+   -28,   224,   372,  1343,-32768,-32768,-32768,   132,-32768,-32768,
+-32768,    48,-32768,-32768,-32768,   132,   105,-32768,-32768,    49,
+  2880,-32768,   227,  2880,-32768,    17,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,   161,-32768,-32768,-32768,-32768,
+-32768,-32768,  2880,-32768,  2880,-32768,   132,-32768,-32768,   221,
+-32768,-32768,-32768,-32768,   132,   132,-32768,-32768,  2880,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  2880,
+-32768,-32768,-32768,-32768,-32768,  1065,-32768,  2880,   396,   247,
+   270,   280,-32768,   224,   311,-32768,-32768,   372,  1147,-32768,
+   310,   265,-32768,-32768,   343,-32768,   132,   345,   396,   209,
+   246,   264,-32768,  1437,-32768,   396,   340,-32768,   346,-32768,
+   378,-32768,   346,-32768,   346,   396,  1241,  1241,   396,-32768,
+-32768,   396,   396,-32768,   123,-32768,   118,   198,   294,-32768,
+-32768,-32768,-32768,-32768,   132,   431,-32768,-32768,-32768,   416,
+   132,-32768,-32768,   132,   488,-32768,-32768,   423,  2880,   427,
+   442,   444,-32768,   462,   417,-32768,   416,   466,-32768,-32768,
+   499,  2880,   502,  2302,   149,   484,   501,   512,   428,   429,
+-32768,-32768,-32768,-32768,-32768,   396,   156,   509,  2396,   504,
+   507,   165,-32768,-32768,-32768,-32768,-32768,   198,   294,    89,
+   112,-32768,   396,  3134,  1824,  1920,  3009,-32768,  2016,-32768,
+-32768,  1147,-32768,   500,    33,-32768,-32768,   416,   132,   132,
+   416,   516,   437,   462,-32768,  1147,  1147,   462,  1730,-32768,
+   329,-32768,   239,    93,-32768,-32768,   538,-32768,-32768,   513,
+-32768,   517,   379,-32768,-32768,-32768,-32768,   533,   534,   523,
+-32768,-32768,-32768,-32768,   526,  2880,   522,   532,-32768,-32768,
+  2880,  2880,-32768,  1824,-32768,-32768,-32768,  3134,  3036,-32768,
+   343,-32768,-32768,-32768,-32768,   555,  3134,   556,-32768,   559,
+   560,-32768,-32768,   412,-32768,   558,-32768,   121,   557,-32768,
+   436,   438,   438,   540,   761,-32768,-32768,   290,-32768,-32768,
+-32768,   563,   567,   568,   542,-32768,   396,-32768,   541,-32768,
+   544,-32768,   546,   547,   562,-32768,-32768,   566,   549,-32768,
+-32768,    93,-32768,   574,-32768,   444,   417,-32768,   417,   329,
+   550,   128,  2112,-32768,   564,-32768,-32768,-32768,-32768,-32768,
+   575,-32768,-32768,  2490,   379,  1634,-32768,   198,   376,-32768,
+    34,    34,-32768,-32768,   396,   579,   570,   565,   578,-32768,
+   587,  2396,   396,  2591,-32768,  2692,   576,   159,   583,-32768,
+   393,   221,  3134,    21,  3134,  1018,   760,-32768,   463,  3134,
+   557,   557,-32768,-32768,   288,   436,   436,   295,   295,   132,
+  3077,   132,   132,-32768,-32768,-32768,   132,-32768,   438,-32768,
+  3134,-32768,  3134,-32768,-32768,-32768,   211,-32768,-32768,-32768,
+-32768,-32768,-32768,   582,   588,   571,-32768,-32768,-32768,   586,
+   132,-32768,-32768,  1824,-32768,-32768,   376,   434,  2208,-32768,
+-32768,   373,-32768,-32768,    34,    34,-32768,-32768,   561,-32768,
+-32768,-32768,-32768,-32768,   249,-32768,-32768,-32768,-32768,-32768,
+-32768,   132,   594,  3134,   596,-32768,   595,   558,   419,  3134,
+   598,   625,   599,   601,   603,-32768,-32768,  2880,   425,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   288,-32768,
+-32768,-32768,    20,-32768,-32768,-32768,   295,   606,-32768,   445,
+    -7,-32768,-32768,-32768,   617,-32768,   619,   614,-32768,   613,
+-32768,   611,   642,   472,-32768,  1538,-32768,-32768,-32768,   615,
+-32768,-32768,   396,    -7,-32768,   132,-32768,   221,  2786,  3134,
+-32768,    28,  3134,-32768,-32768,-32768,-32768,   889,-32768,-32768,
+-32768,-32768,-32768,   221,  2880,-32768,   605,-32768,   132,   132,
+   597,-32768,-32768,   132,   648,-32768,-32768,   396,   637,-32768,
+-32768,   605,-32768,-32768,  2880,-32768,-32768,   558,  3134,   622,
+-32768,   277,-32768,   115,   396,  3134,   572,-32768,-32768,   572,
+-32768,-32768,-32768,   650,   572,-32768,   558,-32768,-32768,   221,
+  2880,  3134,   282,   654,  3134,   607,   620,  3134,   607,-32768,
+   616,-32768,-32768,-32768,   659,   631,   623,   635,   623,   641,
+   623,  3134,-32768,   672,   673,   334,  3134,   633,   192,   647,
+-32768,   633,-32768,-32768,-32768,-32768,   676,  3134,   649,   192,
+   677,   187,-32768,   678,   656,-32768,   657,-32768,   684,-32768,
+    65,-32768,   200,   192,-32768,   245,   668,-32768,-32768,   192,
+-32768,-32768,   709,-32768,   189,   189,-32768,   451,   730,-32768,
+   725,-32768,-32768,   726,-32768,    47,   189,-32768,   250,   309,
+   335,-32768,   730,-32768,-32768,   452,-32768,   464,-32768,-32768,
+   739,   740,-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,-32768,-32768,-32768,   655,-32768,-32768,   741,   743,-32768,
+-32768,-32768,   371,   748,-32768,-32768,   621,   629,   640,-32768,
+  -120,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   661,-32768,
+    -6,-32768,   651,-32768,   545,-32768,   539,   537,-32768,-32768,
+   552,  -114,   573,  -179,-32768,   316,-32768,  -434,-32768,   188,
+  -522,   215,   -77,   180,   178,   255,  -420,   166,-32768,  -165,
+-32768,-32768,  -406,-32768,  -251,  -288,  -326,-32768,-32768,-32768,
+-32768,-32768,   432,-32768,-32768,   -76,-32768,-32768,-32768,    -3,
+   -18,-32768,    45,-32768,-32768,   440,   524,   -79,-32768,-32768,
+    63,-32768,   -93,  -135,   369,   443,  -174,   287,  -189,  -212,
+  -101,   569,   -32,  -257,   643,  -137,-32768,   580,-32768,-32768,
+-32768,  -532,  -201,  -254,-32768,   137,   -95,   508,-32768,-32768,
+  -282,   505,-32768,-32768,   515,  -264,  -173,-32768,-32768,  -243,
+-32768,  -297,-32768,-32768,   278,     7,   -23,   -38,   455,   694,
+  -373,    15,   577
+};
+
+
+#define	YYLAST		3247
+
+
+static const short yytable[] = {   117,
+    99,   102,   112,   195,   185,   147,   208,   210,    15,    19,
+   412,   197,   295,   179,    15,   295,   394,   111,   251,   140,
+   119,   202,    19,   378,   270,   340,   342,   274,     2,   116,
+   106,   131,   384,   496,   390,   444,   388,   398,   399,   244,
+   441,   390,   586,   594,   335,   207,   218,   220,   100,   669,
+   319,   530,   544,   323,   103,   541,   326,   509,   109,   125,
+   150,   126,   605,   360,   327,   610,   101,   442,   601,   179,
+   642,   650,   644,   128,   425,   136,   177,   380,   569,   104,
+   150,   128,   128,   672,   627,     3,   139,   150,   525,   562,
+   329,   370,   380,   332,   141,   639,   545,   150,   216,   217,
+   150,   651,   262,   150,   150,   174,   218,   220,   218,   220,
+    15,   107,   487,   -55,    19,   349,   580,   358,   517,   518,
+    99,   219,   217,   116,  -101,   275,   179,   350,   468,   212,
+   470,   483,   231,    99,    99,   484,   108,   343,   217,   344,
+   179,   179,   340,   342,   497,   591,   468,   179,   276,  -101,
+   214,     9,   563,   391,   213,   255,    10,   150,   468,   392,
+   592,    19,   263,   247,   428,   234,   346,   226,   100,   221,
+   227,   273,   390,   434,   150,   578,   579,   430,   111,   436,
+   213,   100,   100,   471,   474,   482,   101,   213,   620,   177,
+   622,   655,   642,   643,   644,   461,   213,   270,   656,   101,
+   101,   630,   417,   177,   177,   395,   540,   216,   217,   630,
+   177,   317,   632,   631,   150,   532,   631,   502,   174,   208,
+   210,   645,   123,   641,   631,   340,     8,   493,   282,   283,
+   284,   285,   174,   174,   652,   330,   331,   654,   344,   500,
+   344,   158,   213,     9,   159,   130,     9,   655,    10,   160,
+   161,   115,   162,   151,   656,   522,   218,   440,     9,   656,
+   163,   584,   527,    10,   164,   165,    11,   373,   373,   631,
+   317,   262,   166,   512,   631,   568,   152,   167,   150,   456,
+   523,   657,   153,   589,   282,   283,   284,   285,   603,   282,
+   283,   284,   285,   168,   458,   182,   458,   278,   279,   411,
+   488,   489,   208,   219,   217,   401,   402,     9,   590,   163,
+   280,   655,   281,   213,   587,   180,   150,   150,   656,   187,
+   403,   166,   404,   405,   406,   407,   150,   282,   283,   284,
+   285,   570,   408,   631,   150,   440,   482,   655,   343,   217,
+   626,   286,   155,   467,   656,   675,   288,   156,   282,   283,
+   284,   285,  -404,    64,   184,    66,   188,    68,    69,   631,
+   189,    71,    72,    73,    74,   538,   665,   666,    77,    78,
+   373,   677,   373,   198,   282,   283,   284,   285,   673,  -247,
+   674,    16,   473,   111,   355,   439,   217,   199,   356,   217,
+   602,     9,     9,   289,   290,   557,    10,    10,   357,   150,
+   291,   142,   660,   130,   482,   143,   490,   513,   494,   495,
+   623,   660,   660,   490,   158,   144,   326,   159,   676,   678,
+   130,   278,   279,   660,   327,   660,   660,   660,   463,   561,
+   317,     9,   280,   163,   349,   515,   281,   490,   158,   438,
+   222,   159,   223,   356,   217,   166,   350,   278,    15,   233,
+   530,   282,   283,   284,   285,   531,   538,     9,   130,   537,
+   593,   539,   281,   235,   583,   286,   287,   238,   490,   243,
+   288,   239,   217,   236,   111,   237,   530,   282,   283,   284,
+   285,   543,   667,   667,   150,   349,   326,   668,   679,   467,
+   158,   286,   245,   159,   327,   667,   288,   350,   228,   229,
+   680,   162,   597,   554,   246,   574,   555,   599,   248,   163,
+   209,   211,   558,   230,   132,   134,   214,   289,   290,   150,
+   256,   166,   337,   339,   291,   567,   167,   485,   486,   133,
+   135,   257,   490,   264,   111,   325,   150,   271,   258,   259,
+   272,   575,   333,   289,   290,   352,   334,   581,   354,   353,
+   291,   574,   363,   364,   365,   490,   490,   368,   371,   158,
+    15,   567,   159,   372,   383,   385,   278,   279,   386,   387,
+   400,   390,   413,   414,   415,   416,     9,   418,   163,   419,
+   635,   281,   420,   421,   424,   448,   427,   567,   422,   451,
+   166,   635,   423,   453,   431,   634,   282,   283,   284,   285,
+   426,   433,   111,   449,   635,   635,   634,   662,   503,   460,
+   286,   635,   452,   462,   504,   288,   662,   662,   519,   634,
+   634,   505,   506,   664,   526,   529,   634,   528,   662,   533,
+   662,   662,   662,   158,  -405,   534,   159,   535,    21,   536,
+   278,   279,   542,   548,   549,   550,   551,   552,   553,   560,
+   472,   280,   163,   576,   582,   281,   544,   280,   588,   598,
+   604,   612,   289,   290,   166,   613,   608,   606,   619,   291,
+   282,   283,   284,   285,   617,   614,   595,   621,   624,   625,
+   628,   636,   638,   640,   286,   287,  -406,   646,   647,   288,
+   649,   648,   663,   615,   476,   477,   478,    27,    28,    29,
+    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+    40,    41,    42,    43,    44,    45,   644,    46,    47,    48,
+    49,    50,    51,    52,    53,    54,    55,   110,    57,    58,
+    59,    60,   669,    61,   670,   671,   289,   290,   682,   683,
+   138,     7,   454,   291,   192,    64,    84,    66,    67,    68,
+    69,    86,   193,    71,    72,    73,    74,    75,   157,    76,
+    77,    78,   158,   194,   154,   159,   324,    21,   321,   278,
+   279,   401,   402,   338,   336,   524,   585,   600,   611,   472,
+   280,   163,   163,   616,   281,   277,   403,   637,   404,   405,
+   406,   407,   571,   166,   166,   376,   447,   437,   408,   282,
+   283,   284,   285,   475,   328,   564,   393,   232,   389,   409,
+   183,   347,     0,   286,   287,     0,     0,     0,   288,   348,
+     0,     0,     0,   476,   477,   478,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,     0,     0,   289,   290,     0,     0,     0,
+     0,     0,   291,     0,    64,     0,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,     0,    76,    77,
+    78,   158,     0,     0,   159,     0,    21,     0,   278,   279,
+     0,     0,     0,     0,     0,     0,     0,     0,   472,   280,
+   163,     0,     0,   281,     0,     0,     0,     0,     0,     0,
+     0,     0,   166,     0,     0,     0,     0,     0,   282,   283,
+   284,   285,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   286,   287,     0,     0,     0,   288,     0,     0,
+     0,     0,   476,   477,   478,    27,    28,    29,    30,    31,
+    32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+    42,    43,    44,    45,     0,    46,    47,    48,    49,    50,
+    51,    52,    53,    54,    55,   110,    57,    58,    59,    60,
+     0,    61,     0,     0,   289,   290,     0,     0,     0,     0,
+     0,   291,     0,    64,     0,    66,    67,    68,    69,     0,
+     0,    71,    72,    73,    74,    75,     0,    76,    77,    78,
+   158,     0,     0,   159,     0,    21,     0,   278,   279,     0,
+     0,     0,     0,     0,     0,     0,     0,   472,   280,   163,
+     0,     0,   281,     0,     0,     0,     0,     0,     0,     0,
+     0,   166,     0,     0,     0,     0,     0,   282,   283,   284,
+   285,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,   286,   287,     0,     0,     0,   288,     0,     0,     0,
+     0,     0,     0,     0,    27,    28,    29,    30,    31,    32,
+    33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+    43,    44,    45,     0,    46,    47,    48,    49,    50,    51,
+    52,    53,    54,    55,   110,    57,    58,    59,    60,     0,
+    61,     0,     0,   289,   290,     0,     0,     0,     0,     0,
+   291,     0,    64,     0,    66,    67,    68,    69,     0,     0,
+    71,    72,    73,    74,    75,     0,    76,    77,    78,   158,
+     0,     0,   159,     0,    21,     0,     0,   160,   161,     0,
+   162,     0,     0,     0,     0,     0,    22,     0,   163,     0,
+     0,     0,   164,   165,     0,     0,     0,     0,     0,    64,
+   166,    66,     0,    68,    69,   167,     0,    71,    72,    73,
+    74,     0,     0,     0,    77,    78,     0,     0,     0,     0,
+     0,   168,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   169,    27,    28,    29,    30,    31,    32,    33,
+    34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+    44,    45,     0,    46,    47,    48,    49,    50,    51,    52,
+    53,    54,    55,   110,    57,    58,    59,    60,    21,    61,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    22,    64,     0,    66,    67,    68,    69,     0,     0,    71,
+    72,    73,    74,    75,     0,    76,    77,    78,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,    23,     0,
+    24,     0,     0,     0,     0,     0,    25,     0,     0,     0,
+     0,     0,    26,     0,     0,     0,     0,    27,    28,    29,
+    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+    40,    41,    42,    43,    44,    45,     0,    46,    47,    48,
+    49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+    59,    60,     0,    61,     0,     0,     0,     0,    62,     0,
+    21,     0,    63,     0,     3,    64,    65,    66,    67,    68,
+    69,    70,    22,    71,    72,    73,    74,    75,     0,    76,
+    77,    78,    79,    80,    81,    82,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    23,     0,    24,     0,     0,     0,     0,     0,    25,     0,
+     0,     0,     0,     0,    26,     0,     0,     0,     0,    27,
+    28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+    38,    39,    40,    41,    42,    43,    44,    45,     0,    46,
+    47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+    57,    58,    59,    60,    21,    61,     0,     0,     0,     0,
+    62,     0,     0,     0,    63,     0,    22,    64,    65,    66,
+    67,    68,    69,    70,     0,    71,    72,    73,    74,    75,
+     0,    76,    77,    78,    79,    80,    81,    82,     0,     0,
+     0,     0,     0,     0,     0,     0,    24,     0,     0,     0,
+     0,     0,    25,     0,     0,     0,     0,     0,    26,     0,
+     0,     0,     0,    27,    28,    29,    30,    31,    32,    33,
+    34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+    44,    45,     0,    46,    47,    48,    49,    50,    51,    52,
+    53,    54,    55,    56,    57,    58,    59,    60,     0,    61,
+     0,     0,     0,     0,     0,    21,     0,     0,    63,     0,
+     0,    64,    65,    66,    67,    68,    69,    22,     0,    71,
+    72,    73,    74,    75,     0,    76,    77,    78,    79,    80,
+    81,    82,   556,     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,    27,    28,    29,    30,    31,    32,
+    33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+    43,    44,    45,     0,    46,    47,    48,    49,    50,    51,
+    52,    53,    54,    55,   110,    57,    58,    59,    60,   438,
+    61,    21,     0,   356,   217,     0,     0,     0,     0,     0,
+     0,     0,    64,    22,    66,    67,    68,    69,   130,     0,
+    71,    72,    73,    74,    75,     0,    76,    77,    78,     0,
+    80,    81,    82,     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,
+    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+    37,    38,    39,    40,    41,    42,    43,    44,    45,     0,
+    46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+   110,    57,    58,    59,    60,   238,    61,    21,     0,   239,
+   217,     0,     0,     0,     0,     0,     0,     0,    64,    22,
+    66,    67,    68,    69,     0,     0,    71,    72,    73,    74,
+    75,   249,    76,    77,    78,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,    21,    61,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,    22,    64,     0,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,   249,    76,    77,
+    78,     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,   313,   314,     0,
+    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+    37,    38,    39,    40,    41,    42,    43,    44,    45,     0,
+    46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+   110,    57,    58,    59,    60,     0,    61,    21,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,    64,    22,
+    66,    67,    68,    69,     0,     0,    71,    72,    73,    74,
+    75,     0,    76,    77,    78,     0,   318,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,    21,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,    64,    22,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,   249,    76,    77,
+    78,     0,   322,     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,    27,    28,    29,    30,    31,    32,    33,    34,
+    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+    45,     0,    46,    47,    48,    49,    50,    51,    52,    53,
+    54,    55,   110,    57,    58,    59,    60,     0,    61,    21,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    64,    22,    66,    67,    68,    69,     0,     0,    71,    72,
+    73,    74,    75,   249,    76,    77,    78,     0,   429,     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,    27,    28,
+    29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+    39,    40,    41,    42,    43,    44,    45,     0,    46,    47,
+    48,    49,    50,    51,    52,    53,    54,    55,   110,    57,
+    58,    59,    60,     0,    61,    21,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,    64,    22,    66,    67,
+    68,    69,     0,     0,    71,    72,    73,    74,    75,   249,
+    76,    77,    78,     0,   511,     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,    27,    28,    29,    30,    31,    32,
+    33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+    43,    44,    45,     0,    46,    47,    48,    49,    50,    51,
+    52,    53,    54,    55,   110,    57,    58,    59,    60,    21,
+    61,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,    22,    64,     0,    66,    67,    68,    69,     0,     0,
+    71,    72,    73,    74,    75,   249,    76,    77,    78,     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,    27,    28,
+    29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+    39,    40,    41,    42,    43,    44,    45,     0,    46,    47,
+    48,    49,    50,    51,    52,    53,    54,    55,   110,    57,
+    58,    59,    60,    21,    61,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,    22,    64,     0,    66,    67,
+    68,    69,     0,     0,    71,    72,    73,    74,    75,   249,
+    76,    77,    78,     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,    27,    28,    29,    30,    31,    32,    33,    34,
+    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+    45,     0,    46,    47,    48,    49,    50,    51,    52,    53,
+    54,    55,   110,    57,    58,    59,    60,    21,    61,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,    22,
+    64,     0,    66,    67,    68,    69,     0,   266,    71,    72,
+    73,    74,    75,     0,    76,    77,    78,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,     0,     0,     0,     0,     0,    21,     0,
+     0,     0,     0,     0,    64,     0,    66,    67,    68,    69,
+    22,     0,    71,    72,    73,    74,    75,   435,    76,    77,
+    78,     0,     0,     0,     0,   457,     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,    27,    28,    29,
+    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+    40,    41,    42,    43,    44,    45,     0,    46,    47,    48,
+    49,    50,    51,    52,    53,    54,    55,   110,    57,    58,
+    59,    60,     0,    61,     0,     0,     0,     0,     0,    21,
+     0,     0,     0,     0,     0,    64,     0,    66,    67,    68,
+    69,    22,     0,    71,    72,    73,    74,    75,     0,    76,
+    77,    78,     0,     0,     0,     0,   459,     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,    27,    28,
+    29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+    39,    40,    41,    42,    43,    44,    45,     0,    46,    47,
+    48,    49,    50,    51,    52,    53,    54,    55,   110,    57,
+    58,    59,    60,    21,    61,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,    22,    64,     0,    66,    67,
+    68,    69,     0,     0,    71,    72,    73,    74,    75,     0,
+    76,    77,    78,     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,   565,    27,    28,    29,    30,    31,    32,    33,    34,
+    35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+    45,     0,    46,    47,    48,    49,    50,    51,    52,    53,
+    54,    55,   110,    57,    58,    59,    60,    21,    61,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,    22,
+    64,     0,    66,    67,    68,    69,     0,     0,    71,    72,
+    73,    74,    75,     0,    76,    77,    78,     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,    27,    28,    29,    30,
+    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+    41,    42,    43,    44,    45,     0,    46,    47,    48,    49,
+    50,    51,    52,    53,    54,    55,   110,    57,    58,    59,
+    60,     0,    61,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,    64,     0,    66,    67,    68,    69,
+     0,     0,    71,    72,    73,    74,    75,     0,    76,    77,
+    78,   158,     0,     0,   159,     0,     0,     0,   278,   279,
+     0,     0,     0,     0,     0,     0,     0,     0,     9,   280,
+   163,     0,     0,   281,     0,     0,     0,     0,   158,     0,
+     0,   159,   166,     0,   320,   278,   279,     0,   282,   283,
+   284,   285,     0,     0,     0,     9,   280,   163,     0,     0,
+   281,     0,   286,   287,     0,     0,     0,   288,     0,   166,
+     0,   379,     0,     0,     0,   282,   283,   284,   285,   158,
+     0,     0,   159,     0,     0,     0,   278,   279,     0,   286,
+   287,     0,     0,     0,   288,     0,     9,   280,   163,     0,
+     0,   281,     0,     0,     0,     0,     0,     0,     0,     0,
+   166,     0,   492,     0,   289,   290,   282,   283,   284,   285,
+     0,   291,     0,     0,     0,     0,     0,     0,     0,     0,
+   286,   287,     0,     0,     0,   288,   158,     0,     0,   159,
+     0,   289,   290,   278,   279,     0,     0,     0,   291,     0,
+     0,     0,     0,     9,   280,   163,     0,     0,   281,     0,
+     0,     0,     0,     0,     0,     0,     0,   166,     0,     0,
+     0,     0,     0,   282,   283,   284,   285,     0,     0,     0,
+     0,     0,   289,   290,     0,     0,     0,   286,   287,   291,
+     0,     0,   288,     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,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   289,
+   290,     0,     0,     0,     0,     0,   291
+};
+
+static const short yycheck[] = {    23,
+     4,     8,    21,   124,   119,    99,   142,   143,     2,     3,
+   308,   126,   214,   109,     8,   217,   299,    21,   184,    96,
+    24,   136,    16,   278,   199,   238,   239,   207,    57,    23,
+    16,    70,   287,   407,    14,   362,   294,   302,   303,   177,
+     7,    14,   565,   576,   234,   139,   148,   149,     4,     3,
+   216,    32,    60,   219,     7,    36,    24,   431,    10,    63,
+    99,    65,   595,   253,    32,   598,     4,    34,   591,   165,
+     6,     7,     8,    67,   332,    79,   109,   279,    51,    32,
+   119,    75,    76,    37,   617,   114,    90,   126,   462,   524,
+   228,   266,   294,   231,    98,   628,   104,   136,    10,    11,
+   139,    37,   196,   142,   143,   109,   208,   209,   210,   211,
+   104,     7,   395,    97,   108,    23,   551,   253,   445,   446,
+   124,    10,    11,   117,     7,    37,   222,    35,   383,     7,
+   110,   389,   165,   137,   138,   390,    32,    10,    11,   241,
+   236,   237,   355,   356,   409,    31,   401,   243,    37,    32,
+    33,    20,   526,    33,    32,     7,    25,   196,   413,    39,
+    46,   155,     7,   182,    37,   169,   243,   161,   124,   155,
+   164,     7,    14,   353,   213,   549,   550,   343,   182,   354,
+    32,   137,   138,   385,   386,   387,   124,    32,   609,   222,
+   611,     3,     6,     7,     8,    37,    32,   372,    10,   137,
+   138,    10,   317,   236,   237,   301,   489,    10,    11,    10,
+   243,   215,   619,    25,   253,   470,    25,     7,   222,   355,
+   356,    35,    62,   630,    25,   438,     3,   401,    40,    41,
+    42,    43,   236,   237,    35,   229,   230,   644,   340,   413,
+   342,     3,    32,    20,     6,    25,    20,     3,    25,    11,
+    12,    25,    14,     7,    10,     7,   358,   359,    20,    10,
+    22,   559,   464,    25,    26,    27,    43,   271,   272,    25,
+   274,   365,    34,   439,    25,   530,     7,    39,   317,   373,
+    32,    37,     3,     7,    40,    41,    42,    43,     7,    40,
+    41,    42,    43,    55,   374,    31,   376,    10,    11,    10,
+   396,   397,   438,    10,    11,    11,    12,    20,    32,    22,
+    21,     3,    25,    32,   569,     6,   355,   356,    10,   111,
+    26,    34,    28,    29,    30,    31,   365,    40,    41,    42,
+    43,   533,    38,    25,   373,   437,   538,     3,    10,    11,
+     7,    54,    32,   382,    10,    37,    59,    37,    40,    41,
+    42,    43,    10,   115,    10,   117,   111,   119,   120,    25,
+    97,   123,   124,   125,   126,    32,   655,   656,   130,   131,
+   374,    37,   376,    34,    40,    41,    42,    43,   667,    34,
+   669,    10,   386,   387,     6,    10,    11,    10,    10,    11,
+   592,    20,    20,   106,   107,   516,    25,    25,    20,   438,
+   113,     6,   646,    25,   606,    10,   400,    35,   402,   403,
+   612,   655,   656,   407,     3,    20,    24,     6,   670,   671,
+    25,    10,    11,   667,    32,   669,   670,   671,    36,   523,
+   434,    20,    21,    22,    23,   442,    25,   431,     3,     6,
+    10,     6,    27,    10,    11,    34,    35,    10,   442,    27,
+    32,    40,    41,    42,    43,    37,    32,    20,    25,   478,
+   575,    37,    25,    37,   558,    54,    55,     6,   462,    53,
+    59,    10,    11,    32,   478,    32,    32,    40,    41,    42,
+    43,    37,    32,    32,   523,    23,    24,    37,    37,   528,
+     3,    54,    27,     6,    32,    32,    59,    35,    11,    12,
+    37,    14,   580,    32,     6,   544,    35,   585,     7,    22,
+   142,   143,   516,    26,    75,    76,    33,   106,   107,   558,
+    20,    34,   236,   237,   113,   529,    39,   391,   392,    75,
+    76,    20,   526,    25,   538,    36,   575,    34,   111,   111,
+    34,   545,    27,   106,   107,     8,   110,   554,    32,    37,
+   113,   590,    20,    20,    32,   549,   550,    32,    37,     3,
+   554,   565,     6,    32,    10,    10,    10,    11,    10,    10,
+    31,    14,    10,     7,     7,    34,    20,    37,    22,    36,
+   619,    25,    37,    37,    36,     7,    37,   591,    27,    25,
+    34,   630,    27,     7,    31,   619,    40,    41,    42,    43,
+    27,    27,   606,    34,   643,   644,   630,   646,    27,    34,
+    54,   650,    35,    31,    27,    59,   655,   656,    58,   643,
+   644,    51,    37,   647,    31,    31,   650,    32,   667,    32,
+   669,   670,   671,     3,    10,    37,     6,    37,     8,    37,
+    10,    11,    37,    27,    26,    32,    34,    37,     7,    35,
+    20,    21,    22,    49,     7,    25,    60,    21,    37,    10,
+     7,    46,   106,   107,    34,     7,    47,    61,    34,   113,
+    40,    41,    42,    43,    52,    45,   105,    37,     7,     7,
+    48,    35,     7,    35,    54,    55,    10,    10,    33,    59,
+     7,    35,    25,    63,    64,    65,    66,    67,    68,    69,
+    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+    80,    81,    82,    83,    84,    85,     8,    87,    88,    89,
+    90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+   100,   101,     3,   103,    10,    10,   106,   107,     0,     0,
+    86,     1,   372,   113,   124,   115,     4,   117,   118,   119,
+   120,     4,   124,   123,   124,   125,   126,   127,   108,   129,
+   130,   131,     3,   124,   104,     6,   222,     8,   217,    10,
+    11,    11,    12,   237,   236,   460,   562,   590,   599,    20,
+    21,    22,    22,   606,    25,   213,    26,   622,    28,    29,
+    30,    31,   538,    34,    34,   272,   365,   355,    38,    40,
+    41,    42,    43,    44,   225,   528,   299,   165,   294,   305,
+   117,   243,    -1,    54,    55,    -1,    -1,    -1,    59,   243,
+    -1,    -1,    -1,    64,    65,    66,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,    -1,    -1,   106,   107,    -1,    -1,    -1,
+    -1,    -1,   113,    -1,   115,    -1,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,    -1,   129,   130,
+   131,     3,    -1,    -1,     6,    -1,     8,    -1,    10,    11,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,    21,
+    22,    -1,    -1,    25,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    34,    -1,    -1,    -1,    -1,    -1,    40,    41,
+    42,    43,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    54,    55,    -1,    -1,    -1,    59,    -1,    -1,
+    -1,    -1,    64,    65,    66,    67,    68,    69,    70,    71,
+    72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+    82,    83,    84,    85,    -1,    87,    88,    89,    90,    91,
+    92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
+    -1,   103,    -1,    -1,   106,   107,    -1,    -1,    -1,    -1,
+    -1,   113,    -1,   115,    -1,   117,   118,   119,   120,    -1,
+    -1,   123,   124,   125,   126,   127,    -1,   129,   130,   131,
+     3,    -1,    -1,     6,    -1,     8,    -1,    10,    11,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,    21,    22,
+    -1,    -1,    25,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    34,    -1,    -1,    -1,    -1,    -1,    40,    41,    42,
+    43,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    54,    55,    -1,    -1,    -1,    59,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    67,    68,    69,    70,    71,    72,
+    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+    83,    84,    85,    -1,    87,    88,    89,    90,    91,    92,
+    93,    94,    95,    96,    97,    98,    99,   100,   101,    -1,
+   103,    -1,    -1,   106,   107,    -1,    -1,    -1,    -1,    -1,
+   113,    -1,   115,    -1,   117,   118,   119,   120,    -1,    -1,
+   123,   124,   125,   126,   127,    -1,   129,   130,   131,     3,
+    -1,    -1,     6,    -1,     8,    -1,    -1,    11,    12,    -1,
+    14,    -1,    -1,    -1,    -1,    -1,    20,    -1,    22,    -1,
+    -1,    -1,    26,    27,    -1,    -1,    -1,    -1,    -1,   115,
+    34,   117,    -1,   119,   120,    39,    -1,   123,   124,   125,
+   126,    -1,    -1,    -1,   130,   131,    -1,    -1,    -1,    -1,
+    -1,    55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    66,    67,    68,    69,    70,    71,    72,    73,
+    74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+    84,    85,    -1,    87,    88,    89,    90,    91,    92,    93,
+    94,    95,    96,    97,    98,    99,   100,   101,     8,   103,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    20,   115,    -1,   117,   118,   119,   120,    -1,    -1,   123,
+   124,   125,   126,   127,    -1,   129,   130,   131,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,    -1,
+    50,    -1,    -1,    -1,    -1,    -1,    56,    -1,    -1,    -1,
+    -1,    -1,    62,    -1,    -1,    -1,    -1,    67,    68,    69,
+    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+    80,    81,    82,    83,    84,    85,    -1,    87,    88,    89,
+    90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+   100,   101,    -1,   103,    -1,    -1,    -1,    -1,   108,    -1,
+     8,    -1,   112,    -1,   114,   115,   116,   117,   118,   119,
+   120,   121,    20,   123,   124,   125,   126,   127,    -1,   129,
+   130,   131,   132,   133,   134,   135,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    48,    -1,    50,    -1,    -1,    -1,    -1,    -1,    56,    -1,
+    -1,    -1,    -1,    -1,    62,    -1,    -1,    -1,    -1,    67,
+    68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+    78,    79,    80,    81,    82,    83,    84,    85,    -1,    87,
+    88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+    98,    99,   100,   101,     8,   103,    -1,    -1,    -1,    -1,
+   108,    -1,    -1,    -1,   112,    -1,    20,   115,   116,   117,
+   118,   119,   120,   121,    -1,   123,   124,   125,   126,   127,
+    -1,   129,   130,   131,   132,   133,   134,   135,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    -1,    -1,
+    -1,    -1,    56,    -1,    -1,    -1,    -1,    -1,    62,    -1,
+    -1,    -1,    -1,    67,    68,    69,    70,    71,    72,    73,
+    74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+    84,    85,    -1,    87,    88,    89,    90,    91,    92,    93,
+    94,    95,    96,    97,    98,    99,   100,   101,    -1,   103,
+    -1,    -1,    -1,    -1,    -1,     8,    -1,    -1,   112,    -1,
+    -1,   115,   116,   117,   118,   119,   120,    20,    -1,   123,
+   124,   125,   126,   127,    -1,   129,   130,   131,   132,   133,
+   134,   135,    35,    -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,    67,    68,    69,    70,    71,    72,
+    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+    83,    84,    85,    -1,    87,    88,    89,    90,    91,    92,
+    93,    94,    95,    96,    97,    98,    99,   100,   101,     6,
+   103,     8,    -1,    10,    11,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,   115,    20,   117,   118,   119,   120,    25,    -1,
+   123,   124,   125,   126,   127,    -1,   129,   130,   131,    -1,
+   133,   134,   135,    -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,
+    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+    77,    78,    79,    80,    81,    82,    83,    84,    85,    -1,
+    87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+    97,    98,    99,   100,   101,     6,   103,     8,    -1,    10,
+    11,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   115,    20,
+   117,   118,   119,   120,    -1,    -1,   123,   124,   125,   126,
+   127,   128,   129,   130,   131,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,     8,   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    20,   115,    -1,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,   128,   129,   130,
+   131,    -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,    64,    65,    -1,
+    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+    77,    78,    79,    80,    81,    82,    83,    84,    85,    -1,
+    87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+    97,    98,    99,   100,   101,    -1,   103,     8,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   115,    20,
+   117,   118,   119,   120,    -1,    -1,   123,   124,   125,   126,
+   127,    -1,   129,   130,   131,    -1,    37,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,     8,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   115,    20,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,   128,   129,   130,
+   131,    -1,    37,    -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,    67,    68,    69,    70,    71,    72,    73,    74,
+    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+    85,    -1,    87,    88,    89,    90,    91,    92,    93,    94,
+    95,    96,    97,    98,    99,   100,   101,    -1,   103,     8,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+   115,    20,   117,   118,   119,   120,    -1,    -1,   123,   124,
+   125,   126,   127,   128,   129,   130,   131,    -1,    37,    -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,    67,    68,
+    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+    79,    80,    81,    82,    83,    84,    85,    -1,    87,    88,
+    89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+    99,   100,   101,    -1,   103,     8,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,   115,    20,   117,   118,
+   119,   120,    -1,    -1,   123,   124,   125,   126,   127,   128,
+   129,   130,   131,    -1,    37,    -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,    67,    68,    69,    70,    71,    72,
+    73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+    83,    84,    85,    -1,    87,    88,    89,    90,    91,    92,
+    93,    94,    95,    96,    97,    98,    99,   100,   101,     8,
+   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    20,   115,    -1,   117,   118,   119,   120,    -1,    -1,
+   123,   124,   125,   126,   127,   128,   129,   130,   131,    -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,    67,    68,
+    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+    79,    80,    81,    82,    83,    84,    85,    -1,    87,    88,
+    89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+    99,   100,   101,     8,   103,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    20,   115,    -1,   117,   118,
+   119,   120,    -1,    -1,   123,   124,   125,   126,   127,   128,
+   129,   130,   131,    -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,    67,    68,    69,    70,    71,    72,    73,    74,
+    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+    85,    -1,    87,    88,    89,    90,    91,    92,    93,    94,
+    95,    96,    97,    98,    99,   100,   101,     8,   103,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,
+   115,    -1,   117,   118,   119,   120,    -1,   122,   123,   124,
+   125,   126,   127,    -1,   129,   130,   131,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,    -1,    -1,    -1,    -1,    -1,     8,    -1,
+    -1,    -1,    -1,    -1,   115,    -1,   117,   118,   119,   120,
+    20,    -1,   123,   124,   125,   126,   127,   128,   129,   130,
+   131,    -1,    -1,    -1,    -1,    35,    -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,    67,    68,    69,
+    70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+    80,    81,    82,    83,    84,    85,    -1,    87,    88,    89,
+    90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+   100,   101,    -1,   103,    -1,    -1,    -1,    -1,    -1,     8,
+    -1,    -1,    -1,    -1,    -1,   115,    -1,   117,   118,   119,
+   120,    20,    -1,   123,   124,   125,   126,   127,    -1,   129,
+   130,   131,    -1,    -1,    -1,    -1,    35,    -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,    67,    68,
+    69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+    79,    80,    81,    82,    83,    84,    85,    -1,    87,    88,
+    89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+    99,   100,   101,     8,   103,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    20,   115,    -1,   117,   118,
+   119,   120,    -1,    -1,   123,   124,   125,   126,   127,    -1,
+   129,   130,   131,    -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,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+    75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+    85,    -1,    87,    88,    89,    90,    91,    92,    93,    94,
+    95,    96,    97,    98,    99,   100,   101,     8,   103,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,
+   115,    -1,   117,   118,   119,   120,    -1,    -1,   123,   124,
+   125,   126,   127,    -1,   129,   130,   131,    -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,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+    81,    82,    83,    84,    85,    -1,    87,    88,    89,    90,
+    91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+   101,    -1,   103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   115,    -1,   117,   118,   119,   120,
+    -1,    -1,   123,   124,   125,   126,   127,    -1,   129,   130,
+   131,     3,    -1,    -1,     6,    -1,    -1,    -1,    10,    11,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,    21,
+    22,    -1,    -1,    25,    -1,    -1,    -1,    -1,     3,    -1,
+    -1,     6,    34,    -1,    36,    10,    11,    -1,    40,    41,
+    42,    43,    -1,    -1,    -1,    20,    21,    22,    -1,    -1,
+    25,    -1,    54,    55,    -1,    -1,    -1,    59,    -1,    34,
+    -1,    36,    -1,    -1,    -1,    40,    41,    42,    43,     3,
+    -1,    -1,     6,    -1,    -1,    -1,    10,    11,    -1,    54,
+    55,    -1,    -1,    -1,    59,    -1,    20,    21,    22,    -1,
+    -1,    25,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    34,    -1,    36,    -1,   106,   107,    40,    41,    42,    43,
+    -1,   113,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    54,    55,    -1,    -1,    -1,    59,     3,    -1,    -1,     6,
+    -1,   106,   107,    10,    11,    -1,    -1,    -1,   113,    -1,
+    -1,    -1,    -1,    20,    21,    22,    -1,    -1,    25,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    34,    -1,    -1,
+    -1,    -1,    -1,    40,    41,    42,    43,    -1,    -1,    -1,
+    -1,    -1,   106,   107,    -1,    -1,    -1,    54,    55,   113,
+    -1,    -1,    59,    -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,   106,
+   107,    -1,    -1,    -1,    -1,    -1,   113
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/lib/bison.simple"
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+#ifndef alloca
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
+#include 
+#else /* not sparc */
+#if defined (MSDOS) && !defined (__TURBOC__)
+#include 
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+#include 
+ #pragma alloca
+#else /* not MSDOS, __TURBOC__, or _AIX */
+#ifdef __hpux
+#ifdef __cplusplus
+extern "C" {
+void *alloca (unsigned int);
+};
+#else /* not __cplusplus */
+void *alloca ();
+#endif /* not __cplusplus */
+#endif /* __hpux */
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc.  */
+#endif /* not GNU C.  */
+#endif /* alloca not defined.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		-2
+#define YYEOF		0
+#define YYACCEPT	return(0)
+#define YYABORT 	return(1)
+#define YYERROR		goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL		goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    { yychar = (token), yylval = (value);			\
+      yychar1 = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    { yyerror ("syntax error: cannot back up"); YYERROR; }	\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+#ifndef YYPURE
+#define YYLEX		yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int	yychar;			/*  the lookahead symbol		*/
+YYSTYPE	yylval;			/*  the semantic value of the		*/
+				/*  lookahead symbol			*/
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;			/*  location data for the lookahead	*/
+				/*  symbol				*/
+#endif
+
+int yynerrs;			/*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug;			/*  nonzero means print parse trace	*/
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
+
+#ifndef	YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+int yyparse (void);
+#endif
+
+#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
+#define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
+#else				/* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (to, from, count)
+     char *to;
+     char *from;
+     int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (char *to, char *from, int count)
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 196 "/usr/lib/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
+  int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */
+
+  short	yyssa[YYINITDEPTH];	/*  the state stack			*/
+  YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/
+
+  short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+
+#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+
+#ifdef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;		/*  the variable used to return		*/
+				/*  semantic values from the action	*/
+				/*  routines				*/
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+	 the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+	 but that might be undefined if yyoverflow is a macro.  */
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yyls1, size * sizeof (*yylsp),
+		 &yystacksize);
+#else
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yystacksize);
+#endif
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+	{
+	  yyerror("parser stack overflow");
+	  return 2;
+	}
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+	yystacksize = YYMAXDEPTH;
+      yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+      __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
+      yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+      __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+      __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+	YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+  goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)		/* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;		/* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+	{
+	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+	  /* Give the individual parser a way to print the precise meaning
+	     of a token, for further debugging info.  */
+#ifdef YYPRINT
+	  YYPRINT (stderr, yychar, yylval);
+#endif
+	  fprintf (stderr, ")\n");
+	}
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  if (yylen > 0)
+    yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+	       yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 1:
+#line 372 "llgrammar.y"
+{ lhExternals (yyvsp[0].interfacelist); ;
+    break;}
+case 2:
+#line 373 "llgrammar.y"
+{ interfaceNodeList_free (yyvsp[-2].interfacelist); interfaceNodeList_free (yyvsp[0].interfacelist); ;
+    break;}
+case 3:
+#line 376 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_new (); ;
+    break;}
+case 4:
+#line 377 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_addh (yyvsp[-1].interfacelist, yyvsp[0].iface);;
+    break;}
+case 7:
+#line 384 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_new (); ;
+    break;}
+case 8:
+#line 385 "llgrammar.y"
+{ yyval.interfacelist = consInterfaceNode (yyvsp[-1].iface, yyvsp[0].interfacelist);;
+    break;}
+case 9:
+#line 386 "llgrammar.y"
+{ yyval.interfacelist = consInterfaceNode (yyvsp[-1].iface, yyvsp[0].interfacelist);;
+    break;}
+case 10:
+#line 389 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_new (); ;
+    break;}
+case 11:
+#line 390 "llgrammar.y"
+{ yyval.interfacelist = interfaceNodeList_addh (yyvsp[-1].interfacelist, yyvsp[0].iface);;
+    break;}
+case 15:
+#line 399 "llgrammar.y"
+{ yyval.iface = makeInterfaceNodeImports (yyvsp[-1].importlist);
+     /* assume subspecs are already processed, symbol table info in external file */
+   ;
+    break;}
+case 16:
+#line 405 "llgrammar.y"
+{ yyval.iface = makeInterfaceNodeUses (yyvsp[-1].traitreflist); readlsignatures (yyval.iface);;
+    break;}
+case 17:
+#line 409 "llgrammar.y"
+{ declareConstant (yyvsp[0].constdeclaration); yyval.iface = interfaceNode_makeConst (yyvsp[0].constdeclaration); ;
+    break;}
+case 18:
+#line 411 "llgrammar.y"
+{ declareVar (yyvsp[0].vardeclaration); yyval.iface = interfaceNode_makeVar (yyvsp[0].vardeclaration); ;
+    break;}
+case 19:
+#line 413 "llgrammar.y"
+{ declareType (yyvsp[0].type); yyval.iface = interfaceNode_makeType (yyvsp[0].type); ;
+    break;}
+case 20:
+#line 415 "llgrammar.y"
+{ declareFcn (yyvsp[0].fcn, typeId_invalid); yyval.iface = interfaceNode_makeFcn (yyvsp[0].fcn); ;
+    break;}
+case 21:
+#line 417 "llgrammar.y"
+{ yyval.iface = interfaceNode_makeClaim (yyvsp[0].claim); ;
+    break;}
+case 22:
+#line 419 "llgrammar.y"
+{ declareIter (yyvsp[0].iter); yyval.iface = interfaceNode_makeIter (yyvsp[0].iter); ;
+    break;}
+case 23:
+#line 423 "llgrammar.y"
+{ yyval.iter = makeIterNode (yyvsp[-4].ltok, yyvsp[-2].paramlist); ;
+    break;}
+case 24:
+#line 426 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_new (); ;
+    break;}
+case 25:
+#line 427 "llgrammar.y"
+{ yyval.paramlist = yyvsp[0].paramlist; ;
+    break;}
+case 26:
+#line 431 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (paramNodeList_new (), yyvsp[0].param); ;
+    break;}
+case 27:
+#line 433 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (yyvsp[-2].paramlist,yyvsp[0].param); ;
+    break;}
+case 28:
+#line 436 "llgrammar.y"
+{ yyval.param = markYieldParamNode (yyvsp[0].param); ;
+    break;}
+case 29:
+#line 437 "llgrammar.y"
+{ yyval.param = yyvsp[0].param; ;
+    break;}
+case 30:
+#line 440 "llgrammar.y"
+{ symtable_export (g_symtab, FALSE); ;
+    break;}
+case 31:
+#line 441 "llgrammar.y"
+{ yyval.iface = yyvsp[0].iface; symtable_export (g_symtab, TRUE); ;
+    break;}
+case 32:
+#line 445 "llgrammar.y"
+{ declarePrivConstant (yyvsp[0].constdeclaration); yyval.iface =  interfaceNode_makePrivConst (yyvsp[0].constdeclaration); ;
+    break;}
+case 33:
+#line 447 "llgrammar.y"
+{ declarePrivVar (yyvsp[0].vardeclaration); yyval.iface = interfaceNode_makePrivVar (yyvsp[0].vardeclaration); ;
+    break;}
+case 34:
+#line 449 "llgrammar.y"
+{ declarePrivType (yyvsp[0].type); yyval.iface = interfaceNode_makePrivType (yyvsp[0].type); ;
+    break;}
+case 35:
+#line 451 "llgrammar.y"
+{ declarePrivFcn (yyvsp[0].fcn, typeId_invalid); yyval.iface = interfaceNode_makePrivFcn (yyvsp[0].fcn); ;
+    break;}
+case 36:
+#line 455 "llgrammar.y"
+{ yyval.constdeclaration = makeConstDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls); ;
+    break;}
+case 37:
+#line 459 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, FALSE); yyval.vardeclaration->qualifier = QLF_NONE; ;
+    break;}
+case 38:
+#line 461 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, FALSE); yyval.vardeclaration->qualifier = QLF_CONST; ;
+    break;}
+case 39:
+#line 463 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, FALSE); yyval.vardeclaration->qualifier = QLF_VOLATILE; ;
+    break;}
+case 40:
+#line 466 "llgrammar.y"
+{ yyval.type = makeAbstractTypeNode (yyvsp[0].abstract); ;
+    break;}
+case 41:
+#line 467 "llgrammar.y"
+{ yyval.type = makeExposedTypeNode (yyvsp[0].exposed); ;
+    break;}
+case 42:
+#line 470 "llgrammar.y"
+{ yyval.typequal = qual_createPrintfLike (); ;
+    break;}
+case 43:
+#line 471 "llgrammar.y"
+{ yyval.typequal = qual_createScanfLike (); ;
+    break;}
+case 44:
+#line 472 "llgrammar.y"
+{ yyval.typequal = qual_createMessageLike (); ;
+    break;}
+case 45:
+#line 475 "llgrammar.y"
+{ enteringFcnScope (yyvsp[-2].lcltypespec, yyvsp[-1].declare, yyvsp[0].globals); ;
+    break;}
+case 46:
+#line 477 "llgrammar.y"
+{ yyval.fcn = makeFcnNode (qual_createUnknown (), yyvsp[-12].lcltypespec, yyvsp[-11].declare, yyvsp[-10].globals, yyvsp[-7].vardeclarationlist, yyvsp[-6].letdecls, 
+		       yyvsp[-5].lclpredicate, yyvsp[-4].lclpredicate, yyvsp[-3].modify, yyvsp[-2].lclpredicate, yyvsp[-1].lclpredicate); 
+     /* type, declarator, glovbls, privateinits,
+	lets, checks, requires, modifies, ensures, claims */
+     symtable_exitScope (g_symtab);
+   ;
+    break;}
+case 47:
+#line 483 "llgrammar.y"
+{ enteringFcnScope (yyvsp[-2].lcltypespec, yyvsp[-1].declare, yyvsp[0].globals); ;
+    break;}
+case 48:
+#line 487 "llgrammar.y"
+{ yyval.fcn = makeFcnNode (yyvsp[-13].typequal, yyvsp[-12].lcltypespec, yyvsp[-11].declare, yyvsp[-10].globals, yyvsp[-7].vardeclarationlist, 
+		       yyvsp[-6].letdecls, yyvsp[-5].lclpredicate, yyvsp[-4].lclpredicate, yyvsp[-3].modify, yyvsp[-2].lclpredicate, yyvsp[-1].lclpredicate); 
+     /* type, declarator, glovbls, privateinits,
+	lets, checks, requires, modifies, ensures, claims */
+     symtable_exitScope (g_symtab);
+   ;
+    break;}
+case 49:
+#line 497 "llgrammar.y"
+{ enteringClaimScope (yyvsp[-2].paramlist, yyvsp[0].globals); ;
+    break;}
+case 50:
+#line 499 "llgrammar.y"
+{      yyval.claim = makeClaimNode (yyvsp[-11].ltok, yyvsp[-9].paramlist, yyvsp[-7].globals, yyvsp[-4].letdecls, yyvsp[-3].lclpredicate, yyvsp[-2].program, yyvsp[-1].lclpredicate); 
+     symtable_exitScope (g_symtab); ;
+    break;}
+case 51:
+#line 502 "llgrammar.y"
+{ yyval.claim = (claimNode) 0; ;
+    break;}
+case 52:
+#line 505 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 53:
+#line 505 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 54:
+#line 506 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-5].ltok, yyvsp[-2].ltok, TRUE, FALSE, yyvsp[0].abstbody); ;
+    break;}
+case 55:
+#line 507 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 56:
+#line 508 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 57:
+#line 509 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-6].ltok, yyvsp[-2].ltok, TRUE, TRUE, yyvsp[0].abstbody); ;
+    break;}
+case 58:
+#line 510 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 59:
+#line 511 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 60:
+#line 512 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-5].ltok, yyvsp[-2].ltok, TRUE, TRUE, yyvsp[0].abstbody); ;
+    break;}
+case 61:
+#line 513 "llgrammar.y"
+{g_inTypeDef = TRUE; ;
+    break;}
+case 62:
+#line 513 "llgrammar.y"
+{g_inTypeDef = FALSE; ;
+    break;}
+case 63:
+#line 514 "llgrammar.y"
+{ yyval.abstract = makeAbstractNode (yyvsp[-5].ltok, yyvsp[-2].ltok, FALSE, FALSE, yyvsp[0].abstbody); ;
+    break;}
+case 64:
+#line 517 "llgrammar.y"
+{ g_inTypeDef = TRUE; setExposedType (yyvsp[0].lcltypespec); ;
+    break;}
+case 65:
+#line 518 "llgrammar.y"
+{ g_inTypeDef = FALSE; ;
+    break;}
+case 66:
+#line 519 "llgrammar.y"
+{ yyval.exposed = makeExposedNode (yyvsp[-5].ltok, yyvsp[-4].lcltypespec, yyvsp[-2].declaratorinvs); /* to support mutually recursive types */ ;
+    break;}
+case 67:
+#line 521 "llgrammar.y"
+{ yyval.exposed = makeExposedNode (yyvsp[0].ltok, makeLclTypeSpecNodeSU (yyvsp[-1].structorunion), declaratorInvNodeList_new ()); ;
+    break;}
+case 68:
+#line 523 "llgrammar.y"
+{ yyval.exposed = makeExposedNode (yyvsp[0].ltok, makeLclTypeSpecNodeEnum (yyvsp[-1].enumspec), declaratorInvNodeList_new ()); ;
+    break;}
+case 69:
+#line 539 "llgrammar.y"
+{ yyval.importlist = importNodeList_add (importNodeList_new (), yyvsp[0].import); ;
+    break;}
+case 70:
+#line 541 "llgrammar.y"
+{ yyval.importlist = importNodeList_add (yyvsp[-2].importlist, yyvsp[0].import); ;
+    break;}
+case 71:
+#line 544 "llgrammar.y"
+{ yyval.import = importNode_makePlain (yyvsp[0].ltok); ;
+    break;}
+case 72:
+#line 546 "llgrammar.y"
+{ checkBrackets (yyvsp[-2].ltok, yyvsp[0].ltok); yyval.import = importNode_makeBracketed (yyvsp[-1].ltok); ;
+    break;}
+case 73:
+#line 547 "llgrammar.y"
+{ yyval.import = importNode_makeQuoted (yyvsp[0].ltok); ;
+    break;}
+case 74:
+#line 550 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 75:
+#line 551 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 77:
+#line 559 "llgrammar.y"
+{ yyval.traitreflist = traitRefNodeList_add (traitRefNodeList_new (), yyvsp[0].traitref); ;
+    break;}
+case 78:
+#line 561 "llgrammar.y"
+{ yyval.traitreflist = traitRefNodeList_add (yyvsp[-2].traitreflist, yyvsp[0].traitref); ;
+    break;}
+case 79:
+#line 565 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (ltokenList_singleton (yyvsp[0].ltok), (renamingNode)0); ;
+    break;}
+case 80:
+#line 567 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (ltokenList_singleton (yyvsp[-3].ltok), yyvsp[-1].renaming); ;
+    break;}
+case 81:
+#line 569 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (yyvsp[-1].ltokenList, (renamingNode)0); ;
+    break;}
+case 82:
+#line 571 "llgrammar.y"
+{ yyval.traitref = makeTraitRefNode (yyvsp[-4].ltokenList, yyvsp[-1].renaming); ;
+    break;}
+case 83:
+#line 574 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 84:
+#line 575 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 85:
+#line 579 "llgrammar.y"
+{ yyval.renaming = makeRenamingNode (typeNameNodeList_new (), yyvsp[0].replacelist); ;
+    break;}
+case 86:
+#line 581 "llgrammar.y"
+{ yyval.renaming = makeRenamingNode (yyvsp[0].namelist, replaceNodeList_new ()); ;
+    break;}
+case 87:
+#line 582 "llgrammar.y"
+{ yyval.renaming = makeRenamingNode (yyvsp[-2].namelist, yyvsp[0].replacelist); ;
+    break;}
+case 88:
+#line 586 "llgrammar.y"
+{ yyval.namelist = typeNameNodeList_add (typeNameNodeList_new (), yyvsp[0].typname); ;
+    break;}
+case 89:
+#line 587 "llgrammar.y"
+{ yyval.namelist = typeNameNodeList_add (yyvsp[-2].namelist, yyvsp[0].typname); ;
+    break;}
+case 90:
+#line 591 "llgrammar.y"
+{ yyval.replacelist = replaceNodeList_add (replaceNodeList_new (), yyvsp[0].replace); ;
+    break;}
+case 91:
+#line 592 "llgrammar.y"
+{ yyval.replacelist = replaceNodeList_add (yyvsp[-2].replacelist, yyvsp[0].replace); ;
+    break;}
+case 92:
+#line 595 "llgrammar.y"
+{ yyval.replace = makeReplaceNode (yyvsp[-1].ltok, yyvsp[-2].typname, TRUE, yyvsp[0].ltok, NULL, NULL); ;
+    break;}
+case 93:
+#line 596 "llgrammar.y"
+{ yyval.replace = makeReplaceNameNode (yyvsp[-1].ltok, yyvsp[-2].typname, yyvsp[0].name); ;
+    break;}
+case 94:
+#line 597 "llgrammar.y"
+{ yyval.replace = makeReplaceNode (yyvsp[-2].ltok, yyvsp[-3].typname, FALSE, ltoken_undefined,
+							 yyvsp[-1].name, yyvsp[0].signature); ;
+    break;}
+case 95:
+#line 601 "llgrammar.y"
+{ yyval.name = makeNameNodeId (yyvsp[0].ltok); ;
+    break;}
+case 96:
+#line 602 "llgrammar.y"
+{ yyval.name = makeNameNodeForm (yyvsp[0].opform); ;
+    break;}
+case 99:
+#line 610 "llgrammar.y"
+{ yyval.initdecls = initDeclNodeList_add (initDeclNodeList_new (), yyvsp[0].initdecl); ;
+    break;}
+case 100:
+#line 612 "llgrammar.y"
+{ yyval.initdecls = initDeclNodeList_add (yyvsp[-2].initdecls, yyvsp[0].initdecl); ;
+    break;}
+case 101:
+#line 615 "llgrammar.y"
+{ yyval.initdecl = makeInitDeclNode (yyvsp[0].declare, (termNode)0); ;
+    break;}
+case 102:
+#line 616 "llgrammar.y"
+{ yyval.initdecl = makeInitDeclNode (yyvsp[-2].declare, yyvsp[0].term); ;
+    break;}
+case 103:
+#line 620 "llgrammar.y"
+{ yyval.globals = varDeclarationNodeList_new (); ;
+    break;}
+case 104:
+#line 622 "llgrammar.y"
+{ varDeclarationNodeList_addh (yyvsp[-1].globals, yyvsp[0].vardeclaration); yyval.globals = yyvsp[-1].globals; ;
+    break;}
+case 105:
+#line 625 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, TRUE, FALSE); ;
+    break;}
+case 106:
+#line 626 "llgrammar.y"
+{ yyval.vardeclaration = makeInternalStateNode (); ;
+    break;}
+case 107:
+#line 627 "llgrammar.y"
+{ yyval.vardeclaration = makeFileSystemNode (); ;
+    break;}
+case 108:
+#line 630 "llgrammar.y"
+{ yyval.vardeclarationlist = varDeclarationNodeList_new (); ;
+    break;}
+case 109:
+#line 631 "llgrammar.y"
+{ varDeclarationNodeList_addh (yyvsp[-1].vardeclarationlist, yyvsp[0].vardeclaration); yyval.vardeclarationlist = yyvsp[-1].vardeclarationlist; ;
+    break;}
+case 110:
+#line 635 "llgrammar.y"
+{ yyval.vardeclaration = makeVarDeclarationNode (yyvsp[-2].lcltypespec, yyvsp[-1].initdecls, FALSE, TRUE); ;
+    break;}
+case 111:
+#line 638 "llgrammar.y"
+{ yyval.letdecls = letDeclNodeList_new (); ;
+    break;}
+case 112:
+#line 639 "llgrammar.y"
+{ yyval.letdecls = yyvsp[-1].letdecls; ;
+    break;}
+case 113:
+#line 642 "llgrammar.y"
+{ yyval.letdecls = letDeclNodeList_add (letDeclNodeList_new (), yyvsp[0].letdecl); ;
+    break;}
+case 114:
+#line 643 "llgrammar.y"
+{ yyval.letdecls = letDeclNodeList_add (yyvsp[-2].letdecls, yyvsp[0].letdecl); ;
+    break;}
+case 115:
+#line 646 "llgrammar.y"
+{ yyval.letdecl = makeLetDeclNode (yyvsp[-4].ltok, yyvsp[-2].lcltypespec, yyvsp[0].term); ;
+    break;}
+case 116:
+#line 647 "llgrammar.y"
+{ yyval.letdecl = makeLetDeclNode (yyvsp[-2].ltok, (lclTypeSpecNode)0, yyvsp[0].term); ;
+    break;}
+case 118:
+#line 652 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 119:
+#line 653 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeChecksNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); ;
+    break;}
+case 120:
+#line 656 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 121:
+#line 657 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeRequiresNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate);;
+    break;}
+case 122:
+#line 660 "llgrammar.y"
+{ yyval.modify = (modifyNode)0; ;
+    break;}
+case 123:
+#line 661 "llgrammar.y"
+{ yyval.modify = makeModifyNodeSpecial (yyvsp[-2].ltok, TRUE); ;
+    break;}
+case 124:
+#line 662 "llgrammar.y"
+{ yyval.modify = makeModifyNodeSpecial (yyvsp[-2].ltok, FALSE); ;
+    break;}
+case 125:
+#line 663 "llgrammar.y"
+{ yyval.modify = makeModifyNodeRef (yyvsp[-2].ltok, yyvsp[-1].storereflist); ;
+    break;}
+case 126:
+#line 666 "llgrammar.y"
+{ yyval.storereflist = storeRefNodeList_add (storeRefNodeList_new (), yyvsp[0].storeref); ;
+    break;}
+case 127:
+#line 667 "llgrammar.y"
+{ yyval.storereflist = storeRefNodeList_add (yyvsp[-2].storereflist, yyvsp[0].storeref); ;
+    break;}
+case 128:
+#line 670 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeTerm (yyvsp[0].term); ;
+    break;}
+case 129:
+#line 671 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeType (yyvsp[0].lcltypespec, FALSE); ;
+    break;}
+case 130:
+#line 672 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeType (yyvsp[0].lcltypespec, TRUE); ;
+    break;}
+case 131:
+#line 673 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeInternal (); ;
+    break;}
+case 132:
+#line 674 "llgrammar.y"
+{ yyval.storeref = makeStoreRefNodeSystem (); ;
+    break;}
+case 133:
+#line 677 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 134:
+#line 678 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeEnsuresNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate);;
+    break;}
+case 135:
+#line 681 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 136:
+#line 682 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.lclpredicate = makeIntraClaimNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate);;
+    break;}
+case 137:
+#line 685 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_new (); ;
+    break;}
+case 138:
+#line 686 "llgrammar.y"
+{ yyval.paramlist = yyvsp[0].paramlist; ;
+    break;}
+case 140:
+#line 690 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (paramNodeList_new (), paramNode_elipsis ()); ;
+    break;}
+case 141:
+#line 691 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (yyvsp[-2].paramlist, paramNode_elipsis ()); ;
+    break;}
+case 142:
+#line 694 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_single (yyvsp[0].param); ;
+    break;}
+case 143:
+#line 695 "llgrammar.y"
+{ yyval.paramlist = paramNodeList_add (yyvsp[-2].paramlist, yyvsp[0].param); ;
+    break;}
+case 144:
+#line 698 "llgrammar.y"
+{ yyval.program = (programNode)0; ;
+    break;}
+case 145:
+#line 699 "llgrammar.y"
+{ yyval.program = yyvsp[-1].program; ;
+    break;}
+case 146:
+#line 700 "llgrammar.y"
+{ yyval.program = yyvsp[-2].program; ;
+    break;}
+case 147:
+#line 703 "llgrammar.y"
+{ yyval.program = makeProgramNode (yyvsp[0].stmt); ;
+    break;}
+case 148:
+#line 706 "llgrammar.y"
+{ yyval.program = yyvsp[-1].program; yyval.program->wrapped = yyval.program->wrapped + 1; ;
+    break;}
+case 149:
+#line 708 "llgrammar.y"
+{ programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, yyvsp[-1].program);
+     yyval.program = makeProgramNodeAction (x, ACT_ITER); 
+   ;
+    break;}
+case 150:
+#line 713 "llgrammar.y"
+{ programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, yyvsp[-2].program);
+     programNodeList_addh (x, yyvsp[0].program);
+     yyval.program = makeProgramNodeAction (x, ACT_ALTERNATE); 
+   ;
+    break;}
+case 151:
+#line 719 "llgrammar.y"
+{ programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, yyvsp[-2].program);
+     programNodeList_addh (x, yyvsp[0].program);
+     yyval.program = makeProgramNodeAction (x, ACT_SEQUENCE); 
+   ;
+    break;}
+case 152:
+#line 727 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (ltoken_undefined, yyvsp[-3].ltok, yyvsp[-1].termlist); ;
+    break;}
+case 153:
+#line 729 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (ltoken_undefined, yyvsp[-2].ltok, termNodeList_new ()); ;
+    break;}
+case 154:
+#line 731 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (yyvsp[-4].ltok, yyvsp[-2].ltok, termNodeList_new ()); ;
+    break;}
+case 155:
+#line 733 "llgrammar.y"
+{ yyval.stmt = makeStmtNode (yyvsp[-5].ltok, yyvsp[-3].ltok, yyvsp[-1].termlist); ;
+    break;}
+case 156:
+#line 736 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (termNodeList_new (), yyvsp[0].term); ;
+    break;}
+case 157:
+#line 737 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (yyvsp[-2].termlist, yyvsp[0].term); ;
+    break;}
+case 159:
+#line 741 "llgrammar.y"
+{ yyval.term = makeSimpleTermNode (yyvsp[0].ltok); ;
+    break;}
+case 160:
+#line 742 "llgrammar.y"
+{ yyval.term = makePrefixTermNode (yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 161:
+#line 743 "llgrammar.y"
+{ yyval.term = makePostfixTermNode2 (yyvsp[-1].term, yyvsp[0].ltok); ;
+    break;}
+case 162:
+#line 744 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 163:
+#line 745 "llgrammar.y"
+{ yyval.term = yyvsp[-1].term; yyval.term->wrapped = yyval.term->wrapped + 1; ;
+    break;}
+case 164:
+#line 747 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-2].ltok, yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok); ;
+    break;}
+case 165:
+#line 749 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 166:
+#line 752 "llgrammar.y"
+{ yyval.abstbody = (abstBodyNode)0; ;
+    break;}
+case 167:
+#line 753 "llgrammar.y"
+{ yyval.abstbody = makeAbstBodyNode (yyvsp[-2].ltok, yyvsp[-1].fcns); ;
+    break;}
+case 168:
+#line 754 "llgrammar.y"
+{ yyval.abstbody = makeAbstBodyNode2 (yyvsp[-3].ltok, yyvsp[-2].ltokenList); ;
+    break;}
+case 169:
+#line 755 "llgrammar.y"
+{ yyval.abstbody = (abstBodyNode)0; ;
+    break;}
+case 170:
+#line 758 "llgrammar.y"
+{ yyval.fcns = fcnNodeList_new (); ;
+    break;}
+case 171:
+#line 759 "llgrammar.y"
+{ yyval.fcns = fcnNodeList_add (yyvsp[-1].fcns, yyvsp[0].fcn); ;
+    break;}
+case 172:
+#line 762 "llgrammar.y"
+{ yyval.lclpredicate = (lclPredicateNode)0; ;
+    break;}
+case 174:
+#line 766 "llgrammar.y"
+{ g_inTypeDef = FALSE; ;
+    break;}
+case 175:
+#line 767 "llgrammar.y"
+{ yyvsp[-1].lclpredicate->tok = yyvsp[-5].ltok; yyvsp[-1].lclpredicate->kind = LPD_CONSTRAINT;
+     checkLclPredicate (yyvsp[-5].ltok, yyvsp[-1].lclpredicate);
+     yyval.lclpredicate = yyvsp[-1].lclpredicate;
+     symtable_exitScope (g_symtab); 
+     g_inTypeDef = TRUE;
+   ;
+    break;}
+case 176:
+#line 775 "llgrammar.y"
+{ yyval.declaratorinvs = declaratorInvNodeList_add (declaratorInvNodeList_new (), yyvsp[0].declaratorinv); ;
+    break;}
+case 177:
+#line 777 "llgrammar.y"
+{ yyval.declaratorinvs = declaratorInvNodeList_add (yyvsp[-2].declaratorinvs, yyvsp[0].declaratorinv); ;
+    break;}
+case 178:
+#line 780 "llgrammar.y"
+{ declareForwardType (yyvsp[0].declare); ;
+    break;}
+case 179:
+#line 781 "llgrammar.y"
+{ yyval.declaratorinv = makeDeclaratorInvNode (yyvsp[-2].declare, yyvsp[0].abstbody); ;
+    break;}
+case 180:
+#line 784 "llgrammar.y"
+{ yyval.abstbody = (abstBodyNode)0; ;
+    break;}
+case 181:
+#line 785 "llgrammar.y"
+{ yyval.abstbody = makeExposedBodyNode (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); ;
+    break;}
+case 182:
+#line 788 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_VOID, 0)); ;
+    break;}
+case 183:
+#line 789 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_CHAR, 0)); ;
+    break;}
+case 184:
+#line 790 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_DOUBLE, 0)); ;
+    break;}
+case 185:
+#line 791 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_FLOAT, 0)); ;
+    break;}
+case 186:
+#line 792 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_INT, 0)); ;
+    break;}
+case 187:
+#line 793 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_LONG, 0)); ;
+    break;}
+case 188:
+#line 794 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_SHORT, 0)); ;
+    break;}
+case 189:
+#line 795 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_SIGNED, 0)); ;
+    break;}
+case 190:
+#line 796 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_UNSIGNED, 0)); ;
+    break;}
+case 191:
+#line 797 "llgrammar.y"
+{ yyval.ltok = yyvsp[0].ltok; ltoken_setIntField (yyval.ltok, fixBits (TS_UNKNOWN, 0)); ;
+    break;}
+case 192:
+#line 805 "llgrammar.y"
+{ yyval.ctypes = makeCTypesNode ((CTypesNode)0, yyvsp[0].ltok); ;
+    break;}
+case 193:
+#line 806 "llgrammar.y"
+{ yyval.ctypes = makeCTypesNode (yyvsp[-1].ctypes, yyvsp[0].ltok); ;
+    break;}
+case 194:
+#line 812 "llgrammar.y"
+{ yyval.ctypes = makeTypeSpecifier (yyvsp[0].ltok); ;
+    break;}
+case 195:
+#line 814 "llgrammar.y"
+{ yyval.ctypes = yyvsp[0].ctypes; yyval.ctypes->sort = sort_lookupName (lclctype_toSort (yyvsp[0].ctypes->intfield)); ;
+    break;}
+case 196:
+#line 819 "llgrammar.y"
+{ yyval.typequal = qual_createOut (); ;
+    break;}
+case 197:
+#line 820 "llgrammar.y"
+{ yyval.typequal = qual_createUnused (); ;
+    break;}
+case 198:
+#line 821 "llgrammar.y"
+{ yyval.typequal = qual_createSef (); ;
+    break;}
+case 199:
+#line 822 "llgrammar.y"
+{ yyval.typequal = qual_createOnly (); ;
+    break;}
+case 200:
+#line 823 "llgrammar.y"
+{ yyval.typequal = qual_createOwned (); ;
+    break;}
+case 201:
+#line 824 "llgrammar.y"
+{ yyval.typequal = qual_createDependent (); ;
+    break;}
+case 202:
+#line 825 "llgrammar.y"
+{ yyval.typequal = qual_createKeep (); ;
+    break;}
+case 203:
+#line 826 "llgrammar.y"
+{ yyval.typequal = qual_createKept (); ;
+    break;}
+case 204:
+#line 827 "llgrammar.y"
+{ yyval.typequal = qual_createObserver (); ;
+    break;}
+case 205:
+#line 828 "llgrammar.y"
+{ yyval.typequal = qual_createExits (); ;
+    break;}
+case 206:
+#line 829 "llgrammar.y"
+{ yyval.typequal = qual_createMayExit (); ;
+    break;}
+case 207:
+#line 830 "llgrammar.y"
+{ yyval.typequal = qual_createTrueExit (); ;
+    break;}
+case 208:
+#line 831 "llgrammar.y"
+{ yyval.typequal = qual_createFalseExit (); ;
+    break;}
+case 209:
+#line 832 "llgrammar.y"
+{ yyval.typequal = qual_createNeverExit (); ;
+    break;}
+case 210:
+#line 833 "llgrammar.y"
+{ yyval.typequal = qual_createOnly (); ;
+    break;}
+case 211:
+#line 834 "llgrammar.y"
+{ yyval.typequal = qual_createShared (); ;
+    break;}
+case 212:
+#line 835 "llgrammar.y"
+{ yyval.typequal = qual_createUnique (); ;
+    break;}
+case 213:
+#line 836 "llgrammar.y"
+{ yyval.typequal = qual_createChecked (); ;
+    break;}
+case 214:
+#line 837 "llgrammar.y"
+{ yyval.typequal = qual_createUnchecked (); ;
+    break;}
+case 215:
+#line 838 "llgrammar.y"
+{ yyval.typequal = qual_createCheckedStrict (); ;
+    break;}
+case 216:
+#line 839 "llgrammar.y"
+{ yyval.typequal = qual_createTrueNull (); ;
+    break;}
+case 217:
+#line 840 "llgrammar.y"
+{ yyval.typequal = qual_createFalseNull (); ;
+    break;}
+case 218:
+#line 841 "llgrammar.y"
+{ yyval.typequal = qual_createRelNull (); ;
+    break;}
+case 219:
+#line 842 "llgrammar.y"
+{ yyval.typequal = qual_createRelDef (); ;
+    break;}
+case 220:
+#line 843 "llgrammar.y"
+{ yyval.typequal = qual_createRefCounted (); ;
+    break;}
+case 221:
+#line 844 "llgrammar.y"
+{ yyval.typequal = qual_createRefs (); ;
+    break;}
+case 222:
+#line 845 "llgrammar.y"
+{ yyval.typequal = qual_createNewRef (); ;
+    break;}
+case 223:
+#line 846 "llgrammar.y"
+{ yyval.typequal = qual_createKillRef (); ;
+    break;}
+case 224:
+#line 847 "llgrammar.y"
+{ yyval.typequal = qual_createNull (); ;
+    break;}
+case 225:
+#line 848 "llgrammar.y"
+{ yyval.typequal = qual_createNotNull (); ;
+    break;}
+case 226:
+#line 849 "llgrammar.y"
+{ yyval.typequal = qual_createReturned (); ;
+    break;}
+case 227:
+#line 850 "llgrammar.y"
+{ yyval.typequal = qual_createExposed (); ;
+    break;}
+case 228:
+#line 851 "llgrammar.y"
+{ yyval.typequal = qual_createPartial (); ;
+    break;}
+case 229:
+#line 852 "llgrammar.y"
+{ yyval.typequal = qual_createUndef (); ;
+    break;}
+case 230:
+#line 853 "llgrammar.y"
+{ yyval.typequal = qual_createKilled (); ;
+    break;}
+case 231:
+#line 857 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeType (yyvsp[0].ctypes); ;
+    break;}
+case 232:
+#line 859 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeSU (yyvsp[0].structorunion); ;
+    break;}
+case 233:
+#line 861 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeEnum (yyvsp[0].enumspec); ;
+    break;}
+case 234:
+#line 863 "llgrammar.y"
+{ yyval.lcltypespec = lclTypeSpecNode_addQual (yyvsp[0].lcltypespec, yyvsp[-1].typequal); ;
+    break;}
+case 235:
+#line 865 "llgrammar.y"
+{ yyval.lcltypespec = makeLclTypeSpecNodeConj (yyvsp[-3].lcltypespec, yyvsp[-1].lcltypespec); ;
+    break;}
+case 237:
+#line 875 "llgrammar.y"
+{ llassert (lclTypeSpecNode_isDefined (yyvsp[-1].lcltypespec));
+     yyvsp[-1].lcltypespec->pointers = yyvsp[0].count; yyval.lcltypespec = yyvsp[-1].lcltypespec; ;
+    break;}
+case 238:
+#line 879 "llgrammar.y"
+{ yyval.count = 1; ;
+    break;}
+case 239:
+#line 880 "llgrammar.y"
+{ yyval.count = yyvsp[-1].count + 1; ;
+    break;}
+case 240:
+#line 884 "llgrammar.y"
+{ (void) checkAndEnterTag (TAG_FWDSTRUCT, ltoken_copy (yyvsp[0].ltok)); ;
+    break;}
+case 241:
+#line 886 "llgrammar.y"
+{ yyval.structorunion = makestrOrUnionNode (yyvsp[-5].ltok, SU_STRUCT, yyvsp[-4].ltok, yyvsp[-1].structdecls); ;
+    break;}
+case 242:
+#line 888 "llgrammar.y"
+{ (void) checkAndEnterTag (TAG_FWDUNION, ltoken_copy (yyvsp[0].ltok)); ;
+    break;}
+case 243:
+#line 890 "llgrammar.y"
+{ yyval.structorunion = makestrOrUnionNode (yyvsp[-5].ltok, SU_UNION, yyvsp[-4].ltok, yyvsp[-1].structdecls); ;
+    break;}
+case 244:
+#line 892 "llgrammar.y"
+{ yyval.structorunion = makeForwardstrOrUnionNode (yyvsp[-1].ltok, SU_STRUCT, yyvsp[0].ltok); ;
+    break;}
+case 245:
+#line 894 "llgrammar.y"
+{ yyval.structorunion = makeForwardstrOrUnionNode (yyvsp[-1].ltok, SU_UNION, yyvsp[0].ltok); ;
+    break;}
+case 246:
+#line 897 "llgrammar.y"
+{ yyval.ltok = ltoken_undefined; ;
+    break;}
+case 248:
+#line 901 "llgrammar.y"
+{ yyval.structdecls = stDeclNodeList_add (stDeclNodeList_new (), yyvsp[0].structdecl); ;
+    break;}
+case 249:
+#line 902 "llgrammar.y"
+{ yyval.structdecls = stDeclNodeList_add (yyvsp[-1].structdecls, yyvsp[0].structdecl); ;
+    break;}
+case 250:
+#line 907 "llgrammar.y"
+{ yyval.structdecl = makestDeclNode (yyvsp[-2].lcltypespec, yyvsp[-1].declarelist); ;
+    break;}
+case 251:
+#line 911 "llgrammar.y"
+{ yyval.declarelist = declaratorNodeList_add (declaratorNodeList_new (), yyvsp[0].declare); ;
+    break;}
+case 252:
+#line 913 "llgrammar.y"
+{ yyval.declarelist = declaratorNodeList_add (yyvsp[-2].declarelist, yyvsp[0].declare); ;
+    break;}
+case 253:
+#line 916 "llgrammar.y"
+{ ; ;
+    break;}
+case 254:
+#line 917 "llgrammar.y"
+{ ; ;
+    break;}
+case 255:
+#line 921 "llgrammar.y"
+{ yyval.enumspec = makeEnumSpecNode (yyvsp[-5].ltok, yyvsp[-4].ltok, yyvsp[-2].ltokenList); ;
+    break;}
+case 256:
+#line 923 "llgrammar.y"
+{ yyval.enumspec = makeEnumSpecNode2 (yyvsp[-1].ltok, yyvsp[0].ltok); ;
+    break;}
+case 257:
+#line 926 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 258:
+#line 927 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 259:
+#line 937 "llgrammar.y"
+{ yyval.declare = makeDeclaratorNode (yyvsp[0].typeexpr); ;
+    break;}
+case 260:
+#line 938 "llgrammar.y"
+{ yyval.declare = makeDeclaratorNode (yyvsp[0].typeexpr); ;
+    break;}
+case 261:
+#line 941 "llgrammar.y"
+{ yyval.typeexpr = makeTypeExpr (yyvsp[0].ltok); ;
+    break;}
+case 262:
+#line 942 "llgrammar.y"
+{ yyval.typeexpr = yyvsp[-1].typeexpr; yyval.typeexpr->wrapped = yyval.typeexpr->wrapped + 1; ;
+    break;}
+case 263:
+#line 943 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 264:
+#line 944 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 265:
+#line 945 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 266:
+#line 946 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 267:
+#line 949 "llgrammar.y"
+{ yyval.typeexpr = makeTypeExpr (yyvsp[0].ltok); ;
+    break;}
+case 268:
+#line 950 "llgrammar.y"
+{ yyval.typeexpr = yyvsp[-1].typeexpr; yyval.typeexpr->wrapped = yyval.typeexpr->wrapped + 1; ;
+    break;}
+case 269:
+#line 951 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 270:
+#line 952 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 271:
+#line 953 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 272:
+#line 954 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 273:
+#line 963 "llgrammar.y"
+{ yyval.typeexpr = makeTypeExpr (yyvsp[0].ltok); ;
+    break;}
+case 274:
+#line 964 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 275:
+#line 965 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 276:
+#line 966 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 277:
+#line 967 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 278:
+#line 973 "llgrammar.y"
+{ yyval.param = makeParamNode (yyvsp[-1].lcltypespec, yyvsp[0].typeexpr); ;
+    break;}
+case 279:
+#line 974 "llgrammar.y"
+{ yyval.param = makeParamNode (yyvsp[-1].lcltypespec, yyvsp[0].typeexpr); ;
+    break;}
+case 280:
+#line 975 "llgrammar.y"
+{ yyval.param = makeParamNode (yyvsp[-1].lcltypespec, yyvsp[0].abstDecl); ;
+    break;}
+case 281:
+#line 985 "llgrammar.y"
+{ yyval.typname = makeTypeNameNode (FALSE, yyvsp[-1].lcltypespec, yyvsp[0].abstDecl); ;
+    break;}
+case 282:
+#line 986 "llgrammar.y"
+{ yyval.typname = makeTypeNameNode (TRUE, yyvsp[-1].lcltypespec, yyvsp[0].abstDecl); ;
+    break;}
+case 283:
+#line 987 "llgrammar.y"
+{ yyval.typname = makeTypeNameNodeOp (yyvsp[0].opform); ;
+    break;}
+case 284:
+#line 992 "llgrammar.y"
+{ yyval.abstDecl = (abstDeclaratorNode)0; ;
+    break;}
+case 285:
+#line 993 "llgrammar.y"
+{ yyval.abstDecl = (abstDeclaratorNode)yyvsp[0].typeexpr; ;
+    break;}
+case 286:
+#line 996 "llgrammar.y"
+{ yyval.typeexpr = yyvsp[-1].typeexpr; yyval.typeexpr->wrapped = yyval.typeexpr->wrapped + 1; ;
+    break;}
+case 287:
+#line 997 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[-1].ltok, yyvsp[0].typeexpr); ;
+    break;}
+case 288:
+#line 998 "llgrammar.y"
+{ yyval.typeexpr = makePointerNode (yyvsp[0].ltok, (typeExpr)0); ;
+    break;}
+case 289:
+#line 999 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode ((typeExpr)0, yyvsp[0].array); ;
+    break;}
+case 290:
+#line 1000 "llgrammar.y"
+{ yyval.typeexpr = makeArrayNode (yyvsp[-1].typeexpr, yyvsp[0].array); ;
+    break;}
+case 291:
+#line 1001 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-2].typeexpr, paramNodeList_new ()); ;
+    break;}
+case 292:
+#line 1002 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode ((typeExpr)0, yyvsp[-1].paramlist); ;
+    break;}
+case 293:
+#line 1003 "llgrammar.y"
+{ yyval.typeexpr = makeFunctionNode (yyvsp[-3].typeexpr, yyvsp[-1].paramlist); ;
+    break;}
+case 294:
+#line 1006 "llgrammar.y"
+{ yyval.array = makeArrayQualNode (yyvsp[-1].ltok, (termNode)0); ;
+    break;}
+case 295:
+#line 1007 "llgrammar.y"
+{ yyval.array = makeArrayQualNode (yyvsp[-2].ltok, yyvsp[-1].term); ;
+    break;}
+case 296:
+#line 1011 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-5].ltok, OPF_IF, opFormUnion_createMiddle (0), ltoken_undefined); ;
+    break;}
+case 297:
+#line 1013 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[0].ltok, OPF_ANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 298:
+#line 1015 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_MANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 299:
+#line 1017 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_ANYOPM, opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 300:
+#line 1019 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MANYOPM, 
+			  opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 301:
+#line 1022 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 302:
+#line 1024 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 303:
+#line 1026 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 304:
+#line 1028 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MMIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 305:
+#line 1030 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 306:
+#line 1032 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 307:
+#line 1040 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 308:
+#line 1042 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMMIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 309:
+#line 1044 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_SELECT, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 310:
+#line 1047 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_MAP, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 311:
+#line 1050 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MSELECT, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 312:
+#line 1053 "llgrammar.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MMAP, 
+			  opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 320:
+#line 1070 "llgrammar.y"
+{ yyval.count = 0; ;
+    break;}
+case 322:
+#line 1074 "llgrammar.y"
+{ yyval.count = 1; ;
+    break;}
+case 323:
+#line 1075 "llgrammar.y"
+{ yyval.count = yyvsp[-2].count + 1; ;
+    break;}
+case 326:
+#line 1082 "llgrammar.y"
+{ yyval.signature = makesigNode (yyvsp[-3].ltok, yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 327:
+#line 1085 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_new (); ;
+    break;}
+case 329:
+#line 1089 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 330:
+#line 1090 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 331:
+#line 1093 "llgrammar.y"
+{ yyval.lclpredicate = makeLclPredicateNode (ltoken_undefined, yyvsp[0].term, LPD_PLAIN);;
+    break;}
+case 332:
+#line 1096 "llgrammar.y"
+{ yyval.term = checkSort (yyvsp[0].term); ;
+    break;}
+case 333:
+#line 1103 "llgrammar.y"
+{ yyval.term = makeIfTermNode (yyvsp[-5].ltok,yyvsp[-4].term,yyvsp[-3].ltok,yyvsp[-2].term,yyvsp[-1].ltok,yyvsp[0].term); ;
+    break;}
+case 335:
+#line 1105 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 337:
+#line 1111 "llgrammar.y"
+{ checkLclPredicate (yyvsp[-2].ltok, yyvsp[-1].lclpredicate); yyval.term = makeQuantifiedTermNode (yyvsp[-3].quantifiers, yyvsp[-2].ltok, yyvsp[-1].lclpredicate->predicate, yyvsp[0].ltok);
+     symtable_exitScope (g_symtab); 
+   ;
+    break;}
+case 338:
+#line 1115 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term);;
+    break;}
+case 339:
+#line 1117 "llgrammar.y"
+{ yyval.term = makeInfixTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].term);;
+    break;}
+case 341:
+#line 1121 "llgrammar.y"
+{ yyval.term = makePostfixTermNode (yyvsp[-1].term, yyvsp[0].ltokenList); ;
+    break;}
+case 342:
+#line 1122 "llgrammar.y"
+{ yyval.term = CollapseInfixTermNode (yyvsp[-1].term, yyvsp[0].termlist); ;
+    break;}
+case 346:
+#line 1130 "llgrammar.y"
+{ yyval.term = makePrefixTermNode (yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 347:
+#line 1133 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 348:
+#line 1134 "llgrammar.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-1].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 349:
+#line 1137 "llgrammar.y"
+{ yyval.termlist = pushInfixOpPartNode (termNodeList_new (), yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 350:
+#line 1138 "llgrammar.y"
+{ yyval.termlist = pushInfixOpPartNode (yyvsp[-2].termlist, yyvsp[-1].ltok, yyvsp[0].term); ;
+    break;}
+case 352:
+#line 1142 "llgrammar.y"
+{ yyval.term = computePossibleSorts (yyvsp[0].term); ;
+    break;}
+case 353:
+#line 1143 "llgrammar.y"
+{ yyval.term = updateMatchedNode ((termNode)0, yyvsp[-1].term, yyvsp[0].term); ;
+    break;}
+case 354:
+#line 1144 "llgrammar.y"
+{ yyval.term = updateMatchedNode (yyvsp[-1].term, yyvsp[0].term, (termNode)0); ;
+    break;}
+case 355:
+#line 1145 "llgrammar.y"
+{ yyval.term = updateMatchedNode (yyvsp[-2].term, yyvsp[-1].term, yyvsp[0].term); ;
+    break;}
+case 356:
+#line 1146 "llgrammar.y"
+{ yyval.term = computePossibleSorts (yyvsp[0].term); ;
+    break;}
+case 357:
+#line 1147 "llgrammar.y"
+{ yyval.term = updateSqBracketedNode ((termNode)0, yyvsp[-1].term, yyvsp[0].term); ;
+    break;}
+case 358:
+#line 1150 "llgrammar.y"
+{ yyval.term = yyvsp[-2].term; yyval.term->sort = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); ;
+    break;}
+case 360:
+#line 1155 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-4].ltok, yyvsp[-3].termlist, yyvsp[-2].ltok); 
+     yyval.term->given = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); ;
+    break;}
+case 361:
+#line 1158 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 362:
+#line 1160 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-3].ltok, termNodeList_new (), yyvsp[-2].ltok); 
+     yyval.term->given = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); 
+   ;
+    break;}
+case 363:
+#line 1164 "llgrammar.y"
+{ yyval.term = makeSqBracketedNode (yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok); ;
+    break;}
+case 364:
+#line 1167 "llgrammar.y"
+{ yyval.term = makeMatchedNode (yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 365:
+#line 1168 "llgrammar.y"
+{ yyval.term = makeMatchedNode (yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok); ;
+    break;}
+case 366:
+#line 1171 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (termNodeList_new (), yyvsp[0].term); ;
+    break;}
+case 367:
+#line 1172 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (yyvsp[-2].termlist, yyvsp[0].term); ;
+    break;}
+case 368:
+#line 1176 "llgrammar.y"
+{ yyval.term = yyvsp[-1].term; yyval.term->wrapped = yyval.term->wrapped + 1; ;
+    break;}
+case 369:
+#line 1178 "llgrammar.y"
+{ yyval.term = makeSimpleTermNode (yyvsp[0].ltok); ;
+    break;}
+case 370:
+#line 1180 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 372:
+#line 1183 "llgrammar.y"
+{ yyval.term = makePostfixTermNode2 (yyvsp[-1].term, yyvsp[0].ltok); ;
+    break;}
+case 373:
+#line 1185 "llgrammar.y"
+{ ltoken_markOwned (yyvsp[0].ltok); yyval.term = makeSelectTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].ltok); ;
+    break;}
+case 374:
+#line 1187 "llgrammar.y"
+{ ltoken_markOwned (yyvsp[0].ltok); yyval.term = makeMapTermNode (yyvsp[-2].term, yyvsp[-1].ltok, yyvsp[0].ltok); ;
+    break;}
+case 375:
+#line 1189 "llgrammar.y"
+{ yyval.term = updateSqBracketedNode (yyvsp[-2].term, makeSqBracketedNode (yyvsp[-1].ltok, termNodeList_new (), yyvsp[0].ltok), 
+				(termNode)0); ;
+    break;}
+case 376:
+#line 1192 "llgrammar.y"
+{ yyval.term = updateSqBracketedNode (yyvsp[-3].term, makeSqBracketedNode (yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok), (termNode)0); ;
+    break;}
+case 377:
+#line 1194 "llgrammar.y"
+{ yyval.term = yyvsp[-2].term; yyval.term->given = sort_lookupName (ltoken_getText (yyvsp[0].ltok)); ;
+    break;}
+case 378:
+#line 1197 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (termNodeList_new (), yyvsp[0].term); ;
+    break;}
+case 379:
+#line 1198 "llgrammar.y"
+{ yyval.termlist = termNodeList_push (yyvsp[-2].termlist, yyvsp[0].term); ;
+    break;}
+case 385:
+#line 1208 "llgrammar.y"
+{ yyval.term = makeSimpleTermNode (yyvsp[0].ltok); ;
+    break;}
+case 386:
+#line 1209 "llgrammar.y"
+{ yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, yyvsp[-1].termlist, yyvsp[0].ltok); ;
+    break;}
+case 387:
+#line 1210 "llgrammar.y"
+{ yyval.term = makeUnchangedTermNode1 (yyvsp[-3].ltok, yyvsp[-1].ltok); ;
+    break;}
+case 388:
+#line 1211 "llgrammar.y"
+{ yyval.term = makeUnchangedTermNode2 (yyvsp[-3].ltok, yyvsp[-1].storereflist); ;
+    break;}
+case 389:
+#line 1213 "llgrammar.y"
+{ termNodeList x = termNodeList_new (); 
+     termNodeList_addh (x, yyvsp[-1].term);
+     yyval.term = makeOpCallTermNode (yyvsp[-3].ltok, yyvsp[-2].ltok, x, yyvsp[0].ltok); 
+   ;
+    break;}
+case 390:
+#line 1218 "llgrammar.y"
+{ termNodeList x = termNodeList_new ();
+     termNodeList_addh (x, yyvsp[-3].term);
+     termNodeList_addh (x, yyvsp[-1].term);
+     yyval.term = makeOpCallTermNode (yyvsp[-5].ltok, yyvsp[-4].ltok, x, yyvsp[0].ltok); 
+   ;
+    break;}
+case 391:
+#line 1223 "llgrammar.y"
+{ yyval.term = makeSizeofTermNode (yyvsp[-3].ltok, yyvsp[-1].lcltypespec); ;
+    break;}
+case 392:
+#line 1233 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_int); ;
+    break;}
+case 393:
+#line 1234 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_cstring); ;
+    break;}
+case 394:
+#line 1235 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_char); ;
+    break;}
+case 395:
+#line 1236 "llgrammar.y"
+{ yyval.term = makeLiteralTermNode (yyvsp[0].ltok, sort_double); ;
+    break;}
+case 396:
+#line 1240 "llgrammar.y"
+{ yyval.quantifiers = quantifierNodeList_add (quantifierNodeList_new (), yyvsp[0].quantifier); ;
+    break;}
+case 397:
+#line 1242 "llgrammar.y"
+{ yyval.quantifiers = quantifierNodeList_add (yyvsp[-1].quantifiers, yyvsp[0].quantifier); ;
+    break;}
+case 398:
+#line 1245 "llgrammar.y"
+{ scopeInfo si = (scopeInfo) dmalloc (sizeof (*si));
+		   si->kind = SPE_QUANT;
+		   symtable_enterScope (g_symtab, si); ;
+    break;}
+case 399:
+#line 1249 "llgrammar.y"
+{ yyval.quantifier = makeQuantifierNode (yyvsp[0].vars, yyvsp[-2].ltok); ;
+    break;}
+case 400:
+#line 1252 "llgrammar.y"
+{ yyval.vars = varNodeList_add (varNodeList_new (), yyvsp[0].var); ;
+    break;}
+case 401:
+#line 1253 "llgrammar.y"
+{ yyval.vars = varNodeList_add (yyvsp[-2].vars, yyvsp[0].var); ;
+    break;}
+case 402:
+#line 1256 "llgrammar.y"
+{ yyval.var = makeVarNode (yyvsp[-2].ltok, FALSE, yyvsp[0].lcltypespec); ;
+    break;}
+case 403:
+#line 1257 "llgrammar.y"
+{ yyval.var = makeVarNode (yyvsp[-3].ltok, TRUE, yyvsp[0].lcltypespec); ;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 498 "/usr/lib/bison.simple"
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+	{
+	  int size = 0;
+	  char *msg;
+	  int x, count;
+
+	  count = 0;
+	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
+	  for (x = (yyn < 0 ? -yyn : 0);
+	       x < (sizeof(yytname) / sizeof(char *)); x++)
+	    if (yycheck[x + yyn] == x)
+	      size += strlen(yytname[x]) + 15, count++;
+	  msg = (char *) malloc(size + 15);
+	  if (msg != 0)
+	    {
+	      strcpy(msg, "parse error");
+
+	      if (count < 5)
+		{
+		  count = 0;
+		  for (x = (yyn < 0 ? -yyn : 0);
+		       x < (sizeof(yytname) / sizeof(char *)); x++)
+		    if (yycheck[x + yyn] == x)
+		      {
+			strcat(msg, count == 0 ? ", expecting `" : " or `");
+			strcat(msg, yytname[x]);
+			strcat(msg, "'");
+			count++;
+		      }
+		}
+	      yyerror(msg);
+	      free(msg);
+	    }
+	  else
+	    yyerror ("parse error; also virtual memory exceeded");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror("parse error");
+    }
+
+  goto yyerrlab1;
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+	YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;		/* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+}
+#line 1272 "llgrammar.y"
+
+
+# include "bison.reset"
+
+/*
+** yytext is set in lex scanner 
+** extern YYSTYPE yylval;  
+** yylval is defined by code generated by bison 
+*/
+
+void ylerror (char *s) 
+{
+  /* 
+  ** This resetting of the left context is very important when multiple
+  ** files are to be parsed.  We do not want failures to propagate.
+  ** Lex/Yacc does not reset the flags when the parsing goes bad.  
+  ** BEGIN 0;        
+  **/
+
+  /*@-mustfree@*/
+  lclfatalerror (yllval.ltok,
+		 message ("%s: Token code: %s, Token String: %s", 
+			  cstring_fromChars (s), 
+			  ltoken_unparseCodeName (yllval.ltok), 
+			  ltoken_getRawString (yllval.ltok)));
+  /*@=mustfree@*/
+}
+
+static void yyprint (FILE *f, int t, YYSTYPE value) 
+{
+  fprintf (f, " type: %d (%s)", t, 
+	   cstring_toCharsSafe (ltoken_getRawString (value.ltok)));
+}
+
+
+
+
+
+
+
diff --git a/src/llgrammar.tab.h b/src/llgrammar.tab.h
new file mode 100644
index 0000000..a3d47b5
--- /dev/null
+++ b/src/llgrammar.tab.h
@@ -0,0 +1,201 @@
+typedef union 
+{
+  ltoken ltok;  /* a leaf is also an ltoken */
+  qual typequal;
+  unsigned int count;
+  /*@only@*/ ltokenList ltokenList;
+  /*@only@*/ abstDeclaratorNode abstDecl; 
+  /*@only@*/ declaratorNode declare;
+  /*@only@*/ declaratorNodeList declarelist;
+  /*@only@*/ typeExpr typeexpr;
+  /*@only@*/ arrayQualNode array;
+  /*@only@*/ quantifierNode quantifier;
+  /*@only@*/ quantifierNodeList quantifiers;
+  /*@only@*/ varNode var;
+  /*@only@*/ varNodeList vars;
+  /*@only@*/ storeRefNode storeref;
+  /*@only@*/ storeRefNodeList storereflist;
+  /*@only@*/ termNode term;
+  /*@only@*/ termNodeList termlist;
+  /*@only@*/ programNode program; 
+  /*@only@*/ stmtNode stmt;
+  /*@only@*/ claimNode claim;
+  /*@only@*/ typeNode type;
+  /*@only@*/ iterNode iter;
+  /*@only@*/ fcnNode fcn;
+  /*@only@*/ fcnNodeList fcns;
+  /*@only@*/ letDeclNode letdecl;
+  /*@only@*/ letDeclNodeList letdecls;
+  /*@only@*/ lclPredicateNode lclpredicate;
+  /*@only@*/ modifyNode modify;
+  /*@only@*/ paramNode param;
+  /*@only@*/ paramNodeList paramlist;
+  /*@only@*/ declaratorInvNodeList declaratorinvs;	
+  /*@only@*/ declaratorInvNode declaratorinv;	
+  /*@only@*/ abstBodyNode abstbody;
+  /*@only@*/ abstractNode abstract;
+  /*@only@*/ exposedNode exposed;
+  /*    taggedUnionNode taggedunion; */
+  /*@only@*/ globalList globals;
+  /*@only@*/ constDeclarationNode constdeclaration;
+  /*@only@*/ varDeclarationNode vardeclaration;
+  /*@only@*/ varDeclarationNodeList vardeclarationlist;
+  /*@only@*/ initDeclNodeList initdecls;
+  /*@only@*/ initDeclNode initdecl;
+  /*@only@*/ stDeclNodeList structdecls;
+  /*@only@*/ stDeclNode structdecl;
+  /*@only@*/ strOrUnionNode structorunion;
+  /*@only@*/ enumSpecNode enumspec; 
+  /*@only@*/ lclTypeSpecNode lcltypespec;
+  /*@only@*/ typeNameNode typname;
+  /*@only@*/ opFormNode opform;
+  /*@only@*/ sigNode signature;
+  /*@only@*/ nameNode name;
+  /*@only@*/ typeNameNodeList namelist;
+  /*@only@*/ replaceNode replace;	
+  /*@only@*/ replaceNodeList replacelist;
+  /*@only@*/ renamingNode renaming;
+  /*@only@*/ traitRefNode traitref;
+  /*@only@*/ traitRefNodeList traitreflist;
+  /*@only@*/ importNode import;
+  /*@only@*/ importNodeList importlist;
+  /*@only@*/ interfaceNode iface;
+  /*@only@*/ interfaceNodeList interfacelist; 
+  /*@only@*/ CTypesNode ctypes;
+} YYSTYPE;
+#define	simpleOp	258
+#define	PREFIX_OP	259
+#define	POSTFIX_OP	260
+#define	LLT_MULOP	261
+#define	LLT_SEMI	262
+#define	LLT_VERTICALBAR	263
+#define	ITERATION_OP	264
+#define	LLT_LPAR	265
+#define	LLT_LBRACKET	266
+#define	selectSym	267
+#define	LLT_IF_THEN_ELSE	268
+#define	logicalOp	269
+#define	eqSepSym	270
+#define	equationSym	271
+#define	commentSym	272
+#define	LLT_WHITESPACE	273
+#define	LLT_EOL	274
+#define	LLT_TYPEDEF_NAME	275
+#define	quantifierSym	276
+#define	openSym	277
+#define	closeSym	278
+#define	sepSym	279
+#define	simpleId	280
+#define	mapSym	281
+#define	markerSym	282
+#define	preSym	283
+#define	postSym	284
+#define	anySym	285
+#define	LLT_COLON	286
+#define	LLT_COMMA	287
+#define	LLT_EQUALS	288
+#define	LLT_LBRACE	289
+#define	LLT_RBRACE	290
+#define	LLT_RBRACKET	291
+#define	LLT_RPAR	292
+#define	LLT_QUOTE	293
+#define	eqOp	294
+#define	LLT_CCHAR	295
+#define	LLT_CFLOAT	296
+#define	LLT_CINTEGER	297
+#define	LLT_LCSTRING	298
+#define	LLT_ALL	299
+#define	LLT_ANYTHING	300
+#define	LLT_BE	301
+#define	LLT_BODY	302
+#define	LLT_CLAIMS	303
+#define	LLT_CHECKS	304
+#define	LLT_CONSTANT	305
+#define	LLT_ELSE	306
+#define	LLT_ENSURES	307
+#define	LLT_FOR	308
+#define	LLT_FRESH	309
+#define	LLT_IF	310
+#define	LLT_IMMUTABLE	311
+#define	LLT_IMPORTS	312
+#define	LLT_CONSTRAINT	313
+#define	LLT_ISSUB	314
+#define	LLT_LET	315
+#define	LLT_MODIFIES	316
+#define	LLT_MUTABLE	317
+#define	LLT_NOTHING	318
+#define	LLT_INTERNAL	319
+#define	LLT_FILESYS	320
+#define	LLT_OBJ	321
+#define	LLT_OUT	322
+#define	LLT_SEF	323
+#define	LLT_ONLY	324
+#define	LLT_PARTIAL	325
+#define	LLT_OWNED	326
+#define	LLT_DEPENDENT	327
+#define	LLT_KEEP	328
+#define	LLT_KEPT	329
+#define	LLT_TEMP	330
+#define	LLT_SHARED	331
+#define	LLT_UNIQUE	332
+#define	LLT_UNUSED	333
+#define	LLT_EXITS	334
+#define	LLT_MAYEXIT	335
+#define	LLT_NEVEREXIT	336
+#define	LLT_TRUEEXIT	337
+#define	LLT_FALSEEXIT	338
+#define	LLT_UNDEF	339
+#define	LLT_KILLED	340
+#define	LLT_CHECKMOD	341
+#define	LLT_CHECKED	342
+#define	LLT_UNCHECKED	343
+#define	LLT_CHECKEDSTRICT	344
+#define	LLT_TRUENULL	345
+#define	LLT_FALSENULL	346
+#define	LLT_LNULL	347
+#define	LLT_LNOTNULL	348
+#define	LLT_RETURNED	349
+#define	LLT_OBSERVER	350
+#define	LLT_EXPOSED	351
+#define	LLT_REFCOUNTED	352
+#define	LLT_REFS	353
+#define	LLT_RELNULL	354
+#define	LLT_RELDEF	355
+#define	LLT_KILLREF	356
+#define	LLT_TEMPREF	357
+#define	LLT_NEWREF	358
+#define	LLT_PRIVATE	359
+#define	LLT_REQUIRES	360
+#define	LLT_RESULT	361
+#define	LLT_SIZEOF	362
+#define	LLT_SPEC	363
+#define	LLT_TAGGEDUNION	364
+#define	LLT_THEN	365
+#define	LLT_TYPE	366
+#define	LLT_TYPEDEF	367
+#define	LLT_UNCHANGED	368
+#define	LLT_USES	369
+#define	LLT_CHAR	370
+#define	LLT_CONST	371
+#define	LLT_DOUBLE	372
+#define	LLT_ENUM	373
+#define	LLT_FLOAT	374
+#define	LLT_INT	375
+#define	LLT_ITER	376
+#define	LLT_YIELD	377
+#define	LLT_LONG	378
+#define	LLT_SHORT	379
+#define	LLT_SIGNED	380
+#define	LLT_UNKNOWN	381
+#define	LLT_STRUCT	382
+#define	LLT_TELIPSIS	383
+#define	LLT_UNION	384
+#define	LLT_UNSIGNED	385
+#define	LLT_VOID	386
+#define	LLT_VOLATILE	387
+#define	LLT_PRINTFLIKE	388
+#define	LLT_SCANFLIKE	389
+#define	LLT_MESSAGELIKE	390
+
+
+extern YYSTYPE yllval;
diff --git a/src/llgrammar.y b/src/llgrammar.y
new file mode 100644
index 0000000..e1dfe60
--- /dev/null
+++ b/src/llgrammar.y
@@ -0,0 +1,1321 @@
+/*;-*-C-*-;
+** Copyright (c) Massachusetts Institute of Technology 1994-1998.
+**          All Rights Reserved.
+**          Unpublished rights reserved under the copyright laws of
+**          the United States.
+**
+** THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+** OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+**
+** This code is distributed freely and may be used freely under the 
+** following conditions:
+**
+**     1. This notice may not be removed or altered.
+**
+**     2. Works derived from this code are not distributed for
+**        commercial gain without explicit permission from MIT 
+**        (for permission contact lclint-request@sds.lcs.mit.edu).
+*/
+/*
+**	 Copyright (c) Massachusetts Institute of Technology, 1993
+**	    All Rights Reserved.  Unpublished rights reserved
+**	    under the copyright laws of the United States.
+**++
+**  FACILITY:  LSLC
+**
+**  MODULE DESCRIPTION:
+**
+**      FILENAME: llgramar.y
+**
+**	PURPOSE:  bison grammar for LCL language.
+** 
+**  AUTHORS:
+**	Yang Meng Tan, Massachusetts Institute of Technology
+*/
+
+%{
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "lclscan.h"
+# include "checking.h"
+# include "lslparse.h" 
+# include "lh.h"
+# include "usymtab_interface.h"
+
+/*@-noparams@*/
+static /*@unused@*/ void yyprint ();
+/*@=noparams@*/
+
+/*@-redecl@*/
+void ylerror (char *) /*@modifies *g_msgstream@*/ ;
+/*@=redecl@*/
+
+bool g_inTypeDef = FALSE;
+
+/*@constant int YYDEBUG;@*/
+# define YYDEBUG 1
+
+/*@notfunction@*/
+# define YYPRINT(file, type, value) yyprint (file, type, value)
+
+/*
+** This is necessary, or else when the bison-generated code #include's malloc.h,
+** there will be a parse error.
+**
+** Unfortunately, it means the error checking on malloc, etc. is lost for allocations
+** in bison-generated files under Win32.
+*/
+
+# ifdef WIN32
+# undef malloc
+# undef calloc
+# undef realloc
+# endif
+
+%}
+
+%union 
+{
+  ltoken ltok;  /* a leaf is also an ltoken */
+  qual typequal;
+  unsigned int count;
+  /*@only@*/ ltokenList ltokenList;
+  /*@only@*/ abstDeclaratorNode abstDecl; 
+  /*@only@*/ declaratorNode declare;
+  /*@only@*/ declaratorNodeList declarelist;
+  /*@only@*/ typeExpr typeexpr;
+  /*@only@*/ arrayQualNode array;
+  /*@only@*/ quantifierNode quantifier;
+  /*@only@*/ quantifierNodeList quantifiers;
+  /*@only@*/ varNode var;
+  /*@only@*/ varNodeList vars;
+  /*@only@*/ storeRefNode storeref;
+  /*@only@*/ storeRefNodeList storereflist;
+  /*@only@*/ termNode term;
+  /*@only@*/ termNodeList termlist;
+  /*@only@*/ programNode program; 
+  /*@only@*/ stmtNode stmt;
+  /*@only@*/ claimNode claim;
+  /*@only@*/ typeNode type;
+  /*@only@*/ iterNode iter;
+  /*@only@*/ fcnNode fcn;
+  /*@only@*/ fcnNodeList fcns;
+  /*@only@*/ letDeclNode letdecl;
+  /*@only@*/ letDeclNodeList letdecls;
+  /*@only@*/ lclPredicateNode lclpredicate;
+  /*@only@*/ modifyNode modify;
+  /*@only@*/ paramNode param;
+  /*@only@*/ paramNodeList paramlist;
+  /*@only@*/ declaratorInvNodeList declaratorinvs;	
+  /*@only@*/ declaratorInvNode declaratorinv;	
+  /*@only@*/ abstBodyNode abstbody;
+  /*@only@*/ abstractNode abstract;
+  /*@only@*/ exposedNode exposed;
+  /*    taggedUnionNode taggedunion; */
+  /*@only@*/ globalList globals;
+  /*@only@*/ constDeclarationNode constdeclaration;
+  /*@only@*/ varDeclarationNode vardeclaration;
+  /*@only@*/ varDeclarationNodeList vardeclarationlist;
+  /*@only@*/ initDeclNodeList initdecls;
+  /*@only@*/ initDeclNode initdecl;
+  /*@only@*/ stDeclNodeList structdecls;
+  /*@only@*/ stDeclNode structdecl;
+  /*@only@*/ strOrUnionNode structorunion;
+  /*@only@*/ enumSpecNode enumspec; 
+  /*@only@*/ lclTypeSpecNode lcltypespec;
+  /*@only@*/ typeNameNode typname;
+  /*@only@*/ opFormNode opform;
+  /*@only@*/ sigNode signature;
+  /*@only@*/ nameNode name;
+  /*@only@*/ typeNameNodeList namelist;
+  /*@only@*/ replaceNode replace;	
+  /*@only@*/ replaceNodeList replacelist;
+  /*@only@*/ renamingNode renaming;
+  /*@only@*/ traitRefNode traitref;
+  /*@only@*/ traitRefNodeList traitreflist;
+  /*@only@*/ importNode import;
+  /*@only@*/ importNodeList importlist;
+  /*@only@*/ interfaceNode iface;
+  /*@only@*/ interfaceNodeList interfacelist; 
+  /*@only@*/ CTypesNode ctypes;
+}
+
+/* Order of precedence is increasing going down the list */
+
+%left     simpleOp
+%right    PREFIX_OP 
+%left     POSTFIX_OP 
+%left     LLT_MULOP    
+  /* as arithmetic binary operator, or as iteration construct in claims */
+%left     LLT_SEMI
+%left     LLT_VERTICALBAR
+%nonassoc ITERATION_OP /* two * cannot follow each other */
+%left     LLT_LPAR LLT_LBRACKET selectSym 
+  /* to allow mixing if-then-else with other kinds of terms */
+%left     LLT_IF_THEN_ELSE 
+%left     logicalOp
+
+/* Note: the grammar parses b = p /\ q as (b = p) /\ q, that is,
+    = has higher precedence than logicalOp.  
+   Reminder: = > logicalOp >= if_then_else > == (present in LSL) */
+
+/* Precedence of claim operators: ( > * > | >; (| and; left-assoc) */
+
+/* These are not needed in the grammar, 
+   but needed in init files and lclscanline.c */
+
+%token  eqSepSym          /* \eqsep */
+%token  equationSym     /* \equals or == */
+%token  commentSym        /* \comment */
+%token  LLT_WHITESPACE
+%token  LLT_EOL  /*@-varuse@*/  /* yacc declares yytranslate here */
+/* used to bypass parsing problems in C types */
+%token  LLT_TYPEDEF_NAME /*@=varuse@*/
+
+/* LSL reserved extension symbols */
+
+%token  quantifierSym     /* \forall */
+%token  logicalOp         /* \implies, \and, \not, \or */
+%token  selectSym         /* \select */
+%token  openSym           /* \( */
+%token  closeSym          /* \) */
+%token  sepSym            /* \, */
+
+%token  simpleId          /* \: id-char +, Ordinary Identifier */
+%token  mapSym            /* \arrow, -> */
+%token  markerSym         /* \marker, __ */
+%token  preSym            /* \pre */
+%token  postSym           /* \post */
+%token  anySym            /* \any */
+
+/* Generic LSL operators */
+
+%token  simpleOp          /* opSym - reserved */
+
+/* Reserved special symbols */
+
+%token  LLT_COLON              /* : */
+%token  LLT_COMMA              /* , */
+%token  LLT_EQUALS             /* = */
+%token  LLT_LBRACE             /* { */
+%token  LLT_RBRACE             /* } */
+%token  LLT_LBRACKET           /* [ */
+%token  LLT_RBRACKET           /* ] */
+%token  LLT_LPAR               /* ( */
+%token  LLT_RPAR               /* ) */
+%token  LLT_QUOTE              /* ' */
+%token  LLT_SEMI               /*; */
+%token  LLT_VERTICALBAR        /* | */
+
+/* C operator tokens and Combined C/LSL operator tokens */
+
+%token  eqOp                /* \eq, \neq, ==, != */
+%token  LLT_MULOP               /* * */
+
+/* LCL C literal tokens */
+
+%token  LLT_CCHAR
+%token  LLT_CFLOAT
+%token  LLT_CINTEGER
+%token  LLT_LCSTRING
+
+/* LCL reserved words */
+
+%token  LLT_ALL
+%token  LLT_ANYTHING
+%token  LLT_BE
+%token  LLT_BODY
+%token  LLT_CLAIMS
+%token  LLT_CHECKS
+%token  LLT_CONSTANT
+%token  LLT_ELSE
+%token  LLT_ENSURES
+%token  LLT_FOR
+%token  LLT_FRESH
+%token  LLT_IF
+%token  LLT_IMMUTABLE
+%token  LLT_IMPORTS
+%token  LLT_CONSTRAINT /* was INVARIANT */
+%token  LLT_ISSUB
+%token  LLT_LET
+%token  LLT_MODIFIES
+%token  LLT_MUTABLE
+%token  LLT_NOTHING
+%token  LLT_INTERNAL
+%token  LLT_FILESYS
+%token  LLT_OBJ
+%token  LLT_OUT
+%token  LLT_SEF
+%token  LLT_ONLY LLT_PARTIAL LLT_OWNED LLT_DEPENDENT LLT_KEEP LLT_KEPT LLT_TEMP 
+%token  LLT_SHARED LLT_UNIQUE LLT_UNUSED
+%token  LLT_EXITS LLT_MAYEXIT LLT_NEVEREXIT LLT_TRUEEXIT LLT_FALSEEXIT
+%token  LLT_UNDEF LLT_KILLED
+%token  LLT_CHECKMOD LLT_CHECKED LLT_UNCHECKED LLT_CHECKEDSTRICT
+%token  LLT_TRUENULL
+%token  LLT_FALSENULL
+%token  LLT_LNULL
+%token  LLT_LNOTNULL
+%token  LLT_RETURNED
+%token  LLT_OBSERVER
+%token  LLT_EXPOSED
+%token  LLT_REFCOUNTED
+%token  LLT_REFS
+%token  LLT_RELNULL
+%token  LLT_RELDEF
+%token  LLT_KILLREF
+%token  LLT_TEMPREF
+%token  LLT_NEWREF
+%token  LLT_PRIVATE
+%token  LLT_REQUIRES
+%token  LLT_RESULT
+%token  LLT_SIZEOF
+%token  LLT_SPEC
+%token  LLT_TAGGEDUNION  /* keep it for other parts of LCL checker */
+%token  LLT_THEN
+%token  LLT_TYPE
+%token  LLT_TYPEDEF
+%token  LLT_UNCHANGED
+%token  LLT_USES
+
+/* LCL C keywords */
+
+%token  LLT_CHAR
+%token  LLT_CONST
+%token  LLT_DOUBLE
+%token  LLT_ENUM
+%token  LLT_FLOAT
+%token  LLT_INT
+%token  LLT_ITER
+%token  LLT_YIELD
+%token  LLT_LONG
+%token  LLT_SHORT
+%token  LLT_SIGNED
+%token  LLT_UNKNOWN
+%token  LLT_STRUCT
+%token  LLT_TELIPSIS
+%token  LLT_UNION
+%token  LLT_UNSIGNED
+%token  LLT_VOID
+%token  LLT_VOLATILE
+
+%token  LLT_PRINTFLIKE LLT_SCANFLIKE LLT_MESSAGELIKE
+
+%type  interface externals optDeclarations declarations
+%type  external declaration imports uses export private private2
+%type  type 
+%type  fcn
+%type  fcns
+%type  claim 
+%type  iter
+%type  varDeclaration globalDecl privateInit 
+%type  globals
+%type  interfaceNameList traitIdList domain sortList 
+%type  importName
+%type  importNameList
+%type  traitRefNodeList 
+%type  traitRef 
+%type  renaming
+%type  nameList 
+%type  name 
+%type  replaceNodeList
+%type  replace
+%type  opForm
+%type  signature
+%type  typeName
+%type  middle placeList pointers 
+%type  optAbstDeclarator 
+%type  lclTypeSpec lclType sortSpec
+%type  enumeratorList postfixOps
+%type  CTypes typeSpecifier
+%type  structOrUnionSpec 
+%type  enumSpec
+%type  declarator 
+%type  notype_decl after_type_decl abstDeclarator parameter_decl 
+%type  declaratorList
+%type  structDecls 
+%type  structDecl
+%type  constDeclaration
+%type  initDecls 
+%type  initDecl 
+%type  privateInits
+%type  abstract
+%type  exposed 
+%type  declaratorInvs
+%type  declaratorInv
+%type  abstBody optExposedBody 
+%type  optClaim optEnsure optRequire optChecks lclPredicate 
+%type  optTypeInv typeInv 
+%type  optModify
+%type  optLetDecl beDeclList 
+%type  beDecl 
+%type  term constLclExpr initializer value equalityTerm 
+%type  simpleOpTerm prefixOpTerm secondary primary lclPrimary 
+%type  bracketed sqBracketed matched term0 cLiteral
+%type  args infixOpPart valueList termList
+%type  optBody callExpr
+%type  stmt 
+%type  storeRefList 
+%type  storeRef  
+%type  quantified 
+%type  quantifiedList
+%type  quantifier 
+%type  quantifiers
+%type  arrayQual 
+%type  optParamList paramList realParamList iterParamList realIterParamList
+%type  param iterParam
+%type  open close anyOp separator simpleOp2 stateFcn 
+%type  interfaceName 
+%type  varId fcnId tagId claimId sortId traitId opId CType optTagId
+%type  simpleIdOrTypedefName
+%type  specialQualifier special
+
+/*
+** Conventions in calling static semantic routines:
+**   The inputs are in strict order (in AST) as well as in the position of
+**   the call to the static semantic routine. 
+*/ 
+
+%%
+
+interface
+ : externals { lhExternals ($1); } optDeclarations 
+   { interfaceNodeList_free ($1); interfaceNodeList_free ($3); }
+
+externals   
+ : /* empty */        { $$ = interfaceNodeList_new (); }
+ | externals external { $$ = interfaceNodeList_addh ($1, $2);}  
+
+external
+ : imports
+ | uses
+
+optDeclarations    
+ : /* empty */              { $$ = interfaceNodeList_new (); }
+ | export declarations      { $$ = consInterfaceNode ($1, $2);}  
+ | private declarations     { $$ = consInterfaceNode ($1, $2);}  
+
+declarations 
+ : /* empty */              { $$ = interfaceNodeList_new (); }
+ | declarations declaration { $$ = interfaceNodeList_addh ($1, $2);}  
+
+declaration
+ : export
+ | private
+ | uses 
+
+imports   
+ : LLT_IMPORTS importNameList LLT_SEMI 
+   { $$ = makeInterfaceNodeImports ($2);
+     /* assume subspecs are already processed, symbol table info in external file */
+   }
+
+uses   
+ : LLT_USES traitRefNodeList LLT_SEMI  
+   { $$ = makeInterfaceNodeUses ($2); readlsignatures ($$);}
+
+export
+ : constDeclaration
+   { declareConstant ($1); $$ = interfaceNode_makeConst ($1); }
+ | varDeclaration
+   { declareVar ($1); $$ = interfaceNode_makeVar ($1); }
+ | type
+   { declareType ($1); $$ = interfaceNode_makeType ($1); }
+ | fcn
+   { declareFcn ($1, typeId_invalid); $$ = interfaceNode_makeFcn ($1); }
+ | claim
+   { $$ = interfaceNode_makeClaim ($1); }
+ | iter
+   { declareIter ($1); $$ = interfaceNode_makeIter ($1); }                              
+
+iter 
+ : LLT_ITER varId LLT_LPAR iterParamList LLT_RPAR LLT_SEMI
+   { $$ = makeIterNode ($2, $4); }
+ 
+iterParamList      
+ : /* empty */         { $$ = paramNodeList_new (); }
+ | realIterParamList   { $$ = $1; }
+ 
+realIterParamList  
+ : iterParam           
+   { $$ = paramNodeList_add (paramNodeList_new (), $1); }
+ | realIterParamList LLT_COMMA iterParam  
+   { $$ = paramNodeList_add ($1,$3); }     
+   
+iterParam          
+ : LLT_YIELD param            { $$ = markYieldParamNode ($2); }
+ | param                  { $$ = $1; }
+
+private   
+ : LLT_SPEC { symtable_export (g_symtab, FALSE); } private2 
+   { $$ = $3; symtable_export (g_symtab, TRUE); } 
+
+private2 
+ : constDeclaration
+   { declarePrivConstant ($1); $$ =  interfaceNode_makePrivConst ($1); } 
+ | varDeclaration
+   { declarePrivVar ($1); $$ = interfaceNode_makePrivVar ($1); }
+ | type 
+   { declarePrivType ($1); $$ = interfaceNode_makePrivType ($1); }
+ | fcn
+   { declarePrivFcn ($1, typeId_invalid); $$ = interfaceNode_makePrivFcn ($1); }
+
+constDeclaration   
+ : LLT_CONSTANT lclTypeSpec initDecls LLT_SEMI
+   { $$ = makeConstDeclarationNode ($2, $3); } 
+
+varDeclaration    
+ : lclTypeSpec initDecls LLT_SEMI
+   { $$ = makeVarDeclarationNode ($1, $2, FALSE, FALSE); $$->qualifier = QLF_NONE; } 
+ | LLT_CONST lclTypeSpec initDecls LLT_SEMI
+   { $$ = makeVarDeclarationNode ($2, $3, FALSE, FALSE); $$->qualifier = QLF_CONST; } 
+ | LLT_VOLATILE lclTypeSpec initDecls LLT_SEMI
+   { $$ = makeVarDeclarationNode ($2, $3, FALSE, FALSE); $$->qualifier = QLF_VOLATILE; }
+
+type
+ : abstract                     { $$ = makeAbstractTypeNode ($1); } 
+ | exposed                      { $$ = makeExposedTypeNode ($1); } 
+
+special
+ : LLT_PRINTFLIKE  { $$ = qual_createPrintfLike (); }
+ | LLT_SCANFLIKE   { $$ = qual_createScanfLike (); }
+ | LLT_MESSAGELIKE { $$ = qual_createMessageLike (); }
+
+fcn   
+ : lclTypeSpec declarator globals { enteringFcnScope ($1, $2, $3); } LLT_LBRACE
+   privateInits optLetDecl optChecks optRequire optModify optEnsure optClaim LLT_RBRACE
+   { $$ = makeFcnNode (qual_createUnknown (), $1, $2, $3, $6, $7, 
+		       $8, $9, $10, $11, $12); 
+     /* type, declarator, glovbls, privateinits,
+	lets, checks, requires, modifies, ensures, claims */
+     symtable_exitScope (g_symtab);
+   }
+ | special lclTypeSpec declarator globals { enteringFcnScope ($2, $3, $4); }
+   LLT_LBRACE
+   privateInits optLetDecl optChecks optRequire optModify optEnsure optClaim 
+   LLT_RBRACE
+   { $$ = makeFcnNode ($1, $2, $3, $4, $7, 
+		       $8, $9, $10, $11, $12, $13); 
+     /* type, declarator, glovbls, privateinits,
+	lets, checks, requires, modifies, ensures, claims */
+     symtable_exitScope (g_symtab);
+   }
+
+
+claim 
+ : LLT_CLAIMS claimId LLT_LPAR optParamList LLT_RPAR globals
+   { enteringClaimScope ($4, $6); } 
+   LLT_LBRACE optLetDecl optRequire optBody optEnsure LLT_RBRACE
+   {      $$ = makeClaimNode ($2, $4, $6, $9, $10, $11, $12); 
+     symtable_exitScope (g_symtab); } 
+ | LLT_CLAIMS fcnId claimId LLT_SEMI
+   { $$ = (claimNode) 0; }
+
+abstract
+ : LLT_MUTABLE {g_inTypeDef = TRUE; } LLT_TYPE LLT_TYPEDEF_NAME {g_inTypeDef = FALSE; } abstBody
+   { $$ = makeAbstractNode ($1, $4, TRUE, FALSE, $6); } 
+ | LLT_MUTABLE {g_inTypeDef = TRUE; } LLT_REFCOUNTED LLT_TYPE 
+   LLT_TYPEDEF_NAME {g_inTypeDef = FALSE; } abstBody
+   { $$ = makeAbstractNode ($1, $5, TRUE, TRUE, $7); } 
+ | LLT_REFCOUNTED LLT_MUTABLE {g_inTypeDef = TRUE; } LLT_TYPE 
+   LLT_TYPEDEF_NAME {g_inTypeDef = FALSE; } abstBody
+   { $$ = makeAbstractNode ($2, $5, TRUE, TRUE, $7); } 
+ | LLT_IMMUTABLE {g_inTypeDef = TRUE; } LLT_TYPE LLT_TYPEDEF_NAME {g_inTypeDef = FALSE; } abstBody
+   { $$ = makeAbstractNode ($1, $4, FALSE, FALSE, $6); } 
+
+exposed
+ : LLT_TYPEDEF lclTypeSpec { g_inTypeDef = TRUE; setExposedType ($2); } declaratorInvs
+   { g_inTypeDef = FALSE; } LLT_SEMI
+   { $$ = makeExposedNode ($1, $2, $4); /* to support mutually recursive types */ }
+ | structOrUnionSpec LLT_SEMI
+   { $$ = makeExposedNode ($2, makeLclTypeSpecNodeSU ($1), declaratorInvNodeList_new ()); }
+ | enumSpec LLT_SEMI
+   { $$ = makeExposedNode ($2, makeLclTypeSpecNodeEnum ($1), declaratorInvNodeList_new ()); }
+
+/* evs - 26 Feb 1995 (changed to be consistent with C grammar)
+ | STRUCT tagId LLT_SEMI
+   { (void) checkAndEnterTag (TAG_FWDSTRUCT, ltoken_copy ($2));
+     lhForwardStruct ($2); $$ = (exposedNode)0;
+   }
+ | UNION tagId LLT_SEMI
+   { (void) checkAndEnterTag (TAG_FWDUNION, ltoken_copy ($2));
+     lhForwardUnion ($2);
+     $$ = (exposedNode)0; 
+   }
+*/
+
+importNameList  
+ : importName        
+   { $$ = importNodeList_add (importNodeList_new (), $1); } 
+ | importNameList LLT_COMMA importName  
+   { $$ = importNodeList_add ($1, $3); } 
+
+importName       
+ : interfaceName      { $$ = importNode_makePlain ($1); }
+ | simpleOp interfaceName simpleOp
+   { checkBrackets ($1, $3); $$ = importNode_makeBracketed ($2); }
+ | LLT_LCSTRING           { $$ = importNode_makeQuoted ($1); } 
+
+interfaceNameList  
+ : interfaceName                         { $$ = ltokenList_singleton ($1); } 
+ | interfaceNameList LLT_COMMA interfaceName { $$ = ltokenList_push ($1, $3); }
+
+interfaceName   
+ : simpleIdOrTypedefName
+   /* to allow module names to be the same as LCL type names */
+
+traitRefNodeList   
+ : traitRef
+   { $$ = traitRefNodeList_add (traitRefNodeList_new (), $1); } 
+ | traitRefNodeList LLT_COMMA traitRef
+   { $$ = traitRefNodeList_add ($1, $3); } 
+
+traitRef   
+ : traitId
+   { $$ = makeTraitRefNode (ltokenList_singleton ($1), (renamingNode)0); } 
+ | traitId LLT_LPAR renaming LLT_RPAR
+   { $$ = makeTraitRefNode (ltokenList_singleton ($1), $3); } 
+ | LLT_LPAR traitIdList LLT_RPAR
+   { $$ = makeTraitRefNode ($2, (renamingNode)0); } 
+ | LLT_LPAR traitIdList LLT_RPAR LLT_LPAR renaming LLT_RPAR
+   { $$ = makeTraitRefNode ($2, $5); } 
+
+traitIdList   
+ : traitId                     { $$ = ltokenList_singleton ($1); } 
+ | traitIdList LLT_COMMA traitId   { $$ = ltokenList_push ($1, $3); } 
+
+renaming   
+ : replaceNodeList   
+   { $$ = makeRenamingNode (typeNameNodeList_new (), $1); } 
+ | nameList
+   { $$ = makeRenamingNode ($1, replaceNodeList_new ()); } 
+ | nameList LLT_COMMA replaceNodeList { $$ = makeRenamingNode ($1, $3); } 
+ 
+nameList
+ : typeName
+   { $$ = typeNameNodeList_add (typeNameNodeList_new (), $1); } 
+ | nameList LLT_COMMA typeName       { $$ = typeNameNodeList_add ($1, $3); } 
+
+replaceNodeList   
+ : replace
+   { $$ = replaceNodeList_add (replaceNodeList_new (), $1); } 
+ | replaceNodeList LLT_COMMA replace { $$ = replaceNodeList_add ($1, $3); } 
+
+replace
+ : typeName LLT_FOR CType            { $$ = makeReplaceNode ($2, $1, TRUE, $3, NULL, NULL); } 
+ | typeName LLT_FOR name             { $$ = makeReplaceNameNode ($2, $1, $3); }
+ | typeName LLT_FOR name signature   { $$ = makeReplaceNode ($2, $1, FALSE, ltoken_undefined,
+							 $3, $4); } 
+
+name    
+ : opId                          { $$ = makeNameNodeId ($1); } 
+ | opForm                        { $$ = makeNameNodeForm ($1); } 
+
+initializer : constLclExpr
+
+constLclExpr : term
+
+initDecls
+ : initDecl 
+   { $$ = initDeclNodeList_add (initDeclNodeList_new (), $1); } 
+ | initDecls LLT_COMMA initDecl      
+   { $$ = initDeclNodeList_add ($1, $3); } 
+
+initDecl  
+ : declarator                    { $$ = makeInitDeclNode ($1, (termNode)0); } 
+ | declarator LLT_EQUALS initializer { $$ = makeInitDeclNode ($1, $3); } 
+
+globals   
+ : /* empty */ /* has the same structure */
+   { $$ = varDeclarationNodeList_new (); }
+ | globals globalDecl
+   { varDeclarationNodeList_addh ($1, $2); $$ = $1; }
+
+globalDecl   
+ : lclTypeSpec initDecls LLT_SEMI    { $$ = makeVarDeclarationNode ($1, $2, TRUE, FALSE); } 
+ | LLT_INTERNAL LLT_SEMI                 { $$ = makeInternalStateNode (); }
+ | LLT_FILESYS LLT_SEMI                  { $$ = makeFileSystemNode (); }
+
+privateInits   
+ : /* empty */                  { $$ = varDeclarationNodeList_new (); }
+ | privateInits privateInit     { varDeclarationNodeList_addh ($1, $2); $$ = $1; }
+
+privateInit   
+ : LLT_PRIVATE lclTypeSpec initDecls LLT_SEMI
+   { $$ = makeVarDeclarationNode ($2, $3, FALSE, TRUE); } 
+
+optLetDecl   
+ : /* empty */                 { $$ = letDeclNodeList_new (); }
+ | LLT_LET beDeclList LLT_SEMI         { $$ = $2; } 
+
+beDeclList   
+ : beDecl                      { $$ = letDeclNodeList_add (letDeclNodeList_new (), $1); } 
+ | beDeclList LLT_COMMA beDecl     { $$ = letDeclNodeList_add ($1, $3); } 
+
+beDecl   
+ : varId LLT_COLON sortSpec LLT_BE term { $$ = makeLetDeclNode ($1, $3, $5); } 
+ | varId                LLT_BE term { $$ = makeLetDeclNode ($1, (lclTypeSpecNode)0, $3); } 
+
+sortSpec : lclTypeSpec
+
+optChecks   
+ : /* empty */                  { $$ = (lclPredicateNode)0; }
+ | LLT_CHECKS lclPredicate LLT_SEMI     { checkLclPredicate ($1, $2); $$ = makeChecksNode ($1, $2); }
+
+optRequire
+ : /* empty */                  { $$ = (lclPredicateNode)0; }
+ | LLT_REQUIRES lclPredicate LLT_SEMI   { checkLclPredicate ($1, $2); $$ = makeRequiresNode ($1, $2);} 
+
+optModify
+ : /* empty */                  { $$ = (modifyNode)0; }
+ | LLT_MODIFIES LLT_NOTHING LLT_SEMI        { $$ = makeModifyNodeSpecial ($1, TRUE); } 
+ | LLT_MODIFIES LLT_ANYTHING LLT_SEMI       { $$ = makeModifyNodeSpecial ($1, FALSE); } 
+ | LLT_MODIFIES storeRefList LLT_SEMI   { $$ = makeModifyNodeRef ($1, $2); } 
+
+storeRefList   
+ : storeRef                     { $$ = storeRefNodeList_add (storeRefNodeList_new (), $1); } 
+ | storeRefList LLT_COMMA storeRef  { $$ = storeRefNodeList_add ($1, $3); } 
+
+storeRef   
+ : term                         { $$ = makeStoreRefNodeTerm ($1); } 
+ | lclType                      { $$ = makeStoreRefNodeType ($1, FALSE); } 
+ | LLT_OBJ lclType                  { $$ = makeStoreRefNodeType ($2, TRUE); } 
+ | LLT_INTERNAL                     { $$ = makeStoreRefNodeInternal (); }
+ | LLT_FILESYS                      { $$ = makeStoreRefNodeSystem (); }
+
+optEnsure
+ : /* empty */                  { $$ = (lclPredicateNode)0; }
+ | LLT_ENSURES lclPredicate LLT_SEMI    { checkLclPredicate ($1, $2); $$ = makeEnsuresNode ($1, $2);} 
+
+optClaim   
+ : /* empty */                  { $$ = (lclPredicateNode)0; }
+ | LLT_CLAIMS lclPredicate LLT_SEMI     { checkLclPredicate ($1, $2); $$ = makeIntraClaimNode ($1, $2);} 
+
+optParamList       
+ : /* empty */                  { $$ = paramNodeList_new (); }
+ | realParamList                { $$ = $1; }
+
+realParamList      
+ : paramList
+ | LLT_TELIPSIS                  { $$ = paramNodeList_add (paramNodeList_new (), paramNode_elipsis ()); }
+ | paramList LLT_COMMA LLT_TELIPSIS  { $$ = paramNodeList_add ($1, paramNode_elipsis ()); }
+
+paramList   
+ : param                     { $$ = paramNodeList_single ($1); }
+ | paramList LLT_COMMA param     { $$ = paramNodeList_add ($1, $3); } 
+
+optBody
+ : /* empty */                      { $$ = (programNode)0; }
+ | LLT_BODY LLT_LBRACE callExpr LLT_RBRACE      { $$ = $3; } 
+ | LLT_BODY LLT_LBRACE callExpr LLT_SEMI LLT_RBRACE { $$ = $3; } 
+
+callExpr   
+ : stmt                             { $$ = makeProgramNode ($1); } 
+ | LLT_LPAR callExpr LLT_RPAR 
+   /* may need to make a copy of $2 */
+   { $$ = $2; $$->wrapped = $$->wrapped + 1; } 
+ | callExpr LLT_MULOP        %prec ITERATION_OP
+   { programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, $1);
+     $$ = makeProgramNodeAction (x, ACT_ITER); 
+   } 
+ | callExpr LLT_VERTICALBAR callExpr  
+   { programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, $1);
+     programNodeList_addh (x, $3);
+     $$ = makeProgramNodeAction (x, ACT_ALTERNATE); 
+   } 
+ | callExpr LLT_SEMI callExpr   
+   { programNodeList x = programNodeList_new ();
+     programNodeList_addh (x, $1);
+     programNodeList_addh (x, $3);
+     $$ = makeProgramNodeAction (x, ACT_SEQUENCE); 
+   } 
+
+stmt               
+ : fcnId LLT_LPAR valueList LLT_RPAR 
+   { $$ = makeStmtNode (ltoken_undefined, $1, $3); } 
+ | fcnId LLT_LPAR LLT_RPAR
+   { $$ = makeStmtNode (ltoken_undefined, $1, termNodeList_new ()); }
+ | varId LLT_EQUALS fcnId LLT_LPAR LLT_RPAR
+   { $$ = makeStmtNode ($1, $3, termNodeList_new ()); } 
+ | varId LLT_EQUALS fcnId LLT_LPAR valueList LLT_RPAR
+   { $$ = makeStmtNode ($1, $3, $5); }
+
+valueList   
+ : value                 { $$ = termNodeList_push (termNodeList_new (), $1); } 
+ | valueList LLT_COMMA value { $$ = termNodeList_push ($1, $3); } 
+
+value   
+ : cLiteral
+ | varId                            { $$ = makeSimpleTermNode ($1); } 
+ | simpleOp value %prec PREFIX_OP   { $$ = makePrefixTermNode ($1, $2); } 
+ | value simpleOp  %prec POSTFIX_OP { $$ = makePostfixTermNode2 ($1, $2); } 
+ | value simpleOp value /* infix */ { $$ = makeInfixTermNode ($1, $2, $3); }
+ | LLT_LPAR value LLT_RPAR                  { $$ = $2; $$->wrapped = $$->wrapped + 1; }
+ | fcnId LLT_LPAR LLT_RPAR
+   { $$ = makeOpCallTermNode ($1, $2, termNodeList_new (), $3); }
+ | fcnId LLT_LPAR valueList LLT_RPAR
+   { $$ = makeOpCallTermNode ($1, $2, $3, $4); } 
+
+abstBody   
+ : LLT_SEMI                                  { $$ = (abstBodyNode)0; } 
+ | LLT_LBRACE fcns LLT_RBRACE                    { $$ = makeAbstBodyNode ($1, $2); }
+ | LLT_LBRACE interfaceNameList LLT_RBRACE LLT_SEMI  { $$ = makeAbstBodyNode2 ($1, $2); }
+ | LLT_LBRACE LLT_RBRACE LLT_SEMI                    { $$ = (abstBodyNode)0; }
+
+fcns   
+ : /* empty */                           { $$ = fcnNodeList_new (); }
+ | fcns fcn                              { $$ = fcnNodeList_add ($1, $2); } 
+
+optTypeInv   
+ : /* empty */                           { $$ = (lclPredicateNode)0; }
+ | typeInv
+
+typeInv   
+ : LLT_CONSTRAINT { g_inTypeDef = FALSE; } quantifier LLT_LPAR lclPredicate LLT_RPAR
+   { $5->tok = $1; $5->kind = LPD_CONSTRAINT;
+     checkLclPredicate ($1, $5);
+     $$ = $5;
+     symtable_exitScope (g_symtab); 
+     g_inTypeDef = TRUE;
+   }
+
+declaratorInvs     
+ : declaratorInv        { $$ = declaratorInvNodeList_add (declaratorInvNodeList_new (), $1); } 
+ | declaratorInvs LLT_COMMA declaratorInv
+   { $$ = declaratorInvNodeList_add ($1, $3); } 
+
+declaratorInv      
+ : declarator { declareForwardType ($1); } optExposedBody
+   { $$ = makeDeclaratorInvNode ($1, $3); } 
+
+optExposedBody   
+ : /* empty */                  { $$ = (abstBodyNode)0; }
+ | LLT_LBRACE optTypeInv LLT_RBRACE     { $$ = makeExposedBodyNode ($1, $2); }
+
+CType   
+ : LLT_VOID           { $$ = $1; ltoken_setIntField ($$, fixBits (TS_VOID, 0)); }
+ | LLT_CHAR           { $$ = $1; ltoken_setIntField ($$, fixBits (TS_CHAR, 0)); }
+ | LLT_DOUBLE         { $$ = $1; ltoken_setIntField ($$, fixBits (TS_DOUBLE, 0)); }
+ | LLT_FLOAT          { $$ = $1; ltoken_setIntField ($$, fixBits (TS_FLOAT, 0)); }
+ | LLT_INT            { $$ = $1; ltoken_setIntField ($$, fixBits (TS_INT, 0)); }
+ | LLT_LONG           { $$ = $1; ltoken_setIntField ($$, fixBits (TS_LONG, 0)); }
+ | LLT_SHORT          { $$ = $1; ltoken_setIntField ($$, fixBits (TS_SHORT, 0)); }
+ | LLT_SIGNED         { $$ = $1; ltoken_setIntField ($$, fixBits (TS_SIGNED, 0)); }
+ | LLT_UNSIGNED       { $$ = $1; ltoken_setIntField ($$, fixBits (TS_UNSIGNED, 0)); }
+ | LLT_UNKNOWN        { $$ = $1; ltoken_setIntField ($$, fixBits (TS_UNKNOWN, 0)); }
+
+/*
+** CTypes allow "unsigned short int" but we drop all C type qualifiers 
+** and storage class except TYPEDEF 
+*/
+
+CTypes   
+ : CType                       { $$ = makeCTypesNode ((CTypesNode)0, $1); }
+ | CTypes CType                { $$ = makeCTypesNode ($1, $2); } 
+
+/* Add abstract type names and typedef names */
+
+typeSpecifier   
+ : LLT_TYPEDEF_NAME                
+   { $$ = makeTypeSpecifier ($1); }
+ | CTypes                      
+   { $$ = $1; $$->sort = sort_lookupName (lclctype_toSort ($1->intfield)); } 
+
+/* Add struct and enum types */
+
+specialQualifier
+ : LLT_OUT       { $$ = qual_createOut (); }
+ | LLT_UNUSED { $$ = qual_createUnused (); } 
+ | LLT_SEF       { $$ = qual_createSef (); }
+ | LLT_ONLY      { $$ = qual_createOnly (); }
+ | LLT_OWNED     { $$ = qual_createOwned (); }
+ | LLT_DEPENDENT { $$ = qual_createDependent (); }
+ | LLT_KEEP      { $$ = qual_createKeep (); }
+ | LLT_KEPT      { $$ = qual_createKept (); }
+ | LLT_OBSERVER  { $$ = qual_createObserver (); }
+ | LLT_EXITS     { $$ = qual_createExits (); }
+ | LLT_MAYEXIT   { $$ = qual_createMayExit (); }
+ | LLT_TRUEEXIT  { $$ = qual_createTrueExit (); }
+ | LLT_FALSEEXIT { $$ = qual_createFalseExit (); }
+ | LLT_NEVEREXIT { $$ = qual_createNeverExit (); }
+ | LLT_TEMP      { $$ = qual_createOnly (); }
+ | LLT_SHARED    { $$ = qual_createShared (); }
+ | LLT_UNIQUE    { $$ = qual_createUnique (); }
+ | LLT_CHECKED   { $$ = qual_createChecked (); }
+ | LLT_UNCHECKED { $$ = qual_createUnchecked (); }
+ | LLT_CHECKEDSTRICT { $$ = qual_createCheckedStrict (); }
+ | LLT_TRUENULL  { $$ = qual_createTrueNull (); }
+ | LLT_FALSENULL { $$ = qual_createFalseNull (); }
+ | LLT_RELNULL   { $$ = qual_createRelNull (); }
+ | LLT_RELDEF    { $$ = qual_createRelDef (); }
+ | LLT_REFCOUNTED{ $$ = qual_createRefCounted (); }
+ | LLT_REFS      { $$ = qual_createRefs (); }
+ | LLT_NEWREF    { $$ = qual_createNewRef (); }
+ | LLT_KILLREF   { $$ = qual_createKillRef (); }
+ | LLT_LNULL     { $$ = qual_createNull (); }
+ | LLT_LNOTNULL  { $$ = qual_createNotNull (); }
+ | LLT_RETURNED  { $$ = qual_createReturned (); }
+ | LLT_EXPOSED   { $$ = qual_createExposed (); }
+ | LLT_PARTIAL   { $$ = qual_createPartial (); }
+ | LLT_UNDEF { $$ = qual_createUndef (); }
+ | LLT_KILLED { $$ = qual_createKilled (); }
+
+lclTypeSpec   
+ : typeSpecifier                        
+   { $$ = makeLclTypeSpecNodeType ($1); } /* does not process CONST at all */
+ | structOrUnionSpec                    
+   { $$ = makeLclTypeSpecNodeSU ($1); }
+ | enumSpec                             
+   { $$ = makeLclTypeSpecNodeEnum ($1); }
+ | specialQualifier lclTypeSpec         
+   { $$ = lclTypeSpecNode_addQual ($2, $1); }
+ | LLT_VERTICALBAR lclType LLT_COLON lclType LLT_VERTICALBAR
+   { $$ = makeLclTypeSpecNodeConj ($2, $4); } 
+
+/* 
+** Add pointers to the right, only used in StoreRef, maybe should throw
+** out and replace its use in StoreRef by CTypeName 
+*/
+
+lclType     
+ : lclTypeSpec 
+ | lclTypeSpec pointers 
+   { llassert (lclTypeSpecNode_isDefined ($1));
+     $1->pointers = $2; $$ = $1; }
+
+pointers   
+ : LLT_MULOP          { $$ = 1; }
+ | pointers LLT_MULOP { $$ = $1 + 1; } 
+
+structOrUnionSpec  
+ : LLT_STRUCT optTagId 
+   { (void) checkAndEnterTag (TAG_FWDSTRUCT, ltoken_copy ($2)); } 
+   LLT_LBRACE structDecls LLT_RBRACE
+   { $$ = makestrOrUnionNode ($1, SU_STRUCT, $2, $5); }
+ | LLT_UNION optTagId  
+   { (void) checkAndEnterTag (TAG_FWDUNION, ltoken_copy ($2)); } 
+   LLT_LBRACE structDecls LLT_RBRACE
+   { $$ = makestrOrUnionNode ($1, SU_UNION, $2, $5); }
+ | LLT_STRUCT tagId 
+   { $$ = makeForwardstrOrUnionNode ($1, SU_STRUCT, $2); }
+ | LLT_UNION tagId  
+   { $$ = makeForwardstrOrUnionNode ($1, SU_UNION, $2); }
+
+optTagId    
+ : /* empty */ { $$ = ltoken_undefined; }
+ | tagId
+
+structDecls   
+ : structDecl               { $$ = stDeclNodeList_add (stDeclNodeList_new (), $1); } 
+ | structDecls structDecl   { $$ = stDeclNodeList_add ($1, $2); } 
+
+/* We don't allow specification of field size */
+
+structDecl   
+ : lclTypeSpec declaratorList LLT_SEMI { $$ = makestDeclNode ($1, $2); } 
+
+declaratorList   
+ : declarator                       
+   { $$ = declaratorNodeList_add (declaratorNodeList_new (), $1); } 
+ | declaratorList LLT_COMMA declarator  
+   { $$ = declaratorNodeList_add ($1, $3); } 
+
+optCOMMA           
+ : /* empty */ { ; }
+ | LLT_COMMA       { ; }
+
+enumSpec   
+ : LLT_ENUM optTagId LLT_LBRACE enumeratorList optCOMMA LLT_RBRACE
+   { $$ = makeEnumSpecNode ($1, $2, $4); } 
+ | LLT_ENUM tagId
+   { $$ = makeEnumSpecNode2 ($1, $2); } 
+
+enumeratorList   
+ : simpleId                             { $$ = ltokenList_singleton ($1); } 
+ | enumeratorList LLT_COMMA simpleId        { $$ = ltokenList_push ($1, $3); } 
+
+/* This part of declarator rules is adapted from GCC (2.2.1)'s C grammar */
+
+/* An after_type_decl is a declarator that is allowed only after an explicit 
+   typeSpecifier, an id can be typedef'd here.  
+   A notype_decl is a declarator that may not have seen a typeSpecifier
+   preceding it; it cannot typedef'd an id.  */
+
+declarator   
+ : after_type_decl                      { $$ = makeDeclaratorNode ($1); }
+ | notype_decl                          { $$ = makeDeclaratorNode ($1); }
+
+notype_decl    
+ : varId                                { $$ = makeTypeExpr ($1); }
+ | LLT_LPAR notype_decl LLT_RPAR        { $$ = $2; $$->wrapped = $$->wrapped + 1; } 
+ | LLT_MULOP notype_decl                { $$ = makePointerNode ($1, $2); } 
+ | notype_decl arrayQual                { $$ = makeArrayNode ($1, $2); } 
+ | notype_decl LLT_LPAR LLT_RPAR                { $$ = makeFunctionNode ($1, paramNodeList_new ()); } 
+ | notype_decl LLT_LPAR realParamList LLT_RPAR  { $$ = makeFunctionNode ($1, $3); }
+
+after_type_decl    
+ : LLT_TYPEDEF_NAME                         { $$ = makeTypeExpr ($1); }
+ | LLT_LPAR after_type_decl LLT_RPAR        { $$ = $2; $$->wrapped = $$->wrapped + 1; }
+ | LLT_MULOP after_type_decl                { $$ = makePointerNode ($1, $2); } 
+ | after_type_decl arrayQual                { $$ = makeArrayNode ($1, $2); } 
+ | after_type_decl LLT_LPAR LLT_RPAR                { $$ = makeFunctionNode ($1, paramNodeList_new ()); } 
+ | after_type_decl LLT_LPAR realParamList LLT_RPAR  { $$ = makeFunctionNode ($1, $3); }
+
+/* A parameter_decl is a decl that can appear in a parameter list.  
+   We disallow the old C way of giving only the id names without types.
+   A parameter_decl is like an after_type_decl except that it does not
+   allow a TYPEDEF_NAME to appear in parens.  It will conflict with a
+   a function with that typedef as an argument */
+
+parameter_decl     
+ : LLT_TYPEDEF_NAME                             { $$ = makeTypeExpr ($1); } 
+ | LLT_MULOP parameter_decl /* %prec UNARY */   { $$ = makePointerNode ($1, $2); } 
+ | parameter_decl arrayQual                 { $$ = makeArrayNode ($1, $2); } 
+ | parameter_decl LLT_LPAR LLT_RPAR                 { $$ = makeFunctionNode ($1, paramNodeList_new ()); } 
+ | parameter_decl LLT_LPAR realParamList LLT_RPAR   { $$ = makeFunctionNode ($1, $3); } 
+
+/* param : the last production allows C types to be generated without the
+   parameter name */
+
+param   
+ : lclTypeSpec parameter_decl               { $$ = makeParamNode ($1, $2); } 
+ | lclTypeSpec notype_decl                  { $$ = makeParamNode ($1, $2); } 
+ | lclTypeSpec optAbstDeclarator            { $$ = makeParamNode ($1, $2); } 
+/*
+** | OUT lclTypeSpec parameter_decl           { $$ = makeOutParamNode ($1, $2, $3); } 
+** | OUT lclTypeSpec notype_decl              { $$ = makeOutParamNode ($1, $2, $3); } 
+** | OUT lclTypeSpec optAbstDeclarator        { $$ = makeOutParamNode ($1, $2, $3); } 
+*/
+
+/* typeName is only used in trait parameter renaming */
+
+typeName   
+ : lclTypeSpec optAbstDeclarator           { $$ = makeTypeNameNode (FALSE, $1, $2); } 
+ | LLT_OBJ lclTypeSpec optAbstDeclarator       { $$ = makeTypeNameNode (TRUE, $2, $3); } 
+ | opForm                                  { $$ = makeTypeNameNodeOp ($1); } 
+
+/* Abstract declarator is like a declarator, but with no identifier */
+ 
+optAbstDeclarator  
+ : /* empty */                            { $$ = (abstDeclaratorNode)0; }
+ | abstDeclarator                         { $$ = (abstDeclaratorNode)$1; } 
+
+abstDeclarator   
+ : LLT_LPAR abstDeclarator LLT_RPAR               { $$ = $2; $$->wrapped = $$->wrapped + 1; }
+ | LLT_MULOP abstDeclarator                   { $$ = makePointerNode ($1, $2); } 
+ | LLT_MULOP                                  { $$ = makePointerNode ($1, (typeExpr)0); } 
+ | arrayQual                              { $$ = makeArrayNode ((typeExpr)0, $1); } 
+ | abstDeclarator arrayQual               { $$ = makeArrayNode ($1, $2); } 
+ | abstDeclarator LLT_LPAR LLT_RPAR               { $$ = makeFunctionNode ($1, paramNodeList_new ()); } 
+ | LLT_LPAR realParamList LLT_RPAR                { $$ = makeFunctionNode ((typeExpr)0, $2); } 
+ | abstDeclarator LLT_LPAR realParamList LLT_RPAR { $$ = makeFunctionNode ($1, $3); } 
+
+arrayQual   
+ : LLT_LBRACKET LLT_RBRACKET                     { $$ = makeArrayQualNode ($1, (termNode)0); } 
+ | LLT_LBRACKET constLclExpr LLT_RBRACKET        { $$ = makeArrayQualNode ($1, $2); } 
+
+opForm   
+ : LLT_IF markerSym LLT_THEN markerSym LLT_ELSE markerSym
+   { $$ = makeOpFormNode ($1, OPF_IF, opFormUnion_createMiddle (0), ltoken_undefined); }
+ | anyOp
+   { $$ = makeOpFormNode ($1, OPF_ANYOP, opFormUnion_createAnyOp ($1), ltoken_undefined); }
+ | markerSym anyOp
+   { $$ = makeOpFormNode ($1, OPF_MANYOP, opFormUnion_createAnyOp ($2), ltoken_undefined); }
+ | anyOp markerSym
+   { $$ = makeOpFormNode ($1, OPF_ANYOPM, opFormUnion_createAnyOp ($1), ltoken_undefined); }
+ | markerSym anyOp markerSym
+   { $$ = makeOpFormNode ($1, OPF_MANYOPM, 
+			  opFormUnion_createAnyOp ($2), ltoken_undefined); }
+ | open middle close
+   { $$ = makeOpFormNode ($1, OPF_MIDDLE, opFormUnion_createMiddle ($2), $3); }
+ | markerSym open middle close
+   { $$ = makeOpFormNode ($1, OPF_MMIDDLE, opFormUnion_createMiddle ($3), $4); }
+ | open middle close markerSym
+   { $$ = makeOpFormNode ($1, OPF_MIDDLEM, opFormUnion_createMiddle ($2), $3); }
+ | markerSym open middle close markerSym
+   { $$ = makeOpFormNode ($2, OPF_MMIDDLEM, opFormUnion_createMiddle ($3), $4); }
+ | LLT_LBRACKET middle LLT_RBRACKET
+   { $$ = makeOpFormNode ($1, OPF_BMIDDLE, opFormUnion_createMiddle ($2), $3); }
+ | LLT_LBRACKET middle LLT_RBRACKET markerSym
+   { $$ = makeOpFormNode ($1, OPF_BMIDDLEM, opFormUnion_createMiddle ($2), $3); }
+
+   /* added the next 6 productions (wrt old checker) to complete LSL grammar
+   ** LSL treats '[' and '{' as openSym but LCL treats them as LLT_LBRACKET and
+   ** LLT_LBRACE, and hence the need for these separate productions 
+   */
+
+ | markerSym LLT_LBRACKET middle LLT_RBRACKET 
+   { $$ = makeOpFormNode ($2, OPF_BMMIDDLE, opFormUnion_createMiddle ($3), $4); }
+ | markerSym LLT_LBRACKET middle LLT_RBRACKET markerSym
+   { $$ = makeOpFormNode ($2, OPF_BMMIDDLEM, opFormUnion_createMiddle ($3), $4); }
+ | selectSym simpleIdOrTypedefName
+   { $$ = makeOpFormNode ($1, OPF_SELECT, 
+			  opFormUnion_createAnyOp ($2), ltoken_undefined); }
+ | mapSym simpleIdOrTypedefName
+   { $$ = makeOpFormNode ($1, OPF_MAP, 
+			  opFormUnion_createAnyOp ($2), ltoken_undefined); }
+ | markerSym selectSym simpleIdOrTypedefName
+   { $$ = makeOpFormNode ($1, OPF_MSELECT, 
+			  opFormUnion_createAnyOp ($3), ltoken_undefined); }
+ | markerSym mapSym simpleIdOrTypedefName
+   { $$ = makeOpFormNode ($1, OPF_MMAP, 
+			  opFormUnion_createAnyOp ($3), ltoken_undefined); }
+
+open   
+ : openSym
+ | LLT_LBRACE
+
+close   
+ : closeSym
+ | LLT_RBRACE 
+
+anyOp   
+ : simpleOp2
+ | logicalOp
+ | eqOp
+
+middle   
+ : /* empty */               { $$ = 0; }
+ | placeList
+
+placeList   
+ : markerSym                      { $$ = 1; }
+ | placeList separator markerSym  { $$ = $1 + 1; }
+
+separator   
+ : LLT_COMMA
+ | sepSym
+
+signature   
+ : LLT_COLON domain mapSym sortId   { $$ = makesigNode ($1, $2, $4); } 
+
+domain   
+ : /* empty */               { $$ = ltokenList_new (); }
+ | sortList
+
+sortList   
+ : sortId                    { $$ = ltokenList_singleton ($1); } 
+ | sortList LLT_COMMA sortId     { $$ = ltokenList_push ($1, $3); } 
+
+lclPredicate   
+ : term                      { $$ = makeLclPredicateNode (ltoken_undefined, $1, LPD_PLAIN);} 
+
+term 
+ : term0                     { $$ = checkSort ($1); }
+
+/* When "if  then  else  .  "
+   shift instead of reduce */
+
+term0   
+ : LLT_IF term0 LLT_THEN term0 LLT_ELSE term0 %prec LLT_IF_THEN_ELSE
+   { $$ = makeIfTermNode ($1,$2,$3,$4,$5,$6); } 
+ | equalityTerm
+ | term0 logicalOp term0          { $$ = makeInfixTermNode ($1, $2, $3); } 
+
+equalityTerm   
+ : simpleOpTerm   /* was   | quantifiers LLT_LPAR term LLT_RPAR */
+ | quantifiers LLT_LPAR lclPredicate LLT_RPAR
+   /* temp fix, should change interface in future, add lclPredicateKind too */
+   { checkLclPredicate ($2, $3); $$ = makeQuantifiedTermNode ($1, $2, $3->predicate, $4);
+     symtable_exitScope (g_symtab); 
+   } 
+ | simpleOpTerm eqOp simpleOpTerm
+   { $$ = makeInfixTermNode ($1, $2, $3);} 
+ | simpleOpTerm LLT_EQUALS simpleOpTerm 
+   { $$ = makeInfixTermNode ($1, $2, $3);} 
+
+simpleOpTerm   
+ : prefixOpTerm
+ | secondary postfixOps          { $$ = makePostfixTermNode ($1, $2); } 
+ | secondary infixOpPart         { $$ = CollapseInfixTermNode ($1, $2); } 
+
+simpleOp2          
+ : simpleOp
+ | LLT_MULOP
+
+prefixOpTerm   
+ : secondary
+ | simpleOp2 prefixOpTerm          { $$ = makePrefixTermNode ($1, $2); } 
+
+postfixOps   
+ : simpleOp2                       { $$ = ltokenList_singleton ($1); } 
+ | postfixOps simpleOp2            { $$ = ltokenList_push ($1, $2); } 
+
+infixOpPart   
+ : simpleOp2 secondary             { $$ = pushInfixOpPartNode (termNodeList_new (), $1, $2); } 
+ | infixOpPart simpleOp2 secondary { $$ = pushInfixOpPartNode ($1, $2, $3); } 
+
+secondary   
+ : primary
+ | bracketed                 { $$ = computePossibleSorts ($1); } 
+ | bracketed primary         { $$ = updateMatchedNode ((termNode)0, $1, $2); }
+ | primary bracketed         { $$ = updateMatchedNode ($1, $2, (termNode)0); }
+ | primary bracketed primary { $$ = updateMatchedNode ($1, $2, $3); }
+ | sqBracketed               { $$ = computePossibleSorts ($1); } 
+ | sqBracketed primary       { $$ = updateSqBracketedNode ((termNode)0, $1, $2); }
+
+bracketed   
+ : matched LLT_COLON sortId    { $$ = $1; $$->sort = sort_lookupName (ltoken_getText ($3)); }
+ | matched
+
+sqBracketed   
+ : LLT_LBRACKET args LLT_RBRACKET LLT_COLON sortId
+   { $$ = makeSqBracketedNode ($1, $2, $3); 
+     $$->given = sort_lookupName (ltoken_getText ($5)); }
+ | LLT_LBRACKET args LLT_RBRACKET
+   { $$ = makeSqBracketedNode ($1, $2, $3); } 
+ | LLT_LBRACKET  LLT_RBRACKET LLT_COLON sortId
+   { $$ = makeSqBracketedNode ($1, termNodeList_new (), $2); 
+     $$->given = sort_lookupName (ltoken_getText ($4)); 
+   }
+ | LLT_LBRACKET  LLT_RBRACKET
+   { $$ = makeSqBracketedNode ($1, termNodeList_new (), $2); } 
+
+matched      
+ : open args  close          { $$ = makeMatchedNode ($1, $2, $3); } 
+ | open close                { $$ = makeMatchedNode ($1, termNodeList_new (), $2); } 
+
+args   
+ : term                      { $$ = termNodeList_push (termNodeList_new (), $1); } 
+ | args separator term       { $$ = termNodeList_push ($1, $3); } 
+
+primary   
+ : LLT_LPAR term0 LLT_RPAR           /* may need to make a copy of $2 */
+   { $$ = $2; $$->wrapped = $$->wrapped + 1; }
+ | varId
+   { $$ = makeSimpleTermNode ($1); } 
+ | opId LLT_LPAR termList LLT_RPAR
+   { $$ = makeOpCallTermNode ($1, $2, $3, $4); } 
+ | lclPrimary
+ | primary stateFcn
+   { $$ = makePostfixTermNode2 ($1, $2); }  
+ | primary selectSym simpleIdOrTypedefName
+   { ltoken_markOwned ($3); $$ = makeSelectTermNode ($1, $2, $3); } 
+ | primary mapSym simpleIdOrTypedefName
+   { ltoken_markOwned ($3); $$ = makeMapTermNode ($1, $2, $3); } 
+ | primary LLT_LBRACKET LLT_RBRACKET   
+   { $$ = updateSqBracketedNode ($1, makeSqBracketedNode ($2, termNodeList_new (), $3), 
+				(termNode)0); }
+ | primary LLT_LBRACKET termList LLT_RBRACKET
+   { $$ = updateSqBracketedNode ($1, makeSqBracketedNode ($2, $3, $4), (termNode)0); }
+ | primary LLT_COLON sortId
+   { $$ = $1; $$->given = sort_lookupName (ltoken_getText ($3)); }
+
+termList   
+ : term0                  { $$ = termNodeList_push (termNodeList_new (), $1); } 
+ | termList LLT_COMMA term0   { $$ = termNodeList_push ($1, $3); } 
+
+stateFcn   
+ : preSym
+ | postSym
+ | anySym
+ | LLT_QUOTE
+
+lclPrimary   
+ : cLiteral                         
+ | LLT_RESULT                           { $$ = makeSimpleTermNode ($1); } 
+ | LLT_FRESH LLT_LPAR termList LLT_RPAR         { $$ = makeOpCallTermNode ($1, $2, $3, $4); } 
+ | LLT_UNCHANGED LLT_LPAR LLT_ALL LLT_RPAR          { $$ = makeUnchangedTermNode1 ($1, $3); } 
+ | LLT_UNCHANGED LLT_LPAR storeRefList LLT_RPAR { $$ = makeUnchangedTermNode2 ($1, $3); } 
+ | LLT_SIZEOF LLT_LPAR term LLT_RPAR
+   { termNodeList x = termNodeList_new (); 
+     termNodeList_addh (x, $3);
+     $$ = makeOpCallTermNode ($1, $2, x, $4); 
+   } 
+ | LLT_ISSUB LLT_LPAR term LLT_COMMA term LLT_RPAR
+   { termNodeList x = termNodeList_new ();
+     termNodeList_addh (x, $3);
+     termNodeList_addh (x, $5);
+     $$ = makeOpCallTermNode ($1, $2, x, $6); 
+   } 
+ | LLT_SIZEOF LLT_LPAR lclTypeSpec LLT_RPAR       { $$ = makeSizeofTermNode ($1, $3); } 
+
+/* removed 94-Mar-25:
+**   | MODIFIES LLT_LPAR term LLT_RPAR
+**                             {termNodeList x = termNodeList_new ();
+**          termNodeList_addh (x, $3);
+**        $$ = makeOpCallTermNode ($1, $2, x, $4); } 
+*/
+
+cLiteral   
+ : LLT_CINTEGER  { $$ = makeLiteralTermNode ($1, sort_int); }
+ | LLT_LCSTRING  { $$ = makeLiteralTermNode ($1, sort_cstring); }
+ | LLT_CCHAR     { $$ = makeLiteralTermNode ($1, sort_char); }
+ | LLT_CFLOAT    { $$ = makeLiteralTermNode ($1, sort_double); }
+
+quantifiers   
+ : quantifier
+   { $$ = quantifierNodeList_add (quantifierNodeList_new (), $1); } 
+ | quantifiers quantifier
+   { $$ = quantifierNodeList_add ($1, $2); } 
+
+quantifier   
+ : quantifierSym { scopeInfo si = (scopeInfo) dmalloc (sizeof (*si));
+		   si->kind = SPE_QUANT;
+		   symtable_enterScope (g_symtab, si); }
+   quantifiedList 
+   { $$ = makeQuantifierNode ($3, $1); } 
+
+quantifiedList   
+ : quantified                         { $$ = varNodeList_add (varNodeList_new (), $1); } 
+ | quantifiedList LLT_COMMA quantified    { $$ = varNodeList_add ($1, $3); } 
+
+quantified   
+ : varId LLT_COLON sortSpec     { $$ = makeVarNode ($1, FALSE, $3); } 
+ | varId LLT_COLON LLT_OBJ sortSpec { $$ = makeVarNode ($1, TRUE, $4); } 
+
+simpleIdOrTypedefName  
+ : simpleId
+ | LLT_TYPEDEF_NAME
+
+/* a different name space from varId/fcnId/typeId */
+fcnId : simpleId
+varId : simpleId
+tagId : simpleIdOrTypedefName
+claimId : simpleIdOrTypedefName
+sortId : simpleIdOrTypedefName
+traitId : simpleIdOrTypedefName
+opId : simpleIdOrTypedefName
+
+%%
+
+# include "bison.reset"
+
+/*
+** yytext is set in lex scanner 
+** extern YYSTYPE yylval;  
+** yylval is defined by code generated by bison 
+*/
+
+void ylerror (char *s) 
+{
+  /* 
+  ** This resetting of the left context is very important when multiple
+  ** files are to be parsed.  We do not want failures to propagate.
+  ** Lex/Yacc does not reset the flags when the parsing goes bad.  
+  ** BEGIN 0;        
+  **/
+
+  /*@-mustfree@*/
+  lclfatalerror (yllval.ltok,
+		 message ("%s: Token code: %s, Token String: %s", 
+			  cstring_fromChars (s), 
+			  ltoken_unparseCodeName (yllval.ltok), 
+			  ltoken_getRawString (yllval.ltok)));
+  /*@=mustfree@*/
+}
+
+static void yyprint (FILE *f, int t, YYSTYPE value) 
+{
+  fprintf (f, " type: %d (%s)", t, 
+	   cstring_toCharsSafe (ltoken_getRawString (value.ltok)));
+}
+
+
+
+
+
+
+
diff --git a/src/llmain.c b/src/llmain.c
new file mode 100644
index 0000000..cc3652c
--- /dev/null
+++ b/src/llmain.c
@@ -0,0 +1,2377 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** llmain.c
+**
+** Main module for LCLint checker
+*/
+
+# include 
+
+/*
+** Ensure that WIN32 and _WIN32 are both defined or both undefined.
+*/
+
+# ifdef WIN32
+# ifndef _WIN32
+# error "Inconsistent definitions."
+# endif
+# else
+# ifdef _WIN32
+# error "Inconsistent definitions."
+# endif
+# endif
+
+# ifdef WIN32
+# include 
+# include 
+# endif
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "osd.h"
+
+# ifndef NOLCL
+# include "gram.h"
+# include "lclscan.h"
+# include "scanline.h"
+# include "lclscanline.h"
+# include "lclsyntable.h"
+# include "lcltokentable.h"
+# include "lslparse.h"
+# include "scan.h"
+# include "syntable.h"
+# include "tokentable.h"
+# include "lslinit.h"
+# include "lclinit.h"
+# include "lh.h"
+# include "imports.h"
+# endif
+
+# include "version.h"
+# include "herald.h"
+# include "fileIdList.h"
+# include "lcllib.h"
+# include "cgrammar.h"
+# include "llmain.h"
+# include "portab.h"
+# include "cpp.h"
+# include 
+
+extern /*@external@*/ int yydebug;
+
+static void printMail (void);
+static void printMaintainer (void);
+static void printReferences (void);
+static void printFlags (void);
+static void printAnnotations (void);
+static void printParseErrors (void);
+static void printComments (void);
+static void describePrefixCodes (void);
+static void cleanupFiles (void);
+static void showHelp (void);
+static void interrupt (int p_i);
+static void loadrc (FILE *p_rcfile, cstringSList *p_passThroughArgs);
+static void describeVars (void);
+static bool specialFlagsHelp (char *p_next);
+static bool hasShownHerald = FALSE;
+
+static bool anylcl = FALSE;
+static clock_t inittime;
+
+static /*@only@*/ /*@null@*/ tsource *initFile = (tsource *) 0;
+
+static fileIdList preprocessFiles (fileIdList)
+  /*@modifies fileSystem@*/ ;
+
+# ifndef NOLCL
+
+static
+void lslCleanup (void)
+   /*@globals killed g_symtab@*/
+   /*@modifies internalState, g_symtab@*/
+{
+  /*
+  ** Cleanup all the LCL/LSL.
+  */
+
+  static bool didCleanup = FALSE;
+
+  llassert (!didCleanup);
+  llassert (anylcl);
+
+  didCleanup = TRUE;
+
+  lsymbol_destroyMod ();
+  LCLSynTableCleanup ();
+  LCLTokenTableCleanup ();
+  LCLScanLineCleanup ();
+  LCLScanCleanup ();
+
+  /* clean up LSL parsing */
+
+  lsynTableCleanup ();
+  ltokenTableCleanup ();
+  lscanLineCleanup ();
+  LSLScanCleanup ();
+
+  symtable_free (g_symtab);
+  sort_destroyMod (); 
+}
+
+static
+  void lslInit (void)
+  /*@globals undef g_symtab; @*/
+  /*@modifies g_symtab, internalState, fileSystem; @*/
+{
+  /*
+  ** Open init file provided by user, or use the default LCL init file 
+  */
+  
+  cstring larchpath = context_getLarchPath ();
+  tsource *LSLinitFile = (tsource *) 0;
+
+  setCodePoint ();
+
+  if (initFile == (tsource *) 0)
+    {
+      initFile = tsource_create (INITFILENAME, LCLINIT_SUFFIX, FALSE);
+      
+      if (!tsource_getPath (cstring_toCharsSafe (larchpath), initFile))
+	{
+	  lldiagmsg (message ("Continuing without LCL init file: %s",
+			      cstring_fromChars (tsource_fileName (initFile))));
+	}
+      else 
+	{
+	  if (!tsource_open (initFile))
+	    {
+	      lldiagmsg (message ("Continuing without LCL init file: %s",
+				  cstring_fromChars (tsource_fileName (initFile))));
+	    }
+	}
+    }
+  else 
+    {
+      if (!tsource_open (initFile))
+	{
+	  lldiagmsg (message ("Continuing without LCL init file: %s",
+			      cstring_fromChars (tsource_fileName (initFile))));
+	}
+    }
+
+  /* Initialize checker */
+
+  lsymbol_initMod ();
+  LCLSynTableInit ();
+
+  setCodePoint ();
+
+  LCLSynTableReset ();
+  LCLTokenTableInit ();
+
+  setCodePoint ();
+
+  LCLScanLineInit ();
+  setCodePoint ();
+  LCLScanLineReset ();
+  setCodePoint ();
+  LCLScanInit ();
+
+  setCodePoint ();
+
+  /* need this to initialize LCL checker */
+  llassert (initFile != NULL);
+      
+  if (tsource_isOpen (initFile))
+    {
+      setCodePoint ();
+
+      LCLScanReset (initFile);
+      LCLProcessInitFileInit ();
+      LCLProcessInitFileReset ();
+
+      setCodePoint ();
+      LCLProcessInitFile ();
+      LCLProcessInitFileCleanup ();
+
+      setCodePoint ();
+      check (tsource_close (initFile));
+    }
+  
+  /* Initialize LSL init files, for parsing LSL signatures from LSL */
+  
+  LSLinitFile = tsource_create ("lslinit.lsi", ".lsi", FALSE);
+  
+  if (!tsource_getPath (cstring_toCharsSafe (larchpath), LSLinitFile))
+    {
+      lldiagmsg (message ("Continuing without LSL init file: %s",
+			  cstring_fromChars (tsource_fileName (LSLinitFile))));
+    }
+  else 
+    {
+      if (!tsource_open (LSLinitFile))
+	{
+	  lldiagmsg (message ("Continuing without LSL init file: %s",
+			      cstring_fromChars (tsource_fileName (LSLinitFile))));
+	}
+    }
+      
+  setCodePoint ();
+  lsynTableInit ();
+  lsynTableReset ();
+
+  setCodePoint ();
+  ltokenTableInit ();
+
+  setCodePoint ();
+  lscanLineInit ();
+  lscanLineReset ();
+  LSLScanInit ();
+
+  if (tsource_isOpen (LSLinitFile))
+    {
+      setCodePoint ();
+      LSLScanReset (LSLinitFile);
+      LSLProcessInitFileInit ();
+      setCodePoint ();
+      LSLProcessInitFile ();
+      setCodePoint ();
+      check (tsource_close (LSLinitFile));
+    }
+      
+  tsource_free (LSLinitFile);
+  
+  if (lclHadError ())
+    {
+      lclplainerror 
+	(cstring_makeLiteral ("LSL init file error.  Attempting to continue."));
+    }
+  
+  setCodePoint ();
+  g_symtab = symtable_new ();
+  
+  /* 
+  ** sort_init must come after symtab has been initialized 
+  */
+  sort_init ();
+  abstract_init ();
+  setCodePoint ();
+  
+  inittime = clock ();
+  
+  /* 
+  ** Equivalent to importing old spec_csupport.lcl
+  ** define immutable LCL type "bool" and bool constants TRUE and FALSE
+  ** and initialized them to be equal to LSL's "true" and "false".
+  **
+  ** Reads in CTrait.syms (derived from CTrait.lsl) on LARCH_PATH.
+  */
+      
+  LCLBuiltins (); 
+  LCLReportEolTokens (FALSE);
+}
+
+static void
+lslProcess (fileIdList lclfiles)
+   /*@globals undef g_currentSpec, undef g_currentSpecName, g_currentloc,
+              undef killed g_symtab; @*/
+   /*@modifies g_currentSpec, g_currentSpecName, g_currentloc, internalState, fileSystem; @*/
+{
+  char *path = NULL;
+  bool parser_status = FALSE;
+  bool overallStatus = FALSE;
+  
+  lslInit ();
+  
+  context_resetSpecLines ();
+
+  fileIdList_elements (lclfiles, fid)
+    {
+      char *actualName = (char *) dmalloc (sizeof (*actualName));
+      char *oactualName = actualName;
+      char *fname = cstring_toCharsSafe (fileName (fid));
+      
+      if (osd_getPath (g_localSpecPath, fname, &actualName) == OSD_FILENOTFOUND)
+	{
+	  if (mstring_equal (g_localSpecPath, "."))
+	    {
+	      lldiagmsg (message ("Spec file not found: %s",
+				  cstring_fromChars (fname)));
+	    }
+	  else
+	    {
+	      lldiagmsg (message ("Spec file not found: %s (on %s)", 
+				  cstring_fromChars (fname), 
+				  cstring_fromChars (g_localSpecPath)));
+	    }
+	}
+      else
+	{
+	  tsource *specFile;
+	  
+	  while (*actualName == '.' && *(actualName + 1) == CONNECTCHAR) 
+	    {
+	      actualName += 2;
+	    }
+	  
+	  specFile = tsource_create (actualName, LCL_SUFFIX, TRUE);
+	  llassert (specFile != (tsource *) 0);
+	  
+	  g_currentSpec = cstring_fromChars (mstring_copy (actualName));
+
+	  g_currentSpecName = specFullName 
+	    (cstring_toCharsSafe (g_currentSpec),
+	     &path);
+
+	  setSpecFileId (fid);
+	  	  
+	  if (context_getFlag (FLG_SHOWSCAN))
+	    {
+	      lldiagmsg (message ("< reading spec %s >", g_currentSpec));
+	    }
+	  
+	  /* Open source file */
+	  
+	  if (!tsource_open (specFile))
+	    {
+	      lldiagmsg (message ("Cannot open file: %s",
+				  cstring_fromChars (tsource_fileName (specFile))));
+	      tsource_free (specFile);
+	    }
+	  else
+	    {
+	      scopeInfo dummy_scope = (scopeInfo) dmalloc (sizeof (*dummy_scope));
+	      dummy_scope->kind = SPE_INVALID;
+	      
+	      lhInit (specFile);
+	      LCLScanReset (specFile);
+	      
+	      /* 
+              ** Minor hacks to allow more than one LCL file to
+	      ** be scanned, while keeping initializations
+	      */
+	      
+	      symtable_enterScope (g_symtab, dummy_scope);
+	      resetImports (cstring_fromChars (g_currentSpecName));
+	      context_enterLCLfile ();
+	      (void) lclHadNewError ();
+	      
+	      parser_status = (ylparse () != 0);
+	      context_exitLCLfile ();
+	      lhCleanup ();
+	      overallStatus = parser_status || lclHadNewError (); 
+
+	      if (context_getFlag (FLG_DOLCS))
+		{
+		  if (overallStatus)
+		    {
+ 		      outputLCSFile (path, "%%FAILED Output from ",
+				     g_currentSpecName);
+		    }
+		  else
+		    {
+		      outputLCSFile (path, "%%PASSED Output from ", 
+				     g_currentSpecName);
+		    }
+		}
+
+	      (void) tsource_close (specFile);
+	      tsource_free (specFile);
+
+	      symtable_exitScope (g_symtab);
+	    }
+	}
+      
+      sfree (oactualName);
+    } end_fileIdList_elements; 
+  
+    /* Can cleanup lsl stuff right away */
+
+      lslCleanup ();
+  
+  g_currentSpec = cstring_undefined;
+  g_currentSpecName = NULL;
+}
+# endif
+
+static void handlePassThroughFlag (char *arg)
+{
+  char *curarg = arg;
+  char *quotechar = strchr (curarg, '\"');
+  int offset = 0;
+  bool open = FALSE;
+
+  while (quotechar != NULL)
+    {
+      if (*(quotechar - 1) == '\\')
+	{
+	  char *tp = quotechar - 2;
+	  bool escape = TRUE;
+
+	  while (*tp == '\\')
+	    {
+	      escape = !escape;
+	      tp--;
+	    }
+	  
+	  if (escape)
+	    {
+	      curarg = quotechar + 1;
+	      quotechar = strchr (curarg, '\"');
+	      continue;
+	    }
+	}
+      
+      *quotechar = '\0';
+      offset = (quotechar - arg) + 2;
+      
+      if (open)
+	{
+	  arg = cstring_toCharsSafe
+	    (message ("%s\"\'%s", 
+		      cstring_fromChars (arg), 
+		      cstring_fromChars (quotechar + 1))); 
+	  open = FALSE;
+	}
+      else
+	{
+	  arg = cstring_toCharsSafe
+	    (message ("%s\'\"%s", 
+		      cstring_fromChars (arg), 
+		      cstring_fromChars (quotechar + 1)));
+	  open = TRUE;
+	}
+      
+      curarg = arg + offset;
+      quotechar = strchr (curarg, '\"');
+    }
+
+  if (open)
+    {
+      showHerald ();
+      llerror (FLG_BADFLAG,
+	       message ("Unclosed quote in flag: %s",
+			cstring_fromChars (arg)));
+    }
+  else
+    {
+      if (arg[0] == 'D') {
+	cstring def;
+	
+	/* 
+	** If the value is surrounded by single quotes ('), remove
+	** them.  This is an artifact of UNIX command line?
+	*/
+
+	def = osd_fixDefine (arg + 1);
+	DPRINTF (("Do define: %s", def));
+	cppDoDefine (def);
+	DPRINTF (("After define"));
+	cstring_free (def);
+      } else if (arg[0] == 'U') {
+	cppDoUndefine (cstring_fromChars (arg + 1));
+      } else {
+	BADBRANCH;
+      }
+    }
+}
+
+void showHerald (void)
+{
+  if (hasShownHerald || context_getFlag (FLG_QUIET)) return;
+
+  else
+    {
+      fprintf (g_msgstream, "%s\n\n", LCL_VERSION);
+      hasShownHerald = TRUE;
+      llflush ();
+    }
+}
+
+static void addFile (fileIdList files, /*@only@*/ cstring s)
+{
+  if (fileTable_exists (context_fileTable (), s))
+    {
+      showHerald ();
+      lldiagmsg (message ("File listed multiple times: %s", s));
+      cstring_free (s);
+    }
+  else
+    {
+      fileIdList_add (files, fileTable_addFileOnly (context_fileTable (), s));
+    }
+}
+
+/*
+** Disable MSVC++ warning about return value.  Methinks humbly lclint control
+** comments are a mite more legible.
+*/
+
+# ifdef WIN32
+# pragma warning (disable:4035) 
+# endif
+
+int main (int argc, char *argv[])
+# ifdef NOLCL
+  /*@globals killed undef g_currentloc,
+	     killed undef yyin,
+                    undef g_msgstream;
+   @*/
+  /*@modifies g_currentloc, fileSystem,
+	      yyin; 
+  @*/
+# else
+  /*@globals killed undef g_currentloc,
+	     killed undef initFile,
+	     killed       g_localSpecPath,  
+	     killed undef g_currentSpec,
+	     killed undef g_currentSpecName,
+	     killed undef yyin,
+                    undef g_msgstream;
+   @*/
+  /*@modifies g_currentloc, initFile, 
+              g_localSpecPath, g_currentSpec, g_currentSpecName, fileSystem,
+	      yyin; 
+  @*/
+# endif
+{
+  bool first_time = TRUE;
+  bool showhelp = FALSE;
+  bool allhelp = TRUE;
+  tsource *sourceFile = (tsource *) 0;
+ 
+  fileIdList dercfiles;
+  cstringSList fl = cstringSList_undefined;
+  cstringSList passThroughArgs = cstringSList_undefined;
+  fileIdList cfiles;
+  fileIdList lclfiles;
+  clock_t before, lcltime, libtime, pptime, cptime, rstime;
+  int i = 0;
+
+  g_msgstream = stdout;
+
+  (void) signal (SIGINT, interrupt);
+  (void) signal (SIGSEGV, interrupt); 
+
+  cfiles = fileIdList_create ();
+  lclfiles = fileIdList_create ();
+
+  flags_initMod ();
+  typeIdSet_initMod ();
+  cppReader_initMod ();
+
+  setCodePoint ();
+
+  g_currentloc = fileloc_createBuiltin ();
+
+  before = clock ();
+  context_initMod ();
+  context_setInCommandLine ();
+
+  if (argc <= 1)
+    {
+      showHelp ();
+      llexit (LLGIVEUP);
+    }
+
+  setCodePoint ();
+  yydebug = 0;
+
+  /*
+  ** Add include directories from environment.
+  */
+
+  {
+    char *incval = mstring_copy (osd_getEnvironmentVariable (INCLUDE_VAR));
+
+    if (incval != NULL)
+      {
+	/*
+	** Each directory on the include path is a system include directory.
+	*/
+
+	DPRINTF (("include: %s", incval));
+	context_setString (FLG_SYSTEMDIRS, cstring_fromCharsNew (incval));
+
+	while (incval != NULL)
+	  {
+	    char *nextsep = strchr (incval, SEPCHAR);
+
+	    if (nextsep != NULL)
+	      {
+		cstring dir;
+		*nextsep = '\0';
+		dir = cstring_fromCharsNew (incval);
+
+		if (cstring_length (dir) == 0
+		    || !isalpha ((int) cstring_firstChar (dir)))
+		  {
+		    /* 
+		    ** win32 environment values can have special values,
+		    ** ignore them
+		    */
+		  }
+		else
+		  {
+		    DPRINTF (("Add include: %s", dir));
+		    cppAddIncludeDir (dir);
+		  }
+
+		*nextsep = SEPCHAR;
+		incval = nextsep + 1;
+		cstring_free (dir);
+	      }
+	    else
+	      {
+		break;
+	      }
+	  }
+      }
+  }
+
+  /*
+  ** check RCFILE for default flags
+  */
+
+  {
+    cstring home = cstring_fromChars (osd_getHomeDir ());
+    char *fname  = NULL;
+    FILE *rcfile;
+    bool defaultf = TRUE;
+    bool nof = FALSE;
+
+    for (i = 1; i < argc; i++)
+      {
+	char *thisarg;
+	thisarg = argv[i];
+	
+	if (*thisarg == '-' || *thisarg == '+')
+	  {
+	    thisarg++;
+
+	    if (mstring_equal (thisarg, "nof"))
+	      {
+		nof = TRUE;
+	      }
+	    else if (mstring_equal (thisarg, "f"))
+	      {
+		if (++i < argc)
+		  {
+		    defaultf = FALSE;
+		    fname = argv[i];
+		    rcfile = fopen (fname, "r");
+
+		    if (rcfile != NULL)
+		      {
+			fileloc oloc = g_currentloc;
+			
+			g_currentloc = fileloc_createRc (cstring_fromChars (fname));
+			loadrc (rcfile, &passThroughArgs);
+			fileloc_reallyFree (g_currentloc); 
+			g_currentloc = oloc;
+		      }
+		    else 
+		      {
+			showHerald ();
+			lldiagmsg (message ("Options file not found: %s", 
+					    cstring_fromChars (fname)));
+		      }
+		  }
+		else
+		  llfatalerror
+		    (cstring_makeLiteral ("Flag f to select options file "
+					  "requires an argument"));
+	      }
+	    else
+	      {
+		; /* wait to process later */
+	      }
+	  }
+      }
+    
+    if (fname == NULL)
+      {
+	if (!cstring_isEmpty (home)) {
+	  fname = cstring_toCharsSafe (message ("%s%h%s", home, CONNECTCHAR,
+						cstring_fromChars (RCFILE)));
+	  mstring_markFree (fname);
+	}
+      }
+
+    setCodePoint ();
+
+    if (!nof && defaultf)
+      {
+	if (!mstring_isEmpty (fname)) {
+	  rcfile = fopen (fname, "r");
+	  
+	  if (rcfile != NULL)
+	    {
+	      fileloc oloc = g_currentloc;
+	      
+	      g_currentloc = fileloc_createRc (cstring_fromChars (fname));
+	      loadrc (rcfile, &passThroughArgs);
+	      fileloc_reallyFree (g_currentloc);
+	      g_currentloc = oloc;
+	    }
+	}
+
+# if defined(MSDOS) || defined(OS2)
+	fname = cstring_toCharsSafe (message ("%s",
+					      cstring_fromChars (RCFILE)));
+# else
+	fname = cstring_toCharsSafe (message ("./%s", 
+					      cstring_fromChars (RCFILE)));
+# endif
+
+	rcfile = fopen (fname, "r");
+
+	if (rcfile != NULL)
+	  {
+	    fileloc oloc = g_currentloc;
+
+	    g_currentloc = fileloc_createRc (cstring_fromChars (fname));
+	    loadrc (rcfile, &passThroughArgs);
+	    fileloc_reallyFree (g_currentloc);
+	    g_currentloc = oloc;
+	  }
+
+	sfree (fname); 
+      }
+  }
+  
+  setCodePoint ();
+  
+  for (i = 1; i < argc; i++)
+    {
+      char *thisarg;
+      flagcode opt;
+      
+      thisarg = argv[i];
+      
+      if (showhelp)
+	{
+	  if (allhelp)
+	    {
+	      showHerald ();
+	    }
+	  
+	  allhelp = FALSE;
+	  
+	  if (*thisarg == '-' || *thisarg == '+')
+	    {
+	      thisarg++;	/* skip '-' */
+	    }
+	  if (mstring_equal (thisarg, "modes"))
+	    {
+	      llmsg (describeModes ());
+	    }
+	  else if (mstring_equal (thisarg, "vars")
+		   || mstring_equal (thisarg, "env"))
+	    {
+	      describeVars ();
+	    }
+	  else if (mstring_equal (thisarg, "annotations"))
+	    {
+	      printAnnotations ();
+	    }
+	  else if (mstring_equal (thisarg, "parseerrors"))
+	    {
+	      printParseErrors ();
+	    }
+	  else if (mstring_equal (thisarg, "comments"))
+	    {
+	      printComments ();
+	    }
+	  else if (mstring_equal (thisarg, "prefixcodes"))
+	    {
+	      describePrefixCodes ();
+	    }
+	  else if (mstring_equal (thisarg, "references") 
+		   || mstring_equal (thisarg, "refs"))
+	    {
+	      printReferences ();
+	    }
+	  else if (mstring_equal (thisarg, "mail"))
+	    {
+	      printMail ();
+	    }
+	  else if (mstring_equal (thisarg, "maintainer")
+		   || mstring_equal (thisarg, "version"))
+	    {
+	      printMaintainer ();
+	    }
+	  else if (mstring_equal (thisarg, "flags"))
+	    {
+	      if (i + 1 < argc)
+		{
+		  char *next = argv[i + 1];
+		  
+		  if (specialFlagsHelp (next))
+		    {
+		      i++;
+		    }
+		  else
+		    {
+		      flagkind k = identifyCategory (cstring_fromChars (next));
+		      
+		      if (k != FK_NONE)
+			{
+			  printCategory (k);
+			  i++;
+			}
+		    }
+		}
+	      else
+		{
+		  printFlags ();
+		}
+	    }
+	  else
+	    {
+	      cstring s = describeFlag (cstring_fromChars (thisarg));
+	      
+	      if (cstring_isDefined (s))
+		{
+		  llmsg (s);
+		}
+	    }
+	}
+      else
+	{
+	  if (*thisarg == '-' || *thisarg == '+')
+	    {
+	      bool set = (*thisarg == '+');
+	      cstring flagname;
+	      
+	      thisarg++;	/* skip '-' */
+	      flagname = cstring_fromChars (thisarg);
+	      
+	      opt = identifyFlag (flagname);
+	      
+	      if (flagcode_isSkip (opt))
+		{
+		  ;
+		}
+	      else if (flagcode_isInvalid (opt))
+		{
+		  if (isMode (flagname))
+		    {
+		      context_setMode (flagname);
+		    }
+		  else
+		    {
+		      llgloberror (message ("Unrecognized option: %s", 
+					    cstring_fromChars (thisarg)));
+		    }
+		}
+	      else
+		{
+		  context_userSetFlag (opt, set);
+		  
+		  if (flagcode_hasArgument (opt))
+		    {
+		      if (opt == FLG_HELP)
+			{
+			  showhelp = TRUE;
+			}
+		      else if (flagcode_isPassThrough (opt)) /* -D or -U */
+			{ 
+			  passThroughArgs = cstringSList_add 
+			    (passThroughArgs, cstring_fromChars (thisarg));
+			}
+		      else if (flagcode_hasValue (opt))
+			{
+			  if (++i < argc)
+			    {
+			      setValueFlag (opt, cstring_fromChars (argv[i]));
+			    }
+			  else
+			    {
+			      llfatalerror 
+				(message
+				 ("Flag %s must be followed by a number",
+				  flagcode_unparse (opt)));
+			    }
+			} 
+		      else if (opt == FLG_INCLUDEPATH || opt == FLG_SPECPATH)
+			{
+			  cstring dir = cstring_suffix (cstring_fromChars (thisarg), 1); /* skip over I */
+			  
+			  switch (opt)
+			    {
+			    case FLG_INCLUDEPATH:
+			      cppAddIncludeDir (dir);
+			      /*@switchbreak@*/ break;
+			    case FLG_SPECPATH:
+			      /*@-mustfree@*/
+			      g_localSpecPath = cstring_toCharsSafe
+				(message ("%s%h%s", 
+					  cstring_fromChars (g_localSpecPath), 
+					  SEPCHAR,
+					  dir));
+			      /*@=mustfree@*/
+			      /*@switchbreak@*/ break;
+			      BADDEFAULT;
+			    }
+			}
+		      else if (flagcode_hasString (opt)
+			       || opt == FLG_INIT || opt == FLG_OPTF)
+			{
+			  if (++i < argc)
+			    {
+			      cstring arg = cstring_fromChars (argv[i]);
+			      
+			      if (opt == FLG_OPTF)
+				{
+				  ; /* -f already processed */
+				}
+			      else if (opt == FLG_INIT)
+				{
+# ifndef NOLCL
+				  initFile = tsource_create 
+				    (cstring_toCharsSafe (arg), 
+				     LCLINIT_SUFFIX, FALSE);
+# endif
+				  break;
+				}
+			      else
+				{
+				  setStringFlag (opt, arg);
+				}
+			    }
+			  else
+			    {
+			      llfatalerror 
+				(message
+				 ("Flag %s must be followed by a string",
+				  flagcode_unparse (opt)));
+			    }
+			}
+		      else
+			{
+			  /* no argument */
+			}
+		    }
+		}
+	    }
+	  else /* its a filename */
+	    {
+	      fl = cstringSList_add (fl, cstring_fromChars (thisarg));
+	    }
+	}
+    }
+
+  setCodePoint ();  
+
+  /*
+  ** create lists of C and LCL files
+  */
+
+  cstringSList_elements (fl, current)
+    {
+      char *fname = cstring_toCharsSafe (current);
+      char *ext = strrchr (fname, '.');
+
+      if (ext == NULL)
+	{
+	  /* no extension --- both C and LCL with default extensions */
+	  
+	  addFile (cfiles, message ("%s.c", cstring_fromChars (fname)));
+	  addFile (lclfiles, message ("%s.lcl", cstring_fromChars (fname)));
+	}
+      else if (isCext (ext))
+	{
+	  addFile (cfiles, cstring_fromCharsNew (fname));
+	}
+      else 
+	{
+	  if (!mstring_equal (ext, ".lcl"))
+	    {
+	      lldiagmsg (message ("Unrecognized file extension: %s (assuming lcl)", 
+				  cstring_fromChars (ext)));
+	    }
+
+	  addFile (lclfiles, cstring_fromCharsNew (fname));
+	}
+    } end_cstringSList_elements;
+  
+  
+  showHerald ();
+
+  
+  if (showhelp)
+    {
+      if (allhelp)
+	{
+	  showHelp ();
+	}
+      fprintf (g_msgstream, "\n");
+
+      fileIdList_free (cfiles);
+      fileIdList_free (lclfiles);
+      
+      llexit (LLSUCCESS);
+    }
+
+# ifdef DOANNOTS
+  initAnnots ();
+# endif
+
+  inittime = clock ();
+
+  context_resetErrors ();
+  context_clearInCommandLine ();
+
+  anylcl = !fileIdList_isEmpty (lclfiles);
+
+  if (context_doMerge ())
+    {
+      cstring m = context_getMerge ();
+
+      if (context_getFlag (FLG_SHOWSCAN))
+	{
+	  fprintf (g_msgstream, "< loading %s ", cstring_toCharsSafe (m));
+	}
+
+      loadState (m);
+
+      if (context_getFlag (FLG_SHOWSCAN))
+	{
+	  fprintf (g_msgstream, " >\n");
+	}
+
+      if (!usymtab_existsType (context_getBoolName ()))
+	{
+	  usymtab_initBool (); 
+	}
+    }
+  else
+    {
+      if (!context_getFlag (FLG_NOLIB) && loadStandardState ())
+	{
+	  ;
+	}
+      else
+	{
+	  ctype_initTable ();
+	}
+
+      /* setup bool type and constants */
+      usymtab_initBool (); 
+    }
+
+  fileloc_free (g_currentloc);
+  g_currentloc = fileloc_createBuiltin ();
+
+  libtime = clock ();
+  
+  if (anylcl)
+    {
+# ifdef NOLCL
+      llfatalerror (cstring_makeLiteral ("This version of LCLint does not handle LCL files."));
+# else
+      lslProcess (lclfiles);
+# endif
+    }
+
+  /*
+  ** pre-processing
+  **
+  ** call the pre-preprocessor and /lib/cpp to generate appropriate
+  ** files
+  **
+  */
+
+  context_setInCommandLine ();
+
+  cppReader_initialize ();
+
+  DPRINTF (("Pass through: %s", cstringSList_unparse (passThroughArgs)));
+  
+  cstringSList_elements (passThroughArgs, thisarg) {
+    handlePassThroughFlag (cstring_toCharsSafe (thisarg));
+  } end_cstringSList_elements;
+
+  cstringSList_free (passThroughArgs);
+
+  cleanupMessages ();
+
+  cppReader_saveDefinitions ();
+  
+  context_clearInCommandLine ();
+
+  if (!context_getFlag (FLG_NOPP))
+    {
+      llflush ();
+
+      if (context_getFlag (FLG_SHOWSCAN))
+	{
+	  fprintf (stderr, "< preprocessing"); 
+	}
+      
+      lcltime = clock ();
+
+      context_setPreprocessing ();
+      dercfiles = preprocessFiles (cfiles);
+      context_clearPreprocessing ();
+
+      fileIdList_free (cfiles);
+
+      if (context_getFlag (FLG_SHOWSCAN))
+	{
+	  fprintf (stderr, " >\n");
+	}
+      
+      pptime = clock ();
+    }
+  else
+    {
+      lcltime = clock ();
+      dercfiles = cfiles;
+      pptime = clock ();
+    }
+  
+  /*
+  ** now, check all the corresponding C files
+  **
+  ** (for now these are just .c, but after pre-processing
+  **  will be ..c)
+  */
+
+  {
+# ifdef WIN32
+    int nfiles = /*@-unrecog@*/ _fcloseall (); /*@=unrecog@*/
+
+    if (nfiles != 0) 
+      {
+	llbug (message ("Files unclosed: %d", nfiles));
+      }
+# endif
+  }
+
+  exprNode_initMod ();
+
+  fileIdList_elements (dercfiles, fid)
+    {
+      sourceFile = tsource_create (cstring_toCharsSafe (fileName (fid)),
+				   C_SUFFIX, TRUE);
+      context_setFileId (fid);
+      
+      /* Open source file  */
+      
+      if (sourceFile == (tsource *) 0 || (!tsource_open (sourceFile)))
+	{
+	  /* previously, this was ignored  ?! */
+	  llbug (message ("Could not open temp file: %s", fileName (fid)));
+	}
+      else
+	{
+	  yyin = sourceFile->file; /*< shared <- only */
+	
+	  llassert (yyin != NULL);
+
+	  if (context_getFlag (FLG_SHOWSCAN))
+	    {
+	      	      lldiagmsg (message ("< checking %s >", rootFileName (fid)));
+	    }
+	  
+	  /*
+	  ** Every time, except the first time, through the loop,
+	  ** need to call yyrestart to clean up the parse buffer.
+	  */
+
+	  if (!first_time)
+	    {
+	      (void) yyrestart (yyin);	
+	    }
+	  else
+	    {
+	      first_time = FALSE;
+	    }
+	  
+	  context_enterFile ();
+	  (void) yyparse ();
+	  context_exitFile ();
+		    
+	  (void) tsource_close (sourceFile);
+	}
+      
+    } end_fileIdList_elements;
+
+  cptime = clock ();
+  
+  /* process any leftover macros */
+
+  context_processAllMacros ();
+  
+  /* check everything that was specified was defined */
+  
+  /* don't check if no c files were processed ?
+  **   is this correct behaviour?
+  */
+  
+  if (context_getFlag (FLG_SHOWSCAN))
+    {
+      lldiagmsg (cstring_makeLiteral ("< global checks >"));
+    }
+
+  cleanupMessages ();
+  
+  if (context_getLinesProcessed () > 0)
+    {
+      usymtab_allDefined ();
+    }
+
+  if (context_maybeSet (FLG_TOPUNUSED))
+    {
+      uentry ue = usymtab_lookupSafe (cstring_makeLiteralTemp ("main"));
+
+      if (uentry_isValid (ue))
+	{
+	  uentry_setUsed (ue, fileloc_observeBuiltin ());
+	}
+
+      usymtab_allUsed ();
+    }
+
+  if (context_maybeSet (FLG_EXPORTLOCAL))
+    {
+      usymtab_exportLocal ();
+    }
+
+  
+  if (context_maybeSet (FLG_EXPORTHEADER))
+    {
+      usymtab_exportHeader ();
+    }
+
+  if (context_getFlag (FLG_SHOWUSES))
+    {
+      usymtab_displayAllUses ();
+    }
+
+  context_checkSuppressCounts ();
+
+  if (context_doDump ())
+    {
+      cstring dump = context_getDump ();
+
+      dumpState (dump);
+    }
+
+# ifdef DOANNOTS
+  printAnnots ();
+# endif
+
+  cleanupFiles ();
+
+  if (context_getFlag (FLG_SHOWSUMMARY))
+    {
+      summarizeErrors (); 
+    }
+
+  if (!context_getFlag (FLG_QUIET))
+    {
+      cstring specErrors = cstring_undefined;
+# ifndef NOLCL
+      int nspecErrors = lclNumberErrors ();
+# endif
+
+      if (context_neednl ())
+	fprintf (g_msgstream, "\n");
+    
+# ifndef NOLCL
+      if (nspecErrors > 0)
+	{
+	  if (nspecErrors == context_getLCLExpect ())
+	    {
+	      specErrors = 
+		message ("%d spec error%p found, as expected\n       ", 
+			 nspecErrors);
+	    }
+	  else
+	    {
+	      if (context_getLCLExpect () > 0)
+		{
+		  specErrors = 
+		    message ("%d spec error%p found, expected %d\n       ", 
+			     nspecErrors,
+			     (int) context_getLCLExpect ());
+		}
+	      else
+		{
+		  specErrors = message ("%d spec error%p found\n       ",
+					nspecErrors);
+		}
+	    }
+	}
+      else
+	{
+	  if (context_getLCLExpect () > 0)
+	    {
+	      specErrors = message ("No spec errors found, expected %d\n       ", 
+				    (int) context_getLCLExpect ());
+	    }
+	}
+# endif
+
+      if (context_anyErrors ())
+	{
+	  if (context_numErrors () == context_getExpect ())
+	    {
+	      llmsg (message ("Finished LCLint checking --- "
+			      "%s%d code error%p found, as expected",
+			      specErrors, context_numErrors ()));
+	    }
+	  else
+	    {
+	      if (context_getExpect () > 0)
+		{
+		  llmsg (message 
+			 ("Finished LCLint checking --- "
+			  "%s%d code error%p found, expected %d",
+			  specErrors, context_numErrors (), 
+			  (int) context_getExpect ()));
+		}
+	      else
+		{
+		  llmsg (message ("Finished LCLint checking --- "
+				  "%s%d code error%p found", 
+				  specErrors, context_numErrors ()));
+		}
+	    }
+	}
+      else
+	{
+	  if (context_getExpect () > 0)
+	    {
+	      llmsg (message
+		     ("Finished LCLint checking --- "
+		      "%sno code errors found, expected %d", 
+		      specErrors,
+		      (int) context_getExpect ()));
+	    }
+	  else
+	    {
+	      if (context_getLinesProcessed () > 0)
+		{
+		  llmsg (message ("Finished LCLint checking --- %sno code errors found", 
+				      specErrors));
+		}
+	      else
+		{
+		  llmsg (message ("Finished LCLint checking --- %sno code processed", 
+				      specErrors));
+		}
+	    }
+	}
+
+      cstring_free (specErrors);
+    }
+
+  if (context_getFlag (FLG_STATS))
+    {
+      clock_t ttime = clock () - before;
+      int specLines = context_getSpecLinesProcessed ();
+
+      rstime = clock ();
+
+      if (specLines > 0)
+	{
+	  fprintf (g_msgstream, "%d spec, ", specLines);
+	}
+
+# ifndef CLOCKS_PER_SEC
+      fprintf (g_msgstream, "%d source lines in %ld time steps (steps/sec unknown)\n", 
+	       context_getLinesProcessed (), 
+	       (long) ttime);
+# else
+      fprintf (g_msgstream, "%d source lines in %.2f s.\n", 
+	       context_getLinesProcessed (), 
+	       (double) ttime / CLOCKS_PER_SEC);
+# endif
+    }
+  else
+    {
+      rstime = clock ();
+    }
+  
+  if (context_getFlag (FLG_TIMEDIST))
+    {
+      clock_t ttime = clock () - before;
+
+      if (ttime > 0)
+	{
+	  char *msg = (char *) dmalloc (256 * sizeof (*msg));
+
+	  if (anylcl)
+	    {
+	      sprintf (msg, 
+		       "Time distribution (percent): initialize %.2f / lcl %.2f / "
+		       "pre-process %.2f / c check %.2f / finalize %.2f \n", 
+		       (100.0 * (double) (libtime - before) / ttime),
+		       (100.0 * (double) (lcltime - libtime) / ttime),
+		       (100.0 * (double) (pptime - lcltime) / ttime),
+		       (100.0 * (double) (cptime - pptime) / ttime),
+		       (100.0 * (double) (rstime - cptime) / ttime));
+	    }
+	  else
+	    {
+	      sprintf (msg, 
+		       "Time distribution (percent): initialize %.2f / "
+		       "pre-process %.2f / c check %.2f / finalize %.2f \n", 
+		       (100.0 * (double) (libtime - before) / ttime),
+		       (100.0 * (double) (pptime - libtime) / ttime),
+		       (100.0 * (double) (cptime - pptime) / ttime),
+		       (100.0 * (double) (rstime - cptime) / ttime));
+	    }
+
+	  llgenindentmsgnoloc (cstring_fromCharsO (msg));
+	}
+    }
+
+  llexit (LLSUCCESS);
+}
+
+/*
+** Reenable return value warnings.
+*/
+
+#pragma warning (default:4035)
+
+void
+showHelp (void)
+{
+  showHerald ();
+  
+  llmsglit ("Source files are .c, .h and .lcl files.  If there is no suffix,");
+  llmsglit ("   LCLint will look for .c and .lcl.");
+  llmsglit ("");
+  llmsglit ("Use lclint -help  for more information");
+  llmsglit ("");
+  llmsglit ("Topics:");
+  llmsglit ("");
+  llmsglit ("   annotations (describes source-code annotations)");
+  llmsglit ("   comments (describes control comments)");
+  llmsglit ("   flags (describes flag categories)");
+  llmsglit ("   flags  (describes flags in category)");
+  llmsglit ("   flags all (short description of all flags)");
+  llmsglit ("   flags alpha (list all flags alphabetically)");
+  llmsglit ("   flags full (full description of all flags)");
+  llmsglit ("   mail (information on mailing lists)");
+  llmsglit ("   modes (show mode settings)");
+  llmsglit ("   parseerrors (help on handling parser errors)");
+  llmsglit ("   prefixcodes (character codes in namespace prefixes)");
+  llmsglit ("   references (sources for more information)");
+  llmsglit ("   vars (environment variables)"); 
+  llmsglit ("   version (information on compilation, maintainer)");
+  llmsglit ("");
+}
+
+static bool
+specialFlagsHelp (char *next)
+{
+  if ((next != NULL) && (*next != '-') && (*next != '+'))
+    {
+      if (mstring_equal (next, "alpha"))
+	{
+	  printAlphaFlags ();
+	  return TRUE;
+	}
+      else if (mstring_equal (next, "all"))
+	{
+	  printAllFlags (TRUE, FALSE);
+	  return TRUE;
+	}
+      else if (mstring_equal (next, "categories")
+	       || mstring_equal (next, "cats"))
+	{
+	  listAllCategories ();
+	  return TRUE;
+	}
+      else if (mstring_equal (next, "full"))
+	{
+	  printAllFlags (FALSE, TRUE);
+	  return TRUE;
+	}
+      else
+	{
+	  return FALSE;
+	}
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+void
+printParseErrors (void)
+{
+  llmsglit ("Parse Errors");
+  llmsglit ("------------");
+  llmsglit ("");
+  llmsglit ("LCLint will sometimes encounter a parse error for code that "
+	    "can be parsed with a local compiler. There are a few likely "
+	    "causes for this and a number of techniques that can be used "
+	    "to work around the problem.");
+  llmsglit ("");
+  llmsglit ("Compiler extensions --- compilers sometimes extend the C "
+	    "language with compiler-specific keywords and syntax. While "
+	    "it is not advisible to use these, oftentimes one has no choice "
+	    "when the system header files use compiler extensions. ");
+  llmsglit ("");
+  llmsglit ("LCLint supports some of the GNU (gcc) compiler extensions, "
+	    "if the +gnuextensions flag is set. You may be able to workaround "
+	    "other compiler extensions by using a pre-processor define. "
+	    "Alternately, you can surround the unparseable code with");
+  llmsglit ("");
+  llmsglit ("   # ifndef __LCLINT__");
+  llmsglit ("   ...");
+  llmsglit ("   # endif");
+  llmsglit ("");
+  llmsglit ("Missing type definitions --- an undefined type name will usually "
+	    "lead to a parse error. This ofter occurs when a standard header "
+	    "file defines some type that is not part of the standard library. ");
+  llmsglit ("By default, LCLint does not process the local files corresponding "
+	    "to standard library headers, but uses a library specification "
+	    "instead so dependencies on local system headers can be detected. "
+	    "If another system header file that does not correspond to a "
+	    "standard library header uses one of these superfluous types, "
+	    "a parse error will result.");
+  llmsglit ("");
+  llmsglit ("If the parse error is inside a posix standard header file, the "
+	    "first thing to try is +posixlib. This make LCLint use "
+	    "the posix library specification instead of reading the posix "
+	    "header files.");
+  llmsglit ("");
+  llmsglit ("Otherwise, you may need to either manually define the problematic "
+	    "type (e.g., add -Dmlink_t=int to your .lclintrc file) or force "
+	    "lclint to process the header file that defines it. This is done "
+	    "by setting -skipansiheaders or -skipposixheaders before "
+	    "the file that defines the type is #include'd.");
+  llmsglit ("(See lclint -help "
+	    "skipansiheaders and lclint -help skipposixheaders for a list of "
+	    "standard headers.)  For example, if  uses a type "
+	    "defined by posix header  but not defined by the "
+	    "posix library, we might do: ");
+  llmsglit ("");
+  llmsglit ("   /*@-skipposixheaders@*/");
+  llmsglit ("   # include ");
+  llmsglit ("   /*@=skipposixheaders@*/");
+  llmsglit ("   # include ");
+  llmsglit ("");
+  llmsglit ("to force LCLint to process .");
+  llmsglit ("");
+  llmsglit ("At last resort, +trytorecover can be used to make LCLint attempt "
+	    "to continue after a parse error.  This is usually not successful "
+	    "and the author does not consider assertion failures when +trytorecover "
+	    "is used to be bugs.");
+}
+
+void
+printAnnotations (void)
+{
+  llmsglit ("Annotations");
+  llmsglit ("-----------");
+  llmsglit ("");
+  llmsglit ("Annotations are stylized comments that document certain "
+	    "assumptions about functions, variables, parameters, and types. ");
+  llmsglit ("");
+  llmsglit ("They may be used to indicate where the representation of a "
+	    "user-defined type is hidden, to limit where a global variable may "
+	    "be used or modified, to constrain what a function implementation "
+            "may do to its parameters, and to express checked assumptions about "
+	    "variables, types, structure fields, function parameters, and "
+	    "function results.");
+  llmsglit ("");
+  llmsglit ("Annotations are introduced by \"/*@\". The role of the @ may be "
+	    "played by any printable character, selected using -commentchar .");
+  llmsglit ("");
+  llmsglit ("Consult the User's Guide for descriptions of checking associated with each annotation.");
+  llmsglit ("");
+  llmsglit ("Globals: (in function declarations)");
+  llmsglit ("   /*@globals ,+ @*/");
+  llmsglit ("      globitem is an identifier, internalState or fileSystem");
+  llmsglit ("");
+  llmsglit ("Modifies: (in function declarations)");
+  llmsglit ("   /*@modifies ,+ @*/");
+  llmsglit ("      moditem is an lvalue");
+  llmsglit ("   /*@modifies nothing @*/");
+  llmsglit ("   /*@*/   (Abbreviation for no globals and modifies nothing.)");
+  llmsglit ("");
+  llmsglit ("Iterators:");
+  llmsglit ("   /*@iter  () @*/ - declare an iterator");
+  llmsglit ("");
+  llmsglit ("Constants:");
+  llmsglit ("   /*@constant  @*/ - declares a constant");
+  llmsglit ("");
+  llmsglit ("Alternate Types:");
+  llmsglit ("   /*@alt ,+ @*/");
+  llmsglit ("   (e.g., int /*@alt char@*/ is a type matching either int or char)");
+  llmsglit ("");
+  llmsglit ("Declarator Annotations");
+  llmsglit ("");
+  llmsglit ("Type Definitions:");
+  llmsglit ("   /*@abstract@*/ - representation is hidden from clients");
+  llmsglit ("   /*@concrete@*/ - representation is visible to clients");
+  llmsglit ("   /*@immutable@*/ - instances of the type cannot change value");
+  llmsglit ("   /*@mutable@*/ - instances of the type can change value");
+  llmsglit ("   /*@refcounted@*/ - reference counted type");
+  llmsglit ("");
+  llmsglit ("Global Variables:");
+  llmsglit ("   /*@unchecked@*/ - weakest checking for global use");
+  llmsglit ("   /*@checkmod@*/ - check modification by not use of global");
+  llmsglit ("   /*@checked@*/ - check use and modification of global");
+  llmsglit ("   /*@checkedstrict@*/ - check use of global strictly");
+  llmsglit ("");
+  llmsglit ("Memory Management:");
+  llmsglit ("   /*@dependent@*/ - a reference to externally-owned storage");
+  llmsglit ("   /*@keep@*/ - a parameter that is kept by the called function");
+  llmsglit ("   /*@killref@*/ - a refcounted parameter, killed by the call");
+  llmsglit ("   /*@only@*/ - an unshared reference");
+  llmsglit ("   /*@owned@*/ - owner of storage that may be shared by /*@dependent@*/ references");
+  llmsglit ("   /*@shared@*/ - shared reference that is never deallocated");
+  llmsglit ("   /*@temp@*/ - temporary parameter");
+  llmsglit ("");
+  llmsglit ("Aliasing:");
+  llmsglit ("   /*@unique@*/ - may not be aliased by any other visible reference");
+  llmsglit ("   /*@returned@*/ - may be aliased by the return value");
+  llmsglit ("");
+  llmsglit ("Exposure:");
+  llmsglit ("   /*@observer@*/ - reference that cannot be modified");
+  llmsglit ("   /*@exposed@*/ - exposed reference to storage in another object");
+  llmsglit ("");
+  llmsglit ("Definition State:");
+  llmsglit ("   /*@out@*/ - storage reachable from reference need not be defined");
+  llmsglit ("   /*@in@*/ - all storage reachable from reference must be defined");
+  llmsglit ("   /*@partial@*/ - partially defined, may have undefined fields");
+  llmsglit ("   /*@reldef@*/ - relax definition checking");
+  llmsglit ("");
+  llmsglit ("Global State: (for globals lists, no /*@, since list is already in /*@\'s)");
+  llmsglit ("   undef - variable is undefined before the call");
+  llmsglit ("   killed - variable is undefined after the call");
+  llmsglit ("");
+  llmsglit ("Null State:");
+  llmsglit ("   /*@null@*/ - possibly null pointer");
+  llmsglit ("   /*@notnull@*/ - non-null pointer");
+  llmsglit ("   /*@relnull@*/ - relax null checking");
+  llmsglit ("");
+  llmsglit ("Null Predicates:");
+  llmsglit ("   /*@truenull@*/ - if result is TRUE, first parameter is NULL");
+  llmsglit ("   /*@falsenull@*/ - if result is TRUE, first parameter is not NULL");
+  llmsglit ("");
+  llmsglit ("Execution:");
+  llmsglit ("   /*@exits@*/ - function never returns");
+  llmsglit ("   /*@mayexit@*/ - function may or may not return");
+  llmsglit ("   /*@trueexit@*/ - function does not return if first parameter is TRUE");
+  llmsglit ("   /*@falseexit@*/ - function does not return if first parameter if FALSE");
+  llmsglit ("   /*@neverexit@*/ - function always returns");
+  llmsglit ("");
+  llmsglit ("Side-Effects:");
+  llmsglit ("   /*@sef@*/ - corresponding actual parameter has no side effects");
+  llmsglit ("");
+  llmsglit ("Declaration:");
+  llmsglit ("   /*@unused@*/ - need not be used (no unused errors reported)");
+  llmsglit ("   /*@external@*/ - defined externally (no undefined error reported)");
+  llmsglit ("");
+  llmsglit ("Case:");
+  llmsglit ("   /*@fallthrough@*/ - fall-through case");
+  llmsglit ("");
+  llmsglit ("Break:");
+  llmsglit ("   /*@innerbreak@*/ - break is breaking an inner loop or switch");
+  llmsglit ("   /*@loopbreak@*/ - break is breaking a loop");
+  llmsglit ("   /*@switchbreak@*/ - break is breaking a switch");
+  llmsglit ("   /*@innercontinue@*/ - continue is continuing an inner loop");
+  llmsglit ("");
+  llmsglit ("Unreachable Code:");
+  llmsglit ("   /*@notreached@*/ - statement may be unreachable.");
+  llmsglit ("");
+  llmsglit ("Special Functions:");
+  llmsglit ("   /*@printflike@*/ - check variable arguments like printf");
+  llmsglit ("   /*@scanflike@*/ - check variable arguments like scanf");
+}
+
+void
+printComments (void)
+{
+  llmsglit ("Control Comments");
+  llmsglit ("----------------");
+  llmsglit ("");
+  llmsglit ("Setting Flags");
+  llmsglit ("");
+  llmsglit ("Most flags (all except those characterized as \"globally-settable only\") can be set locally using control comments. A control comment can set flags locally to override the command line settings. The original flag settings are restored before processing the next file.");
+  llmsglit ("");
+  llmsglit ("The syntax for setting flags in control comments is the same as that of the command line, except that flags may also be preceded by = to restore their setting to the original command-line value. For instance,");
+  llmsglit ("   /*@+boolint -modifies =showfunc@*/");
+  llmsglit ("sets boolint on (this makes bool and int indistinguishable types), sets modifies off (this prevents reporting of modification errors), and sets showfunc to its original setting (this controls  whether or not the name of a function is displayed before a message).");
+  llmsglit ("");
+  llmsglit ("Error Suppression");
+  llmsglit ("");
+  llmsglit ("Several comments are provided for suppressing messages. In general, it is usually better to use specific flags to suppress a particular error permanently, but the general error suppression flags may be more convenient for quickly suppressing messages for code that will be corrected or documented later.");
+  llmsglit ("");
+  llmsglit ("/*@ignore@*/ ... /*@end@*/");
+  llgenindentmsgnoloc
+    (cstring_makeLiteral 
+     ("No errors will be reported in code regions between /*@ignore@*/ and /*@end@*/. These comments can be used to easily suppress an unlimited number of messages."));
+  llmsglit ("/*@i@*/");
+    llgenindentmsgnoloc
+    (cstring_makeLiteral 
+     ("No errors will be reported from an /*@i@*/ comment to the end of the line."));
+  llmsglit ("/*@i@*/");
+  llgenindentmsgnoloc
+    (cstring_makeLiteral 
+     ("No errors will be reported from an /*@i@*/ (e.g., /*@i3@*/) comment to the end of the line. If there are not exactly n errors suppressed from the comment point to the end of the line, LCLint will report an error."));
+  llmsglit ("/*@t@*/, /*@t@*/");
+  llgenindentmsgnoloc
+    (cstring_makeLiteral 
+     ("Like i and i, except controlled by +tmpcomments flag. These can be used to temporarily suppress certain errors. Then, -tmpcomments can be set to find them again."));
+  llmsglit ("");
+  llmsglit ("Type Access");
+  llmsglit ("");
+  llmsglit ("/*@access @*/"); 
+  llmsglit ("   Allows the following code to access the representation of ");
+  llmsglit ("/*@noaccess @*/");
+  llmsglit ("   Hides the representation of ");
+  llmsglit ("");
+  llmsglit ("Macro Expansion");
+  llmsglit ("");
+  llmsglit ("/*@notfunction@*/");
+  llgenindentmsgnoloc 
+    (cstring_makeLiteral
+     ("Indicates that the next macro definition is not intended to be a "
+      "function, and should be expanded in line instead of checked as a "
+      "macro function definition."));
+}
+
+  
+void
+printFlags (void)
+{
+  llmsglit ("Flag Categories");
+  llmsglit ("---------------");
+  listAllCategories ();
+  llmsglit ("\nTo see the flags in a flag category, do\n   lclint -help flags ");
+  llmsglit ("To see a list of all flags in alphabetical order, do\n   lclint -help flags alpha");
+  llmsglit ("To see a full description of all flags, do\n   lclint -help flags full");
+}
+
+void
+printMaintainer (void)
+{
+  llmsg (message ("Maintainer: %s", cstring_makeLiteralTemp (LCLINT_MAINTAINER)));
+  llmsglit (LCL_COMPILE);
+}
+
+void
+printMail (void)
+{
+  llmsglit ("Mailing Lists");
+  llmsglit ("-------------");
+  llmsglit ("");
+  llmsglit ("There are two mailing lists associated with LCLint: ");
+  llmsglit ("");
+  llmsglit ("   lclint-announce@virginia.edu");
+  llmsglit ("");
+  llmsglit ("      Reserved for announcements of new releases and bug fixes.");
+  llmsglit ("      To subscribe, send a message to majordomo@virginia.edu with body: ");
+  llmsglit ("           subscribe lclint-announce");
+  llmsglit ("");
+  llmsglit ("   lclint-interest@virginia.edu");
+  llmsglit ("");
+  llmsglit ("      Informal discussions on the use and development of lclint.");
+  llmsglit ("      To subscribe, send a message to majordomo@virginia.edu with body: ");
+  llmsglit ("           subscribe lclint-interest");
+}
+
+void
+printReferences (void)
+{
+  llmsglit ("References");
+  llmsglit ("----------");
+  llmsglit ("");
+  llmsglit ("The LCLint web site is http://lclint.cs.virginia.edu");
+  llmsglit ("");
+  llmsglit ("Technical papers relating to LCLint include:");
+  llmsglit ("");
+  llmsglit ("   David Evans. \"Static Detection of Dynamic Memory Errors\".");  
+  llmsglit ("   SIGPLAN Conference on Programming Language Design and ");
+  llmsglit ("   Implementation (PLDI '96), Philadelphia, PA, May 1996.");
+  llmsglit ("");
+  llmsglit ("   David Evans, John Guttag, Jim Horning and Yang Meng Tan. ");
+  llmsglit ("   \"LCLint: A Tool for Using Specifications to Check Code\".");
+  llmsglit ("   SIGSOFT Symposium on the Foundations of Software Engineering,");
+  llmsglit ("   December 1994.");
+  llmsglit ("");
+  llmsglit ("A general book on Larch is:");
+  llmsglit ("");
+  llmsglit ("   Guttag, John V., Horning, James J., (with Garland, S. J., Jones, ");
+  llmsglit ("   K. D., Modet, A., and Wing, J. M.), \"Larch: Languages and Tools ");
+  llmsglit ("   for Formal Specification\", Springer-Verlag, 1993.");
+}
+
+void
+describePrefixCodes (void)
+{
+  llmsglit ("Prefix Codes");
+  llmsglit ("------------");
+  llmsglit ("");
+  llmsglit ("These characters have special meaning in name prefixes:");
+  llmsglit ("");
+  llmsg (message ("   %h  Any uppercase letter [A-Z]", PFX_UPPERCASE));
+  llmsg (message ("   %h  Any lowercase letter [a-z]", PFX_LOWERCASE));
+  llmsg (message ("   %h  Any character (valid in a C identifier)", PFX_ANY));
+  llmsg (message ("   %h  Any digit [0-9]", PFX_DIGIT));
+  llmsg (message ("   %h  Any non-uppercase letter [a-z0-9_]", PFX_NOTUPPER));
+  llmsg (message ("   %h  Any non-lowercase letter [A-Z0-9_]", PFX_NOTLOWER));
+  llmsg (message ("   %h  Any letter [A-Za-z]", PFX_ANYLETTER));
+  llmsg (message ("   %h  Any letter or digit [A-Za-z0-9]", PFX_ANYLETTERDIGIT));
+  llmsglit ("   *  Zero or more repetitions of the previous character class until the end of the name");
+}
+
+void
+describeVars (void)
+{
+  cstring eval;
+  char *def;
+
+  eval = context_getLarchPath ();
+  def = osd_getEnvironmentVariable (LARCH_PATH);
+
+  if (def != NULL || 
+      !cstring_equal (eval, cstring_fromChars (DEFAULT_LARCHPATH)))
+    {
+      llmsg (message ("LARCH_PATH = %s", eval));
+    }
+  else
+    {
+      llmsg (message ("LARCH_PATH =  (default = %s)",
+		      cstring_fromChars (DEFAULT_LARCHPATH)));
+    }
+  
+  llmsglit ("   --- path used to find larch initialization files and LSL traits");
+
+  eval = context_getLCLImportDir ();
+  def = osd_getEnvironmentVariable (LCLIMPORTDIR);
+
+  if (def != NULL ||
+      !cstring_equal (eval, cstring_fromChars (DEFAULT_LCLIMPORTDIR)))
+    {
+      llmsg (message ("%q = %s", cstring_makeLiteral (LCLIMPORTDIR), eval));
+    }
+  else
+    {
+      llmsg (message ("%s = ", cstring_makeLiteralTemp (LCLIMPORTDIR), 
+		      cstring_makeLiteralTemp (DEFAULT_LCLIMPORTDIR))); 
+    }
+  
+  llmsglit ("   --- directory containing lcl standard library files "
+	    "(import with < ... >)");;
+
+  {
+    cstring dirs = context_getString (FLG_SYSTEMDIRS);
+    llmsg (message 
+	   ("systemdirs = %s (set by include envirnoment variable or -systemdirs)",
+	    dirs));
+
+  }
+}
+
+void
+interrupt (int i)
+{
+  switch (i)
+    {
+    case SIGINT:
+      fprintf (stderr, "*** Interrupt\n");
+      llexit (LLINTERRUPT);
+    case SIGSEGV:
+      {
+	cstring loc;
+	
+	/* Cheat when there are parse errors */
+	checkParseError (); 
+	
+	fprintf (stderr, "*** Segmentation Violation\n");
+	
+	/* Don't catch it if fileloc_unparse causes a signal */
+	(void) signal (SIGSEGV, NULL);
+
+	loc = fileloc_unparse (g_currentloc);
+	
+	fprintf (stderr, "*** Location (not trusted): %s\n", 
+		 cstring_toCharsSafe (loc));
+	cstring_free (loc);
+	printCodePoint ();
+	fprintf (stderr, "*** Please report bug to %s\n", LCLINT_MAINTAINER);
+	exit (LLGIVEUP);
+      }
+    default:
+      fprintf (stderr, "*** Signal: %d\n", i);
+      /*@-mustfree@*/
+      fprintf (stderr, "*** Location (not trusted): %s\n", 
+	       cstring_toCharsSafe (fileloc_unparse (g_currentloc)));
+      /*@=mustfree@*/
+      printCodePoint ();
+      fprintf (stderr, "*** Please report bug to %s ***\n", LCLINT_MAINTAINER);
+      exit (LLGIVEUP);
+    }
+}
+
+void
+cleanupFiles (void)
+{
+  static bool doneCleanup = FALSE;
+
+  /* make sure this is only called once! */
+
+  if (doneCleanup) return;
+
+  setCodePoint ();
+
+  if (context_getFlag (FLG_KEEP))
+    {
+      check (fputs ("Temporary files kept:\n", stderr) != EOF);
+      fileTable_printTemps (context_fileTable ());
+    }
+  else
+    {
+# ifdef WIN32
+      int nfiles = /*@-unrecog@*/ _fcloseall (); /*@=unrecog@*/
+      
+      if (nfiles != 0) 
+	{
+	  llbug (message ("Files unclosed: %d", nfiles));
+	}
+# endif
+      fileTable_cleanup (context_fileTable ());
+    }
+
+  doneCleanup = TRUE;
+}
+
+/*
+** cleans up temp files (if necessary)
+** exits lclint
+*/
+
+/*@exits@*/ void
+llexit (int status)
+{
+# ifdef WIN32
+  if (status == LLFAILURE) 
+    {
+      _fcloseall ();
+    }
+# endif
+
+  cleanupFiles ();
+
+  if (status != LLFAILURE)
+    {
+      context_destroyMod ();
+      exprNode_destroyMod ();
+      
+      sRef_destroyMod ();
+      uentry_destroyMod ();
+      typeIdSet_destroyMod ();
+      
+# ifdef USEDMALLOC
+      dmalloc_shutdown ();
+# endif
+    }
+
+  exit ((status == LLSUCCESS) ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
+void
+loadrc (FILE *rcfile, cstringSList *passThroughArgs)
+{
+  char *s = mstring_create (MAX_LINE_LENGTH);
+  char *os = s;
+
+  DPRINTF (("Pass through: %s", cstringSList_unparse (*passThroughArgs)));
+
+  s = os;
+
+  while (fgets (s, MAX_LINE_LENGTH, rcfile) != NULL)
+    {
+      char c;
+      bool set = FALSE;	    
+      char *thisflag;
+      flagcode opt;
+
+      DPRINTF (("Line: %s", s));
+      DPRINTF (("Pass through: %s", cstringSList_unparse (*passThroughArgs)));
+      incLine ();
+            
+      while (*s == ' ' || *s == '\t' || *s == '\n') 
+	{
+	  s++;
+	  incColumn ();
+	}
+      
+      while (*s != '\0')
+	{
+	  bool escaped = FALSE;
+	  bool quoted = FALSE;
+	  c = *s;
+
+	  DPRINTF (("Process: %s", s));
+	  DPRINTF (("Pass through: %s", cstringSList_unparse (*passThroughArgs)));
+	  /* comment characters */
+	  if (c == '#' || c == ';' || c == '\n') 
+	    {
+	      /*@innerbreak@*/
+	      break;
+	    }
+	  
+	  if (c == '-' || c == '+')
+	    {
+	      set = (c == '+');
+	    }
+	  else
+	    {
+	      showHerald ();
+	      llerror (FLG_SYNTAX, 
+		       message ("Bad flag syntax (+ or - expected, "
+				"+ is assumed): %s", 
+				cstring_fromChars (s)));
+	      s--;
+	      set = TRUE;
+	    }
+	  
+	  s++;
+	  incColumn ();
+	  
+	  thisflag = s;
+	  
+	  while ((c = *s) != '\0')
+	    { /* remember to handle spaces and quotes in -D and -U ... */
+	      if (escaped)
+		{
+		  escaped = FALSE;
+		}
+	      else if (quoted)
+		{
+		  if (c == '\\')
+		    {
+		      escaped = TRUE;
+		    }
+		  else if (c == '\"')
+		    {
+		      quoted = FALSE;
+		    }
+		  else
+		    {
+		      ;
+		    }
+		}
+	      else if (c == '\"')
+		{
+		  quoted = TRUE;
+		}
+	      else
+		{
+		 if (c == ' ' || c == '\t' || c == '\n')
+		   {
+		     /*@innerbreak@*/ break;
+		   }
+	       }
+		  
+	      s++; 
+	      incColumn ();
+	    }
+
+	  DPRINTF (("Nulling: %c", *s));
+	  *s = '\0';
+
+	  if (mstring_isEmpty (thisflag))
+	    {
+	      llfatalerror (message ("Missing flag: %s",
+				     cstring_fromChars (os)));
+	    }
+
+	  DPRINTF (("Flag: %s", thisflag));
+
+	  opt = identifyFlag (cstring_fromChars (thisflag));
+	  
+	  if (flagcode_isSkip (opt))
+	    {
+	      ;
+	    }
+	  else if (flagcode_isInvalid (opt))
+	    {
+	      if (isMode (cstring_fromChars (thisflag)))
+		{
+		  context_setMode (cstring_fromChars (thisflag));
+		}
+	      else
+		{
+		  llerror (FLG_BADFLAG,
+			   message ("Unrecognized option: %s", 
+				    cstring_fromChars (thisflag)));
+		}
+	    }
+	  else
+	    {
+	      context_userSetFlag (opt, set);
+
+	      if (flagcode_hasArgument (opt))
+		{
+		  if (opt == FLG_HELP)
+		    {
+		      showHerald ();
+		      llerror (FLG_BADFLAG,
+			       message ("Cannot use help in rc files"));
+		    }
+		  else if (flagcode_isPassThrough (opt)) /* -D or -U */
+		    {
+		      cstring arg = cstring_fromCharsNew (thisflag);
+		      cstring_markOwned (arg);
+		      *passThroughArgs = cstringSList_add (*passThroughArgs, arg);
+		      DPRINTF (("Pass through: %s",
+				cstringSList_unparse (*passThroughArgs)));
+		    }
+		  else if (opt == FLG_INCLUDEPATH 
+			   || opt == FLG_SPECPATH)
+		    {
+		      cstring dir = cstring_suffix (cstring_fromChars (thisflag), 1); /* skip over I/S */
+		      		      
+		      switch (opt)
+			{
+			case FLG_INCLUDEPATH:
+			  cppAddIncludeDir (dir);
+			  /*@switchbreak@*/ break;
+			case FLG_SPECPATH:
+			  /*@-mustfree@*/
+			  g_localSpecPath = cstring_toCharsSafe
+			    (message ("%s:%s", cstring_fromChars (g_localSpecPath), dir));
+			  /*@=mustfree@*/
+			  /*@switchbreak@*/ break;
+			  BADDEFAULT;
+			}
+		    }
+		  else if (flagcode_hasString (opt)
+			   || flagcode_hasValue (opt)
+			   || opt == FLG_INIT || opt == FLG_OPTF)
+		    {
+		      cstring extra = cstring_undefined;
+		      char *rest, *orest;
+		      char rchar;
+		      
+		      *s = c;
+		      rest = mstring_copy (s);
+		      DPRINTF (("Here: rest = %s", rest));
+		      orest = rest;
+		      *s = '\0';
+		      
+		      while ((rchar = *rest) != '\0'
+			     && (isspace ((int) rchar)))
+			{
+			  rest++;
+			  s++;
+			}
+		      
+		      DPRINTF (("Yo: %s", rest));
+
+		      while ((rchar = *rest) != '\0' 
+			     && !isspace ((int) rchar))
+			{
+			  extra = cstring_appendChar (extra, rchar);
+			  rest++; 
+			  s++;
+			}
+		      
+		      DPRINTF (("Yo: %s", extra));
+		      sfree (orest);
+
+		      if (cstring_isUndefined (extra))
+			{
+			  showHerald ();
+			  llerror 
+			    (FLG_BADFLAG,
+			     message
+			     ("Flag %s must be followed by an argument",
+			      flagcode_unparse (opt)));
+			}
+		      else
+			{
+			  s--;
+			  
+			  DPRINTF (("Here we are: %s", extra));
+
+			  if (flagcode_hasValue (opt))
+			    {
+			      DPRINTF (("Set value flag: %s", extra));
+			      setValueFlag (opt, extra);
+			      cstring_free (extra);
+			    }
+			  else if (opt == FLG_OPTF)
+			    {
+			      FILE *innerf = fopen (cstring_toCharsSafe (extra), "r");
+			      cstring_markOwned (extra);
+			      
+			      if (innerf != NULL)
+				{
+				  fileloc fc = g_currentloc;
+				  g_currentloc = fileloc_createRc (extra);
+				  loadrc (innerf, passThroughArgs);
+				  fileloc_reallyFree (g_currentloc);
+				  g_currentloc = fc;
+				}
+			      else 
+				{
+				  showHerald ();
+				  llerror
+				    (FLG_SYNTAX, 
+				     message ("Options file not found: %s", 
+					      extra));
+				}
+			    }
+			  else if (opt == FLG_INIT)
+			    {
+# ifndef NOLCL
+			      llassert (initFile == NULL);
+			      
+			      initFile = tsource_create 
+				(cstring_toCharsSafe (extra), 
+				 LCLINIT_SUFFIX, FALSE);
+			      cstring_markOwned (extra);
+# else
+			      cstring_free (extra);
+# endif
+			    }
+			  else if (flagcode_hasString (opt))
+			    {
+			      if (cstring_firstChar (extra) == '"')
+				{
+				  if (cstring_lastChar (extra) == '"')
+				    {
+				      char *extras = cstring_toCharsSafe (extra);
+				      
+				      llassert (extras[strlen(extras) - 1] == '"');
+				      extras[strlen(extras) - 1] = '\0';
+				      extra = cstring_fromChars (extras + 1); 
+				      DPRINTF (("Remove quites: %s", extra));
+				    }
+				  else
+				    {
+				      llerror
+					(FLG_SYNTAX, 
+					 message ("Unmatched \" in option string: %s", 
+						  extra));
+				    }
+				}
+			      
+			      setStringFlag (opt, extra);
+			    }
+			  else
+			    {
+			      cstring_free (extra);
+			      BADEXIT;
+			    }
+			}
+		    }
+		  else
+		    {
+		      BADEXIT;
+		    }
+		}
+	    }
+	  
+	  *s = c;
+	  DPRINTF (("Pass through: %s", cstringSList_unparse (*passThroughArgs)));
+	  while ((c == ' ') || (c == '\t'))
+	    {
+	      c = *(++s);
+	      incColumn ();
+	    } 
+	}
+      DPRINTF (("Pass through: %s", cstringSList_unparse (*passThroughArgs)));
+      s = os;
+    }
+
+  DPRINTF (("Pass through: %s", cstringSList_unparse (*passThroughArgs)));
+  sfree (os); 
+  check (fclose (rcfile) == 0);
+}
+
+static fileIdList preprocessFiles (fileIdList fl)
+  /*@modifies fileSystem@*/
+{
+  bool msg = (context_getFlag (FLG_SHOWSCAN) && fileIdList_size (fl) > 10);
+  int skip = (fileIdList_size (fl) / 5);
+  int filesprocessed = 0;
+  fileIdList dfiles = fileIdList_create ();
+
+  fileloc_free (g_currentloc);
+  g_currentloc = fileloc_createBuiltin ();
+
+  fileIdList_elements (fl, fid)
+    {
+      char *ppfname = cstring_toCharsSafe (fileName (fid));
+
+      if (!(osd_fileIsReadable (ppfname)))
+	{
+	  lldiagmsg (message ("Cannot open file: %s",
+			      cstring_fromChars (ppfname)));
+	}
+      else
+	{
+	  fileId  dfile = fileTable_addCTempFile (context_fileTable (), fid);
+	  
+	  llassert (!mstring_isEmpty (ppfname));
+	  
+	  if (msg)
+	    {
+	      if ((filesprocessed % skip) == 0) 
+		{
+		  if (filesprocessed == 0) {
+		    fprintf (stderr, " ");
+		  }
+		  else {
+		    fprintf (stderr, ".");
+		  }
+		  
+		  (void) fflush (stderr);
+		}
+	      filesprocessed++;
+	    }
+
+	  if (cppProcess (cstring_fromChars (ppfname), 
+			  fileName (dfile)) != 0) 
+	    {
+	      llfatalerror (message ("Preprocessing error for file: %s", 
+				     rootFileName (fid)));
+	    }
+	  
+	  fileIdList_add (dfiles, dfile);
+	}
+    } end_fileIdList_elements; 
+    
+    return dfiles;
+}
diff --git a/src/lltok.c b/src/lltok.c
new file mode 100644
index 0000000..425f0bd
--- /dev/null
+++ b/src/lltok.c
@@ -0,0 +1,164 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lltok.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+# ifdef SANITIZER
+# include "sgrammar.h"
+# include "sgrammar_tokens.h"
+# else
+# include "cgrammar.h"
+# include "cgrammar_tokens.h"
+# endif
+
+bool
+lltok_isSemi (lltok tok)
+{
+  return (tok.tok == TSEMI);
+}
+
+cstring
+lltok_unparse (lltok tok)
+{
+  char *lit;
+
+  switch (tok.tok)
+    {
+    case BREAK:      lit = "break"; break;
+    case CASE:       lit = "case"; break;
+    case CONTINUE:   lit = "continue"; break;
+    case DEFAULT:    lit = "default"; break;
+    case DO:         lit = "do"; break;
+    case CDOUBLE:    lit = "double"; break;
+    case CELSE:      lit = "else"; break;
+    case CFOR:       lit = "for"; break;
+    case GOTO:       lit = "goto"; break;
+    case CIF:        lit = "if"; break;
+    case RETURN:     lit = "return"; break;
+    case CSIZEOF:    lit = "sizeof"; break;
+    case SWITCH:     lit = "switch"; break;
+    case WHILE:      lit = "while"; break;
+    case CSTRUCT:    lit = "struct"; break;
+    case CTYPEDEF:   lit = "typedef"; break;
+    case CUNION:     lit = "union"; break;
+    case CENUM:      lit = "enum"; break;
+    case QEXTERN:     lit = "extern"; break;
+    case QAUTO:       lit = "auto"; break;
+    case QSTATIC:     lit = "static"; break;
+    case RIGHT_ASSIGN: lit = ">>="; break;
+    case LEFT_ASSIGN:  lit = "<<="; break;
+    case ADD_ASSIGN: lit = "+="; break;
+    case SUB_ASSIGN: lit = "-="; break;
+    case MUL_ASSIGN: lit = "*="; break;
+    case DIV_ASSIGN: lit = "/="; break;
+    case MOD_ASSIGN: lit = "%="; break;
+    case AND_ASSIGN: lit = "&="; break;
+    case XOR_ASSIGN: lit = "^="; break;
+    case OR_ASSIGN:  lit = "|="; break;
+    case RIGHT_OP:   lit = ">>"; break;
+    case LEFT_OP:    lit = "<<"; break;
+    case INC_OP:     lit = "++"; break; 
+    case DEC_OP:     lit = "--"; break;
+    case ARROW_OP:   lit = "->"; break;
+    case AND_OP:     lit = "&&"; break;
+    case OR_OP:      lit = "||"; break;
+    case LE_OP:      lit = "<="; break;
+    case GE_OP:      lit = ">="; break;
+    case EQ_OP:      lit = "=="; break;
+    case NE_OP:      lit = "!="; break;
+    case TSEMI:      lit = ";"; break;
+    case TLBRACE:    lit = "{"; break;
+    case TRBRACE:    lit = "}"; break;
+    case TCOMMA:     lit = ","; break;
+    case TCOLON:     lit = ":"; break;
+    case TASSIGN:        lit = "="; break;
+    case TLPAREN:    lit = "("; break;
+    case TRPAREN:    lit = ")"; break;
+    case TLSQBR:     lit = "["; break;
+    case TRSQBR:     lit = "]"; break;
+    case TDOT:       lit = "."; break;
+    case TAMPERSAND: lit = "&"; break;
+    case TEXCL:      lit = "!"; break;
+    case TTILDE:     lit = "~"; break;
+    case TMINUS:     lit = "-"; break;
+    case TPLUS:      lit = "+"; break;
+    case TMULT:      lit = "*"; break;
+    case TDIV:       lit = "/"; break;
+    case TPERCENT:   lit = "%"; break;
+    case TLT:        lit = "<"; break;
+    case TGT:        lit = ">"; break;
+    case TCIRC:      lit = "^"; break;
+    case TBAR:       lit = "|"; break;
+    case TQUEST:     lit = "?"; break;  
+    case QOUT:       lit = "out"; break;
+    case QONLY:      lit = "only"; break;
+    case QKEEP:      lit = "keep"; break;
+    case QKEPT:      lit = "kept"; break;
+    case QTEMP:      lit = "temp"; break;
+    case QSHARED:    lit = "shared"; break;
+    case QUNIQUE:    lit = "unique"; break;
+    case QREF:       lit = "ref"; break;
+    case QCHECKED:   lit = "checked"; break;
+    case QCHECKEDSTRICT: lit = "checkedstrict"; break;
+    case QCHECKMOD:  lit = "checkmod"; break;
+    case QUNCHECKED: lit = "unchecked"; break;
+    case QTRUENULL:  lit = "truenull"; break;
+    case QFALSENULL: lit = "falsenull"; break;
+    case QRETURNED:  lit = "returned"; break;
+    case QEXPOSED:   lit = "exposed"; break;
+    case QNULL:      lit = "null"; break;
+    case QRELNULL:   lit = "refnull"; break;
+    case QOBSERVER:  lit = "observer"; break;
+    case QPARTIAL:   lit = "partial"; break;
+    case QSPECIAL:   lit = "special"; break;
+    case QUSES:      lit = "uses"; break;
+    case QDEFINES:   lit = "defines"; break;
+    case QALLOCATES: lit = "allocates"; break;
+    case QSETS:      lit = "sets"; break;
+    case QRELEASES:  lit = "releases"; break;
+    BADDEFAULT;
+    }
+ 
+  return cstring_makeLiteralTemp (lit);
+}
+
+lltok
+lltok_create (int tok, fileloc loc)
+{
+  lltok l;
+
+  l.tok = tok;
+  l.loc = loc;
+
+  return (l);
+}
+
+void lltok_release (lltok t) 
+{
+  fileloc_free (t.loc);
+}
diff --git a/src/lslOpList.c b/src/lslOpList.c
new file mode 100644
index 0000000..5b5bfe6
--- /dev/null
+++ b/src/lslOpList.c
@@ -0,0 +1,107 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lslOpList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ lslOpList
+lslOpList_new ()
+{
+  lslOpList s = (lslOpList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = lslOpListBASESIZE;
+  s->elements = (lslOp *)
+    dmalloc (sizeof (*s->elements) * lslOpListBASESIZE);
+
+  return (s);
+}
+
+static void
+lslOpList_grow (lslOpList s)
+{
+  int i;
+  lslOp *newelements; 
+
+  s->nspace += lslOpListBASESIZE;
+  
+  newelements = (lslOp *) dmalloc (sizeof (*newelements)
+					 * (s->nelements + s->nspace));
+  
+  if (newelements == (lslOp *) 0)
+    {
+      llfatalerror (cstring_makeLiteral ("lslOpList_grow: out of memory!"));
+    }
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+void 
+lslOpList_add (lslOpList s, lslOp el)
+{
+  llassert (lslOpListBASESIZE != 0);
+
+  if (s->nspace <= 0)
+    {
+      lslOpList_grow (s);
+    }
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+}
+
+/*@only@*/ cstring
+lslOpList_unparse (lslOpList s)
+{
+  int i;
+  cstring st = cstring_undefined;
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      st = message ("%q%q\n", st, lslOp_unparse (s->elements[i]));
+    }
+
+  return st;
+}
+
+void
+lslOpList_free (lslOpList s)
+{
+  sfree (s->elements);	
+  sfree (s);
+}
diff --git a/src/lslOpSet.c b/src/lslOpSet.c
new file mode 100644
index 0000000..de9bd3d
--- /dev/null
+++ b/src/lslOpSet.c
@@ -0,0 +1,198 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+
+/*
+** lslOpSet.c
+**
+** based on set_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "checking.h"		/* for lslOp_equal */
+
+static bool lslOpSet_member (lslOpSet p_s, lslOp p_el);
+
+lslOpSet lslOpSet_new ()
+{
+  lslOpSet s = (lslOpSet) dmalloc (sizeof (*s));
+
+  s->entries = 0;
+  s->nspace = lslOpSetBASESIZE;
+  s->elements = (lslOp *)
+    dmalloc (sizeof (*s->elements) * lslOpSetBASESIZE);
+  
+  return (s);
+}
+
+static /*@only@*/ lslOpSet
+lslOpSet_predict (int size)
+{
+  lslOpSet s = (lslOpSet) dmalloc (sizeof (*s));
+  
+  s->entries = 0;
+
+  if (size > 0)
+    {
+      s->nspace = size;
+      s->elements = (lslOp *) dmalloc (sizeof (*s->elements) * size);
+    }
+  else
+    {
+      s->nspace = 0;
+      s->elements = NULL;
+    }
+
+  return (s);
+}
+
+static void
+lslOpSet_grow (/*@notnull@*/ lslOpSet s)
+{
+  int i;
+  lslOp *newelements;
+
+  s->nspace = lslOpSetBASESIZE;
+  newelements = (lslOp *) dmalloc (sizeof (*newelements)
+					 * (s->entries + s->nspace));
+
+  if (newelements == (lslOp *) 0)
+    {
+      llfatalerror (cstring_makeLiteral ("lslOpSet_grow: out of memory!"));
+    }
+
+  for (i = 0; i < s->entries; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+/*
+** Ensures: if *e \in *s
+**          then unchanged (*s) & result = false
+**          else *s' = insert (*s, *e) & result = true
+** Modifies: *s
+*/
+
+bool
+lslOpSet_insert (lslOpSet s, /*@only@*/ lslOp el)
+{
+  llassert (lslOpSet_isDefined (s));
+
+  if (lslOpSet_member (s, el))
+    {
+      lslOp_free (el);
+      return FALSE;
+    }
+  else
+    {
+      if (s->nspace <= 0)
+	lslOpSet_grow (s);
+      s->nspace--;
+      s->elements[s->entries] = el;
+      s->entries++;
+      return TRUE;
+    }
+}
+
+static bool
+lslOpSet_member (lslOpSet s, lslOp el)
+{
+  if (lslOpSet_isDefined (s))
+    {
+      int i;
+      
+      for (i = 0; i < lslOpSet_size (s); i++)
+	{
+	  if (lslOp_equal (el, s->elements[i]))
+	    return TRUE;
+	}
+    }
+
+  return FALSE;
+}
+
+/*@only@*/ cstring
+lslOpSet_unparse (lslOpSet s)
+{
+  if (lslOpSet_isDefined (s))
+    {
+      int i;
+      cstring st = cstring_makeLiteral ("{");
+      
+      for (i = 0; i < lslOpSet_size (s); i++)
+	{
+	  st = message ("%q   %q", st, lslOp_unparse (s->elements[i]));
+	}
+      
+      st = message ("%q}", st);
+      return st;
+    }
+  else
+    {
+      return (cstring_makeLiteral ("{ }"));
+    }
+}
+
+/*@only@*/ lslOpSet
+lslOpSet_copy (lslOpSet s)
+{
+  if (lslOpSet_isDefined (s))
+    {
+      lslOpSet t = lslOpSet_predict (lslOpSet_size (s));
+      int i;
+      
+      for (i = 0; i < lslOpSet_size (s); i++)
+	{
+	  (void) lslOpSet_insert (t, lslOp_copy (s->elements[i])); 
+	}
+      
+      return t;
+    }
+  else
+    {
+      return lslOpSet_undefined;
+    }
+}
+
+void
+lslOpSet_free (lslOpSet s)
+{
+  if (lslOpSet_isDefined (s))
+    {
+      int i;
+      for (i = 0; i < s->entries; i++)
+	{
+	  lslOp_free (s->elements[i]); 
+	}
+      
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
diff --git a/src/lslinit.c b/src/lslinit.c
new file mode 100644
index 0000000..9a3deb4
--- /dev/null
+++ b/src/lslinit.c
@@ -0,0 +1,1555 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lslinit.c
+**
+** Processor for Larch Shared Language Init Files
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "signature.h"
+# include "signature2.h"
+# include "scan.h"
+# include "scanline.h"
+# include "tokentable.h"
+# include "syntable.h"
+# include "lslinit.h"
+
+/* needed to parse init files */
+# include "shift.h"
+#if TRACING == 1
+/*@notfunction@*/
+# define LTRACE(rule) printf ("Reducing: %s\n", rule)
+#else
+/*@notfunction@*/
+# define LTRACE(rule)
+#endif
+
+static void LocalUserError (ltoken p_t, /*@temp@*/ char *p_msg)
+  /*@modifies *g_msgstream@*/;
+
+static /*@only@*/ ltoken nextToken;
+
+static void InitFile (void) /*@modifies nextToken@*/ ;
+static void InitLines (void) /*@modifies nextToken@*/ ;
+static void InitLine (void) /*@modifies nextToken@*/ ;
+static void Classification (void) /*@modifies nextToken@*/ ;
+static void CharClass (void) /*@modifies nextToken@*/ ;
+
+static void EndCommentChars (void) /*@modifies nextToken@*/ ;
+static void IdChars (void) /*@modifies nextToken@*/ ;
+static void OpChars (void) /*@modifies nextToken@*/ ;
+static void ExtensionChar (void) /*@modifies nextToken@*/ ;
+static void SingChars (void) /*@modifies nextToken@*/ ;
+static void WhiteChars (void) /*@modifies nextToken@*/ ;
+static void EndCommentChar (void) /*@modifies nextToken@*/ ;
+static void IdChar (void) /*@modifies nextToken@*/ ;
+static void OpChar (void) /*@modifies nextToken@*/ ;
+static void SingChar (void) /*@modifies nextToken@*/ ;
+static void WhiteChar (void) /*@modifies nextToken@*/ ;
+
+static void TokenClass (void) /*@modifies nextToken@*/ ;
+static void QuantifierSymToks (void) /*@modifies nextToken@*/ ;
+static void LogicalOpToks (void) /*@modifies nextToken@*/ ;
+static void EqOpToks (void) /*@modifies nextToken@*/ ;
+static void EquationSymToks (void) /*@modifies nextToken@*/ ;
+static void EqSepSymToks (void) /*@modifies nextToken@*/ ;
+static void SelectSymToks (void) /*@modifies nextToken@*/ ;
+static void OpenSymToks (void) /*@modifies nextToken@*/ ;
+static void SepSymToks (void) /*@modifies nextToken@*/ ;
+static void CloseSymToks (void) /*@modifies nextToken@*/ ;
+static void SimpleIdToks (void) /*@modifies nextToken@*/ ;
+static void MapSymToks (void) /*@modifies nextToken@*/ ;
+static void MarkerSymToks (void) /*@modifies nextToken@*/ ;
+static void CommentSymToks (void) /*@modifies nextToken@*/ ;
+static void QuantifierSymTok (void) /*@modifies nextToken@*/ ;
+static void LogicalOpTok (void) /*@modifies nextToken@*/ ;
+static void EqOpTok (void) /*@modifies nextToken@*/ ;
+static void EquationSymTok (void) /*@modifies nextToken@*/ ;
+static void EqSepSymTok (void) /*@modifies nextToken@*/ ;
+static void SelectSymTok (void) /*@modifies nextToken@*/ ;
+static void OpenSymTok (void) /*@modifies nextToken@*/ ;
+static void SepSymTok (void) /*@modifies nextToken@*/ ;
+static void CloseSymTok (void) /*@modifies nextToken@*/ ;
+static void SimpleIdTok (void) /*@modifies nextToken@*/ ;
+static void MapSymTok (void) /*@modifies nextToken@*/ ;
+static void MarkerSymTok (void) /*@modifies nextToken@*/ ;
+static void CommentSymTok (void) /*@modifies nextToken@*/ ;
+static void SynClass (void) /*@modifies nextToken@*/ ;
+static void OldToken (void) /*@modifies nextToken@*/ ;
+static void NewToken (void) /*@modifies nextToken@*/ ;
+static void Token (void) /*@modifies nextToken@*/ ;
+
+static void InitReduce (LSLInitRuleCode p_rule) /*@modifies nextToken@*/ ;
+static void UpdateXCharKeywords (charCode) /*@modifies nextToken@*/ ;
+static void ProcessExtensionChar (void) /*@modifies nextToken@*/ ;
+static void ProcessEndCommentChar (void) /*@modifies nextToken@*/ ;
+static void ProcessSingleChar (charCode p_code) /*@modifies nextToken@*/ ;
+static void ProcessToken (ltokenCode p_code) /*@modifies nextToken@*/ ;
+static void ProcessSynonym (void) /*@modifies nextToken@*/ ;
+
+/* If TRUE character has been redefined as a singleChar. */
+static bool defineSingleChar[LASTCHAR + 1];
+
+static charCode currentExtensionChar;
+
+/* LSL init file keyword tokens.  */
+
+static /*@dependent@*/ ltoken endCommentCharToken;
+static /*@dependent@*/ ltoken idCharToken;
+static /*@dependent@*/ ltoken opCharToken;
+static /*@dependent@*/ ltoken extensionCharToken;
+static /*@dependent@*/ ltoken singleCharToken;
+static /*@dependent@*/ ltoken whiteCharToken;
+static /*@dependent@*/ ltoken quantifierSymToken;
+static /*@dependent@*/ ltoken logicalOpToken;
+static /*@dependent@*/ ltoken eqOpToken;
+static /*@dependent@*/ ltoken equationSymToken;
+static /*@dependent@*/ ltoken eqSepSymToken;
+static /*@dependent@*/ ltoken selectSymToken;
+static /*@dependent@*/ ltoken openSymToken;
+static /*@dependent@*/ ltoken sepSymToken;
+static /*@dependent@*/ ltoken closeSymToken;
+static /*@dependent@*/ ltoken simpleIdToken;
+static /*@dependent@*/ ltoken mapSymToken;
+static /*@dependent@*/ ltoken markerSymToken;
+static /*@dependent@*/ ltoken commentSymToken;
+static /*@dependent@*/ ltoken synonymToken;
+
+static bool
+hasFirstChar (ltoken tok)
+{
+  return (ltoken_isChar (tok)
+	  && lscanCharClass (cstring_firstChar (ltoken_unparse (tok))) == SINGLECHAR);
+}
+
+void
+LSLProcessInitFile (void)
+{
+  InitFile ();
+}
+
+/*
+**
+**  Parsing functions for init file processing, in the same order as the
+**  grammar file lslinit.cfg.  This is top-down order, as much as possible.
+**
+*/
+
+static void
+InitFile (void)
+{
+  InitLines ();
+  InitReduce (INITFILE1);
+
+  if (ltoken_getCode (nextToken) != LEOFTOKEN)
+    {
+      LocalUserError (nextToken, "unexpected tokens after end-of-file");
+    }
+}
+
+static void
+InitLines (void)
+{
+  InitReduce (INITLINES1);
+
+  if (ltoken_getCode (nextToken) != LEOFTOKEN)
+    {
+      InitLine ();
+      InitReduce (INITLINES2);
+    }
+
+  while (ltoken_getCode (nextToken) != LEOFTOKEN)
+    {
+      InitLine ();
+      InitReduce (INITLINES3);
+    }
+
+}
+
+static void
+InitLine (void)
+{
+  if (ltoken_getCode (nextToken) == LST_EOL)
+    {
+     /* Nothing on line. */
+      InitReduce (INITLINE1);
+    }
+  else
+    {
+      Classification ();
+      InitReduce (INITLINE2);
+    }
+
+  if (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      LocalUserError (nextToken, "Unexpected tokens on line");
+    }
+
+  ltoken_free (nextToken);
+  nextToken = LSLScanNextToken ();	       
+}
+
+static void
+Classification (void)
+{
+  if (ltoken_getRawText (nextToken) == ltoken_getText (endCommentCharToken)
+      || ltoken_getRawText (nextToken) == ltoken_getText (idCharToken)
+      || ltoken_getRawText (nextToken) == ltoken_getText (opCharToken)
+      || ltoken_getRawText (nextToken) == ltoken_getText (extensionCharToken)
+      || ltoken_getRawText (nextToken) == ltoken_getText (singleCharToken)
+      || ltoken_getRawText (nextToken) == ltoken_getText (whiteCharToken))
+    {
+      CharClass ();
+      InitReduce (CLASSIFICATION1);
+    }
+  else if (ltoken_getRawText (nextToken) == ltoken_getText (quantifierSymToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (logicalOpToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (eqOpToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (equationSymToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (eqSepSymToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (selectSymToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (openSymToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (sepSymToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (closeSymToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (simpleIdToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (mapSymToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (markerSymToken)
+	   || ltoken_getRawText (nextToken) == ltoken_getText (commentSymToken))
+    {
+      TokenClass ();
+      InitReduce (CLASSIFICATION2);
+    }
+  else if (ltoken_getRawText (nextToken) == ltoken_getText (synonymToken))
+    {
+      SynClass ();
+      InitReduce (CLASSIFICATION3);
+    }
+  else
+    {
+      LocalUserError (nextToken,
+		      "expected character, token, or synonym classification");
+    }
+}
+
+static void
+CharClass (void)
+{
+  ltoken charClassToken;
+
+  charClassToken = nextToken;
+
+  nextToken = LSLScanNextToken ();		/* Discard char class keyword. */
+
+  if (ltoken_getRawText (charClassToken) == ltoken_getText (endCommentCharToken))
+    {
+      EndCommentChars ();
+      InitReduce (CHARCLASS1);
+    }
+  else if (ltoken_getRawText (charClassToken) == ltoken_getText (idCharToken))
+    {
+      IdChars ();
+      InitReduce (CHARCLASS2);
+    }
+  else if (ltoken_getRawText (charClassToken) == ltoken_getText (opCharToken))
+    {
+      OpChars ();
+      InitReduce (CHARCLASS3);
+    }
+  else if (ltoken_getRawText (charClassToken)
+	   == ltoken_getText (extensionCharToken))
+    {
+      ExtensionChar ();
+      InitReduce (CHARCLASS4);
+    }
+  else if (ltoken_getRawText (charClassToken) == ltoken_getText (singleCharToken))
+    {
+      SingChars ();
+      InitReduce (CHARCLASS5);
+    }
+  else if (ltoken_getRawText (charClassToken) == ltoken_getText (whiteCharToken))
+    {
+      WhiteChars ();
+      InitReduce (CHARCLASS6);
+    }
+  else
+    {
+      LocalUserError (nextToken, "expected character classification");
+    }
+
+  ltoken_free (charClassToken);
+}
+
+static void
+EndCommentChars (void)
+{
+  EndCommentChar ();
+  InitReduce (LRC_ENDCOMMENT1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      EndCommentChar ();
+      InitReduce (LRC_ENDCOMMENT2);
+    }
+
+}
+
+static void
+IdChars (void)
+{
+  IdChar ();
+  InitReduce (IDCHARS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      IdChar ();
+      InitReduce (IDCHARS2);
+    }
+}
+
+static void
+OpChars (void)
+{
+  OpChar ();
+  InitReduce (OPCHARS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      OpChar ();
+      InitReduce (OPCHARS2);
+    }
+}
+
+static void
+ExtensionChar (void)
+{
+  if (ltoken_isChar (nextToken)
+      && lscanCharClass (cstring_firstChar (ltoken_unparse (nextToken))) == SINGLECHAR)
+    {
+      LSLGenShiftOnly (nextToken);
+      nextToken = LSLScanNextToken ();
+      InitReduce (LRC_EXTENSIONCHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken, "expected only one character");
+    }
+}
+
+static void
+SingChars (void)
+{
+  SingChar ();
+  InitReduce (SINGCHARS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      SingChar ();
+      InitReduce (SINGCHARS2);
+    }
+}
+
+static void
+WhiteChars (void)
+{
+  WhiteChar ();
+  InitReduce (WHITECHARS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      WhiteChar ();
+      InitReduce (WHITECHARS2);
+    }
+}
+
+static void
+EndCommentChar (void)
+{
+  if (ltoken_isChar (nextToken))
+    {
+      LSLGenShiftOnly (nextToken);
+      nextToken = LSLScanNextToken ();
+      InitReduce (LRC_ENDCOMMENTCHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken, "expected only one character");
+    }
+}
+
+static void
+IdChar (void)
+{
+  if (hasFirstChar (nextToken))
+    {
+      LSLGenShiftOnly (nextToken);
+      nextToken = LSLScanNextToken ();
+      InitReduce (IDCHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken, "character is already defined, cannot redefine");
+    }
+}
+
+static void
+OpChar (void)
+{
+  if (hasFirstChar (nextToken))
+    {
+      LSLGenShiftOnly (nextToken);
+      nextToken = LSLScanNextToken ();
+      InitReduce (OPCHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken, "character is already defined, cannot redefine");
+    }
+}
+
+static void
+SingChar (void)
+{
+  if (hasFirstChar (nextToken))
+    {
+      LSLGenShiftOnly (nextToken);
+      nextToken = LSLScanNextToken ();
+      InitReduce (SINGCHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken, "character is already defined, cannot redefine");
+    }
+}
+
+static void
+WhiteChar (void)
+{
+  if (hasFirstChar (nextToken))
+    {
+      LSLGenShiftOnly (nextToken);
+      nextToken = LSLScanNextToken ();
+      InitReduce (WHITECHAR1);
+    }
+  else
+    {
+      LocalUserError (nextToken, "character is already defined, cannot redefine");
+    }
+}
+
+static void
+TokenClass (void)
+{
+  ltoken tokenClassToken;
+
+  tokenClassToken = nextToken;
+
+  nextToken = LSLScanNextToken ();
+
+  if (ltoken_getRawText (tokenClassToken) == ltoken_getText (quantifierSymToken))
+    {
+      QuantifierSymToks ();
+      InitReduce (TOKENCLASS1);
+    }
+  else if (ltoken_getRawText (tokenClassToken) == ltoken_getText (logicalOpToken))
+    {
+      LogicalOpToks ();
+      InitReduce (TOKENCLASS2);
+    }
+  else if (ltoken_getRawText (tokenClassToken) == ltoken_getText (eqOpToken))
+    {
+      EqOpToks ();
+      InitReduce (TOKENCLASS3);
+    }
+  else if (ltoken_getRawText (tokenClassToken)
+	   == ltoken_getText (equationSymToken))
+    {
+      EquationSymToks ();
+      InitReduce (TOKENCLASS4);
+    }
+  else if (ltoken_getRawText (tokenClassToken) == ltoken_getText (eqSepSymToken))
+    {
+      EqSepSymToks ();
+      InitReduce (TOKENCLASS5);
+    }
+  else if (ltoken_getRawText (tokenClassToken) == ltoken_getText (selectSymToken))
+    {
+      SelectSymToks ();
+      InitReduce (TOKENCLASS6);
+    }
+  else if (ltoken_getRawText (tokenClassToken) == ltoken_getText (openSymToken))
+    {
+      OpenSymToks ();
+      InitReduce (TOKENCLASS7);
+    }
+  else if (ltoken_getRawText (tokenClassToken) == ltoken_getText (sepSymToken))
+    {
+      SepSymToks ();
+      InitReduce (TOKENCLASS8);
+    }
+  else if (ltoken_getRawText (tokenClassToken) == ltoken_getText (closeSymToken))
+    {
+      CloseSymToks ();
+      InitReduce (TOKENCLASS9);
+    }
+  else if (ltoken_getRawText (tokenClassToken) == ltoken_getText (simpleIdToken))
+    {
+      SimpleIdToks ();
+      InitReduce (TOKENCLASS10);
+    }
+  else if (ltoken_getRawText (tokenClassToken) == ltoken_getText (mapSymToken))
+    {
+      MapSymToks ();
+      InitReduce (TOKENCLASS11);
+    }
+  else if (ltoken_getRawText (tokenClassToken) == ltoken_getText (markerSymToken))
+    {
+      MarkerSymToks ();
+      InitReduce (TOKENCLASS12);
+    }
+  else if (ltoken_getRawText (tokenClassToken)
+	   == ltoken_getText (commentSymToken))
+    {
+      CommentSymToks ();
+      InitReduce (TOKENCLASS13);
+    }
+  else
+    {
+      LocalUserError (nextToken, "expected token classification");
+    }
+
+  ltoken_free (tokenClassToken);
+}
+
+static void
+QuantifierSymToks (void)
+{
+  QuantifierSymTok ();
+  InitReduce (QUANTIFIERSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      QuantifierSymTok ();
+      InitReduce (QUANTIFIERSYMTOKS2);
+    }
+}
+
+static void
+LogicalOpToks (void)
+{
+  LogicalOpTok ();
+  InitReduce (LOGICALOPTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      LogicalOpTok ();
+      InitReduce (LOGICALOPTOKS2);
+    }
+}
+
+static void
+EqOpToks (void)
+{
+  EqOpTok ();
+  InitReduce (LRC_EQOPTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      EqOpTok ();
+      InitReduce (LRC_EQOPTOKS2);
+    }
+}
+
+static void
+EquationSymToks (void)
+{
+  EquationSymTok ();
+  InitReduce (LRC_EQUATIONSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      EquationSymTok ();
+      InitReduce (LRC_EQUATIONSYMTOKS2);
+    }
+}
+
+static void
+EqSepSymToks (void)
+{
+  EqSepSymTok ();
+  InitReduce (LRC_EQSEPSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      EqSepSymTok ();
+      InitReduce (LRC_EQSEPSYMTOKS2);
+    }
+}
+
+static void
+SelectSymToks (void)
+{
+  SelectSymTok ();
+  InitReduce (SELECTSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      SelectSymTok ();
+      InitReduce (SELECTSYMTOKS2);
+    }
+}
+
+static void
+OpenSymToks (void)
+{
+  OpenSymTok ();
+  InitReduce (OPENSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      OpenSymTok ();
+      InitReduce (OPENSYMTOKS2);
+    }
+}
+
+static void
+SepSymToks (void)
+{
+  SepSymTok ();
+  InitReduce (SEPSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      SepSymTok ();
+      InitReduce (SEPSYMTOKS2);
+    }
+}
+
+static void
+CloseSymToks (void)
+{
+  CloseSymTok ();
+  InitReduce (CLOSESYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      CloseSymTok ();
+      InitReduce (CLOSESYMTOKS2);
+    }
+}
+
+static void
+SimpleIdToks (void)
+{
+  SimpleIdTok ();
+  InitReduce (SIMPLEIDTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      SimpleIdTok ();
+      InitReduce (SIMPLEIDTOKS2);
+    }
+}
+
+static void
+MapSymToks (void)
+{
+  MapSymTok ();
+  InitReduce (MAPSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      MapSymTok ();
+      InitReduce (MAPSYMTOKS2);
+    }
+}
+
+static void
+MarkerSymToks (void)
+{
+  MarkerSymTok ();
+  InitReduce (MARKERSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      MarkerSymTok ();
+      InitReduce (MARKERSYMTOKS2);
+    }
+}
+
+static void
+CommentSymToks (void)
+{
+  CommentSymTok ();
+  InitReduce (COMMENTSYMTOKS1);
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      CommentSymTok ();
+      InitReduce (COMMENTSYMTOKS2);
+    }
+}
+
+static void
+QuantifierSymTok (void)
+{
+  Token ();
+  InitReduce (QUANTIFIERSYMTOK1);
+}
+
+static void
+LogicalOpTok (void)
+{
+  Token ();
+  InitReduce (LOGICALOPTOK1);
+}
+
+static void
+EqOpTok (void)
+{
+  Token ();
+  InitReduce (LRC_EQOPTOK1);
+}
+
+static void
+EquationSymTok (void)
+{
+ /* ### EquationSymTok (); ### */
+  Token ();
+  InitReduce (LRC_EQUATIONSYMTOK1);
+}
+
+static void
+EqSepSymTok (void)
+{
+  Token ();
+  InitReduce (LRC_EQSEPSYMTOK1);
+
+}
+
+static void
+SelectSymTok (void)
+{
+  Token ();
+  InitReduce (SELECTSYMTOK1);
+}
+
+static void
+OpenSymTok (void)
+{
+  Token ();
+  InitReduce (OPENSYMTOK1);
+}
+
+static void
+SepSymTok (void)
+{
+  Token ();
+  InitReduce (SEPSYMTOK1);
+}
+
+static void
+CloseSymTok (void)
+{
+  Token ();
+  InitReduce (CLOSESYMTOK1);
+}
+
+static void
+SimpleIdTok (void)
+{
+  Token ();
+  InitReduce (SIMPLEIDTOK1);
+}
+
+static void
+MapSymTok (void)
+{
+  Token ();
+  InitReduce (MAPSYMTOK1);
+}
+
+static void
+MarkerSymTok (void)
+{
+  Token ();
+  InitReduce (MARKERSYMTOK1);
+
+}
+
+static void
+CommentSymTok (void)
+{
+  Token ();
+  InitReduce (COMMENTSYMTOK1);
+}
+
+
+static void
+SynClass (void)
+{
+  if (ltoken_getRawText (nextToken) == ltoken_getText (synonymToken))
+    {
+      ltoken_free (nextToken);
+      nextToken = LSLScanNextToken ();
+
+      OldToken ();
+      NewToken ();
+
+      InitReduce (SYNCLASS1);
+    }
+  else
+    {
+      LocalUserError (nextToken, "expected synonym classification");
+    }
+
+}
+
+static void
+OldToken (void)
+{
+  Token ();
+  InitReduce (OLDTOKEN1);
+
+}
+
+static void
+NewToken (void)
+{
+  Token ();
+  InitReduce (NEWTOKEN1);
+
+}
+
+static void
+Token (void)
+{
+  if (ltoken_getCode (nextToken) == LST_EOL
+      || ltoken_getCode (nextToken) == LEOFTOKEN)
+    {
+      LocalUserError (nextToken, "unexpected end-of-line or end-of-file");
+    }
+  else
+    {
+      LSLGenShiftOnly (nextToken);
+      nextToken = LSLScanNextToken ();
+    }
+}
+
+/*
+** Init File Processing Routines, these routines use the shift-reduce sequence
+** produced by the init file parser and update the necessary tables for the
+** scanner.
+**
+** The same shift stack is used that LSL parser uses.  A different reduce
+** procedure is used because the init file grammar is different from the LSL
+** grammar.
+**
+*/
+
+static void
+InitReduce (LSLInitRuleCode rule)
+{
+  switch (rule)
+    {
+      case INITFILE1:
+      LTRACE ("INITFILE1");
+      break;
+
+    case INITLINES1:
+      LTRACE ("INITLINES1");
+      break;
+
+    case INITLINES2:
+      LTRACE ("INITLINES2");
+      break;
+
+    case INITLINES3:
+      LTRACE ("INITLINES3");
+      break;
+
+    case INITLINE1:
+      LTRACE ("INITLINE1");
+      break;
+
+    case INITLINE2:
+      LTRACE ("INITLINE2");
+      break;
+
+    case CLASSIFICATION1:
+      LTRACE ("CLASSIFICATION1");
+      break;
+
+    case CLASSIFICATION2:
+      LTRACE ("CLASSIFICATION2");
+      break;
+
+    case CLASSIFICATION3:
+      LTRACE ("CLASSIFICATION3");
+      break;
+
+    case CHARCLASS1:
+      LTRACE ("CHARCLASS1");
+      break;
+
+    case CHARCLASS2:
+      LTRACE ("CHARCLASS2");
+      break;
+
+    case CHARCLASS3:
+      LTRACE ("CHARCLASS3");
+      break;
+
+    case CHARCLASS4:
+      LTRACE ("CHARCLASS4");
+      break;
+
+    case CHARCLASS5:
+      LTRACE ("CHARCLASS5");
+      break;
+
+    case CHARCLASS6:
+      LTRACE ("CHARCLASS6");
+      break;
+
+    case LRC_ENDCOMMENT1:
+      LTRACE ("LRC_ENDCOMMENT1");
+      break;
+
+    case LRC_ENDCOMMENT2:
+      LTRACE ("LRC_ENDCOMMENT2");
+      break;
+
+    case IDCHARS1:
+      LTRACE ("IDCHARS1");
+      break;
+
+    case IDCHARS2:
+      LTRACE ("IDCHARS2");
+      break;
+
+    case OPCHARS1:
+      LTRACE ("OPCHARS1");
+      break;
+
+    case OPCHARS2:
+      LTRACE ("OPCHARS2");
+      break;
+
+    case LRC_EXTENSIONCHAR1:
+      LTRACE ("LRC_EXTENSIONCHAR1");
+      ProcessExtensionChar ();
+      break;
+
+    case SINGCHARS1:
+      LTRACE ("SINGCHARS1");
+      break;
+
+    case SINGCHARS2:
+      LTRACE ("SINGCHARS2");
+      break;
+
+    case WHITECHARS1:
+      LTRACE ("WHITECHARS1");
+      break;
+
+    case WHITECHARS2:
+      LTRACE ("WHITECHARS2");
+      break;
+
+    case LRC_ENDCOMMENTCHAR1:
+      LTRACE ("LRC_ENDCOMMENTCHAR1");
+      ProcessEndCommentChar ();
+      break;
+
+    case IDCHAR1:
+      LTRACE ("IDCHAR1");
+      ProcessSingleChar (IDCHAR);
+      break;
+
+    case OPCHAR1:
+      LTRACE ("OPCHAR1");
+      ProcessSingleChar (OPCHAR);
+      break;
+
+    case SINGCHAR1:
+      LTRACE ("SINGCHAR1");
+      ProcessSingleChar (SINGLECHAR);
+      break;
+
+    case WHITECHAR1:
+      LTRACE ("CHAR1");
+      ProcessSingleChar (WHITECHAR);
+      break;
+
+    case TOKENCLASS1:
+      LTRACE ("TOKENCLASS1");
+      break;
+
+    case TOKENCLASS2:
+      LTRACE ("TOKENCLASS2");
+      break;
+
+    case TOKENCLASS3:
+      LTRACE ("TOKENCLASS3");
+      break;
+
+    case TOKENCLASS4:
+      LTRACE ("TOKENCLASS4");
+      break;
+
+    case TOKENCLASS5:
+      LTRACE ("TOKENCLASS5");
+      break;
+
+    case TOKENCLASS6:
+      LTRACE ("TOKENCLASS6");
+      break;
+
+    case TOKENCLASS7:
+      LTRACE ("TOKENCLASS7");
+      break;
+
+    case TOKENCLASS8:
+      LTRACE ("TOKENCLASS8");
+      break;
+
+    case TOKENCLASS9:
+      LTRACE ("TOKENCLASS9");
+      break;
+
+    case TOKENCLASS10:
+      LTRACE ("TOKENCLASS10");
+      break;
+
+    case TOKENCLASS11:
+      LTRACE ("TOKENCLASS11");
+      break;
+
+    case TOKENCLASS12:
+      LTRACE ("TOKENCLASS12");
+      break;
+
+    case TOKENCLASS13:
+      LTRACE ("TOKENCLASS13");
+      break;
+
+    case QUANTIFIERSYMTOKS1:
+      LTRACE ("QUALIFERSYMTOKS1");
+      break;
+
+    case QUANTIFIERSYMTOKS2:
+      LTRACE ("QUANTIFIERSYMTOKS2");
+      break;
+
+    case LOGICALOPTOKS1:
+      LTRACE ("LOGICALOPTOKS1");
+      break;
+
+    case LOGICALOPTOKS2:
+      LTRACE ("LOGICALOPTOKS2");
+      break;
+
+    case LRC_EQOPTOKS1:
+      LTRACE ("LRC_EQOPTOKS1");
+      break;
+
+    case LRC_EQOPTOKS2:
+      LTRACE ("LRC_EQOPTOKS2");
+      break;
+
+    case LRC_EQUATIONSYMTOKS1:
+      LTRACE ("LRC_EQUATIONSYMTOKS1");
+      break;
+
+    case LRC_EQUATIONSYMTOKS2:
+      LTRACE ("LRC_EQUATIONSYMTOKS2");
+      break;
+
+    case LRC_EQSEPSYMTOKS1:
+      LTRACE ("LRC_EQSEPSYMTOKS1");
+      break;
+
+    case LRC_EQSEPSYMTOKS2:
+      LTRACE ("LRC_EQSEPSYMTOKS2");
+      break;
+
+    case SELECTSYMTOKS1:
+      LTRACE ("SELECTSYMTOKS1");
+      break;
+
+    case SELECTSYMTOKS2:
+      LTRACE ("SELECTSYMTOKS2");
+      break;
+
+    case OPENSYMTOKS1:
+      LTRACE ("OPENSYMTOKS1");
+      break;
+
+    case OPENSYMTOKS2:
+      LTRACE ("OPENSYMTOKS2");
+      break;
+
+    case SEPSYMTOKS1:
+      LTRACE ("SEPSYMTOKS1");
+      break;
+
+    case SEPSYMTOKS2:
+      LTRACE ("SEPSYMTOKS2");
+      break;
+
+    case CLOSESYMTOKS1:
+      LTRACE ("CLOSESYMTOKS1");
+      break;
+
+    case CLOSESYMTOKS2:
+      LTRACE ("CLOSESYMTOKS2");
+      break;
+
+    case SIMPLEIDTOKS1:
+      LTRACE ("SIMPLEIDTOKS1");
+      break;
+
+    case SIMPLEIDTOKS2:
+      LTRACE ("SIMPLEIDTOKS2");
+      break;
+
+    case MAPSYMTOKS1:
+      LTRACE ("MAPSYMTOKS1");
+      break;
+
+    case MAPSYMTOKS2:
+      LTRACE ("MAPSYMTOKS2");
+      break;
+
+    case MARKERSYMTOKS1:
+      LTRACE ("MARKERSYMTOKS1");
+      break;
+
+    case MARKERSYMTOKS2:
+      LTRACE ("MARKERSYMTOKS2");
+      break;
+
+    case COMMENTSYMTOKS1:
+      LTRACE ("COMMENTSYMTOKS1");
+      break;
+
+    case COMMENTSYMTOKS2:
+      LTRACE ("COMMENTSYMTOKS2");
+      break;
+
+    case QUANTIFIERSYMTOK1:
+      LTRACE ("QUANTIFERSYMTOK1");
+      ProcessToken (LST_QUANTIFIERSYM);
+      break;
+
+    case LOGICALOPTOK1:
+      LTRACE ("LOGICALOPTOK1");
+      ProcessToken (LST_LOGICALOP);
+      break;
+
+    case LRC_EQOPTOK1:
+      LTRACE ("LRC_EQOPTOK1");
+      ProcessToken (LST_EQOP);
+      break;
+
+    case LRC_EQUATIONSYMTOK1:
+      LTRACE ("LRC_EQUATIONSYMTOK1");
+      ProcessToken (LST_EQUATIONSYM);
+      break;
+
+    case LRC_EQSEPSYMTOK1:
+      LTRACE ("LRC_EQSEPSYMTOK1");
+      ProcessToken (LST_EQSEPSYM);
+      break;
+
+    case SELECTSYMTOK1:
+      LTRACE ("SELECTSYMTOK1");
+      ProcessToken (LST_SELECTSYM);
+      break;
+
+    case OPENSYMTOK1:
+      LTRACE ("OPENSYMTOK1");
+      ProcessToken (LST_OPENSYM);
+      break;
+
+    case SEPSYMTOK1:
+      LTRACE ("SEPSYMTOK1");
+      ProcessToken (LST_SEPSYM);
+      break;
+
+    case CLOSESYMTOK1:
+      LTRACE ("CLOSESYMTOK1");
+      ProcessToken (LST_CLOSESYM);
+      break;
+
+    case SIMPLEIDTOK1:
+      LTRACE ("SIMPLEIDTOK1");
+      ProcessToken (LST_SIMPLEID);
+      break;
+
+    case MAPSYMTOK1:
+      LTRACE ("MAPSYMTOK1");
+      ProcessToken (LST_MAPSYM);
+      break;
+
+    case MARKERSYMTOK1:
+      LTRACE ("MARKERSYMTOK1");
+      ProcessToken (LST_MARKERSYM);
+      break;
+
+    case COMMENTSYMTOK1:
+      LTRACE ("COMMENTSYMTOK1");
+      ProcessToken (LST_COMMENTSYM);
+      break;
+
+    case SYNCLASS1:
+      LTRACE ("SYNCLASS1");
+      ProcessSynonym ();
+      break;
+
+    case OLDTOKEN1:
+      LTRACE ("OLDTOKEN1");
+      break;
+
+    case NEWTOKEN1:
+      LTRACE ("NEWTOKEN1");
+      break;
+
+    default:
+      llcontbuglit ("InitReduce: bad switch");
+      break;
+
+    }				/* end switch	    */
+}				/* end InitReduce () */
+
+
+
+/* Reset the first character of the predefined extensionChar keywords when  */
+/* the extensionChar changes.  e.g. "extensionChar @" changes "forall" to   */
+/* "@forall".								    */
+
+static void
+UpdateXCharKeywords (charCode xCharCode)
+{
+  char xChar = (char) xCharCode;
+  char *str;
+
+  str = ltoken_getTextChars (ltoken_forall);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_and);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_or);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_implies);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_eq);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_neq);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_equals);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_eqsep);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_select);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_open);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_sep);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_close);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_id);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_arrow);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_marker);
+  *str = xChar;
+
+  str = ltoken_getTextChars (ltoken_comment);
+  *str = xChar;
+
+}
+
+/* Different from ProcessCharClass because only allow one extension	    */
+/* character. Therefore, the present extension character must be set to a   */
+/* singleChar.								    */
+
+static void
+ProcessExtensionChar (void)
+{
+  ltoken stackToken = LSLGenTopPopShiftStack ();
+  char firstChar = cstring_firstChar (ltoken_unparse (stackToken));
+
+  if (!defineSingleChar[(int)firstChar]
+      && lscanCharClass (firstChar) == SINGLECHAR)
+    {
+     /* Is a single character that has not been defined before.	    */
+     /* Can only have one extension char.  Release old one. */
+      lsetCharClass (firstChar, CHC_EXTENSION);
+      
+      /* this is a (bogus) type bug! caught by lclint */
+      /* lsetCharClass (currentExtensionChar, SINGLECHAR); */
+
+      lsetCharClass ((char) currentExtensionChar, SINGLECHAR);
+
+      currentExtensionChar = (charCode) firstChar;
+      UpdateXCharKeywords (currentExtensionChar);
+    }
+  else
+    {
+     /* Already redefined.  Don't allow to be redefined. */
+      LocalUserError (stackToken, "character is already defined, cannot redefine");
+    }
+  ltoken_free (stackToken);
+}
+
+/* Different from ProcessSingleChar because allow any characters to be	    */
+/* endCommentChar and also set a different part of the scanner structure.   */
+
+static void
+ProcessEndCommentChar (void)
+{
+  ltoken stackToken = LSLGenTopPopShiftStack ();
+  char firstChar = cstring_firstChar (ltoken_unparse (stackToken));
+
+  if (LSLIsEndComment (firstChar))
+    {
+      LocalUserError (stackToken,
+		    "already defined as a endCommentChar, cannot redefine");
+    }
+  else
+    {
+      lsetEndCommentChar (firstChar, TRUE);
+    }
+  ltoken_free (stackToken);
+}
+
+static void
+ProcessSingleChar (charCode code)
+{
+  ltoken stackToken = LSLGenTopPopShiftStack ();
+  char firstChar = cstring_firstChar (ltoken_unparse (stackToken));
+
+  if (!defineSingleChar[(int)firstChar]
+      && lscanCharClass (firstChar) == SINGLECHAR)
+    {
+      /* Is a single character that has not been defined before.	    */
+      /* It's OK to redefine once. */
+      lsetCharClass (firstChar, code);
+      /* OK to mark as a defined singleChar even if not.  Only check	    */
+      /* defineSingleChar[] if defining a singleChar.			    */
+      defineSingleChar[(int)firstChar] = TRUE;
+    }
+  else
+    {
+      LocalUserError (stackToken, "character is already defined, cannot redefine");
+    }
+  ltoken_free (stackToken);
+}
+
+static void
+ProcessToken (ltokenCode code)
+{
+  ltoken stackToken, temp;
+  lsymbol sym;
+
+  stackToken = LSLGenTopPopShiftStack ();
+  sym = ltoken_getText (stackToken);
+
+  if (LSLIsSyn (sym))
+    {
+      LocalUserError (stackToken,
+		      "already defined as a synonym, cannot redefine");
+    }
+
+  /* Get the token from the token table, so can check if the token    */
+  /* was updated by a previous token.				    */
+  temp = LSLGetToken (sym);
+  
+  if (ltoken_isStateDefined (temp))
+    {
+      if ((code == LST_OPENSYM && sym == lsymbol_fromChars ("[")) ||
+	  (code == LST_CLOSESYM && sym == lsymbol_fromChars ("]")))
+	{
+	  /* ignore "openSym [" and "closeSym ]" TokenClass */
+	  ltoken_free (stackToken);
+	  return;
+	}
+      else
+	{
+	  LocalUserError (stackToken, "already defined, cannot redefine");
+	  PrintToken (temp);
+	}
+    }
+  
+  LSLUpdateToken (code, ltoken_getText (stackToken), TRUE);
+  ltoken_free (stackToken);
+}
+
+
+static void
+ProcessSynonym (void)
+{
+  ltoken newtok;
+  ltoken oldtok;
+
+  newtok = LSLGenTopPopShiftStack ();
+  oldtok = LSLGenTopPopShiftStack ();
+
+  if (ltoken_wasSyn (newtok))
+    {
+     /* The token has a synonym.  This means that the synonym was in the */
+     /* init file, so complain about redefining as a synonym again	    */
+      LocalUserError (newtok, "newtok already is a synonym, cannot redefine");
+    }
+
+  if (ltoken_hasSyn (newtok))
+    {
+      /*
+      ** newtok already has a synonym defined for it.  Do not allow	    
+      ** synonyms to be chained.					    
+      */
+
+      LocalUserError (newtok,
+		      "newtok already has a synonym, cannot chain synonyms");
+    }
+
+  if (ltoken_isStateDefined (newtok))
+    {
+      LocalUserError (newtok, "newtok already defined, cannot redefine");
+    }
+
+  LSLAddSyn (ltoken_getText (newtok), ltoken_getText (oldtok));
+  ltoken_free (oldtok);
+  ltoken_free (newtok);
+}
+
+
+/*
+ * Utilities, in alphabetical order
+ */
+
+static void
+LocalUserError (ltoken t, /*@temp@*/ char *msg)
+{
+  lldiagmsg (message ("%s %s in the LSL init file:", 
+		      ltoken_unparse (t), cstring_fromChars (msg)));
+
+  ltoken_free (nextToken);
+  nextToken = LSLScanNextToken ();	       
+
+  while (ltoken_getCode (nextToken) != LST_EOL)
+    {
+      ltoken_free (nextToken);
+      nextToken = LSLScanNextToken ();
+    }
+}
+
+/*
+**  Required initialization and cleanup routines
+*/
+
+static /*@exposed@*/ ltoken insertSimpleToken (char *text) 
+  /*@modifies internalState@*/
+{
+  return (LSLInsertToken (LST_SIMPLEID, lsymbol_fromChars (text), 0, FALSE));
+}
+
+void
+LSLProcessInitFileInit (void)
+{
+  int i;
+
+  LSLGenInit (TRUE);		/* parsing LSLinit not LCLinit */
+
+  /*
+  ** Insert the init file keywords into the token table as undefined	    
+  ** SIMPLEIDs.  They are defined as simpleIds since they must be treated 
+  ** that way if they do not appear as the first token on a line, and	    
+  ** they must be treated that way for the actual LSL parsing. Save the   
+  ** tokens so can recognize as init file keywords when necessary.	 
+  */
+
+  endCommentCharToken = insertSimpleToken ("endCommentChar");
+  idCharToken = insertSimpleToken ("idChar");			     
+  opCharToken = insertSimpleToken ("opChar");			     
+  extensionCharToken = insertSimpleToken ("extensionChar");    
+  singleCharToken = insertSimpleToken ("singleChar");	
+  whiteCharToken = insertSimpleToken ("whiteChar");
+
+  quantifierSymToken = insertSimpleToken ("quantifierSym");
+  logicalOpToken = insertSimpleToken ("logicalOp");
+  eqOpToken = insertSimpleToken ("eqOp");			   
+  equationSymToken = insertSimpleToken ("equationSym");
+  eqSepSymToken = insertSimpleToken ("eqSepSym");			       
+  selectSymToken = insertSimpleToken ("selectSym");
+  openSymToken = insertSimpleToken ("openSym");			      
+  sepSymToken = insertSimpleToken ("sepSym");			     
+  closeSymToken = insertSimpleToken ("closeSym");			       
+  simpleIdToken = insertSimpleToken ("simpleId");			       
+  mapSymToken = insertSimpleToken ("mapSym");			     
+  markerSymToken = insertSimpleToken ("markerSym");
+  commentSymToken = insertSimpleToken ("commentSym"); 
+  synonymToken = insertSimpleToken ("synonym");			      
+
+  for (i = 0; i <= LASTCHAR; i++)
+    {
+      defineSingleChar[i] = FALSE;
+    }
+  
+  /*
+  ** Record the current extension character so can redefine back to	    
+  ** singleChar if a new extension character is redefined.		    
+  */
+
+  currentExtensionChar = (charCode) CHAREXTENDER;
+
+  LSLReportEolTokens (TRUE);
+  ltoken_free (nextToken);
+  nextToken = LSLScanNextToken ();	       
+}
+
+
+
+
+
+
+
+
diff --git a/src/lslparse.c b/src/lslparse.c
new file mode 100644
index 0000000..01ddf6b
--- /dev/null
+++ b/src/lslparse.c
@@ -0,0 +1,512 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lslparse.c
+**
+** Module for calling LSL checker.
+**
+**  AUTHOR:
+**	Yang Meng Tan,
+**         Massachusetts Institute of Technology
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "lclscan.h"
+# include "signature.h"
+# include "signature2.h"
+# include "scan.h"
+# include "scanline.h"
+# include "syntable.h"
+# include "tokentable.h"
+# include "lslinit.h"
+# include "lslparse.h"
+# include "llmain.h"
+
+/*@+ignorequals@*/
+
+/*@dependent@*/ /*@null@*/ lslOp g_importedlslOp = NULL;
+bool g_lslParsingTraits = FALSE;
+
+static void invokeLSL (char *p_infile, char *p_outfile, bool p_deletep);
+
+int
+parseSignatures (cstring infile)
+{
+  char *cinfile = cstring_toCharsSafe (infile);
+  tsource *sourceFile;
+  ltoken *id = (ltoken *) dmalloc (sizeof (*id));
+  int status = 0;
+
+  /* parse traits */
+  *id = LSLInsertToken (LST_SIMPLEID, lsymbol_fromChars (cinfile), 0, FALSE);
+  ltoken_setFileName (*id, cinfile);
+  ltoken_setLine (*id, 0);
+  ltoken_setCol (*id, 0);
+
+  sourceFile = tsource_create (cinfile, "", FALSE);
+
+  if (!tsource_getPath (cstring_toCharsSafe (context_getLarchPath ()), sourceFile))
+    {
+      lclplainerror 
+	(message ("LSL signature parsing: can't find file %s containing trait",
+		  cstring_fromChars (tsource_fileName (sourceFile))));
+      status = 1;
+
+      sfree (id);
+      tsource_free (sourceFile);
+      return status;
+    }
+
+  if (!tsource_open (sourceFile))
+    {
+      lclplainerror 
+	(cstring_makeLiteral ("LSL parsing: can't open file containing trait"));
+      status = 2;
+      sfree (id);
+      tsource_free (sourceFile);
+
+      return status;
+    }
+
+  lsldebug = 0;
+  g_lslParsingTraits = TRUE;
+  LSLScanReset (sourceFile);
+  LSLReportEolTokens (FALSE);
+
+  status = lslparse ();
+
+  /* symtable_dump (symtab, stdout, TRUE); */
+  g_lslParsingTraits = FALSE;
+
+  (void) tsource_close (sourceFile);
+  tsource_free (sourceFile);
+
+  sfree (id);
+
+  
+  return status;
+}
+
+/*@only@*/ lslOp
+parseOpLine (char *fname, char *line)
+{
+  tsource *sourceFile;
+  bool status;
+
+  sourceFile = tsource_fromString (fname, line);
+  
+  if (check (tsource_open (sourceFile)))
+    {
+      LSLScanReset (sourceFile);
+      LSLReportEolTokens (FALSE); /* 0 by default, lslParsingTraits = 0; */
+      
+      /*
+      ** lsl parsing and importing .lcs files are expected to be mutually
+      ** exclusive. 
+      **
+      ** lslparse sets importedlslOp
+      */
+      
+      status = (lslparse () != 0);
+      
+      if (status)
+	{
+	  lclplainfatalerror (message ("Error in parsing line: %s", 
+				       cstring_fromChars (line)));
+	}
+      
+      (void) tsource_close (sourceFile);
+    }
+
+  tsource_free (sourceFile);
+  
+  llassert (g_importedlslOp != NULL);
+  return (lslOp_copy (g_importedlslOp));
+}
+
+lsymbol
+processTraitSortId (lsymbol sortid)
+{
+  lsymbol out = lsymbol_sortFromType (g_symtab, sortid);
+  if (out == sortid)
+    { /* may be a new sort */
+      (void) sort_fromLsymbol (sortid);
+    }
+  return out;
+}
+
+/* formerly from check.c module */
+
+static /*@only@*/ cstring
+printTypeName2 (typeNameNode n)
+{
+  cstring s = cstring_undefined;
+  sortNode sn;
+  lsymbol lclSort;
+  ltoken err;
+
+  if (n != (typeNameNode) 0)
+    {
+      if (n->isTypeName)
+	{
+	  /* does not process opForm renaming, pass on to LSL
+	     and hope that it works for now. */
+	  typeNamePack p = n->typename;
+
+	  llassert (p != NULL);
+
+	  /* get the LCL type, assume LCL type has already been mentioned. */
+	  lclSort = lclTypeSpecNode2sort (p->type);
+	  lclSort = sort_getUnderlying (lclSort);
+	  /* lclsource = LCLSLScanSource (); */
+	  if (!sort_isValidSort (lclSort))
+	    {
+	      err = lclTypeSpecNode_errorToken (p->type);
+	      /* errorShowPoint (tsource_thisLine (lclsource), ltoken_getCol (err)); */
+	      lclerror (err, message ("Unrecognized type in uses: %q", 
+				      typeNameNode_unparse (n)));
+	    }
+	  else
+	    {
+	      /* 
+              ** Below is necessary because this is one place where an LCL mutable
+	      ** type name is mapped directly into its value sort, not obj sort.
+	      ** Allows us to support only one qualifying "obj", rather
+	      ** than "val" as well. 
+	      */
+	      
+	      lclSort = typeExpr2ptrSort (lclSort, p->abst);
+	      lclSort = sort_makeVal (lclSort);
+	      
+	      /*
+	      ** Check that lclSort is not a HOFSort ...
+	      ** Propagation of HOFSort should stop here.  
+	      */
+
+	      if (sort_isHOFSortKind (lclSort))
+		{
+		  err = lclTypeSpecNode_errorToken (p->type);
+		  
+		  lclfatalerror
+		    (err, 
+		     cstring_makeLiteral 
+		     ("LCL uses cannot handle higher-order types"));
+		}
+	      if (p->isObj)
+		lclSort = sort_makeObj (lclSort);
+	      
+	      /*	if (!p->isObj) {
+			lclSort = sort_makeVal (lclSort);
+			} */
+	      
+	      sn = sort_lookup (lclSort);
+	      s = cstring_copy (cstring_fromChars (lsymbol_toChars (sn.name)));
+	      /* s = string_paste (s, AbstDeclaratorNode_unparse (p->abst)); */
+	    }
+	}
+      else
+	{
+	  /* s = OpFormNode_unparse (n->opform); */
+	  if (n->opform != 0)
+	    {
+	      lclfatalerror 
+		(n->opform->tok,
+		 cstring_makeLiteral ("Attempt to rename operator with uses: "
+				     "use LSL includes renaming facility"));
+	    }
+	  else
+	    {		
+	      BADEXIT;
+	    }
+	}
+    }
+  return s;
+}
+
+static /*@only@*/ cstring
+replaceNode_unparseAlt (replaceNode x)
+{
+  cstring s = cstring_undefined;
+
+  if (x != (replaceNode) 0)
+    {
+      s = printTypeName2 (x->typename);
+      s = cstring_concatChars (s, " for ");
+
+      if (x->isCType)
+	{
+	  s = cstring_concatFree1 (s, ltoken_unparse (x->content.ctype));
+	}
+      else
+	{
+	  s = cstring_concatFree (s, nameNode_unparse (x->content.renamesortname.name));
+	  s = cstring_concatFree (s, 
+				  sigNode_unparse (x->content.renamesortname.signature));
+	}
+    }
+
+  return s;
+}
+
+static /*@only@*/ cstring
+replaceNodeList_unparseAlt (replaceNodeList x)
+{
+  cstring s = cstring_undefined;
+  bool first = TRUE;
+
+  replaceNodeList_elements (x, i)
+    {
+      if (first)
+	{
+	  s = replaceNode_unparseAlt (i);
+	  first = FALSE;
+	}
+      else
+	{
+	  s = message ("%q, %q", s, replaceNode_unparseAlt (i));
+	}
+    } end_replaceNodeList_elements;
+
+  return s;
+}
+
+static /*@only@*/ cstring
+printNameList2 (typeNameNodeList x)
+{
+  /* printing a list of typeNameNode's, not nameNode's */
+  bool first = TRUE;
+  cstring s = cstring_undefined;
+
+  typeNameNodeList_elements (x, i)
+  {
+    if (first)
+      {
+	s = printTypeName2 (i);
+	first = FALSE;
+      }
+    else
+      {
+	s = message ("%q, %q", s, printTypeName2 (i));
+      }
+    } end_typeNameNodeList_elements; 
+
+  return s;
+}
+
+static /*@only@*/ cstring
+printRenamingNode2 (renamingNode x)
+{
+  cstring s = cstring_undefined;
+
+  if (x != (renamingNode) 0)
+    {
+      if (x->is_replace)
+	{
+	  replaceNodeList r = x->content.replace;
+	  s = replaceNodeList_unparseAlt (r);
+	}
+      else
+	{
+	  nameAndReplaceNode n = x->content.name;
+	  bool printComma = TRUE;
+	  if (typeNameNodeList_size (n->namelist) == 0)
+	    {
+	      printComma = FALSE;
+	    }
+	  s = printNameList2 (n->namelist);
+	  if (printComma)
+	    if (replaceNodeList_isDefined (n->replacelist) &&
+		replaceNodeList_size (n->replacelist) != 0)
+	      {
+		s = cstring_appendChar (s, ',');
+		s = cstring_appendChar (s, ' ');
+	      }
+	  s = cstring_concatFree (s, replaceNodeList_unparseAlt (n->replacelist));
+	}
+    }
+  return s;
+}
+
+static /*@only@*/ cstring
+printTraitRefList2 (traitRefNodeList x)
+{
+  cstring s = cstring_undefined;
+
+  traitRefNodeList_elements (x, i)
+  {
+    s = message ("%qincludes (%q)", s, printRawLeaves2 (i->traitid));
+
+    if (i->rename != 0)
+      {
+	s = message ("%q(%q)", s, printRenamingNode2 (i->rename));
+      }
+    s = message ("%q\n", s);
+  } end_traitRefNodeList_elements;
+
+  return s;
+}
+
+void
+callLSL (/*@unused@*/ char *specfile, /*@only@*/ char *text)
+{
+  /* specfile is the name of the LCL file that contains "uses"
+     Create an intermediate file named
+     specfile_..
+     put text in the file, run lsl on it and direct
+     output to specfile_..
+     specfile can be a full pathname.
+     Note: LSL does not support traitnames that are pathnames, only
+     symbols. 
+     */
+
+  char *infile, *outfile;
+  char *tmp1, *tmp2;
+  FILE *inptr;
+
+  infile = cstring_toCharsSafe (fileName (fileTable_addltemp (context_fileTable ())));
+  
+  inptr = fopen (infile, "w");
+  
+  if (inptr == NULL)
+    {
+      /* fopen fails */
+      llfatalerror (message ("Unable to write intermediate file: %s", 
+			     cstring_fromChars (infile)));
+    }
+  
+  tmp1 = removePath (infile);
+  tmp2 = removeAnyExtension (tmp1);
+
+  fprintf (inptr, "%s : trait\n", tmp2);
+  sfree (tmp1);
+  sfree (tmp2);
+
+  fprintf (inptr, "%s", text);
+  check (fclose (inptr) == 0);
+
+  /* the default is to delete the input file */
+
+  outfile = cstring_toCharsSafe (fileName (fileTable_addltemp (context_fileTable ())));
+  invokeLSL (infile, outfile, context_getFlag (FLG_KEEP));
+  sfree (text);
+}
+
+static void invokeLSL (char *infile, char *outfile, bool deletep)
+{
+  /* run lsl on infile and leave result in outfile */
+  FILE *outptr;
+  filestatus status;
+  int callstatus;
+  cstring call;
+  char *returnPath = NULL;
+  
+  /*
+  ** Ensures that outfile can be written into, should find a better
+  ** way to do this. 
+  */
+  
+  outptr = fopen (outfile, "w");
+
+  if (outptr == NULL)
+    {			
+      /* fopen fails */
+      llfatalerror (message ("Unable to write intermediate file: %s", 
+			     cstring_fromChars (outfile)));
+    }
+  
+  check (fclose (outptr) == 0);
+
+  /* set call to the right command */
+  status = osd_getExePath ("PATH", "lsl", &returnPath);
+    
+
+  if (status == OSD_FILEFOUND)
+    {
+      call = message ("%s -syms %s > %s", cstring_fromChars (returnPath), 
+		      cstring_fromChars (infile), cstring_fromChars (outfile));
+      
+      /* before calling, make sure old file is removed */
+      (void) osd_unlink (outfile);
+
+      callstatus = osd_system (cstring_toCharsSafe (call));
+      
+      cstring_free (call);
+
+      if (callstatus != CALL_SUCCESS)
+	{
+	  /*
+	  ** lsl errors: call lsl again without -syms, sending output to stdout
+          */
+	  cstring syscal = message ("%s %s", cstring_fromChars (returnPath), 
+				    cstring_fromChars (infile));
+
+	  (void) osd_system (cstring_toCharsSafe (syscal));
+	  cstring_free (syscal);
+
+	  llfatalerror (cstring_makeLiteral ("LSL trait used contains errors.")); 
+	}
+      else
+	{			/* ok, go ahead */
+	 /* Now parse the LSL output and store info in symbol table */
+	  callstatus = parseSignatures (cstring_fromChars (outfile));
+
+	  if (callstatus == 0)
+	    {	
+	      /* all went well */
+	      if (!context_getFlag (FLG_KEEP))
+		{
+		  /* delete temporary files */
+		  if (deletep)
+		    {
+		      (void) osd_unlink (infile);
+		    }
+		  
+		  (void) osd_unlink (outfile);
+		}
+	    }
+	}
+    }
+  else if (status == OSD_FILENOTFOUND)
+    {
+      llfatalerror 
+	(cstring_makeLiteral ("Cannot find LSL checker: check your command search path."));
+    }
+  else				/* must be (status == OSD_PATHTOOLONG) */
+    {
+      lclfatalbug ("invokeLSL: lsl plus directory from search path is too long");
+    }
+}
+
+/* callLSL ("MySet", "includes Set (CC for C, EE for E)");  */
+
+void
+readlsignatures (interfaceNode n)
+{
+  /* assume n->kind = usesKIND */
+  char *content;
+  
+  content = cstring_toCharsSafe (printTraitRefList2 (n->content.uses));
+  callLSL (cstring_toCharsSafe (g_currentSpec), content);
+}
diff --git a/src/lsymbol.c b/src/lsymbol.c
new file mode 100644
index 0000000..9b3654a
--- /dev/null
+++ b/src/lsymbol.c
@@ -0,0 +1,360 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lsymbol.c
+**
+** String manager
+**
+**	This module implements an abstraction for efficiently managing
+**      string comparisons.  It alloctes and manages a string context,
+**      which consists of three major data structures:
+**       - a StringEntry table
+**       - a character-string table
+**       - a hash table
+**
+**      A StringEntry table is made of of StringEntries. StringEntries
+**      are linked in hash-chains to support fast lookup. Every
+**      allocated StringEntry corresponds to a unique character-string
+**	in the character-string table. StringEntries can be referenced
+**      via Symbol values.
+**
+**	A character-string table is composed of character-strings. A
+**      character-string is a variable length byte array that is always
+**	null-terminated ('\0').
+**
+**	A hash table manages the start of each hash-list of StringEntries.
+**	StringEntries are entered into the hash-list by hashing on its
+**      character-string representation.
+**
+**	This module provides routines for retrieving a unique Symbol for a
+**	given character-string, and returning the character-string given its
+**	corresponding Symbol. An item is allocated in both tables whenever a
+**	new character-string is encountered, otherwise the Symbol for the
+**	character-string is found and returned.
+**
+**  AUTHORS:
+**
+**      Shota Aki
+**
+**  MODIFICATION HISTORY:
+**
+**	{0} Aki      at Digital -- 89.08.07 -- original
+**	{1} Aki      at Digital -- 89.11.13 -- context switchable
+**	{2} Aki      at Digital -- 89.11.28 -- removed use of TABLES interface
+**	{3} Aki      at Digital -- 89.11.29 -- moved to RC
+**	{4} Aki	     at Digital -- 90.04.10 -- support primary-context
+**	{5} McKeeman at Digital -- 90.05.08 -- C to Larch SL
+**	{6} Wild     at Digital	-- 91.06.26 -- Update copyright notice.
+**	{n} Who	     at Where   -- yy.mm.dd -- what
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+/*@+ignorequals@*/
+
+/*@constant int NULLFACTOR; @*/
+# define NULLFACTOR 1
+
+typedef Handle CharIndex;     
+
+typedef struct
+{
+  lsymbol HashNext;	
+  CharIndex i;			
+} StringEntry;
+
+static void AllocCharSpace (unsigned p_newSize) /*@modifies internalState@*/ ;
+static CharIndex AllocChar (/*@unique@*/ char *p_name) /*@modifies internalState@*/ ;
+static void AllocEntrySpace (unsigned p_newSize) /*@modifies internalState@*/ ;
+static lsymbol AllocEntry (char *p_name, long unsigned p_hashValue)
+   /*@modifies internalState@*/ ;
+
+static /*@only@*/ /*@null@*/ lsymbol *hashArray = NULL; 
+
+static long unsigned MaxChar;	
+static CharIndex FreeChar;	
+static /*@only@*/ /*@null@*/ char *CharString;
+
+static long unsigned MaxEntry;	
+static lsymbol FreeEntry;	
+static /*@only@*/ /*@null@*/ StringEntry *Entry;	
+
+lsymbol
+lsymbol_fromString (cstring s)
+{
+  if (cstring_isUndefined (s))
+    {
+      return lsymbol_undefined;
+    }
+  else
+    {
+      return (lsymbol_fromChars (cstring_toCharsSafe (s)));
+    }
+}
+
+lsymbol
+lsymbol_fromChars (/*@temp@*/ char *name)
+{
+  lsymbol ss;
+  long unsigned hashValue;	
+  unsigned h = 0;            
+  char *p = name;
+
+  while (*p != '\0')
+    { 
+      h = (h << 1) + (unsigned) (*p++); 
+    } 
+  
+  hashValue = h & HASHMASK;         
+
+  if (hashArray == NULL) /* evs - was MaxIndex == 0 */
+    {
+      /* nothing initialized */
+      ss = AllocEntry (name, hashValue);	
+    }
+  else
+    {
+      ss = hashArray[hashValue]; /* start of hash chain */
+
+      if (ss == lsymbol_undefined)
+	{
+	  /* hash not initialized */
+	  ss = AllocEntry (name, hashValue);
+	}
+      else
+	{
+	 /*
+          * Traverse hash-chain. Loop terminates when
+          * a match is found or end of chain is encountered.
+          */
+
+	  llassert (Entry != NULL);
+	  llassert (CharString != NULL);
+
+	  while (strcmp (&CharString[Entry[ss].i], name) != 0)
+	    {
+	      if (lsymbol_undefined == (ss = Entry[ss].HashNext))
+		{
+		  ss = AllocEntry (name, hashValue);
+		  break;
+		}
+	    }
+	}
+    }
+
+  return ss;
+}
+
+cstring lsymbol_toString (lsymbol ss)
+{
+  return (cstring_fromChars (lsymbol_toChars (ss)));
+}
+
+char *
+lsymbol_toCharsSafe (lsymbol ss)
+{
+  char *ret = lsymbol_toChars (ss);
+
+  if (ret == NULL) 
+    {
+      ret = mstring_create (0);
+    } 
+
+  return ret;
+}
+
+char *lsymbol_toChars (lsymbol ss)
+{
+  if (lsymbol_isDefined (ss))
+    {
+      if (ss >= FreeEntry)
+	{
+	  llcontbug (message ("lsymbol_toChars: invalid lsymbol: %d", ss));
+	  return NULL;
+	}
+      
+      llassert (Entry != NULL);
+      llassert (CharString != NULL);
+      
+      return &CharString[Entry[ss].i];
+    }
+  else
+    {
+      return NULL;
+    }
+}
+
+static void
+AllocCharSpace (unsigned newSize)
+{
+  llassert (newSize > MaxChar);
+  
+  CharString = (char *) drealloc ((void *) CharString, newSize * sizeof (*CharString));
+  MaxChar = newSize;
+/*@-compdef@*/
+} /*@=compdef@*/
+
+static CharIndex
+AllocChar (/*@unique@*/ char *name)
+{
+  int namelength;
+  CharIndex retVal;
+  long unsigned size;
+  CharIndex unused;
+
+  namelength = size_toInt (strlen (name));
+  unused = FreeChar;
+  size = MaxChar;
+
+  if ((unused + namelength + NULLFACTOR) > size)
+    {
+      if (size == 0)
+	size = INITCHARSTRING;
+      else
+	size = (unsigned) (DELTACHARSTRING * size);
+
+      AllocCharSpace (size);
+    }
+
+  llassert (CharString != NULL);
+
+  retVal = unused;		
+  strcpy (&CharString[unused], name);	
+  unused += namelength;
+  CharString[unused] = '\0';	
+  unused += 1;
+
+  FreeChar = unused;
+  return retVal;
+}
+
+static void
+AllocEntrySpace (unsigned newSize)
+{
+  llassert (newSize > MaxEntry);
+
+  /* Casts mess up checking here. */
+  /*@-mustfree@*/
+  Entry = (StringEntry *) drealloc ((void *) Entry, newSize * sizeof (*Entry));
+  /*@=mustfree@*/
+
+  if (MaxEntry == 0) MaxEntry = 1;
+
+  FreeEntry = MaxEntry;
+  MaxEntry = newSize;
+/*@-compdef@*/
+} /*@=compdef@*/
+
+static lsymbol AllocEntry (char *name, long unsigned hashValue)
+{
+  lsymbol retVal;
+  long unsigned size;
+
+  size = MaxEntry;
+
+  if ((retVal = FreeEntry) == size)
+    {
+      if (size == 0)
+	{
+	  size = INITSTRINGENTRY;
+	}
+      else
+	{
+	  size = (unsigned) (DELTASTRINGENTRY * size);
+	}
+
+      AllocEntrySpace (size);
+      retVal = FreeEntry;
+    }
+  
+  FreeEntry = retVal + 1;
+
+  llassert (hashArray != NULL);
+  llassert (Entry != NULL);
+  
+  Entry[retVal].HashNext = hashArray[hashValue];
+  hashArray[hashValue] = retVal;
+  Entry[retVal].i = AllocChar (name);
+  
+  return retVal;
+}
+
+void
+lsymbol_initMod (void)
+   /*@globals undef CharString, undef Entry; @*/
+{
+  int i;
+
+  if (hashArray != NULL)
+    {
+      sfree (hashArray); 
+    }
+  
+  hashArray = (lsymbol *) dmalloc (HASHSIZE * sizeof (*hashArray));
+
+  for (i = 0; i < HASHSIZE; i++)
+    {
+      hashArray[i] = lsymbol_undefined;
+    } 
+
+  MaxChar = 0;
+  MaxEntry = 0;
+
+  FreeChar = 0;
+  FreeEntry = 0; 
+
+  CharString = (char *) 0;
+  Entry = (StringEntry *) 0;
+/*@-compdef@*/ 
+} 
+/*@=compdef@*/ 
+
+void
+lsymbol_destroyMod (void)
+   /*@globals killed Entry, killed CharString, killed hashArray@*/
+{
+   sfree (Entry);      
+   sfree (CharString); 
+   sfree (hashArray); 
+}
+
+void
+lsymbol_printStats (void)
+{
+  /* only for debugging */
+  printf ("Number of lsymbols generated = %d\n", (int) FreeEntry);
+}
+
+/*
+** note lsymbol_setbool, etc. defined in abstract.c
+*/
+
+
+
+
+
+
+
+
diff --git a/src/lsymbolList.c b/src/lsymbolList.c
new file mode 100644
index 0000000..fee5c1a
--- /dev/null
+++ b/src/lsymbolList.c
@@ -0,0 +1,95 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lsymbolList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ lsymbolList
+lsymbolList_new ()
+{
+  lsymbolList s = (lsymbolList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+
+  s->nspace = lsymbolListBASESIZE;
+  s->elements = (lsymbol *) dmalloc (sizeof (*s->elements) * lsymbolListBASESIZE);
+
+  return (s);
+}
+
+static void
+lsymbolList_grow (lsymbolList s)
+{
+  int i;
+  lsymbol *newelements;
+
+  s->nspace += lsymbolListBASESIZE;
+  
+   newelements = (lsymbol *) dmalloc (sizeof (*newelements) * (s->nelements + s->nspace));
+
+  if (newelements == (lsymbol *) 0)
+    {
+      llfatalerror (cstring_makeLiteral ("lsymbolList_grow: out of memory!"));
+    }
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+void 
+lsymbolList_addh (lsymbolList s, lsymbol el)
+{
+  if (s->nspace <= 0)
+    lsymbolList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+}
+
+void
+lsymbolList_free (lsymbolList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+     /*      lsymbol_free (s->elements[i]); */
+    }
+
+  sfree (s->elements);	     
+  sfree (s);
+}
+
diff --git a/src/lsymbolSet.c b/src/lsymbolSet.c
new file mode 100644
index 0000000..d40a6fd
--- /dev/null
+++ b/src/lsymbolSet.c
@@ -0,0 +1,157 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** lsymbolSet.c
+**
+** based on set_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+ 
+lsymbolSet lsymbolSet_new ()
+{
+  lsymbolSet s = (lsymbolSet) dmalloc (sizeof (*s));
+
+  s->entries = 0;
+  s->nspace = lsymbolSetBASESIZE;
+  s->elements = (lsymbol *) dmalloc (sizeof (*s->elements) * lsymbolSetBASESIZE);
+
+  return (s);
+}
+
+static void
+lsymbolSet_grow (lsymbolSet s)
+{
+  int i;
+  lsymbol *newelements; 
+
+  llassert (lsymbolSet_isDefined (s));
+
+  s->nspace = lsymbolSetBASESIZE;
+  newelements = (lsymbol *) dmalloc (sizeof (*newelements) 
+				       * (s->entries + s->nspace));
+
+  if (newelements == (lsymbol *) 0)
+    {
+      llfatalerror (cstring_makeLiteral ("lsymbolSet_grow: out of memory!"));
+    }
+
+  for (i = 0; i < s->entries; i++)
+    {
+      newelements[i] = s->elements[i]; 
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+/*
+** Ensures: if *e \in *s
+**          then unchanged (*s) & result = false
+**          else *s' = insert (*s, *e) & result = true
+** Modifies: *s
+*/
+
+bool
+lsymbolSet_insert (lsymbolSet s, lsymbol el)
+{
+  llassert (lsymbolSet_isDefined (s));
+
+  if (lsymbolSet_member (s, el))
+    {
+      return FALSE;
+    }
+  else
+    {
+      if (s->nspace <= 0)
+	lsymbolSet_grow (s);
+      s->nspace--;
+      s->elements[s->entries] = el;
+      s->entries++;
+      return TRUE;
+    }
+}
+
+bool
+lsymbolSet_member (lsymbolSet s, lsymbol el)
+{
+  if (lsymbolSet_isDefined (s))
+    {
+      int i;
+      
+      for (i = 0; i < s->entries; i++)
+	{
+	  /* was: &el == &s->elements[i] ! */
+
+	  if (lsymbol_equal (el, s->elements[i]))
+	    {
+	      return TRUE;
+	    }
+	}
+    }
+
+  return FALSE;
+}
+
+/*@only@*/ cstring
+lsymbolSet_unparse (lsymbolSet s)
+{
+  if (lsymbolSet_isDefined (s))
+    {
+      int i;
+      cstring st = cstring_makeLiteral ("{");
+      
+      for (i = 0; i < s->entries; i++)
+	{
+	  if (i == 0)
+	    {
+	      st = message ("%q %s", st, 
+			    cstring_fromChars (lsymbol_toChars (s->elements[i])));
+	    }
+	  else
+	    st = message ("%q, %s", st, 
+			  cstring_fromChars (lsymbol_toChars (s->elements[i])));
+	}
+      
+      st = message ("%q }", st);
+      return st;
+    }
+  else
+    {
+      return (cstring_makeLiteral ("{ }"));
+    }
+}
+
+void
+lsymbolSet_free (/*@null@*/ lsymbolSet s)
+{
+  if (lsymbolSet_isDefined (s))
+    {
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
diff --git a/src/ltoken.c b/src/ltoken.c
new file mode 100644
index 0000000..8694393
--- /dev/null
+++ b/src/ltoken.c
@@ -0,0 +1,326 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** ltoken.c
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "llgrammar.h"
+# include "scanline.h"
+# include "lclscanline.h"
+
+/* 
+** Place to store the \keyword (\forall ...) tokens.  These tokens will	    
+** have to be modified when the extensionChar ("\") changes. 		    
+** set in LCLScanLineInit of lclscanline.c or in scanline.c 
+*/
+
+/*@-namechecks@*/
+ltoken ltoken_forall;
+ltoken ltoken_exists;
+ltoken ltoken_true;
+ltoken ltoken_false;
+ltoken ltoken_not;
+ltoken ltoken_and;
+ltoken ltoken_or;
+ltoken ltoken_implies;
+ltoken ltoken_eq;
+ltoken ltoken_neq;
+ltoken ltoken_equals;
+ltoken ltoken_eqsep;
+ltoken ltoken_select;
+ltoken ltoken_open;
+ltoken ltoken_sep;
+ltoken ltoken_close;
+ltoken ltoken_id;
+ltoken ltoken_arrow;
+ltoken ltoken_marker;
+ltoken ltoken_pre;
+ltoken ltoken_post;
+ltoken ltoken_comment;
+ltoken ltoken_any;
+ltoken ltoken_compose;
+ltoken ltoken_if;
+ltoken ltoken_result;
+ltoken ltoken_typename;
+ltoken ltoken_bool;
+ltoken ltoken_farrow;
+ltoken ltoken_lbracked;
+ltoken ltoken_rbracket;
+/*@=namechecks@*/
+
+static /*@notnull@*/ ltoken ltoken_new (void)
+{
+  ltoken tok = (ltoken) dmalloc (sizeof (*tok));
+
+  tok->code = NOTTOKEN;
+  tok->col = 0;
+  tok->line = 0;
+  tok->text = lsymbol_undefined;
+  tok->fname = lsymbol_undefined;
+  tok->rawText = lsymbol_undefined;
+  tok->defined = FALSE;
+  tok->hasSyn = FALSE;
+
+  return tok;
+}
+
+ltoken ltoken_create (unsigned int code, lsymbol text)
+{
+  ltoken tok = ltoken_new ();
+
+  tok->code = code;
+  tok->text = text;
+  
+  return tok;
+}
+
+ltoken ltoken_createRaw (unsigned int code, lsymbol text)
+{
+  ltoken tok = ltoken_new ();
+
+  tok->code = code;
+  tok->rawText = text;
+
+  return tok;
+}
+
+ltoken ltoken_createType (unsigned int code, SimpleIdCode idtype, lsymbol text)
+{
+  ltoken tok = ltoken_new ();
+
+  /* no...what's the real llassert (code == simpleId); */
+
+  tok->code = code;
+  tok->idtype = idtype;
+  tok->text = text;
+  
+  return tok;
+}
+
+ltoken ltoken_createFull (unsigned int code, lsymbol text, 
+			  cstring file, unsigned int line, 
+			  unsigned int col)
+{
+  ltoken tok = (ltoken) dmalloc (sizeof (*tok));
+  
+  tok->code = code;
+  tok->text = text;
+  tok->fname = lsymbol_fromString (file);
+  tok->line = line;
+  tok->col = col;
+  tok->rawText = lsymbol_undefined;
+  tok->defined = FALSE;
+  tok->hasSyn = FALSE;
+  
+  return tok;
+}
+
+static /*@only@*/ cstring LCLTokenCode_unparseCodeName (unsigned int t)
+{
+  switch (t)
+    {
+    case NOTTOKEN:         return cstring_makeLiteral ("*** NOTTOKEN ***");
+    case quantifierSym:    return cstring_makeLiteral ("QUANTIFIERSYM");      
+    case logicalOp:        return cstring_makeLiteral ("LOGICALOP");
+    case selectSym:        return cstring_makeLiteral ("SELECTSYM");    
+    case openSym:          return cstring_makeLiteral ("OPENSYM");
+    case preSym:           return cstring_makeLiteral ("\\pre");
+    case postSym:          return cstring_makeLiteral ("\\post");
+    case anySym:           return cstring_makeLiteral ("\\any");
+    case sepSym:           return cstring_makeLiteral ("SEPSYM");
+    case closeSym:         return cstring_makeLiteral ("CLOSESYM");
+    case simpleId:         return cstring_makeLiteral ("simpleId");
+    case LLT_TYPEDEF_NAME:     return cstring_makeLiteral ("TYPEDEF_NAME");
+    case mapSym:           return cstring_makeLiteral ("MAPSYM");
+    case markerSym:        return cstring_makeLiteral ("MARKERSYM");
+    case commentSym:       return cstring_makeLiteral ("COMMENTSYM");
+    case simpleOp:         return cstring_makeLiteral ("SIMPLEOP");
+    case LLT_COLON:            return cstring_makeLiteral ("COLON");
+    case LLT_COMMA:            return cstring_makeLiteral ("COMMA");
+    case LLT_EQUALS:           return cstring_makeLiteral ("LLT_EQUALS");
+    case LLT_LBRACE:           return cstring_makeLiteral ("LBRACE");
+    case LLT_LBRACKET:         return cstring_makeLiteral ("LBRACKET");
+    case LLT_LPAR:             return cstring_makeLiteral ("LPAR");
+    case LLT_QUOTE:            return cstring_makeLiteral ("QUOTE");
+    case LLT_RBRACE:           return cstring_makeLiteral ("RBRACE");
+    case LLT_RBRACKET:         return cstring_makeLiteral ("RBRACKET");
+    case LLT_RPAR:             return cstring_makeLiteral ("RPAR");
+    case LLT_SEMI:             return cstring_makeLiteral ("SEMI");
+    case LLT_VERTICALBAR:      return cstring_makeLiteral ("VERTICALBAR");
+    case eqOp:             return cstring_makeLiteral ("EQOP");
+    case LLT_MULOP:            return cstring_makeLiteral ("MULOP");
+    case LLT_WHITESPACE:       return cstring_makeLiteral ("WHITESPACE,");
+    case LEOFTOKEN:        return cstring_makeLiteral ("EOFTOKEN");
+    case LLT_EOL:         return cstring_makeLiteral ("LLT_EOL");
+    case LLT_CCHAR:            return cstring_makeLiteral ("CCHAR");
+    case LLT_CFLOAT:           return cstring_makeLiteral ("CFLOAT");
+    case LLT_CINTEGER:         return cstring_makeLiteral ("CINTEGER");
+    case LLT_LCSTRING:         return cstring_makeLiteral ("CSTRING");
+    case LLT_ALL:              return cstring_makeLiteral ("allTOKEN");
+    case LLT_ANYTHING:         return cstring_makeLiteral ("anythingTOKEN");
+    case LLT_BE:               return cstring_makeLiteral ("beTOKEN");
+    case LLT_CONSTANT:         return cstring_makeLiteral ("constantTOKEN");
+    case LLT_ELSE:         return cstring_makeLiteral ("elseTOKEN");
+    case LLT_ENSURES:      return cstring_makeLiteral ("ensuresTOKEN");
+    case LLT_IF:               return cstring_makeLiteral ("ifTOKEN");
+    case LLT_IMMUTABLE:        return cstring_makeLiteral ("immutableTOKEN");
+    case LLT_OBJ:              return cstring_makeLiteral ("objTOKEN");
+    case LLT_IMPORTS:          return cstring_makeLiteral ("importsTOKEN");
+    case LLT_CONSTRAINT:       return cstring_makeLiteral ("constraintTOKEN");
+    case LLT_LET:              return cstring_makeLiteral ("letTOKEN");
+    case LLT_MODIFIES:         return cstring_makeLiteral ("modifiesTOKEN");
+    case LLT_CLAIMS:           return cstring_makeLiteral ("claimsTOKEN");
+    case LLT_MUTABLE:          return cstring_makeLiteral ("mutableTOKEN");
+    case LLT_FRESH:            return cstring_makeLiteral ("freshTOKEN");
+    case LLT_NOTHING:          return cstring_makeLiteral ("nothingTOKEN");
+    case LLT_PRIVATE:          return cstring_makeLiteral ("privateTOKEN");
+    case LLT_SPEC:             return cstring_makeLiteral ("specTOKEN");
+    case LLT_REQUIRES:         return cstring_makeLiteral ("requiresTOKEN");
+    case LLT_BODY:             return cstring_makeLiteral ("bodyTOKEN");
+    case LLT_RESULT:           return cstring_makeLiteral ("resultTOKEN");
+    case LLT_SIZEOF:           return cstring_makeLiteral ("sizeofTOKEN");
+    case LLT_THEN:             return cstring_makeLiteral ("thenTOKEN");
+    case LLT_TYPE:             return cstring_makeLiteral ("typeTOKEN");
+    case LLT_TYPEDEF:          return cstring_makeLiteral ("typedefTOKEN");
+    case LLT_UNCHANGED:        return cstring_makeLiteral ("unchangedTOKEN");
+    case LLT_USES:             return cstring_makeLiteral ("usesTOKEN");
+    case LLT_CHAR:             return cstring_makeLiteral ("charTOKEN");
+    case LLT_CONST:            return cstring_makeLiteral ("constTOKEN");
+    case LLT_DOUBLE:           return cstring_makeLiteral ("doubleTOKEN");
+    case LLT_ENUM:         return cstring_makeLiteral ("enumTOKEN");
+    case LLT_FLOAT:            return cstring_makeLiteral ("floatTOKEN");
+    case LLT_INT:              return cstring_makeLiteral ("intTOKEN");
+    case LLT_LONG:             return cstring_makeLiteral ("longTOKEN");
+    case LLT_SHORT:            return cstring_makeLiteral ("shortTOKEN");
+    case LLT_STRUCT:           return cstring_makeLiteral ("structTOKEN");
+    case LLT_SIGNED:       return cstring_makeLiteral ("signedTOKEN");
+    case LLT_UNION:            return cstring_makeLiteral ("unionTOKEN");
+    case LLT_UNKNOWN:          return cstring_makeLiteral ("unknownTOKEN");
+    case LLT_UNSIGNED:         return cstring_makeLiteral ("unsignedTOKEN");
+    case LLT_VOID:             return cstring_makeLiteral ("voidTOKEN");
+    case LLT_VOLATILE:         return cstring_makeLiteral ("volatileTOKEN");
+    case LLT_TELIPSIS:         return cstring_makeLiteral ("elipsisTOKEN");
+    case LLT_ITER:             return cstring_makeLiteral ("iterTOKEN");
+    case LLT_YIELD:            return cstring_makeLiteral ("yieldTOKEN");
+    default:               return cstring_makeLiteral ("*** invalid token code ***"); 
+    } /* end switch */
+}
+
+cstring ltoken_unparseCodeName (ltoken tok)
+{
+  return LCLTokenCode_unparseCodeName (ltoken_getCode (tok));
+}
+
+/*@observer@*/ cstring ltoken_unparse (ltoken s)
+{
+  if (ltoken_isValid (s))
+    {
+      return (lsymbol_toString (s->text));
+    }
+  else
+    {
+      return cstring_undefined;
+    }
+}
+
+ltoken ltoken_copy (ltoken tok)
+{
+  if (ltoken_isValid (tok))
+    {
+      ltoken ret = (ltoken) dmalloc (sizeof (*ret));
+      
+      ret->code = tok->code;
+      ret->text = tok->text;
+      ret->fname = tok->fname;
+      ret->line = tok->line;
+      ret->col = tok->col;
+      ret->rawText = tok->rawText;
+      ret->defined = tok->defined;
+      ret->hasSyn = tok->hasSyn;
+      ret->idtype = tok->idtype;
+      ret->intfield = tok->intfield;
+      
+      return ret;
+    }
+  else
+    {
+      return ltoken_undefined;
+    }
+}
+
+lsymbol ltoken_getRawText (ltoken tok)
+{
+  if (ltoken_isValid (tok))
+    {
+      lsymbol ret = tok->rawText;
+
+      if (lsymbol_isUndefined (ret))
+	{
+	  ret = tok->text;
+	}
+      
+      return ret;
+    }
+  else
+    {
+      return lsymbol_undefined;
+    }
+}
+
+/*@only@*/ cstring ltoken_unparseLoc (ltoken t)
+{
+  if (ltoken_getCode (t) != NOTTOKEN)
+    {
+      if (context_getFlag (FLG_SHOWCOL))
+	{
+	  return (message ("%s:%u,%u", ltoken_fileName (t), 
+			   ltoken_getLine (t), ltoken_getCol (t)));
+	}
+      else
+	{
+	  return (message ("%s:%u", ltoken_fileName (t), ltoken_getLine (t)));
+	}
+    }
+  else
+    {
+      return cstring_makeLiteral ("*** Not Token ***"); 
+    }
+}
+
+void ltoken_markOwned (/*@owned@*/ ltoken tok)
+{
+    sfreeEventually (tok);
+}
+
+void ltoken_free (/*@only@*/ ltoken tok)
+{
+  sfree (tok); 
+}
+
+bool ltoken_isSingleChar (char c)
+{
+  return (LCLScanCharClass (c) == SINGLECHAR);
+}
diff --git a/src/ltokenList.c b/src/ltokenList.c
new file mode 100644
index 0000000..8e764ef
--- /dev/null
+++ b/src/ltokenList.c
@@ -0,0 +1,231 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** ltokenList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@notnull@*/ /*@only@*/ ltokenList
+ltokenList_new ()
+{
+  ltokenList s = (ltokenList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = ltokenListBASESIZE;
+  s->elements = (ltoken *) 
+    dmalloc (sizeof (*s->elements) * ltokenListBASESIZE);
+  s->current = 0;
+
+  return (s);
+}
+
+/*@notnull@*/ /*@only@*/ ltokenList
+ltokenList_singleton (ltoken l)
+{
+  ltokenList s = (ltokenList) dmalloc (sizeof (*s));
+
+  s->nelements = 1;
+  s->nspace = ltokenListBASESIZE - 1;
+  s->elements = (ltoken *) dmalloc (sizeof (*s->elements) * ltokenListBASESIZE);
+  s->elements[0] = l;
+  s->current = 0;
+
+  return (s);
+}
+
+static void
+ltokenList_grow (/*@notnull@*/ ltokenList s)
+{
+  int i;
+  ltoken *newelements;
+
+  s->nspace += ltokenListBASESIZE;
+
+  newelements = (ltoken *) dmalloc (sizeof (*newelements)
+				    * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] =  s->elements[i]; 
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+ltokenList 
+ltokenList_push (/*@returned@*/ ltokenList s, ltoken el)
+{
+  ltokenList_addh (s, el);
+  return s;
+}
+
+void 
+ltokenList_addh (ltokenList s, ltoken el)
+{
+  llassert (ltokenList_isDefined (s));
+
+  if (s->nspace <= 0)
+    ltokenList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+}
+
+void 
+ltokenList_reset (ltokenList s)
+{
+  if (ltokenList_isDefined (s))
+    {
+      s->current = 0;
+    }
+}
+
+bool
+ltokenList_isFinished (ltokenList s)
+{
+  return (ltokenList_isUndefined(s) || (s->current == s->nelements));
+}
+
+void 
+ltokenList_advance (ltokenList s)
+{
+  if (ltokenList_isDefined (s))
+    {
+      s->current++;
+      llassert (s->current <= s->nelements);
+    }
+}
+
+ltoken 
+ltokenList_head (ltokenList s)
+{
+  llassert (ltokenList_isDefined (s) && s->nelements > 0);
+  return (s->elements[0]);
+}
+
+bool 
+ltokenList_equal (ltokenList s1, ltokenList s2)
+{
+  if (ltokenList_isUndefined (s1))
+    {
+      return (ltokenList_isEmpty (s2));
+    }
+  else
+    {
+      if (ltokenList_isUndefined (s2))
+	{
+	  return ltokenList_isEmpty (s1);
+	}
+      else
+	{
+	  int i;
+	  int size = s1->nelements;
+	  
+	  if (s2->nelements != size)
+	    return FALSE;
+	  
+	  for (i = 0; i < size; i++)
+	    {
+	      if (!ltoken_similar (s1->elements[i], s2->elements[i]))
+		return FALSE;
+	    }
+	  return TRUE;
+	}
+    }
+}
+
+/*@only@*/ ltokenList 
+ltokenList_copy (ltokenList s)
+{
+  ltokenList r = ltokenList_new ();
+
+  ltokenList_elements (s, x)
+  {
+    ltokenList_addh (r, ltoken_copy (x));
+  } end_ltokenList_elements;
+
+  return r;
+}
+
+void
+ltokenList_removeCurrent (ltokenList s)
+{
+  int i;
+  llassert (ltokenList_isDefined (s) && s->current >= 0 && s->current < s->nelements);
+
+  for (i = s->current; i < s->nelements - 1; i++)
+    {
+      s->elements[i] = s->elements[i+1];
+    }
+
+  s->nelements--;
+  s->nspace++;
+}
+
+ltoken 
+ltokenList_current (ltokenList s)
+{
+  llassert (ltokenList_isDefined (s) && s->current >= 0 && s->current < s->nelements);
+  return (s->elements[s->current]);
+}
+
+/*@only@*/ cstring
+ltokenList_unparse (ltokenList s)
+{
+  int i;
+  cstring st = cstring_undefined;
+
+  if (ltokenList_isDefined (s))
+    {
+      for (i = 0; i < s->nelements; i++)
+	{
+	  if (i == 0)
+	    {
+	      st = cstring_copy (ltoken_unparse (s->elements[i]));
+	    }
+	  else
+	    st = message ("%q, %s", st, ltoken_unparse (s->elements[i]));
+	}
+    }
+
+  return st;
+}
+
+void
+ltokenList_free (ltokenList s)
+{
+  if (ltokenList_isDefined (s))
+    {
+      sfree (s->elements);
+      sfree (s);
+    }
+}
diff --git a/src/macrocache.c b/src/macrocache.c
new file mode 100644
index 0000000..2db8944
--- /dev/null
+++ b/src/macrocache.c
@@ -0,0 +1,408 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** macrocache.c
+**
+** rep Invariant:
+**     no two fileloc's may be equal
+**
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "llmain.h"
+
+/*@constant int MCEBASESIZE;@*/
+# define MCEBASESIZE 8
+
+/*@constant int DNE;@*/
+# define DNE -1
+
+/*
+** Temporary file used for processing macros.
+*/
+
+static /*@null@*/ FILE *s_macFile = NULL;
+
+/*
+** mcDisable is set to TRUE when a macro is being processed, so
+** its contents are not added to the macrocache again, creating
+** a nasty infinite loop.
+*/
+
+static bool mcDisable = TRUE;
+static void macrocache_grow (macrocache p_s);
+static int macrocache_exists (macrocache p_s, fileloc p_fl);
+static void macrocache_processMacro (macrocache p_m, int p_i);
+
+static /*@only@*/ mce
+  mce_create (/*@only@*/ fileloc fl, /*@only@*/ cstring def, bool comment)
+{
+  mce m = (mce) dmalloc (sizeof (*m));
+  m->fl = fl;
+  m->def = def; /*< had a copy here! check this carefully */
+  m->defined = FALSE;
+  m->scomment = comment;
+  return m;
+}
+
+static void mce_free (/*@only@*/ mce m)
+{
+  fileloc_free (m->fl);
+  cstring_free (m->def);
+  sfree (m);
+}
+
+/*@only@*/ macrocache
+macrocache_create (void)
+{
+  macrocache s = (macrocache) dmalloc (sizeof (*s));
+
+  s->entries = 0;
+  s->nspace = MCEBASESIZE;
+  s->contents = (mce *) dmalloc (sizeof (*s->contents) * MCEBASESIZE);
+
+  mcDisable = FALSE;
+
+  return (s);
+}
+
+void
+macrocache_free (macrocache s)
+{
+  int i;
+
+  llassert (s_macFile == NULL);
+
+  for (i = 0; i < s->entries; i++)
+    {
+      mce_free (s->contents[i]);
+    }
+
+  sfree (s->contents);
+  sfree (s);
+}
+
+static void
+macrocache_grow (macrocache s)
+{
+  int i;
+  o_mce *oldcontents = s->contents;
+
+  s->nspace = MCEBASESIZE;
+  s->contents = (mce *) dmalloc (sizeof (*s->contents) * (s->entries + s->nspace)); 
+
+  for (i = 0; i < s->entries; i++)
+    {
+      s->contents[i] = oldcontents[i];
+    }
+
+  sfree (oldcontents);
+}
+
+static void
+macrocache_addGenEntry (macrocache s, /*@only@*/ fileloc fl,
+			/*@only@*/ cstring def, bool sup)
+{
+  int i;
+
+  if (mcDisable)
+    {
+      fileloc_free (fl);
+      cstring_free (def);
+      return;
+    }
+
+  if ((i = macrocache_exists (s, fl)) != DNE)
+    {
+      if (cstring_equal (def, s->contents[i]->def))
+	{
+	  fileloc_free (fl);
+	  cstring_free (def);
+
+	  return;
+	}
+      else
+	{
+	  /*
+	  ** macro definition contained macro that is expanded
+	  ** replace with def
+	  **
+	  ** how do we know which is better??
+	  */
+	  
+	  cstring_free (s->contents[i]->def);
+	  s->contents[i]->def = def;
+
+	  fileloc_free (fl);
+	  return;
+	}
+    }
+
+  if (s->nspace <= 0) {
+    macrocache_grow (s);
+  }
+
+  s->nspace--;
+  s->contents[s->entries] = mce_create (fl, def, sup);
+  s->entries++;
+}
+
+void
+macrocache_addEntry (macrocache s, /*@only@*/ fileloc fl, /*@only@*/ cstring def)
+{
+  macrocache_addGenEntry (s, fl, def, FALSE);
+}
+
+
+void
+macrocache_addComment (macrocache s, /*@only@*/ fileloc fl, /*@only@*/ cstring def)
+{
+  macrocache_addGenEntry (s, fl, def, TRUE);
+}
+
+static int
+macrocache_exists (macrocache s, fileloc fl)
+{
+  int i;
+
+  for (i = 0; i < s->entries; i++)
+    {
+      if (fileloc_equal (s->contents[i]->fl, fl))
+	return (i);
+    }
+
+  return (DNE);
+}
+
+/*@only@*/ cstring
+macrocache_unparse (macrocache m)
+{
+  cstring s = cstring_undefined;
+  int i;
+
+  for (i = 0; i < m->entries; i++)
+    {
+      fileloc fl = m->contents[i]->fl;
+      cstring def = m->contents[i]->def;
+      bool defined = m->contents[i]->defined;
+      
+      s = message ("%q%q: %s [%s]\n", s, fileloc_unparse (fl), def, 
+		   bool_unparse (defined));
+    }
+  
+  return (s);
+}
+
+/*
+** needs to call lex by hand...yuk!
+**
+** modifies gc fileloc!
+*/
+
+/*
+** there's gotta be a better way of doing this!
+*/
+
+static void pushString (/*@only@*/ cstring s)
+{
+  static fileId mtid = fileId_invalid;
+  long floc;
+
+  if (s_macFile == NULL)
+    {
+      cstring fname;
+      mtid = fileTable_addMacrosFile (context_fileTable ());
+      
+      fname = fileName (mtid);
+      s_macFile = fopen (cstring_toCharsSafe (fname), "wb+");
+      
+      if (s_macFile == NULL)
+	{
+	  llcontbug (message ("Cannot open tmp file %s needed to process macro: %s", 
+			      fname, s));
+	  cstring_free (s);
+	  return;
+    	}
+    }
+
+  llassert (s_macFile != NULL);
+
+  /* SunOS, others? don't define SEEK_CUR and SEEK_SET */
+# ifndef SEEK_CUR 
+# define SEEK_CUR 1
+# endif
+  check (fseek (s_macFile, 0, SEEK_CUR) == 0);
+
+  floc = ftell (s_macFile);
+
+  if (cstring_length (s) > 0) {
+    check (fputs (cstring_toCharsSafe (s), s_macFile) != EOF);
+  }
+
+  check (fputc ('\n', s_macFile) == (int) '\n');
+
+# ifndef SEEK_SET 
+# define SEEK_SET 0
+# endif
+  check (fseek (s_macFile, floc, SEEK_SET) == 0);
+
+  yyin = s_macFile;
+  (void) yyrestart (yyin);
+  cstring_free (s);
+}
+
+static void
+macrocache_processMacro (macrocache m, int i)
+{
+  fileloc fl = m->contents[i]->fl;
+   
+  m->contents[i]->defined = TRUE;
+
+  if (!fileId_equal (currentFile (), fileloc_fileId (fl)))
+    {
+      g_currentloc = fileloc_update (g_currentloc, fl);
+      context_enterMacroFile ();
+    }
+  else
+    {
+      setLine (fileloc_lineno (fl));
+    }
+
+  beginLine ();
+
+  DPRINTF (("Process macro: %s", m->contents[i]->def));
+
+  if (m->contents[i]->scomment)
+    {
+      pushString (message ("%s%s%s", 
+			   cstring_fromChars (BEFORE_COMMENT_MARKER),
+			   m->contents[i]->def,
+			   cstring_fromChars (AFTER_COMMENT_MARKER)));
+      (void) yyparse ();
+    }
+  else
+    {
+      bool insup = context_inSuppressRegion ();
+
+      pushString (message ("%s %s", 
+			   cstring_makeLiteralTemp (PPMRCODE),
+			   m->contents[i]->def));
+      (void) yyparse ();
+
+      if (context_inSuppressRegion () && !insup)
+	{
+	  llerrorlit (FLG_SYNTAX, "Macro ends in ignore region");
+	}
+    }
+  
+  incLine ();  
+  context_exitMacroCache ();
+}
+
+extern void macrocache_processUndefinedElements (macrocache m)
+{
+  fileloc lastfl = fileloc_undefined;
+  int i;
+ 
+  mcDisable = TRUE;
+
+  DPRINTF (("Processing undefined elements"));
+
+  if (!context_getFlag (FLG_PARTIAL))
+    {
+      for (i = 0; i < m->entries; i++) 
+	{
+	  if (m->contents[i]->defined)
+	    {
+	      ;
+	    }
+	  else 
+	    { 
+	      fileloc fl = m->contents[i]->fl; 
+	      
+	      if (fileloc_isDefined (lastfl) && fileloc_sameFile (fl, lastfl)) 
+		{
+		  ;
+		}
+	      else
+		{
+		  if (context_getFlag (FLG_SHOWSCAN))
+		    {
+		      if (!fileloc_isLib (fl))
+			{
+			  lldiagmsg (message ("< checking macros %s >", fileloc_filename (fl)));
+			}
+		    }
+		  
+		  lastfl = fl;
+		  cleanupMessages ();
+		}
+	      
+	      macrocache_processMacro (m, i);	
+	    }
+	}
+    }
+
+  mcDisable = FALSE;
+}
+
+extern /*@observer@*/ fileloc macrocache_processFileElements (macrocache m, cstring base)
+{
+  fileloc lastfl = fileloc_undefined;
+  int i;
+ 
+  mcDisable = TRUE;
+
+  for (i = 0; i < m->entries; i++) 
+    {
+      if (m->contents[i]->defined)
+	{
+	  ;
+	}
+      else 
+        { 
+	  fileloc fl = m->contents[i]->fl;  /* should be dependent! */
+	  cstring fb = fileloc_getBase (fl);
+
+	  if (cstring_equal (fb, base))
+	    {
+	      lastfl = fl;
+	      macrocache_processMacro (m, i);	
+	    }
+	}
+    }
+
+  mcDisable = FALSE;
+  return lastfl;
+}
+
+void macrocache_finalize (void)
+{
+  if (s_macFile != NULL)
+    {
+      check (fclose (s_macFile) == 0);
+      s_macFile = NULL;
+    }
+}
diff --git a/src/mapping.c b/src/mapping.c
new file mode 100644
index 0000000..65589c3
--- /dev/null
+++ b/src/mapping.c
@@ -0,0 +1,124 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** mapping.c
+**
+** Module for lsymbol maps.
+**
+**  AUTHOR:
+**	Yang Meng Tan,
+**         Massachusetts Institute of Technology
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@constant int MAPPING_SIZE; @*/
+# define MAPPING_SIZE 127
+
+/* use lower-order bits by masking out higher order bits */
+
+/*@-macrofcndecl@*/
+# define MMASH(key)  ((unsigned int) ((key) & MAPPING_SIZE))
+/*@=macrofcndecl@*/
+
+static void mappair_free (/*@null@*/ /*@only@*/ mappair *p)
+{
+  if (p == NULL) 
+    {
+      return;
+    }
+  else
+    {
+      mappair_free (p->next);
+      sfree (p);
+    }
+}
+
+void mapping_free (/*@only@*/ mapping *m)
+{
+  int i;
+
+  for (i = 0; i <= MAPPING_SIZE; i++)
+    {
+      mappair_free (m->buckets[i]);
+    }
+  
+  sfree (m->buckets);
+  sfree (m);
+}
+
+/*@only@*/ mapping *
+mapping_create (void)
+{
+  int i;
+  mapping *t = (mapping *) dmalloc (sizeof (*t));
+
+  t->buckets = (mappair **) dmalloc ((MAPPING_SIZE + 1) * sizeof (*t->buckets));
+  t->count = 0;
+
+  for (i = 0; i <= MAPPING_SIZE; i++)
+    {
+      t->buckets[i] = (mappair *) 0;
+    }
+
+  return t;
+}
+
+lsymbol
+mapping_find (mapping * t, lsymbol domain)
+{
+  mappair *entry;
+  unsigned int key;
+
+  key = MMASH (domain);
+  entry = t->buckets[key];
+  for (; entry != NULL; entry = entry->next)
+    {
+      if (entry->domain == domain)
+	return entry->range;
+    }
+
+  return lsymbol_undefined;
+}
+
+void
+mapping_bind (mapping *t, lsymbol domain, lsymbol range)
+{
+  /* add the binding (domain -> range) to t */
+  /* can assume that the binding is a new one in m, so no need
+     to check. */
+  mappair *entry;
+  mappair *newentry = (mappair *) dmalloc (sizeof (*newentry));
+  unsigned int key;
+
+  key = MMASH (domain);
+  /*@-deparrays@*/ entry = t->buckets[key]; /*@=deparrays@*/
+  newentry->domain = domain;
+  newentry->range = range;
+  newentry->next = entry;
+
+  t->buckets[key] = newentry; 
+  t->count++;
+}
diff --git a/src/message.c b/src/message.c
new file mode 100644
index 0000000..53fe670
--- /dev/null
+++ b/src/message.c
@@ -0,0 +1,277 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** message.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+ 
+/* patch for linux? solaris? */
+
+static char strbuf[64];
+static int modcode;
+
+typedef enum
+{
+  XINVALID, 
+  XCHAR, XSTRING, XSTRINGFREE, XTSTRINGFREE, XINT, XFLOAT, XBOOL, XUENTRY,
+  XPERCENT, XCTYPE, XPLURAL, XREPREFIX, XFILELOC
+} ccode;
+
+/* char *s, anytype v */
+/*@notfunction@*/
+# define GETPRINTF(s,v) (sprintf (strbuf, s, v), mstring_copy (strbuf))
+
+/*
+** returns control code indicated by *c, and
+** advances *c to next character.
+*/
+
+static ccode
+  identify_control (char **s)
+{
+  char c;
+
+  modcode = 0;
+
+  c = **s;
+  if (c == '\0')
+    {
+      return (XINVALID);
+    }
+
+  if (c >= '0' && c <= '9')
+    {
+      modcode = getInt (s);
+    }
+
+  c = **s;
+
+  (*s)++;
+
+ /*
+ ** handle single-char codes
+ */
+
+  switch (c)
+    {
+    case '%':
+      return (XPERCENT);
+    case 'h':
+    case 'c':
+      return (XCHAR);
+    case 's':
+      return (XSTRING);
+    case 'q':
+      return (XSTRINGFREE);
+    case 'x':
+      return (XSTRINGFREE);
+    case 'd':
+      return (XINT);
+    case 'u':
+      return (XINT); /* unsigned */
+    case 'w':
+      return (XINT); /* unsigned long */
+    case 'f':
+      return (XFLOAT);
+    case 'b':
+      return (XBOOL);
+    case 't':
+      return (XCTYPE);
+    case 'l':
+      return (XFILELOC);
+    case 'p':
+      return (XPLURAL);
+    case 'r':
+      return (XREPREFIX);
+    default:
+      llcontbug (message ("Message: invalid code: %h (%s)", c, 
+			  cstring_fromChars (*s)));
+      return (XINVALID);
+    }
+}
+
+/*
+** message
+**
+** returns a cstring containing the message, as formated by s.
+**
+** the format codes are similar to printf:
+**
+**         %s    cstring (don't free after print)
+**         %q    cstring (free after print)
+**         %d    int
+**         %f    float
+**         %b    bool     (uses bool_unparse)
+**         %u    uentry
+**         %l    fileloc
+**         %t    ctype
+*/
+
+
+# if USEVARARGS
+cstring
+message (fmt, va_alist)
+     char *fmt;
+     va_dcl
+# else
+/*@messagelike@*/ /*@only@*/ cstring
+message (/*@temp@*/ char *fmt, ...)
+# endif
+{
+  char c;
+  int lastint = 0;
+  char *ret = mstring_createEmpty ();
+  char *ofmt = fmt;
+  va_list pvar;
+
+# if USEVARARGS
+  va_start (pvar);
+# else
+  va_start (pvar, fmt);
+# endif  
+
+  while ((c = *fmt++) != '\0')
+    {
+      if (c == '%')
+	{
+	  /*@-loopswitchbreak@*/
+
+	  switch (identify_control (&fmt))
+	    {
+	    case XPERCENT:
+	      {
+		ret = mstring_concatFree1 (ret, "%");
+		break;
+	      }
+	    case XCHAR:
+	      {
+		/*
+                ** some systems don't handle char va_arg correctly, so it must be
+		** passed as an int here
+		*/
+
+		char lc = (char) va_arg (pvar, int);
+
+		ret = mstring_append (ret, lc);
+		break;
+	      }
+	    case XSTRING:
+	      {
+		cstring s = va_arg (pvar, cstring);
+		
+		if (modcode != 0)
+		  {
+		    ret = mstring_concatFree (ret, cstring_toCharsSafe 
+					  (cstring_fill (s, modcode)));
+		  }
+		else
+		  {
+		    if (cstring_isDefined (s))
+		      {
+			ret = mstring_concatFree1 (ret, cstring_toCharsSafe (s));
+		      }
+		  }
+	      }
+	      break;
+	    case XSTRINGFREE:
+	    case XTSTRINGFREE:
+	      {
+		cstring s = va_arg (pvar, cstring);
+		
+		if (modcode != 0)
+		  {
+		    ret = mstring_concatFree (ret, cstring_toCharsSafe 
+					      (cstring_fill (s, modcode)));
+		  }
+		else
+		  {
+		    if (cstring_isDefined (s))
+		      {
+			ret = mstring_concatFree 
+			  (ret, cstring_toCharsSafe (s));
+		      }
+		  }
+	      }
+	      break;
+	    case XREPREFIX:
+	      lastint = va_arg (pvar, int);
+
+	      if (lastint != 0)
+		{
+		  ret = mstring_concatFree1 (ret, "re");
+		}
+	      break;
+	    case XPLURAL:
+	      if (lastint != 1)
+		{
+		  ret = mstring_concatFree1 (ret, "s");
+		}
+	      break;
+	    case XINT:
+	      lastint = va_arg (pvar, int);
+	      ret = mstring_concatFree (ret, GETPRINTF ("%d", lastint));
+	      break;
+	    case XFLOAT:
+	      ret = mstring_concatFree (ret, GETPRINTF ("%e", va_arg (pvar, double)));
+	      break;
+	    case XBOOL:
+	      ret = mstring_concatFree1 (ret, cstring_toCharsSafe 
+				    (bool_unparse (va_arg (pvar, bool))));
+	      break;
+	    case XUENTRY:
+	      ret = mstring_concatFree (ret, cstring_toCharsSafe 
+				   (uentry_unparse (va_arg (pvar, uentry))));
+	      break;
+	    case XCTYPE:
+	      /* cannot free ctype_unparse */
+	      ret = mstring_concatFree1 (ret, cstring_toCharsSafe 
+				   (ctype_unparse (va_arg (pvar, ctype)))); 
+	      break;
+	    case XFILELOC:
+	      ret = mstring_concatFree (ret, cstring_toCharsSafe 
+				   (fileloc_unparse (va_arg (pvar, fileloc))));
+	      break;
+	    case XINVALID:
+	    default:
+	      llcontbug (cstring_makeLiteral ("message: bad control flag"));
+	      fprintf (stdout, "\tFormat string: %s", ofmt);
+	    }
+	  /*@=loopswitchbreak@*/
+	}
+      else
+	{
+	  ret = mstring_append (ret, c);
+	}
+    }
+
+  va_end (pvar);
+
+  /*
+  ** cstring_fromChars returns the same storage (exposed)
+  */
+
+  /*@-mustfree@*/ return (cstring_fromChars (ret)); /*@=mustfree@*/
+}
diff --git a/src/messageLog.c b/src/messageLog.c
new file mode 100644
index 0000000..56470da
--- /dev/null
+++ b/src/messageLog.c
@@ -0,0 +1,214 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** messageLog.c (from slist_template.c)
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+/*@only@*/ messageLog
+messageLog_new ()
+{
+  messageLog s = (messageLog) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = messageLogBASESIZE;
+  s->elements = (msgentry *) dmalloc (sizeof (*s->elements) * messageLogBASESIZE);
+
+  return (s);
+}
+
+static /*@only@*/ msgentry
+msgentry_create (fileloc loc, cstring mess)
+{
+  msgentry msg = (msgentry) dmalloc (sizeof (*msg));
+
+  msg->loc = fileloc_copy (loc);
+  msg->msg = cstring_copy (mess);
+
+  return msg;
+}
+
+static void msgentry_free (/*@only@*/ msgentry msg)
+{
+  fileloc_free (msg->loc);
+  cstring_free (msg->msg);
+  sfree (msg);
+}
+
+/*
+** returns TRUE if m1 < m2
+*/
+
+static bool
+msgentry_lessthan (msgentry m1, msgentry m2)
+{
+  return (fileloc_lessthan (m1->loc, m2->loc)
+	  || (fileloc_equal (m1->loc, m2->loc) 
+	      && (cstring_lessthan (m1->msg, m2->msg))));
+}
+
+static bool
+msgentry_equal (msgentry m1, msgentry m2)
+{
+  return (fileloc_equal (m1->loc, m2->loc) &&
+	  cstring_equal (m1->msg, m2->msg));
+}
+
+/*
+** returns highest index of element less than msg
+*/
+
+static int
+messageLog_index (messageLog s, msgentry msg)
+{
+  int high;
+  int low  = 0;
+
+  llassert (messageLog_isDefined (s));
+
+  high = s->nelements - 1;
+
+  for (low = high; low >= 0; low--)
+    {
+      if (msgentry_lessthan (s->elements[low], msg))
+	{
+	  return low;
+	}
+    }
+
+  return -1;
+# if 0      
+  while (low < high)
+    {
+      int mid = (low + high + 1) / 2;
+
+      if (msgentry_lessthan (s->elements[mid], msg)) /* mid < msg */
+	{
+	  if (high == mid) break;
+	  high = mid;
+	}
+      else
+	{
+	  if (low == mid) break;
+	  low = mid;
+	}
+    }
+
+  return low - 1;
+# endif
+}
+
+static void
+messageLog_grow (/*@notnull@*/ messageLog s)
+{
+  int i;
+  msgentry *newelements;
+  
+  s->nspace += messageLogBASESIZE; 
+  newelements = (msgentry *) dmalloc (sizeof (*newelements) * (s->nelements + s->nspace));
+  
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+  
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+bool messageLog_add (messageLog s, fileloc fl, cstring mess)
+{
+  msgentry msg = msgentry_create (fl, mess);
+  int ind, i;
+
+  llassert (messageLog_isDefined (s));
+
+  ind = messageLog_index (s, msg);
+
+  if (ind + 1 < s->nelements)
+    {
+      if (msgentry_equal (msg, s->elements[ind + 1]))
+	{
+	  msgentry_free (msg);
+	  return FALSE;
+	}
+    }
+
+  if (s->nspace <= 0) {
+    messageLog_grow (s);
+  }
+
+  for (i = s->nelements; i > ind + 1; i--)
+    {
+      s->elements[i] = s->elements[i-1];
+    }
+  
+  s->elements[ind + 1] = msg;
+  s->nspace--;
+  s->nelements++;
+
+  return TRUE;
+}
+
+/*@only@*/ cstring
+messageLog_unparse (messageLog s)
+{
+   int i;
+   cstring st = cstring_makeLiteral ("[");
+
+   if (messageLog_isDefined (s))
+     {
+       for (i = 0; i < s->nelements; i++)
+	 {
+	   if (i == 0)
+	     {
+	       st = message ("%q %q", st, fileloc_unparseDirect (s->elements[i]->loc));
+	     }
+	   else
+	     st = message ("%q, %q", st, fileloc_unparseDirect (s->elements[i]->loc));
+	 }
+     }
+
+   st = message ("%q ]", st);
+   return st;
+}
+
+void
+messageLog_free (messageLog s)
+{
+  if (s != NULL)
+    {
+      int i;
+
+      for (i = 0; i < s->nelements; i++)
+	{
+	  msgentry_free (s->elements[i]);
+	}
+      
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
diff --git a/src/multiVal.c b/src/multiVal.c
new file mode 100644
index 0000000..cf054be
--- /dev/null
+++ b/src/multiVal.c
@@ -0,0 +1,306 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** multiVal.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+/*@only@*/ multiVal multiVal_unknown ()
+{
+  return multiVal_undefined;
+}
+
+static /*@special@*/ /*@notnull@*/ multiVal multiVal_create (mvkind kind)
+   /*@defines result->kind@*/
+{
+  multiVal mv = (multiVal) dmalloc (sizeof (*mv));
+
+  mv->kind = kind;
+  return mv;
+}
+
+/*@only@*/ multiVal multiVal_makeInt (long x)
+{
+  multiVal mv = multiVal_create (MVLONG);
+
+  mv->value.ival = x;
+  return mv;
+}
+
+/*@only@*/ multiVal multiVal_makeChar (char x)
+{
+  multiVal mv = multiVal_create (MVCHAR);
+    mv->value.cval = x;
+    return mv;
+}
+
+/*@only@*/ multiVal multiVal_makeDouble (double x)
+{
+  multiVal mv = multiVal_create (MVDOUBLE);
+
+    mv->value.fval = x;
+    return mv;
+}
+
+/*@only@*/ multiVal multiVal_makeString (/*@only@*/ cstring s)
+{
+  multiVal mv = multiVal_create (MVSTRING);
+
+  mv->value.sval = s;
+  return mv;
+}
+
+
+/*@only@*/ multiVal multiVal_copy (multiVal m)
+{
+  multiVal r;
+
+  if (multiVal_isUndefined (m))
+    {
+      return multiVal_undefined;
+    }
+
+  r = multiVal_create (m->kind);
+      
+  switch (m->kind)
+    {
+    case MVLONG:
+      r->value.ival = m->value.ival;
+      break;
+    case MVCHAR:
+      r->value.cval = m->value.cval;
+      break;
+    case MVDOUBLE:
+      r->value.fval = m->value.fval;
+      break;
+    case MVSTRING:
+      r->value.sval = cstring_copy (m->value.sval);
+      break;
+    }
+  
+  return r;
+}
+
+multiVal multiVal_invert (multiVal m)
+{
+  if (multiVal_isUndefined (m))
+    {
+      return multiVal_undefined;
+    }
+      
+  switch (m->kind)
+    {
+    case MVLONG:
+      return multiVal_makeInt (-1 * m->value.ival);
+    case MVCHAR:
+      BADBRANCHCONT;
+      return multiVal_undefined;
+    case MVDOUBLE:
+      return multiVal_makeDouble (-1.0 * m->value.fval);
+    case MVSTRING:
+      BADBRANCHCONT;
+      return multiVal_undefined;
+    }
+
+  BADEXIT;
+}
+
+long multiVal_forceInt (multiVal m)
+{
+  llassert (multiVal_isInt (m));
+
+  return m->value.ival;
+}
+
+char multiVal_forceChar (multiVal m)
+{
+  llassert (multiVal_isChar (m));
+  
+  return m->value.cval;
+}
+
+double multiVal_forceDouble (multiVal m)
+{
+  llassert (multiVal_isDouble (m));
+
+  return m->value.fval;
+}
+
+/*@dependent@*/ /*@observer@*/ cstring multiVal_forceString (multiVal m)
+{
+  llassert (multiVal_isString (m));
+
+  return m->value.sval;
+}
+
+bool multiVal_isInt (multiVal m)
+{
+  return (multiVal_isDefined (m) && m->kind == MVLONG);
+}
+
+bool multiVal_isChar (multiVal m)
+{
+  return (multiVal_isDefined (m) && m->kind == MVCHAR);
+}
+
+bool multiVal_isDouble (multiVal m)
+{
+  return (multiVal_isDefined (m) && m->kind == MVDOUBLE);
+}
+
+bool multiVal_isString (multiVal m)
+{
+  return (multiVal_isDefined (m) && m->kind == MVSTRING);
+}
+
+/*@only@*/ cstring multiVal_unparse (multiVal m)
+{
+  if (multiVal_isDefined (m))
+    {
+      switch (m->kind)
+	{
+	case MVLONG:
+	  return message ("%d", (int)m->value.ival);
+	case MVCHAR:
+	  	  return message ("'%h'", m->value.cval);
+	case MVDOUBLE:
+	  return message ("%f", (float)m->value.fval);
+	case MVSTRING:
+	  return message ("%s", m->value.sval);
+	}
+      BADEXIT;
+    }
+  else
+    {
+      return (cstring_makeLiteral ("?"));
+    }
+}
+
+/*@only@*/ cstring multiVal_dump (multiVal m)
+{
+  if (multiVal_isDefined (m))
+    {
+      switch (m->kind)
+	{
+	case MVLONG:
+	  return (message ("i%d", (int)m->value.ival));
+	case MVCHAR:
+	  return (message ("c%d", (int)m->value.cval));
+	case MVDOUBLE:
+	  return (message ("d%f", (float)m->value.fval));
+	case MVSTRING:
+	  return (message ("s%s", m->value.sval));
+	}
+      BADEXIT;
+    }
+  else
+    {
+      return (cstring_undefined);
+    }
+}
+
+/*@only@*/ multiVal multiVal_undump (char **s)
+{
+  char tchar = **s;
+
+  switch (tchar)
+    {
+    case 'i':
+      (*s)++;
+      return multiVal_makeInt (getInt (s));
+    case 'c':
+      (*s)++;
+      return multiVal_makeChar ((char) getInt (s));
+    case 'd':
+      (*s)++;
+      return multiVal_makeDouble (getDouble (s));
+    case 's':
+      {
+	cstring st = cstring_undefined;
+
+	(*s)++;
+	while (**s != '#')
+	  {
+	    st = cstring_appendChar (st, **s);
+	    (*s)++;
+	  }
+
+	return multiVal_makeString (st);
+      }
+    case '@':
+    case '#':
+      return multiVal_unknown ();
+    BADDEFAULT;
+    }
+  
+  BADEXIT;
+}
+
+int multiVal_compare (multiVal m1, multiVal m2)
+{
+  if (multiVal_isUndefined (m1))
+    {
+      if (multiVal_isUndefined (m2)) 
+	{
+	  return 0;
+	}
+
+      else return -1;
+    }
+  if (multiVal_isUndefined (m2))
+    {
+      return -1;
+    }
+
+  COMPARERETURN (generic_compare (m1->kind, m2->kind));
+
+  switch (m1->kind)
+    {
+    case MVLONG:   return (generic_compare (m1->value.ival, m2->value.ival));
+    case MVCHAR:   return (generic_compare (m1->value.cval, m2->value.cval));
+    case MVDOUBLE: return (generic_compare (m1->value.fval, m2->value.fval));
+    case MVSTRING: return (cstring_compare (m1->value.sval, m2->value.sval));
+    }
+
+  BADEXIT;
+}
+
+void multiVal_free (/*@only@*/ multiVal m)
+{
+  if (multiVal_isDefined (m))
+    {
+      if (m->kind == MVSTRING)
+	{
+	  cstring_free (m->value.sval);
+	}
+      
+      sfree (m);
+    }
+}
+
+
+
+
diff --git a/src/nameChecks.c b/src/nameChecks.c
new file mode 100644
index 0000000..df19ab0
--- /dev/null
+++ b/src/nameChecks.c
@@ -0,0 +1,1462 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** nameChecks.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "nameChecks.h"
+
+static bool checkCzechName (uentry p_ue, flagcode p_czechflag, bool p_report)
+  /*@modifies p_ue, g_msgstream@*/ ;
+
+static bool checkSlovakName (uentry p_ue, flagcode p_slovakflag, bool p_report)
+  /*@modifies p_ue, g_msgstream@*/ ;
+
+static cstring czechPrefix (cstring name)
+{
+  return (cstring_beforeChar (name, '_'));
+}
+
+static cstring slovakPrefix (cstring name)
+{
+  int i = 0;
+
+  cstring_chars (name, c)
+    {
+      if (isupper ((unsigned char) c))
+	{
+	  return (cstring_prefix (name, i));
+	}
+      i++;
+    } end_cstring_chars;
+
+  return cstring_undefined;
+}
+
+static flagcode excludeCodes [] = 
+ {
+   FLG_MACROVARPREFIXEXCLUDE,
+   FLG_TAGPREFIXEXCLUDE,
+   FLG_ENUMPREFIXEXCLUDE,
+   FLG_FILESTATICPREFIXEXCLUDE,
+   FLG_GLOBPREFIXEXCLUDE,
+   FLG_TYPEPREFIXEXCLUDE,
+   FLG_EXTERNALPREFIXEXCLUDE,
+   FLG_UNCHECKEDMACROPREFIXEXCLUDE,
+   FLG_LOCALPREFIXEXCLUDE,
+   INVALID_FLAG
+   } ;
+
+/*@iter excludeFlagCodes (yield flagcode code);@*/
+# define excludeFlagCodes(m_c) \
+  { int m_i = 0; while (flagcode_isValid (excludeCodes[m_i])) \
+      { flagcode m_c = excludeCodes[m_i]; m_i++; 
+
+# define end_excludeFlagCodes }}
+
+static bool matchPrefixChar (int nc, int pc)
+{
+  if (nc == pc)
+    {
+      return TRUE;
+    }
+  else
+    {
+      switch (pc)
+	{
+	case PFX_UPPERCASE: 
+	  return isupper (nc);
+	case PFX_LOWERCASE:
+	  return islower (nc);
+	case PFX_ANY:
+	  return TRUE;
+	case PFX_DIGIT:
+	  return isdigit (nc);
+	case PFX_NOTUPPER:
+	  return !isupper (nc);
+	case PFX_NOTLOWER:
+	  return !islower (nc);
+	case PFX_ANYLETTER:
+	  return isalpha (nc);
+	case PFX_ANYLETTERDIGIT: 
+	  return (isdigit (nc) || isalpha (nc));
+	default: return FALSE;
+	}
+    }
+
+  BADEXIT;
+}
+
+static bool matchPrefix (cstring name, cstring prefix)
+{
+  if (cstring_isUndefined (name)
+      || cstring_isUndefined (prefix))
+    {
+      return TRUE;
+    }
+  else
+    {
+      int namelen = cstring_length (name);
+      int last = (int) '\0';
+      int n = 1;
+
+      cstring_chars (prefix, pc)
+	{
+	  int nc;
+
+	  if (pc == '*')
+	    {
+	      n++;
+
+	      
+	      while (n <= namelen)
+		{
+		  nc = (int) cstring_getChar (name, n);
+
+		  if (!matchPrefixChar (nc, last))
+		    {
+		      return FALSE;
+		    }
+		  n++;
+		}
+
+	      return TRUE;
+	    }
+	  else
+	    {
+	      if (n > namelen)
+		{
+		  if ((cstring_length (prefix) >= n + 1)
+		      && cstring_getChar (prefix, n + 1) == '*')
+		    {
+		      return TRUE;
+		    }
+		  else
+		    {
+		      return FALSE;
+		    }
+		}
+	      
+	      nc = (int) cstring_getChar (name, n);
+	      
+	      if (!matchPrefixChar (nc, (int) pc))
+		{
+		  return FALSE;
+		}
+	    }
+	
+	  last = (int) pc;
+	  n++;
+	} end_cstring_chars;
+
+      return TRUE;
+    }
+}
+
+static flagcode
+namespaceExcluded (flagcode code) /*@*/ 
+{
+  switch (code)
+    {
+    case FLG_MACROVARPREFIXEXCLUDE:
+      return (FLG_MACROVARPREFIX);
+    case FLG_TAGPREFIXEXCLUDE:
+      return (FLG_TAGPREFIX);
+    case FLG_ENUMPREFIXEXCLUDE:
+      return (FLG_ENUMPREFIX);
+    case FLG_FILESTATICPREFIXEXCLUDE:
+      return (FLG_FILESTATICPREFIX);
+    case FLG_GLOBPREFIXEXCLUDE:
+      return (FLG_GLOBPREFIX);
+    case FLG_TYPEPREFIXEXCLUDE:
+      return (FLG_TYPEPREFIX);
+    case FLG_EXTERNALPREFIXEXCLUDE:
+      return (FLG_EXTERNALPREFIX);
+    case FLG_UNCHECKEDMACROPREFIXEXCLUDE:
+      return (FLG_UNCHECKEDMACROPREFIX);
+    case FLG_LOCALPREFIXEXCLUDE:
+      return (FLG_LOCALPREFIX);
+    case FLG_ITERPREFIXEXCLUDE:
+      return (FLG_ITERPREFIX);
+    case FLG_CONSTPREFIXEXCLUDE:
+      return (FLG_CONSTPREFIX);
+    BADDEFAULT;
+    }
+}
+
+static /*@observer@*/ cstring
+namespaceName (flagcode flag) /*@*/
+{
+  switch (flag)
+    {
+    case FLG_MACROVARPREFIX: 
+      return cstring_makeLiteralTemp ("macro variable");
+    case FLG_TAGPREFIX:  
+      return cstring_makeLiteralTemp ("tag");
+    case FLG_ENUMPREFIX:  
+      return cstring_makeLiteralTemp ("enum member");
+    case FLG_TYPEPREFIX:     
+      return cstring_makeLiteralTemp ("user-defined type");
+    case FLG_FILESTATICPREFIX:
+      return cstring_makeLiteralTemp ("file static");
+    case FLG_GLOBPREFIX: 
+      return cstring_makeLiteralTemp ("global variable");
+    case FLG_EXTERNALPREFIX: 
+      return cstring_makeLiteralTemp ("external");
+    case FLG_LOCALPREFIX: 
+      return cstring_makeLiteralTemp ("local variable");
+    case FLG_CONSTPREFIX: 
+      return cstring_makeLiteralTemp ("constant");
+    case FLG_ITERPREFIX: 
+      return cstring_makeLiteralTemp ("iter");
+    case FLG_UNCHECKEDMACROPREFIX: 
+      return cstring_makeLiteralTemp ("unchecked macro");
+    BADDEFAULT;
+    }
+}
+
+void 
+checkPrefix (uentry ue)
+{
+  cstring name = cstring_undefined;
+  flagcode flag;
+
+  if (uentry_isExpandedMacro (ue))
+    {
+      flag = FLG_UNCHECKEDMACROPREFIX;
+    }
+  else if (uentry_isAnyTag (ue))
+    {
+      flag = FLG_TAGPREFIX;
+    }
+  else if (uentry_isEnumConstant (ue))
+    {
+      flag = FLG_ENUMPREFIX;
+    }
+  else if (uentry_isDatatype (ue))
+    {
+      flag = FLG_TYPEPREFIX;
+    }
+  else if (uentry_isFileStatic (ue))
+    {
+      flag = FLG_FILESTATICPREFIX;
+    }
+  else if (uentry_isGlobal (ue))
+    {
+      flag = FLG_GLOBPREFIX;
+    }
+  else if (uentry_isVariable (ue))
+    {
+      if (uentry_isRefParam (ue))
+	{
+	  return; /* already checked param */
+	}
+
+      if (context_inMacro ())
+	{
+	  if (uentry_isAnyParam (ue))
+	    {
+	      if (uentry_isYield (ue))
+		{
+		  flag = FLG_MACROVARPREFIX;
+		}
+	      else
+		{
+		  flag = FLG_LOCALPREFIX;
+		}
+	    }
+	  else
+	    {
+	      flag = FLG_MACROVARPREFIX;
+	    }
+	}
+      else
+	{
+	  flag = FLG_LOCALPREFIX;
+	}
+    }
+  else if (uentry_isConstant (ue))
+    {
+      flag = FLG_CONSTPREFIX;
+    }
+  else if (uentry_isIter (ue))
+    {
+      flag = FLG_ITERPREFIX;
+    }
+  else if (uentry_isExported (ue))
+    {
+      flag = FLG_EXTERNALPREFIX;
+    }
+  else
+    {
+      llcontbug (message ("What is it: %q", uentry_unparseFull (ue)));
+      return;
+    }
+
+  if (flag == FLG_TYPEPREFIX || flag == FLG_GLOBPREFIX
+      || flag == FLG_ENUMPREFIX || flag == FLG_CONSTPREFIX)
+    {
+      if (flag == FLG_ENUMPREFIX)
+	{
+	  if (!context_getFlag (flag))
+	    {
+	      flag = FLG_CONSTPREFIX;
+	    }
+	}
+
+      if (!context_getFlag (flag))
+	{
+	  flag = FLG_EXTERNALPREFIX;
+	}
+    }
+
+  if (context_getFlag (flag))
+    {
+      name = uentry_getName (ue);
+      
+      
+      if (!matchPrefix (name, context_getString (flag)))
+	{
+	  if (optgenerror
+	      (flag,
+	       message ("%s %s name is not consistent with %s "
+			"namespace prefix \"%s\"",
+			uentry_ekindName (ue),
+			name,
+			namespaceName (flag),
+			context_getString (flag)),
+	       uentry_whereLast (ue)))
+	    {
+	      uentry_setHasNameError (ue);
+	    }
+	}
+    }  
+
+  excludeFlagCodes (code)
+    {
+      bool check = FALSE;
+
+      if (context_getFlag (code))
+	{
+	  /*@-loopswitchbreak@*/
+	  switch (code)
+	    {
+	    case FLG_MACROVARPREFIXEXCLUDE:
+	      check = (flag != FLG_MACROVARPREFIX);
+	      break;
+	    case FLG_TAGPREFIXEXCLUDE:
+	      check = (flag != FLG_TAGPREFIX);
+	      break;
+	    case FLG_ENUMPREFIXEXCLUDE:
+	      check = (flag != FLG_ENUMPREFIX);
+	      break;
+	    case FLG_FILESTATICPREFIXEXCLUDE:
+	      check = (flag != FLG_FILESTATICPREFIX);
+	      break;
+	    case FLG_GLOBPREFIXEXCLUDE:
+	      check = (flag != FLG_GLOBPREFIX);
+	      break;
+	    case FLG_TYPEPREFIXEXCLUDE:
+	      check = (flag != FLG_TYPEPREFIX);
+	      break;
+	    case FLG_EXTERNALPREFIXEXCLUDE:
+	      check = (flag != FLG_EXTERNALPREFIX
+		       && flag != FLG_GLOBPREFIX
+		       && flag != FLG_TYPEPREFIX
+		       && flag != FLG_UNCHECKEDMACROPREFIX);
+	      break;
+	    case FLG_UNCHECKEDMACROPREFIXEXCLUDE:
+	      check = (flag != FLG_UNCHECKEDMACROPREFIX);
+	      break;
+	    case FLG_LOCALPREFIXEXCLUDE:
+	      check = (flag != FLG_LOCALPREFIX);
+	      break;
+	    case FLG_CONSTPREFIXEXCLUDE:
+	      check = (flag != FLG_CONSTPREFIX);
+	      break;
+	    case FLG_ITERPREFIXEXCLUDE:
+	      check = (flag != FLG_ITERPREFIX);
+	      break;
+	    BADDEFAULT;
+	    }
+	  /*@=loopswitchbreak@*/
+
+	  if (check)
+	    {
+	      flagcode rcode = namespaceExcluded (code);
+	      cstring pstring = context_getString (rcode);
+
+	      if (cstring_isDefined (pstring))
+		{
+		  if (cstring_isUndefined (name))
+		    {
+		      name = uentry_getName (ue);
+		    }
+		  
+		  if (matchPrefix (name, context_getString (rcode)))
+		    {
+		      if (optgenerror
+			  (code,
+			   message
+			   ("%s %s name is not a %s (it is a %s), "
+			    "but matches the %s "
+			    "namespace prefix \"%s\"",
+			    uentry_ekindName (ue),
+			    name,
+			    namespaceName (rcode),
+			    namespaceName (flag),
+			    namespaceName (rcode),
+			    context_getString (rcode)),
+			   uentry_whereLast (ue)))
+			{
+			  uentry_setHasNameError (ue);
+			}
+		    }
+		}
+	    }
+	} 
+    } end_excludeFlagCodes ;
+
+  cstring_free (name);
+}
+
+static void
+checkNationalName (uentry ue)
+{
+  flagcode czechflag;
+  flagcode slovakflag;
+  flagcode czechoslovakflag;
+  bool gcf, gsf, gcsf;
+
+  
+  if (uentry_isFunction (ue)
+      || uentry_isIter (ue)
+      || uentry_isEndIter (ue))
+    {
+      czechflag = FLG_CZECHFUNCTIONS;
+      slovakflag = FLG_SLOVAKFUNCTIONS;
+      czechoslovakflag = FLG_CZECHOSLOVAKFUNCTIONS;
+    }
+  else if (uentry_isExpandedMacro (ue))
+    {
+      czechflag = FLG_CZECHMACROS;
+      slovakflag = FLG_SLOVAKMACROS;
+      czechoslovakflag = FLG_CZECHOSLOVAKMACROS;
+    }
+  else if (uentry_isVariable (ue))
+    {
+      if (uentry_isGlobal (ue) && context_getFlag (FLG_GLOBPREFIX))
+	{
+	  /* prefix checks supercede national naming checks */
+	  return;
+	}
+
+      czechflag = FLG_CZECHVARS;
+      slovakflag = FLG_SLOVAKVARS;
+      czechoslovakflag = FLG_CZECHOSLOVAKVARS;
+    }
+  else if (uentry_isConstant (ue))
+    {
+      if (uentry_isGlobal (ue) && context_getFlag (FLG_CONSTPREFIX))
+	{
+	  /* prefix checks supercede national naming checks */
+	  return;
+	}
+
+      czechflag = FLG_CZECHCONSTANTS;
+      slovakflag = FLG_SLOVAKCONSTANTS;
+      czechoslovakflag = FLG_CZECHOSLOVAKCONSTANTS;
+    }
+  else
+    {
+      if (uentry_isAnyTag (ue) || uentry_isEnumConstant (ue))
+	{
+	  return; /* no errors for tags */
+	}
+      
+      llassert (uentry_isDatatype (ue));
+
+      czechflag = FLG_CZECHTYPES;
+      slovakflag = FLG_SLOVAKTYPES;
+      czechoslovakflag = FLG_CZECHOSLOVAKTYPES;
+    }
+
+  gcf = context_getFlag (czechflag);
+  gsf = context_getFlag (slovakflag);
+  gcsf = context_getFlag (czechoslovakflag);
+
+  if (gcf || (uentry_isFunction (ue) 
+	      && context_getFlag (FLG_ACCESSCZECH)))
+    {
+            (void) checkCzechName (ue, czechflag, gcf);
+    }
+
+  if (gsf || (uentry_isFunction (ue) 
+	      && context_getFlag (FLG_ACCESSSLOVAK)))
+    {
+      (void) checkSlovakName (ue, slovakflag, gsf);
+    }
+
+  if (gcsf)
+    {
+      if (uentry_isDatatype (ue))
+	{
+	  /* May not have either _'s or uppercase letter */
+	  cstring name = uentry_rawName (ue);
+	  int charno = 1;
+
+	  cstring_chars (name, c)
+	    {
+	      if (isupper ((unsigned char) c))
+		{
+		  if (optgenerror
+		      (FLG_CZECHOSLOVAKTYPES,
+		       message
+		       ("%s %q name violates Czechoslovak naming convention.  "
+			"Czechoslovak datatype names should not use uppercase "
+			"letters.",
+			uentry_ekindName (ue),
+			uentry_getName (ue)),
+		       uentry_whereLast (ue)))
+		    {
+		      uentry_setHasNameError (ue);
+		    }
+		  break;
+		}
+
+	      if (c == '_' && charno != 2 && charno != 3)
+		{
+		  if (optgenerror
+		      (FLG_CZECHOSLOVAKTYPES,
+		       message ("%s %q name violates Czechoslovak naming "
+				"convention.  Czechoslovak datatype names "
+				"should not use the _ charater.",
+				uentry_ekindName (ue),
+				uentry_getName (ue)),
+		       uentry_whereLast (ue)))
+		    {
+		      uentry_setHasNameError (ue);
+		    }
+		  break;
+		}
+	      
+	      charno++;
+	    } end_cstring_chars;
+	}
+      else
+	{
+	  bool okay = checkCzechName (ue, czechflag, FALSE);
+	  
+	  /* still need to call, to set access */
+	  okay |= checkSlovakName (ue, slovakflag, FALSE);
+	  
+	  if (!okay)
+	    {
+	      if (optgenerror
+		  (czechoslovakflag,
+		   message ("%s %q name is not consistent with Czechoslovak "
+			    "naming convention.",
+			    uentry_ekindName (ue),
+			    uentry_getName (ue)),
+		   uentry_whereLast (ue)))
+		{
+		  uentry_setHasNameError (ue);
+		}
+	    }
+	}
+    }
+}
+
+static bool checkCzechName (uentry ue, flagcode czechflag, bool report)
+{
+  if (uentry_isDatatype (ue))
+    {
+      /*
+      ** Czech datatypes may not have _'s, except if there are 1 or 2 characters
+      ** before the only _.
+      */
+
+      cstring name = uentry_rawName (ue);
+      int charno = 1;
+      
+      cstring_chars (name, c)
+	{
+	  if (c == '_' && charno != 2 && charno != 3)
+	    {
+	      if (report)
+		{
+		  if (optgenerror
+		      (FLG_CZECHTYPES,
+		       message 
+		       ("%s %q name violates Czech naming convention.  "
+			"Czech datatype names should not use the _ charater.",
+			uentry_ekindName (ue),
+			uentry_getName (ue)),
+		       uentry_whereLast (ue)))
+		    {
+		      uentry_setHasNameError (ue);
+		    }
+		}
+
+	      return FALSE;
+	    }
+	  
+	  charno++;
+	} end_cstring_chars;
+    }
+  else
+    {
+      typeIdSet acc = context_fileAccessTypes ();
+      cstring pfx = czechPrefix (uentry_rawName (ue));
+
+      if (cstring_isEmpty (pfx))
+	{
+	  if (uentry_isVariable (ue) || uentry_isConstant (ue))
+	    {
+	      ctype ct = uentry_getType (ue);
+	      
+	      if (ctype_isAbstract (ct)
+		  && context_hasAccess (ctype_typeId (ct)))
+		{
+		  if (report)
+		    {
+		      if (optgenerror
+			  (czechflag,
+			   message ("%s %q name is not consistent with Czech "
+				    "naming convention.  The name should "
+				    "begin with %s_",
+				    uentry_ekindName (ue),
+				    uentry_getName (ue),
+				    ctype_unparse (ct)),
+			   uentry_whereLast (ue)))
+			{
+			  uentry_setHasNameError (ue);
+			}
+		    }
+
+		  cstring_free (pfx);
+		  return FALSE;
+		}
+	    }
+	  else if (uentry_isFunction (ue) || uentry_isIter (ue))
+	    {
+	      if (typeIdSet_isEmpty (acc))
+		{
+		  ; /* okay - should not be czech name */
+		}
+	      else
+		{
+		  if (report)
+		    {
+		      if (optgenerror
+			  (czechflag,
+			   message ("%s %q name is not consistent with Czech "
+				    "naming convention.  Accessible types: %q",
+				    uentry_ekindName (ue),
+				    uentry_getName (ue),
+				    typeIdSet_unparse (acc)),
+			   uentry_whereLast (ue)))
+			{
+			  uentry_setHasNameError (ue);
+			}
+		    }
+
+		  cstring_free (pfx);
+		  return FALSE;
+		}
+	    }
+	  else
+	    {
+	      ;
+	    }
+	}
+      else
+	{
+	  if (usymtab_existsTypeEither (pfx))
+	    {
+	      ctype ct = usymtab_lookupAbstractType (pfx);
+	      typeId tid;
+	      
+	      if (ctype_isUA (ct))
+		{
+		  tid = ctype_typeId (ct);
+		  
+		  if (ctype_isUser (ct) || context_hasAccess (tid))
+		    {
+		      ;
+		    }
+		  else
+		    {
+		      if (context_getFlag (FLG_ACCESSCZECH)
+			  || context_getFlag (FLG_ACCESSCZECHOSLOVAK))
+			{
+			  if (!uentry_isVar (ue))
+			    {
+			      uentry_addAccessType (ue, tid);
+			    }
+			}
+		      else
+			{
+			  if (report)
+			    {
+			      if (llgenhinterror
+				  (czechflag,
+				   message 
+				   ("%s %q name violates Czech naming "
+				    "convention. Czech prefix %s names "
+				    "an abstract type that is "
+				    "not accessible.",
+				    uentry_ekindName (ue),
+				    uentry_getName (ue),
+				    pfx),
+				   cstring_makeLiteral 
+				   ("Use +accessczech to allow access to "
+				    "type  in functions "
+				    "named _."), 
+				   uentry_whereLast (ue)))
+				{
+				  uentry_setHasNameError (ue);
+				}
+			    }
+			  
+			  cstring_free (pfx);
+			  return FALSE;
+			}
+		    }
+		}
+	      else if (ctype_isBool (ct))
+		{
+		  if (context_canAccessBool ())
+		    {
+		      ;
+		    }
+		  else
+		    {
+		      if (context_getFlag (FLG_ACCESSCZECH)
+			  || context_getFlag (FLG_ACCESSCZECHOSLOVAK))
+			{
+			  if (!uentry_isVar (ue))
+			    {
+			      tid = usymtab_getTypeId (context_getBoolName ());
+			      uentry_addAccessType (ue, tid);
+			    }
+			}
+		      else
+			{
+			  if (report)
+			    {
+			      if (llgenhinterror
+				  (czechflag,
+				   message
+				   ("%s %q name violates Czech naming "
+				    "convention. Type bool is not accessible.",
+				    uentry_ekindName (ue),
+				    uentry_getName (ue)),
+				   cstring_makeLiteral 
+				   ("Use +accessczech to allow access to "
+				    "type  in functions named _."), 
+				   uentry_whereLast (ue)))
+				{
+				  uentry_setHasNameError (ue);
+				}
+			    }
+			  
+			  cstring_free (pfx);
+			  return FALSE;
+			}
+		    }
+		}
+	      else
+		{
+		  ;
+		}
+	    }
+	  else
+	    {
+	      if (cstring_equalLit (pfx, "int")
+		  || cstring_equalLit (pfx, "char")
+		  || cstring_equalLit (pfx, "short")
+		  || cstring_equalLit (pfx, "long")
+		  || cstring_equalLit (pfx, "unsigned")
+		  || cstring_equalLit (pfx, "signed")
+		  || cstring_equalLit (pfx, "float")
+		  || cstring_equalLit (pfx, "double"))
+		{
+		  ; /* built-in types */
+		}
+	      else
+		{
+		  /* no accessible types, could match module name */
+		  
+		  if (cstring_equal (pfx, context_moduleName ()))
+		    {
+		      ;
+		    }
+		  else
+		    {
+		      if (report)
+			{
+			  if (optgenerror
+			      (czechflag,
+			       message 
+			       ("%s %q name violates Czech naming convention.  "
+				"Czech prefix %s is not the name of a type.",
+				uentry_ekindName (ue),
+				uentry_getName (ue),
+				pfx),
+			       uentry_whereLast (ue)))
+			    {
+			      uentry_setHasNameError (ue);
+			    }
+			}
+
+		      cstring_free (pfx);		      
+		      return FALSE;
+		    }
+		}
+	    }
+	}
+      cstring_free (pfx);
+    }
+
+  return TRUE;
+}
+
+static bool checkSlovakName (uentry ue, flagcode slovakflag, bool report)
+{
+  if (uentry_isDatatype (ue))
+    {
+      /*
+      ** Slovak datatypes may not have uppercase letters.
+      */
+
+      if (context_getFlag (FLG_SLOVAK))
+	{
+	  cstring name = uentry_rawName (ue);
+
+	  cstring_chars (name, c)
+	    {
+	      if (isupper ((unsigned char) c))
+		{
+		  if (report)
+		    {
+		      if (optgenerror
+			  (FLG_SLOVAKTYPES,
+			   message 
+			   ("%s %q name violates Slovak naming convention.  "
+			    "Slovak datatype names should not use uppercase "
+			    "letters.",
+			    uentry_ekindName (ue),
+			    uentry_getName (ue)),
+			   uentry_whereLast (ue)))
+			{
+			  uentry_setHasNameError (ue);
+			}
+		    }
+		  return FALSE;
+		}
+	    } end_cstring_chars;
+	}
+    }
+  else
+    {
+      typeIdSet acc = context_fileAccessTypes ();
+      cstring pfx = slovakPrefix (uentry_rawName (ue));
+      
+      if (cstring_isEmpty (pfx))
+	{
+	  if (typeIdSet_isEmpty (acc))
+	    {
+	      ; /* okay - should not be slovak name */
+	    }
+	  else
+	    {
+	      if (uentry_isFunction (ue))
+		{
+		  if (report)
+		    {
+		      if (optgenerror
+			  (slovakflag,
+			   message ("%s %q name is not consistent with Slovak "
+				    "naming convention.  Accessible types: %q",
+				    uentry_ekindName (ue),
+				    uentry_getName (ue),
+				    typeIdSet_unparse (acc)),
+			   uentry_whereLast (ue)))
+			{
+			  uentry_setHasNameError (ue);
+			}
+		    }
+		  
+		  cstring_free (pfx);
+		  return FALSE;
+		}
+	      else
+		{
+		  ctype ct = uentry_getType (ue);
+		  
+		  if (ctype_isUA (ct))
+		    {
+		      if (report)
+			{
+			  if (optgenerror
+			      (slovakflag,
+			       message ("%s %q name is not consistent with "
+					"Slovak naming convention.  The "
+					"name should begin with %s followed "
+					"by an uppercase letter.",
+					uentry_ekindName (ue),
+					uentry_getName (ue),
+					ctype_unparse (ct)),
+			       uentry_whereLast (ue)))
+			    {
+			      uentry_setHasNameError (ue);
+			    }	
+			}
+		      
+		      cstring_free (pfx);
+		      return FALSE;
+		    }
+		}
+	    }
+	}
+      else
+	{
+	  if (usymtab_existsTypeEither (pfx))
+	    {
+	      ctype ct = usymtab_lookupAbstractType (pfx);
+	      typeId tid;
+	      
+	      if (ctype_isUA (ct))
+		{
+		  tid = ctype_typeId (ct);
+		  
+		  if (ctype_isUser (ct) || context_hasAccess (tid))
+		    {
+		      ;
+		    }
+		  else
+		    {
+		      if (context_getFlag (FLG_ACCESSSLOVAK)
+			  || context_getFlag (FLG_ACCESSCZECHOSLOVAK))
+			{
+			  if (!uentry_isVar (ue))
+			    {
+			      uentry_addAccessType (ue, tid);
+			    }
+			}
+		      else
+			{
+			  if (report)
+			    {
+			      if (llgenhinterror
+				  (slovakflag,
+				   message 
+				   ("%s %q name violates Slovak naming "
+				    "convention. Slovak prefix %s names "
+				    "an abstract type that is not accessible.",
+				    uentry_ekindName (ue),
+				    uentry_getName (ue),
+				    pfx),
+				   cstring_makeLiteral 
+				   ("Use +accessslovak to allow access to "
+				    "type  in functions named _."), 
+				   uentry_whereLast (ue)))
+				{
+				  uentry_setHasNameError (ue);
+				}
+			    }
+			  
+			  cstring_free (pfx);
+			  return FALSE;
+			}
+		    }
+		}
+	      else if (ctype_isBool (ct))
+		{
+		  if (context_canAccessBool ())
+		    {
+		      ;
+		    }
+		  else
+		    {
+		      if (context_getFlag (FLG_ACCESSSLOVAK)
+			  || context_getFlag (FLG_ACCESSCZECHOSLOVAK))
+			{
+			  if (!uentry_isVar (ue))
+			    {
+			      tid = usymtab_getTypeId (context_getBoolName ());
+			      uentry_addAccessType (ue, tid);
+			    }
+			}
+		      else
+			{
+			  if (report)
+			    {
+			      if (llgenhinterror
+				  (slovakflag,
+				   message
+				   ("%s %q name violates Slovak naming convention.  "
+				    "Type bool is not accessible.",
+				    uentry_ekindName (ue),
+				    uentry_getName (ue)),
+				   cstring_makeLiteral
+				   ("Use +accessslovak to allow access to "
+				    "type  in functions named _."),
+				   uentry_whereLast (ue)))
+				{
+				  uentry_setHasNameError (ue);
+				}
+			    }
+			  
+			  cstring_free (pfx);
+			  return FALSE;
+			}
+		    }
+		}
+	      else
+		{
+		  ;
+		}
+	    }
+	  else
+	    {
+	      if (cstring_equalLit (pfx, "int")
+		  || cstring_equalLit (pfx, "char")
+		  || cstring_equalLit (pfx, "short")
+		  || cstring_equalLit (pfx, "long")
+		  || cstring_equalLit (pfx, "unsigned")
+		  || cstring_equalLit (pfx, "signed")
+		  || cstring_equalLit (pfx, "float")
+		  || cstring_equalLit (pfx, "double"))
+		{
+		  ; /* built-in types */
+		}
+	      else
+		{
+		  /* no accessible types, could match module name */
+		  
+		  if (cstring_equal (pfx, context_moduleName ()))
+		    {
+		      ;
+		    }
+		  else
+		    {
+		      if (report)
+			{
+			  if (optgenerror
+			      (slovakflag,
+			       message 
+			       ("%s %q name violates Slovak naming convention.  "
+				"Slovak prefix %s is not the name of a type.",
+				uentry_ekindName (ue),
+				uentry_getName (ue),
+				pfx),
+			       uentry_whereLast (ue)))
+			    {
+			      uentry_setHasNameError (ue);
+			    }
+			}
+
+		      cstring_free (pfx);
+		      return FALSE;
+		    }
+		}
+	    }
+	}
+
+      cstring_free (pfx);
+    }
+
+  return TRUE;
+}
+
+void
+checkGlobalName (uentry ue)
+{
+  if (!uentry_isStatic (ue) && uentry_hasName (ue))
+    {
+      checkNationalName (ue);
+    }
+  else
+    {
+      ;
+    }
+}
+
+void
+checkLocalName (/*@unused@*/ uentry ue)
+{
+  ;
+}
+
+/*
+** Checks a name used by user source is not reserved by ANSI 
+** (or for future library functions).
+**
+** The restrictions are described in X3.159-1989: 4.13
+*/
+
+/*@constant int NRESERVEDNAMES; @*/
+# define NRESERVEDNAMES 201
+
+/*@constant int NCPPNAMES@*/
+# define NCPPNAMES 39
+
+bool checkCppName (cstring name, fileloc loc)
+{
+  static ob_mstring cppNames[NCPPNAMES] =
+    {
+      "and", "and_eq", "asm", 
+      "bitand", "bitor", "bool", /* gasp: "bool", is special for lclint */
+      "catch", "class", "compl", "const_class",
+      "delete", "dynamic_cast", "false", "friend",
+      "inline", "mutable", "namespace", "new",
+      "not", "not_eq",
+      "operator", "or", "or_eq", "overload",
+      "private", "protected", "public",
+      "reinterpret_cast", "static_cast",
+      "template", "this", "throw", "true", "try",
+      "typeid", "using", "virtual", "xor", "xor_eq"
+      } ;
+  
+  if (cstring_isDefined (cstring_bsearch (name, &cppNames[0],
+					  NCPPNAMES)))
+    {
+      return (optgenerror
+	      (FLG_CPPNAMES,
+	       message ("Name %s is a keyword or reserved word in C++",
+			name),
+	       loc));
+    }
+
+  return FALSE;
+}
+
+bool
+checkAnsiName (cstring name, fileloc loc)
+{
+  bool hasError = FALSE;
+  int length = cstring_length (name);
+  char fchar = (length >= 1) ? cstring_firstChar (name) : '\0';
+  char schar = (length >= 2) ? cstring_secondChar (name) : '\0';
+  char tchar = (length >= 3) ? cstring_getChar (name, 3) : '\0';
+  char rchar = (length >= 4) ? cstring_getChar (name, 4) : '\0';
+
+  /* 
+  ** reservedNames
+  **   taken from Linden, "Expert C Programming", p. 126-8. 
+  **   invariant:  must be sorted (case-insensitive, lexicographically)
+  **               must end with NULL
+  */
+
+  static ob_mstring reservedNames[NRESERVEDNAMES] =
+    { 
+# include "reservedNames.nf"
+    } ;
+
+  if (fileloc_isSystemFile (loc) || fileloc_isBuiltin (loc))
+    {
+      return FALSE;  /* no errors for system files */
+    }
+
+# if 0
+  {
+    int i = 0;
+    char *lastname = NULL;
+    char *name;
+    
+    while ((name = reservedNames[i]) != NULL)
+      {
+	llassertprint (lastname == NULL
+		       || strcmp (name, lastname) > 0,
+		       ("%s / %s", lastname, name));
+	lastname = name;
+	i++;
+      }
+    
+    nreservedNames = i - 1;
+  }
+# endif
+  
+  if (cstring_isDefined (cstring_bsearch (name, &reservedNames[0],
+					  NRESERVEDNAMES)))
+    {
+      return (optgenerror
+	      (FLG_ANSIRESERVED,
+	       message ("Name %s is reserved for the standard library",
+			name),
+	       loc));
+    }
+
+  if (fchar == '_')
+    {
+      hasError = optgenerror
+	(FLG_ANSIRESERVED,
+	 message 
+	 ("Name %s is in the implementation name space (any identifier "
+	  "beginning with underscore)", 
+	  name),
+	 loc);
+    }
+
+  /*
+  ** 4.13.1 Errors 
+  **
+  ** Macros that begin with E and a digit or E and an uppercase letter ...
+  */
+
+  else if (fchar == 'E' && (isdigit ((int) schar) 
+			    || isupper ((int) schar)))
+    {
+      hasError = optgenerror
+	(FLG_ANSIRESERVED,
+	 message 
+	 ("Name %s is reserved for future ANSI library extensions. "
+	  "Macros beginning with E and a digit or uppercase letter "
+	  "may be added to . (See ANSI, Section 4.13.1)",
+	  name),
+	 loc);
+    }
+  
+  /*
+  ** 4.13.2 Character Handling 
+  **
+  ** Function names that begin with either "is" or "to" and a lowercase letter ...
+  */
+
+  else if (((fchar == 'i' && schar == 's') 
+	    || (fchar == 't' && schar == 'o'))
+	   && (islower ((int) tchar)))
+    {
+      hasError = optgenerror
+	(FLG_ANSIRESERVED,
+	 message
+	 ("Name %s is reserved for future ANSI library extensions.  "
+	  "Functions beginning with \"is\" or \"to\" and a lowercase "
+	  "letter may be added to . (See ANSI, Section 4.13.2)",
+	  name),
+	 loc);
+    }
+  
+  /*
+  ** 4.13.3 Localization 
+  **
+  ** Macros that begin with LC_ and an uppercase letter ...
+  */
+
+  else if (length >= 4 
+	   && ((fchar == 'L')
+	       && (schar == 'C')
+	       && (tchar == '_'))
+	   && (isupper ((int) rchar)))
+    {
+      hasError = optgenerror
+	(FLG_ANSIRESERVED,
+	 message
+	 ("Name %s is reserved for future ANSI library extensions.  "
+	  "Macros beginning with \"LC_\" and an uppercase letter may "
+	  "be added to . (See ANSI, Section 4.13.3)",
+	  name),
+	 loc);
+    }
+  
+  /*
+  ** 4.13.4 Mathematics 
+  **
+  ** The names of all existing functions declared in the  header, 
+  ** suffixed with f or l...
+  */
+
+  else if ((cstring_lastChar (name) == 'f' || cstring_lastChar (name) == 'l')
+	   && 
+	   (((length == 4)
+	     && ((cstring_equalPrefix (name, "cos") ||
+		  cstring_equalPrefix (name, "sin") ||
+		  cstring_equalPrefix (name, "tan") ||
+		  cstring_equalPrefix (name, "exp") ||
+		  cstring_equalPrefix (name, "log") ||
+		  cstring_equalPrefix (name, "pow"))))
+	    || ((length == 5)
+		&& ((cstring_equalPrefix (name, "acos") ||
+		     cstring_equalPrefix (name, "asin") ||
+		     cstring_equalPrefix (name, "atan") ||
+		     cstring_equalPrefix (name, "cosh") ||
+		     cstring_equalPrefix (name, "sinh") ||
+		     cstring_equalPrefix (name, "sqrt") ||
+		     cstring_equalPrefix (name, "ceil") ||
+		     cstring_equalPrefix (name, "fabs") ||
+		     cstring_equalPrefix (name, "fmod") ||
+		     cstring_equalPrefix (name, "tanh") ||
+		     cstring_equalPrefix (name, "modf"))))
+	    || ((length == 6)
+		&& ((cstring_equalPrefix (name, "atan2") ||
+		     cstring_equalPrefix (name, "floor") ||
+		     cstring_equalPrefix (name, "frexp") ||
+		     cstring_equalPrefix (name, "ldexp") ||
+		     cstring_equalPrefix (name, "log10"))))))
+    {
+      hasError = optgenerror
+	(FLG_ANSIRESERVED,
+	 message
+	 ("Name %s is reserved for future ANSI library extensions.  "
+	  "The names of all existing functions in  suffixed "
+	  "with 'f' or 'l' may be added to . (See ANSI, Section 4.13.4)",
+	  name),
+	 loc);
+    }
+  
+  /*
+  ** 4.13.5 Signal Handling 
+  **
+  ** Macros that begin with either SIG or SIG_ and an uppercase letter or...
+  */
+
+  else if (fchar == 'S' && schar == 'I' && tchar == 'G'
+	   && ((rchar == '_' && ((length >= 5 
+				  && isupper ((int) cstring_getChar (name, 5)))))
+	       || (isupper ((int) rchar))))
+    {
+      hasError = optgenerror
+	(FLG_ANSIRESERVED,
+	 message
+	 ("Name %s is reserved for future ANSI library extensions.  "
+	  "Macros that begin with SIG and an uppercase letter or SIG_ "
+	  "and an uppercase letter may be added to "
+	  ". (See ANSI, Section 4.13.5)",
+	  name),
+	 loc);
+    }
+  
+  /*
+  ** 4.13.6 Input/Output 
+  **
+  ** (nothing to check)
+  */
+
+  /*
+  ** 4.13.7 General Utilities 
+  **
+  ** Functions names that begin with str and a lowercase letter may be added to .
+  */
+
+  else if (fchar == 's' && schar == 't' && tchar == 'r' 
+	   && (islower ((int) rchar)))
+    {
+      hasError = optgenerror
+	(FLG_ANSIRESERVED,
+	 message
+	 ("Name %s is reserved for future ANSI library extensions.  "
+	  "Functions that begin with \"str\" and a lowercase letter "
+	  "may be added to  or . (See ANSI, Section 4.13.7)",
+	  name),
+	 loc);
+    }
+  
+  /*
+  ** 4.13.8 String Handling 
+  **
+  ** Function names that begin with str, mem, or wcs and a lowercase letter ...
+  **
+  ** (Note: already checked "str" above.)
+  */
+
+  else if (((fchar == 'm' && schar == 'e' && tchar == 'm')
+	    || (fchar == 'w' && schar == 'c' && tchar == 's'))
+	   && (islower ((int) rchar)))
+    {
+      hasError = optgenerror
+	(FLG_ANSIRESERVED,
+	 message
+	 ("Name %s is reserved for future ANSI library extensions.  "
+	  "Functions that begin with \"mem\" or \"wcs\" and a "
+	  "lowercase letter letter may be added to . (See ANSI, Section 4.13.8)",
+	  name),
+	 loc);
+    }
+  else
+    {
+      ;
+    }
+
+  return hasError;
+}
+
+void checkParamNames (uentry ue)
+{
+  cstring fpfx = context_getString (FLG_DECLPARAMPREFIX);
+  bool noformal = context_getFlag (FLG_DECLPARAMNAME);
+
+  llassert (uentry_isFunction (ue));
+  
+  if (cstring_isDefined (fpfx) || noformal)
+    {
+      uentryList params = uentry_getParams (ue);
+      
+      uentryList_elements (params, p)
+	{
+	  if (uentry_hasName (p))
+	    {
+	      if (noformal && !cstring_isDefined (fpfx))
+		{
+		  if (optgenerror
+		      (FLG_DECLPARAMNAME, 
+		       message ("Declaration parameter has name: %q",
+				uentry_getName (p)),
+		       uentry_whereLast (p)))
+		    {
+		      uentry_setHasNameError (p);
+		    }
+		}
+	      else
+		{
+		  cstring pname = uentry_getName (p);
+		  
+		  if (!cstring_equalPrefix (pname, cstring_toCharsSafe (fpfx)))
+		    {
+		      if (context_getFlag (FLG_NAMECHECKS))
+			{
+			  if (optgenerror
+			      (FLG_DECLPARAMPREFIX, 
+			       message ("Declaration parameter name %s does not begin "
+					"with protoparamprefix (%s)",
+					pname, fpfx),
+			       uentry_whereLast (p)))
+			    {
+			      uentry_setHasNameError (p);
+			    }
+			}
+		    }
+		  cstring_free (pname);
+		}
+	    }
+	} end_uentryList_elements ;
+    }
+}
+
+
+
+
diff --git a/src/osd.c b/src/osd.c
new file mode 100644
index 0000000..81749ad
--- /dev/null
+++ b/src/osd.c
@@ -0,0 +1,543 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** osd.c
+**
+** Provide a system-independent interface to system-dependent
+** file operations.
+*/
+
+/*
+ * Modified by Herbert 04/19/97:
+ * - added conditional 'OS2' to conditional 'MSDOS'
+ * - added include of new header portab.h.
+ * - changed '/' to macro.
+ * - added DOS / OS/2 specific stuff in osd_getPath.
+ */
+
+/*@-allmacros*/
+/*@ignore@*/
+# include 
+# include 
+/* Fix suggested by Lars Rasmussen */
+# include 
+/*@end@*/
+/*@=allmacros*/
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "osd.h"
+# include "portab.h"
+
+/* from stat.h */
+/*@ignore@*/
+extern int stat (const char *, /*@out@*/ struct stat *);
+/*@end@*/
+
+static bool osd_executableFileExists (char *);
+
+static bool nextdir (char **p_current_dir, /*@out@*/ char **p_dir, 
+		     /*@out@*/ size_t *p_len);
+
+extern char *LSLRootName (char *filespec)
+{
+  char *result, *startName, *tail;
+  size_t nameLength;
+
+  tail = strrchr (filespec, CONNECTCHAR);
+  startName = (tail == NULL ? filespec : &tail[1]);
+  tail = strrchr (startName, '.');
+  nameLength = (tail == NULL ? strlen (startName) 
+		: size_fromInt (tail - startName));
+  result = dmalloc (nameLength + 1);
+  strncpy (result, startName, nameLength);
+  result[(int) nameLength] = '\0';
+  return result;
+}
+
+extern /*@observer@*/ char *
+osd_getEnvironment (char *env, /*@returned@*/ char *def)
+{
+  char *ret = osd_getEnvironmentVariable (env);
+
+  if (ret == NULL)
+    {
+      return def;
+    }
+  else
+    {
+      return ret;
+    }
+}
+
+
+/*
+**++
+**  FUNCTIONAL DESCRIPTION:
+**
+**      This function attempts to locate a file in a search list.  On VMS, it
+**	just concatinates the path and file names, and then lets RMS do the
+**	searching.  On Ultrix, it searches for the file on the path.
+**
+**  FORMAL PARAMETERS:
+**
+**      path:	    search path where to look for the file.
+**	file:	    name of file to search for.
+**	returnPath: if a file is found, this is where the concatenated
+**		    directory and file name are returned.
+**
+**  RETURN VALUE:
+**
+**      OSD_FILEFOUND:	    the file was found on the search list.
+**	OSD_FILENOTFOUND    the file was not found.
+**	OSD_PATHTOOLONG	    the concatenated directory and file name are too
+**			    long.
+**
+**  SIDE EFFECTS:
+**
+**      None
+**
+**  PRECONDITIONS:
+**
+**  	Requires that parameters, path and file, are valid C strings.
+**
+**
+**--
+*/
+
+extern /*@null@*/ /*@observer@*/ char *
+  osd_getHomeDir ()
+{
+  /* Would something different be better for windows? */
+  return (osd_getEnvironmentVariable ("HOME"));
+}
+
+filestatus osd_findOnLarchPath (char *file, char **returnPath)
+{
+  return (osd_getPath (cstring_toCharsSafe (context_getLarchPath ()), file, returnPath));
+}
+
+extern filestatus
+osd_getPath (char *path, char *file, char **returnPath)
+{
+  char *fullPath;
+  char *dirPtr;
+  size_t dirLen;
+  char aPath[MAXPATHLEN];
+  filestatus rVal = OSD_FILENOTFOUND;	/* assume file not found. */
+
+  fullPath = path;
+
+  if (fullPath == NULL || 
+# if defined(OS2) || defined(MSDOS) || defined(WIN32)
+    /* under OS/2 and MSDOS the includePath may be empty, if so, search 
+     * the current directory. */
+    *fullPath == '\0' || 
+    (*file == CONNECTCHAR || (file[0] != '\0' && file[1] == ':')))
+# else
+# ifdef WIN32
+	(*file == CONNECTCHAR || (file[0] != '\0' && file[1] == ':')))
+# else
+    (*file == CONNECTCHAR))
+# endif
+# endif
+    {
+     /* No path specified. Look for it in the current directory.	    */
+
+      strcpy (&aPath[0], file);
+
+      if (osd_fileExists (&aPath[0]))
+	{
+	  rVal = OSD_FILEFOUND;
+   	  *returnPath = dmalloc (strlen (&aPath[0]) + 1);
+	  strcpy (*returnPath, &aPath[0]);
+	}
+    }
+  else
+    {
+     /* Path specified. Loop through directories in path looking for the */
+     /* first occurrence of the file.				    */
+
+      while (nextdir (&fullPath, &dirPtr, &dirLen) &&
+	     rVal == OSD_FILENOTFOUND)
+	{
+	  if ((dirLen + strlen (file) + 2) <= MAXPATHLEN)
+	    {
+	     /* Cat directory and filename, and see if file exists.  */
+	      strncpy (&aPath[0], dirPtr, dirLen);
+	      strcpy (&aPath[0] + dirLen, "");	/* Null terminate aPath. */
+	      strcat (&aPath[0], CONNECTSTR);
+	      strcat (&aPath[0], file);
+
+	      if (osd_fileExists (&aPath[0]))
+		{
+		  rVal = OSD_FILEFOUND;
+   		  *returnPath = (char *) dmalloc (strlen (&aPath[0]) + 1);
+		  strcpy (*returnPath, &aPath[0]);
+		}
+	    }
+	  else
+	    {
+	      rVal = OSD_PATHTOOLONG;
+	    }
+	}	
+    }
+
+  return rVal;
+}
+
+extern filestatus
+osd_getExePath (char *path, char *file, char **returnPath)
+{
+  char *fullPath;
+  char *dirPtr;
+  size_t dirLen;
+  char aPath[MAXPATHLEN];
+  filestatus rVal = OSD_FILENOTFOUND;	/* assume file not found. */
+  
+  fullPath = osd_getEnvironmentVariable (path);
+
+  if (fullPath == NULL)
+    {
+     /* No path specified. Look for it in the current directory. */
+
+      strcpy (&aPath[0], file);
+
+      if (osd_fileExists (&aPath[0]))
+	{
+	  rVal = OSD_FILEFOUND;
+   	  *returnPath = dmalloc (strlen (&aPath[0]) + 1);
+	  strcpy (*returnPath, &aPath[0]);
+	}
+    }
+  else
+    {
+     /* 
+     ** Path specified. Loop through directories in path looking
+     ** for the first occurrence of the file.				    
+     */
+
+      while (nextdir (&fullPath, &dirPtr, &dirLen) &&
+	     rVal == OSD_FILENOTFOUND)
+	{
+	  if ((dirLen + strlen (file) + 2) <= MAXPATHLEN)
+	    {
+	      /* Cat directory and filename, and see if file exists.  */
+	      strncpy (&aPath[0], dirPtr, dirLen);
+	      strcpy (&aPath[0] + dirLen, ""); /* Null terminate aPath. */
+	      strcat (&aPath[0], CONNECTSTR);
+	      strcat (&aPath[0], file);
+
+	      if (osd_executableFileExists (&aPath[0]))
+		{
+		  rVal = OSD_FILEFOUND;
+   		  *returnPath = dmalloc (strlen (&aPath[0]) + 1);
+		  strcpy (*returnPath, &aPath[0]);
+		}
+	    }
+	  else
+	    {
+	      rVal = OSD_PATHTOOLONG;
+	    }
+	}
+    }
+
+  return rVal;
+}
+
+bool
+osd_fileExists (char *filespec)
+{
+# ifdef UNIX
+  struct stat buf;
+  return (stat (filespec, &buf) == 0);
+# else
+# ifdef WIN32
+  FILE *test = fopen (filespec, "r");
+  if (test != NULL) 
+  {
+	(void) fclose (test);
+	return TRUE;
+  } 
+  else
+  { 
+	  return FALSE;
+  }
+# else 
+  return FALSE;
+# endif
+# endif
+}
+
+bool
+osd_executableFileExists (/*@unused@*/ char *filespec)
+{
+# ifdef UNIX
+	struct stat buf;
+# if defined(__IBMC__) && defined(OS2)
+# define S_IFMT (unsigned short)0xFFFF
+# endif
+  if (stat (filespec, &buf) == 0)
+    { 
+      /* mask by file type */
+      /*@-unrecog@*/ /* S_IFMT is not defined */
+      if ((buf.st_mode & S_IFMT) != S_IFDIR /*@=unrecog@*/) /* not a directory */
+	{
+	  /* as long as it is an executable file */
+# if defined(__IBMC__) && defined(OS2)
+      int com_or_exe_pos = strlen( filespec) - 4;
+      return stricmp( &filespec[com_or_exe_pos], ".exe") == 0
+        || stricmp( &filespec[com_or_exe_pos], ".com") == 0
+        || stricmp( &filespec[com_or_exe_pos], ".bat") == 0
+        || stricmp( &filespec[com_or_exe_pos], ".cmd") == 0;
+# else
+	  return (((buf.st_mode & S_IXUSR)
+# if !defined(MSDOS) && !defined(OS2) 
+		   | (buf.st_mode & S_IXGRP) |
+		   (buf.st_mode & S_IXOTH)
+# endif
+		   ) != 0);
+# endif
+	}
+    }
+
+# endif
+  return (FALSE);
+
+}
+
+/*
+**++
+**  FUNCTIONAL DESCRIPTION:
+**
+**      Find the next directory from a directory path.
+**
+**  FORMAL PARAMETERS:
+**
+**      char ** current_dir :
+**	    Points to the current position in the path string.  The first time
+**	    you call this routine, this should point to the first character of
+**	    the path.  On return, this will be updated to point to the
+**	    terminating \0 or : of the first directory found.  You can then pass
+**	    it unchanged for subsequent calls; this routine will correctly skip
+**	    over the :.
+**
+**	char ** dir :
+**	    On exit, this will point to the first character of the directory
+**	    that was found.  This will be a pointer directly into the client's
+**	    path string.
+**
+**	unsigned int * len :
+**	    On exit, this will contain the length of the directory that was
+**	    found, not counting any terminating \0 or :.  If no directory was
+**	    found, this will be 0.
+**
+**  RETURN VALUE:
+**	TRUE if we found another directory.
+**	FALSE otherwise.
+**
+**  DESIGN:
+**
+**      We return a pointer and length, rather than a string, because of a)
+**	historical reasons; and b) this avoids having to allocate storage.
+**
+**
+**
+**--
+*/
+
+static bool
+nextdir (d_char *current_dir, d_char *dir, size_t *len)
+{
+  char *tchar;
+
+  if (**current_dir == '\0')
+    {
+      *len = 0;
+      return FALSE;
+    }
+
+  *dir = (**current_dir == SEPCHAR ? *current_dir + 1 : *current_dir);
+  
+  /* Find next ':' or end of string */
+  for (tchar = *dir; *tchar != '\0' && *tchar != SEPCHAR; tchar++)
+    {
+      ;
+    }
+  
+  *current_dir = tchar;
+  *len = size_fromInt (tchar - *dir);
+  return TRUE;
+}
+
+/*@observer@*/ /*@null@*/ char *osd_getEnvironmentVariable (char *var)
+{
+# ifdef UNIX
+	return getenv (var);
+# else
+# if defined(OS2) || defined(MSDOS)
+	return getenv (var);
+# else
+# if defined(WIN32)
+	return getenv (var);
+# else
+	return NULL;
+# endif
+# endif
+# endif
+}
+
+# ifndef NOLCL
+
+# ifdef WIN32
+extern /*@external@*/ int _flushall (void) /*@modifies fileSystem@*/ ;
+# endif
+
+# ifndef system
+extern /*@external@*/ int system (const char *) /*@modifies fileSystem@*/ ;
+# endif
+int osd_system (const char *cmd)
+{
+  int res;
+    /* system ("printenv"); */
+# ifdef WIN32
+  (void) _flushall (); 
+# endif
+
+  res = system (cmd);
+  return res;
+}
+# endif
+
+# ifndef unlink
+/*@-redecl@*/
+extern /*@external@*/ int unlink (const char *) /*@modifies fileSystem@*/ ;
+/*@=redecl@*/
+# endif
+
+int osd_unlink (const char *fname)
+{
+  int res;
+
+  res = unlink (fname);
+
+  if (res != 0)
+    {
+      llcontbug (message ("Cannot remove temporary file: %s (%s)",
+			  cstring_fromChars (fname),
+			  cstring_fromChars (strerror (errno))));
+    }
+  
+  return res;
+}
+
+# ifdef WIN32
+# include 
+# endif
+
+# ifdef WIN32
+int
+# else
+int /* pid_t */
+# endif
+osd_getPid ()
+{
+# ifdef WIN32
+  int pid = _getpid ();
+# else
+  pid_t pid = getpid ();
+# endif
+
+  return (int) pid;
+}
+  
+cstring osd_fixDefine (char *x)
+{
+# ifdef UNIX
+  if (strchr (x, '\'') != NULL) {
+    /*
+    ** If there is a single quote, check for ='' and 
+    ** produce =
+    */
+
+    char *eqs = strchr (x, '=');
+
+    if (eqs != NULL) {
+      if (eqs[1] == '\'') {
+	char *endqu = strrchr (x, '\'');
+
+	if (endqu != NULL) {
+	  if (*(endqu - 1) != '\\') {
+	    if (*(endqu + 1) == '\0') {
+	      cstring res;
+	      cstring def;
+
+	      *endqu = '\0';
+	      def = cstring_fromChars (eqs + 2);
+	      eqs[1] = '\0';
+	      res = cstring_concat (cstring_fromChars (x), def);
+	      	      return res;
+	    }
+	  }
+	}
+      }
+    }
+  } 
+
+# endif
+
+  return cstring_fromCharsNew (x);
+}
+
+bool osd_fileIsReadable (char *f)
+{
+  FILE *fl = fopen (f, "r");
+
+  if (fl != (FILE *) 0)
+    {
+      check (fclose (fl) == 0);
+      return (TRUE);
+    }
+  else
+    {
+      return (FALSE);
+    }
+}
+
+bool osd_isConnectChar (char c)
+{
+  if (c == CONNECTCHAR) 
+    {
+      return TRUE;
+    }
+
+# ifdef HASALTCONNECTCHAR
+  if (c == ALTCONNECTCHAR)
+    {
+      return TRUE;
+    }
+# endif
+
+  return FALSE;
+}
+
diff --git a/src/pairNodeList.c b/src/pairNodeList.c
new file mode 100644
index 0000000..2ee744b
--- /dev/null
+++ b/src/pairNodeList.c
@@ -0,0 +1,116 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** pairNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ pairNodeList
+pairNodeList_new ()
+{
+  pairNodeList s = (pairNodeList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = pairNodeListBASESIZE;
+  s->elements = (pairNode *) 
+    dmalloc (sizeof (*s->elements) * pairNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+pairNodeList_grow (/*@notnull@*/ pairNodeList s)
+{
+  int i;
+  pairNode *newelements; 
+
+  s->nspace += pairNodeListBASESIZE;
+  newelements = (pairNode *) dmalloc (sizeof (*newelements) 
+				      * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+void 
+pairNodeList_addh (pairNodeList s, pairNode el)
+{
+  llassert (pairNodeList_isDefined (s));
+  llassert (pairNodeListBASESIZE > 0);
+
+  if (s->nspace <= 0)
+    pairNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+}
+
+/*@only@*/ cstring
+pairNodeList_unparse (pairNodeList s)
+{
+  cstring st = cstring_undefined;
+  
+  if (s != (pairNodeList)0)
+    {
+      pairNodeList_elements (s, current)
+	{
+	  if (current != NULL)
+	    {
+	      st = message ("%q%s %s; ", st, 
+			    sort_unparseName (current->sort), 
+			    ltoken_getRawString (current->tok));
+	    }
+	} end_pairNodeList_elements;
+    }
+
+  return st;
+}
+
+void
+pairNodeList_free (/*@only@*/ pairNodeList s)
+{
+  if (pairNodeList_isDefined (s))
+    {
+      int i;
+      for (i = 0; i < s->nelements; i++)
+	{
+	  pairNode_free (s->elements[i]); 
+	}
+      
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
diff --git a/src/paramNodeList.c b/src/paramNodeList.c
new file mode 100644
index 0000000..3e7ed07
--- /dev/null
+++ b/src/paramNodeList.c
@@ -0,0 +1,167 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** paramNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ paramNodeList
+paramNodeList_new ()
+{
+  paramNodeList s = (paramNodeList) dmalloc (sizeof (*s));
+
+  s->nelements = 0;
+  s->nspace = paramNodeListBASESIZE;
+  s->elements = (paramNode *) 
+    dmalloc (sizeof (*s->elements) * paramNodeListBASESIZE);
+
+  return (s);
+}
+
+/*@only@*/ paramNodeList
+paramNodeList_single (/*@keep@*/ paramNode p)
+{
+  paramNodeList s = (paramNodeList) dmalloc (sizeof (*s));
+  
+  s->nelements = 1;
+  s->nspace = paramNodeListBASESIZE - 1;
+  s->elements = (paramNode *) dmalloc (sizeof (*s->elements) * paramNodeListBASESIZE);
+  s->elements[0] = p;
+
+  return (s);
+}
+
+static void
+paramNodeList_grow (/*@notnull@*/ paramNodeList s)
+{
+  int i;
+  paramNode *newelements;
+
+  s->nspace += paramNodeListBASESIZE;
+
+  newelements = (paramNode *) dmalloc (sizeof (*newelements)
+				       * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+paramNodeList
+paramNodeList_add (paramNodeList s, paramNode el)
+{
+  llassert (paramNodeList_isDefined (s));
+
+  if (s->nspace <= 0)
+    paramNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  
+  s->nelements++;
+  return s;
+}
+
+/*@only@*/ paramNodeList 
+paramNodeList_copy (paramNodeList s)
+{
+  paramNodeList r = paramNodeList_new ();
+
+  paramNodeList_elements (s, x)
+  {
+    r = paramNodeList_add (r, paramNode_copy (x));
+  } end_paramNodeList_elements;
+
+  return r;
+}
+
+/*@only@*/ cstring
+paramNodeList_unparse (paramNodeList s)
+{
+  bool first = TRUE;
+  cstring st = cstring_undefined;
+
+  paramNodeList_elements (s, current)
+  {
+    if (first)
+      {
+	st = paramNode_unparse (current);
+	first = FALSE;
+      }
+    else
+      {
+	st = message ("%q, %q", st, paramNode_unparse (current));
+      }
+  } end_paramNodeList_elements;
+
+  return st;
+}
+
+/*@only@*/ cstring
+paramNodeList_unparseComments (paramNodeList s)
+{
+  bool first = TRUE;
+  cstring st = cstring_undefined;
+
+  paramNodeList_elements (s, current)
+  {
+    if (first)
+      {
+	st = paramNode_unparseComments (current);
+	first = FALSE;
+      }
+    else
+      {
+	st = message ("%q, %q", st, paramNode_unparseComments (current));
+      }
+  } end_paramNodeList_elements;
+
+  return st;
+}
+
+void
+paramNodeList_free (/*@only@*/ paramNodeList s)
+{
+  if (paramNodeList_isDefined (s))
+    {
+      int i;
+      for (i = 0; i < s->nelements; i++)
+	{
+	  paramNode_free (s->elements[i]); 
+	}
+      
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
diff --git a/src/programNodeList.c b/src/programNodeList.c
new file mode 100644
index 0000000..6357ea9
--- /dev/null
+++ b/src/programNodeList.c
@@ -0,0 +1,111 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** programNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ programNodeList
+programNodeList_new ()
+{
+  programNodeList s = (programNodeList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = programNodeListBASESIZE;
+  s->elements = (programNode *) 
+    dmalloc (sizeof (*s->elements) * programNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+programNodeList_grow (programNodeList s)
+{
+  int i;
+  programNode *newelements;
+
+  s->nspace += programNodeListBASESIZE;
+  newelements = (programNode *) dmalloc (sizeof (*newelements)
+					 * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+void 
+programNodeList_addh (programNodeList s, /*@keep@*/ programNode el)
+{
+  if (s->nspace <= 0)
+    programNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+}
+
+/*@only@*/ cstring
+programNodeList_unparse (programNodeList s)
+{
+  bool first = TRUE;
+  cstring st = cstring_undefined;
+
+  programNodeList_elements (s, current)
+  {
+    if (first)
+      {
+	st = programNode_unparse (current);
+	first = FALSE;
+      }
+    else
+      {
+	st = message ("%q; %q", st, programNode_unparse (current));
+      }
+  } end_programNodeList_elements;
+
+  return st;
+}
+
+void
+programNodeList_free (programNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      programNode_free (s->elements[i]); 
+    }
+
+  sfree (s->elements); 
+  sfree (s);
+}
diff --git a/src/qtype.c b/src/qtype.c
new file mode 100644
index 0000000..854114b
--- /dev/null
+++ b/src/qtype.c
@@ -0,0 +1,226 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** qtype.c
+**
+** Qualified types: a type qualifier list, and a ctype.
+** qtypes are mutable
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+/*@notnull@*/ qtype qtype_create (ctype c)
+{
+  qtype q = (qtype) dmalloc (sizeof (*q));
+
+  q->type = c;
+  q->quals = qualList_new ();
+  return q;
+}
+
+void qtype_free (/*@only@*/ qtype q)
+{
+  if (qtype_isDefined (q))
+    {
+      qualList_free (q->quals);
+      sfree (q);
+    }
+}
+
+qtype qtype_unknown ()
+{
+  return (qtype_create (ctype_unknown));
+}
+
+qtype qtype_addQual (qtype qt, qual q)
+{
+  if (qtype_isDefined (qt))
+    {
+      qt->quals = qualList_add (qt->quals, q);
+    }
+
+  return qt;
+}
+
+# ifndef NOLCL
+qtype qtype_addQualList (/*@returned@*/ qtype qt, qualList ql)
+{
+  if (qtype_isDefined (qt))
+    {
+      qt->quals = qualList_appendList (qt->quals, ql);
+    }
+
+  return qt;
+}
+# endif
+
+static void checkAltQuals (qtype q)
+{
+  if (qtype_isDefined (q))
+    {
+      qualList badQuals = qualList_undefined;
+      
+      qualList_elements (q->quals, qu)
+	{
+	  if (!qual_isCQual (qu) && !qual_isImplied (qu))
+	    {
+	      badQuals = qualList_add (badQuals, qu);
+	    }
+	} end_qualList_elements ;
+      
+      if (!qualList_isEmpty (badQuals))
+	{
+	  voptgenerror (FLG_SYNTAX,
+			message 
+			("Alternate type cannot use annotations %q: %q",
+			 qualList_unparse (badQuals),
+			 qtype_unparse (q)),
+			g_currentloc);
+	}
+    }
+}
+
+# ifndef NOLCL
+qtype qtype_mergeImplicitAlt (/*@returned@*/ qtype q1, /*@only@*/ qtype q2)
+{
+  if (qtype_isDefined (q1) && qtype_isDefined (q2))
+    {
+      q1->type = ctype_makeConj (q1->type, q2->type);
+      
+      if (!qualList_isEmpty (q2->quals))
+	{
+	  checkAltQuals (q2);
+	}
+    }
+
+  qtype_free (q2);
+  return q1;
+}
+# endif
+
+qtype qtype_mergeAlt (/*@returned@*/ qtype q1, /*@only@*/ qtype q2)
+{
+  if (qtype_isDefined (q1) && qtype_isDefined (q2))
+    {
+      if (context_getFlag (FLG_IMPCONJ))
+	{
+	  q1->type = ctype_makeConj (q1->type, q2->type);
+	}
+      else
+	{
+	  q1->type = ctype_makeExplicitConj (q1->type, q2->type);
+	}
+
+      
+      if (!qualList_isEmpty (q2->quals))
+	{
+	  checkAltQuals (q2);
+	}
+    }
+  
+  qtype_free (q2);
+  return q1;
+}
+
+qtype qtype_combine (/*@returned@*/ qtype q1, ctype ct)
+{
+  if (qtype_isDefined (q1))
+    {
+      /* ct is modifier (or q1->type is unknown) */
+      q1->type = ctype_combine (q1->type, ct); 
+    }
+
+  return q1;
+}
+
+qtype qtype_resolve (/*@returned@*/ qtype q)
+{
+  if (qtype_isDefined (q))
+    {
+      q->type = ctype_resolve (q->type);
+    }
+
+  return q;
+}
+
+cstring qtype_unparse (qtype q)
+{
+  if (qtype_isDefined (q))
+    {
+      return (message ("%q%s", qualList_unparse (q->quals), 
+		       ctype_unparse (q->type)));
+    }
+  else
+    {
+      return (cstring_makeLiteral (""));
+    }
+}
+
+qtype qtype_newBase (/*@returned@*/ qtype q, ctype ct)
+{
+  if (qtype_isDefined (q))
+    {
+      q->type = ctype_newBase (ct, q->type);
+    }
+
+  return q;
+}
+
+qtype qtype_newQbase (qtype q1, qtype q2)
+{
+  if (qtype_isDefined (q1) && qtype_isDefined (q2))
+    {
+      q1->type = ctype_newBase (q1->type, q2->type);
+      q1->quals = qualList_appendList (q1->quals, q2->quals);
+    }
+
+  return q1;
+}
+
+void qtype_adjustPointers (int n, qtype q)
+{
+  if (qtype_isDefined (q))
+    {
+      q->type = ctype_adjustPointers (n, q->type);
+    }
+}
+
+# ifndef NOLCL
+qtype qtype_copy (qtype q)
+{
+  if (qtype_isDefined (q))
+    {
+      qtype r = qtype_create (q->type);
+      
+      qualList_free (r->quals);
+      r->quals = qualList_copy (q->quals);
+      return r;
+    }
+  else
+    {
+      return qtype_undefined;
+    }
+}
+# endif
diff --git a/src/qual.c b/src/qual.c
new file mode 100644
index 0000000..3fafbf3
--- /dev/null
+++ b/src/qual.c
@@ -0,0 +1,115 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** qual.c
+**
+** representation of type qualifiers
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+static bool qual_isValid (int q)
+{
+  return ((qual)q >= QU_UNKNOWN 
+	  && ((qual)q < QU_LAST));
+}
+
+qual qual_fromInt (int q)
+{
+  llassertprint (qual_isValid (q), ("Invalid qual: %d", q));
+  return (qual) q;
+}
+
+cstring qual_unparse (qual q)
+{
+  switch (q)
+    {
+    case QU_UNKNOWN:    return cstring_makeLiteralTemp ("unknown");
+    case QU_ABSTRACT:   return cstring_makeLiteralTemp ("abstract");
+    case QU_CONCRETE:   return cstring_makeLiteralTemp ("concrete");
+    case QU_MUTABLE:    return cstring_makeLiteralTemp ("mutable");
+    case QU_IMMUTABLE:  return cstring_makeLiteralTemp ("immutable");
+    case QU_SHORT:      return cstring_makeLiteralTemp ("short");
+    case QU_LONG:       return cstring_makeLiteralTemp ("long");
+    case QU_SIGNED:     return cstring_makeLiteralTemp ("signed");
+    case QU_UNSIGNED:   return cstring_makeLiteralTemp ("unsigned");
+    case QU_CONST:      return cstring_makeLiteralTemp ("const");
+    case QU_VOLATILE:   return cstring_makeLiteralTemp ("volatile");
+    case QU_INLINE:     return cstring_makeLiteralTemp ("inline");
+    case QU_EXTERN:     return cstring_makeLiteralTemp ("extern");
+    case QU_STATIC:     return cstring_makeLiteralTemp ("static");
+    case QU_AUTO:       return cstring_makeLiteralTemp ("auto");
+    case QU_REGISTER:   return cstring_makeLiteralTemp ("register");
+    case QU_OUT:        return cstring_makeLiteralTemp ("out");
+    case QU_IN:         return cstring_makeLiteralTemp ("in");
+    case QU_RELDEF:     return cstring_makeLiteralTemp ("reldef");
+    case QU_ONLY:       return cstring_makeLiteralTemp ("only");
+    case QU_IMPONLY:    return cstring_makeLiteralTemp ("only");
+    case QU_PARTIAL:    return cstring_makeLiteralTemp ("partial");
+    case QU_SPECIAL:    return cstring_makeLiteralTemp ("special");
+    case QU_KEEP:       return cstring_makeLiteralTemp ("keep");
+    case QU_KEPT:       return cstring_makeLiteralTemp ("kept");
+    case QU_YIELD:      return cstring_makeLiteralTemp ("yield");
+    case QU_TEMP:       return cstring_makeLiteralTemp ("temp");
+    case QU_SHARED:     return cstring_makeLiteralTemp ("shared");
+    case QU_UNIQUE:     return cstring_makeLiteralTemp ("unique");
+    case QU_UNCHECKED:  return cstring_makeLiteralTemp ("unchecked");
+    case QU_CHECKED:    return cstring_makeLiteralTemp ("checked");
+    case QU_CHECKMOD:   return cstring_makeLiteralTemp ("checkmod");
+    case QU_CHECKEDSTRICT: return cstring_makeLiteralTemp ("checkedstrict");
+    case QU_TRUENULL:   return cstring_makeLiteralTemp ("truenull");
+    case QU_FALSENULL:  return cstring_makeLiteralTemp ("falsenull");
+    case QU_NULL:       return cstring_makeLiteralTemp ("null");
+    case QU_RELNULL:    return cstring_makeLiteralTemp ("relnull");
+    case QU_NOTNULL:    return cstring_makeLiteralTemp ("notnull");
+    case QU_RETURNED:   return cstring_makeLiteralTemp ("  returned");
+    case QU_EXPOSED:    return cstring_makeLiteralTemp ("exposed");
+    case QU_EXITS:      return cstring_makeLiteralTemp ("exits");
+    case QU_MAYEXIT:    return cstring_makeLiteralTemp ("mayexit");
+    case QU_UNUSED:     return cstring_makeLiteralTemp ("unused");
+    case QU_EXTERNAL:   return cstring_makeLiteralTemp ("external");
+    case QU_SEF:        return cstring_makeLiteralTemp ("sef");
+    case QU_OBSERVER:   return cstring_makeLiteralTemp ("observer");
+    case QU_REFCOUNTED: return cstring_makeLiteralTemp ("refcounted"); 
+    case QU_REFS:       return cstring_makeLiteralTemp ("refs"); 
+    case QU_NEWREF:     return cstring_makeLiteralTemp ("newref"); 
+    case QU_KILLREF:    return cstring_makeLiteralTemp ("killref"); 
+    case QU_TEMPREF:    return cstring_makeLiteralTemp ("tempref"); 
+    case QU_OWNED:      return cstring_makeLiteralTemp ("owned");
+    case QU_DEPENDENT:  return cstring_makeLiteralTemp ("dependent");
+    case QU_NEVEREXIT:  return cstring_makeLiteralTemp ("neverexit");
+    case QU_TRUEEXIT:   return cstring_makeLiteralTemp ("trueexit");
+    case QU_FALSEEXIT:  return cstring_makeLiteralTemp ("falseexit");
+    case QU_UNDEF:      return cstring_makeLiteralTemp ("undef");
+    case QU_KILLED:     return cstring_makeLiteralTemp ("killed");
+    case QU_PRINTFLIKE: return cstring_makeLiteralTemp ("printflike");
+    case QU_SCANFLIKE:  return cstring_makeLiteralTemp ("scanflike");
+    case QU_MESSAGELIKE:return cstring_makeLiteralTemp ("messagelike");
+    case QU_LAST:       return cstring_makeLiteralTemp ("< last >");
+    }
+
+  BADEXIT;
+}
+
diff --git a/src/qualList.c b/src/qualList.c
new file mode 100644
index 0000000..4b6dea3
--- /dev/null
+++ b/src/qualList.c
@@ -0,0 +1,204 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** qualList.c (from slist_template.c)
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+qualList
+qualList_new ()
+{
+  return qualList_undefined;
+}
+
+static /*@only@*/ /*@notnull@*/ qualList
+qualList_newEmpty (void)
+{
+  qualList s = (qualList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->free = qualListBASESIZE;
+  s->elements = (qual *) dmalloc (sizeof (*s->elements) * qualListBASESIZE);
+
+  return (s);
+}
+
+void
+qualList_clear (qualList q)
+{
+  if (qualList_isDefined (q))
+    {
+      q->free += q->nelements;
+      q->nelements = 0;
+    }
+}
+
+static void
+qualList_grow (/*@notnull@*/ qualList s)
+{
+  int i;
+  qual *oldelements = s->elements;
+  
+  s->free += qualListBASESIZE; 
+
+  s->elements = (qual *) dmalloc (sizeof (*s->elements) * (s->nelements + s->free));
+    
+  for (i = 0; i < s->nelements; i++)
+    {
+      s->elements[i] = oldelements[i];
+    }
+  
+  sfree (oldelements);
+}
+
+qualList qualList_add (qualList s, qual el)
+{
+  if (qualList_isUndefined (s))
+    {
+      s = qualList_newEmpty ();
+    }
+  
+  if (s->free <= 0)
+    qualList_grow (s);
+  
+  s->free--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return (s);
+}
+
+qualList qualList_appendList (qualList s, qualList t)
+{
+  qualList_elements (t, current)
+    {
+      s = qualList_add (s, current);
+    } end_qualList_elements;
+
+  return s;
+}
+
+# ifndef NOLCL
+qualList qualList_copy (qualList s)
+{
+  qualList t = qualList_new ();
+
+  qualList_elements (s, current)
+    {
+      t = qualList_add (t, current);
+    } end_qualList_elements;
+
+  return t;
+}
+# endif
+
+/*@only@*/ cstring
+qualList_unparse (qualList s)
+{
+   int i;
+   cstring st = cstring_undefined;
+
+   if (qualList_isDefined (s))
+     {
+       for (i = 0; i < qualList_size (s); i++)
+	 {
+	   if (i == 0)
+	     {
+	       st = message ("%q%s ", st, qual_unparse (s->elements[i]));
+	     }
+	   else
+	     st = message ("%q%s ", st, qual_unparse (s->elements[i]));
+	 }
+     }
+
+   return st;
+}
+
+# ifndef NOLCL
+/*@only@*/ cstring
+qualList_toCComments (qualList s)
+{
+   int i;
+   cstring st = cstring_undefined;
+
+   if (qualList_isDefined (s))
+     {
+       for (i = 0; i < qualList_size (s); i++)
+	 {
+	   if (i == 0)
+	     {
+	       st = message ("%q/*@%s@*/ ", st, qual_unparse (s->elements[i]));
+	     }
+	   else
+	     st = message ("%q/*@%s@*/ ", st, qual_unparse (s->elements[i]));
+	 }
+     }
+
+   return st;
+}
+# endif
+
+bool
+qualList_hasAliasQualifier (qualList s)
+{
+  if (qualList_isDefined (s))
+    {
+      qualList_elements (s, q)
+	{
+	  if (qual_isAliasQual (q)) return TRUE;
+	} end_qualList_elements;
+    }
+
+  return FALSE;
+}
+
+bool
+qualList_hasExposureQualifier (qualList s)
+{
+  if (qualList_isDefined (s))
+    {
+      qualList_elements (s, q)
+	{
+	  if (qual_isExQual (q)) return TRUE;
+	} end_qualList_elements;
+    }
+
+  return FALSE;
+}
+
+void
+qualList_free (/*@only@*/ qualList s)
+{
+  if (qualList_isDefined (s))
+    {
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
+
+
+
+
diff --git a/src/quantifierNodeList.c b/src/quantifierNodeList.c
new file mode 100644
index 0000000..2adf2a6
--- /dev/null
+++ b/src/quantifierNodeList.c
@@ -0,0 +1,120 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** quantifierNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ quantifierNodeList
+quantifierNodeList_new ()
+{
+  quantifierNodeList s = (quantifierNodeList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = quantifierNodeListBASESIZE;
+  s->elements = (quantifierNode *) 
+    dmalloc (sizeof (*s->elements) * quantifierNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+quantifierNodeList_grow (quantifierNodeList s)
+{
+  int i;
+  quantifierNode *newelements; 
+
+  s->nspace += quantifierNodeListBASESIZE;
+
+  newelements = (quantifierNode *) dmalloc (sizeof (*newelements)
+					    * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i]; 
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+quantifierNodeList 
+quantifierNodeList_add (quantifierNodeList s, quantifierNode el)
+{
+  if (s->nspace <= 0)
+    quantifierNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+/*@only@*/ quantifierNodeList 
+quantifierNodeList_copy (quantifierNodeList s)
+{
+  quantifierNodeList r = quantifierNodeList_new ();
+
+  quantifierNodeList_elements (s, x)
+    {
+      r = quantifierNodeList_add (r, quantifierNode_copy (x));
+    } end_quantifierNodeList_elements;
+  
+  return r;
+}
+
+/*@only@*/ cstring
+quantifierNodeList_unparse (quantifierNodeList s)
+{
+  cstring st = cstring_undefined;
+
+  quantifierNodeList_elements (s, current)
+  {
+    st = message ("%q%s %q", 
+		  st, ltoken_getRawString (current->quant),
+		  varNodeList_unparse (current->vars));
+  } end_quantifierNodeList_elements;
+
+  return st;
+}
+
+void
+quantifierNodeList_free (quantifierNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      quantifierNode_free (s->elements[i]); 
+    }
+
+  sfree (s->elements); 
+  sfree (s);
+}
diff --git a/src/replaceNodeList.c b/src/replaceNodeList.c
new file mode 100644
index 0000000..affdc89
--- /dev/null
+++ b/src/replaceNodeList.c
@@ -0,0 +1,114 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** replaceNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ replaceNodeList
+replaceNodeList_new ()
+{
+  replaceNodeList s = (replaceNodeList) dmalloc (sizeof (*s));
+
+  s->nelements = 0;
+  s->nspace = replaceNodeListBASESIZE;
+  s->elements = (replaceNode *)
+    dmalloc (sizeof (*s->elements) * replaceNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+replaceNodeList_grow (replaceNodeList s)
+{
+  int i;
+  replaceNode *newelements; 
+
+  s->nspace += replaceNodeListBASESIZE;
+
+  newelements = (replaceNode *) dmalloc (sizeof (*newelements)
+					 * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements); 
+  s->elements  = newelements;
+}
+
+replaceNodeList
+  replaceNodeList_add (replaceNodeList s, replaceNode el)
+{
+  if (s->nspace <= 0)
+    replaceNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+/*@only@*/ cstring
+replaceNodeList_unparse (replaceNodeList s)
+{
+  bool first = TRUE;
+  cstring st = cstring_undefined;
+
+  replaceNodeList_elements (s, current)
+  {
+    if (first)
+      {
+	st = replaceNode_unparse (current);
+	first = FALSE;
+      }
+    else
+      {
+	st = message ("%q, %q", st, replaceNode_unparse (current));
+      }
+  } end_replaceNodeList_elements;
+
+  return st;
+}
+
+void
+replaceNodeList_free (replaceNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      replaceNode_free (s->elements[i]); 
+    }
+
+  sfree (s->elements); 
+  sfree (s);
+}
diff --git a/src/sRef.c b/src/sRef.c
new file mode 100644
index 0000000..9e862be
--- /dev/null
+++ b/src/sRef.c
@@ -0,0 +1,8972 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** storeRef.c
+**
+** Memory management:
+**    storeRef's are kept in allRefs for each function scope, and all are
+**    free'd at the end of the function.  This relies on the constraint that
+**    no storeRef created while checking a function is used outside that
+**    function.
+**
+**    storeRefs in the file and global scopes are free'd by the uentry.
+**
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "exprChecks.h"
+# include "aliasChecks.h"
+# include "sRefTable.h"
+# include "structNames.h"
+
+/*
+** Predicate functions that evaluate both arguments in order.
+*/
+
+/*@notfunction@*/
+# define OR(a,b)  (a ? (b, TRUE) : b)
+
+/*@notfunction@*/
+# define AND(a,b) (a ? b : (b, FALSE))
+
+static bool sRef_isDerived (sRef p_s) /*@*/ ;
+
+static /*@exposed@*/ sRef sRef_fixDirectBase (sRef p_s, sRef p_base) 
+   /*@modifies p_base@*/ ;
+
+static bool sRef_isAllocatedStorage (sRef p_s) /*@*/ ;
+static void sRef_setNullErrorLoc (sRef p_s, fileloc) /*@*/ ;
+
+static void
+  sRef_aliasSetComplete (void (p_predf) (sRef, fileloc), sRef p_s, fileloc p_loc)
+  /*@modifies p_s@*/ ;
+
+static int sRef_depth (sRef p_s) /*@*/ ;
+
+static void
+  sRef_innerAliasSetComplete (void (p_predf) (sRef, fileloc), sRef p_s, 
+			      fileloc p_loc)
+  /*@modifies p_s@*/ ;
+
+static void
+  sRef_innerAliasSetCompleteParam (void (p_predf) (sRef, sRef), sRef p_s, sRef p_t)
+  /*@modifies p_s@*/ ;
+
+static void
+  sRef_aliasSetCompleteParam (void (p_predf) (sRef, alkind, fileloc), sRef p_s, 
+			      alkind p_kind, fileloc p_loc)
+  /*@modifies p_s@*/ ;
+
+static speckind speckind_fromInt (int p_i);
+static bool sRef_equivalent (sRef p_s1, sRef p_s2);
+static bool sRef_isDeepUnionField (sRef p_s);
+static void sRef_addDeriv (/*@notnull@*/ sRef p_s, /*@notnull@*/ sRef p_t);
+static sRef sRef_makeResultType (ctype p_ct) /*@*/ ;
+static bool sRef_checkModify (sRef p_s, sRefSet p_sl) /*@*/ ;
+
+static bool skind_isSimple (skind sk)
+{
+  switch (sk)
+    {
+    case SK_PARAM: case SK_CVAR: case SK_CONST:
+    case SK_OBJECT: case SK_UNKNOWN: case SK_NEW:
+      return TRUE;
+    default:
+      return FALSE;
+    }
+}
+
+static void sinfo_free (/*@special@*/ /*@temp@*/ /*@notnull@*/ sRef p_s)
+   /*@uses p_s->kind, p_s->info@*/
+   /*@releases p_s->info@*/ ;
+
+static /*@null@*/ sinfo sinfo_copy (/*@notnull@*/ sRef p_s) /*@*/ ;
+static void sRef_setPartsFromUentry (sRef p_s, uentry p_ue)
+   /*@modifies p_s@*/ ;
+static bool checkDeadState (/*@notnull@*/ sRef p_el, bool p_tbranch, fileloc p_loc);
+static sRef sRef_constructPointerAux (/*@notnull@*/ /*@exposed@*/ sRef p_t) /*@*/ ;
+
+static void 
+  sRef_combineExKinds (/*@notnull@*/ sRef p_res, /*@notnull@*/ sRef p_other)
+  /*@modifies p_res@*/ ;
+
+static void 
+  sRef_combineAliasKinds (/*@notnull@*/ sRef p_res, /*@notnull@*/ sRef p_other, 
+			  clause p_cl, fileloc p_loc)
+  /*@modifies p_res@*/ ;
+
+static void
+  sRef_combineNullState (/*@notnull@*/ sRef p_res, /*@notnull@*/ sRef p_other)
+  /*@modifies p_res@*/ ;
+
+static void
+  sRef_combineDefState (/*@notnull@*/ sRef p_res, /*@notnull@*/ sRef p_other)
+  /*@modifies p_res@*/ ;
+
+static void sRef_setStateFromAbstractUentry (sRef p_s, uentry p_ue) 
+  /*@modifies p_s@*/ ;
+
+static void 
+  sinfo_update (/*@notnull@*/ /*@exposed@*/ sRef p_res, 
+		/*@notnull@*/ /*@exposed@*/ sRef p_other);
+static /*@only@*/ alinfo alinfo_makeRefLoc (/*@exposed@*/ sRef p_ref, fileloc p_loc);
+static void sRef_setDefinedAux (sRef p_s, fileloc p_loc, bool p_clear)
+   /*@modifies p_s@*/ ;
+static void sRef_setDefinedNoClear (sRef p_s, fileloc p_loc)
+   /*@modifies p_s@*/ ;
+static void sRef_setStateAux (sRef p_s, sstate p_ss, fileloc p_loc)
+   /*@modifies p_s@*/;
+
+static /*@exposed@*/ sRef 
+  sRef_buildNCField (/*@exposed@*/ sRef p_rec, /*@exposed@*/ cstring p_f);
+
+static void 
+  sRef_mergeStateAux (/*@notnull@*/ sRef p_res, /*@notnull@*/ sRef p_other, 
+		      clause p_cl, bool p_opt, fileloc p_loc,
+		      bool p_doDerivs)
+  /*@modifies p_res, p_other@*/ ;
+
+static /*@null@*/ sinfo sinfo_fullCopy (/*@notnull@*/ sRef p_s);
+static bool sRef_doModify (sRef p_s, sRefSet p_sl) /*@modifies p_s@*/ ;
+static bool sRef_doModifyVal (sRef p_s, sRefSet p_sl) /*@modifies p_s@*/;
+static bool sRef_checkModifyVal (sRef p_s, sRefSet p_sl) /*@*/ ;
+
+static /*@only@*/ sRefSet
+  sRef_mergeDerivs (/*@only@*/ sRefSet p_res, sRefSet p_other, 
+		    bool p_opt, clause p_cl, fileloc p_loc);
+
+static /*@only@*/ sRefSet
+  sRef_mergeUnionDerivs (/*@only@*/ sRefSet p_res, 
+			 /*@exposed@*/ sRefSet p_other,
+			 bool p_opt, clause p_cl, fileloc p_loc);
+
+static /*@only@*/ sRefSet 
+  sRef_mergePdefinedDerivs (/*@only@*/ sRefSet p_res, sRefSet p_other, bool p_opt,
+			    clause p_cl, fileloc p_loc);
+
+static /*@only@*/ cstring sRef_unparseWithArgs (sRef p_s, uentryList p_args);
+static /*@only@*/ cstring sRef_unparseNoArgs (sRef p_s);
+
+static /*@exposed@*/ sRef sRef_findDerivedPointer (sRef p_s);
+static /*@exposed@*/ sRef sRef_findDerivedField (/*@notnull@*/ sRef p_rec, cstring p_f);
+static /*@exposed@*/ sRef
+  sRef_getDeriv (/*@notnull@*/ /*@returned@*/ sRef p_set, sRef p_guide);
+
+static bool inFunction = FALSE;
+static /*@only@*/ sRefTable allRefs;
+
+/* # define DEBUGREFS  */
+
+# ifdef DEBUGREFS
+static nsrefs = 0;
+static totnsrefs = 0;
+static maxnsrefs = 0;
+static ntotrefers = 0;
+static nrefers = 0;
+# endif
+
+/*@constant null alinfo alinfo_undefined; @*/
+# define alinfo_undefined ((alinfo) NULL)
+
+static /*@only@*/ /*@notnull@*/ alinfo alinfo_makeLoc (fileloc p_loc);
+static /*@only@*/ alinfo alinfo_copy (alinfo p_a);
+
+static /*@checked@*/ bool protectDerivs = FALSE;
+
+void sRef_protectDerivs (void) /*@modifies protectDerivs@*/
+{
+  llassert (!protectDerivs);
+  protectDerivs = TRUE;
+}
+
+void sRef_clearProtectDerivs (void) /*@modifies protectDerivs@*/
+{
+  llassert (protectDerivs);
+  protectDerivs = FALSE;
+}
+
+/*
+** hmmm...here be kind of a hack.  This function mysteriously appeared
+** in my code, but I'm sure I didn't write it.
+*/
+
+bool
+sRef_isRecursiveField (sRef s)
+{
+  if (sRef_isField (s))
+    {
+      if (sRef_depth (s) > 13)
+	{
+	  sRef base;
+	  cstring fieldname;
+	  
+	  fieldname = sRef_getField (s);
+	  base = sRef_getBase (s);
+	  
+	  while (sRef_isValid (base))
+	    {
+	      if (sRef_isField (base))
+		{
+		  if (cstring_equal (fieldname, sRef_getField (base)))
+		    {
+		      return TRUE;
+		    }
+		}
+	      
+	      base = sRef_getBaseSafe (base);
+	    }
+	}
+    }
+
+  return FALSE;
+}
+
+static void
+sRef_addDeriv (/*@notnull@*/ sRef s, /*@notnull@*/ sRef t)
+{
+  if (!context_inProtectVars () 
+      && !protectDerivs
+      && sRef_isValid (s)
+      && sRef_isValid (t)
+      && !sRef_isConst (s))
+    {
+      int sd = sRef_depth (s);
+      int td = sRef_depth (t);
+      
+      if (sd >= td)
+	{
+	  return;
+	}
+
+      if (sRef_isGlobal (s))
+	{
+	  if (context_inFunctionLike () 
+	      && ctype_isKnown (sRef_getType (s))
+	      && !ctype_isFunction (sRef_getType (s)))
+	    {
+	      globSet g = context_getUsedGlobs ();
+
+	      if (!globSet_member (g, s))
+		{
+		  /* 
+		  ** don't report as a bug 
+		  ** 
+
+		  llcontbug 
+			(message ("sRef_addDeriv: global variable not in used "
+				  "globs: %q / %s / %q",
+				  sRef_unparse (s), 
+				  ctype_unparse (sRef_getType (s)),
+				  sRefSet_unparse (s->deriv)));
+		  */
+		}
+	      else
+		{
+		  s->deriv = sRefSet_insert (s->deriv, t);
+		}
+	    }
+	}
+      else
+	{
+	  s->deriv = sRefSet_insert (s->deriv, t);
+	}
+    }
+}
+
+bool
+sRef_deepPred (bool (predf) (sRef), sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      if ((*predf)(s)) return TRUE;
+
+      switch  (s->kind)
+	{
+	case SK_PTR:
+	  return (sRef_deepPred (predf, s->info->ref));
+	case SK_ARRAYFETCH:
+	  return (sRef_deepPred (predf, s->info->arrayfetch->arr));
+	case SK_FIELD:
+	  return (sRef_deepPred (predf, s->info->field->rec));
+	case SK_CONJ:
+	  return (sRef_deepPred (predf, s->info->conj->a)
+		  || sRef_deepPred (predf, s->info->conj->b));
+	default:
+	  return FALSE;
+	}
+    }
+
+  return FALSE;
+}
+
+bool sRef_modInFunction (void)
+{
+  return inFunction;
+}
+
+void sRef_setStateFromType (sRef s, ctype ct)
+{
+  if (sRef_isValid (s))
+    {
+      if (ctype_isUser (ct))
+	{
+	  sRef_setStateFromUentry 
+	    (s, usymtab_getTypeEntry (ctype_typeId (ct)));
+	}
+      else if (ctype_isAbstract (ct))
+	{
+	  sRef_setStateFromAbstractUentry 
+	    (s, usymtab_getTypeEntry (ctype_typeId (ct)));
+	}
+      else
+	{
+	  ; /* not a user type */
+	}
+    }
+}
+
+static void sRef_setTypeState (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      sRef_setStateFromType (s, s->type);
+    }
+}
+
+static void alinfo_free (/*@only@*/ alinfo a)
+{
+  if (a != NULL)
+    {
+      fileloc_free (a->loc);
+      sfree (a);
+    }
+}
+
+static /*@only@*/ alinfo alinfo_update (/*@only@*/ alinfo old, alinfo newinfo)
+/*
+** returns an alinfo with the same value as new.  May reuse the
+** storage of old.  (i.e., same effect as copy, but more
+** efficient.)
+*/
+{
+  if (old == NULL) 
+    {
+      old = alinfo_copy (newinfo);
+    }
+  else if (newinfo == NULL)
+    {
+      alinfo_free (old);
+      return NULL;
+    }
+  else
+    {
+      old->loc = fileloc_update (old->loc, newinfo->loc);
+      old->ref = newinfo->ref;
+      old->ue = newinfo->ue;
+    }
+
+  return old;
+}
+
+static /*@only@*/ alinfo alinfo_updateLoc (/*@only@*/ alinfo old, fileloc loc)
+{
+  if (old == NULL) 
+    {
+      old = alinfo_makeLoc (loc);
+    }
+  else
+    {
+      old->loc = fileloc_update (old->loc, loc);
+      old->ue = uentry_undefined;
+      old->ref = sRef_undefined;
+    }
+
+  return old;
+}
+
+static /*@only@*/ alinfo 
+  alinfo_updateRefLoc (/*@only@*/ alinfo old, /*@dependent@*/ sRef ref, fileloc loc)
+{
+  if (old == NULL) 
+    {
+      old = alinfo_makeRefLoc (ref, loc);
+    }
+  else
+    {
+      old->loc = fileloc_update (old->loc, loc);
+      old->ue = uentry_undefined;
+      old->ref = ref;
+    }
+
+  return old;
+}
+
+static /*@only@*/ alinfo
+alinfo_copy (alinfo a)
+{
+  if (a == NULL)
+    {
+      return NULL;
+    }
+  else
+    {
+      alinfo ret = (alinfo) dmalloc (sizeof (*ret));
+      
+      ret->loc = fileloc_copy (a->loc); /*< should report bug without copy! >*/
+      ret->ue = a->ue;
+      ret->ref = a->ref;
+
+      return ret;
+    }
+}
+
+static bool
+  sRef_hasAliasInfoLoc (sRef s)
+{
+  return (sRef_isValid (s) && (s->aliasinfo != NULL)
+	  && (fileloc_isDefined (s->aliasinfo->loc)));
+}
+
+static /*@falsenull@*/ bool
+sRef_hasStateInfoLoc (sRef s)
+{
+  return (sRef_isValid (s) && (s->definfo != NULL) 
+	  && (fileloc_isDefined (s->definfo->loc)));
+}
+
+static /*@falsenull@*/ bool
+sRef_hasExpInfoLoc (sRef s)
+{
+  return (sRef_isValid (s) 
+	  && (s->expinfo != NULL) && (fileloc_isDefined (s->expinfo->loc)));
+}
+
+static bool
+sRef_hasNullInfoLoc (sRef s)
+{
+  return (sRef_isValid (s) && (s->nullinfo != NULL) 
+	  && (fileloc_isDefined (s->nullinfo->loc)));
+}
+
+bool
+sRef_hasAliasInfoRef (sRef s)
+{
+  return (sRef_isValid (s) && (s->aliasinfo != NULL) 
+	  && (sRef_isValid (s->aliasinfo->ref)));
+}
+
+static /*@observer@*/ fileloc
+sRef_getAliasInfoLoc (/*@exposed@*/ sRef s)
+{
+  llassert (sRef_isValid (s) && s->aliasinfo != NULL
+	    && (fileloc_isDefined (s->aliasinfo->loc)));
+  return (s->aliasinfo->loc);
+}
+
+static /*@observer@*/ fileloc
+sRef_getStateInfoLoc (/*@exposed@*/ sRef s)
+{
+  llassert (sRef_isValid (s) && s->definfo != NULL 
+	    && (fileloc_isDefined (s->definfo->loc)));
+  return (s->definfo->loc);
+}
+
+static /*@observer@*/ fileloc
+sRef_getExpInfoLoc (/*@exposed@*/ sRef s)
+{
+  llassert (sRef_isValid (s) && s->expinfo != NULL 
+	    && (fileloc_isDefined (s->expinfo->loc)));
+  return (s->expinfo->loc);
+}
+
+static /*@observer@*/ fileloc
+sRef_getNullInfoLoc (/*@exposed@*/ sRef s)
+{
+  llassert (sRef_isValid (s) && s->nullinfo != NULL 
+	    && (fileloc_isDefined (s->nullinfo->loc)));
+  return (s->nullinfo->loc);
+}
+
+/*@observer@*/ sRef
+  sRef_getAliasInfoRef (/*@exposed@*/ sRef s)
+{
+  llassert (sRef_isValid (s) && s->aliasinfo != NULL);
+  return (s->aliasinfo->ref);
+}
+
+static /*@only@*/ /*@notnull@*/ alinfo
+alinfo_makeLoc (fileloc loc)
+{
+  alinfo ret = (alinfo) dmalloc (sizeof (*ret));
+
+  ret->loc = fileloc_copy (loc); /* don't need to copy! */
+  ret->ue = uentry_undefined;
+  ret->ref = sRef_undefined;
+  
+  return ret;
+}
+
+static /*@only@*/ alinfo
+alinfo_makeRefLoc (/*@exposed@*/ sRef ref, fileloc loc)
+{
+  alinfo ret = (alinfo) dmalloc (sizeof (*ret));
+
+  ret->loc = fileloc_copy (loc);
+  ret->ref = ref;
+  ret->ue  = uentry_undefined;
+  
+  return ret;
+}
+
+/*
+** This function should be called before new sRefs are created
+** somewhere where they will have a lifetime greater than the
+** current function scope.
+*/
+
+void sRef_setGlobalScope ()
+{
+  llassert (inFunction);
+  inFunction = FALSE;
+}
+
+void sRef_clearGlobalScope ()
+{
+  llassert (!inFunction);
+  inFunction = TRUE;
+}
+
+static bool oldInFunction = FALSE;
+
+void sRef_setGlobalScopeSafe ()
+{
+    oldInFunction = inFunction;
+  inFunction = FALSE;
+}
+
+void sRef_clearGlobalScopeSafe ()
+{
+    inFunction = oldInFunction;
+}
+
+void sRef_enterFunctionScope ()
+{
+  llassert (!inFunction);
+  llassert (sRefTable_isEmpty (allRefs));
+  inFunction = TRUE;
+}
+
+void sRef_exitFunctionScope ()
+{
+  
+  if (inFunction)
+    {
+      sRefTable_clear (allRefs);
+      inFunction = FALSE;
+    }
+  else
+    {
+      llbuglit ("sRef_exitFunctionScope: not in function");
+    }
+}
+  
+void sRef_destroyMod () /*@globals killed allRefs;@*/
+{
+# ifdef DEBUGREFS  
+  llmsg (message ("Live: %d / %d ", nsrefs, totnsrefs));  
+# endif
+
+  sRefTable_free (allRefs);
+}
+
+/*
+** Result of sRef_alloc is dependent since allRefs may
+** reference it.  It is only if !inFunction.
+*/
+
+static /*@dependent@*/ /*@out@*/ /*@notnull@*/ sRef
+sRef_alloc (void)
+{
+  sRef s = (sRef) dmalloc (sizeof (*s));
+
+  if (inFunction)
+    {
+      allRefs = sRefTable_add (allRefs, s);
+      /*@-branchstate@*/ 
+    } 
+  /*@=branchstate@*/
+
+# ifdef DEBUGREFS
+  if (nsrefs >= maxnsrefs)
+    {
+      maxnsrefs = nsrefs;
+    }
+
+  totnsrefs++;
+  nsrefs++;
+# endif
+
+  /*@-mustfree@*/ /*@-freshtrans@*/
+  return s;
+  /*@=mustfree@*/ /*@=freshtrans@*/
+}
+
+static /*@dependent@*/ /*@notnull@*/ /*@special@*/ sRef
+  sRef_new (void)
+  /*@defines result@*/
+  /*@post:isnull result->aliasinfo, result->definfo, result->nullinfo, 
+                 result->expinfo, result->info, result->deriv@*/
+{
+  sRef s = sRef_alloc ();
+
+  s->kind = SK_UNKNOWN;
+  s->safe = TRUE;
+  s->modified = FALSE;
+  s->type = ctype_unknown;
+  s->defstate = SS_UNKNOWN;
+
+  s->aliaskind = AK_UNKNOWN;
+  s->oaliaskind = AK_UNKNOWN;
+
+  s->nullstate = NS_UNKNOWN;
+
+  s->expkind = XO_UNKNOWN;
+  s->oexpkind = XO_UNKNOWN;
+
+  s->aliasinfo = alinfo_undefined;
+  s->definfo = alinfo_undefined;
+  s->nullinfo = alinfo_undefined;
+  s->expinfo = alinfo_undefined;
+
+  s->info = NULL;
+  s->deriv = sRefSet_undefined;
+
+  return s;
+}
+
+static /*@notnull@*/ /*@exposed@*/ sRef
+sRef_fixConj (/*@notnull@*/ sRef s)
+{
+  if (sRef_isConj (s))
+    {
+      do {
+	s = sRef_getConjA (s);
+      } while (sRef_isConj (s));
+      
+      llassert (sRef_isValid (s));
+      return s; /* don't need to ref */
+    }
+  else
+    {
+      return s;
+    }
+}
+
+static bool 
+sRef_isExternallyVisibleAux (sRef s)
+{
+  bool res = FALSE;
+  sRef base = sRef_getRootBase (s);
+
+  if (sRef_isValid (base))
+    {
+      res = sRef_isParam (base) || sRef_isGlobal (base) || sRef_isExternal (base);
+    }
+
+  return res;
+}
+
+bool 
+  sRef_isExternallyVisible (sRef s)
+{
+  return (sRef_aliasCheckSimplePred (sRef_isExternallyVisibleAux, s));
+}
+
+/*@exposed@*/ uentry
+sRef_getBaseUentry (sRef s)
+{
+  sRef base = sRef_getRootBase (s);
+  uentry res = uentry_undefined;
+  
+  if (sRef_isValid (base))
+    {
+      switch (base->kind)
+	{
+	case SK_PARAM:
+	  res = usymtab_getRefQuiet (paramsScope, base->info->paramno);
+	  break;
+
+	case SK_CVAR:
+	  res = usymtab_getRefQuiet (base->info->cvar->lexlevel, 
+				     base->info->cvar->index);
+	  break;
+
+	default:
+	  break;
+	}  
+    }
+
+  return res;
+}
+
+/*
+** lookup the current uentry corresponding to s, and return the corresponding sRef.
+** yuk yuk yuk yuk yuk yuk yuk yuk
+*/
+
+/*@exposed@*/ sRef
+sRef_updateSref (sRef s)
+{
+  sRef inner;
+  sRef ret;
+  sRef res;
+
+  if (!sRef_isValid (s)) return sRef_undefined;
+
+  
+  switch (s->kind)
+    {
+    case SK_UNKNOWN:
+    case SK_OBJECT:
+    case SK_NEW:
+    case SK_TYPE:
+    case SK_EXTERNAL:
+    case SK_DERIVED:
+    case SK_UNCONSTRAINED:
+    case SK_CONST:
+    case SK_SPECIAL:
+    case SK_RESULT:
+      return s; 
+    case SK_PARAM:
+    case SK_CVAR:
+      {
+	uentry ue = sRef_getUentry (s);
+
+	/* must be raw name!  (need the marker) */
+	ue = usymtab_lookupSafe (uentry_rawName (ue));
+	
+	if (uentry_isUndefined (ue))
+	  {
+	    	    return s;
+	  }
+	else
+	  {
+	    	    return (uentry_getSref (ue));
+	  }
+      }
+    case SK_ARRAYFETCH:
+      /* special case if ind known */
+      inner = s->info->arrayfetch->arr;
+      ret = sRef_updateSref (inner);
+
+      if (ret == inner) 
+	{
+	  res = s; 
+	}
+      else 
+	{
+	  res = sRef_makeArrayFetch (ret);
+	}
+
+      return res;
+
+    case SK_FIELD:
+      inner = s->info->field->rec;
+      ret = sRef_updateSref (inner);
+
+      if (ret == inner) 
+	{
+	  res = s; 
+	}
+      else 
+	{
+	  res = (sRef_makeField (ret, s->info->field->field));
+	}
+
+      return (res);
+    case SK_PTR:
+      inner = s->info->ref;
+      ret = sRef_updateSref (inner);
+      if (ret == inner) 
+	{
+	  res = s; 
+	}
+      else
+	{
+	  res = sRef_makePointer (ret);
+	}
+
+      return (res);
+
+    case SK_ADR:
+      inner = s->info->ref;
+      ret = sRef_updateSref (inner);
+
+      if (ret == inner)
+	{
+	  res = s; 
+	}
+      else 
+	{
+	  res = sRef_makeAddress (ret);
+	}
+
+      return (res);
+
+    case SK_CONJ:
+      {
+	sRef innera = s->info->conj->a;
+	sRef innerb = s->info->conj->b;
+	sRef reta = sRef_updateSref (innera);
+	sRef retb = sRef_updateSref (innerb);
+
+	if (innera == reta && innerb == retb)
+	  {
+	    res = s;
+	  }
+	else 
+	  {
+	    res = sRef_makeConj (reta, retb);
+	  }
+
+	return (res);
+      }
+    }
+  
+  BADEXIT;
+}
+
+uentry
+sRef_getUentry (sRef s)
+{
+  llassert (sRef_isValid (s));
+
+  switch (s->kind)
+    {
+    case SK_PARAM:
+      return (usymtab_getRefQuiet (paramsScope, s->info->paramno));
+    case SK_CVAR:
+      return (usymtab_getRefQuiet (s->info->cvar->lexlevel, s->info->cvar->index));
+    case SK_CONJ:
+      {
+	if (sRef_isCvar (s->info->conj->a) || sRef_isParam (s->info->conj->a)
+	    || sRef_isConj (s->info->conj->a))
+	  {
+	    return sRef_getUentry (s->info->conj->a);
+	  }
+	else 
+	  {
+	    return sRef_getUentry (s->info->conj->b);
+	  }
+      }
+    case SK_UNKNOWN:
+    case SK_SPECIAL:
+      return uentry_undefined;
+    BADDEFAULT;
+    }
+}
+
+int
+sRef_getParam (sRef s)
+{
+  llassert (sRef_isValid (s));
+  llassert (s->kind == SK_PARAM);
+
+  return s->info->paramno;
+}
+
+bool
+sRef_isModified (sRef s)
+{
+    return (!sRef_isValid (s) || s->modified);
+}
+
+void sRef_setModified (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      s->modified = TRUE;
+
+      
+      if (sRef_isRefsField (s))
+	{
+	  sRef base = sRef_getBase (s);
+
+	  
+	  llassert (s->kind == SK_FIELD);
+
+	  
+	  if (sRef_isPointer (base))
+	    {
+	      base = sRef_getBase (base);
+	      	    }
+
+	  if (sRef_isRefCounted (base))
+	    {
+	      base->aliaskind = AK_NEWREF;
+	      	    }
+	}
+
+          }
+}
+
+/*
+** note: this side-effects sRefSet to set modified to TRUE
+** for any sRef similar to s.
+*/
+
+bool
+sRef_canModifyVal (sRef s, sRefSet sl)
+{
+  if (context_getFlag (FLG_MUSTMOD))
+    {
+      return (sRef_doModifyVal (s, sl));
+    }
+  else
+    {
+      return (sRef_checkModifyVal (s, sl));
+    }
+}
+
+bool
+sRef_canModify (sRef s, sRefSet sl)
+{
+  
+  if (context_getFlag (FLG_MUSTMOD))
+    {
+      return (sRef_doModify (s, sl));
+    }
+  else
+    {
+      return (sRef_checkModify (s, sl));
+    }
+}
+
+/*
+** No side-effects
+*/
+
+static
+bool sRef_checkModifyVal (sRef s, sRefSet sl)
+{
+  if (sRef_isInvalid (s))
+    {
+      return TRUE;
+    }
+  
+  switch (s->kind)
+    {
+    case SK_UNCONSTRAINED:
+    case SK_CONST:
+      return TRUE;
+    case SK_CVAR:
+      if (sRef_isGlobal (s))
+	{
+	  if (context_checkGlobMod (s))
+	    {
+	      return (sRefSet_member (sl, s));
+	    }
+
+	  return TRUE;
+	}
+      else
+	{
+	  return TRUE;
+	}
+    case SK_PARAM:
+            return (sRefSet_member (sl, s) 
+	      || alkind_isOnly (sRef_getOrigAliasKind (s)));
+    case SK_ARRAYFETCH: 
+      /* special case if ind known */
+      return (sRefSet_member (sl, s) ||
+	      sRef_checkModifyVal (s->info->arrayfetch->arr, sl));
+    case SK_FIELD:
+      return (sRefSet_member (sl, s) || sRef_checkModifyVal (s->info->field->rec, sl));
+    case SK_PTR:
+      return (sRefSet_member (sl, s) || sRef_checkModifyVal (s->info->ref, sl));
+    case SK_ADR:
+      return (sRefSet_member (sl, s) || sRef_checkModifyVal (s->info->ref, sl));
+    case SK_CONJ:
+      return ((sRef_checkModifyVal (s->info->conj->a, sl)) &&
+	      (sRef_checkModifyVal (s->info->conj->b, sl)));
+    case SK_UNKNOWN:
+    case SK_OBJECT:
+    case SK_NEW:
+    case SK_TYPE:
+    case SK_DERIVED:
+      return TRUE;
+    case SK_EXTERNAL:
+      return TRUE;
+    case SK_SPECIAL:
+      {
+	switch (s->info->spec)
+	  {
+	  case SR_NOTHING:   return TRUE;
+	  case SR_INTERNAL:  
+	    if (context_getFlag (FLG_INTERNALGLOBS))
+	      {
+		return (sRefSet_member (sl, s));
+	      }
+	    else
+	      {
+		return TRUE;
+	      }
+	  case SR_SPECSTATE: return TRUE;
+	  case SR_SYSTEM:    return (sRefSet_member (sl, s));
+	  }
+      }
+    case SK_RESULT: BADBRANCH;
+    }
+  BADEXIT;
+}
+
+/*
+** this should probably be elsewhere...
+**
+** returns TRUE iff sl indicates that s can be modified
+*/
+
+static bool sRef_checkModify (sRef s, sRefSet sl)
+{
+  llassert (sRef_isValid (s));
+
+  switch (s->kind)
+    {
+    case SK_UNCONSTRAINED:
+    case SK_CONST:
+      return TRUE;
+    case SK_CVAR:
+      if (sRef_isGlobal (s))
+	{
+	  if (context_checkGlobMod (s))
+	    {
+	      return (sRefSet_member (sl, s));
+	    }
+
+	  return TRUE;
+	}
+      else
+	{
+	  return TRUE;
+	}
+    case SK_PARAM:
+      return TRUE;
+    case SK_ARRAYFETCH:
+      return (sRefSet_member (sl, s) ||
+	      sRef_checkModifyVal (s->info->arrayfetch->arr, sl));
+    case SK_FIELD:
+      {
+	sRef sr = s->info->field->rec;
+
+	if (sr->kind == SK_PARAM)
+	  return TRUE; /* structs are copied on call */
+
+	return (sRefSet_member (sl, s) || sRef_checkModifyVal (s->info->field->rec, sl));
+      }
+    case SK_PTR:
+      {
+	bool sm;
+
+	sm = sRefSet_member (sl, s);
+
+	if (sm)
+	  return TRUE;
+	else
+	  return (sRef_checkModifyVal (s->info->ref, sl));
+      }
+    case SK_ADR:
+      return (sRefSet_member (sl, s) || sRef_checkModifyVal (s->info->ref, sl));
+    case SK_CONJ:
+      return ((sRef_checkModify (s->info->conj->a, sl)) &&
+	      (sRef_checkModify (s->info->conj->b, sl)));
+    case SK_NEW:
+    case SK_OBJECT:
+    case SK_UNKNOWN:
+    case SK_TYPE:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+      return TRUE;
+    case SK_SPECIAL:
+      {
+	switch (s->info->spec)
+	  {
+	  case SR_NOTHING:   return TRUE;
+	  case SR_INTERNAL:  
+	    if (context_getFlag (FLG_INTERNALGLOBS))
+	      {
+		return (sRefSet_member (sl, s));
+	      }
+	    else
+	      {
+		return TRUE;
+	      }
+	  case SR_SPECSTATE: return TRUE;
+	  case SR_SYSTEM:    return (sRefSet_member (sl, s));
+	  }
+      }
+    case SK_RESULT: BADBRANCH;
+    }
+  BADEXIT;
+}
+
+cstring sRef_stateVerb (sRef s)
+{
+  if (sRef_isDead (s))
+    {
+      return cstring_makeLiteralTemp ("released");
+    }
+  else if (sRef_isKept (s))
+    {
+      return cstring_makeLiteralTemp ("kept");
+    }
+  else if (sRef_isDependent (s))
+    {
+      return cstring_makeLiteralTemp ("dependent");
+    }
+  else
+    {
+      BADEXIT;
+    }
+}
+
+cstring sRef_stateAltVerb (sRef s)
+{
+  if (sRef_isDead (s))
+    {
+      return cstring_makeLiteralTemp ("live");
+    }
+  else if (sRef_isKept (s))
+    {
+      return cstring_makeLiteralTemp ("not kept");
+    }
+  else if (sRef_isDependent (s))
+    {
+      return cstring_makeLiteralTemp ("independent");
+    }
+  else
+    {
+      BADEXIT;
+    }
+}
+
+static 
+bool sRef_doModifyVal (sRef s, sRefSet sl)
+{
+  llassert (sRef_isValid (s));
+
+  
+  switch (s->kind)
+    {
+    case SK_UNCONSTRAINED:
+    case SK_CONST:
+      return TRUE;
+    case SK_CVAR:
+      if (sRef_isGlobal (s))
+	{
+	  
+	  if (context_checkGlobMod (s))
+	    {
+	      return (sRefSet_modifyMember (sl, s));
+	    }
+	  else
+	    {
+	      (void) sRefSet_modifyMember (sl, s);
+	    }
+
+	  	  return TRUE;
+	}
+      else
+	{
+	  return TRUE;
+	}      
+    case SK_PARAM:
+      return (sRefSet_modifyMember (sl, s) 
+	      || alkind_isOnly (sRef_getOrigAliasKind (s)));
+    case SK_ARRAYFETCH:
+      /* special case if ind known */
+      /* unconditional OR, need side effect */
+      return (OR (sRefSet_modifyMember (sl, s),
+		  sRef_doModifyVal (s->info->arrayfetch->arr, sl)));
+    case SK_FIELD:
+      return (OR (sRefSet_modifyMember (sl, s),
+		  sRef_doModifyVal (s->info->field->rec, sl)));
+    case SK_PTR:
+      return (OR (sRefSet_modifyMember (sl, s),
+		  sRef_doModifyVal (s->info->ref, sl)));
+    case SK_ADR:
+      return (OR (sRefSet_modifyMember (sl, s),
+		  sRef_doModifyVal (s->info->ref, sl)));
+    case SK_CONJ:
+      return (AND (sRef_doModifyVal (s->info->conj->a, sl) ,
+		   sRef_doModifyVal (s->info->conj->b, sl)));
+    case SK_OBJECT:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+    case SK_UNKNOWN:
+    case SK_NEW:
+    case SK_TYPE:
+      return TRUE;
+    case SK_SPECIAL:
+      {
+	switch (s->info->spec)
+	  {
+	  case SR_NOTHING:   return TRUE;
+	  case SR_INTERNAL:  
+	    if (context_getFlag (FLG_INTERNALGLOBS))
+	      {
+		return (sRefSet_modifyMember (sl, s));
+	      }
+	    else
+	      {
+		(void) sRefSet_modifyMember (sl, s);
+		return TRUE;
+	      }
+	  case SR_SPECSTATE: 
+	    {
+	      return TRUE;
+	    }
+	  case SR_SYSTEM:
+	    {
+	      return (sRefSet_modifyMember (sl, s));
+	    }
+	  }
+      }
+    case SK_RESULT: BADBRANCH;
+    }
+  BADEXIT;
+}
+
+/*
+** this should probably be elsewhere...
+**
+** returns TRUE iff sl indicates that s can be modified
+*/
+
+static 
+bool sRef_doModify (sRef s, sRefSet sl)
+{
+    llassert (sRef_isValid (s));
+  
+  switch (s->kind)
+    {
+    case SK_UNCONSTRAINED:
+    case SK_CONST:
+      return TRUE;
+    case SK_CVAR:
+      if (sRef_isGlobal (s))
+	{
+	  if (context_checkGlobMod (s))
+	    {
+	      return (sRefSet_modifyMember (sl, s));
+	    }
+	  else
+	    {
+	      (void) sRefSet_modifyMember (sl, s);
+	    }
+
+	  return TRUE;
+	}
+      else
+	{
+	  return TRUE;
+	}
+    case SK_PARAM:
+      return TRUE;
+    case SK_ARRAYFETCH:
+            return (OR (sRefSet_modifyMember (sl, s),
+		  sRef_doModifyVal (s->info->arrayfetch->arr, sl)));
+    case SK_FIELD:
+      {
+	sRef sr = s->info->field->rec;
+
+	if (sr->kind == SK_PARAM)
+	  {
+	    return TRUE; /* structs are shallow-copied on call */
+	  }
+	
+	return (OR (sRefSet_modifyMember (sl, s),
+		    sRef_doModifyVal (s->info->field->rec, sl)));
+      }
+    case SK_PTR:
+      {
+	return (OR (sRefSet_modifyMember (sl, s),
+		    sRef_doModifyVal (s->info->ref, sl)));
+      }
+    case SK_ADR:
+      return (OR (sRefSet_modifyMember (sl, s),
+		  sRef_doModifyVal (s->info->ref, sl)));
+    case SK_CONJ:
+      return (AND (sRef_doModify (s->info->conj->a, sl),
+		  (sRef_doModify (s->info->conj->b, sl))));
+    case SK_UNKNOWN:
+    case SK_NEW:
+    case SK_TYPE:
+      return TRUE;
+    case SK_OBJECT:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+      return TRUE;
+    case SK_SPECIAL:
+      {
+	switch (s->info->spec)
+	  {
+	  case SR_NOTHING:   return TRUE;
+	  case SR_INTERNAL:  return TRUE;
+	  case SR_SPECSTATE: return TRUE;
+	  case SR_SYSTEM:    return (sRefSet_modifyMember (sl, s));
+	  }
+      }
+    case SK_RESULT: BADBRANCH;
+    }
+  BADEXIT;
+}
+
+static /*@exposed@*/ sRef
+  sRef_leastCommon (/*@exposed@*/ sRef s1, sRef s2)
+{
+  llassert (sRef_similar (s1, s2));
+  
+  if (!sRef_isValid (s1)) return s1;
+  if (!sRef_isValid (s2)) return s1;
+
+  sRef_combineDefState (s1, s2);
+  sRef_combineNullState (s1, s2);
+  sRef_combineExKinds (s1, s2);
+  
+  if (s1->aliaskind != s2->aliaskind)
+    {
+      if (s1->aliaskind == AK_UNKNOWN)
+	{
+	  s1->aliaskind = s2->aliaskind;
+	}
+      else if (s2->aliaskind == AK_UNKNOWN)
+	{
+	  ;
+	}
+      else
+	{
+	  s1->aliaskind = AK_ERROR;
+	}
+    }
+
+  return s1;
+}
+
+int sRef_compare (sRef s1, sRef s2)
+{
+  if (s1 == s2) return 0;
+
+  if (sRef_isInvalid (s1)) return -1;
+  if (sRef_isInvalid (s2)) return 1;
+      
+  INTCOMPARERETURN (s1->kind, s2->kind);
+  INTCOMPARERETURN (s1->defstate, s2->defstate);
+  INTCOMPARERETURN (s1->aliaskind, s2->aliaskind);
+
+  COMPARERETURN (nstate_compare (s1->nullstate, s2->nullstate));
+
+  switch (s1->kind)
+    {
+    case SK_PARAM:
+      return (int_compare (s1->info->paramno, s2->info->paramno));
+    case SK_ARRAYFETCH:
+      {
+	COMPARERETURN (sRef_compare (s1->info->arrayfetch->arr, 
+				     s2->info->arrayfetch->arr));
+	
+	if (s1->info->arrayfetch->indknown && s2->info->arrayfetch->indknown)
+	  {
+	    return (int_compare (s1->info->arrayfetch->ind, 
+				 s2->info->arrayfetch->ind));
+	  }
+	if (!s1->info->arrayfetch->indknown && !s2->info->arrayfetch->indknown)
+	  return 0;
+	
+	return 1;
+      }
+    case SK_FIELD:
+      {
+	COMPARERETURN (sRef_compare (s1->info->field->rec, s2->info->field->rec));
+	
+	if (cstring_equal (s1->info->field->field, s2->info->field->field))
+	  return 0;
+
+	return 1;
+      }
+    case SK_PTR:
+    case SK_ADR:
+      return (sRef_compare (s1->info->ref, s2->info->ref));
+    case SK_CONJ:
+      COMPARERETURN (sRef_compare (s1->info->conj->a, s2->info->conj->a));
+      return (sRef_compare (s1->info->conj->b, s2->info->conj->b));
+    case SK_UNCONSTRAINED:
+      return (cstring_compare (s1->info->fname, s2->info->fname));
+    case SK_NEW:
+    case SK_CVAR:
+    case SK_UNKNOWN:
+    case SK_OBJECT:
+    case SK_TYPE:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+    case SK_CONST:
+    case SK_RESULT:
+      return 0;
+    case SK_SPECIAL:
+      return (generic_compare (s1->info->spec, s2->info->spec));
+    }
+  BADEXIT;
+}
+
+static bool cref_equal (cref c1, cref c2)
+{
+  return ((c1->lexlevel == c2->lexlevel) &&
+	  (usymId_equal (c1->index, c2->index)));
+}
+
+/*
+** returns true if s1 could be the same storage as s2.
+** i.e., a[?] ~ a[3].  Note its not symmetric ... s1
+** should be more specific.
+*/
+
+/*
+** like similar, but matches objects <-> non-objects
+*/
+
+static bool 
+sRef_uniqueReference (sRef s)
+{
+  return (sRef_isFresh (s) || sRef_isUnique (s) 
+	  || sRef_isOnly (s) || sRef_isStack (s)
+	  || sRef_isAddress (s)); 
+}
+
+static bool
+sRef_similarRelaxedAux (sRef s1, sRef s2)
+{
+  if (s1 == s2)
+    {
+      if (sRef_isUnknownArrayFetch (s1))
+	{
+	  return FALSE;
+	}
+      else
+	{
+	  return TRUE;
+	}
+    }
+
+  if (sRef_isInvalid (s1) || sRef_isInvalid (s2)) return FALSE;
+
+  if (sRef_isConj (s2)) 
+    return (sRef_similarRelaxedAux (s1, sRef_getConjA (s2)) ||
+	    sRef_similarRelaxedAux (s1, sRef_getConjB (s2)));
+
+  switch (s1->kind)
+    {
+    case SK_CVAR:
+      return ((s2->kind == SK_CVAR)
+	      && (cref_equal (s1->info->cvar, s2->info->cvar)));
+    case SK_PARAM:
+      return ((s2->kind == SK_PARAM)
+	      && (s1->info->paramno == s2->info->paramno));
+    case SK_ARRAYFETCH:
+      if (s2->kind == SK_ARRAYFETCH)
+	{
+	  if (sRef_similarRelaxedAux (s1->info->arrayfetch->arr,
+				      s2->info->arrayfetch->arr))
+	    {
+	      if (s1->info->arrayfetch->indknown)
+		{
+		  if (s2->info->arrayfetch->indknown)
+		    {
+		      return (s1->info->arrayfetch->ind == s2->info->arrayfetch->ind);
+		    }
+		  else 
+		    {
+		      return FALSE;
+		    }
+		}
+	      else
+		{
+		  return FALSE;
+		}
+	    }
+	}
+      return FALSE;
+    case SK_FIELD:
+      return ((s2->kind == SK_FIELD
+	       && (sRef_similarRelaxedAux (s1->info->field->rec,
+					   s2->info->field->rec)
+		   && cstring_equal (s1->info->field->field,
+				     s2->info->field->field))));
+    case SK_PTR:
+      return ((s2->kind == SK_PTR)
+	      && sRef_similarRelaxedAux (s1->info->ref, s2->info->ref));
+    case SK_ADR:
+      return ((s2->kind == SK_ADR)
+	      && sRef_similarRelaxedAux (s1->info->ref, s2->info->ref));
+    case SK_CONJ:
+      return ((sRef_similarRelaxedAux (s1->info->conj->a, s2) ||
+	      (sRef_similarRelaxedAux (s1->info->conj->b, s2))));
+    case SK_SPECIAL:
+      return (s1->info->spec == s2->info->spec);
+    case SK_UNCONSTRAINED:
+      return (cstring_equal (s1->info->fname, s2->info->fname));
+    case SK_DERIVED:
+    case SK_CONST:
+    case SK_TYPE:
+    case SK_NEW:
+    case SK_UNKNOWN:
+    case SK_OBJECT:
+    case SK_EXTERNAL:
+    case SK_RESULT:
+      return FALSE;
+    }
+  BADEXIT;
+}
+
+bool
+sRef_similarRelaxed (sRef s1, sRef s2)
+{
+  bool us1, us2;
+
+  if (s1 == s2) 
+    {
+      if (sRef_isThroughArrayFetch (s1))
+	{
+	  return FALSE;
+	}
+      else
+	{
+	  return TRUE;
+	}
+    }
+
+  if (sRef_isInvalid (s1) || sRef_isInvalid (s2)) return FALSE;
+
+  us1 = sRef_uniqueReference (s1);
+  us2 = sRef_uniqueReference (s2);
+
+  if ((s1->kind == SK_EXTERNAL && (s2->kind != SK_EXTERNAL && !us2))
+      || (s2->kind == SK_EXTERNAL && (s1->kind != SK_EXTERNAL && !us1)))
+    {
+      /*
+      ** Previously, also:
+      **   || (sRef_isExposed (s1) && !us2) || (sRef_isExposed (s2) && !us1)) ???? 
+      **
+      ** No clue why this was there?!
+      */
+
+
+      if (sRef_isExposed (s1) && sRef_isCvar (s1))
+	{
+	  uentry ue1 = sRef_getUentry (s1);
+
+	  if (uentry_isRefParam (ue1))
+	    {
+	      return sRef_similarRelaxedAux (s1, s2);
+	    }
+	}
+      
+      if (sRef_isExposed (s2) && sRef_isCvar (s2))
+	{
+	  uentry ue2 = sRef_getUentry (s2);
+
+	  if (uentry_isRefParam (ue2))
+	    {
+	      return sRef_similarRelaxedAux (s1, s2);
+	    }
+	}
+      
+            return (ctype_match (s1->type, s2->type));
+    }
+  else
+    {
+            return sRef_similarRelaxedAux (s1, s2);
+    }
+}
+
+bool
+sRef_similar (sRef s1, sRef s2)
+{
+  if (s1 == s2) return TRUE;
+  if (sRef_isInvalid (s1) || sRef_isInvalid (s2)) return FALSE;
+
+  if (sRef_isConj (s2)) 
+    {
+      return (sRef_similar (s1, sRef_getConjA (s2)) ||
+	      sRef_similar (s1, sRef_getConjB (s2)));
+    }
+
+  if (sRef_isDerived (s2))
+   {
+     return (sRef_includedBy (s1, s2->info->ref));
+   }
+
+  switch (s1->kind)
+    {
+    case SK_CVAR:
+      return ((s2->kind == SK_CVAR)
+	      && (cref_equal (s1->info->cvar, s2->info->cvar)));
+    case SK_PARAM:
+      return ((s2->kind == SK_PARAM)
+	      && (s1->info->paramno == s2->info->paramno));
+    case SK_ARRAYFETCH:
+      if (s2->kind == SK_ARRAYFETCH)
+	{
+	  if (sRef_similar (s1->info->arrayfetch->arr,
+			    s2->info->arrayfetch->arr))
+	    {
+	      if (s1->info->arrayfetch->indknown)
+		{
+		  if (s2->info->arrayfetch->indknown)
+		    {
+		      return (s1->info->arrayfetch->ind == s2->info->arrayfetch->ind);
+		    }
+		  else 
+		    {
+		      return TRUE;
+		    }
+		}
+	      else
+		{
+		  return TRUE;
+		}
+	    }
+	}
+      else 
+	{
+	  if (s2->kind == SK_PTR)
+	    {
+	      if (sRef_similar (s1->info->arrayfetch->arr,
+				s2->info->ref))
+		{
+		  return TRUE; 
+		}
+	    }
+	}
+
+      return FALSE;
+    case SK_FIELD:
+      return ((s2->kind == SK_FIELD
+	       && (sRef_similar (s1->info->field->rec,
+				 s2->info->field->rec)
+		   && cstring_equal (s1->info->field->field,
+				     s2->info->field->field))));
+    case SK_PTR:
+      if (s2->kind == SK_PTR)
+	{
+	  return sRef_similar (s1->info->ref, s2->info->ref);
+	}
+      else 
+	{
+	  if (s2->kind == SK_ARRAYFETCH)
+	    {
+	      if (sRef_similar (s2->info->arrayfetch->arr,
+				s1->info->ref))
+		{
+		  return TRUE; 
+		}
+	    }
+	}
+
+      return FALSE;
+    case SK_ADR:
+      return ((s2->kind == SK_ADR)
+	      && sRef_similar (s1->info->ref, s2->info->ref));
+    case SK_CONJ:
+      return ((sRef_similar (s1->info->conj->a, s2) ||
+	      (sRef_similar (s1->info->conj->b, s2))));
+    case SK_DERIVED:
+      return (sRef_includedBy (s2, s1->info->ref));
+    case SK_UNCONSTRAINED:
+      return (s2->kind == SK_UNCONSTRAINED
+	      && cstring_equal (s1->info->fname, s2->info->fname));
+    case SK_CONST:
+    case SK_TYPE:
+    case SK_NEW:
+    case SK_UNKNOWN:
+    case SK_OBJECT:
+    case SK_EXTERNAL:
+    case SK_RESULT:
+      return FALSE;
+    case SK_SPECIAL:
+      return (s2->kind == SK_SPECIAL 
+	      && (s1->info->spec == s2->info->spec));
+    }
+
+  /*@notreached@*/ DPRINTF (("Fell through for: %s / %s", sRef_unparse (s1), sRef_unparse (s2)));
+  BADEXIT;
+}
+
+/*
+** return TRUE iff small can be derived from big.
+**
+** (e.g. x, x.a is includedBy x;
+**       x.a is included By x.a;
+*/
+
+bool
+sRef_includedBy (sRef small, sRef big)
+{
+  if (small == big) return TRUE;
+  if (sRef_isInvalid (small) || sRef_isInvalid (big)) return FALSE;
+
+  if (sRef_isConj (big)) 
+    return (sRef_similar (small, sRef_getConjA (big)) ||
+	    sRef_similar (small, sRef_getConjB (big)));
+
+  switch (small->kind)
+    {
+    case SK_CVAR:
+    case SK_PARAM:
+      return (sRef_same (small, big));
+    case SK_ARRAYFETCH:
+      if (big->kind == SK_ARRAYFETCH)
+	{
+	  if (sRef_same (small->info->arrayfetch->arr, big->info->arrayfetch->arr))
+	    {
+	      if (small->info->arrayfetch->indknown)
+		{
+		  if (big->info->arrayfetch->indknown)
+		    {
+		      return (small->info->arrayfetch->ind == big->info->arrayfetch->ind);
+		    }
+		  else 
+		    {
+		      return TRUE;
+		    }
+		}
+	      else
+		{
+		  return TRUE;
+		}
+	    }
+	}
+      return (sRef_includedBy (small->info->arrayfetch->arr, big));
+    case SK_FIELD:
+      if (big->kind == SK_FIELD)
+	{
+	  return 
+	    (sRef_same (small->info->field->rec, big->info->field->rec) &&
+	     cstring_equal (small->info->field->field, big->info->field->field));
+	}
+      else
+	{
+	  return (sRef_includedBy (small->info->field->rec, big));
+	}
+
+    case SK_PTR:
+      if (big->kind == SK_PTR)
+	{
+	  return sRef_same (small->info->ref, big->info->ref);
+	}
+      else
+	{
+	  return (sRef_includedBy (small->info->ref, big));
+	}
+
+    case SK_ADR:
+      return ((big->kind == SK_ADR) && sRef_similar (small->info->ref, big->info->ref));
+    case SK_CONJ:
+      return ((sRef_includedBy (small->info->conj->a, big) ||
+	      (sRef_includedBy (small->info->conj->b, big))));
+    case SK_DERIVED:
+      return (sRef_includedBy (small->info->ref, big));
+    case SK_UNCONSTRAINED:
+    case SK_CONST:
+    case SK_TYPE:
+    case SK_NEW:
+    case SK_UNKNOWN:
+    case SK_OBJECT:
+    case SK_EXTERNAL:
+    case SK_RESULT:
+      return FALSE;
+    case SK_SPECIAL:
+      switch (small->info->spec)
+	{
+	case SR_NOTHING: return TRUE;
+	case SR_SPECSTATE:
+	case SR_INTERNAL: return (sRef_isSpecInternalState (big) ||
+				  sRef_isFileStatic (big));
+	case SR_SYSTEM: return (sRef_isSystemState (big));
+	}
+    }
+  BADEXIT;
+}
+
+/*
+** Same is similar to similar, but not quite the same. 
+** same and realSame aren't the same, but they are really similar.
+** similarly, same is the same as same. but realSame is
+** not really the same as same, or similar to similar.
+**
+** Similarly to similar, same checks if two sRefs are the same.
+** The similarities end, however, when same compares arrays
+** with unknown indexes.  Similar returns false; same returns true.
+**
+** Similarly to similar and same, realSame is the same as same,
+** except they do not behave the same when face with unknown
+** sRefs.  Same thinks they are not the same, but realSame thinks
+** the are.
+**
+*/
+
+bool
+sRef_realSame (sRef s1, sRef s2)
+{
+  if (s1 == s2) return TRUE;  
+  if (sRef_isInvalid (s1) || sRef_isInvalid (s2)) return FALSE;
+
+  switch (s1->kind)
+    {
+    case SK_CVAR:
+      return ((s2->kind == SK_CVAR) && (cref_equal (s1->info->cvar, s2->info->cvar)));
+    case SK_PARAM:
+      return ((s2->kind == SK_PARAM) && (s1->info->paramno == s2->info->paramno));
+    case SK_ARRAYFETCH:
+      if (s2->kind == SK_ARRAYFETCH)
+	{
+	  if (sRef_realSame (s1->info->arrayfetch->arr, s2->info->arrayfetch->arr))
+	    {
+	      if (s1->info->arrayfetch->indknown && s2->info->arrayfetch->indknown)
+		{
+		  return (s1->info->arrayfetch->ind == s2->info->arrayfetch->ind);
+		}
+	      if (!s1->info->arrayfetch->indknown && !s2->info->arrayfetch->indknown)
+		{
+		  return TRUE;
+		}
+	      return FALSE;
+	    }
+	}
+      return FALSE;
+    case SK_FIELD:
+      return ((s2->kind == SK_FIELD &&
+	       (sRef_realSame (s1->info->field->rec, s2->info->field->rec) &&
+		cstring_equal (s1->info->field->field, s2->info->field->field))));
+    case SK_PTR:
+      return ((s2->kind == SK_PTR) && sRef_realSame (s1->info->ref, s2->info->ref));
+    case SK_ADR:
+      return ((s2->kind == SK_ADR) && sRef_realSame (s1->info->ref, s2->info->ref));
+    case SK_CONJ:
+      return ((sRef_realSame (s1->info->conj->a, s2) ||
+	      (sRef_realSame (s1->info->conj->b, s2))));
+    case SK_OBJECT:
+      return ((s2->kind == SK_OBJECT) 
+	      && ctype_match (s1->info->object, s2->info->object));
+    case SK_EXTERNAL:
+      return ((s2->kind == SK_EXTERNAL) 
+	      && sRef_realSame (s1->info->ref, s2->info->ref));
+    case SK_SPECIAL:
+      return ((s2->kind == SK_SPECIAL) && s1->info->spec == s2->info->spec);
+    case SK_DERIVED:
+      return ((s2->kind == SK_DERIVED) && sRef_realSame (s1->info->ref, s2->info->ref));
+    case SK_UNCONSTRAINED:
+      return ((s2->kind == SK_UNCONSTRAINED) 
+	      && (cstring_equal (s1->info->fname, s2->info->fname)));
+    case SK_TYPE:
+    case SK_CONST:
+    case SK_NEW:
+    case SK_UNKNOWN:
+    case SK_RESULT:
+      return TRUE; /* changed this! was false */
+    }
+  BADEXIT;
+}
+
+/*
+** same is similar to similar, but not quite the same. 
+**
+** Similarly to similar, same checks is two sRefs are the same.
+** The similarities end, however, when same compares arrays
+** with unknown indexes.  Similar returns false; same returns true.
+*/
+
+bool
+sRef_same (sRef s1, sRef s2)
+{
+  if (s1 == s2) return TRUE;
+  if (sRef_isInvalid (s1) || sRef_isInvalid (s2)) return FALSE;
+
+  switch (s1->kind)
+    {
+    case SK_CVAR:
+      return ((s2->kind == SK_CVAR) && (cref_equal (s1->info->cvar, s2->info->cvar)));
+    case SK_PARAM:
+      return ((s2->kind == SK_PARAM) && (s1->info->paramno == s2->info->paramno));
+    case SK_ARRAYFETCH:
+      if (s2->kind == SK_ARRAYFETCH)
+	{
+	  llassert (s1->info->field->rec != s1);
+	  if (sRef_same (s1->info->arrayfetch->arr, s2->info->arrayfetch->arr))
+	    {
+	      if (s1->info->arrayfetch->indknown && s2->info->arrayfetch->indknown)
+		{
+		  return (s1->info->arrayfetch->ind == s2->info->arrayfetch->ind);
+		}
+	      return TRUE;
+	    }
+	}
+      return FALSE;
+    case SK_FIELD:
+      {
+	llassert (s1->info->field->rec != s1);
+	return ((s2->kind == SK_FIELD &&
+		 (sRef_same (s1->info->field->rec, s2->info->field->rec) &&
+		  cstring_equal (s1->info->field->field, s2->info->field->field))));
+      }
+    case SK_PTR:
+      {
+	llassert (s1->info->ref != s1);
+	return ((s2->kind == SK_PTR) && sRef_same (s1->info->ref, s2->info->ref));
+      }
+    case SK_ADR:
+      {
+	llassert (s1->info->ref != s1);
+	return ((s2->kind == SK_ADR) && sRef_same (s1->info->ref, s2->info->ref));
+      }
+    case SK_CONJ:
+      llassert (s1->info->conj->a != s1);
+      llassert (s1->info->conj->b != s1);
+      return ((sRef_same (s1->info->conj->a, s2)) && /* or or and? */
+	      (sRef_same (s1->info->conj->b, s2)));
+    case SK_SPECIAL:
+      return ((s2->kind == SK_SPECIAL) && s1->info->spec == s2->info->spec);
+    case SK_DERIVED:
+      llassert (s1->info->ref != s1);
+      return ((s2->kind == SK_DERIVED) && sRef_same (s1->info->ref, s2->info->ref));
+    case SK_CONST:
+    case SK_UNCONSTRAINED:
+    case SK_TYPE:
+    case SK_UNKNOWN:
+    case SK_NEW:
+    case SK_OBJECT:
+    case SK_EXTERNAL:
+    case SK_RESULT:
+      return FALSE; 
+    }
+  BADEXIT;
+}
+
+/*
+** sort of similar, for use in def/use
+*/
+
+static bool
+sRef_closeEnough (sRef s1, sRef s2)
+{
+  if (s1 == s2) return TRUE;
+  if (sRef_isInvalid (s1) || sRef_isInvalid (s2)) return FALSE;
+
+  switch (s1->kind)
+    {
+    case SK_CVAR:
+      return (((s2->kind == SK_CVAR) &&
+	       (cref_equal (s1->info->cvar, s2->info->cvar))) ||
+	      (s2->kind == SK_UNCONSTRAINED && s1->info->cvar->lexlevel == 0));
+    case SK_UNCONSTRAINED:
+      return (s2->kind == SK_UNCONSTRAINED
+	      || ((s2->kind == SK_CVAR) && (s2->info->cvar->lexlevel == 0)));
+    case SK_PARAM:
+      return ((s2->kind == SK_PARAM) 
+	      && (s1->info->paramno == s2->info->paramno));
+    case SK_ARRAYFETCH:
+      if (s2->kind == SK_ARRAYFETCH)
+	{
+	  if (sRef_closeEnough (s1->info->arrayfetch->arr, s2->info->arrayfetch->arr))
+	    {
+	      if (s1->info->arrayfetch->indknown && s2->info->arrayfetch->indknown)
+		{
+		  return (s1->info->arrayfetch->ind == s2->info->arrayfetch->ind);
+		}
+	      return TRUE;
+	    }
+	}
+      return FALSE;
+    case SK_FIELD:
+      return ((s2->kind == SK_FIELD &&
+	       (sRef_closeEnough (s1->info->field->rec, s2->info->field->rec) &&
+		cstring_equal (s1->info->field->field, s2->info->field->field))));
+    case SK_PTR:
+      return ((s2->kind == SK_PTR) && sRef_closeEnough (s1->info->ref, s2->info->ref));
+    case SK_ADR:
+      return ((s2->kind == SK_ADR) && sRef_closeEnough (s1->info->ref, s2->info->ref));
+    case SK_DERIVED:
+      return ((s2->kind == SK_DERIVED) && sRef_closeEnough (s1->info->ref, s2->info->ref));
+    case SK_CONJ:
+      return ((sRef_closeEnough (s1->info->conj->a, s2)) ||
+	      (sRef_closeEnough (s1->info->conj->b, s2)));
+    case SK_SPECIAL:
+      return ((s2->kind == SK_SPECIAL) && s1->info->spec == s2->info->spec);
+    case SK_TYPE:
+    case SK_CONST:
+    case SK_UNKNOWN:
+    case SK_NEW:
+    case SK_OBJECT:
+    case SK_EXTERNAL:
+    case SK_RESULT:
+
+      return FALSE;
+    }
+  BADEXIT;
+}
+
+/*@exposed@*/ sRef
+sRef_fixBaseParam (/*@returned@*/ sRef s, exprNodeList args)
+{
+  if (sRef_isInvalid (s)) return (sRef_undefined);
+
+  switch (s->kind)
+    {
+    case SK_UNCONSTRAINED:
+    case SK_CVAR:
+      return s;
+    case SK_PARAM:
+      {
+	if (exprNodeList_size (args) > s->info->paramno)
+	  {
+	    exprNode e = exprNodeList_nth (args, s->info->paramno);
+
+	    if (exprNode_isError (e))
+	      {
+		return sRef_makeUnknown ();
+	      }
+	    
+	    return (exprNode_getSref (e));
+	  }
+	else
+	  {
+	    return sRef_makeUnknown ();
+	  }
+      }
+    case SK_ARRAYFETCH:
+
+      if (s->info->arrayfetch->indknown)
+	{
+	  return (sRef_makeArrayFetchKnown 
+		  (sRef_fixBaseParam (s->info->arrayfetch->arr, args),
+		   s->info->arrayfetch->ind));
+	}
+      else
+	{
+	  return (sRef_makeArrayFetch 
+		  (sRef_fixBaseParam (s->info->arrayfetch->arr, args)));
+	}
+    case SK_FIELD:
+      return (sRef_makeField (sRef_fixBaseParam (s->info->field->rec, args),
+			      s->info->field->field));
+
+    case SK_PTR:
+      return (sRef_makePointer (sRef_fixBaseParam (s->info->ref, args)));
+
+    case SK_ADR:
+      return (sRef_makeAddress (sRef_fixBaseParam (s->info->ref, args)));
+
+    case SK_CONJ:
+      return (sRef_makeConj (sRef_fixBaseParam (s->info->conj->a, args),
+			     sRef_fixBaseParam (s->info->conj->b, args)));
+    case SK_DERIVED:
+    case SK_SPECIAL:
+    case SK_TYPE:
+    case SK_CONST:
+    case SK_NEW:
+    case SK_UNKNOWN:
+    case SK_OBJECT:
+    case SK_EXTERNAL:
+    case SK_RESULT:
+      return s;
+    }
+  BADEXIT;
+}
+
+/*@exposed@*/ sRef
+sRef_undumpGlobal (char **c)
+{
+  char p = **c;
+
+  (*c)++;
+
+  switch (p)
+    {
+    case 'g':
+      {
+	usymId uid = usymId_fromInt (getInt (c));
+	sstate defstate;
+	nstate nullstate;
+	sRef ret;
+
+	checkChar (c, '@');
+	defstate = sstate_fromInt (getInt (c));
+
+	checkChar (c, '@');
+	nullstate = nstate_fromInt (getInt (c));
+
+	ret = sRef_makeGlobal (uid, ctype_unknown);
+	ret->nullstate = nullstate;
+	ret->defstate = defstate;
+	return ret;
+      }
+    case 's':
+      {
+	int i = getInt (c);
+	speckind sk = speckind_fromInt (i);
+
+	switch (sk)
+	  {
+	  case SR_NOTHING:   return (sRef_makeNothing ());
+	  case SR_INTERNAL:  return (sRef_makeInternalState ());
+	  case SR_SPECSTATE: return (sRef_makeSpecState ());
+	  case SR_SYSTEM:    return (sRef_makeSystemState ());
+	  }
+	BADEXIT;
+      }
+    case '-':
+      return sRef_undefined;
+    case 'u':
+      return sRef_makeUnknown ();
+    case 'x':
+      return sRef_makeUnknown ();
+    default:
+      llfatalerror (message ("sRef_undumpGlobal: bad line: %s",
+			     cstring_fromChars (*c)));
+    }
+  BADEXIT;
+}
+
+/*@exposed@*/ sRef
+sRef_undump (char **c)
+{
+  char p = **c;
+
+  (*c)++;
+
+  switch (p)
+    {
+    case 'g':
+      return (sRef_makeGlobal (usymId_fromInt (getInt (c)), ctype_unknown));
+    case 'p':
+      return (sRef_makeParam (getInt (c), ctype_unknown));
+    case 'r':
+      return (sRef_makeResultType (ctype_undump (c)));
+    case 'a':
+      {
+	if ((**c >= '0' && **c <= '9') || **c == '-')
+	  {
+	    int i = getInt (c);
+	    sRef arr = sRef_undump (c);
+	    sRef ret = sRef_buildArrayFetchKnown (arr, i);
+
+	    return ret;
+	  }
+	else
+	  {
+	    sRef arr = sRef_undump (c);
+	    sRef ret = sRef_buildArrayFetch (arr);
+
+	    return ret;
+	  }
+      }
+    case 'f':
+      {
+	cstring fname = cstring_undefined;
+	sRef ret;
+
+	while (**c != '.')
+	  {
+	    fname = cstring_appendChar (fname, **c);
+	    (*c)++;
+	  }
+	(*c)++;
+
+	ret = sRef_buildField (sRef_undump (c), fname);
+	cstring_markOwned (fname);
+	return (ret);
+      }
+    case 's':
+      {
+	int i = getInt (c);
+	speckind sk = speckind_fromInt (i);
+
+	switch (sk)
+	  {
+	  case SR_NOTHING:   return (sRef_makeNothing ());
+	  case SR_INTERNAL:  return (sRef_makeInternalState ());
+	  case SR_SPECSTATE: return (sRef_makeSpecState ());
+	  case SR_SYSTEM:    return (sRef_makeSystemState ());
+	  }
+	BADEXIT;
+      }
+    case 't':
+      {
+	sRef ptr = sRef_undump (c);
+	sRef ret = sRef_makePointer (ptr);
+
+	return (ret);
+      }
+    case 'd':
+      {
+	sRef adr = sRef_undump (c);
+	sRef ret = sRef_makeAddress (adr);
+
+	return (ret);
+      }
+    case 'o':
+      {
+	return (sRef_makeObject (ctype_undump (c)));
+      }
+    case 'c':
+      {
+	sRef s1 = sRef_undump (c);
+	sRef s2 = ((*c)++, sRef_undump (c));
+	sRef ret = sRef_makeConj (s1, s2);
+
+	return (ret);
+      }
+    case '-':
+      return sRef_undefined;
+    case 'u':
+      return sRef_makeUnknown ();
+    case 'x':
+      return sRef_makeUnknown ();
+    default:
+      llfatalerror (message ("sRef_undump: bad line: %s", cstring_fromChars (*c)));
+    }
+  BADEXIT;
+}
+
+/*@only@*/ cstring
+sRef_dump (sRef s)
+{
+  if (sRef_isInvalid (s))
+    {
+      return (cstring_makeLiteral ("-"));
+    }
+  else
+    {
+      switch (s->kind)
+	{
+	case SK_PARAM:
+	  return (message ("p%d", s->info->paramno));
+	case SK_ARRAYFETCH:
+	  if (s->info->arrayfetch->indknown)
+	    {
+	      return (message ("a%d%q", s->info->arrayfetch->ind,
+			       sRef_dump (s->info->arrayfetch->arr)));
+	    }
+	  else
+	    {
+	      return (message ("a%q", sRef_dump (s->info->arrayfetch->arr)));
+	    }
+	case SK_FIELD:
+	  return (message ("f%s.%q", s->info->field->field, 
+			   sRef_dump (s->info->field->rec)));
+	case SK_PTR:
+	  return (message ("t%q", sRef_dump (s->info->ref)));
+	case SK_ADR:
+	  return (message ("d%q", sRef_dump (s->info->ref)));
+	case SK_OBJECT:
+	  return (message ("o%q", ctype_dump (s->info->object)));
+	case SK_SPECIAL:
+	  return (message ("s%d", (int) s->info->spec));
+	case SK_CONJ:
+	  return (message ("c%q.%q",
+			   sRef_dump (s->info->conj->a),
+			   sRef_dump (s->info->conj->b)));
+	case SK_CVAR:
+	  if (sRef_isGlobal (s))
+	    {
+	      return (message ("g%d", 
+			       usymtab_convertId (s->info->cvar->index)));
+	    }
+	  else
+	    {
+	      llcontbug (message ("Dumping local variable: %q",
+				  sRef_unparseDebug (s)));
+	      return (cstring_makeLiteral ("u"));
+	    }
+	case SK_UNKNOWN:
+	  return (cstring_makeLiteral ("u"));
+	case SK_RESULT:
+	  return (message ("r%q", ctype_dump (s->type)));
+	case SK_TYPE:
+	case SK_CONST:
+	case SK_EXTERNAL:
+	case SK_DERIVED:
+	case SK_NEW:
+	case SK_UNCONSTRAINED:
+	  llcontbug (message ("sRef_dump: bad kind: %q",
+			      sRef_unparseFull (s)));
+	  return (cstring_makeLiteral ("x"));
+	}
+    }
+     
+  BADEXIT;
+}
+
+cstring sRef_dumpGlobal (sRef s)
+{
+  if (sRef_isInvalid (s))
+    {
+      return (cstring_makeLiteral ("-"));
+    }
+  else
+    {
+      switch (s->kind)
+	{
+	case SK_CVAR:
+	  if (sRef_isGlobal (s))
+	    {
+	      return (message ("g%d@%d@%d", 
+			       usymtab_convertId (s->info->cvar->index),
+			       (int) s->defstate,
+			       (int) s->nullstate));
+	    }
+	  else
+	    {
+	      llcontbug (message ("Dumping local variable: %q",
+				  sRef_unparseDebug (s)));
+	      return (cstring_makeLiteral ("u"));
+	    }
+	case SK_UNKNOWN:
+	  return (cstring_makeLiteral ("u"));
+	case SK_SPECIAL:
+	  return (message ("s%d", (int) s->info->spec));
+	default:
+	  llcontbug (message ("sRef_dumpGlobal: bad kind: %q",
+			      sRef_unparseFull (s)));
+	  return (cstring_makeLiteral ("x"));
+	}
+    }
+     
+  BADEXIT;
+}
+
+ctype
+sRef_deriveType (sRef s, uentryList cl)
+{
+  if (sRef_isInvalid (s)) return ctype_unknown;
+
+  switch (s->kind)
+    {
+    case SK_CVAR:
+      return (uentry_getType (usymtab_getRefQuiet (s->info->cvar->lexlevel, 
+					      s->info->cvar->index)));
+    case SK_UNCONSTRAINED:
+      return (ctype_unknown);
+    case SK_PARAM:
+      return uentry_getType (uentryList_getN (cl, s->info->paramno));
+    case SK_ARRAYFETCH:
+      {
+	ctype ca = sRef_deriveType (s->info->arrayfetch->arr, cl);
+	
+	if (ctype_isArray (ca))
+	  {
+	    return (ctype_baseArrayPtr (ca));
+	  }
+	else if (ctype_isUnknown (ca))
+	  {
+	    return (ca);
+	  }
+	else
+	  {
+	    llcontbuglit ("sRef_deriveType: inconsistent array type");
+	    return ca;
+	  }
+      }
+    case SK_FIELD:
+      {
+	ctype ct = sRef_deriveType (s->info->field->rec, cl);
+	
+	if (ctype_isStructorUnion (ct))
+	  {
+	    uentry ue = uentryList_lookupField (ctype_getFields (ct), 
+					       s->info->field->field);
+	    
+	    if (uentry_isValid (ue))
+	      {
+		return (uentry_getType (ue));
+	      }
+	    else
+	      {
+		llcontbuglit ("sRef_deriveType: bad field");
+		return ctype_unknown;
+	      }
+	  }
+	else if (ctype_isUnknown (ct))
+	  {
+	    return (ct);
+	  }
+	else
+	  {
+	    llcontbuglit ("sRef_deriveType: inconsistent field type");
+	    return (ct);
+	  }
+      }
+    case SK_PTR:
+      {
+	ctype ct = sRef_deriveType (s->info->ref, cl);
+	
+	if (ctype_isUnknown (ct)) return ct;
+	if (ctype_isPointer (ct)) return (ctype_baseArrayPtr (ct));
+	else
+	  {
+	    llcontbuglit ("sRef_deriveType: inconsistent pointer type");
+	    return (ct);
+	  }
+      }
+    case SK_ADR:
+      {
+	ctype ct = sRef_deriveType (s->info->ref, cl);
+	
+	if (ctype_isUnknown (ct)) return ct;
+	return ctype_makePointer (ct);
+      }
+    case SK_DERIVED:
+      {
+	return sRef_deriveType (s->info->ref, cl);
+      }
+    case SK_OBJECT:
+      {
+	return (s->info->object);
+      }
+    case SK_CONJ:
+      {
+	return (ctype_makeConj (sRef_deriveType (s->info->conj->a, cl),
+			       sRef_deriveType (s->info->conj->b, cl)));
+      }
+    case SK_RESULT:
+    case SK_CONST:
+    case SK_TYPE:
+      {
+	return (s->type);
+      }
+    case SK_SPECIAL:
+    case SK_UNKNOWN:
+    case SK_EXTERNAL:
+    case SK_NEW:
+      return ctype_unknown;
+    }
+  BADEXIT;
+}
+
+ctype
+sRef_getType (sRef s)
+{
+  if (sRef_isInvalid (s)) return ctype_unknown;
+  return s->type;
+}
+
+
+/*@only@*/ cstring
+sRef_unparseOpt (sRef s)
+{
+  sRef rb = sRef_getRootBase (s);
+
+  if (sRef_isMeaningful (rb) && !sRef_isConst (rb))
+    {
+      cstring ret = sRef_unparse (s);
+      
+      llassertprint (!cstring_equalLit (ret, "?"), ("print: %s", sRef_unparseDebug (s)));
+
+      if (!cstring_isEmpty (ret))
+	{
+	  return (cstring_appendChar (ret, ' '));
+	}
+      else
+	{
+	  return ret;
+	}
+    }
+
+  return cstring_undefined;
+}
+
+cstring
+sRef_unparsePreOpt (sRef s)
+{
+  sRef rb = sRef_getRootBase (s);
+
+  if (sRef_isMeaningful (rb) && !sRef_isConst (rb))
+    {
+      cstring ret = sRef_unparse (s);
+      
+      llassertprint (!cstring_equalLit (ret, "?"), ("print: %s", sRef_unparseDebug (s)));
+      return (cstring_prependCharO (' ', ret));
+    }
+
+  return cstring_undefined;
+}
+
+/*@only@*/ cstring
+sRef_unparse (sRef s)
+{
+  if (sRef_isInvalid (s)) return (cstring_makeLiteral ("?"));
+
+  if (context_inFunctionLike ())
+    {
+      return (sRef_unparseWithArgs (s, context_getParams ()));
+    }
+  else
+    {
+      return (sRef_unparseNoArgs (s));
+    }
+}
+
+static /*@only@*/ cstring
+sRef_unparseWithArgs (sRef s, uentryList args)
+{
+  if (sRef_isInvalid (s))
+    {
+      return (cstring_makeLiteral ("?"));
+    }
+
+  switch (s->kind)
+    {
+    case SK_CVAR:
+      return (uentry_getName (usymtab_getRefQuiet (s->info->cvar->lexlevel,
+						   s->info->cvar->index)));
+    case SK_UNCONSTRAINED:
+      return (cstring_copy (s->info->fname));
+    case SK_PARAM:
+      {
+	if (s->info->paramno < uentryList_size (args))
+	  {
+	    uentry ue = uentryList_getN (args, s->info->paramno);
+	    
+	    if (uentry_isValid (ue))
+	      return uentry_getName (ue);
+	  }
+
+	return (message ("info->arrayfetch->indknown)
+	{
+	  return (message ("%q[%d]", sRef_unparseWithArgs (s->info->arrayfetch->arr, args),
+				s->info->arrayfetch->ind));
+	}
+      else
+	{
+	  return (message ("%q[]", sRef_unparseWithArgs (s->info->arrayfetch->arr, args)));
+	}
+    case SK_FIELD:
+      if (s->info->field->rec->kind == SK_PTR)
+	{
+	  sRef ptr = s->info->field->rec;
+
+	  return (message ("%q->%s", sRef_unparseWithArgs (ptr->info->ref, args),
+			   s->info->field->field));	  
+	}
+      return (message ("%q.%s", sRef_unparseWithArgs (s->info->field->rec, args),
+		       s->info->field->field));
+
+    case SK_PTR:
+      {
+	sRef ref = sRef_fixConj (s->info->ref);
+	skind sk = ref->kind;
+	cstring ret;
+
+	if (sk == SK_NEW)
+	  {
+	    ret = message ("storage pointed to by %q",
+			   sRef_unparseWithArgs (ref, args));
+	  }
+	else if (skind_isSimple (sk) || sk == SK_PTR)
+	  {
+	    ret = message ("*%q", sRef_unparseWithArgs (ref, args));
+	  }
+	else
+	  {
+	    ret = message ("*(%q)", sRef_unparseWithArgs (ref, args));
+	  }
+
+	return ret;
+      }
+    case SK_ADR:
+      return (message ("&%q", sRef_unparseWithArgs (s->info->ref, args)));
+    case SK_OBJECT:
+      return (cstring_copy (ctype_unparse (s->info->object)));
+    case SK_CONJ:
+      return (sRef_unparseWithArgs (sRef_getConjA (s), args));
+    case SK_NEW:
+      if (cstring_isDefined (s->info->fname))
+	{
+	  return (message ("[result of %s]", s->info->fname));
+	}
+      else
+	{
+	  return (cstring_makeLiteral (""));
+	}
+    case SK_UNKNOWN:
+      return (cstring_makeLiteral ("?"));
+    case SK_DERIVED:
+      return (message ("", sRef_unparse (s->info->ref)));
+    case SK_EXTERNAL:
+      return (message ("", sRef_unparse (s->info->ref)));
+    case SK_TYPE:
+      return (message ("", ctype_unparse (s->type)));
+    case SK_CONST:
+      return (message ("", ctype_unparse (s->type)));
+    case SK_SPECIAL:
+      return (cstring_makeLiteral
+	      (s->info->spec == SR_NOTHING ? "nothing"
+	       : s->info->spec == SR_INTERNAL ? "internal state"
+	       : s->info->spec == SR_SPECSTATE ? "spec state"
+	       : s->info->spec == SR_SYSTEM ? "file system state"
+	       : ""));
+    case SK_RESULT:
+      return cstring_makeLiteral ("result");
+    default:
+      {
+	llbug (message ("Bad sref, kind = %d", (int) s->kind));
+      }
+    }
+
+  BADEXIT;
+}
+
+/*@only@*/ cstring
+sRef_unparseDebug (sRef s)
+{
+  if (sRef_isInvalid (s)) return (cstring_makeLiteral (""));
+
+  switch (s->kind)
+    {
+    case SK_UNCONSTRAINED:
+      return (message ("", s->info->fname));
+    case SK_CVAR:
+      {
+	uentry ce;
+
+	ce = usymtab_getRefQuiet (s->info->cvar->lexlevel, s->info->cvar->index);
+
+	if (uentry_isInvalid (ce))
+	  {
+	    return (message ("", 
+			     s->info->cvar->lexlevel,
+			     s->info->cvar->index));
+	  }
+	else
+	  {
+	    return (message ("", 
+			     s->info->cvar->lexlevel,
+			     s->info->cvar->index,
+			     uentry_getName (ce)));
+	  }
+
+      }
+    case SK_PARAM:
+      {
+	return (message ("", s->info->paramno + 1));
+      }
+    case SK_ARRAYFETCH:
+      if (s->info->arrayfetch->indknown)
+	{
+	  return (message ("%q[%d]", sRef_unparseDebug (s->info->arrayfetch->arr),
+			   s->info->arrayfetch->ind));
+	}
+      else
+	{
+	  return (message ("%q[]", sRef_unparseDebug (s->info->arrayfetch->arr)));
+	}
+    case SK_FIELD:
+      return (message ("%q.%s", sRef_unparseDebug (s->info->field->rec),
+		       s->info->field->field));
+    case SK_PTR:
+      return (message ("*(%q)", sRef_unparseDebug (s->info->ref)));
+    case SK_ADR:
+      return (message ("&%q", sRef_unparseDebug (s->info->ref)));
+    case SK_OBJECT:
+      return (message ("", ctype_unparse (s->info->object)));
+    case SK_CONJ:
+      return (message ("%q | %q", sRef_unparseDebug (s->info->conj->a),
+		       sRef_unparseDebug (s->info->conj->b)));
+    case SK_NEW:
+      return message ("", s->info->fname);
+    case SK_DERIVED:
+      return (message ("", sRef_unparseDebug (s->info->ref)));
+    case SK_EXTERNAL:
+      return (message ("", sRef_unparseDebug (s->info->ref)));
+    case SK_TYPE:
+      return (message ("", ctype_unparse (s->type)));
+    case SK_CONST:
+      return (message ("", ctype_unparse (s->type)));
+    case SK_RESULT:
+      return (message ("", ctype_unparse (s->type)));
+    case SK_SPECIAL:
+      return (message ("",
+		       cstring_makeLiteralTemp
+		       (s->info->spec == SR_NOTHING ? "nothing"
+			: s->info->spec == SR_INTERNAL ? "internalState"
+			: s->info->spec == SR_SPECSTATE ? "spec state"
+			: s->info->spec == SR_SYSTEM ? "fileSystem"
+			: "error")));
+    case SK_UNKNOWN:
+      return cstring_makeLiteral ("");
+    }
+
+  BADEXIT;
+}
+
+static /*@only@*/ cstring
+sRef_unparseNoArgs (sRef s)
+{
+  if (sRef_isInvalid (s)) return (cstring_makeLiteral ("?"));
+
+  switch (s->kind)
+    {
+    case SK_UNCONSTRAINED:
+      return (cstring_copy (s->info->fname));
+    case SK_CVAR:
+      {
+	uentry ce = usymtab_getRefQuiet (s->info->cvar->lexlevel, 
+					 s->info->cvar->index);
+
+	if (uentry_isInvalid (ce))
+	  {
+	    llcontbug (message ("sRef_unparseNoArgs: bad cvar: %q", sRef_unparseDebug (s)));
+	    return (sRef_unparseDebug (s)); 
+	  }
+	else
+	  {
+	    return (uentry_getName (ce));
+	  }
+      }
+    case SK_ARRAYFETCH:
+      if (s->info->arrayfetch->indknown)
+	{
+	  return (message ("%q[%d]", sRef_unparseNoArgs (s->info->arrayfetch->arr),
+			   s->info->arrayfetch->ind));
+	}
+      else
+	{
+	  return (message ("%q[]", sRef_unparseNoArgs (s->info->arrayfetch->arr)));
+	}
+    case SK_FIELD:
+      return (message ("%q.%s", sRef_unparseNoArgs (s->info->field->rec),
+		       s->info->field->field));
+    case SK_PTR:
+      {
+	sRef ref = sRef_fixConj (s->info->ref);
+	skind sk = ref->kind;
+	cstring ret;
+
+	if (skind_isSimple (sk) || sk == SK_PTR)
+	  {
+	    ret = message ("*%q", sRef_unparseNoArgs (ref));
+	  }
+	else
+	  {
+	    ret = message ("*(%q)", sRef_unparseNoArgs (ref));
+	  }
+
+	return (ret);
+      }
+    case SK_ADR:
+      return (message ("&%q", sRef_unparseNoArgs (s->info->ref)));
+    case SK_OBJECT:
+      return (cstring_copy (ctype_unparse (s->info->object)));
+    case SK_CONJ:
+      return (sRef_unparseNoArgs (s->info->conj->a));
+    case SK_NEW:
+      return (message ("result of %s", s->info->fname));
+    case SK_DERIVED:
+      return (message ("", sRef_unparseNoArgs (s->info->ref)));
+    case SK_EXTERNAL:
+      return message ("", sRef_unparseNoArgs (s->info->ref));
+    case SK_SPECIAL:
+      return (cstring_makeLiteral
+	      (s->info->spec == SR_NOTHING ? "nothing"
+	       : s->info->spec == SR_INTERNAL ? "internal state"
+	       : s->info->spec == SR_SPECSTATE ? "spec state"
+	       : s->info->spec == SR_SYSTEM ? "file system state"
+	       : ""));
+    case SK_RESULT:
+      return cstring_makeLiteral ("result");
+    case SK_CONST:
+    case SK_TYPE:
+    case SK_UNKNOWN:
+      return cstring_makeLiteral ("?");
+    case SK_PARAM:
+      /* llcontbug (message ("sRef_unparseNoArgs: bad case: %q", sRef_unparseDebug (s))); */
+      return (sRef_unparseDebug (s));
+    }
+  BADEXIT;
+}
+
+/*@dependent@*/ sRef sRef_makeUnconstrained (cstring fname)
+{
+  sRef s = sRef_new ();
+
+  s->kind = SK_UNCONSTRAINED;
+  s->info = (sinfo) dmalloc (sizeof (*s->info));
+  s->info->fname = fname;
+
+  return (s);
+}
+
+cstring sRef_unconstrainedName (sRef s)
+{
+  llassert (sRef_isUnconstrained (s));
+
+  return s->info->fname;
+}
+
+bool sRef_isUnconstrained (sRef s) 
+{
+  return (sRef_isValid(s) && s->kind == SK_UNCONSTRAINED);
+}
+
+static /*@dependent@*/ /*@notnull@*/ sRef 
+  sRef_makeCvarAux (int level, usymId index, ctype ct)
+{
+  sRef s = sRef_new ();
+
+    s->kind = SK_CVAR;
+  s->info = (sinfo) dmalloc (sizeof (*s->info));
+
+  s->info->cvar = (cref) dmalloc (sizeof (*s->info->cvar));
+  s->info->cvar->lexlevel = level;
+  s->info->cvar->index = index;
+
+  /* for now, all globals are defined; all locals, aren't */
+
+  if (level <= fileScope)
+    {
+      s->defstate = SS_UNKNOWN;
+    }
+  else 
+    {
+      ctype rct = ctype_realType (ct);
+
+      if (level != paramsScope
+	  && (ctype_isStructorUnion (rct) || ctype_isRealArray (rct)))
+	{
+	  s->defstate = SS_ALLOCATED; 
+	  s->oaliaskind = s->aliaskind = AK_STACK;
+	}
+      else
+	{
+	  s->defstate = SS_UNDEFINED;
+	  s->oaliaskind = s->aliaskind = AK_LOCAL;
+	}
+    }
+
+  s->type = ct;
+
+  llassert (level >= globScope);
+  llassert (usymId_isValid (index));
+
+  return s;
+}
+
+/*@dependent@*/ sRef sRef_makeCvar (int level, usymId index, ctype ct)
+{
+  return (sRef_makeCvarAux (level, index, ct));
+}
+
+int sRef_lexLevel (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      sRef conj;
+
+      conj = sRef_fixConj (s);
+      s = sRef_getRootBase (conj);
+      
+      if (sRef_isValid (s) && s->kind == SK_CVAR)
+	{
+	  return (s->info->cvar->lexlevel);
+	}
+    }
+
+  return globScope;
+}
+
+sRef
+sRef_makeGlobal (usymId l, ctype ct)
+{
+  return (sRef_makeCvar (globScope, l, ct));
+}
+
+void
+sRef_setParamNo (sRef s, int l)
+{
+  llassert (sRef_isValid (s) && s->kind == SK_PARAM);
+  s->info->paramno = l;
+}
+
+/*@dependent@*/ sRef
+sRef_makeParam (int l, ctype ct)
+{
+  sRef s = sRef_new ();
+
+  s->kind = SK_PARAM;
+  s->type = ct;
+
+  s->info = (sinfo) dmalloc (sizeof (*s->info));
+  s->info->paramno = l; 
+  s->defstate = SS_UNKNOWN; /* (probably defined, unless its an out parameter) */
+
+  return s;
+}
+
+bool
+sRef_isIndexKnown (sRef arr)
+{
+  bool res;
+
+  llassert (sRef_isValid (arr));
+  arr = sRef_fixConj (arr);
+  
+  llassert (arr->kind == SK_ARRAYFETCH);  
+  res = arr->info->arrayfetch->indknown;
+  return (res);
+}
+
+int
+sRef_getIndex (sRef arr)
+{
+  int result;
+
+  llassert (sRef_isValid (arr));
+  arr = sRef_fixConj (arr);
+
+  llassert (arr->kind == SK_ARRAYFETCH);  
+
+  if (!arr->info->arrayfetch->indknown)
+    {
+      llcontbug (message ("sRef_getIndex: unknown: %q", sRef_unparse (arr)));
+      result = 0; 
+    }
+  else
+    {
+      result = arr->info->arrayfetch->ind;
+    }
+
+  return result;
+}
+
+static bool sRef_isZerothArrayFetch (/*@notnull@*/ sRef s)
+{
+  return (s->kind == SK_ARRAYFETCH
+	  && s->info->arrayfetch->indknown
+	  && (s->info->arrayfetch->ind == 0));
+}
+
+/*@exposed@*/ sRef sRef_makeAddress (/*@exposed@*/ sRef t)
+{
+  
+  if (sRef_isInvalid (t)) return sRef_undefined;
+
+  if (sRef_isPointer (t))
+    {
+      return (t->info->ref);
+    }
+  else if (sRef_isZerothArrayFetch (t))
+    {
+      return (t->info->arrayfetch->arr);
+    }
+  else
+    {
+      sRef s = sRef_new ();
+      
+      s->kind = SK_ADR;
+      s->type = ctype_makePointer (t->type);
+      s->info = (sinfo) dmalloc (sizeof (*s->info));
+      s->info->ref = t;
+      
+      if (t->defstate == SS_UNDEFINED) 
+	/* no! it is allocated even still: && !ctype_isPointer (t->type)) */
+	{
+	  s->defstate = SS_ALLOCATED;
+	}
+      else
+	{
+	  s->defstate = t->defstate;
+	}
+
+      if (t->aliaskind == AK_LOCAL)
+	{
+	  if (sRef_isLocalVar (t))
+	    {
+	      s->aliaskind = AK_STACK;
+	    }
+	}
+
+      return s;
+    }
+}
+
+cstring sRef_getField (sRef s)
+{
+  cstring res;
+
+  llassert (sRef_isValid (s));
+  s = sRef_fixConj (s);
+
+  llassertprint (sRef_isValid (s) && (s->kind == SK_FIELD),
+		 ("s = %s", sRef_unparseDebug (s)));
+
+  res = s->info->field->field;
+  return (res);
+}
+
+sRef sRef_getBase (sRef s)
+{
+  sRef res;
+
+  if (sRef_isInvalid (s)) return (sRef_undefined);
+
+  s = sRef_fixConj (s);
+
+  switch (s->kind)
+    {
+    case SK_ADR:
+    case SK_PTR:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+      res = s->info->ref;
+      break;
+    case SK_FIELD:
+      res = s->info->field->rec;
+      break;
+
+    case SK_ARRAYFETCH:
+      res = s->info->arrayfetch->arr;
+      break;
+
+    default:
+      res = sRef_undefined; /* shouldn't need it */
+    }
+
+  return (res);
+}
+
+/*
+** same as getBase, except returns invalid
+** (and doesn't use adr's)                   
+*/
+
+sRef
+sRef_getBaseSafe (sRef s)
+{
+  sRef res;
+
+  if (sRef_isInvalid (s)) { return sRef_undefined; }
+
+  s = sRef_fixConj (s);
+
+  switch (s->kind)
+    {
+    case SK_PTR:
+            res = s->info->ref; 
+      break;
+    case SK_FIELD:
+            res = s->info->field->rec; break;
+    case SK_ARRAYFETCH:
+            res = s->info->arrayfetch->arr; 
+      break;
+    default:
+      res = sRef_undefined; break;
+    }
+
+  return res;
+}
+
+/*@constant int MAXBASEDEPTH;@*/
+# define MAXBASEDEPTH 25
+
+static /*@exposed@*/ sRef 
+sRef_getRootBaseAux (sRef s, int depth)
+{
+  if (sRef_isInvalid (s)) return sRef_undefined;
+
+  if (depth > MAXBASEDEPTH)
+    {
+      llgenmsg (message 
+		("Warning: reference base limit exceeded for %q. "
+		 "This either means there is a variable with at least "
+		 "%d indirections from this reference, or "
+		 "there is a bug in LCLint.",
+		 sRef_unparse (s),
+		 MAXBASEDEPTH),
+		g_currentloc);
+
+      return sRef_undefined;
+    }
+
+  switch (s->kind)
+    {
+    case SK_ADR:
+    case SK_PTR:
+      return (sRef_getRootBaseAux (s->info->ref, depth + 1));
+    case SK_FIELD:
+      return (sRef_getRootBaseAux (s->info->field->rec, depth + 1));
+    case SK_ARRAYFETCH:
+      return (sRef_getRootBaseAux (s->info->arrayfetch->arr, depth + 1));
+    case SK_CONJ:
+      return (sRef_getRootBaseAux (sRef_fixConj (s), depth + 1));
+    default:
+      return s;
+    }
+}
+
+sRef sRef_getRootBase (sRef s)
+{
+  return (sRef_getRootBaseAux (s, 0));
+}
+
+static bool sRef_isDeep (sRef s)
+{
+  if (sRef_isInvalid (s)) return FALSE;
+  
+  switch (s->kind)
+    {
+    case SK_ADR:
+    case SK_PTR:
+    case SK_FIELD:
+    case SK_ARRAYFETCH:
+      return TRUE;
+    case SK_CONJ:
+      return (sRef_isDeep (sRef_fixConj (s)));
+    default:
+      return FALSE;
+    }
+}
+
+static int sRef_depth (sRef s)
+{
+  if (sRef_isInvalid (s)) return 0;
+  
+  switch (s->kind)
+    {
+    case SK_ADR:
+    case SK_PTR:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+      return 1 + sRef_depth (s->info->ref);
+    case SK_FIELD:
+      return 1 + sRef_depth (s->info->field->rec);
+    case SK_ARRAYFETCH:
+      return 1 + sRef_depth (s->info->arrayfetch->arr);
+    case SK_CONJ:
+      return (sRef_depth (sRef_fixConj (s)));
+    default:
+      return 1;
+    }
+}
+
+sRef
+sRef_makeObject (ctype o)
+{
+  sRef s = sRef_new ();
+
+  s->kind = SK_OBJECT;
+  s->info = (sinfo) dmalloc (sizeof (*s->info));
+  s->info->object = o;
+  return s;
+}
+
+sRef sRef_makeExternal (/*@exposed@*/ sRef t)
+{
+  sRef s = sRef_new ();
+
+  llassert (sRef_isValid (t));
+
+  s->kind = SK_EXTERNAL;
+  s->info = (sinfo) dmalloc (sizeof (*s->info));
+  s->type = t->type;
+  s->info->ref = t;
+  return s;
+}
+
+sRef sRef_makeDerived (/*@exposed@*/ sRef t)
+{
+  if (sRef_isValid (t))
+    {
+      sRef s = sRef_new ();
+      
+      s->kind = SK_DERIVED;
+      s->info = (sinfo) dmalloc (sizeof (*s->info));
+      s->info->ref = t;
+      
+      s->type = t->type;
+      return s;
+    }
+  else
+    {
+      return sRef_undefined;
+    }
+}
+
+/*
+** definitely NOT symmetric:
+**
+**   res fills in unknown state information from other
+*/
+
+void
+sRef_mergeStateQuiet (sRef res, sRef other)
+{
+  llassert (sRef_isValid (res));
+  llassert (sRef_isValid (other));
+
+  res->modified = res->modified || other->modified;
+  res->safe = res->safe && other->safe;
+
+  if (res->defstate == SS_UNKNOWN) 
+    {
+      res->defstate = other->defstate;
+      res->definfo = alinfo_update (res->definfo, other->definfo);
+    }
+
+  if (res->aliaskind == AK_UNKNOWN || 
+      (res->aliaskind == AK_LOCAL && alkind_isKnown (other->aliaskind)))
+    {
+      res->aliaskind = other->aliaskind;
+      res->oaliaskind = other->oaliaskind;
+      res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+    }
+
+  if (res->expkind == XO_UNKNOWN)
+    {
+      res->expkind = other->expkind;
+      res->oexpkind = other->oexpkind;
+      res->expinfo = alinfo_update (res->expinfo, other->expinfo);
+    }
+  
+  /* out takes precedence over implicitly defined */
+  if (res->defstate == SS_DEFINED && other->defstate != SS_UNKNOWN) 
+    {
+      res->defstate = other->defstate;
+      res->definfo = alinfo_update (res->definfo, other->definfo);
+    }
+
+  if (other->nullstate == NS_ERROR || res->nullstate == NS_ERROR) 
+    {
+      res->nullstate = NS_ERROR;
+    }
+  else
+    {
+      if (other->nullstate != NS_UNKNOWN 
+	  && (res->nullstate == NS_UNKNOWN || res->nullstate == NS_NOTNULL 
+	      || res->nullstate == NS_MNOTNULL))
+	{
+	  res->nullstate = other->nullstate;
+	  res->nullinfo = alinfo_update (res->nullinfo, other->nullinfo);
+	}
+    }
+}
+
+/*
+** definitely NOT symmetric:
+**
+**   res fills in known state information from other
+*/
+
+void
+sRef_mergeStateQuietReverse (sRef res, sRef other)
+{
+  bool changed = FALSE;
+
+  llassert (sRef_isValid (res));
+  llassert (sRef_isValid (other));
+
+  if (res->kind != other->kind)
+    {
+      changed = TRUE;
+
+      sinfo_free (res);
+
+      res->kind = other->kind;
+      res->type = other->type;
+      res->info = sinfo_fullCopy (other);
+    }
+  else
+    {
+      if (!ctype_equal (res->type, other->type))
+	{
+	  changed = TRUE;
+	  res->type = other->type;
+	}
+      
+      sinfo_update (res, other);
+    }
+
+  res->modified = res->modified || other->modified;
+  res->safe = res->safe && other->safe;
+
+  if (res->aliaskind != other->aliaskind
+      && (res->aliaskind == AK_UNKNOWN
+	  || ((res->aliaskind == AK_LOCAL 
+	       || (res->aliaskind == AK_REFCOUNTED
+		   && other->aliaskind != AK_LOCAL))
+	      && other->aliaskind != AK_UNKNOWN)))
+    {
+      changed = TRUE;
+      res->aliaskind = other->aliaskind;
+      res->oaliaskind = other->oaliaskind;
+      res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+          }
+
+  if (other->expkind != XO_UNKNOWN && other->expkind != res->expkind)
+    {
+      changed = TRUE;
+      res->expkind = other->expkind;
+      res->expinfo = alinfo_update (res->expinfo, other->expinfo);
+    }
+
+  if (other->oexpkind != XO_UNKNOWN)
+    {
+      res->oexpkind = other->oexpkind;
+    }
+
+  /* out takes precedence over implicitly defined */
+
+  if (res->defstate != other->defstate)
+    {
+      if (other->defstate != SS_UNKNOWN)
+	{
+	  res->defstate = other->defstate;
+	}
+    }
+
+  if (other->nullstate == NS_ERROR || res->nullstate == NS_ERROR)
+    {
+      if (res->nullstate != NS_ERROR)
+	{
+	  res->nullstate = NS_ERROR;
+	  changed = TRUE;
+	}
+    }
+  else
+    {
+      if (other->nullstate != NS_UNKNOWN && other->nullstate != res->nullstate)
+	{
+	  changed = TRUE;
+	  res->nullstate = other->nullstate;
+	  res->nullinfo = alinfo_update (res->nullinfo, other->nullinfo);
+	}
+    }
+
+  if (changed)
+    {
+      sRef_clearDerived (res); 
+    }
+}
+
+void 
+sRef_mergeState (sRef res, sRef other, clause cl, fileloc loc)
+{
+  if (sRef_isValid (res) && sRef_isValid (other))
+    {
+      sRef_mergeStateAux (res, other, cl, FALSE, loc, TRUE);
+    }
+  else
+    {
+      if (sRef_isInvalid (res))
+	{
+	  llbug (message ("sRef_mergeState: invalid res sRef: %q", 
+			  sRef_unparseDebug (other)));
+	}
+      else 
+	{
+	  llbug (message ("sRef_mergeState: invalid other sRef: %q", 
+			  sRef_unparseDebug (res)));
+	}
+    }
+}
+
+void 
+sRef_mergeOptState (sRef res, sRef other, clause cl, fileloc loc)
+{
+  if (sRef_isValid (res) && sRef_isValid (other))
+    {
+      sRef_mergeStateAux (res, other, cl, TRUE, loc, TRUE);
+    }
+  else
+    {
+      if (sRef_isInvalid (res))
+	{
+	  llbug (message ("sRef_mergeOptState: invalid res sRef: %q", 
+			  sRef_unparseDebug (other)));
+	}
+      else 
+	{
+	  llbug (message ("sRef_mergeOptState: invalid other sRef: %q", 
+			  sRef_unparseDebug (res)));
+	}
+    }
+}
+
+static void
+sRef_mergeStateAux (/*@notnull@*/ sRef res, /*@notnull@*/ sRef other, 
+		    clause cl, bool opt, fileloc loc,
+		    bool doDerivs)
+   /*@modifies res@*/ 
+{
+  llassertfatal (sRef_isValid (res));
+  llassertfatal (sRef_isValid (other));
+  
+  res->modified = res->modified || other->modified;
+
+  if (res->kind == other->kind 
+      || (other->kind == SK_UNKNOWN || res->kind == SK_UNKNOWN))
+    {
+      sstate odef = other->defstate;
+      sstate rdef = res->defstate;
+      nstate onull = other->nullstate;
+      
+      /*
+      ** yucky stuff to handle 
+      **
+      **   if (s) free (s);
+      */
+
+      if (other->defstate == SS_DEAD 
+	  && ((sRef_isOnly (res) && sRef_definitelyNull (res))
+	      || (res->defstate == SS_UNDEFINED
+		  || res->defstate == SS_UNUSEABLE)))
+	{
+	  if (res->defstate == SS_UNDEFINED
+	      || res->defstate == SS_UNUSEABLE)
+	    {
+	      res->defstate = SS_UNUSEABLE;
+	    }
+	  else
+	    {
+	      res->defstate = SS_DEAD;
+	    }
+
+	  res->definfo = alinfo_update (res->definfo, other->definfo);
+	  sRef_clearDerived (other);
+	  sRef_clearDerived (res);
+	  	}
+      else if (res->defstate == SS_DEAD 
+	       && ((sRef_isOnly (other) && sRef_definitelyNull (other))
+		   || (other->defstate == SS_UNDEFINED
+		       || other->defstate == SS_UNUSEABLE)))
+	{
+	  if (other->defstate == SS_UNDEFINED
+	      || other->defstate == SS_UNUSEABLE)
+	    {
+	      res->defstate = SS_UNUSEABLE;
+	    }
+	  else
+	    {
+	      res->defstate = SS_DEAD;
+	    }
+
+	  sRef_clearDerived (other);
+	  sRef_clearDerived (res);
+	}
+      else if (res->defstate == SS_DEFINED 
+	       && (other->defstate == SS_ALLOCATED 
+		   && sRef_definitelyNull (other)))
+	{
+	  other->defstate = SS_DEFINED; /* definitely null! */
+	}
+      else if (other->defstate == SS_DEFINED
+	       && (res->defstate == SS_ALLOCATED && sRef_definitelyNull (res)))
+	{
+	  res->defstate = SS_DEFINED;
+	  res->definfo = alinfo_update (res->definfo, other->definfo);
+	}
+      else
+	{
+	  ; /* okay */
+	}
+
+      if (res->defstate == SS_DEAD && other->defstate == SS_DEAD)
+	{
+	  sRef_clearDerived (other);
+	  sRef_clearDerived (res);
+	}
+
+      /*
+      ** only & dead isn't really an only!
+      */
+
+      if (alkind_isOnly (other->aliaskind) && other->defstate == SS_DEAD)
+	{
+	  other->aliaskind = AK_UNKNOWN;
+	}
+
+      if (alkind_isOnly (res->aliaskind) && res->defstate == SS_DEAD)
+	{
+	  res->aliaskind = AK_UNKNOWN;
+	}
+
+      /*
+      ** Dead and dependent -> dead
+      */
+      
+      if (alkind_isDependent (other->aliaskind) && res->defstate == SS_DEAD)
+	{
+	  other->aliaskind = AK_UNKNOWN;
+	  other->defstate = SS_DEAD;
+	  sRef_clearDerived (res);
+	  sRef_clearDerived (other);
+	  	}
+
+      if (alkind_isDependent (res->aliaskind) && other->defstate == SS_DEAD)
+	{
+	  res->aliaskind = AK_UNKNOWN;
+	  res->defstate = SS_DEAD;
+	  sRef_clearDerived (res);
+	  sRef_clearDerived (other);
+	}
+
+      /*
+      ** must do alias combine first, since it depends on 
+      ** original values of state and null.
+      */
+
+      sRef_combineAliasKinds (res, other, cl, loc);
+      sRef_combineDefState (res, other);
+      sRef_combineNullState (res, other);
+
+      if (rdef == SS_ALLOCATED || rdef == SS_SPECIAL)
+	{
+	  if (odef == SS_DEFINED)
+	    {
+	      if (onull == NS_DEFNULL || onull == NS_CONSTNULL)
+		{
+		  res->deriv = sRefSet_copy (res->deriv, other->deriv);
+		}
+
+	      	      	      ; 
+	    }
+	  else if (odef == SS_ALLOCATED
+		   || odef == SS_SPECIAL)
+	    {
+	      
+	      if (doDerivs)
+		{
+		  if (ctype_isUnion (ctype_realType (sRef_getType (res))))
+		    {
+		      res->deriv = sRef_mergeUnionDerivs (res->deriv, 
+							  other->deriv, 
+							  opt, cl, loc);
+		    }
+		  else
+		    {
+		      		      res->deriv = sRef_mergeDerivs (res->deriv, other->deriv, 
+						     opt, cl, loc);
+		    }
+		}
+	    }
+	  else
+	    {
+	      if (doDerivs)
+		{
+		  		  res->deriv = sRef_mergeDerivs (res->deriv, other->deriv, 
+						 opt, cl, loc);
+		}
+	      else
+		{
+		  		}
+	    }
+	}
+      else
+	{
+	  if (rdef == SS_PDEFINED
+	      || (rdef == SS_DEFINED && odef == SS_PDEFINED))
+	    {
+	      if (doDerivs)
+		{
+		  		  res->deriv = sRef_mergePdefinedDerivs (res->deriv, other->deriv, 
+							 opt, cl, loc);
+		}
+	    }
+	  else
+	    {
+	      if ((rdef == SS_DEFINED  || rdef == SS_UNKNOWN)
+		  && res->defstate == SS_ALLOCATED)
+		{
+		  		  res->deriv = sRefSet_copy (res->deriv, other->deriv);
+		}
+	      else
+		{
+		  if (doDerivs)
+		    {
+		      		      res->deriv = sRef_mergeDerivs (res->deriv, other->deriv, 
+						     opt, cl, loc);
+		    }
+		}
+	    }
+	}
+
+      
+      sRef_combineExKinds (res, other);
+    }
+  else
+    {
+      if (res->kind == SK_ARRAYFETCH && other->kind == SK_PTR)
+	{
+	  sRef nother = sRef_buildArrayFetchKnown (sRef_getBase (other), 0);
+
+	  sRef_copyState (nother, other);
+	  sRef_mergeStateAux (res, nother, cl, opt, loc, doDerivs);
+	}
+      else if (res->kind == SK_PTR && other->kind == SK_ARRAYFETCH)
+	{
+	  sRef nother = sRef_buildPointer (sRef_getBase (other));
+
+	  if (sRef_isValid (nother))
+	    {
+	      sRef_copyState (nother, other);
+	      sRef_mergeStateAux (res, nother, cl, opt, loc, doDerivs);
+	    }
+	}
+      else
+	{
+	  llcontbug (message ("merge conj: %q / %q", sRef_unparseFull (res), 
+			      sRef_unparseFull (other)));
+	  
+	}
+    }
+  
+  }
+
+static sRefSet
+sRef_mergeUnionDerivs (/*@only@*/ sRefSet res, 
+		       /*@exposed@*/ sRefSet other, bool opt,
+		       clause cl, fileloc loc)
+{
+  if (sRefSet_isEmpty (res))
+    {
+      return sRefSet_copy (res, other);
+    }
+  else
+    {
+      sRefSet_allElements (other, el)
+	{
+	  if (sRef_isValid (el))
+	    {
+	      sRef e2 = sRefSet_lookupMember (other, el);
+	      
+	      if (sRef_isValid (e2))
+		{
+		  sRef_mergeStateAux (el, e2, cl, opt, loc, FALSE);
+		}
+	      else
+		{
+		  res = sRefSet_insert (res, el);
+		}
+	    }
+	} end_sRefSet_allElements ;
+
+      return res;
+    }
+}
+
+static /*@only@*/ sRefSet
+sRef_mergeDerivs (/*@only@*/ sRefSet res, sRefSet other, 
+		  bool opt, clause cl, fileloc loc)
+{
+  sRefSet ret = sRefSet_new ();
+  
+    
+  sRefSet_allElements (res, el)
+    {
+      if (sRef_isValid (el))
+	{
+	  sRef e2 = sRefSet_lookupMember (other, el);
+
+	  if (sRef_isValid (e2))
+	    {
+	      if (el->defstate == SS_ALLOCATED &&
+		  e2->defstate == SS_PDEFINED)
+		{
+		  e2->defstate = SS_ALLOCATED;
+		}
+	      else if (e2->defstate == SS_ALLOCATED &&
+		       el->defstate == SS_PDEFINED)
+		{
+		  el->defstate = SS_ALLOCATED;
+		  sRef_clearDerived (el);
+		}
+	      else if ((el->defstate == SS_DEAD || sRef_isKept (el)) &&
+		       (e2->defstate == SS_DEFINED && !sRef_isKept (e2)))
+		{
+		  
+		  if (checkDeadState (el, TRUE, loc))
+		    {
+		      if (sRef_isThroughArrayFetch (el))
+			{
+			  sRef_maybeKill (el, loc);
+			  sRef_maybeKill (e2, loc);
+			}
+		    }
+		}
+	      else if ((e2->defstate == SS_DEAD || sRef_isKept (e2)) &&
+		       (el->defstate == SS_DEFINED && !sRef_isKept (el)))
+		{
+		  
+		  if (checkDeadState (e2, FALSE, loc))
+		    {
+		      if (sRef_isThroughArrayFetch (el))
+			{
+			  sRef_maybeKill (el, loc);
+			  sRef_maybeKill (e2, loc);
+			}
+		    }
+		}
+	      else if (el->defstate == SS_DEFINED &&
+		       e2->defstate == SS_PDEFINED)
+		{
+		  el->defstate = SS_PDEFINED;
+		}
+	      else if (e2->defstate == SS_DEFINED &&
+		       el->defstate == SS_PDEFINED)
+		{
+		  e2->defstate = SS_PDEFINED;
+		}
+	      else
+		{
+		  ; /* okay */
+		}
+
+	      if (ctype_isUnion (ctype_realType (sRef_getType (el))))
+		{
+		  el->deriv = sRef_mergeUnionDerivs (el->deriv, e2->deriv, 
+						     opt, cl, loc); 
+		}
+	      else
+		{
+		  el->deriv = sRef_mergeDerivs (el->deriv, e2->deriv, opt, cl, loc); 
+		}
+	      
+	      if (sRef_equivalent (el, e2))
+		{
+		  		  ret = sRefSet_insert (ret, el);
+		}
+	      else
+		{
+		  sRef sr = sRef_leastCommon (el, e2);
+
+		  if (sRef_isValid (sr))
+		    {
+		      ret = sRefSet_insert (ret, sr);
+		    }
+		  else
+		    {
+		      ;
+		    }
+		}
+	      
+	      (void) sRefSet_delete (other, e2);
+	    }
+	  else /* not defined */
+	    {
+	      	      (void) checkDeadState (el, TRUE, loc);
+	    }
+	}
+    } end_sRefSet_allElements;
+
+  sRefSet_allElements (other, el)
+    {
+      if (sRef_isValid (el))
+	{
+	  (void) checkDeadState (el, FALSE, loc);
+	}
+    } end_sRefSet_allElements;
+  
+  sRefSet_free (res); 
+  return (ret);
+}
+
+/*
+** Returns TRUE is there is an error.
+*/
+
+static bool checkDeadState (/*@notnull@*/ sRef el, bool tbranch, fileloc loc)
+{
+  /*
+  ** usymtab_isGuarded --- the utab should still be in the
+  ** state of the alternate branch.
+  **
+  ** tbranch TRUE means el is released in the last branch, e.g.
+  **     if (x != NULL) { ; } else { sfree (x); }
+  ** so, if x is null in the other branch no error is reported.
+  **
+  ** tbranch FALSE means this is the other branch:
+  **     if (x != NULL) { sfree (x); } else { ; }
+  ** so, if x is null in this branch there is no error.
+  */
+
+  
+  if ((sRef_isDead (el) || sRef_isKept (el))
+      && !sRef_isDeepUnionField (el) && !sRef_isThroughArrayFetch (el))
+    {
+       
+      if (!tbranch)
+	{
+	  if (usymtab_isProbableDeepNull (el))
+	    {
+	      	      return TRUE;
+	    }
+	}
+      else
+	{
+	  if (usymtab_isAltProbablyDeepNull (el))
+	    {
+	      	      return TRUE;
+	    }
+	}
+
+      if (optgenerror
+	  (FLG_BRANCHSTATE,
+	   message ("Storage %q is %q in one path, but live in another.",
+		    sRef_unparse (el),
+		    cstring_makeLiteral (sRef_isKept (el) 
+					 ? "kept" : "released")),
+	   loc))
+	{
+	  	  
+	  if (sRef_isKept (el))
+	    {
+	      sRef_showAliasInfo (el);      
+	    }
+	  else
+	    {
+	      sRef_showStateInfo (el);
+	    }
+
+	  /* prevent further errors */
+	  el->defstate = SS_UNKNOWN; 
+	  sRef_setAliasKind (el, AK_ERROR, fileloc_undefined);
+	  
+	  return FALSE;
+	}
+    }
+
+  return TRUE;
+}
+
+static void 
+checkDerivDeadState (/*@notnull@*/ sRef el, bool tbranch, fileloc loc)
+{
+  
+  if (checkDeadState (el, tbranch, loc))
+    {
+      sRefSet_allElements (el->deriv, t)
+	{
+	  if (sRef_isValid (t))
+	    {
+	      	      checkDerivDeadState (t, tbranch, loc);
+	    }
+	} end_sRefSet_allElements;
+    }
+}
+
+static sRefSet
+  sRef_mergePdefinedDerivs (sRefSet res, sRefSet other, bool opt, 
+			    clause cl, fileloc loc)
+{
+  sRefSet ret = sRefSet_new ();
+
+  sRefSet_allElements (res, el)
+    {
+      if (sRef_isValid (el))
+	{
+	  sRef e2 = sRefSet_lookupMember (other, el);
+	  
+	  if (sRef_isValid (e2))
+	    {
+	      if (sRef_isAllocated (el) && !sRef_isAllocated (e2))
+		{
+		  ;
+		}
+	      else if (sRef_isAllocated (e2) && !sRef_isAllocated (el))
+		{
+		  el->deriv = sRefSet_copy (el->deriv, e2->deriv); 
+		}
+	      else
+		{
+		  el->deriv = sRef_mergePdefinedDerivs (el->deriv, e2->deriv, 
+							opt, cl, loc);
+		}
+
+	      sRef_mergeStateAux (el, e2, cl, opt, loc, FALSE);
+	      
+	      ret = sRefSet_insert (ret, el);
+	      (void) sRefSet_delete (other, e2);
+	    }
+	  else
+	    {
+	      if (!opt)
+		{
+		  		  checkDerivDeadState (el, (cl == FALSECLAUSE), loc);
+		}
+
+	      ret = sRefSet_insert (ret, el);
+	    }
+	}
+    } end_sRefSet_allElements;
+  
+  sRefSet_allElements (other, el)
+    {
+      if (sRef_isValid (el))
+	{
+	  if (!sRefSet_member (ret, el))
+	    {
+	      	      	      /* was cl == FALSECLAUSE */
+	      checkDerivDeadState (el, FALSE, loc);
+	      ret = sRefSet_insert (ret, el);
+	    }
+	  else
+	    {
+	      /*
+	      ** it's okay --- member is a different equality test 
+	      */
+	    }
+	}
+    } end_sRefSet_allElements;
+
+  sRefSet_free (res);
+  return (ret);
+}
+
+sRef sRef_makeConj (/*@exposed@*/ /*@returned@*/ sRef a, /*@exposed@*/ sRef b)
+{
+  llassert (sRef_isValid (a));
+  llassert (sRef_isValid (b));
+      
+  if (!sRef_equivalent (a, b))
+    {
+      sRef s = sRef_new ();
+      
+      s->kind = SK_CONJ;
+      s->info = (sinfo) dmalloc (sizeof (*s->info));
+      s->info->conj = (cjinfo) dmalloc (sizeof (*s->info->conj));
+      s->info->conj->a = a;
+      s->info->conj->b = b;
+      
+      if (ctype_equal (a->type, b->type)) s->type = a->type;
+      else s->type = ctype_makeConj (a->type, b->type);
+      
+      if (a->defstate == b->defstate)
+	{
+	  s->defstate = a->defstate;
+	}
+      else
+	{
+	  s->defstate = SS_UNKNOWN; 
+	}
+      
+      s->nullstate = NS_UNKNOWN;
+      
+      s->safe = a->safe && b->safe;
+      s->aliaskind = alkind_resolve (a->aliaskind, b->aliaskind);
+
+      return s;
+    }
+  else
+    {
+      /*@-exposetrans@*/ return a; /*@=exposetrans@*/
+    }
+}
+
+sRef
+sRef_makeUnknown ()
+{
+  sRef s = sRef_new ();
+
+  s->kind = SK_UNKNOWN;
+  return s;
+}
+
+static sRef
+sRef_makeSpecial (speckind sk) /*@*/
+{
+  sRef s = sRef_new ();
+
+  s->kind = SK_SPECIAL;
+  s->info = (sinfo) dmalloc (sizeof (*s->info));
+  s->info->spec = sk;
+  return s;
+}
+
+static sRef srnothing = sRef_undefined;
+static sRef srinternal = sRef_undefined;
+static sRef srsystem = sRef_undefined;
+static sRef srspec = sRef_undefined;
+
+sRef
+sRef_makeNothing (void)
+{
+  if (sRef_isInvalid (srnothing))
+    {
+      srnothing = sRef_makeSpecial (SR_NOTHING);
+    }
+
+  /*@-retalias@*/
+  return srnothing;
+  /*@=retalias@*/
+}
+
+sRef
+sRef_makeInternalState (void)
+{
+  if (sRef_isInvalid (srinternal))
+    {
+      srinternal = sRef_makeSpecial (SR_INTERNAL);
+    }
+
+  /*@-retalias@*/
+  return srinternal;
+  /*@=retalias@*/
+}
+
+sRef
+sRef_makeSpecState (void)
+{
+  if (sRef_isInvalid (srspec))
+    {
+      srspec = sRef_makeSpecial (SR_SPECSTATE);
+    }
+
+  /*@-retalias@*/
+  return srspec;
+  /*@=retalias@*/
+}
+
+sRef
+sRef_makeSystemState (void)
+{
+  if (sRef_isInvalid (srsystem))
+    {
+      srsystem = sRef_makeSpecial (SR_SYSTEM);
+    }
+
+  /*@-retalias@*/
+  return (srsystem);
+  /*@=retalias@*/
+}
+
+static sRef
+sRef_makeResultType (ctype ct)
+{
+  sRef res = sRef_makeResult ();
+
+  res->type = ct;
+  return res;
+}
+
+sRef
+sRef_makeResult ()
+{
+  sRef s = sRef_new ();
+  
+  s->kind = SK_RESULT;
+  s->type = ctype_unknown;
+  s->defstate = SS_UNKNOWN; 
+  s->aliaskind = AK_UNKNOWN;
+  s->nullstate = NS_UNKNOWN;
+  
+  return s;
+}
+
+
+bool
+sRef_isNothing (sRef s)
+{
+  return (sRef_isKindSpecial (s) && s->info->spec == SR_NOTHING);
+}
+
+bool
+sRef_isInternalState (sRef s)
+{
+  return (sRef_isKindSpecial (s) && s->info->spec == SR_INTERNAL);
+}
+
+bool
+sRef_isSpecInternalState (sRef s)
+{
+  return (sRef_isKindSpecial (s) 
+	  && (s->info->spec == SR_INTERNAL || s->info->spec == SR_SPECSTATE));
+}
+
+bool
+sRef_isSpecState (sRef s)
+{
+  return (sRef_isKindSpecial (s) && s->info->spec == SR_SPECSTATE);
+}
+
+bool
+sRef_isResult (sRef s)
+{
+  return (sRef_isValid (s) && s->kind == SK_RESULT);
+}
+
+bool
+sRef_isSystemState (sRef s)
+{
+  return (sRef_isKindSpecial (s) && s->info->spec == SR_SYSTEM);
+}
+
+usymId
+sRef_getScopeIndex (sRef s)
+{
+  llassert (sRef_isValid (s));
+  llassert (sRef_isCvar (s));
+
+  return (s->info->cvar->index);
+}
+
+void
+sRef_makeSafe (sRef s)
+{
+  if (sRef_isValid (s)) 
+    {
+      s->safe = TRUE;
+    }
+}
+
+void
+sRef_makeUnsafe (sRef s)
+{
+  if (sRef_isValid (s)) 
+    {
+      s->safe = FALSE;
+    }
+}
+
+/*
+** memory state operations
+*/
+
+/*@only@*/ cstring sRef_unparseFull (sRef s)
+{
+  if (sRef_isInvalid (s)) return (cstring_undefined);
+
+  return (message ("[%d] %q - %q [%s] { %q }", 
+		   (int) s,
+		   sRef_unparseDebug (s), 
+		   sRef_unparseState (s),
+		   exkind_unparse (s->oexpkind),
+		   sRefSet_unparseDebug (s->deriv)));
+}
+
+/*@unused@*/ cstring sRef_unparseDeep (sRef s)
+{
+  cstring st = cstring_undefined;
+
+  st = message ("%q:", sRef_unparseFull (s));
+
+  if (sRef_isValid (s))
+    {
+      sRefSet_allElements (s->deriv, el)
+	{
+	  st = message("%q\n%q", st, sRef_unparseDeep (el));
+	} end_sRefSet_allElements ;
+    }
+
+  return st;
+}
+
+/*@only@*/ cstring sRef_unparseState (sRef s)
+{
+  if (sRef_isConj (s))
+    {
+      return (message ("%q | %q", 
+		       sRef_unparseState (s->info->conj->a),
+		       sRef_unparseState (s->info->conj->b)));
+    }
+
+  if (sRef_isInvalid (s))
+    {
+      return (cstring_makeLiteral (""));
+    }
+
+  return (message ("%s.%s.%s.%s", 
+		   alkind_unparse (s->aliaskind), 
+		   nstate_unparse (s->nullstate),
+		   exkind_unparse (s->expkind),
+		   sstate_unparse (s->defstate)));
+}
+
+bool sRef_isNotUndefined (sRef s)
+{
+  return (sRef_isInvalid (s)
+	  || (s->defstate != SS_UNDEFINED
+	      && s->defstate != SS_UNUSEABLE
+	      && s->defstate != SS_DEAD));
+}
+
+ynm sRef_isWriteable (sRef s)
+{
+  if (sRef_isInvalid (s)) return MAYBE;
+
+  if (sRef_isConj (s) && s->defstate == SS_UNKNOWN)
+    {
+      if (ynm_toBoolStrict (sRef_isWriteable (sRef_getConjA (s))))
+	{
+	  if (ynm_toBoolStrict (sRef_isWriteable (sRef_getConjB (s))))
+	    {
+	      return YES;
+	    }
+	  return MAYBE;
+	}
+      else
+	{
+	  if (ynm_toBoolStrict (sRef_isWriteable (sRef_getConjB (s))))
+	    {
+	      return MAYBE;
+	    }
+	  return NO;
+	}
+    }
+
+  return (ynm_fromBool (s->defstate != SS_UNUSEABLE));
+}
+
+bool sRef_hasNoStorage (sRef s)
+{
+  return (!sRef_isAllocatedStorage (s) || sRef_isDefinitelyNull (s));
+}
+
+bool sRef_isStrictReadable (sRef s)
+{
+  return (ynm_toBoolStrict (sRef_isReadable (s)));
+}
+
+ynm sRef_isReadable (sRef s)
+{
+  sstate ss;
+
+  if (sRef_isInvalid (s)) return YES;
+
+  ss = s->defstate;
+  
+  if (sRef_isConj (s) && s->defstate == SS_UNKNOWN)
+    {
+      if (ynm_toBoolStrict (sRef_isReadable (sRef_getConjA (s))))
+	{
+	  if (ynm_toBoolStrict (sRef_isReadable (sRef_getConjB (s))))
+	    {
+	      return YES;
+	    }
+	  return MAYBE;
+	}
+      else
+	{
+	  if (ynm_toBoolStrict (sRef_isReadable (sRef_getConjB (s))))
+	    {
+	      return MAYBE;
+	    }
+	  return NO;
+	}
+    }
+  else if (ss == SS_HOFFA)
+    {
+      if (context_getFlag (FLG_STRICTUSERELEASED))
+	{
+	  return MAYBE;
+	}
+      else
+	{
+	  return YES;
+	}
+    }
+  else
+    {
+      return (ynm_fromBool (ss == SS_DEFINED 
+			    || ss == SS_FIXED 
+			    || ss == SS_RELDEF 
+			    || ss == SS_PDEFINED 
+			    || ss == SS_PARTIAL
+			    || ss == SS_SPECIAL
+			    || ss == SS_ALLOCATED
+			    || ss == SS_UNKNOWN));
+    }
+}
+
+static /*@exposed@*/ sRef whatUndefined (/*@exposed@*/ sRef fref, int depth)
+{
+  ctype ct;
+
+  
+  if (depth > MAXDEPTH)
+    {
+      llgenmsg (message 
+		("Warning: check definition limit exceeded, checking %q. "
+		 "This either means there is a variable with at least "
+		 "%d indirections apparent in the program text, or "
+		 "there is a bug in LCLint.",
+		 sRef_unparse (fref),
+		 MAXDEPTH),
+		g_currentloc);
+
+      return sRef_undefined;
+    }
+
+  if (!sRef_isKnown (fref) || sRef_isAnyDefined (fref))
+    {
+      return sRef_undefined;
+    }
+
+  if (sRef_isUnuseable (fref) || sRef_isStateUndefined (fref))
+    {
+      return fref;
+    }
+
+  ct = ctype_realType (sRef_getType (fref));
+  
+  if (ctype_isUnknown (ct))
+    {
+      return sRef_undefined;
+    }
+  else if (ctype_isPointer (ct) || ctype_isArray (ct))
+    {
+      if (sRef_isStateUnknown (fref))
+	{
+	  return sRef_undefined;
+	}
+      else
+	{
+	  sRef fptr = sRef_constructDeref (fref);
+
+	  return (whatUndefined (fptr, depth + 1));
+	}
+    }
+  else if (ctype_isStruct (ct))
+    {
+      bool hasOneDefined = FALSE;
+      
+      if (sRef_isStateUnknown (fref))
+	{
+	  return fref;
+	}
+	  
+      if (sRef_isPdefined (fref) || sRef_isAnyDefined (fref))
+	{
+	  sRefSet_realElements (sRef_derivedFields (fref), sr)
+	    {
+	      hasOneDefined = TRUE;
+	      
+	      if (sRef_isField (sr))
+		{
+		  cstring fieldname = sRef_getField (sr);
+		  sRef fldref = sRef_makeField (fref, fieldname);
+		  bool shouldCheck = !sRef_isRecursiveField (fldref);
+		  
+		  if (shouldCheck)
+		    {
+		      sRef wdef = whatUndefined (fldref, depth + 1);
+
+		      if (sRef_isValid (wdef))
+			{
+			  return wdef;
+			}
+		    }
+		}
+	    } end_sRefSet_realElements;
+	}
+      else if (sRef_isAllocated (fref))
+	{
+	  /*
+	  ** for structures, each field must be completely defined
+	  */
+	  
+	  uentryList fields = ctype_getFields (ct);
+	      
+	  uentryList_elements (fields, ue)
+	    {
+	      cstring name = uentry_getRealName (ue);
+	      sRef ffield = sRef_makeField (fref, name);
+	      bool shouldCheck = !sRef_isRecursiveField (ffield);
+
+	      if (sRef_isRelDef (uentry_getSref (ue)))
+		{
+		  ; /* no error */
+		}
+	      else
+		{
+		  if (shouldCheck)
+		    {
+		      sRef wdef = whatUndefined (ffield, depth + 1);
+
+		      if (sRef_isInvalid (wdef))
+			{
+			  return wdef;
+			}
+		    }
+		}
+	    } end_uentryList_elements;
+	}
+      else
+	{
+	  ;
+	}
+    }
+  else if (ctype_isUnion (ct))
+    {
+      ; 
+    }
+  else
+    {
+      ;
+    }
+
+  return sRef_undefined;
+}
+
+static bool checkDefined (sRef sr)
+{
+  return (sRef_isInvalid (whatUndefined (sr, 0)));
+}
+
+bool sRef_isReallyDefined (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      if (sRef_isAnyDefined (s))
+	{
+	  return TRUE;
+	}
+      else
+	{
+	  if (sRef_isAllocated (s) || sRef_isPdefined (s))
+	    {
+	      return checkDefined (s);
+	    }
+	  else
+	    {
+	      return FALSE;
+	    }
+	}
+    }
+  else
+    {
+      return TRUE;
+    }
+}
+
+void sRef_showNotReallyDefined (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      if (sRef_isAnyDefined (s))
+	{
+	  BADBRANCH;
+	}
+      else
+	{
+	  if (sRef_isAllocated (s) || sRef_isPdefined (s))
+	    {
+	      sRef ref = whatUndefined (s, 0);
+
+	      llassert (sRef_isValid (ref));
+
+	      if (ref != s)
+		{
+		  llgenindentmsgnoloc
+		    (message ("This sub-reference is %s: %q",
+			      sstate_unparse (sRef_getDefState (ref)),
+			      sRef_unparse (ref)));
+		}
+	    }
+	  else
+	    {
+	      ;
+	    }
+	}
+    }
+  else
+    {
+      BADBRANCH;
+    }
+}
+
+sstate sRef_getDefState (sRef s)
+{
+  if (sRef_isInvalid (s)) return (SS_UNKNOWN);
+  return (s->defstate);
+}
+
+void sRef_setDefState (sRef s, sstate defstate, fileloc loc)
+{
+  sRef_setStateAux (s, defstate, loc);
+}
+
+static void sRef_clearAliasStateAux (sRef s, fileloc loc)
+{
+  sRef_setAliasKind (s, AK_ERROR, loc);
+}
+
+void sRef_clearAliasState (sRef s, fileloc loc)
+{
+  sRef_aliasSetComplete (sRef_clearAliasStateAux, s, loc);
+}
+
+void sRef_setAliasKindComplete (sRef s, alkind kind, fileloc loc)
+{
+  sRef_aliasSetCompleteParam (sRef_setAliasKind, s, kind, loc);
+}
+
+void sRef_setAliasKind (sRef s, alkind kind, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      sRef_clearDerived (s);
+
+      if ((kind != s->aliaskind && kind != s->oaliaskind)
+	  && fileloc_isDefined (loc))
+	{
+	  s->aliasinfo = alinfo_updateLoc (s->aliasinfo, loc);
+	}
+      
+      s->aliaskind = kind;
+    }
+}
+
+void sRef_setOrigAliasKind (sRef s, alkind kind)
+{
+  if (sRef_isValid (s))
+    {
+      s->oaliaskind = kind;
+    }
+}
+
+exkind sRef_getExKind (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      return (s->expkind);
+    }
+  else
+    {
+      return XO_UNKNOWN;
+    }
+}
+
+exkind sRef_getOrigExKind (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      return (s->oexpkind);
+    }
+  else
+    {
+      return XO_UNKNOWN;
+    }
+}
+
+static void sRef_clearExKindAux (sRef s, fileloc loc)
+{
+  sRef_setExKind (s, XO_UNKNOWN, loc);
+}
+
+void sRef_setObserver (sRef s, fileloc loc) 
+{
+  sRef_setExKind (s, XO_OBSERVER, loc);
+}
+
+void sRef_setExposed (sRef s, fileloc loc) 
+{
+  sRef_setExKind (s, XO_EXPOSED, loc);
+}
+
+void sRef_clearExKindComplete (sRef s, fileloc loc)
+{
+  (void) sRef_aliasSetComplete (sRef_clearExKindAux, s, loc);
+}
+
+void sRef_setExKind (sRef s, exkind exp, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      if (s->expkind != exp)
+	{
+	  s->expinfo = alinfo_updateLoc (s->expinfo, loc);
+	}
+      
+      s->expkind = exp;
+    }
+}
+
+/*
+** s1->derived = s2->derived
+*/
+
+static void sRef_copyRealDerived (sRef s1, sRef s2)
+{
+  if (sRef_isValid (s1) && sRef_isValid (s2))
+    {
+      sRef sb = sRef_getRootBase (s1);
+
+      sRefSet_clear (s1->deriv);
+
+      sRefSet_allElements (s2->deriv, el)
+	{
+	  if (sRef_isValid (el))
+	    {
+	      sRef rb = sRef_getRootBase (el);
+	      
+	      if (!sRef_same (rb, sb))
+		{
+		  sRef fb = sRef_fixDirectBase (el, s1);
+		  
+		  if (sRef_isValid (fb))
+		    {
+		      sRef_copyRealDerived (fb, el);
+		      sRef_addDeriv (s1, fb);
+		    }
+		}
+	      else
+		{
+		  sRef_addDeriv (s1, el);
+		}
+	    }
+	} end_sRefSet_allElements ;
+    }
+  
+  }
+
+void sRef_copyRealDerivedComplete (sRef s1, sRef s2)
+{
+  sRef_innerAliasSetCompleteParam (sRef_copyRealDerived, s1, s2);
+}
+
+void sRef_setUndefined (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      s->defstate = SS_UNDEFINED;
+
+      if (fileloc_isDefined (loc))
+	{
+	  s->definfo = alinfo_updateLoc (s->definfo, loc);
+	}
+
+      sRef_clearDerived (s);
+    }
+}
+
+static void sRef_setDefinedAux (sRef s, fileloc loc, bool clear)
+{
+  if (sRef_isInvalid (s)) return;
+
+  if (s->defstate != SS_DEFINED && fileloc_isDefined (loc))
+    {
+      s->definfo = alinfo_updateLoc (s->definfo, loc);
+    }
+  
+  s->defstate = SS_DEFINED;
+  
+  /* e.g., if x is allocated, *x = 3 defines x */
+  
+  if (s->kind == SK_PTR)
+    {
+      sRef p = s->info->ref;
+      
+      if (p->defstate == SS_ALLOCATED)
+	{
+	  sRef_setDefinedAux (p, loc, clear);
+	}
+    }
+  else if (s->kind == SK_ARRAYFETCH) 
+    {
+      if (!s->info->arrayfetch->indknown
+	  || (s->info->arrayfetch->ind == 0))
+	{
+	  sRef p = s->info->arrayfetch->arr;
+	  sRef ptr = sRef_constructPointer (p);
+	  
+	  if (sRef_isValid (ptr))
+	    {
+	      if (ptr->defstate == SS_ALLOCATED 
+		  || ptr->defstate == SS_UNDEFINED)
+		{
+		  sRef_setDefinedAux (ptr, loc, clear);
+		}
+	    }
+	  
+	  if (p->defstate == SS_RELDEF) 
+	    {
+	      ;
+	    }
+	  else if (p->defstate == SS_ALLOCATED || p->defstate == SS_PDEFINED)
+	    {
+	      p->defstate = SS_DEFINED;
+	    }
+	  else
+	    {
+	    }
+	}
+    }
+  else if (s->kind == SK_FIELD)
+    {
+      sRef parent = s->info->field->rec;
+      
+      if (sRef_isValid (parent))
+	{
+	  if (ctype_isUnion (ctype_realType (parent->type)))
+	    {
+	      /*
+	      ** Should not clear derived from here.
+	      */
+	      
+	      sRef_setDefinedNoClear (parent, loc);
+	    }
+	  else
+	    {
+	      ; /* Nothing to do for structures. */
+	    }
+	}
+
+          }
+  else
+    {
+      ;
+    }
+
+  if (clear)
+    {
+      sRef_clearDerived (s);
+    }  
+}
+
+static void sRef_setPartialDefined (sRef s, fileloc loc)
+{
+  if (!sRef_isPartial (s))
+    {
+      sRef_setDefined (s, loc);
+    }
+}
+
+void sRef_setPartialDefinedComplete (sRef s, fileloc loc)
+{
+  sRef_innerAliasSetComplete (sRef_setPartialDefined, s, loc);
+}
+
+void sRef_setDefinedComplete (sRef s, fileloc loc)
+{
+  sRef_innerAliasSetComplete (sRef_setDefined, s, loc);
+}
+
+void sRef_setDefined (sRef s, fileloc loc)
+{
+  sRef_setDefinedAux (s, loc, TRUE);
+}
+
+static void sRef_setDefinedNoClear (sRef s, fileloc loc)
+{
+  DPRINTF (("Defining: %s", sRef_unparseFull (s)));
+  sRef_setDefinedAux (s, loc, FALSE);
+  DPRINTF (("==> %s", sRef_unparseFull (s)));
+}
+
+void sRef_setDefinedNCComplete (sRef s, fileloc loc)
+{
+  DPRINTF (("Set Defined Complete: %s", sRef_unparseFull (s)));
+  sRef_innerAliasSetComplete (sRef_setDefinedNoClear, s, loc);
+  DPRINTF (("==> %s", sRef_unparseFull (s)));
+}
+
+static bool sRef_isDeepUnionField (sRef s)
+{
+  return (sRef_deepPred (sRef_isUnionField, s));
+}
+
+bool sRef_isUnionField (sRef s)
+{
+  if (sRef_isValid (s) && s->kind == SK_FIELD)
+    {
+      /*
+       ** defining one field of a union defines the union
+       */
+      
+      sRef base = s->info->field->rec;
+
+      if (sRef_isValid (base))
+	{
+	  return (ctype_isUnion (ctype_realType (base->type)));
+	}
+    }
+
+  return FALSE;
+}
+
+void sRef_setPdefined (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s) && !sRef_isPartial (s))
+    {
+      sRef base = sRef_getBaseSafe (s);
+
+      if (s->defstate == SS_ALLOCATED)
+	{
+	  return;
+	}
+      
+      if (s->defstate != SS_PDEFINED && fileloc_isDefined (loc))
+	{
+	  s->definfo = alinfo_updateLoc (s->definfo, loc);
+	}
+
+      s->defstate = SS_PDEFINED;
+      
+      /* e.g., if x is allocated, *x = 3 defines x */
+      
+      while (sRef_isValid (base) && sRef_isKnown (base))
+	{
+	  if (base->defstate == SS_DEFINED)
+	    { 
+	      sRef nb;
+
+	      	      base->defstate = SS_PDEFINED; 
+	      nb = sRef_getBaseSafe (base); 
+	      base = nb;
+	    }
+	  else 
+	    { 
+	      break; 
+	    }
+	}      
+    }
+}
+
+static void sRef_setStateAux (sRef s, sstate ss, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      /* if (s->defstate == SS_RELDEF) return; */
+
+      if (s->defstate != ss && fileloc_isDefined (loc))
+	{
+	  s->definfo = alinfo_updateLoc (s->definfo, loc);
+	}
+
+      s->defstate = ss;
+      sRef_clearDerived (s); 
+
+      if (ss == SS_ALLOCATED)
+	{
+	  sRef base = sRef_getBaseSafe (s);
+	  
+	  while (sRef_isValid (base) && sRef_isKnown (base))
+	    {
+	      if (base->defstate == SS_DEFINED) 
+		{ 
+		  sRef nb;
+		  
+		  base->defstate = SS_PDEFINED; 
+		  
+		  nb = sRef_getBaseSafe (base); 
+		  base = nb;
+		}
+	      else 
+		{ 
+		  break; 
+		}
+	    }
+	}
+
+          }
+}
+
+void sRef_setAllocatedComplete (sRef s, fileloc loc)
+{
+  sRef_innerAliasSetComplete (sRef_setAllocated, s, loc);
+}
+
+static void sRef_setAllocatedShallow (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      if (s->defstate == SS_DEAD || s->defstate == SS_UNDEFINED)
+	{
+	  s->defstate = SS_ALLOCATED;
+	  
+	  if (fileloc_isDefined (loc))
+	    {
+	      s->definfo = alinfo_updateLoc (s->definfo, loc);
+	    }
+	}
+    }
+}
+
+void sRef_setAllocatedShallowComplete (sRef s, fileloc loc)
+{
+  sRef_innerAliasSetComplete (sRef_setAllocatedShallow, s, loc);
+}
+
+void sRef_setAllocated (sRef s, fileloc loc)
+{
+  sRef_setStateAux (s, SS_ALLOCATED, loc);
+  }
+
+void sRef_setPartial (sRef s, fileloc loc)
+{
+  sRef_setStateAux (s, SS_PARTIAL, loc);
+  }
+
+void sRef_setShared (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      if (s->aliaskind != AK_SHARED && fileloc_isDefined (loc))
+	{
+	  s->aliasinfo = alinfo_updateLoc (s->aliasinfo, loc);
+	}
+
+      s->aliaskind = AK_SHARED;
+      /* don't! sRef_clearDerived (s); */
+    }
+}
+
+void sRef_setLastReference (sRef s, sRef ref, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      s->aliaskind = sRef_getAliasKind (ref);
+      s->aliasinfo = alinfo_updateRefLoc (s->aliasinfo, ref, loc);
+    }
+}
+
+static
+void sRef_setNullStateAux (/*@notnull@*/ sRef s, nstate ns, fileloc loc)
+{
+ s->nullstate = ns;
+
+ if (fileloc_isDefined (loc))
+   {
+     s->nullinfo = alinfo_updateLoc (s->nullinfo, loc);
+   }
+}
+
+void sRef_setNotNull (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      sRef_setNullStateAux (s, NS_NOTNULL, loc);
+    }
+}
+
+void sRef_setNullState (sRef s, nstate n, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      sRef_setNullStateAux (s, n, loc);
+    }
+}
+
+void sRef_setNullStateInnerComplete (sRef s, nstate n, fileloc loc)
+{
+  sRef_setNullState (s, n, loc);
+
+  switch (n)
+    {
+    case NS_POSNULL:
+      sRef_innerAliasSetComplete (sRef_setPosNull, s, loc);
+      break;
+    case NS_DEFNULL:
+      sRef_innerAliasSetComplete (sRef_setDefNull, s, loc);
+      break;
+    case NS_UNKNOWN:
+      sRef_innerAliasSetComplete (sRef_setNullUnknown, s, loc);
+      break;
+    case NS_NOTNULL:
+      sRef_innerAliasSetComplete (sRef_setNotNull, s, loc);
+      break;
+    case NS_MNOTNULL:
+      sRef_innerAliasSetComplete (sRef_setNotNull, s, loc);
+      break;
+    case NS_RELNULL:
+      sRef_innerAliasSetComplete (sRef_setNullUnknown, s, loc);
+      break;
+    case NS_CONSTNULL:
+      sRef_innerAliasSetComplete (sRef_setDefNull, s, loc);
+      break;
+    case NS_ABSNULL:
+      sRef_innerAliasSetComplete (sRef_setNullUnknown, s, loc);
+      break;
+    case NS_ERROR:
+      sRef_innerAliasSetComplete (sRef_setNullErrorLoc, s, loc);
+      break;
+    }
+}
+
+void sRef_setPosNull (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      sRef_setNullStateAux (s, NS_POSNULL, loc);
+    }
+}
+  
+void sRef_setDefNull (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      sRef_setNullStateAux (s, NS_DEFNULL, loc);
+    }
+}
+
+void sRef_setNullUnknown (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      sRef_setNullStateAux (s, NS_UNKNOWN, loc);
+    }
+}
+
+void sRef_setNullError (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      sRef_setNullStateAux (s, NS_UNKNOWN, fileloc_undefined);
+    }
+}
+
+void sRef_setNullErrorLoc (sRef s, /*@unused@*/ fileloc loc)
+{
+  sRef_setNullError (s);
+}
+
+void sRef_setOnly (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s) && s->aliaskind != AK_ONLY)
+    {
+      s->aliaskind = AK_ONLY;
+      s->aliasinfo = alinfo_updateLoc (s->aliasinfo, loc);
+          }
+}
+
+void sRef_setDependent (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s) && !sRef_isConst (s) && (s->aliaskind != AK_DEPENDENT))
+    {
+      s->aliaskind = AK_DEPENDENT;
+      s->aliasinfo = alinfo_updateLoc (s->aliasinfo, loc);
+          }
+}
+
+void sRef_setOwned (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s) && !sRef_isConst (s) && (s->aliaskind != AK_OWNED))
+    {
+      s->aliaskind = AK_OWNED;
+      s->aliasinfo = alinfo_updateLoc (s->aliasinfo, loc);
+          }
+}
+
+void sRef_setKept (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s) && !sRef_isConst (s) && (s->aliaskind != AK_KEPT))
+    {
+      sRef base = sRef_getBaseSafe (s);  
+      
+      while (sRef_isValid (base) && sRef_isKnown (base))
+	{
+	  if (base->defstate == SS_DEFINED) 
+	    {
+	      base->defstate = SS_PDEFINED; 
+	      	      base = sRef_getBaseSafe (base); 
+	    }
+	  else 
+	    {
+	      break; 
+	    }
+
+	}
+
+      s->aliaskind = AK_KEPT;
+      s->aliasinfo = alinfo_updateLoc (s->aliasinfo, loc);
+          }
+}
+
+static void sRef_setKeptAux (sRef s, fileloc loc)
+{
+  if (!sRef_isShared (s))
+    {
+      sRef_setKept (s, loc);
+    }
+}
+
+static void sRef_setDependentAux (sRef s, fileloc loc)
+{
+  if (!sRef_isShared (s))
+    {
+      sRef_setDependent (s, loc);
+    }
+}
+
+void sRef_setKeptComplete (sRef s, fileloc loc)
+{
+  sRef_aliasSetComplete (sRef_setKeptAux, s, loc);
+}
+
+void sRef_setDependentComplete (sRef s, fileloc loc)
+{
+  sRef_aliasSetComplete (sRef_setDependentAux, s, loc);
+}
+
+void sRef_setFresh (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s))
+    {
+      s->aliaskind = AK_FRESH;
+      s->aliasinfo = alinfo_updateLoc (s->aliasinfo, loc);
+    }
+}
+
+void sRef_kill (sRef s, fileloc loc)
+{
+  DPRINTF (("Kill: %s", sRef_unparseFull (s)));
+
+  if (sRef_isValid (s) && !sRef_isShared (s) && !sRef_isConst (s))
+    {
+      sRef base = sRef_getBaseSafe (s);  
+      
+      while (sRef_isValid (base) && sRef_isKnown (base))
+	{
+	  if (base->defstate == SS_DEFINED) 
+	    {
+	      base->defstate = SS_PDEFINED; 
+	      base = sRef_getBaseSafe (base); 
+	    }
+	  else 
+	    {
+	      break; 
+	    }
+
+	}
+      
+      s->aliaskind = s->oaliaskind;
+      s->defstate = SS_DEAD;
+      s->definfo = alinfo_updateLoc (s->definfo, loc);
+
+      sRef_clearDerived (s);
+    }
+}
+
+void sRef_maybeKill (sRef s, fileloc loc)
+{
+        
+  if (sRef_isValid (s))
+    {
+      sRef base = sRef_getBaseSafe (s);  
+
+            
+      while (sRef_isValid (base) && sRef_isKnown (base))
+	{
+	  if (base->defstate == SS_DEFINED || base->defstate == SS_RELDEF)
+	    {
+	      base->defstate = SS_PDEFINED; 
+	      	      base = sRef_getBaseSafe (base); 
+	    }
+	  else 
+	    {
+	      	      break; 
+	    }
+	  
+	}
+      
+      s->aliaskind = s->oaliaskind;
+      s->defstate = SS_HOFFA; 
+      s->definfo = alinfo_updateLoc (s->definfo, loc);
+      sRef_clearDerived (s); 
+    }
+
+  }
+
+/*
+** just for type checking...
+*/
+
+static void sRef_killAux (sRef s, fileloc loc)
+{
+  if (sRef_isValid (s) && !sRef_isShared (s))
+    {
+      if (sRef_isUnknownArrayFetch (s))
+	{
+	  sRef_maybeKill (s, loc);
+	}
+      else
+	{
+	  	  sRef_kill (s, loc);
+	  	}
+    }
+}
+
+/*
+** kills s and all aliases to s
+*/
+
+void sRef_killComplete (sRef s, fileloc loc)
+{
+  DPRINTF (("Kill complete: %s", sRef_unparseFull (s)));
+  sRef_aliasSetComplete (sRef_killAux, s, loc);
+}
+
+static bool sRef_equivalent (sRef s1, sRef s2)
+{
+  return (sRef_compare (s1, s2) == 0);
+}
+
+/*
+** returns an sRef that will not be free'd on function exit.
+*/
+
+/*@only@*/ sRef sRef_saveCopy (sRef s)
+{
+  sRef ret;
+
+  if (sRef_isValid (s))
+    {
+      bool old = inFunction;
+
+      /*
+      ** Exit the function scope, so this sRef is not
+      ** stored in the deallocation table.
+      */
+      
+      inFunction = FALSE;
+      DPRINTF (("Copying sref: %s", sRef_unparseFull(s)));
+      ret = sRef_copy (s);
+      DPRINTF (("Copying ===>: %s", sRef_unparseFull(ret)));
+      inFunction = old;
+    }
+  else
+    {
+      ret = sRef_undefined;
+    }
+
+  /*@-dependenttrans@*/ 
+  return ret;
+  /*@=dependenttrans@*/ 
+}
+
+sRef sRef_copy (sRef s)
+{
+  if (sRef_isKindSpecial (s))
+    {
+      /*@-retalias@*/
+      return s; /* don't copy specials */
+      /*@=retalias@*/
+    }
+  
+  if (sRef_isValid (s))
+    {
+      sRef t = sRef_alloc ();
+
+      t->kind = s->kind;
+      t->safe = s->safe;
+      t->modified = s->modified;
+      t->type = s->type;
+
+            t->info = sinfo_copy (s);
+      
+      t->defstate = s->defstate;
+
+      t->nullstate = s->nullstate;
+
+      t->aliaskind = s->aliaskind;
+      t->oaliaskind = s->oaliaskind;
+
+      t->expkind = s->expkind;
+      t->oexpkind = s->oexpkind;
+
+      t->aliasinfo = alinfo_copy (s->aliasinfo);
+      t->definfo = alinfo_copy (s->definfo);
+      t->nullinfo = alinfo_copy (s->nullinfo);
+      t->expinfo = alinfo_copy (s->expinfo);
+
+      t->deriv = sRefSet_newDeepCopy (s->deriv);
+      
+      return t;
+    }
+  else
+    {
+      return sRef_undefined;
+    }
+}
+
+/*@notfunction@*/
+# define PREDTEST(func,s) \
+   do { if (sRef_isInvalid (s)) { return FALSE; } \
+        else { if (sRef_isConj (s)) \
+                  { return (func (sRef_getConjA (s)) \
+		            || func (sRef_getConjB (s))); }}} while (FALSE);
+
+bool sRef_isAddress (sRef s)
+{
+  PREDTEST (sRef_isAddress, s);
+  return (s->kind == SK_ADR);
+}
+	  
+/*
+** pretty weak... maybe a flag should control this.
+*/
+
+bool sRef_isThroughArrayFetch (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      sRef tref = s;
+
+      do 
+	{
+	  sRef lt;
+
+	  if (sRef_isArrayFetch (tref)) 
+	    {
+	      	      return TRUE;
+	    }
+	  
+	  lt = sRef_getBase (tref);
+	  tref = lt;
+	} while (sRef_isValid (tref));
+    } 
+
+  return FALSE;
+}
+
+bool sRef_isArrayFetch (sRef s)
+{
+  PREDTEST (sRef_isArrayFetch, s);
+  return (s->kind == SK_ARRAYFETCH);
+}
+
+bool sRef_isMacroParamRef (sRef s)
+{
+  if (context_inMacro () && sRef_isCvar (s))
+    {
+      uentry ue = sRef_getUentry (s);
+      cstring pname = makeParam (uentry_rawName (ue));
+      uentry mac = usymtab_lookupSafe (pname);
+
+      cstring_free (pname);
+      return (uentry_isValid (mac));
+    }
+
+  return FALSE;
+}
+      
+bool sRef_isCvar (sRef s) 
+{
+  PREDTEST (sRef_isCvar, s);
+  return (s->kind == SK_CVAR);
+}
+
+bool sRef_isConst (sRef s) 
+{
+  PREDTEST (sRef_isConst, s);
+  return (s->kind == SK_CONST);
+}
+
+bool sRef_isObject (sRef s) 
+{
+  PREDTEST (sRef_isObject, s);
+  return (s->kind == SK_OBJECT);
+}
+
+bool sRef_isExternal (sRef s) 
+{
+  PREDTEST (sRef_isExternal, s);
+  return (s->kind == SK_EXTERNAL);
+}
+
+static bool sRef_isDerived (sRef s) 
+{
+  PREDTEST (sRef_isDerived, s);
+  return (s->kind == SK_DERIVED);
+}
+
+bool sRef_isField (sRef s)
+{
+  PREDTEST (sRef_isField, s);
+  return (s->kind == SK_FIELD);
+}
+
+static bool sRef_isIndex (sRef s)
+{
+  PREDTEST (sRef_isIndex, s);
+  return (s->kind == SK_ARRAYFETCH);
+}
+
+bool sRef_isAnyParam (sRef s)
+{
+  PREDTEST (sRef_isAnyParam, s);
+  return (s->kind == SK_PARAM);  
+}
+
+bool sRef_isParam (sRef s)
+{
+  PREDTEST (sRef_isParam, s);
+  return (s->kind == SK_PARAM);
+}
+
+bool sRef_isDirectParam (sRef s)
+{
+  PREDTEST (sRef_isDirectParam, s);
+
+  return ((s->kind == SK_CVAR) &&
+	  (s->info->cvar->lexlevel == functionScope) &&
+	  (context_inFunction () && 
+	   (s->info->cvar->index <= uentryList_size (context_getParams ()))));
+}
+
+bool sRef_isPointer (sRef s)
+{
+  PREDTEST (sRef_isPointer, s);
+  return (s->kind == SK_PTR);
+}
+
+/*
+** returns true if storage referenced by s is visible
+*/
+
+bool sRef_isReference (sRef s)
+{
+  PREDTEST (sRef_isReference, s);
+
+  return (sRef_isPointer (s) || sRef_isIndex (s) || sRef_isGlobal (s)
+	  || (sRef_isField (s) && (sRef_isReference (s->info->field->rec))));
+}
+
+bool sRef_isIReference (sRef s)
+{
+  return (sRef_isPointer (s) || sRef_isAddress (s) || sRef_isIndex (s)
+	  || sRef_isField (s) || sRef_isArrayFetch (s));
+}
+
+bool sRef_isGlobal (sRef s)
+{
+  return (sRef_isCvar (s) && (s->info->cvar->lexlevel <= fileScope));
+}
+
+bool sRef_isRealGlobal (sRef s)
+{
+  return (sRef_isCvar (s) && (s->info->cvar->lexlevel == globScope));
+}
+
+bool sRef_isFileStatic (sRef s)
+{
+  return (sRef_isCvar (s) && (s->info->cvar->lexlevel == fileScope));
+}
+
+bool sRef_isAliasCheckedGlobal (sRef s)
+{
+  if (sRef_isGlobal (s))
+    {
+      uentry ue = sRef_getUentry (s);
+
+      return context_checkAliasGlob (ue);
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+void sRef_free (/*@only@*/ sRef s)
+{
+  if (s != sRef_undefined && s->kind != SK_SPECIAL)
+    {
+      alinfo_free (s->expinfo);
+      alinfo_free (s->aliasinfo);
+      alinfo_free (s->definfo);
+      alinfo_free (s->nullinfo);
+      
+      sRefSet_free (s->deriv);
+      s->deriv = sRefSet_undefined;
+      sinfo_free (s);
+      
+      sfree (s); 
+    }
+}
+
+void sRef_setType (sRef s, ctype t)
+{
+  if (sRef_isValid (s))
+    {
+      s->type = t;
+    }
+}
+
+void sRef_setTypeFull (sRef s, ctype t)
+{
+  if (sRef_isValid (s))
+    {
+      s->type = t;
+
+      sRefSet_allElements (s->deriv, current)
+	{
+	  sRef_setTypeFull (current, ctype_unknown);
+	} end_sRefSet_allElements ;
+    }
+}
+
+/*@exposed@*/ sRef
+  sRef_buildField (sRef rec, /*@dependent@*/ cstring f)
+{
+  return (sRef_buildNCField (rec, f)); 
+}
+
+static /*@exposed@*/ sRef
+sRef_findDerivedField (/*@notnull@*/ sRef rec, cstring f)
+{
+  sRefSet_allElements (rec->deriv, sr)
+    {
+      if (sRef_isValid (sr))
+	{
+	  if (sr->kind == SK_FIELD && cstring_equal (sr->info->field->field, f))
+	    {
+	      return sr;
+	    }
+	}
+    } end_sRefSet_allElements;
+
+  return sRef_undefined;
+}
+
+/*@dependent@*/ /*@observer@*/ sRefSet
+  sRef_derivedFields (sRef rec)
+{
+  if (sRef_isValid (rec))
+    {
+      sRefSet ret;
+      ret = rec->deriv;
+      return (ret);
+    }
+  else
+    {
+      return (sRefSet_undefined);
+    }
+}
+
+static /*@exposed@*/ sRef
+  sRef_findDerivedPointer (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      sRefSet_realElements (s->deriv, sr)
+	{
+	  if (sRef_isValid (sr) && sr->kind == SK_PTR)
+	    {
+	      return sr;
+	    }
+	} end_sRefSet_realElements;
+    }
+
+  return sRef_undefined;
+}
+
+bool
+sRef_isUnknownArrayFetch (sRef s)
+{
+  return (sRef_isValid (s) 
+	  && s->kind == SK_ARRAYFETCH
+	  && !s->info->arrayfetch->indknown);
+}
+
+static /*@exposed@*/ sRef
+sRef_findDerivedArrayFetch (/*@notnull@*/ sRef s, bool isknown, int idx, bool dead)
+{
+  
+  if (isknown) 
+    {
+      sRefSet_realElements (s->deriv, sr)
+	{
+	  if (sRef_isValid (sr)
+	      && sr->kind == SK_ARRAYFETCH
+	      && sr->info->arrayfetch->indknown
+	      && (sr->info->arrayfetch->ind == idx))
+	    {
+	      return sr;
+	    }
+	} end_sRefSet_realElements;
+    }
+  else
+    {
+      sRefSet_realElements (s->deriv, sr)
+	{
+	  if (sRef_isValid (sr)
+	      && sr->kind == SK_ARRAYFETCH
+	      && (!sr->info->arrayfetch->indknown
+		  || (sr->info->arrayfetch->indknown && 
+		      sr->info->arrayfetch->ind == 0)))
+	    {
+	      if (sRef_isDead (sr) || sRef_isKept (sr))
+		{
+		  if (dead || context_getFlag (FLG_STRICTUSERELEASED))
+		    {
+		      return sr;
+		    }
+		}
+	      else
+		{
+		  return sr;
+		}
+	    }
+	} end_sRefSet_realElements;
+    }
+
+  return sRef_undefined;
+}
+
+static /*@exposed@*/ sRef 
+sRef_buildNCField (/*@exposed@*/ sRef rec, /*@exposed@*/ cstring f)
+{
+  sRef s;
+
+  if (sRef_isInvalid (rec))
+    {
+      return sRef_undefined;
+    }
+      
+  /*
+  ** check if the field already has been referenced 
+  */
+
+  s = sRef_findDerivedField (rec, f);
+  
+  if (sRef_isValid (s))
+    {
+            return s;
+    }
+  else
+    {
+      ctype ct = ctype_realType (rec->type);
+
+      s = sRef_new ();      
+      s->kind = SK_FIELD;
+      s->info = (sinfo) dmalloc (sizeof (*s->info));
+      s->info->field = (fldinfo) dmalloc (sizeof (*s->info->field));
+      s->info->field->rec = rec;
+      s->info->field->field = f; /* doesn't copy f */
+      
+      
+      if (ctype_isKnown (ct) && ctype_isSU (ct))
+	{
+	  uentry ue = uentryList_lookupField (ctype_getFields (ct), f);
+	
+	  if (!uentry_isUndefined (ue))
+	    {
+	      s->type = uentry_getType (ue);
+
+	      if (ctype_isMutable (s->type)
+		  && rec->aliaskind != AK_STACK 
+		  && !alkind_isStatic (rec->aliaskind))
+		{
+		  s->aliaskind = rec->aliaskind;
+		}
+	      else
+		{
+		  s->aliaskind = AK_UNKNOWN;
+		}
+
+	      if (sRef_isStateDefined (rec) || sRef_isStateUnknown (rec) 
+		  || sRef_isPdefined (rec))
+		{
+		  		  sRef_setStateFromUentry (s, ue);
+		  		}
+	      else
+		{
+		  sRef_setPartsFromUentry (s, ue);
+		  		}
+
+	      s->oaliaskind = s->aliaskind;
+	      s->oexpkind = s->expkind;
+	    }
+	  else
+	    {
+	      /*
+		Never report this as an error.  It can happen whenever there
+		is casting involved.
+
+	      if (report)
+		{
+		  llcontbug (message ("buildNCField --- no field %s: %q / %s",
+				      f, sRef_unparse (s), ctype_unparse (ct)));
+		}
+		*/
+
+	      return sRef_undefined;
+	    }
+	}
+      
+      if (rec->defstate == SS_DEFINED 
+	  && (s->defstate == SS_UNDEFINED || s->defstate == SS_UNKNOWN))
+	{
+	  s->defstate = SS_DEFINED;
+	}
+      else if (rec->defstate == SS_PARTIAL)
+	{
+	  s->defstate = SS_PARTIAL;
+	}
+      else if (rec->defstate == SS_ALLOCATED) 
+	{
+	  if (ctype_isStackAllocated (ct) && ctype_isStackAllocated (s->type))
+	    {
+	      s->defstate = SS_ALLOCATED;
+	    }
+	  else
+	    {
+	      s->defstate = SS_UNDEFINED;
+	    }
+	}
+      else if (s->defstate == SS_UNKNOWN)
+	{
+	  s->defstate = rec->defstate;
+	}
+      else
+	{
+	  ; /* no change */
+	}
+
+      if (s->defstate == SS_UNDEFINED)
+	{
+	  ctype rt = ctype_realType (s->type);
+	  
+	  if (ctype_isArray (rt) || ctype_isSU (rt))
+	    {
+	      	      s->defstate = SS_ALLOCATED;
+	    }
+	}
+
+      sRef_addDeriv (rec, s);
+
+      if (ctype_isInt (s->type) && cstring_equal (f, REFSNAME))
+	{
+	  s->aliaskind = AK_REFS;
+	  s->oaliaskind = AK_REFS;
+	}
+
+            return s;
+    }
+}
+
+bool
+sRef_isStackAllocated (sRef s)
+{
+  return (sRef_isValid(s) 
+	  && s->defstate == SS_ALLOCATED && ctype_isStackAllocated (s->type));
+}
+	  
+static
+void sRef_setArrayFetchState (/*@notnull@*/ /*@exposed@*/ sRef s, 
+			      /*@notnull@*/ /*@exposed@*/ sRef arr)
+{
+  if (ctype_isRealAP (arr->type))
+    {
+      s->type = ctype_baseArrayPtr (arr->type);
+    }
+
+  /* a hack, methinks... makeArrayFetch (&a[0]) ==> a[] */
+  if (sRef_isAddress (arr)) 
+    {
+      sRef t = arr->info->ref;
+      
+      if (sRef_isArrayFetch (t))
+	{
+	  s->info->arrayfetch->arr = t->info->arrayfetch->arr;
+	}
+    }
+  else if (ctype_isRealPointer (arr->type))
+    {
+      sRef sp = sRef_findDerivedPointer (arr);
+
+      
+      if (sRef_isValid (sp))
+	{
+	  
+	  if (ctype_isMutable (s->type))
+	    {
+	      sRef_setExKind (s, sRef_getExKind (sp), fileloc_undefined);
+
+	      	      
+	      s->aliaskind = sp->aliaskind;
+	    }
+
+	  s->defstate = sp->defstate;
+
+	  if (s->defstate == SS_DEFINED) 
+	    {
+	      if (!context_getFlag (FLG_STRICTDESTROY))
+		{
+		  s->defstate = SS_PARTIAL;
+		}
+	    }
+
+	  s->nullstate = sp->nullstate;
+	}
+      else
+	{
+	  if (arr->defstate == SS_UNDEFINED)
+	    {
+	      s->defstate = SS_UNUSEABLE;
+	    }
+	  else if ((arr->defstate == SS_ALLOCATED) && !ctype_isSU (s->type))
+	    {
+	      s->defstate = SS_UNDEFINED;
+	    }
+	  else
+	    {
+	      if (!context_getFlag (FLG_STRICTDESTROY))
+		{
+		  s->defstate = SS_PARTIAL;
+		}
+	      else
+		{
+		  s->defstate = SS_DEFINED;
+		}
+
+	      /*
+	      ** Very weak checking for array elements.
+	      ** Was:
+	      **     s->defstate = arr->defstate;
+	      */
+	    }
+
+	  sRef_setExKind (s, sRef_getExKind (arr), g_currentloc);
+
+	  if (arr->aliaskind == AK_LOCAL || arr->aliaskind == AK_FRESH)
+	    {
+	      s->aliaskind = AK_LOCAL;
+	    }
+	  else
+	    {
+	      s->aliaskind = AK_UNKNOWN;
+	    }
+	  
+	  sRef_setTypeState (s);
+	}
+    }
+  else
+    {
+      if (arr->defstate == SS_DEFINED)
+	{
+	  /*
+	  ** Very weak checking for array elements.
+	  ** Was:
+	  **     s->defstate = arr->defstate;
+	  */
+
+	  if (context_getFlag (FLG_STRICTDESTROY))
+	    {
+	      s->defstate = SS_DEFINED;
+	    }
+	  else
+	    {
+	      s->defstate = SS_PARTIAL;
+	    }
+	}
+      else if (arr->defstate == SS_ALLOCATED)
+	{
+	  if (ctype_isRealArray (s->type))
+	    {
+	      s->defstate = SS_ALLOCATED;
+	    }
+	  else 
+	    {
+	      if (!s->info->arrayfetch->indknown)
+		{
+		  /*
+		  ** is index is unknown, elements is defined or 
+		  ** allocated is any element is!
+		  */
+		  
+		  s->defstate = SS_UNDEFINED;
+		  
+		  sRefSet_allElements (arr->deriv, sr)
+		    {
+		      if (sRef_isValid (sr))
+			{
+			  if (sr->defstate == SS_ALLOCATED)
+			    {
+			      s->defstate = SS_ALLOCATED;
+			    }
+			  else 
+			    {
+			      if (sr->defstate == SS_DEFINED)
+				{
+				  if (context_getFlag (FLG_STRICTDESTROY))
+				    {
+				      s->defstate = SS_DEFINED;
+				    }
+				  else
+				    {
+				      s->defstate = SS_PARTIAL;
+				    }
+
+				  break;
+				}
+			    }
+			}
+		    } end_sRefSet_allElements;
+		  
+		  		}
+	      else
+		{
+		  s->defstate = SS_UNDEFINED;
+		}
+	    }
+	}
+      else
+	{
+	  s->defstate = arr->defstate;
+	}
+      
+      
+      /*
+      ** kludgey way to guess where aliaskind applies
+      */
+      
+      if (ctype_isMutable (s->type) 
+	  && !ctype_isPointer (arr->type) 
+	  && !alkind_isStatic (arr->aliaskind))
+	{
+	  s->aliaskind = arr->aliaskind;
+	}
+      else
+	{
+	  s->aliaskind = AK_UNKNOWN;
+	}
+    
+      sRef_setTypeState (s);
+    }
+
+  if (sRef_isObserver (arr)) 
+    {
+      s->expkind = XO_OBSERVER;
+    }
+}  
+
+/*@exposed@*/ sRef sRef_buildArrayFetch (/*@exposed@*/ sRef arr)
+{
+  sRef s;
+
+  if (!sRef_isValid (arr)) {
+    /*@-nullret@*/ return arr /*@=nullret@*/;
+  }
+
+  if (ctype_isRealPointer (arr->type))
+    {
+      (void) sRef_buildPointer (arr); /* do this to define arr! */
+    }
+  
+  s = sRef_findDerivedArrayFetch (arr, FALSE, 0, FALSE);
+  
+  if (sRef_isValid (s))
+    {
+      sRef_setExKind (s, sRef_getExKind (arr), g_currentloc);
+      return s;
+    }
+  else
+    {
+      s = sRef_new ();
+
+      s->kind = SK_ARRAYFETCH;
+      s->info = (sinfo) dmalloc (sizeof (*s->info));
+      s->info->arrayfetch = (ainfo) dmalloc (sizeof (*s->info->arrayfetch));
+      s->info->arrayfetch->indknown = FALSE;
+      s->info->arrayfetch->ind = 0;
+      s->info->arrayfetch->arr = arr;
+      sRef_setArrayFetchState (s, arr);
+      s->oaliaskind = s->aliaskind;
+      s->oexpkind = s->expkind;
+
+      if (!context_inProtectVars ())
+	{
+	  sRef_addDeriv (arr, s);
+	}
+      
+      return (s);
+    }
+}
+
+/*@exposed@*/ sRef
+  sRef_buildArrayFetchKnown (/*@exposed@*/ sRef arr, int i)
+{
+  sRef s;
+
+  if (!sRef_isValid (arr)) {
+    /*@-nullret@*/ return arr /*@=nullret@*/;
+  }
+
+  if (ctype_isRealPointer (arr->type))
+    {
+       (void) sRef_buildPointer (arr); /* do this to define arr! */
+    }
+
+  s = sRef_findDerivedArrayFetch (arr, TRUE, i, FALSE);
+      
+  if (sRef_isValid (s))
+    {
+      sRef_setExKind (s, sRef_getExKind (arr), g_currentloc);      
+      return s;
+    }
+  else
+    {
+      s = sRef_new ();
+      
+      s->kind = SK_ARRAYFETCH;
+      s->info = (sinfo) dmalloc (sizeof (*s->info));
+      s->info->arrayfetch = (ainfo) dmalloc (sizeof (*s->info->arrayfetch));
+      s->info->arrayfetch->arr = arr;
+      s->info->arrayfetch->indknown = TRUE;
+      s->info->arrayfetch->ind = i;
+      
+      sRef_setArrayFetchState (s, arr);
+      
+      s->oaliaskind = s->aliaskind;
+      s->oexpkind = s->expkind;
+      sRef_addDeriv (arr, s);
+
+      return (s);
+    }
+}
+
+/*
+** sets everything except for defstate
+*/
+
+static void
+sRef_setPartsFromUentry (sRef s, uentry ue)
+{
+    
+  llassert (sRef_isValid (s));
+
+  s->aliaskind = alkind_derive (s->aliaskind, uentry_getAliasKind (ue));
+  s->oaliaskind = s->aliaskind;
+
+  if (s->expkind == XO_UNKNOWN)
+    {
+      s->expkind = uentry_getExpKind (ue);
+    }
+
+  s->oexpkind = s->expkind;
+
+  if (s->nullstate == NS_UNKNOWN)
+    {
+      s->nullstate = sRef_getNullState (uentry_getSref (ue));
+    }
+
+  if (s->aliaskind == AK_IMPONLY 
+      && (sRef_isExposed (s) || sRef_isObserver (s)))
+    {
+      s->oaliaskind = s->aliaskind = AK_IMPDEPENDENT;
+    }
+
+}
+
+static void
+sRef_setStateFromAbstractUentry (sRef s, uentry ue)
+{
+  llassert (sRef_isValid (s));
+  
+  sRef_setPartsFromUentry (s, ue);
+
+  s->aliaskind = alkind_derive (s->aliaskind, uentry_getAliasKind (ue));
+  s->oaliaskind = s->aliaskind;
+
+  if (s->expkind == XO_UNKNOWN)
+    {
+      s->expkind = uentry_getExpKind (ue);
+    }
+
+  s->oexpkind = s->expkind;
+}
+
+void
+sRef_setStateFromUentry (sRef s, uentry ue)
+{
+  sstate defstate;
+
+  llassert (sRef_isValid (s));
+  
+  sRef_setPartsFromUentry (s, ue);
+
+  defstate = uentry_getDefState (ue);
+
+  if (sstate_isKnown (defstate))
+    {
+      s->defstate = defstate;
+    }
+  else
+    {
+      ;
+    }
+}
+
+/*@exposed@*/ sRef
+  sRef_buildPointer (/*@exposed@*/ sRef t)
+{
+  DPRINTF (("build pointer: %s", sRef_unparse (t)));
+
+  if (sRef_isInvalid (t)) return sRef_undefined;
+
+  if (sRef_isAddress (t))
+    {
+      DPRINTF (("Return ref: %s", sRef_unparse (t->info->ref)));
+      return (t->info->ref);
+    }
+  else
+    {
+      sRef s = sRef_findDerivedPointer (t);
+
+      DPRINTF (("find derived: %s", sRef_unparse (s)));
+
+      if (sRef_isValid (s))
+	{
+	  
+	  sRef_setExKind (s, sRef_getExKind (t), g_currentloc);
+	  s->oaliaskind = s->aliaskind;
+	  s->oexpkind = s->expkind;
+
+	  return s;
+	}
+      else
+	{
+	  s = sRef_constructPointerAux (t);
+	  
+	  DPRINTF (("construct: %s", sRef_unparse (s)));
+
+	  if (sRef_isValid (s))
+	    {
+	      sRef_addDeriv (t, s);
+
+	      s->oaliaskind = s->aliaskind;
+	      s->oexpkind = s->expkind;
+	    }
+	  
+	  return s;
+	}
+    }
+}
+
+/*@exposed@*/ sRef
+sRef_constructPointer (sRef t)
+   /*@modifies t@*/
+{
+  return sRef_buildPointer (t);
+}
+
+static /*@exposed@*/ sRef sRef_constructDerefAux (sRef t, bool isdead)
+{
+  if (sRef_isValid (t))
+    {
+      sRef s;
+      
+      /*
+      ** if there is a derived t[?], return that.  Otherwise, *t.
+      */
+      
+            
+      s = sRef_findDerivedArrayFetch (t, FALSE, 0, isdead);
+      
+      if (sRef_isValid (s))
+	{
+	  	  return s;
+	}
+      else
+	{
+	  sRef ret = sRef_constructPointer (t);
+
+	  /*
+	  ** This is necessary to prevent infinite depth
+	  ** in checking complete destruction.  
+	  */
+
+	  
+	  if (isdead)
+	    {
+	      /* ret->defstate = SS_UNKNOWN;  */
+	      return ret; 
+	    }
+	  else
+	    {
+	      return ret;
+	    }
+	}
+    }
+  else
+    {
+      return sRef_undefined;
+    }
+}
+
+sRef sRef_constructDeref (sRef t)
+{
+  return sRef_constructDerefAux (t, FALSE);
+}
+
+sRef sRef_constructDeadDeref (sRef t)
+{
+  return sRef_constructDerefAux (t, TRUE);
+}
+
+static sRef
+sRef_constructPointerAux (/*@notnull@*/ /*@exposed@*/ sRef t)
+{
+  sRef s = sRef_new ();
+  ctype rt = t->type;
+  ctype st;
+  
+  s->kind = SK_PTR;
+  s->info = (sinfo) dmalloc (sizeof (*s->info));
+  s->info->ref = t;
+  
+  if (ctype_isRealAP (rt))
+    {
+      s->type = ctype_baseArrayPtr (rt);
+    }
+  
+  st = ctype_realType (s->type);
+  
+    
+  if (t->defstate == SS_UNDEFINED)
+    {
+      s->defstate = SS_UNUSEABLE;
+    }
+  else if ((t->defstate == SS_ALLOCATED) && !ctype_isSU (st))
+    {
+      s->defstate = SS_UNDEFINED;
+    }
+  else
+    {
+      s->defstate = t->defstate;
+    }
+  
+  if (t->aliaskind == AK_LOCAL || t->aliaskind == AK_FRESH)
+    {
+      s->aliaskind = AK_LOCAL;
+    }
+  else
+    {
+      s->aliaskind = AK_UNKNOWN;
+    }
+  
+  sRef_setExKind (s, sRef_getExKind (t), fileloc_undefined);
+  sRef_setTypeState (s);
+  
+  s->oaliaskind = s->aliaskind;
+  s->oexpkind = s->expkind;
+
+  return s;
+}
+
+bool sRef_hasDerived (sRef s)
+{
+  return (sRef_isValid (s) && !sRefSet_isEmpty (s->deriv));
+}
+
+void
+sRef_clearDerived (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+            sRefSet_clear (s->deriv); 
+    }
+}
+
+void
+sRef_clearDerivedComplete (sRef s)
+{
+  
+  if (sRef_isValid (s))
+    {
+      sRef base = sRef_getBaseSafe (s);
+
+      while (sRef_isValid (base))
+	{
+	  sRefSet_clear (base->deriv); 
+	  base = sRef_getBaseSafe (base);
+	}
+
+      sRefSet_clear (s->deriv); 
+    }
+}
+
+/*@exposed@*/ sRef
+sRef_makePointer (sRef s)
+   /*@modifies s@*/
+{
+  sRef res = sRef_buildPointer (s); 
+
+  DPRINTF (("Res: %s", sRef_unparse (res)));
+  return res;
+}
+
+/*
+** &a[] => a (this is for out params)
+*/
+
+/*@exposed@*/ sRef
+sRef_makeAnyArrayFetch (/*@exposed@*/ sRef arr)
+{
+  
+  if (sRef_isAddress (arr))
+    {
+            return (arr->info->ref);
+    }
+  else
+    {
+      return (sRef_buildArrayFetch (arr));
+    }
+}
+
+/*@exposed@*/ sRef
+sRef_makeArrayFetch (sRef arr)
+{
+  return (sRef_buildArrayFetch (arr));
+}
+
+/*@exposed@*/ sRef
+sRef_makeArrayFetchKnown (sRef arr, int i)
+{
+  return (sRef_buildArrayFetchKnown (arr, i));
+}
+
+/*@exposed@*/ sRef
+sRef_makeField (sRef rec, /*@dependent@*/ cstring f)
+{
+  sRef ret;
+  ret = sRef_buildField (rec, f);
+  return ret;
+}
+
+/*@exposed@*/ sRef
+sRef_makeNCField (sRef rec, /*@dependent@*/ cstring f)
+{
+    return (sRef_buildNCField (rec, f));
+}
+
+/*@only@*/ cstring
+sRef_unparseKindName (sRef s)
+{
+  cstring result;
+
+  if (s == sRef_undefined) return cstring_makeLiteral ("");
+
+  s = sRef_fixConj (s);
+
+  switch (s->kind)
+    {
+    case SK_CVAR: 
+      if (sRef_isLocalVar (s)) 
+	{
+	  result = cstring_makeLiteral ("Variable");
+	}
+      else
+	{
+	  result = cstring_makeLiteral ("Undef global");
+	}
+      break;
+    case SK_PARAM:
+      result = cstring_makeLiteral ("Out parameter");
+      break;
+    case SK_ARRAYFETCH:
+      if (sRef_isAnyParam (s->info->arrayfetch->arr)) 
+	{
+	  result = cstring_makeLiteral ("Out parameter");
+	}
+      else if (sRef_isIndexKnown (s))
+	{
+	  result = cstring_makeLiteral ("Array element");
+	}
+      else
+	{
+	  result = cstring_makeLiteral ("Value");
+	}
+      break;
+    case SK_PTR:
+      if (sRef_isAnyParam (s->info->ref)) 
+	{
+	  result = cstring_makeLiteral ("Out parameter");
+	}
+      else
+	{
+	  result = cstring_makeLiteral ("Value");
+	}
+      break;
+    case SK_ADR:
+      result = cstring_makeLiteral ("Value");
+      break;
+    case SK_FIELD:
+      result = cstring_makeLiteral ("Field");
+      break;
+    case SK_OBJECT:
+      result = cstring_makeLiteral ("Object");
+      break;
+    case SK_UNCONSTRAINED:
+      result = cstring_makeLiteral ("");
+      break;
+    case SK_RESULT:
+    case SK_SPECIAL:
+    case SK_UNKNOWN:
+    case SK_EXTERNAL:
+    case SK_DERIVED:
+    case SK_CONST:
+    case SK_TYPE:
+      result = cstring_makeLiteral ("");
+      break;
+    case SK_CONJ:
+      result = cstring_makeLiteral ("");
+      break;
+    case SK_NEW:
+      result = cstring_makeLiteral ("Storage");
+      break;
+    }
+  
+  return result;
+}
+
+/*@only@*/ cstring
+sRef_unparseKindNamePlain (sRef s)
+{
+  cstring result;
+
+  if (s == sRef_undefined) return cstring_makeLiteral ("");
+
+  s = sRef_fixConj (s);
+
+  switch (s->kind)
+    {
+    case SK_CVAR: 
+      if (sRef_isLocalVar (s)) 
+	{
+	  result = cstring_makeLiteral ("Variable");
+	}
+      else 
+	{
+	  result = cstring_makeLiteral ("Global");
+	}
+      break;
+    case SK_PARAM:
+      result = cstring_makeLiteral ("Parameter");
+      break;
+    case SK_ARRAYFETCH:
+      if (sRef_isAnyParam (s->info->arrayfetch->arr)) 
+	{
+	  result = cstring_makeLiteral ("Parameter");
+	}
+      else if (sRef_isIndexKnown (s))
+	{
+	  result = cstring_makeLiteral ("Array element");
+	}
+      else 
+	{
+	  result = cstring_makeLiteral ("Value");
+	}
+      break;
+    case SK_PTR:
+      if (sRef_isAnyParam (s->info->ref))
+	{
+	  result = cstring_makeLiteral ("Parameter");
+	}
+      else
+	{
+	  result = cstring_makeLiteral ("Value");
+	}
+      break;
+    case SK_ADR:
+      result = cstring_makeLiteral ("Value");
+      break;
+    case SK_FIELD:
+      result = cstring_makeLiteral ("Field");
+      break;
+    case SK_OBJECT:
+      result = cstring_makeLiteral ("Object");
+      break;
+    case SK_NEW:
+      result = cstring_makeLiteral ("Storage");
+      break;
+    case SK_UNCONSTRAINED:
+      result = cstring_makeLiteral ("");
+      break;
+    case SK_RESULT:
+    case SK_TYPE:
+    case SK_CONST:
+    case SK_EXTERNAL:
+    case SK_DERIVED:
+    case SK_UNKNOWN:
+    case SK_SPECIAL:
+      result = cstring_makeLiteral ("");
+      break;
+    case SK_CONJ:
+      result = cstring_makeLiteral ("");
+      break;
+    }
+  
+  return result;
+}
+
+/*
+** s1 <- s2
+*/
+
+void
+sRef_copyState (sRef s1, sRef s2)
+{
+  if (sRef_isValid (s1) && sRef_isValid (s2))
+    {
+      s1->defstate = s2->defstate;
+      
+      s1->nullstate = s2->nullstate;
+      s1->nullinfo = alinfo_update (s1->nullinfo, s2->nullinfo);
+
+      s1->aliaskind = s2->aliaskind;
+      s1->aliasinfo = alinfo_update (s1->aliasinfo, s2->aliasinfo);
+
+      s1->expkind = s2->expkind;
+      s1->expinfo = alinfo_update (s1->expinfo, s2->expinfo);
+
+      s1->safe = s2->safe;
+          }
+}
+
+sRef
+sRef_makeNew (ctype ct, sRef t, cstring name)
+{
+  sRef s = sRef_new ();
+
+  s->kind = SK_NEW;
+  s->type = ct;
+
+  llassert (sRef_isValid (t));
+  s->defstate = t->defstate;
+
+  s->aliaskind = t->aliaskind;
+  s->oaliaskind = s->aliaskind;
+
+  s->nullstate = t->nullstate;
+
+  s->expkind = t->expkind;
+  s->oexpkind = s->expkind;
+
+  s->info = (sinfo) dmalloc (sizeof (*s->info));
+  s->info->fname = name;
+
+    return s;
+}
+
+sRef
+sRef_makeType (ctype ct)
+{
+  sRef s = sRef_new ();
+  
+  s->kind = SK_TYPE;
+  s->type = ct;
+
+  s->defstate = SS_UNKNOWN; 
+  s->aliaskind = AK_UNKNOWN;
+  s->nullstate = NS_UNKNOWN;
+
+    
+  if (ctype_isUA (ct))
+    {
+      typeId uid = ctype_typeId (ct);
+      uentry ue = usymtab_getTypeEntrySafe (uid);
+
+      if (uentry_isValid (ue))
+	{
+	  sRef_mergeStateQuiet (s, uentry_getSref (ue));
+	}
+    }
+
+    s->oaliaskind = s->aliaskind;
+  s->oexpkind = s->expkind;
+
+  return s;
+}
+
+sRef
+sRef_makeConst (ctype ct)
+{
+  sRef s = sRef_new ();
+  
+  s->kind = SK_CONST;
+  s->type = ct;
+
+  s->defstate = SS_UNKNOWN;
+  s->aliaskind = AK_UNKNOWN;
+  s->nullstate = NS_UNKNOWN;
+
+  
+  if (ctype_isUA (ct))
+    {
+      typeId uid = ctype_typeId (ct);
+      uentry te = usymtab_getTypeEntrySafe (uid);
+      
+      if (uentry_isValid (te))
+	{
+	  sRef_mergeStateQuiet (s, uentry_getSref (te));
+	}
+    }
+
+  
+  s->oaliaskind = s->aliaskind;
+  s->oexpkind = s->expkind;
+
+  return s;
+}
+
+bool sRef_hasName (sRef s)
+{
+  if (sRef_isInvalid (s))
+    {
+      return (FALSE);
+    }
+
+  switch (s->kind)
+    {
+    case SK_CVAR:
+      {
+	uentry u = usymtab_getRefQuiet (s->info->cvar->lexlevel,
+					 s->info->cvar->index);
+	return (uentry_hasName (u));
+      }
+    case SK_PARAM:
+      {
+	uentry u = uentryList_getN (context_getParams (), 
+				    s->info->paramno);
+
+	return (uentry_hasName (u));
+      }
+    default:
+      return TRUE;
+    }
+}
+
+bool
+sRef_sameName (sRef s1, sRef s2)
+{
+  if (sRef_isInvalid (s1))
+    {
+      return sRef_isInvalid (s2);
+    }
+
+  if (sRef_isInvalid (s2))
+    {
+      return (FALSE);
+    }
+
+  switch (s1->kind)
+    {
+    case SK_CVAR:
+      if (s2->kind == SK_CVAR)
+	{
+	  return (s1->info->cvar->lexlevel == s2->info->cvar->lexlevel
+		  && s1->info->cvar->index == s2->info->cvar->index);
+	}
+      else if (s2->kind == SK_PARAM)
+	{
+	  if (context_inFunctionLike ())
+	    {
+	      uentry u1 = usymtab_getRefQuiet (s1->info->cvar->lexlevel,
+					       s1->info->cvar->index);
+	      uentry u2 = uentryList_getN (context_getParams (), 
+					   s2->info->paramno);
+	  
+	      return (cstring_equalFree (uentry_getName (u1),
+					 uentry_getName (u2)));
+	    }
+	  else 
+	    {
+	      return FALSE;
+	    }
+	}
+      else
+	{
+	  return FALSE;
+	}
+    case SK_PARAM:
+      {
+	if (s2->kind == SK_PARAM)
+	  {
+	    return (s1->info->paramno == s2->info->paramno);
+	  }
+	else if (s2->kind == SK_CVAR)
+	  {
+	    if (context_inFunctionLike ())
+	      {
+		uentry u1 = uentryList_getN (context_getParams (), 
+					     s1->info->paramno);
+		uentry u2 = usymtab_getRefQuiet (s2->info->cvar->lexlevel,
+						 s2->info->cvar->index);
+
+		
+		return (cstring_equalFree (uentry_getName (u1),
+					   uentry_getName (u2)));
+	      }
+	    else 
+	      {
+		return FALSE;
+	      }
+	  }
+	else
+	  {
+	    return FALSE;
+	  }
+      }
+
+    case SK_UNCONSTRAINED:
+      return FALSE;
+
+    case SK_ARRAYFETCH:
+      if (s2->kind == SK_ARRAYFETCH)
+	{
+	  if (bool_equal (s1->info->arrayfetch->indknown,
+			  s2->info->arrayfetch->indknown))
+	    {
+	      if (!s1->info->arrayfetch->indknown 
+		  || (s1->info->arrayfetch->ind == s2->info->arrayfetch->ind))
+		{
+		  return sRef_sameName (s1->info->arrayfetch->arr,
+					s2->info->arrayfetch->arr);
+		}
+	    }
+	}
+
+      return FALSE;
+    case SK_FIELD:
+      if (s2->kind == SK_FIELD)
+	{
+	  if (cstring_equal (s1->info->field->field,
+			     s2->info->field->field))
+	    {
+	      return sRef_sameName (s1->info->field->rec,
+				    s2->info->field->rec);
+	    }
+
+	}
+      return FALSE;
+    case SK_PTR:
+    case SK_ADR:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+      if (s2->kind == s1->kind)
+	{
+	  return sRef_sameName (s1->info->ref,
+				s2->info->ref);
+	}
+
+      return FALSE;
+    case SK_OBJECT:
+      return FALSE;
+    case SK_CONJ:
+      return sRef_sameName (sRef_getConjA (s1), s2);
+    case SK_NEW:
+      return FALSE;
+    case SK_UNKNOWN:
+      return (s2->kind == SK_UNKNOWN);
+    case SK_TYPE:
+    case SK_CONST:
+      if (s2->kind == s1->kind)
+	{
+	  return (ctype_equal (s1->type, s2->type));
+	}
+      
+      return FALSE;
+    case SK_SPECIAL:
+      if (s2->kind == SK_SPECIAL)
+	{
+	  return (s1->info->spec == s2->info->spec);
+	}
+      return FALSE;
+    case SK_RESULT:
+      return (s2->kind == SK_RESULT);
+    default:
+      return FALSE;
+    }
+  BADEXIT;
+}
+		
+sRef
+sRef_fixOuterRef (/*@returned@*/ sRef s)
+{
+  sRef root = sRef_getRootBase (s);
+
+  if (sRef_isCvar (root))
+    {
+      uentry ue = usymtab_getRefQuiet (root->info->cvar->lexlevel, 
+				       root->info->cvar->index);
+
+      if (uentry_isValid (ue))
+	{
+	  sRef uref = uentry_getSref (ue);
+	  sRef sr = sRef_fixBase (s, uref);
+
+	  return (sr);
+	}
+      else
+	{
+	  llcontbug (message ("sRef_fixOuterRef: undefined: %q", sRef_unparseDebug (s)));
+	  return (s);
+	}
+    }
+
+  return (s);
+}
+
+void
+sRef_storeState (sRef s)
+{
+  if (sRef_isInvalid (s)) return;
+
+  s->oaliaskind = s->aliaskind;
+  s->oexpkind = s->expkind;
+}
+  
+static void sRef_resetStateAux (sRef s, /*@unused@*/ fileloc loc)
+{
+  sRef_resetState (s);
+}
+
+void
+sRef_resetState (sRef s)
+{
+  bool changed = FALSE;
+  if (sRef_isInvalid (s)) return;
+
+  
+  if (s->oaliaskind == AK_KILLREF && !sRef_isParam (s))
+    {
+      /*
+      ** killref is used in a kludgey way, to save having to add
+      ** another alias kind (see usymtab_handleParams)
+      */
+ 
+      if (s->expkind != s->oexpkind)
+	{
+	  changed = TRUE;
+	  s->expkind = s->oexpkind;
+	}
+    }
+  else
+    {
+      if (s->expkind != s->oexpkind)
+	{
+	  changed = TRUE;
+	  s->expkind = s->oexpkind;	  
+	}
+
+      if (s->aliaskind != s->oaliaskind
+	  && s->aliaskind != AK_REFCOUNTED
+	  && s->aliaskind != AK_REFS)
+	{
+	  changed = TRUE;
+	  s->aliaskind = s->oaliaskind;
+	  	}
+    }
+
+  if (changed)
+    {
+      sRef_clearDerived (s);
+    }
+  
+  }
+
+void
+sRef_resetStateComplete (sRef s)
+{
+  sRef_innerAliasSetComplete (sRef_resetStateAux, s, fileloc_undefined);
+}
+
+/*@exposed@*/ sRef
+sRef_fixBase (/*@returned@*/ sRef s, /*@returned@*/ sRef base)
+{
+  sRef tmp = sRef_undefined;
+  sRef ret;
+
+  if (sRef_isInvalid (s)) return s;
+  if (sRef_isInvalid (base)) return base;
+
+  switch (s->kind)
+    {
+    case SK_RESULT:
+    case SK_PARAM:
+    case SK_CVAR:
+      ret = base;
+      break;
+    case SK_ARRAYFETCH:
+      tmp = sRef_fixBase (s->info->arrayfetch->arr, base);
+
+      if (s->info->arrayfetch->indknown)
+	{
+	  ret = sRef_makeArrayFetchKnown (tmp, s->info->arrayfetch->ind);
+	}
+      else
+	{
+	  ret = sRef_makeArrayFetch (tmp);
+	}
+      break;
+    case SK_FIELD:
+      tmp = sRef_fixBase (s->info->field->rec, base);
+      ret = sRef_buildNCField (tmp, s->info->field->field);
+      break;
+    case SK_PTR:
+      tmp = sRef_fixBase (s->info->ref, base);
+      ret = sRef_makePointer (tmp);
+      break;
+    case SK_ADR:
+      tmp = sRef_fixBase (s->info->ref, base);
+      ret = sRef_makeAddress (tmp);
+      break;
+    case SK_CONJ:
+      {
+	sRef tmpb;
+
+	tmp = sRef_fixBase (s->info->conj->a, base);
+	tmpb = sRef_fixBase (s->info->conj->b, base);
+
+	ret = sRef_makeConj (tmp, tmpb);
+	break;
+      }
+      BADDEFAULT;
+    }
+
+  return ret;
+}
+
+static /*@exposed@*/ sRef 
+sRef_fixDirectBase (sRef s, sRef base)
+{
+  sRef ret;
+
+  
+  if (sRef_isInvalid (s))
+    {
+            return sRef_undefined;
+    }
+
+  switch (s->kind)
+    {
+    case SK_ARRAYFETCH:
+      if (s->info->arrayfetch->indknown)
+	{
+	  ret = sRef_makeArrayFetchKnown (base, s->info->arrayfetch->ind);
+	}
+      else
+	{
+	  ret = sRef_makeArrayFetch (base);
+	}
+      break;
+    case SK_FIELD:
+      ret = sRef_buildNCField (base, s->info->field->field);
+      break;
+    case SK_PTR:
+            ret = sRef_makePointer (base);
+            break;
+    case SK_ADR:
+      ret = sRef_makeAddress (base);
+      break;
+    case SK_CONJ:
+      {
+	sRef tmpa, tmpb;
+
+	tmpa = sRef_fixDirectBase (s->info->conj->a, base);
+	tmpb = sRef_fixDirectBase (s->info->conj->b, base);
+
+	ret = sRef_makeConj (tmpa, tmpb);
+	break;
+      }
+      BADDEFAULT;
+    }
+
+    sRef_copyState (ret, s);
+    return ret;
+}
+
+bool
+sRef_isAllocIndexRef (sRef s)
+{
+  return (sRef_isArrayFetch (s) && !(s->info->arrayfetch->indknown) 
+	  && sRef_isAllocated (s->info->arrayfetch->arr));
+}
+
+void
+sRef_showRefLost (sRef s)
+{
+  if (sRef_hasAliasInfoLoc (s))
+    {
+      llgenindentmsg (cstring_makeLiteral ("Original reference lost"),
+		sRef_getAliasInfoLoc (s));
+    }
+}
+
+void
+sRef_showRefKilled (sRef s)
+{
+  if (sRef_hasStateInfoLoc (s))
+    {
+      llgenindentmsg (message ("Storage %q released", 
+			       sRef_unparse (s)), sRef_getStateInfoLoc (s));
+    }
+}
+
+void
+sRef_showStateInconsistent (sRef s)
+{
+  if (sRef_hasStateInfoLoc (s))
+    {
+      llgenindentmsg
+	(message ("Storage %qbecomes inconsistent (released on one branch)",
+		  sRef_unparseOpt (s)), 
+	 sRef_getStateInfoLoc (s));
+    }
+}
+
+void
+sRef_showStateInfo (sRef s)
+{
+  if (sRef_hasStateInfoLoc (s))
+    {
+      if (s->defstate == SS_DEAD)
+	{
+	  llgenindentmsg 
+	    (message ("Storage %qis released", sRef_unparseOpt (s)),
+	     sRef_getStateInfoLoc (s));
+	}
+      else if (s->defstate == SS_ALLOCATED || s->defstate == SS_DEFINED)
+	{
+	  llgenindentmsg 
+	    (message ("Storage %qis %s", sRef_unparseOpt (s), 
+		      sstate_unparse (s->defstate)),
+	     sRef_getStateInfoLoc (s));
+	}
+      else if (s->defstate == SS_UNUSEABLE)
+	{
+	  llgenindentmsg 
+	    (message ("Storage %qbecomes inconsistent (clauses merge with"
+		      "%qreleased on one branch)",
+		      sRef_unparseOpt (s), 
+		      sRef_unparseOpt (s)),
+	     sRef_getStateInfoLoc (s));
+	}
+      else 
+	{
+	  llgenindentmsg (message ("Storage %qbecomes %s", 
+				   sRef_unparseOpt (s), 
+				   sstate_unparse (s->defstate)),
+			  sRef_getStateInfoLoc (s));
+	}
+    }
+}
+
+void
+sRef_showExpInfo (sRef s)
+{
+  if (sRef_hasExpInfoLoc (s))
+    {
+      llgenindentmsg (message ("Storage %qbecomes %s", sRef_unparseOpt (s), 
+			       exkind_unparse (s->expkind)),
+		      sRef_getExpInfoLoc (s));
+    }
+}
+
+void
+sRef_showNullInfo (sRef s)
+{
+  if (sRef_hasNullInfoLoc (s) && sRef_isKnown (s))
+    {
+      switch (s->nullstate)
+	{
+	case NS_CONSTNULL:
+	  {
+	    fileloc loc = sRef_getNullInfoLoc (s);
+	    
+	    if (fileloc_isDefined (loc) && !fileloc_isLib (loc))
+	      {
+		llgenindentmsg 
+		  (message ("Storage %qbecomes null", sRef_unparseOpt (s)),
+		   loc);
+	      }
+	    break;
+	  }
+	case NS_DEFNULL:
+	  {
+	    fileloc loc = sRef_getNullInfoLoc (s);
+	    
+	    if (fileloc_isDefined (loc) && !fileloc_isLib (loc))
+	      {
+		llgenindentmsg (message ("Storage %qbecomes null", sRef_unparseOpt (s)),
+				loc);
+	      }
+	    break;
+	  }
+	case NS_ABSNULL:
+	case NS_POSNULL:
+	  llgenindentmsg
+	    (message ("Storage %qmay become null", sRef_unparseOpt (s)),
+	     sRef_getNullInfoLoc (s));
+	  break;
+	case NS_NOTNULL:
+	case NS_MNOTNULL:
+	  llgenindentmsg
+	    (message ("Storage %qbecomes not null", sRef_unparseOpt (s)),
+	     sRef_getNullInfoLoc (s));
+	  break;
+	case NS_UNKNOWN:
+	  llgenindentmsg
+	    (message ("Storage %qnull state becomes unknown",
+		      sRef_unparseOpt (s)),
+	     sRef_getNullInfoLoc (s));
+	  break;
+
+	case NS_ERROR:
+	  BADBRANCHCONT;
+	  break;
+
+	default:
+	  llgenindentmsg
+	    (message (" Storage %q becomes %s",
+		      sRef_unparse (s), 
+		      nstate_unparse (s->nullstate)),
+	     sRef_getNullInfoLoc (s));
+	  
+	  break;
+	}
+    }
+}
+
+void
+sRef_showAliasInfo (sRef s)
+{
+  if (sRef_hasAliasInfoLoc (s))
+    {
+      if (sRef_isFresh (s))
+	{
+	  llgenindentmsg 
+	    (message ("Fresh storage %qallocated", sRef_unparseOpt (s)),
+	     sRef_getAliasInfoLoc (s));
+	}
+      else 
+	{
+	  if (!sRef_isRefCounted (s))
+	    {
+	      llgenindentmsg 
+		(message ("Storage %qbecomes %s", 
+			  sRef_unparseOpt (s),
+			  alkind_unparse (sRef_getAliasKind (s))),
+		 sRef_getAliasInfoLoc (s));
+	    }
+	}
+    }
+}
+
+void
+sRef_mergeNullState (sRef s, nstate n)
+{
+  if (sRef_isValid (s))
+    {
+      nstate old;
+      
+      old = s->nullstate;
+      
+      if (n != old && n != NS_UNKNOWN)
+	{
+	  	  
+	  s->nullstate = n;
+	  s->nullinfo = alinfo_updateLoc (s->nullinfo, g_currentloc);
+	}
+    }
+  else
+    {
+      llbuglit ("sRef_mergeNullState: invalid");
+    }
+}
+
+bool
+sRef_possiblyNull (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      if (s->nullstate == NS_ABSNULL)
+	{
+	  ctype rct = ctype_realType (s->type);
+
+	  if (ctype_isAbstract (rct))
+	    {
+	      return FALSE;
+	    }
+	  else
+	    {
+	      if (ctype_isUser (rct))
+		{
+		  uentry ue = usymtab_getTypeEntry (ctype_typeId (rct));
+		  
+		  return (nstate_possiblyNull
+			  (sRef_getNullState (uentry_getSref (ue))));
+		}
+	      else
+		{
+		  return FALSE;
+		}
+	    }
+	}
+      else
+	{
+	  return nstate_possiblyNull (s->nullstate);
+	}
+    }
+
+  return FALSE;
+}
+
+cstring
+sRef_getScopeName (sRef s)
+{
+  sRef base = sRef_getRootBase (s);
+
+  if (sRef_isRealGlobal (base))
+    {
+      return (cstring_makeLiteralTemp ("Global"));
+    }
+  else if (sRef_isFileStatic (base))
+    {
+      return (cstring_makeLiteralTemp ("Static"));
+    }
+  else
+    {
+      return (cstring_makeLiteralTemp ("Local"));
+    }
+}
+
+cstring
+sRef_unparseScope (sRef s)
+{
+  sRef base = sRef_getRootBase (s);
+
+  if (sRef_isRealGlobal (base))
+    {
+      return (cstring_makeLiteralTemp ("global"));
+    }
+  else if (sRef_isFileStatic (base))
+    {
+      return (cstring_makeLiteralTemp ("file static"));
+    }
+  else
+    {
+      BADEXIT;
+    }
+}
+
+int
+sRef_getScope (sRef s)
+{
+  llassert (sRef_isValid (s));
+
+  if (sRef_isCvar (s))
+    {
+      return s->info->cvar->lexlevel;
+    }
+  else if (sRef_isParam (s))
+    {
+      return paramsScope;
+    }
+  else
+    {
+      return fileScope;
+    }
+}
+
+bool
+sRef_isDead (sRef s)
+{
+  return (sRef_isValid (s) && (s)->defstate == SS_DEAD);
+}
+
+bool
+sRef_isDeadStorage (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      if (s->defstate == SS_DEAD
+	  || s->defstate == SS_UNUSEABLE
+	  || s->defstate == SS_UNDEFINED
+	  || s->defstate == SS_UNKNOWN)
+	{
+	  return TRUE;
+	}
+      else 
+	{
+	  return (sRef_isDefinitelyNull (s));
+	}
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+bool
+sRef_isPossiblyDead (sRef s)
+{
+  return (sRef_isValid (s) && s->defstate == SS_HOFFA);
+}
+
+bool sRef_isStateLive (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      sstate ds = s->defstate;
+
+      return (!(ds == SS_UNDEFINED 
+		|| ds == SS_DEAD
+		|| ds == SS_UNUSEABLE
+		|| ds == SS_HOFFA));
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+
+bool sRef_isStateUndefined (sRef s)
+{
+  return ((sRef_isValid(s)) && ((s)->defstate == SS_UNDEFINED));
+}
+
+bool sRef_isJustAllocated (sRef s)
+{
+  if (sRef_isAllocated (s))
+    {
+      sRefSet_allElements (s->deriv, el)
+	{
+	  if (!(sRef_isStateUndefined (el) || sRef_isUnuseable (el)))
+	    {
+	      return FALSE;
+	    }
+	} end_sRefSet_allElements ;
+
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+static bool
+sRef_isAllocatedStorage (sRef s)
+{
+  if (sRef_isValid (s) && ynm_toBoolStrict (sRef_isReadable (s)))
+    {
+      return (ctype_isVisiblySharable (sRef_getType (s)));
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+bool
+sRef_isUnuseable (sRef s)
+{
+  return ((sRef_isValid(s)) && ((s)->defstate == SS_UNUSEABLE));
+}
+
+bool
+sRef_perhapsNull (sRef s)
+{
+  if (sRef_isValid (s))
+    {
+      if (s->nullstate == NS_ABSNULL)
+	{
+	  ctype rct = ctype_realType (s->type);
+
+	  if (ctype_isAbstract (rct))
+	    {
+	      return FALSE;
+	    }
+	  else
+	    {
+	      if (ctype_isUser (rct))
+		{
+		  uentry ue = usymtab_getTypeEntry (ctype_typeId (rct));
+
+		  return (nstate_perhapsNull 
+			  (sRef_getNullState (uentry_getSref (ue))));
+		}
+	      else
+		{
+		  return FALSE;
+		}
+	    }
+	}
+      else
+	{
+	  return nstate_perhapsNull (s->nullstate);
+	}
+    }
+
+  return FALSE;
+}
+
+/*
+** definitelyNull --- called when TRUE is good
+*/
+
+bool 
+sRef_definitelyNull (sRef s)
+{
+  return (sRef_isValid (s)
+	  && (s->nullstate == NS_DEFNULL || s->nullstate == NS_CONSTNULL));
+}
+
+/*
+** based on sRef_similar
+*/
+
+void
+sRef_setDerivNullState (sRef set, sRef guide, nstate ns)
+{
+  if (sRef_isValid (set))
+    {
+      sRef deriv = sRef_getDeriv (set, guide);
+      
+      if (sRef_isValid (deriv))
+	{
+	  deriv->nullstate = ns;
+	}
+    }
+}
+
+static /*@exposed@*/ sRef
+sRef_getDeriv (/*@returned@*/ /*@notnull@*/ sRef set, sRef guide)
+{
+  llassert (sRef_isValid (set));
+  llassert (sRef_isValid (guide));
+
+  switch (guide->kind)
+    {
+    case SK_CVAR:
+      llassert (set->kind == SK_CVAR);
+      
+      return set;
+
+    case SK_PARAM:
+      llassert (set->kind == guide->kind);
+      llassert (set->info->paramno == guide->info->paramno);
+
+      return set;
+
+    case SK_ARRAYFETCH:
+
+      if (set->kind == SK_ARRAYFETCH
+	  && (sRef_similar (set->info->arrayfetch->arr,
+			    guide->info->arrayfetch->arr)))
+	{
+	  return set;
+	}
+      else
+	{
+	  return (sRef_makeAnyArrayFetch 
+		  (sRef_getDeriv (set, guide->info->arrayfetch->arr)));
+	}
+
+    case SK_PTR:
+      
+      if (set->kind == SK_PTR && sRef_similar (set->info->ref, guide->info->ref))
+	{
+	  return set;
+	}
+      else
+	{
+	  return (sRef_makePointer (sRef_getDeriv (set, guide->info->ref)));
+	}
+      
+    case SK_FIELD:
+      
+      if ((set->kind == SK_FIELD &&
+	   (sRef_similar (set->info->field->rec, guide->info->field->rec) &&
+	    cstring_equal (set->info->field->field, guide->info->field->field))))
+	{
+	  return set;
+	}
+      else
+	{
+	  return (sRef_makeField (sRef_getDeriv (set, guide->info->field->rec),
+				  guide->info->field->field));
+	}
+    case SK_ADR:
+      
+      if ((set->kind == SK_ADR) && sRef_similar (set->info->ref, guide->info->ref))
+	{
+	  return set;
+	}
+      else
+	{
+	  return (sRef_makeAddress (sRef_getDeriv (set, guide->info->ref)));
+	}
+
+    case SK_CONJ:
+      
+            return sRef_undefined;
+
+    case SK_RESULT:
+    case SK_SPECIAL:
+    case SK_UNCONSTRAINED:
+    case SK_TYPE:
+    case SK_CONST:
+    case SK_NEW:
+    case SK_UNKNOWN:
+    case SK_OBJECT:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+      return sRef_undefined;
+    }
+
+  BADEXIT;
+}
+      
+/*
+** sRef_aliasCheckPred
+**
+** A confusing but spiffy function:
+**
+**    Calls predf (s, e, text, ) on s and all of s's aliases
+**    (unless checkAliases (s) is FALSE).
+**
+**    For alias calls, calls as
+**          predf (alias, e, text, s)
+*/
+
+void
+sRef_aliasCheckPred (bool (predf) (sRef, exprNode, sRef, exprNode),
+		     /*@null@*/ bool (checkAliases) (sRef),
+		     sRef s, exprNode e, exprNode err)
+{
+  bool error = (*predf)(s, e, sRef_undefined, err);
+  
+  
+  if (checkAliases != NULL && !(checkAliases (s)))
+    {
+      /* don't check aliases */
+    }
+  else
+    {
+      sRefSet aliases = usymtab_allAliases (s);
+
+      
+      sRefSet_realElements (aliases, current)
+	{
+	  if (sRef_isValid (current))
+	    {
+	      if (!sRef_similar (current, s)
+		  || (error && sRef_sameName (current, s)))
+		{
+		  (void) (*predf)(current, e, s, err);
+		}
+	      }
+	} end_sRefSet_realElements;
+
+      sRefSet_free (aliases);
+    }
+}
+
+/*
+** return TRUE iff predf (s) is true for s or any alias of s
+*/
+
+bool
+sRef_aliasCheckSimplePred (sRefTest predf, sRef s)
+{
+    
+  if ((*predf)(s))
+    {
+      return TRUE;
+    }
+  else
+    {
+      sRefSet aliases;
+
+      aliases = usymtab_allAliases (s);
+      
+      sRefSet_realElements (aliases, current)
+	{
+	  if (sRef_isValid (current))
+	    {
+	      sRef cref = sRef_updateSref (current);
+	      
+	      /* Whoa! a very kludgey way to make sure the right sref is used
+	      ** where there is a conditional symbol table.  I am beginning
+	      ** to think that having a conditional symbol table wasn't such
+	      ** a great idea.  ;(
+	      */
+	      
+	      	      
+	      if ((*predf)(cref))
+		{
+		  sRefSet_free (aliases);
+		  return TRUE;
+		}
+	    }
+	} end_sRefSet_realElements;
+
+      sRefSet_free (aliases);
+    }
+  return FALSE;
+}
+
+bool
+sRef_aliasCompleteSimplePred (bool (predf) (sRef), sRef s)
+{
+  sRefSet aliases;
+  bool result = FALSE;
+  
+  
+  aliases = usymtab_allAliases (s);
+  
+  if ((*predf)(s)) result = TRUE;
+
+  
+  sRefSet_realElements (aliases, current)
+    {
+      if (sRef_isValid (current))
+	{
+	  	  current = sRef_updateSref (current);
+	  	  if ((*predf)(current)) result = TRUE;
+	}
+    } end_sRefSet_realElements;
+  
+  sRefSet_free (aliases);
+  return result;
+}
+
+static void
+sRef_aliasSetComplete (void (predf) (sRef, fileloc), sRef s, fileloc loc)
+{
+  sRefSet aliases;
+  
+  aliases = usymtab_allAliases (s);
+
+  (*predf)(s, loc);
+
+  sRefSet_realElements (aliases, current)
+    {
+      if (sRef_isValid (current))
+	{
+	  current = sRef_updateSref (current);
+	  	  ((*predf)(current, loc));
+	}
+    } end_sRefSet_realElements;
+
+  sRefSet_free (aliases);
+}
+
+static void
+sRef_aliasSetCompleteParam (void (predf) (sRef, alkind, fileloc), sRef s, 
+			    alkind kind, fileloc loc)
+{
+  sRefSet aliases;
+
+  
+  if (sRef_isDeep (s))
+    {
+      aliases = usymtab_allAliases (s);
+    }
+  else
+    {
+      aliases = usymtab_aliasedBy (s);
+    }
+
+  (*predf)(s, kind, loc);
+
+  sRefSet_realElements (aliases, current)
+    {
+      if (sRef_isValid (current))
+	{
+	  current = sRef_updateSref (current);
+	  	  ((*predf)(current, kind, loc));
+	}
+    } end_sRefSet_realElements;
+
+  sRefSet_free (aliases);
+}
+
+static void
+sRef_innerAliasSetComplete (void (predf) (sRef, fileloc), sRef s, fileloc loc)
+{
+  sRef inner;
+  sRefSet aliases;
+  ctype ct;
+
+  if (!sRef_isValid (s)) return;
+
+  
+  /*
+  ** Type equivalence checking is necessary --- there might be casting.
+  */
+
+  (*predf)(s, loc);
+
+  switch (s->kind)
+    {
+    case SK_UNCONSTRAINED:
+    case SK_CVAR:
+    case SK_PARAM:
+      break;
+    case SK_PTR:
+      inner = s->info->ref;
+      aliases = usymtab_allAliases (inner);
+      ct = sRef_getType (inner);
+
+      
+      sRefSet_realElements (aliases, current)
+	{
+	  if (sRef_isValid (current))
+	    {
+	      current = sRef_updateSref (current);
+	      
+	      if (ctype_equal (ct, sRef_getType (current)))
+		{
+		  sRef ptr = sRef_makePointer (current);
+		  
+		  ((*predf)(ptr, loc));
+		}
+	    }
+	} end_sRefSet_realElements;
+
+      sRefSet_free (aliases);
+      break;
+    case SK_ARRAYFETCH:
+      inner = s->info->arrayfetch->arr;
+      aliases = usymtab_allAliases (inner);
+      ct = sRef_getType (inner);
+
+      sRefSet_realElements (aliases, current)
+	{
+	  if (sRef_isValid (current))
+	    {
+	      current = sRef_updateSref (current);
+	      
+	      if (ctype_equal (ct, sRef_getType (current)))
+		{
+		  		  
+		  if (s->info->arrayfetch->indknown)
+		    {
+		      sRef af = sRef_makeArrayFetchKnown (current, s->info->arrayfetch->ind);
+		      
+		      ((*predf)(af, loc));
+		    }
+		  else
+		    {
+		      sRef af = sRef_makeArrayFetch (current);
+		      
+		      ((*predf)(af, loc));
+		    }
+		}
+	    }
+	} end_sRefSet_realElements;
+
+      sRefSet_free (aliases);
+      break;
+    case SK_FIELD:
+      inner = s->info->field->rec;
+      aliases = usymtab_allAliases (inner);
+      ct = sRef_getType (inner);
+
+      
+      sRefSet_realElements (aliases, current)
+	{
+	  if (sRef_isValid (current))
+	    {
+	      current = sRef_updateSref (current);
+	      
+	      if (ctype_equal (ct, sRef_getType (current)))
+		{
+		  sRef f = sRef_makeField (current, s->info->field->field);
+		  
+		  ((*predf)(f, loc));
+		}
+	    }
+	} end_sRefSet_realElements;
+      
+      sRefSet_free (aliases);
+      break;
+    case SK_CONJ:
+      sRef_innerAliasSetComplete (predf, s->info->conj->a, loc);
+      sRef_innerAliasSetComplete (predf, s->info->conj->b, loc);
+      break;
+    case SK_SPECIAL:
+    case SK_ADR:
+    case SK_TYPE:
+    case SK_CONST:
+    case SK_NEW:
+    case SK_UNKNOWN:
+    case SK_OBJECT:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+    case SK_RESULT:
+      break;
+    }
+}
+
+static void
+sRef_innerAliasSetCompleteParam (void (predf) (sRef, sRef), sRef s, sRef t)
+{
+  sRef inner;
+  sRefSet aliases;
+  ctype ct;
+
+  if (!sRef_isValid (s)) return;
+
+  
+  /*
+  ** Type equivalence checking is necessary --- there might be casting.
+  */
+
+  (*predf)(s, t);
+
+  switch (s->kind)
+    {
+    case SK_UNCONSTRAINED:
+    case SK_CVAR:
+    case SK_PARAM:
+      break;
+    case SK_PTR:
+      inner = s->info->ref;
+      aliases = usymtab_allAliases (inner);
+      ct = sRef_getType (inner);
+      
+      
+      sRefSet_realElements (aliases, current)
+	{
+	  if (sRef_isValid (current))
+	    {
+	      current = sRef_updateSref (current);
+	      
+	      if (ctype_equal (ct, sRef_getType (current)))
+		{
+		  sRef ptr = sRef_makePointer (current);
+		  
+		  ((*predf)(ptr, t));
+		}
+	    }
+	} end_sRefSet_realElements;
+
+      sRefSet_free (aliases);
+      break;
+    case SK_ARRAYFETCH:
+      inner = s->info->arrayfetch->arr;
+      aliases = usymtab_allAliases (inner);
+      ct = sRef_getType (inner);
+
+      sRefSet_realElements (aliases, current)
+	{
+	  if (sRef_isValid (current))
+	    {
+	      current = sRef_updateSref (current);
+	      
+	      if (ctype_equal (ct, sRef_getType (current)))
+		{
+		  		  
+		  if (s->info->arrayfetch->indknown)
+		    {
+		      sRef af = sRef_makeArrayFetchKnown (current, s->info->arrayfetch->ind);
+		      
+		      ((*predf)(af, t));
+		    }
+		  else
+		    {
+		      sRef af = sRef_makeArrayFetch (current);
+		      
+		      ((*predf)(af, t));
+		    }
+		}
+	    }
+	} end_sRefSet_realElements;
+
+      sRefSet_free (aliases);
+      break;
+    case SK_FIELD:
+      inner = s->info->field->rec;
+      aliases = usymtab_allAliases (inner);
+      ct = sRef_getType (inner);
+
+      
+      sRefSet_realElements (aliases, current)
+	{
+	  if (sRef_isValid (current))
+	    {
+	      current = sRef_updateSref (current);
+	      
+	      if (ctype_equal (ct, sRef_getType (current)))
+		{
+		  sRef f = sRef_makeField (current, s->info->field->field);
+		  
+		  ((*predf)(f, t));
+		}
+	    }
+	} end_sRefSet_realElements;
+      
+      sRefSet_free (aliases);
+      break;
+    case SK_CONJ:
+      sRef_innerAliasSetCompleteParam (predf, s->info->conj->a, t);
+      sRef_innerAliasSetCompleteParam (predf, s->info->conj->b, t);
+      break;
+    case SK_SPECIAL:
+    case SK_ADR:
+    case SK_TYPE:
+    case SK_CONST:
+    case SK_NEW:
+    case SK_UNKNOWN:
+    case SK_OBJECT:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+    case SK_RESULT:
+      break;
+    }
+}
+
+static void sRef_combineExKinds (/*@notnull@*/ sRef res, /*@notnull@*/ sRef other)
+{
+  exkind a1 = sRef_getExKind (res);
+  exkind a2 = sRef_getExKind (other);
+
+  if (a1 == a2 || a2 == XO_UNKNOWN) 
+    {
+      ;
+    }
+  else if (a1 == XO_UNKNOWN) 
+    { 
+      res->expinfo = alinfo_update (res->expinfo, other->expinfo);
+      res->expkind = a2;
+    }
+  else
+    {
+      res->expkind = XO_OBSERVER;
+    }
+}
+
+/*
+** Currently, this is a very ad hoc implementation, with lots of fixes to
+** make real code work okay.  I need to come up with some more general
+** rules or principles here.
+*/
+
+static void 
+  sRef_combineAliasKindsError (/*@notnull@*/ sRef res, 
+			       /*@notnull@*/ sRef other, 
+			       clause cl, fileloc loc)
+{
+  bool hasError = FALSE;
+  alkind ares = sRef_getAliasKind (res);
+  alkind aother = sRef_getAliasKind (other);
+
+  if (alkind_isDependent (ares))
+    {
+      if (aother == AK_KEPT)
+	{
+	  res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+	  res->aliaskind = AK_KEPT;      
+	}
+      else 
+	{
+	  if (aother == AK_LOCAL || aother == AK_STATIC 
+	      || alkind_isTemp (aother))
+	    {
+	      res->aliaskind = AK_DEPENDENT;
+	    }
+	}
+    }
+  else if (alkind_isDependent (aother))
+    {
+      if (ares == AK_KEPT)
+	{
+	  res->aliaskind = AK_KEPT;      
+	}
+      else 
+	{
+	  if (ares == AK_LOCAL || ares == AK_STATIC || alkind_isTemp (ares))
+	    {
+	      res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+	      res->aliaskind = AK_DEPENDENT;
+	    }
+	}
+    }
+  else if ((ares == AK_LOCAL || ares == AK_UNIQUE
+	    || ares == AK_STATIC || alkind_isTemp (ares))
+	   && sRef_isFresh (other))
+    {
+      /*
+      ** cases like: if (s == NULL) s = malloc...;
+      **    don't generate errors
+      */
+      
+      if (usymtab_isAltProbablyDeepNull (res))
+	{
+	  res->aliaskind = ares;
+	}
+      else
+	{
+	  hasError = TRUE; 
+	}
+    }
+  else if ((aother == AK_LOCAL || aother == AK_UNIQUE
+	    || aother == AK_STATIC || alkind_isTemp (aother))
+	   && sRef_isFresh (res))
+    {
+      /*
+      ** cases like: if (s == NULL) s = malloc...;
+      **    don't generate errors
+      */
+      
+      if (usymtab_isProbableDeepNull (other))
+	{
+	  res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+	  res->aliaskind = aother;
+	}
+      else
+	{
+	  hasError = TRUE;
+	}
+    }
+  else if (ares == AK_NEWREF && aother == AK_REFCOUNTED 
+	   && sRef_isConst (other))
+    {
+      res->aliaskind = AK_NEWREF;
+    }
+  else if (aother == AK_NEWREF && ares == AK_REFCOUNTED
+	   && sRef_isConst (res))
+    {
+      res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+      res->aliaskind = AK_NEWREF;
+    }
+  else if (sRef_isLocalVar (res)
+	   && ((ares == AK_KEPT && aother == AK_LOCAL)
+	       || (aother == AK_KEPT && ares == AK_LOCAL)))
+    {
+      res->aliaskind = AK_KEPT;
+    }
+  else
+    {
+      hasError = TRUE;
+    }
+
+  if (hasError)
+    {
+      if (sRef_isThroughArrayFetch (res))
+	{
+	  if (optgenerror2 
+	      (FLG_BRANCHSTATE, FLG_STRICTBRANCHSTATE,
+	       message
+	       ("Clauses exit with %q possibly referencing %s storage %s, "
+		"%s storage %s", 
+		sRef_unparse (res),
+		alkind_unparse (aother),
+		clause_nameTaken (cl),
+		alkind_unparse (ares),
+		clause_nameAlternate (cl)),
+	       loc))
+	    {
+	      sRef_showAliasInfo (res);
+	      sRef_showAliasInfo (other);
+	      res->aliaskind = AK_ERROR;
+	    }
+	  else
+	    {
+	      if (ares == AK_KEPT || aother == AK_KEPT)
+		{
+		  sRef_maybeKill (res, loc);
+		  		}
+	    }
+	}
+      else 
+	{
+	  if (optgenerror 
+	      (FLG_BRANCHSTATE,
+	       message ("Clauses exit with %q referencing %s storage %s, "
+			"%s storage %s", 
+			sRef_unparse (res),
+			alkind_unparse (aother),
+			clause_nameTaken (cl),
+			alkind_unparse (ares),
+			clause_nameAlternate (cl)),
+	       loc))
+	    {
+	      sRef_showAliasInfo (res);
+	      sRef_showAliasInfo (other);
+	      
+	      res->aliaskind = AK_ERROR;
+	    }
+	}
+      
+      res->aliaskind = (sRef_isLocalVar (res) ? AK_LOCAL : AK_UNKNOWN);
+    }
+}
+
+static void 
+  sRef_combineAliasKinds (/*@notnull@*/ sRef res, /*@notnull@*/ sRef other, 
+			  clause cl, fileloc loc)
+{
+  alkind ares = sRef_getAliasKind (res);
+  alkind aother = sRef_getAliasKind (other);
+
+  if (alkind_equal (ares, aother)
+      || aother == AK_UNKNOWN
+      || aother == AK_ERROR)
+    {
+      ; /* keep current state */
+    }
+  else if (sRef_isDead (res) || sRef_isDead (other))
+    {
+      /* dead error reported (or storage is dead) */
+      res ->aliaskind = AK_ERROR; 
+    }
+  else if (ares == AK_UNKNOWN || ares == AK_ERROR
+	   || sRef_isStateUndefined (res))
+    { 
+      res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+      res->aliaskind = aother;  
+    }
+  else if (sRef_isStateUndefined (other))
+    {
+      ;
+    }
+  else if (((ares == AK_UNIQUE || alkind_isTemp (ares))
+	    && aother == AK_LOCAL) 
+	   || ((aother == AK_UNIQUE || alkind_isTemp (aother))
+	       && ares == AK_LOCAL))
+    {
+      if (ares != AK_LOCAL)
+	{
+	  res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+	}
+
+      res->aliaskind = AK_LOCAL;
+    }
+  else if ((ares == AK_OWNED && aother == AK_FRESH) 
+	   || (aother == AK_OWNED && ares == AK_FRESH))
+    {
+      if (ares != AK_FRESH)
+	{
+	  res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+	}
+      
+      res->aliaskind = AK_FRESH;
+    }
+  else if ((ares == AK_KEEP && aother == AK_FRESH) ||
+	   (aother == AK_KEEP && ares == AK_FRESH))
+    {
+      if (ares != AK_KEEP)
+	{
+	  res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+	}
+      
+      res->aliaskind = AK_KEEP;
+    }
+  else if ((ares == AK_LOCAL && aother == AK_STACK) ||
+	   (aother == AK_LOCAL && ares == AK_STACK))
+    {
+      if (ares != AK_STACK)
+	{
+	  res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+	}
+
+      res->aliaskind = AK_STACK;
+    }
+  else if ((ares == AK_LOCAL
+	    && (aother == AK_OWNED && sRef_isLocalVar (other)))
+	   || (aother == AK_LOCAL 
+	       && (ares == AK_OWNED && sRef_isLocalVar (res))))
+    {
+      if (ares != AK_LOCAL)
+	{
+	  res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+	}
+
+      res->aliaskind = AK_LOCAL;
+    }
+  else if ((ares == AK_FRESH && alkind_isOnly (aother))
+	   || (aother == AK_FRESH && alkind_isOnly (ares)))
+    {
+      res->aliaskind = AK_FRESH;
+    }
+  else if ((aother == AK_FRESH && sRef_definitelyNull (res))
+	   || (ares == AK_FRESH && sRef_definitelyNull (other)))
+    {
+      if (ares != AK_FRESH)
+	{
+	  res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+	  res->aliaskind = AK_FRESH;
+	}
+    }
+  else if ((sRef_isFresh (res) && sRef_isConst (other))
+	   || (sRef_isFresh (other) && sRef_isConst (res)))
+    {
+      /*
+      ** for NULL constantants
+      ** this is bogus!
+      */
+
+      if (!sRef_isFresh (res))
+	{
+	  res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+	}
+
+      res->aliaskind = AK_FRESH;
+    }
+  else if ((alkind_isStatic (aother) && sRef_isConst (res))
+	   || (alkind_isStatic (ares) && sRef_isConst (other)))
+    {
+      if (!alkind_isStatic (ares))
+	{
+	  res->aliasinfo = alinfo_update (res->aliasinfo, other->aliasinfo);
+	  res->aliaskind = AK_STATIC;
+	}
+    }
+  else
+    {
+      sRef_combineAliasKindsError (res, other, cl, loc);
+    }
+}
+
+static void sRef_combineDefState (/*@notnull@*/ sRef res, 
+				  /*@notnull@*/ sRef other)
+{
+  sstate s1 = res->defstate;
+  sstate s2 = other->defstate;
+  bool flip = FALSE;
+
+  if (s1 == s2 || s2 == SS_UNKNOWN)
+    {
+      ;
+    }
+  else if (s1 == SS_UNKNOWN)
+    {
+      flip = TRUE;
+    }
+  else
+    {
+      switch (s1)
+	{
+	case SS_FIXED:   
+	  if (s2 == SS_DEFINED) 
+	    {
+	      break;
+	    }
+	  else
+	    {
+	      llcontbuglit ("ssfixed: not implemented");
+	      flip = TRUE;
+	    }
+	  break;
+	case SS_DEFINED: 
+	  flip = TRUE;
+	  break;
+	case SS_PDEFINED:
+	case SS_ALLOCATED: 
+	  flip = (s2 != SS_DEFINED);
+	  break;
+	case SS_HOFFA:
+	case SS_RELDEF:
+	case SS_UNUSEABLE: 
+	case SS_UNDEFINED: 
+	case SS_PARTIAL:
+	case SS_UNDEFGLOB:
+	case SS_KILLED:
+	case SS_DEAD:      
+	case SS_SPECIAL: 
+	  break;
+	BADDEFAULT;
+	}
+    }
+
+  if (flip)
+    {
+      res->definfo = alinfo_update (res->definfo, other->definfo);
+      res->defstate = s2;
+    }
+}
+
+extern /*@notnull@*/ sRef sRef_getConjA (sRef s)
+{
+  sRef ret;
+  llassert (sRef_isConj (s));
+
+  ret = s->info->conj->a;
+  llassert (ret != NULL);
+  return ret;
+}
+
+extern /*@notnull@*/ sRef sRef_getConjB (sRef s)
+{
+  sRef ret;
+  llassert (sRef_isConj (s));
+
+  ret = s->info->conj->b;
+  llassert (ret != NULL);
+  return ret;
+}
+  
+extern /*@exposed@*/ sRef sRef_makeArrow (sRef s, /*@dependent@*/ cstring f)
+{
+  sRef p;
+  sRef ret;
+
+    p = sRef_makePointer (s);
+  ret = sRef_makeField (p, f);
+    return ret;
+}
+
+extern /*@exposed@*/ sRef sRef_buildArrow (sRef s, cstring f)
+{
+  sRef p;
+  sRef ret;
+
+  p = sRef_buildPointer (s);
+  ret = sRef_buildField (p, f);
+  
+  return ret;
+}
+
+static /*@null@*/ sinfo sinfo_copy (/*@notnull@*/ sRef s)
+{
+  sinfo ret;
+
+  switch (s->kind)
+    {
+    case SK_CVAR:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->cvar = (cref) dmalloc (sizeof (*ret->cvar));
+      ret->cvar->lexlevel = s->info->cvar->lexlevel; 
+      ret->cvar->index = s->info->cvar->index; 
+      break;
+
+    case SK_PARAM:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->paramno = s->info->paramno; 
+      break;
+
+    case SK_ARRAYFETCH:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->arrayfetch = (ainfo) dmalloc (sizeof (*ret->arrayfetch));
+      ret->arrayfetch->indknown = s->info->arrayfetch->indknown;
+      ret->arrayfetch->ind = s->info->arrayfetch->ind;
+      ret->arrayfetch->arr = s->info->arrayfetch->arr;
+      break;
+
+    case SK_FIELD:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->field = (fldinfo) dmalloc (sizeof (*ret->field));
+      ret->field->rec = s->info->field->rec;
+      ret->field->field = s->info->field->field; 
+      break;
+
+    case SK_OBJECT:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->object = s->info->object;
+      break;
+
+    case SK_PTR:
+    case SK_ADR:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->ref = s->info->ref;	 
+      break;
+
+    case SK_CONJ:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->conj = (cjinfo) dmalloc (sizeof (*ret->conj));
+      ret->conj->a = s->info->conj->a;
+      ret->conj->b = s->info->conj->b;
+      break;
+    case SK_SPECIAL:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->spec = s->info->spec;
+      break;
+    case SK_UNCONSTRAINED:
+    case SK_NEW:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->fname = s->info->fname;
+      break;
+    case SK_RESULT:
+    case SK_CONST:
+    case SK_TYPE:
+    case SK_UNKNOWN:
+      llassertprint (s->info == NULL, ("s = %s", sRef_unparse (s)));
+      ret = NULL;
+      break;
+    }
+
+  return ret;
+}
+
+static /*@null@*/ sinfo sinfo_fullCopy (/*@notnull@*/ sRef s)
+{
+  sinfo ret;
+
+  /*
+  ** Since its a full copy, only storage is assigned
+  ** to dependent fields.
+  */
+  /*@-onlytrans@*/
+
+  switch (s->kind)
+    {
+    case SK_CVAR:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->cvar = (cref) dmalloc (sizeof (*ret->cvar));
+      ret->cvar->lexlevel = s->info->cvar->lexlevel; 
+      ret->cvar->index = s->info->cvar->index; 
+      break;
+
+    case SK_PARAM:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->paramno = s->info->paramno; 
+      break;
+
+    case SK_ARRAYFETCH:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->arrayfetch = (ainfo) dmalloc (sizeof (*ret->arrayfetch));
+      ret->arrayfetch->indknown = s->info->arrayfetch->indknown;
+      ret->arrayfetch->ind = s->info->arrayfetch->ind;
+      ret->arrayfetch->arr = sRef_saveCopy (s->info->arrayfetch->arr);
+      break;
+
+    case SK_FIELD:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->field = (fldinfo) dmalloc (sizeof (*ret->field));
+      ret->field->rec = sRef_saveCopy (s->info->field->rec);
+      ret->field->field = s->info->field->field; 
+      break;
+
+    case SK_OBJECT:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->object = s->info->object;
+      break;
+
+    case SK_PTR:
+    case SK_ADR:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->ref = sRef_saveCopy (s->info->ref);	 
+      break;
+
+    case SK_CONJ:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->conj = (cjinfo) dmalloc (sizeof (*ret->conj));
+      ret->conj->a = sRef_saveCopy (s->info->conj->a);
+      ret->conj->b = sRef_saveCopy (s->info->conj->b);
+      break;
+    case SK_SPECIAL:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->spec = s->info->spec;
+      break;
+    case SK_NEW:
+    case SK_UNCONSTRAINED:
+      ret = (sinfo) dmalloc (sizeof (*ret));
+      ret->fname = s->info->fname;
+      break;
+    case SK_CONST:
+    case SK_TYPE:
+    case SK_RESULT:
+    case SK_UNKNOWN:
+      llassert (s->info == NULL);
+      ret = NULL;
+      break;
+    }
+  /*@=onlytrans@*/ 
+  return ret;
+}
+
+
+static void 
+  sinfo_update (/*@notnull@*/ /*@exposed@*/ sRef res, 
+		/*@notnull@*/ /*@exposed@*/ sRef other)
+{
+  llassert (res->kind == other->kind);
+
+  switch (res->kind)
+    {
+    case SK_CVAR:
+      res->info->cvar->lexlevel = other->info->cvar->lexlevel; 
+      res->info->cvar->index = other->info->cvar->index; 
+      break;
+
+    case SK_PARAM:
+      res->info->paramno = other->info->paramno; 
+      break;
+
+    case SK_ARRAYFETCH:
+      res->info->arrayfetch->indknown = other->info->arrayfetch->indknown;
+      res->info->arrayfetch->ind = other->info->arrayfetch->ind;
+      res->info->arrayfetch->arr = other->info->arrayfetch->arr;
+      break;
+
+    case SK_FIELD:
+      res->info->field->rec = other->info->field->rec;
+      res->info->field->field = other->info->field->field; 
+      break;
+
+    case SK_OBJECT:
+      res->info->object = other->info->object;
+      break;
+
+    case SK_PTR:
+    case SK_ADR:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+      res->info->ref = other->info->ref;	 
+      break;
+
+    case SK_CONJ:
+      res->info->conj->a = other->info->conj->a;
+      res->info->conj->b = other->info->conj->b;
+      break;
+
+    case SK_SPECIAL:
+      res->info->spec = other->info->spec;
+      break;
+
+    case SK_NEW:
+    case SK_UNCONSTRAINED:
+      res->info->fname = other->info->fname;
+      break;
+
+    case SK_CONST:
+    case SK_TYPE:
+    case SK_UNKNOWN:
+    case SK_RESULT:
+      llassert (res->info == NULL);
+      break;
+    }
+}
+
+static void sinfo_free (/*@special@*/ /*@temp@*/ /*@notnull@*/ sRef s)
+   /*@uses s->kind, s->info@*/
+   /*@releases s->info@*/ 
+{
+  switch (s->kind)
+    {
+    case SK_CVAR:
+      sfree (s->info->cvar);
+      break;
+
+    case SK_PARAM:
+      break;
+
+    case SK_ARRAYFETCH:
+      sfree (s->info->arrayfetch);
+      break;
+
+    case SK_FIELD:
+      sfree (s->info->field); 
+      break;
+
+    case SK_OBJECT:
+      break;
+
+    case SK_PTR:
+    case SK_ADR:
+    case SK_DERIVED:
+    case SK_EXTERNAL:
+      break;
+
+    case SK_CONJ:
+      sfree (s->info->conj);
+      break;
+
+    case SK_UNCONSTRAINED:
+    case SK_SPECIAL:
+    case SK_CONST:
+    case SK_NEW:
+    case SK_TYPE:
+    case SK_UNKNOWN:
+    case SK_RESULT:
+      break;
+    }
+
+  sfree (s->info);
+}
+
+bool sRef_isNSLocalVar (sRef s)  
+{
+  if (sRef_isLocalVar (s))
+    {
+      uentry ue = sRef_getUentry (s);
+
+      return (!uentry_isStatic (ue));
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+bool sRef_isLocalVar (sRef s)  
+{
+  if (sRef_isValid(s))
+    {
+      return (s->kind == SK_CVAR 
+	      && (s->info->cvar->lexlevel > fileScope));
+    }
+  
+  return FALSE;
+}
+
+bool sRef_isRealLocalVar (sRef s)  
+{
+  if (sRef_isValid(s))
+    {
+      if (s->kind == SK_CVAR)
+	{
+	  if (s->info->cvar->lexlevel == functionScope)
+	    {
+	      uentry ue = sRef_getUentry (s);
+
+	      if (uentry_isAnyParam (ue)
+		  || uentry_isRefParam (ue))
+		{
+		  return FALSE;
+		}
+	      else
+		{
+		  return TRUE;
+		}
+	    }
+	  else
+	    {
+	      return (s->info->cvar->lexlevel > functionScope);
+	    }
+	}
+    }
+  
+  return FALSE;
+}
+
+bool sRef_isLocalParamVar (sRef s)  
+{
+  if (sRef_isValid(s))
+    {
+      return (s->kind == SK_PARAM
+	      || (s->kind == SK_CVAR 
+		  && (s->info->cvar->lexlevel > fileScope)));
+    }
+  
+  return FALSE;
+}
+
+static speckind speckind_fromInt (int i)
+{
+  /*@+enumint@*/ 
+  llassert (i >= SR_NOTHING && i <= SR_SYSTEM); 
+  /*@=enumint@*/
+
+  return ((speckind) i);
+}
+
+void sRef_combineNullState (/*@notnull@*/ sRef res, /*@notnull@*/ sRef other)
+{
+  nstate n1 = res->nullstate;
+  nstate n2 = other->nullstate;
+  bool flip = FALSE;
+  nstate nn = n1;
+
+  if (n1 == n2 || n2 == NS_UNKNOWN)
+    {
+      ;
+    }
+  else
+    {
+      /* note: n2 is not unknown or defnull */
+
+      switch (n1)
+	{
+	case NS_ERROR:   nn = NS_ERROR; break;
+	case NS_UNKNOWN: flip = TRUE; nn = n2; break; 
+	case NS_POSNULL: break;
+	case NS_DEFNULL: nn = NS_POSNULL; break;
+	case NS_RELNULL: break;
+	case NS_NOTNULL:  
+	  if (n2 == NS_MNOTNULL)
+	    {
+	      ;
+	    }
+	  else 
+	    { 
+	      flip = TRUE;
+	      nn = NS_POSNULL; 
+	    }
+	  break;
+	case NS_MNOTNULL: 
+	  if (n2 == NS_NOTNULL) 
+	    {
+	      nn = NS_NOTNULL; 
+	    }
+	  else 
+	    {
+	      flip = TRUE;
+	      nn = NS_POSNULL; 
+	    }
+	  break;
+	case NS_CONSTNULL:
+	case NS_ABSNULL:
+	  flip = TRUE;
+	  nn = n2;
+	}
+    }
+  
+  if (flip)
+    {
+      res->nullinfo = alinfo_update (res->nullinfo, other->nullinfo);      
+    }
+
+  res->nullstate = nn;
+}
+
+cstring sRef_nullMessage (sRef s)
+{
+  llassert (sRef_isValid (s));
+
+  switch (s->nullstate)
+    {
+    case NS_DEFNULL:
+    case NS_CONSTNULL:
+      return (cstring_makeLiteralTemp ("null"));
+    default:
+      return (cstring_makeLiteralTemp ("possibly null"));
+    }
+  BADEXIT;
+}
+
+sRef sRef_fixResultType (/*@returned@*/ sRef s, ctype typ, uentry ue)
+{
+  sRef tmp = sRef_undefined;
+  sRef ret;
+
+  llassert (sRef_isValid (s));
+
+  switch (s->kind)
+    {
+    case SK_RESULT:
+      s->type = typ;
+      ret = s;
+      break;
+    case SK_ARRAYFETCH:
+      {
+	ctype ct;
+	tmp = sRef_fixResultType (s->info->arrayfetch->arr, typ, ue);
+
+	ct = ctype_realType (sRef_getType (tmp));
+
+	
+	if (ctype_isKnown (ct))
+	  {
+	    if (ctype_isAP (ct))
+	      {
+		;
+	      }
+	    else
+	      {
+		voptgenerror 
+		  (FLG_TYPE,
+		   message
+		   ("Special clause indexes non-array (%t): *%q",
+		    ct, sRef_unparse (s->info->arrayfetch->arr)),
+		   uentry_whereLast (ue));
+	      }
+	  }
+
+	tmp = sRef_fixResultType (s->info->arrayfetch->arr, typ, ue);
+
+	if (s->info->arrayfetch->indknown)
+	  {
+	    ret = sRef_makeArrayFetchKnown (tmp, s->info->arrayfetch->ind);
+	  }
+	else
+	  {
+	    ret = sRef_makeArrayFetch (tmp);
+	  }
+      }
+      break;
+    case SK_FIELD:
+      {
+	sRef rec = sRef_fixResultType (s->info->field->rec, typ, ue);
+	ctype ct = ctype_realType (sRef_getType (rec));
+
+	if (ctype_isKnown (ct))
+	  {
+	    if (ctype_isSU (ct))
+	      {
+		if (uentry_isValid (uentryList_lookupField (ctype_getFields (ct), 
+							    s->info->field->field)))
+		  {
+		    ;
+		  }
+		else
+		  {
+		    voptgenerror 
+		      (FLG_TYPE,
+		       message
+		       ("Special clause accesses non-existent field of result: %q.%s",
+			sRef_unparse (rec), s->info->field->field),
+		       uentry_whereLast (ue));
+		  }
+	      }
+	    else
+	      {
+		voptgenerror 
+		  (FLG_TYPE,
+		   message
+		   ("Special clause accesses field of non-struct or union result (%t): %q.%s",
+		    ct, sRef_unparse (rec), s->info->field->field),
+		   uentry_whereLast (ue));
+	      }
+	  }
+	
+	ret = sRef_makeField (tmp, s->info->field->field);
+	break;
+      }
+    case SK_PTR:
+      {
+	ctype ct;
+	tmp = sRef_fixResultType (s->info->ref, typ, ue);
+
+	ct = ctype_realType (sRef_getType (tmp));
+
+	if (ctype_isKnown (ct))
+	  {
+	    if (ctype_isAP (ct))
+	      {
+		;
+	      }
+	    else
+	      {
+		voptgenerror 
+		  (FLG_TYPE,
+		   message
+		   ("Special clause dereferences non-pointer (%t): *%q",
+		    ct, sRef_unparse (s->info->ref)),
+		   uentry_whereLast (ue));
+	      }
+	  }
+	
+	ret = sRef_makePointer (tmp);
+	break;
+      }
+    case SK_ADR:
+      voptgenerror 
+	(FLG_TYPE,
+	 message
+	 ("Special clause uses & operator (not allowed): &%q", sRef_unparse (s->info->ref)),
+	 uentry_whereLast (ue));
+      ret = s;
+      break;
+    BADDEFAULT;
+    }
+
+  return ret;
+}
+
+bool sRef_isOnly (sRef s)
+{
+  return (sRef_isValid(s) && alkind_isOnly (s->aliaskind));
+}
+
+bool sRef_isDependent (sRef s) 
+{
+  return (sRef_isValid(s) && alkind_isDependent (s->aliaskind));
+}
+
+bool sRef_isOwned (sRef s)
+{
+  return (sRef_isValid (s) && (s->aliaskind == AK_OWNED));
+}
+
+bool sRef_isKeep (sRef s) 
+{
+  return (sRef_isValid (s) && (s->aliaskind == AK_KEEP));
+}
+
+bool sRef_isTemp (sRef s)
+{
+  return (sRef_isValid (s) && alkind_isTemp (s->aliaskind));
+}
+
+bool sRef_isLocalState (sRef s) 
+{
+  return (sRef_isValid (s) && (s->aliaskind == AK_LOCAL));
+}
+
+bool sRef_isUnique (sRef s)
+{
+  return (sRef_isValid (s) && (s->aliaskind == AK_UNIQUE));
+}
+
+bool sRef_isShared (sRef s) 
+{
+  return (sRef_isValid (s) && (s->aliaskind == AK_SHARED));
+}
+
+bool sRef_isExposed (sRef s) 
+{
+  return (sRef_isValid (s) && (s->expkind == XO_EXPOSED));
+}
+
+bool sRef_isObserver (sRef s) 
+{
+  return (sRef_isValid (s) && (s->expkind == XO_OBSERVER));
+}
+
+bool sRef_isFresh (sRef s) 
+{
+  return (sRef_isValid (s) && (s->aliaskind == AK_FRESH));
+}
+
+bool sRef_isDefinitelyNull (sRef s) 
+{
+  return (sRef_isValid (s) && (s->nullstate == NS_DEFNULL 
+			       || s->nullstate == NS_CONSTNULL));
+}
+
+bool sRef_isAllocated (sRef s)
+{
+  return (sRef_isValid (s) && (s->defstate == SS_ALLOCATED));
+}
+
+bool sRef_isStack (sRef s)
+{
+  return (sRef_isValid (s) && (s->aliaskind == AK_STACK));
+}
+
+extern bool sRef_isNotNull (sRef s)
+{
+  return (sRef_isValid(s) && (s->nullstate == NS_MNOTNULL 
+			      || s->nullstate == NS_NOTNULL));
+}
+
+
+
+
+
+
diff --git a/src/sRefSet.c b/src/sRefSet.c
new file mode 100644
index 0000000..2bc16c9
--- /dev/null
+++ b/src/sRefSet.c
@@ -0,0 +1,998 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** sRefSet.c
+**
+** based on set_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+sRefSet
+sRefSet_new ()
+{
+  return sRefSet_undefined;
+}
+
+static /*@notnull@*/ /*@only@*/ sRefSet
+sRefSet_newEmpty (void)
+{
+  sRefSet s = (sRefSet) dmalloc (sizeof (*s));
+  
+  s->entries = 0;
+  s->nspace = sRefSetBASESIZE;
+  s->elements = (sRef *) dmalloc (sizeof (*s->elements) * sRefSetBASESIZE);
+
+  return (s);
+}
+
+/*@only@*/ sRefSet
+sRefSet_single (/*@exposed@*/ sRef sr)
+{
+  sRefSet s = (sRefSet) dmalloc (sizeof (*s));
+  
+  s->entries = 1;
+  s->nspace = sRefSetBASESIZE - 1;
+  s->elements = (sRef *) dmalloc (sizeof (*s->elements) * sRefSetBASESIZE);
+  s->elements[0] = sr;
+
+    return (s);
+}
+
+static void
+sRefSet_grow (/*@notnull@*/ sRefSet s)
+{
+  int i;
+  sRef *newelements; 
+
+  s->nspace = sRefSetBASESIZE;
+  newelements = (sRef *) dmalloc (sizeof (*newelements) * (s->entries + s->nspace));
+
+  for (i = 0; i < s->entries; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+sRefSet
+sRefSet_insert (sRefSet s, /*@exposed@*/ sRef el)
+{
+  if (sRefSet_isUndefined (s))
+    {
+      s = sRefSet_newEmpty ();
+    }
+
+  
+  if (!sRefSet_isSameMember (s, el))
+    {
+      
+      if (s->nspace <= 0)
+	sRefSet_grow (s);
+
+      s->nspace--;
+
+      llassert (s->elements != NULL);
+      s->elements[s->entries] = el;
+
+            s->entries++;
+    }
+  else
+    {
+          }
+
+  return s;
+}
+
+void
+sRefSet_clear (sRefSet s)
+{
+  if (sRefSet_isDefined (s))
+    {
+      s->nspace += s->entries;
+      s->entries = 0;
+    }
+}
+
+/*
+** slow algorithm...but it doesn't matter
+*/
+
+void
+sRefSet_clearStatics (sRefSet s)
+{
+  if (sRefSet_isDefined (s))
+    {
+      int i;
+
+      for (i = 0; i < s->entries; i++)
+	{
+	  sRef current = s->elements[i];
+	  
+	  if (sRef_isFileStatic (sRef_getRootBase (current)))
+	    {
+	      int j;
+	      
+	      for (j = i; j < s->entries - 1; j++)
+		{
+		  s->elements[j] = s->elements[j+1];
+		}
+	      
+	      s->entries--;
+	      s->nspace++;
+	      i--;
+	    }
+	}
+    }
+}
+
+bool
+sRefSet_delete (sRefSet s, sRef el)
+{
+  int i;
+
+  if (sRefSet_isUndefined (s)) return FALSE;
+
+  if (s->elements != NULL)
+    {
+      for (i = 0; i < s->entries; i++)
+	{
+	  sRef current = s->elements[i];
+	  
+	  if (sRef_realSame (el, current))
+	    {
+	      int j;
+
+	      for (j = i; j < s->entries - 1; j++)
+		{
+		  s->elements[j] = s->elements[j+1];
+		}
+	      
+	      s->entries--;
+	      s->nspace++;
+	      return TRUE;
+	    }
+	}
+    }
+
+  return FALSE;
+}
+
+/*@exposed@*/ sRef
+sRefSet_choose (sRefSet s)
+{
+  llassert (sRefSet_isDefined (s));
+  llassert (s->entries > 0);
+  llassert (s->elements != NULL);
+
+  return (s->elements[0]);
+}
+
+sRef
+sRefSet_mergeIntoOne (sRefSet s)
+{
+  sRef res;
+  int i;
+
+  if (sRefSet_isUndefined (s)) return sRef_undefined;
+  if (s->entries == 0) return sRef_undefined;
+
+  llassert (s->elements != NULL);
+
+  res = s->elements[0];
+
+  for (i = 1; i < s->entries; i++)
+    {
+      sRef tmp;
+
+            tmp = sRef_makeConj (res, s->elements[i]);
+            res = tmp;
+    }
+
+  return res;
+}
+
+/*
+** this is really yucky...but it works...
+*/
+
+bool
+sRefSet_deleteBase (sRefSet s, sRef base)
+{
+  int i = 0;
+  int offset = 0;
+
+  if (sRefSet_isUndefined (s) || (s->elements == NULL))
+    {
+      return FALSE;
+    } ;
+
+  while (i + offset < s->entries)
+    {
+      sRef current = s->elements[i + offset];
+
+      while (sRef_includedBy (current, base))
+	{
+	  	  offset++;
+	  if (i + offset >= s->entries) goto doneLoop;
+	  current = s->elements [i + offset];
+	}
+      
+      if (offset > 0)
+	{
+	  	  s->elements [i] = current;
+	}
+      
+      i++;
+    }
+
+ doneLoop:
+  s->entries -= offset;
+  s->nspace += offset;
+
+  return (offset > 0);
+}
+
+/*
+** modifies *s1
+*/
+
+sRefSet
+sRefSet_unionFree (/*@returned@*/ sRefSet s1, sRefSet s2)
+{
+  sRefSet res = sRefSet_union (s1, s2);
+
+  sRefSet_free (s2);
+  return res;
+}
+
+sRefSet
+sRefSet_union (/*@returned@*/ sRefSet s1, sRefSet s2)
+{
+  if (s1 == s2) 
+    {
+      return s1;
+    }
+
+  if (sRefSet_isEmpty (s1))
+    {
+      s1 = sRefSet_copy (s1, s2);
+    }
+  else
+    {
+      sRefSet_allElements (s2, el)
+	{
+	  s1 = sRefSet_insert (s1, el);
+	} end_sRefSet_allElements;
+    }
+
+  return s1;
+}
+
+/*
+** s1 <- s1 U (s2 - ex - params)
+*/
+
+sRefSet
+sRefSet_unionExcept (/*@returned@*/ sRefSet s1, sRefSet s2, sRef ex)
+{
+  if (s1 == s2) return s1;
+
+  sRefSet_allElements (s2, el)
+    {
+      if (sRef_same (el, ex))
+	{
+	  	}
+      else
+	{
+	  s1 = sRefSet_insert (s1, el);
+	}
+    } end_sRefSet_allElements;
+  
+  return s1;
+}
+
+/*@only@*/ sRefSet
+sRefSet_realNewUnion (sRefSet s1, sRefSet s2)
+{
+  llassert (NOALIAS (s1, s2));
+
+  if (sRefSet_isUndefined (s1))
+    {
+      return (sRefSet_newCopy (s2));
+    }
+  else
+    {
+      sRefSet ret = sRefSet_newCopy (s1);
+      
+      sRefSet_allElements (s2, el)
+	{
+	  ret = sRefSet_insert (ret, el);
+	} end_sRefSet_allElements;
+      
+      return ret;
+    }
+}
+
+/* slow! */
+
+/*@only@*/ sRefSet
+sRefSet_intersect (sRefSet s1, sRefSet s2)
+{
+  sRefSet s = sRefSet_new ();
+
+  llassert (NOALIAS (s1, s2));
+
+  sRefSet_allElements (s1, el)
+    {
+      if (sRefSet_member (s2, el))
+	{
+	  s = sRefSet_insert (s, el);
+	}
+    } end_sRefSet_allElements;
+  
+    return s;
+}
+
+sRefSet
+sRefSet_levelUnion (/*@returned@*/ sRefSet sr, sRefSet s, int lexlevel)
+{
+  llassert (NOALIAS (sr, s));
+
+  sRefSet_allElements (s, el)
+    {
+      if (sRef_lexLevel (el) <= lexlevel)
+	{
+	  sr = sRefSet_insert (sr, el);
+	}
+    } end_sRefSet_allElements;
+
+  return sr;
+}
+
+void
+sRefSet_levelPrune (sRefSet s, int lexlevel)
+{
+  if (sRefSet_isDefined (s))
+    {
+      int i;
+      int backcount = sRefSet_size (s) - 1;
+      
+      for (i = 0; i <= backcount; i++)
+	{
+	  sRef el = s->elements[i]; 
+	  
+	  if (sRef_lexLevel (el) > lexlevel)
+	    {
+	      int j;
+	      
+	      
+	      for (j = backcount; j > i; j--)
+		{
+		  backcount--;
+		  s->entries--;
+		  s->nspace++;
+		  
+		  if (sRef_lexLevel (s->elements[j]) <= lexlevel)
+		    {
+		      s->elements[i] = s->elements[j];
+		      
+		      if (backcount == i) s->entries++;
+		      /*@innerbreak@*/ break;
+		    }
+		}
+
+	      if (backcount == i)
+		{
+		  s->entries--;
+		}
+	    }
+	}
+    }
+}
+
+/*
+** s1 <- s2
+*/
+
+sRefSet
+  sRefSet_copy (/*@returned@*/ sRefSet s1, /*@exposed@*/ sRefSet s2)
+{
+  int origentries;
+  
+  llassert (NOALIAS (s1, s2));
+  
+  if (sRefSet_isUndefined (s1))
+    {
+      if (sRefSet_isEmpty (s2))
+	{
+	  return s1;
+	}
+      else
+	{
+	  s1 = sRefSet_newEmpty ();
+	}
+    } 
+
+  origentries = s1->entries;
+
+  s1->nspace = s1->entries + s1->nspace;
+  s1->entries = 0;
+
+  sRefSet_allElements (s2, el)
+    {
+      if (s1->nspace == 0)
+	{
+	  sRefSet_grow (s1);
+	}
+
+      s1->elements[s1->entries] = el; 
+      s1->nspace--;
+      s1->entries++;
+    } end_sRefSet_allElements;
+
+  return s1;
+}
+
+/*@only@*/ sRefSet
+  sRefSet_newCopy (/*@exposed@*/ sRefSet s)
+{
+  if (sRefSet_isEmpty (s))
+    {
+      return sRefSet_undefined;
+    }
+  else
+    {
+      sRefSet r = (sRefSet) dmalloc (sizeof (*r));
+      int i;
+      
+      r->entries = s->entries;
+      r->nspace = s->nspace;
+      r->elements = (sRef *) dmalloc (sizeof (*r->elements) * (s->entries + s->nspace));
+      
+      for (i = 0; i < s->entries; i++)
+	{
+	  r->elements[i] = s->elements[i]; 
+	}  
+      
+      return r;
+    }
+}
+
+/*@only@*/ sRefSet
+sRefSet_levelCopy (/*@exposed@*/ sRefSet s, int lexlevel)
+{
+  if (sRefSet_isEmpty (s))
+    {
+      return sRefSet_undefined;
+    }
+  else
+    {
+      sRefSet r = (sRefSet) dmalloc (sizeof (*r));
+      int i;
+      
+      r->nspace = s->entries;
+      r->entries = 0;
+      r->elements = (sRef *) dmalloc (sizeof (*r->elements) * (s->entries)); 
+
+      for (i = 0; i < s->entries; i++)
+	{
+	  if (sRef_lexLevel (s->elements[i]) <= lexlevel)
+	    {
+	      r->elements[r->entries] = s->elements[i];
+	      r->entries++;
+	      r->nspace--;
+	    }
+	}  
+      
+      return r;
+    }
+}
+
+/*@only@*/ sRefSet
+sRefSet_newDeepCopy (sRefSet s)
+{
+  if (sRefSet_isUndefined (s))
+    {
+      return sRefSet_newEmpty ();
+    }
+  else
+    {
+      sRefSet r = (sRefSet) dmalloc (sizeof (*r));
+      int i;
+      
+      r->entries = s->entries;
+      r->nspace = s->nspace;
+      r->elements = (sRef *) dmalloc (sizeof (*r->elements) * (s->entries + s->nspace));
+      
+      for (i = 0; i < s->entries; i++)
+	{
+	  r->elements[i] = sRef_copy (s->elements[i]);
+	}  
+      
+      return r;
+    }
+}
+
+static bool
+sRefSet_isElementCompare (bool (*test)(sRef, sRef), sRefSet s, sRef el)
+{
+  sRefSet_allElements (s, e)
+    {
+      if ((test)(el, e))
+	{
+	  return TRUE;
+	}
+    } end_sRefSet_allElements;
+
+  return FALSE;
+}
+
+static bool
+sRefSet_isElementTest (bool (*test)(sRef), sRefSet s)
+{
+  sRefSet_allElements (s, e)
+    {
+      if ((test)(e))
+	{
+	  return TRUE;
+	}
+    } end_sRefSet_allElements;
+
+  return FALSE;
+}
+
+bool
+sRefSet_hasRealElement (sRefSet s)
+{
+  sRefSet_allElements (s, e)
+    {
+      if (sRef_isMeaningful (e) && !sRef_isUnconstrained (e))
+	{
+	  return TRUE;
+	}
+    } end_sRefSet_allElements;
+
+  return FALSE;
+}
+
+bool
+sRefSet_isSameMember (sRefSet s, sRef el)
+{
+  return (sRefSet_isElementCompare (sRef_realSame, s, el));
+}
+
+bool
+sRefSet_isSameNameMember (sRefSet s, sRef el)
+{
+  return (sRefSet_isElementCompare (sRef_sameName, s, el));
+}
+
+bool
+sRefSet_member (sRefSet s, sRef el)
+{
+  return (sRefSet_isElementCompare (sRef_similar, s, el));
+}
+
+bool
+sRefSet_hasStatic (sRefSet s)
+{
+  return (sRefSet_isElementTest (sRef_isFileStatic, s));
+}
+
+bool
+sRefSet_hasUnconstrained (sRefSet s)
+{
+  return (sRefSet_isElementTest (sRef_isUnconstrained, s));
+}
+
+cstring
+  sRefSet_unparseUnconstrained (sRefSet s)
+{
+  int num = 0;
+  cstring res = cstring_undefined;
+  
+  sRefSet_allElements (s, el)
+    {
+      if (sRef_isUnconstrained (el))
+	{
+	  if (cstring_isUndefined (res))
+	    {
+	      res = cstring_copy (sRef_unconstrainedName (el));
+	    }
+	  else
+	    {
+	      res = message ("%q, %s", res, sRef_unconstrainedName (el));
+	    }
+	  
+	  num++;
+	}
+    } end_sRefSet_allElements ;
+  
+  if (num == 0)
+    {
+      llassert (cstring_isUndefined (res));
+      return (cstring_makeLiteral (""));
+    }
+  else if (num == 1)
+    {
+      return (message ("unconstrained function %q", res));
+    }
+  else
+    {
+      return (message ("unconstrained functions %q", res));
+    }
+}
+
+cstring
+sRefSet_unparseUnconstrainedPlain (sRefSet s)
+{
+  cstring res = cstring_undefined;
+
+  sRefSet_allElements (s, el)
+    {
+      if (sRef_isUnconstrained (el))
+	{
+	  if (cstring_isUndefined (res))
+	    {
+	      res = cstring_copy (sRef_unconstrainedName (el));
+	    }
+	  else
+	    {
+	      res = message ("%q, %s", res, sRef_unconstrainedName (el));
+	    }
+	}
+    } end_sRefSet_allElements ;
+
+  return res;
+}
+      
+bool
+sRefSet_modifyMember (sRefSet s, sRef m)
+{
+  bool ret = FALSE;
+
+  sRefSet_allElements (s, e)
+    {
+      if (sRef_similar (m, e))
+	{
+	  sRef_setModified (e);
+	  ret = TRUE;
+	}
+    } end_sRefSet_allElements;
+
+  
+  return ret;
+}
+
+/*@exposed@*/ sRef
+sRefSet_lookupMember (sRefSet s, sRef el)
+{
+  sRefSet_allElements (s, e)
+    {
+      if (sRef_similar (el, e))
+	{
+	  return e;
+	}
+    } end_sRefSet_allElements;
+  
+  return sRef_undefined;
+}
+
+int sRefSet_size (sRefSet s)
+{
+  if (sRefSet_isUndefined (s)) return 0;
+  return s->entries;
+}
+
+/*@only@*/ cstring
+sRefSet_unparse (sRefSet s)
+{
+  int i;
+  cstring st = cstring_makeLiteral ("{");
+
+  if (sRefSet_isDefined (s))
+    {
+      for (i = 0; i < sRefSet_size (s); i++)
+	{
+	  if (i == 0)
+	    st = message ("%q %q", st, sRef_unparse (s->elements[i]));
+	  else
+	    st = message ("%q, %q", st, sRef_unparse (s->elements[i]));
+	}
+    }
+  
+  st = message ("%q }", st);
+  return st;
+}
+
+cstring sRefSet_unparsePlain (sRefSet s)
+{
+  int i;
+  cstring st = cstring_undefined;
+
+  if (sRefSet_isDefined (s))
+    {
+      for (i = 0; i < sRefSet_size (s); i++)
+	{
+	  if (i == 0)
+	    st = sRef_unparse (s->elements[i]);
+	  else
+	    st = message ("%q, %q", st, sRef_unparse (s->elements[i]));
+	}
+    }
+  
+  return st;
+}
+
+cstring
+sRefSet_unparseDebug (sRefSet s)
+{
+  int i;
+  cstring st = cstring_makeLiteral ("{");
+
+  if (sRefSet_isDefined (s))
+    {
+      for (i = 0; i < sRefSet_size (s); i++)
+	{
+	  if (i == 0)
+	    {
+	      st = message ("%q %q", st, sRef_unparseDebug (s->elements[i]));
+	    }
+	  else
+	    {
+	      st = message ("%q, %q", st, sRef_unparseDebug (s->elements[i]));
+	    }
+	}
+    }
+  
+  st = message ("%q }", st);
+  return st;
+}
+
+void
+sRefSet_fixSrefs (sRefSet s)
+{
+  if (sRefSet_isDefined (s))
+    {
+      int i;
+      
+      for (i = 0; i < sRefSet_size (s); i++)
+	{
+	  sRef current = s->elements[i];
+
+	  if (sRef_isLocalVar (current))
+	    {
+	      s->elements[i] = uentry_getSref (sRef_getUentry (current));
+	      	    }
+	}
+    }
+}
+
+void
+sRefSet_free (/*@only@*/ sRefSet s)
+{
+  if (!sRefSet_isUndefined (s))
+    {
+      llassertprint (s->entries < 1000, ("sRefSet free size: %d", s->entries));
+
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
+
+sRefSet sRefSet_removeIndirection (sRefSet s)
+{
+  /*
+  ** returns a NEW sRefSet containing references to all sRef's in s
+  */
+
+  sRefSet t = sRefSet_new ();
+  
+  
+  sRefSet_allElements (s, el)
+    {
+      if (!sRef_isAddress (el))
+	{
+	  t = sRefSet_insert (t, sRef_makeAddress (el));
+	}
+    } end_sRefSet_allElements;
+
+  return t;
+}
+
+sRefSet sRefSet_addIndirection (sRefSet s)
+{
+  /*
+  ** returns a NEW sRefSet containing references to all sRef's in s
+  */
+
+  sRefSet t = sRefSet_new ();
+  
+  
+  sRefSet_allElements (s, el)
+    {
+      ctype ct = ctype_realType (sRef_getType (el));
+
+      
+      if ((ctype_isArrayPtr (ct)))
+	{
+	  
+	  sRef a = sRef_constructPointer (el);
+
+	  t = sRefSet_insert (t, a);   
+	}
+    } end_sRefSet_allElements;
+
+    return t;
+}
+
+sRefSet sRefSet_accessField (sRefSet s, /*@observer@*/ cstring f)
+{
+  /*
+  ** returns a NEW sRefSet containing references to all sRef's in s
+  */
+
+  sRefSet t = sRefSet_new ();
+
+  
+  sRefSet_allElements (s, el)
+    {
+      ctype ct = ctype_realType (sRef_getType (el));
+
+      if ((ctype_isStruct (ct) || ctype_isUnion (ct))
+	  && (!uentry_isUndefined (uentryList_lookupField (ctype_getFields (ct), f))))
+	{
+	  t = sRefSet_insert (t, sRef_makeNCField (el, f));
+	}
+    } end_sRefSet_allElements;
+  
+    return t;
+}
+
+sRefSet sRefSet_fetchUnknown (sRefSet s)
+{
+  sRefSet t = sRefSet_new ();
+  
+  sRefSet_allElements (s, el)
+    {
+      ctype ct = ctype_realType (sRef_getType (el));
+      
+      if (ctype_isArrayPtr (ct))
+	{
+	  t = sRefSet_insert (t, sRef_makeArrayFetch (el));
+	}
+    } end_sRefSet_allElements;
+
+  return t;
+}
+
+sRefSet sRefSet_fetchKnown (sRefSet s, int i)
+{
+  sRefSet t = sRefSet_new ();
+  
+  sRefSet_allElements (s, el)
+    {
+      ctype ct = ctype_realType (sRef_getType (el));
+      
+      if (ctype_isArrayPtr (ct))
+	{
+	  t = sRefSet_insert (t, sRef_makeArrayFetchKnown (el, i));
+	}
+    } end_sRefSet_allElements;
+
+  return t;
+}
+
+int sRefSet_compare (sRefSet s1, sRefSet s2)
+{
+  sRefSet_allElements (s1, el)
+    {
+      if (!sRefSet_isSameMember (s2, el))
+	{
+	  return -1;
+	}
+    } end_sRefSet_allElements;
+
+  sRefSet_allElements (s2, el)
+    {
+      if (!sRefSet_isSameMember (s1, el))
+	{
+	  return 1;
+	}
+    } end_sRefSet_allElements;
+
+  return 0;
+}
+
+bool sRefSet_equal (sRefSet s1, sRefSet s2)
+{
+  sRefSet_allElements (s1, el)
+    {
+      if (!sRefSet_isSameMember (s2, el))
+	{
+	  return FALSE;
+	}
+    } end_sRefSet_allElements;
+
+  sRefSet_allElements (s2, el)
+    {
+      if (!sRefSet_isSameMember (s1, el))
+	{
+	  return FALSE;
+	}
+    } end_sRefSet_allElements;
+
+  return TRUE;
+}
+
+/*@only@*/ sRefSet
+sRefSet_undump (char **s)
+{
+  char c;
+  sRefSet sl = sRefSet_new ();
+
+  while ((c = **s) != '#' && c != '@' && c != '$' && c != '&')
+    {
+      sl = sRefSet_insert (sl, sRef_undump (s));
+
+      
+      if (**s == ',')
+	{
+	  (*s)++;
+	}
+    }
+
+    return sl;
+}
+
+/*@only@*/ cstring
+sRefSet_dump (sRefSet sl)
+{
+  cstring st = cstring_undefined;
+  bool first = TRUE;
+
+  
+  sRefSet_allElements (sl, el)
+    {
+      if (!first)
+	{
+	  st = cstring_appendChar (st, ',');
+	}
+      else
+	{
+	  first = FALSE;
+	}
+
+      st = cstring_concatFree (st, sRef_dump (el));
+    } end_sRefSet_allElements;
+
+  return st;
+}
+
diff --git a/src/sRefSetList.c b/src/sRefSetList.c
new file mode 100644
index 0000000..536b879
--- /dev/null
+++ b/src/sRefSetList.c
@@ -0,0 +1,104 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** sRefSetList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+static /*@notnull@*/ /*@only@*/ sRefSetList
+sRefSetList_newEmpty (void)
+{
+  sRefSetList s = (sRefSetList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = sRefSetListBASESIZE; 
+  s->elements = (sRefSet *) dmalloc (sizeof (*s->elements) * sRefSetListBASESIZE);
+
+  return (s);
+}
+
+static void
+sRefSetList_grow (/*@notnull@*/ sRefSetList s)
+{
+  int i;
+  sRefSet *newelements;
+  
+  s->nspace += sRefSetListBASESIZE; 
+
+  newelements = (sRefSet *) dmalloc (sizeof (*newelements) 
+				     * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+  
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+sRefSetList sRefSetList_add (sRefSetList s, /*@dependent@*/ sRefSet el)
+{
+  if (sRefSetList_isUndefined (s))
+    {
+      s = sRefSetList_newEmpty ();
+    }
+
+  if (s->nspace <= 0)
+    {
+      sRefSetList_grow (s);
+    }
+  
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+void
+sRefSetList_clear (sRefSetList s)
+{
+  if (sRefSetList_isDefined (s))
+    {
+      s->nspace += s->nelements;
+      s->nelements = 0;
+    }
+}
+
+void
+sRefSetList_free (sRefSetList s)
+{
+  if (sRefSetList_isDefined (s))
+    {
+      sfree (s->elements);
+      sfree (s);
+    }
+}
diff --git a/src/sRefTable.c b/src/sRefTable.c
new file mode 100644
index 0000000..fd36290
--- /dev/null
+++ b/src/sRefTable.c
@@ -0,0 +1,147 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** sRefTable.c
+**
+** based on table_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "sRefTable.h"
+
+static /*@notnull@*/ /*@only@*/ sRefTable
+sRefTable_new (void)
+{
+  sRefTable s = (sRefTable) dmalloc (sizeof (*s));
+
+  s->entries = 0;
+  s->nspace = sRefTableBASESIZE;
+  s->elements = (sRef *) dmalloc (sizeof (*s->elements) * sRefTableBASESIZE);
+
+  return (s);
+}
+
+static void
+sRefTable_grow (/*@notnull@*/ sRefTable s)
+{
+  int i;
+  sRef *newelements; 
+
+  s->nspace = sRefTableBASESIZE;
+  newelements = (sRef *) dmalloc (sizeof (*newelements) * (s->entries + s->nspace));
+
+  for (i = 0; i < s->entries; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+sRefTable
+sRefTable_add (sRefTable s, /*@owned@*/ sRef el)
+{
+  if (sRefTable_isNull (s))
+    {
+      s = sRefTable_new ();
+    }
+
+  if (s->nspace <= 0)
+    {
+      sRefTable_grow (s);
+    }
+
+  s->nspace--;
+  
+  llassert (s->elements != NULL);
+  s->elements[s->entries] = el;
+  
+  s->entries++;
+
+  return s;
+}
+
+void
+sRefTable_clear (sRefTable s)
+{
+  if (sRefTable_isDefined (s))
+    {
+      int i;
+      
+      for (i = 0; i < s->entries; i++)
+	{
+	  	  sRef_free (s->elements[i]); 
+	}
+
+      s->nspace += s->entries;
+      s->entries = 0;
+    }
+}
+
+static int sRefTable_size (sRefTable s)
+{
+  if (sRefTable_isNull (s)) return 0;
+  return s->entries;
+}
+
+/*@only@*/ cstring
+sRefTable_unparse (sRefTable s)
+{
+  int i;
+  cstring st = cstring_undefined;
+
+  if (sRefTable_isDefined (s))
+    {
+      for (i = 0; i < sRefTable_size (s); i++)
+	{
+	  if (i == 0)
+	    st = message ("%4d. %q\n", i, sRef_unparse (s->elements[i]));
+	  else
+	    st = message ("%q%4d. %q\n", st, i, sRef_unparse (s->elements[i]));
+	}
+    }
+  return st;
+}
+
+void
+sRefTable_free (/*@only@*/ sRefTable s)
+{
+  if (sRefTable_isDefined (s))
+    {
+      int i;
+
+      for (i = 0; i < s->entries; i++)
+	{
+	  sRef_free (s->elements[i]);
+	}
+
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
+
diff --git a/src/scan.c b/src/scan.c
new file mode 100644
index 0000000..05fce97
--- /dev/null
+++ b/src/scan.c
@@ -0,0 +1,168 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** scan.c
+**
+** Deliver tokens one at a time
+**
+**	METHOD:
+**	The input arrives via LSLScanFreshToken ().
+**	The output is reported via LSLScanNextToken ().
+**
+**	The tokens are built in module ScanLine.
+**	The tokens are delivered from this module.
+**	Meantimes, they are saved in a static array.
+**
+**	The tokenizing is split off from the delivery of tokens
+**	to facilitate incremental scanning at a later date.
+**	The essential is that scanline () can be called or not
+**	if the input text is dirty or not.  Clean lines cause
+**	tokens to be played out from the saved token list (not
+**	yet implemented in this version).
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "signature.h"
+# include "signature2.h"
+# include "scan.h"
+# include "scanline.h"
+
+extern /*@external@*/ /*@unused@*/ YYSTYPE lsllval;
+
+static /*@exposed@*/ ltoken LSLScanLookAhead (void);
+static tsource *scanFile;	  /* file to scan */
+static o_ltoken TokenList[MAXLINE]; /* available tokens */
+static int nextToken;		  /* next available token */
+static int lastToken;		  /* next available slot */
+
+static /*@dependent@*/ /*@null@*/ char *line;	/* input text */
+static unsigned int lineNumber;	/* current line number */
+
+unsigned int lsllex (YYSTYPE *lval)
+{
+  /* This is important!  Bison expects this */
+  lval->ltok = LSLScanNextToken ();
+  return (ltoken_getCode (lval->ltok));
+}
+
+ltoken LSLScanNextToken (void)
+{
+  
+  if (nextToken < lastToken)
+    {	
+      /*@-retalias@*/
+            return TokenList[nextToken++];
+      /*@=retalias@*/
+    }
+  else
+    {
+      lastToken = 0;		
+      lineNumber++;
+
+      line = tsource_nextLine (scanFile);       
+      
+      if (line != (char *) 0)
+	{
+	  	  lscanLine (line);	/* tokenize */
+	  nextToken = 0;
+	  return LSLScanNextToken ();	
+	}
+      else
+	{
+	  	  return LSLScanEofToken ();
+	}
+    }
+}
+
+static /*@exposed@*/ ltoken
+LSLScanLookAhead (void)
+{
+  if (nextToken < lastToken)
+    {		
+      return TokenList[nextToken];
+    }
+  else
+    {
+      lastToken = 0;		
+      line = tsource_nextLine (scanFile);
+
+      if (line != (char *) 0)
+	{
+	  lscanLine (line);	
+	  nextToken = 0;	
+	  return LSLScanLookAhead ();	
+	}
+      else
+	{
+	  /* 
+          ** This is a real memory leak.  Its only a few bytes
+	  ** per file though, and lsl files are hardly ever used.
+	  */
+
+	  /*@-onlytrans@*/ 
+	  return LSLScanEofToken ();
+	  /*@=onlytrans@*/
+	}
+    }
+}
+
+void
+LSLScanFreshToken (ltoken tok)
+{
+  if (lastToken < MAXLINE)
+    {				
+      TokenList[lastToken++] = ltoken_copy (tok);	
+    }
+  else
+    {
+      llfatalbug (message ("LSLScanFreshToken: out of range: %s", 
+			   cstring_fromChars (lsymbol_toChars (ltoken_getText (tok)))));
+    }
+}
+
+/*@exposed@*/ tsource *LSLScanSource (void)
+{
+  return scanFile;
+}
+
+
+void
+LSLScanInit (void)
+{
+}
+
+void
+LSLScanReset (tsource *s)
+{
+  scanFile = s;
+  lastToken = 0;
+  nextToken = lastToken + 1;	/* force call to scanline   */
+  lineNumber = 0;
+}
+
+void
+LSLScanCleanup (void)
+{
+}
diff --git a/src/scanline.c b/src/scanline.c
new file mode 100644
index 0000000..d972215
--- /dev/null
+++ b/src/scanline.c
@@ -0,0 +1,822 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** scanline.c
+**
+** Scan one line of Larch SL input at a time.
+**
+**	The input is source text, line at a time.   The output is a sequence
+**	of tokens, reported by call-out LSLScanFreshToken.
+**
+**	This organization allows implementation of line-at-a-time
+**	incremental scanning.  The incremental mechanism is in the
+**	driving module scan.c, which can save and replay tokens for
+**	unchanged lines.  This module works either way.
+**
+**	The main loop of the scanner keys on the leading character.
+**	Actions within the loop collect the token starting with the
+**	and determine its kind.
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "signature.h"
+# include "signature2.h"
+# include "scan.h"
+# include "scanline.h"
+# include "tokentable.h"
+# include "syntable.h"
+
+/*@notfunction@*/
+# define MOVECHAR()   do { *bufptr++ = c; c = *currentLine++; colNumber++; } while (FALSE) 
+
+/*@constant static int MAXCHAR;@*/
+# define MAXCHAR 512      
+
+/*@constant static int TABSIZE;@*/
+# define TABSIZE 8	
+
+static void LocalUserError (/*@temp@*/ char *p_msg);
+
+static charClassData charClass[LASTCHAR + 1];
+
+static unsigned int colNumber; 
+static unsigned int startCol;	
+static bool reportEOL;		
+static bool reportComments;	
+
+static char tokenBuffer[MAXCHAR];
+
+static const charClassData charClassDef[] =
+{
+  /* Control characters					 */
+
+  { CHC_NULL, TRUE },      /*  0 NULL		 */
+  { SINGLECHAR, FALSE },        /*  1 CTRL-A		 */
+  { SINGLECHAR, FALSE },	/*  2 CTRL-B		 */
+  { SINGLECHAR, FALSE },	/*  3 CTRL-C		 */
+  { SINGLECHAR, FALSE },	/*  4 CTRL-D		 */
+  { SINGLECHAR, FALSE },	/*  5 CTRL-E		 */
+  { SINGLECHAR, FALSE },	/*  6 CTRL-F		 */
+  { SINGLECHAR, FALSE },	/*  7 CTRL-G		 */
+  { SINGLECHAR, FALSE },	/*  8 CTRL-H		 */
+
+  /* defined formatting characters			 */
+
+  { WHITECHAR, FALSE },		/*  9 CTRL-I   TAB	 */
+  { WHITECHAR, TRUE },		/* 10 CTRL-J   EOL	 */
+
+  /* more control characters				 */
+
+  { SINGLECHAR, FALSE },	/* 11 CTRL-K		 */
+  { SINGLECHAR, FALSE },	/* 12 CTRL-L		 */
+  { SINGLECHAR, FALSE },	/* 13 CTRL-M		 */
+  { SINGLECHAR, FALSE },	/* 14 CTRL-N		 */
+  { SINGLECHAR, FALSE },	/* 15 CTRL-O		 */
+  { SINGLECHAR, FALSE },	/* 16 CTRL-P		 */
+  { SINGLECHAR, FALSE },	/* 17 CTRL-Q		 */
+  { SINGLECHAR, FALSE },	/* 18 CTRL-R		 */
+  { SINGLECHAR, FALSE },	/* 19 CTRL-S		 */
+  { SINGLECHAR, FALSE },	/* 20 CTRL-T		 */
+  { SINGLECHAR, FALSE },	/* 21 CTRL-U		 */
+  { SINGLECHAR, FALSE },	/* 22 CTRL-V		 */
+  { SINGLECHAR, FALSE },	/* 23 CTRL-W		 */
+  { SINGLECHAR, FALSE },	/* 24 CTRL-X		 */
+  { SINGLECHAR, FALSE },	/* 25 CTRL-Y		 */
+  { SINGLECHAR, FALSE },	/* 26 CTRL-Z		 */
+  { SINGLECHAR, FALSE },	/* 27 CTRL-[   ESC	 */
+  { SINGLECHAR, FALSE },	/* 28 CTRL-slash         */
+  { SINGLECHAR, FALSE },	/* 29 CTRL-]   GS	 */
+  { SINGLECHAR, FALSE },	/* 30 CTRL-^   RS	 */
+  { SINGLECHAR, FALSE },	/* 31 CTRL-_   US	 */
+
+  /* Special printing characters			 */
+
+  { WHITECHAR, FALSE },		/* 32 space		 */
+  { SINGLECHAR, FALSE },	/* 33 !			 */
+  { SINGLECHAR, FALSE },	/* 34 "			 */
+  { SINGLECHAR, FALSE },	/* 35 #			 */
+  { SINGLECHAR, FALSE },	/* 36 $			 */
+  { SINGLECHAR, FALSE },	/* 37 %			 */
+  { SINGLECHAR, FALSE },	/* 38 &			 */
+  { SINGLECHAR, FALSE },	/* 39 '			 */
+
+  /* Reserved characters				 */
+
+  { PERMCHAR, FALSE },		/* 40 (			 */
+  { PERMCHAR, FALSE },		/* 41 )			 */
+  { OPCHAR, FALSE },		/* 42 *			 */
+  { OPCHAR, FALSE },		/* 43 +			 */
+  { PERMCHAR, FALSE },		/* 44 ,			 */
+  { OPCHAR, FALSE },		/* 45 -			 */
+  { OPCHAR, FALSE },		/* 46 .			 */
+  { SLASHCHAR, FALSE },		/* 47 /			 */
+
+  /* Numbers						 */
+
+  { IDCHAR, FALSE },		/* 48 0			 */
+  { IDCHAR, FALSE },		/* 49 1			 */
+  { IDCHAR, FALSE },		/* 50 2			 */
+  { IDCHAR, FALSE },		/* 51 3			 */
+  { IDCHAR, FALSE },		/* 52 4			 */
+  { IDCHAR, FALSE },		/* 53 5			 */
+  { IDCHAR, FALSE },		/* 54 6			 */
+  { IDCHAR, FALSE },		/* 55 7			 */
+  { IDCHAR, FALSE },		/* 56 8			 */
+  { IDCHAR, FALSE },		/* 57 9			 */
+
+  /* More reserved and special printing characters	 */
+
+  { PERMCHAR, FALSE },		/* 58 :			 */
+  { SINGLECHAR, FALSE },	/* 59;			 */
+  { OPCHAR, FALSE },		/* 60 <			 */
+  { OPCHAR, FALSE },		/* 61 =			 */
+  { OPCHAR, FALSE },		/* 62 >			 */
+  { SINGLECHAR, FALSE },	/* 63 ?			 */
+  { SINGLECHAR, FALSE },	/* 64 @			 */
+
+  /* Uppercase Alphabetics				 */
+
+  { IDCHAR, FALSE },		/* 65 A 		 */
+  { IDCHAR, FALSE },		/* 66 B 		 */
+  { IDCHAR, FALSE },		/* 67 C 		 */
+  { IDCHAR, FALSE },		/* 68 D 	 	 */
+  { IDCHAR, FALSE },		/* 69 E 		 */
+  { IDCHAR, FALSE },		/* 70 F			 */
+  { IDCHAR, FALSE },		/* 71 G			 */
+  { IDCHAR, FALSE },		/* 72 H			 */
+  { IDCHAR, FALSE },		/* 73 I			 */
+  { IDCHAR, FALSE },		/* 74 J			 */
+  { IDCHAR, FALSE },		/* 75 K			 */
+  { IDCHAR, FALSE },		/* 76 L			 */
+  { IDCHAR, FALSE },		/* 77 M			 */
+  { IDCHAR, FALSE },		/* 78 N			 */
+  { IDCHAR, FALSE },		/* 79 O			 */
+  { IDCHAR, FALSE },		/* 80 P			 */
+  { IDCHAR, FALSE },		/* 81 Q			 */
+  { IDCHAR, FALSE },		/* 82 R			 */
+  { IDCHAR, FALSE },		/* 83 S			 */
+  { IDCHAR, FALSE },		/* 84 T			 */
+  { IDCHAR, FALSE },		/* 85 U			 */
+  { IDCHAR, FALSE },		/* 86 V			 */
+  { IDCHAR, FALSE },		/* 87 W			 */
+  { IDCHAR, FALSE },		/* 88 X			 */
+  { IDCHAR, FALSE },		/* 89 Y			 */
+  { IDCHAR, FALSE },		/* 90 Z			 */
+
+  /* Still more reserved and special printing characters */
+
+  { SINGLECHAR, FALSE },	/* 91 [			 */
+  { CHC_EXTENSION, FALSE },	/* 92 slash		 */
+  { SINGLECHAR, FALSE },	/* 93 ]			 */
+  { SINGLECHAR, FALSE },	/* 94 ^			 */
+  { IDCHAR, FALSE },		/* 95 _			 */
+  { SINGLECHAR, FALSE },	/* 96 `			 */
+  
+  /* Lowercase alphabetics				 */
+
+  { IDCHAR, FALSE },		/* 97 a			 */
+  { IDCHAR, FALSE },		/* 98 b			 */
+  { IDCHAR, FALSE },		/* 99 c			 */
+  { IDCHAR, FALSE },		/* 100 d		 */
+  { IDCHAR, FALSE },		/* 101 e		 */
+  { IDCHAR, FALSE },		/* 102 f		 */
+  { IDCHAR, FALSE },		/* 103 g		 */
+  { IDCHAR, FALSE },		/* 104 h		 */
+  { IDCHAR, FALSE },		/* 105 i		 */
+  { IDCHAR, FALSE },		/* 106 j		 */
+  { IDCHAR, FALSE },		/* 107 k		 */
+  { IDCHAR, FALSE },		/* 108 l		 */
+  { IDCHAR, FALSE },		/* 109 m		 */
+  { IDCHAR, FALSE },		/* 110 n		 */
+  { IDCHAR, FALSE },		/* 111 o		 */
+  { IDCHAR, FALSE },		/* 112 p		 */
+  { IDCHAR, FALSE },		/* 113 q		 */
+  { IDCHAR, FALSE },		/* 114 r		 */
+  { IDCHAR, FALSE },		/* 115 s		 */
+  { IDCHAR, FALSE },		/* 116 t		 */
+  { IDCHAR, FALSE },		/* 117 u		 */
+  { IDCHAR, FALSE },		/* 118 v		 */
+  { IDCHAR, FALSE },		/* 119 w		 */
+  { IDCHAR, FALSE },		/* 120 x		 */
+  { IDCHAR, FALSE },		/* 121 y		 */
+  { IDCHAR, FALSE },		/* 122 z		 */
+
+  { SINGLECHAR, FALSE },	/* 123 {		 */
+  { SINGLECHAR, FALSE },	/* 124 |		 */
+  { SINGLECHAR, FALSE },	/* 125 }		 */
+  { SINGLECHAR, FALSE },	/* 126 ~		 */
+  { SINGLECHAR, FALSE },	/* 127 DEL		 */
+
+  /* MCS - unused in English				 */
+
+  { SINGLECHAR, FALSE },	/* 128			 */
+  { SINGLECHAR, FALSE },	/* 129			 */
+  { SINGLECHAR, FALSE },	/* 130			 */
+  { SINGLECHAR, FALSE },	/* 131			 */
+  { SINGLECHAR, FALSE },	/* 132			 */
+  { SINGLECHAR, FALSE },	/* 133			 */
+  { SINGLECHAR, FALSE },	/* 134			 */
+  { SINGLECHAR, FALSE },	/* 135			 */
+  { SINGLECHAR, FALSE },	/* 136			 */
+  { SINGLECHAR, FALSE },	/* 137			 */
+  { SINGLECHAR, FALSE },	/* 138			 */
+  { SINGLECHAR, FALSE },	/* 139			 */
+  { SINGLECHAR, FALSE },	/* 140			 */
+  { SINGLECHAR, FALSE },	/* 141			 */
+  { SINGLECHAR, FALSE },	/* 142			 */
+  { SINGLECHAR, FALSE },	/* 143			 */
+  { SINGLECHAR, FALSE },	/* 144			 */
+  { SINGLECHAR, FALSE },	/* 145			 */
+  { SINGLECHAR, FALSE },	/* 146			 */
+  { SINGLECHAR, FALSE },	/* 147			 */
+  { SINGLECHAR, FALSE },	/* 148			 */
+  { SINGLECHAR, FALSE },	/* 149			 */
+  { SINGLECHAR, FALSE },	/* 150			 */
+  { SINGLECHAR, FALSE },	/* 151			 */
+  { SINGLECHAR, FALSE },	/* 152			 */
+  { SINGLECHAR, FALSE },	/* 153			 */
+  { SINGLECHAR, FALSE },	/* 154			 */
+  { SINGLECHAR, FALSE },	/* 155			 */
+  { SINGLECHAR, FALSE },	/* 156			 */
+  { SINGLECHAR, FALSE },	/* 157			 */
+  { SINGLECHAR, FALSE },	/* 158			 */
+  { SINGLECHAR, FALSE },	/* 159			 */
+  { SINGLECHAR, FALSE },	/* 160			 */
+  { SINGLECHAR, FALSE },	/* 161			 */
+  { SINGLECHAR, FALSE },	/* 162			 */
+  { SINGLECHAR, FALSE },	/* 163			 */
+  { SINGLECHAR, FALSE },	/* 164			 */
+  { SINGLECHAR, FALSE },	/* 165			 */
+  { SINGLECHAR, FALSE },	/* 166			 */
+  { SINGLECHAR, FALSE },	/* 167			 */
+  { SINGLECHAR, FALSE },	/* 168			 */
+  { SINGLECHAR, FALSE },	/* 169			 */
+  { SINGLECHAR, FALSE },	/* 170			 */
+  { SINGLECHAR, FALSE },	/* 171			 */
+  { SINGLECHAR, FALSE },	/* 172			 */
+  { SINGLECHAR, FALSE },	/* 173			 */
+  { SINGLECHAR, FALSE },	/* 174			 */
+  { SINGLECHAR, FALSE },	/* 175			 */
+  { SINGLECHAR, FALSE },	/* 176			 */
+  { SINGLECHAR, FALSE },	/* 177			 */
+  { SINGLECHAR, FALSE },	/* 178			 */
+  { SINGLECHAR, FALSE },	/* 179			 */
+  { SINGLECHAR, FALSE },	/* 180			 */
+  { SINGLECHAR, FALSE },	/* 181			 */
+  { SINGLECHAR, FALSE },	/* 182			 */
+  { SINGLECHAR, FALSE },	/* 183			 */
+  { SINGLECHAR, FALSE },	/* 184			 */
+  { SINGLECHAR, FALSE },	/* 185			 */
+  { SINGLECHAR, FALSE },	/* 186			 */
+  { SINGLECHAR, FALSE },	/* 187			 */
+  { SINGLECHAR, FALSE },	/* 188			 */
+  { SINGLECHAR, FALSE },	/* 189			 */
+  { SINGLECHAR, FALSE },	/* 190			 */
+  { SINGLECHAR, FALSE },	/* 191			 */
+  { SINGLECHAR, FALSE },	/* 192			 */
+  { SINGLECHAR, FALSE },	/* 193			 */
+  { SINGLECHAR, FALSE },	/* 194			 */
+  { SINGLECHAR, FALSE },	/* 195			 */
+  { SINGLECHAR, FALSE },	/* 196			 */
+  { SINGLECHAR, FALSE },	/* 197			 */
+  { SINGLECHAR, FALSE },	/* 198			 */
+  { SINGLECHAR, FALSE },	/* 199			 */
+  { SINGLECHAR, FALSE },	/* 200			 */
+  { SINGLECHAR, FALSE },	/* 201			 */
+  { SINGLECHAR, FALSE },	/* 202			 */
+  { SINGLECHAR, FALSE },	/* 203			 */
+  { SINGLECHAR, FALSE },	/* 204			 */
+  { SINGLECHAR, FALSE },	/* 205			 */
+  { SINGLECHAR, FALSE },	/* 206			 */
+  { SINGLECHAR, FALSE },	/* 207			 */
+  { SINGLECHAR, FALSE },	/* 208			 */
+  { SINGLECHAR, FALSE },	/* 209			 */
+  { SINGLECHAR, FALSE },	/* 210			 */
+  { SINGLECHAR, FALSE },	/* 211			 */
+  { SINGLECHAR, FALSE },	/* 212			 */
+  { SINGLECHAR, FALSE },	/* 213			 */
+  { SINGLECHAR, FALSE },	/* 214			 */
+  { SINGLECHAR, FALSE },	/* 215			 */
+  { SINGLECHAR, FALSE },	/* 216			 */
+  { SINGLECHAR, FALSE },	/* 217			 */
+  { SINGLECHAR, FALSE },	/* 218			 */
+  { SINGLECHAR, FALSE },	/* 219			 */
+  { SINGLECHAR, FALSE },	/* 220			 */
+  { SINGLECHAR, FALSE },	/* 221			 */
+  { SINGLECHAR, FALSE },	/* 222			 */
+  { SINGLECHAR, FALSE },	/* 223			 */
+  { SINGLECHAR, FALSE },	/* 224			 */
+  { SINGLECHAR, FALSE },	/* 225			 */
+  { SINGLECHAR, FALSE },	/* 226			 */
+  { SINGLECHAR, FALSE },	/* 227			 */
+  { SINGLECHAR, FALSE },	/* 228			 */
+  { SINGLECHAR, FALSE },	/* 229			 */
+  { SINGLECHAR, FALSE },	/* 230			 */
+  { SINGLECHAR, FALSE },	/* 231			 */
+  { SINGLECHAR, FALSE },	/* 232			 */
+  { SINGLECHAR, FALSE },	/* 233			 */
+  { SINGLECHAR, FALSE },	/* 234			 */
+  { SINGLECHAR, FALSE },	/* 235			 */
+  { SINGLECHAR, FALSE },	/* 236			 */
+  { SINGLECHAR, FALSE },	/* 237			 */
+  { SINGLECHAR, FALSE },	/* 238			 */
+  { SINGLECHAR, FALSE },	/* 239			 */
+  { SINGLECHAR, FALSE },	/* 240			 */
+  { SINGLECHAR, FALSE },	/* 241			 */
+  { SINGLECHAR, FALSE },	/* 242			 */
+  { SINGLECHAR, FALSE },	/* 243			 */
+  { SINGLECHAR, FALSE },	/* 244			 */
+  { SINGLECHAR, FALSE },	/* 245			 */
+  { SINGLECHAR, FALSE },	/* 246			 */
+  { SINGLECHAR, FALSE },	/* 247			 */
+  { SINGLECHAR, FALSE },	/* 248			 */
+  { SINGLECHAR, FALSE },	/* 249			 */
+  { SINGLECHAR, FALSE },	/* 250			 */
+  { SINGLECHAR, FALSE },	/* 251			 */
+  { SINGLECHAR, FALSE },	/* 252			 */
+  { SINGLECHAR, FALSE },	/* 253			 */
+  { SINGLECHAR, FALSE },	/* 254			 */
+  { SINGLECHAR, FALSE }		/* 255			 */
+};
+
+/*
+**++
+**  FUNCTION NAME:
+**
+**      lscanline ()
+**
+**  FORMAL PARAMETERS:
+**
+**      None
+**
+**  RETURN VALUE:
+**
+**      None
+**
+**  INVARIANTS:
+**
+**      [@description or none@]
+**
+**  DESCRIPTION:
+**
+**	One line of text is processed.
+**	Tokens are delivered via the call LSLScanFreshToken ().
+**
+**  EXCEPTIONS:
+**
+**--
+*/
+
+void
+lscanLine (char *currentLine)
+{
+  ltokenCode cod;	 
+  lsymbol sym;		
+  register char c;	
+  register char *bufptr;
+  ltoken newToken;	
+
+  c = *currentLine++;	
+  colNumber = 0;	
+
+  for (;;)
+    {			
+      bufptr = &tokenBuffer[0];	
+      startCol = colNumber;	
+
+      /*@-loopswitchbreak@*/
+      switch (lscanCharClass (c))
+	{			
+
+	case CHC_NULL:	
+	  sym = lsymbol_fromChars ("E O L");
+	  cod = LST_EOL;
+	  break;
+	  
+	 /* Identifiers */
+
+	case IDCHAR:
+
+	  while (lscanCharClass (c) == IDCHAR)
+	    {			
+	      MOVECHAR ();
+	    }
+
+	  *bufptr = '\0';	
+	  sym = lsymbol_fromChars (&tokenBuffer[0]);
+	  cod = LST_SIMPLEID;
+	  break;
+
+	 /* One-character tokens */
+
+	case SINGLECHAR:
+	case PERMCHAR:		
+	  MOVECHAR ();
+	  *bufptr = '\0';	
+	  sym = lsymbol_fromChars (&tokenBuffer[0]);
+	  cod = LST_SIMPLEOP;
+	  break;
+
+	case SLASHCHAR:
+	  if (*currentLine == '\\')
+	    {
+	      MOVECHAR ();
+	      MOVECHAR ();
+	      *bufptr = '\0';
+	      sym = lsymbol_fromChars (&tokenBuffer[0]);
+	      cod = LST_SIMPLEOP;
+	      break;
+	    }
+	  MOVECHAR ();
+	  /* We fall through to next case if we have / followed  */
+	  /* by anything else.					 */
+	  /*@fallthrough@*/
+	case OPCHAR: 
+
+	 /* Operator symbols */
+
+	 /* possible multi character */
+	  while (lscanCharClass (c) == OPCHAR)
+	    {			
+	      MOVECHAR ();
+	    }
+
+	  *bufptr = '\0';	/* null terminate in buffer */
+	  sym = lsymbol_fromChars (&tokenBuffer[0]);
+	  cod = LST_SIMPLEOP;
+	  break;
+
+	 /* White space */
+	case WHITECHAR:
+	  /*@-switchswitchbreak@*/
+	  switch (c)
+	    {
+	    case '\t':
+	      MOVECHAR ();
+	      colNumber--;
+	      colNumber += TABSIZE;
+	      colNumber -= (colNumber % TABSIZE);
+	      break;
+
+	    case '\v':
+	    case '\f':
+	      MOVECHAR ();
+	      colNumber--;
+	      break;
+
+	    default:
+	      MOVECHAR ();
+	      break;
+	    }
+	  *bufptr = '\0';	
+	  sym = lsymbol_fromChars (&tokenBuffer[0]);
+	  cod = LST_WHITESPACE;
+	  break;
+
+	case CHC_EXTENSION:	
+	  MOVECHAR ();
+
+	  switch (c)
+	    {			
+
+	     /* open and close */
+	    case '(':		
+	      MOVECHAR ();
+	      while (lscanCharClass (c) == IDCHAR)
+		{		
+		  MOVECHAR ();
+		}
+	      *bufptr = '\0';	
+	      sym = lsymbol_fromChars (&tokenBuffer[0]);
+	      cod = LST_OPENSYM;
+	      break;
+
+	    case ')':		
+	      MOVECHAR ();
+	      while (lscanCharClass (c) == IDCHAR)
+		{		
+		  MOVECHAR ();
+		}
+	      *bufptr = '\0';	
+	      sym = lsymbol_fromChars (&tokenBuffer[0]);
+	      cod = LST_CLOSESYM;
+	      break;
+
+	     /* separator */
+	    case ',':		
+	      MOVECHAR ();
+	      while (lscanCharClass (c) == IDCHAR)
+		{		
+		  MOVECHAR ();
+		}
+	      *bufptr = '\0';	
+	      sym = lsymbol_fromChars (&tokenBuffer[0]);
+	      cod = LST_SEPSYM;
+	      break;
+
+	      /* simpleid */
+	    case ':':		
+	      MOVECHAR ();
+	      while (lscanCharClass (c) == IDCHAR)
+		{		
+		  MOVECHAR ();
+		}
+	      *bufptr = '\0';	
+	      sym = lsymbol_fromChars (&tokenBuffer[0]);
+	      cod = LST_SIMPLEID;
+	      break;
+
+	    default:		
+	      if (lscanCharClass (c) == IDCHAR)
+		{
+		  do
+		    {
+		      MOVECHAR ();
+		    }
+		  while (lscanCharClass (c) == IDCHAR);
+		  *bufptr = '\0';
+		  sym = lsymbol_fromChars (&tokenBuffer[0]);
+		  cod = LST_SIMPLEOP;
+		}
+	      else
+		{
+		  /*
+                  ** Meets none of the above.  Take the extension	    
+		  ** character and the character following and treat	    
+		  ** together as a SINGLECHAR.  SINGLECHARs tranlate into 
+		  ** SIMPLEOPs.					    
+		  */
+
+		  MOVECHAR ();
+		  *bufptr = '\0';	
+		  sym = lsymbol_fromChars (&tokenBuffer[0]);
+		  cod = LST_SIMPLEOP;
+		}
+	      break;
+	    }
+	  /*@switchbreak@*/ break;	
+	  /*@=switchswitchbreak@*/
+	default:
+
+	  LocalUserError ("unexpected character in input");
+	  return;
+	}
+      /*@=loopswitchbreak@*/
+
+      /*
+      ** Above code only "guessed" at token type.  Insert it into the    
+      ** TokenTable.  If the token already exists, it is returned as
+      ** previously defined.  If it does not exist, it is inserted as the 
+      ** token code computed above.
+      */
+
+      newToken = LSLInsertToken (cod, sym, 0, FALSE);
+
+      if (LSLIsSyn (ltoken_getText (newToken)))
+	{
+	  /* 
+	  ** Token is a synonym.  Get the actual token and set the raw    
+	  ** text to the synonym name.				    
+	  */
+
+	  newToken = LSLGetTokenForSyn (ltoken_getText (newToken));
+	  ltoken_setRawText (newToken, sym);
+	}
+
+      ltoken_setCol (newToken, startCol);
+      ltoken_setLine (newToken, tsource_thisLineNumber (LSLScanSource ()));
+      ltoken_setFileName (newToken, tsource_fileName (LSLScanSource ()));
+      
+      if (ltoken_getCode (newToken) == LST_COMMENTSYM)
+	{
+	  bufptr = &tokenBuffer[0];
+
+	  while (!LSLIsEndComment (c))
+	    {
+	      MOVECHAR ();
+	    }
+	  if (lscanCharClass (c) != CHC_NULL)
+	    {
+	      MOVECHAR ();
+	    }
+	  if (reportComments)
+	    {
+	      *bufptr = '\0';
+	      ltoken_setRawText (newToken, lsymbol_fromChars (&tokenBuffer[0]));
+	      LSLScanFreshToken (newToken);
+	    }
+	}
+      else if (ltoken_getCode (newToken) == LST_EOL)
+	{
+	  if (reportEOL)
+	    {
+	      LSLScanFreshToken (newToken);
+	    }
+	  return;
+	}
+      else 
+	{
+	  if (cod != LST_WHITESPACE)
+	    {
+	      LSLScanFreshToken (newToken);
+	    }
+	}
+    }
+}
+
+ltoken
+LSLScanEofToken (void)
+{
+  ltoken t = ltoken_copy (LSLInsertToken (LEOFTOKEN, 
+					  lsymbol_fromChars ("E O F"),
+					  0, TRUE));
+  ltoken_setCol (t, colNumber);
+  ltoken_setLine (t, tsource_thisLineNumber (LSLScanSource ()));
+  ltoken_setFileName (t, tsource_fileName (LSLScanSource ()));
+  return t;
+}
+
+void
+LSLReportEolTokens (bool setting)
+{
+  reportEOL = setting;
+}
+
+static void
+  LocalUserError (char *msg)
+{
+  tsource *s = LSLScanSource ();
+  llfatalerror (message ("%s:%u,%u: %s", 
+			 cstring_fromChars (tsource_fileName (s)), 
+			 tsource_thisLineNumber (s), colNumber, 
+			 cstring_fromChars (msg)));
+}
+
+/*
+**++
+**  FUNCTION NAME:
+**
+**      lscanLineInit ()
+**
+**  FORMAL PARAMETERS:
+**
+**      None
+**
+**  RETURN VALUE:
+**
+**      None
+**
+**  INVARIANTS:
+**
+**      [@description or none@]
+**
+**  DESCRIPTION:
+**
+**      Initialize this module (should only be called once).
+**
+**  IMPLICIT INPUTS/OUTPUT:
+**
+**      GetNextLine - (output) initialized
+**	NullToken   - (output) initialized
+**      PrintName   - (output) array contents initialized
+**
+**  EXCEPTIONS:
+**
+**      None
+**--
+*/
+
+void
+lscanLineInit (void)
+{
+  int i;
+
+  reportEOL = FALSE;
+  reportComments = FALSE;
+
+  for (i = 0; i <= LASTCHAR; i++)
+    {
+      charClass[i] = charClassDef[i];
+    }
+
+ /*
+ ** NOTE: The following line ensures that all tokens have nonzero
+ ** handles, so that a handle of zero can be used to indicate that a
+ ** token does not have a synonym.
+ */
+
+  (void) LSLReserveToken (LST_SIMPLEID, "dummy token");
+
+  ltoken_forall = LSLReserveToken (LST_QUANTIFIERSYM, "\\forall");
+  ltoken_true = LSLReserveToken (LST_SIMPLEID, "true");
+  ltoken_false = LSLReserveToken (LST_SIMPLEID, "false");
+  ltoken_not = LSLReserveToken (LST_SIMPLEOP, "\\not");
+  ltoken_and = LSLReserveToken (LST_LOGICALOP, "\\and");
+  ltoken_or = LSLReserveToken (LST_LOGICALOP, "\\or");
+  ltoken_implies = LSLReserveToken (LST_LOGICALOP, "\\implies");
+
+  ltoken_eq = LSLReserveToken (LST_EQOP, "\\eq");
+  ltoken_neq = LSLReserveToken (LST_EQOP, "\\neq");
+
+  ltoken_equals = LSLReserveToken (LST_EQUATIONSYM, "\\equals");
+  ltoken_eqsep = LSLReserveToken (LST_EQSEPSYM, "\\eqsep");
+  ltoken_select = LSLReserveToken (LST_SELECTSYM, "\\select");
+  ltoken_open = LSLReserveToken (LST_OPENSYM, "\\open");
+  ltoken_sep = LSLReserveToken (LST_SEPSYM, "\\,");
+  ltoken_close = LSLReserveToken (LST_CLOSESYM, "\\close");
+  ltoken_id = LSLReserveToken (LST_SIMPLEID, "\\:");
+  ltoken_arrow = LSLReserveToken (LST_MAPSYM, "\\arrow");
+  ltoken_farrow = LSLReserveToken (LST_FIELDMAPSYM, "\\field_arrow");
+
+  ltoken_marker = LSLReserveToken (LST_MARKERSYM, "\\marker");
+  ltoken_comment = LSLReserveToken (LST_COMMENTSYM, "\\comment");
+  ltoken_compose = LSLReserveToken (LST_COMPOSESYM, "\\composeSort");
+  ltoken_if = LSLReserveToken (LST_ifTOKEN, "if");
+
+  (void) LSLReserveToken (LST_LPAR, "(");
+  (void) LSLReserveToken (LST_RPAR, ")");
+  (void) LSLReserveToken (LST_COMMA, ",");
+  (void) LSLReserveToken (LST_COLON, ":");
+
+  (void) LSLReserveToken (LST_LBRACKET, "[");
+  (void) LSLReserveToken (LST_RBRACKET, "]");
+
+  (void) LSLReserveToken (LST_WHITESPACE, " ");
+  (void) LSLReserveToken (LST_WHITESPACE, "\t");
+  (void) LSLReserveToken (LST_WHITESPACE, "\n");
+
+  (void) LSLReserveToken (LEOFTOKEN, "E O F");
+  (void) LSLReserveToken (LST_EOL, "E O L");
+
+  (void) LSLReserveToken (LST_assertsTOKEN, "asserts");
+  (void) LSLReserveToken (LST_assumesTOKEN, "assumes");
+  (void) LSLReserveToken (LST_byTOKEN, "by");
+  (void) LSLReserveToken (LST_convertsTOKEN, "converts");
+  (void) LSLReserveToken (LST_elseTOKEN, "else");
+  (void) LSLReserveToken (LST_enumerationTOKEN, "enumeration");
+  (void) LSLReserveToken (LST_equationsTOKEN, "equations");
+  (void) LSLReserveToken (LST_exemptingTOKEN, "exempting");
+  (void) LSLReserveToken (LST_forTOKEN, "for");
+  (void) LSLReserveToken (LST_generatedTOKEN, "generated");
+  (void) LSLReserveToken (LST_impliesTOKEN, "implies");
+  (void) LSLReserveToken (LST_includesTOKEN, "includes");
+  (void) LSLReserveToken (LST_introducesTOKEN, "introduces");
+  (void) LSLReserveToken (LST_ofTOKEN, "of");
+  (void) LSLReserveToken (LST_partitionedTOKEN, "partitioned");
+  (void) LSLReserveToken (LST_thenTOKEN, "then");
+  (void) LSLReserveToken (LST_traitTOKEN, "trait");
+  (void) LSLReserveToken (LST_tupleTOKEN, "tuple");
+  (void) LSLReserveToken (LST_unionTOKEN, "union");
+}
+
+void
+lscanLineReset (void)
+{
+}
+
+void
+lscanLineCleanup (void)
+{
+}
+
+charCode lscanCharClass (char c)
+{
+  return charClass[(int)(c)].code;
+}
+
+bool LSLIsEndComment (char c)
+{
+  return charClass[(int)(c)].endCommentChar;
+}
+
+void lsetCharClass (char c, charCode cod)
+{
+  charClass[(int)(c)].code = cod;
+}
+
+void lsetEndCommentChar (char c, bool flag)
+{
+  charClass[(int)(c)].endCommentChar = flag;
+}
diff --git a/src/shift.c b/src/shift.c
new file mode 100644
index 0000000..3dac621
--- /dev/null
+++ b/src/shift.c
@@ -0,0 +1,100 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+
+/*
+** shift.c
+**
+** Larch shift sequence manager
+**
+**	Tokens are sent by the parser to this module.  Here they are saved
+**	for awhile in a stack, and delivered on demand during reduce actions.
+**	The coordination between what the parser sends here and what reduce
+**	consumes here must be maintained by the programmer.
+**
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "shift.h"
+
+/*@constant static int SHIFTMAX;@*/
+# define SHIFTMAX 200
+
+static o_ltoken Shifts[SHIFTMAX];
+static int shiftIndex;
+
+static bool Parsing_LSLinit = TRUE;
+
+static bool
+LSLGenIsEmptyShiftStack (void)
+{
+  return (shiftIndex == 0);
+}
+
+void LSLGenShift (ltoken tok)
+{
+  if (shiftIndex < SHIFTMAX)
+    {
+      Shifts[shiftIndex] = ltoken_copy (tok);
+      shiftIndex++;
+    }
+  else
+    {
+      llbuglit ("LSLGenShift: needs MoreMem ()");
+    }
+}
+
+extern void
+LSLGenShiftOnly (/*@only@*/ ltoken tok)
+{
+  if (shiftIndex < SHIFTMAX)
+    {
+      Shifts[shiftIndex] = tok;
+      shiftIndex++;
+    }
+  else
+    {
+      llbugexitlit ("LSLGenShift: needs MoreMem ()");
+    }
+}
+
+extern ltoken
+LSLGenTopPopShiftStack (void)
+{
+  if (LSLGenIsEmptyShiftStack ())
+    {
+      lclfatalbug ("LSLGenTopPopShiftStack: Empty stack");
+    }
+
+  /*@-retalias@*/
+  return Shifts[--shiftIndex];
+  /*@=retalias@*/
+}
+
+void
+LSLGenInit (bool LSLParse)
+{
+  Parsing_LSLinit = LSLParse;
+}
+
diff --git a/src/sigNodeSet.c b/src/sigNodeSet.c
new file mode 100644
index 0000000..5435d58
--- /dev/null
+++ b/src/sigNodeSet.c
@@ -0,0 +1,222 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** sigNodeSet.c
+**
+** based on set_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "intSet.h"
+
+static bool sigNodeSet_member (sigNodeSet p_s, sigNode p_el);
+
+/*@only@*/ sigNodeSet
+sigNodeSet_new ()
+{
+  sigNodeSet s = (sigNodeSet) dmalloc (sizeof (*s));
+
+  s->entries = 0;
+  s->nspace = sigNodeSetBASESIZE;
+  s->elements = (sigNode *) dmalloc (sizeof (*s->elements) * sigNodeSetBASESIZE);
+
+  return (s);
+}
+
+/*@only@*/ sigNodeSet
+sigNodeSet_singleton (sigNode el)
+{
+  sigNodeSet s = (sigNodeSet) dmalloc (sizeof (*s));
+
+  s->entries = 1;
+  s->nspace = sigNodeSetBASESIZE - 1;
+  s->elements = (sigNode *) dmalloc (sizeof (*s->elements) * sigNodeSetBASESIZE);
+  s->elements[0] = el;
+
+  return (s);
+}
+
+static void
+sigNodeSet_grow (/*@notnull@*/ sigNodeSet s)
+{
+  int i;
+  sigNode *newelements; 
+
+  s->nspace = sigNodeSetBASESIZE;
+  newelements = (sigNode *) dmalloc (sizeof (*newelements) 
+					   * (s->entries + s->nspace));
+  
+  for (i = 0; i < s->entries; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+/*
+** Ensures: if *e \in *s
+**          then unchanged (*s) & result = false
+**          else *s' = insert (*s, *e) & result = true
+** Modifies: *s
+*/
+
+bool
+sigNodeSet_insert (sigNodeSet s, /*@owned@*/ sigNode el)
+{
+  llassert (sigNodeSet_isDefined (s));
+
+  if (sigNodeSet_member (s, el))
+    {
+      sigNode_free (el);
+      return FALSE;
+    }
+  else
+    {
+      if (s->nspace <= 0)
+	{
+	  sigNodeSet_grow (s);
+	}
+
+      s->nspace--;
+      s->elements[s->entries] = el;
+      s->entries++;
+      return TRUE;
+    }
+}
+
+static bool
+sigNodeSet_member (sigNodeSet s, sigNode el)
+{
+  if (sigNodeSet_isUndefined (s)) 
+    {
+      return FALSE;
+    }
+  else
+    {
+      int i;
+      
+      for (i = 0; i < s->entries; i++)
+	{
+	  if (sigNode_equal (el, s->elements[i]))
+	    return TRUE;
+	}
+      return FALSE;
+    }
+}
+
+/*@only@*/ cstring
+sigNodeSet_unparse (sigNodeSet s)
+{
+  int i;
+  cstring st = cstring_undefined;
+
+  if (sigNodeSet_isDefined (s))
+    {
+      for (i = 0; i < s->entries; i++)
+	{
+	  if (i == 0)
+	    {
+	      st = sigNode_unparse (s->elements[i]);
+	    }
+	  else
+	    st = message ("%q, %q", st, sigNode_unparse (s->elements[i]));
+	}
+    }
+     
+  return st;
+}
+
+/*@only@*/ cstring
+sigNodeSet_unparseSomeSigs (sigNodeSet s)
+{
+  int i;
+  cstring st = cstring_undefined;
+
+  if (sigNodeSet_isDefined (s))
+    {
+      for (i = 0; i < s->entries; i++)
+	{
+	  cstring t = sigNode_unparseText (s->elements[i]);
+	  
+	  if (i == 0)
+	    {
+	      st = cstring_copy (t);
+	      cstring_free (t);
+	    }
+	  else if (i > 5 && (s->entries > 8))
+	    {
+	      return (message ("%q; %q; ... (%d more signatures)",
+			       st, t, (s->entries - i - 1)));
+	    }
+	  else
+	    {
+	      st = message ("%q; %q", st, t);
+	    }
+	}
+    }
+     
+  return st;
+}
+
+/*@only@*/ cstring
+sigNodeSet_unparsePossibleAritys (sigNodeSet s)
+{
+  int i;
+  intSet is = intSet_new ();
+  cstring st;
+
+  if (sigNodeSet_isDefined (s))
+    {
+      for (i = 0; i < s->entries; i++)
+	{
+	  int arity = ltokenList_size ((s->elements[i])->domain);
+	  (void) intSet_insert (is, arity);
+	}
+    }
+
+  st = intSet_unparseText (is);
+  intSet_free (is);
+  return (st);
+}
+
+void
+sigNodeSet_free (sigNodeSet s)
+{
+  if (sigNodeSet_isDefined (s))
+    {
+      int i;
+      for (i = 0; i < s->entries; i++)
+	{
+	  sigNode_free (s->elements[i]); 
+	}
+      
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
diff --git a/src/signature.c b/src/signature.c
new file mode 100644
index 0000000..9193368
--- /dev/null
+++ b/src/signature.c
@@ -0,0 +1,1320 @@
+/*
+** Inserted at beginning of c files generated by bison
+** REMEMBER:  Change bison.reset too.
+*/
+
+/*@-allmacros@*/
+/*@+boolint@*/
+/*@+charint@*/
+/*@-macroparams@*/
+/*@-macroundef@*/
+/*@-unreachable@*/
+/*@-macrospec@*/
+/*@-varuse@*/
+/*@+ignorequals@*/
+/*@-macrostmt@*/
+/*@-noeffect@*/
+/*@-shadow@*/
+/*@-exitarg@*/
+/*@-macroredef@*/
+/*@-uniondef@*/
+/*@-compdef@*/
+/*@-matchfields@*/
+/*@-exportlocal@*/
+/*@-evalorderuncon@*/
+/*@-exportheader@*/
+/*@-typeuse@*/
+/*@-redecl@*/
+/*@-redef@*/
+/*@-noparams@*/
+/*@-ansireserved@*/
+/*@-fielduse@*/
+/*@-ifblock@*/
+/*@-elseifcomplete@*/
+/*@-whileblock@*/
+/*@-forblock@*/
+/*@-branchstate@*/
+/*@-readonlytrans@*/
+/*@-namechecks@*/
+/*@-usedef@*/
+/*@-systemunrecog@*/
+/*@-dependenttrans@*/
+/*@-unqualifiedtrans@*/
+/*@-nullassign@*/
+
+/* < end of bison.head > */
+
+
+/*  A Bison parser, made from signature.y
+ by  GNU Bison version 1.27
+  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define yyparse lslparse
+#define yylex lsllex
+#define yyerror lslerror
+#define yylval lsllval
+#define yychar lslchar
+#define yydebug lsldebug
+#define yynerrs lslnerrs
+#define	LST_SIMPLEID	257
+#define	LST_LOGICALOP	258
+#define	LST_EQOP	259
+#define	LST_SIMPLEOP	260
+#define	LST_MAPSYM	261
+#define	LST_FIELDMAPSYM	262
+#define	LST_MARKERSYM	263
+#define	LST_ifTOKEN	264
+#define	LST_thenTOKEN	265
+#define	LST_elseTOKEN	266
+#define	LST_LBRACKET	267
+#define	LST_RBRACKET	268
+#define	LST_SELECTSYM	269
+#define	LST_SEPSYM	270
+#define	LST_OPENSYM	271
+#define	LST_CLOSESYM	272
+#define	LST_COLON	273
+#define	LST_COMMA	274
+#define	LST_EOL	275
+#define	LST_COMMENTSYM	276
+#define	LST_WHITESPACE	277
+#define	LST_QUANTIFIERSYM	278
+#define	LST_EQUATIONSYM	279
+#define	LST_EQSEPSYM	280
+#define	LST_COMPOSESYM	281
+#define	LST_LPAR	282
+#define	LST_RPAR	283
+#define	LST_assertsTOKEN	284
+#define	LST_assumesTOKEN	285
+#define	LST_byTOKEN	286
+#define	LST_convertsTOKEN	287
+#define	LST_enumerationTOKEN	288
+#define	LST_equationsTOKEN	289
+#define	LST_exemptingTOKEN	290
+#define	LST_forTOKEN	291
+#define	LST_generatedTOKEN	292
+#define	LST_impliesTOKEN	293
+#define	LST_includesTOKEN	294
+#define	LST_introducesTOKEN	295
+#define	LST_ofTOKEN	296
+#define	LST_partitionedTOKEN	297
+#define	LST_traitTOKEN	298
+#define	LST_tupleTOKEN	299
+#define	LST_unionTOKEN	300
+#define	LST_BADTOKEN	301
+
+#line 36 "signature.y"
+
+
+# include "bison.reset"
+
+# include 
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "lslparse.h"
+# include "signature.h"
+
+void lslerror (char *);
+/*@dependent@*/ /*@null@*/ lslOp importedlslOp;
+
+/*@-noparams@*/ /* Can't list params since YYSTYPE isn't defined yet. */
+static void yyprint (/*FILE *p_file, int p_type, YYSTYPE p_value */);
+/*@=noparams@*/
+
+# define YYPRINT(file, type, value) yyprint (file, type, value)
+
+# define YYDEBUG 1
+
+# include "bison.head"
+
+
+#line 73 "signature.y"
+typedef union {
+  ltoken ltok;  /* a leaf is also an ltoken */
+  unsigned int count;
+  /*@only@*/  ltokenList ltokenList;
+  /*@only@*/  opFormNode opform;
+  /*@owned@*/ sigNode signature;
+  /*@only@*/  nameNode name;
+  /*@owned@*/ lslOp operator;
+  /*@only@*/  lslOpList operators;
+} YYSTYPE;
+#ifndef YYDEBUG
+#define YYDEBUG 1
+#endif
+
+#include 
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define	YYFINAL		62
+#define	YYFLAG		-32768
+#define	YYNTBASE	48
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 301 ? yytranslate[x] : 62)
+
+static const char yytranslate[] = {     0,
+     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,     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,     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,     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,     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,     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,     1,     3,     4,     5,     6,
+     7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+    17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+    37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+    47
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = {     0,
+     0,     2,     4,     7,    11,    13,    15,    22,    24,    27,
+    30,    34,    38,    43,    48,    54,    58,    63,    68,    74,
+    77,    81,    85,    87,    89,    91,    92,    94,    96,   100,
+   102,   104,   108,   109,   111,   113,   117,   119
+};
+
+static const short yyrhs[] = {    49,
+     0,    50,     0,    49,    50,     0,    51,    19,    57,     0,
+    61,     0,    52,     0,    10,     9,    11,     9,    12,     9,
+     0,    53,     0,     9,    53,     0,    53,     9,     0,     9,
+    53,     9,     0,    17,    54,    18,     0,     9,    17,    54,
+    18,     0,    17,    54,    18,     9,     0,     9,    17,    54,
+    18,     9,     0,    13,    54,    14,     0,     9,    13,    54,
+    14,     0,    13,    54,    14,     9,     0,     9,    13,    54,
+    14,     9,     0,    15,     3,     0,     9,    15,     3,     0,
+     9,     8,     3,     0,     6,     0,     4,     0,     5,     0,
+     0,    55,     0,     9,     0,    55,    56,     9,     0,    20,
+     0,    16,     0,    58,     7,    60,     0,     0,    59,     0,
+    60,     0,    59,    20,    60,     0,     3,     0,     3,     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+   139,   141,   146,   150,   156,   158,   162,   164,   166,   168,
+   170,   172,   174,   176,   178,   181,   184,   187,   190,   193,
+   196,   201,   206,   208,   210,   213,   215,   218,   220,   223,
+   225,   228,   231,   233,   236,   238,   241,   247
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = {   "$","error","$undefined.","LST_SIMPLEID",
+"LST_LOGICALOP","LST_EQOP","LST_SIMPLEOP","LST_MAPSYM","LST_FIELDMAPSYM","LST_MARKERSYM",
+"LST_ifTOKEN","LST_thenTOKEN","LST_elseTOKEN","LST_LBRACKET","LST_RBRACKET",
+"LST_SELECTSYM","LST_SEPSYM","LST_OPENSYM","LST_CLOSESYM","LST_COLON","LST_COMMA",
+"LST_EOL","LST_COMMENTSYM","LST_WHITESPACE","LST_QUANTIFIERSYM","LST_EQUATIONSYM",
+"LST_EQSEPSYM","LST_COMPOSESYM","LST_LPAR","LST_RPAR","LST_assertsTOKEN","LST_assumesTOKEN",
+"LST_byTOKEN","LST_convertsTOKEN","LST_enumerationTOKEN","LST_equationsTOKEN",
+"LST_exemptingTOKEN","LST_forTOKEN","LST_generatedTOKEN","LST_impliesTOKEN",
+"LST_includesTOKEN","LST_introducesTOKEN","LST_ofTOKEN","LST_partitionedTOKEN",
+"LST_traitTOKEN","LST_tupleTOKEN","LST_unionTOKEN","LST_BADTOKEN","top","operatorList",
+"operator","name","opForm","anyOp","middle","placeList","separator","signature",
+"domain","sortList","sortId","opId", NULL
+};
+#endif
+
+static const short yyr1[] = {     0,
+    48,    49,    49,    50,    51,    51,    52,    52,    52,    52,
+    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,
+    52,    52,    53,    53,    53,    54,    54,    55,    55,    56,
+    56,    57,    58,    58,    59,    59,    60,    61
+};
+
+static const short yyr2[] = {     0,
+     1,     1,     2,     3,     1,     1,     6,     1,     2,     2,
+     3,     3,     4,     4,     5,     3,     4,     4,     5,     2,
+     3,     3,     1,     1,     1,     0,     1,     1,     3,     1,
+     1,     3,     0,     1,     1,     3,     1,     1
+};
+
+static const short yydefact[] = {     0,
+    38,    24,    25,    23,     0,     0,    26,     0,    26,     1,
+     2,     0,     6,     8,     5,     0,    26,     0,    26,     9,
+     0,    28,     0,    27,    20,     0,     3,    33,    10,    22,
+     0,    21,     0,    11,     0,    16,    31,    30,     0,    12,
+    37,     4,     0,    34,    35,    17,    13,     0,    18,    29,
+    14,     0,     0,    19,    15,     0,    32,    36,     7,     0,
+     0,     0
+};
+
+static const short yydefgoto[] = {    60,
+    10,    11,    12,    13,    14,    23,    24,    39,    42,    43,
+    44,    45,    15
+};
+
+static const short yypact[] = {    -3,
+-32768,-32768,-32768,-32768,    11,    -4,     0,     8,     0,    -3,
+-32768,    -1,-32768,    13,-32768,    17,     0,    22,     0,    18,
+    20,-32768,    19,   -12,-32768,    14,-32768,    31,-32768,-32768,
+    21,-32768,    23,-32768,    27,    28,-32768,-32768,    29,    30,
+-32768,-32768,    33,    24,-32768,    34,    36,    35,-32768,-32768,
+-32768,    31,    31,-32768,-32768,    37,-32768,-32768,-32768,    42,
+    48,-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,    39,-32768,-32768,    45,     4,-32768,-32768,-32768,-32768,
+-32768,   -23,-32768
+};
+
+
+#define	YYLAST		50
+
+
+static const short yytable[] = {     1,
+     2,     3,     4,    37,    21,     5,     6,    38,    22,     7,
+    25,     8,    26,     9,     2,     3,     4,    28,    16,    30,
+    31,    29,    33,    17,    32,    18,    34,    19,    57,    58,
+    35,    40,    36,    41,    46,    48,    49,    50,    51,    52,
+    47,    61,    54,    53,    55,    59,    56,    62,    27,    20
+};
+
+static const short yycheck[] = {     3,
+     4,     5,     6,    16,     9,     9,    10,    20,     9,    13,
+     3,    15,     9,    17,     4,     5,     6,    19,     8,     3,
+    17,     9,    19,    13,     3,    15,     9,    17,    52,    53,
+    11,    18,    14,     3,    14,     9,     9,     9,     9,     7,
+    18,     0,     9,    20,     9,     9,    12,     0,    10,     5
+};
+#define YYPURE 1
+
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/lib/bison.simple"
+/* This file comes from bison-1.27.  */
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+#ifndef YYSTACK_USE_ALLOCA
+#ifdef alloca
+#define YYSTACK_USE_ALLOCA
+#else /* alloca not defined */
+#ifdef __GNUC__
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
+#define YYSTACK_USE_ALLOCA
+#include 
+#else /* not sparc */
+/* We think this test detects Watcom and Microsoft C.  */
+/* This used to test MSDOS, but that is a bad idea
+   since that symbol is in the user namespace.  */
+#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
+#if 0 /* No need for malloc.h, which pollutes the namespace;
+	 instead, just don't use alloca.  */
+#include 
+#endif
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+/* I don't know what this was needed for, but it pollutes the namespace.
+   So I turned it off.   rms, 2 May 1997.  */
+/* #include   */
+ #pragma alloca
+#define YYSTACK_USE_ALLOCA
+#else /* not MSDOS, or __TURBOC__, or _AIX */
+#if 0
+#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
+		 and on HPUX 10.  Eventually we can turn this on.  */
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#endif /* __hpux */
+#endif
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc */
+#endif /* not GNU C */
+#endif /* alloca not defined */
+#endif /* YYSTACK_USE_ALLOCA not defined */
+
+#ifdef YYSTACK_USE_ALLOCA
+#define YYSTACK_ALLOC alloca
+#else
+#define YYSTACK_ALLOC malloc
+#endif
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		-2
+#define YYEOF		0
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT 	goto yyabortlab
+#define YYERROR		goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL		goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    { yychar = (token), yylval = (value);			\
+      yychar1 = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    { yyerror ("syntax error: cannot back up"); YYERROR; }	\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+#ifndef YYPURE
+#define YYLEX		yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int	yychar;			/*  the lookahead symbol		*/
+YYSTYPE	yylval;			/*  the semantic value of the		*/
+				/*  lookahead symbol			*/
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;			/*  location data for the lookahead	*/
+				/*  symbol				*/
+#endif
+
+int yynerrs;			/*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug;			/*  nonzero means print parse trace	*/
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
+
+#ifndef	YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Define __yy_memcpy.  Note that the size argument
+   should be passed with type unsigned int, because that is what the non-GCC
+   definitions require.  With GCC, __builtin_memcpy takes an arg
+   of type size_t, but it can handle unsigned int.  */
+
+#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
+#define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
+#else				/* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (to, from, count)
+     char *to;
+     char *from;
+     unsigned int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (char *to, char *from, unsigned int count)
+{
+  register char *t = to;
+  register char *f = from;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 216 "/usr/lib/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+#ifdef YYPARSE_PARAM
+int yyparse (void *);
+#else
+int yyparse (void);
+#endif
+#endif
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
+  int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */
+
+  short	yyssa[YYINITDEPTH];	/*  the state stack			*/
+  YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/
+
+  short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+
+#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+  int yyfree_stacks = 0;
+
+#ifdef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;		/*  the variable used to return		*/
+				/*  semantic values from the action	*/
+				/*  routines				*/
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+	 the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+	 but that might be undefined if yyoverflow is a macro.  */
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yyls1, size * sizeof (*yylsp),
+		 &yystacksize);
+#else
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yystacksize);
+#endif
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+	{
+	  yyerror("parser stack overflow");
+	  if (yyfree_stacks)
+	    {
+	      free (yyss);
+	      free (yyvs);
+#ifdef YYLSP_NEEDED
+	      free (yyls);
+#endif
+	    }
+	  return 2;
+	}
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+	yystacksize = YYMAXDEPTH;
+#ifndef YYSTACK_USE_ALLOCA
+      yyfree_stacks = 1;
+#endif
+      yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
+      __yy_memcpy ((char *)yyss, (char *)yyss1,
+		   size * (unsigned int) sizeof (*yyssp));
+      yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
+      __yy_memcpy ((char *)yyvs, (char *)yyvs1,
+		   size * (unsigned int) sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
+      __yy_memcpy ((char *)yyls, (char *)yyls1,
+		   size * (unsigned int) sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+	YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+  goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)		/* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;		/* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+	{
+	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+	  /* Give the individual parser a way to print the precise meaning
+	     of a token, for further debugging info.  */
+#ifdef YYPRINT
+	  YYPRINT (stderr, yychar, yylval);
+#endif
+	  fprintf (stderr, ")\n");
+	}
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  if (yylen > 0)
+    yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+	       yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 1:
+#line 139 "signature.y"
+{ lslOpList_free (yyvsp[0].operators); ;
+    break;}
+case 2:
+#line 142 "signature.y"
+{ lslOpList x = lslOpList_new ();
+		g_importedlslOp = yyvsp[0].operator;
+		lslOpList_add (x, yyvsp[0].operator);
+ 		yyval.operators = x; ;
+    break;}
+case 3:
+#line 147 "signature.y"
+{ lslOpList_add (yyvsp[-1].operators, yyvsp[0].operator);
+		yyval.operators = yyvsp[-1].operators; ;
+    break;}
+case 4:
+#line 151 "signature.y"
+{ yyval.operator = makelslOpNode (yyvsp[-2].name, yyvsp[0].signature); ;
+    break;}
+case 5:
+#line 157 "signature.y"
+{ yyval.name = makeNameNodeId (yyvsp[0].ltok); ;
+    break;}
+case 6:
+#line 159 "signature.y"
+{ yyval.name = makeNameNodeForm (yyvsp[0].opform); ;
+    break;}
+case 7:
+#line 163 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-5].ltok, OPF_IF, opFormUnion_createMiddle (0), ltoken_undefined); ;
+    break;}
+case 8:
+#line 165 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[0].ltok, OPF_ANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 9:
+#line 167 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_MANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 10:
+#line 169 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_ANYOPM, opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 11:
+#line 171 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MANYOPM, opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 12:
+#line 173 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 13:
+#line 175 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 14:
+#line 177 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 15:
+#line 179 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MMIDDLEM, 
+			      opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 16:
+#line 182 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMIDDLE, 
+			      opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 17:
+#line 185 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMMIDDLE, 
+			      opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 18:
+#line 188 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMIDDLEM, 
+			    opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 19:
+#line 191 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMMIDDLEM, 
+			    opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 20:
+#line 194 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_SELECT, 
+			    opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 21:
+#line 197 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MSELECT, 
+			    opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 22:
+#line 202 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MMAP, 
+			    opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 23:
+#line 207 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 24:
+#line 209 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 25:
+#line 211 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 26:
+#line 214 "signature.y"
+{ yyval.count = 0; ;
+    break;}
+case 27:
+#line 216 "signature.y"
+{ yyval.count = yyvsp[0].count; ;
+    break;}
+case 28:
+#line 219 "signature.y"
+{ yyval.count = 1; ;
+    break;}
+case 29:
+#line 221 "signature.y"
+{ yyval.count = yyvsp[-2].count + 1; ;
+    break;}
+case 30:
+#line 224 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 31:
+#line 226 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 32:
+#line 229 "signature.y"
+{ yyval.signature = makesigNode (yyvsp[-1].ltok, yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 33:
+#line 232 "signature.y"
+{ yyval.ltokenList = ltokenList_new (); ;
+    break;}
+case 34:
+#line 234 "signature.y"
+{ yyval.ltokenList = yyvsp[0].ltokenList; ;
+    break;}
+case 35:
+#line 237 "signature.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 36:
+#line 239 "signature.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 37:
+#line 242 "signature.y"
+{ 
+	  yyval.ltok = yyvsp[0].ltok; 
+	  ltoken_setText (yyval.ltok, processTraitSortId (ltoken_getText (yyvsp[0].ltok))); 
+	;
+    break;}
+case 38:
+#line 248 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 542 "/usr/lib/bison.simple"
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+	{
+	  int size = 0;
+	  char *msg;
+	  int x, count;
+
+	  count = 0;
+	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
+	  for (x = (yyn < 0 ? -yyn : 0);
+	       x < (sizeof(yytname) / sizeof(char *)); x++)
+	    if (yycheck[x + yyn] == x)
+	      size += strlen(yytname[x]) + 15, count++;
+	  msg = (char *) malloc(size + 15);
+	  if (msg != 0)
+	    {
+	      strcpy(msg, "parse error");
+
+	      if (count < 5)
+		{
+		  count = 0;
+		  for (x = (yyn < 0 ? -yyn : 0);
+		       x < (sizeof(yytname) / sizeof(char *)); x++)
+		    if (yycheck[x + yyn] == x)
+		      {
+			strcat(msg, count == 0 ? ", expecting `" : " or `");
+			strcat(msg, yytname[x]);
+			strcat(msg, "'");
+			count++;
+		      }
+		}
+	      yyerror(msg);
+	      free(msg);
+	    }
+	  else
+	    yyerror ("parse error; also virtual memory exceeded");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror("parse error");
+    }
+
+  goto yyerrlab1;
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+	YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;		/* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+
+ yyacceptlab:
+  /* YYACCEPT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 0;
+
+ yyabortlab:
+  /* YYABORT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 1;
+}
+#line 249 "signature.y"
+
+
+# include "bison.reset"
+
+extern char *yytext;
+
+void lslerror (char *s) 
+{
+  lclplainerror 
+    (message ("An error has occurred in parsing LSL signature: %s", 
+	      cstring_fromChars (s)));
+}
+
+static void yyprint (FILE *file, int type, YYSTYPE value)
+{
+  fprintf (file, " (%u:%u type: %d; text: %s) ", 
+	   ltoken_getLine (value.ltok), 
+	   ltoken_getCol (value.ltok), 
+	   type, 
+	   ltoken_getRawTextChars (value.ltok));
+}
+
+extern void PrintToken (ltoken tok) {
+  char *codStr;
+  
+  switch (ltoken_getCode (tok)) 
+    {
+    case NOTTOKEN:          codStr = "*** NOTTOKEN ***"; break;
+    case LST_QUANTIFIERSYM: codStr = "QUANTIFIERSYM"; break;
+    case LST_LOGICALOP:     codStr = "LOGICALOP: "; break; 
+    case LST_SELECTSYM:     codStr = "LST_SELECTSYM"; break;
+    case LST_OPENSYM:	    codStr = "LST_OPENSYM"; break;
+    case LST_SEPSYM:	    codStr = "SEPSYM"; break;
+    case LST_CLOSESYM:	    codStr = "LST_CLOSESYM"; break;
+    case LST_SIMPLEID:	    codStr = "LST_SIMPLEID"; break;
+    case LST_MAPSYM:	    codStr = "MAPSYM"; break;
+    case LST_MARKERSYM:	    codStr = "LST_MARKERSYM"; break;
+    case LST_COMMENTSYM:    codStr = "COMMENTSYM"; break;
+    case LST_SIMPLEOP:	    codStr = "SIMPLEOP"; break;
+    case LST_COLON:         codStr = "LST_COLON"; break;
+    case LST_COMMA:	    codStr = "COMMA"; break;
+    case LST_LBRACKET:	    codStr = "LST_LBRACKET"; break;
+    case LST_LPAR:	    codStr = "LST_LPAR"; break;
+    case LST_RBRACKET:	    codStr = "LST_RBRACKET"; break;
+    case LST_RPAR:          codStr = "LST_RPAR"; break;
+    case LST_EQOP:          codStr = "LST_EQOP"; break;
+    case LST_WHITESPACE:    codStr = "WHITESPACE,"; break;
+    case LST_EOL:           codStr = "LST_EOL"; break;
+    case LST_elseTOKEN:     codStr = "elseTOKEN"; break;
+    case LST_ifTOKEN:       codStr = "ifTOKEN"; break;
+    case LST_thenTOKEN:     codStr = "thenTOKEN"; break;
+    case LST_BADTOKEN:      codStr = "*** BADTOKEN ***"; break;
+    case LEOFTOKEN: /* can't reach LEOFTOKEN easily */
+      codStr = "LEOFTOKEN"; break;
+    default:
+      codStr = "*** invalid token code ***";
+      break;
+    } /* end switch */
+  
+  /* only used for debugging */
+  printf ("%u:%u: Token Code (%u): %s",
+	  ltoken_getLine (tok), ltoken_getCol (tok), 
+	  ltoken_getCode (tok), codStr);
+  if (ltoken_getRawText (tok) != 0) 
+    {
+      printf (", Token String (%lu): %s\n", 
+	      ltoken_getRawText (tok), ltoken_getRawTextChars (tok));
+    }
+  else printf ("\n");
+}
+
+
+
+
diff --git a/src/signature.c.der b/src/signature.c.der
new file mode 100644
index 0000000..9193368
--- /dev/null
+++ b/src/signature.c.der
@@ -0,0 +1,1320 @@
+/*
+** Inserted at beginning of c files generated by bison
+** REMEMBER:  Change bison.reset too.
+*/
+
+/*@-allmacros@*/
+/*@+boolint@*/
+/*@+charint@*/
+/*@-macroparams@*/
+/*@-macroundef@*/
+/*@-unreachable@*/
+/*@-macrospec@*/
+/*@-varuse@*/
+/*@+ignorequals@*/
+/*@-macrostmt@*/
+/*@-noeffect@*/
+/*@-shadow@*/
+/*@-exitarg@*/
+/*@-macroredef@*/
+/*@-uniondef@*/
+/*@-compdef@*/
+/*@-matchfields@*/
+/*@-exportlocal@*/
+/*@-evalorderuncon@*/
+/*@-exportheader@*/
+/*@-typeuse@*/
+/*@-redecl@*/
+/*@-redef@*/
+/*@-noparams@*/
+/*@-ansireserved@*/
+/*@-fielduse@*/
+/*@-ifblock@*/
+/*@-elseifcomplete@*/
+/*@-whileblock@*/
+/*@-forblock@*/
+/*@-branchstate@*/
+/*@-readonlytrans@*/
+/*@-namechecks@*/
+/*@-usedef@*/
+/*@-systemunrecog@*/
+/*@-dependenttrans@*/
+/*@-unqualifiedtrans@*/
+/*@-nullassign@*/
+
+/* < end of bison.head > */
+
+
+/*  A Bison parser, made from signature.y
+ by  GNU Bison version 1.27
+  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define yyparse lslparse
+#define yylex lsllex
+#define yyerror lslerror
+#define yylval lsllval
+#define yychar lslchar
+#define yydebug lsldebug
+#define yynerrs lslnerrs
+#define	LST_SIMPLEID	257
+#define	LST_LOGICALOP	258
+#define	LST_EQOP	259
+#define	LST_SIMPLEOP	260
+#define	LST_MAPSYM	261
+#define	LST_FIELDMAPSYM	262
+#define	LST_MARKERSYM	263
+#define	LST_ifTOKEN	264
+#define	LST_thenTOKEN	265
+#define	LST_elseTOKEN	266
+#define	LST_LBRACKET	267
+#define	LST_RBRACKET	268
+#define	LST_SELECTSYM	269
+#define	LST_SEPSYM	270
+#define	LST_OPENSYM	271
+#define	LST_CLOSESYM	272
+#define	LST_COLON	273
+#define	LST_COMMA	274
+#define	LST_EOL	275
+#define	LST_COMMENTSYM	276
+#define	LST_WHITESPACE	277
+#define	LST_QUANTIFIERSYM	278
+#define	LST_EQUATIONSYM	279
+#define	LST_EQSEPSYM	280
+#define	LST_COMPOSESYM	281
+#define	LST_LPAR	282
+#define	LST_RPAR	283
+#define	LST_assertsTOKEN	284
+#define	LST_assumesTOKEN	285
+#define	LST_byTOKEN	286
+#define	LST_convertsTOKEN	287
+#define	LST_enumerationTOKEN	288
+#define	LST_equationsTOKEN	289
+#define	LST_exemptingTOKEN	290
+#define	LST_forTOKEN	291
+#define	LST_generatedTOKEN	292
+#define	LST_impliesTOKEN	293
+#define	LST_includesTOKEN	294
+#define	LST_introducesTOKEN	295
+#define	LST_ofTOKEN	296
+#define	LST_partitionedTOKEN	297
+#define	LST_traitTOKEN	298
+#define	LST_tupleTOKEN	299
+#define	LST_unionTOKEN	300
+#define	LST_BADTOKEN	301
+
+#line 36 "signature.y"
+
+
+# include "bison.reset"
+
+# include 
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "lslparse.h"
+# include "signature.h"
+
+void lslerror (char *);
+/*@dependent@*/ /*@null@*/ lslOp importedlslOp;
+
+/*@-noparams@*/ /* Can't list params since YYSTYPE isn't defined yet. */
+static void yyprint (/*FILE *p_file, int p_type, YYSTYPE p_value */);
+/*@=noparams@*/
+
+# define YYPRINT(file, type, value) yyprint (file, type, value)
+
+# define YYDEBUG 1
+
+# include "bison.head"
+
+
+#line 73 "signature.y"
+typedef union {
+  ltoken ltok;  /* a leaf is also an ltoken */
+  unsigned int count;
+  /*@only@*/  ltokenList ltokenList;
+  /*@only@*/  opFormNode opform;
+  /*@owned@*/ sigNode signature;
+  /*@only@*/  nameNode name;
+  /*@owned@*/ lslOp operator;
+  /*@only@*/  lslOpList operators;
+} YYSTYPE;
+#ifndef YYDEBUG
+#define YYDEBUG 1
+#endif
+
+#include 
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define	YYFINAL		62
+#define	YYFLAG		-32768
+#define	YYNTBASE	48
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 301 ? yytranslate[x] : 62)
+
+static const char yytranslate[] = {     0,
+     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,     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,     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,     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,     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,     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,     1,     3,     4,     5,     6,
+     7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+    17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+    37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+    47
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = {     0,
+     0,     2,     4,     7,    11,    13,    15,    22,    24,    27,
+    30,    34,    38,    43,    48,    54,    58,    63,    68,    74,
+    77,    81,    85,    87,    89,    91,    92,    94,    96,   100,
+   102,   104,   108,   109,   111,   113,   117,   119
+};
+
+static const short yyrhs[] = {    49,
+     0,    50,     0,    49,    50,     0,    51,    19,    57,     0,
+    61,     0,    52,     0,    10,     9,    11,     9,    12,     9,
+     0,    53,     0,     9,    53,     0,    53,     9,     0,     9,
+    53,     9,     0,    17,    54,    18,     0,     9,    17,    54,
+    18,     0,    17,    54,    18,     9,     0,     9,    17,    54,
+    18,     9,     0,    13,    54,    14,     0,     9,    13,    54,
+    14,     0,    13,    54,    14,     9,     0,     9,    13,    54,
+    14,     9,     0,    15,     3,     0,     9,    15,     3,     0,
+     9,     8,     3,     0,     6,     0,     4,     0,     5,     0,
+     0,    55,     0,     9,     0,    55,    56,     9,     0,    20,
+     0,    16,     0,    58,     7,    60,     0,     0,    59,     0,
+    60,     0,    59,    20,    60,     0,     3,     0,     3,     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+   139,   141,   146,   150,   156,   158,   162,   164,   166,   168,
+   170,   172,   174,   176,   178,   181,   184,   187,   190,   193,
+   196,   201,   206,   208,   210,   213,   215,   218,   220,   223,
+   225,   228,   231,   233,   236,   238,   241,   247
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = {   "$","error","$undefined.","LST_SIMPLEID",
+"LST_LOGICALOP","LST_EQOP","LST_SIMPLEOP","LST_MAPSYM","LST_FIELDMAPSYM","LST_MARKERSYM",
+"LST_ifTOKEN","LST_thenTOKEN","LST_elseTOKEN","LST_LBRACKET","LST_RBRACKET",
+"LST_SELECTSYM","LST_SEPSYM","LST_OPENSYM","LST_CLOSESYM","LST_COLON","LST_COMMA",
+"LST_EOL","LST_COMMENTSYM","LST_WHITESPACE","LST_QUANTIFIERSYM","LST_EQUATIONSYM",
+"LST_EQSEPSYM","LST_COMPOSESYM","LST_LPAR","LST_RPAR","LST_assertsTOKEN","LST_assumesTOKEN",
+"LST_byTOKEN","LST_convertsTOKEN","LST_enumerationTOKEN","LST_equationsTOKEN",
+"LST_exemptingTOKEN","LST_forTOKEN","LST_generatedTOKEN","LST_impliesTOKEN",
+"LST_includesTOKEN","LST_introducesTOKEN","LST_ofTOKEN","LST_partitionedTOKEN",
+"LST_traitTOKEN","LST_tupleTOKEN","LST_unionTOKEN","LST_BADTOKEN","top","operatorList",
+"operator","name","opForm","anyOp","middle","placeList","separator","signature",
+"domain","sortList","sortId","opId", NULL
+};
+#endif
+
+static const short yyr1[] = {     0,
+    48,    49,    49,    50,    51,    51,    52,    52,    52,    52,
+    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,
+    52,    52,    53,    53,    53,    54,    54,    55,    55,    56,
+    56,    57,    58,    58,    59,    59,    60,    61
+};
+
+static const short yyr2[] = {     0,
+     1,     1,     2,     3,     1,     1,     6,     1,     2,     2,
+     3,     3,     4,     4,     5,     3,     4,     4,     5,     2,
+     3,     3,     1,     1,     1,     0,     1,     1,     3,     1,
+     1,     3,     0,     1,     1,     3,     1,     1
+};
+
+static const short yydefact[] = {     0,
+    38,    24,    25,    23,     0,     0,    26,     0,    26,     1,
+     2,     0,     6,     8,     5,     0,    26,     0,    26,     9,
+     0,    28,     0,    27,    20,     0,     3,    33,    10,    22,
+     0,    21,     0,    11,     0,    16,    31,    30,     0,    12,
+    37,     4,     0,    34,    35,    17,    13,     0,    18,    29,
+    14,     0,     0,    19,    15,     0,    32,    36,     7,     0,
+     0,     0
+};
+
+static const short yydefgoto[] = {    60,
+    10,    11,    12,    13,    14,    23,    24,    39,    42,    43,
+    44,    45,    15
+};
+
+static const short yypact[] = {    -3,
+-32768,-32768,-32768,-32768,    11,    -4,     0,     8,     0,    -3,
+-32768,    -1,-32768,    13,-32768,    17,     0,    22,     0,    18,
+    20,-32768,    19,   -12,-32768,    14,-32768,    31,-32768,-32768,
+    21,-32768,    23,-32768,    27,    28,-32768,-32768,    29,    30,
+-32768,-32768,    33,    24,-32768,    34,    36,    35,-32768,-32768,
+-32768,    31,    31,-32768,-32768,    37,-32768,-32768,-32768,    42,
+    48,-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,    39,-32768,-32768,    45,     4,-32768,-32768,-32768,-32768,
+-32768,   -23,-32768
+};
+
+
+#define	YYLAST		50
+
+
+static const short yytable[] = {     1,
+     2,     3,     4,    37,    21,     5,     6,    38,    22,     7,
+    25,     8,    26,     9,     2,     3,     4,    28,    16,    30,
+    31,    29,    33,    17,    32,    18,    34,    19,    57,    58,
+    35,    40,    36,    41,    46,    48,    49,    50,    51,    52,
+    47,    61,    54,    53,    55,    59,    56,    62,    27,    20
+};
+
+static const short yycheck[] = {     3,
+     4,     5,     6,    16,     9,     9,    10,    20,     9,    13,
+     3,    15,     9,    17,     4,     5,     6,    19,     8,     3,
+    17,     9,    19,    13,     3,    15,     9,    17,    52,    53,
+    11,    18,    14,     3,    14,     9,     9,     9,     9,     7,
+    18,     0,     9,    20,     9,     9,    12,     0,    10,     5
+};
+#define YYPURE 1
+
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/lib/bison.simple"
+/* This file comes from bison-1.27.  */
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+#ifndef YYSTACK_USE_ALLOCA
+#ifdef alloca
+#define YYSTACK_USE_ALLOCA
+#else /* alloca not defined */
+#ifdef __GNUC__
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
+#define YYSTACK_USE_ALLOCA
+#include 
+#else /* not sparc */
+/* We think this test detects Watcom and Microsoft C.  */
+/* This used to test MSDOS, but that is a bad idea
+   since that symbol is in the user namespace.  */
+#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
+#if 0 /* No need for malloc.h, which pollutes the namespace;
+	 instead, just don't use alloca.  */
+#include 
+#endif
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+/* I don't know what this was needed for, but it pollutes the namespace.
+   So I turned it off.   rms, 2 May 1997.  */
+/* #include   */
+ #pragma alloca
+#define YYSTACK_USE_ALLOCA
+#else /* not MSDOS, or __TURBOC__, or _AIX */
+#if 0
+#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
+		 and on HPUX 10.  Eventually we can turn this on.  */
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#endif /* __hpux */
+#endif
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc */
+#endif /* not GNU C */
+#endif /* alloca not defined */
+#endif /* YYSTACK_USE_ALLOCA not defined */
+
+#ifdef YYSTACK_USE_ALLOCA
+#define YYSTACK_ALLOC alloca
+#else
+#define YYSTACK_ALLOC malloc
+#endif
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		-2
+#define YYEOF		0
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT 	goto yyabortlab
+#define YYERROR		goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL		goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    { yychar = (token), yylval = (value);			\
+      yychar1 = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    { yyerror ("syntax error: cannot back up"); YYERROR; }	\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+#ifndef YYPURE
+#define YYLEX		yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int	yychar;			/*  the lookahead symbol		*/
+YYSTYPE	yylval;			/*  the semantic value of the		*/
+				/*  lookahead symbol			*/
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;			/*  location data for the lookahead	*/
+				/*  symbol				*/
+#endif
+
+int yynerrs;			/*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug;			/*  nonzero means print parse trace	*/
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
+
+#ifndef	YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Define __yy_memcpy.  Note that the size argument
+   should be passed with type unsigned int, because that is what the non-GCC
+   definitions require.  With GCC, __builtin_memcpy takes an arg
+   of type size_t, but it can handle unsigned int.  */
+
+#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
+#define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
+#else				/* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (to, from, count)
+     char *to;
+     char *from;
+     unsigned int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (char *to, char *from, unsigned int count)
+{
+  register char *t = to;
+  register char *f = from;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 216 "/usr/lib/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+#ifdef YYPARSE_PARAM
+int yyparse (void *);
+#else
+int yyparse (void);
+#endif
+#endif
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
+  int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */
+
+  short	yyssa[YYINITDEPTH];	/*  the state stack			*/
+  YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/
+
+  short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+
+#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+  int yyfree_stacks = 0;
+
+#ifdef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;		/*  the variable used to return		*/
+				/*  semantic values from the action	*/
+				/*  routines				*/
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+	 the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+	 but that might be undefined if yyoverflow is a macro.  */
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yyls1, size * sizeof (*yylsp),
+		 &yystacksize);
+#else
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yystacksize);
+#endif
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+	{
+	  yyerror("parser stack overflow");
+	  if (yyfree_stacks)
+	    {
+	      free (yyss);
+	      free (yyvs);
+#ifdef YYLSP_NEEDED
+	      free (yyls);
+#endif
+	    }
+	  return 2;
+	}
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+	yystacksize = YYMAXDEPTH;
+#ifndef YYSTACK_USE_ALLOCA
+      yyfree_stacks = 1;
+#endif
+      yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
+      __yy_memcpy ((char *)yyss, (char *)yyss1,
+		   size * (unsigned int) sizeof (*yyssp));
+      yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
+      __yy_memcpy ((char *)yyvs, (char *)yyvs1,
+		   size * (unsigned int) sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
+      __yy_memcpy ((char *)yyls, (char *)yyls1,
+		   size * (unsigned int) sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+	YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+  goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)		/* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;		/* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+	{
+	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+	  /* Give the individual parser a way to print the precise meaning
+	     of a token, for further debugging info.  */
+#ifdef YYPRINT
+	  YYPRINT (stderr, yychar, yylval);
+#endif
+	  fprintf (stderr, ")\n");
+	}
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  if (yylen > 0)
+    yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+	       yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 1:
+#line 139 "signature.y"
+{ lslOpList_free (yyvsp[0].operators); ;
+    break;}
+case 2:
+#line 142 "signature.y"
+{ lslOpList x = lslOpList_new ();
+		g_importedlslOp = yyvsp[0].operator;
+		lslOpList_add (x, yyvsp[0].operator);
+ 		yyval.operators = x; ;
+    break;}
+case 3:
+#line 147 "signature.y"
+{ lslOpList_add (yyvsp[-1].operators, yyvsp[0].operator);
+		yyval.operators = yyvsp[-1].operators; ;
+    break;}
+case 4:
+#line 151 "signature.y"
+{ yyval.operator = makelslOpNode (yyvsp[-2].name, yyvsp[0].signature); ;
+    break;}
+case 5:
+#line 157 "signature.y"
+{ yyval.name = makeNameNodeId (yyvsp[0].ltok); ;
+    break;}
+case 6:
+#line 159 "signature.y"
+{ yyval.name = makeNameNodeForm (yyvsp[0].opform); ;
+    break;}
+case 7:
+#line 163 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-5].ltok, OPF_IF, opFormUnion_createMiddle (0), ltoken_undefined); ;
+    break;}
+case 8:
+#line 165 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[0].ltok, OPF_ANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 9:
+#line 167 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_MANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 10:
+#line 169 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_ANYOPM, opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 11:
+#line 171 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MANYOPM, opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 12:
+#line 173 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 13:
+#line 175 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 14:
+#line 177 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 15:
+#line 179 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MMIDDLEM, 
+			      opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 16:
+#line 182 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMIDDLE, 
+			      opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 17:
+#line 185 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMMIDDLE, 
+			      opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 18:
+#line 188 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMIDDLEM, 
+			    opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 19:
+#line 191 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMMIDDLEM, 
+			    opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 20:
+#line 194 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_SELECT, 
+			    opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 21:
+#line 197 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MSELECT, 
+			    opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 22:
+#line 202 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MMAP, 
+			    opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 23:
+#line 207 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 24:
+#line 209 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 25:
+#line 211 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 26:
+#line 214 "signature.y"
+{ yyval.count = 0; ;
+    break;}
+case 27:
+#line 216 "signature.y"
+{ yyval.count = yyvsp[0].count; ;
+    break;}
+case 28:
+#line 219 "signature.y"
+{ yyval.count = 1; ;
+    break;}
+case 29:
+#line 221 "signature.y"
+{ yyval.count = yyvsp[-2].count + 1; ;
+    break;}
+case 30:
+#line 224 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 31:
+#line 226 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 32:
+#line 229 "signature.y"
+{ yyval.signature = makesigNode (yyvsp[-1].ltok, yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 33:
+#line 232 "signature.y"
+{ yyval.ltokenList = ltokenList_new (); ;
+    break;}
+case 34:
+#line 234 "signature.y"
+{ yyval.ltokenList = yyvsp[0].ltokenList; ;
+    break;}
+case 35:
+#line 237 "signature.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 36:
+#line 239 "signature.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 37:
+#line 242 "signature.y"
+{ 
+	  yyval.ltok = yyvsp[0].ltok; 
+	  ltoken_setText (yyval.ltok, processTraitSortId (ltoken_getText (yyvsp[0].ltok))); 
+	;
+    break;}
+case 38:
+#line 248 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 542 "/usr/lib/bison.simple"
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+	{
+	  int size = 0;
+	  char *msg;
+	  int x, count;
+
+	  count = 0;
+	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
+	  for (x = (yyn < 0 ? -yyn : 0);
+	       x < (sizeof(yytname) / sizeof(char *)); x++)
+	    if (yycheck[x + yyn] == x)
+	      size += strlen(yytname[x]) + 15, count++;
+	  msg = (char *) malloc(size + 15);
+	  if (msg != 0)
+	    {
+	      strcpy(msg, "parse error");
+
+	      if (count < 5)
+		{
+		  count = 0;
+		  for (x = (yyn < 0 ? -yyn : 0);
+		       x < (sizeof(yytname) / sizeof(char *)); x++)
+		    if (yycheck[x + yyn] == x)
+		      {
+			strcat(msg, count == 0 ? ", expecting `" : " or `");
+			strcat(msg, yytname[x]);
+			strcat(msg, "'");
+			count++;
+		      }
+		}
+	      yyerror(msg);
+	      free(msg);
+	    }
+	  else
+	    yyerror ("parse error; also virtual memory exceeded");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror("parse error");
+    }
+
+  goto yyerrlab1;
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+	YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;		/* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+
+ yyacceptlab:
+  /* YYACCEPT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 0;
+
+ yyabortlab:
+  /* YYABORT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 1;
+}
+#line 249 "signature.y"
+
+
+# include "bison.reset"
+
+extern char *yytext;
+
+void lslerror (char *s) 
+{
+  lclplainerror 
+    (message ("An error has occurred in parsing LSL signature: %s", 
+	      cstring_fromChars (s)));
+}
+
+static void yyprint (FILE *file, int type, YYSTYPE value)
+{
+  fprintf (file, " (%u:%u type: %d; text: %s) ", 
+	   ltoken_getLine (value.ltok), 
+	   ltoken_getCol (value.ltok), 
+	   type, 
+	   ltoken_getRawTextChars (value.ltok));
+}
+
+extern void PrintToken (ltoken tok) {
+  char *codStr;
+  
+  switch (ltoken_getCode (tok)) 
+    {
+    case NOTTOKEN:          codStr = "*** NOTTOKEN ***"; break;
+    case LST_QUANTIFIERSYM: codStr = "QUANTIFIERSYM"; break;
+    case LST_LOGICALOP:     codStr = "LOGICALOP: "; break; 
+    case LST_SELECTSYM:     codStr = "LST_SELECTSYM"; break;
+    case LST_OPENSYM:	    codStr = "LST_OPENSYM"; break;
+    case LST_SEPSYM:	    codStr = "SEPSYM"; break;
+    case LST_CLOSESYM:	    codStr = "LST_CLOSESYM"; break;
+    case LST_SIMPLEID:	    codStr = "LST_SIMPLEID"; break;
+    case LST_MAPSYM:	    codStr = "MAPSYM"; break;
+    case LST_MARKERSYM:	    codStr = "LST_MARKERSYM"; break;
+    case LST_COMMENTSYM:    codStr = "COMMENTSYM"; break;
+    case LST_SIMPLEOP:	    codStr = "SIMPLEOP"; break;
+    case LST_COLON:         codStr = "LST_COLON"; break;
+    case LST_COMMA:	    codStr = "COMMA"; break;
+    case LST_LBRACKET:	    codStr = "LST_LBRACKET"; break;
+    case LST_LPAR:	    codStr = "LST_LPAR"; break;
+    case LST_RBRACKET:	    codStr = "LST_RBRACKET"; break;
+    case LST_RPAR:          codStr = "LST_RPAR"; break;
+    case LST_EQOP:          codStr = "LST_EQOP"; break;
+    case LST_WHITESPACE:    codStr = "WHITESPACE,"; break;
+    case LST_EOL:           codStr = "LST_EOL"; break;
+    case LST_elseTOKEN:     codStr = "elseTOKEN"; break;
+    case LST_ifTOKEN:       codStr = "ifTOKEN"; break;
+    case LST_thenTOKEN:     codStr = "thenTOKEN"; break;
+    case LST_BADTOKEN:      codStr = "*** BADTOKEN ***"; break;
+    case LEOFTOKEN: /* can't reach LEOFTOKEN easily */
+      codStr = "LEOFTOKEN"; break;
+    default:
+      codStr = "*** invalid token code ***";
+      break;
+    } /* end switch */
+  
+  /* only used for debugging */
+  printf ("%u:%u: Token Code (%u): %s",
+	  ltoken_getLine (tok), ltoken_getCol (tok), 
+	  ltoken_getCode (tok), codStr);
+  if (ltoken_getRawText (tok) != 0) 
+    {
+      printf (", Token String (%lu): %s\n", 
+	      ltoken_getRawText (tok), ltoken_getRawTextChars (tok));
+    }
+  else printf ("\n");
+}
+
+
+
+
diff --git a/src/signature.tab.c b/src/signature.tab.c
new file mode 100644
index 0000000..6f28c6a
--- /dev/null
+++ b/src/signature.tab.c
@@ -0,0 +1,1204 @@
+
+/*  A Bison parser, made from signature.y
+ by  GNU Bison version 1.25
+  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define yyparse lslparse
+#define yylex lsllex
+#define yyerror lslerror
+#define yylval lsllval
+#define yychar lslchar
+#define yydebug lsldebug
+#define yynerrs lslnerrs
+#define	LST_SIMPLEID	258
+#define	LST_LOGICALOP	259
+#define	LST_EQOP	260
+#define	LST_SIMPLEOP	261
+#define	LST_MAPSYM	262
+#define	LST_FIELDMAPSYM	263
+#define	LST_MARKERSYM	264
+#define	LST_ifTOKEN	265
+#define	LST_thenTOKEN	266
+#define	LST_elseTOKEN	267
+#define	LST_LBRACKET	268
+#define	LST_RBRACKET	269
+#define	LST_SELECTSYM	270
+#define	LST_SEPSYM	271
+#define	LST_OPENSYM	272
+#define	LST_CLOSESYM	273
+#define	LST_COLON	274
+#define	LST_COMMA	275
+#define	LST_EOL	276
+#define	LST_COMMENTSYM	277
+#define	LST_WHITESPACE	278
+#define	LST_QUANTIFIERSYM	279
+#define	LST_EQUATIONSYM	280
+#define	LST_EQSEPSYM	281
+#define	LST_COMPOSESYM	282
+#define	LST_LPAR	283
+#define	LST_RPAR	284
+#define	LST_assertsTOKEN	285
+#define	LST_assumesTOKEN	286
+#define	LST_byTOKEN	287
+#define	LST_convertsTOKEN	288
+#define	LST_enumerationTOKEN	289
+#define	LST_equationsTOKEN	290
+#define	LST_exemptingTOKEN	291
+#define	LST_forTOKEN	292
+#define	LST_generatedTOKEN	293
+#define	LST_impliesTOKEN	294
+#define	LST_includesTOKEN	295
+#define	LST_introducesTOKEN	296
+#define	LST_ofTOKEN	297
+#define	LST_partitionedTOKEN	298
+#define	LST_traitTOKEN	299
+#define	LST_tupleTOKEN	300
+#define	LST_unionTOKEN	301
+#define	LST_BADTOKEN	302
+
+#line 36 "signature.y"
+
+
+# include "bison.reset"
+
+# include 
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "lslparse.h"
+# include "signature.h"
+
+void lslerror (char *);
+/*@dependent@*/ /*@null@*/ lslOp importedlslOp;
+
+/*@-noparams@*/ /* Can't list params since YYSTYPE isn't defined yet. */
+static void yyprint (/*FILE *p_file, int p_type, YYSTYPE p_value */);
+/*@=noparams@*/
+
+# define YYPRINT(file, type, value) yyprint (file, type, value)
+
+# define YYDEBUG 1
+
+# include "bison.head"
+
+
+#line 73 "signature.y"
+typedef union {
+  ltoken ltok;  /* a leaf is also an ltoken */
+  unsigned int count;
+  /*@only@*/  ltokenList ltokenList;
+  /*@only@*/  opFormNode opform;
+  /*@owned@*/ sigNode signature;
+  /*@only@*/  nameNode name;
+  /*@owned@*/ lslOp operator;
+  /*@only@*/  lslOpList operators;
+} YYSTYPE;
+#ifndef YYDEBUG
+#define YYDEBUG 1
+#endif
+
+#include 
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define	YYFINAL		62
+#define	YYFLAG		-32768
+#define	YYNTBASE	48
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 302 ? yytranslate[x] : 62)
+
+static const char yytranslate[] = {     0,
+     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,     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,     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,     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,     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,     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,     1,     2,     3,     4,     5,
+     6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+    16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+    26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+    36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+    46,    47
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = {     0,
+     0,     2,     4,     7,    11,    13,    15,    22,    24,    27,
+    30,    34,    38,    43,    48,    54,    58,    63,    68,    74,
+    77,    81,    85,    87,    89,    91,    92,    94,    96,   100,
+   102,   104,   108,   109,   111,   113,   117,   119
+};
+
+static const short yyrhs[] = {    49,
+     0,    50,     0,    49,    50,     0,    51,    19,    57,     0,
+    61,     0,    52,     0,    10,     9,    11,     9,    12,     9,
+     0,    53,     0,     9,    53,     0,    53,     9,     0,     9,
+    53,     9,     0,    17,    54,    18,     0,     9,    17,    54,
+    18,     0,    17,    54,    18,     9,     0,     9,    17,    54,
+    18,     9,     0,    13,    54,    14,     0,     9,    13,    54,
+    14,     0,    13,    54,    14,     9,     0,     9,    13,    54,
+    14,     9,     0,    15,     3,     0,     9,    15,     3,     0,
+     9,     8,     3,     0,     6,     0,     4,     0,     5,     0,
+     0,    55,     0,     9,     0,    55,    56,     9,     0,    20,
+     0,    16,     0,    58,     7,    60,     0,     0,    59,     0,
+    60,     0,    59,    20,    60,     0,     3,     0,     3,     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+   139,   141,   146,   150,   156,   158,   162,   164,   166,   168,
+   170,   172,   174,   176,   178,   181,   184,   187,   190,   193,
+   196,   201,   206,   208,   210,   213,   215,   218,   220,   223,
+   225,   228,   231,   233,   236,   238,   241,   247
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = {   "$","error","$undefined.","LST_SIMPLEID",
+"LST_LOGICALOP","LST_EQOP","LST_SIMPLEOP","LST_MAPSYM","LST_FIELDMAPSYM","LST_MARKERSYM",
+"LST_ifTOKEN","LST_thenTOKEN","LST_elseTOKEN","LST_LBRACKET","LST_RBRACKET",
+"LST_SELECTSYM","LST_SEPSYM","LST_OPENSYM","LST_CLOSESYM","LST_COLON","LST_COMMA",
+"LST_EOL","LST_COMMENTSYM","LST_WHITESPACE","LST_QUANTIFIERSYM","LST_EQUATIONSYM",
+"LST_EQSEPSYM","LST_COMPOSESYM","LST_LPAR","LST_RPAR","LST_assertsTOKEN","LST_assumesTOKEN",
+"LST_byTOKEN","LST_convertsTOKEN","LST_enumerationTOKEN","LST_equationsTOKEN",
+"LST_exemptingTOKEN","LST_forTOKEN","LST_generatedTOKEN","LST_impliesTOKEN",
+"LST_includesTOKEN","LST_introducesTOKEN","LST_ofTOKEN","LST_partitionedTOKEN",
+"LST_traitTOKEN","LST_tupleTOKEN","LST_unionTOKEN","LST_BADTOKEN","top","operatorList",
+"operator","name","opForm","anyOp","middle","placeList","separator","signature",
+"domain","sortList","sortId","opId", NULL
+};
+#endif
+
+static const short yyr1[] = {     0,
+    48,    49,    49,    50,    51,    51,    52,    52,    52,    52,
+    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,
+    52,    52,    53,    53,    53,    54,    54,    55,    55,    56,
+    56,    57,    58,    58,    59,    59,    60,    61
+};
+
+static const short yyr2[] = {     0,
+     1,     1,     2,     3,     1,     1,     6,     1,     2,     2,
+     3,     3,     4,     4,     5,     3,     4,     4,     5,     2,
+     3,     3,     1,     1,     1,     0,     1,     1,     3,     1,
+     1,     3,     0,     1,     1,     3,     1,     1
+};
+
+static const short yydefact[] = {     0,
+    38,    24,    25,    23,     0,     0,    26,     0,    26,     1,
+     2,     0,     6,     8,     5,     0,    26,     0,    26,     9,
+     0,    28,     0,    27,    20,     0,     3,    33,    10,    22,
+     0,    21,     0,    11,     0,    16,    31,    30,     0,    12,
+    37,     4,     0,    34,    35,    17,    13,     0,    18,    29,
+    14,     0,     0,    19,    15,     0,    32,    36,     7,     0,
+     0,     0
+};
+
+static const short yydefgoto[] = {    60,
+    10,    11,    12,    13,    14,    23,    24,    39,    42,    43,
+    44,    45,    15
+};
+
+static const short yypact[] = {    -3,
+-32768,-32768,-32768,-32768,    11,    -4,     0,     8,     0,    -3,
+-32768,    -1,-32768,    13,-32768,    17,     0,    22,     0,    18,
+    20,-32768,    19,   -12,-32768,    14,-32768,    31,-32768,-32768,
+    21,-32768,    23,-32768,    27,    28,-32768,-32768,    29,    30,
+-32768,-32768,    33,    24,-32768,    34,    36,    35,-32768,-32768,
+-32768,    31,    31,-32768,-32768,    37,-32768,-32768,-32768,    42,
+    48,-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,    39,-32768,-32768,    45,     4,-32768,-32768,-32768,-32768,
+-32768,   -23,-32768
+};
+
+
+#define	YYLAST		50
+
+
+static const short yytable[] = {     1,
+     2,     3,     4,    37,    21,     5,     6,    38,    22,     7,
+    25,     8,    26,     9,     2,     3,     4,    28,    16,    30,
+    31,    29,    33,    17,    32,    18,    34,    19,    57,    58,
+    35,    40,    36,    41,    46,    48,    49,    50,    51,    52,
+    47,    61,    54,    53,    55,    59,    56,    62,    27,    20
+};
+
+static const short yycheck[] = {     3,
+     4,     5,     6,    16,     9,     9,    10,    20,     9,    13,
+     3,    15,     9,    17,     4,     5,     6,    19,     8,     3,
+    17,     9,    19,    13,     3,    15,     9,    17,    52,    53,
+    11,    18,    14,     3,    14,     9,     9,     9,     9,     7,
+    18,     0,     9,    20,     9,     9,    12,     0,    10,     5
+};
+#define YYPURE 1
+
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/lib/bison.simple"
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+#ifndef alloca
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
+#include 
+#else /* not sparc */
+#if defined (MSDOS) && !defined (__TURBOC__)
+#include 
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+#include 
+ #pragma alloca
+#else /* not MSDOS, __TURBOC__, or _AIX */
+#ifdef __hpux
+#ifdef __cplusplus
+extern "C" {
+void *alloca (unsigned int);
+};
+#else /* not __cplusplus */
+void *alloca ();
+#endif /* not __cplusplus */
+#endif /* __hpux */
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc.  */
+#endif /* not GNU C.  */
+#endif /* alloca not defined.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		-2
+#define YYEOF		0
+#define YYACCEPT	return(0)
+#define YYABORT 	return(1)
+#define YYERROR		goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL		goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    { yychar = (token), yylval = (value);			\
+      yychar1 = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    { yyerror ("syntax error: cannot back up"); YYERROR; }	\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+#ifndef YYPURE
+#define YYLEX		yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int	yychar;			/*  the lookahead symbol		*/
+YYSTYPE	yylval;			/*  the semantic value of the		*/
+				/*  lookahead symbol			*/
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;			/*  location data for the lookahead	*/
+				/*  symbol				*/
+#endif
+
+int yynerrs;			/*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug;			/*  nonzero means print parse trace	*/
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
+
+#ifndef	YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+int yyparse (void);
+#endif
+
+#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
+#define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
+#else				/* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (to, from, count)
+     char *to;
+     char *from;
+     int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (char *to, char *from, int count)
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 196 "/usr/lib/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
+  int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */
+
+  short	yyssa[YYINITDEPTH];	/*  the state stack			*/
+  YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/
+
+  short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+
+#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+
+#ifdef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;		/*  the variable used to return		*/
+				/*  semantic values from the action	*/
+				/*  routines				*/
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+	 the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+	 but that might be undefined if yyoverflow is a macro.  */
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yyls1, size * sizeof (*yylsp),
+		 &yystacksize);
+#else
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yystacksize);
+#endif
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+	{
+	  yyerror("parser stack overflow");
+	  return 2;
+	}
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+	yystacksize = YYMAXDEPTH;
+      yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+      __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
+      yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+      __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+      __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+	YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+  goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)		/* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;		/* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+	{
+	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+	  /* Give the individual parser a way to print the precise meaning
+	     of a token, for further debugging info.  */
+#ifdef YYPRINT
+	  YYPRINT (stderr, yychar, yylval);
+#endif
+	  fprintf (stderr, ")\n");
+	}
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  if (yylen > 0)
+    yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+	       yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 1:
+#line 139 "signature.y"
+{ lslOpList_free (yyvsp[0].operators); ;
+    break;}
+case 2:
+#line 142 "signature.y"
+{ lslOpList x = lslOpList_new ();
+		g_importedlslOp = yyvsp[0].operator;
+		lslOpList_add (x, yyvsp[0].operator);
+ 		yyval.operators = x; ;
+    break;}
+case 3:
+#line 147 "signature.y"
+{ lslOpList_add (yyvsp[-1].operators, yyvsp[0].operator);
+		yyval.operators = yyvsp[-1].operators; ;
+    break;}
+case 4:
+#line 151 "signature.y"
+{ yyval.operator = makelslOpNode (yyvsp[-2].name, yyvsp[0].signature); ;
+    break;}
+case 5:
+#line 157 "signature.y"
+{ yyval.name = makeNameNodeId (yyvsp[0].ltok); ;
+    break;}
+case 6:
+#line 159 "signature.y"
+{ yyval.name = makeNameNodeForm (yyvsp[0].opform); ;
+    break;}
+case 7:
+#line 163 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-5].ltok, OPF_IF, opFormUnion_createMiddle (0), ltoken_undefined); ;
+    break;}
+case 8:
+#line 165 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[0].ltok, OPF_ANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 9:
+#line 167 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_MANYOP, opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 10:
+#line 169 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_ANYOPM, opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 11:
+#line 171 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MANYOPM, opFormUnion_createAnyOp (yyvsp[-1].ltok), ltoken_undefined); ;
+    break;}
+case 12:
+#line 173 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 13:
+#line 175 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MMIDDLE, opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 14:
+#line 177 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MIDDLEM, opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 15:
+#line 179 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_MMIDDLEM, 
+			      opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 16:
+#line 182 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMIDDLE, 
+			      opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 17:
+#line 185 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_BMMIDDLE, 
+			      opFormUnion_createMiddle (yyvsp[-1].count), yyvsp[0].ltok); ;
+    break;}
+case 18:
+#line 188 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMIDDLEM, 
+			    opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 19:
+#line 191 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-3].ltok, OPF_BMMIDDLEM, 
+			    opFormUnion_createMiddle (yyvsp[-2].count), yyvsp[-1].ltok); ;
+    break;}
+case 20:
+#line 194 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-1].ltok, OPF_SELECT, 
+			    opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 21:
+#line 197 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MSELECT, 
+			    opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 22:
+#line 202 "signature.y"
+{ yyval.opform = makeOpFormNode (yyvsp[-2].ltok, OPF_MMAP, 
+			    opFormUnion_createAnyOp (yyvsp[0].ltok), ltoken_undefined); ;
+    break;}
+case 23:
+#line 207 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 24:
+#line 209 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 25:
+#line 211 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 26:
+#line 214 "signature.y"
+{ yyval.count = 0; ;
+    break;}
+case 27:
+#line 216 "signature.y"
+{ yyval.count = yyvsp[0].count; ;
+    break;}
+case 28:
+#line 219 "signature.y"
+{ yyval.count = 1; ;
+    break;}
+case 29:
+#line 221 "signature.y"
+{ yyval.count = yyvsp[-2].count + 1; ;
+    break;}
+case 30:
+#line 224 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 31:
+#line 226 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+case 32:
+#line 229 "signature.y"
+{ yyval.signature = makesigNode (yyvsp[-1].ltok, yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 33:
+#line 232 "signature.y"
+{ yyval.ltokenList = ltokenList_new (); ;
+    break;}
+case 34:
+#line 234 "signature.y"
+{ yyval.ltokenList = yyvsp[0].ltokenList; ;
+    break;}
+case 35:
+#line 237 "signature.y"
+{ yyval.ltokenList = ltokenList_singleton (yyvsp[0].ltok); ;
+    break;}
+case 36:
+#line 239 "signature.y"
+{ yyval.ltokenList = ltokenList_push (yyvsp[-2].ltokenList, yyvsp[0].ltok); ;
+    break;}
+case 37:
+#line 242 "signature.y"
+{ 
+	  yyval.ltok = yyvsp[0].ltok; 
+	  ltoken_setText (yyval.ltok, processTraitSortId (ltoken_getText (yyvsp[0].ltok))); 
+	;
+    break;}
+case 38:
+#line 248 "signature.y"
+{ yyval.ltok = yyvsp[0].ltok; ;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 498 "/usr/lib/bison.simple"
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+	{
+	  int size = 0;
+	  char *msg;
+	  int x, count;
+
+	  count = 0;
+	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
+	  for (x = (yyn < 0 ? -yyn : 0);
+	       x < (sizeof(yytname) / sizeof(char *)); x++)
+	    if (yycheck[x + yyn] == x)
+	      size += strlen(yytname[x]) + 15, count++;
+	  msg = (char *) malloc(size + 15);
+	  if (msg != 0)
+	    {
+	      strcpy(msg, "parse error");
+
+	      if (count < 5)
+		{
+		  count = 0;
+		  for (x = (yyn < 0 ? -yyn : 0);
+		       x < (sizeof(yytname) / sizeof(char *)); x++)
+		    if (yycheck[x + yyn] == x)
+		      {
+			strcat(msg, count == 0 ? ", expecting `" : " or `");
+			strcat(msg, yytname[x]);
+			strcat(msg, "'");
+			count++;
+		      }
+		}
+	      yyerror(msg);
+	      free(msg);
+	    }
+	  else
+	    yyerror ("parse error; also virtual memory exceeded");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror("parse error");
+    }
+
+  goto yyerrlab1;
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+	YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;		/* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+}
+#line 249 "signature.y"
+
+
+# include "bison.reset"
+
+extern char *yytext;
+
+void lslerror (char *s) 
+{
+  lclplainerror (message ("An error has occurred in parsing LSL signature: %s", 
+			  cstring_fromChars (s)));
+}
+
+static void yyprint (FILE *file, int type, YYSTYPE value)
+{
+  fprintf (file, " (%u:%u type: %d; text: %s) ", 
+	   ltoken_getLine (value.ltok), 
+	   ltoken_getCol (value.ltok), 
+	   type, 
+	   ltoken_getRawTextChars (value.ltok));
+}
+
+extern void PrintToken (ltoken tok) {
+  char *codStr;
+  
+  switch (ltoken_getCode (tok)) 
+    {
+    case NOTTOKEN:          codStr = "*** NOTTOKEN ***"; break;
+    case LST_QUANTIFIERSYM: codStr = "QUANTIFIERSYM"; break;
+    case LST_LOGICALOP:     codStr = "LOGICALOP: "; break; 
+    case LST_SELECTSYM:     codStr = "LST_SELECTSYM"; break;
+    case LST_OPENSYM:	    codStr = "LST_OPENSYM"; break;
+    case LST_SEPSYM:	    codStr = "SEPSYM"; break;
+    case LST_CLOSESYM:	    codStr = "LST_CLOSESYM"; break;
+    case LST_SIMPLEID:	    codStr = "LST_SIMPLEID"; break;
+    case LST_MAPSYM:	    codStr = "MAPSYM"; break;
+    case LST_MARKERSYM:	    codStr = "LST_MARKERSYM"; break;
+    case LST_COMMENTSYM:    codStr = "COMMENTSYM"; break;
+    case LST_SIMPLEOP:	    codStr = "SIMPLEOP"; break;
+    case LST_COLON:         codStr = "LST_COLON"; break;
+    case LST_COMMA:	    codStr = "COMMA"; break;
+    case LST_LBRACKET:	    codStr = "LST_LBRACKET"; break;
+    case LST_LPAR:	    codStr = "LST_LPAR"; break;
+    case LST_RBRACKET:	    codStr = "LST_RBRACKET"; break;
+    case LST_RPAR:          codStr = "LST_RPAR"; break;
+    case LST_EQOP:          codStr = "LST_EQOP"; break;
+    case LST_WHITESPACE:    codStr = "WHITESPACE,"; break;
+    case LST_EOL:           codStr = "LST_EOL"; break;
+    case LST_elseTOKEN:     codStr = "elseTOKEN"; break;
+    case LST_ifTOKEN:       codStr = "ifTOKEN"; break;
+    case LST_thenTOKEN:     codStr = "thenTOKEN"; break;
+    case LST_BADTOKEN:      codStr = "*** BADTOKEN ***"; break;
+    case LEOFTOKEN: /* can't reach LEOFTOKEN easily */
+      codStr = "LEOFTOKEN"; break;
+    default:
+      codStr = "*** invalid token code ***";
+      break;
+    } /* end switch */
+  
+  /* only used for debugging */
+  printf ("%u:%u: Token Code (%u): %s",
+	  ltoken_getLine (tok), ltoken_getCol (tok), 
+	  ltoken_getCode (tok), codStr);
+  if (ltoken_getRawText (tok) != 0) 
+    {
+      printf (", Token String (%lu): %s\n", 
+	      ltoken_getRawText (tok), ltoken_getRawTextChars (tok));
+    }
+  else printf ("\n");
+}
+
+
+
+
diff --git a/src/signature.tab.h b/src/signature.tab.h
new file mode 100644
index 0000000..e70fb35
--- /dev/null
+++ b/src/signature.tab.h
@@ -0,0 +1,56 @@
+typedef union {
+  ltoken ltok;  /* a leaf is also an ltoken */
+  unsigned int count;
+  /*@only@*/  ltokenList ltokenList;
+  /*@only@*/  opFormNode opform;
+  /*@owned@*/ sigNode signature;
+  /*@only@*/  nameNode name;
+  /*@owned@*/ lslOp operator;
+  /*@only@*/  lslOpList operators;
+} YYSTYPE;
+#define	LST_SIMPLEID	257
+#define	LST_LOGICALOP	258
+#define	LST_EQOP	259
+#define	LST_SIMPLEOP	260
+#define	LST_MAPSYM	261
+#define	LST_FIELDMAPSYM	262
+#define	LST_MARKERSYM	263
+#define	LST_ifTOKEN	264
+#define	LST_thenTOKEN	265
+#define	LST_elseTOKEN	266
+#define	LST_LBRACKET	267
+#define	LST_RBRACKET	268
+#define	LST_SELECTSYM	269
+#define	LST_SEPSYM	270
+#define	LST_OPENSYM	271
+#define	LST_CLOSESYM	272
+#define	LST_COLON	273
+#define	LST_COMMA	274
+#define	LST_EOL	275
+#define	LST_COMMENTSYM	276
+#define	LST_WHITESPACE	277
+#define	LST_QUANTIFIERSYM	278
+#define	LST_EQUATIONSYM	279
+#define	LST_EQSEPSYM	280
+#define	LST_COMPOSESYM	281
+#define	LST_LPAR	282
+#define	LST_RPAR	283
+#define	LST_assertsTOKEN	284
+#define	LST_assumesTOKEN	285
+#define	LST_byTOKEN	286
+#define	LST_convertsTOKEN	287
+#define	LST_enumerationTOKEN	288
+#define	LST_equationsTOKEN	289
+#define	LST_exemptingTOKEN	290
+#define	LST_forTOKEN	291
+#define	LST_generatedTOKEN	292
+#define	LST_impliesTOKEN	293
+#define	LST_includesTOKEN	294
+#define	LST_introducesTOKEN	295
+#define	LST_ofTOKEN	296
+#define	LST_partitionedTOKEN	297
+#define	LST_traitTOKEN	298
+#define	LST_tupleTOKEN	299
+#define	LST_unionTOKEN	300
+#define	LST_BADTOKEN	301
+
diff --git a/src/signature.y b/src/signature.y
new file mode 100644
index 0000000..c272435
--- /dev/null
+++ b/src/signature.y
@@ -0,0 +1,322 @@
+/*;-*-C-*-;
+** Copyright (c) Massachusetts Institute of Technology 1994-1998.
+**          All Rights Reserved.
+**          Unpublished rights reserved under the copyright laws of
+**          the United States.
+**
+** THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+** OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+**
+** This code is distributed freely and may be used freely under the 
+** following conditions:
+**
+**     1. This notice may not be removed or altered.
+**
+**     2. Works derived from this code are not distributed for
+**        commercial gain without explicit permission from MIT 
+**        (for permission contact lclint-request@sds.lcs.mit.edu).
+*/
+/*
+**	 Copyright (c) Massachusetts Institute of Technology, 1993
+**	    All Rights Reserved.  Unpublished rights reserved
+**	    under the copyright laws of the United States.
+**++
+**  FACILITY:  LSLC
+**
+**  MODULE DESCRIPTION:
+**
+**      FILENAME: signature.y
+**
+**	PURPOSE:  bison grammar for LSL signatures.
+** 
+**  AUTHOR:
+**	Yang Meng Tan, Massachusetts Institute of Technology
+*/
+
+%{
+
+# include "bison.reset"
+
+# include 
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "lslparse.h"
+# include "signature.h"
+
+void lslerror (char *);
+/*@dependent@*/ /*@null@*/ lslOp importedlslOp;
+
+/*@-noparams@*/ /* Can't list params since YYSTYPE isn't defined yet. */
+static void yyprint (/*FILE *p_file, int p_type, YYSTYPE p_value */);
+/*@=noparams@*/
+
+# define YYPRINT(file, type, value) yyprint (file, type, value)
+
+# define YYDEBUG 1
+
+# include "bison.head"
+
+%}
+
+%pure_parser 
+
+/* CONVENTIONS:  Reserved words are in ALL CAPS (plus markerSym)
+		Characters appearing in the grammar are reserved:
+						% ( ) , : \ */
+
+/* Changes made
+   - added LBRACKET stuff in OpForm (missing in LSL)
+   - dif from LCL: open vs openSym, close vs closeSym
+   - yylval vs yylval.tok
+*/
+
+%union {
+  ltoken ltok;  /* a leaf is also an ltoken */
+  unsigned int count;
+  /*@only@*/  ltokenList ltokenList;
+  /*@only@*/  opFormNode opform;
+  /*@owned@*/ sigNode signature;
+  /*@only@*/  nameNode name;
+  /*@owned@*/ lslOp operator;
+  /*@only@*/  lslOpList operators;
+}
+
+%token  LST_SIMPLEID
+%token  LST_LOGICALOP         /* \implies, \and, \not, \or */
+%token  LST_EQOP              /* \eq, \neq, ==, != */
+%token  LST_SIMPLEOP          /* opSym - reserved */
+%token  LST_MAPSYM            /* LSL's -> */
+  /* FIELDMAPSYM = "\\field_arrow", only for LCL symtable import */
+%token  LST_FIELDMAPSYM       /* LCL's struct field operator -> */
+%token  LST_MARKERSYM         /* \marker, __ */
+%token  LST_ifTOKEN LST_thenTOKEN LST_elseTOKEN
+  /* different from LSL: separate LBRACKET from openSym and
+     RBRACKET from closeSym */
+%token  LST_LBRACKET LST_RBRACKET
+%token  LST_SELECTSYM         /* \select or . */
+%token  LST_SEPSYM LST_OPENSYM LST_CLOSESYM
+%token  LST_COLON             /* : */
+%token  LST_COMMA             /* , */
+%token  LST_EOL LST_COMMENTSYM LST_WHITESPACE 
+
+%token LST_WHITESPACE
+%token LST_QUANTIFIERSYM
+%token LST_EQUATIONSYM
+%token LST_EQSEPSYM
+%token LST_COMPOSESYM
+%token LST_LPAR
+%token LST_RPAR
+%token LST_assertsTOKEN
+%token LST_assumesTOKEN
+%token LST_byTOKEN
+%token LST_convertsTOKEN
+%token LST_enumerationTOKEN
+%token LST_equationsTOKEN
+%token LST_exemptingTOKEN
+%token LST_forTOKEN
+%token LST_generatedTOKEN 
+%token LST_impliesTOKEN 
+%token LST_includesTOKEN
+%token LST_introducesTOKEN
+%token LST_ofTOKEN
+%token LST_partitionedTOKEN
+%token LST_traitTOKEN
+%token LST_tupleTOKEN
+%token LST_unionTOKEN
+%token LST_BADTOKEN
+
+%type  anyOp separator sortId opId
+%type  middle placeList
+%type  domain sortList
+%type  opForm
+%type  signature
+%type  name 
+%type  operator
+%type  operatorList top
+
+%%
+
+top: operatorList { lslOpList_free ($1); } 
+ 
+operatorList: operator 
+              { lslOpList x = lslOpList_new ();
+		g_importedlslOp = $1;
+		lslOpList_add (x, $1);
+ 		$$ = x; }
+            | operatorList operator
+              { lslOpList_add ($1, $2);
+		$$ = $1; } 
+
+operator: name LST_COLON signature 
+          { $$ = makelslOpNode ($1, $3); }
+/* The next production is never used in the output of lsl -syms 
+          |  name
+          { $$ = makelslOpNode ($1, (sigNode)0); } */
+ 
+name: opId /* check for the case of if_then_else */
+      { $$ = makeNameNodeId ($1); } 
+    | opForm
+      { $$ = makeNameNodeForm ($1); }
+ 
+opForm 
+     : LST_ifTOKEN LST_MARKERSYM LST_thenTOKEN LST_MARKERSYM LST_elseTOKEN LST_MARKERSYM
+       { $$ = makeOpFormNode ($1, OPF_IF, opFormUnion_createMiddle (0), ltoken_undefined); }
+     | anyOp
+       { $$ = makeOpFormNode ($1, OPF_ANYOP, opFormUnion_createAnyOp ($1), ltoken_undefined); }
+     | LST_MARKERSYM anyOp
+       { $$ = makeOpFormNode ($1, OPF_MANYOP, opFormUnion_createAnyOp ($2), ltoken_undefined); }
+     | anyOp LST_MARKERSYM
+       { $$ = makeOpFormNode ($1, OPF_ANYOPM, opFormUnion_createAnyOp ($1), ltoken_undefined); }
+     | LST_MARKERSYM anyOp LST_MARKERSYM
+       { $$ = makeOpFormNode ($1, OPF_MANYOPM, opFormUnion_createAnyOp ($2), ltoken_undefined); }
+     | LST_OPENSYM middle LST_CLOSESYM
+       { $$ = makeOpFormNode ($1, OPF_MIDDLE, opFormUnion_createMiddle ($2), $3); }
+     | LST_MARKERSYM LST_OPENSYM middle LST_CLOSESYM
+       { $$ = makeOpFormNode ($2, OPF_MMIDDLE, opFormUnion_createMiddle ($3), $4); }
+     | LST_OPENSYM middle LST_CLOSESYM LST_MARKERSYM
+       { $$ = makeOpFormNode ($1, OPF_MIDDLEM, opFormUnion_createMiddle ($2), $3); }
+     | LST_MARKERSYM LST_OPENSYM middle LST_CLOSESYM LST_MARKERSYM
+       { $$ = makeOpFormNode ($2, OPF_MMIDDLEM, 
+			      opFormUnion_createMiddle ($3), $4); }
+     | LST_LBRACKET middle LST_RBRACKET
+       { $$ = makeOpFormNode ($1, OPF_BMIDDLE, 
+			      opFormUnion_createMiddle ($2), $3); }
+     | LST_MARKERSYM LST_LBRACKET middle LST_RBRACKET 
+       { $$ = makeOpFormNode ($2, OPF_BMMIDDLE, 
+			      opFormUnion_createMiddle ($3), $4); }
+     | LST_LBRACKET middle LST_RBRACKET LST_MARKERSYM
+     { $$ = makeOpFormNode ($1, OPF_BMIDDLEM, 
+			    opFormUnion_createMiddle ($2), $3); }
+     | LST_MARKERSYM LST_LBRACKET middle LST_RBRACKET LST_MARKERSYM
+     { $$ = makeOpFormNode ($2, OPF_BMMIDDLEM, 
+			    opFormUnion_createMiddle ($3), $4); }
+     | LST_SELECTSYM LST_SIMPLEID
+     { $$ = makeOpFormNode ($1, OPF_SELECT, 
+			    opFormUnion_createAnyOp ($2), ltoken_undefined); }
+     | LST_MARKERSYM LST_SELECTSYM LST_SIMPLEID
+     { $$ = makeOpFormNode ($1, OPF_MSELECT, 
+			    opFormUnion_createAnyOp ($3), ltoken_undefined); }
+        /* not in LSL, need FILEDMAPSYM to distinguish it from MAPSYM */ 
+        /* LST_FIELDMAPSYM = "\\field_arrow", only for LCL symtable import */
+     | LST_MARKERSYM LST_FIELDMAPSYM LST_SIMPLEID
+     { $$ = makeOpFormNode ($1, OPF_MMAP, 
+			    opFormUnion_createAnyOp ($3), ltoken_undefined); }
+			  
+
+anyOp: LST_SIMPLEOP
+       { $$ = $1; }
+     | LST_LOGICALOP
+       { $$ = $1; }
+     | LST_EQOP
+       { $$ = $1; }
+
+middle: /* empty */
+        { $$ = 0; }      
+      | placeList
+        { $$ = $1; }      
+ 
+placeList: LST_MARKERSYM
+           { $$ = 1; }      
+         | placeList separator LST_MARKERSYM
+           { $$ = $1 + 1; }      
+ 
+separator: LST_COMMA
+           { $$ = $1; }      
+         | LST_SEPSYM
+           { $$ = $1; }      
+
+signature: domain LST_MAPSYM sortId
+           { $$ = makesigNode ($2, $1, $3); }
+
+domain: /* empty */
+        { $$ = ltokenList_new (); } 
+      | sortList
+        { $$ = $1; }
+ 
+sortList: sortId
+          { $$ = ltokenList_singleton ($1); } 
+        | sortList LST_COMMA sortId
+          { $$ = ltokenList_push ($1, $3); }  
+
+sortId: LST_SIMPLEID 
+        { 
+	  $$ = $1; 
+	  ltoken_setText ($$, processTraitSortId (ltoken_getText ($1))); 
+	} 
+
+opId: LST_SIMPLEID
+      { $$ = $1; }
+%%
+
+# include "bison.reset"
+
+extern char *yytext;
+
+void lslerror (char *s) 
+{
+  lclplainerror 
+    (message ("An error has occurred in parsing LSL signature: %s", 
+	      cstring_fromChars (s)));
+}
+
+static void yyprint (FILE *file, int type, YYSTYPE value)
+{
+  fprintf (file, " (%u:%u type: %d; text: %s) ", 
+	   ltoken_getLine (value.ltok), 
+	   ltoken_getCol (value.ltok), 
+	   type, 
+	   ltoken_getRawTextChars (value.ltok));
+}
+
+extern void PrintToken (ltoken tok) {
+  char *codStr;
+  
+  switch (ltoken_getCode (tok)) 
+    {
+    case NOTTOKEN:          codStr = "*** NOTTOKEN ***"; break;
+    case LST_QUANTIFIERSYM: codStr = "QUANTIFIERSYM"; break;
+    case LST_LOGICALOP:     codStr = "LOGICALOP: "; break; 
+    case LST_SELECTSYM:     codStr = "LST_SELECTSYM"; break;
+    case LST_OPENSYM:	    codStr = "LST_OPENSYM"; break;
+    case LST_SEPSYM:	    codStr = "SEPSYM"; break;
+    case LST_CLOSESYM:	    codStr = "LST_CLOSESYM"; break;
+    case LST_SIMPLEID:	    codStr = "LST_SIMPLEID"; break;
+    case LST_MAPSYM:	    codStr = "MAPSYM"; break;
+    case LST_MARKERSYM:	    codStr = "LST_MARKERSYM"; break;
+    case LST_COMMENTSYM:    codStr = "COMMENTSYM"; break;
+    case LST_SIMPLEOP:	    codStr = "SIMPLEOP"; break;
+    case LST_COLON:         codStr = "LST_COLON"; break;
+    case LST_COMMA:	    codStr = "COMMA"; break;
+    case LST_LBRACKET:	    codStr = "LST_LBRACKET"; break;
+    case LST_LPAR:	    codStr = "LST_LPAR"; break;
+    case LST_RBRACKET:	    codStr = "LST_RBRACKET"; break;
+    case LST_RPAR:          codStr = "LST_RPAR"; break;
+    case LST_EQOP:          codStr = "LST_EQOP"; break;
+    case LST_WHITESPACE:    codStr = "WHITESPACE,"; break;
+    case LST_EOL:           codStr = "LST_EOL"; break;
+    case LST_elseTOKEN:     codStr = "elseTOKEN"; break;
+    case LST_ifTOKEN:       codStr = "ifTOKEN"; break;
+    case LST_thenTOKEN:     codStr = "thenTOKEN"; break;
+    case LST_BADTOKEN:      codStr = "*** BADTOKEN ***"; break;
+    case LEOFTOKEN: /* can't reach LEOFTOKEN easily */
+      codStr = "LEOFTOKEN"; break;
+    default:
+      codStr = "*** invalid token code ***";
+      break;
+    } /* end switch */
+  
+  /* only used for debugging */
+  printf ("%u:%u: Token Code (%u): %s",
+	  ltoken_getLine (tok), ltoken_getCol (tok), 
+	  ltoken_getCode (tok), codStr);
+  if (ltoken_getRawText (tok) != 0) 
+    {
+      printf (", Token String (%lu): %s\n", 
+	      ltoken_getRawText (tok), ltoken_getRawTextChars (tok));
+    }
+  else printf ("\n");
+}
+
+
+
+
diff --git a/src/sort.c b/src/sort.c
new file mode 100644
index 0000000..58b2161
--- /dev/null
+++ b/src/sort.c
@@ -0,0 +1,3159 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** sort.c
+**
+** sort abstraction
+**
+**      NOTE: The structure of this module follows a similar one
+**            used in the previous LCL checker.  However, all other
+**            details are quite different.
+**
+**  AUTHOR:
+**	Yang Meng Tan,
+**         Massachusetts Institute of Technology
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "llgrammar.h"
+# include "lclscan.h"
+
+/*@+ignorequals@*/
+
+static lsymbol newStructTag (void) /*@*/ ;
+static lsymbol newEnumTag (void) /*@*/ ;
+static lsymbol newUnionTag (void) /*@*/ ;
+
+/*@constant static int MAXBUFFLEN; @*/
+# define MAXBUFFLEN 1024
+
+/*@constant static int DELTA; @*/
+# define DELTA 100
+
+/*@constant static int NOSORTHANDLE; @*/
+# define NOSORTHANDLE 0
+
+/*@constant static int HOFSORTHANDLE; @*/
+# define HOFSORTHANDLE 1
+
+/* local routines */
+
+static void sort_addTupleMembers (sort p_tupleSort, sort p_strSort)  
+   /*@modifies internalState@*/ ;
+
+static bool sort_isNewEntry (sortNode p_s) /*@*/ ;  
+
+static sort sort_enterNew (/*@special@*/ sortNode p_s) 
+   /*@uses p_s.kind, p_s.name, p_s.members@*/
+   /*@releases p_s.members@*/
+   /*@modifies internalState@*/ ;
+
+static sort sort_enterGlobal (sortNode p_s) /*@modifies internalState@*/ ;
+
+static sort sort_enterNewForce (/*@special@*/ sortNode p_s) 
+   /*@uses p_s.kind, p_s.name, p_s.members@*/
+   /*@releases p_s.members@*/
+   /*@modifies internalState@*/ ;
+
+static void genPtrOps (sort p_baseSort, sort p_ptrSort, sort p_arraySort);
+static void genArrOps (sort p_baseSort, sort p_arraySort, int p_dim,
+		       sort p_vecSort);
+static void genVecOps (sort p_baseSort, sort p_vecSort, int p_dim);
+static void genTupleOps (sort p_tupleSort);
+static void genUnionOps (sort p_tupleSort);
+static void genStrOps (sort p_strSort, sort p_tupleSort);
+static void genEnumOps (sort p_enumSort);
+
+static void overloadPtrFcns (sort p_ptrSort);
+static void overloadIsSub (sort p_s, int p_dim);
+static void overloadSizeof (sort p_domainSort);
+
+/*@observer@*/ static cstring sort_unparseKind (sortKind p_k) /*@*/ ;
+
+static /*@observer@*/ cstring
+  sort_unparseKindName (sortNode p_s) /*@*/ ;
+
+static lsymbol
+  sortTag_toSymbol (char *p_kind, ltoken p_tagid, /*@out@*/ bool *p_isNew);
+
+static void 
+  overloadUnaryTok (/*@only@*/ nameNode p_nn, 
+		    sort p_domainSort, /*@only@*/ ltoken p_range);
+static void 
+  overloadUnary (/*@only@*/ nameNode p_nn, 
+		 sort p_domainSort, sort p_rangeSort);
+static void 
+  overloadBinary (/*@only@*/ nameNode p_nn, 
+		  sort p_s, /*@only@*/ ltoken p_dTok, sort p_rs);
+static /*@only@*/ nameNode makeFieldOp (lsymbol p_field);
+static /*@only@*/ nameNode makeArrowFieldOp (lsymbol p_field);
+
+# undef sp
+static lsymbol sp (lsymbol p_s1, lsymbol p_s2);
+static void sortError (ltoken p_t, sort p_oldsort, sortNode p_newnode);
+
+/*@-namechecks@*/
+sort sort_bool;
+sort sort_capBool;
+sort sort_int;
+sort sort_char;
+sort sort_float;
+sort sort_double;
+sort sort_cstring;
+/*@=namechecks@*/
+
+static sort sort_void;
+static sort char_obj_ptrSort;
+static sort char_obj_ArrSort;
+
+/* This is used to uniqueize sort names, for anonymous C types */
+static int sortUID = 1;
+
+static /*@only@*/ /*@null@*/ sortNode *sortTable = (sortNode *) 0;
+static int sortTableSize = 0;
+static int sortTableAlloc = 0;
+
+/* Important to keep sorts in some order because importing routines
+for sorts rely on this order to ensure that when we encounter a sort
+S1 that is based on sort S2, S2 is before S1 in the imported file. */
+
+static bool exporting = TRUE;
+
+static lsymbol underscoreSymbol;
+static /*@only@*/ ltoken intToken;
+
+static /*@owned@*/ nameNode arrayRefNameNode;
+static /*@owned@*/ nameNode ptr2arrayNameNode;
+static /*@owned@*/ nameNode deRefNameNode;
+static /*@owned@*/ nameNode nilNameNode;
+static /*@owned@*/ nameNode plusNameNode;
+static /*@owned@*/ nameNode minusNameNode;
+static /*@owned@*/ nameNode condNameNode;
+static /*@owned@*/ nameNode eqNameNode;
+static /*@owned@*/ nameNode neqNameNode;
+
+static sortNode noSort;
+
+static sortNode HOFSort =
+{ 
+  SRT_HOF, 
+  HOFSORTHANDLE,
+  lsymbol_undefined,
+  lsymbol_undefined,
+  FALSE, /* was lsymbolNULL */
+  NOSORTHANDLE,
+  NOSORTHANDLE,
+  smemberInfo_undefined,
+  FALSE,
+  FALSE,
+  FALSE, 
+  FALSE
+};
+
+static ob_mstring sortKindName[] =
+{
+  "FIRSTSORT", "NOSORT", "HOFSORT",
+  "PRIMITIVE", "SYNONYM", "POINTER", "OBJ", "ARRAY", "VECTOR",
+  "STRUCT", "TUPLE", "UNION", "UNIONVAL", "ENUM", "LASTSORT"
+} ;
+
+static void smemberInfo_free (/*@null@*/ /*@only@*/ smemberInfo *mem)
+{
+  sfree (mem);
+}
+
+static void sortNode_free (/*@special@*/ sortNode sn)
+   /*@uses sn.members@*/
+   /*@releases sn.members@*/
+{
+  smemberInfo_free (sn.members);
+}
+
+void
+sort_destroyMod (void)
+   /*@globals killed sortTable, killed arrayRefNameNode,
+              killed ptr2arrayNameNode,killed deRefNameNode,
+ 	      killed nilNameNode, killed plusNameNode,
+	      killed minusNameNode, killed condNameNode,
+	      killed eqNameNode, killed neqNameNode @*/
+{
+  if (sortTable != NULL)  
+    {
+      int i;
+
+      for (i = 0; i < sortTableSize; i++)
+	{
+	  sortNode_free (sortTable[i]);
+	}
+
+      nameNode_free (arrayRefNameNode);
+      nameNode_free (ptr2arrayNameNode);
+      nameNode_free (deRefNameNode);
+      nameNode_free (nilNameNode);
+      nameNode_free (plusNameNode);
+      nameNode_free (minusNameNode);
+      nameNode_free (condNameNode);
+      nameNode_free (eqNameNode);
+      nameNode_free (neqNameNode);
+
+      sfree (sortTable);
+      /*@-branchstate@*/
+    }
+} /*@=branchstate@*/
+
+sort
+sort_makeNoSort (void)
+{
+  return NOSORTHANDLE;
+}
+
+sort
+sort_makeHOFSort (sort base)
+{
+  sortNode outSort;
+  sort handle;
+
+  outSort.kind = SRT_HOF;
+  outSort.name = cstring_toSymbol (message ("_HOF_sort_%d", sortTableSize));
+  outSort.tag = lsymbol_undefined;
+  outSort.baseSort = base;
+  outSort.objSort = NOSORTHANDLE;
+  outSort.members = smemberInfo_undefined;
+  outSort.export = exporting;
+  outSort.imported = context_inImport ();
+  outSort.mutable = FALSE;
+  outSort.abstract = FALSE;
+
+  llassert (sortTable != NULL);
+
+  outSort.handle = handle = sortTableSize;
+  sortTable[handle] = outSort;
+
+  sortTableSize++;
+  return handle;
+}
+
+static sort
+sort_construct (lsymbol name, sortKind kind, sort baseSort,
+		lsymbol tagName,
+		bool mut, sort objSort, /*@null@*/ smemberInfo *members)
+{
+  sortNode outSort;
+  sort handle;
+
+  handle = sort_lookupName (name);
+
+  outSort.kind = kind;
+  outSort.name = name;
+  outSort.tag = tagName;
+  outSort.realtag = TRUE; 
+  outSort.baseSort = baseSort;
+  outSort.objSort = objSort;
+  outSort.members = members;
+  outSort.mutable = mut;
+  outSort.export = exporting;
+  outSort.imported = context_inImport ();
+  outSort.abstract = FALSE;
+  outSort.handle = handle;
+
+  if (handle == NOSORTHANDLE)
+    {
+      outSort.handle = handle = sort_enterNew (outSort);
+      return handle;
+    }
+  else
+    {
+      llassert (sortTable != NULL);
+
+      if (sortTable[handle].kind != kind)
+	{
+	  sortError (ltoken_undefined, handle, outSort);
+	  smemberInfo_free (outSort.members);
+
+	  return handle;
+	}
+      else
+	{
+	  /* evs --- added 11 Mar 1994
+	  ** the new entry should supercede the old one, since
+          ** it could be a forward reference to a struct, etc.
+          */
+
+	  sortTable[handle] = outSort;
+	  return handle;
+	}
+    }
+}
+
+static sort
+  sort_constructAbstract (lsymbol name, bool mut, sort baseSort)
+{
+  sortNode outSort;
+  sortKind kind;
+  sort handle;
+
+  if (mut)
+    kind = SRT_OBJ;
+  else
+    kind = SRT_PRIM;
+
+  handle = sort_lookupName (name);
+  outSort.kind = kind;
+  outSort.name = name;
+  outSort.tag = lsymbol_undefined;
+  outSort.baseSort = baseSort;
+  outSort.objSort = NOSORTHANDLE;
+  outSort.members = smemberInfo_undefined;
+  outSort.mutable = mut;
+  outSort.export = exporting;
+  outSort.imported = context_inImport ();
+  outSort.abstract = TRUE;
+  outSort.handle = handle;
+
+  if (handle == NOSORTHANDLE)
+    {
+      outSort.handle = handle = sort_enterNew (outSort);
+      /* do not make sort operators. */
+    }
+  else
+    {
+      llassert (sortTable != NULL);
+
+      if (sortTable[handle].kind != kind)
+	{
+	  sortError (ltoken_undefined, handle, outSort);
+	}
+
+      smemberInfo_free (outSort.members);
+    }
+
+  return handle;
+}
+
+sort
+sort_makeSort (/*@unused@*/ ltoken t, lsymbol n)
+{
+  /*
+  ** Expects n to be a new sort.
+  ** Generate a sort with the given name.  Useful for LSL sorts. 
+  */
+
+  sort handle = sort_lookupName (n);
+
+  if (handle == NOSORTHANDLE)
+    {
+      sortNode outSort;
+
+      outSort.handle = handle;      
+      outSort.kind = SRT_PRIM;
+      outSort.name = n;
+      outSort.tag = lsymbol_undefined;
+      outSort.baseSort = NOSORTHANDLE;
+      outSort.objSort = NOSORTHANDLE;
+      outSort.members = smemberInfo_undefined;
+      outSort.export = exporting;
+      outSort.mutable = FALSE;
+      outSort.imported = context_inImport ();
+      outSort.abstract = FALSE;
+
+      /* Put into sort table, sort_enter checks for duplicates. */
+      outSort.handle = handle = sort_enterNew (outSort);
+    }
+  else
+    {
+      /* don't override old info */
+     ;
+    }
+
+  return handle;
+}
+
+static sort
+sort_makeSortNoOps (/*@unused@*/ ltoken t, lsymbol n) /*@modifies internalState@*/ 
+{
+  sort handle;
+  
+  handle = sort_lookupName (n);
+
+  if (handle == NOSORTHANDLE)
+    {
+      sortNode outSort;
+
+      outSort.handle = handle;
+      outSort.kind = SRT_PRIM;
+      outSort.name = n;
+      outSort.tag = lsymbol_undefined;
+      outSort.baseSort = NOSORTHANDLE;
+      outSort.objSort = NOSORTHANDLE;
+      outSort.members = smemberInfo_undefined;
+      outSort.export = exporting;
+      outSort.mutable = FALSE;
+      outSort.imported = context_inImport ();
+      outSort.abstract = FALSE;
+      /* Put into sort table, sort_enter checks for duplicates. */
+      outSort.handle = handle = sort_enterNew (outSort);
+    }				/* don't override old info */
+
+  return handle;
+}
+
+static sort
+sort_makeLiteralSort (ltoken t, lsymbol n) 
+   /*@modifies internalState@*/
+{
+  /*
+  ** Like sort_makeSort, in addition, generate sizeof operator 
+  ** t not currently used, may be useful for generating error msgs later 
+  ** Also useful for abstract types, need sizeof operator.
+  */
+
+  sort handle = sort_makeSort (t, n);
+
+  overloadSizeof (handle);
+  return handle;
+}
+
+sort
+sort_makeSyn (ltoken t, sort s, lsymbol n)
+{
+  /* make a synonym sort with name n that is == to sort s */
+  /* expect n to be a new sort name */
+  sortNode outSort;
+  sort handle;
+  /* must not clash with any LSL sorts */
+  lsymbol newname = sp (underscoreSymbol, n);
+  
+  if (n == lsymbol_undefined)
+    {
+      llbuglit ("sort_makeSyn: synonym must have name");
+    }
+
+  handle = sort_lookupName (newname);
+
+  outSort.kind = SRT_SYN;
+  outSort.name = newname;
+  outSort.baseSort = s;
+  outSort.objSort = NOSORTHANDLE;
+  /* info is not duplicated */
+  outSort.tag = lsymbol_undefined;
+  outSort.members = smemberInfo_undefined;
+  outSort.export = exporting;
+  outSort.mutable = FALSE;
+  outSort.imported = context_inImport ();
+  outSort.abstract = FALSE;
+  outSort.handle = handle;
+
+  if (handle == NOSORTHANDLE)
+    {
+      outSort.handle = handle = sort_enterNew (outSort);
+      /* No operators to generate for synonyms */
+    }
+  else
+    {
+      llassert (sortTable != NULL);
+      
+      if (sortTable[handle].kind != SRT_SYN)
+	{
+	  sortError (t, handle, outSort);
+	}
+
+      smemberInfo_free (outSort.members);
+    }
+
+  return handle;
+}
+
+sort
+sort_makeFormal (sort insort)
+{
+  sortNode s;
+  sort sor, handle;
+
+  sor = sort_getUnderlying (insort);
+  handle = sor;
+  s = sort_lookup (sor);
+
+  switch (s.kind)
+    {
+    case SRT_STRUCT:
+      handle = sort_makeTuple (ltoken_undefined, sor);
+      break;
+    case SRT_UNION:
+      handle = sort_makeUnionVal (ltoken_undefined, sor);
+      break;
+    default:
+      break;
+    }
+
+  return handle;
+}
+
+sort
+sort_makeGlobal (sort insort)
+{
+  /* Make a Obj if not an array or a struct */
+  sortNode s;
+  sort sor, handle;
+  sor = sort_getUnderlying (insort);
+  handle = sor;
+  s = sort_lookup (sor);
+
+  switch (s.kind)
+    {
+    case SRT_ARRAY:
+    case SRT_STRUCT:
+    case SRT_UNION:
+    case SRT_HOF:
+    case SRT_NONE:
+      break;
+    case SRT_VECTOR:
+    case SRT_TUPLE:
+    case SRT_UNIONVAL:
+      llcontbuglit ("sort_makeGlobal: can't make vectors, tuples, or unionvals global");
+      break;
+    default:
+      handle = sort_makeObj (sor);
+      break;
+    }
+  return handle;
+}
+
+sort
+sort_makeObj (sort sor)
+{
+  sortNode baseSortNode, outSort;
+  sort baseSort, handle;
+  lsymbol name;
+
+ /* skip the synonym sort */
+  baseSort = sort_getUnderlying (sor);
+  baseSortNode = sort_quietLookup (baseSort);
+  switch (baseSortNode.kind)
+    {
+    case SRT_HOF:
+    case SRT_NONE:
+      return baseSort;
+    case SRT_VECTOR:
+      if (baseSortNode.objSort != 0)
+	return baseSortNode.objSort;
+      else			/* must have well-defined objSort field */
+	{
+	  llcontbuglit ("sort_makeObj: Inconsistent vector reps:invalid objSort field");
+	  return baseSort;
+	}
+    case SRT_TUPLE:
+    case SRT_UNIONVAL:
+     /* need to map *_Struct_Tuple to *_Struct and *_Union_UnionVal to
+      *_Union, according to sort naming conventions */
+      if (baseSortNode.baseSort != NOSORTHANDLE)
+       /* for tuples and unionvals, baseSort field keeps the map from
+          value sort to obj sort. */
+	return baseSortNode.baseSort;
+      else			/* valid tuples and unionvals must have baseSort fields */
+	{
+	  llcontbuglit ("sort_makeObj: Inconsistent tuples or unionvals reps: invalid baseSort field");
+	  return baseSort;
+	}
+    default:
+      name = sp (sp (underscoreSymbol, sort_getLsymbol (baseSort)),
+		 lsymbol_fromChars ("_Obj"));
+      handle = sort_lookupName (name);
+
+      outSort.kind = SRT_OBJ;
+      /* must not clash with any LSL sorts */
+      outSort.name = name;
+      outSort.tag = lsymbol_undefined;
+      outSort.baseSort = baseSort;
+      outSort.objSort = NOSORTHANDLE;
+      outSort.members = smemberInfo_undefined;
+      outSort.mutable = TRUE;
+      outSort.export = exporting;
+      outSort.abstract = FALSE;
+      outSort.handle = handle;
+      outSort.imported = TRUE;
+
+      if (handle == NOSORTHANDLE)
+	{
+	  if (sort_isNewEntry (outSort))
+	    {
+	      outSort.handle = handle = sort_enterNew (outSort);
+	    }
+	  else
+	    {
+	      outSort.handle = handle = sort_enterNew (outSort);
+	    }
+	}
+      else
+	{
+	  llassert (sortTable != NULL);
+
+	  if (sortTable[handle].kind != SRT_OBJ)
+	    {
+	      sortError (ltoken_undefined, handle, outSort);
+	    }
+
+	  smemberInfo_free (outSort.members);
+	}
+
+      return handle;
+    }
+}
+
+sort
+sort_makePtr (ltoken t, sort baseSort)
+{
+  sortNode s, outSort;
+  sort handle, arrayHandle;
+  lsymbol name;
+
+  s = sort_lookup (baseSort);
+
+  if (s.kind == SRT_HOF)
+    {
+      return baseSort;
+    }
+  if (s.kind == SRT_NONE)
+    {
+      return baseSort;
+    }
+
+  if (s.kind != SRT_ARRAY && s.kind != SRT_STRUCT &&
+      s.kind != SRT_UNION)
+    /* && s.kind != SRT_OBJ) */
+    /* base is not an SRT_ARRAY, struct or union.  Need to insert a obj. */
+    baseSort = sort_makeObj (baseSort);
+  
+  name = sp (sp (underscoreSymbol, sort_getLsymbol (baseSort)),
+	     lsymbol_fromChars ("_Ptr"));
+  handle = sort_lookupName (name);
+  
+  outSort.kind = SRT_PTR;
+  outSort.name = name;
+  outSort.tag = lsymbol_undefined;
+  outSort.baseSort = baseSort;
+  outSort.objSort = NOSORTHANDLE;
+  outSort.members = smemberInfo_undefined;
+  outSort.mutable = FALSE;
+  outSort.export = exporting;
+  outSort.imported = context_inImport ();
+  outSort.abstract = FALSE;
+  outSort.handle = handle;
+  
+  if (handle == NOSORTHANDLE)
+    {
+      if (sort_isNewEntry (outSort))
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+	  arrayHandle = sort_makeArr (t, baseSort);
+	  genPtrOps (baseSort, handle, arrayHandle);
+	}
+      else
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+	}
+    }
+  else
+    {
+      llassert (sortTable != NULL);
+
+      if (sortTable[handle].kind != SRT_PTR)
+	{
+	  sortError (t, handle, outSort);
+	}
+      smemberInfo_free (outSort.members);
+    }
+  return handle;
+}
+
+sort
+sort_makePtrN (sort s, int pointers)
+{
+  llassert (pointers >= 0);
+
+  if (pointers == 0)
+    {
+      return s;
+    }
+  else
+    {
+      return sort_makePtrN (sort_makePtr (ltoken_undefined, s), 
+			    pointers - 1);
+    }
+}
+
+sort
+sort_makeArr (ltoken t, sort baseSort)
+{
+  sortNode s, outSort, old;
+  sort handle, vecHandle;
+  int dim;
+  lsymbol name;
+
+  s = sort_lookup (baseSort);
+
+  if (s.kind == SRT_HOF)
+    return baseSort;
+  if (s.kind == SRT_NONE)
+    return baseSort;
+
+  if (s.kind != SRT_ARRAY && s.kind != SRT_STRUCT &&
+      s.kind != SRT_UNION && s.kind != SRT_OBJ)
+   /* base is not an array, struct or obj.  Need to insert a Obj. */
+    baseSort = sort_makeObj (baseSort);
+
+  name = sp (sp (underscoreSymbol, sort_getLsymbol (baseSort)),
+	     lsymbol_fromChars ("_Arr"));
+  handle = sort_lookupName (name);
+
+ /* must not clash with any LSL sorts */
+  outSort.name = name;
+  outSort.kind = SRT_ARRAY;
+  outSort.baseSort = baseSort;
+  outSort.objSort = NOSORTHANDLE;
+  outSort.members = smemberInfo_undefined;
+  outSort.mutable = TRUE;
+  outSort.export = exporting;
+  outSort.imported = context_inImport ();
+  outSort.abstract = FALSE;
+  outSort.handle = handle;
+  
+  if (handle == NOSORTHANDLE)
+    {
+      if (sort_isNewEntry (outSort))
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+
+	  for (old = outSort, dim = 0;
+	       old.kind == SRT_ARRAY;
+	       dim++, old = sort_lookup (old.baseSort))
+	    {
+	      ;
+	    }
+
+	  vecHandle = sort_makeVec (t, handle);
+	  genArrOps (baseSort, handle, dim, vecHandle);
+	}
+      else
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+	}
+    }
+  else
+    {
+      llassert (sortTable != NULL);
+
+      if (sortTable[handle].kind != SRT_ARRAY)
+	{
+	  sortError (t, handle, outSort);
+	}
+
+      smemberInfo_free (outSort.members);
+    }
+
+  return handle;
+}
+
+sort
+sort_makeVec (ltoken t, sort arraySort)
+{
+  sortNode s, outSort, old;
+  sort baseSort, handle, elementSort;
+  int dim;			/* array dimension count. */
+  lsymbol name;
+
+  s = sort_lookup (arraySort);
+
+  if (s.kind == SRT_HOF)
+    return arraySort;
+  if (s.kind == SRT_NONE)
+    return arraySort;
+
+  if (s.kind != SRT_ARRAY)
+    {
+      llbug (message ("sort_makeVec: only arrays can become vectors: given sort is %s",
+		      sort_unparseKind (s.kind)));
+    }
+
+  if (s.baseSort == NOSORTHANDLE)
+    llbuglit ("sort_makeVec: arrays must have base (element) sort");
+
+ /* Vectors return "values", so make array elements values. */
+
+  baseSort = s.baseSort;
+  elementSort = sort_makeVal (baseSort);
+
+  name = sp (sp (underscoreSymbol, sort_getLsymbol (elementSort)),
+	     lsymbol_fromChars ("_Vec"));
+  handle = sort_lookupName (name);
+
+  outSort.baseSort = elementSort;
+  outSort.name = name;
+  outSort.objSort = arraySort;
+  outSort.kind = SRT_VECTOR;
+  outSort.members = smemberInfo_undefined;
+  outSort.mutable = FALSE;
+  outSort.export = exporting;
+  outSort.imported = context_inImport ();
+  outSort.abstract = FALSE;
+  outSort.handle = handle;
+
+  if (handle == NOSORTHANDLE)
+    {
+      if (sort_isNewEntry (outSort))
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+
+	  for (old = outSort, dim = 0;
+	       old.kind == SRT_VECTOR;
+	       dim++, old = sort_lookup (old.baseSort))
+	    {
+	      ;
+	    }
+
+	  genVecOps (elementSort, handle, dim);
+	}
+      else
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+	}
+    }
+  else
+    {
+      llassert (sortTable != NULL);
+
+      if (sortTable[handle].kind != SRT_VECTOR)
+	{
+	  sortError (t, handle, outSort);
+	}
+
+      smemberInfo_free (outSort.members);
+    }
+
+  return handle;
+}
+
+sort
+sort_makeVal (sort sor)
+{
+  sort retSort = sor;
+  sortNode rsn, s;
+
+  llassert (sortTable != NULL);
+  s = sort_quietLookup (sor);
+
+  switch (s.kind)
+    {
+    case SRT_PRIM:
+    case SRT_ENUM:
+    case SRT_PTR:
+    case SRT_TUPLE:
+    case SRT_UNIONVAL:
+    case SRT_VECTOR:
+    case SRT_HOF:
+    case SRT_NONE:
+     /* Do nothing for basic types and pointers. */
+      retSort = sor;
+      break;
+    case SRT_SYN:
+      return sort_makeVal (sortTable[sor].baseSort);
+    case SRT_OBJ:
+     /* Strip out the last Obj's */
+      if (s.baseSort == NOSORTHANDLE)
+	{
+	  llbuglit ("sort_makeVal: expecting a base sort for Obj");
+	}
+      retSort = s.baseSort;
+      break;
+    case SRT_ARRAY:
+      retSort = sort_makeVec (ltoken_undefined, sor);
+      break;
+    case SRT_STRUCT:
+      retSort = sort_makeTuple (ltoken_undefined, sor);
+      break;
+    case SRT_UNION:
+      retSort = sort_makeUnionVal (ltoken_undefined, sor);
+      break;
+    default:
+      llbuglit ("sort_makeVal: invalid sort kind");
+    }
+  rsn = sort_quietLookup (retSort);
+  if (rsn.kind == SRT_NONE)
+    {
+      llfatalbug (message ("sort_makeVal: invalid return sort kind: %d", (int)rsn.kind));
+    }
+  return retSort;
+}
+
+sort
+sort_makeImmutable (ltoken t, lsymbol name)
+{
+  sortNode outSort;
+  sort handle;
+
+  handle = sort_lookupName (name);
+
+  outSort.kind = SRT_PRIM;
+  outSort.name = name;
+  outSort.baseSort = NOSORTHANDLE;
+  outSort.objSort = NOSORTHANDLE;
+  outSort.members = smemberInfo_undefined;
+  outSort.export = exporting;
+  outSort.mutable = FALSE;
+  outSort.imported = context_inImport ();
+  outSort.abstract = TRUE;
+  outSort.handle = handle;
+
+  if (handle == NOSORTHANDLE)
+    {
+      outSort.handle = handle = sort_enterNew (outSort);
+      overloadSizeof (handle);
+    }
+  else
+    {				/* complain */
+      llassert (sortTable != NULL);
+
+      if ((sortTable[handle].kind != SRT_PRIM) &&
+	  (sortTable[handle].abstract) &&
+	  (!sortTable[handle].mutable))
+	{
+	  sortError (t, handle, outSort);
+	}
+
+      smemberInfo_free (outSort.members);
+    }
+
+  return handle;
+}
+
+sort
+sort_makeMutable (ltoken t, lsymbol name)
+{
+  sort immutable_old, handle, baseSort;
+  lsymbol objName;
+
+  immutable_old = sort_lookupName (name);
+
+ /* First generate the value sort */
+  baseSort = sort_makeImmutable (t, name);
+
+  llassert (sortTable != NULL);
+
+  /* to prevent duplicate error messages */
+  if (immutable_old != NOSORTHANDLE &&
+      (sortTable[baseSort].kind != SRT_PRIM) &&
+      (sortTable[baseSort].abstract) &&
+      (!sortTable[baseSort].mutable))
+    {
+     /* already complained */
+      handle = NOSORTHANDLE;
+    }
+  else
+    {				/* sort_makeImmutable must have succeeded */
+      sortNode outSort;
+
+     /* must not clash with any LSL sorts */
+      objName = sp (sp (underscoreSymbol, name),
+		    lsymbol_fromChars ("_Obj"));
+      handle = sort_lookupName (objName);
+
+      outSort.kind = SRT_OBJ;
+      outSort.name = objName;
+      outSort.tag = lsymbol_undefined;
+      outSort.baseSort = baseSort;
+      outSort.objSort = NOSORTHANDLE;
+      outSort.members = smemberInfo_undefined;
+      outSort.mutable = TRUE;
+      outSort.export = exporting;
+      outSort.imported = context_inImport ();
+      outSort.abstract = TRUE;
+      outSort.handle = handle;
+
+      if (handle == NOSORTHANDLE)
+	{
+	  if (sort_isNewEntry (outSort))
+	    {
+	      outSort.handle = handle = sort_enterNew (outSort);
+	    }
+	  else
+	    {
+	      handle = sort_enterNew (outSort);
+	    }
+	}
+      else 
+	{
+	  llassert (sortTable != NULL);
+
+	  if ((sortTable[handle].kind != SRT_OBJ) 
+	      && sortTable[handle].abstract
+	      && sortTable[handle].mutable)
+	    {
+	      sortError (t, handle, outSort);
+	    }
+
+	  smemberInfo_free (outSort.members);
+	}
+    }
+  return handle;
+}
+
+sort
+sort_makeStr (ltoken opttagid)
+{
+  sortNode outSort;
+  sort handle;
+  bool isNewTag;
+  lsymbol name;
+
+  /* must not clash with any LSL sorts, tag2sortname adds "_" prefix */
+  /* isNewTag true means that the name generated is new */
+
+  if (ltoken_isUndefined (opttagid))
+    {
+      opttagid = ltoken_create (simpleId, newStructTag ());
+
+      outSort.realtag = FALSE;
+    }
+  else
+    {
+      outSort.realtag = TRUE;
+    }
+  
+  name = sortTag_toSymbol ("Struct", opttagid, &isNewTag);
+  
+  llassert (sortTable != NULL);
+  handle = sort_lookupName (name);
+  outSort.name = name;
+  outSort.kind = SRT_STRUCT;
+  outSort.tag = ltoken_getText (opttagid);
+  outSort.baseSort = NOSORTHANDLE;
+  outSort.objSort = NOSORTHANDLE;
+  outSort.members = smemberInfo_undefined;
+  outSort.export = exporting;
+  outSort.mutable = TRUE;
+  outSort.imported = context_inImport ();
+  outSort.abstract = FALSE;
+  outSort.handle = handle;
+
+  if (handle == NOSORTHANDLE)
+    {
+      if (sort_isNewEntry (outSort))
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+	}
+      else
+	{
+	  outSort.handle = handle = sort_enterNewForce (outSort);
+	}
+    }
+  else 
+    {
+      if (sortTable[handle].kind != SRT_STRUCT)
+	{
+	  sortError (opttagid, handle, outSort);
+	}
+
+      smemberInfo_free (outSort.members);
+    }
+
+  return handle;
+}
+
+bool
+sort_updateStr (sort strSort, /*@only@*/ smemberInfo *info)
+{
+  /* expect strSort to be in sort table but not yet filled in */
+  /* return TRUE if it is "new" */
+  sort tupleSort;
+  sortNode sn;
+  
+  llassert (sortTable != NULL);
+  sn = sort_lookup (strSort);
+
+  if (sn.members == (smemberInfo *) 0)
+    {
+      sortTable[strSort].members = info;
+      tupleSort = sort_makeTuple (ltoken_undefined, strSort);
+      genStrOps (strSort, tupleSort);
+      return TRUE;
+    }
+  else
+    {
+      smemberInfo_free (info);
+      return FALSE;
+    }
+}
+
+sort
+sort_makeTuple (ltoken t, sort strSort)
+{
+  sort handle;
+  sortNode outSort, s = sort_lookup (strSort);
+  lsymbol name;
+
+  if (s.kind != SRT_STRUCT)
+    {
+      llfatalbug (message ("sort_makeTuple: Only structs can become tuples: given sort is %s",
+			   sort_unparseKind (s.kind)));
+    }
+
+  name = sp (s.name, lsymbol_fromChars ("_Tuple"));
+  llassert (sortTable != NULL);
+  handle = sort_lookupName (name);
+
+  outSort.kind = SRT_TUPLE;
+  outSort.name = name;
+  outSort.tag = s.tag;
+  outSort.realtag = s.realtag;
+  outSort.baseSort = strSort;
+  outSort.objSort = NOSORTHANDLE;
+  outSort.members = smemberInfo_undefined;
+  outSort.export = exporting;
+  outSort.abstract = FALSE;
+  outSort.imported = context_inImport ();
+  outSort.mutable = FALSE;
+  outSort.handle = handle;
+
+  if (handle == NOSORTHANDLE)
+    {
+      if (sort_isNewEntry (outSort))
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+
+	  sort_addTupleMembers (handle, strSort);
+	  genTupleOps (handle);
+	}
+      else
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+	}
+    }
+  else 
+    {
+      if (sortTable[handle].kind != SRT_TUPLE)
+	{
+	  sortError (t, handle, outSort);
+	}
+
+      smemberInfo_free (outSort.members);
+    }
+
+  return handle;
+}
+
+static void
+sort_addTupleMembers (sort tupleSort, sort strSort)
+{
+  smemberInfo *mem, *tail = smemberInfo_undefined;
+  smemberInfo *top = smemberInfo_undefined;
+  smemberInfo *newinfo;
+  
+  /* make sure it works for empty smemberInfo */
+  
+  llassert (sortTable != NULL);
+ 
+ for (mem = sortTable[strSort].members;
+       mem != smemberInfo_undefined; mem = mem->next)
+    {
+      newinfo = (smemberInfo *) dmalloc (sizeof (*newinfo));
+      newinfo->name = mem->name;
+      newinfo->sort = sort_makeVal (mem->sort);
+      newinfo->next = smemberInfo_undefined;
+
+      if (top == smemberInfo_undefined)
+	{			/* start of iteration */
+	  top = newinfo;
+	  tail = newinfo;
+	}
+      else
+	{
+	  llassert (tail != smemberInfo_undefined);
+
+	  tail->next = newinfo;
+	  tail = newinfo;
+	  /*@-branchstate@*/ /* tail is dependent */
+	} 
+      /*@=branchstate@*/
+    }
+
+  sortTable[tupleSort].members = top;
+}
+
+static 
+void genTupleOps (sort tupleSort)
+{
+  ltoken range, dom;
+  sort fieldsort;
+  smemberInfo *m;
+  unsigned int memCount;
+  ltokenList domain = ltokenList_new ();
+  sigNode signature;
+  opFormUnion u;
+  opFormNode opform;
+  nameNode nn;
+
+  memCount = 0;
+  range = ltoken_createType (simpleId, SID_SORT, sort_getLsymbol (tupleSort));
+
+  llassert (sortTable != NULL);
+  for (m = sortTable[tupleSort].members;
+       m != smemberInfo_undefined; m = m->next)
+    {
+      fieldsort = sort_makeVal (m->sort);
+      overloadUnary (makeFieldOp (m->name), tupleSort, fieldsort);
+
+      dom = ltoken_createType (simpleId, SID_SORT,
+			       sort_getLsymbol (fieldsort));
+      ltokenList_addh (domain, dom);
+      memCount++;
+    }
+
+  /* For tuples only: [__, ...]: memSorts, ... -> tupleSort */
+  signature = makesigNode (ltoken_undefined, domain, range);
+  u.middle = memCount;
+
+  opform = makeOpFormNode (ltoken_copy (ltoken_lbracked),
+			   OPF_BMIDDLE, u, ltoken_copy (ltoken_rbracket));
+
+  nn = makeNameNodeForm (opform);
+  symtable_enterOp (g_symtab, nn, signature);
+  
+  /*
+  ** should not be able to take sizeof (struct^) ...
+  */
+}
+
+static 
+void genUnionOps (sort tupleSort)
+{
+ /* like genTupleOps but no constructor [ ...]: -> unionSort */
+  smemberInfo *m;
+  sort sort;
+
+  llassert (sortTable != NULL);
+  for (m = sortTable[tupleSort].members;
+       m != smemberInfo_undefined; m = m->next)
+    {
+     /* Generate __.memName: strSort ->memSortObj */
+      overloadUnary (makeFieldOp (m->name), tupleSort, m->sort);
+     /*    printf ("making __.%s: %s -> %s\n", lsymbol_toChars (m->name),
+                sort_getName (tupleSort), sort_getName (m->sort)); */
+     /* __->memName : Union_Ptr -> memSortObj */
+      sort = sort_makePtr (ltoken_undefined, tupleSort);
+      overloadUnary (makeArrowFieldOp (m->name), sort, m->sort);
+     /*    printf ("making __->%s: %s -> %s\n", lsymbol_toChars (m->name),
+                sort_getName (sort), sort_getName (m->sort)); */
+    }
+}
+
+static 
+void genStrOps (sort strSort, /*@unused@*/ sort tupleSort)
+{
+  smemberInfo *m;
+  sort sort;
+  
+  llassert (sortTable != NULL);
+  for (m = sortTable[strSort].members;
+       m != smemberInfo_undefined; m = m->next)
+    {
+     /* Generate __.memName: strSort ->memSortObj */
+      overloadUnary (makeFieldOp (m->name), strSort, m->sort);
+      /*    printf ("making __.%s: %s -> %s\n", lsymbol_toChars (m->name),
+	    sort_getName (strSort), sort_getName (m->sort)); */
+      /* __->memName : Struct_Ptr -> memSortObj */
+      sort = sort_makePtr (ltoken_undefined, strSort);
+      overloadUnary (makeArrowFieldOp (m->name), sort, m->sort);
+      /*    printf ("making __->%s: %s -> %s\n", lsymbol_toChars (m->name),
+	    sort_getName (sort), sort_getName (m->sort)); */
+    }
+  /* Generate fresh, trashed, modifies, unchanged: struct/union -> bool */
+  /* Generate __any, __pre, __post: nStruct -> nTuple */
+  /* Generate sizeof: strSort -> int */
+  /* overloadStateFcns (strSort, tupleSort); */
+}
+
+sort
+sort_makeUnion (ltoken opttagid)
+{
+  sortNode outSort;
+  sort handle;
+  bool isNewTag; 
+  lsymbol name;
+
+  /* must not clash with any LSL sorts, tag2sortname adds "_" prefix */
+  /* isNewTag true means that the name generated is new */
+
+  if (ltoken_isUndefined (opttagid))
+    {
+      opttagid = ltoken_create (simpleId, newUnionTag ());
+      outSort.realtag = FALSE;
+    }
+  else
+    outSort.realtag = TRUE;
+
+  llassert (sortTable != NULL);
+  name = sortTag_toSymbol ("Union", opttagid, &isNewTag);
+  handle = sort_lookupName (name);
+  outSort.name = name;
+  outSort.kind = SRT_UNION;
+  outSort.tag = ltoken_getText (opttagid);
+  outSort.baseSort = NOSORTHANDLE;
+  outSort.objSort = NOSORTHANDLE;
+  outSort.members = smemberInfo_undefined;
+  outSort.export = exporting;
+  outSort.mutable = TRUE;
+  outSort.imported = context_inImport ();
+  outSort.abstract = FALSE;
+  outSort.handle = handle;
+  
+  if (handle == NOSORTHANDLE)
+    {
+      if (sort_isNewEntry (outSort))
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+	}
+      else
+	{
+	  outSort.handle = handle = sort_enterNewForce (outSort);
+	}
+    }
+  else 
+    {
+      if (sortTable[handle].kind != SRT_UNION)
+	{
+	  sortError (opttagid, handle, outSort);
+	}
+
+      smemberInfo_free (outSort.members);
+    }
+
+  return handle;
+}
+
+bool
+sort_updateUnion (sort unionSort, /*@only@*/ smemberInfo *info)
+{
+ /* expect unionSort to be in sort table but not yet filled in */
+ /* return TRUE if it is "new" */
+  sort uValSort;
+  sortNode sn;
+
+  llassert (sortTable != NULL);
+
+  sn = sort_lookup (unionSort);
+
+  if (sn.members == (smemberInfo *) 0)
+    {
+      sortTable[unionSort].members = info;
+      uValSort = sort_makeUnionVal (ltoken_undefined, unionSort);
+      /* same as struct operations */
+      genStrOps (unionSort, uValSort);
+      return TRUE;
+    }
+  else
+    {
+      smemberInfo_free (info);
+      return FALSE;
+    }
+}
+
+sort
+sort_makeUnionVal (ltoken t, sort unionSort)
+{
+  sort handle;
+  sortNode outSort, s = sort_lookup (unionSort);
+  lsymbol name;
+
+  if (s.kind != SRT_UNION)
+    {
+      llfatalbug (message ("sort_makeUnion: only unions can become unionVals: given sort is: %s",
+			   sort_unparseKind (s.kind)));
+    }
+
+  llassert (sortTable != NULL);
+
+  name = sp (s.name, lsymbol_fromChars ("_UnionVal"));
+  handle = sort_lookupName (name);
+
+  outSort.kind = SRT_UNIONVAL;
+  outSort.name = name;
+  outSort.tag = s.tag;
+  outSort.realtag = s.realtag;
+  outSort.baseSort = unionSort;
+  outSort.objSort = NOSORTHANDLE;
+  outSort.members = smemberInfo_undefined;
+  outSort.export = exporting;
+  outSort.abstract = FALSE;
+  outSort.imported = context_inImport ();
+  outSort.mutable = FALSE;
+  outSort.handle = handle;
+
+  if (handle == NOSORTHANDLE)
+    {
+      if (sort_isNewEntry (outSort))
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+
+	  /* Add members to the unionVal's. */
+	  /* same as structs and tuples */
+
+	  sort_addTupleMembers (handle, unionSort);
+	  genUnionOps (handle);
+	}
+      else
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+	}
+    }
+  else 
+    {
+      if (sortTable[handle].kind != SRT_UNIONVAL)
+	{
+	  sortError (t, handle, outSort);
+	}
+
+      smemberInfo_free (outSort.members);
+    }
+
+  return handle;
+}
+
+static lsymbol
+newEnumTag ()
+{
+  static int ecount = 0;
+
+  return (cstring_toSymbol (message ("e%s%de", context_moduleName (), ecount++)));
+}
+
+static lsymbol
+newStructTag ()
+{
+  static int ecount = 0;
+
+  return (cstring_toSymbol (message ("s%s%ds", context_moduleName (), ecount++)));
+}
+
+static lsymbol
+newUnionTag ()
+{
+  static int ecount = 0;
+
+  return (cstring_toSymbol (message ("u%s%du", context_moduleName (), ecount++)));
+}
+
+sort
+sort_makeEnum (ltoken opttagid)
+{
+  sortNode outSort;
+  sort handle;
+  bool isNew;
+  lsymbol name;
+
+  llassert (sortTable != NULL);
+
+  if (ltoken_isUndefined (opttagid))
+    {
+      opttagid = ltoken_create (simpleId, newEnumTag ());
+      outSort.realtag = FALSE;
+    }
+  else
+    outSort.realtag = TRUE;
+  
+  /* must not clash with any LSL sorts, tag2sortname adds "_" prefix */
+
+  name = sortTag_toSymbol ("Enum", opttagid, &isNew);
+  handle = sort_lookupName (name);
+  outSort.name = name;
+  outSort.kind = SRT_ENUM;
+  outSort.tag = ltoken_getText (opttagid);
+  outSort.baseSort = NOSORTHANDLE;
+  outSort.objSort = NOSORTHANDLE;
+  outSort.members = smemberInfo_undefined;
+  outSort.export = exporting;
+  outSort.mutable = FALSE;
+  outSort.imported = context_inImport ();
+  outSort.abstract = FALSE;
+  outSort.handle = handle;
+
+  if (handle == NOSORTHANDLE)
+    {
+      if (sort_isNewEntry (outSort))
+	{
+	  outSort.handle = handle = sort_enterNew (outSort);
+	}
+      else
+	{
+	  outSort.handle = handle = sort_enterNewForce (outSort);
+	}
+    }
+  else 
+    {
+      if (sortTable[handle].kind != SRT_ENUM)
+	{
+	  sortError (opttagid, handle, outSort);
+	}
+
+      smemberInfo_free (outSort.members);
+    }
+
+  return handle;
+}
+
+bool
+sort_updateEnum (sort enumSort, /*@only@*/ smemberInfo *info)
+{
+  /*
+  ** Expect enumSort to be in sort table but not yet filled in.
+  ** Return TRUE if it is "new" 
+  */
+
+  sortNode sn;
+
+  llassert (sortTable != NULL);
+
+  sn = sort_lookup (enumSort);
+  if (sn.members == (smemberInfo *) 0)
+    {
+      sortTable[enumSort].members = info;
+      genEnumOps (enumSort);
+      return TRUE;
+    }
+  else
+    {
+      smemberInfo_free (info);
+      return FALSE;
+    }
+}
+
+static 
+void genEnumOps (sort enumSort)
+{
+  smemberInfo *ei;
+  ltokenList domain = ltokenList_new ();
+  ltoken range, mem;
+  nameNode nn;
+  sigNode signature;
+
+  range = ltoken_createType (simpleId, SID_SORT, sort_getLsymbol (enumSort));
+  signature = makesigNode (ltoken_undefined, domain, range);
+
+  llassert (sortTable != NULL);
+
+  for (ei = sortTable[enumSort].members;
+       ei != (smemberInfo *) 0; ei = ei->next)
+    {
+      mem = ltoken_createType (simpleId, SID_OP, ei->name);
+      nn = makeNameNodeId (mem);
+      symtable_enterOp (g_symtab, nn, sigNode_copy (signature));
+    }
+
+  sigNode_free (signature);
+  overloadSizeof (enumSort);
+}
+
+static void
+genPtrOps (/*@unused@*/ sort baseSort, sort ptrSort, sort arraySort)
+{
+  /* Generate *__: xPtr -> x */
+
+  /* overloadUnary (deRefNameNode, ptrSort, baseSort); */
+
+  /* Generate maxIndex, minIndex: xPtr -> int */
+  /* overloadUnaryTok (maxIndexNameNode, ptrSort, intToken); */
+  /* overloadUnaryTok (minIndexNameNode, ptrSort, intToken); */
+
+  /* Generate __[]: pointer -> array  */
+  overloadUnary (nameNode_copySafe (ptr2arrayNameNode), ptrSort, arraySort);
+
+  /* Generate __+__, __-__: pointer, int -> pointer  */
+  overloadBinary (nameNode_copySafe (plusNameNode), ptrSort, 
+		  ltoken_copy (intToken), ptrSort);
+
+  overloadBinary (nameNode_copySafe (minusNameNode), ptrSort, 
+		  ltoken_copy (intToken), ptrSort);
+
+  /* Generate NIL: -> xPtr */
+  /* Generate __+__: int, pointer -> pointer  */
+  /* Generate __-__: pointer, pointer -> int  */
+  overloadPtrFcns (ptrSort);
+}
+
+static void
+genArrOps (sort baseSort, sort arraySort, int dim, /*@unused@*/ sort vecSort)
+{
+  /* Generate __[__]: nArr, int -> n */
+  overloadBinary (nameNode_copySafe (arrayRefNameNode), arraySort, 
+		  ltoken_copy (intToken), baseSort);
+  
+  /* Generate maxIndex, minIndex: sort -> int */
+  /* overloadUnaryTok (maxIndexNameNode, arraySort, intToken); */
+  /* overloadUnaryTok (minIndexNameNode, arraySort, intToken); */
+  
+  /* Generate isSub: arraySort, int, ... -> bool */
+  overloadIsSub (arraySort, dim); 
+  
+  /* Generate fresh, trashed, modifies, unchanged: array -> bool  */
+  /* Generate any, pre, post: array -> vector */
+  
+  /* overloadStateFcns (arraySort, vecSort); */
+  /* overloadObjFcns (arraySort); */
+}
+
+/*
+** overloadPtrFcns:
+**   generate NIL: -> ptrSort
+**            __+__: int, ptrSort -> ptrSort  
+**            __-__: ptrSort, ptrSort -> int  
+*/
+static void
+overloadPtrFcns (sort ptrSort)
+{
+  ltokenList domain = ltokenList_new ();
+  ltoken range;
+  sigNode signature;
+  
+  /* NIL: -> ptrSort */
+  
+  range = ltoken_createType (simpleId, SID_SORT, sort_getLsymbol (ptrSort));
+  signature = makesigNode (ltoken_undefined, ltokenList_new (), ltoken_copy (range));
+  symtable_enterOp (g_symtab, nameNode_copySafe (nilNameNode), signature);
+  
+  /* __+__: int, ptrSort -> ptrSort  */
+  
+  ltokenList_addh (domain, ltoken_copy (intToken));
+  ltokenList_addh (domain, ltoken_copy (range));
+
+  signature = makesigNode (ltoken_undefined, domain, ltoken_copy (range));
+  symtable_enterOp (g_symtab, nameNode_copySafe (plusNameNode), signature);
+  
+  /* __-__: ptrSort, ptrSort -> int  */
+
+  domain = ltokenList_new ();
+  ltokenList_addh (domain, ltoken_copy (range));
+  ltokenList_addh (domain, range);
+  range = ltoken_copy (intToken);
+  signature = makesigNode (ltoken_undefined, domain, range);
+  symtable_enterOp (g_symtab, nameNode_copySafe (minusNameNode), signature);
+}
+
+static void
+genVecOps (sort baseSort, sort vecSort, int dim)
+{
+  /* Generate __[__]: vecSort, int -> baseSort */
+
+  overloadBinary (nameNode_copySafe (arrayRefNameNode), vecSort, 
+		  ltoken_copy (intToken), baseSort);
+
+  /*          sizeof: vecSort -> int */
+  /* Generate isSub: vecSort, int, ... -> bool */
+
+  overloadIsSub (vecSort, dim);
+}
+
+static void
+overloadIsSub (sort s, int dim)
+{
+  /* Generate isSub: s, int, ... -> bool */
+  int j, i;
+  ltoken dom, nulltok = ltoken_undefined;
+  ltokenList domain;
+  sigNode signature;
+
+  for (j = 1; j <= dim; j++)
+    {
+      nameNode isSubNameNode = (nameNode) dmalloc (sizeof (*isSubNameNode));
+
+      isSubNameNode->isOpId = TRUE;
+      isSubNameNode->content.opid = ltoken_createType (simpleId, SID_OP, 
+							 lsymbol_fromChars ("isSub"));
+      dom = ltoken_createType (simpleId, SID_SORT, sort_getLsymbol (s));
+
+      domain = ltokenList_singleton (dom);
+
+      for (i = 1; i <= j; i++)
+	{
+	  ltokenList_addh (domain, ltoken_copy (intToken));
+	}
+
+      signature = makesigNode (nulltok, domain, ltoken_copy (ltoken_bool));
+      symtable_enterOp (g_symtab, isSubNameNode, signature);
+    }
+}
+
+static void
+overloadUnaryTok (/*@only@*/ nameNode nn, sort domainSort, /*@only@*/ ltoken range)
+{
+  /* Generate : domainSort -> rangeTok */
+  sigNode signature;
+  ltoken dom;
+  ltokenList domain;
+
+  dom = ltoken_createType (simpleId, SID_SORT, sort_getLsymbol (domainSort));
+  domain = ltokenList_singleton (dom);
+  signature = makesigNode (ltoken_undefined, domain, range);
+  symtable_enterOp (g_symtab, nn, signature);
+}
+
+static void
+overloadSizeof (sort domainSort)
+{
+  nameNode sizeofNameNode = (nameNode) dmalloc (sizeof (*sizeofNameNode));
+  
+  sizeofNameNode->isOpId = TRUE;
+  sizeofNameNode->content.opid = ltoken_createType (simpleId, SID_OP, 
+						      lsymbol_fromChars ("sizeof"));
+  
+  overloadUnaryTok (sizeofNameNode, domainSort, ltoken_copy (intToken));
+}
+
+static void
+overloadUnary (/*@only@*/ nameNode nn, sort domainSort, sort rangeSort)
+{
+  ltoken range = ltoken_createType (simpleId, SID_SORT, sort_getLsymbol (rangeSort));
+
+  overloadUnaryTok (nn, domainSort, range);
+}
+
+static void
+overloadBinary (/*@only@*/ nameNode nn, sort s, /*@only@*/ ltoken dTok, sort rs)
+{
+  /* Generate : s, dTok -> rs */
+  sigNode signature;
+  ltoken range, dom;
+  ltokenList domain = ltokenList_new ();
+
+  range = ltoken_createType (simpleId, SID_SORT, sort_getLsymbol (rs));
+  dom = ltoken_createType (simpleId, SID_SORT, sort_getLsymbol (s));
+  
+  ltokenList_addh (domain, dom);
+  ltokenList_addh (domain, dTok);
+  
+  signature = makesigNode (ltoken_undefined, domain, range);
+      symtable_enterOp (g_symtab, nn, signature);
+}
+
+static /*@only@*/ nameNode
+makeFieldOp (lsymbol field)
+{
+ /* operator: __. */
+  nameNode nn;
+  opFormUnion u;
+  opFormNode opform;
+
+  u.id = ltoken_createType (simpleId, SID_OP, field);
+  opform = makeOpFormNode (ltoken_undefined, OPF_MSELECT, u, ltoken_undefined);
+  nn = makeNameNodeForm (opform);
+  return nn;
+}
+
+static /*@only@*/ nameNode
+makeArrowFieldOp (lsymbol field)
+{
+ /* operator: __-> */
+  nameNode nn;
+  opFormUnion u;
+  opFormNode opform;
+
+  u.id = ltoken_createType (simpleId, SID_OP, field);
+  opform = makeOpFormNode (ltoken_undefined, OPF_MMAP, u, ltoken_undefined);
+  nn = makeNameNodeForm (opform);
+  return nn;
+}
+
+void
+sort_init (void) 
+   /*@globals undef noSort,
+              undef arrayRefNameNode,
+              undef ptr2arrayNameNode,
+              undef deRefNameNode,
+              undef nilNameNode,
+              undef plusNameNode,
+              undef minusNameNode,
+              undef condNameNode,
+              undef eqNameNode,
+              undef neqNameNode,
+              undef intToken; @*/
+{
+  /* on alpha, declaration does not allocate storage */
+  opFormNode opform;
+  opFormUnion u;
+  underscoreSymbol = lsymbol_fromChars ("_");
+
+  /*
+  ** commonly used data for generating operators 
+  */
+  
+  lsymbol_setbool (lsymbol_fromChars ("bool"));
+  intToken = ltoken_createType (simpleId, SID_SORT, lsymbol_fromChars ("int"));
+  
+  /*
+  ** __ \eq __: sort, sort -> bool 
+  */
+
+  u.anyop = ltoken_copy (ltoken_eq);
+  opform = makeOpFormNode (ltoken_undefined, OPF_MANYOPM, u, ltoken_undefined);
+  eqNameNode = makeNameNodeForm (opform);
+  
+  /*
+  ** __ \neq __: sort, sort -> bool 
+  */
+
+  u.anyop = ltoken_copy (ltoken_neq);
+  opform = makeOpFormNode (ltoken_undefined, OPF_MANYOPM, u, ltoken_undefined);
+  neqNameNode = makeNameNodeForm (opform);
+  
+  /*
+  **if __ then __ else __: bool, sort, sort -> sort 
+  */
+
+  opform = makeOpFormNode (ltoken_undefined, OPF_IF, 
+			   opFormUnion_createMiddle (0), ltoken_undefined);
+  condNameNode = makeNameNodeForm (opform);
+  
+  /* operator: __[__]: arraySort, int -> elementSort_Obj */
+  u.middle = 1;
+  opform = makeOpFormNode (ltoken_copy (ltoken_lbracked), OPF_BMMIDDLE, u,
+			   ltoken_copy (ltoken_rbracket));
+  arrayRefNameNode = makeNameNodeForm (opform);
+  
+  /* operator: __[]: ptrSort -> arraySort */
+  u.middle = 0;
+  opform = makeOpFormNode (ltoken_copy (ltoken_lbracked), 
+			   OPF_BMMIDDLE, u,
+			   ltoken_copy (ltoken_rbracket));
+  ptr2arrayNameNode = makeNameNodeForm (opform);
+  
+  /* operator: *__ */
+  u.anyop = ltoken_create (LLT_MULOP, lsymbol_fromChars ("*"));
+  opform = makeOpFormNode (ltoken_undefined, OPF_ANYOPM, u, ltoken_undefined);
+  deRefNameNode = makeNameNodeForm (opform);
+  
+  /* operator: __ + __ */
+  u.anyop = ltoken_create (simpleOp, lsymbol_fromChars ("+"));
+  opform = makeOpFormNode (ltoken_undefined, OPF_MANYOPM, u, ltoken_undefined);
+  plusNameNode = makeNameNodeForm (opform);
+  
+  /* operator: __ - __ */
+  u.anyop = ltoken_create (simpleOp, lsymbol_fromChars ("-"));
+  opform = makeOpFormNode (ltoken_undefined, OPF_MANYOPM, u, ltoken_undefined);
+  minusNameNode = makeNameNodeForm (opform);
+  
+  /* operator: NIL */
+  nilNameNode = (nameNode) dmalloc (sizeof (*nilNameNode));
+  nilNameNode->isOpId = TRUE;
+  nilNameNode->content.opid = ltoken_createType (simpleId, SID_OP, 
+						 lsymbol_fromChars ("NIL"));
+
+  noSort.kind = SRT_NONE;
+  noSort.name = lsymbol_fromChars ("_unknown");;
+  noSort.tag = lsymbol_undefined;
+  noSort.baseSort = NOSORTHANDLE;
+  noSort.objSort = NOSORTHANDLE;
+  noSort.members = smemberInfo_undefined;
+  noSort.export = FALSE;
+  noSort.mutable = FALSE;
+  noSort.abstract = FALSE;
+  noSort.imported = FALSE;
+  noSort.handle = NOSORTHANDLE;
+  
+  /*
+  ** Store the null sort into table, and in the process initialize the sort table. 
+  ** Must be the first sort_enter so NOSORTHANDLE is truly = 0. Similarly, 
+  ** for HOFSORTHANDLE = 1.
+  */
+  
+  noSort.handle = sort_enterGlobal (noSort);
+  (void) sort_enterGlobal (HOFSort); 
+  
+  /* Other builtin sorts */
+  
+  sort_bool = sort_makeImmutable (ltoken_undefined, lsymbol_fromChars ("bool"));
+  sort_capBool = sort_makeSortNoOps (ltoken_undefined, lsymbol_fromChars ("Bool"));
+  
+  llassert (sortTable != NULL);
+
+  /* make sort_Bool a synonym for sort_bool */
+  sortTable[sort_capBool].kind = SRT_SYN;
+  sortTable[sort_capBool].baseSort = sort_bool;
+  sortTable[sort_capBool].mutable = FALSE;
+  sortTable[sort_capBool].abstract = TRUE;
+  
+  sort_int = sort_makeLiteralSort (ltoken_undefined, 
+				   lsymbol_fromChars ("int"));
+  sort_char = sort_makeLiteralSort (ltoken_undefined,
+				    lsymbol_fromChars ("char"));
+  sort_void = sort_makeLiteralSort (ltoken_undefined,
+				    lsymbol_fromChars ("void"));
+  
+  /* sort_cstring is char__Vec, for C strings eg: "xyz" */
+  char_obj_ptrSort = sort_makePtr (ltoken_undefined, sort_char);
+  char_obj_ArrSort = sort_makeArr (ltoken_undefined, sort_char);
+  
+  sort_cstring = sort_makeVal (char_obj_ArrSort);
+  sort_float = sort_makeLiteralSort (ltoken_undefined, lsymbol_fromChars ("float"));
+  sort_double = sort_makeLiteralSort (ltoken_undefined, lsymbol_fromChars ("double"));
+}
+
+sort
+sort_lookupName (lsymbol name)
+{
+  long int i;
+
+  if (name == lsymbol_undefined)
+    {
+      return NOSORTHANDLE;
+    }
+
+  llassert (sortTable != NULL);
+
+  for (i = 0; i < sortTableSize; i++)
+    {
+      if (sortTable[i].name == name)
+	{
+	  return i;
+	}
+    }
+
+  return NOSORTHANDLE;
+}
+
+static bool
+sort_isNewEntry (sortNode s)
+{
+  int i;
+  
+  for (i = 0; i < sortTableSize; i++)
+    {
+      llassert (sortTable != NULL);
+
+      if (sortTable[i].kind == s.kind && sortTable[i].name == s.name)
+	{
+	  return FALSE;
+	}
+    }
+  return TRUE;
+}
+
+static sort
+sort_enterGlobal (sortNode s)
+{
+  /*@i@*/ return (sort_enterNew (s));
+}
+
+static sort
+sort_enterNew (sortNode s)
+{
+  /* This ensures that the argument sortNode is not entered into
+     the sort table more than once.  isNew flag will tell the
+     caller this info, and the caller will decide whether to generate
+     operators for this sort. */
+  long int i;
+  
+  for (i = 0; i < sortTableSize; i++)
+    {
+      llassert (sortTable != NULL);
+
+      if (sortTable[i].kind == s.kind && sortTable[i].name == s.name)
+	{
+	  sortNode_free (s);
+	  return i;
+	}
+    }
+
+  if (sortTableSize >= sortTableAlloc)
+    {
+      sortNode *oldSortTable = sortTable;
+
+      sortTableAlloc += DELTA;
+      sortTable = (sortNode *) dmalloc (sortTableAlloc * sizeof (*sortTable));
+
+      if (sortTableSize > 0)
+	{
+	  llassert (oldSortTable != NULL);      
+	  for (i = 0; i < sortTableSize; i++)
+	    {
+	      sortTable[i] = oldSortTable[i];
+	    }
+	}
+
+      sfree (oldSortTable);
+    }
+
+  llassert (sortTable != NULL);
+
+  s.handle = sortTableSize;
+  sortTable[sortTableSize++] = s;
+
+  /*@-compdef@*/ 
+  
+  return s.handle;
+} /*=compdef@*/
+
+static sort sort_enterNewForce (sortNode s)
+{
+  sort sor = sort_enterNew (s); 
+
+  s.handle = sor;
+  llassert (sortTable != NULL);
+  sortTable[sor] = s;
+  
+  /*@-globstate@*/ return (sor); /*@=globstate@*/
+}
+
+void
+sort_printStats (void)
+{
+  /* only for debugging */
+  printf ("sortTableSize = %d; sortTableAlloc = %d\n", sortTableSize,
+	  sortTableAlloc);
+}
+
+sortNode
+sort_lookup (sort sor)
+{
+  /* ymtan: can sor be 0 ? */
+  /* evs --- yup...0 should return noSort ? */
+  
+  if (sor > 0U && sor < (unsigned) sortTableSize)
+    {
+      llassert (sortTable != NULL);
+      return sortTable[sor];
+    }
+
+  llassert (sor == 0);
+  return noSort;
+}
+
+sortNode
+sort_quietLookup (sort sor)
+{
+  /* ymtan: can sor be 0 ? */
+  if (sor > 0U && sor < (unsigned) sortTableSize)
+    {
+      llassert (sortTable != NULL);
+      return (sortTable[sor]);
+    }
+  else
+    {
+      return noSort;
+    }
+}
+
+static cstring
+printEnumMembers (/*@null@*/ smemberInfo *list)
+{
+  cstring out = cstring_undefined;
+  smemberInfo *m;
+
+  for (m = list; m != (smemberInfo *) 0; m = m->next)
+    {
+      out = cstring_concat (out, lsymbol_toString (m->name));
+
+      if (m->next != (smemberInfo *) 0)
+	{
+	  out = cstring_concatChars (out, ", ");
+	}
+    }
+  return out;
+}
+
+static /*@only@*/ cstring
+printStructMembers (/*@null@*/ smemberInfo *list)
+{
+  cstring ret = cstring_undefined;
+  smemberInfo *m;
+
+  for (m = list; m != (smemberInfo *) 0; m = m->next)
+    {
+      ret = message ("%q%q %s; ",
+		     ret, sort_unparse (m->sort), 
+		     cstring_fromChars (lsymbol_toChars (m->name)));
+    }
+
+  return ret;
+}
+
+/*@only@*/ cstring
+sort_unparse (sort s)
+{
+ /* printing routine for sorts */
+  sortNode sn;
+  lsymbol name;
+
+  sn = sort_quietLookup (s);
+  name = sn.name;
+
+  switch (sn.kind)
+    {
+    case SRT_NONE:
+      if (name == lsymbol_undefined)
+	{
+	  return cstring_makeLiteral ("_unknown");
+	}
+
+      return (cstring_fromCharsNew (lsymbol_toChars (name)));
+    case SRT_HOF:
+      return cstring_makeLiteral ("procedural");
+    case SRT_PRIM:
+      return (cstring_fromCharsNew (lsymbol_toChars (name)));
+    case SRT_SYN:
+      return (cstring_fromCharsNew (lsymbol_toChars (name)));
+
+    case SRT_PTR:
+      return (message ("%q *", sort_unparse (sort_makeVal (sn.baseSort))));
+    case SRT_OBJ:
+      return (message ("obj %q", sort_unparse (sn.baseSort)));
+    case SRT_ARRAY:
+      return (message ("array of %q", sort_unparse (sort_makeVal (sn.baseSort))));
+    case SRT_VECTOR:
+      return (message ("vector of %q", sort_unparse (sn.baseSort)));
+    case SRT_TUPLE:
+      if (sn.tag != lsymbol_undefined && sn.realtag)
+	{
+	  return (message ("struct %s", cstring_fromChars (lsymbol_toChars (sn.tag))));
+	}
+      else
+	{
+	  return (message ("struct {%q}", printStructMembers (sn.members)));
+	}
+    case SRT_UNIONVAL:
+      if (sn.tag != lsymbol_undefined && sn.realtag)
+	{
+	  return (message ("union %s", cstring_fromChars (lsymbol_toChars (sn.tag))));
+	}
+      else
+	{
+	  return (message ("union {%q}", printStructMembers (sn.members)));
+	}
+    case SRT_ENUM:
+      if (sn.tag != lsymbol_undefined && sn.realtag)
+	{
+	  return (message ("enum %s", cstring_fromChars (lsymbol_toChars (sn.tag))));
+	}
+      else
+	{
+	  return (message ("enum {%q}", printEnumMembers (sn.members)));
+	}
+    case SRT_STRUCT:
+      if (sn.tag != lsymbol_undefined && sn.realtag)
+	{
+	  return (message ("obj struct %s", cstring_fromChars (lsymbol_toChars (sn.tag))));
+	}
+      else
+	{
+	  return (message ("obj struct {%q}", printStructMembers (sn.members)));
+	}
+    case SRT_UNION:
+      if (sn.tag != lsymbol_undefined && sn.realtag)
+	{
+	  return (message ("obj union %s", cstring_fromChars (lsymbol_toChars (sn.tag))));
+	}
+      else
+	{
+	  return (message ("obj union {%q}", printStructMembers (sn.members)));
+	}
+    default:
+      return (cstring_makeLiteral ("illegal"));
+    }
+}
+
+static lsymbol
+sp (lsymbol s1, lsymbol s2)
+{
+  char buff[MAXBUFFLEN];
+  char *name1Ptr;
+  char *name2Ptr;
+  int temp_length;
+
+  name1Ptr = lsymbol_toCharsSafe (s1);
+  name2Ptr = lsymbol_toCharsSafe (s2);
+
+  if (strlen (name1Ptr) + strlen (name2Ptr) + 1 > MAXBUFFLEN)
+    {
+      temp_length = strlen (name1Ptr) + strlen (name2Ptr) + 1;
+      llfatalbug (message ("sp: name too long: %s%s", 
+			   cstring_fromChars (name1Ptr), 
+			   cstring_fromChars (name2Ptr)));
+    }
+
+  strcpy (&buff[0], name1Ptr);
+  strcat (&buff[0], name2Ptr);
+
+  return lsymbol_fromChars (&buff[0]);
+}
+
+static lsymbol
+sortTag_toSymbol (char *kind, ltoken tagid, /*@out@*/ bool *isNew)
+{
+  /* 
+  ** kind could be struct, union or enum.  Create a unique sort
+  ** name based on the given info. But first check that tagid
+  ** has not been defined already. (ok if it is a forward decl) 
+  **/
+
+  tagInfo to;
+
+  if (ltoken_isUndefined (tagid))
+    {
+      *isNew = TRUE;
+      return (cstring_toSymbol (message ("_anon_%s%d", cstring_fromChars (kind), sortUID++)));
+    }
+  else
+    {
+      to = symtable_tagInfo (g_symtab, ltoken_getText (tagid));
+
+      if (tagInfo_exists (to))
+	{
+	  *isNew = FALSE;
+	}
+      else
+	{
+	  *isNew = TRUE;
+	}
+
+      return (cstring_toSymbol (message ("_%s_%s", 
+					 ltoken_unparse (tagid), 
+					 cstring_fromChars (kind))));
+    }
+}
+
+# define MAX_SORT_DEPTH 10
+
+static sort
+sort_getUnderlyingAux (sort s, int depth)
+{
+  sortNode sn = sort_quietLookup (s);
+  
+  if (sn.kind == SRT_SYN)
+    {
+      if (depth > MAX_SORT_DEPTH)
+	{
+	  llcontbug (message ("sort_getUnderlying: depth charge: %d", depth));
+	  return s;
+	}
+      
+      return sort_getUnderlyingAux (sn.baseSort, depth + 1);
+    }
+  
+  return s;
+}
+
+sort
+sort_getUnderlying (sort s)
+{
+  return sort_getUnderlyingAux (s, 0);
+}
+
+static lsymbol
+underlyingSortName (sortNode sn)
+{
+  if (sn.kind == SRT_SYN)
+    return underlyingSortName (sort_quietLookup (sn.baseSort));
+  return sn.name;
+}
+
+static /*@observer@*/ sortNode
+underlyingSortNode (sortNode sn)
+{
+  if (sn.kind == SRT_SYN)
+    {
+      return underlyingSortNode (sort_quietLookup (sn.baseSort));
+    }
+
+  return sn;
+}
+
+bool
+sort_mutable (sort s)
+{
+ /* if s is not a valid sort, then returns false */
+  sortNode sn = sort_quietLookup (s);
+  if (sn.mutable)
+    return TRUE;
+  return FALSE;
+}
+
+bool
+sort_setExporting (bool flag)
+{
+  bool old;
+  old = exporting;
+  exporting = flag;
+  return old;
+}
+
+/*@observer@*/ static cstring 
+sort_unparseKind (sortKind k)
+{
+  if (k > SRT_FIRST && k < SRT_LAST)
+    return (cstring_fromChars (sortKindName[(int)k]));
+  else
+    return (cstring_makeLiteralTemp (""));
+}
+
+bool
+sort_isValidSort (sort s)
+{
+  sortNode sn = sort_quietLookup (s);
+  sortKind k = sn.kind;
+  if (k != SRT_NONE && k > SRT_FIRST && k < SRT_LAST)
+    return TRUE;
+  else
+    return FALSE;
+}
+
+void
+sort_dump (FILE *f, bool lco)
+{
+  int i;
+  sortNode s;
+  smemberInfo *mem;
+
+  fprintf (f, "%s\n", BEGINSORTTABLE);
+  llassert (sortTable != NULL);
+
+  for (i = 2; i < sortTableSize; i++)
+    {
+      /* skips 0 and 1, noSort and HOFSort */
+      s = sortTable[i];
+      
+      /* if (lco && !s.export) continue; */
+      /* Difficult to keep track of where each op and sort belong to
+	 which LCL type.  Easiest to export them all (even private sorts and
+	 op's) but for checking imported modules, we only use LCL types and
+	 variables to check, i.e., we don't rely on sorts and op's for such
+	 checking. */
+      
+      if (s.kind == SRT_NONE)
+	continue;
+      
+      if (lco)
+	{
+	  fprintf (f, "%%LCL");
+	}
+
+      if (lsymbol_isDefined (s.name))
+	{
+	  fprintf (f, "sort %s ", lsymbol_toCharsSafe (s.name));
+	}
+      else
+	{
+	  llcontbug (message ("Invalid sort in sort_dump: sort %d; sortname: %s.  This may result from using .lcs files produced by an old version of LCLint.  Remove the .lcs files, and rerun LCLint.",
+			      i, lsymbol_toString (s.name)));
+	  fprintf (f, "sort _error_ ");
+	}
+      
+      if (!lco && !s.export)
+	fprintf (f, "private ");
+
+      /*@-loopswitchbreak@*/
+      switch (s.kind)
+	{
+	case SRT_HOF:
+	  fprintf (f, "hof nil nil\n");
+	  break;
+	case SRT_PRIM:
+	  if (s.abstract)
+	    fprintf (f, "immutable nil nil\n");
+	  else
+	    fprintf (f, "primitive nil nil\n");
+	  break;
+	case SRT_OBJ:
+	  if (s.abstract)
+	    fprintf (f, "mutable %s nil\n",
+		     lsymbol_toCharsSafe (sortTable[s.baseSort].name));
+	  else
+	    fprintf (f, "obj %s nil\n",
+		     lsymbol_toCharsSafe (sortTable[s.baseSort].name));
+	  break;
+	case SRT_SYN:
+	  fprintf (f, "synonym %s nil\n",
+		   lsymbol_toCharsSafe (sortTable[s.baseSort].name));
+	  break;
+	case SRT_PTR:
+	  fprintf (f, "ptr %s nil\n", lsymbol_toCharsSafe (sortTable[s.baseSort].name));
+	  break;
+	case SRT_ARRAY:
+	  fprintf (f, "arr %s nil\n",
+		   lsymbol_toCharsSafe (sortTable[s.baseSort].name));
+	  break;
+	case SRT_VECTOR:
+	  fprintf (f, "vec %s %s\n",
+		   lsymbol_toCharsSafe (sortTable[s.baseSort].name),
+		   lsymbol_toCharsSafe (sortTable[s.objSort].name));
+	  break;
+	case SRT_STRUCT:
+	  if (s.tag == lsymbol_undefined)
+	    {
+	      /* we need to make up a tag to prevent excessive
+		 growth of .lcs files when tags are overloaded
+		 */
+	      llbuglit ("Struct has no tag");
+	    }
+	  else
+	    fprintf (f, "str %s nil\n", lsymbol_toCharsSafe (s.tag));
+
+	  for (mem = s.members;
+	       mem != smemberInfo_undefined; mem = mem->next)
+	    {
+	      if (lco)
+		fprintf (f, "%%LCL");
+	      fprintf (f, "sort %s strMem %s nil\n", lsymbol_toCharsSafe (mem->name),
+		       lsymbol_toCharsSafe (sortTable[mem->sort].name));
+	    }
+	  if (lco)
+	    fprintf (f, "%%LCL");
+	  fprintf (f, "sort strEnd nil nil nil\n");
+	  break;
+	case SRT_UNION:
+	  if (s.tag == lsymbol_undefined)
+	    llbuglit ("Union has no tag");
+	  else
+	    fprintf (f, "union %s nil\n", lsymbol_toCharsSafe (s.tag));
+	  for (mem = s.members;
+	       mem != smemberInfo_undefined; mem = mem->next)
+	    {
+	      if (lco)
+		fprintf (f, "%%LCL");
+	      fprintf (f, "sort %s unionMem %s nil\n", lsymbol_toCharsSafe (mem->name),
+		       lsymbol_toCharsSafe (sortTable[mem->sort].name));
+	    }
+	  if (lco)
+	    fprintf (f, "%%LCL");
+	  fprintf (f, "sort unionEnd nil nil nil\n");
+	  break;
+	case SRT_ENUM:
+	  if (s.tag == lsymbol_undefined)
+	    {
+	      llbuglit ("Enum has no tag");
+	    }
+
+	  fprintf (f, "enum %s nil\n", lsymbol_toCharsSafe (s.tag));
+
+	  for (mem = s.members;
+	       mem != smemberInfo_undefined; mem = mem->next)
+	    {
+	      if (lco)
+		fprintf (f, "%%LCL");
+	      fprintf (f, "sort %s enumMem nil nil\n", lsymbol_toCharsSafe (mem->name));
+	    }
+	  if (lco)
+	    fprintf (f, "%%LCL");
+	  fprintf (f, "sort enumEnd nil nil nil\n");
+	  break;
+	case SRT_TUPLE:
+	  fprintf (f, "tup %s nil\n", lsymbol_toCharsSafe (sortTable[s.baseSort].name));
+	  break;
+	case SRT_UNIONVAL:
+	  fprintf (f, "unionval %s nil\n",
+		   lsymbol_toCharsSafe (sortTable[s.baseSort].name));
+	  break;
+	default:
+	  fprintf (f, "sort_dump: unexpected sort: %d", (int)s.kind);
+	}			/* switch */
+      /*@=loopswitchbreak@*/
+    }
+
+  fprintf (f, "%s\n", SORTTABLEEND);
+}
+
+static void
+sort_loadOther (char *kstr, lsymbol sname, sort bsort)
+{
+  if (strcmp (kstr, "synonym") == 0)
+    {
+      (void) sort_construct (sname, SRT_SYN, bsort, lsymbol_undefined,
+			     FALSE, NOSORTHANDLE, smemberInfo_undefined);
+    }
+  else if (strcmp (kstr, "mutable") == 0)
+    {
+      (void) sort_constructAbstract (sname, TRUE, bsort);
+    }
+  else if (strcmp (kstr, "obj") == 0)
+    {
+      (void) sort_construct (sname, SRT_OBJ, bsort, lsymbol_undefined,
+			     TRUE, NOSORTHANDLE, smemberInfo_undefined);
+    }
+  else if (strcmp (kstr, "ptr") == 0)
+    {
+      (void) sort_construct (sname, SRT_PTR, bsort, lsymbol_undefined,
+			     FALSE, NOSORTHANDLE, smemberInfo_undefined);
+    }
+  else if (strcmp (kstr, "arr") == 0)
+    {
+      (void) sort_construct (sname, SRT_ARRAY, bsort, lsymbol_undefined,
+			     TRUE, NOSORTHANDLE, smemberInfo_undefined);
+    }
+  else if (strcmp (kstr, "tup") == 0)
+    {
+      (void) sort_construct (sname, SRT_TUPLE, bsort, lsymbol_undefined,
+			     FALSE, NOSORTHANDLE, smemberInfo_undefined);
+    }
+  else if (strcmp (kstr, "unionval") == 0)
+    {
+      (void) sort_construct (sname, SRT_UNIONVAL, bsort, lsymbol_undefined,
+			     FALSE, NOSORTHANDLE, smemberInfo_undefined);
+    }
+  else
+    {
+      llbug (message ("Unhandled: %s", cstring_fromChars (kstr)));
+    }
+}
+
+static void
+parseSortLine (char *line, ltoken t, tsource * s,
+	       mapping *map, lsymbolList slist)
+{
+  /* caller expects that map and slist are updated */
+  /* t and importfle are only used for error messages */
+  static lsymbol strName = lsymbol_undefined;
+  static smemberInfo *strMemList = NULL;
+  static lsymbol unionName = lsymbol_undefined;
+  static smemberInfo *unionMemList = NULL;
+  static lsymbol enumName = lsymbol_undefined;
+  static smemberInfo *enumMemList = NULL;
+  static lsymbol tagName = lsymbol_undefined;
+  
+  char *importfile = tsource_fileName (s);
+  char sostr[MAXBUFFLEN], kstr[10], basedstr[MAXBUFFLEN], objstr[MAXBUFFLEN];
+  bool tmp;
+  tagInfo ti;
+  lsymbol sname, bname, new_name, objName;
+  sort objSort;
+  char *lineptr;
+  int col;			/* for keeping column number */
+  ltoken tagid;
+  
+  if (sscanf (line, "sort %s %s %s %s", &(sostr[0]), &(kstr[0]),
+	      &(basedstr[0]), &(objstr[0])) != 4)
+    {		
+      /* if this fails, can have weird errors */
+      /* strEnd, unionEnd, enumEnd won't return 4 args */
+      lclplainerror 
+	(message ("%q: Imported file contains illegal sort declaration.   "
+		  "Skipping this line: \n%s\n",
+		  fileloc_unparseRaw (cstring_fromChars (importfile), 
+				      tsource_thisLineNumber (s)), 
+		  cstring_fromChars (line)));
+      return;
+    }
+  
+  sname = lsymbol_fromChars (sostr);
+  if (sname == lsymbol_fromChars ("nil"))
+    {
+      /* No given sort name.  Use lsymbol_undefined and generate sort name
+	 in sort building routines. */
+      sname = lsymbol_undefined;
+      lclerror (t, message ("Illegal sort declaration in import file: %s:\n%s",
+			    cstring_fromChars (importfile), 
+			    cstring_fromChars (line)));
+    }
+  
+  /* Assume that when we encounter a sort S1 that is based on sort
+     S2, S2 is before S1 in the imported file.  sort table is a
+     linear list and we create base sorts before other sorts. */
+  
+  bname = lsymbol_fromChars (basedstr);
+  if (strcmp (kstr, "primitive") == 0)
+    {
+      new_name = lsymbol_translateSort (map, sname);
+      (void) sort_construct (new_name, SRT_PRIM, NOSORTHANDLE,
+			     lsymbol_undefined, FALSE,
+			     NOSORTHANDLE, smemberInfo_undefined);
+    }
+  else if (strcmp (kstr, "strMem") == 0)
+    {
+      smemberInfo *mem = (smemberInfo *) dmalloc (sizeof (*mem));
+      mem->next = strMemList;
+      mem->name = sname;
+      mem->sortname = bname;
+      mem->sort = NOSORTHANDLE;
+      strMemList = mem;
+    }
+  else if (strcmp (sostr, "strEnd") == 0)
+    {				/* now process it */
+      if (strName != lsymbol_undefined && strMemList != NULL)
+	{
+	  sort asort = sort_construct (strName, SRT_STRUCT, NOSORTHANDLE, tagName,
+				  TRUE, NOSORTHANDLE, strMemList);
+	  
+	  if (tagName != lsymbol_undefined)
+	    {
+	      tagid = ltoken_create (simpleId, tagName);
+
+	      ti = (tagInfo) dmalloc (sizeof (*ti));
+	      ti->sort = asort;
+	      ti->kind = TAG_STRUCT;
+	      ti->id = tagid;
+	      ti->imported = FALSE;
+	      
+	      (void) symtable_enterTagForce (g_symtab, ti);
+	    }
+	}
+      else
+	{
+	  if (strName == lsymbol_undefined)
+	    {
+	      lclbug (message ("%q: Imported file contains unexpected null struct sort",
+			       fileloc_unparseRaw (cstring_fromChars (importfile), tsource_thisLineNumber (s))));
+	    }
+	  else
+	    {
+	      /*
+	       ** no members -> its a forward struct
+	       */
+	      
+	      if (tagName != lsymbol_undefined)
+		{
+		  tagid = ltoken_create (simpleId, tagName);
+		  (void) checkAndEnterTag (TAG_FWDSTRUCT, tagid);
+		}
+	    }
+	}
+      strName = lsymbol_undefined;
+      strMemList = NULL;
+      tagName = lsymbol_undefined;
+    }
+  else if (strcmp (kstr, "str") == 0)
+    {
+      if (strName != lsymbol_undefined || strMemList != NULL)
+	{
+	  lclbug (message ("%q: unexpected non-null struct sort or "
+			   "non-empty member list",
+			   fileloc_unparseRaw (cstring_fromChars (importfile), 
+					       tsource_thisLineNumber (s))));
+	}
+      /* see if a tag is associated with this sort */
+      if (strcmp (basedstr, "nil") == 0)
+	{
+	  llfatalerror (message ("%s: Struct missing tag.  Obsolete .lcs file, remove and rerun lcl.",
+				 cstring_fromChars (importfile)));
+	  /*
+	    strName = sortTag_toSymbol ("Struct", nulltok, &tmp);
+	    tagName = lsymbol_undefined;
+	    mapping_bind (map, sname, strName);
+	    */
+	}
+      else /* a tag exists */
+	{  /* create tag in symbol table and add tagged sort in sort table */
+	  tagName = bname;
+	  tagid = ltoken_create (simpleId, bname);
+
+	  strName = sortTag_toSymbol ("Struct", tagid, &tmp);
+	  ti = symtable_tagInfo (g_symtab, tagName);
+
+	  /*
+	  ** No error for redefining a tag in an import.
+	  */
+	}
+      /* to be processed later in sort_import */
+      lsymbolList_addh (slist, strName);
+    }
+  else if (strcmp (kstr, "enumMem") == 0)
+    {
+      smemberInfo *mem = (smemberInfo *) dmalloc (sizeof (*mem));
+      mem->next = enumMemList;
+      mem->sortname = enumName;
+      mem->name = sname;
+      mem->sort = NOSORTHANDLE;
+      enumMemList = mem;
+    }
+  else if (strcmp (sostr, "enumEnd") == 0)
+    {
+      if (enumName != lsymbol_undefined && enumMemList != NULL)
+	{
+	  sort asort = sort_construct (enumName, SRT_ENUM, NOSORTHANDLE, tagName,
+				       FALSE, NOSORTHANDLE, enumMemList);
+	  
+	  if (tagName != lsymbol_undefined)
+	    {
+	      tagid = ltoken_create (simpleId, tagName);
+
+	      ti = (tagInfo) dmalloc (sizeof (*ti));
+	      ti->sort = asort;
+	      ti->kind = TAG_ENUM;
+	      ti->id = tagid;
+	      ti->imported = FALSE;
+
+	      (void) symtable_enterTagForce (g_symtab, ti);
+	    }
+	}
+      else
+	{
+	  lclbug (message ("%q: unexpected null enum sort or empty member list",
+			   fileloc_unparseRaw (cstring_fromChars (importfile), tsource_thisLineNumber (s))));
+	}
+      enumName = lsymbol_undefined;
+      enumMemList = NULL;
+      tagName = lsymbol_undefined;
+    }
+  else if (strcmp (kstr, "enum") == 0)
+    {
+      if (enumName != lsymbol_undefined || enumMemList != NULL)
+	{
+	  lclbug (message ("%q: Unexpected non-null enum sort or "
+			   "non-empty member list",
+			   fileloc_unparseRaw (cstring_fromChars (importfile), 
+					       tsource_thisLineNumber (s))));
+	}
+
+      /* see if a tag is associated with this sort */
+      if (strcmp (basedstr, "nil") == 0)
+	{
+	  llfatalerror (message ("%s: Enum missing tag.  Obsolete .lcs file, "
+				 "remove and rerun lcl.",
+				 cstring_fromChars (importfile)));
+	}
+      else
+	{			/* a tag exists */
+	  tagName = bname;
+	  tagid = ltoken_create (simpleId, bname);
+	  enumName = sortTag_toSymbol ("Enum", tagid, &tmp);
+	  ti = symtable_tagInfo (g_symtab, bname);
+	}
+    }
+  else if (strcmp (kstr, "unionMem") == 0)
+    {
+      smemberInfo *mem = (smemberInfo *) dmalloc (sizeof (*mem));
+      mem->next = unionMemList;
+      mem->sortname = bname;
+      mem->name = sname;
+      mem->sort = NOSORTHANDLE;
+      unionMemList = mem;
+    }
+  else if (strcmp (sostr, "unionEnd") == 0)
+    {
+      if (unionName != lsymbol_undefined && unionMemList != NULL)
+	{
+	  sort asort = sort_construct (unionName, SRT_UNION, NOSORTHANDLE, tagName,
+				       FALSE, NOSORTHANDLE, unionMemList);
+
+	  if (tagName != lsymbol_undefined)
+	    {
+	      tagid = ltoken_create (simpleId, tagName);
+
+	      ti = (tagInfo) dmalloc (sizeof (*ti));
+	      ti->sort = asort;
+	      ti->kind = TAG_UNION;
+	      ti->id = tagid;
+	      ti->imported = FALSE;
+
+	      (void) symtable_enterTagForce (g_symtab, ti);
+	    }
+	}
+      else
+	{
+	  if (unionName == lsymbol_undefined)
+	    {
+	      lclbug
+		(message ("%q: Imported file contains unexpected null union sort",
+			  fileloc_unparseRaw (cstring_fromChars (importfile), tsource_thisLineNumber (s))));
+	    }
+	  else
+	    {
+	      /*
+	       ** no members -> its a forward struct
+	       */
+	      
+	      if (tagName != lsymbol_undefined)
+		{
+		  tagid = ltoken_create (simpleId, tagName);
+
+		  (void) checkAndEnterTag (TAG_FWDUNION, tagid);
+		}
+	    }
+	}
+
+      unionName = lsymbol_undefined;
+      unionMemList = NULL;
+      tagName = lsymbol_undefined;
+    }
+  else if (strcmp (kstr, "union") == 0)
+    {
+      if (unionName != lsymbol_undefined || unionMemList != NULL)
+	{
+	  lclbug
+	    (message 
+	     ("%q: Unexpected non-null union sort or non-empty "
+	      "member list",
+	      fileloc_unparseRaw (cstring_fromChars (importfile), tsource_thisLineNumber (s))));
+	}
+      /* see if a tag is associated with this sort */
+      if (strcmp (basedstr, "nil") == 0)
+	{
+	  llfatalerror
+	    (message ("%s: Union missing tag.  Obsolete .lcs file, "
+		      "remove and rerun lcl.",
+	      cstring_fromChars (importfile)));
+	}
+      else
+	{			/* a tag exists */
+	  tagName = bname;
+	  tagid = ltoken_create (simpleId, bname);
+
+	  unionName = sortTag_toSymbol ("Union", tagid, &tmp);
+	  ti = symtable_tagInfo (g_symtab, bname);
+	}
+      lsymbolList_addh (slist, unionName);
+    }
+  else if (strcmp (kstr, "immutable") == 0)
+    {
+      (void) sort_constructAbstract (sname, FALSE, NOSORTHANDLE);
+    }
+  else if (strcmp (kstr, "hof") == 0)
+    {
+      (void) sort_construct (sname, SRT_HOF, NOSORTHANDLE, lsymbol_undefined,
+			     FALSE, NOSORTHANDLE, smemberInfo_undefined);
+    }
+  else
+    {
+      sort bsort = sort_lookupName (lsymbol_translateSort (map, bname));
+
+      if (sort_isNoSort (bsort))
+	{
+	  lineptr = strchr (line, ' ');	/* go past "sort" */
+	  llassert (lineptr != NULL);
+	  lineptr = strchr (lineptr + 1, ' ');	/* go past sostr */
+	  llassert (lineptr != NULL);
+	  lineptr = strchr (lineptr + 1, ' ');	/* go past kstr */
+	  llassert (lineptr != NULL);
+	  col = 5 + lineptr - line;	/* 5 for initial "%LCL "*/
+
+	  llbug 
+	    (message ("%q: Imported file contains unknown base sort: %s",
+		      fileloc_unparseRawCol (cstring_fromChars (importfile), 
+					     tsource_thisLineNumber (s), col),
+		      cstring_fromChars (lsymbol_toCharsSafe (bname))));
+	}
+      
+      if (strcmp (kstr, "vec") == 0)
+	{			
+	  objName = lsymbol_fromChars (objstr);
+	  objSort = sort_lookupName (lsymbol_translateSort (map, objName));
+	  (void) sort_construct (sname, SRT_VECTOR, bsort, lsymbol_undefined,
+				 FALSE, objSort, smemberInfo_undefined);
+	}
+      else
+	{
+	  sort_loadOther (kstr, sname, bsort);
+	}
+    } 
+}
+
+void
+sort_import (tsource *imported, ltoken tok, mapping * map)
+{
+  /* tok is only used for error message line number */
+  char *buf, *importfile;
+  tsource *lclsource;
+  sort bsort;
+  lsymbolList slist = lsymbolList_new ();
+
+  buf = tsource_nextLine (imported);
+
+  llassert (buf != NULL);
+
+  importfile = tsource_fileName (imported);
+
+  if (!firstWord (buf, "%LCLSortTable"))
+    {
+      lclsource = LCLScanSource ();
+
+      lclfatalerror (tok, message ("Expecting \"%%LCLSortTable\" line "
+				   "in import file %s:\n%s",
+				   cstring_fromChars (importfile), 
+				   cstring_fromChars (buf)));
+      
+    }
+
+  for (;;)
+    {
+      buf = tsource_nextLine (imported);
+
+      llassert (buf != NULL);
+
+      if (firstWord (buf, "%LCLSortTableEnd"))
+	{
+	  break;
+	}
+      else
+	{ /* a good line, remove %LCL from line first */
+	  if (firstWord (buf, "%LCL"))
+	    {
+	      parseSortLine (buf + 4, tok, imported, map, slist);
+	    }
+	  else
+	    {
+	      lclsource = LCLScanSource ();
+	      lclfatalerror
+		(tok, 
+		 message ("Expecting '%%LCL' prefix in import file %s:\n%s\n",
+			  cstring_fromChars (importfile), 
+			  cstring_fromChars (buf)));
+	    }
+	}
+    }
+
+  /* now process the smemberInfo in the sort List */
+  lsymbolList_elements (slist, s)
+    {
+      if (s != lsymbol_undefined)
+	{
+	  sort sor;
+	  sortNode sn;
+
+	  sor = sort_lookupName (s);
+	  sn = sort_quietLookup (sor);
+	  
+	  switch (sn.kind)
+	    {
+	    case SRT_ENUM:
+	      {			/* update the symbol table with members of enum */
+		varInfo vi;
+		smemberInfo *mlist = sn.members;
+		for (; mlist != NULL; mlist = mlist->next)
+		  {
+		    /* check that enumeration constants are unique */
+		    vi = symtable_varInfo (g_symtab, mlist->name);
+		    if (!varInfo_exists (vi))
+		      {	/* put info into symbol table */
+			vi = (varInfo) dmalloc (sizeof (*vi));
+			vi->id = ltoken_create (NOTTOKEN, mlist->name);
+			vi->kind = VRK_ENUM;
+			vi->sort = sor;
+			vi->export = TRUE;
+
+			(void) symtable_enterVar (g_symtab, vi);
+			varInfo_free (vi);
+		      }
+		    else
+		      {
+			lclplainerror 
+			  (message ("%s: enum member %s of %s has already been declared",
+				    cstring_fromChars (importfile), 
+				    lsymbol_toString (mlist->name),
+				    lsymbol_toString (sn.name)));
+		      }
+		  }
+		/*@switchbreak@*/ break;
+	      }
+	    case SRT_STRUCT:
+	    case SRT_UNION:
+	      {
+		smemberInfo *mlist = sn.members;
+
+		for (; mlist != NULL; mlist = mlist->next)
+		  {
+		    bsort = sort_lookupName (lsymbol_translateSort (map, mlist->sortname));
+		    if (sort_isNoSort (bsort))
+		      {
+			lclbug (message ("%s: member %s of %s has unknown sort\n",
+					 cstring_fromChars (importfile), 
+					 cstring_fromChars (lsymbol_toChars (mlist->name)),
+					 cstring_fromChars (lsymbol_toChars (sn.name))));
+		      }
+		    else
+		      {
+			mlist->sort = bsort;
+		      }
+		  }
+		/*@switchbreak@*/ break;
+	      }
+	    default:
+	      lclbug (message ("%s: %s has unexpected sort kind %s",
+			       cstring_fromChars (importfile), 
+			       cstring_fromChars (lsymbol_toChars (sn.name)),
+			       sort_unparseKind (sn.kind)));
+	    }
+	}
+    } end_lsymbolList_elements;
+  
+  /* list and sorts in it are not used anymore */
+  lsymbolList_free (slist);
+}
+
+bool
+sort_equal (sort *s1, sort *s2)
+{
+  sort syn1, syn2;
+  if ((s1 != 0) && (s2 != 0))
+    {
+      if ((*s1) == (*s2))
+	return TRUE;
+     /* handle synonym sorts */
+      syn1 = sort_getUnderlying (*s1);
+      syn2 = sort_getUnderlying (*s2);
+      if (syn1 == syn2)
+	return TRUE;
+     /* makes bool and Bool equal */
+    }
+  return FALSE;
+}
+
+bool
+sort_compatible (sort s1, sort s2)
+{
+  sort syn1, syn2;
+ /* later: might consider "char" and enum types the same as "int" */
+  if (s1 == s2)
+    return TRUE;
+ /* handle synonym sorts */
+  syn1 = sort_getUnderlying (s1);
+  syn2 = sort_getUnderlying (s2);
+  if (syn1 == syn2)
+    return TRUE;
+  /* makes bool and Bool equal */
+  return FALSE;
+}
+
+bool
+sort_compatible_modulo_cstring (sort s1, sort s2)
+{
+ /* like sort_compatible but also handles special cstring inits,
+    allows the following 2 cases:
+     char c[] = "abc"; (LHS: char_Obj_Arr, RHS = char_Vec)
+                       (c as implicitly coerced into c^)
+     char *d = "abc";  (LHS: char_Obj_Ptr, RHS = char_Vec)
+                       (d as implicitly coerced into d[]^)
+		       */
+  sort syn1, syn2;
+  if (sort_compatible (s1, s2))
+    return TRUE;
+  syn1 = sort_getUnderlying (s1);
+  syn2 = sort_getUnderlying (s2);
+  if (sort_cstring == syn2 &&
+      (syn1 == char_obj_ptrSort || syn1 == char_obj_ArrSort))
+    return TRUE;
+  return FALSE;
+}
+
+lsymbol
+sort_getLsymbol (sort sor)
+{
+ /*  sortNode sn = sort_lookup (sor); */
+  sortNode sn = sort_quietLookup (sor);
+  return sn.name;
+}
+
+/* a few handy routines for debugging */
+
+char *sort_getName (sort s)
+{
+  return (lsymbol_toCharsSafe (sort_getLsymbol (s)));
+}
+
+/*@exposed@*/ cstring
+sort_unparseName (sort s)
+{
+    return (cstring_fromChars (sort_getName (s)));
+}
+
+static void
+sortError (ltoken t, sort oldsort, sortNode newnode)
+{
+  sortNode old = sort_quietLookup (oldsort);
+
+  if ((old.kind <= SRT_FIRST || old.kind >= SRT_LAST) ||
+      (newnode.kind <= SRT_FIRST || newnode.kind >= SRT_LAST))
+    {
+      llbuglit ("sortError: illegal sort kind");
+    }
+
+  llassert (sortTable != NULL);
+
+  lclerror (t, message ("Sort %s defined as %s cannot be redefined as %s",
+			cstring_fromChars (lsymbol_toChars (newnode.name)),
+			sort_unparseKindName (sortTable[oldsort]),
+			sort_unparseKindName (newnode)));
+}
+
+static /*@observer@*/ cstring
+  sort_unparseKindName (sortNode s)
+{
+  switch (s.kind)
+    {
+    case SRT_NONE:
+      return cstring_fromChars (sortKindName[(int)s.kind]);
+    default:
+      if (s.abstract)
+	{
+	  if (s.mutable)
+	    {
+	      return cstring_makeLiteralTemp ("MUTABLE");
+	    }
+	  else
+	    {
+	      return cstring_makeLiteralTemp ("IMMUTABLE");
+	    }
+	}
+      else
+	return cstring_fromChars (sortKindName[(int)s.kind]);
+    }
+  
+  BADEXIT;
+}
+
+sort
+sort_fromLsymbol (lsymbol sortid)
+{
+ /* like sort_lookupName but creates sort if not already present */
+  sort sort = sort_lookupName (sortid);
+  if (sort == NOSORTHANDLE)
+    sort = sort_makeSort (ltoken_undefined, sortid);
+  return sort;
+}
+
+bool
+sort_isHOFSortKind (sort s)
+{
+  sortNode sn = sort_quietLookup (s);
+  if (sn.kind == SRT_HOF)
+    return TRUE;
+  return FALSE;
+}
+
+/*
+** returns TRUE iff s has State operators (', ~, ^)
+*/
+
+static bool
+sort_hasStateFcns (sort s)
+{
+  sortNode sn = sort_quietLookup (s);
+  sortKind kind = sn.kind;
+
+  if (kind == SRT_SYN)
+    {
+      return (sort_hasStateFcns (sn.baseSort));
+    }
+
+  return ((kind == SRT_PTR) ||
+	  (kind == SRT_OBJ) ||
+	  (kind == SRT_ARRAY) ||
+	  (kind == SRT_STRUCT) ||
+	  (kind == SRT_UNION));
+}
+
+
diff --git a/src/sortList.c b/src/sortList.c
new file mode 100644
index 0000000..89a24b2
--- /dev/null
+++ b/src/sortList.c
@@ -0,0 +1,139 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** sortList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ sortList
+sortList_new ()
+{
+  sortList s = (sortList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = sortListBASESIZE;
+  s->elements = (sort *) dmalloc (sizeof (*s->elements) * sortListBASESIZE);
+  s->current = 0;
+
+  return (s);
+}
+
+static void
+sortList_grow (sortList s)
+{
+  int i;
+  sort *newelements;
+
+  s->nspace += sortListBASESIZE;
+
+  newelements = (sort *) dmalloc (sizeof (*newelements) * (s->nelements + s->nspace));
+
+  if (newelements == (sort *) 0)
+    {
+      llfatalerror (cstring_makeLiteral ("sortList_grow: out of memory!"));
+    }
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+void 
+sortList_addh (sortList s, sort el)
+{
+  if (s->nspace <= 0)
+    sortList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+}
+
+void 
+sortList_reset (sortList s)
+{
+  s->current = 0;
+}
+
+void 
+sortList_advance (sortList s)
+{
+  s->current++;
+  llassert (s->current < s->nelements);
+}
+
+sort 
+sortList_current (sortList s)
+{
+  if (s->current < 0 || s->current >= s->nelements)
+    {
+      llbug (message ("sortList_current: current out of range: %d (size: %d)",
+		      s->current, s->nelements));
+    }
+  return (s->elements[s->current]);
+}
+
+/*@only@*/ cstring
+sortList_unparse (sortList s)
+{
+  int i;
+  cstring st = cstring_undefined;
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      if (i == 0)
+	{
+	  st = cstring_copy (sort_unparseName (s->elements[i])); /* !!! NEED COPY HERE !!! */
+	}
+      else
+	{
+	  st = message ("%q, %s", st, sort_unparseName (s->elements[i]));
+	}
+    }
+
+  return st;
+}
+
+void
+sortList_free (sortList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      /*      sort_free (s->elements[i]); */
+    }
+  
+  sfree (s->elements);		/* not quite!!! */
+  sfree (s);
+}
diff --git a/src/sortSet.c b/src/sortSet.c
new file mode 100644
index 0000000..02f4f84
--- /dev/null
+++ b/src/sortSet.c
@@ -0,0 +1,236 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** sortSet.c
+**
+** based on set_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+sortSet sortSet_new ()
+{
+  sortSet s = (sortSet) dmalloc (sizeof (*s));
+  
+  s->entries = 0;
+  s->nspace = sortSetBASESIZE;
+  s->elements = (sort *) dmalloc (sizeof (*s->elements) * sortSetBASESIZE);
+  
+  return (s);
+}
+
+static /*@notnull@*/ sortSet
+sortSet_predict (int size)
+{
+  sortSet s = (sortSet) dmalloc (sizeof (*s));
+  
+  s->entries = 0;
+
+  if (size > 0)
+    {
+      s->nspace = size;
+      s->elements = (sort *) dmalloc (sizeof (*s->elements) * size);
+    }
+  else
+    {
+      s->nspace = 0;
+      s->elements = NULL;
+    }
+  
+  return (s);
+}
+
+static void
+sortSet_grow (/*@notnull@*/ sortSet s)
+{
+  int i;
+  sort *newelements; 
+
+  s->nspace = sortSetBASESIZE;
+  newelements = (sort *) dmalloc (sizeof (*newelements) * (s->entries + s->nspace));
+
+  if (newelements == (sort *) 0)
+    {
+      llfatalerror (cstring_makeLiteral ("sortSet_grow: out of memory!"));
+    }
+
+  for (i = 0; i < s->entries; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+/*
+** Ensures: if *e \in *s
+**          then unchanged (*s) & result = false
+**          else *s' = insert (*s, *e) & result = true
+** Modifies: *s
+*/
+
+bool
+sortSet_insert (sortSet s, sort el)
+{
+  llassert (sortSet_isDefined (s));
+
+  if (sortSet_member (s, el))
+    {
+      return FALSE;
+    }
+  else
+    {
+      if (s->nspace <= 0)
+	sortSet_grow (s);
+      s->nspace--;
+      s->elements[s->entries] = el;
+      s->entries++;
+      return TRUE;
+    }
+}
+
+sort
+sortSet_choose (sortSet s)
+{
+  llassert (sortSet_isDefined (s) && s->entries > 0);
+  return (s->elements[0]);
+}
+
+bool
+sortSet_member (sortSet s, sort el)
+{
+  if (sortSet_isDefined (s))
+    {
+      int i;
+
+      for (i = 0; i < s->entries; i++)
+	{
+	  if (sort_equal (&el, &(s->elements[i])))
+	    {
+	      return TRUE;
+	    }
+	}
+    }
+
+  return FALSE;
+}
+
+/*@only@*/ cstring
+sortSet_unparse (sortSet s)
+{
+  return (message ("{ %q }", sortSet_unparseClean (s)));
+}
+
+/*@only@*/ cstring
+sortSet_unparseClean (sortSet s)
+{
+  cstring st = cstring_undefined;
+
+  if (sortSet_isDefined (s))
+    {
+      int i;
+
+      for (i = 0; i < s->entries; i++)
+	{
+	  if (i == 0)
+	    {
+	      st = message ("%q%s", st, sort_unparseName (s->elements[i]));
+	    }
+	  else
+	    {
+	      st = message ("%q, %s", st, sort_unparseName (s->elements[i]));
+	    }
+	}
+    }
+
+  return st;
+}
+
+/*@only@*/ cstring
+sortSet_unparseOr (sortSet s)
+{
+  cstring st = cstring_undefined;
+
+  if (sortSet_isDefined (s))
+    {
+      int i;
+      int last = s->entries - 1;
+      
+      for (i = 0; i < s->entries; i++)
+	{
+	  if (i == 0)
+	    {
+	      st = cstring_concatFree (st, sort_unparse (s->elements[i]));
+	    }
+	  else
+	    {
+	      if (i == last)
+		{
+		  /* was sort_unparse ??? */
+		  st = message ("%q or %q", st, sort_unparse (s->elements[i]));
+		}
+	      else
+		{
+		  st = message ("%q, %q", st, sort_unparse (s->elements[i]));
+		}
+	    }
+	}
+    }
+  
+  return st;
+}
+
+void
+sortSet_free (sortSet s)
+{
+  if (sortSet_isDefined (s))
+    {
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
+
+/*@only@*/ sortSet
+sortSet_copy (sortSet s)
+{
+  sortSet t = sortSet_predict (sortSet_size (s));
+  int i;
+
+  if (sortSet_isDefined (s))
+    {
+      for (i = 0; i < sortSet_size (s); i++)
+	{
+	  (void) sortSet_insert (t, s->elements[i]); 
+	}
+    }
+
+  return t;
+}
+
+
+
diff --git a/src/sortSetList.c b/src/sortSetList.c
new file mode 100644
index 0000000..4b7bc63
--- /dev/null
+++ b/src/sortSetList.c
@@ -0,0 +1,140 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** sortSetList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ sortSetList
+sortSetList_new ()
+{
+  sortSetList s = (sortSetList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->free = sortSetListBASESIZE;
+  s->elements = (sortSet *) dmalloc (sizeof (*s->elements) * sortSetListBASESIZE);
+  s->current = 0;
+  
+  return (s);
+}
+
+static void
+sortSetList_grow (sortSetList s)
+{
+  int i;
+  sortSet *newelements;
+
+  s->free += sortSetListBASESIZE;
+  newelements = (sortSet *) dmalloc (sizeof (*newelements)
+				     * (s->nelements + s->free));
+  
+  if (newelements == (sortSet *) 0)
+    {
+      llfatalerror (cstring_makeLiteral ("sortSetList_grow: out of memory!"));
+    }
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+void 
+sortSetList_addh (sortSetList s, sortSet el)
+{
+  llassert (sortSetListBASESIZE > 0);
+
+  if (s->free <= 0)
+    sortSetList_grow (s);
+
+  s->free--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+}
+
+void 
+sortSetList_reset (sortSetList s)
+{
+  s->current = 0;
+}
+
+void 
+sortSetList_advance (sortSetList s)
+{
+  s->current++;
+}
+
+/*@observer@*/ sortSet 
+sortSetList_head (sortSetList s)
+{
+  llassert (s->nelements > 0);
+  return (s->elements[0]);
+}
+
+/*@observer@*/ sortSet 
+sortSetList_current (sortSetList s)
+{
+  if (s->current < 0 || s->current >= s->nelements)
+    {
+      llbug (message ("sortSetList_current: current out of range: %d (size: %d)",
+		      s->current, s->nelements));
+    }
+  return (s->elements[s->current]);
+}
+
+/*@only@*/ cstring
+sortSetList_unparse (sortSetList s)
+{
+  int i;
+  cstring st = cstring_makeLiteral ("[ ");
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      if (i != 0)
+	st = message ("%q, %q", st, sortSet_unparse (s->elements[i]));
+      else
+	st = message ("%q%q", st, sortSet_unparse (s->elements[i]));
+    }
+  
+  st = message ("%q]", st);
+  return st;
+}
+
+void
+sortSetList_free (sortSetList s)
+{
+  /* note: elements are dependent */
+
+  sfree (s->elements);	     
+  sfree (s);
+}
diff --git a/src/source.c b/src/source.c
new file mode 100644
index 0000000..b9852f2
--- /dev/null
+++ b/src/source.c
@@ -0,0 +1,332 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** source.c
+**
+** Interface to source file abstraction
+**
+**	NOTE:	    This module is almost identical to the one for LCL.  The
+**		    only difference is that a couple of source lines have been
+**		    commented out.
+**
+**		    This module has too many dependencies to be in the common
+**		    source area.  Any of the solutions that would allow this
+**		    module to be common had its own set of compromises.  It
+**		    seemed best and most straightforward to just keep separte
+**		    copies for LSL and LCL.  We should examine this again if we
+**		    ever reorganize the module structure.
+**
+**  AUTHORS:
+**
+**     Steve Garland,
+**         Massachusetts Institute of Technology
+**     Joe Wild, Technical Languages and Environments, DECspec project
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "osd.h"
+# include "portab.h"
+
+extern bool
+tsource_close (tsource *s)
+{
+  if (s->file != NULL)
+    {
+      check (fclose (s->file) == 0);
+      s->file = NULL;
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+extern void
+tsource_free (/*@null@*/ /*@only@*/ tsource *s)
+{
+  if (s != NULL)
+    {
+      sfree (s->name);
+      sfree (s->stringSource);
+      sfree (s);
+    }
+}
+
+extern /*@only@*/ tsource *
+  tsource_create (char *name, char *suffix, bool echo)
+{
+  char *ps;
+  tsource *s = (tsource *) dmalloc (sizeof (*s));
+  
+  s->name = (char *) dmalloc (strlen (name) + strlen (suffix) + 1);
+  s->file = 0;
+  strcpy (s->name, name);
+
+  ps = strrchr (s->name, CONNECTCHAR);
+
+  if (ps == (char *) 0)
+    {
+      ps = s->name;
+    }
+
+  if (strchr (ps, '.') == NULL)
+    {
+      strcat (s->name, suffix);
+    }
+
+  
+
+  s->lineNo = 0;
+  s->echo = echo;
+  s->fromString = FALSE;
+  s->stringSource = NULL;
+  s->stringSourceTail = NULL;
+  
+
+  return s;
+}
+
+extern /*@only@*/ tsource *
+tsource_fromString (char *name, char *str)
+{
+  tsource *s = (tsource *) dmalloc (sizeof (*s));
+
+  s->name = mstring_copy (name);
+  s->stringSource = mstring_copy (str);
+  s->stringSourceTail = s->stringSource;
+  s->file = 0;
+  s->echo = FALSE;
+  s->fromString = TRUE;
+  s->lineNo = 0;
+
+    return s;
+}
+
+extern /*@dependent@*/ /*@null@*/ 
+char *tsource_nextLine (tsource *s)
+{
+  char *currentLine;
+  int len;
+
+  if (s->fromString)
+    {
+      if (s->stringSourceTail == NULL || (strlen (s->stringSourceTail) == 0))
+	{
+	  currentLine = 0;
+	}
+      else
+	{
+	  char *c = strchr (s->stringSourceTail, '\n');
+	  
+	  
+	  /* in case line is terminated not by newline */ 
+	  if (c == 0)
+	    {
+	      c = strchr (s->stringSourceTail, '\0');
+	    }
+
+	  len = c - s->stringSourceTail + 1;
+
+	  if (len > STUBMAXRECORDSIZE - 2)
+	    {
+	      len = (STUBMAXRECORDSIZE - 2);
+	    }
+
+	  currentLine = &(s->buffer)[0];
+	  strncpy (currentLine, s->stringSourceTail, size_fromInt (len));
+	  currentLine[len] = '\0';
+	  s->stringSourceTail += len;
+	}
+      
+    }
+  else
+    {
+      llassert (s->file != NULL);
+      currentLine = fgets (&(s->buffer)[0], STUBMAXRECORDSIZE, s->file);
+    }
+  if (currentLine == 0)
+    {
+      strcpy (s->buffer, "*** End of File ***");
+    }
+  else
+    {
+      s->lineNo++;
+      len = strlen (currentLine) - 1;
+      if (s->buffer[len] == '\n')
+	{
+	  s->buffer[len] = '\0';
+	}
+      else 
+	{
+	  if (len >= STUBMAXRECORDSIZE - 2)
+	    {
+	      lldiagmsg (message ("Input line too long: %s",
+				  cstring_fromChars (currentLine)));
+	    }
+	}
+    }
+  /* if (s->echo) slo_echoLine (currentLine);		only needed in LCL */
+    return currentLine;
+}
+
+extern bool
+tsource_open (tsource *s)
+{
+  if (s->fromString)
+    {
+      /* not an error: tail is dependent */
+      s->stringSourceTail = s->stringSource; 
+      return TRUE;
+    }
+
+  DPRINTF (("Open: %s", s->name));
+  s->file = fopen (s->name, "r");
+  return (s->file != 0 || s->fromString);
+}
+
+/*
+** requires
+**  path != NULL \and
+**  s != NULL \and
+**  *s.name == filename (*s.name) || filetype (*s.name)
+**      *s.name consists of a file name and type only (".)
+**	No path name is included
+**
+** ensures
+**  if filefound (*path, *s) then
+**	result = true \and *s.name = filespec_where_file_found (*path, *s)
+**  else
+**	result = false
+*/
+
+extern bool tsource_getPath (char *path, tsource *s)
+{
+  char *returnPath;
+  filestatus status;		/* return status of osd_getEnvPath.*/
+  bool rVal;			/* return value of this procedure. */
+
+ /* Check if requires met. */
+  if (path == NULL || s == NULL || s->name == NULL)
+    {
+      llbugexitlit ("tsource_getPath: invalid parameter");
+    }
+
+  status = osd_getPath (path, s->name, &returnPath);
+
+  if (status == OSD_FILEFOUND)
+    {				/* Should be majority of cases. */
+      rVal = TRUE;
+      
+      sfree (s->name);
+      s->name = returnPath;
+    }
+  else if (status == OSD_FILENOTFOUND)
+    {
+      rVal = FALSE;
+    }
+  else if (status == OSD_PATHTOOLONG)
+    {
+      rVal = FALSE;
+     /* Directory and filename are too long.  Report error. */
+     llbuglit ("soure_getPath: Filename plus directory from search path too long");
+ }
+  else
+    {
+      rVal = FALSE;
+      llbuglit ("tsource_getPath: invalid return status");
+    }
+  return rVal;
+}
+
+# ifndef NOLCL
+char *specFullName (char *specfile, /*@out@*/ char **inpath)
+{
+  /* extract the path and the specname associated with the given file */
+  char *specname = (char *) dmalloc (sizeof (*specname) 
+				     * (strlen (specfile) + 9));
+  char *ospecname = specname;
+  char *path = (char *) dmalloc (sizeof (*path) * (strlen (specfile)));
+  size_t size;
+  long int i, j;
+  
+  /* initialized path to empty string or may have accidental garbage */
+  *path = '\0';
+
+  /*@-mayaliasunique@*/ 
+  strcpy (specname, specfile);
+  /*@=mayaliasunique@*/ 
+
+  /* trim off pathnames in specfile */
+  size = strlen (specname);
+
+  for (i = size_toInt (size) - 1; i >= 0; i--)
+    {
+      if (specname[i] == CONNECTCHAR)
+	{
+	  /* strcpy (specname, (char *)specname+i+1); */
+	  for (j = 0; j <= i; j++)	/* include '/'  */
+	    {
+	      path[j] = specname[j];
+	    }
+
+	  path[i + 1] = '\0';
+	  specname += i + 1;
+	  break;
+	}
+    }
+
+  /* 
+  ** also remove .lcl file extension, assume it's the last extension
+  ** of the file name 
+  */
+
+  size = strlen (specname);
+
+  for (i = size_toInt (size) - 1; i >= 0; i--)
+    {
+      if (specname[i] == '.')
+	{
+	  specname[i] = '\0';
+	  break;
+	}
+    }
+  
+  *inpath = path;
+
+  /*
+  ** If specname no longer points to the original char,
+  ** we need to allocate a new pointer and copy the string.
+  */
+
+  if (specname != ospecname) {
+    char *rspecname = (char *) dmalloc (sizeof (*rspecname) * (strlen (specname) + 1));
+    strcpy (rspecname, specname); /* evs 2000-05-16: Bug: was ospecname! */
+    sfree (ospecname);
+    return rspecname;
+  } 
+
+  return specname;
+}
+# endif
+
diff --git a/src/specialClauses.c b/src/specialClauses.c
new file mode 100644
index 0000000..e905770
--- /dev/null
+++ b/src/specialClauses.c
@@ -0,0 +1,942 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** specialClauses.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+static bool specialClause_isMemoryAllocation (specialClause p_cl) /*@*/ ;
+static void specialClause_free (/*@only@*/ specialClause p_s) ;
+static cstring specialClause_dump (specialClause p_s) /*@*/ ;
+static specialClause specialClause_undump (char **p_s) /*@modifies *p_s@*/ ;
+static specialClause specialClause_copy (specialClause p_s) /*@*/ ;
+static bool specialClause_sameKind (specialClause p_s1, specialClause p_s2) /*@*/ ;
+
+specialClause 
+  specialClause_create (stateConstraint st, specialClauseKind k, sRefSet s) 
+{
+  specialClause ret = (specialClause) dmalloc (sizeof (*ret));
+
+  ret->state = st;
+  ret->kind = k;
+  ret->refs = s;
+
+  return ret;
+}
+
+bool specialClause_isBefore (specialClause cl)
+{
+  return (cl->state == TK_BEFORE || cl->state == TK_BOTH);
+}
+
+bool specialClause_isAfter (specialClause cl)
+{
+  return (cl->state == TK_AFTER || cl->state == TK_BOTH);
+}
+
+bool specialClause_isMemoryAllocation (specialClause cl)
+{
+  switch (cl->kind)
+    {
+    case SP_ALLOCATES:
+    case SP_RELEASES:
+    case SP_ISONLY:
+    case SP_ISSHARED:
+    case SP_ISDEPENDENT:
+    case SP_ISOWNED:
+    case SP_ISOBSERVER:
+    case SP_ISEXPOSED:
+      return TRUE;
+    case SP_USES:
+    case SP_DEFINES:
+    case SP_SETS:
+    case SP_ISNULL:
+    case SP_ISNOTNULL:
+      return FALSE;
+  }
+
+  BADEXIT;
+}
+
+/*
+** An error is reported if the test is NOT true.
+*/
+
+sRefTest specialClause_getPreTestFunction (specialClause cl)
+{
+  switch (cl->kind)
+    {
+    case SP_USES:
+      return sRef_isStrictReadable;
+    case SP_ALLOCATES:
+      return sRef_hasNoStorage; 
+    case SP_DEFINES:
+      return sRef_hasNoStorage;
+    case SP_SETS:
+      return sRef_isNotUndefined;
+    case SP_RELEASES:
+      return sRef_isNotUndefined;
+    case SP_ISONLY:
+      return sRef_isOnly;
+    case SP_ISSHARED:
+      return sRef_isShared;
+    case SP_ISDEPENDENT:
+      return sRef_isDependent;
+    case SP_ISOWNED:
+      return sRef_isOwned;
+    case SP_ISOBSERVER:
+      return sRef_isObserver;
+    case SP_ISEXPOSED:
+      return sRef_isExposed;
+    case SP_ISNOTNULL:
+      return sRef_isNotNull;
+    case SP_ISNULL:
+      return sRef_isDefinitelyNull;
+  }
+
+  BADEXIT;
+}
+
+sRefTest specialClause_getPostTestFunction (specialClause cl)
+{
+  switch (cl->kind)
+    {
+    case SP_USES:
+      return NULL;
+    case SP_ALLOCATES:
+      return sRef_isAllocated;
+    case SP_DEFINES:
+      return sRef_isReallyDefined;
+    case SP_SETS:
+      return sRef_isReallyDefined;
+    case SP_RELEASES:
+      return sRef_isDeadStorage;
+    case SP_ISONLY:
+      return sRef_isOnly;
+    case SP_ISSHARED:
+      return sRef_isShared;
+    case SP_ISDEPENDENT:
+      return sRef_isDependent;
+    case SP_ISOWNED:
+      return sRef_isOwned;
+    case SP_ISOBSERVER:
+      return sRef_isObserver;
+    case SP_ISEXPOSED:
+      return sRef_isExposed;
+    case SP_ISNOTNULL:
+      return sRef_isNotNull;
+    case SP_ISNULL:
+      return sRef_isDefinitelyNull;
+  }
+
+  BADEXIT;
+}
+
+sRefShower specialClause_getPostTestShower (specialClause cl)
+{
+  switch (cl->kind)
+    {
+    case SP_USES:
+    case SP_ALLOCATES:
+      return NULL;
+    case SP_DEFINES:
+    case SP_SETS:
+      return sRef_showNotReallyDefined;
+    case SP_RELEASES:
+      return NULL;
+    case SP_ISONLY:
+    case SP_ISSHARED:
+    case SP_ISDEPENDENT:
+    case SP_ISOWNED:
+      return sRef_showAliasInfo;
+    case SP_ISOBSERVER:
+    case SP_ISEXPOSED:
+      return sRef_showExpInfo;
+    case SP_ISNOTNULL:
+    case SP_ISNULL:
+      return sRef_showNullInfo;
+  }
+
+  BADEXIT;
+}
+
+sRefMod specialClause_getEntryFunction (specialClause cl)
+{
+  if (cl->state == TK_BEFORE || cl->state == TK_BOTH)
+    {
+      switch (cl->kind)
+	{
+	case SP_USES:
+	  return sRef_setDefinedComplete;
+	case SP_ALLOCATES:
+	  return NULL;
+	case SP_DEFINES:
+	  return NULL;
+	case SP_SETS:
+	  return sRef_setAllocatedComplete;
+	case SP_RELEASES:
+	  return sRef_setDefinedComplete;
+	case SP_ISONLY:
+	  return sRef_setOnly;
+	case SP_ISSHARED:
+	  return sRef_setShared;
+	case SP_ISDEPENDENT:
+	  return sRef_setDependent;
+	case SP_ISOWNED:
+	  return sRef_setOwned;
+	case SP_ISOBSERVER:
+	  return sRef_setObserver;
+	case SP_ISEXPOSED:
+	  return sRef_setExposed;
+	case SP_ISNOTNULL:
+	  return sRef_setNotNull;
+	case SP_ISNULL:
+	  return sRef_setDefNull;
+	}
+
+      BADBRANCH;
+    }
+  else
+    {
+      return NULL;
+    }
+}
+
+sRefMod specialClause_getEffectFunction (specialClause cl)
+{
+  if (cl->state == TK_AFTER || cl->state == TK_BOTH)
+    {
+      switch (cl->kind)
+	{
+	case SP_USES:
+	  return NULL;
+	case SP_ALLOCATES:
+	  return sRef_setAllocatedComplete;
+	case SP_DEFINES:
+	  return sRef_setDefinedNCComplete;
+	case SP_SETS:
+	  return sRef_setDefinedNCComplete;
+	case SP_RELEASES:
+	  return sRef_killComplete;
+	case SP_ISONLY:
+	  return sRef_setOnly;
+	case SP_ISSHARED:
+	  return sRef_setShared;
+	case SP_ISDEPENDENT:
+	  return sRef_setDependent;
+	case SP_ISOWNED:
+	  return sRef_setOwned;
+	case SP_ISOBSERVER:
+	  return sRef_setObserver;
+	case SP_ISEXPOSED:
+	  return sRef_setExposed;
+	case SP_ISNOTNULL:
+	  return sRef_setNotNull;
+	case SP_ISNULL:
+	  return sRef_setDefNull;
+	}
+
+      BADBRANCH;
+    }
+  else
+    {
+      return NULL;
+    }
+}
+
+sRefMod specialClause_getReturnEffectFunction (specialClause cl)
+{
+  if (cl->state == TK_AFTER || cl->state == TK_BOTH)
+    {
+      switch (cl->kind)
+	{
+	case SP_USES:
+	case SP_ALLOCATES:
+	case SP_DEFINES:
+	case SP_SETS:
+	case SP_RELEASES:
+	  return NULL;
+	case SP_ISONLY:
+	  return sRef_killComplete;
+	case SP_ISSHARED:
+	case SP_ISDEPENDENT:
+	case SP_ISOWNED:
+	case SP_ISOBSERVER:
+	case SP_ISEXPOSED:
+	case SP_ISNULL:
+	case SP_ISNOTNULL:
+	  return NULL;
+	}
+
+      BADBRANCH;
+    }
+  else
+    {
+      return NULL;
+    }
+}
+
+flagcode specialClause_preErrorCode (specialClause cl)
+{
+  llassert (cl->state == TK_BOTH || cl->state == TK_BEFORE);
+
+  switch (cl->kind)
+    {
+    case SP_USES:
+      return FLG_USEDEF;
+    case SP_ALLOCATES: /*@fallthrough@*/ 
+    case SP_DEFINES:
+    case SP_SETS:
+      return FLG_MUSTFREE;
+    case SP_RELEASES:
+      return FLG_USEDEF;
+    case SP_ISONLY:
+      return FLG_ONLYTRANS;
+    case SP_ISSHARED:
+      return FLG_SHAREDTRANS;
+    case SP_ISDEPENDENT:
+      return FLG_DEPENDENTTRANS;
+    case SP_ISOWNED:
+      return FLG_OWNEDTRANS;
+    case SP_ISOBSERVER:
+      return FLG_OBSERVERTRANS;
+    case SP_ISEXPOSED:
+      return FLG_EXPOSETRANS;
+    case SP_ISNULL:
+    case SP_ISNOTNULL:
+      return FLG_NULLSTATE;
+  }
+
+  BADBRANCH;
+}
+
+cstring specialClause_preErrorString (specialClause cl, sRef sr)
+{
+  llassert (cl->state == TK_BOTH || cl->state == TK_BEFORE);
+
+  switch (cl->kind)
+    {
+    case SP_USES:
+      if (sRef_isDead (sr)) 
+	return cstring_makeLiteralTemp ("Dead");
+      else
+	return cstring_makeLiteralTemp ("Undefined");
+    case SP_ALLOCATES: /*@fallthrough@*/ 
+    case SP_DEFINES:
+    case SP_SETS:
+      return cstring_makeLiteralTemp ("Allocated");
+    case SP_RELEASES:
+      if (sRef_isDead (sr)) 
+	{
+	  return cstring_makeLiteralTemp ("Dead");
+	}
+      else if (sRef_isDependent (sr) 
+	       || sRef_isShared (sr))
+	{
+	  return alkind_unparse (sRef_getAliasKind (sr));
+	}
+      else if (sRef_isObserver (sr) || sRef_isExposed (sr))
+	{
+	  return exkind_unparse (sRef_getExKind (sr));
+	}
+      else
+	{
+	  return cstring_makeLiteralTemp ("Undefined");
+	}
+    case SP_ISONLY:
+    case SP_ISSHARED:
+    case SP_ISDEPENDENT:
+    case SP_ISOWNED:
+      return alkind_capName (sRef_getAliasKind (sr));
+    case SP_ISOBSERVER:
+      return cstring_makeLiteralTemp ("Non-observer");
+    case SP_ISEXPOSED:
+      if (sRef_isObserver (sr))
+	{
+	  return cstring_makeLiteralTemp ("Observer");
+	}
+      else
+	{
+	  return cstring_makeLiteralTemp ("Non-exposed");
+	}
+    case SP_ISNOTNULL:
+      if (sRef_isDefinitelyNull (sr))
+	{
+	  return cstring_makeLiteralTemp ("Null");
+	}
+      else
+	{
+	  return cstring_makeLiteralTemp ("Possibly null");
+	}
+    case SP_ISNULL:
+      return cstring_makeLiteralTemp ("Non-null");
+  }
+
+  BADEXIT;
+}
+
+flagcode specialClause_postErrorCode (specialClause cl)
+{
+  llassert (cl->state == TK_BOTH || cl->state == TK_AFTER);
+
+  switch (cl->kind)
+    {
+    case SP_USES:
+      BADBRANCHCONT;
+      return INVALID_FLAG;
+    case SP_ALLOCATES: 
+    case SP_DEFINES:  
+    case SP_SETS:     
+      return FLG_COMPDEF;
+    case SP_RELEASES:
+      return FLG_MUSTFREE;
+    case SP_ISONLY:
+      return FLG_ONLYTRANS;
+    case SP_ISSHARED:
+      return FLG_SHAREDTRANS;
+    case SP_ISDEPENDENT:
+      return FLG_DEPENDENTTRANS;
+    case SP_ISOWNED:
+      return FLG_OWNEDTRANS;
+    case SP_ISOBSERVER:
+      return FLG_OBSERVERTRANS;
+    case SP_ISEXPOSED:
+      return FLG_EXPOSETRANS;
+    case SP_ISNULL:
+    case SP_ISNOTNULL:
+      return FLG_NULLSTATE;
+  }
+
+  BADBRANCH;
+}
+
+cstring specialClause_postErrorString (specialClause cl, sRef sr)
+{
+  llassert (cl->state == TK_BOTH || cl->state == TK_AFTER);
+
+  switch (cl->kind)
+    {
+    case SP_USES:
+      BADBRANCHCONT;
+      return cstring_makeLiteralTemp ("");
+    case SP_ALLOCATES: 
+      return cstring_makeLiteralTemp ("Unallocated");
+    case SP_DEFINES:
+    case SP_SETS:
+      return cstring_makeLiteralTemp ("Undefined");
+    case SP_RELEASES:
+      return cstring_makeLiteralTemp ("Unreleased");
+    case SP_ISONLY:
+    case SP_ISSHARED:
+    case SP_ISOWNED:
+    case SP_ISDEPENDENT:
+      return alkind_capName (sRef_getAliasKind (sr));
+    case SP_ISOBSERVER:
+      return cstring_makeLiteralTemp ("Non-observer");
+    case SP_ISEXPOSED:
+      if (sRef_isObserver (sr))
+	{
+	  return cstring_makeLiteralTemp ("Observer");
+	}
+      else
+	{
+	  return cstring_makeLiteralTemp ("Non-exposed");
+	}
+    case SP_ISNULL:
+      return cstring_makeLiteralTemp ("Non-null");
+    case SP_ISNOTNULL:
+      if (sRef_isDefinitelyNull (sr))
+	{
+	  return cstring_makeLiteralTemp ("Null");
+	}
+      else
+	{
+	  return cstring_makeLiteralTemp ("Possibly null");
+	}
+  }
+
+  BADEXIT;
+}
+
+cstring specialClause_dump (specialClause s)
+{
+  return (message ("%d.%d.%q",
+		   (int) s->state,
+		   (int) s->kind,
+		   sRefSet_dump (s->refs)));
+}
+
+specialClause specialClause_undump (char **s)
+{
+  specialClause ret = (specialClause) dmalloc (sizeof (*ret));
+
+  ret->state = (stateConstraint) getInt (s);
+  checkChar (s, '.');
+  ret->kind = (specialClauseKind) getInt (s);
+  checkChar (s, '.');
+  ret->refs = sRefSet_undump (s);
+
+  return ret;
+}
+
+specialClause specialClause_copy (specialClause s) 
+{
+  specialClause ret = (specialClause) dmalloc (sizeof (*ret));
+  
+  ret->state = s->state;
+  ret->kind = s->kind;
+  ret->refs = sRefSet_newCopy (s->refs);
+  
+  return ret;
+}
+
+bool specialClause_sameKind (specialClause s1, specialClause s2)
+{
+  return (s1->state == s2->state && s1->kind == s2->kind);
+}
+
+void specialClause_free (specialClause s)
+{
+  sRefSet_free (s->refs);
+  sfree (s);
+}
+
+static /*@observer@*/ cstring 
+  specialClauseKind_unparse (specialClauseKind k) 
+{
+  switch (k)
+    {
+    case SP_USES: 
+      return cstring_makeLiteralTemp ("uses");
+    case SP_DEFINES:
+      return cstring_makeLiteralTemp ("defines");
+    case SP_ALLOCATES:
+      return cstring_makeLiteralTemp ("allocates");
+    case SP_RELEASES:
+      return cstring_makeLiteralTemp ("releases");
+    case SP_SETS:
+      return cstring_makeLiteralTemp ("sets");
+    case SP_ISNULL:
+      return cstring_makeLiteralTemp ("isnull");
+    case SP_ISNOTNULL:
+      return cstring_makeLiteralTemp ("notnull");
+    case SP_ISONLY:
+      return cstring_makeLiteralTemp ("only");
+    case SP_ISSHARED:
+      return cstring_makeLiteralTemp ("shared");
+    case SP_ISDEPENDENT:
+      return cstring_makeLiteralTemp ("dependent");
+    case SP_ISOWNED:
+      return cstring_makeLiteralTemp ("owned");
+    case SP_ISOBSERVER:
+      return cstring_makeLiteralTemp ("observer");
+    case SP_ISEXPOSED:
+      return cstring_makeLiteralTemp ("exposed");
+    }
+
+  BADEXIT;
+}
+
+cstring specialClause_unparseKind (specialClause s)
+{
+  return (message ("%s%s",
+		   cstring_makeLiteralTemp (s->state == TK_BEFORE 
+					    ? "pre:"
+					    : (s->state == TK_AFTER
+					       ? "post:" : "")),
+		   specialClauseKind_unparse (s->kind)));
+}
+
+cstring specialClause_unparse (specialClause s)
+{
+  return (message ("%q %q", 
+		   specialClause_unparseKind (s), sRefSet_unparse (s->refs)));
+}
+
+specialClause specialClause_createDefines (sRefSet s)
+{
+  return (specialClause_create (TK_BOTH, SP_DEFINES, s));
+}
+
+specialClause specialClause_createUses (sRefSet s)
+{
+  return (specialClause_create (TK_BOTH, SP_USES, s));
+}
+
+specialClause specialClause_createSets (sRefSet s)
+{
+  return (specialClause_create (TK_BOTH, SP_SETS, s));
+}
+
+specialClause specialClause_createReleases (sRefSet s)
+{
+  return (specialClause_create (TK_BOTH, SP_RELEASES, s));
+}
+
+specialClause specialClause_createAllocates (sRefSet s)
+{
+  return (specialClause_create (TK_BOTH, SP_ALLOCATES, s));
+}
+
+static /*@notnull@*/ specialClauses specialClauses_new (void)
+{
+  specialClauses s = (specialClauses) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = specialClausesBASESIZE;
+  s->elements = (specialClause *) 
+    dmalloc (sizeof (*s->elements) * specialClausesBASESIZE);
+
+  return (s);
+}
+
+static void
+specialClauses_grow (specialClauses s)
+{
+  int i;
+  specialClause *newelements;
+
+  llassert (specialClauses_isDefined (s));
+
+  s->nspace += specialClausesBASESIZE; 
+  
+  newelements = (specialClause *) 
+    dmalloc (sizeof (*newelements) * (s->nelements + s->nspace));
+  
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+  
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+specialClauses specialClauses_add (specialClauses s, specialClause el)
+{
+  if (specialClauses_isUndefined (s))
+    {
+      s = specialClauses_new ();
+    }
+  else
+    {
+      specialClauses_elements (s, cl)
+	{
+	  if (specialClause_sameKind (cl, el))
+	    {
+	      voptgenerror
+		(FLG_SYNTAX,
+		 message ("Multiple %q clauses for one function (using union)",
+			  specialClause_unparseKind (cl)),
+		 g_currentloc);
+
+	      cl->refs = sRefSet_union (cl->refs, el->refs);
+	      specialClause_free (el);
+	      return s;
+	    }
+	} end_specialClauses_elements ;
+    }
+
+  if (s->nspace <= 0)
+    {
+      specialClauses_grow (s);
+    }
+  
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+cstring specialClauses_unparse (specialClauses s)
+{
+  cstring st = cstring_undefined;
+  int i;
+  
+  if (specialClauses_isDefined (s))
+    {
+      for (i = 0; i < specialClauses_size (s); i++)
+	{
+	  if (i == 0)
+	    {
+	      st = message ("%q;", specialClause_unparse (s->elements[i]));
+	    }
+	  else
+	    st = message ("%q %q;", st, specialClause_unparse (s->elements[i]));
+	}
+    }
+  
+  return (st);
+}
+
+specialClauses specialClauses_copy (specialClauses s)
+{
+  if (specialClauses_isDefined (s))
+    {
+      specialClauses t = (specialClauses) dmalloc (sizeof (*t));
+      int i;
+      
+      t->nelements = s->nelements;
+      t->nspace = 0;
+      
+      if (s->nelements > 0)
+	{
+	  t->elements = (specialClause *) dmalloc (sizeof (*t->elements) * t->nelements);
+	  for (i = 0; i < s->nelements; i++) 
+	    {
+	      t->elements[i] = specialClause_copy (s->elements[i]); 
+	    }
+	}
+      else
+	{
+	  t->elements = NULL;
+	}
+
+      return t;
+    }
+  else
+    {
+      return specialClauses_undefined;
+    }
+}
+
+void
+specialClauses_free (specialClauses s)
+{
+  if (!specialClauses_isUndefined (s)) 
+    {
+      int i;
+
+      for (i = 0; i < s->nelements; i++)
+	{
+	  specialClause_free (s->elements[i]);  
+	}
+
+      sfree (s->elements);
+      sfree (s);
+    }
+}
+
+cstring specialClauses_dump (specialClauses s)
+{
+  cstring st = cstring_undefined;
+
+  if (specialClauses_isUndefined (s)) return st;
+  
+  specialClauses_elements (s, current)
+    {
+      st = message ("%q%q$", st, specialClause_dump (current));
+    } end_specialClauses_elements;
+
+  return st;
+}
+
+specialClauses specialClauses_undump (char **s)
+{
+  char c;
+  specialClauses pn = specialClauses_new ();
+  int paramno = 0;
+
+  c = **s;
+
+  while (c != '#' && c != '@')
+    {
+      specialClause sc = specialClause_undump (s);
+      
+      pn = specialClauses_add (pn, sc);
+      checkChar (s, '$');
+      c = **s;
+      paramno++;
+    }
+
+  return pn;
+}
+
+static /*@exposed@*/ sRefSet
+  specialClauses_getClause (specialClauses s, stateConstraint st, 
+			    specialClauseKind k)
+{
+  specialClauses_elements (s, el)
+    {
+      if (el->state == st && el->kind == k)
+	{
+	  return el->refs;
+	}
+    } end_specialClauses_elements ;
+
+  return sRefSet_undefined;
+}
+
+void specialClauses_checkAll (uentry ue)
+{
+  specialClauses clauses = uentry_getSpecialClauses (ue);
+  sRef res = uentry_getSref (ue);		  
+  bool specialResult = FALSE;
+
+  specialClauses_elements (clauses, cl)
+    {
+      bool isPre = (cl->state == TK_BEFORE);
+      sRefSet refs = cl->refs;
+
+      sRefSet_allElements (refs, el)
+	{
+	  sRef rb = sRef_getRootBase (el);
+
+	  if (sRef_isResult (rb))
+	    {
+	      if (isPre)
+		{
+		  voptgenerror
+		    (FLG_INCONDEFS,
+		     message ("Function result is used in %q clause of %q "
+			      "(%q applies to the state before function is "
+			      "called, so should not use result): %q",
+			      specialClause_unparseKind (cl),
+			      uentry_getName (ue),
+			      specialClause_unparseKind (cl),
+			      sRef_unparse (el)),
+		     uentry_whereLast (ue));
+		}
+	      else
+		{
+		  if (!sRef_isStateSpecial (res))
+		    {
+		      if (!specialResult)
+			{
+			  voptgenerror
+			    (FLG_INCONDEFS,
+			     message ("Function result is used in %q clause of %q "
+				      "but not annotated with special: %q",
+				      specialClause_unparseKind (cl),
+				      uentry_getName (ue),
+				      sRef_unparse (el)),
+			     uentry_whereLast (ue));
+
+			  specialResult = TRUE;
+			}
+		    }
+
+		  (void) sRef_fixResultType (el, sRef_getType (res), ue);
+		}
+	    }
+	  else if (sRef_isParam (rb))
+	    {
+	      if (!sRef_isStateSpecial (rb))
+		{
+		  voptgenerror 
+		    (FLG_INCONDEFS,
+		     message ("Reference %q used in %q clause of %q, "
+			      "but not annotated with special: %q",
+			      sRef_unparse (rb),
+			      specialClause_unparseKind (cl),
+			      uentry_getName (ue),
+			      sRef_unparse (el)),
+		     uentry_whereLast (ue));
+		}
+	    }
+	  else if (sRef_isInvalid (rb))
+	    {
+	      /*@innercontinue@*/ continue;
+	    }
+	  else 
+	    {
+	      BADBRANCHCONT;
+	      /*@innercontinue@*/ continue;
+	    }
+
+	  if (specialClause_isMemoryAllocation (cl))
+	    {
+	      if (!ctype_isVisiblySharable (sRef_getType (el)))
+		{
+		  llerror 
+		    (FLG_SYNTAX, 
+		     message ("Special clause %q includes %q of "
+			      "non-dynamically allocatated type %s",
+			      specialClause_unparseKind (cl),
+			      sRef_unparse (el), 
+			      ctype_unparse (sRef_getType (el))));
+		}
+	    }
+
+	} end_sRefSet_allElements ;
+    } end_specialClauses_elements ;
+}
+  
+void specialClauses_checkEqual (uentry old, uentry unew)
+{
+  specialClauses oldClauses = uentry_getSpecialClauses (old);
+  specialClauses newClauses = uentry_getSpecialClauses (unew);
+
+  if (specialClauses_isDefined (newClauses))
+    {
+      specialClauses_elements (newClauses, cl)
+	{
+	  sRefSet sc = specialClauses_getClause (oldClauses, cl->state, cl->kind);
+
+	  if (!sRefSet_equal (sc, cl->refs))
+	    {
+	      if (optgenerror
+		  (FLG_INCONDEFS,
+		   message ("Function %q %rdeclared with inconsistent %q clause: %q",
+			    uentry_getName (old),
+			    uentry_isDeclared (old),
+			    specialClause_unparseKind (cl),
+			    sRefSet_unparsePlain (cl->refs)),
+		   g_currentloc))
+		{
+		  uentry_showWhereLastExtra (old, sRefSet_unparsePlain (sc));
+		}
+	    }
+	} end_specialClauses_elements ;
+
+      specialClauses_elements (oldClauses, cl)
+	{
+	  sRefSet sc = specialClauses_getClause (newClauses, cl->state, cl->kind);
+
+	  if (sRefSet_isUndefined (sc) && !sRefSet_isEmpty (cl->refs))
+	    {
+	      if (optgenerror
+		  (FLG_INCONDEFS,
+		   message ("Function %q %rdeclared without %q clause (either "
+			    "use no special clauses in redeclaration, or "
+			    "they must match exactly: %q",
+			    uentry_getName (old),
+			    uentry_isDeclared (old),
+			    specialClause_unparseKind (cl),
+			    sRefSet_unparsePlain (cl->refs)),
+		   g_currentloc))
+		{
+		  uentry_showWhereLastExtra (old, sRefSet_unparsePlain (sc));
+		}
+	    }
+	} end_specialClauses_elements ;
+
+    }
+}
+
+
+
diff --git a/src/stDeclNodeList.c b/src/stDeclNodeList.c
new file mode 100644
index 0000000..48e6c27
--- /dev/null
+++ b/src/stDeclNodeList.c
@@ -0,0 +1,129 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** structDeclNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ stDeclNodeList
+stDeclNodeList_new ()
+{
+  stDeclNodeList s = (stDeclNodeList) dmalloc (sizeof (*s));
+
+  s->nelements = 0;
+  s->nspace = stDeclNodeListBASESIZE;
+  s->elements = (stDeclNode *)
+    dmalloc (sizeof (*s->elements) * stDeclNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+stDeclNodeList_grow (stDeclNodeList s)
+{
+  int i;
+  stDeclNode *newelements; 
+
+  s->nspace += stDeclNodeListBASESIZE;
+
+  newelements = (stDeclNode *) dmalloc (sizeof (*newelements)
+					* (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i]; 
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+stDeclNodeList  
+stDeclNodeList_add (stDeclNodeList s, /*@only@*/ stDeclNode el)
+{
+  if (s->nspace <= 0)
+    stDeclNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+/*@only@*/ stDeclNodeList 
+stDeclNodeList_copy (stDeclNodeList s)
+{
+  stDeclNodeList r = stDeclNodeList_new ();
+
+  stDeclNodeList_elements (s, x)
+    {
+      r = stDeclNodeList_add (r, stDeclNode_copy (x));
+    } end_stDeclNodeList_elements;
+  
+  return r;
+}
+
+/*@only@*/ cstring
+stDeclNodeList_unparse (stDeclNodeList s)
+{
+  bool first = TRUE;
+  cstring st = cstring_undefined;
+
+  stDeclNodeList_elements (s, current)
+  {
+    if (first)
+      {
+	st = message ("%q %q;", lclTypeSpecNode_unparse (current->lcltypespec),
+		      declaratorNodeList_unparse (current->declarators));
+	first = FALSE;
+      }
+    else
+      {
+	st = message ("%q %q %q;", st, lclTypeSpecNode_unparse (current->lcltypespec),
+		      declaratorNodeList_unparse (current->declarators));
+      }
+  } end_stDeclNodeList_elements;
+
+  return st;
+}
+
+void
+stDeclNodeList_free (stDeclNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      stDeclNode_free (s->elements[i]); 
+    }
+
+  sfree (s->elements); 
+  sfree (s);
+}
diff --git a/src/storeRefNodeList.c b/src/storeRefNodeList.c
new file mode 100644
index 0000000..b4a4715
--- /dev/null
+++ b/src/storeRefNodeList.c
@@ -0,0 +1,142 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** storeRefNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ storeRefNodeList
+storeRefNodeList_new ()
+{
+  storeRefNodeList s = (storeRefNodeList) dmalloc (sizeof (*s));
+
+  s->nelements = 0;
+  s->nspace = storeRefNodeListBASESIZE;
+  s->elements = (storeRefNode *) 
+    dmalloc (sizeof (*s->elements) * storeRefNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+storeRefNodeList_grow (storeRefNodeList s)
+{
+  int i;
+  storeRefNode *newelements; 
+
+  s->nspace += storeRefNodeListBASESIZE;
+
+  newelements = (storeRefNode *) dmalloc (sizeof (*newelements)
+					  * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i]; 
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+storeRefNodeList
+storeRefNodeList_add (storeRefNodeList s, storeRefNode el)
+{
+  if (s->nspace <= 0)
+    storeRefNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+/*@only@*/ storeRefNodeList 
+storeRefNodeList_copy (storeRefNodeList s)
+{
+  storeRefNodeList r = storeRefNodeList_new ();
+
+  storeRefNodeList_elements (s, x)
+    {
+      r = storeRefNodeList_add (r, storeRefNode_copy (x));
+    } end_storeRefNodeList_elements;
+
+  return r;
+}
+
+/*@only@*/ cstring
+storeRefNodeList_unparse (storeRefNodeList s)
+{
+  bool first = TRUE;
+  cstring st = cstring_undefined;
+
+  storeRefNodeList_elements (s, current)
+  {
+    if (first)
+      {
+	first = FALSE;
+      }
+    else
+      {
+	st = message ("%q, ", st);
+      }
+
+    switch (current->kind)
+      {
+      case SRN_OBJ:
+	st = message ("%qobj", st);
+	/*@switchbreak@*/ break;
+      case SRN_TERM:
+	st = message ("%q%q", st, termNode_unparse (current->content.term));
+	/*@switchbreak@*/ break;
+      case SRN_TYPE:
+	st = message ("%q%q", st, lclTypeSpecNode_unparse (current->content.type));
+	/*@switchbreak@*/ break;
+      case SRN_SPECIAL:
+	st = message ("%q%q", st, sRef_unparse (current->content.ref));
+	/*@switchbreak@*/ break;
+      }
+  } end_storeRefNodeList_elements;
+
+  return st;
+}
+
+void
+storeRefNodeList_free (storeRefNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      storeRefNode_free (s->elements[i]);
+    }
+
+  sfree (s->elements);
+  sfree (s);
+}
diff --git a/src/structNames.c b/src/structNames.c
new file mode 100644
index 0000000..cc55d27
--- /dev/null
+++ b/src/structNames.c
@@ -0,0 +1,154 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** structNames.c
+**
+** Hacks to fit tags into the same namespace.
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "structNames.h"
+
+/*@constant char MARKCHAR_STRUCT; @*/
+# define MARKCHAR_STRUCT '@'
+
+/*@constant char MARKCHAR_UNION; @*/
+# define MARKCHAR_UNION  '$'
+
+/*@constant char MARKCHAR_ENUM; @*/
+# define MARKCHAR_ENUM   '&'
+
+/*@constant char MARKCHAR_PARAM; @*/
+# define MARKCHAR_PARAM  '%'
+
+/*@only@*/ cstring fixTagName (cstring s)
+{
+  if (isFakeTag (s))
+    {
+      switch (cstring_firstChar (s))
+	{
+	case MARKCHAR_STRUCT: return (cstring_makeLiteral ("struct"));
+	case MARKCHAR_UNION:  return (cstring_makeLiteral ("union"));
+	case MARKCHAR_ENUM:   return (cstring_makeLiteral ("enum"));
+	default:         return (message ("", s));
+	  /* BADDEFAULT; */
+	}
+    }
+  else
+    {
+      if (cstring_isDefined (s)) {
+	switch (cstring_firstChar (s))
+	  {
+	  case MARKCHAR_STRUCT:
+	    return (message ("struct %s", cstring_suffix (s, 1)));
+	  case MARKCHAR_UNION: 
+	    return (message ("union %s", cstring_suffix (s, 1)));
+	  case MARKCHAR_ENUM:   
+	    return (message ("enum %s", cstring_suffix (s, 1)));
+	    BADDEFAULT;
+	  }
+      } else {
+	return (cstring_makeLiteral (""));
+      }
+    }
+}
+
+cstring makeParam (cstring s)
+{
+  if (cstring_length(s) > 0 && cstring_firstChar (s) == MARKCHAR_PARAM)
+    {
+      llbug (message ("makeParam: %s\n", s));
+    }
+
+  if (cstring_isUndefined (s))
+    {
+      return cstring_undefined;
+    }
+
+  return (cstring_prependChar (MARKCHAR_PARAM, s));  
+}
+
+/*@observer@*/ cstring fixParamName (cstring s)
+{
+  if (cstring_length(s) < 1)
+    {
+      return cstring_undefined;
+    }
+
+  if (cstring_firstChar (s) != MARKCHAR_PARAM)
+    {
+      llbug (message ("fixParamName (no #): %s", s));
+    }
+
+  return (cstring_suffix (s, 1));
+}
+
+cstring makeStruct (cstring s)
+{
+  if (cstring_firstChar (s) == '@')
+    {
+      llbug (message ("makeStruct: %s\n", s));
+    }
+
+  return (cstring_prependChar (MARKCHAR_STRUCT, s));
+}
+
+cstring makeUnion (cstring s)
+{
+  return (cstring_prependChar (MARKCHAR_UNION, s));
+}
+
+cstring makeEnum (cstring s)
+{
+  return (cstring_prependChar (MARKCHAR_ENUM, s));
+}
+
+static unsigned int tagno = 1;
+
+void setTagNo (unsigned int n)
+{
+  if (n > tagno)
+    tagno = n;
+}
+
+bool isFakeTag (cstring s)
+{
+  int length = cstring_length (s);
+
+  return ((length >= 1 && cstring_firstChar (s) == '!')
+	  || (length >= 2 && cstring_getChar (s, 2) == '!'));
+}
+
+cstring fakeTag ()
+{
+  tagno++;
+
+  return (message ("!%u", tagno));
+}
+
+
+
+
+
diff --git a/src/symtable.c b/src/symtable.c
new file mode 100644
index 0000000..4908c66
--- /dev/null
+++ b/src/symtable.c
@@ -0,0 +1,2121 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** symtable.c
+**
+** Symbol table abstraction
+**
+**  AUTHORS:
+**
+**	Gary Feldman, Technical Languages and Environments, DECspec project
+**	Steve Garland,
+**         Massachusetts Institute of Technology
+**	Joe Wild, Technical Languages and Environments, DECspec project
+**	Yang Meng Tan,
+**         Massachusetts Institute of Technology
+**
+**  CREATION DATE:
+**
+**	20 January 1991
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "gram.h"
+# include "lclscan.h"
+# include "lclsyntable.h"
+# include "lslparse.h"
+
+/*@+ignorequals@*/
+
+static bool isBlankLine (char *p_line);
+static bool inImport = FALSE;
+
+/*@constant static int MAXBUFFLEN;@*/
+# define MAXBUFFLEN 512
+/*@constant static int DELTA;@*/
+# define DELTA 100
+
+static void symHashTable_dump (symHashTable * p_t, FILE * p_f, bool p_lco);
+
+static void tagInfo_free (/*@only@*/ tagInfo p_tag);
+static /*@observer@*/ scopeInfo symtable_scopeInfo (symtable p_stable);
+
+static void symtable_dumpId (symtable p_stable, FILE *p_f, bool p_lco);
+static lsymbol nameNode2key (nameNode p_n);
+
+typedef enum
+{
+  SYMK_FCN, SYMK_SCOPE, SYMK_TYPE, SYMK_VAR
+} symKind;
+
+typedef struct
+{
+  symKind kind;
+  union
+  {
+    /*@only@*/ fctInfo fct;
+    /*@only@*/ scopeInfo scope;
+    /*@only@*/ typeInfo type;
+    /*@only@*/ varInfo var;
+  } info;
+} idTableEntry;
+
+typedef struct _idTable
+{
+  unsigned int size;
+  unsigned int allocated;
+  /*@relnull@*/ idTableEntry *entries;
+  bool exporting;
+} idTable;
+
+struct _symtableStruct
+{
+  idTable *idTable;		/* data is idTableEntry */
+  symHashTable *hTable;		/* data is htData */
+  mapping *type2sort;		/* maps LCL type symbol to LSL sort */
+} ;
+
+static /*@observer@*/ ltoken idTableEntry_getId (idTableEntry *p_x);
+static /*@out@*/ /*@exposed@*/ idTableEntry *nextFree (idTable * p_st);
+static /*@dependent@*/ /*@null@*/ idTableEntry *symtable_lookup (idTable * p_st, lsymbol p_id);
+static /*@dependent@*/ /*@null@*/ idTableEntry *symtable_lookupInScope (idTable * p_st, lsymbol p_id);
+
+static /*@only@*/ idTable *symtable_newIdTable (void);
+static void idTableEntry_free (idTableEntry p_x);
+
+/* Local implementatio of hash table */
+
+static bool allowed_redeclaration = FALSE;
+static symbolKey htData_key (htData *p_x);
+
+static void symHashTable_free (/*@only@*/ symHashTable *p_h);
+static /*@only@*/ symHashTable *symHashTable_create (unsigned int p_size);
+static /*@null@*/ /*@exposed@*/ htData *
+  symHashTable_get (symHashTable * p_t, symbolKey p_key, infoKind p_kind, 
+		 /*@null@*/ nameNode p_n);
+static bool symHashTable_put (symHashTable *p_t, /*@only@*/ htData *p_data);
+static /*@only@*/ /*@exposed@*/ /*@null@*/ htData *
+  symHashTable_forcePut (symHashTable * p_t, /*@only@*/ htData *p_data);
+/* static unsigned int symHashTable_count (symHashTable * t); */
+
+static void idTable_free (/*@only@*/ idTable *p_st);
+
+void varInfo_free (/*@only@*/ varInfo v)
+{
+  sfree (v);
+}
+
+static /*@only@*/ varInfo varInfo_copy (varInfo v)
+{
+  varInfo ret = (varInfo) dmalloc (sizeof (*ret));
+
+  ret->id = ltoken_copy (v->id);
+  ret->sort = v->sort;
+  ret->kind = v->kind;
+  ret->export = v->export;
+
+  return ret;
+}
+
+void symtable_free (symtable stable)
+{
+  /* symtable_printStats (stable); */
+
+  idTable_free (stable->idTable);
+  symHashTable_free (stable->hTable);
+  mapping_free (stable->type2sort);
+  sfree (stable);
+}
+
+static void idTable_free (idTable *st)
+{
+  unsigned int i;
+
+  for (i = 0; i < st->size; i++)
+    {
+      idTableEntry_free (st->entries[i]);
+    }
+
+  sfree (st->entries);
+  sfree (st);
+}
+
+static void fctInfo_free (/*@only@*/ fctInfo f)
+{
+  signNode_free (f->signature);
+  pairNodeList_free (f->globals);
+  ltoken_free (f->id);
+  sfree (f);
+}
+
+static void typeInfo_free (/*@only@*/ typeInfo t)
+{
+  sfree (t);
+}
+
+static void scopeInfo_free (/*@only@*/ scopeInfo s)
+{
+  sfree (s);
+}
+
+static void idTableEntry_free (idTableEntry x)
+{
+  switch (x.kind)
+    {
+    case SYMK_FCN:
+      fctInfo_free (x.info.fct);
+      break;
+    case SYMK_SCOPE:
+      scopeInfo_free (x.info.scope);
+      break;
+    case SYMK_TYPE:
+      typeInfo_free (x.info.type);
+      break;
+    case SYMK_VAR:
+      varInfo_free (x.info.var);
+      break;
+    }
+}
+
+static /*@observer@*/ ltoken idTableEntry_getId (idTableEntry *x)
+{
+  switch (x->kind)
+    {
+    case SYMK_FCN:
+      return (x->info.fct->id);
+    case SYMK_SCOPE:
+      return ltoken_undefined;
+    case SYMK_TYPE:
+      return (x->info.type->id);
+    case SYMK_VAR:
+      return (x->info.var->id);
+    }
+
+  BADBRANCH;
+}
+
+/*@only@*/ symtable
+symtable_new (void)
+{
+  symtable stable = (symtable) dmalloc (sizeof (*stable));
+  idTableEntry *e;
+  
+  stable->idTable = symtable_newIdTable ();
+  stable->hTable = symHashTable_create (HT_MAXINDEX);
+  stable->type2sort = mapping_create ();
+  
+  /* add builtin synonym:  Bool -> bool */
+  
+  mapping_bind (stable->type2sort, lsymbol_getBool (), lsymbol_getbool ());
+
+  /*
+  ** done by symtable_newIdTable
+  ** st->allocated = 0;
+  ** st->entries = (idTableEntry *) 0;
+  ** st->exporting = TRUE;
+  */
+
+  /* this is global scope */
+  e = nextFree (stable->idTable);
+  e->kind = SYMK_SCOPE;
+  (e->info).scope = (scopeInfo) dmalloc (sizeof (*((e->info).scope)));
+  (e->info).scope->kind = SPE_GLOBAL;
+  
+  return stable;
+}
+
+static /*@only@*/ idTable *symtable_newIdTable (void)
+{
+  idTable *st = (idTable *) dmalloc (sizeof (*st));
+
+  st->size = 0;
+  st->allocated = 0;
+  st->entries = (idTableEntry *) 0;
+  st->exporting = TRUE;
+  
+  /* this was being done twice!
+     e = nextFree (st);
+     e->kind = SYMK_SCOPE;
+     (e->info).scope.kind = globScope;
+     */
+
+  return st;
+}
+
+static lsymbol
+nameNode2key (nameNode n)
+{
+  unsigned int ret;
+
+  if (n->isOpId)
+    {
+      ret =  ltoken_getText (n->content.opid);
+    }
+  else
+    {
+      /* use opForm's key as its Identifier */
+      llassert (n->content.opform != NULL);
+      ret = (n->content.opform)->key;
+    }
+
+  return ret;
+}
+
+/*
+** requires: nameNode n is already in st.
+*/
+
+static bool
+htData_insertSignature (htData *d, /*@owned@*/ sigNode oi)
+{
+  sigNodeSet set = d->content.op->signatures;
+
+  
+  if (oi != (sigNode) 0)
+    {
+      return (sigNodeSet_insert (set, oi));
+    }
+  return FALSE;
+}
+
+void
+symtable_enterOp (symtable st, /*@only@*/ /*@notnull@*/ nameNode n, 
+		  /*@owned@*/ sigNode oi)
+{
+  /*
+  ** Operators are overloaded, we allow entering opInfo more than once,
+  ** even if it's the same signature. 
+  **
+  ** Assumes all sorts are already entered into the symbol table 
+  */
+
+  symHashTable *ht = st->hTable;
+  htData *d;
+  lsymbol id;
+
+  
+  
+  id = nameNode2key (n);
+
+  d = symHashTable_get (ht, id, IK_OP, n);
+  
+  if (d == (htData *) 0)
+    {				/* first signature of this operator */
+      opInfo op = (opInfo) dmalloc (sizeof (*op));
+      htData *nd = (htData *) dmalloc (sizeof (*nd));
+
+      op->name = n;
+
+      if (oi != (sigNode) 0)
+	{
+	  op->signatures = sigNodeSet_singleton (oi);
+	  ht->count++;
+	}
+      else
+	{
+	  op->signatures = sigNodeSet_new ();
+	  sigNode_markOwned (oi);
+	}
+
+      nd->kind = IK_OP;
+      nd->content.op = op;
+      (void) symHashTable_put (ht, nd);
+    }
+  else
+    {
+      
+      nameNode_free (n);  /*<<count++;
+	}
+    }
+}
+
+bool
+  symtable_enterTag (symtable st, tagInfo ti)
+{
+  /* put ti only if it is not already in symtable */
+  symHashTable *ht = st->hTable;
+  htData *d;
+  symbolKey key = ltoken_getText (ti->id);
+
+  d = symHashTable_get (ht, key, IK_TAG, (nameNode) 0);
+  if (d == (htData *) 0)
+    {
+      d = (htData *) dmalloc (sizeof (*d));
+      d->kind = IK_TAG;
+      d->content.tag = ti;
+      d->content.tag->imported = context_inImport ();
+      (void) symHashTable_put (ht, d);
+      return TRUE;
+    }
+  else
+    {
+      if (d->content.tag->imported)
+	{
+	  d->content.tag = ti;
+	  d->content.tag->imported = context_inImport ();
+	  return TRUE;
+	}
+      else
+	{
+	  tagInfo_free (ti);
+	  return FALSE;
+	}
+    }
+}
+
+bool
+symtable_enterTagForce (symtable st, tagInfo ti)
+{
+ /* put ti, force-put if necessary */
+  symHashTable *ht = st->hTable;
+  htData *d;
+  symbolKey key = ltoken_getText (ti->id);
+
+  d = symHashTable_get (ht, key, IK_TAG, (nameNode) 0);
+
+  if (d == (htData *) 0)
+    {
+      d = (htData *) dmalloc (sizeof (*d));
+      
+      d->kind = IK_TAG;
+      d->content.tag = ti;
+      d->content.tag->imported = context_inImport ();
+      (void) symHashTable_put (ht, d);
+      return TRUE;
+    }
+  else
+    {
+            
+      d->kind = IK_TAG;
+      d->content.tag = ti;
+      d->content.tag->imported = context_inImport ();
+      /* interpret return data later, htData * */
+      /*@i@*/ (void) symHashTable_forcePut (ht, d);
+      return FALSE;
+    }
+}
+
+/*@null@*/ opInfo
+symtable_opInfo (symtable st, /*@notnull@*/ nameNode n)
+{
+  symHashTable *ht = st->hTable;
+  lsymbol i = nameNode2key (n);
+
+  htData *d;
+  d = symHashTable_get (ht, i, IK_OP, n);
+  if (d == (htData *) 0)
+    {
+      return (opInfo)NULL;
+    }
+
+  return (d->content.op);
+}
+
+/*@null@*/ tagInfo
+symtable_tagInfo (symtable st, lsymbol i)
+{
+  symHashTable *ht = st->hTable;
+  htData *d;
+  d = symHashTable_get (ht, i, IK_TAG, 0);
+
+  if (d == (htData *) 0)
+    {
+      return (tagInfo) NULL;
+    }
+
+  return (d->content.tag);
+}
+
+void
+  symtable_enterScope (symtable stable, scopeInfo si)
+{
+  idTable *st = stable->idTable;
+  idTableEntry *e = nextFree (st);
+  if (si->kind == SPE_GLOBAL)
+    llbuglit ("symtable_enterScope: SPE_GLOBAL");
+  e->kind = SYMK_SCOPE;
+  (e->info).scope = si;
+}
+
+void
+symtable_exitScope (symtable stable)
+{
+  idTable *st = stable->idTable;
+  int n;
+
+  if (st->entries != NULL)
+    {
+      for (n = st->size - 1; (st->entries[n]).kind != SYMK_SCOPE; n--)
+	{
+	  ;
+	}
+    }
+  else
+    {
+      llcontbuglit ("symtable_exitScope: no scope to exit");
+      n = 0;
+    }
+
+  st->size = n;
+}
+
+bool
+symtable_enterFct (symtable stable, fctInfo fi)
+{
+  idTable *st = stable->idTable;
+  idTableEntry *e;
+  bool redecl = FALSE;
+
+  if (!allowed_redeclaration &&
+      symtable_lookup (st, ltoken_getText (fi->id)) != (idTableEntry *) 0)
+    {
+      lclRedeclarationError (fi->id);
+      redecl = TRUE;
+    }
+  
+  e = nextFree (st);
+  e->kind = SYMK_FCN;
+  fi->export = st->exporting;	/* && !fi->private; */
+  (e->info).fct = fi;
+
+  return redecl;
+}
+
+void
+symtable_enterType (symtable stable, /*@only@*/ typeInfo ti)
+{
+  idTable *st = stable->idTable;
+  idTableEntry *e;
+  bool insertp = TRUE;
+  scopeKind k = (symtable_scopeInfo (stable))->kind;
+
+  /* symtable_disp (stable); */
+
+  if (k != SPE_GLOBAL && k != SPE_INVALID)	/* fixed for LCLint */
+    {
+      llbug (message ("%q: symtable_enterType: expect global scope. (type: %s)",
+		      ltoken_unparseLoc (ti->id),
+		      ltoken_getRawString (ti->id)));
+    }
+
+  if (!allowed_redeclaration &&
+      symtable_lookup (st, ltoken_getText (ti->id)) != (idTableEntry *) 0)
+    {
+     /* ignore if Bool is re-entered */
+      if (ltoken_getText (ti->id) == lsymbol_getBool () ||
+	  ltoken_getText (ti->id) == lsymbol_getbool ())
+	{
+	  insertp = FALSE;
+	}
+      else
+	{
+	  lclRedeclarationError (ti->id);
+	}
+    }
+  if (insertp)
+    {
+      /* make sure it is a type TYPEDEF_NAME; */
+      
+      if (ltoken_getCode (ti->id) != LLT_TYPEDEF_NAME)
+	{
+	  lclbug (message ("symtable_enterType: gets a simpleId, expect a type: %s",
+			   ltoken_getRawString (ti->id)));
+	}
+      
+      e = nextFree (st);
+      e->kind = SYMK_TYPE;
+      ti->export = st->exporting;/* && !ti->private; */
+      (e->info).type = ti;
+      mapping_bind (stable->type2sort, ltoken_getText (ti->id),
+		    sort_getLsymbol (sort_makeVal (sort_getUnderlying (ti->basedOn))));
+    }
+  else
+    {
+      typeInfo_free (ti);
+    }
+}
+
+lsymbol
+lsymbol_sortFromType (symtable s, lsymbol typename)
+{
+  lsymbol inter;
+  lsymbol out;
+  ltoken tok;
+ /* check the synonym table first */
+  if (LCLIsSyn (typename))
+    {
+      tok = LCLGetTokenForSyn (typename);
+      inter = ltoken_getText (tok);
+     /*    printf ("In lsymbol_sortFromType: %s -> %s\n",
+                lsymbol_toChars (typename), lsymbol_toChars (inter)); */
+    }
+  else
+    {
+      inter = typename;
+    }
+
+  /* now map LCL type to sort */
+  out = mapping_find (s->type2sort, inter);
+  
+  if (out == lsymbol_undefined)
+    {
+      return inter;
+    }
+
+  return out;
+}
+
+/* really temp! */
+
+/*
+** returns true is vi is a redeclaration
+*/
+
+bool
+symtable_enterVar (symtable stable, /*@temp@*/ varInfo vi)
+{
+  idTable *st = stable->idTable;
+  bool insertp = TRUE;
+  bool redecl = FALSE;
+
+  
+  /* symtable_disp (symtab); */
+  
+  if (!allowed_redeclaration &&
+      (symtable_lookupInScope (st, ltoken_getText (vi->id)) != (idTableEntry *) 0))
+    {
+      if (ltoken_getText (vi->id) == lsymbol_getTRUE () ||
+	  ltoken_getText (vi->id) == lsymbol_getFALSE ())
+	{
+	  insertp = FALSE;
+	}
+      else
+	{
+	  if (usymtab_existsEither (ltoken_getRawString (vi->id)))
+	    {
+	      	      lclRedeclarationError (vi->id);
+	      redecl = TRUE;
+	    }
+	  else
+	    {
+	      llbuglit ("redeclared somethingerother?!");
+	    }
+	}
+    }
+
+  if (insertp)
+    {
+      idTableEntry *e = nextFree (st);
+
+      e->kind = SYMK_VAR;
+      vi->export = st->exporting &&	/* !vi.private && */
+	(vi->kind == VRK_VAR || vi->kind == VRK_CONST || vi->kind == VRK_ENUM);
+      (e->info).var = varInfo_copy (vi);
+    }
+  
+    return (redecl);
+}
+
+bool
+symtable_exists (symtable stable, lsymbol i)
+{
+  idTable *st = stable->idTable;
+  return symtable_lookup (st, i) != (idTableEntry *) 0;
+}
+
+/*@null@*/ typeInfo
+symtable_typeInfo (symtable stable, lsymbol i)
+{
+  idTable *st;
+  idTableEntry *e;
+
+  st = stable->idTable;
+  e = symtable_lookup (st, i);
+
+  if (e == (idTableEntry *) 0 || e->kind != SYMK_TYPE)
+    {
+      return (typeInfo) NULL;
+    }
+
+  return (e->info).type;
+}
+
+/*@null@*/ varInfo
+symtable_varInfo (symtable stable, lsymbol i)
+{
+  idTable *st = stable->idTable;
+  idTableEntry *e;
+
+  e = symtable_lookup (st, i);
+
+  if (e == (idTableEntry *) 0 || e->kind != SYMK_VAR)
+    {
+      return (varInfo) NULL;
+    }
+
+  return (e->info).var;
+}
+
+/*@null@*/ varInfo
+symtable_varInfoInScope (symtable stable, lsymbol id)
+{
+  /* if current scope is a SPE_QUANT, can go beyond current scope */
+  idTable *st = stable->idTable;
+  idTableEntry *e2 = (idTableEntry *) 0;
+  int n;
+  
+  for (n = st->size - 1; n >= 0; n--)
+    {
+      ltoken tok;
+
+      e2 = &(st->entries[n]);
+      
+      if (e2->kind == SYMK_SCOPE && e2->info.scope->kind != SPE_QUANT)
+	{
+	  return (varInfo) NULL;
+	}
+
+      tok = idTableEntry_getId (e2);
+
+      if (e2->kind == SYMK_VAR && ltoken_getText (tok) == id)
+	{
+	  return (e2->info).var;
+	}
+    }
+
+  return (varInfo) NULL;
+}
+
+scopeInfo
+symtable_scopeInfo (symtable stable)
+{
+  idTable *st = stable->idTable;
+  int n;
+  idTableEntry *e;
+
+  for (n = st->size - 1; n >= 0; n--)
+    {
+      e = &(st->entries[n]);
+      if (e->kind == SYMK_SCOPE)
+	return (e->info).scope;
+    }
+
+  lclfatalbug ("symtable_scopeInfo: not found");
+  BADEXIT;
+}
+
+void
+symtable_export (symtable stable, bool yesNo)
+{
+  idTable *st = stable->idTable;
+  st->exporting = yesNo;
+  (void) sort_setExporting (yesNo);
+}
+
+static void
+symHashTable_dump (symHashTable * t, FILE * f, bool lco)
+{
+  /* like symHashTable_dump2 but for output to .lcs file */
+  int i, size;
+  bucket *b;
+  htEntry *entry;
+  htData *d;
+  ltoken tok;
+  sigNodeSet sigs;
+  
+  for (i = 0; i <= HT_MAXINDEX; i++)
+    {
+            b = t->buckets[i];
+
+      for (entry = b; entry != NULL; entry = entry->next)
+	{
+	  d = entry->data;
+
+	  switch (d->kind)
+	    {
+	    case IK_SORT:
+	      /*@switchbreak@*/ break;
+	    case IK_OP:
+	      {
+		char *name = cstring_toCharsSafe (nameNode_unparse (d->content.op->name));
+		sigs = d->content.op->signatures;
+		size = sigNodeSet_size (sigs);
+
+		
+		sigNodeSet_elements (sigs, x)
+		  {
+		    cstring s = sigNode_unparse (x);
+
+		    if (lco)
+		      {
+			fprintf (f, "%%LCL");
+		      }
+
+		    fprintf (f, "op %s %s\n", name, cstring_toCharsSafe (s));
+		    cstring_free (s);
+		  } end_sigNodeSet_elements;
+
+		sfree (name);
+		/*@switchbreak@*/ break;
+	      }
+	    case IK_TAG:
+	      tok = d->content.tag->id;
+	      
+	      if (!ltoken_isUndefined (tok))
+		{
+		  cstring s = tagKind_unparse (d->content.tag->kind);
+
+		  if (lco)
+		    {
+		      fprintf (f, "%%LCL");
+		    }
+
+		  fprintf (f, "tag %s %s\n", ltoken_getTextChars (tok), 
+			   cstring_toCharsSafe (s));
+		  cstring_free (s);
+		}
+	      /*@switchbreak@*/ break;
+	    }
+	}
+    }
+}
+
+void
+symtable_dump (symtable stable, FILE * f, bool lco)
+{
+  symHashTable *ht = stable->hTable;
+
+
+  fprintf (f, "%s\n", BEGINSYMTABLE);
+   
+  symHashTable_dump (ht, f, lco);
+   
+  symtable_dumpId (stable, f, lco);
+  
+  fprintf (f, "%s\n", SYMTABLEEND);
+  }
+
+lsymbol
+lsymbol_translateSort (mapping * m, lsymbol s)
+{
+  lsymbol res = mapping_find (m, s);
+  if (res == lsymbol_undefined)
+    return s;
+  return res;
+}
+
+static /*@null@*/ lslOp
+  lslOp_renameSorts (mapping *map,/*@returned@*/ /*@null@*/ lslOp op)
+{
+  sigNode sign;
+
+  if (op != (lslOp) 0)
+    {
+      ltokenList domain;
+      ltoken range;
+
+      sign = op->signature;
+      range = sign->range;
+      domain = sign->domain;
+
+      ltokenList_elements (domain, dt)
+	{
+	  ltoken_setText (dt, 
+			  lsymbol_translateSort (map, ltoken_getText (dt)));
+	} end_ltokenList_elements;
+
+      /*@-onlytrans@*/ /* A memory leak... */
+      op->signature = makesigNode (sign->tok, domain, range);
+      /*@=onlytrans@*/
+    }
+
+  return op;
+}
+
+static /*@null@*/ signNode
+  signNode_fromsigNode (sigNode s)
+{
+  signNode sign;
+  sortList slist;
+  
+  if (s == (sigNode) 0)
+    {
+      return (signNode) 0;
+    }
+  
+  sign = (signNode) dmalloc (sizeof (*sign));
+  slist = sortList_new ();
+  sign->tok = ltoken_copy (s->tok);
+  sign->key = s->key;
+  sign->range = sort_makeSort (ltoken_undefined, ltoken_getText (s->range));
+
+  ltokenList_elements (s->domain, dt)
+    {
+      sortList_addh (slist, sort_makeSort (ltoken_undefined, ltoken_getText (dt)));
+    } end_ltokenList_elements;
+
+  sign->domain = slist;
+  return sign;
+}
+
+
+/**  2.4.3 ymtan  93.09.23  -- fixed bug in parseGlobals: removed ";" at the
+ **                            end of pairNode (gstr).
+ */
+
+static /*@only@*/ pairNodeList
+parseGlobals (char *line, tsource *srce)
+{
+  pairNodeList plist = pairNodeList_new ();
+  pairNode p;
+  int semi_index;
+  char *lineptr, sostr[MAXBUFFLEN], gstr[MAXBUFFLEN];
+
+  /* line is not all blank */
+  /* expected format: "sort1 g1; sort2 g2; sort3 g3;" */
+  lineptr = line;
+  
+  while (!isBlankLine (lineptr))
+    {
+      if (sscanf (lineptr, "%s %s", &(sostr[0]), gstr) != 2)
+	{
+	  lclplainerror 
+	    (message 
+	     ("%q: Imported file contains illegal function global declaration.\n"
+	      "Skipping rest of the line: %s (%s)",
+	      fileloc_unparseRaw (cstring_fromChars (tsource_fileName (srce)), 
+				  tsource_thisLineNumber (srce)), 
+	      cstring_fromChars (line), 
+	      cstring_fromChars (lineptr)));
+	  return plist;
+	}
+      
+      p = (pairNode) dmalloc (sizeof (*p));
+      
+      /* Note: remove the ";" separator at the end of gstr */
+      semi_index = size_toInt (strlen (gstr));
+      gstr[semi_index - 1] = '\0';
+
+      p->tok = ltoken_create (NOTTOKEN, lsymbol_fromChars (gstr));
+      p->sort = sort_makeSort (ltoken_undefined, lsymbol_fromChars (sostr));
+
+      pairNodeList_addh (plist, p);
+      lineptr = strchr (lineptr, ';');	/* go pass the next; */
+
+      llassert (lineptr != NULL);
+      lineptr = lineptr + 1;
+    }
+
+  return plist;
+}
+
+static bool
+isBlankLine (char *line)
+{
+  int i;
+
+  if (line == NULL) return TRUE;
+
+  for (i = 0; line[i] != '\0'; i++)
+    {
+      if (line[i] == ' ')
+	continue;
+      if (line[i] == '\t')
+	continue;
+      if (line[i] == '\n')
+	return TRUE;
+      return FALSE;
+    }
+  return TRUE;
+}
+
+typedef /*@only@*/ fctInfo o_fctInfo;
+
+static void
+parseLine (char *line, tsource *srce, mapping * map)
+{
+  static /*@owned@*/ o_fctInfo *savedFcn = NULL;
+  char *lineptr, *lineptr2, *cimportfile = tsource_fileName (srce);
+  cstring importfile = cstring_fromChars (cimportfile);
+  char namestr[MAXBUFFLEN], kstr[20], sostr[MAXBUFFLEN];
+  sort bsort, nullSort = sort_makeNoSort ();
+  int col = 0;
+  fileloc imploc = fileloc_undefined;
+
+  
+  if (inImport)
+    {
+      imploc = fileloc_createImport (importfile, tsource_thisLineNumber (srce));
+    }
+  
+  if (firstWord (line, "op"))
+    {
+      lslOp op;
+
+      lineptr = strchr (line, 'o');	/* remove any leading blanks */
+      llassert (lineptr != NULL);
+      lineptr = strchr (lineptr, ' ');	/* go past "op" */
+      llassert (lineptr != NULL);
+
+      /* add a newline to the end of the line since parseOpLine expects it */
+      lineptr2 = strchr (lineptr, '\0');
+
+      if (lineptr2 != 0)
+	{
+	  *lineptr2 = '\n';
+	  *(lineptr2 + 1) = '\0';
+	}
+
+      llassert (cimportfile != NULL);
+      op = parseOpLine (cimportfile, lineptr + 1);
+      
+      if (op == (lslOp) 0)
+	{
+	  lclplainerror
+	    (message
+	     ("%q: Imported file contains illegal operator declaration:\n "
+	      "skipping this line: %s",
+	      fileloc_unparseRaw (importfile, tsource_thisLineNumber (srce)), 
+	      cstring_fromChars (line)));
+	  fileloc_free (imploc);
+	  return;
+	}
+
+            op = lslOp_renameSorts (map, op);
+
+      llassert (op != NULL);
+      llassert (op->name != NULL);
+
+      symtable_enterOp (g_symtab, op->name, 
+			sigNode_copy (op->signature));
+          /*@-mustfree@*/ } /*@=mustfree@*/
+  else if (firstWord (line, "type"))
+    {
+      typeInfo ti;
+
+      if (sscanf (line, "type %s %s %s", namestr, sostr, kstr) != 3)
+	{
+	  lclplainerror 
+	    (message ("%q: illegal type declaration:\n skipping this line: %s",
+		      fileloc_unparseRaw (importfile, tsource_thisLineNumber (srce)), 
+		      cstring_fromChars (line)));
+	  fileloc_free (imploc);
+	  return;
+	}
+      
+      ti = (typeInfo) dmalloc (sizeof (*ti));
+      ti->id = ltoken_createFull (LLT_TYPEDEF_NAME, lsymbol_fromChars (namestr),
+				    importfile, tsource_thisLineNumber (srce), col);
+
+      bsort = sort_lookupName (lsymbol_translateSort (map, lsymbol_fromChars (sostr)));
+
+      if (sort_isNoSort (bsort))
+	{
+	  lineptr = strchr (line, ' ');	/* go past "type" */
+	  llassert (lineptr != NULL);
+	  lineptr = strchr (lineptr + 1, ' ');	/* go past namestr */
+	  llassert (lineptr != NULL);
+	  col = 5 + lineptr - line;	/* 5 for initial "%LCL "*/
+
+	  lclbug (message ("%q: Imported files contains unknown base sort",
+			   fileloc_unparseRawCol (importfile, tsource_thisLineNumber (srce), col)));
+
+	  bsort = nullSort;
+	}
+      ti->basedOn = bsort;
+
+      if (strcmp (kstr, "exposed") == 0)
+	{
+	  ti->abstract = FALSE;
+	  ti->modifiable = TRUE;
+	}
+      else
+	{
+	  ti->abstract = TRUE;
+	  if (strcmp (kstr, "mutable") == 0)
+	    ti->modifiable = TRUE;
+	  else
+	    ti->modifiable = FALSE;
+	}
+      ti->export = TRUE;
+      
+      /* 
+      ** sort of a hack to get imports to work...
+      */
+      
+      if (inImport)
+	{
+	  cstring cnamestr = cstring_fromChars (namestr);
+
+	  if (!usymtab_existsGlobEither (cnamestr))
+	    {
+	      (void) usymtab_addEntry 
+		(uentry_makeDatatype (cnamestr, ctype_unknown,
+				      ti->abstract ? ynm_fromBool (ti->modifiable) : MAYBE,
+				      ti->abstract ? YES : NO,
+				      fileloc_copy (imploc)));
+	    }
+	}
+
+      symtable_enterType (g_symtab, ti);
+    }
+  else if (firstWord (line, "var"))
+    {
+      varInfo vi;
+
+      if (sscanf (line, "var %s %s", namestr, sostr) != 2)
+	{
+	  lclplainerror
+	    (message ("%q: Imported file contains illegal variable declaration.  "
+		      "Skipping this line.", 
+		      fileloc_unparseRaw (importfile, tsource_thisLineNumber (srce))));
+	  fileloc_free (imploc);
+	  return;
+	}
+
+      vi = (varInfo) dmalloc (sizeof (*vi));
+      bsort = sort_lookupName (lsymbol_translateSort (map, lsymbol_fromChars (sostr)));
+      lineptr = strchr (line, ' ');	/* go past "var" */
+      llassert (lineptr != NULL);
+      lineptr = strchr (lineptr + 1, ' ');	/* go past namestr */
+      llassert (lineptr != NULL);
+      col = 5 + lineptr - line;	/* 5 for initial "%LCL "*/
+
+      if (sort_isNoSort (bsort))
+	{
+	  lclplainerror (message ("%q: Imported file contains unknown base sort",
+				  fileloc_unparseRawCol (importfile, tsource_thisLineNumber (srce), col)));
+	  bsort = nullSort;
+	}
+
+      vi->id = ltoken_createFull (simpleId, lsymbol_fromChars (namestr),
+				  importfile, tsource_thisLineNumber (srce), col);
+      vi->sort = bsort;
+      vi->kind = VRK_VAR;
+      vi->export = TRUE;
+      (void) symtable_enterVar (g_symtab, vi);
+      varInfo_free (vi);
+
+      if (inImport)
+	{
+	  cstring cnamestr = cstring_fromChars (namestr);
+
+	  if (!usymtab_existsGlobEither (cnamestr))
+	    {
+	      
+	      (void) usymtab_supEntrySref 
+		(uentry_makeVariable (cnamestr, ctype_unknown, 
+				      fileloc_copy (imploc), 
+				      FALSE));
+	    }
+	}
+    }
+  else if (firstWord (line, "const"))
+    {
+      varInfo vi;
+
+      if (sscanf (line, "const %s %s", namestr, sostr) != 2)
+	{
+	  lclbug (message ("%q: Imported file contains illegal constant declaration: %s",
+			   fileloc_unparseRaw (importfile, tsource_thisLineNumber (srce)), 
+			   cstring_fromChars (line)));
+	  fileloc_free (imploc);
+	  return;
+	}
+
+      vi = (varInfo) dmalloc (sizeof (*vi));
+      bsort = sort_lookupName (lsymbol_translateSort (map, lsymbol_fromChars (sostr)));
+      lineptr = strchr (line, ' ');	/* go past "var" */
+      llassert (lineptr != NULL);
+      lineptr = strchr (lineptr + 1, ' ');	/* go past namestr */
+      llassert (lineptr != NULL);
+      
+      col = 5 + lineptr - line;	/* 5 for initial "%LCL "*/
+
+      if (sort_isNoSort (bsort))
+	{
+	  lclplainerror (message ("%q: Imported file contains unknown base sort",
+				  fileloc_unparseRawCol (importfile, tsource_thisLineNumber (srce), col)));
+	  bsort = nullSort;
+	}
+
+      vi->id = ltoken_createFull (simpleId, lsymbol_fromChars (namestr),
+				    importfile, tsource_thisLineNumber (srce), col);
+      vi->sort = bsort;
+      vi->kind = VRK_CONST;
+      vi->export = TRUE;
+      (void) symtable_enterVar (g_symtab, vi);
+      varInfo_free (vi);
+      
+      if (inImport)
+	{
+	  cstring cnamestr = cstring_fromChars (namestr);
+	  
+	  if (!usymtab_existsGlobEither (cnamestr))
+	    {
+	      	      
+	      (void) usymtab_addEntry (uentry_makeConstant (cnamestr,
+							    ctype_unknown,
+							    fileloc_copy (imploc)));
+	    }
+	}
+      /* must check for "fcnGlobals" before "fcn" */
+    }
+  else if (firstWord (line, "fcnGlobals"))
+    {
+      pairNodeList globals;
+      lineptr = strchr (line, 'f');	/* remove any leading blanks */
+      llassert (lineptr != NULL);
+      lineptr = strchr (lineptr, ' ');	/* go past "fcnGlobals" */
+      llassert (lineptr != NULL);
+
+     /* a quick check for empty fcnGlobals */
+      if (!isBlankLine (lineptr))
+	{
+	  globals = parseGlobals (lineptr, srce);
+	  /* should ensure that each global in an imported function
+	     corresponds to some existing global.  Since only
+	     "correctly processed" .lcs files are imported, this is
+	     true as an invariant. */
+	}
+      else
+	{
+	  globals = pairNodeList_new ();
+	}
+      
+      /* check that they exist, store them on fctInfo */
+
+      if (savedFcn != NULL)
+	{
+	  pairNodeList_free ((*savedFcn)->globals);
+	  (*savedFcn)->globals = globals;  /* evs, moved inside if predicate */
+
+	  (void) symtable_enterFct (g_symtab, *savedFcn);
+	  savedFcn = NULL;
+	}
+      else
+	{
+	  lclplainerror 
+	    (message ("%q: Unexpected function globals.  "
+		      "Skipping this line: \n%s",
+		      fileloc_unparseRaw (importfile, tsource_thisLineNumber (srce)), 
+		      cstring_fromChars (line)));
+	  savedFcn = NULL;
+	  pairNodeList_free (globals);
+	}
+    }
+  else if (firstWord (line, "fcn"))
+    {
+      lslOp op;
+      lslOp op2; 
+
+      if (savedFcn != (fctInfo *) 0)
+	{
+	  lclplainerror 
+	    (message ("%q: illegal function declaration.  Skipping this line:\n%s",
+		      fileloc_unparseRaw (importfile, tsource_thisLineNumber (srce)), 
+		      cstring_fromChars (line)));
+	  fileloc_free (imploc);
+	  return;
+	}
+
+      savedFcn = (fctInfo *) dmalloc (sizeof (*savedFcn));
+
+      lineptr = strchr (line, 'f');	/* remove any leading blanks */
+      llassert (lineptr != NULL);
+      lineptr = strchr (lineptr, ' ');	/* go past "fcn" */
+      llassert (lineptr != NULL);
+
+      /* add a newline to the end of the line since parseOpLine expects it */
+
+      lineptr2 = strchr (lineptr, '\0');
+
+      if (lineptr2 != 0)
+	{
+	  *lineptr2 = '\n';
+	  *(lineptr2 + 1) = '\0';
+	}
+
+      op = parseOpLine (cimportfile, lineptr + 1);
+
+      if (op == (lslOp) 0)
+	{
+	  lclplainerror (message ("%q: illegal function declaration: %s",
+				  fileloc_unparseRaw (importfile, tsource_thisLineNumber (srce)), 
+				  cstring_fromChars (line)));
+	  fileloc_free (imploc);
+	  return;
+	}
+	
+      op2 = lslOp_renameSorts (map, op);
+
+      llassert (op2 != NULL);
+
+      if ((op->name != NULL) && op->name->isOpId)
+	{
+	  (*savedFcn) = (fctInfo) dmalloc (sizeof (**savedFcn));
+	  (*savedFcn)->id = op->name->content.opid;
+	  (*savedFcn)->signature = signNode_fromsigNode (op2->signature);
+	  (*savedFcn)->globals = pairNodeList_new ();
+	  (*savedFcn)->export = TRUE;
+	  
+	  if (inImport)
+	    {
+	      /* 27 Jan 1995 --- added this to be undefined namestr bug */
+	      cstring fname = ltoken_unparse ((*savedFcn)->id);
+	      
+	      if (!usymtab_existsGlobEither (fname))
+		{
+		  		  (void) usymtab_addEntry (uentry_makeFunction
+					   (fname, ctype_unknown, 
+					    typeId_invalid, globSet_new (),
+					    sRefSet_undefined, 
+					    fileloc_copy (imploc)));
+		}
+	    }
+	}
+      else
+	{
+	  lclplainerror (message ("%q: unexpected function name: %s",
+				  fileloc_unparseRaw (importfile, tsource_thisLineNumber (srce)), 
+				  cstring_fromChars (line)));
+	}
+    }
+  else if (firstWord (line, "enumConst"))
+    {
+      varInfo vi;
+
+      if (sscanf (line, "enumConst %s %s", namestr, sostr) != 2)
+	{
+	  lclplainerror 
+	    (message ("%q: Illegal enum constant declaration.  "
+		      "Skipping this line:\n%s",
+		      fileloc_unparseRaw (importfile, tsource_thisLineNumber (srce)), 
+		      cstring_fromChars (line)));
+	  fileloc_free (imploc);
+	  return;
+	}
+      
+      vi = (varInfo) dmalloc (sizeof (*vi));
+      bsort = sort_lookupName (lsymbol_translateSort (map, lsymbol_fromChars (sostr)));
+      lineptr = strchr (line, ' ');	/* go past "var" */
+      llassert (lineptr != NULL);
+      lineptr = strchr (lineptr + 1, ' ');	/* go past namestr */
+      llassert (lineptr != NULL);
+
+      col = 5 + lineptr - line;	/* 5 for initial "%LCL "*/
+      if (sort_isNoSort (bsort))
+	{
+	  lclplainerror (message ("%q: unknown base sort\n",
+				  fileloc_unparseRawCol (importfile, tsource_thisLineNumber (srce), col)));
+	  bsort = nullSort;
+	}
+
+      vi->id = ltoken_createFull (simpleId, lsymbol_fromChars (namestr),
+				    importfile, tsource_thisLineNumber (srce), col);
+			
+      vi->sort = bsort;
+      vi->kind = VRK_ENUM;
+      vi->export = TRUE;
+      (void) symtable_enterVar (g_symtab, vi);
+      varInfo_free (vi);
+
+      if (inImport)
+	{
+	  cstring cnamestr = cstring_fromChars (namestr);
+	  if (!usymtab_existsEither (cnamestr))
+	    {
+	      	      (void) usymtab_addEntry (uentry_makeConstant (cnamestr, ctype_unknown,
+							    fileloc_copy (imploc)));
+	    }
+	}
+    }
+  else if (firstWord (line, "tag"))
+    {
+     /* do nothing, sort processing already handles this */
+    }
+  else
+    {
+      lclplainerror 
+	(message ("%q: Unknown symbol declaration.  Skipping this line:\n%s",
+		  fileloc_unparseRaw (importfile, tsource_thisLineNumber (srce)), 
+		  cstring_fromChars (line)));
+    }
+
+    fileloc_free (imploc);
+}
+
+void
+symtable_import (tsource *imported, ltoken tok, mapping * map)
+{
+  char *buf, *importfile;
+  tsource *lclsource;
+  int old_lsldebug;
+  bool old_inImport = inImport;
+
+  buf = tsource_nextLine (imported);
+  importfile = tsource_fileName (imported);
+
+  llassert (buf != NULL);
+
+  if (!firstWord (buf, "%LCLSymbolTable"))
+    {
+      lclsource = LCLScanSource ();
+      lclfatalerror (tok, 
+		     message ("Expecting '%%LCLSymbolTable' line in import file %s:\n%s\n",
+			      cstring_fromChars (importfile), 
+			      cstring_fromChars (buf)));
+    }
+
+  old_lsldebug = lsldebug;
+  lsldebug = 0;
+  allowed_redeclaration = TRUE;
+  inImport = TRUE;
+
+  for (;;)
+    {
+      buf = tsource_nextLine (imported);
+      llassert (buf != NULL);
+
+      
+      if (firstWord (buf, "%LCLSymbolTableEnd"))
+	{
+	  break;
+	}
+      else
+	{			/* a good line, remove %LCL from line first */
+	  if (firstWord (buf, "%LCL"))
+	    {
+	      parseLine (buf + 4, imported, map);
+	    }
+	  else
+	    {
+	      lclsource = LCLScanSource ();
+	      lclfatalerror 
+		(tok,
+		 message ("Expecting '%%LCL' prefix in import file %s:\n%s\n",
+			  cstring_fromChars (importfile), 
+			  cstring_fromChars (buf)));
+	    }
+	}
+    }
+
+  /* restore old value */
+  inImport = old_inImport;
+  lsldebug = old_lsldebug;
+  allowed_redeclaration = FALSE;
+  }
+
+static void
+symtable_dumpId (symtable stable, FILE *f, bool lco)
+{
+  idTable *st = stable->idTable;
+  unsigned int i;
+  idTableEntry *se;
+  fctInfo fi;
+  typeInfo ti;
+  varInfo vi;
+
+  for (i = 1; i < st->size; i++)
+    {
+      /* 2/22/93 I think there is a off-by-1 error, 0 entry is never used */
+      se = st->entries + i;
+      llassert (se != NULL);
+      
+      
+      /*@-loopswitchbreak@*/
+      switch (se->kind)
+	{
+	case SYMK_FCN:
+	  {
+	    cstring tmp;
+	    
+	    fi = (se->info).fct;
+	    
+	    if (lco)
+	      {
+		fprintf (f, "%%LCL");
+	      }
+
+	    if (!lco && !fi->export)
+	      {
+		fprintf (f, "spec ");
+	      }
+	    
+	    tmp = signNode_unparse (fi->signature);
+	    fprintf (f, "fcn %s %s \n", ltoken_getTextChars (fi->id), 
+		     cstring_toCharsSafe (tmp));
+	    cstring_free (tmp);
+	    
+	    tmp = pairNodeList_unparse (fi->globals);
+	    fprintf (f, "%%LCLfcnGlobals %s\n", cstring_toCharsSafe (tmp));
+	    cstring_free (tmp);
+	    break;
+	  }
+	case SYMK_SCOPE:
+	  if (lco)
+	    {
+	      break;
+	    }
+
+	  /*@-switchswitchbreak@*/
+	  switch ((se->info).scope->kind)
+	    {
+	    case SPE_GLOBAL:
+	      fprintf (f, "Global scope\n");
+	      break;
+	    case SPE_ABSTRACT:
+	      fprintf (f, "Abstract type scope\n");
+	      break;
+	    case SPE_FCN:
+	      fprintf (f, "Function scope\n");
+	      break;
+	     /* a let scope can only occur in a function scope, should not push
+                a new scope, so symtable_lookupInScope works properly
+                   case letScope:
+	             fprintf (f, "Let scope\n");
+	             break; */
+	    case SPE_QUANT:
+	      fprintf (f, "Quantifier scope\n");
+	      break;
+	    case SPE_CLAIM:
+	      fprintf (f, "Claim scope\n");
+	      break;
+	    case SPE_INVALID:
+	      break;
+	    }
+	  break;
+	case SYMK_TYPE:
+	  ti = (se->info).type;
+	  if (lco)
+	    fprintf (f, "%%LCL");
+	  if (!lco && !ti->export)
+	    fprintf (f, "spec ");
+	  fprintf (f, "type %s %s",
+		   ltoken_getTextChars (ti->id), sort_getName (ti->basedOn));
+	  if (ti->abstract)
+	    {
+	      if (ti->modifiable)
+		fprintf (f, " mutable\n");
+	      else
+		fprintf (f, " immutable\n");
+	    }
+	  else
+	    fprintf (f, " exposed\n");
+	  break;
+	case SYMK_VAR:
+
+	  vi = (se->info).var;
+	  if (lco)
+	    {
+	      fprintf (f, "%%LCL");
+	    }
+
+	  if (!lco && !vi->export)
+	    {
+	      fprintf (f, "spec ");
+	    }
+	  switch (vi->kind)
+	    {
+	    case VRK_CONST:
+	      fprintf (f, "const %s %s\n",
+		       ltoken_getTextChars (vi->id), sort_getName (vi->sort));
+	      break;
+	    case VRK_VAR:
+	      fprintf (f, "var %s %s\n",
+		       ltoken_getTextChars (vi->id), sort_getName (vi->sort));
+	      break;
+	    case VRK_ENUM:
+	      fprintf (f, "enumConst %s %s\n",
+		       ltoken_getTextChars (vi->id), sort_getName (vi->sort));
+	      break;
+	    default:
+	      if (lco)
+		{
+		  switch (vi->kind)
+		    {
+		    case VRK_GLOBAL:
+		      fprintf (f, "global %s %s\n", ltoken_getTextChars (vi->id), sort_getName (vi->sort));
+		      break;
+		    case VRK_PRIVATE:	/* for private vars within function */
+		      fprintf (f, "local %s %s\n",
+			       ltoken_getTextChars (vi->id), sort_getName (vi->sort));
+		      break;
+		    case VRK_LET:
+		      fprintf (f, "let %s %s\n",
+			       ltoken_getTextChars (vi->id), sort_getName (vi->sort));
+		      break;
+		    case VRK_PARAM:
+		      fprintf (f, "param %s %s\n",
+			       ltoken_getTextChars (vi->id), sort_getName (vi->sort));
+		      break;
+		    case VRK_QUANT:
+		      fprintf (f, "quant %s %s\n",
+			       ltoken_getTextChars (vi->id), sort_getName (vi->sort));
+		      break;
+		    BADDEFAULT;
+		    }
+		  /*@=loopswitchbreak@*/
+		  /*@=switchswitchbreak@*/
+		}
+	    }
+	}
+    }
+}
+
+static /*@exposed@*/ /*@out@*/ idTableEntry *
+nextFree (idTable * st)
+{
+  idTableEntry *ret;
+  unsigned int n = st->size;
+
+  if (n >= st->allocated)
+    {
+      /*
+      ** this loses with the garbage collector
+      ** (and realloc is notoriously dangerous)
+      **
+      ** st->entries = (idTableEntry *) LSLMoreMem (st->entries, (n + DELTA) 
+      **                                * sizeof (idTableEntry));
+      **
+      ** instead, we copy the symtable...
+      */
+      
+      idTableEntry *oldentries = st->entries;
+      unsigned int i;
+      
+      st->entries = dmalloc ((n+DELTA) * sizeof (*st->entries));
+      
+      for (i = 0; i < n; i++)
+	{
+	  st->entries[i] = oldentries[i];
+	}
+      
+      sfree (oldentries);
+      
+      st->allocated = n + DELTA;
+    }
+  
+  ret = &(st->entries[st->size]);
+  st->size++;
+  return ret;
+}
+
+
+static /*@dependent@*/ /*@null@*/ idTableEntry *
+  symtable_lookup (idTable *st, lsymbol id)
+{
+  int n;
+  idTableEntry *e;
+
+  for (n = st->size - 1; n >= 0; n--)
+    {
+      e = &(st->entries[n]);
+
+      /*@-loopswitchbreak@*/
+      switch (e->kind)
+	{
+	case SYMK_SCOPE: 
+	  break;
+	case SYMK_FCN:
+	  if (ltoken_getText (e->info.fct->id) == id) return e;
+	  break;
+	case SYMK_TYPE:
+	  if (ltoken_getText (e->info.type->id) == id) return e;
+	  break;
+	case SYMK_VAR:
+	  if (ltoken_getText (e->info.var->id) == id) return e;
+	  break;
+	BADDEFAULT;
+	}
+      /*@=loopswitchbreak@*/
+    }
+
+  return (idTableEntry *) 0;
+}
+
+
+static /*@dependent@*/ /*@null@*/ idTableEntry *
+  symtable_lookupInScope (idTable *st, lsymbol id)
+{
+  int n;
+  idTableEntry *e;
+  for (n = st->size - 1; n >= 0; n--)
+    {
+      e = &(st->entries[n]);
+      if (e->kind == SYMK_SCOPE)
+	break;
+      if (ltoken_getText (e->info.fct->id) == id)
+	{
+	  return e;
+	}
+    }
+  return (idTableEntry *) 0;
+}
+
+/* hash table implementation */
+
+static symbolKey
+htData_key (htData * x)
+{
+  /* assume x points to a valid htData struct */
+  switch (x->kind)
+    {
+    case IK_SORT:
+      return x->content.sort;
+    case IK_OP:
+      {				/* get the textSym of the token */
+	nameNode n = (x->content.op)->name;
+
+	if (n->isOpId)
+	  {
+	    return ltoken_getText (n->content.opid);
+	  }
+	else
+	  {
+	    llassert (n->content.opform != NULL);
+	    return (n->content.opform)->key;
+	  }
+      }
+    case IK_TAG:
+      return ltoken_getText ((x->content).tag->id);
+    }
+  BADEXIT;
+}
+
+static void htData_free (/*@null@*/ /*@only@*/ htData *d)
+{
+  if (d != NULL)
+    {
+      switch (d->kind)
+	{
+	case IK_SORT:
+	  break;
+	case IK_OP:
+	  /* nameNode_free (d->content.op->name);*/
+	  sigNodeSet_free (d->content.op->signatures);
+	  break;
+	case IK_TAG:
+	  {
+	    switch (d->content.tag->kind)
+	      {
+	      case TAG_STRUCT:
+	      case TAG_UNION:
+	      case TAG_FWDSTRUCT:
+	      case TAG_FWDUNION:
+		/*
+		 ** no: stDeclNodeList_free (d->content.tag->content.decls);
+		 **     it is dependent!
+		 */
+		/*@switchbreak@*/ break;
+	      case TAG_ENUM:
+		
+		/* no: ltokenList_free (d->content.tag->content.enums);
+		 **     it is dependent!
+		 */
+		
+		/*@switchbreak@*/ break;
+	      }
+	  }
+	}
+      
+      sfree (d);
+    }
+}
+
+static void bucket_free (/*@null@*/ /*@only@*/ bucket *b)
+{
+  if (b != NULL)
+    {
+      bucket_free (b->next);
+      htData_free (b->data);
+      sfree (b);
+    }
+}
+
+static void symHashTable_free (/*@only@*/ symHashTable *h)
+{
+  unsigned int i;
+
+  for (i = 0; i < h->size; i++)
+    {
+      bucket_free (h->buckets[i]);
+    }
+
+  sfree (h->buckets);
+  sfree (h);
+}      
+      
+static /*@only@*/ symHashTable *
+symHashTable_create (unsigned int size)
+{
+  unsigned int i;
+  symHashTable *t = (symHashTable *) dmalloc (sizeof (*t));
+  
+  t->buckets = (bucket **) dmalloc ((size + 1) * sizeof (*t->buckets));
+  t->count = 0;
+  t->size = size;
+
+  for (i = 0; i <= size; i++)
+    {
+      t->buckets[i] = (bucket *) NULL;
+    }
+
+  return t;
+}
+
+static /*@null@*/ /*@exposed@*/ htData *
+symHashTable_get (symHashTable *t, symbolKey key, infoKind kind, /*@null@*/ nameNode n)
+{
+  bucket *b;
+  htEntry *entry;
+  htData *d;
+
+  b = t->buckets[MASH (key, kind)];
+  if (b == (bucket *) 0)
+    {
+      return ((htData *) 0);
+    }
+  
+  for (entry = (htEntry *) b; entry != NULL; entry = entry->next)
+    {
+      d = entry->data;
+
+      if (d->kind == kind && htData_key (d) == key)
+	if (kind != IK_OP || sameNameNode (n, d->content.op->name))
+	  {
+	    return d;
+	  }
+    }
+  return ((htData *) 0);
+}
+
+static bool
+symHashTable_put (symHashTable *t, /*@only@*/ htData *data)
+{
+  /* if key is already taken, don't insert, return FALSE
+     else insert it and return TRUE. */
+  symbolKey key;
+  htData *oldd;
+  infoKind kind;
+  nameNode name;
+
+  key = htData_key (data);
+  kind = data->kind;
+
+  if (kind == IK_OP && (!data->content.op->name->isOpId))
+    {
+      name = data->content.op->name;
+    }
+  else
+    {
+      name = (nameNode) 0;
+    }
+  
+  oldd = symHashTable_get (t, key, kind, name);
+
+  if (oldd == (htData *) 0)
+    {
+      /*@-deparrays@*/
+      bucket *new_entry = (bucket *) dmalloc (sizeof (*new_entry));
+      bucket *b = (t->buckets[MASH (key, kind)]);
+      htEntry *entry = (htEntry *) b;
+      /*@=deparrays@*/
+
+      new_entry->data = data;
+      new_entry->next = entry;
+      t->buckets[MASH (key, kind)] = new_entry;
+      t->count++;
+
+      return TRUE;
+    }
+  else
+    {
+      htData_free (data);
+    }
+
+  return FALSE;
+}
+
+static /*@only@*/ /*@exposed@*/ /*@null@*/ htData *
+  symHashTable_forcePut (symHashTable *t, /*@only@*/ htData *data)
+{
+  /* Put data in, return old value */
+  symbolKey key;
+  bucket *b;
+  htData *oldd;
+  htEntry *entry, *new_entry;
+  infoKind kind;
+  nameNode name;
+
+  key = htData_key (data);
+  kind = data->kind;
+
+  if (kind == IK_OP && (!data->content.op->name->isOpId))
+    {
+      name = data->content.op->name;
+    }
+  else
+    {
+      name = (nameNode) 0;
+    }
+
+  oldd = symHashTable_get (t, key, kind, name);
+
+  if (oldd == (htData *) 0)
+    {
+      new_entry = (htEntry *) dmalloc (sizeof (*new_entry));
+
+      /*@-deparrays@*/
+      b = t->buckets[MASH (key, kind)];
+      /*@=deparrays@*/
+
+      entry = b;
+      new_entry->data = data;
+      new_entry->next = entry;
+      t->buckets[MASH (key, kind)] = new_entry;
+      t->count++;
+
+      return NULL;
+    }
+  else
+    {				/* modify in place */
+      *oldd = *data;		/* copy new info over to old info */
+
+      /* dangerous: if the data is the same, don't free it */
+      if (data != oldd)   
+	{
+	  sfree (data); 
+        /*@-branchstate@*/ 
+	} 
+      /*@=branchstate@*/
+
+      return oldd;
+    }
+}
+
+#if 0
+static unsigned int
+symHashTable_count (symHashTable * t)
+{
+  return (t->count);
+}
+
+#endif
+
+static void
+symHashTable_printStats (symHashTable * t)
+{
+  int i, bucketCount, setsize, sortCount, opCount, tagCount;
+  int sortTotal, opTotal, tagTotal;
+  bucket *b;
+  htEntry *entry;
+  htData *d;
+
+  sortTotal = 0;
+  opTotal = 0;
+  tagTotal = 0;
+  sortCount = 0;
+  opCount = 0;
+  tagCount = 0;
+
+  /* for debugging only */
+  printf ("\n Printing symHashTable stats ... \n");
+  for (i = 0; i <= HT_MAXINDEX; i++)
+    {
+      b = t->buckets[i];
+      bucketCount = 0;
+      for (entry = b; entry != NULL; entry = entry->next)
+	{
+	  d = entry->data;
+	  bucketCount++;
+	  switch (d->kind)
+	    {
+	    case IK_SORT:
+	      sortCount++;
+	      /*@switchbreak@*/ break;
+	    case IK_OP:
+	      {
+		cstring name = nameNode_unparse (d->content.op->name);
+		cstring sigs = sigNodeSet_unparse (d->content.op->signatures);
+		opCount++;
+		/* had a tt? */
+		setsize = sigNodeSet_size (d->content.op->signatures);
+		printf ("       Op (%d): %s %s\n", setsize, 
+			cstring_toCharsSafe (name), 
+			cstring_toCharsSafe (sigs));
+		cstring_free (name);
+		cstring_free (sigs);
+		/*@switchbreak@*/ break;
+	      }
+	    case IK_TAG:
+	      tagCount++;
+	      /*@switchbreak@*/ break;
+	    }
+	}
+      if (bucketCount > 0)
+	{
+	  printf ("   Bucket %d has count = %d; opCount = %d; sortCount = %d; tagCount = %d\n", i, bucketCount, opCount, sortCount, tagCount);
+	  sortTotal += sortCount;
+	  tagTotal += tagCount;
+	  opTotal += opCount;
+	}
+    }
+  printf ("SymHashTable has total count = %d, opTotal = %d, sortTotal = %d, tagTotal = %d :\n", t->count, opTotal, sortTotal, tagTotal);
+
+}
+
+void
+symtable_printStats (symtable s)
+{
+  symHashTable_printStats (s->hTable);
+ /* for debugging only */
+  printf ("idTable size = %d; allocated = %d\n",
+	  s->idTable->size, s->idTable->allocated);
+}
+
+/*@only@*/ cstring
+tagKind_unparse (tagKind k)
+{
+  switch (k)
+    {
+    case TAG_STRUCT:
+    case TAG_FWDSTRUCT:
+      return cstring_makeLiteral ("struct");
+    case TAG_UNION:
+    case TAG_FWDUNION:
+      return cstring_makeLiteral ("union");
+    case TAG_ENUM:
+      return cstring_makeLiteral ("enum");
+    }
+  BADEXIT;
+}
+
+static void tagInfo_free (/*@only@*/ tagInfo tag)
+{
+  sfree (tag);
+}
+
+/*@observer@*/ sigNodeSet 
+  symtable_possibleOps (symtable tab, nameNode n)
+{
+  opInfo oi = symtable_opInfo (tab, n);
+  
+  if (opInfo_exists (oi))
+    {
+      return (oi->signatures);
+    }
+
+  return sigNodeSet_undefined;
+}
+
+bool
+symtable_opExistsWithArity (symtable tab, nameNode n, int arity)
+{
+  opInfo oi = symtable_opInfo (tab, n);
+
+  if (opInfo_exists (oi))
+    {
+      sigNodeSet sigs = oi->signatures;
+      sigNodeSet_elements (sigs, sig)
+      {
+	if (ltokenList_size (sig->domain) == arity)
+	  return TRUE;
+      } end_sigNodeSet_elements;
+    }
+  return FALSE;
+}
+
+static bool
+domainMatches (ltokenList domain, sortSetList argSorts)
+{
+  /* expect their length to match */
+  /* each domain sort in op must be an element of
+     the corresponding set in argSorts. */
+  bool matched = TRUE;
+  sort s;
+
+  sortSetList_reset (argSorts);
+  ltokenList_elements (domain, dom)
+    {
+      s = sort_fromLsymbol (ltoken_getText (dom));
+      if (!(sortSet_member (sortSetList_current (argSorts), s)))
+	{
+	  /*      printf ("   mismatched element is: %s in %s\n", ltoken_getTextChars (*dom),
+		  sortSet_unparse (sortSetList_current (argSorts))); */
+	  matched = FALSE;
+	  break;
+	}
+      sortSetList_advance (argSorts);
+  } end_ltokenList_elements;
+
+  return matched;
+}
+
+/*@only@*/ lslOpSet
+  symtable_opsWithLegalDomain (symtable tab, /*@temp@*/ /*@null@*/ nameNode n,
+			       sortSetList argSorts, sort qual)
+{
+ /* handles nil qual */
+  lslOpSet ops = lslOpSet_new ();
+  lslOp op;
+  sort rangeSort;
+  opInfo oi;
+
+  llassert (n != NULL);
+  oi = symtable_opInfo (tab, n);
+
+  if (opInfo_exists (oi))
+    {
+      sigNodeSet sigs = oi->signatures;
+
+      sigNodeSet_elements (sigs, sig)
+	{
+	  if (ltokenList_size (sig->domain) == sortSetList_size (argSorts))
+	    {
+	      rangeSort = sigNode_rangeSort (sig);
+	      
+	      if ((qual == 0) || (sort_equal (&rangeSort, &qual)))
+		{
+		  if (domainMatches (sig->domain, argSorts))
+		    {
+		      op = (lslOp) dmalloc (sizeof (*op));
+		      
+		      /* each domain sort in op must be an element of
+			 the corresponding set in argSorts. */
+		      op->signature = sig;
+		      op->name = nameNode_copy (n);
+		      (void) lslOpSet_insert (ops, op);
+		    }
+		}
+	    }
+	} end_sigNodeSet_elements;
+    }
+  return ops;
+}
diff --git a/src/syntable.c b/src/syntable.c
new file mode 100644
index 0000000..76d53eb
--- /dev/null
+++ b/src/syntable.c
@@ -0,0 +1,218 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** syntable.c
+**
+** Larch shared language synonym table
+**
+**	This table stores synonyms for the Larch Shared Language.  It is
+**	essentially a array of token-handles indexed by string-handles.
+**	Therefore, synonyms (strings) can be converted to the actual token.
+**
+**  AUTHORS:
+**	J.P. Wild
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "tokentable.h"
+# include "syntable.h"
+
+/*@+ignorequals@*/
+
+typedef lsymbol *lsymbolTable;
+
+static /*@only@*/ /*@null@*/ lsymbolTable SynTable;	
+static unsigned long int SynTableEntries;
+
+static void SynTable_grow (int p_size);
+
+/*
+**++
+**  FUNCTION NAME:
+**
+**      LSLAddSyn ()
+**
+**  FORMAL PARAMETERS:
+**
+**      otok  - token-handle for token associated with oldToken
+**	ntok  - string-handle for the string to be a synonym with oldToken.
+**
+**  RETURN VALUE:
+**
+**  INVARIANTS:
+**
+**      A context must be established.
+**
+**  DESCRIPTION:
+**
+**    This routine inserts a synonym into the synonym table.  The synonym table
+**    is used to define synonyms in the form:
+**
+**	    synonym oldToken newToken
+**
+**    The table associates the string for newToken with the token for oldToken.
+**    This table is used to find the the actual token (oldToken) from a synonym
+**    string (newToken).
+**
+**    A new SynTable is allocated when:
+**	. The SynTable[] is empty (initial case)
+**      . The location where to insert the synonym is not in SynTable[]
+**
+**  IMPLICIT INPUTS/OUTPUT:
+**
+**    SynTable      - (input/output) SynTable array
+**
+**  EXCEPTIONS:
+**    A synonym already exists at the location where the it is to be added.
+**
+**--
+*/
+
+void
+LSLAddSyn (lsymbol ntok, lsymbol otok)
+{
+  if (ntok >= SynTableEntries) /* was otok */
+    {
+      SynTable_grow (otok);
+    }
+
+  llassert (SynTable != NULL);
+
+  if (SynTable[ntok] == (lsymbol) 0)
+    {				/* Entry is empty. Fill it in. */
+      SynTable[ntok] = otok;
+      LSLSetTokenHasSyn (otok, TRUE);	/* Mark oldToken as having a synonym. */
+    }
+  else
+    {
+      llbuglit ("LSLAddSyn: duplicate SynTable entry");
+    }
+}
+
+/*@exposed@*/ ltoken
+LSLGetTokenForSyn (lsymbol ntok)
+{
+  llassert (SynTable != NULL);
+  llassert (!(!((ntok < SynTableEntries) || (SynTable[ntok] != 0))));
+
+  return LSLGetToken (SynTable[ntok]);
+}
+
+bool
+LSLIsSyn (lsymbol str)
+{
+  if (str < SynTableEntries)
+    {
+      llassert (SynTable != NULL);
+      return (SynTable[str] != 0);
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+static void
+SynTable_grow (int size)
+{
+  int oldSize;
+  int i;
+  lsymbolTable oldSynTable = SynTable;
+  
+  llassert (oldSynTable != NULL);
+  oldSize = SynTableEntries;
+  
+  if (size <= oldSize)
+    {
+      llcontbuglit ("SynTable_grow: goal size is smaller than oldSize");
+      return;
+    }
+  
+  if (size < (oldSize + SYNTABLE_BASESIZE))
+    {
+      size = oldSize + SYNTABLE_BASESIZE;
+    }
+
+  SynTable = (lsymbolTable) dmalloc (size * sizeof (*SynTable));
+  SynTableEntries = size;
+
+  for (i = 0; i < oldSize; i++)
+    {
+      SynTable[i] = oldSynTable[i];
+    }
+
+  /* Zero out new allocated space.  Need to detect when cells are empty   */
+  /* and do this by checking that SynTable[x] == 0.			  */
+
+  /*@+loopexec@*/
+  for (i = oldSize; i < size; i++)
+    {
+      SynTable[i] = (lsymbol) 0;
+    }
+  /*@=loopexec@*/
+
+  sfree (oldSynTable);
+/*@-compdef@*/ } /*=compdef@*/
+
+void
+lsynTableInit (void) /*@globals undef SynTable; @*/
+{
+  int i;
+
+  SynTable = (lsymbolTable) dmalloc (sizeof (*SynTable) * SYNTABLE_BASESIZE);
+
+  /*@+loopexec@*/
+  for (i = 0; i < SYNTABLE_BASESIZE; i++)
+    {
+      SynTable[i] = (lsymbol) 0;
+    }
+  /*@=loopexec@*/
+
+  SynTableEntries = SYNTABLE_BASESIZE;
+/*@-compdef@*/ } /*@=compdef@*/
+
+void
+lsynTableReset (void)
+{
+}
+
+void
+lsynTableCleanup (void)
+{
+  sfree (SynTable);
+  SynTable = NULL;
+}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/termNodeList.c b/src/termNodeList.c
new file mode 100644
index 0000000..7e522ea
--- /dev/null
+++ b/src/termNodeList.c
@@ -0,0 +1,260 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** termNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+termNodeList termNodeList_new ()
+{
+  termNodeList s = (termNodeList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspacelow = termNodeListGROWLOW;
+  s->nspacehigh = termNodeListGROWHI;
+  s->elementsroot = (termNode *) dmalloc (sizeof (*s->elements) * (s->nspacelow + s->nspacehigh));
+  s->elements = s->elementsroot + termNodeListGROWLOW;
+  s->current = 0;
+
+  return (s);
+}
+
+static void
+termNodeList_grow (termNodeList s)
+{
+  int i;
+  termNode *newelements = (termNode *) dmalloc (sizeof (*newelements)
+						* (s->nelements + termNodeListBASESIZE));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i + termNodeListGROWLOW] = s->elements[i];
+    }
+  
+  sfree (s->elementsroot);
+
+  s->nspacelow = termNodeListGROWLOW;
+  s->nspacehigh = termNodeListGROWHI; 
+
+  s->elementsroot = newelements;
+  s->elements = s->elementsroot + s->nspacelow;
+}
+
+void 
+termNodeList_addh (termNodeList s, termNode el)
+{
+  llassert (termNodeListGROWHI > 0);
+
+  if (s->nspacehigh <= 0)
+    termNodeList_grow (s);
+
+  s->nspacehigh--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+}
+
+termNodeList 
+termNodeList_push (termNodeList s, termNode el)
+{
+  termNodeList_addh (s, el);
+  return s;
+}
+
+void 
+termNodeList_addl (termNodeList s, termNode el)
+{
+  llassert (termNodeListGROWLOW > 0);
+
+  if (s->nspacelow <= 0)
+    termNodeList_grow (s);
+
+  s->nspacelow--;
+  s->elements--;
+  s->elements[0] = el;
+  s->current++;
+  s->nelements++;
+}
+
+void 
+termNodeList_reset (termNodeList s)
+{
+  s->current = 0;
+}
+
+void 
+termNodeList_finish (termNodeList s)
+{
+  s->current = s->nelements - 1;
+}
+
+void 
+termNodeList_advance (termNodeList s)
+{
+  s->current++;
+  llassert (s->current < s->nelements);
+}
+
+/*@exposed@*/ termNode 
+termNodeList_head (termNodeList s)
+{
+  llassert (s->nelements > 0);
+  return (s->elements[0]);
+}
+
+/*@only@*/ termNodeList 
+termNodeList_copy (termNodeList s)
+{
+  termNodeList r = termNodeList_new ();
+
+  termNodeList_elements (s, x)
+  {
+    termNodeList_addh (r, termNode_copySafe (x));
+  } end_termNodeList_elements;
+
+  return r;
+}
+
+/*@exposed@*/ termNode 
+termNodeList_current (termNodeList s)
+{
+  llassert (!(s->current >= s->nelements));
+  return (s->elements[s->current]);
+}
+
+termNode 
+termNodeList_getN (termNodeList s, int n)
+{
+  llassert (n >= 0 && n < s->nelements);
+
+  return (s->elements[n]);
+}
+
+/*@only@*/ cstring
+termNodeList_unparse (termNodeList s)
+{
+  bool first = TRUE;
+  cstring st = cstring_undefined;
+
+  termNodeList_elements (s, current)
+  {
+    if (first)
+      {
+	st = termNode_unparse (current);
+	first = FALSE;
+      }
+    else
+      st = message ("%q, %q", st, termNode_unparse (current));
+  } end_termNodeList_elements;
+
+  return st;
+}
+
+/*@only@*/ cstring
+termNodeList_unparseTail (termNodeList s)
+{
+  bool head = TRUE;
+  bool first = TRUE;
+  cstring st = cstring_undefined;
+
+  termNodeList_elements (s, current)
+  {
+    if (head)
+      {
+	head = FALSE;
+      }
+    else
+      {
+	if (first)
+	  {
+	    st = termNode_unparse (current);
+	    first = FALSE;
+	  }
+	else
+	  st = message ("%q, %q", st, termNode_unparse (current));
+      }
+  } end_termNodeList_elements;
+
+  return st;
+}
+
+/*@only@*/ cstring
+termNodeList_unparseToCurrent (termNodeList s)
+{
+  int i;
+  cstring st = cstring_undefined;
+
+  for (i = 0; i < s->current; i++)
+    {
+      termNode current = s->elements[i];
+
+      if (i == 0)
+	st = termNode_unparse (current);
+      else
+	st = message ("%q, %q", st, termNode_unparse (current));
+    }
+
+  return st;
+}
+
+/*@only@*/ cstring
+termNodeList_unparseSecondToCurrent (termNodeList s)
+{
+  int i;
+  cstring st = cstring_undefined;
+
+  for (i = 1; i < s->current; i++)
+    {
+      termNode current = s->elements[i];
+
+      if (i == 1)
+	{
+	  st = termNode_unparse (current);
+	}
+      else
+	{
+	  st = message ("%q, %q", st, termNode_unparse (current));
+	}
+    }
+
+  return st;
+}
+
+void
+termNodeList_free (termNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      termNode_free (s->elements[i]); 
+    }
+
+  sfree (s->elementsroot);
+  sfree (s);
+}
diff --git a/src/tokentable.c b/src/tokentable.c
new file mode 100644
index 0000000..66d9322
--- /dev/null
+++ b/src/tokentable.c
@@ -0,0 +1,180 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** tokentable.c
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "osd.h"
+# include "tokentable.h"
+
+static long unsigned MaxToken;	
+static /*@null@*/ /*@only@*/ o_ltoken *TokenTable;       
+
+static void AllocTokenTable (void) /*@modifies TokenTable, MaxToken@*/ ;
+
+ltoken
+  LSLInsertToken (ltokenCode cod, lsymbol sym, lsymbol rTxt, bool def)
+{
+  while (sym >= MaxToken)
+    {
+      AllocTokenTable ();
+    }
+
+  llassert (TokenTable != NULL);
+
+  if (ltoken_isUndefined (TokenTable[sym]))
+    {
+      TokenTable[sym] = ltoken_create (cod, sym);        
+      ltoken_setRawText (TokenTable[sym], rTxt);
+      ltoken_setDefined (TokenTable[sym], def);
+    }
+  
+  return TokenTable[sym];
+}
+
+void
+LSLUpdateToken (ltokenCode cod, lsymbol sym, bool def)
+{
+  llassert (TokenTable != NULL);
+
+  if (!ltoken_isUndefined (TokenTable[sym]))
+    {
+      ltoken_setCode (TokenTable[sym], cod);
+      ltoken_setDefined (TokenTable[sym], def);
+    }
+  else
+    {
+      llfatalbug (message ("LSLUpdateToken: token not in table: %d, text: %s", 
+			   (int) cod, cstring_fromChars (lsymbol_toChars (sym))));
+    }
+}
+
+void
+LSLSetTokenHasSyn (lsymbol sym, bool syn)
+{
+  llassert (TokenTable != NULL);
+    
+  if (!ltoken_isUndefined (TokenTable[sym]))
+    {
+      ltoken_setHasSyn (TokenTable[sym], syn);
+    }
+  else
+    {
+      llbuglit ("LSLSetTokenHasSyn: null token");
+    }
+}
+
+ltoken LSLGetToken (lsymbol sym)
+{
+  llassert (TokenTable != NULL);
+
+  if (!((sym < MaxToken) || (!ltoken_isUndefined (TokenTable[sym]))))
+    {
+      llcontbuglit ("LSLGetToken: bad argument");
+      return TokenTable[0];
+    }
+
+  return TokenTable[sym];
+}
+
+/*@exposed@*/ ltoken
+LSLReserveToken (ltokenCode cod, char *txt)
+{
+  lsymbol sym;
+  
+  sym = lsymbol_fromChars (txt);
+
+  /* 
+  ** Reserved tokens never have raw text like synonyms.
+  */
+
+  return LSLInsertToken (cod, sym, lsymbol_undefined, TRUE);
+}
+
+static void
+AllocTokenTable (void)
+{
+  long unsigned oldSize, newSize;
+  long unsigned int i;
+
+  oldSize = MaxToken;
+
+  if (oldSize == 0)
+    {
+      newSize = INITTOKENTABLE;
+      llassert (TokenTable == NULL);
+      TokenTable = (ltoken *) dmalloc (newSize * sizeof (*TokenTable)); 
+    }
+  else
+    {
+      o_ltoken *oldTokenTable = TokenTable;
+
+      newSize = (long unsigned) (DELTATOKENTABLE * oldSize);
+      TokenTable = (ltoken *) dmalloc (newSize * sizeof (*TokenTable));
+
+      llassert (oldSize > 0);
+      llassert (oldTokenTable != NULL);
+      
+      for (i = 0; i < oldSize; i++)
+	{
+	  TokenTable[i] = oldTokenTable[i];
+	}
+
+      sfree (oldTokenTable);
+    }
+
+  /*@+loopexec@*/
+  for (i = oldSize; i < newSize; i++)
+    {
+      TokenTable[i] = ltoken_undefined;
+    }
+  /*@=loopexec@*/
+
+  MaxToken = newSize;
+/*@-compdef@*/ } /*=compdef@*/
+
+void
+ltokenTableInit (void)
+{
+  MaxToken = 0;
+}
+
+void
+ltokenTableCleanup (void)
+{
+  if (TokenTable != NULL)
+    {
+      long unsigned i;
+      
+      for (i = 0; i < MaxToken; i++)
+	{
+	  ltoken_free (TokenTable[i]);
+	}
+
+      sfree (TokenTable); 
+      TokenTable = NULL;
+    }
+}
diff --git a/src/traitRefNodeList.c b/src/traitRefNodeList.c
new file mode 100644
index 0000000..19d9956
--- /dev/null
+++ b/src/traitRefNodeList.c
@@ -0,0 +1,111 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** traitRefNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+/*@only@*/ traitRefNodeList
+traitRefNodeList_new ()
+{
+  traitRefNodeList s = (traitRefNodeList) dmalloc (sizeof (*s));
+
+  s->nelements = 0;
+  s->nspace = traitRefNodeListBASESIZE;
+  s->elements = (traitRefNode *)
+    dmalloc (sizeof (*s->elements) * traitRefNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+traitRefNodeList_grow (traitRefNodeList s)
+{
+  int i;
+  traitRefNode *newelements; 
+
+  s->nspace += traitRefNodeListBASESIZE;
+  newelements = (traitRefNode *) dmalloc (sizeof (*newelements)
+					  * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i]; 
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+traitRefNodeList
+traitRefNodeList_add (traitRefNodeList s, /*@only@*/ traitRefNode el)
+{
+  if (s->nspace <= 0)
+    traitRefNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+/*@only@*/ cstring
+traitRefNodeList_unparse (traitRefNodeList s)
+{
+  cstring st = cstring_undefined;
+
+  traitRefNodeList_elements (s, current)
+  {
+    st = message ("%quses (%q)", st, printLeaves2 (current->traitid));
+
+    if (current->rename != 0)
+      {
+	st = message ("%q (%q)", st, renamingNode_unparse (current->rename));
+      }
+
+    st = message ("%q\n", st);
+  } end_traitRefNodeList_elements;
+
+  return (st);
+}
+
+void
+traitRefNodeList_free (traitRefNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      traitRefNode_free (s->elements[i]); 
+    }
+
+  sfree (s->elements); 
+  sfree (s);
+}
diff --git a/src/typeIdSet.c b/src/typeIdSet.c
new file mode 100644
index 0000000..1489d83
--- /dev/null
+++ b/src/typeIdSet.c
@@ -0,0 +1,299 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** typeIdSet.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+/*@constant int TISTABLEBASESIZE;@*/
+# define TISTABLEBASESIZE LARGEBASESIZE
+
+static int tistableentries = 0;
+static int tistablefree = 0;
+typedef /*@only@*/ usymIdSet o_usymIdSet;
+static /*@only@*/ o_usymIdSet *tistable;
+static void tistable_addDirectEntry (/*@only@*/ usymIdSet p_s) 
+   /*@modifies tistable, tistableentries, tistablefree@*/;
+
+void typeIdSet_initMod (void)
+   /*@globals undef tistable;@*/
+   /*@modifies tistable, tistablefree;@*/
+{
+  llassert (tistableentries == 0 && tistablefree == 0);
+
+  tistablefree = TISTABLEBASESIZE;
+  tistable = (usymIdSet *) dmalloc (sizeof (tistable) * tistablefree);
+  tistable[0] = usymIdSet_undefined;
+  tistableentries = 1;
+  tistablefree--;
+}
+
+void typeIdSet_destroyMod (void)
+   /*@globals killed tistable, tistableentries@*/
+{
+  int i;
+
+  for (i = 0; i < tistableentries; i++)
+    {
+      usymIdSet_free (tistable[i]);
+    }
+
+  sfree (tistable);
+  tistableentries = 0;
+}
+
+void typeIdSet_dumpTable (FILE *fout)
+{
+  int i;
+
+  /*
+  ** Don't dump 0th entry
+  */
+
+  for (i = 1; i < tistableentries; i++)
+    {
+      cstring s = usymIdSet_dump (tistable[i]);
+
+      fprintf (fout, "%s\n", cstring_toCharsSafe (s));
+      cstring_free (s);
+    }
+}
+
+static /*@unused@*/ void tistable_printOut (void)
+{
+  int i;
+
+  /*
+  ** Don't dump 0th entry
+  */
+
+  for (i = 1; i < tistableentries; i++)
+    {
+      cstring s = usymIdSet_unparse (tistable[i]);
+
+      fprintf (g_msgstream, "%d: %s\n", i, cstring_toCharsSafe (s));
+      cstring_free (s);
+    }
+}
+
+void typeIdSet_loadTable (FILE *fin)
+{
+  char *s = mstring_create (MAX_DUMP_LINE_LENGTH);  
+  char *os = s;
+
+  llassert (tistableentries == 1);
+
+  s = fgets (s, MAX_DUMP_LINE_LENGTH, fin);
+
+  while (s != NULL && *s != ';')
+    {
+      usymIdSet u = usymIdSet_undump (&s);
+      
+      llassert (*s == '\0' || *s == '\n');
+      
+      tistable_addDirectEntry (u);
+      s = fgets (os, MAX_DUMP_LINE_LENGTH, fin);
+    }
+}
+  
+static void tistable_grow (void)
+{
+  o_usymIdSet *oldtable = tistable;
+  int newsize = tistableentries + TISTABLEBASESIZE;
+  int i;
+
+  llassert (tistablefree == 0);
+
+  tistable = (usymIdSet *) dmalloc (sizeof (tistable) * newsize);
+
+  for (i = 0; i < tistableentries; i++)
+    {
+      tistable[i] = oldtable[i];
+    }
+
+  tistablefree = TISTABLEBASESIZE;
+  sfree (oldtable);
+} 
+
+static void tistable_addDirectEntry (/*@only@*/ usymIdSet s)
+{
+  if (tistablefree == 0)
+    {
+      tistable_grow ();
+    }
+
+  tistable[tistableentries] = s;
+  tistableentries++;
+  tistablefree--;
+}
+
+static int tistable_addEntry (/*@only@*/ usymIdSet s)
+{
+  int i;
+
+  
+  for (i = 0; i < tistableentries; i++)
+    {
+      if (usymIdSet_compare (tistable[i], s) == 0)
+	{
+	  /*@access usymIdSet@*/
+	  llassert (i == 0 || s != tistable[i]);
+	  /*@noaccess usymIdSet@*/
+
+	  usymIdSet_free (s);
+	  	  return i;
+	}
+    }
+
+  tistable_addDirectEntry (s);
+  return (tistableentries - 1);
+}
+  
+static /*@observer@*/ usymIdSet tistable_fetch (typeIdSet t)
+   /*@globals tistableentries, tistable@*/
+   /*@modifies nothing;@*/
+{
+  llassert (t >= 0 && t < tistableentries);
+
+  return tistable[t];
+}
+
+typeIdSet typeIdSet_emptySet (void)
+{
+  if (tistableentries == 0)
+    {
+      int val = tistable_addEntry (usymIdSet_new ());
+
+      llassert (val == 0);
+    }
+
+  llassert (usymIdSet_isUndefined (tistable[0]));
+  return 0;
+}
+    
+bool typeIdSet_member (typeIdSet t, typeId el)
+{
+  usymIdSet u = tistable_fetch (t);
+
+  return usymIdSet_member (u, el);
+}
+
+bool typeIdSet_isEmpty (typeIdSet t)
+{
+  return (t == 0);
+}
+
+typeIdSet typeIdSet_single (typeId t)
+{
+  return (tistable_addEntry (usymIdSet_single (t)));
+}
+
+typeIdSet typeIdSet_singleOpt (typeId t)
+{
+  if (typeId_isValid (t))
+    {
+      return (tistable_addEntry (usymIdSet_single (t)));
+    }
+  else
+    {
+      return typeIdSet_empty;
+    }
+}
+
+typeIdSet typeIdSet_insert (typeIdSet t, typeId el)
+{
+  usymIdSet u = tistable_fetch (t);
+
+  if (usymIdSet_member (u, el))
+    {
+      return t;
+    }
+  else
+    {
+      return (tistable_addEntry (usymIdSet_add (u, el)));
+    }
+}
+
+typeIdSet typeIdSet_removeFresh (typeIdSet t, typeId el)
+{
+  return (tistable_addEntry (usymIdSet_removeFresh (tistable_fetch (t), el)));
+}
+
+cstring typeIdSet_unparse (typeIdSet t)
+{
+  return (usymIdSet_unparse (tistable_fetch (t)));
+}
+
+int typeIdSet_compare (typeIdSet t1, typeIdSet t2)
+{
+  return (int_compare (t1, t2));
+}
+
+typeIdSet typeIdSet_subtract (typeIdSet s, typeIdSet t)
+{
+  if (typeIdSet_isEmpty (t))
+    {
+      return s;
+    }
+  else
+    {
+      return (tistable_addEntry (usymIdSet_subtract (tistable_fetch (s),
+						     tistable_fetch (t))));
+    }
+}
+
+cstring typeIdSet_dump (typeIdSet t)
+{
+  return (message ("%d", t));
+}
+
+typeIdSet typeIdSet_undump (char **s)
+{
+  int i;
+
+  
+  i = getInt (s);
+
+  llassert (i >= 0 && i < tistableentries);
+  return (typeIdSet) i;
+}
+
+typeIdSet typeIdSet_union (typeIdSet t1, typeIdSet t2)
+{
+  if (t1 == typeIdSet_undefined)
+    {
+      return t2;
+    }
+  else if (t2 == typeIdSet_undefined)
+    {
+      return t1;
+    }
+  else
+    {
+      return (tistable_addEntry (usymIdSet_newUnion (tistable_fetch (t1),
+						     tistable_fetch (t2))));
+    }
+}
diff --git a/src/typeNameNodeList.c b/src/typeNameNodeList.c
new file mode 100644
index 0000000..267ad2a
--- /dev/null
+++ b/src/typeNameNodeList.c
@@ -0,0 +1,112 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** typeNameNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+typeNameNodeList typeNameNodeList_new ()
+{
+  typeNameNodeList s = (typeNameNodeList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = typeNameNodeListBASESIZE;
+  s->elements = (typeNameNode *) 
+    dmalloc (sizeof (*s->elements) * typeNameNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+typeNameNodeList_grow (typeNameNodeList s)
+{
+  int i;
+  typeNameNode *newelements; 
+
+  s->nspace += typeNameNodeListBASESIZE;
+
+  newelements = (typeNameNode *) dmalloc (sizeof (*newelements)
+					  * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] =  s->elements[i]; 
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+typeNameNodeList 
+typeNameNodeList_add (typeNameNodeList s, typeNameNode el)
+{
+  if (s->nspace <= 0)
+    typeNameNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+/*@only@*/ cstring
+typeNameNodeList_unparse (typeNameNodeList s)
+{
+  cstring st = cstring_undefined;
+  bool first = TRUE;
+
+  typeNameNodeList_elements (s, current)
+  {
+    if (first)
+      {
+	st = typeNameNode_unparse (current);
+	first = FALSE;
+      }
+    else
+      {
+	st = message ("%q, %q", st, typeNameNode_unparse (current));
+      }
+  } end_typeNameNodeList_elements;
+  return (st);
+}
+
+void
+typeNameNodeList_free (typeNameNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      typeNameNode_free (s->elements[i]); 
+    }
+
+  sfree (s->elements);
+  sfree (s);
+}
diff --git a/src/uentry.c b/src/uentry.c
new file mode 100644
index 0000000..4a9aa5f
--- /dev/null
+++ b/src/uentry.c
@@ -0,0 +1,9396 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** uentry.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "structNames.h"
+# include "nameChecks.h"
+
+static /*@dependent@*/ uentry posRedeclared = uentry_undefined;
+static /*@only@*/ fileloc posLoc = fileloc_undefined;
+static int nuentries = 0;
+static int totuentries = 0;
+
+static void checkGlobalsModifies (/*@notnull@*/ uentry p_ue, sRefSet p_sr) ;
+static void uentry_setDeclDef (uentry p_e, fileloc p_f) /*@modifies p_e@*/ ;
+static bool uentry_isRefCounted (uentry p_ue) /*@*/ ;
+static bool uentry_isRefsField (uentry p_ue) /*@*/ ;
+static bool uentry_isReallySpecified (uentry p_e) /*@*/ ;
+static void uentry_checkIterArgs (uentry p_ue);
+static cstring uentry_dumpAux (uentry p_v, bool p_isParam);
+
+/*@access ekind@*/
+static void checkAliasState (/*@notnull@*/ uentry p_old,
+			       /*@notnull@*/ uentry p_unew, 
+			       bool p_mustConform, bool p_completeConform) 
+   /*@modifies p_old, p_unew@*/ ;
+static void checkNullState (/*@notnull@*/ uentry p_old,
+			    /*@notnull@*/ uentry p_unew, 
+			    bool p_mustConform, bool p_completeConform) 
+   /*@modifies p_old, p_unew@*/ ;
+
+static void checkVarConformance (/*@notnull@*/ uentry p_old,
+				 /*@notnull@*/ uentry p_unew, 
+				 bool p_mustConform, bool p_completeConform) 
+   /*@modifies p_old, p_unew@*/;
+
+# ifndef NOLCL
+static void uentry_setHasMods (uentry p_ue) /*@modifies p_ue@*/;
+static void uentry_setHasGlobs (uentry p_ue) /*@modifies p_ue@*/;
+# endif
+
+static void uentry_reallyFree (/*@notnull@*/ /*@only@*/ uentry p_e);
+
+static void uentry_setSpecDef (/*@special@*/ uentry p_e, /*@keep@*/ fileloc p_f)
+   /*@defines p_e->whereSpecified, p_e->whereDeclared, p_e->whereDefined@*/
+   /*@modifies p_e@*/;
+
+static void returnValueError (/*@notnull@*/ uentry p_old, /*@notnull@*/ uentry p_unew);
+static void nargsError (/*@notnull@*/ uentry p_old, /*@notnull@*/ uentry p_unew);
+static /*@observer@*/ cstring paramStorageName (uentry p_ue) /*@*/ ;
+static /*@observer@*/ cstring fcnErrName (uentry p_ue) /*@*/ ;
+static /*@observer@*/ cstring checkedName (chkind p_checked) /*@*/ ;
+static void 
+  paramTypeError (/*@notnull@*/ uentry p_old, /*@notnull@*/ uentry p_oldCurrent,
+		  ctype p_oldType, /*@notnull@*/ uentry p_unew,
+		  /*@notnull@*/ uentry p_newCurrent, 
+		  ctype p_newType, int p_paramno) /*@modifies g_msgstream@*/ ;
+
+static /*@only@*/ /*@notnull@*/ uentry 
+  uentry_makeVariableAux (cstring p_n, ctype p_t, /*@keep@*/ fileloc p_f,
+			  /*@exposed@*/ sRef p_s, bool p_priv, vkind p_kind);
+
+static /*@out@*/ /*@notnull@*/ uentry uentry_alloc (void) /*@*/ 
+{
+  uentry ue = (uentry) dmalloc (sizeof (*ue));
+  nuentries++;
+  totuentries++;
+  
+  return ue;
+}
+
+static cstring uentry_getOptName (uentry p_e) /*@*/ ;
+static void uentry_copyInto (/*@out@*/ /*@unique@*/ uentry p_unew, uentry p_old);
+static void uentry_setNullState (/*@notnull@*/ uentry p_ue, nstate p_ns);
+static void uentry_setAliasKind (/*@notnull@*/ uentry p_ue, alkind p_ak);
+static /*@only@*/ /*@null@*/ uinfo uinfo_copy (uinfo p_u, ekind p_kind);
+static void uinfo_free (/*@only@*/ uinfo p_u, ekind p_kind);
+static void uvinfo_free (/*@only@*/ uvinfo p_u);
+
+# ifdef DOANNOTS
+
+static /*@only@*/ cstring ancontext_unparse (ancontext an)
+{
+  switch (an)
+    {
+    case AN_UNKNOWN: return cstring_makeLiteral ("unknown");
+    case AN_FCNRETURN: return cstring_makeLiteral ("return value");
+    case AN_FCNPARAM: return cstring_makeLiteral ("function param");
+    case AN_SUFIELD: return cstring_makeLiteral ("su field");
+    case AN_TDEFN: return cstring_makeLiteral ("type definition");
+    case AN_GSVAR: return cstring_makeLiteral ("global/static var");
+    case AN_CONST: return cstring_makeLiteral ("constant");
+    BADDEFAULT;
+    }
+  BADEXIT;
+}
+
+static int annots[AN_LAST][QU_LAST];
+static int decls[AN_LAST];
+static int shdecls[AN_LAST];
+static int idecls[AN_LAST];
+
+void initAnnots ()
+{
+  int i, j;
+
+  for (i = AN_UNKNOWN; i < AN_LAST; i++)
+    {
+      decls[i] = 0;
+      shdecls[i] = 0;
+      idecls[i] = 0;
+
+      for (j = QU_UNKNOWN; j < QU_LAST; j++)
+	{
+	  annots[i][j] = 0;
+	}
+    }
+}
+
+static void tallyAnnot (ancontext ac, qual q)
+{
+  (annots[ac][q])++;
+}
+
+void printAnnots ()
+{
+  int total[QU_LAST];
+  int alltotals = 0;
+  int totdecls = 0;
+  int totshdecls = 0;
+  int totidecls = 0;
+  int i, j;
+
+  for (j = QU_UNKNOWN; j < QU_LAST; j++)
+    {
+      total[j] = 0;
+    }
+
+  for (i = AN_UNKNOWN; i < AN_LAST; i++)
+    {
+      int tmptot;
+
+      if (decls[i] > 0)
+	{
+	  printf ("Context: %s (%d declarations, %d sharable, %d indirect)\n", 
+		  ancontext_unparse (i),
+		  decls[i], shdecls[i], idecls[i]);
+	  
+	  totdecls += decls[i];
+	  totshdecls += shdecls[i];
+	  totidecls += idecls[i];
+	  
+	  for (j = QU_UNKNOWN; j < QU_LAST; j++)
+	    {
+	      total[j] += annots[i][j];
+	      alltotals += annots[i][j];
+	    }
+	  
+	  printf ("   Allocation:\n");
+	  
+	  tmptot = 0;
+	  
+	  for (j = QU_UNKNOWN; j < QU_LAST; j++)
+	    {
+	      if (qual_isAliasQual (j) && !qual_isUnique (j))
+		{
+		  if (annots[i][j] > 0)
+		    {
+		      printf ("\t%10s: %5d (%3.2f%%)\n", qual_unparse (j), annots[i][j],
+			      100.0 * (double)annots[i][j] / (double)decls[i]);
+		      tmptot += annots[i][j];
+		    }
+		}
+	    }
+
+	  printf ("   Exposure:\n");
+	  
+	  tmptot = 0;
+	  
+	  for (j = QU_UNKNOWN; j < QU_LAST; j++)
+	    {
+	      if (qual_isExQual (j))
+		{
+		  if (annots[i][j] > 0)
+		    {
+		      printf ("\t%10s: %5d (%3.2f%%)\n", qual_unparse (j), annots[i][j],
+			      100.0 * (double)annots[i][j] / (double)decls[i]);
+		      tmptot += annots[i][j];
+		    }
+		}
+	    }
+	  
+	  printf ("   Definition:\n");
+	  
+	  for (j = QU_UNKNOWN; j < QU_LAST; j++)
+	    {
+	      if (qual_isAllocQual (j))
+		{
+		  if (annots[i][j] > 0)
+		    {
+		      printf ("\t%10s: %5d (%3.2f%%)\n", qual_unparse (j), annots[i][j],
+			      100.0 * (double)annots[i][j] / (double)decls[i]);
+		    }
+		}
+	    }
+	  
+	  printf ("   Null:\n");
+	  
+	  for (j = QU_UNKNOWN; j < QU_LAST; j++)
+	    {
+	      if (qual_isNull (j) || qual_isNotNull (j) || qual_isRelNull (j))
+		{
+		  if (annots[i][j] > 0)
+		    {
+		      printf ("\t%10s: %5d (%3.2f%%)\n", qual_unparse (j), annots[i][j],
+			      100.0 * (double)annots[i][j] / (double)decls[i]);
+		    }
+		}
+	    }
+
+	  printf ("\n");
+	}
+    }
+
+  for (j = QU_UNKNOWN; j < QU_LAST; j++)
+    {
+      bool hasone = FALSE;
+
+      for (i = AN_UNKNOWN; i < AN_LAST; i++)
+	{
+	  if (annots[i][j] > 0)
+	    {
+	      hasone = TRUE;
+	      break;
+	    }
+	}
+
+      if (hasone)
+	{
+	  printf ("Annotation: %s\n", qual_unparse (j));
+	  
+	  for (i = AN_UNKNOWN; i < AN_LAST; i++)
+	    {
+	      if (annots[i][j] > 0)
+		{
+		  printf ("%25s: %5d\n", ancontext_unparse (i), annots[i][j]);
+		}
+	    }
+	  printf ("\n");
+	}
+    }
+
+  printf ("All Contexts\n");
+  
+  for (j = QU_UNKNOWN; j < QU_LAST; j++)
+    {
+      if (total[j] > 0)
+	{
+	  printf ("%10s: %5d (%3.2f%%)\n", qual_unparse (j), total[j],
+		  100.0 * (double)total[j] / (double)(totdecls));
+	}
+    }
+  printf ("\n");
+
+  printf ("Total Annotations: %d (%d decls, %d sharable, %d indirect)\n", alltotals, totdecls, totshdecls, totidecls); }
+
+extern void uentry_tallyAnnots (uentry u, ancontext kind)
+{
+  alkind ak = sRef_getAliasKind (u->sref);
+  exkind ek = sRef_getExKind (u->sref);
+  nstate ns = sRef_getNullState (u->sref);
+  sstate ss = sRef_getDefState (u->sref);
+  bool recordUnknown = FALSE;
+
+  
+  if (kind == AN_UNKNOWN)
+    {
+      ekind e = u->ukind;
+
+      if (e == KENDITER)
+	{
+	  return;
+	}
+      else if (e == KCONST || e == KENUMCONST)
+	{
+	  kind = AN_CONST;
+	}
+      else if (e == KFCN || e == KITER)
+	{
+	  uentryList params = uentry_getParams (u);
+	  bool hasRet = FALSE;
+
+	  uentryList_elements (params, current)
+	    {
+	      if (uentry_isReturned (current))
+		{
+		  hasRet = TRUE;
+		}
+	      if (!uentry_isElipsisMarker (current))
+		{
+		  uentry_tallyAnnots (current, AN_FCNPARAM);
+		}
+	    } end_uentryList_elements;
+	  
+	  kind = AN_FCNRETURN;
+	  
+	  if (ctype_isFunction (u->utype)
+	      && !hasRet
+	      && ctype_isVisiblySharable (ctype_realType (ctype_returnValue (u->utype))))
+	    {
+	      recordUnknown = TRUE;
+	    }
+	}
+      else if (e == KDATATYPE || e == KSTRUCTTAG || e == KUNIONTAG || e == KENUMTAG)
+	{
+	  ctype t = ctype_realType (u->utype);
+
+	  if (ctype_isSU (t))
+	    {
+	      uentryList fields = ctype_getFields (t);
+
+	      uentryList_elements (fields, current)
+		{
+		  uentry_tallyAnnots (current, AN_SUFIELD);
+		}
+	    } end_uentryList_elements;
+	  
+	  kind = AN_TDEFN;
+
+	  if (ctype_isVisiblySharable (u->utype))
+	    {
+	      recordUnknown = TRUE;
+	    }
+	}
+      else 
+	{
+	  kind = AN_GSVAR;
+	  
+	  
+	  if (ctype_isVisiblySharable (ctype_realType (u->utype)))
+	    {
+	      recordUnknown = TRUE;
+	    }
+	}
+    }
+
+  decls[kind]++;
+
+  if (kind == AN_FCNRETURN)
+    {
+      if (recordUnknown) 
+	{
+	  shdecls[kind]++;
+	  idecls[kind]++;
+	}
+      else 
+	{
+	  ;
+	}
+    }
+  else
+    {
+      if (ctype_isVisiblySharable (ctype_realType (u->utype)))
+	{
+	  shdecls[kind]++;
+	  	}
+      
+      if (ctype_isRealPointer (ctype_realType (u->utype)))
+	{
+	  idecls[kind]++;
+	}
+    }
+  
+
+
+
+
+
+
+
+
+
+  switch (ss)
+    {
+    case SS_ALLOCATED: tallyAnnot (kind, QU_OUT); break;
+    case SS_PARTIAL:   tallyAnnot (kind, QU_PARTIAL); break;
+    case SS_RELDEF:    tallyAnnot (kind, QU_RELDEF); break;
+    case SS_SPECIAL:   tallyAnnot (kind, QU_SPECIAL); break;
+    default: break;
+    }
+
+  if (uentry_isReturned (u))
+    {
+      tallyAnnot (kind, QU_RETURNED); 
+    }
+
+  switch (ak)
+    {
+    case AK_UNKNOWN:    
+      if (ctype_isRefCounted (ctype_realType (u->utype))
+	  || (ctype_isFunction (u->utype) &&
+	      ctype_isRefCounted (ctype_realType (ctype_returnValue (u->utype)))))
+	{
+	  ;
+	}
+      else
+	{
+	  if (kind == AN_FCNPARAM) 
+	    { 
+	      tallyAnnot (kind, QU_TEMP); 
+	    } 
+	  else if (recordUnknown) 
+	    { 
+	      if (kind == AN_FCNRETURN)
+		{
+		  		}
+	      tallyAnnot (kind, QU_UNKNOWN); 
+	    }
+	}
+      break;
+    case AK_ONLY:       tallyAnnot (kind, QU_ONLY); break;
+    case AK_IMPONLY:    tallyAnnot (kind, QU_ONLY); break;
+    case AK_KEEP:       tallyAnnot (kind, QU_KEEP); break;
+    case AK_KEPT:       tallyAnnot (kind, QU_KEPT); break;
+    case AK_IMPTEMP:
+    case AK_TEMP:       tallyAnnot (kind, QU_TEMP); break;
+    case AK_SHARED:     tallyAnnot (kind, QU_SHARED); break;
+    case AK_UNIQUE:     tallyAnnot (kind, QU_UNIQUE); break;
+    case AK_RETURNED:   tallyAnnot (kind, QU_RETURNED); break;
+    case AK_REFCOUNTED: tallyAnnot (kind, QU_UNKNOWN); break;
+    case AK_REFS:       tallyAnnot (kind, QU_REFS); break;
+    case AK_KILLREF:    tallyAnnot (kind, QU_KILLREF); break;
+    case AK_NEWREF:     tallyAnnot (kind, QU_NEWREF); break;
+    case AK_OWNED:      tallyAnnot (kind, QU_OWNED); break;
+    case AK_IMPDEPENDENT:
+    case AK_DEPENDENT:  tallyAnnot (kind, QU_DEPENDENT); break;
+    case AK_ERROR:    
+    case AK_FRESH:
+    case AK_STACK:
+    case AK_LOCAL:
+      break;
+    }
+
+  switch (ek)
+    {
+    case XO_EXPOSED:    tallyAnnot (kind, QU_EXPOSED); break;
+    case XO_OBSERVER:   tallyAnnot (kind, QU_OBSERVER); break;
+    default:  break;
+    }
+
+  switch (ns)
+    {
+    case NS_ERROR:   break;
+    case NS_UNKNOWN:   break;
+    case NS_NOTNULL:   break;
+    case NS_MNOTNULL:  tallyAnnot (kind, QU_NOTNULL); break;
+    case NS_RELNULL:   tallyAnnot (kind, QU_RELNULL); break;
+    case NS_CONSTNULL: tallyAnnot (kind, QU_NULL); break;
+    case NS_POSNULL:   tallyAnnot (kind, QU_NULL); break;
+    case NS_DEFNULL: 
+    case NS_ABSNULL:   break;   
+    }
+}
+
+# endif
+
+static /*@observer@*/ cstring specCode_unparse (specCode s) /*@*/
+{
+  switch (s)
+    {
+    case SPC_NONE: return cstring_makeLiteralTemp ("normal");
+    case SPC_PRINTFLIKE: return cstring_makeLiteralTemp ("printflike");
+    case SPC_SCANFLIKE: return cstring_makeLiteralTemp ("scanflike");
+    case SPC_MESSAGELIKE: return cstring_makeLiteralTemp ("messagelike");
+    case SPC_LAST: return cstring_makeLiteralTemp ("");
+    }
+
+  BADEXIT;
+}
+
+static specCode specCode_fromInt (int i)
+{
+  /*@+enumint@*/
+  llassert (i >= SPC_NONE && i < SPC_LAST);
+
+  return ((specCode) i);
+  /*@=enumint@*/
+}
+
+/*@observer@*/ cstring uentry_specOrDefName (uentry u) 
+{
+  if (uentry_isDeclared (u))
+    {
+      return cstring_makeLiteralTemp ("previously declared");
+    }
+  else
+    {
+      return cstring_makeLiteralTemp ("specified");
+    }
+}
+
+/*@observer@*/ cstring uentry_specDeclName (uentry u) 
+{
+  if (uentry_isDeclared (u))
+    {
+      return cstring_makeLiteralTemp ("previous declaration");
+    }
+  else
+    {
+      return cstring_makeLiteralTemp ("specification");
+    }
+}
+
+static /*@observer@*/ cstring uentry_reDefDecl (uentry old, uentry unew)  /*@*/ 
+{
+  if (uentry_isCodeDefined (old) && uentry_isCodeDefined (unew))
+    {
+      return cstring_makeLiteralTemp ("redefined");
+    }
+  else if (uentry_isCodeDefined (unew))
+    {
+      return cstring_makeLiteralTemp ("defined");
+    }
+  else if (uentry_isDeclared (old) && uentry_isDeclared (unew))
+    {
+      return cstring_makeLiteralTemp ("redeclared");
+    }
+  else
+    {
+      return cstring_makeLiteralTemp ("declared");
+    }
+}
+
+static /*@only@*/ fileloc setLocation (void)
+{
+  fileloc fl = context_getSaveLocation ();
+
+  if (fileloc_isDefined (fl)) 
+    {
+      return fl;
+    }
+  else
+    {
+      return fileloc_copy (g_currentloc);
+    }
+}
+
+/*@notnull@*/ uentry uentry_makeEnumConstant (cstring n, ctype t)
+{
+  fileloc loc = setLocation ();
+  uentry ue = uentry_makeConstant (n, t, loc);
+
+  ue->ukind = KENUMCONST;
+  uentry_setDefined (ue, loc);
+  return ue;
+}
+
+/*@notnull@*/ uentry uentry_makeEnumInitializedConstant (cstring n, ctype t, exprNode expr)
+{
+  fileloc loc = setLocation ();
+  uentry ue = uentry_makeConstant (n, t, loc);
+  ctype etype = exprNode_getType (expr);
+
+  if (!ctype_isRealInt (etype)) {
+    voptgenerror 
+      (FLG_ENUMMEMBERS,
+       message
+       ("Value of enum member is not an integeral type (type %s): %s",
+	ctype_unparse (etype), exprNode_unparse (expr)),
+       exprNode_loc (expr));
+  }
+  
+  ue->ukind = KENUMCONST;
+  uentry_setDefined (ue, loc);
+  return ue;
+}
+
+# ifndef NOLCL
+/*@notnull@*/ uentry uentry_makeSpecEnumConstant (cstring n, ctype t, fileloc loc)
+{
+  uentry ue = uentry_makeConstant (n, t, loc);
+
+  ue->ukind = KENUMCONST;
+  return ue;
+}
+# endif
+
+/*@notnull@*/ uentry uentry_makeVariableLoc (cstring n, ctype t)
+{
+  return uentry_makeVariable (n, t, setLocation (), FALSE);
+}
+
+# ifndef NOLCL
+/*@notnull@*/ /*@only@*/ uentry uentry_makeUnnamedVariable (ctype t)
+{
+  return uentry_makeVariable (cstring_undefined, t, setLocation (), FALSE);
+}
+# endif
+
+/*@notnull@*/ uentry uentry_makeIdDatatype (idDecl id)
+{
+  ctype ct = idDecl_getCtype (id);
+  uentry ue = uentry_makeDatatype (idDecl_observeId (id), ct, 
+				   MAYBE, MAYBE, setLocation ());
+
+  uentry_reflectQualifiers (ue, idDecl_getQuals (id));
+  
+  if (!ynm_isOn (ue->info->datatype->abs))
+    {
+      if (ctype_isUnknown (ct))
+	{
+	  ue->info->datatype->mut = MAYBE;
+	}
+      else
+	{
+	  ue->info->datatype->mut = ynm_fromBool (ctype_isMutable (ct));
+	}
+    }
+  
+  return ue;
+}
+
+void uentry_checkParams (uentry ue)
+{
+  if (uentry_isValid (ue))
+    {
+      bool isExt = uentry_isExtern (ue);
+
+      if (uentry_isRealFunction (ue))
+	{
+	  uentryList params = uentry_getParams (ue);
+
+	  uentryList_elements (params, current)
+	    {
+	      if (uentry_isValid (current))
+		{
+		  ctype ct = current->utype;		      
+		  
+		  if (ctype_isFixedArray (ct))
+		    {
+		      if (ctype_isArray (ctype_baseArrayPtr (ct))
+			  && !ctype_isFixedArray (ctype_baseArrayPtr (ct)))
+			{
+			  ;
+			}
+		      else
+			{
+			  voptgenerror 
+			    (FLG_FIXEDFORMALARRAY,
+			     message ("Function parameter %q declared as "
+				      "manifest array (size constant is meaningless)",
+				      uentry_getName (current)),
+			     uentry_whereDeclared (current));
+			}
+		    }
+		  else 
+		    {
+		      if (ctype_isArray (ct))
+			{
+			  voptgenerror 
+			    (FLG_FORMALARRAY,
+			     message ("Function parameter %q declared as "
+				      "array (treated as pointer)", 
+				      uentry_getName (current)),
+			     uentry_whereDeclared (current));
+			}
+		    }
+
+		  if (sRef_getNullState (uentry_getSref (current)) == NS_MNOTNULL)
+		    {
+		      if (ctype_isAbstract (ct) && 
+			  (isExt || (ctype_isAbstract (ctype_realType (ct))
+				     && !context_hasFileAccess (ctype_typeId (ct)))))
+			{
+			  vgenhinterror 
+			    (FLG_INCONDEFS,
+			     message 
+			     ("Function %q declared with notnull parameter %q of abstract "
+			      "type %s",
+			      uentry_getName (ue),
+			      uentry_getName (current),
+			      ctype_unparse (ct)),
+			     message 
+			     ("Since %s is an abstract type, notnull can only be "
+			      "used for parameters if the function is static to a "
+			      "module where %s is accessible.",
+			      ctype_unparse (ct),
+			      ctype_unparse (ct)),
+			     uentry_whereDeclared (current));
+			}
+		    }
+		}
+	    } end_uentryList_elements;
+	  
+	  if (sRef_getNullState (uentry_getSref (ue)) == NS_MNOTNULL)
+	    {
+	      ctype ct = ue->utype;
+		  
+	      if (ctype_isAbstract (ct) 
+		  && (isExt || (ctype_isAbstract (ctype_realType (ct))
+				&& !context_hasFileAccess (ctype_typeId (ct)))))
+		{
+		  vgenhinterror 
+		    (FLG_INCONDEFS,
+		     message 
+		     ("%s %q declared %s notnull storage of abstract type %s",
+		      ekind_capName (uentry_getKind (ue)),
+		      uentry_getName (ue),
+		      fcnErrName (ue),
+		      ctype_unparse (ct)),
+		     message 
+		     ("Since %s is an abstract type, notnull can only be used "
+		      "if it is static to a module where %s is accessible.",
+		      ctype_unparse (ct),
+		      ctype_unparse (ct)),
+		     uentry_whereDeclared (ue));
+		}
+	    }
+	}
+    }
+}
+
+static void reflectImplicitFunctionQualifiers (/*@notnull@*/ uentry ue, bool spec)
+{
+  alkind ak = sRef_getAliasKind (ue->sref);
+
+  if (alkind_isRefCounted (ak))
+    {
+      sRef_setAliasKind (ue->sref, AK_NEWREF, fileloc_undefined);
+    }
+  else 
+    {
+      if (alkind_isUnknown (ak))
+	{
+	  exkind ek = sRef_getExKind (ue->sref);
+	  
+	  if (exkind_isKnown (ek))
+	    {
+	      sRef_setAliasKind (ue->sref, AK_IMPDEPENDENT, fileloc_undefined);
+	    }
+	  else 
+	    {
+	      if (context_getFlag (spec ? FLG_SPECRETIMPONLY : FLG_RETIMPONLY))
+		{
+		  if (ctype_isVisiblySharable 
+		      (ctype_realType (ctype_returnValue (ue->utype))))
+		    {
+		      if (uentryList_hasReturned (uentry_getParams (ue)))
+			{
+			  ;
+			}
+		      else
+			{
+			  sRef_setAliasKind (ue->sref, AK_IMPONLY, 
+					     fileloc_undefined);
+			  			}
+		    }
+		}
+	    }
+	}
+    }
+}
+
+static /*@notnull@*/ uentry 
+uentry_makeFunctionAux (cstring n, ctype t, 
+			typeIdSet access,
+			/*@only@*/ globSet globs, 
+			/*@only@*/ sRefSet mods, 
+			/*@keep@*/ fileloc f, bool priv,
+			/*@unused@*/ bool isForward)
+{
+  uentry e = uentry_alloc ();
+  ctype ret;
+
+  if (ctype_isFunction (t))
+    {
+      ret = ctype_returnValue (t);
+    }
+  else
+    {
+      if (ctype_isKnown (t))
+	{
+	  llbug (message ("not function: %s", ctype_unparse (t)));
+	}
+      ret = ctype_unknown;
+    }
+
+  e->ukind = KFCN;
+
+  if (fileloc_isSpec (f) || fileloc_isImport (f))
+    {
+      e->whereSpecified = f;
+      e->whereDeclared = fileloc_undefined;
+    }
+  else
+    {
+      e->whereSpecified = fileloc_undefined;
+      e->whereDeclared = f;
+    }
+
+  /* e->shallowCopy = FALSE; */
+  e->uname = cstring_copy (n);
+  e->utype = t;
+  e->storageclass = SCNONE;
+
+    e->sref = sRef_makeType (ret);
+
+  if (ctype_isUA (ret))
+    {
+      sRef_setStateFromType (e->sref, ret);
+    }
+  
+  e->used = FALSE;
+  e->lset = FALSE;
+  e->uses = filelocList_new ();
+  e->isPrivate = priv;
+  e->hasNameError = FALSE;
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->fcn = (ufinfo) dmalloc (sizeof (*e->info->fcn));
+
+  e->info->fcn->hasMods = sRefSet_isDefined (mods);
+  e->info->fcn->hasGlobs = globSet_isDefined (globs);
+
+  e->info->fcn->exitCode = XK_UNKNOWN;
+  e->info->fcn->nullPred = QU_UNKNOWN;
+  e->info->fcn->specialCode = SPC_NONE;
+
+  e->info->fcn->access = access;
+  e->info->fcn->globs = globs;
+  e->info->fcn->defparams = uentryList_undefined;
+
+  sRef_setDefined (e->sref, f);
+  e->whereDefined = fileloc_undefined;
+  
+  e->info->fcn->mods = sRefSet_undefined;
+  e->info->fcn->specclauses = NULL;
+  checkGlobalsModifies (e, mods);
+  e->info->fcn->mods = mods;
+
+  return (e);
+}
+
+/*@notnull@*/ uentry uentry_makeIdFunction (idDecl id)
+{
+  uentry ue = 
+    uentry_makeFunction (idDecl_observeId (id), idDecl_getCtype (id), 
+			 typeId_invalid, globSet_undefined, 
+			 sRefSet_undefined, 
+			 setLocation ());
+  
+  uentry_reflectQualifiers (ue, idDecl_getQuals (id));
+  reflectImplicitFunctionQualifiers (ue, FALSE);
+
+  if (!uentry_isStatic (ue)
+      && cstring_equalLit (ue->uname, "main"))
+    {
+      ctype typ = ue->utype;
+      ctype retval;
+      uentryList args;
+
+      llassert (ctype_isFunction (typ));
+
+      retval = ctype_returnValue (typ);
+
+      if (!ctype_isInt (retval))
+	{
+	  voptgenerror 
+	    (FLG_MAINTYPE,
+	     message ("Function main declared to return %s, should return int",
+		      ctype_unparse (retval)),
+	     uentry_whereDeclared (ue));
+	}
+
+      args = ctype_argsFunction (typ);
+
+      if (uentryList_isMissingParams (args) 
+	  || uentryList_size (args) == 0)
+	{
+	  ;
+	}
+      else
+	{
+	  if (uentryList_size (args) != 2)
+	    {
+	      voptgenerror 
+		(FLG_MAINTYPE,
+		 message ("Function main declared with %d arg%p, "
+			  "should have 2 (int argc, char *argv[])",
+			  uentryList_size (args)),
+		 uentry_whereLast (ue));
+	    }
+	  else
+	    {
+	      uentry arg = uentryList_getN (args, 0);
+	      ctype ct = uentry_getType (arg);
+
+	      if (!ctype_isInt (ct))
+		{
+		  voptgenerror 
+		    (FLG_MAINTYPE,
+		     message ("Parameter 1, %q, of function main declared "
+			      "with type %t, should have type int",
+			      uentry_getName (arg), ct),
+		     uentry_whereDeclared (arg));
+		}
+
+	      arg = uentryList_getN (args, 1);
+	      ct = uentry_getType (arg);
+
+	      if (ctype_isArrayPtr (ct)
+		  && ctype_isArrayPtr (ctype_baseArrayPtr (ct))
+		  && ctype_isChar (ctype_baseArrayPtr (ctype_baseArrayPtr (ct))))
+		{
+		  ;
+		}
+	      else
+		{
+		  voptgenerror 
+		    (FLG_MAINTYPE,
+		     message ("Parameter 2, %q, of function main declared "
+			      "with type %t, should have type char **",
+			      uentry_getName (arg), ct),
+		     uentry_whereDeclared (arg));
+		}
+	    }
+	}
+    }
+
+  return ue;
+}
+
+static void uentry_implicitParamAnnots (/*@notnull@*/ uentry e)
+{
+  alkind ak = sRef_getAliasKind (e->sref);
+
+  if ((alkind_isUnknown (ak) || alkind_isImplicit (ak))
+      && context_getFlag (FLG_PARAMIMPTEMP))
+    {
+      exkind ek = sRef_getExKind (e->sref);
+      
+      if (exkind_isKnown (ek))
+	{
+	  sRef_setAliasKind (e->sref, AK_IMPDEPENDENT, fileloc_undefined);
+	  sRef_setOrigAliasKind (e->sref, AK_IMPDEPENDENT);
+	}
+      else
+	{
+	  sRef_setAliasKind (e->sref, AK_IMPTEMP, fileloc_undefined);
+	  sRef_setOrigAliasKind (e->sref, AK_IMPTEMP);
+	}
+    }
+}
+
+static /*@only@*/ /*@notnull@*/ uentry 
+uentry_makeVariableParamAux (cstring n, ctype t, sRef s, sstate defstate)
+{
+  cstring pname = makeParam (n);
+  uentry e = uentry_makeVariableAux (pname, t, setLocation (), s, FALSE, VKPARAM);
+
+  cstring_free (pname);
+  uentry_implicitParamAnnots (e);
+
+  if (!sRef_isAllocated (e->sref) && !sRef_isPartial (e->sref))
+    {
+      sRef_setDefState (e->sref, defstate, uentry_whereDeclared (e));
+      e->info->var->defstate = defstate;
+    }
+
+  return (e);
+}
+
+# ifndef NOLCL
+void
+uentry_setRefCounted (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      uentry_setAliasKind (e, AK_REFCOUNTED);
+      sRef_storeState (e->sref);
+    }
+}
+# endif
+
+void
+uentry_setStatic (uentry c)
+{
+  if (uentry_isValid (c)) 
+    {
+      alkind ak = sRef_getAliasKind (c->sref);
+      c->storageclass = SCSTATIC;
+
+      if (uentry_isVariable (c) && !ctype_isFunction (uentry_getType (c)))
+	{
+	  if (!alkind_isUnknown (ak)
+	      && !alkind_isStatic (ak))
+	    {
+	      if  (!(ctype_isRealPointer (uentry_getType (c)))
+		   && !(ctype_isAbstract (ctype_realType (uentry_getType (c))))
+		   && !alkind_isRefCounted (ak))
+		{
+		  if (alkind_isImplicit (ak)
+		      && alkind_isDependent (ak)
+		      && ctype_isArray (uentry_getType (c)))
+		    {
+		      ; /* no error for observer arrays */
+		    }
+		  else
+		    {
+		      voptgenerror 
+			(FLG_INCONDEFS,
+			 message ("Static storage %q declared as %s",
+				  uentry_getName (c),
+				  alkind_unparse (ak)),
+			 uentry_whereDeclared (c));
+		    }
+		}
+	    }
+	  else
+	    {
+	      if (alkind_isUnknown (ak)
+		  || (alkind_isImplicit (sRef_getAliasKind (c->sref))
+		      && !alkind_isDependent (sRef_getAliasKind (c->sref))))
+		{
+		  sRef_setAliasKind (c->sref, AK_STATIC, fileloc_undefined);
+		  sRef_setOrigAliasKind (c->sref, AK_STATIC);
+		}
+	    }
+	}
+    }
+}
+
+void
+uentry_setExtern (uentry c)
+{
+  if (uentry_isValid (c)) 
+    c->storageclass = SCEXTERN;
+}
+
+void
+uentry_setParamNo (uentry ue, int pno)
+{
+  llassert (uentry_isAnyParam (ue) && sRef_isParam (ue->sref));
+  sRef_setParamNo (ue->sref, pno);
+}
+
+static
+void checkGlobalsModifies (/*@notnull@*/ uentry ue, sRefSet sr)
+{
+  sRefSet_allElements (sr, el)
+    {
+      sRef base = sRef_getRootBase (el);
+      
+      if (sRef_isGlobal (base) || sRef_isInternalState (base)
+	  || (sRef_isKindSpecial (base) && !sRef_isNothing (base)))
+	{
+	  if (!globSet_member (ue->info->fcn->globs, base))
+	    {
+	      if (uentry_hasGlobs (ue)
+		  || context_getFlag (FLG_WARNMISSINGGLOBALSNOGLOBS))
+		{
+		  if (optgenerror 
+		      (FLG_WARNMISSINGGLOBALS,
+		       message
+		       ("Modifies list for %q uses global %q, "
+			"not included in globals list.",
+			uentry_getName (ue),
+			sRef_unparse (base)),
+		       uentry_whereLast (ue)))
+		    {
+		      uentry_showWhereSpecified (ue);
+		    } 
+		}
+	      
+	      ue->info->fcn->globs = globSet_insert (ue->info->fcn->globs, 
+						     base);
+	      if (sRef_isFileStatic (base))
+		{
+		  context_recordFileGlobals (ue->info->fcn->globs);
+		}
+	    }
+	}
+    } end_sRefSet_allElements;
+}
+
+uentry
+uentry_makeVariableSrefParam (cstring n, ctype t, sRef s)
+{
+  return (uentry_makeVariableParamAux (n, t, s, SS_UNKNOWN));
+}
+
+void
+uentry_fixupSref (uentry ue)
+{
+  sRef sr;
+  
+  if (uentry_isUndefined (ue) || uentry_isElipsisMarker (ue)) 
+    {
+      return;
+    }
+  
+  sr = uentry_getSref (ue);
+
+  sRef_resetState (sr);
+  sRef_clearDerived (sr);
+  
+  llassertprint (uentry_isVariable (ue), ("fixing: %s", uentry_unparseFull (ue)));
+  llassert (sRef_isValid (sr)); 
+  
+  if (uentry_isVariable (ue))
+    {
+      sRef_setDefState (sr, ue->info->var->defstate, fileloc_undefined);
+      sRef_setNullState (sr, ue->info->var->nullstate, fileloc_undefined);
+    }
+}
+
+void uentry_setSpecialClauses (uentry ue, specialClauses clauses)
+{
+  llassert (uentry_isFunction (ue));
+  llassert (ue->info->fcn->specclauses == NULL);
+
+  ue->info->fcn->specclauses = clauses;
+  specialClauses_checkAll (ue);
+}
+
+/*
+** Used for @modifies@ @endmodifies@ syntax.
+**
+** If ue is specified, sr must contain *only*:
+**
+**      o file static globals
+**      o sRef's derived from modifies spec (i.e., more specific than
+**        what was specified)
+**
+** Otherwise, if sr has modifies it must match sr.
+**
+** If it doesn't have modifies, set them to sr.
+*/
+
+void
+uentry_setModifies (uentry ue, /*@owned@*/ sRefSet sr)
+{
+  if (sRef_modInFunction ())
+    {
+      llparseerror
+	(message ("Modifies list not in function context.  "
+		  "A modifies list can only appear following the parameter list "
+		  "in a function declaration or header."));
+
+      /*@-mustfree@*/ return; /*@=mustfree@*/ 
+    }
+
+  if (sRefSet_hasStatic (sr))
+    {
+      context_recordFileModifies (sr);
+    }
+
+  if (uentry_isValid (ue))
+    {
+      if (uentry_isIter (ue))
+	{
+	  llassert (sRefSet_isUndefined (ue->info->iter->mods));
+	  ue->info->iter->mods = sr;
+	}
+      else
+	{
+	  if (uentry_isVariable (ue) && ctype_isFunction (uentry_getType (ue)))
+	    {
+	      uentry_makeVarFunction (ue);
+	    }
+	  
+	  llassertfatal (uentry_isFunction (ue));
+	  llassert (sRefSet_isUndefined (ue->info->fcn->mods));
+	  
+	  ue->info->fcn->mods = sr;
+	  ue->info->fcn->hasMods = TRUE;
+	  
+	  checkGlobalsModifies (ue, sr);
+	}
+      
+      if (context_getFlag (FLG_MODIFIESIMPNOGLOBALS))
+	{
+	  ue->info->fcn->hasGlobs = TRUE;
+	}
+    }
+  else
+    {
+      sRefSet_free (sr);
+    }
+}
+
+/*
+** requires: new and old are functions
+*/
+ 
+static void
+checkGlobalsConformance (/*@notnull@*/ uentry old, 
+			 /*@notnull@*/ uentry unew, 
+			 bool mustConform, bool completeConform)
+{
+  bool hasInternalState = FALSE;
+
+  old->info->fcn->hasGlobs |= unew->info->fcn->hasGlobs;
+
+  if (globSet_isDefined (unew->info->fcn->globs))
+    {
+      globSet_allElements (unew->info->fcn->globs, el)
+	{
+	  if (sRef_isFileStatic (el))
+	    {
+	      sRef sr = globSet_lookup (old->info->fcn->globs, el);
+
+	      if (sRef_isInvalid (sr))
+		{
+		  bool hasError = FALSE;
+
+		  if (!hasInternalState 
+		      && sRef_isInvalid (globSet_lookup (old->info->fcn->globs,
+							 sRef_makeInternalState ()))
+		      && sRef_isInvalid (globSet_lookup (old->info->fcn->globs,
+							 sRef_makeSpecState ())))
+		    {
+		      if (mustConform 
+			  && !uentry_isStatic (old)
+			  && optgenerror 
+			  (FLG_INCONDEFS,
+			   message ("Globals list for %q includes internal state, %q, "
+				    "but %s without globals internalState.",
+				    uentry_getName (old),
+				    sRef_unparse (el),
+				    uentry_specOrDefName (old)),
+			   uentry_whereLast (unew)))
+			{
+			  uentry_showWhereSpecified (old);
+			  hasError = TRUE;
+			}
+		      
+		      old->info->fcn->globs = globSet_insert (old->info->fcn->globs,
+							      sRef_makeInternalState ());
+		      hasInternalState = TRUE;
+		    }
+
+		  if (!hasError
+		      && fileloc_sameFile (uentry_whereDeclared (unew),
+					   uentry_whereDeclared (old)))
+		    {
+		      if (mustConform
+			  && optgenerror 
+			  (FLG_INCONDEFS,
+			   message ("Function %q inconsistently %rdeclared (in "
+				    "same file) with file static global %q in "
+				    "globals list",
+				    uentry_getName (unew),
+				    uentry_isDeclared (old),
+				    sRef_unparse (el)),
+			   uentry_whereDeclared (unew)))
+			{
+			  uentry_showWhereSpecified (old);
+			}
+		    }
+		}
+
+	      old->info->fcn->globs = globSet_insert (old->info->fcn->globs, el);
+	      context_recordFileGlobals (old->info->fcn->globs);
+	    }
+	  else
+	    {
+	      sRef sr = globSet_lookup (old->info->fcn->globs, el);
+	      
+	      if (sRef_isInvalid (sr))
+		{
+		  if (mustConform
+		      && optgenerror 
+		      (FLG_INCONDEFS,
+		       message ("Function %q inconsistently %rdeclared with "
+				"%q in globals list",
+				uentry_getName (unew),
+				uentry_isDeclared (old),
+				sRef_unparse (el)),
+		       uentry_whereDeclared (unew)))
+		    {
+		      old->info->fcn->globs = globSet_insert (old->info->fcn->globs, el);
+		      uentry_showWhereSpecified (old);
+		    }
+		}
+	      else
+		{
+		  if (!bool_equal (sRef_isAllocated (el), sRef_isAllocated (sr)))
+		    {
+		      if (mustConform
+			  && optgenerror 
+			  (FLG_INCONDEFS,
+			   message 
+			   ("Function %q global %q inconsistently "
+			    "%rdeclared as %qout global",
+			    uentry_getName (unew),
+			    sRef_unparse (el),
+			    uentry_isDeclared (old),
+			    cstring_makeLiteral (sRef_isAllocated (el) ? "" : "non-")),
+			   uentry_whereDeclared (unew)))
+			{
+			  uentry_showWhereSpecified (old);
+			}
+		    }
+		}
+	    }
+	} end_globSet_allElements ;
+
+      if (completeConform)
+	{
+	  globSet_allElements (old->info->fcn->globs, el)
+	    {
+	      sRef sr = globSet_lookup (unew->info->fcn->globs, el);
+	      
+	      if (sRef_isInvalid (sr))
+		{
+		  if (mustConform
+		      && uentry_isReallySpecified (old)
+		      && optgenerror 
+		      (FLG_NEEDSPEC,
+		       message ("Function %q specified with %q in globals list, "
+				"but declared without %q",
+				uentry_getName (unew),
+				sRef_unparse (el),
+				sRef_unparse (el)),
+		       uentry_whereDeclared (unew)))
+		    {
+		      uentry_showWhereSpecified (old);
+		    }
+		}
+	    } end_globSet_allElements;
+	}
+    }
+  else
+    {
+      if (completeConform && !globSet_isEmpty (old->info->fcn->globs))
+	{
+	  if (uentry_isReallySpecified (old)
+	      && optgenerror 
+	      (FLG_NEEDSPEC,
+	       message ("%s %q specified with globals list, but "
+			"declared with no globals",
+			ekind_capName (unew->ukind),
+			uentry_getName (unew)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      llgenindentmsg 
+		(message ("Specification globals: %q", 
+			  globSet_unparse (old->info->fcn->globs)),
+		 uentry_whereSpecified (old));
+	    }
+	}
+      
+      unew->info->fcn->globs = globSet_copy (unew->info->fcn->globs, 
+					    old->info->fcn->globs);
+    }
+}
+
+/*
+** new modifies list must be included by old modifies list.
+**
+** file static state may be added to new, if old has internal.
+*/
+
+static void
+checkModifiesConformance (/*@notnull@*/ uentry old, /*@notnull@*/ uentry unew, 
+			  bool mustConform, bool completeConform)
+{
+  sRefSet newMods;
+  bool changedMods = FALSE;
+  bool modInternal = FALSE;
+
+  llassert (uentry_isFunction (old) && uentry_isFunction (unew));
+
+  old->info->fcn->hasMods |= unew->info->fcn->hasMods;
+  newMods = unew->info->fcn->mods;
+	    
+  if (sRefSet_isEmpty (newMods))
+    {
+      if (completeConform && !sRefSet_isEmpty (old->info->fcn->mods)
+	  && uentry_isReallySpecified (old))
+	{
+	  if (optgenerror 
+	      (FLG_NEEDSPEC,
+	       message ("%s %q specified with modifies clause, "
+			"but declared with no modifies clause",
+			ekind_capName (unew->ukind),
+			uentry_getName (unew)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      llgenindentmsg (message ("Specification has modifies %q", 
+				       sRefSet_unparse (old->info->fcn->mods)),
+			      uentry_whereSpecified (old));
+	    }
+	}
+
+      return;
+    }
+
+  sRefSet_allElements (newMods, current)
+    {
+      if (sRef_isValid (current))
+	{
+	  sRef rb = sRef_getRootBase (current);
+	  
+	  if (sRef_isFileStatic (rb))
+	    {
+	      if (!modInternal)
+		{
+		  if (!sRefSet_isSameMember (old->info->fcn->mods, 
+					     sRef_makeInternalState ())
+		      && !sRefSet_isSameMember (old->info->fcn->mods, 
+						sRef_makeSpecState ()))
+		    {
+		      if (mustConform 
+			  && !uentry_isStatic (old)
+			  && optgenerror 
+			  (FLG_INCONDEFS,
+			   message
+			   ("Modifies list for %q includes internal state, "
+			    "but %s without modifies internal.",
+			    uentry_getName (old),
+			    uentry_specOrDefName (old)),
+			   uentry_whereLast (unew)))
+			{
+			  uentry_showWhereSpecified (old);
+			}
+		      
+		      old->info->fcn->mods = 
+			sRefSet_insert (old->info->fcn->mods, 
+					sRef_makeInternalState ());
+		      modInternal = TRUE;
+		    }
+		}
+	      
+	      old->info->fcn->mods = sRefSet_insert (old->info->fcn->mods,
+						     current);
+	      changedMods = TRUE;
+	    }
+	  else
+	    {
+	      if (sRef_canModifyVal (current, old->info->fcn->mods))
+		{
+		  int size = sRefSet_size (old->info->fcn->mods);
+
+		  old->info->fcn->mods = sRefSet_insert (old->info->fcn->mods,
+							 current);
+
+		  if (sRefSet_size (old->info->fcn->mods) != size)
+		    {
+		      changedMods = TRUE;
+		    }
+		}
+	      else
+		{
+		  if (mustConform
+		      && optgenerror 
+		      (FLG_INCONDEFS,
+		       message 
+		       ("Modifies list for %q contains %q, not modifiable "
+			"according to %s",
+			uentry_getName (old),
+			sRef_unparse (current),
+			uentry_specDeclName (old)),
+		       uentry_whereLast (unew)))
+		    {
+		      uentry_showWhereSpecified (old);
+		    }
+		}
+	    }
+	}
+    } end_sRefSet_allElements;
+
+  if (completeConform && uentry_isReallySpecified (old))
+    {
+      sRefSet_allElements (old->info->fcn->mods, el)
+	{
+	  if (sRef_canModify (el, newMods))
+	    {
+	      ; /* okay */
+	    }
+	  else
+	    {
+	      if (optgenerror 
+		  (FLG_NEEDSPEC,
+		   message 
+		   ("Specification modifies clause for %q contains %q, "
+		    "not included in declaration modifies clause",
+		    uentry_getName (old),
+		    sRef_unparse (el)),
+		   uentry_whereLast (unew)))
+		{
+		  uentry_showWhereSpecified (old);
+		}
+	    }
+	} end_sRefSet_allElements ;
+    } 
+
+  /*
+  ** Make sure file static elements will be removed.
+  */
+
+  if (changedMods)
+    {
+      context_recordFileModifies (old->info->fcn->mods);
+    }
+}
+
+static void 
+  uentry_checkMutableType (uentry ue)
+{
+  ctype ct = uentry_getType (ue);
+
+  if (!ctype_isRealPointer (ct) && !ctype_isRealAbstract (ct))
+    {
+      voptgenerror (FLG_MUTREP,
+		    message ("Mutable abstract type %q declared without pointer "
+			     "indirection: %t (violates assignment semantics)",
+			     uentry_getName (ue), ct),
+		    uentry_whereDeclared (ue));
+    }
+}
+
+void
+uentry_setMutable (uentry e)
+{
+  llassert (uentry_isDatatype (e));
+  e->info->datatype->mut = YES;
+}
+
+static void
+uentry_checkIterArgs (uentry ue)
+{
+  bool hasYield = FALSE;
+  uentryList args;
+
+  llassert (uentry_isIter (ue));
+
+  args = uentry_getParams (ue);
+
+  uentryList_elements (args, el)
+    {
+      sstate ds = uentry_getDefState (el);
+
+      if (uentry_isYield (el))
+	{
+	  hasYield = TRUE;
+	}
+
+      if (sstate_isUnknown (ds))
+	{
+	  uentry_setDefState (el, SS_DEFINED);
+	}
+      else
+	{
+	  ;
+	}
+    } end_uentryList_elements;
+
+  if (!hasYield)
+    {
+      voptgenerror (FLG_HASYIELD,
+		    message ("Iterator %q declared with no yield parameters",
+			     uentry_getName (ue)),
+		    uentry_whereDeclared (ue));
+    }
+}
+
+static chkind
+chkind_fromQual (qual qel)
+{
+  if (qual_isChecked (qel))
+    {
+      return CH_CHECKED;
+    }
+  else if (qual_isCheckMod (qel))
+    {
+      return CH_CHECKMOD;
+    }
+  else if (qual_isCheckedStrict (qel))
+    {
+      return CH_CHECKEDSTRICT;
+    }
+  else if (qual_isUnchecked (qel))
+    {
+      return CH_UNCHECKED;
+    }
+  else
+    {
+      BADEXIT;
+      /*@notreached@*/ return CH_UNKNOWN;
+    }
+}
+
+static void
+uentry_reflectOtherQualifier (/*@notnull@*/ uentry ue, qual qel)
+{
+  if (qual_isKillRef (qel) || qual_isNewRef (qel) || qual_isTempRef (qel))
+    {
+      if (!uentry_isRefCounted (ue))
+	{
+	  llerror 
+	    (FLG_SYNTAX, 
+	     message ("Reference counting qualifier %s used on non-reference "
+		      "counted storage: %q",
+		      qual_unparse (qel), 
+		      uentry_unparse (ue)));
+	}
+      else
+	{
+	  alkind ak = alkind_fromQual (qel);
+	  
+	  uentry_setAliasKind (ue, ak);
+	}
+    }
+  else if (qual_isRefCounted (qel))
+    {
+      ctype ct = ctype_realType (uentry_getType (ue));
+      ctype rt;
+      
+      if (ctype_isPointer (ct) 
+	  && (ctype_isStruct (rt = ctype_realType (ctype_baseArrayPtr (ct)))))
+	{
+	  /* check there is a refs field */
+	  uentryList fields = ctype_getFields (rt);
+	  uentry refs = uentry_undefined;
+
+	  uentryList_elements (fields, field)
+	    {
+	      if (uentry_isRefsField (field))
+		{
+		  if (uentry_isValid (refs))
+		    {
+		      llerror 
+			(FLG_SYNTAX, 
+			 message ("Reference counted structure type %s has "
+				  "multiple refs fields: %q and %q",
+				  ctype_unparse (ct),
+				  uentry_getName (refs),
+				  uentry_getName (field)));
+		    }
+		  
+		  refs = field;
+		}
+	    } end_uentryList_elements;
+
+	  if (uentry_isInvalid (refs))
+	    {
+	      vgenhinterror 
+		(FLG_SYNTAX, 
+		 message ("Reference counted structure type %s has "
+			  "no refs field",
+			  ctype_unparse (ct)),
+		 cstring_makeLiteral
+		 ("To count reference, the structure must have a field named "
+		  "refs of type int."),
+		 g_currentloc);		  
+	    }
+	  else if (!ctype_isInt (uentry_getType (refs)))
+	    {
+	      llerror 
+		(FLG_SYNTAX, 
+		 message ("Reference counted structure type %s refs field has "
+			  "type %s (should be int)", ctype_unparse (ct),
+			  ctype_unparse (uentry_getType (refs))));
+	    }
+	  else
+	    {
+	      sRef_setAliasKind (ue->sref, alkind_fromQual (qel), 
+				 uentry_whereDeclared (ue));
+	    }
+	}
+      else
+	{
+	  if ((ctype_isPointer (ct) 
+	       && ctype_isUnknown (ctype_realType (ctype_baseArrayPtr (ct))))
+	      ||ctype_isAbstract (ct) || ctype_isUnknown (ct))
+	    {
+	      sRef_setAliasKind (ue->sref, alkind_fromQual (qel), 
+				 uentry_whereDeclared (ue));
+	    }
+	  else
+	    {
+	      llerror 
+		(FLG_SYNTAX, 
+		 message ("Non-pointer to structure type %s declared with "
+			  "refcounted qualifier",
+			  ctype_unparse (ct)));
+	    }
+	}
+    }
+  else if (qual_isRefs (qel))
+    {
+      if (uentry_isVariable (ue) && !uentry_isParam (ue))
+	{
+	  uentry_setAliasKind (ue, AK_REFS);
+	}
+      else
+	{
+	  llerror 
+	    (FLG_SYNTAX, 
+	     message ("Refs qualifier used on non-structure field: %q",
+		      uentry_unparse (ue)));
+	}
+    }
+  else if (qual_isAliasQual (qel))
+    {
+      alkind ak = alkind_fromQual (qel);
+      bool okay = TRUE;
+      alkind oldak = uentry_getAliasKind (ue);
+      ctype ut = uentry_getType (ue);
+      
+      if (alkind_isImplicit (ak) 
+	  && (alkind_isKnown (oldak) && !alkind_isImplicit (oldak)))
+	{
+	  /* ignore the implied qualifier */
+	  okay = FALSE;
+	}
+      
+      if (uentry_isEitherConstant (ue))
+	{
+	  llerror 
+	    (FLG_SYNTAX, 
+	     message ("Alias qualifier %s used on constant: %q",
+		      alkind_unparse (ak), uentry_unparse (ue)));
+	  okay = FALSE;
+	}
+      
+      if (ctype_isFunction (ut))
+	{
+	  ut = ctype_returnValue (ut);
+	}
+      
+      if (!(ctype_isVisiblySharable (ut) 
+	    || ctype_isRealArray (ut)
+	    || ctype_isRealSU (ut)))
+	{
+	  if (!qual_isImplied (qel))
+	    {
+	      llerror 
+		(FLG_SYNTAX, 
+		 message ("Alias qualifier %s used on unsharable storage type %t: %q",
+			  alkind_unparse (ak), ut, uentry_getName (ue)));
+	    }
+	  
+	  okay = FALSE;
+	}
+      else
+	{
+	  if (uentry_isRefCounted (ue))
+	    {
+	      if (!(qual_isRefQual (qel) || qual_isOnly (qel)
+		    || qual_isExposed (qel) 
+		    || qual_isObserver (qel)))
+		{
+		  if (!qual_isImplied (qel))
+		    {
+		      llerror 
+			(FLG_SYNTAX, 
+			 message 
+			 ("Alias qualifier %s used on reference counted storage: %q",
+			  alkind_unparse (ak), 
+			  uentry_unparse (ue)));
+		    }
+		  
+		  okay = FALSE;
+		}
+	    }
+	  else
+	    {
+	      if (qual_isRefQual (qel))
+		{
+		  llerror 
+		    (FLG_SYNTAX, 
+		     message ("Qualifier %s used on non-reference counted storage: %q",
+			      alkind_unparse (ak), uentry_unparse (ue)));
+		  
+		  okay = FALSE;
+		}
+	    }
+	}
+      
+      if (okay)
+	{
+	  uentry_setAliasKind (ue, ak);
+	}
+    }
+  else if (qual_isNull (qel))
+    {
+      if (uentry_isConstant (ue))
+	{
+	  sRef_setNullState 
+	    (ue->sref, 
+	     ctype_isAbstract (ue->utype) ? NS_CONSTNULL : NS_DEFNULL, 
+	     uentry_whereDeclared (ue));
+	}
+      else
+	{
+	  uentry_setNullState (ue, NS_POSNULL);
+	}
+    }
+  else if (qual_isRelNull (qel))
+    {
+      uentry_setNullState (ue, NS_RELNULL);
+    }
+  else if (qual_isNotNull (qel))
+    {
+      uentry_setNullState (ue, NS_MNOTNULL);
+    }
+  else if (qual_isAbstract (qel)
+	   || qual_isConcrete (qel))
+    {
+      if (!uentry_isDatatype (ue))
+	{
+	  llerror 
+	    (FLG_SYNTAX, 
+	     message ("Qualifier %s used with non-datatype", 
+		      qual_unparse (qel)));
+	}
+      else
+	{
+	  ue->info->datatype->abs = ynm_fromBool (qual_isAbstract (qel));
+	}
+    }
+  else if (qual_isMutable (qel))
+    {
+      if (!uentry_isDatatype (ue))
+	{
+	  llerror (FLG_SYNTAX,
+		   message ("Qualifier %s used with non-datatype", qual_unparse (qel)));
+	}
+      else
+	{
+	  if (!ynm_isOn (ue->info->datatype->mut))
+	    {
+	      uentry_checkMutableType (ue);
+	    }
+	  
+	  ue->info->datatype->mut = YES;
+	}
+    }
+  else if (qual_isImmutable (qel))
+    {
+      if (!uentry_isDatatype (ue))
+	{
+	  llerror (FLG_SYNTAX, message ("Qualifier %s used with non-datatype", 
+					qual_unparse (qel)));
+	}
+      else
+	{
+	  ue->info->datatype->mut = NO;
+	}
+    }
+  else if (qual_isNullPred (qel))
+    {
+      if (uentry_isVariable (ue) && ctype_isFunction (uentry_getType (ue)))
+	{
+	  uentry_makeVarFunction (ue);
+	}
+      
+      if (uentry_isFunction (ue))
+	{
+	  ctype typ = uentry_getType (ue);
+	  ctype rtype = ctype_returnValue (uentry_getType (ue));
+	  
+	  if (ctype_isRealBool (rtype))
+	    {
+	      uentryList pl = ctype_argsFunction (typ);
+	      
+	      if (uentryList_size (pl) == 1)
+		{
+		  ue->info->fcn->nullPred = qel;
+		}
+	      else
+		{
+		  llerror (FLG_SYNTAX, 
+			   message ("Qualifier %s used with function having %d "
+				    "arguments (should have 1)", 
+				    qual_unparse (qel),
+				    uentryList_size (pl)));
+		}
+	    }
+	  else
+	    {
+	      llerror (FLG_SYNTAX, 
+		       message ("Qualifier %s used with function returning %s "
+				"(should return bool)", 
+				qual_unparse (qel),
+				ctype_unparse (rtype)));
+	    }
+	}
+      else
+	{
+	  llerror (FLG_SYNTAX, 
+		   message ("Qualifier %s used with non-function", 
+			    qual_unparse (qel)));
+	}
+    }
+  else if (qual_isExitQual (qel))
+    {
+      exitkind exk = exitkind_fromQual (qel);
+      
+      if (uentry_isFunction (ue))
+	{
+	  if (exitkind_isKnown (ue->info->fcn->exitCode))
+	    {
+	      llerror (FLG_SYNTAX, 
+		       message ("Multiple exit qualifiers used on function %q:  %s, %s", 
+				uentry_getName (ue),
+				exitkind_unparse (ue->info->fcn->exitCode),
+				exitkind_unparse (exk)));
+	    }
+	  
+	  ue->info->fcn->exitCode = exk;
+	}
+      else
+	{
+	  if (uentry_isVariable (ue) && ctype_isFunction (uentry_getType (ue)))
+	    {
+	      uentry_makeVarFunction (ue);
+	      ue->info->fcn->exitCode = exk;
+	    }
+	  else
+	    {
+	      llerror (FLG_SYNTAX,
+		       message ("Exit qualifier %s used with non-function (type %s)", 
+				qual_unparse (qel),
+				ctype_unparse (uentry_getType (ue))));
+	    }
+	}
+    }
+  else
+    {
+      if (qual_isCQual (qel))
+	{
+	  ; /* okay */
+	}
+      else
+	{
+	  llbug (message ("unhandled qualifier: %s", qual_unparse (qel)));
+	}
+    }
+}
+
+void
+uentry_reflectQualifiers (uentry ue, qualList q)
+{
+  llassert (uentry_isValid (ue)); 
+
+  qualList_elements (q, qel)
+    {
+      if (qual_isStatic (qel))
+	{
+	  uentry_setStatic (ue);
+	}
+      else if (qual_isUnused (qel))
+	{
+	  uentry_setUsed (ue, fileloc_undefined);	  
+	}
+      else if (qual_isExternal (qel))
+	{
+	  fileloc_free (ue->whereDefined);
+	  ue->whereDefined = fileloc_createExternal ();
+	}
+      else if (qual_isSef (qel))
+	{
+	  if (uentry_isVariable (ue))
+	    {
+	      vkind vk = ue->info->var->kind;
+
+	      llassert (vk != VKREFPARAM);
+
+	      if (vk == VKYIELDPARAM)
+		{
+		  llerror
+		    (FLG_SYNTAX,
+		     message ("Qualifier sef cannot be used with %s: %q",
+			      cstring_makeLiteralTemp (vk == VKYIELDPARAM ? "yield" : "returned"),
+			      uentry_unparse (ue)));
+		}
+	      else if (vk == VKRETPARAM)
+		{
+		  ue->info->var->kind = VKSEFRETPARAM;
+		}
+	      else
+		{
+		  ue->info->var->kind = VKSEFPARAM;
+		}
+	    }
+	  else
+	    {
+	      llerror 
+		(FLG_SYNTAX,
+		 message ("Qualifier sef is meaningful only on parameters: %q", 
+			  uentry_unparse (ue)));
+	    }
+	}
+      else if (qual_isExtern (qel))
+	{
+	  ue->storageclass = SCEXTERN;
+	}
+      else if (qual_isGlobalQual (qel)) /* undef, killed */
+	{
+	  if (uentry_isVariable (ue))
+	    {
+	      sstate oldstate = ue->info->var->defstate;
+	      sstate defstate = sstate_fromQual (qel);
+
+
+	      if ((oldstate == SS_UNDEFGLOB && defstate == SS_KILLED)
+		  || (oldstate == SS_KILLED && defstate == SS_UNDEFGLOB))
+		{
+		  defstate = SS_UNDEFKILLED;
+		}
+	      else 
+		{
+		  ; /* any errors? */
+		}
+
+	      sRef_setDefState (ue->sref, defstate, fileloc_undefined);
+	      ue->info->var->defstate = defstate;
+	    }
+	  else
+	    {
+	      llerror 
+		(FLG_SYNTAX, 
+		 message ("Qualifier %s used on non-variable: %q",
+			  qual_unparse (qel), uentry_unparse (ue)));	      
+	    }
+	}
+      else if (qual_isAllocQual (qel)) /* out, partial, reldef, special, etc. */
+	{
+	  ctype realType = ctype_realType (ue->utype);
+	  sstate defstate = sstate_fromQual (qel);
+
+	  if (ctype_isFunction (realType))
+	    {
+	      realType = ctype_realType (ctype_returnValue (realType));
+	    }
+
+	  if (qual_isRelDef (qel))
+	    {
+	      ; /* okay anywhere */
+	    }
+	  else
+	    {
+	      if (!ctype_isAP (realType) 
+		  && !ctype_isSU (realType)
+		  && !ctype_isUnknown (realType)
+		  && !ctype_isAbstract (ue->utype))
+		{
+		  llerror 
+		    (FLG_SYNTAX, 
+		     message ("Qualifier %s used on non-pointer or struct: %q",
+			      qual_unparse (qel), uentry_unparse (ue)));
+		}
+	    }
+
+	  uentry_setDefState (ue, defstate);
+
+	  if (sRef_isStateSpecial (ue->sref)
+	      && alkind_isImplicit (sRef_getAliasKind (ue->sref)))
+	    {
+	      sRef_setAliasKind (ue->sref, AK_ERROR, fileloc_undefined);
+	    }
+	}
+      else if (qual_isYield (qel))
+	{
+	  if (uentry_isVariable (ue))
+	    {
+	      ue->info->var->kind = VKYIELDPARAM;
+	    }
+	  else
+	    {
+	      llerror 
+		(FLG_SYNTAX, 
+		 message ("Qualifier %s used on non-iterator parameter: %q",
+			  qual_unparse (qel), uentry_unparse (ue)));	      
+	    }
+	}
+      else if (qual_isExQual (qel))
+	{
+	  exkind ek = exkind_fromQual (qel);
+	  ctype ut = uentry_getType (ue);
+
+	  if (ctype_isFunction (ut))
+	    {
+	      ut = ctype_returnValue (ut);
+	    }
+	  
+	  if (!(ctype_isVisiblySharable (ut))
+	      && !(ctype_isArray (ut)) /* can apply to arrays also! */
+	      && !(ctype_isStruct (ctype_realType (ut)))) /* applies to structure fields! */
+	    {
+	      if (!qual_isImplied (qel))
+		{
+		  llerror 
+		    (FLG_SYNTAX, 
+		     message ("Qualifier %s used on unsharable storage type %t: %q",
+			      exkind_unparse (ek), ut, uentry_getName (ue)));
+		}
+	    }
+	  else
+	    {
+	      alkind ak = sRef_getAliasKind (ue->sref);
+
+	      sRef_setExKind (ue->sref, ek, uentry_whereDeclared (ue));
+
+	      if (alkind_isUnknown (ak) || alkind_isImplicit (ak) || alkind_isStatic (ak))
+		{
+		  if (!alkind_isTemp (ak))
+		    {
+		      uentry_setAliasKind (ue, AK_IMPDEPENDENT);
+		    }
+		}
+	      else if (alkind_isDependent (ak) || alkind_isTemp (ak)
+		       || alkind_isOwned (ak))
+		{
+		  ; /* okay */
+		}
+	      else
+		{
+		  llerror 
+		    (FLG_SYNTAX, 
+		     message ("Exposure qualifier %s used on %s storage (should "
+			      "be dependent): %q",
+			      qual_unparse (qel), 
+			      alkind_unparse (ak),
+			      uentry_unparse (ue)));
+		}
+	    }
+	}
+      else if (qual_isGlobCheck (qel))
+	{
+	  if (uentry_isVariable (ue))
+	    {
+	      chkind ch = chkind_fromQual (qel); 		
+		       
+	      if (ue->info->var->checked != CH_UNKNOWN)
+		{
+		  if (ch == ue->info->var->checked)
+		    {
+		      llerror (FLG_SYNTAX, 
+			       message ("Redundant %s qualifier on %q",
+					qual_unparse (qel),
+					uentry_getName (ue)));
+		    }
+		  else
+		    {
+		      llerror (FLG_SYNTAX, 
+			       message
+			       ("Contradictory %s and %s qualifiers on %q",
+				qual_unparse (qel),
+				checkedName (ue->info->var->checked),
+				uentry_getName (ue)));
+		    }
+		}
+
+	      ue->info->var->checked = ch;
+	    }
+	  else
+	    {
+	      llerror
+		(FLG_SYNTAX, 
+		 message ("Qualifier %s used with non-variable", 
+			  qual_unparse (qel)));
+	    }
+	}
+      else if (qual_isReturned (qel))
+	{
+	  if (uentry_isVariable (ue))
+	    {
+	      ue->info->var->kind = VKRETPARAM;
+	    }
+	  else
+	    {
+	      llerror (FLG_SYNTAX, message ("Qualifier %s used with non-variable", 
+					    qual_unparse (qel)));
+	    }
+	}
+      else
+	{
+	  uentry_reflectOtherQualifier (ue, qel);
+	}
+
+      sRef_storeState (ue->sref);
+    } end_qualList_elements;
+
+  qualList_clear (q);
+}
+	
+bool
+uentry_isOnly (uentry ue)
+{
+  return (!uentry_isUndefined (ue) 
+	  && uentry_isVariable (ue) 
+	  && alkind_isOnly (sRef_getOrigAliasKind (ue->sref)));
+}
+
+static void
+uentry_setAliasKind (/*@notnull@*/ uentry ue, alkind ak)
+{
+  sRef_setAliasKind (ue->sref, ak, uentry_whereDeclared (ue));
+  sRef_setOrigAliasKind (ue->sref, ak);
+}
+
+static void
+uentry_setNullState (/*@notnull@*/ uentry ue, nstate ns)
+{
+  if (uentry_isVariable (ue))
+    {
+      ue->info->var->nullstate = ns;
+    }
+
+  sRef_setNullState (ue->sref, ns, uentry_whereDeclared (ue));
+}
+
+bool
+uentry_isUnique (uentry ue)
+{
+  return (!uentry_isUndefined (ue) 
+	  && uentry_isVariable (ue) 
+	  && alkind_isUnique (sRef_getOrigAliasKind (ue->sref)));
+}
+
+bool
+uentry_isFileStatic (uentry ue)
+{
+  return (uentry_isStatic (ue) 
+	  && (!uentry_isVariable (ue)
+	      || sRef_isFileStatic (uentry_getSref (ue))));
+}
+
+bool
+uentry_isExported (uentry ue)
+{
+  if (uentry_isValid (ue))
+    {
+      if (uentry_isVariable (ue))
+	{
+	  return (sRef_isRealGlobal (uentry_getSref (ue)));
+	}
+      else
+	{
+	  return !uentry_isStatic (ue);
+	}
+    }
+
+  return FALSE;
+}
+
+bool
+uentry_isNonLocal (uentry ue)
+{
+  return (uentry_isValid (ue) && uentry_isVariable (ue)
+	  && (sRef_isGlobal (ue->sref) || uentry_isStatic (ue)));
+}
+
+bool
+uentry_isGlobal (uentry ue)
+{
+  return (uentry_isValid (ue) && uentry_isVariable (ue) && 
+	  sRef_isGlobal (ue->sref));
+}
+
+bool
+uentry_isPrintfLike (uentry ue)
+{
+  return (uentry_isFunction (ue) 
+	  && (ue->info->fcn->specialCode == SPC_PRINTFLIKE));
+}
+
+bool
+uentry_isScanfLike (uentry ue)
+{
+  return (uentry_isFunction (ue) 
+	  && (ue->info->fcn->specialCode == SPC_SCANFLIKE));
+}
+
+bool
+uentry_isMessageLike (uentry ue)
+{
+  return (uentry_isFunction (ue) 
+	  && (ue->info->fcn->specialCode == SPC_MESSAGELIKE));
+}
+
+static void checkSpecialFunction (/*@notnull@*/ uentry ue)
+{
+  uentryList args = uentry_getParams (ue);
+
+  if (!uentryList_isMissingParams (args))
+    {
+      uentry last = uentry_undefined;
+
+      uentryList_elements (args, current)
+	{
+	  if (uentry_isElipsisMarker (current))
+	    {
+	      if (uentry_isUndefined (last))
+		{
+		  voptgenerror 
+		    (FLG_SYNTAX,
+		     message ("Function %q is marked %s, but has no format "
+			      "string argument before elipsis",
+			      uentry_getName (ue),
+			      specCode_unparse (ue->info->fcn->specialCode)),
+		     uentry_whereLast (ue));
+		  ue->info->fcn->specialCode = SPC_NONE;
+		}
+	      else
+		{
+		  ctype rt = ctype_realType (uentry_getType (last));
+
+		  if (!ctype_match (rt, ctype_string))
+		    {
+		      bool okay = FALSE;
+
+		      /* wchar_t * is okay too */
+		      if (ctype_isAP (rt))
+			{
+			  ctype base = ctype_baseArrayPtr (rt);
+			  
+			  if (ctype_isArbitraryIntegral (base)) 
+			    {
+			      okay = TRUE;
+			    }
+			}
+		      
+		      if (!okay) 
+			{
+			  voptgenerror
+			    (FLG_SYNTAX,
+			     message ("Function %q is marked %s, but the argument "
+				      "before the elipsis has type %s (should be char *)",
+				      uentry_getName (ue),
+				      specCode_unparse (ue->info->fcn->specialCode),
+				      ctype_unparse (uentry_getType (last))),
+			     uentry_whereLast (ue));
+			  
+			  ue->info->fcn->specialCode = SPC_NONE;
+			}
+		    }
+		}
+	      return;
+	    }
+	  last = current;
+	} end_uentryList_elements ;
+
+      voptgenerror 
+	(FLG_SYNTAX,
+	 message ("Function %q is marked %s, but has no elipsis parameter",
+		  uentry_getName (ue),
+		  specCode_unparse (ue->info->fcn->specialCode)),
+	 uentry_whereLast (ue));
+
+      ue->info->fcn->specialCode = SPC_NONE;
+    }
+}
+
+void
+uentry_setPrintfLike (uentry ue)
+{
+  if (uentry_isVariable (ue) && ctype_isFunction (uentry_getType (ue)))
+    {
+      uentry_makeVarFunction (ue);
+    }
+  
+  llassertfatal (uentry_isFunction (ue));
+  ue->info->fcn->specialCode = SPC_PRINTFLIKE;
+  checkSpecialFunction (ue);
+}
+
+void
+uentry_setScanfLike (uentry ue)
+{
+  if (uentry_isVariable (ue) && ctype_isFunction (uentry_getType (ue)))
+    {
+      uentry_makeVarFunction (ue);
+    }
+  
+  llassertfatal (uentry_isFunction (ue));
+  ue->info->fcn->specialCode = SPC_SCANFLIKE;
+  checkSpecialFunction (ue);
+}
+
+void
+uentry_setMessageLike (uentry ue)
+{
+  if (uentry_isVariable (ue) && ctype_isFunction (uentry_getType (ue)))
+    {
+      uentry_makeVarFunction (ue);
+    }
+  
+  llassertfatal (uentry_isFunction (ue));
+  ue->info->fcn->specialCode = SPC_MESSAGELIKE;
+  checkSpecialFunction (ue);
+}
+
+bool
+uentry_isSpecialFunction (uentry ue)
+{
+  return (uentry_isFunction (ue) 
+	  && (ue->info->fcn->specialCode != SPC_NONE));
+}
+
+/*@notnull@*/ uentry uentry_makeParam (idDecl t, int i)
+{
+  ctype ct = idDecl_getCtype (t);
+  ctype base = ct;
+  sRef pref = sRef_makeParam (i, ct);
+  uentry ue = uentry_makeVariableSrefParam (idDecl_observeId (t), ct, pref);
+
+  uentry_reflectQualifiers (ue, idDecl_getQuals (t));
+  uentry_implicitParamAnnots (ue);
+
+  /* Parameter type [][] or [x][] is invalid */
+
+  while (ctype_isFixedArray (base)) {
+    base = ctype_baseArrayPtr (base);
+  }
+
+  if (ctype_isIncompleteArray (base)) {
+    base = ctype_baseArrayPtr (base);
+
+    if (ctype_isArray (base)) {
+      (void) optgenerror (FLG_INCOMPLETETYPE, 
+			  message ("Function parameter %q is incomplete type (inner array must have bounds): %s",
+				   uentry_getName (ue),
+				   ctype_unparse (ct)),
+			  uentry_whereLast (ue));
+    }
+  }
+
+  return ue;
+}
+
+/*@only@*/ /*@notnull@*/ uentry uentry_makeIdVariable (idDecl t)
+{
+  ctype ct = idDecl_getCtype (t);
+
+  if (ctype_isFunction (ct))
+    {
+            return (uentry_makeIdFunction (t));
+    }
+  else
+    {
+      fileloc loc = setLocation ();
+      uentry ue = uentry_makeVariable (idDecl_observeId (t), ct, loc, FALSE);
+      
+      uentry_reflectQualifiers (ue, idDecl_getQuals (t));
+
+      if (!uentry_isExtern (ue))
+	{
+	  uentry_setDefined (ue, loc);
+	}
+
+      return ue;
+    }
+}
+
+# ifndef NOLCL
+/*@notnull@*/ uentry uentry_makeVariableParam (cstring n, ctype t)
+{
+  return (uentry_makeVariableParamAux (n, t, sRef_makeType (t), SS_DEFINED));
+}
+# endif
+
+/*
+** constants
+*/
+
+/*@only@*/ /*@notnull@*/ 
+uentry uentry_makeConstantAux (cstring n, ctype t, 
+			       /*@keep@*/ fileloc f, bool priv,
+			       /*@only@*/ multiVal m)
+{
+  uentry e = uentry_alloc ();
+
+  e->ukind = KCONST;
+  e->uname = cstring_copy (n);
+  e->utype = t;
+  e->storageclass = SCNONE;
+
+  e->sref  = sRef_makeConst (t);
+
+  e->lset = FALSE;
+  e->used = FALSE;
+  
+  e->uses = filelocList_new ();
+  e->isPrivate = priv;
+  e->hasNameError = FALSE;
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->uconst = (ucinfo) dmalloc (sizeof (*e->info->uconst));
+  e->info->uconst->val = m;
+  e->info->uconst->access = typeIdSet_undefined;
+
+  uentry_setSpecDef (e, f);
+
+  if (multiVal_isInt (m) && (multiVal_forceInt (m) == 0))
+    {
+      sRef_setDefNull (e->sref, uentry_whereDeclared (e)); 
+    }
+
+  return (e);
+}
+
+/*@notnull@*/ uentry uentry_makeConstant (cstring n, ctype t, fileloc f)
+{
+  return (uentry_makeConstantAux (n, t, f, FALSE, multiVal_unknown ()));
+}
+
+/*@notnull@*/ uentry uentry_makeIdConstant (idDecl t)
+{
+  uentry ue = uentry_makeConstant (idDecl_observeId (t), 
+				   idDecl_getCtype (t), 
+				   fileloc_undefined);
+
+  llassert (fileloc_isUndefined (ue->whereDeclared));
+  ue->whereDeclared = setLocation ();
+
+  uentry_reflectQualifiers (ue, idDecl_getQuals (t));
+
+  return ue;
+}
+
+/*
+** variables
+*/
+
+void uentry_setDefState (uentry ue, sstate defstate)
+{
+  if (uentry_isValid (ue))
+    {
+      sRef_setDefState (ue->sref, defstate, fileloc_undefined);
+
+      if (uentry_isVariable (ue))
+	{
+	  ue->info->var->defstate = defstate; /* evs 2000-05-17: fixed bug, was SS_DEFINED! */
+	}
+    }
+}
+
+bool uentry_isCheckedUnknown (uentry ue)
+{
+  return (uentry_isVar (ue) 
+	  && (ue->info->var->checked == CH_UNKNOWN));
+}
+
+bool uentry_isCheckMod (uentry ue)
+{
+  return (uentry_isVar (ue) 
+	  && (ue->info->var->checked == CH_CHECKMOD));
+}
+
+bool uentry_isUnchecked (uentry ue)
+{
+  return (uentry_isVar (ue) 
+	  && (ue->info->var->checked == CH_UNCHECKED));
+}
+
+bool uentry_isChecked (uentry ue)
+{
+  return (uentry_isVar (ue) 
+	  && (ue->info->var->checked == CH_CHECKED));
+}
+
+bool uentry_isCheckedModify (uentry ue)
+{
+  return (uentry_isVar (ue) 
+	  && (ue->info->var->checked == CH_CHECKED
+	      || ue->info->var->checked == CH_CHECKMOD
+	      || ue->info->var->checked == CH_CHECKEDSTRICT));
+}
+
+bool uentry_isCheckedStrict (uentry ue)
+{
+  return (uentry_isVar (ue) 
+	  && (ue->info->var->checked == CH_CHECKEDSTRICT));
+}
+
+void uentry_setUnchecked (uentry ue)
+{
+  llassert (uentry_isVar (ue));
+
+  ue->info->var->checked = CH_UNCHECKED;
+}
+
+void uentry_setChecked (uentry ue)
+{
+  llassert (uentry_isVar (ue));
+
+  ue->info->var->checked = CH_CHECKED;
+}
+
+void uentry_setCheckMod (uentry ue)
+{
+  llassert (uentry_isVar (ue));
+
+  ue->info->var->checked = CH_CHECKMOD;
+}
+
+void uentry_setCheckedStrict (uentry ue)
+{
+  llassert (uentry_isVar (ue));
+  
+  ue->info->var->checked = CH_CHECKEDSTRICT;
+}
+
+static /*@only@*/ /*@notnull@*/ 
+  uentry uentry_makeVariableAux (cstring n, ctype t, 
+				 fileloc f,
+				 /*@exposed@*/ sRef s,
+				 bool priv, vkind kind)
+{
+  uentry e = uentry_alloc ();
+  ctype rt = t;
+
+  DPRINTF (("Make variable: %s %s %s", n, ctype_unparse (t), sRef_unparse (s)));
+
+  e->ukind = KVAR;
+  e->uname = cstring_copy (n);
+  e->utype = t;
+
+  e->storageclass = SCNONE;
+
+  e->sref  = s;
+
+  e->used = FALSE;
+  e->lset = FALSE;
+
+  e->uses = filelocList_new ();
+  e->isPrivate = priv;
+  e->hasNameError = FALSE;
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->var = (uvinfo) dmalloc (sizeof (*e->info->var));
+  e->info->var->kind = kind;
+
+  e->info->var->checked = CH_UNKNOWN;
+
+  uentry_setSpecDef (e, f);
+
+  if (ctype_isFunction (rt))
+    {
+      rt = ctype_returnValue (rt);
+    }
+
+  if (ctype_isUA (rt))
+    {
+      sRef_setStateFromType (e->sref, rt);
+    }
+
+  e->info->var->defstate = sRef_getDefState (e->sref);  
+  e->info->var->nullstate = sRef_getNullState (e->sref);
+
+  return (e);
+}
+
+bool
+uentry_isYield (uentry ue)
+{
+  return (uentry_isVariable (ue) 
+	  && (ue->info->var->kind == VKYIELDPARAM
+	      || ue->info->var->kind == VKREFYIELDPARAM));
+}
+
+static bool
+uentry_isRefsField (uentry ue)
+{
+  return (uentry_isVariable (ue) && sRef_isRefsField (ue->sref));
+}
+
+/*@only@*/ /*@notnull@*/ 
+uentry uentry_makeVariable (cstring n, ctype t, fileloc f, bool isPriv)
+{
+  return (uentry_makeVariableAux (n, t, f, sRef_makeType (t), isPriv, 
+				  fileloc_isSpec (f) ? VKSPEC : VKNORMAL));
+}
+
+/*
+** functions
+*/
+
+void uentry_makeVarFunction (uentry ue)
+{
+  alkind ak;
+  exkind ek;
+  uvinfo oldInfo;
+  fileloc loc;
+
+  llassert (uentry_isValid (ue));
+  llassert (!sRef_modInFunction ());
+
+  ak = sRef_getOrigAliasKind (ue->sref);
+  ek = sRef_getOrigExKind (ue->sref);
+
+  oldInfo = ue->info->var;
+
+  llassert (ctype_isUnknown (ue->utype) || ctype_isFunction (ue->utype));
+
+  /*
+  ** expanded macro is marked used (until I write a pre-processor)
+  */
+
+  ue->used |= (oldInfo->kind == VKEXPMACRO);
+
+  ue->ukind = KFCN;
+  ue->info->fcn = (ufinfo) dmalloc (sizeof (*ue->info->fcn));
+  ue->info->fcn->exitCode = XK_UNKNOWN;
+  ue->info->fcn->nullPred = QU_UNKNOWN;
+  ue->info->fcn->specialCode = SPC_NONE;
+  ue->info->fcn->access = typeIdSet_undefined;
+  ue->info->fcn->hasGlobs = FALSE;
+  ue->info->fcn->globs = globSet_undefined;
+  ue->info->fcn->hasMods = FALSE;
+  ue->info->fcn->mods = sRefSet_undefined;
+  ue->info->fcn->specclauses = NULL;
+  ue->info->fcn->defparams = uentryList_undefined;
+
+  if (ctype_isFunction (ue->utype))
+    {
+      ue->sref = sRef_makeType (ctype_returnValue (ue->utype)); 
+    }
+  else
+    {
+      ue->sref = sRef_makeType (ctype_unknown); 
+    }
+
+  if (sRef_isRefCounted (ue->sref))
+    {
+      ak = AK_NEWREF;
+    }
+  else
+    {
+      if (alkind_isUnknown (ak))
+	{
+	  if (exkind_isKnown (ek))
+	    {
+	      ak = AK_IMPDEPENDENT;
+	    }
+	  else 
+	    {
+	      if (context_getFlag (FLG_RETIMPONLY))
+		{
+		  if (ctype_isFunction (ue->utype)
+		      && ctype_isVisiblySharable 
+		      (ctype_realType (ctype_returnValue (ue->utype))))
+		    {
+		      if (uentryList_hasReturned (uentry_getParams (ue)))
+			{
+			  ;
+			}
+		      else
+			{
+			  ak = AK_IMPONLY;
+			  			}
+		    }
+		}
+	    }
+	}
+    }
+
+  loc = ue->whereDeclared;
+
+  sRef_setAliasKind (ue->sref, ak, loc);
+  sRef_setNullState (ue->sref, oldInfo->nullstate, loc);
+  sRef_setDefState (ue->sref, oldInfo->defstate, loc);
+  sRef_setExKind (ue->sref, ek, loc);
+
+  if (oldInfo->kind == VKEXPMACRO)
+    {
+      fileloc_free (loc);
+      ue->whereDeclared = fileloc_undefined;
+    }
+  else
+    {
+      fileloc_free (ue->whereDefined);
+      ue->whereDefined = fileloc_undefined;
+    }
+
+  uvinfo_free (oldInfo);
+}
+
+void
+uentry_setGlobals (uentry ue, /*@owned@*/ globSet globs)
+{
+  llassert (uentry_isValid (ue));
+
+  if (uentry_isIter (ue))
+    {
+      llassert (globSet_isUndefined (ue->info->iter->globs));
+      ue->info->iter->globs = globs;
+    }
+  else
+    {
+      if (uentry_isVariable (ue) && ctype_isFunction (uentry_getType (ue)))
+	{
+	  uentry_makeVarFunction (ue);
+	}
+      
+      llassert (uentry_isFunction (ue));
+      llassert (!ue->info->fcn->hasGlobs 
+		&& globSet_isUndefined (ue->info->fcn->globs));
+      
+      ue->info->fcn->hasGlobs = TRUE;
+      /*@-mustfree@*/ ue->info->fcn->globs = globs;
+      /*@=mustfree@*/
+    }
+
+  if (globSet_hasStatic (globs))
+    {
+      context_recordFileGlobals (globs);
+    }
+
+  if (context_getFlag (FLG_GLOBALSIMPMODIFIESNOTHING))
+    {
+      ue->info->fcn->hasMods = TRUE;
+    }
+}
+
+void uentry_addAccessType (uentry ue, typeId tid)
+{
+  if (uentry_isFunction (ue))
+    {
+      ue->info->fcn->access = typeIdSet_insert (ue->info->fcn->access, tid);
+    }
+  else if (uentry_isEitherConstant (ue))
+    {
+      ue->info->uconst->access = typeIdSet_insert (ue->info->uconst->access, tid);
+    }
+  else if (uentry_isIter (ue))
+    {
+      ue->info->iter->access = typeIdSet_insert (ue->info->iter->access, tid);
+    }
+  else if (uentry_isEndIter (ue))
+    {
+      ue->info->enditer->access = typeIdSet_insert (ue->info->enditer->access, tid);
+    }
+  else
+    {
+      llbug (message ("no access for: %q", uentry_unparse (ue)));
+    }
+}
+
+/*@only@*/ /*@notnull@*/ uentry 
+  uentry_makeFunction (cstring n, ctype t, 
+		       typeId access, 
+		       /*@only@*/ globSet globs, /*@only@*/ sRefSet mods, 
+		       fileloc f)
+{
+  return (uentry_makeFunctionAux (n, t, 
+				  ((typeId_isInvalid (access)) ? typeIdSet_emptySet () 
+				   : typeIdSet_single (access)),
+				  globs, mods, f,
+				  FALSE, FALSE));
+}
+
+# ifndef NOLCL
+/*@notnull@*/ uentry 
+  uentry_makePrivFunction2 (cstring n, ctype t, 
+			    typeIdSet access, 
+			    globSet globs, sRefSet mods, 
+			    fileloc f)
+{
+  return (uentry_makeFunctionAux (n, t, access, globs, mods, f, TRUE, FALSE));
+}
+
+
+/*@notnull@*/ uentry 
+  uentry_makeSpecFunction (cstring n, ctype t, 
+			   typeIdSet access,
+			   /*@only@*/ globSet globs, 
+			   /*@only@*/ sRefSet mods, 
+			   fileloc f)
+{
+  uentry ue = uentry_makeFunctionAux (n, t, access, 
+				      globs, mods, f,
+				      FALSE, FALSE);
+
+  uentry_setHasGlobs (ue);
+  uentry_setHasMods (ue);
+
+  reflectImplicitFunctionQualifiers (ue, TRUE);
+  return (ue);
+}
+# endif
+
+uentry uentry_makeExpandedMacro (cstring s, fileloc f)
+{
+  uentry ue = uentry_makeVariableAux (s, ctype_unknown, fileloc_undefined, 
+				      sRef_undefined, FALSE, VKEXPMACRO);
+
+  uentry_setDefined (ue, f);
+  return ue;
+}
+
+/*@notnull@*/ /*@notnull@*/ uentry 
+  uentry_makeForwardFunction (cstring n, typeId access, fileloc f)
+{
+  uentry ue = uentry_makeFunctionAux (n, ctype_unknown, 
+				      typeIdSet_singleOpt (access),
+				      globSet_undefined, sRefSet_undefined, 
+				      fileloc_undefined,
+				      FALSE, TRUE);
+
+  ue->whereDeclared = fileloc_update (ue->whereDeclared, f);
+  return ue;
+}
+
+bool uentry_isForward (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      ctype ct = uentry_getType (e);
+
+      return (ctype_isUnknown (ct)
+	      || (ctype_isFunction (ct)
+		  && ctype_isUnknown (ctype_returnValue (ct))));
+    }
+
+  return FALSE;
+}
+
+# ifndef NOLCL
+/*@notnull@*/ uentry 
+uentry_makeTypeListFunction (cstring n, typeIdSet access, fileloc f)
+{
+  return (uentry_makeFunctionAux (n, ctype_unknown, access,
+				  globSet_new (),
+				  sRefSet_new (), f,
+				  FALSE, TRUE));
+}
+
+/*@notnull@*/ uentry 
+uentry_makeUnspecFunction (cstring n, ctype t, 
+			   typeIdSet access, 
+			   fileloc f)
+{
+  uentry ue = uentry_makeFunctionAux (n, t, access, globSet_new (),
+				      sRefSet_new (), f, FALSE, TRUE);
+
+  reflectImplicitFunctionQualifiers (ue, TRUE);
+  return ue;
+}
+# endif
+
+/*
+** datatypes
+*/
+
+/* is exported for use by usymtab_interface */
+
+/*@notnull@*/ uentry 
+  uentry_makeDatatypeAux (cstring n, ctype t, ynm mut, ynm abs, 
+			  fileloc f, bool priv)
+{
+  uentry e = uentry_alloc ();
+
+  /* e->shallowCopy = FALSE; */
+  e->ukind = KDATATYPE;
+  e->uname = cstring_copy (n);
+  e->utype = t;
+  e->storageclass = SCNONE;
+  e->sref  = sRef_makeUnknown ();
+
+  if (ctype_isUA (t))
+    {
+      sRef_setStateFromType (e->sref, t);
+    }
+
+  uentry_setSpecDef (e, f);
+
+  e->uses = filelocList_new ();
+  e->isPrivate = priv;
+  e->hasNameError = FALSE;
+
+  e->used = FALSE;
+  e->lset = FALSE;
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->datatype = (udinfo) dmalloc (sizeof (*e->info->datatype));
+  e->info->datatype->abs = abs;
+  e->info->datatype->mut = mut;
+  e->info->datatype->type = ctype_undefined;
+
+  if (uentry_isDeclared (e))
+    {
+      uentry_setDefined (e, f);
+    }
+
+  if (ynm_isOn (abs) && !(uentry_isCodeDefined (e)))
+    {
+      sRef_setNullState (e->sref, NS_ABSNULL, uentry_whereDeclared (e));
+    }
+
+  return (e);
+}
+
+/*@notnull@*/ uentry
+  uentry_makeDatatype (cstring n, ctype t, ynm mut, ynm abs, 
+		       fileloc f)
+{
+  return (uentry_makeDatatypeAux (n, t, mut, abs, f, FALSE));
+}
+
+/*@notnull@*/ uentry uentry_makeBoolDatatype (ynm abs)
+{
+  uentry ret = uentry_makeDatatypeAux (context_getBoolName (),
+				       ctype_bool, NO, abs, 
+				       fileloc_getBuiltin (),
+				       FALSE);
+  
+  ret->info->datatype->type = ctype_bool;
+  return ret;
+}
+
+/*
+** iters
+*/
+
+static /*@only@*/ /*@notnull@*/ uentry 
+  uentry_makeIterAux (cstring n, typeIdSet access, ctype ct, 
+		      /*@only@*/ fileloc f)
+{
+  uentry e = uentry_alloc ();
+
+  e->ukind = KITER;
+  e->uname = cstring_copy (n);
+  e->utype = ct;
+  e->sref  = sRef_makeUnknown ();
+  e->storageclass = SCNONE;
+  e->used = FALSE;
+  e->lset = FALSE;
+
+  uentry_setSpecDef (e, f);
+
+  e->uses = filelocList_new ();
+  e->isPrivate = FALSE;
+  e->hasNameError = FALSE;
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->iter = (uiinfo) dmalloc (sizeof (*e->info->iter));
+  e->info->iter->access = access;
+  e->info->iter->mods = sRefSet_undefined;
+  e->info->iter->globs = globSet_undefined;
+
+  uentry_checkIterArgs (e);
+  return (e);
+}
+
+/*@notnull@*/ uentry uentry_makeIter (cstring n, ctype ct, fileloc f)
+{
+  return (uentry_makeIterAux (n, context_fileAccessTypes (), ct, f));
+}
+
+static /*@notnull@*/ uentry
+uentry_makeEndIterAux (cstring n, typeIdSet access, /*@only@*/ fileloc f)
+{
+  uentry e = uentry_alloc ();
+
+  /* e->shallowCopy = FALSE; */
+  e->ukind = KENDITER;
+  e->storageclass = SCNONE;
+  e->uname = message ("end_%s", n);
+  e->utype = ctype_unknown;
+  e->sref  = sRef_makeUnknown ();
+
+  uentry_setSpecDef (e, f);
+
+  e->used = FALSE;
+  e->lset = FALSE;
+
+  e->uses = filelocList_new ();
+  e->isPrivate = FALSE;
+  e->hasNameError = FALSE;
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->enditer = (ueinfo) dmalloc (sizeof (*e->info->enditer));
+
+  e->info->enditer->access = access;
+
+  return (e);
+}
+
+/*@notnull@*/ /*@only@*/ uentry uentry_makeEndIter (cstring n, fileloc f)
+{
+  return (uentry_makeEndIterAux (n, context_fileAccessTypes (), f));
+}
+
+/*
+** tags
+*/
+
+static /*@only@*/ /*@notnull@*/ uentry 
+  uentry_makeTagAux (cstring n, ctype t, 
+		     /*@only@*/ fileloc fl, 
+		     bool priv, ekind kind)
+{
+  uentry e = uentry_alloc ();
+  
+  if (kind != KSTRUCTTAG && kind != KUNIONTAG && kind != KENUMTAG)
+    {
+      llbuglit ("uentry_makeTagAux: not a tag type");
+    }
+  
+  e->ukind = kind;
+  /* e->shallowCopy = FALSE; */
+  e->uname = cstring_copy (n);
+
+  e->utype = t;
+  e->sref  = sRef_makeUnknown ();
+  e->storageclass = SCNONE;
+
+  uentry_setSpecDef (e, fl);
+  
+  e->used = FALSE;
+  e->lset = FALSE;
+
+  e->uses = filelocList_new ();
+  e->isPrivate = priv;
+  e->hasNameError = FALSE;
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->datatype = (udinfo) dmalloc (sizeof (*e->info->datatype));
+  e->info->datatype->abs = NO;
+  e->info->datatype->mut = (kind == KENUMTAG) ? NO : MAYBE;
+  e->info->datatype->type = t;
+
+  if (uentry_isDeclared (e))
+    {
+      uentry_setDefined (e, fl);
+    }
+
+  return (e);  
+}
+
+uentry uentry_makeStructTagLoc (cstring n, ctype t)
+{
+  cstring sname = makeStruct (n);
+  uentry ret = uentry_makeTagAux (sname, t, setLocation (), FALSE, KSTRUCTTAG);
+
+  cstring_free (sname);
+  return (ret);
+}
+
+/*@only@*/ uentry
+uentry_makeStructTag (cstring n, ctype t, fileloc loc)
+{
+  cstring sname = makeStruct (n);
+  uentry ret = uentry_makeTagAux (sname, t, loc, FALSE, KSTRUCTTAG);
+
+  cstring_free (sname);
+  return ret;
+}
+
+/*@only@*/ uentry
+uentry_makeUnionTag (cstring n, ctype t, fileloc loc)
+{
+  cstring uname = makeUnion (n);
+  uentry ret = uentry_makeTagAux (uname, t, loc, FALSE, KUNIONTAG);
+
+  cstring_free (uname);
+  return (ret);
+}
+
+# ifndef NOLCL
+uentry
+uentry_makeEnumTag (cstring n, ctype t, fileloc loc)
+{
+  cstring ename = makeEnum (n);
+  uentry ret = uentry_makeTagAux (ename, t, loc, FALSE, KENUMTAG);
+
+  cstring_free (ename);
+  return ret;
+}
+# endif
+
+uentry
+uentry_makeUnionTagLoc (cstring n, ctype t)
+{
+  cstring uname = makeUnion (n);
+  uentry ret = uentry_makeTagAux (uname, t, setLocation (), FALSE, KUNIONTAG);
+
+  cstring_free (uname);
+  return ret;
+}
+
+uentry
+uentry_makeEnumTagLoc (cstring n, ctype t)
+{
+  cstring ename = makeEnum (n);
+  uentry ret = uentry_makeTagAux (ename, t, setLocation (), FALSE, KENUMTAG);
+
+  cstring_free (ename);
+  return ret;
+}
+
+bool 
+uentry_isStructTag (uentry ue) 
+{
+  return (uentry_isValid (ue) && ue->ukind == KSTRUCTTAG);
+}
+
+bool 
+uentry_isUnionTag (uentry ue) 
+{
+  return (uentry_isValid (ue) && ue->ukind == KUNIONTAG);
+}
+
+bool 
+uentry_isEnumTag (uentry ue) 
+{
+  return (uentry_isValid (ue) && ue->ukind == KENUMTAG);
+}
+
+bool
+uentry_isAnyTag (uentry ue)
+{
+  return (uentry_isStructTag (ue) 
+	  || uentry_isUnionTag (ue)
+	  || uentry_isEnumTag (ue));
+}
+
+static /*@unchecked@*/ /*@only@*/ uentry emarker = NULL;
+
+extern void uentry_destroyMod (void)
+   /*@globals killed emarker@*/ /*@modifies emarker@*/
+{
+  static bool wasDestroyed = FALSE;
+
+  llassert (!wasDestroyed);
+
+  if (emarker != NULL)
+    {
+      uentry_reallyFree (emarker);
+    }
+
+  wasDestroyed = TRUE;
+}
+
+uentry
+uentry_makeElipsisMarker (void)
+{
+  if (emarker == NULL)
+    {
+      emarker = uentry_alloc ();
+
+      emarker->ukind = KELIPSMARKER;
+      emarker->uname = cstring_makeLiteral ("...");
+      emarker->utype = ctype_elipsMarker;
+      emarker->sref  = sRef_undefined;
+      emarker->storageclass = SCNONE;
+      emarker->used = FALSE;
+      emarker->lset = FALSE;
+      emarker->info = NULL;
+
+      uentry_setSpecDef (emarker, fileloc_undefined);
+      emarker->uses = filelocList_new ();
+      emarker->isPrivate = FALSE;
+      emarker->hasNameError = FALSE;
+    }
+
+  /*@ignore@*/ return (emarker); /*@end@*/
+} 
+
+/*
+** comparisons
+*/
+
+bool
+uentry_equiv (uentry p1, uentry p2)
+{
+  if (uentry_compare (p1, p2) != 0)
+    {
+      return FALSE;
+    }
+  else
+    {
+      return TRUE;
+    }
+}
+
+int
+uentry_xcomparealpha (uentry *p1, uentry *p2)
+{
+  int res;
+
+  if ((res = uentry_compare (*p1, *p2)) == 0) {
+    if ((*p1 != NULL) && (*p2 != NULL)) {
+      res = cstring_compare ((*p1)->uname,
+			     (*p2)->uname);
+    }
+  }
+
+  return res;
+}
+
+int
+uentry_xcompareuses (uentry *p1, uentry *p2)
+{
+  uentry u1 = *p1;
+  uentry u2 = *p2;
+
+  if (uentry_isValid (u1))
+    {
+      if (uentry_isValid (u2))
+	{
+	  return (-1 * int_compare (filelocList_size (u1->uses), 
+				    filelocList_size (u2->uses)));
+	}
+      else
+	{
+	  return 1;
+	}
+    }
+  else
+    {
+      if (uentry_isValid (u2))
+	{
+	  return -1;
+	}
+      else
+	{
+	  return 0;
+	}
+    }
+}
+
+int 
+uentry_compareStrict (uentry v1, uentry v2)
+{
+  COMPARERETURN (uentry_compare (v1, v2));
+
+  if (v1 != v2 && uentry_isValid (v1) && uentry_isValid (v2))
+    {
+      COMPARERETURN (fileloc_compare (v1->whereDeclared, v2->whereDeclared));
+      COMPARERETURN (fileloc_compare (v1->whereDefined, v2->whereDefined));
+      COMPARERETURN (fileloc_compare (v1->whereSpecified, v2->whereSpecified));
+    }
+
+  return 0;
+}
+
+int
+uentry_compare (uentry u1, uentry u2)
+{
+  if (u1 == u2) return 0;
+  
+  if (uentry_isInvalid (u1)) return -1;
+  if (uentry_isInvalid (u2)) return 1;
+
+  INTCOMPARERETURN (u1->ukind, u2->ukind);
+  COMPARERETURN (ctype_compare (u1->utype, u2->utype));
+  COMPARERETURN (bool_compare (uentry_isPriv (u1), uentry_isPriv (u2)));
+
+  COMPARERETURN (sRef_compare (u1->sref, u2->sref));
+
+  switch (u1->ukind)
+    {
+    case KINVALID:
+    case KELIPSMARKER:
+      /* bug detected by lclint:  
+      ** uentry.c:753,14: Return value type bool does not match declared type int: TRUE 
+      */
+      return 0;
+    case KENUMCONST:
+    case KCONST:
+      return (multiVal_compare (u1->info->uconst->val,
+				u2->info->uconst->val));
+    case KSTRUCTTAG: 
+    case KUNIONTAG: 
+    case KENUMTAG: 
+      return (ctype_compare (u1->info->datatype->type, u2->info->datatype->type));
+    case KITER:
+      COMPARERETURN (typeIdSet_compare (uentry_accessType (u1), 
+					 uentry_accessType (u2)));
+      return (uentryList_compareParams (uentry_getParams (u1), 
+					uentry_getParams (u2)));
+    case KENDITER:
+      return (typeIdSet_compare (uentry_accessType (u1), 
+				  uentry_accessType (u2)));
+    case KFCN:
+      COMPARERETURN (typeIdSet_compare (uentry_accessType (u1), 
+					 uentry_accessType (u2)));
+      COMPARERETURN (globSet_compare (uentry_getGlobs (u1), 
+				      uentry_getGlobs (u2)));
+      COMPARERETURN (uentryList_compareParams (uentry_getParams (u1), 
+					       uentry_getParams (u2)));
+      COMPARERETURN (generic_compare (u1->info->fcn->specialCode,
+				       u2->info->fcn->specialCode));
+      COMPARERETURN (generic_compare (u1->info->fcn->nullPred,
+				       u2->info->fcn->nullPred));
+
+      return (sRefSet_compare (uentry_getMods (u1), uentry_getMods (u2)));
+    case KVAR:
+      COMPARERETURN (generic_compare (u1->info->var->kind, u2->info->var->kind));
+      COMPARERETURN (generic_compare (sRef_getOrigAliasKind (u1->sref),
+				      sRef_getOrigAliasKind (u2->sref)));
+      COMPARERETURN (generic_compare (sRef_getOrigExKind (u1->sref),
+				      sRef_getOrigExKind (u2->sref)));
+      COMPARERETURN (generic_compare (u1->info->var->checked,
+				      u2->info->var->checked));
+      COMPARERETURN (generic_compare (u1->info->var->defstate, 
+				      u2->info->var->defstate));
+      return        (generic_compare (u1->info->var->nullstate, 
+				      u2->info->var->nullstate));
+    case KDATATYPE:
+      COMPARERETURN (ctype_compare (u1->info->datatype->type,
+				    u2->info->datatype->type));
+      COMPARERETURN (ynm_compare (u1->info->datatype->mut,
+				  u2->info->datatype->mut));
+      return (ynm_compare (u1->info->datatype->abs, u2->info->datatype->abs));
+    }
+  
+  BADEXIT;
+}
+
+/*
+** library format:
+**
+** all entries are: [@]*#
+**
+** info depends on kind:
+*/
+
+static void
+advanceField (char **s)
+{
+  checkChar (s, '@');
+}
+
+static void
+advanceName (char **s)
+{
+  checkChar (s, '#');
+}
+
+static vkind
+vkind_fromInt (int i)
+{
+  if /*@+enumint@*/ (i < VKFIRST || i > VKLAST) /*@=enumint@*/
+    {
+      llbuglit ("vkind_fromInt: out of range");
+    }
+
+  return (vkind)i;
+}
+
+static uentry  
+  uentry_makeConstantBase (/*@only@*/ cstring name, ctype ct, 
+			   typeIdSet access, nstate nullstate,
+			   /*@keep@*/ fileloc loc, /*@only@*/ multiVal m)
+{
+  uentry e = uentry_alloc ();
+  
+  e->ukind = KCONST;
+  e->uname = name;
+  e->utype = ct;
+  e->sref  = sRef_makeConst (ct);
+
+  sRef_setNullState (e->sref, nullstate, loc);
+  e->storageclass = SCNONE;
+
+  if (fileloc_isSpec (loc))
+    {
+      e->whereSpecified = loc;
+      e->whereDeclared = fileloc_undefined;
+    }
+  else
+    {
+      e->whereSpecified = fileloc_undefined;
+      e->whereDeclared = loc;
+    }
+
+  e->whereDefined = fileloc_undefined;
+  e->uses = filelocList_new ();
+  e->isPrivate = FALSE;
+  e->hasNameError = FALSE;
+
+  e->used = FALSE;
+  e->lset = FALSE;
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->uconst = (ucinfo) dmalloc (sizeof (*e->info->uconst));
+  e->info->uconst->val = m;
+  e->info->uconst->access = access;
+
+  sRef_storeState (e->sref);
+
+  return (e);
+}
+
+static /*@only@*/ uentry  
+  uentry_makeVariableBase (/*@only@*/ cstring name, ctype ct, vkind kind, 
+			   sstate defstate, nstate isnull, alkind aliased,
+			   exkind exp, chkind checked, 
+			   /*@only@*/ fileloc loc)
+{
+  uentry e = uentry_alloc ();
+
+  e->ukind = KVAR;
+  e->uname = name;
+  e->utype = ct;
+  e->storageclass = SCNONE;
+
+  e->sref  = sRef_makeType (ct);
+  sRef_setNullState (e->sref, isnull, loc);
+
+  e->whereDefined = fileloc_undefined;
+
+  if (fileloc_isSpec (loc))
+    {
+      e->whereSpecified = loc;
+      e->whereDeclared = fileloc_undefined;
+    }
+  else
+    {
+      e->whereSpecified = fileloc_undefined;
+      e->whereDeclared = loc;
+    }
+
+  e->isPrivate = FALSE;
+  e->hasNameError = FALSE;
+
+  e->used = FALSE;
+  e->lset = FALSE;
+
+  e->uses = filelocList_new ();
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->var = (uvinfo) dmalloc (sizeof (*e->info->var));
+  e->info->var->kind = kind;
+  e->info->var->checked = checked;
+  e->info->var->defstate = defstate;
+
+  sRef_setDefState (e->sref, defstate, loc);
+
+  e->info->var->nullstate = sRef_getNullState (e->sref);
+
+  sRef_setExKind (e->sref, exp, loc);
+  sRef_setAliasKind (e->sref, aliased, loc);
+
+  sRef_storeState (e->sref);
+  return (e);
+}
+
+static /*@only@*/ uentry  
+uentry_makeDatatypeBase (/*@only@*/ cstring name, ctype ct, ynm abs, 
+			 ynm mut, ctype rtype, alkind ak, exkind exp, 
+			 sstate defstate, nstate isnull,
+			 /*@only@*/ fileloc loc)
+{
+  uentry e = uentry_alloc ();
+
+  e->ukind = KDATATYPE;
+  /* e->shallowCopy = FALSE; */
+  e->uname = name;
+  e->utype = ct;
+  e->storageclass = SCNONE;
+  e->sref  = sRef_makeUnknown ();
+
+  /*
+  ** This is only setting null state.  (I think?)
+  */
+
+  if (ctype_isUA (ct))
+    {
+      uentry te = usymtab_getTypeEntrySafe (ctype_typeId (ct));
+
+      if (uentry_isValid (te))
+	{
+	  sRef_setStateFromUentry (e->sref, te);
+	}
+      else
+	{
+	  /* problem for recursive type definitions */
+	}
+    }
+  
+  sRef_setAliasKind (e->sref, ak, loc);
+  sRef_setExKind (e->sref, exp, loc);
+
+  sRef_setDefState (e->sref, defstate, loc);
+
+  if (ynm_isOn (abs) && ctype_isUnknown (ct) && isnull == NS_UNKNOWN)
+    {
+      isnull = NS_ABSNULL;
+    }
+
+  sRef_mergeNullState (e->sref, isnull);
+
+  e->whereDefined = fileloc_copy (loc); /*< bogus!  (but necessary for lexer) >*/
+
+  if (fileloc_isSpec (loc))
+    {
+      e->whereSpecified = loc;
+      e->whereDeclared = fileloc_undefined;
+    }
+  else
+    {
+      e->whereSpecified = fileloc_undefined;
+      e->whereDeclared = loc;
+    }
+  
+  e->isPrivate = FALSE;
+  e->hasNameError = FALSE;
+
+  e->used = FALSE;
+  e->lset = FALSE;
+  e->uses = filelocList_new ();
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->datatype = (udinfo) dmalloc (sizeof (*e->info->datatype));
+  e->info->datatype->abs = abs;
+  e->info->datatype->mut = mut;
+  e->info->datatype->type = rtype;
+  
+  sRef_storeState (e->sref);
+
+  return (e);
+}
+
+# ifndef NOLCL
+static void uentry_setHasGlobs (uentry ue)
+{
+  llassert (uentry_isFunction (ue));
+
+  ue->info->fcn->hasGlobs = TRUE;
+}
+
+static void uentry_setHasMods (uentry ue)
+{
+  llassert (uentry_isFunction (ue));
+
+  ue->info->fcn->hasMods = TRUE;
+}
+# endif
+
+bool uentry_hasGlobs (uentry ue)
+{
+  if (uentry_isFunction (ue))
+    {
+      return (ue->info->fcn->hasGlobs);
+    }
+
+  return FALSE;
+}
+
+bool uentry_hasSpecialClauses (uentry ue)
+{
+  return (uentry_isFunction (ue) && (ue->info->fcn->specclauses != NULL));
+}
+
+specialClauses uentry_getSpecialClauses (uentry ue)
+{
+  llassert (uentry_isFunction (ue));
+  return ue->info->fcn->specclauses;
+}
+
+bool uentry_hasMods (uentry ue)
+{
+  if (uentry_isFunction (ue))
+    {
+      return (ue->info->fcn->hasMods);
+    }
+
+  return FALSE;
+}
+
+static uentry  
+  uentry_makeFunctionBase (/*@only@*/ cstring name, ctype ct, 
+			   typeIdSet access, 
+			   bool hasGlobs, /*@only@*/ globSet globs, 
+			   bool hasMods, /*@only@*/ sRefSet mods, 
+			   alkind ak, exkind exp, 
+			   sstate defstate, nstate isnull,
+			   exitkind exitCode,
+			   specCode sCode,
+			   qual nullPred,
+			   /*@only@*/ specialClauses specclauses,
+			   /*@only@*/ fileloc loc)
+{
+  uentry e = uentry_alloc ();
+  ctype ret;
+
+  /* e->shallowCopy = FALSE; */
+  e->ukind = KFCN;
+  e->uname = name;
+  e->utype = ct;
+  e->storageclass = SCNONE;
+
+  if (ctype_isFunction (ct))
+    {
+      ret = ctype_returnValue (ct);
+    }
+  else
+    {
+      if (ctype_isKnown (ct))
+	{
+	  llbug (message ("not function: %s", ctype_unparse (ct)));
+	}
+
+      ret = ctype_unknown;
+    }
+
+  e->sref  = sRef_makeType (ret);
+
+  if (ctype_isUA (ret))
+    {
+      sRef_setStateFromType (e->sref, ret);
+    }
+
+  sRef_setDefined (e->sref, loc);
+  sRef_setNullState (e->sref, isnull, loc);
+
+  sRef_setAliasKind (e->sref, ak, loc);
+  sRef_setExKind (e->sref, exp, loc);
+  sRef_setDefState (e->sref, defstate, loc);
+
+  e->whereSpecified = loc;
+  e->whereDefined = fileloc_undefined;
+
+  e->isPrivate = FALSE;
+  e->hasNameError = FALSE;
+
+  e->used = FALSE;
+  e->lset = FALSE;
+  e->uses = filelocList_new ();  
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->fcn = (ufinfo) dmalloc (sizeof (*e->info->fcn));
+  
+  e->info->fcn->exitCode = exitCode;
+  e->info->fcn->specialCode = sCode;
+  e->info->fcn->nullPred = nullPred;
+  e->info->fcn->access = access;
+
+  e->info->fcn->specclauses = specclauses;
+  e->info->fcn->hasGlobs = hasGlobs;
+  e->info->fcn->globs = globs;
+
+  e->info->fcn->hasMods = hasMods;
+  e->info->fcn->mods = mods;
+
+  e->info->fcn->defparams = uentryList_undefined; 
+  e->whereDeclared = fileloc_undefined;
+
+  sRef_storeState (e->sref);
+
+  return (e);
+}
+
+static /*@only@*/ uentry  
+  uentry_makeTagBase (/*@only@*/ cstring name, ekind tagkind, 
+		      ctype ct, ctype rtype, /*@only@*/ fileloc loc)
+{
+  uentry e = uentry_alloc ();
+  
+  if (tagkind != KSTRUCTTAG && tagkind != KUNIONTAG && tagkind != KENUMTAG)
+    {
+      llbuglit ("uentry_makeTagBase: not a tag type");
+    }
+
+  /* e->shallowCopy = FALSE; */
+  e->ukind = tagkind;
+  e->uname = name;
+  e->utype = ct;
+  e->sref  = sRef_makeUnknown ();
+  e->storageclass = SCNONE;
+
+  if (fileloc_isSpec (loc))
+    {
+      e->whereSpecified = loc;
+      e->whereDeclared = fileloc_undefined;
+    }
+  else
+    {
+      e->whereDeclared = loc;
+      e->whereSpecified = fileloc_undefined;
+    }
+
+  e->whereDefined = fileloc_undefined;
+
+  e->isPrivate = FALSE;
+  e->hasNameError = FALSE;
+
+  e->used = FALSE;
+  e->lset = FALSE;
+  e->uses = filelocList_new ();
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->datatype = (udinfo) dmalloc (sizeof (*e->info->datatype));
+  e->info->datatype->abs  = NO;
+  e->info->datatype->mut  = MAYBE;
+  e->info->datatype->type = rtype;
+
+  sRef_storeState (e->sref);
+
+  return (e);  
+}
+
+static uentry  
+  uentry_makeIterBase (/*@only@*/ cstring name, typeIdSet access, 
+		       ctype ct, /*@only@*/ fileloc loc)
+{
+  uentry e = uentry_alloc ();
+  
+  /* e->shallowCopy = FALSE; */
+  e->ukind = KITER;
+  e->uname = name;
+  e->utype = ct;
+  e->sref  = sRef_makeUnknown ();
+  e->storageclass = SCNONE;
+
+  if (fileloc_isSpec (loc))
+    {
+      e->whereSpecified = loc;
+      e->whereDeclared = fileloc_undefined;
+    }
+  else
+    {
+      e->whereDeclared = loc;
+      e->whereSpecified = fileloc_undefined;
+    }
+
+  e->whereDefined = fileloc_undefined;
+  
+  e->isPrivate = FALSE;
+  e->hasNameError = FALSE;
+
+  e->used = FALSE;
+  e->lset = FALSE;
+  e->uses = filelocList_new ();
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->iter = (uiinfo) dmalloc (sizeof (*e->info->iter));
+  e->info->iter->access = access;
+  e->info->iter->mods = sRefSet_undefined;
+  e->info->iter->globs = globSet_undefined;
+  
+  sRef_storeState (e->sref);
+  return (e);
+}
+
+static uentry  
+  uentry_makeEndIterBase (/*@only@*/ cstring name, typeIdSet access, 
+			  /*@only@*/ fileloc loc)
+{
+  uentry e = uentry_alloc ();
+
+  /* e->shallowCopy = FALSE; */
+  e->ukind = KENDITER;
+  e->storageclass = SCNONE;
+  e->uname = name;
+  e->utype = ctype_unknown;
+  e->sref  = sRef_makeUnknown ();
+  
+  if (fileloc_isSpec (loc))
+    {
+      e->whereSpecified = loc;
+      e->whereDeclared = fileloc_undefined;
+    }
+  else
+    {
+      e->whereDeclared = loc;
+      e->whereSpecified = fileloc_undefined;
+    }
+
+  e->whereDefined = fileloc_undefined;
+
+  e->isPrivate = FALSE;
+  e->hasNameError = FALSE;
+
+  e->used = FALSE;
+  e->lset = FALSE;
+  e->uses = filelocList_new ();
+
+  e->info = (uinfo) dmalloc (sizeof (*e->info));
+  e->info->enditer = (ueinfo) dmalloc (sizeof (*e->info->enditer));
+  e->info->enditer->access = access;
+  sRef_storeState (e->sref);
+
+  return (e);
+}
+
+void uentry_markFree (/*@unused@*/ /*@owned@*/ uentry u)
+{
+  /* should save u */
+/*@-mustfree@*/
+}
+/*@=mustfree@*/
+
+/*@only@*/ uentry
+uentry_undump (ekind kind, fileloc loc, char **s)
+{
+  uentry ue;
+  
+  if (**s == '!')
+    {
+      checkChar (s, '!');
+      checkChar (s, '.');
+      ue = uentry_makeElipsisMarker ();
+    }
+  else
+    {
+      ctype ct = ctype_undump (s);
+      cstring name;
+
+      switch (kind)
+	{
+	case KVAR:
+	  {
+	    vkind  tkind;
+	    sstate defstate;
+	    nstate isnull;
+	    alkind aliased;
+	    exkind exp;
+	    chkind checked;
+	    
+	    checkChar (s, '|');
+
+	    if (optCheckChar (s, '@'))
+	      {
+		tkind = vkind_fromInt (getInt (s));
+		checkChar (s, '|');
+	      }
+	    else
+	      {
+		tkind = VKPARAM;
+	      }
+
+	    if (optCheckChar (s, '$'))
+	      {
+		defstate = SS_UNKNOWN;
+		isnull = NS_UNKNOWN;
+		aliased = AK_IMPTEMP;
+		exp = XO_UNKNOWN;
+		checked = CH_UNKNOWN;
+	      }		
+	    else if (optCheckChar (s, '&'))
+	      {
+		defstate = SS_DEFINED;
+		isnull = NS_UNKNOWN;
+		aliased = AK_IMPTEMP;
+		exp = XO_UNKNOWN;
+		checked = CH_UNKNOWN;
+	      }		
+	    else if (optCheckChar (s, '^'))
+	      {
+		defstate = SS_UNKNOWN;
+		isnull = NS_UNKNOWN;
+		aliased = AK_IMPTEMP;
+		exp = XO_UNKNOWN;
+		checked = CH_UNKNOWN;
+	      }		
+	    else
+	      {
+		defstate = sstate_fromInt (getInt (s));      
+		advanceField (s); isnull = nstate_fromInt (getInt (s));      
+		advanceField (s); aliased = alkind_fromInt (getInt (s));      
+
+		if (optCheckChar (s, '&'))
+		  {
+		    exp = XO_UNKNOWN;
+		    checked = CH_UNKNOWN;
+		  }
+		else
+		  {
+		    advanceField (s); exp = exkind_fromInt (getInt (s));      
+		    advanceField (s); checked = (chkind) (getInt (s));      
+		  }
+	      }
+
+	    advanceName (s);
+	    name = getStringWord (s);
+	    
+	    ue = uentry_makeVariableBase (name, ct, tkind, defstate, 
+					  isnull, aliased, exp, 
+					  checked, fileloc_copy (loc));
+	  }
+	  break;
+	case KDATATYPE: 
+	  {
+	    ynm abs;
+	    ynm mut;
+	    ctype rtype;
+	    sstate defstate;
+	    nstate isnull;
+	    alkind aliased;
+	    exkind exp;
+
+	    advanceField (s); abs = ynm_fromCodeChar (loadChar (s));
+	    advanceField (s); mut = ynm_fromCodeChar (loadChar (s));
+	    advanceField (s); defstate = sstate_fromInt (getInt (s));      
+	    advanceField (s); isnull = nstate_fromInt (getInt (s));      
+	    advanceField (s); aliased = alkind_fromInt (getInt (s));      
+	    advanceField (s); exp = exkind_fromInt (getInt (s));      
+	    advanceField (s); rtype = ctype_undump (s);
+	    advanceName (s); 
+	    name = getStringWord (s);
+
+	    ue = uentry_makeDatatypeBase (name, ct, abs, mut, rtype, 
+					  aliased, exp, defstate, isnull, 
+					  fileloc_copy (loc));
+	  }
+	  break;
+	case KFCN:
+	  {
+	    alkind     ak;
+	    exkind     exp;
+	    sstate     defstate;
+	    nstate     isnull;
+	    exitkind   exitCode;
+	    specCode   specc;
+	    qual       nullPred;
+	    typeIdSet access;
+	    bool       hasGlobs;
+	    globSet    globs;
+	    bool       hasMods;
+	    sRefSet    mods;
+	    specialClauses specclauses;
+
+	    if (optCheckChar (s, '$'))
+	      {
+		defstate = SS_DEFINED;
+		isnull = NS_UNKNOWN;
+		exitCode = XK_UNKNOWN;
+		specc = SPC_NONE;
+		nullPred = QU_UNKNOWN;
+	      }
+	    else
+	      {
+		advanceField (s); defstate = sstate_fromInt (getInt (s)); 
+		advanceField (s); isnull = nstate_fromInt (getInt (s)); 
+		advanceField (s); exitCode = exitkind_fromInt (getInt (s)); 
+		advanceField (s); specc = specCode_fromInt (getInt (s)); 
+		advanceField (s); nullPred = qual_fromInt (getInt (s)); 
+	      }
+
+	    if (optCheckChar (s, '$'))
+	      {
+		hasGlobs = FALSE;
+		globs = globSet_undefined;
+		hasMods = FALSE;
+		mods = sRefSet_undefined;
+	      }
+	    else if (optCheckChar (s, '^'))
+	      {
+		hasGlobs = TRUE;
+		globs = globSet_undefined;
+		hasMods = TRUE;
+		mods = sRefSet_undefined;
+	      }
+	    else
+	      {
+		advanceField (s); hasGlobs = bool_fromInt (getInt (s));
+		advanceField (s); globs  = globSet_undump (s);
+		advanceField (s); hasMods = bool_fromInt (getInt (s));
+		advanceField (s); mods   = sRefSet_undump (s);	    
+	      }
+
+	    if (optCheckChar (s, '$'))
+	      {
+		ak = AK_UNKNOWN;
+		exp = XO_UNKNOWN;
+	      }
+	    else
+	      {
+		advanceField (s); ak = alkind_fromInt (getInt (s));
+		advanceField (s); exp = exkind_fromInt (getInt (s));      
+	      }
+
+	    advanceField (s); access = typeIdSet_undump (s);
+
+	    if (optCheckChar (s, '@'))
+	      {
+		specclauses = specialClauses_undump (s);
+	      }
+	    else
+	      {
+		specclauses = specialClauses_undefined; 
+	      }
+
+	    advanceName (s);  name = getStringWord (s);
+
+	    ue = uentry_makeFunctionBase (name, ct, access, 
+					  hasGlobs, globs, 
+					  hasMods, mods, 
+					  ak, exp, defstate, isnull, 
+					  exitCode, specc, nullPred,
+					  specclauses,
+					  fileloc_copy (loc));
+	    DPRINTF (("Undump: %s", uentry_unparse (ue)));
+	  }
+	  break;
+	case KITER:
+	  {
+	    typeIdSet access;
+	    
+	    advanceField (s); access = typeIdSet_undump (s);
+	    advanceName (s);  name = getStringWord (s);
+	    
+	    ue = uentry_makeIterBase (name, access, ct,
+				      fileloc_copy (loc));
+	  }
+	  break;
+	case KENDITER:
+	  {
+	    typeIdSet access;
+
+	    advanceField (s); access = typeIdSet_undump (s);
+	    advanceName (s);  name = getStringWord (s);
+	    
+	    ue = uentry_makeEndIterBase (name, access, fileloc_copy (loc));
+	  }
+	  break;
+	case KENUMCONST:  
+	case KCONST:  
+	  {
+	    typeIdSet access;
+	    multiVal val;
+	    nstate nullstate;
+
+	    if (optCheckChar (s, '$'))
+	      {
+		val = multiVal_undefined;
+		access = typeIdSet_undefined;
+		nullstate = NS_UNKNOWN;
+	      }
+	    else
+	      {
+		advanceField (s); val = multiVal_undump (s);
+		advanceField (s); access = typeIdSet_undump (s);
+		advanceField (s); nullstate = nstate_fromInt (getInt (s));
+	      }
+
+	    advanceName (s);  name = getStringWord (s);
+	    
+	    ue = uentry_makeConstantBase (name, ct, access,
+					  nullstate, fileloc_copy (loc), val);
+	    break;
+	  }
+	case KSTRUCTTAG:
+	case KUNIONTAG:
+	case KENUMTAG:
+	  {
+	    ctype rtype;
+	    
+	    advanceField (s); rtype = ctype_undump (s);
+	    advanceName (s);  name = getStringWord (s);
+	    ue = uentry_makeTagBase (name, kind, ct, rtype, fileloc_copy (loc));
+	  }
+	  break;
+	case KINVALID:
+	  llcontbuglit ("uentry_undump: invalid");
+	  ue = uentry_undefined;
+	  break;
+	case KELIPSMARKER:
+	  llcontbuglit ("uentry_undump: elips marker");
+	  ue = uentry_undefined;
+	  break;
+	}
+    }
+  
+  return (ue);
+}
+
+cstring
+uentry_dump (uentry v)
+{
+  return (uentry_dumpAux (v, FALSE));
+}
+
+cstring
+uentry_dumpParam (uentry v)
+{
+  llassertprint (uentry_isVariable (v) || uentry_isElipsisMarker (v),
+		 ("dump: %s", uentry_unparseFull (v)));
+
+  return (uentry_dumpAux (v, TRUE));
+}
+
+static cstring
+uentry_dumpAux (uentry v, bool isParam)
+{
+  llassert (uentry_isValid (v));
+
+  switch (v->ukind)
+    {
+    case KINVALID: 
+      llcontbuglit ("uentry_dump: invalid entry"); 
+      return cstring_undefined;
+    case KELIPSMARKER: 
+      return (message ("!."));
+    case KVAR:     
+      {
+	cstring sdump;
+	vkind vk  = v->info->var->kind;
+	sstate dss = sRef_getDefState (v->sref);
+	nstate nst = sRef_getNullState (v->sref);
+	alkind alk = sRef_getAliasKind (v->sref);
+	exkind exk = sRef_getExKind (v->sref);
+	chkind chk = v->info->var->checked;
+
+	if (dss == SS_UNKNOWN
+	    && nst == NS_UNKNOWN
+	    && alk == AK_IMPTEMP
+	    && exk == XO_UNKNOWN
+	    && chk == CH_UNKNOWN)
+	  {
+	    sdump = cstring_makeLiteral ("$");
+	  }
+	else if (dss == SS_DEFINED
+		 && nst == NS_UNKNOWN
+		 && alk == AK_IMPTEMP
+		 && exk == XO_UNKNOWN
+		 && chk == CH_UNKNOWN)
+	  {
+	    sdump = cstring_makeLiteral ("&");
+	  }
+	else if (dss == SS_UNKNOWN
+		 && nst == NS_UNKNOWN
+		 && alk == AK_UNKNOWN
+		 && exk == XO_UNKNOWN
+		 && chk == CH_UNKNOWN)
+	  {
+	    sdump = cstring_makeLiteral ("^");
+	  }
+	else if (exk == XO_UNKNOWN
+		 && chk == CH_UNKNOWN)
+	  {
+	    sdump = message ("%d@%d@%d&",
+			     (int) dss,
+			     (int) nst,
+			     (int) alk);
+	  }
+	else
+	  {
+	    sdump = message ("%d@%d@%d@%d@%d",	
+		     (int) dss,
+			     (int) nst,
+			     (int) alk,
+			     (int) exk,
+			     (int) chk);
+	  }
+	
+
+	if (vk != VKPARAM)
+	  {
+	    return (message ("%q|@%d|%q#%s", 
+			     ctype_dump (v->utype), 
+			     (int) vk,
+			     sdump,
+			     isParam ? cstring_undefined : v->uname));
+	  }
+	else
+	  {
+	    return (message ("%q|%q#%s", 
+			     ctype_dump (v->utype), 
+			     sdump,
+			     isParam ? cstring_undefined : v->uname));
+	  }
+
+      }
+    case KDATATYPE: 
+      return (message ("%q@%s@%s@%d@%d@%d@%d@%q#%s", 
+		       ctype_dump (v->utype),
+		       ynm_unparseCode (v->info->datatype->abs),
+		       ynm_unparseCode (v->info->datatype->mut),
+		       (int) sRef_getDefState (v->sref),
+		       (int) sRef_getNullState (v->sref),
+		       (int) sRef_getAliasKind (v->sref),
+		       (int) sRef_getExKind (v->sref),
+		       ctype_dump (v->info->datatype->type),
+		       v->uname));
+    case KFCN:
+      {
+	cstring sdump, gdump, adump;
+	alkind alk = sRef_getAliasKind (v->sref);
+	exkind exk = sRef_getExKind (v->sref);
+
+	if (sRef_getDefState (v->sref) == SS_DEFINED
+	    && !nstate_isKnown (sRef_getNullState (v->sref))
+	    && !exitkind_isKnown (v->info->fcn->exitCode)
+	    && v->info->fcn->specialCode == SPC_NONE
+	    && v->info->fcn->nullPred == QU_UNKNOWN)
+	  {
+	    sdump = cstring_makeLiteral ("$");
+	  }
+	else
+	  {
+	    sdump = message ("@%d@%d@%d@%d@%d",
+			     (int) sRef_getDefState (v->sref),
+			     (int) sRef_getNullState (v->sref),
+			     (int) v->info->fcn->exitCode,
+			     (int) v->info->fcn->specialCode,
+			     (int) v->info->fcn->nullPred);
+	  }
+
+	if (!uentry_hasGlobs(v) && !uentry_hasMods (v))
+	  {
+	    gdump = cstring_makeLiteral ("$");
+	  }
+	else if (uentry_hasGlobs (v) && globSet_isEmpty (uentry_getGlobs (v))
+		 && uentry_hasMods (v) && sRefSet_isEmpty (uentry_getMods (v)))
+	  {
+	    gdump = cstring_makeLiteral ("^");
+	  }
+	else
+	  {
+	    gdump = message ("@%s@%q@%s@%q",
+			     bool_dump (uentry_hasGlobs (v)),
+			     globSet_dump (uentry_getGlobs (v)),
+			     bool_dump (uentry_hasMods (v)),
+			     sRefSet_dump (uentry_getMods (v)));
+	  }
+
+	if (alk == AK_UNKNOWN && exk == XO_UNKNOWN)
+	  {
+	    adump = cstring_makeLiteral ("$");
+	  }
+	else
+	  {
+	    adump = message ("@%d@%d", (int) alk, (int) exk);
+	  }
+
+	if (uentry_hasSpecialClauses (v))
+	  {
+	    return (message ("%q%q%q%q@%q@%q#%s",
+			     ctype_dump (v->utype),
+			     sdump,
+			     gdump,
+			     adump,
+			     typeIdSet_dump (uentry_accessType (v)),
+			     specialClauses_dump (v->info->fcn->specclauses),
+			     v->uname));
+	  }
+	else
+	  {
+	    return (message ("%q%q%q%q@%q#%s",
+			     ctype_dump (v->utype),
+			     sdump,
+			     gdump,
+			     adump,
+			     typeIdSet_dump (uentry_accessType (v)),
+			     v->uname));
+	  }
+      }
+    case KITER:
+      return (message ("%q@%q#%s",
+		       ctype_dump (v->utype),
+		       typeIdSet_dump (v->info->iter->access),
+		       v->uname));
+    case KENDITER:
+      return (message ("%q@%q#%s",
+		       ctype_dump (v->utype),
+		       typeIdSet_dump (uentry_accessType (v)),
+		       v->uname));
+    case KENUMCONST:  
+    case KCONST:  
+      {
+	cstring sdump;
+
+	if (multiVal_isUnknown (v->info->uconst->val)
+	    && typeIdSet_isEmpty (uentry_accessType (v))
+	    && (sRef_getNullState (v->sref) == NS_UNKNOWN))
+	  {
+	    sdump = cstring_makeLiteral ("$");
+	  }
+	else
+	  {
+	    sdump = message ("@%q@%q@%d",
+			     multiVal_dump (v->info->uconst->val),
+			     typeIdSet_dump (uentry_accessType (v)),
+			     (int) sRef_getNullState (v->sref));
+	  }
+
+	return (message ("%q%q#%s", 
+			 ctype_dump (v->utype), 
+			 sdump,
+			 v->uname));
+      }
+    case KSTRUCTTAG:
+    case KUNIONTAG:
+    case KENUMTAG:
+      return (message ("%q@%q#%s", 
+		       ctype_dump (v->utype), 
+		       ctype_dump (v->info->datatype->type), v->uname));
+    }
+
+  BADEXIT;
+}
+
+/*@only@*/ cstring
+uentry_unparseAbbrev (uentry v)
+{
+  if (!uentry_isVariable (v))
+    {
+      llcontbuglit ("uentry_unparseAbbrev: not variable");
+      return uentry_unparse (v);
+    }
+
+  return (message ("%s %q", ctype_unparseDeep (v->utype), uentry_getName (v)));
+}
+
+/*@only@*/ cstring
+uentry_unparse (uentry v)
+{
+  cstring st;
+
+    if (uentry_isUndefined (v)) return (cstring_makeLiteral (""));
+  if (uentry_isElipsisMarker (v)) return (cstring_makeLiteral ("..."));
+
+  st = uentry_getName (v);
+
+  if (cstring_isDefined (st))
+    {
+      return (ctype_unparseDeclaration (v->utype, st)); 
+    }
+  else
+    {
+      cstring_free (st);
+      return (cstring_copy (ctype_unparse (v->utype)));
+    }
+}
+
+/*@only@*/ cstring
+uentry_unparseFull (uentry v)
+{
+  if (uentry_isUndefined (v))
+    {
+      return (cstring_makeLiteral (""));
+    }
+  else if (uentry_isDatatype (v))
+    {
+      return (message ("[%d] [%s] %s %q : %t [%t] %s %s // %q [s: %q; d: %q]",
+		       (int) v,
+		       ekind_unparse (v->ukind),
+		       v->uname,
+		       uentry_getName (v),
+		       v->utype,
+		       ctype_isDefined (v->info->datatype->type) 
+		          ? v->info->datatype->type : ctype_unknown,
+		       ynm_unparse (v->info->datatype->mut),
+		       ynm_unparse (v->info->datatype->abs),
+		       sRef_unparseState (v->sref),
+		       fileloc_unparse (v->whereSpecified),
+		       fileloc_unparse (v->whereDefined)));
+    }
+  else if (uentry_isFunction (v))
+    {
+      return (message ("[%w] = [%s] %q : %t / sref: %q / mods: %q / "
+		       "globs: %q / [s: %q; decl: %q; def: %q]",
+		       (long unsigned) v,
+		       ekind_unparse (v->ukind),
+		       uentry_getName (v),
+		       v->utype,
+		       sRef_unparseFull (v->sref),
+		       sRefSet_unparse (v->info->fcn->mods),
+		       globSet_unparse  (v->info->fcn->globs),
+		       fileloc_unparse (v->whereSpecified),
+		       fileloc_unparse (v->whereDeclared),
+		       fileloc_unparse (v->whereDefined)));
+    }
+  else if (uentry_isIter (v))
+    {
+      return (message ("[%s] %q: %t / %q [s: %q; d: %q]",
+		       ekind_unparse (v->ukind),
+		       uentry_getName (v),
+		       v->utype,
+		       sRef_unparseFull (v->sref),
+		       fileloc_unparse (v->whereSpecified),
+		       fileloc_unparse (v->whereDefined)));
+    }
+  else if (uentry_isVariable (v))
+    {
+      return 
+	(message ("[check: %s] / [%w] = [%s] %s : %t %q [s: %q; def: %q; dec: %q] "
+		  "kind <%d> isout <%d> used <%d>",
+		  checkedName (v->info->var->checked),
+		  (long unsigned) v,
+		  ekind_unparse (v->ukind),
+		  v->uname,
+		  v->utype,
+		  sRef_unparseDeep (v->sref),
+		  fileloc_unparse (v->whereSpecified),
+		  fileloc_unparse (v->whereDefined),
+		  fileloc_unparse (v->whereDeclared),
+		  (int) v->info->var->kind,
+		  (int) v->info->var->defstate,
+		  (int) v->used));
+    }
+  else
+    {
+      return (message ("[%s] %s : %t %q at [s: %q; d: %q]",
+		       ekind_unparse (v->ukind),
+		       v->uname,
+		       v->utype,
+		       sRef_unparseFull (v->sref),
+		       fileloc_unparse (v->whereSpecified),
+		       fileloc_unparse (v->whereDefined)));
+      
+    }
+}
+
+bool uentry_hasAccessType (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      switch (e->ukind)
+	{
+	case KITER:
+	  return (!typeIdSet_isEmpty (e->info->iter->access));
+	case KENDITER:
+	  return (!typeIdSet_isEmpty (e->info->enditer->access));
+	case KFCN:
+	  return (!typeIdSet_isEmpty (e->info->fcn->access));
+	case KENUMCONST:
+	case KCONST:
+	  return (!typeIdSet_isEmpty (e->info->uconst->access));
+	default:
+	  return FALSE;
+	}
+    }
+
+  return FALSE;
+}
+  
+typeIdSet uentry_accessType (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      switch (e->ukind)
+	{
+	case KITER:
+	  return (e->info->iter->access);
+	case KENDITER:
+	  return (e->info->enditer->access);
+	case KFCN:
+	  return (e->info->fcn->access);
+	case KENUMCONST:
+	case KCONST:
+	  return (e->info->uconst->access);
+	default:
+	  break;
+	}
+    }
+
+  return typeIdSet_undefined;
+}
+
+bool
+uentry_isVariable (uentry e)
+{
+  return (uentry_isVar (e));
+}
+
+bool
+uentry_isSpecified (uentry e)
+{
+  return (uentry_isValid (e) && !fileloc_isUndefined (e->whereSpecified));
+}
+
+static bool
+uentry_isReallySpecified (uentry e)
+{
+  return (uentry_isValid (e) 
+	  && fileloc_isRealSpec (e->whereSpecified));
+}
+
+bool
+uentry_isVar (uentry e)
+{
+  return (!uentry_isUndefined (e) && e->ukind == KVAR);
+}
+
+bool 
+uentry_isFakeTag (uentry e)
+{
+  return (uentry_isValid (e) && strchr (cstring_toCharsSafe (e->uname), '!') != 0);
+}
+
+bool
+uentry_isDatatype (uentry e)
+{
+  return (!uentry_isUndefined (e) &&
+	  (e->ukind == KDATATYPE || e->ukind == KSTRUCTTAG ||
+	   e->ukind == KUNIONTAG || e->ukind == KENUMTAG));
+}
+
+void
+uentry_setAbstract (uentry e)
+{
+  typeId oldid;
+
+  llassert (uentry_isDatatype (e) 
+	    && (ynm_isMaybe (e->info->datatype->abs)));
+
+  oldid = ctype_typeId (e->info->datatype->type);
+  e->info->datatype->abs = YES;
+  e->info->datatype->type = ctype_createAbstract (oldid);
+}
+
+void
+uentry_setConcrete (uentry e)
+{
+  llassert (uentry_isDatatype (e) 
+	    && (ynm_isMaybe (e->info->datatype->abs)));
+
+  e->info->datatype->abs = NO;
+}
+
+bool
+uentry_isAbstractDatatype (uentry e)
+{
+  return (uentry_isDatatype (e) 
+	  && (ynm_isOn (e->info->datatype->abs)));
+}
+
+bool
+uentry_isMaybeAbstract (uentry e)
+{
+  return (uentry_isDatatype (e) 
+	  && (ynm_isMaybe (e->info->datatype->abs)));
+}
+
+bool
+uentry_isMutableDatatype (uentry e)
+{
+  bool res = uentry_isDatatype (e) 
+    && (ynm_toBoolRelaxed (e->info->datatype->mut));
+  
+  return res;
+}
+
+bool
+uentry_isRefCountedDatatype (uentry e)
+{
+  return (uentry_isDatatype (e) && (sRef_isRefCounted (uentry_getSref (e))));
+}
+
+bool
+uentry_isParam (uentry u)
+{
+  return (uentry_isVariable (u) && (u->info->var->kind == VKPARAM
+				    || u->info->var->kind == VKYIELDPARAM));
+}
+
+bool
+uentry_isExpandedMacro (uentry u)
+{
+  return (uentry_isVariable (u) && (u->info->var->kind == VKEXPMACRO));
+}
+
+bool
+uentry_isSefParam (uentry u)
+{
+  return (uentry_isVariable (u) 
+	  && (u->info->var->kind == VKSEFPARAM
+	      || u->info->var->kind == VKREFSEFPARAM
+	      || u->info->var->kind == VKSEFRETPARAM
+	      || u->info->var->kind == VKREFSEFRETPARAM));
+}
+
+bool
+uentry_isRefParam (uentry u)
+{
+  return (uentry_isVariable (u) 
+	  && (u->info->var->kind == VKREFPARAM
+	      || u->info->var->kind == VKREFYIELDPARAM
+	      || u->info->var->kind == VKREFSEFPARAM
+	      || u->info->var->kind == VKREFSEFRETPARAM));
+}
+
+bool
+uentry_isAnyParam (uentry u)
+{
+  return (uentry_isVariable (u) 
+	  && ((u->info->var->kind == VKPARAM)
+	      || (u->info->var->kind == VKSEFPARAM)
+	      || (u->info->var->kind == VKYIELDPARAM)
+	      || (u->info->var->kind == VKRETPARAM)
+	      || (u->info->var->kind == VKSEFRETPARAM)));
+}
+
+sstate 
+uentry_getDefState (uentry u)
+{
+  if (uentry_isValid (u))
+    {
+      return (sRef_getDefState (u->sref));
+    }
+  else
+    {
+      return (SS_UNKNOWN);
+    }
+}
+
+bool
+uentry_isOut (uentry u)
+{
+  return ((uentry_isVariable (u) && (u->info->var->defstate == SS_ALLOCATED))
+	  || (uentry_isDatatype (u) && (sRef_isAllocated (u->sref))));
+}
+
+bool
+uentry_isPartial (uentry u)
+{
+  return ((uentry_isVariable (u) && (u->info->var->defstate == SS_PARTIAL))
+	  || (uentry_isDatatype (u) && (sRef_isAllocated (u->sref))));
+}
+
+bool
+uentry_isStateSpecial (uentry u)
+{
+  return ((uentry_isVariable (u) 
+	   && (u->info->var->defstate == SS_SPECIAL))
+	  || (uentry_isValid (u) && sRef_isStateSpecial (u->sref)));
+}
+
+exitkind uentry_getExitCode (uentry ue) 
+{
+  if (uentry_isFunction (ue))
+    {
+      return ue->info->fcn->exitCode;
+    }
+  else
+    {
+      return XK_UNKNOWN;
+    }
+}
+
+qual
+uentry_nullPred (uentry u)
+{
+  llassert (uentry_isRealFunction (u));
+
+  if (uentry_isFunction (u))
+    {
+      return (u->info->fcn->nullPred);
+    }
+  else
+    {
+      return QU_UNKNOWN;
+    }
+}
+
+bool
+uentry_possiblyNull (uentry u)
+{
+  return ((uentry_isVariable (u) && (nstate_possiblyNull (u->info->var->nullstate)))
+	  || (uentry_isDatatype (u) && (sRef_possiblyNull (u->sref))));
+}
+
+alkind 
+uentry_getAliasKind (uentry u)
+{
+  if (uentry_isValid (u))
+    {
+      return (sRef_getAliasKind (uentry_getSref (u)));
+    }
+  else
+    {
+      return AK_UNKNOWN;
+    }
+}
+
+exkind 
+uentry_getExpKind (uentry u)
+{
+  if (uentry_isValid (u))
+    {
+      return (sRef_getExKind (uentry_getSref (u)));
+    }
+  else
+    {
+      return XO_UNKNOWN;
+    }
+}
+
+bool
+uentry_isIter (uentry e)
+{
+  return (!uentry_isUndefined (e) && e->ukind == KITER);
+}
+
+bool
+uentry_isEndIter (uentry e)
+{
+  return (!uentry_isUndefined (e) && e->ukind == KENDITER);
+}
+
+bool
+uentry_isRealFunction (uentry e)
+{
+  return (uentry_isFunction (e) ||
+	  (uentry_isVariable (e) && ctype_isFunction (uentry_getType (e))));
+}
+
+bool
+uentry_hasName (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      cstring s = e->uname;
+      
+      return (!(cstring_isEmpty (s) || cstring_equalLit (s, "...")));
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+bool uentry_hasRealName (uentry e)
+{
+  return (uentry_isValid (e) && cstring_isNonEmpty (e->uname));
+}
+
+
+/*@observer@*/ globSet
+uentry_getGlobs (uentry l)
+{
+  if (uentry_isInvalid (l)) 
+    {
+      return globSet_undefined;
+    }
+
+  if (l->ukind != KFCN)
+    {
+      if (l->ukind != KITER && l->ukind != KENDITER)
+	{
+	  if (l->ukind == KVAR)
+	    {
+	      llbug (message ("Bad call to uentry_getGlobs (var): %q (%s)", 
+			      uentry_unparse (l), 
+			      ekind_unparse (l->ukind)));
+	    }
+	  else
+	    {
+	      llbug (message ("Bad call to uentry_getGlobs: %q (%s)", 
+			      uentry_unparse (l), 
+			      ekind_unparse (l->ukind)));
+	    }
+	}
+      return globSet_undefined;
+    }
+
+  return l->info->fcn->globs;
+}
+
+/*@observer@*/ sRefSet
+uentry_getMods (uentry l)
+{
+  llassert (uentry_isValid (l));
+
+  if (l->ukind != KFCN && l->ukind != KITER && l->ukind != KENDITER)
+    {
+      llcontbug (message ("Bad call to uentry_getMods: %q", uentry_unparse (l)));
+      return sRefSet_undefined; 
+    }
+
+  return l->info->fcn->mods;
+}
+
+ekind
+uentry_getKind (uentry e)
+{
+  llassert (uentry_isValid (e));
+
+  return (e->ukind);
+}
+
+/*@observer@*/ multiVal uentry_getConstantValue (uentry e)
+{
+  llassert (uentry_isEitherConstant (e));
+
+  return (e->info->uconst->val);
+}
+
+/*@observer@*/ uentryList
+uentry_getParams (uentry l)
+{
+  if (uentry_isInvalid (l)) return uentryList_undefined;
+
+  switch (l->ukind)
+    {
+    case KFCN:  
+    case KITER:
+      {
+	ctype ct = l->utype;
+
+	if (ctype_isFunction (ct))
+	  {
+	    return (ctype_argsFunction (ct));
+	  }
+	else
+	  {
+	    return uentryList_undefined;
+	  }
+      }
+    case KVAR:  
+      {
+	ctype ct = l->utype;
+
+	llassert (ctype_isFunction (ct));
+	return (ctype_argsFunction (ct));
+      }
+    BADDEFAULT;
+    }
+  BADEXIT;
+}
+
+/*@observer@*/ cstring
+uentry_rawName (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      return (e->uname);
+    }
+  else
+    {
+      return cstring_undefined;
+    }
+}
+
+static cstring
+uentry_getOptName (uentry e)
+{
+  cstring s = uentry_getName (e);
+
+  if (cstring_isDefined (s))
+    {
+      s = cstring_appendChar (s, ' ');
+    }
+  
+  return s;
+}
+
+/*@only@*/ cstring
+uentry_getName (uentry e)
+{
+  cstring ret = cstring_undefined;
+
+  if (uentry_isValid (e))
+    {
+      
+      if (uentry_isAnyTag (e))
+	{
+	  ret = fixTagName (e->uname); 
+	}
+      else if (uentry_isAnyParam (e))
+	{
+	  ret = cstring_copy (fixParamName (e->uname));
+	}
+      else
+	{
+	  ret = cstring_copy (e->uname);
+	}
+    }
+
+  return ret;
+}
+
+cstring uentry_getRealName (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      if (uentry_isAnyTag (e))
+	{
+	  return (cstring_undefined);
+	}
+      else
+	{
+	  return (e->uname);
+	}
+    }
+  return cstring_undefined;
+}
+
+ctype uentry_getType (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      return e->utype;
+    }
+  else
+    {
+      return ctype_unknown;
+    }
+}
+
+fileloc uentry_whereLast (uentry e)
+{
+  fileloc loc;
+
+  if (uentry_isInvalid (e)) 
+    {
+      return fileloc_undefined;
+    }
+  
+  loc = e->whereDefined;
+
+  if (fileloc_isValid (loc) && !fileloc_isExternal (loc))
+    {
+      return loc;
+    }
+
+  loc = uentry_whereDeclared (e);
+
+  if (fileloc_isValid (loc) && !fileloc_isExternal (loc))
+    {
+      return loc;
+    }
+
+  loc = uentry_whereSpecified (e);
+  return loc;
+}
+
+fileloc uentry_whereEither (uentry e)
+{
+  if (uentry_isInvalid (e)) return fileloc_undefined;
+
+  if (fileloc_isDefined (e->whereDefined) 
+      && !fileloc_isExternal (e->whereDefined))
+    {
+      return e->whereDefined;
+    }
+  else if (fileloc_isDefined (e->whereDeclared))
+    {
+      return e->whereDeclared;
+    }
+  else
+    {
+      return e->whereSpecified;
+    }
+}
+
+fileloc uentry_whereSpecified (uentry e)
+{
+  if (uentry_isInvalid (e)) return fileloc_undefined;
+
+  return (e->whereSpecified);
+}
+
+fileloc uentry_whereDefined (uentry e)
+{
+  if (uentry_isInvalid (e)) return fileloc_undefined;
+
+  return (e->whereDefined);
+}
+
+fileloc uentry_whereDeclared (uentry e)
+{
+  if (uentry_isInvalid (e)) return fileloc_undefined;
+
+  return (e->whereDeclared);
+}
+
+/*@observer@*/ fileloc
+uentry_whereEarliest (uentry e)
+{
+  if (uentry_isInvalid (e)) return fileloc_undefined;
+  
+  if (fileloc_isDefined (e->whereSpecified))
+    {
+      return (e->whereSpecified);
+    }
+  else if (fileloc_isDefined (e->whereDeclared))
+    {
+      return (e->whereDeclared);
+    }
+  else
+    {
+      return e->whereDefined;
+    }
+}
+
+void
+uentry_setFunctionDefined (uentry e, fileloc loc)
+{
+  if (uentry_isValid (e))
+    {
+      llassert (uentry_isFunction (e));
+
+      if (fileloc_isUndefined (e->whereDeclared))
+	{
+	  e->whereDeclared = fileloc_update (e->whereDeclared, loc);
+	}
+      
+      if (!fileloc_isDefined (e->whereDefined))
+	{
+	  e->whereDefined = fileloc_update (e->whereDefined, loc);
+	}
+    }
+}
+
+void
+uentry_setDeclDef (uentry e, fileloc f)
+{
+  uentry_setDeclared (e, f);
+  
+  if (!uentry_isFunction (e)
+      && !(uentry_isVariable (e) && uentry_isExtern (e)))
+    {
+      uentry_setDefined (e, f);
+    }
+}
+
+void
+uentry_setDeclaredForce (uentry e, fileloc f)
+{
+  llassert (uentry_isValid (e));
+  e->whereDeclared = fileloc_update (e->whereDeclared, f);
+}
+
+void
+uentry_setDeclaredForceOnly (uentry e, fileloc f)
+{
+  llassert (uentry_isValid (e));
+  fileloc_free (e->whereDeclared);
+  e->whereDeclared = f;
+}
+
+void
+uentry_setDeclaredOnly (uentry e, /*@only@*/ fileloc f)
+{
+  fileloc oldloc;
+
+  llassert (uentry_isValid (e));
+  oldloc = e->whereDeclared;  
+
+  if (fileloc_isDefined (oldloc))
+    {
+      if (fileloc_isLib (oldloc) || fileloc_isImport (oldloc))
+	{
+	  e->whereDeclared = f;
+	  fileloc_free (oldloc);
+	}
+      else
+	{
+	  fileloc_free (f);
+	}
+    }
+  else
+    {
+      e->whereDeclared = f;
+      fileloc_free (oldloc);
+    }
+}
+  
+void
+uentry_setDeclared (uentry e, fileloc f)
+{
+  fileloc oldloc;
+
+  llassert (uentry_isValid (e));
+  oldloc = e->whereDeclared;  
+
+  if (fileloc_isDefined (oldloc))
+    {
+      if (fileloc_isLib (oldloc) || fileloc_isImport (oldloc))
+	{
+	  e->whereDeclared = fileloc_update (e->whereDeclared, f);
+	}
+      else
+	{
+	  ;
+	}
+    }
+  else
+    {
+      e->whereDeclared = fileloc_update (e->whereDeclared, f);
+    }
+}
+
+void
+uentry_clearDefined (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      e->whereDefined = fileloc_update (e->whereDefined, fileloc_undefined);
+    }
+}
+
+void
+uentry_setDefined (uentry e, fileloc f)
+{
+  fileloc oldloc;
+
+  llassert (uentry_isValid (e));
+  oldloc = e->whereDefined;
+
+  if (fileloc_isDefined (oldloc))
+    {
+      if (fileloc_isLib (oldloc) 
+	  || fileloc_isImport (oldloc)
+	  || fileloc_isBuiltin (oldloc) 
+	  || fileloc_isPreproc (oldloc))
+	{
+	  e->whereDefined = fileloc_update (e->whereDefined, f);
+	}
+      else
+	{
+	  if (fileloc_equal (oldloc, f) || context_processingMacros ())
+	    {
+	      ; /* okay */
+	    }
+	  else
+	    {
+	      if (optgenerror (FLG_REDEF,
+			       message ("%s %q redefined", 
+					ekind_capName (e->ukind),
+					uentry_getName (e)),
+			       f))
+		{
+		  llgenindentmsg (message ("Previous definition of %q", 
+					   uentry_getName (e)),
+				  e->whereDefined);
+		}
+	    }
+	}
+    }
+  else
+    {
+      e->whereDefined = fileloc_update (e->whereDefined, f);
+    }
+}
+
+bool
+uentry_isCodeDefined (uentry e)
+{
+  return (uentry_isValid (e) && fileloc_isDefined (e->whereDefined));
+}
+
+bool
+uentry_isDeclared (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      return (fileloc_isDefined (e->whereDeclared));
+    }
+
+  return FALSE;
+}
+
+sRef uentry_getSref (uentry e)
+{
+  /* not true, used for functions too (but shouldn't be? */
+  /* llassertprint (e->ukind == KVAR, ("uentry_getSref: not variable!")); */
+
+  if (uentry_isInvalid (e)) return sRef_undefined;
+  
+  return (e->sref);
+}
+
+sRef uentry_getOrigSref (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      sRef sr = sRef_copy (uentry_getSref (e));
+      
+      sRef_resetState (sr);
+      sRef_clearDerived (sr);
+      
+      if (uentry_isVariable (e))
+	{
+	  sRef_setDefState (sr, e->info->var->defstate, fileloc_undefined);
+	  sRef_setNullState (sr, e->info->var->nullstate, fileloc_undefined);
+	}
+      
+      return (sr);
+    }
+  else
+    {
+      return sRef_undefined;
+    }
+}
+
+/*
+** requires: uentry e is not in a hashed symbol table
+*/
+
+void 
+uentry_setName (uentry e, /*@only@*/ cstring n)
+{
+  llassert (uentry_isValid (e));
+
+  cstring_free (e->uname);
+  e->uname = n;
+}
+
+void
+uentry_setType (uentry e, ctype t)
+{
+  if (uentry_isValid (e)) 
+    {
+      e->utype = t;
+      sRef_setType (e->sref, t);
+    }
+}
+
+void
+uentry_resetParams (uentry ue, /*@only@*/ uentryList pn)
+{
+  ctype rct;
+  ctype rettype = ctype_unknown;
+  
+  llassert (uentry_isValid (ue));
+
+  rct = ctype_realType (ue->utype);
+
+  if (uentry_isVariable (ue) && (ctype_isFunction (rct) || ctype_isUnknown (rct)))
+    {
+      uentry_makeVarFunction (ue);
+    }
+
+  llassert (uentry_isFunction (ue));
+
+  if (ctype_isFunction (rct))
+    {
+      rettype = ctype_returnValue (rct);
+    }
+
+  ue->utype = ctype_makeNFParamsFunction (rettype, pn);      
+}
+
+void
+uentry_setRefParam (uentry e)
+{
+  
+  if (!uentry_isVar (e))
+    {
+      llbug (message ("uentry_setParam: not variable: %q", uentry_unparse (e)));
+    }
+  else
+    {
+      if (e->info->var->kind == VKSEFPARAM)
+	{
+	  e->info->var->kind = VKREFSEFPARAM;
+	}
+      else if (e->info->var->kind == VKSEFRETPARAM)
+	{
+	  e->info->var->kind = VKREFSEFRETPARAM;
+	}
+      else if (e->info->var->kind == VKYIELDPARAM)
+	{
+	  e->info->var->kind = VKREFYIELDPARAM;
+	}
+      else
+	{
+	  e->info->var->kind = VKREFPARAM;
+	}
+    }
+}
+
+void
+uentry_setParam (uentry e)
+{
+  if (!uentry_isVar (e))
+    {
+      if (uentry_isElipsisMarker (e))
+	{
+
+	}
+      else
+	{
+	  llbug (message ("uentry_setParam: not variable: %q", uentry_unparse (e)));
+	}
+    }
+  else
+    {
+      cstring oldname;
+
+      if (e->info->var->kind == VKYIELDPARAM 
+	  || e->info->var->kind == VKSEFPARAM
+	  || e->info->var->kind == VKSEFRETPARAM)
+	{
+	  ;
+	}
+      else
+	{
+	  e->info->var->kind = VKPARAM;
+	}
+
+      oldname = e->uname;
+      e->uname = makeParam (e->uname);
+      cstring_free (oldname);
+    }
+}
+
+void
+uentry_setSref (uentry e, sRef s)
+{
+  if (uentry_isValid (e))
+    {
+      if (sRef_isValid (e->sref))
+	{
+	  sRef_mergeStateQuietReverse (e->sref, s);
+	}
+      else
+	{
+	  e->sref = sRef_saveCopy (s);
+	}
+    }
+}
+
+ctype
+uentry_getAbstractType (uentry e)
+{
+  llassert (uentry_isDatatype (e));
+
+  /*
+  ** This assertion removed.
+  ** Okay to have undefined type, for system types
+  
+  llassertprintret (!ctype_isUndefined (e->info->datatype->type),
+		    ("uentry_getAbstractType %q: undefined", uentry_unparseFull (e)),
+		    e->utype);
+		    
+  */
+
+  if (ctype_isUndefined (e->info->datatype->type))
+    {
+      return ctype_unknown;
+    }
+
+  return e->info->datatype->type;
+}
+
+ctype uentry_getRealType (uentry e)
+{
+  ctype   ct;
+  typeId uid = USYMIDINVALID;
+
+  if (uentry_isInvalid (e))
+    {
+      return ctype_unknown;
+    }
+
+  llassertprint (uentry_isDatatype (e), ("not datatype: %s", uentry_unparse (e)));
+
+  if (uentry_isAnyTag (e))
+    {
+      return (e->utype);
+    }
+  
+  if (uentry_isAbstractType (e))
+    {
+      ct = uentry_getAbstractType (e);      
+      llassert (ctype_isUA (ct));
+      
+      uid = ctype_typeId (ct);
+      
+      if (!context_hasAccess (uid))
+	{
+	  return (ct);
+	}
+    }
+
+  ct = uentry_getType (e);
+
+  if (ctype_isUserBool (ct)) return ct;
+  
+  if (ctype_isUA (ct))
+    {
+      usymId iid = ctype_typeId (ct);
+      
+      if /*@access usymId@*/ (iid == uid) /*@noaccess usymId@*/
+	{	  
+	  llcontbug (message ("uentry_getRealType: recursive type! %s",
+			      ctype_unparse (ct)));
+	  return ct;
+	}
+      else
+	{
+	  return uentry_getRealType (usymtab_getTypeEntry (iid));
+	}
+    }
+  else
+    {
+      return ct;
+    }
+}
+
+ctype uentry_getForceRealType (uentry e)
+{
+  ctype   ct;
+  typeId uid = USYMIDINVALID;
+
+  if (uentry_isInvalid (e))
+    {
+      return ctype_unknown;
+    }
+
+  llassertprint (uentry_isDatatype (e), ("not datatype: %s", uentry_unparse (e)));
+  
+  if (uentry_isAnyTag (e))
+    {
+      return (e->utype);
+    }
+  
+  if (uentry_isAbstractType (e))
+    {
+      ct = uentry_getAbstractType (e);      
+      llassert (ctype_isUA (ct));
+      
+      uid = ctype_typeId (ct);
+      /* no check for access! */
+    }
+  
+  ct = uentry_getType (e);
+  
+  if (ctype_isUserBool (ct)) return ct;
+  
+  if (ctype_isUA (ct))
+    {
+      usymId iid = ctype_typeId (ct);
+      
+      if /*@access usymId@*/ (iid == uid) /*@noaccess usymId@*/
+	{	  
+	  llcontbug (message ("uentry_getRealType: recursive type! %s",
+			      ctype_unparse (ct)));
+	  return ct;
+	}
+      else
+	{
+	  return uentry_getForceRealType (usymtab_getTypeEntry (iid));
+	}
+    }
+  else
+    {
+      return ct;
+    }
+}
+
+uentry uentry_nameCopy (cstring name, uentry e)
+{
+  uentry enew = uentry_alloc ();
+
+  llassert (uentry_isValid (e));
+
+  /* enew->shallowCopy = FALSE; */
+  enew->ukind = e->ukind;
+  enew->uname = name;
+  enew->utype = e->utype;
+  enew->whereSpecified = fileloc_copy (e->whereSpecified);
+  enew->whereDefined = fileloc_copy (e->whereDefined);
+  enew->whereDeclared = fileloc_copy (e->whereDeclared);
+  enew->sref = sRef_copy (e->sref); 
+  enew->used = e->used;
+  enew->lset = FALSE;
+  enew->isPrivate = e->isPrivate;
+  enew->hasNameError = FALSE;
+
+  enew->uses = filelocList_new ();
+
+  enew->storageclass = e->storageclass;
+  enew->info = uinfo_copy (e->info, e->ukind);
+
+  return enew;
+}
+
+void
+uentry_setDatatype (uentry e, usymId uid)
+{
+  llassert (uentry_isDatatype (e));
+
+  if (uentry_isAbstractType (e))
+    {
+      e->info->datatype->type = ctype_createAbstract (uid);
+    }
+  else
+    {
+      e->info->datatype->type = ctype_createUser (uid);
+    }
+}
+
+static void 
+uentry_setSpecDef (/*@special@*/ uentry e, /*@keep@*/ fileloc f)
+   /*@defines e->whereSpecified, e->whereDeclared, e->whereDefined@*/
+   /*@modifies e@*/
+{
+  llassert (uentry_isValid (e));
+
+  if (fileloc_isSpec (f) || fileloc_isImport (f))
+    {
+      e->whereSpecified = f;
+      e->whereDeclared  = fileloc_undefined;
+      e->whereDefined  = fileloc_undefined;
+    }
+  else
+    {
+      e->whereSpecified = fileloc_undefined;
+      e->whereDeclared  = f;
+      e->whereDefined  = fileloc_undefined;
+    }
+}
+
+static void
+ucinfo_free (/*@only@*/ ucinfo u)
+{
+  multiVal_free (u->val);
+  sfree (u);
+}
+
+static void
+uvinfo_free (/*@only@*/ uvinfo u)
+{
+  sfree (u);
+}
+
+static void
+udinfo_free (/*@only@*/ udinfo u)
+{
+  sfree (u);
+}
+
+static void
+ufinfo_free (/*@only@*/ ufinfo u)
+{
+  globSet_free (u->globs);
+  sRefSet_free (u->mods);
+  specialClauses_free (u->specclauses);
+
+  sfree (u);
+}
+
+static void
+uiinfo_free (/*@only@*/ uiinfo u)
+{
+  sfree (u);
+}
+
+static void
+ueinfo_free (/*@only@*/ ueinfo u)
+{
+  sfree (u);
+}
+
+static /*@only@*/ ucinfo
+ucinfo_copy (ucinfo u)
+{
+  ucinfo ret = (ucinfo) dmalloc (sizeof (*ret));
+  
+  ret->val = multiVal_copy (u->val);
+  ret->access = u->access;
+
+  return ret;
+}
+
+static /*@only@*/ uvinfo
+uvinfo_copy (uvinfo u)
+{
+  uvinfo ret = (uvinfo) dmalloc (sizeof (*ret));
+  
+  ret->kind = u->kind;
+  ret->nullstate = u->nullstate;
+  ret->defstate = u->defstate;
+  ret->checked = u->checked;
+
+  return ret;
+}
+
+static /*@only@*/ udinfo
+udinfo_copy (udinfo u)
+{
+  udinfo ret = (udinfo) dmalloc (sizeof (*ret));
+
+  ret->abs = u->abs;
+  ret->mut = u->mut;
+  ret->type = u->type;
+
+  return ret;
+}
+
+static /*@only@*/ ufinfo
+ufinfo_copy (ufinfo u)
+{
+  ufinfo ret = (ufinfo) dmalloc (sizeof (*ret));
+
+  ret->hasGlobs = u->hasGlobs;
+  ret->hasMods = u->hasMods;
+  ret->exitCode = u->exitCode;
+  ret->specialCode = u->specialCode;
+  ret->nullPred = u->nullPred;
+  ret->access = u->access;
+  ret->globs = globSet_newCopy (u->globs);
+  ret->mods = sRefSet_newCopy (u->mods);
+  ret->defparams = u->defparams;
+  ret->specclauses = specialClauses_copy (u->specclauses);
+
+  return ret;
+}
+
+static /*@only@*/ uiinfo
+uiinfo_copy (uiinfo u)
+{
+  uiinfo ret = (uiinfo) dmalloc (sizeof (*ret));
+
+  ret->access = u->access;
+  ret->globs = globSet_newCopy (u->globs);
+  ret->mods = sRefSet_newCopy (u->mods);
+
+  return (ret);
+}
+
+static /*@only@*/ ueinfo
+ueinfo_copy (ueinfo u)
+{
+  ueinfo ret = (ueinfo) dmalloc (sizeof (*ret));
+
+  ret->access = u->access;
+  return ret;
+}
+
+static void
+uinfo_free (uinfo u, ekind kind)
+{
+  switch (kind)
+    {
+    case KENUMCONST:
+    case KCONST:       ucinfo_free (u->uconst); break;
+    case KVAR:         uvinfo_free (u->var); break;
+    case KSTRUCTTAG:
+    case KUNIONTAG:
+    case KENUMTAG:
+    case KDATATYPE:    udinfo_free (u->datatype); break;
+    case KFCN:         ufinfo_free (u->fcn); break;
+    case KITER:        uiinfo_free (u->iter); break;
+    case KENDITER:     ueinfo_free (u->enditer); break;
+    case KELIPSMARKER: break;
+    case KINVALID:     break;
+    }
+  
+    sfree (u);
+}
+
+static /*@only@*/ /*@null@*/ uinfo
+uinfo_copy (uinfo u, ekind kind)
+{
+  if (kind == KELIPSMARKER || kind == KINVALID)
+    {
+      return NULL;
+    }
+  else
+    {
+      uinfo ret = (uinfo) dmalloc (sizeof (*ret));
+      
+      switch (kind)
+	{
+	case KENUMCONST:
+	case KCONST:    ret->uconst = ucinfo_copy (u->uconst); break;
+	case KVAR:      ret->var = uvinfo_copy (u->var); break;
+	case KSTRUCTTAG:
+	case KUNIONTAG:
+	case KENUMTAG:
+	case KDATATYPE: ret->datatype = udinfo_copy (u->datatype); break;
+	case KFCN:      ret->fcn = ufinfo_copy (u->fcn); break;
+	case KITER:     ret->iter = uiinfo_copy (u->iter); break;
+	case KENDITER:  ret->enditer = ueinfo_copy (u->enditer); break;
+	BADDEFAULT;
+	}
+      return ret;
+    }
+}
+
+static void
+uentry_reallyFree (/*@notnull@*/ /*@only@*/ uentry e)
+{
+  filelocList_free (e->uses);
+  cstring_free (e->uname);
+  
+  uinfo_free (e->info, e->ukind);
+  
+  fileloc_free (e->whereSpecified); 
+  fileloc_free (e->whereDefined); 
+  fileloc_free (e->whereDeclared); 
+
+  nuentries--;
+  sfree (e);
+  }
+
+extern void uentry_markOwned (/*@owned@*/ uentry u)
+{
+  sfreeEventually (u);
+}
+
+void
+uentry_free (/*@only@*/ uentry e)
+{
+  if (uentry_isValid (e) && !uentry_isElipsisMarker (e))
+    {
+      uentry_reallyFree (e);
+    }
+}
+
+/*
+** For uentry's in the global or file scope
+*/
+
+void
+uentry_freeComplete (/*@only@*/ uentry e)
+{
+  if (uentry_isValid (e) && !uentry_isElipsisMarker (e))
+    {
+      /*@i@*/ sRef_free (e->sref);
+      e->sref = sRef_undefined;
+      uentry_reallyFree (e);
+    }
+}
+
+/*
+** requires old->kind != new->kind, old->uname = new->uname
+*/
+
+static void
+KindConformanceError (/*@unique@*/ uentry old, uentry unew, bool mustConform)
+{
+  llassert (uentry_isValid (old));
+  llassert (uentry_isValid (unew));
+
+  if (uentry_isEitherConstant (unew)
+      && (fileloc_isPreproc (uentry_whereDeclared (old))
+	  || ctype_isUnknown (old->utype))
+      && !uentry_isSpecified (old))
+    {
+      ; /* no error */
+    }
+  else 
+    {
+      if (mustConform)
+	{
+	  if (!uentry_isDeclared (old))
+	    {
+	      if (uentry_isSpecified (old))
+		{
+		  if (uentry_isSpecified (unew))
+		    {
+		      llbuglit ("Respecification!");
+		    }
+		  else if (uentry_isDeclared (unew))
+		    {
+		      if (optgenerror
+			  (FLG_INCONDEFS,
+			   message ("%s %q inconsistently declared as %s: %t",
+				    ekind_capName (old->ukind),
+				    uentry_getName (unew),
+				    ekind_unparseLong (unew->ukind),
+				    unew->utype),
+			   uentry_whereDeclared (unew)))
+			{
+			  uentry_showWhereLast (old);
+			}
+		    }
+		  else
+		    {
+		      BADEXIT;
+		    }
+		}
+	      else
+		{
+		  if (optgenerror
+		      (FLG_INCONDEFS,
+		       message ("%s %q inconsistently declared as %s: %t",
+				ekind_capName (old->ukind),
+				uentry_getName (unew),
+				ekind_unparseLong (unew->ukind),
+				unew->utype),
+		       uentry_whereDeclared (unew)))
+		    {
+		      uentry_showWhereLast (old);
+		    }
+		}
+	    }
+	  else
+	    {
+	      llassert (uentry_isDeclared (unew));
+
+	      if (optgenerror
+		  (FLG_INCONDEFS,
+		   message ("%s %q inconsistently redeclared as %s",
+			    ekind_capName (old->ukind),
+			    uentry_getName (unew),
+			    ekind_unparseLong (unew->ukind)),
+		   uentry_whereDeclared (unew)))
+		{
+		  uentry_showWhereLast (old);
+		}
+	    }
+	}
+    }
+
+  uentry_copyInto (old, unew);
+}
+
+/*
+** def is the definition of spec, modifies spec
+**
+** reports any inconsistencies
+** returns the summary of all available information
+** if spec and def are inconsistent, def is returned
+*/
+
+void
+uentry_showWhereLast (uentry spec)
+{
+  if (uentry_isValid (spec))
+    {
+      if (fileloc_isDefined (spec->whereDefined)
+	  && !fileloc_isLib (spec->whereDefined)
+	  && !fileloc_isPreproc (spec->whereDefined))
+	{
+	  llgenindentmsg (message ("Previous definition of %q: %t", 
+				   uentry_getName (spec),
+				   uentry_getType (spec)),
+			  uentry_whereDefined (spec));
+	}
+      else if (uentry_isDeclared (spec))
+	{
+	  llgenindentmsg (message ("Previous declaration of %q: %t", 
+				   uentry_getName (spec),
+				   uentry_getType (spec)),
+			  uentry_whereDeclared (spec));
+	}
+      else if (uentry_isSpecified (spec))
+	{
+	  if (uentry_hasName (spec))
+	    {
+	      llgenindentmsg (message ("Specification of %q: %t", 
+				       uentry_getName (spec),
+				       uentry_getType (spec)),
+			      uentry_whereSpecified (spec));
+	    }
+	  else
+	    {
+	      llgenindentmsg (message ("Specification: %t", uentry_getType (spec)),
+			      uentry_whereSpecified (spec));
+	    }
+	}
+      else
+	{
+	  /* nothing to show */
+	}
+    }
+}
+
+void
+uentry_showDefSpecInfo (uentry ce, fileloc fwhere)
+{
+  fileloc loc = uentry_whereDefined (ce);
+  
+  if (fileloc_isUser (loc) && !fileloc_equal (loc, fwhere))
+    {
+      llgenindentmsg (message ("Definition of %q", uentry_getName (ce)),
+		      loc);
+    }
+
+  loc = uentry_whereSpecified (ce);
+  
+  if (fileloc_isUser (loc) && !fileloc_equal (loc, fwhere))
+    {
+      llgenindentmsg (message ("Specification of %q", uentry_getName (ce)),
+		      loc);
+    }
+}
+
+void uentry_showWhereLastExtra (uentry spec, cstring extra)
+{
+  if (uentry_isDeclared (spec))
+    {
+      llgenindentmsg (message ("Previous declaration of %q: %q", 
+			       uentry_getName (spec), extra),
+		      uentry_whereDeclared (spec));
+    }
+  else if (uentry_isSpecified (spec))
+    {
+      llgenindentmsg (message ("Specification of %q: %q", 
+			       uentry_getName (spec), extra),
+		      uentry_whereSpecified (spec));
+    }
+  else
+    {
+      cstring_free (extra);
+    }
+}
+
+void
+uentry_showWhereDeclared (uentry spec)
+{
+  if (uentry_isDeclared (spec))
+    {
+      if (uentry_hasName (spec))
+	{
+	  llgenindentmsg (message ("Declaration of %q", uentry_getName (spec)),
+			  uentry_whereDeclared (spec));
+	}
+      else
+	{
+	  llgenindentmsg (cstring_makeLiteral ("Declaration"), uentry_whereDeclared (spec));
+	}
+    }
+  else if (uentry_isSpecified (spec))
+    {
+      if (uentry_hasName (spec))
+	{
+	  llgenindentmsg (message ("Specification of %q", uentry_getName (spec)),
+			  uentry_whereSpecified (spec));
+	}
+      else
+	{
+	  llgenindentmsg (cstring_makeLiteral ("Specification"), uentry_whereSpecified (spec));
+	}
+    }
+  else
+    {
+      /* nothing to show */
+    }
+    
+}
+
+void
+uentry_showWhereAny (uentry spec)
+{
+  if (uentry_isDeclared (spec))
+    {
+      if (uentry_hasName (spec))
+	{
+	  llgenindentmsg (message ("Declaration of %q", uentry_getName (spec)),
+			  uentry_whereDeclared (spec));
+	}
+      else
+	{
+	  llgenindentmsg (cstring_makeLiteral ("Declaration"), uentry_whereDeclared (spec));
+	}
+    }
+  else if (uentry_isSpecified (spec))
+    {
+      if (uentry_hasName (spec))
+	{
+	  llgenindentmsg (message ("Specification of %q",
+				   uentry_getName (spec)),
+			  uentry_whereSpecified (spec));
+	}
+      else
+	{
+	  llgenindentmsg (cstring_makeLiteral ("Specification"), 
+			  uentry_whereSpecified (spec));
+	}
+    }
+  else if (fileloc_isDefined (uentry_whereDefined (spec))) 
+    {
+      if (uentry_hasName (spec))
+	{
+	  llgenindentmsg (message ("Definition of %q", uentry_getName (spec)),
+			  uentry_whereDefined (spec));
+	}
+      else
+	{
+	  llgenindentmsg (cstring_makeLiteral ("Definition"), uentry_whereDefined (spec));
+	}
+    }
+  else
+    {
+      /* nothing to show */
+    }
+}
+
+void
+uentry_showWhereDefined (uentry spec)
+{
+  if (uentry_isCodeDefined (spec))
+    {
+      llgenindentmsg (message ("Previous definition of %q", uentry_getName (spec)),
+		      uentry_whereDefined (spec));
+    }
+}
+
+void
+uentry_showWhereLastPlain (uentry spec)
+{
+  if (uentry_isDeclared (spec))
+    {
+      llgenindentmsg (message ("Previous declaration of %q", uentry_getName (spec)),
+		      uentry_whereDeclared (spec));
+    }
+  else if (uentry_isSpecified (spec))
+    {
+      llgenindentmsg (message ("Specification of %q", uentry_getName (spec)),
+		      uentry_whereSpecified (spec));
+    }
+  else
+    {
+          }
+}
+
+static void
+uentry_showWhereLastVal (uentry spec, cstring val)
+{
+  if (uentry_isDeclared (spec))
+    {
+      llgenindentmsg (message ("Previous declaration of %q: %s", 
+			       uentry_getName (spec), val),
+		      uentry_whereDeclared (spec));
+    }
+  else if (uentry_isSpecified (spec))
+    {
+      llgenindentmsg (message ("Specification of %q: %s", 
+			       uentry_getName (spec), val),
+		      uentry_whereSpecified (spec));
+    }
+  else
+    {
+    }
+}
+
+void
+uentry_showWhereSpecified (uentry spec)
+{
+  if (uentry_isSpecified (spec))
+    {
+      if (uentry_hasName (spec))
+	{
+	  llgenindentmsg (message ("Specification of %q", uentry_getName (spec)),
+			  uentry_whereSpecified (spec));
+	}
+      else
+	{
+	  llgenindentmsg (cstring_makeLiteral ("Specification"), 
+			  uentry_whereSpecified (spec));
+	}
+    }
+  else if (uentry_isDeclared (spec))
+    {
+      llgenindentmsg (message ("Declaration of %q", uentry_getName (spec)),
+		      uentry_whereDeclared (spec));
+    }
+  else
+    {
+      /* nothing to show */
+    }
+}
+
+void
+uentry_showWhereSpecifiedExtra (uentry spec, cstring s)
+{
+  if (uentry_isSpecified (spec))
+    {
+      if (uentry_hasName (spec))
+	{
+	  llgenindentmsg (message ("Specification of %q: %q", 
+				   uentry_getName (spec), s),
+			  uentry_whereSpecified (spec));
+	}
+      else
+	{
+	  llgenindentmsg (message ("Specification: %q", s), 
+			  uentry_whereSpecified (spec));
+	}
+    }
+  else if (uentry_isDeclared (spec))
+    {
+      llgenindentmsg (message ("Declaration of %q: %q", 
+			       uentry_getName (spec), s),
+		      uentry_whereDeclared (spec));
+    }
+  else
+    {
+      llgenindentmsg (message ("Previous: %q", s),
+		      uentry_whereLast (spec));
+    }
+}
+
+/*
+**
+*/
+
+static void
+checkStructConformance (uentry old, uentry unew)
+{
+  ctype oldr, newr; 
+  uentryList fold, fnew;
+
+  /*
+  ** requires: types of old and new are structs or unions
+  */
+
+  llassert (uentry_isValid (old));
+  llassert (uentry_isValid (unew));
+
+  oldr = ctype_realType (old->utype);
+  fold =  ctype_getFields (oldr);
+
+  newr = ctype_realType (unew->utype);
+  fnew = ctype_getFields (newr);
+
+  if (!uentryList_matchFields (fold, fnew))
+    {
+      if (fileloc_equal (uentry_whereLast (old),
+			 uentry_whereLast (unew)))
+	{
+	  ; /* cheat! */
+	}
+      else 
+	{
+	  if (optgenerror 
+	      (FLG_MATCHFIELDS,
+	       message ("%q %q %rdeclared with fields { %q }, %s "
+			"with fields { %q }",
+			cstring_makeLiteral (ctype_isStruct (newr) ? "Structure": "Union"),
+			uentry_getName (old), 
+			uentry_isDeclared (old),
+			uentryList_unparseAbbrev (fnew),
+			uentry_specOrDefName (old),
+			uentryList_unparseAbbrev (fold)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereLastPlain (old);
+	      uentryList_showFieldDifference (fold, fnew);
+	    }
+	}
+
+      old->utype = unew->utype;
+    }
+}
+
+static void
+checkEnumConformance (/*@notnull@*/ uentry old, /*@notnull@*/ uentry unew)
+{
+  /*
+  ** requires old and new are enums
+  */
+  
+  ctype        rold = ctype_realType (old->utype);
+  ctype        rnew = ctype_realType (unew->utype);
+  enumNameList eold = ctype_elist (rold);
+  enumNameList enew = ctype_elist (rnew);
+  
+  if (!enumNameList_match (eold, enew))
+    {
+      if (optgenerror 
+	  (FLG_MATCHFIELDS,
+	   message ("Enum %q declared with members { %q } but "
+		    "specified with members { %q }",
+		    uentry_getName (old), 
+		    enumNameList_unparse (enew),
+		    enumNameList_unparse (eold)),
+	   uentry_whereDeclared (unew)))
+	{
+	  uentry_showWhereSpecified (old);
+	  old->utype = unew->utype;
+	}
+    }
+}
+
+/*
+** either oldCurrent or newCurrent may be undefined!
+*/
+
+static void
+paramTypeError (uentry old, uentry oldCurrent, ctype oldType,
+		uentry unew, uentry newCurrent, ctype newType,
+		int paramno)
+{
+  bool hasError = FALSE;
+
+  if (uentry_isValid (newCurrent) && uentry_isDeclared (newCurrent))
+    {
+      if (uentry_hasName (newCurrent))
+	{
+	  hasError = optgenerror 
+	    (FLG_TYPE,
+	     message ("Parameter %d, %q, of function %q has inconsistent type: "
+		      "declared %t, %s %t",
+		      paramno + 1, uentry_getName (newCurrent), 
+		      uentry_getName (unew),
+		      newType, uentry_specOrDefName (old), oldType),
+	     uentry_whereDeclared (newCurrent));
+	}
+      else
+	{
+	  hasError = optgenerror
+	    (FLG_TYPE,
+	     message ("Parameter %d of function %q has inconsistent type: "
+		      "declared %t, %s %t",
+		      paramno + 1, uentry_getName (unew),
+		      newType, uentry_specOrDefName (old), oldType),
+	     uentry_whereDeclared (newCurrent));
+
+	  DPRINTF (("type: %s / %s",
+		    ctype_unparse (newType),
+		    ctype_unparse (ctype_realType (newType))));
+	}
+    }
+  else 
+    {
+      if (uentry_isDeclared (unew))
+	{
+	  hasError = optgenerror 
+	    (FLG_TYPE,
+	     message ("Parameter %d of function %s has inconsistent type: "
+		      "declared %t, %s %t",
+		      paramno + 1, unew->uname, 
+		      newType, uentry_specOrDefName (old), oldType),
+	     uentry_whereDeclared (unew));
+	}
+      else
+	{
+	  hasError = optgenerror
+	    (FLG_TYPE,
+	     message ("Parameter %d of function %s has inconsistent type: "
+		      "declared %t, %s %t",
+		      paramno + 1, unew->uname, 
+		      newType, uentry_specOrDefName (old), oldType),
+	     uentry_whereDeclared (unew));
+	}
+    }
+  
+  if (hasError)
+    {
+      if (!uentry_isUndefined (oldCurrent))
+	{
+	  if (!uentry_isUndefined (newCurrent) 
+	      && cstring_equal (uentry_rawName (newCurrent), uentry_rawName (oldCurrent)))
+	    {
+	      uentry_showWhereLast (oldCurrent);
+	    }
+	  else
+	    {
+	      uentry_showWhereLastPlain (old);
+	    }
+	  
+	  uentry_setType (oldCurrent, newType);
+	}
+      else
+	{
+	  uentry_showWhereLastPlain (old);
+	}
+    }
+}
+
+static void
+nargsError (/*@notnull@*/ uentry old, /*@notnull@*/ uentry unew)
+{
+  if (optgenerror 
+      (FLG_TYPE,
+       message ("Function %s %rdeclared with %d arg%p, %s with %d",
+		unew->uname, 
+		uentry_isDeclared (old),
+		uentryList_size (uentry_getParams (unew)),
+		uentry_specOrDefName (old),
+		uentryList_size (uentry_getParams (old))),
+       uentry_whereDeclared (unew)))
+    {
+      uentry_showWhereLastPlain (old);
+    }
+}
+
+static void
+returnValueError (/*@notnull@*/ uentry old, /*@notnull@*/ uentry unew)
+{
+  if (optgenerror
+      (FLG_INCONDEFS,
+       message ("Function %s inconsistently %rdeclared to return %t",
+		unew->uname,
+		uentry_isDeclared (old),
+		ctype_returnValue (unew->utype)),
+       uentry_whereDeclared (unew)))
+    {
+      uentry_showWhereLastVal (old, ctype_unparse (ctype_returnValue (old->utype)));
+    }
+}
+
+static cstring paramStorageName (uentry ue)
+{
+  return (cstring_makeLiteralTemp (uentry_isParam (ue) ? "param" : "storage"));
+}
+
+static cstring fcnErrName (uentry ue)
+{
+  return (cstring_makeLiteralTemp (uentry_isFunction (ue) ? "to return" : "as"));
+}
+
+extern /*@observer@*/ cstring uentry_checkedName (uentry ue)
+{
+  if (uentry_isVar (ue))
+    {
+      return (checkedName (ue->info->var->checked));
+    }
+  else
+    {
+      return (cstring_makeLiteralTemp (""));
+    }
+}
+
+static cstring checkedName (chkind checked)
+{
+  switch (checked)
+    {
+    case CH_UNKNOWN:       return (cstring_makeLiteralTemp ("unknown"));
+    case CH_UNCHECKED:     return (cstring_makeLiteralTemp ("unchecked"));
+    case CH_CHECKED:       return (cstring_makeLiteralTemp ("checked"));
+    case CH_CHECKMOD:      return (cstring_makeLiteralTemp ("checkmod"));
+    case CH_CHECKEDSTRICT: return (cstring_makeLiteralTemp ("checkedstrict"));
+    }
+  BADEXIT;
+}
+
+static
+void checkNullState (/*@notnull@*/ uentry old, /*@notnull@*/ uentry unew, bool mustConform, bool completeConform)
+{
+  nstate oldState;
+  nstate newState;
+  
+  if (uentry_isVar (unew))
+    {
+      llassert (uentry_isVar (old));
+      
+      oldState = old->info->var->nullstate;
+      newState = unew->info->var->nullstate;
+    }
+  else
+    {
+      oldState = sRef_getNullState (old->sref);
+      newState = sRef_getNullState (unew->sref);
+    }
+
+  if (oldState == NS_ABSNULL)
+    {
+      if (uentry_isVar (old))
+	{
+	  old->info->var->nullstate = newState;
+	}
+      
+      sRef_mergeNullState (old->sref, newState);
+    }
+  else if (newState == NS_UNKNOWN)
+    {
+      if (completeConform && newState != oldState
+	  && uentry_isReallySpecified (old))
+	{
+	  if (optgenerror 
+	      (FLG_NEEDSPEC,
+	       message ("%s %q specified as %s, but declared without %s qualifier",
+			ekind_capName (unew->ukind),
+			uentry_getName (unew),
+			nstate_unparse (oldState),
+			nstate_unparse (oldState)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	    }
+	}
+      
+      if (uentry_isVar (unew))
+	{
+	  unew->info->var->nullstate = oldState;
+	}
+
+      sRef_mergeNullState (unew->sref, oldState);
+    }
+  else if (newState == NS_POSNULL)
+    {
+      if (oldState == NS_MNOTNULL 
+	  && (ctype_isUA (unew->utype) 
+	      || (uentry_isFunction (unew)
+		  && ctype_isUA (ctype_returnValue (unew->utype)))))
+	{
+	  if (uentry_isVar (unew))
+	    {
+	      unew->info->var->nullstate = oldState;
+	    }
+
+	  sRef_mergeNullState (unew->sref, oldState);
+	}
+      else 
+	{
+	  if (oldState == NS_NOTNULL || oldState == NS_MNOTNULL 
+	      || oldState == NS_UNKNOWN)
+	    {
+	      if (mustConform)
+		{
+		  if (optgenerror 
+		      (FLG_INCONDEFS,
+		       message 
+		       ("%s %q inconsistently %rdeclared %s possibly null storage, "
+			"%s %q qualifier",
+			uentry_ekindName (unew),
+			uentry_getName (unew),
+			uentry_isDeclared (old),
+			fcnErrName (unew),
+			uentry_specOrDefName (old),
+			cstring_makeLiteral (oldState == NS_MNOTNULL ? "with notnull" : "without null")),
+		       uentry_whereDeclared (unew)))
+		    {
+		      uentry_showWhereSpecified (old);
+		    }
+		}
+	    }
+	  
+	  if (uentry_isVar (old))
+	    {
+	      old->info->var->nullstate = newState;
+	    }
+
+	  sRef_mergeNullState (old->sref, newState);
+	}
+    }
+  else if (newState == NS_MNOTNULL)
+    {
+      if (oldState != NS_MNOTNULL)
+	{
+	  if (mustConform)
+	    {
+	      if (optgenerror 
+		  (FLG_INCONDEFS,
+		   message ("%s %q inconsistently %rdeclared %s notnull storage, "
+			    "%s without notnull qualifier",
+			    uentry_ekindName (unew),
+			    uentry_getName (unew),
+			    uentry_isDeclared (old),
+			    fcnErrName (unew),
+			    uentry_specOrDefName (old)),
+		   uentry_whereDeclared (unew)))
+		{
+		  uentry_showWhereSpecified (old);
+		}
+	    }
+	  
+	  if (uentry_isVar (old))
+	    {
+	      old->info->var->nullstate = newState;
+	    }
+
+	  sRef_mergeNullState (old->sref, newState);
+	}
+    }
+  else
+    {
+      if (uentry_isVar (unew)) 
+	{
+	  unew->info->var->nullstate = oldState;
+	}
+
+      sRef_mergeNullState (unew->sref, oldState);
+    }
+}
+
+static
+void checkDefState (/*@notnull@*/ uentry old, /*@notnull@*/ uentry unew, 
+		    bool mustConform, bool completeConform)
+{
+  sstate oldState;
+  sstate newState;
+  bool vars = FALSE;
+
+  if (uentry_isVar (old) && uentry_isVar (unew))
+    {
+      oldState = old->info->var->defstate;
+      newState = unew->info->var->defstate;
+      vars = TRUE;
+    }
+  else
+    {
+      oldState = sRef_getDefState (old->sref);
+      newState = sRef_getDefState (unew->sref);
+    }
+
+  if (newState != oldState && newState != SS_UNKNOWN && newState != SS_DEFINED)
+    {
+      if (mustConform)
+	{
+	  if (optgenerror 
+	      (FLG_INCONDEFS,
+	       message ("%s %q inconsistently %rdeclared %s %s %s, "
+			"%s %s %s %s",
+			uentry_ekindName (unew),
+			uentry_getName (unew),
+			uentry_isDeclared (old),
+			fcnErrName (unew),
+			sstate_unparse (newState),
+			paramStorageName (unew),
+			uentry_specOrDefName (old),
+			fcnErrName (unew),
+			sstate_unparse (oldState),
+			paramStorageName (unew)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	    }
+	}
+      
+      if (vars) old->info->var->defstate = newState;
+      sRef_setDefState (old->sref, newState, uentry_whereDeclared (unew));
+    }
+  else
+    {
+      if (completeConform
+	  && (newState != oldState) && (oldState != SS_DEFINED)
+	  && uentry_isReallySpecified (old))
+	{
+	  if (optgenerror 
+	      (FLG_NEEDSPEC,
+	       message ("%s %q specified as %s, but declared without %s qualifier",
+			ekind_capName (unew->ukind),
+			uentry_getName (unew),
+			sstate_unparse (oldState),
+			sstate_unparse (oldState)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	    }
+	}
+
+      if (vars) unew->info->var->defstate = oldState;
+      sRef_setDefState (unew->sref, oldState, uentry_whereDeclared (unew));
+    }
+}
+
+static void 
+  checkAliasState (/*@notnull@*/ uentry old, /*@notnull@*/ uentry unew, 
+		   bool mustConform, bool completeConform)
+{
+  alkind newKind;
+  alkind oldKind;
+
+  oldKind = sRef_getAliasKind (old->sref);
+  newKind = sRef_getAliasKind (unew->sref);
+
+  if (alkind_isImplicit (newKind) 
+      || (alkind_isRefCounted (newKind) && !uentry_isDatatype (unew)))
+    {
+      if (completeConform && !alkind_equal (newKind, oldKind)
+	  && uentry_isReallySpecified (old))
+	{
+	  if (optgenerror 
+	      (FLG_NEEDSPEC,
+	       message ("%s %q specified as %s, but declared without "
+			"explicit alias qualifier",
+			ekind_capName (unew->ukind),
+			uentry_getName (unew),
+			alkind_unparse (oldKind)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	    }
+	}
+
+      /*  
+      ** This really shouldn't be necessary, but it is!
+      ** Function params (?) use new here.
+      */
+
+      sRef_setAliasKind (unew->sref, oldKind, uentry_whereDeclared (unew));
+      return;
+    }
+
+  if (alkind_isKnown (newKind))
+    {
+      if (!alkind_equal (oldKind, newKind))
+	{
+	  if (alkind_isKnown (oldKind))
+	    {
+	      if (mustConform && 
+		  optgenerror 
+		  (FLG_INCONDEFS,
+		   message ("%s %q inconsistently %rdeclared %s %s storage, "
+			    "%s as %s storage",
+			    uentry_ekindName (unew),
+			    uentry_getName (unew),
+			    uentry_isDeclared (old),
+			    fcnErrName (unew),
+			    alkind_unparse (newKind),
+			    uentry_specOrDefName (old),
+			    alkind_unparse (oldKind)),
+		   uentry_whereDeclared (unew)))
+		{
+		  uentry_showWhereSpecified (old);
+
+		  sRef_setAliasKind (old->sref, AK_ERROR, 
+				     uentry_whereDeclared (unew));
+		}
+	      else
+		{
+		  sRef_setAliasKind (old->sref, newKind, 
+				     uentry_whereDeclared (unew));
+		}
+	    }
+	  else
+	    {
+	      if (!(alkind_isImplicit (newKind)))
+		{
+		  if (mustConform &&
+		      !uentry_isFunction (unew) &&
+		      optgenerror 
+		      (FLG_INCONDEFS,
+		       message ("%s %q inconsistently %rdeclared %s %s storage, "
+				"implicitly %s as temp storage",
+				uentry_ekindName (unew),
+				uentry_getName (unew),
+				uentry_isDeclared (old),
+				fcnErrName (unew),
+				alkind_unparse (newKind),
+				uentry_specOrDefName (old)),
+		       uentry_whereDeclared (unew)))
+		    {
+		      uentry_showWhereSpecified (old);
+		      oldKind = AK_ERROR;
+		    }
+		  
+		  sRef_setAliasKind (old->sref, newKind, 
+				     uentry_whereDeclared (unew));
+		}
+	      else /* newKind is temp or refcounted */
+		{
+		  ;
+		}
+	    }
+	}
+    }
+  else /* newKind unknown */
+    {
+      ;
+    }
+}
+
+static void 
+  checkExpState(/*@notnull@*/ uentry old, /*@notnull@*/ uentry unew, 
+		bool mustConform, bool completeConform)
+{
+  exkind newKind;
+  exkind oldKind;
+  
+  oldKind = sRef_getExKind (old->sref);
+  newKind = sRef_getExKind (unew->sref);
+
+  if (exkind_isKnown (newKind))
+    {
+      if (oldKind != newKind)
+	{
+	  if (exkind_isKnown (oldKind))
+	    {
+	      if (mustConform && 
+		  optgenerror 
+		  (FLG_INCONDEFS,
+		   message ("%s %q inconsistently %rdeclared %s %s, %s as %s",
+			    uentry_ekindName (unew),
+			    uentry_getName (unew),
+			    uentry_isDeclared (old),
+			    fcnErrName (unew),
+			    exkind_unparse (newKind),
+			    uentry_specOrDefName (old),
+			    exkind_unparse (oldKind)),
+		   uentry_whereDeclared (unew)))
+		{
+		  uentry_showWhereSpecified (old);
+		}
+
+	      sRef_setExKind (old->sref, newKind, uentry_whereDefined (unew));
+	    }
+	  else
+	    {
+	      if (mustConform &&
+		  optgenerror 
+		  (FLG_INCONDEFS,
+		   message ("%s %q inconsistently %rdeclared %s %s, "
+			    "implicitly %s without exposure qualifier",
+			    uentry_ekindName (unew),
+			    uentry_getName (unew),
+			    uentry_isDeclared (old),
+			    fcnErrName (unew),
+			    exkind_unparse (newKind),
+			    uentry_specOrDefName (old)),
+		   uentry_whereDeclared (unew)))
+		{
+		  uentry_showWhereSpecified (old);
+		}
+
+	      sRef_setExKind (old->sref, newKind, uentry_whereDefined (unew));
+	    }
+	}
+    }
+  else
+    {
+      if (completeConform && exkind_isKnown (oldKind)
+	  && uentry_isReallySpecified (old))
+	{
+	  if (optgenerror 
+	      (FLG_NEEDSPEC,
+	       message ("%s %q specified as %s, but declared without "
+			"exposure qualifier",
+			ekind_capName (unew->ukind),
+			uentry_getName (unew),
+			exkind_unparse (oldKind)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	    }
+	}
+
+      /* yes, this is necessary! (if its a param) */
+      sRef_setExKind (unew->sref, oldKind, fileloc_undefined);
+    }
+}
+
+static void
+uentry_checkStateConformance (/*@notnull@*/ uentry old,
+			      /*@notnull@*/ uentry unew,
+			      bool mustConform, bool completeConform)
+{
+  checkDefState (old, unew, mustConform, completeConform);
+  checkNullState (old, unew, mustConform, completeConform);
+  checkAliasState (old, unew, mustConform, completeConform);
+  checkExpState (old, unew, mustConform, completeConform);
+
+  sRef_storeState (old->sref);
+  sRef_storeState (unew->sref);
+}
+
+static void
+checkVarConformance (uentry old, uentry unew, bool mustConform, bool completeConform)
+{
+  if (uentry_isElipsisMarker (old) || uentry_isElipsisMarker (unew))
+    {
+      return;
+    }
+
+  llassert (uentry_isVar (old));
+  llassert (uentry_isVar (unew));
+
+  if (cstring_isEmpty (old->uname)) 
+    {
+      cstring_free (old->uname);
+      old->uname = cstring_copy (unew->uname);
+    }
+
+  if (unew->info->var->kind == VKRETPARAM
+      || unew->info->var->kind == VKSEFRETPARAM)
+    {
+      if (old->info->var->kind != VKRETPARAM
+	  && old->info->var->kind != VKSEFRETPARAM)
+	{
+	  if (optgenerror 
+	      (FLG_INCONDEFS,
+	       message ("Parameter %q inconsistently %rdeclared as "
+			"returned parameter",
+			uentry_getName (unew),
+			uentry_isDeclared (old)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	      old->info->var->kind = unew->info->var->kind;
+	    }
+	}
+    }
+
+
+  if (unew->info->var->kind == VKSEFPARAM || unew->info->var->kind == VKSEFRETPARAM)
+    {
+      if (old->info->var->kind != VKSEFPARAM 
+	  && old->info->var->kind != VKSEFRETPARAM)
+	{
+	  if (optgenerror 
+	      (FLG_INCONDEFS,
+	       message ("Parameter %qinconsistently %rdeclared as "
+			"sef parameter",
+			uentry_getOptName (unew),
+			uentry_isDeclared (old)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	      old->info->var->kind = unew->info->var->kind;
+	    }
+	}
+    }
+
+  if (old->info->var->kind == VKSPEC)
+    {
+      old->info->var->kind = unew->info->var->kind;
+    }
+  else
+    {
+      unew->info->var->kind = old->info->var->kind;
+    }
+
+  if (unew->info->var->checked != CH_UNKNOWN
+      && unew->info->var->checked != old->info->var->checked)
+    {
+      if (old->info->var->checked == CH_UNKNOWN
+	  && !fileloc_isUser (uentry_whereLast (old)))
+	{
+	  ; /* no error */
+	}
+      else
+	{
+	  if (optgenerror 
+	      (FLG_INCONDEFS,
+	       message ("Variable %q inconsistently %rdeclared as "
+			"%s parameter (was %s)",
+			uentry_getName (unew),
+			uentry_isDeclared (old),
+			checkedName (unew->info->var->checked),
+			checkedName (old->info->var->checked)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	    }
+	}
+      
+      old->info->var->checked = unew->info->var->checked;
+    }
+  else
+    {
+      if (completeConform 
+	  && (old->info->var->checked != CH_UNKNOWN)
+	  && uentry_isReallySpecified (old))
+	{
+	  if (optgenerror 
+	      (FLG_NEEDSPEC,
+	       message ("%s %q specified as %s, but declared without %s qualifier",
+			ekind_capName (unew->ukind),
+			uentry_getName (unew),
+			checkedName (old->info->var->checked),
+			checkedName (old->info->var->checked)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	    }
+	}
+      
+      unew->info->var->checked = old->info->var->checked;
+    }
+
+  uentry_checkStateConformance (old, unew, mustConform, completeConform);
+}
+
+void uentry_checkMatchParam (uentry u1, uentry u2, int paramno, exprNode e)
+{
+  if (uentry_isElipsisMarker (u1) || uentry_isElipsisMarker (u2))
+    {
+      return;
+    }
+
+  llassert (uentry_isVar (u1));
+  llassert (uentry_isVar (u2));
+
+  if (u1->info->var->kind != u2->info->var->kind) {
+    if (u1->info->var->kind == VKSEFRETPARAM) {
+      if (u2->info->var->kind == VKRETPARAM) {
+	voptgenerror 
+	  (FLG_TYPE,
+	   message ("Function types are inconsistent. Parameter %d is "
+		    "sef parameter, but non-sef parameter in "
+		    "assigned function: %s",
+		    paramno, exprNode_unparse (e)),
+	   exprNode_loc (e));
+      } else if (u2->info->var->kind == VKSEFPARAM) {
+	voptgenerror 
+	  (FLG_TYPE,
+	   message ("Function types are inconsistent. Parameter %d is "
+		    "returns parameter, but non-returns parameter in "
+		    "assigned function: %s",
+		    paramno, exprNode_unparse (e)),
+	   exprNode_loc (e));
+      } else {
+	voptgenerror 
+	  (FLG_TYPE,
+	   message ("Function types are inconsistent. Parameter %d is "
+		    "sef returns parameter, but non-sef returns parameter in "
+		    "assigned function: %s",
+		    paramno, exprNode_unparse (e)),
+	   exprNode_loc (e));
+      }
+    } else if (u1->info->var->kind == VKRETPARAM) {
+      voptgenerror 
+	(FLG_TYPE,
+	 message ("Function types are inconsistent. Parameter %d is "
+		  "returns parameter, but non-returns parameter in "
+		  "assigned function: %s",
+		  paramno, exprNode_unparse (e)),
+	 exprNode_loc (e));
+    } else if (u1->info->var->kind == VKSEFPARAM) {
+      voptgenerror 
+	(FLG_TYPE,
+	 message ("Function types are inconsistent. Parameter %d is "
+		  "sef parameter, but non-sef parameter in "
+		  "assigned function: %s",
+		  paramno, exprNode_unparse (e)),
+	 exprNode_loc (e));
+    } else {
+      if (u2->info->var->kind == VKSEFRETPARAM) {
+	voptgenerror 
+	  (FLG_TYPE,
+	   message ("Function types are inconsistent. Parameter %d is "
+		    "normal parameter, but sef returns parameter in "
+		    "assigned function: %s",
+		    paramno, exprNode_unparse (e)),
+	   exprNode_loc (e));
+      } else if (u2->info->var->kind == VKSEFPARAM) {
+	voptgenerror 
+	  (FLG_TYPE,
+	   message ("Function types are inconsistent. Parameter %d is "
+		    "normal parameter, but sef parameter in "
+		    "assigned function: %s",
+		    paramno, exprNode_unparse (e)),
+	   exprNode_loc (e));
+      } else if (u2->info->var->kind == VKRETPARAM) {
+	voptgenerror 
+	  (FLG_TYPE,
+	   message ("Function types are inconsistent. Parameter %d is "
+		    "normal parameter, but returns parameter in "
+		    "assigned function: %s",
+		    paramno, exprNode_unparse (e)),
+	   exprNode_loc (e));
+      } else {
+	BADBRANCH;
+      }
+    }
+  }
+
+  if (u1->info->var->defstate != u2->info->var->defstate) 
+    {
+      voptgenerror 
+	(FLG_TYPE,
+	 message ("Function types are inconsistent. Parameter %d is "
+		  "%s, but %s in assigned function: %s",
+		  paramno, 
+		  sstate_unparse (u1->info->var->defstate),
+		  sstate_unparse (u2->info->var->defstate),
+		  exprNode_unparse (e)),
+	 exprNode_loc (e));
+    }
+
+  if (u1->info->var->nullstate != u2->info->var->nullstate) 
+    {
+      voptgenerror 
+	(FLG_TYPE,
+	 message ("Function types are inconsistent. Parameter %d is "
+		  "%s, but %s in assigned function: %s",
+		  paramno, 
+		  nstate_unparse (u1->info->var->nullstate),
+		  nstate_unparse (u2->info->var->nullstate),
+		  exprNode_unparse (e)),
+	 exprNode_loc (e));
+    }
+      
+  if (sRef_getAliasKind (u1->sref) != sRef_getAliasKind (u2->sref))
+    {
+      voptgenerror 
+	(FLG_TYPE,
+	 message ("Function types are inconsistent. Parameter %d is "
+		  "%s, but %s in assigned function: %s",
+		  paramno, 
+		  alkind_unparse (sRef_getAliasKind (u1->sref)),
+		  alkind_unparse (sRef_getAliasKind (u2->sref)),
+		  exprNode_unparse (e)),
+	 exprNode_loc (e));
+    }
+
+  if (sRef_getExKind (u1->sref) != sRef_getExKind (u2->sref))
+    {
+      voptgenerror 
+	(FLG_TYPE,
+	 message ("Function types are inconsistent. Parameter %d is "
+		  "%s, but %s in assigned function: %s",
+		  paramno, 
+		  exkind_unparse (sRef_getExKind (u1->sref)),
+		  exkind_unparse (sRef_getExKind (u2->sref)),
+		  exprNode_unparse (e)),
+	 exprNode_loc (e));
+    }
+}
+
+static void
+checkFunctionConformance (/*@unique@*/ /*@notnull@*/ uentry old,
+			  /*@notnull@*/ uentry unew, 
+			  bool mustConform, /*@unused@*/ bool completeConform)
+{
+  uentryList oldParams  = uentry_getParams (old);
+  uentryList newParams  = uentry_getParams (unew);
+  ctype      newType    = unew->utype;
+  ctype      oldType    = old->utype;
+  ctype      oldRetType = ctype_unknown;
+  ctype      newRetType = ctype_unknown;
+
+  if (uentry_isForward (old))
+    {
+      mustConform = FALSE;
+      uentry_copyInto (old, unew);
+      return;
+    }
+
+  /*
+  ** check return values
+  */
+  
+  if (ctype_isKnown (oldType))
+    {
+      llassert (ctype_isFunction (oldType));
+
+      oldRetType = ctype_returnValue (oldType);
+    }
+
+  if (ctype_isKnown (newType))
+    {
+      llassert (ctype_isFunction (newType));
+
+      newRetType = ctype_returnValue (newType);
+    }
+
+  if (ctype_isKnown (oldRetType) && ctype_isKnown (newRetType)
+      && !ctype_matchDef (newRetType, oldRetType))
+    {
+      if (mustConform) returnValueError (old, unew);
+    }
+  else 
+    {
+      if (ctype_isConj (newRetType))
+	{
+	  if (ctype_isConj (oldRetType))
+	    {
+	      if (!ctype_sameAltTypes (newRetType, oldRetType))
+		{
+		  if (optgenerror 
+		      (FLG_INCONDEFS,
+		       message ("Function %q inconsistently %rdeclared to "
+				"return alternate types %s "
+				"(types match, but alternates are not identical, "
+				"so checking may not be correct)",
+				uentry_getName (unew),
+				uentry_isDeclared (old),
+				ctype_unparse (newRetType)),
+		       uentry_whereDeclared (unew)))
+		    {
+		      uentry_showWhereLastVal (old, ctype_unparse (oldRetType));
+		    }
+		}
+	    }
+	  else
+	    {
+	      old->utype = ctype_makeFunction (oldRetType, uentryList_copy (newParams));
+	    }
+	}
+    }
+
+  uentry_checkStateConformance (old, unew, mustConform, completeConform);
+
+  if (!exitkind_equal (unew->info->fcn->exitCode, old->info->fcn->exitCode))
+    {
+      if (exitkind_isKnown (unew->info->fcn->exitCode))
+	{
+	  if (optgenerror 
+	      (FLG_INCONDEFS,
+	       message ("Function %q inconsistently %rdeclared using %s",
+			uentry_getName (unew),
+			uentry_isDeclared (old),
+			exitkind_unparse (unew->info->fcn->exitCode)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	    }
+	}
+      else
+	{
+	  unew->info->fcn->exitCode = old->info->fcn->exitCode;
+	}
+    }
+
+  if (!qual_isUnknown (unew->info->fcn->nullPred))
+    {
+      if (!qual_equal (old->info->fcn->nullPred, unew->info->fcn->nullPred))
+	{
+	  if (optgenerror
+	      (FLG_INCONDEFS,
+	       message ("Function %q inconsistently %rdeclared using %s",
+			uentry_getName (unew),
+			uentry_isDeclared (old),
+			qual_unparse (unew->info->fcn->nullPred)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	    }
+	}
+    }
+  else
+    {
+      unew->info->fcn->nullPred = old->info->fcn->nullPred;
+    }
+
+  if (unew->info->fcn->specialCode != SPC_NONE)
+    {
+      if (old->info->fcn->specialCode != unew->info->fcn->specialCode)
+	{
+	  if (optgenerror
+	      (FLG_INCONDEFS,
+	       message ("Function %q inconsistently %rdeclared using %s",
+			uentry_getName (unew),
+			uentry_isDeclared (old),
+			specCode_unparse (unew->info->fcn->specialCode)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereSpecified (old);
+	    }
+	}
+    }
+  else
+    {
+      unew->info->fcn->specialCode = old->info->fcn->specialCode;
+    }
+	  
+  /*
+  ** check parameters
+  */
+  
+  if (!uentryList_sameObject (oldParams, newParams)
+      && (!uentryList_isMissingParams (oldParams)))
+    {
+      if (!uentryList_isMissingParams (newParams))
+	{
+	  int paramno = 0;
+	  int nparams = uentryList_size (oldParams);
+	  bool checknames = context_maybeSet (FLG_DECLPARAMMATCH);
+
+	  if (nparams != uentryList_size (newParams))
+	    {
+	      nargsError (old, unew);
+	    }
+	  
+	  if (uentryList_size (newParams) < nparams) 
+	    {
+	      nparams = uentryList_size (newParams);
+	    }
+
+	  while (paramno < nparams)
+	    {
+	      uentry oldCurrent = uentryList_getN (oldParams, paramno);
+	      uentry newCurrent  = uentryList_getN (newParams, paramno);
+	      ctype  oldCurrentType = uentry_getType (oldCurrent);
+	      ctype  newCurrentType = uentry_getType (newCurrent);
+
+	      llassert (uentry_isValid (oldCurrent)
+			&& uentry_isValid (newCurrent));
+	      
+	      if (!uentry_isElipsisMarker (oldCurrent)
+		  && !uentry_isElipsisMarker (newCurrent))
+		{
+		  checkVarConformance (oldCurrent, newCurrent, 
+				       mustConform, completeConform);
+		}
+
+	      if (checknames)
+		{
+		  if (uentry_hasName (oldCurrent) 
+		      && uentry_hasName (newCurrent))
+		    {
+		      cstring oldname = uentry_getName (oldCurrent);
+		      cstring pfx = context_getString (FLG_DECLPARAMPREFIX);
+		      cstring oname;
+		      cstring nname = uentry_getName (newCurrent);
+		      cstring nnamefix;
+
+		      if (cstring_isDefined (pfx)
+			  && cstring_equalPrefix (oldname, cstring_toCharsSafe (pfx)))
+			{
+			  oname = cstring_suffix (oldname, cstring_length (pfx));
+			}
+		      else
+			{
+			  oname = oldname;
+			/*@-branchstate@*/ } /*@=branchstate@*/
+
+		      if (cstring_isDefined (pfx)
+			  && cstring_equalPrefix (nname, cstring_toCharsSafe (pfx)))
+			{
+			  nnamefix = cstring_suffix (nname, cstring_length (pfx));
+			}
+		      else
+			{
+			  nnamefix = nname;
+			/*@-branchstate@*/ } /*@=branchstate@*/
+
+		      if (!cstring_equal (oname, nnamefix))
+			{
+			  if (optgenerror
+			      (FLG_DECLPARAMMATCH, 
+			       message ("Definition parameter name %s does not match "
+					"name of corresponding parameter in "
+					"declaration: %s",
+					nnamefix, oname),
+			       uentry_whereLast (newCurrent)))
+			    {
+			      uentry_showWhereLastPlain (oldCurrent);
+			    }
+			}
+		      
+		      cstring_free (oldname);
+		      cstring_free (nname);
+		    }
+		}
+
+	      if (!ctype_match (oldCurrentType, newCurrentType))
+		{
+		  paramTypeError (old, oldCurrent, oldCurrentType,
+				  unew, newCurrent, newCurrentType, paramno);
+		}
+	      else
+		{
+		  if (ctype_isMissingParamsMarker (newCurrentType)
+		      || ctype_isElips (newCurrentType)
+		      || ctype_isMissingParamsMarker (oldCurrentType)
+		      || ctype_isElips (oldCurrentType))
+		    {
+		      ;
+		    }
+		  else
+		    {
+		      if (ctype_isConj (newCurrentType))
+			{
+			  if (ctype_isConj (oldCurrentType))
+			    {
+			      if (!ctype_sameAltTypes (newCurrentType, oldCurrentType))
+				{
+				  if (optgenerror 
+				      (FLG_INCONDEFS,
+				       message ("Parameter %q inconsistently %rdeclared with "
+						"alternate types %s "
+						"(types match, but alternates are not identical, "
+						"so checking may not be correct)",
+						uentry_getName (newCurrent),
+						uentry_isDeclared (oldCurrent),
+						ctype_unparse (newCurrentType)),
+				       uentry_whereDeclared (unew)))
+				    {
+				      uentry_showWhereLastVal (oldCurrent,
+							       ctype_unparse (oldCurrentType));
+				    }
+				}
+			    }
+			  else
+			    {
+			      if (optgenerror 
+				  (FLG_INCONDEFS,
+				   message ("Parameter %q inconsistently %rdeclared with "
+					    "alternate types %s",
+					    uentry_getName (newCurrent),
+					    uentry_isDeclared (oldCurrent),
+					    ctype_unparse (newCurrentType)),
+				   uentry_whereDeclared (unew)))
+				{
+				  uentry_showWhereLastVal (oldCurrent,
+							   ctype_unparse (oldCurrentType));
+				  
+				}
+			    }
+			}
+		      else 
+			{
+			  if (ctype_isConj (oldCurrentType))
+			    {
+			      uentry_setType (newCurrent, oldCurrentType);
+			    }
+			}
+		    }
+		}
+
+	      paramno++;  
+	      /*
+	       ** Forgot this!  detected by lclint:
+	       ** uentry.c:1257,15: Suspected infinite loop
+	       */
+	    }
+	}
+    }
+
+  if (!uentryList_isMissingParams (newParams))
+    {
+      if (ctype_isConj (oldRetType))
+	{
+	  old->utype = ctype_makeFunction (oldRetType, 
+					   uentryList_copy (newParams));
+	}
+      else
+	{
+	  old->utype = unew->utype;
+	}
+    }
+
+  checkGlobalsConformance (old, unew, mustConform, completeConform);
+  checkModifiesConformance (old, unew, mustConform, completeConform);
+
+  if (unew->info->fcn->specclauses != NULL)
+    {
+      if (old->info->fcn->specclauses == NULL)
+	{
+	  if (optgenerror
+	      (FLG_INCONDEFS,
+	       message ("Function %q redeclared using special clauses (can only "
+			"be used in first declaration)",
+			uentry_getName (unew)),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereLast (old);
+	    }
+	}
+      else
+	{
+	  specialClauses_checkEqual (old, unew);
+	}
+    }
+
+  if (fileloc_isUndefined (old->whereDeclared))
+    {
+      old->whereDeclared = fileloc_copy (unew->whereDeclared);
+    }
+  else if (fileloc_isUndefined (unew->whereDeclared))
+    {
+      unew->whereDeclared = fileloc_copy (old->whereDeclared);
+    }
+  else
+    {
+      /* no change */
+    }
+}
+
+void
+uentry_mergeConstantValue (uentry ue, /*@only@*/ multiVal m)
+{
+  multiVal uval;
+
+  llassert (uentry_isValid (ue));
+  llassert (uentry_isEitherConstant (ue));
+
+  uval = ue->info->uconst->val;
+
+  if (multiVal_isDefined (uval))
+    {
+      if (multiVal_isDefined (m))
+	{
+	  if (!multiVal_equiv (uval, m))
+	    {
+	      if (optgenerror 
+		  (FLG_INCONDEFS,
+		   message ("%s %q defined with inconsistent value: %q",
+			    ekind_capName (ue->ukind),
+			    uentry_getName (ue), 
+			    multiVal_unparse (m)),
+		   g_currentloc))
+		{
+		  uentry_showWhereLastExtra (ue, multiVal_unparse (uval));
+		}
+	    }
+	}
+      multiVal_free (m);
+    }
+  else
+    {
+      ue->info->uconst->val = m;
+      multiVal_free (uval);
+    }
+}
+
+static
+bool checkTypeConformance (/*@notnull@*/ uentry old, /*@notnull@*/ uentry unew, 
+			   bool mustConform)
+{
+  bool typeError = FALSE;
+
+  if (uentry_isStructTag (old) || uentry_isUnionTag (old))
+    {
+      if (ctype_isSU (old->utype) && ctype_isSU (unew->utype))
+	{
+	  if (mustConform)
+	    {
+	      checkStructConformance (old, unew); 
+	    }
+	}
+      else
+	{
+	  if (!(ctype_isBogus (old->utype) || ctype_isBogus (unew->utype)))
+	    {
+	      llbug (message ("struct tags: bad types: %t / %t", 
+			      old->utype, unew->utype));
+	    }
+	}
+    }
+  else if (uentry_isEnumTag (old))
+    {
+      if (ctype_isEnum (old->utype) && ctype_isEnum (unew->utype))
+	{
+	  if (mustConform) checkEnumConformance (old, unew);
+	}
+      else 
+	{
+	  if (!(ctype_isBogus (old->utype) || ctype_isBogus (unew->utype)))
+	    {
+	      llbug (message ("enum! bad type: %s / %s", ctype_unparse (old->utype),
+			      ctype_unparse (unew->utype)));
+	    }
+	}
+    }
+  else if (!ctype_match (old->utype, unew->utype))
+    {
+      if (cstring_equal (uentry_rawName (old), context_getBoolName ()))
+	{
+	  ctype realt = ctype_realType (unew->utype);
+	  
+	  if (ctype_isRealInt (realt) || ctype_isChar (realt))
+	    {
+	      unew->utype = ctype_bool;
+	    }
+	  else
+	    {
+	      if (mustConform)
+		{
+		  typeError = optgenerror
+		    (FLG_INCONDEFS,
+		     message ("%q defined as %s", uentry_getName (old), 
+			      ctype_unparse (realt)),
+		     uentry_whereDeclared (unew));
+		}
+	    }
+	} 
+      else 
+	{
+	  if (mustConform)
+	    {
+	      ctype oldr = ctype_realType (old->utype);
+	      ctype newr = ctype_realType (unew->utype);
+	      
+	      if (ctype_isStruct (oldr) && ctype_isStruct (newr))
+		{
+		  checkStructConformance (old, unew);
+		}
+	      else if (ctype_isUnion (oldr) && ctype_isUnion (newr))
+		{
+		  checkStructConformance (old, unew);
+		}
+	      else if (ctype_isEnum (oldr) && ctype_isEnum (newr))
+		{
+		  checkEnumConformance (old, unew);
+		}
+	      else if (uentry_isConstant (old) 
+		       && (ctype_isAbstract (oldr) && ctype_isEnum (newr)))
+		{
+		  /* okay...for now! (should check the type is reset later... */
+		}
+	      else
+		{
+		  if (optgenerror 
+		      (FLG_INCONDEFS,
+		       message ("%s %q %rdeclared with inconsistent type: %t",
+				ekind_capName (unew->ukind),
+				uentry_getName (unew), 
+				uentry_isDeclared (old),
+				unew->utype),
+		       uentry_whereDeclared (unew)))
+		    {
+		      uentry_showWhereLast (old);
+		      typeError = TRUE;
+		    }
+		}
+	    }
+	}
+    }
+  else
+    {
+      /* no error */
+    }
+
+  return typeError;
+}
+
+static void
+uentry_checkDatatypeConformance (/*@notnull@*/ uentry old,
+				 /*@notnull@*/ uentry unew,
+				 bool mustConform, bool completeConform)
+{
+  if (ctype_isDefined (unew->info->datatype->type))
+    {
+      if (ctype_isDirectBool (old->utype) &&
+	  cstring_equalLit (unew->uname, "bool"))
+	{
+	  if (!context_getFlag (FLG_ABSTRACTBOOL))
+	    {
+	      unew->utype = ctype_bool;
+	    }
+	}
+      
+      if (ctype_isUnknown (old->info->datatype->type))
+	{
+	  old->info->datatype->type = unew->info->datatype->type;
+	}
+      else
+	{
+	  if (ctype_matchDef (old->info->datatype->type,
+			   unew->info->datatype->type))
+	    {
+	      ;
+	    }
+	  else
+	    {
+	      if (optgenerror 
+		  (FLG_INCONDEFS,
+		   message
+		   ("Type %q %s with inconsistent type: %t",
+		    uentry_getName (unew), 
+		    uentry_reDefDecl (old, unew),
+		    unew->info->datatype->type),
+		   uentry_whereDeclared (unew)))
+		{
+		  uentry_showWhereLastExtra 
+		    (old, cstring_copy (ctype_unparse (old->info->datatype->type)));
+		}
+
+	      old->info->datatype->type = unew->info->datatype->type;
+	    }
+	}
+    }
+  
+  if (unew->info->datatype->abs != MAYBE)
+    {
+      if (ynm_isOff (old->info->datatype->abs)
+	  && ynm_isOn (unew->info->datatype->abs))
+	{
+	  if (!ctype_isDirectBool (old->utype))
+	    {
+	      if (optgenerror 
+		  (FLG_INCONDEFS,
+		   message 
+		   ("Datatype %q inconsistently %rdeclared as abstract type",
+		    uentry_getName (unew), 
+		    uentry_isDeclared (old)),
+		   uentry_whereDeclared (unew)))
+		{
+		  uentry_showWhereLastPlain (old);
+		}
+	    }
+	}
+      else if (ynm_isOn (old->info->datatype->abs)
+	       && ynm_isOff (unew->info->datatype->abs))
+	{
+	  if (!ctype_isDirectBool (old->utype))
+	    {
+	      if (optgenerror 
+		  (FLG_INCONDEFS,
+		   message 
+		   ("Datatype %q inconsistently %rdeclared as concrete type",
+		    uentry_getName (unew), 
+		    uentry_isDeclared (old)),
+		   uentry_whereDeclared (unew)))
+		{
+		  uentry_showWhereLastPlain (old);
+		}
+	    }
+	}
+      else
+	{
+	  ;
+	}
+    }
+  else 
+    {
+      if (ynm_isOn (old->info->datatype->abs))
+	{
+	  old->sref = unew->sref;
+	  unew->info->datatype->mut = old->info->datatype->mut;
+	  
+	  if (completeConform
+	      && uentry_isReallySpecified (old))
+	    {
+	      if (optgenerror 
+		  (FLG_NEEDSPEC,
+		   message 
+		   ("Datatype %q specified as abstract, "
+		    "but abstract annotation not used in declaration",
+		    uentry_getName (unew)), 
+		   uentry_whereDeclared (unew)))
+		{
+		  uentry_showWhereLastPlain (old);
+		}
+	    }
+	}
+    }
+  
+  unew->info->datatype->abs = old->info->datatype->abs;	  
+  
+  if (ynm_isMaybe (unew->info->datatype->mut))
+    {
+      if (completeConform && ynm_isOff (old->info->datatype->mut)
+	  && uentry_isReallySpecified (old))
+	{
+	  if (optgenerror 
+	      (FLG_NEEDSPEC,
+	       message 
+	       ("Datatype %q specified as immutable, "
+		"but immutable annotation not used in declaration",
+		uentry_getName (unew)), 
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereLastPlain (old);
+	    }
+	}
+      
+      unew->info->datatype->mut = old->info->datatype->mut;
+    }
+  else if (ynm_isMaybe (old->info->datatype->mut))
+    {
+      old->info->datatype->mut = unew->info->datatype->mut;
+    }
+  else
+    {
+      if (ynm_isOn (old->info->datatype->abs))
+	{
+	  if (ynm_isOn (old->info->datatype->mut) && ynm_isOff (unew->info->datatype->mut))
+	    {
+	      if (optgenerror
+		  (FLG_INCONDEFS,
+		   message ("Datatype %q inconsistently %rdeclared as immutable",
+			    uentry_getName (unew), 
+			    uentry_isDeclared (old)),
+		   uentry_whereDeclared (unew)))
+		{
+		  uentry_showWhereLastPlain (old);
+		}
+	    }
+	  else 
+	    {
+	      if (ynm_isOff (old->info->datatype->mut)
+		  && ynm_isOn (unew->info->datatype->mut))
+		{
+		  if (optgenerror
+		      (FLG_INCONDEFS,
+		       message ("Datatype %q inconsistently %rdeclared as mutable",
+				uentry_getName (unew), 
+				uentry_isDeclared (old)),
+		       uentry_whereDeclared (unew)))
+		    {
+		      uentry_showWhereLastPlain (old);
+		    }
+		}
+	    }
+	}
+      old->info->datatype->mut = unew->info->datatype->mut;	  
+    }
+
+  uentry_checkStateConformance (old, unew, mustConform, completeConform);
+}
+
+static void
+uentry_checkConstantConformance (/*@notnull@*/ uentry old,
+				 /*@notnull@*/ uentry unew,
+				 bool mustConform, 
+				 /*@unused@*/ bool completeConform)
+{
+  multiVal oldVal = old->info->uconst->val;
+  multiVal newVal = unew->info->uconst->val;
+  
+  if (multiVal_isDefined (oldVal))
+    {
+      if (multiVal_isDefined (newVal))
+	{
+	  if (!multiVal_equiv (oldVal, newVal))
+	    {
+	      if (mustConform
+		  && optgenerror 
+		  (FLG_INCONDEFS,
+		   message ("%s %q %rdeclared with inconsistent value: %q",
+			    ekind_capName (unew->ukind),
+			    uentry_getName (unew), 
+			    uentry_isDeclared (old),
+			    multiVal_unparse (newVal)),
+		   uentry_whereDeclared (unew)))
+		{
+		  uentry_showWhereLastExtra (old, multiVal_unparse (oldVal));
+		}
+	    }
+	  
+	  unew->info->uconst->val = multiVal_copy (oldVal);
+	  multiVal_free (newVal);
+	}
+      else
+	{
+	  ;
+	}
+    }
+  else
+    {
+      old->info->uconst->val = multiVal_copy (newVal);
+    }
+}
+
+static void 
+uentry_checkConformance (/*@unique@*/ /*@notnull@*/ uentry old, 
+			 /*@notnull@*/ uentry unew, bool mustConform,
+			 bool completeConform)
+{
+  bool typeError = FALSE;
+  bool fcnConformance = FALSE;
+
+  if (!ekind_equal (unew->ukind, old->ukind))
+    {
+      /*
+      ** okay, only if one is a function and the other is
+      ** a variable of type function.
+      */
+
+      if (unew->ukind == KENUMCONST
+	  && old->ukind == KCONST)
+	{
+	  old->ukind = KENUMCONST;
+	  goto nokinderror;
+	}
+
+      if (unew->ukind == KFCN 
+	  && old->ukind == KCONST
+	  && ctype_isUnknown (old->utype))
+	{
+	  /*
+	  ** When a function is defined with an unparam macro
+	  */
+
+	  uentry_copyInto (old, unew);
+	  return;
+	}
+
+      if (uentry_isExpandedMacro (old) 
+	  && uentry_isEitherConstant (unew))
+	{
+	  uentry_copyInto (old, unew);
+	  return;
+	}
+
+      if (uentry_isEndIter (unew))
+	{
+	  if (ctype_isUnknown (old->utype))
+	    {
+	      if (!uentry_isSpecified (old)
+		  && uentry_isCodeDefined (unew))
+		{
+		  if (!fileloc_withinLines (uentry_whereDefined (old),
+					    uentry_whereDeclared (unew), 2))
+		    { /* bogus!  will give errors if there is too much whitespace */
+		      voptgenerror
+			(FLG_SYNTAX,
+			 message
+			 ("Iterator finalized name %q does not match name in "
+			  "previous iter declaration (should be end_%q).  This iter "
+			  "is declared at %q", 
+			  uentry_getName (unew),
+			  uentry_getName (old),
+			  fileloc_unparse (uentry_whereDefined (old))),
+			 uentry_whereDeclared (old));
+		    }
+		}
+
+	      uentry_copyInto (old, unew);
+	      return;
+	    }
+	  else
+	    {
+	      KindConformanceError (old, unew, mustConform);
+	    }
+	}
+
+      if (uentry_isFunction (unew))
+	{
+	  if (uentry_isVariable (old))
+	    {
+	      if (!ctype_isUnknown (old->utype))
+		{
+		  if (ctype_isFunction (old->utype))
+		    {
+		      uentry_makeVarFunction (old);
+		      checkFunctionConformance (old, unew, mustConform,
+						completeConform);
+		      fcnConformance = TRUE;
+		    }
+		  else
+		    {
+		      KindConformanceError (old, unew, mustConform);
+		    }
+		}
+	      else
+		{
+		  if (uentry_isExpandedMacro (old))
+		    {
+		      if (fileloc_isUndefined (unew->whereDefined))
+			{
+			  unew->whereDefined = fileloc_update (unew->whereDefined, 
+							      old->whereDefined);
+			}
+
+		      uentry_copyInto (old, unew);
+		      old->used = unew->used = TRUE;
+		      return;
+		    }
+		  else
+		    {
+		      /* undeclared identifier */
+		      old->utype = unew->utype;
+		      uentry_makeVarFunction (old);
+		      checkFunctionConformance (old, unew, FALSE, FALSE);
+		      fcnConformance = TRUE;
+		    }
+		}
+	    }
+	  else
+	    {
+	      KindConformanceError (old, unew, mustConform);
+	    }
+	}
+      else if (uentry_isFunction (old) && uentry_isVariable (unew))
+	{
+	  if (!ctype_isUnknown (unew->utype))
+	    {
+	      if (ctype_isFunction (unew->utype))
+		{
+		  uentry_makeVarFunction (unew);
+		  checkFunctionConformance (old, unew, mustConform, completeConform);
+		  fcnConformance = TRUE;
+		}
+	      else
+		{
+		  KindConformanceError (old, unew, mustConform);
+		}
+	    }
+	  else
+	    {
+	      KindConformanceError (old, unew, mustConform);
+	    }
+	}
+      else
+	{
+	  KindConformanceError (old, unew, mustConform);
+	}
+    }
+  else
+    {
+      /*
+      ** check parameter lists for functions 
+      ** (before type errors, to get better messages
+      */
+
+      if (uentry_isFunction (old))
+	{
+	  checkFunctionConformance (old, unew, mustConform, completeConform);
+	  fcnConformance = TRUE;
+	}
+      else 
+	{
+	  if (!ctype_isUndefined (old->utype))
+	    {
+	      typeError = checkTypeConformance (old, unew, mustConform);
+	    }
+	}
+    }
+
+ nokinderror:
+
+  if (uentry_isEitherConstant (old) && uentry_isEitherConstant (unew))
+    {
+      uentry_checkConstantConformance (old, unew, mustConform, completeConform);
+    }
+
+  if (uentry_isDatatype (old) && uentry_isDatatype (unew))
+    {
+      uentry_checkDatatypeConformance (old, unew, mustConform, completeConform);
+    }
+
+  if (uentry_isVariable (old) && uentry_isVariable (unew))
+    {
+      if (!typeError && 
+	  !ctype_matchDef (old->utype, unew->utype))
+	{
+	  if (optgenerror 
+	      (FLG_INCONDEFS,
+	       message
+	       ("Variable %q %s with inconsistent type (arrays and pointers are "
+		"not identical in variable declarations): %t",
+		uentry_getName (unew), 
+		uentry_reDefDecl (old, unew),
+		unew->utype),
+	       uentry_whereDeclared (unew)))
+	    {
+	      uentry_showWhereLast (old);
+	      
+	      /*
+	      ** Avoid repeated errors.
+	      */
+
+	      if (uentry_isCodeDefined (old) && uentry_isCodeDefined (unew))
+		{
+		  old->whereDefined = fileloc_update (old->whereDefined,
+						      fileloc_undefined);
+		}
+
+	      typeError = TRUE;
+	    }
+	}
+
+      checkVarConformance (old, unew, mustConform, completeConform);
+    }
+
+  if (fcnConformance)
+    {
+      /* old->utype = unew->utype; */
+    }
+  else
+    {
+      if (ctype_isConj (old->utype))
+	{
+	  if (ctype_isConj (unew->utype))
+	    {
+	      if (!ctype_sameAltTypes (old->utype, unew->utype))
+		{
+		  if (optgenerror 
+		      (FLG_INCONDEFS,
+		       message ("%s %q inconsistently %rdeclared with "
+				"alternate types %s "
+				"(types match, but alternates are not identical, "
+				"so checking may not be correct)",
+				ekind_capName (uentry_getKind (old)),
+				uentry_getName (unew),
+				uentry_isDeclared (old),
+				ctype_unparse (unew->utype)),
+		       uentry_whereDeclared (unew)))
+		    {
+		      uentry_showWhereLastVal (old, ctype_unparse (old->utype));
+		    }
+		  else
+		    {
+		      old->utype = unew->utype;
+		    }
+		}
+	    }
+	}
+      else
+	{
+	  if (ctype_isUnknown (old->utype))
+	    {
+	      old->utype = unew->utype;
+	    }
+	}
+    }  
+
+  if (unew->ukind == old->ukind) 
+    {
+      sfree (unew->info);
+      unew->info = uinfo_copy (old->info, old->ukind);
+    }
+
+  sRef_storeState (old->sref);
+  sRef_storeState (unew->sref);
+}
+
+/*
+** modifies spec to reflect def, reports any inconsistencies
+*/
+
+void
+uentry_mergeEntries (uentry spec, /*@only@*/ uentry def)
+{
+  llassert (uentry_isValid (spec));
+  llassert (uentry_isValid (def));
+  llassert (cstring_equal (spec->uname, def->uname));
+
+  uentry_checkConformance (spec, def, TRUE, 
+			   context_getFlag (FLG_NEEDSPEC));
+
+  /* was: !(fileloc_isImport (uentry_whereSpecified (spec)))); */
+
+  /*
+  ** okay, declarations conform.  Propagate extra information.
+  */
+
+  uentry_setDefined (spec, uentry_whereDefined (def));
+  uentry_setDeclared (spec, uentry_whereDeclared (def));
+
+  if (uentry_isStatic (def))
+    {
+      if (optgenerror 
+	  (FLG_INCONDEFS,
+	   message ("%s %q specified, but declared as static",
+		    ekind_capName (def->ukind),
+		    uentry_getName (def)),
+	   uentry_whereDeclared (def)))
+	{
+	  uentry_showWhereSpecified (spec);
+	}
+    }
+  else 
+    {
+      spec->storageclass = def->storageclass;
+    }
+
+  sRef_storeState (spec->sref);
+
+  spec->used = def->used || spec->used;
+  spec->hasNameError |= def->hasNameError;
+
+  uentry_free (def);
+
+  if (!spec->hasNameError)
+    {
+      uentry_checkName (spec);
+    }
+  else
+    {
+      ;
+    }
+}
+
+/*
+** Can't generate function redeclaration errors when the 
+** entries are merged, since we don't yet know if its the
+** definition of the function.
+*/
+
+void
+uentry_clearDecl (void)
+{
+  posRedeclared = uentry_undefined;
+  fileloc_free (posLoc);
+  posLoc = fileloc_undefined;
+}
+
+void
+uentry_checkDecl (void)
+{
+  if (uentry_isValid (posRedeclared))
+    {
+      llassert (fileloc_isDefined (posLoc));
+
+      if (uentry_isCodeDefined (posRedeclared))
+	{
+	  if (optgenerror (FLG_REDECL,
+			   message ("%s %q declared after definition", 
+				    ekind_capName (posRedeclared->ukind),
+				    uentry_getName (posRedeclared)),
+			   posLoc))
+	    {
+	      llgenindentmsg (message ("Definition of %q", 
+				       uentry_getName (posRedeclared)),
+			      posRedeclared->whereDeclared);
+	    }
+	}
+      else
+	{
+	  if (optgenerror (FLG_REDECL,
+			   message ("%s %q declared more than once", 
+				    ekind_capName (posRedeclared->ukind),
+				    uentry_getName (posRedeclared)),
+			   posLoc))
+	    {
+	      llgenindentmsg (message ("Previous declaration of %q", 
+				       uentry_getName (posRedeclared)),
+			      posRedeclared->whereDeclared);
+	    }
+	}
+    }
+
+  fileloc_free (posLoc);
+  posLoc = fileloc_undefined;
+  posRedeclared = uentry_undefined;
+}
+
+/*
+** Redefinition of old as unew.
+** modifies old to reflect unew, reports any inconsistencies
+*/
+
+void
+uentry_mergeDefinition (uentry old, /*@only@*/ uentry unew)
+{
+  fileloc olddef = uentry_whereDeclared (old);
+  fileloc unewdef = uentry_whereDeclared (unew);
+  bool mustConform;
+  bool wasForward;
+ 
+  if (uentry_isExtern (unew))
+    {
+      uentry_setUsed (old, unewdef);
+    }
+
+  wasForward = 
+    fileloc_isUndefined (olddef) 
+      && fileloc_isDefined (uentry_whereDefined (old)) 
+	&& !uentry_isExpandedMacro (old);
+  
+  if (!context_getFlag (FLG_INCONDEFSLIB)
+      && (fileloc_isLib (olddef) || fileloc_isImport (olddef)))
+    {
+      mustConform = FALSE;
+    }
+  else
+    {
+      mustConform = TRUE;
+    }
+  
+  llassert (uentry_isValid (old));
+  llassert (uentry_isValid (unew));
+  llassert (cstring_equal (old->uname, unew->uname));
+
+  /*
+  ** should check old one was extern!
+  */
+
+  if (uentry_isStatic (old))
+    {
+      if (!(uentry_isStatic (unew)))
+	{
+	  if (optgenerror 
+	      (FLG_SHADOW,
+	       message ("%s %q shadows static declaration",
+			ekind_capName (unew->ukind),
+			uentry_getName (unew)),
+	       unewdef))
+	    {
+	      uentry_showWhereLast (old);
+	    }
+	}
+      else
+	{
+	  uentry_setDeclDef (old, unewdef);
+	}
+    }
+  else if (uentry_isStatic (unew))
+    {
+      uentry_setDeclDef (old, unewdef);
+    }
+  else if (uentry_isExtern (old))
+    {
+      uentry_setDeclared (old, unewdef);
+    }
+  else
+    {
+      if (!uentry_isExtern (unew) && !uentry_isForward (old)
+	  && !fileloc_equal (olddef, unewdef)
+	  && !fileloc_isUndefined (olddef)
+	  && !fileloc_isUndefined (unewdef)
+	  && !fileloc_isBuiltin (olddef)
+	  && !fileloc_isBuiltin (unewdef)
+	  && !uentry_isYield (old)
+	  && !(fileloc_isLib (olddef) || fileloc_isImport (olddef)))
+	{
+	  if (uentry_isVariable (old) || uentry_isVariable (unew))
+	    {
+	      ; /* will report redeclaration error later */
+	    }
+	  else
+	    {
+	      if (fileloc_isDefined (uentry_whereDefined (old)))
+		{
+		  if (optgenerror
+		      (FLG_REDEF,
+		       message ("%s %q defined more than once", 
+				ekind_capName (unew->ukind),
+				uentry_getName (unew)),
+		       uentry_whereLast (unew)))
+		    {
+		      llgenindentmsg
+			(message ("Previous definition of %q", 
+				  uentry_getName (old)),
+			 uentry_whereLast (old));
+		    }
+		  /*
+		  if (uentry_isDatatype (old) || uentry_isAnyTag (old))
+		    {
+		      uentry_copyInto (old, unew);
+		      old->sref = sRef_saveCopy (old->sref);
+		    }
+		    */
+		}
+	    }
+	}
+      else
+	{
+	  if (fileloc_isLib (olddef)
+	      || fileloc_isUndefined (olddef)
+	      || fileloc_isImport (olddef))
+	    {
+	      if (uentry_isExtern (unew)) 
+		{
+		  if (uentry_isExtern (old)
+		      || (fileloc_isDefined (uentry_whereDeclared (old))
+			  && (!fileloc_equal (uentry_whereDeclared (old),
+					      uentry_whereDefined (old)))))
+		    {
+		      if (optgenerror
+			  (FLG_REDECL,
+			   message ("%s %q declared more than once", 
+				    ekind_capName (unew->ukind),
+				    uentry_getName (unew)),
+			   unew->whereDeclared))
+			{
+			  llgenindentmsg
+			    (message ("Previous declaration of %q", 
+				      uentry_getName (old)),
+			     old->whereDeclared);
+			}
+		    }
+		  
+		  uentry_setExtern (old);
+		}
+	      else
+		{
+		  uentry_setDefined (old, unewdef);
+		}
+	    }
+	}
+    }
+
+  uentry_checkConformance (old, unew, mustConform, FALSE);
+
+  old->used = old->used || unew->used;
+  old->uses = filelocList_append (old->uses, unew->uses);
+  unew->uses = filelocList_undefined; 
+
+  sRef_storeState (old->sref); 
+  sRef_storeState (unew->sref);
+
+  if (wasForward)
+    {
+      old->whereDefined = fileloc_update (old->whereDefined,
+					  fileloc_undefined);
+    }
+
+  /*
+  ** No redeclaration errors for functions here, since we
+  ** don't know if this is the definition of the function.
+  */
+
+  if (fileloc_isUser (old->whereDeclared)
+      && fileloc_isUser (unew->whereDeclared)
+      && !fileloc_equal (old->whereDeclared, unew->whereDeclared)
+      && !fileloc_isDefined (unew->whereDefined))
+    {
+      if (uentry_isFunction (old))
+	{
+	  /*@-temptrans@*/ posRedeclared = old; /*@=temptrans@*/
+	  posLoc = fileloc_update (posLoc, unew->whereDeclared);
+	}
+      else
+	{
+	  if (optgenerror (FLG_REDECL,
+			   message ("%s %q declared more than once", 
+				    ekind_capName (unew->ukind),
+				    uentry_getName (unew)),
+			   unew->whereDeclared))
+	    {
+	      llgenindentmsg (message ("Previous declaration of %q", 
+				       uentry_getName (old)),
+			      old->whereDeclared);
+	    }
+	}
+    }
+
+  if (fileloc_isUndefined (old->whereDefined))
+    {
+      old->whereDefined = fileloc_update (old->whereDefined, unew->whereDefined);
+    }
+  else
+    {
+      if (!context_processingMacros ()
+	  && fileloc_isUser (old->whereDefined) 
+	  && fileloc_isUser (unew->whereDefined)
+	  && !fileloc_equal (old->whereDefined, unew->whereDefined))
+	{
+	  if (uentry_isVariable (unew) || uentry_isFunction (unew))
+	    {
+	      if (uentry_isVariable (unew) 
+		  && uentry_isExtern (unew))
+		{
+		  if (optgenerror (FLG_REDECL,
+				   message ("%s %q declared after definition", 
+					    ekind_capName (unew->ukind),
+					    uentry_getName (unew)),
+				   unew->whereDeclared))
+		    {
+		      llgenindentmsg (message ("Definition of %q", 
+					       uentry_getName (old)),
+				      old->whereDefined);
+		    }
+		}
+	      else
+		{
+		  if (optgenerror (FLG_REDEF,
+				   message ("%s %q redefined", 
+					    ekind_capName (unew->ukind),
+					    uentry_getName (unew)),
+				   unew->whereDefined))
+		    {
+		      llgenindentmsg (message ("Previous definition of %q", 
+					       uentry_getName (old)),
+				      old->whereDefined);
+		    }
+		}
+	    }
+	}
+    }
+
+  if (uentry_isExternal (unew))
+    {
+      old->whereDefined = fileloc_createExternal ();
+    }
+
+  if (unew->hasNameError)
+    {
+      old->hasNameError = TRUE;
+    }
+
+  uentry_free (unew);
+
+  if (!old->hasNameError)
+    {
+      uentry_checkName (old);
+    }
+
+  llassert (!ctype_isUndefined (old->utype));
+}
+
+void
+uentry_copyState (uentry res, uentry other)
+{
+  llassert (uentry_isValid (res));
+  llassert (uentry_isValid (other));
+
+  res->used = other->used;
+
+  res->info->var->kind = other->info->var->kind;
+  res->info->var->defstate = other->info->var->defstate;
+  res->info->var->nullstate = other->info->var->nullstate;
+  res->info->var->checked = other->info->var->checked;
+
+  sRef_copyState (res->sref, other->sref);
+}
+
+bool
+uentry_sameKind (uentry u1, uentry u2)
+{
+  if (uentry_isValid (u1) && uentry_isValid (u2))
+    {
+      if (uentry_isVar (u1) && uentry_isVar (u2))
+	{
+	  ctype c1 = u1->utype;
+	  ctype c2 = u2->utype;
+
+	  if (ctype_isUnknown (c1) || ctype_isUnknown (c2)) return FALSE;
+
+	  /*
+	  ** both functions, or both not functions
+	  */
+
+	  return (bool_equal (ctype_isFunction (c1), ctype_isFunction (c2)));
+	}
+      else
+	{
+	  return ((u1->ukind == u2->ukind));
+	}
+    }
+  
+  return FALSE;
+}
+   
+static void uentry_copyInto (/*@unique@*/ uentry unew, uentry old)
+{
+  llassert (uentry_isValid (unew));
+  llassert (uentry_isValid (old));
+
+  unew->ukind = old->ukind;
+  unew->uname = cstring_copy (old->uname);
+  unew->utype = old->utype;
+
+  unew->whereSpecified = fileloc_copy (old->whereSpecified);
+  unew->whereDefined = fileloc_copy (old->whereDefined);
+  unew->whereDeclared = fileloc_copy (old->whereDeclared);
+
+  unew->sref = sRef_saveCopy (old->sref); /* Memory leak! */
+  unew->used = old->used;
+  unew->lset = FALSE;
+  unew->isPrivate = old->isPrivate;
+  unew->hasNameError = old->hasNameError;
+  unew->uses = filelocList_undefined;
+
+  unew->storageclass = old->storageclass;
+  unew->info = uinfo_copy (old->info, old->ukind);
+}
+
+
+uentry
+uentry_copy (uentry e)
+{
+  if (uentry_isValid (e))
+    {
+      uentry enew = uentry_alloc ();
+      DPRINTF (("copy: %s", uentry_unparseFull (e)));
+      uentry_copyInto (enew, e);
+      DPRINTF (("Here we are..."));
+      DPRINTF (("original: %s", uentry_unparseFull (e)));
+      DPRINTF (("copy: %s", uentry_unparse (enew)));
+      DPRINTF (("copy: %s", uentry_unparseFull (enew)));
+      return enew;
+    }
+  else
+    {
+      return uentry_undefined;
+    }
+}
+
+void
+uentry_setState (uentry res, uentry other)
+{
+  llassert (uentry_isValid (res));
+  llassert (uentry_isValid (other));
+
+  llassert (res->ukind == other->ukind);
+  llassert (res->ukind == KVAR);
+
+  res->sref = sRef_saveCopy (other->sref);
+  res->used = other->used;
+  filelocList_free (res->uses); 
+  res->uses = other->uses; 
+  other->uses = filelocList_undefined; 
+  res->lset = other->lset;
+}
+
+void
+uentry_mergeUses (uentry res, uentry other)
+{
+  llassert (uentry_isValid (res));
+  llassert (uentry_isValid (other));
+
+  res->used = other->used || res->used;
+  res->lset = other->lset || res->lset;
+  res->uses = filelocList_append (res->uses, other->uses);
+  other->uses = filelocList_undefined;
+}
+
+
+/*
+** This is a really ugly routine.
+**
+** gack...fix this one day.
+*/
+
+/*
+** flip == TRUE
+**   >> res is the false branch, other is the true branch (or continuation)
+** flip == FALSE
+**   >> res is the true branch, other is the false branch (or continutation)
+**
+** opt == TRUE if,
+**
+** 
+** if  ;
+**
+** References not effected by res are propagated from other.
+*/
+
+static void
+  branchStateError (/*@notnull@*/ uentry res, /*@notnull@*/ uentry other, 
+		    bool flip, clause cl, fileloc loc)
+{
+  if (optgenerror 
+      (FLG_BRANCHSTATE,
+       message ("%s %q is %s %s, but %s %s.",
+		ekind_capName (res->ukind), uentry_getName (res),
+		sRef_stateVerb (res->sref), clause_nameFlip (cl, flip),
+		sRef_stateAltVerb (res->sref), clause_nameFlip (cl, !flip)),
+       loc))
+    {
+      if (sRef_isDead (res->sref))
+	{
+	  sRef_showStateInfo (res->sref);
+	}
+      else if (sRef_isKept (res->sref))
+	{
+	  sRef_showAliasInfo (res->sref);
+	}
+      else /* dependent */
+	{
+	  sRef_showAliasInfo (res->sref);
+	  sRef_showAliasInfo (other->sref);
+	}
+      
+      sRef_setAliasKind (res->sref, AK_ERROR, fileloc_undefined);
+    }
+}
+
+static bool incompatibleStates (sRef rs, sRef os)
+{
+  alkind rk = sRef_getAliasKind (rs);
+  alkind ok = sRef_getAliasKind (os);
+
+  if (alkind_isError (rk) || alkind_isError (ok))
+    {
+      return FALSE;
+    }
+  else
+    {
+      return ((sRef_isDead (rs)
+	       || (alkind_isKept (rk) && !alkind_isKept (ok))
+	       || (alkind_isDependent (rk) 
+		   && !alkind_isDependent (ok) && !alkind_isTemp (ok)))
+	      && (sRef_isAllocated (os) || sRef_isStateDefined (os)));
+    }
+}
+
+static void
+  branchStateAltError (/*@notnull@*/ uentry res,
+		       /*@notnull@*/ uentry other, bool flip,
+		       clause cl, fileloc loc)
+{
+  if (optgenerror 
+      (FLG_BRANCHSTATE,
+       message ("%s %q is %s %s, but %s %s.",
+		ekind_capName (res->ukind), uentry_getName (res),
+		sRef_stateVerb (other->sref), clause_nameFlip (cl, flip),
+		sRef_stateAltVerb (other->sref), clause_nameFlip (cl, !flip)),
+       loc))
+    {
+      if (sRef_isDead (other->sref))
+	{
+	  sRef_showStateInfo (other->sref);
+	}
+      else /* kept */
+	{
+	  sRef_showAliasInfo (other->sref);
+	}
+      
+      sRef_setAliasKind (res->sref, AK_ERROR, fileloc_undefined);
+      sRef_setDefinedComplete (res->sref, fileloc_undefined);
+      
+      sRef_setAliasKind (other->sref, AK_ERROR, fileloc_undefined);
+      sRef_setDefinedComplete (other->sref, fileloc_undefined);
+    }
+}
+
+static bool notNull (sRef sr, bool flip)
+{
+  return (!sRef_definitelyNull (sr)
+	  && !(sRef_isKept (sr))
+	  && !(sRef_isDependent (sr))
+	  && !(flip ? usymtab_isProbableDeepNull (sr)
+	       : usymtab_isAltProbablyDeepNull (sr)));
+}
+    
+void
+uentry_mergeState (uentry res, uentry other, fileloc loc,
+		   bool mustReturn, bool flip, bool opt,
+		   clause cl)
+{
+  llassert (uentry_isValid (res));
+  llassert (uentry_isValid (other));
+
+  llassert (res->ukind == other->ukind);
+  llassert (res->ukind == KVAR);
+
+  DPRINTF (("Merge state: %s / %s", 
+	    uentry_unparse (res),
+	    uentry_unparse (other)));
+
+  if (sRef_isValid (res->sref))
+    {
+      if (!mustReturn)
+	{
+	  if (incompatibleStates (res->sref, other->sref))
+	    {
+	      if (sRef_isThroughArrayFetch (res->sref)
+		  && !context_getFlag (FLG_STRICTBRANCHSTATE))
+		{
+		  if (sRef_isKept (res->sref) || sRef_isKept (other->sref))
+		    {
+		      sRef_maybeKill (res->sref, loc);
+		    }
+		  else if (sRef_isPossiblyDead (other->sref))
+		    {
+		      sRef_maybeKill (res->sref, loc);
+		    }
+		  else
+		    {
+		      ;
+		    }
+		}
+	      else
+		{
+		  if (notNull (other->sref, flip))
+		    {
+		      if (sRef_isLocalParamVar (res->sref) 
+			  && (sRef_isLocalState (other->sref) 
+			      || sRef_isDependent (other->sref)))
+			{
+			  if (sRef_isDependent (res->sref))
+			    {
+			      sRef_setDependent (other->sref, loc);
+			    }
+			  else
+			    {
+			      sRef_setDefState (res->sref, SS_UNUSEABLE, loc);
+			    }
+			}
+		      else 
+			{
+			  branchStateError (res, other, flip, cl, loc);
+			}
+		    }
+		}
+	      
+	      if (sRef_isKept (res->sref))
+		{
+		  sRef_setKept (other->sref, loc);
+		}
+	    }
+	  else
+	    {
+	      if (incompatibleStates (other->sref, res->sref))
+		{
+		  if (notNull (res->sref, !flip))
+		    {
+		      if (sRef_isLocalParamVar (res->sref) 
+			  && (sRef_isDependent (res->sref)
+			      || sRef_isLocalState (res->sref)))
+			{
+			  if (sRef_isDependent (other->sref))
+			    {
+			      sRef_setDependent (res->sref, loc);
+			    }
+			  else
+			    {
+			      sRef_setDefState (res->sref, SS_UNUSEABLE, loc);
+			    }
+			}
+		      else
+			{
+			  if (sRef_isParam (other->sref))
+			    {
+			      /* 
+		              ** If the local variable associated
+			      ** with the param has the correct state,
+			      ** its okay.
+			      ** (e.g., free (s); s = new(); ...
+			      */
+
+			      uentry uvar = usymtab_lookupSafe (other->uname);
+
+			      if (uentry_isValid (uvar)
+				  && ((sRef_isDead (other->sref) 
+				       && sRef_isOnly (uvar->sref))
+				      || (sRef_isDependent (other->sref)
+					  && sRef_isOwned (uvar->sref))))
+				{
+				  /* no error */
+				}
+			      else
+				{
+				  branchStateAltError (res, other,
+						       flip, cl, loc);
+				}
+			    }
+			  else
+			    {
+			      branchStateAltError (res, other, 
+						   flip, cl, loc);
+			    }
+			}
+		    }
+		}
+
+	      if (sRef_isKept (other->sref))
+		{
+		  sRef_setKept (res->sref, loc);
+		}
+	    }
+	  
+	  if (opt)
+	    {
+	      DPRINTF (("Merge opt..."));
+	      sRef_mergeOptState (res->sref, other->sref, cl, loc);
+	      DPRINTF (("Done!"));
+	    }
+	  else
+	    {
+	      sRef_mergeState (res->sref, other->sref, cl, loc);
+	    }
+	}
+      else
+	{
+	  if (sRef_isModified (other->sref))
+	    {
+	      sRef_setModified (res->sref);
+	    }
+	}
+
+      if (cl == DOWHILECLAUSE)
+	{
+	  res->used = other->used || res->used;
+	  res->lset = other->lset || res->lset;
+	  res->uses = filelocList_append (res->uses, other->uses);
+	  other->uses = filelocList_undefined;
+	}
+      else
+	{
+	  if (sRef_isMacroParamRef (res->sref)
+	      && !uentry_isSefParam (other)
+	      && !uentry_isSefParam (res))
+	    {
+	      bool hasError = FALSE;
+	      
+	      if (bool_equal (res->used, other->used))
+		{
+		  res->used = other->used;
+		}
+	      else
+		{
+		  if (other->used && !flip)
+		    {
+		      hasError = 
+			optgenerror 
+			  (FLG_MACROPARAMS,
+			   message ("Macro parameter %q used in true clause, "
+				    "but not in false clause",
+				    uentry_getName (res)),
+			   uentry_whereDeclared (res));
+		    }
+		  else
+		    {	
+		      hasError = 
+			optgenerror 
+			  (FLG_MACROPARAMS,
+			   message ("Macro parameter %q used in false clause, "
+				    "but not in true clause",
+				    uentry_getName (res)),
+			   uentry_whereDeclared (res));
+		    }
+		  res->used = TRUE;
+		  
+		  if (hasError)
+		    {
+		      /* make it sef now, prevent more errors */
+		      res->info->var->kind = VKREFSEFPARAM;
+		    }
+		}
+	    }
+	  else
+	    {
+	      res->used = other->used || res->used;
+	      res->lset = other->lset || res->lset;
+	      res->uses = filelocList_append (res->uses, other->uses);
+	      other->uses = filelocList_undefined;
+	    }
+	}
+    }
+}
+
+void uentry_setUsed (uentry e, fileloc loc)
+{
+  static bool firstTime = TRUE;
+  static bool showUses = FALSE;
+  static bool exportLocal = FALSE;
+
+  if (firstTime)
+    {
+      /* need to track uses is FLG_SHOWUSES or FLG_EXPORTLOCAL is true */
+
+      showUses = context_getFlag (FLG_SHOWUSES); 
+      exportLocal = context_maybeSet (FLG_EXPORTLOCAL);
+
+      firstTime = FALSE;
+    }
+
+  if (uentry_isValid (e))
+    {
+      int dp;
+      
+      if (sRef_isMacroParamRef (e->sref))
+	{
+	  if (uentry_isYield (e) || uentry_isSefParam (e))
+	    {
+	      ;
+	    }
+	  else 
+	    {
+	      if (context_inConditional ())
+		{
+		  if (optgenerror
+		      (FLG_MACROPARAMS,
+		       message ("Macro parameter %q used in conditionally "
+				"executed code (may or may not be "
+				"evaluated exactly once)", 
+				uentry_getName (e)),
+		       loc))
+		    {
+		      e->info->var->kind = VKREFSEFPARAM;
+		    }
+		}
+	      else
+		{
+		  if ((e)->used)
+		    {
+		      if (optgenerror
+			  (FLG_MACROPARAMS,
+			   message ("Macro parameter %q used more than once", 
+				    uentry_getName (e)),
+			   uentry_whereDeclared (e)))
+			{
+			  e->info->var->kind = VKREFSEFPARAM;
+			}
+		    }
+		}
+	    }
+	}
+      
+      if ((dp = uentry_directParamNo (e)) >= 0)
+	{
+	  uentry_setUsed (usymtab_getParam (dp), loc);
+	}
+      
+      e->used = TRUE;
+      
+      if (!sRef_isLocalVar (e->sref))
+	{
+	  if (showUses)
+	    {
+	      e->uses = filelocList_add (e->uses, fileloc_copy (loc));
+	    }
+	  else 
+	    {
+	      if (exportLocal)
+		{
+		  if (context_inMacro ())
+		    {
+		      e->uses = filelocList_addUndefined (e->uses);
+		    }
+		  else 
+		    {
+		      e->uses = filelocList_addDifferentFile
+			(e->uses, 
+			 uentry_whereDeclared (e),
+			 loc);
+		    }
+		}
+	    }
+	}
+    }
+}
+
+bool uentry_isReturned (uentry u)
+{
+  return (uentry_isValid (u) && uentry_isVar (u) 
+	  && (u->info->var->kind == VKRETPARAM
+	      || u->info->var->kind == VKSEFRETPARAM));
+}
+
+/*@exposed@*/ sRef uentry_returnedRef (uentry u, exprNodeList args)
+{
+  llassert (uentry_isRealFunction (u));
+
+  if (ctype_isFunction (u->utype)
+      && sRef_isStateSpecial (uentry_getSref (u)))
+    {
+      specialClauses clauses = uentry_getSpecialClauses (u);
+      sRef res = sRef_makeNew (ctype_returnValue (u->utype), u->sref, u->uname);
+
+      sRef_setAllocated (res, g_currentloc);
+
+      specialClauses_postElements (clauses, cl)
+	{
+	  sRefSet refs = specialClause_getRefs (cl);
+	  sRefMod modf = specialClause_getEffectFunction (cl);
+
+	  sRefSet_elements (refs, el)
+	    {
+	      sRef base = sRef_getRootBase (el);
+
+	      if (sRef_isResult (base))
+		{
+		  if (modf != NULL)
+		    {
+		      sRef sr = sRef_fixBase (el, res);
+		      modf (sr, g_currentloc);
+		    }
+		}
+	      else
+		{
+		  ;
+		}
+	    } end_sRefSet_elements ;
+
+	} end_specialClauses_postElements ;
+
+      return res;
+    }
+  else
+    {
+      uentryList params;
+      alkind ak;
+      sRefSet prefs = sRefSet_new ();
+      sRef res = sRef_undefined;
+      int paramno = 0;
+      
+      params = uentry_getParams (u);
+      
+      uentryList_elements (params, current)
+	{
+	  if (uentry_isReturned (current))
+	    {
+	      if (exprNodeList_size (args) >= paramno)
+		{
+		  exprNode ecur = exprNodeList_nth (args, paramno);
+		  sRef tref = exprNode_getSref (ecur);
+		  
+		  if (sRef_isValid (tref))
+		    {
+		      sRef tcref = sRef_copy (tref);
+		      
+		      if (sRef_isDead (tcref))
+			{
+			  sRef_setDefined (tcref, g_currentloc);
+			  sRef_setOnly (tcref, g_currentloc);
+			}
+		      
+		      if (sRef_isRefCounted (tcref))
+			{
+			  /* could be a new ref now (but only if its returned) */
+			  sRef_setAliasKindComplete (tcref, AK_ERROR, g_currentloc);
+			}
+		      
+		      sRef_makeSafe (tcref);
+		      
+		      prefs = sRefSet_insert (prefs, tcref);
+		    }
+		}
+	    }
+	  
+	  paramno++;
+	} end_uentryList_elements ;
+      
+      if (sRefSet_size (prefs) > 0)
+	{
+	  nstate n = sRef_getNullState (u->sref);
+	  
+	  if (sRefSet_size (prefs) == 1)
+	    {
+	      res = sRefSet_choose (prefs);
+	    }
+	  else
+	    {
+	      res = sRefSet_mergeIntoOne (prefs);
+	    }
+	  
+	  if (nstate_isKnown (n))
+	    {
+	      sRef_setNullState (res, n, g_currentloc);
+	    }
+	}
+      else
+	{
+	  if (ctype_isFunction (u->utype))
+	    {
+	      res = sRef_makeNew (ctype_returnValue (u->utype), u->sref, u->uname);
+	    }
+	  else
+	    {
+	      res = sRef_makeNew (ctype_unknown, u->sref, u->uname);
+	    }
+	  
+	  if (sRef_isRefCounted (res))
+	    {
+	      sRef_setAliasKind (res, AK_NEWREF, g_currentloc);
+	    }
+	}
+      
+      if (sRef_getNullState (res) == NS_ABSNULL)
+	{
+	  ctype ct = ctype_realType (u->utype);
+	  
+	  if (ctype_isAbstract (ct))
+	    {
+	      sRef_setNotNull (res, g_currentloc);
+	    }
+	  else
+	    {
+	      if (ctype_isUser (ct))
+		{
+		  sRef_setStateFromUentry (res, usymtab_getTypeEntry (ctype_typeId (ct)));
+		}
+	      else
+		{
+		  sRef_setNotNull (res, g_currentloc);
+		}
+	    }
+	}
+      
+      if (sRef_isRefCounted (res))
+	{
+	  sRef_setAliasKind (res, AK_NEWREF, g_currentloc);
+	}
+      else if (sRef_isKillRef (res))
+	{
+	  sRef_setAliasKind (res, AK_REFCOUNTED, g_currentloc);
+	}
+      else
+	{
+	  ;
+	}
+      
+      ak = sRef_getAliasKind (res);
+      
+      if (alkind_isImplicit (ak))
+	{
+	  sRef_setAliasKind (res, 
+			     alkind_fixImplicit (ak),
+			     g_currentloc);
+	}
+      
+      sRefSet_free (prefs);
+      
+      return res;
+    }
+}
+
+static bool uentry_isRefCounted (uentry ue)
+{
+  ctype ct = uentry_getType (ue);
+
+  if (ctype_isFunction (ct))
+    {
+      return (ctype_isRefCounted (ctype_returnValue (ct)));
+    }
+  else
+    {
+      return (ctype_isRefCounted (ct));
+    }
+}
+
+/*
+** old was declared yield in the specification.  
+** new is declared in the iter implementation.
+*/
+
+void uentry_checkYieldParam (uentry old, uentry unew)
+{
+  cstring name;
+
+  llassert (uentry_isVariable (old));
+  llassert (uentry_isVariable (unew));
+
+  unew->info->var->kind = VKYIELDPARAM;
+  (void) checkTypeConformance (old, unew, TRUE);
+  checkVarConformance (old, unew, TRUE, FALSE);
+
+  /* get rid of param marker */
+
+  name = uentry_getName (unew);
+  cstring_free (unew->uname);
+  unew->uname = name;
+  unew->info->var->kind = VKREFYIELDPARAM;
+
+  uentry_setUsed (old, fileloc_undefined);
+  uentry_setUsed (unew, fileloc_undefined);
+}
+
+/*@observer@*/ cstring
+uentry_ekindName (uentry ue)
+{
+  if (uentry_isValid (ue))
+    {
+      switch (ue->ukind)
+	{
+	case KINVALID:
+	  return cstring_makeLiteralTemp ("");
+	case KDATATYPE: 
+	  return cstring_makeLiteralTemp ("Datatype");
+	case KENUMCONST:
+	  return cstring_makeLiteralTemp ("Enum member");
+	case KCONST:  
+	  return cstring_makeLiteralTemp ("Constant");
+	case KVAR:      
+	  if (uentry_isParam (ue))
+	    {
+	      return cstring_makeLiteralTemp ("Parameter");
+	    }
+	  else if (uentry_isExpandedMacro (ue))
+	    {
+	      return cstring_makeLiteralTemp ("Expanded macro");
+	    }
+	  else
+	    {
+	      return cstring_makeLiteralTemp ("Variable");
+	    }
+	case KFCN:   
+	  return cstring_makeLiteralTemp ("Function");
+	case KITER: 
+	  return cstring_makeLiteralTemp ("Iterator");
+	case KENDITER:
+	  return cstring_makeLiteralTemp ("Iterator finalizer");
+	case KSTRUCTTAG:
+	  return cstring_makeLiteralTemp ("Struct tag");
+	case KUNIONTAG:
+	  return cstring_makeLiteralTemp ("Union tag");
+	case KENUMTAG: 
+	  return cstring_makeLiteralTemp ("Enum tag");
+	case KELIPSMARKER: 
+	  return cstring_makeLiteralTemp ("Optional parameters");
+	}
+    }
+  else
+    {
+      return cstring_makeLiteralTemp ("");
+    }
+
+  BADEXIT;
+}
+
+void uentry_setHasNameError (uentry ue)
+{
+  llassert (uentry_isValid (ue));
+
+  ue->hasNameError = TRUE;
+}
+
+void uentry_checkName (uentry ue)
+{
+  if (uentry_isValid (ue) 
+      && !uentry_isElipsisMarker (ue)
+      && context_getFlag (FLG_NAMECHECKS)
+      && !ue->hasNameError 
+      && !uentry_isEndIter (ue)
+      && !fileloc_isBuiltin (uentry_whereLast (ue))
+      && (uentry_isExpandedMacro (ue) || !uentry_isForward (ue)))
+    {
+      
+      if (uentry_isPriv (ue))
+	{
+	  ; /* any checks here? */
+	}
+      else if (fileloc_isExternal (uentry_whereDefined (ue)))
+	{
+	  ; /* no errors for externals */
+	}
+      else
+	{
+	  int scope;
+	  
+	  if (uentry_isExpandedMacro (ue))
+	    {
+	      scope = globScope;
+	    }
+	  else
+	    {
+	      if (uentry_isExpandedMacro (ue))
+		{
+		  scope = fileScope;
+		}
+	      else if (uentry_isVariable (ue))
+		{
+		  sRef sr = uentry_getSref (ue);
+
+		  if (sRef_isValid (sr))
+		    {
+		      scope = sRef_getScope (sr);
+		    }
+		  else
+		    {
+		      scope = fileScope; 
+		    }
+		}
+	      else if (uentry_isFunction (ue)
+		       || uentry_isIter (ue)
+		       || uentry_isEndIter (ue)
+		       || uentry_isConstant (ue))
+		{
+		  scope = uentry_isStatic (ue) ? fileScope : globScope;
+		}
+	      else /* datatypes, etc. must be global */
+		{
+		  scope = globScope;
+		}
+	      
+	      usymtab_checkDistinctName (ue, scope);
+	    }
+
+	  if (context_getFlag (FLG_CPPNAMES)) 
+	    {
+	      if (checkCppName (uentry_rawName (ue), uentry_whereLast (ue)))
+		{
+		  uentry_setHasNameError (ue);
+		}
+	    }
+
+	  if (scope == globScope)
+	    {
+	      checkGlobalName (ue);
+
+	      if (context_getFlag (FLG_ANSIRESERVED))
+		{
+		  if (uentry_hasName (ue)
+		      && !uentry_isAnyTag (ue))
+		    {
+		      if (checkAnsiName (uentry_rawName (ue),
+					 uentry_whereLast (ue)))
+			{
+			  uentry_setHasNameError (ue);
+			}
+		    }
+		}
+	    }
+	  else
+	    {
+	      checkLocalName (ue);
+	      
+	      if (context_getFlag (FLG_ANSIRESERVEDLOCAL))
+		{
+		  if (uentry_hasName (ue)
+		      && !uentry_isAnyTag (ue))
+		    {
+		      if (checkAnsiName (uentry_rawName (ue),
+					 uentry_whereLast (ue)))
+			{
+			  uentry_setHasNameError (ue);
+			}
+		    }
+		}
+	    }
+
+	  DPRINTF (("Check prefix: %s", uentry_unparse (ue)));
+	  checkPrefix (ue);
+	}
+    }
+}
+
+/*@exposed@*/ uentry uentry_makeUnrecognized (cstring c, /*@keep@*/ fileloc loc)
+{
+  uentry ue;
+  fileloc tloc;
+
+  /*
+  ** Can't but unrecognized ids in macros in global scope, because srefs will break! */
+  if (!context_inMacro ())
+    {
+      sRef_setGlobalScopeSafe ();
+    }
+
+  ue = uentry_makeVariable (c, ctype_unknown, loc, FALSE);
+  uentry_setUsed (ue, loc);		  
+  
+  tloc = fileloc_createExternal ();
+  uentry_setDefined (ue, tloc);
+  fileloc_free (tloc);
+  uentry_setHasNameError (ue);
+  
+  if (context_getFlag (FLG_REPEATUNRECOG))
+    {
+      uentry_markOwned (ue);
+    }
+  else
+    {
+      ue = usymtab_supReturnFileEntry (ue);
+    }
+  
+  if (!context_inMacro ())
+    {
+      sRef_clearGlobalScopeSafe ();
+    }
+
+  return ue;
+}
+
+
+
+
diff --git a/src/uentryList.c b/src/uentryList.c
new file mode 100644
index 0000000..9979d06
--- /dev/null
+++ b/src/uentryList.c
@@ -0,0 +1,848 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** uentryList.c (from slist_template.c)
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+/*@only@*/ /*@notnull@*/ uentryList
+uentryList_new ()
+{
+  uentryList s = (uentryList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspace = uentryListBASESIZE;
+  s->elements = (uentry *) 
+    dmalloc (sizeof (*s->elements) * uentryListBASESIZE);
+  s->current = 0;
+
+  return (s);
+}
+
+/*@only@*/ uentryList
+uentryList_single (/*@keep@*/ uentry el)
+{
+  uentryList s = (uentryList) dmalloc (sizeof (*s));
+  
+  s->nelements = 1;
+  s->nspace = uentryListBASESIZE - 1;
+  s->elements = (uentry *) dmalloc (sizeof (*s->elements) * uentryListBASESIZE);
+  
+  s->elements[0] = el;
+  s->current = 0;
+
+  return (s);
+}
+
+static void
+uentryList_grow (uentryList s)
+{
+  int i;
+  uentry *newelements;
+
+  llassert (!uentryList_isUndefined (s));
+
+  s->nspace += uentryListBASESIZE; 
+  
+  newelements = (uentry *) dmalloc (sizeof (*newelements) 
+				    * (s->nelements + s->nspace));
+    
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+  
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+void uentryList_clear (uentryList s)
+{
+  if (uentryList_isUndefined (s))
+    {
+      ;
+    }
+  else
+    {
+      s->nspace += s->nelements;
+      s->nelements = 0;
+    }
+}
+
+uentryList uentryList_add (uentryList s, /*@keep@*/ uentry el)
+{
+  if (uentryList_isUndefined (s))
+    {
+      s = uentryList_new ();
+    }
+
+  if (s->nspace <= 0)
+    uentryList_grow (s);
+  
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+
+  return s;
+}
+
+/*@only@*/ cstring
+  uentryList_unparse (uentryList s)
+{
+  cstring st = cstring_undefined;
+  int i;
+  
+  if (uentryList_isDefined (s))
+    {
+      for (i = 0; i < uentryList_size (s); i++)
+	{
+	  if (i == 0)
+	    {
+	      st = message ("%q;", uentry_unparse (s->elements[i]));
+	    }
+	  else
+	    st = message ("%q %q;", st, uentry_unparse (s->elements[i]));
+	}
+    }
+  
+  return (st);
+}
+
+/*@unused@*/ /*@only@*/ cstring
+  uentryList_unparseFull (uentryList s)
+{
+  cstring st = cstring_undefined;
+  int i;
+  
+  if (uentryList_isDefined (s))
+    {
+      for (i = 0; i < uentryList_size (s); i++)
+	{
+	  if (i == 0)
+	    {
+	      st = message ("%q;", uentry_unparseFull (s->elements[i]));
+	    }
+	  else
+	    {
+	      st = message ("%q %q;", st, uentry_unparseFull (s->elements[i]));
+	    }
+	}
+    }
+  
+  return (st);
+}
+
+cstring uentryList_unparseParams (uentryList s)
+{
+  int i;
+  cstring st = cstring_undefined;
+
+  
+  if (uentryList_isUndefined (s))
+    {
+      return st;
+    }
+  else if (uentryList_isVoid (s))
+    {
+      return (cstring_makeLiteral ("void"));
+    }
+  else
+    {
+      for (i = 0; i < uentryList_size (s); i++)
+	{
+	  if (i == 0)
+	    {
+	      st = message ("%s", ctype_unparse (uentry_getType (s->elements[i])));
+	    }
+	  else
+	    {
+	      st = message ("%q, %s", st, ctype_unparse (uentry_getType (s->elements[i])));
+	    }
+	}
+      
+      return st;
+    }
+}
+
+bool uentryList_matchParams (uentryList p1, uentryList p2, bool force, bool arg)
+{
+  int sz1 = uentryList_size (p1);
+  int sz2 = uentryList_size (p2);
+  int i;
+  
+  if (p1 == p2) return TRUE;
+
+  if (uentryList_isMissingParams (p1) || uentryList_isMissingParams (p2))
+    {
+      return TRUE;
+    }
+
+  if (sz1 != sz2)
+    return FALSE;
+
+  for (i = 0; i < sz1; i++)
+    {
+      if (!ctype_genMatch (uentry_getType (p1->elements[i]), 
+			   uentry_getType (p2->elements[i]), 
+			   force, arg, FALSE))
+	{
+	  return FALSE;
+	}
+    }
+
+  return TRUE;
+}
+
+/*@only@*/ cstring
+uentryList_unparseAbbrev (uentryList p)
+{
+  bool first = TRUE;
+  cstring s = cstring_undefined;
+  int i = 0;
+  
+  if (uentryList_isUndefined (p))
+    return s;
+
+  if (uentryList_size (p) == 0)
+    return cstring_makeLiteral ("void");
+
+  for (i = 0; i < p->nelements && i < PRINTBREADTH; i++)
+    {
+      if (first)
+	{
+	  s = message ("%q;", uentry_unparseAbbrev (p->elements[i]));
+	  first = FALSE;
+	}
+      else
+	{
+	  s = message ("%q %q;", s, uentry_unparseAbbrev (p->elements[i]));
+	}
+    }
+  
+  if (i != uentryList_size (p))
+    s = message ("%q, ...", s);
+  
+  return (s);
+}
+
+static int
+uentryList_lookupDirectName (uentryList s, cstring name)
+{
+  if (uentryList_isDefined (s))
+    {
+      int i;
+      
+      for (i = 0; i < uentryList_size (s); i++)
+	{
+	  if (cstring_equal (name, uentry_rawName (s->elements[i])))
+	    {
+	      return i;
+	    }
+	}
+    }
+
+   return -1;
+}
+
+int
+uentryList_lookupRealName (uentryList s, cstring name)
+{
+  if (uentryList_isDefined (s))
+    {
+      int i;
+      
+      for (i = 0; i < uentryList_size (s); i++)
+	{
+	  cstring uname = uentry_getName (s->elements[i]);
+
+	  if (cstring_equal (name, uname))
+	    {
+	      cstring_free (uname);
+	      return i;
+	    }      
+
+	  cstring_free (uname);
+	}
+    }
+
+   return -1;
+}
+
+uentryList uentryList_copy (uentryList s)
+{
+  
+  if (uentryList_isDefined (s))
+    {
+      uentryList t = (uentryList) dmalloc (sizeof (*t));
+      int i;
+      
+      t->nelements = s->nelements;
+      t->nspace = 0;
+      t->current = s->current;
+      
+      if (s->nelements > 0)
+	{
+	  t->elements = (uentry *) dmalloc (sizeof (*t->elements) * t->nelements);
+	  
+	  for (i = 0; i < s->nelements; i++) 
+	    {
+	      	      t->elements[i] = uentry_copy (s->elements[i]); 
+	      	    }
+	}
+      else
+	{
+	  t->elements = NULL;
+	}
+
+      return t;
+    }
+  else
+    {
+      return uentryList_undefined;
+    }
+}
+
+void
+uentryList_free (uentryList s)
+{
+  
+  if (!uentryList_isUndefined (s)) 
+    {
+      int i;
+
+      for (i = 0; i < s->nelements; i++)
+	{
+	  uentry_free (s->elements[i]);  
+	}
+
+      sfree (s->elements);
+      sfree (s);
+    }
+}
+
+bool
+uentryList_isVoid (uentryList cl)
+{
+  if (cl != NULL && cl->nelements == 1)
+    {
+      return (ctype_isVoid (uentry_getType (cl->elements[0])));
+    }
+  return FALSE;
+}
+
+/*@exposed@*/ uentry
+uentryList_getN (uentryList p, int n)
+{
+  llassert (uentryList_isDefined (p));
+
+  if (n < 0 || (n >= uentryList_size (p)))
+    {
+      llcontbug (message ("uentryList_getN: out of range: %d (size %d)",
+			  n, uentryList_size (p)));
+      return uentry_undefined;
+    }
+
+  return (p->elements[n]);
+}
+
+void uentryList_fixMissingNames (uentryList cl)
+{
+  uentryList_elements (cl, ce)
+    {
+      if (!uentry_hasRealName (ce))
+	{
+	  ctype ct = uentry_getType (ce);
+
+	  if (ctype_isUA (ct))
+	    {
+	      uentry_setName (ce, usymtab_getTypeEntryName (ctype_typeId (ct)));
+	    }
+	  else
+	    {
+	      llbug (message ("uentryList_fixMissingNames: not UA: %s", 
+			      ctype_unparse (ct)));
+	    }
+
+	  uentry_setType (ce, ctype_int);
+	}
+    } end_uentryList_elements;
+}
+
+void uentryList_fixImpParams (uentryList cl)
+{
+  
+  if (context_getFlag (FLG_PARAMIMPTEMP))
+    {
+      uentryList_elements (cl, ce)
+	{
+	  sRef s = uentry_getSref (ce);
+	  alkind ak = sRef_getAliasKind (s);
+
+	  if (alkind_isUnknown (ak) || alkind_isImplicit (ak))
+	    {
+	      exkind ek = sRef_getExKind (s);
+
+	      if (exkind_isKnown (ek))
+		{
+		  sRef_setAliasKind (s, AK_IMPDEPENDENT, fileloc_undefined);
+		}
+	      else
+		{
+		  sRef_setAliasKind (s, AK_IMPTEMP, fileloc_undefined);
+		}
+	      	    }
+	  else
+	    {
+	      	    }
+	} end_uentryList_elements;
+    }
+}
+
+int
+uentryList_compareParams (uentryList s, uentryList t)
+{
+  int i, sz;
+
+  if (s == t) return 0;
+
+  if (uentryList_isUndefined (s)) return 1;
+  if (uentryList_isUndefined (t)) return -1;
+  
+  sz = uentryList_size (s);
+  
+  INTCOMPARERETURN (uentryList_size (t), sz);
+  
+  for (i = 0; i < sz; i++)
+    {
+      COMPARERETURN (uentry_compare (s->elements[i], t->elements[i]));
+    }
+  
+  return 0;
+}
+
+int
+uentryList_compareStrict (uentryList s, uentryList t)
+{
+  int i, sz;
+
+  if (s == t) 
+    {
+      return 0;
+    }
+  
+  if (uentryList_isMissingParams (s))
+    {
+      if (uentryList_isMissingParams (t))
+	{
+	  return 0;
+	}
+      else
+	{
+	  return 1;
+	}
+    }
+  else 
+    {
+      if (uentryList_isMissingParams (t))
+	{
+	  return -1;
+	}
+      else
+	{
+	  sz = uentryList_size (s);
+	  
+	  INTCOMPARERETURN (uentryList_size (t), sz);
+	  
+	  for (i = 0; i < sz; i++)
+	    {
+	      COMPARERETURN (uentry_compareStrict (s->elements[i], t->elements[i]));
+	    }
+	  
+	  return 0;
+	}
+    }
+}
+
+int
+uentryList_compareFields (uentryList s, uentryList t)
+{
+  int i, sz;
+
+  if (s == t) return 0;
+
+  if (uentryList_isUndefined (s))
+    return 1;
+  if (uentryList_isUndefined (t))
+    return -1;
+  
+  sz = uentryList_size (s);
+  
+  if (uentryList_size (t) != sz)
+    {
+      return (int_compare (sz, uentryList_size (t)));
+    }
+  
+  for (i = 0; i < sz; i++)
+    {
+      uentry se = s->elements[i];
+      uentry te = t->elements[i];
+      int namecmp = cstring_compare (uentry_rawName (se), uentry_rawName (te));
+
+      if (namecmp == 0)
+	{
+	  int uc = uentry_compare (s->elements[i], t->elements[i]);
+	  
+	  if (uc != 0) 
+	    { 
+	      return uc; 
+	    }
+	}
+      else
+	{
+	  return (namecmp);
+	}
+    }
+
+  return 0;
+}
+
+/*@exposed@*/ uentry 
+uentryList_current (uentryList s)
+{
+  llassert (uentryList_isDefined (s));
+  llassert (!(s->current < 0 || (s->current >= s->nelements)));
+  return (s->elements[s->current]);
+}
+
+cstring
+uentryList_dumpParams (uentryList s)
+{
+  cstring st = cstring_undefined;
+
+  if (uentryList_isUndefined (s)) return st;
+  
+  uentryList_elements (s, current)
+    {
+      st = message ("%q%q,", st, uentry_dumpParam (current));
+  } end_uentryList_elements;
+
+  return st;
+}
+
+/*@only@*/ cstring
+uentryList_dumpFields (uentryList s)
+{
+  cstring st = cstring_undefined;
+
+  if (uentryList_isUndefined (s)) return st;
+
+  uentryList_elements (s, current)
+  {
+    if (!uentry_isVariable (current))
+      {
+	llassert (uentry_isFunction (current));
+	st = message ("%q!%q,", st, uentry_dump (current));
+      }
+    else
+      {
+	st = message ("%q%q,", st, uentry_dump (current));
+      }
+  } end_uentryList_elements;
+  
+  return st;
+}
+
+/*@only@*/ uentryList 
+uentryList_undumpFields (char **s, fileloc loc)
+{
+  uentryList ul = uentryList_new ();
+
+  while (**s != '\0' && **s != '}') 
+    {
+      if (**s == '!')
+	{
+	  checkChar (s, '!');
+	  ul = uentryList_add (ul, uentry_undump (ekind_function, loc, s));
+	}
+      else
+	{
+	  ul = uentryList_add (ul, uentry_undump (ekind_variable, loc, s));
+	}
+      checkChar (s, ',');
+    }
+
+  checkChar (s, '}');
+  return ul;
+}
+
+/*@only@*/ uentryList
+uentryList_undump (char **s)
+{
+  char c;
+  uentryList pn = uentryList_new ();
+  int paramno = 0;
+
+  c = **s;
+
+  while (c != '#' && c != '@' && c != ')')
+    {
+      uentry ue = uentry_undump (ekind_variable, g_currentloc, s);
+      
+      
+      if (!uentry_isUndefined (ue))
+	{
+	  pn = uentryList_add (pn, ue);
+	}
+      else
+	{
+	  uentry_free (ue);
+	}
+
+      checkChar (s, ',');
+      c = **s;
+      paramno++;
+    }
+
+  checkChar (s, ')');
+  return pn;
+}
+
+void 
+uentryList_reset (uentryList s)
+{
+  if (uentryList_isUndefined (s)) return;
+  s->current = 0;
+}
+
+bool
+uentryList_isFinished (uentryList s)
+{
+  if (uentryList_isUndefined (s)) return TRUE;
+  return (s->current > s->nelements - 1);
+}
+
+void 
+uentryList_advanceSafe (uentryList s)
+{
+  if (uentryList_isUndefined (s)) return;
+
+  s->current++;
+
+  if (s->current > s->nelements)
+    {
+      s->current = s->nelements;
+    }
+}
+
+int
+uentryList_size (uentryList s)
+{
+  if (uentryList_isUndefined (s)) return 0;
+
+  if (s->nelements == 1 && ctype_isVoid (uentry_getType (s->elements[0])))
+    return 0;
+  
+  return s->nelements;
+}
+
+bool
+uentryList_isMissingParams (uentryList s)
+{
+  return (uentryList_isUndefined (s) || s->nelements == 0);
+}
+
+bool uentryList_hasReturned (uentryList ul)
+{
+  uentryList_elements (ul, current)
+    {
+      if (uentry_isReturned (current)) return TRUE;
+    } end_uentryList_elements;
+
+  return FALSE;
+}
+
+/*@exposed@*/ uentry 
+uentryList_lookupField (uentryList f, cstring name)
+{
+  int i = uentryList_lookupDirectName (f, name);
+
+  if (i >= 0)
+    {
+      return (uentryList_getN (f, i));
+    }
+  else
+    {
+      return uentry_undefined;
+    }
+}
+
+/*@only@*/ uentryList
+  uentryList_mergeFields (/*@only@*/ uentryList f1, /*@only@*/ uentryList f2)
+{
+  if (uentryList_isUndefined (f1))
+    {
+      return  (f2);
+    }
+
+  if (uentryList_isDefined (f2))
+    {
+      uentryList_elements (f2, current)
+	{
+	  uentry old = uentryList_lookupField (f1, uentry_rawName (current));
+	  
+	  if (uentry_isValid (old))
+	    {
+	      voptgenerror
+		(FLG_SYNTAX,
+		 message ("Field name reused: %s", uentry_rawName (current)),
+		 uentry_whereDefined (current));
+	      llgenmsg (message ("Previous use of %s", uentry_rawName (current)),
+			uentry_whereDefined (old));
+	    }
+	  
+	  /* okay to use exposed current since f2 is killed */
+	  /*@-exposetrans@*/ /*@-dependenttrans@*/
+	  f1 = uentryList_add (f1, current); 
+	  /*@=exposetrans@*/ /*@=dependenttrans@*/
+
+	} end_uentryList_elements;
+      
+      sfree (f2->elements);
+      sfree (f2);
+    }
+
+  return (f1);
+}
+
+void
+uentryList_showFieldDifference (uentryList p1, uentryList p2)
+{
+  uentry cp1, cp2;
+  int index;
+
+  llassert (NOALIAS (p1, p2));
+  llassert (uentryList_isDefined (p1));
+  llassert (uentryList_isDefined (p2));
+  
+  for (index = 0; index < p1->nelements; index++)
+    {
+      cp1 = p1->elements[index];
+
+      if (index == p2->nelements)
+	{
+	  llgenindentmsg
+	    (message ("Field present in %s, missing in %rdeclaration: %q", 
+		      uentry_specDeclName (cp1),
+		      uentry_isDeclared (cp1),
+		      uentry_unparse (cp1)),
+	     uentry_whereEither (cp1));
+	  return;
+	}
+	  
+      cp2 = p2->elements[index];
+
+      if (!(cstring_equal (uentry_rawName (cp1), uentry_rawName (cp2))))
+	{
+	  llgenindentmsg 
+	    (message ("Field %s in %s corresponds to %s in %rdeclaration", 
+		      uentry_rawName (cp1),
+		      uentry_specOrDefName (cp1),
+		      uentry_rawName (cp2),
+		      uentry_isCodeDefined (cp1)),
+	     uentry_whereDefined (cp2));
+	  uentry_showWhereLastPlain (cp1);
+	  return;
+	}
+      else 
+	{
+	  if (!ctype_match (uentry_getType (cp1), uentry_getType (cp2)))
+	    {
+	      llgenindentmsg 
+		(message ("Field %s %rdeclared as %s, %s as %s",
+			  uentry_rawName (cp2),
+			  uentry_isCodeDefined (cp1),
+			  ctype_unparse (uentry_getType (cp1)),
+			  uentry_specOrDefName (cp2),
+			  ctype_unparse (uentry_getType (cp2))),
+		 uentry_whereDefined (cp2));
+	      uentry_showWhereLastPlain (cp1);
+	      return;
+	    }
+	}
+    }
+
+  if (index != p2->nelements)
+    {
+      cp2 = p2->elements[index];
+
+      llgenindentmsg 
+	(message ("Extra field in new declaration: %q",
+		  uentry_unparse (cp2)),
+	 uentry_whereEither (cp2));
+
+      return;
+    }
+
+  llbug (message ("uentryList_showFieldDifference: match: %q / %q",
+		  uentryList_unparse (p1), uentryList_unparse (p2)));
+}
+
+bool
+uentryList_matchFields (uentryList p1, uentryList p2)
+{
+  int index;
+  uentry cp1, cp2;
+
+  if (p1 == p2) 
+    {
+      return (TRUE);
+    }
+
+  if (uentryList_isEmpty (p1) || uentryList_isEmpty (p2))
+    {
+      return (TRUE);
+    }
+
+  if (uentryList_size (p1) != uentryList_size (p2))
+    {
+      return FALSE;
+    }
+
+  for (index = 0; index < p1->nelements; index++)
+    {
+      cp1 = p1->elements[index];
+      cp2 = p2->elements[index];
+
+      if (!(cstring_equal (uentry_rawName (cp1), uentry_rawName (cp2))
+	    && (ctype_almostEqual (uentry_getType (cp1), uentry_getType (cp2)))))
+	{     /* was ctype_match! */
+	  return FALSE;
+	}
+    }
+
+  return TRUE;
+}
+
diff --git a/src/usymIdSet.c b/src/usymIdSet.c
new file mode 100644
index 0000000..661390f
--- /dev/null
+++ b/src/usymIdSet.c
@@ -0,0 +1,388 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** usymIdSet.c
+**
+** based on set_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+usymIdSet
+usymIdSet_new ()
+{
+  return usymIdSet_undefined;
+}
+
+static /*@notnull@*/ /*@only@*/ usymIdSet
+usymIdSet_newEmpty (void)
+{
+  usymIdSet s = (usymIdSet) dmalloc (sizeof (*s));
+  
+  s->entries = 0;
+  s->nspace = usymIdSetBASESIZE;
+  s->elements = (usymId *) dmalloc (sizeof (*s->elements) * usymIdSetBASESIZE);
+
+  return (s);
+}
+
+static void
+usymIdSet_grow (/*@notnull@*/ usymIdSet s)
+{
+  int i;
+  usymId *newelements;
+
+  s->nspace = usymIdSetBASESIZE;
+  newelements = (usymId *) dmalloc (sizeof (*newelements) * (s->entries + s->nspace));
+
+  for (i = 0; i < s->entries; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+/*@only@*/ usymIdSet
+usymIdSet_single (usymId t)
+{
+  usymIdSet s = (usymIdSet) dmalloc (sizeof (*s));
+   
+  s->entries = 1;
+  s->nspace = usymIdSetBASESIZE - 1;
+  s->elements = (usymId *) dmalloc (sizeof (*s->elements) * usymIdSetBASESIZE);
+  s->elements[0] = t;
+
+  return (s);
+}
+
+static usymIdSet 
+  usymIdSet_insert (/*@returned@*/ usymIdSet s, usymId el)
+{
+  if (usymIdSet_isUndefined (s))
+    {
+      s = usymIdSet_newEmpty ();
+    }
+
+  if (usymIdSet_member (s, el))
+    {
+      return s;
+    }
+  else
+    {
+      if (s->nspace <= 0)
+	usymIdSet_grow (s);
+      s->nspace--;
+      s->elements[s->entries] = el;
+      s->entries++;
+      return s;
+    }
+}
+
+static usymIdSet
+usymIdSet_copy (/*@notnull@*/ usymIdSet s)
+{
+  int size = s->entries + 1;
+  usymIdSet t = (usymIdSet) dmalloc (sizeof (*t));
+  int i;
+  
+  t->entries = s->entries;
+  t->nspace = 1;
+  t->elements = (usymId *) dmalloc (sizeof (*t->elements) * size);
+  
+  for (i = 0; i < s->entries; i++)
+    {
+      t->elements[i] = s->elements[i];
+    }
+  
+  return t;
+}
+
+usymIdSet
+usymIdSet_add (usymIdSet s, usymId el)
+{
+  if (usymIdSet_isDefined (s))
+    {
+      llassert (!usymIdSet_member (s, el));
+      
+      return (usymIdSet_insert (usymIdSet_copy (s), el));
+    }
+  else
+    {
+      return (usymIdSet_single (el));
+    }
+}
+
+usymIdSet
+usymIdSet_removeFresh (/*@temp@*/ usymIdSet s, usymId el)
+{
+  if (usymIdSet_isDefined (s))
+    {
+      usymIdSet t = usymIdSet_newEmpty ();
+      int i;
+      
+      for (i = 0; i < s->entries; i++)
+	{
+	  if (!usymId_equal (el, s->elements[i]))
+	    {
+	      t = usymIdSet_insert (t, s->elements[i]);
+	    }
+	}
+      
+      return t;
+    }
+  else
+    {
+      return usymIdSet_undefined;
+    }
+}
+
+usymIdSet
+usymIdSet_newUnion (usymIdSet s1, usymIdSet s2)
+{
+  usymIdSet t = usymIdSet_new ();
+
+  usymIdSet_elements (s1, current)
+    {
+      t = usymIdSet_insert (t, current);
+    } end_usymIdSet_elements;
+
+  usymIdSet_elements (s2, current)
+    {
+      t = usymIdSet_insert (t, current);
+    } end_usymIdSet_elements;
+
+  return t;
+}
+
+/*
+** returns a new usymIdSet comprised of all elements
+** in s which are not in t.
+*/
+
+usymIdSet
+usymIdSet_subtract (usymIdSet s, usymIdSet t)
+{
+  usymIdSet r = usymIdSet_new ();
+
+  usymIdSet_elements (s, current)
+    {
+      if (!usymIdSet_member (t, current))
+	{
+	  r = usymIdSet_insert (r, current);
+	}
+    } end_usymIdSet_elements;
+
+  return r;
+}
+
+bool
+usymIdSet_member (usymIdSet s, usymId el)
+{
+  if (usymIdSet_isUndefined (s))
+    {
+      return FALSE;
+    }
+  else
+    {
+      int i;
+      
+      for (i = 0; i < s->entries; i++)
+	{
+	  if (usymId_equal (el, s->elements[i]))
+	    return TRUE;
+	}
+      return FALSE;
+    }
+}
+
+void
+usymIdSet_free (/*@only@*/ usymIdSet s)
+{
+  if (!usymIdSet_isUndefined (s))
+    {
+      int i;
+      for (i = 0; i < s->entries; i++)
+	{
+	  /*      usymId_free (s->elements[i]); */
+	}
+      
+      sfree (s->elements); 
+      sfree (s);
+    }
+}
+
+cstring usymIdSet_dump (usymIdSet lset)
+{
+  cstring st = cstring_undefined;
+  
+  if (!usymIdSet_isUndefined (lset))
+    {
+      bool first = TRUE;
+      int i;
+      
+      for (i = 0; i < lset->entries; i++)
+	{
+	  usymId current = lset->elements[i];
+	  
+	  if (!usymId_isInvalid (current))
+	    {
+	      current = usymtab_convertId (current);
+
+	      if (first)
+		{
+		  st = message ("%d", current);
+		  first = FALSE;
+		}
+	      else
+		{
+		  st = message ("%q,%d", st, current);
+		}
+	    }
+	}
+    }
+  return (st);
+}
+
+/*
+** end of list is '@' or '\0'
+*/
+
+usymIdSet
+usymIdSet_undump (char **s)
+{
+  usymIdSet t = usymIdSet_new ();
+  char *olds = *s;
+  char c;
+
+  
+  while ((c = **s) != '\0' && c != '@' && c != '#' && c != '\n')
+    {
+      int tid = 0;
+
+      while (c != '@' && c != '#' && c != ',' && c != '\0' && c != '\n')
+	{
+	  while (c >= '0' && c <= '9')
+	    {
+	      tid *= 10;
+	      tid += (int) (c - '0');
+	      (*s)++;
+	      c = **s;
+	    }
+
+	  if (*s == olds)
+	    {
+	      llcontbug (message ("usymIdSet_undump: loop: %s", 
+				  cstring_fromChars (*s)));
+
+	      while (**s != '\0') 
+		{
+		  (*s)++;
+		}
+
+	      /*@innerbreak@*/ break;
+	    }
+
+	  olds = *s;
+	  
+	  t = usymIdSet_insert (t, usymId_fromInt (tid));
+	}
+
+      if (c == ',')
+	{
+	  (*s)++;
+	}
+    }
+
+  return t;
+}
+
+/*@only@*/ cstring
+usymIdSet_unparse (usymIdSet ll)
+{
+  cstring s = cstring_undefined;
+
+  if (!usymIdSet_isUndefined (ll))
+    {
+      int i;
+      
+      for (i = 0; i < ll->entries; i++)
+	{
+	  usymId current = ll->elements[i];
+
+	  if (i == 0)
+	    s = uentry_getName (usymtab_getGlobalEntry (current));
+	  else
+	    s = message ("%q, %q", s, uentry_getName (usymtab_getGlobalEntry (current)));
+	}
+    }
+  
+  return s;
+}
+
+int 
+usymIdSet_compare (usymIdSet l1, usymIdSet l2)
+{
+  if (usymIdSet_isUndefined (l1))
+    {
+      return (usymIdSet_size (l2) == 0 ? 0 : 1);
+    }
+  
+  if (usymIdSet_isUndefined (l2))
+    {
+      return (usymIdSet_size (l1) == 0 ? 0 : 1);
+    }
+  
+  {
+    int li1 = l1->entries;
+    int li2 = l2->entries;
+    int leastelements = (li1 < li2) ? li1 : li2;
+    int i = 0;
+    
+    while (i < leastelements)
+      {
+	if (usymId_equal (l1->elements[i], l2->elements[i]))
+	  {
+	    i++;
+	  }
+	else
+	  {
+	    if (l1->elements[i] > l2->elements[i]) 
+	      {
+		return 1;
+	      }
+	    else
+	      {
+		return -1;
+	      }
+	  }
+      }
+
+    return (int_compare (li1, li2));
+  }
+}
diff --git a/src/usymtab.c b/src/usymtab.c
new file mode 100644
index 0000000..99c2f91
--- /dev/null
+++ b/src/usymtab.c
@@ -0,0 +1,5587 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** usymtab
+**
+** Lexically scoped symbol table.
+**
+** Unlike a normal symbol table, this table splits to reflect branches.
+**
+** This is necessary since symbol table entries also reflect
+** some state information, like initialization, that may be
+** different on different branches.
+**
+** For each control structure we split:
+**
+** { }                - a normal scope (no control) US_NORMAL
+**
+** if  { }      - US_TBRANCH true branch
+** while  { }     US_FBRANCH else branch
+**
+** switch  { }  - US_SWITCH
+**
+** case x:            - case scope US_CBRANCH
+**                      Should be kept in a separate table, because of
+**                      weird C syntax.
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "structNames.h"
+# include "exprChecks.h"
+# include "aliasChecks.h"
+
+/*
+** Keep track of type definitions inside a function.
+*/
+
+static uentryList functypes = uentryList_undefined;
+
+static bool dbgfree = FALSE;
+static bool dbgload = TRUE;
+
+/*@access ekind usymId@*/
+
+/*
+** Hack to prevent shadow errors from appearing when function parameters
+** are entered into a new scope.
+*/
+
+static bool noshadowerror = FALSE;
+
+/*
+** Constraint: static variables can live in 1 or > 2. 
+**
+** except for tags.  All tags must be at the global level.
+** Static tags are handled in a kludgey way.
+*/
+
+/*
+** utab    is the universal symbol table
+** globtab is the global environment of utab
+** oldtab  is needed for conversions in dumping (after sorting the table)
+**
+** there can be only one usymtab!
+*/
+
+static /*@checkedstrict@*/ /*@owned@*/ /*@notnull@*/ usymtab utab;
+
+/* Reachable environments from from utab */
+static /*@checkedstrict@*/ /*@notnull@*/ /*@dependent@*/ usymtab globtab;
+static /*@checkedstrict@*/ /*@dependent@*/ usymtab filetab;
+
+/* Used for sorting for dumpage. */
+static /*@checkedstrict@*/ /*@owned@*/ usymtab oldtab;
+
+static int usymtab_lexicalLevel (void) /*@globals utab@*/ ;
+static bool usymtab_isProbableNullAltBranch (sRef p_s) /*@globals utab@*/ ;
+static void refTable_free (/*@only@*/ /*@null@*/ refTable p_x, int p_nentries);
+static ctype usymtab_suFieldsType (uentryList p_f, bool p_isStruct) /*@globals globtab@*/ ;
+
+static void
+usymtab_freeLevel (/*@notnull@*/ /*@only@*/ usymtab p_u)
+  /*@globals globtab, utab, filetab@*/ /*@modifies p_u@*/ ;
+
+static bool usymtab_isProbableNullAux (sRef p_s) /*@globals utab@*/ ;
+static /*@only@*/ cstring usymtab_unparseStackTab (usymtab p_t);
+static /*@exposed@*/ /*@dependent@*/ uentry 
+  usymtab_getRefTab (/*@notnull@*/ usymtab p_u, int p_level, usymId p_index);
+static /*@unused@*/ /*@only@*/ cstring 
+  usymtab_unparseLocalAux (/*@notnull@*/ usymtab p_s);
+static /*@unused@*/ /*@only@*/ cstring 
+  usymtab_unparseLocalList (/*@notnull@*/ usymtab p_s);
+static /*@only@*/ cstring usymtab_typeName (/*@notnull@*/ usymtab p_t);
+static void usymtab_handleParams (void)
+   /*@globals utab, globtab, filetab@*/ 
+   /*@modifies utab@*/ ;
+
+static /*@exposed@*/ /*@dependent@*/ uentry 
+  usymtab_addRefEntry (/*@notnull@*/ usymtab p_s, cstring p_k);
+static /*@exposed@*/ /*@dependent@*/ usymtab
+  usymtab_dropEnv (/*@notnull@*/ usymtab p_s);
+static /*@exposed@*/ /*@dependent@*/ uentry 
+  usymtab_getRefNoisy (/*@notnull@*/ usymtab p_s, int p_level, usymId p_index);
+
+static /*@exposed@*/ /*@dependent@*/ uentry 
+  usymtab_lookupQuiet (usymtab p_s, cstring p_k);
+static void usymtab_printAllAux (usymtab p_s) /*@modifies g_msgstream@*/ ;
+static int usymtab_getIndex (/*@notnull@*/ usymtab p_s, cstring p_k);
+static /*@exposed@*/ uentry usymtab_fetchIndex (/*@notnull@*/ usymtab p_s, int p_i);
+static /*@exposed@*/ uentry 
+  usymtab_lookupAux (usymtab p_s, cstring p_k);
+static /*@exposed@*/ /*@dependent@*/ /*@notnull@*/ usymtab 
+  usymtab_getFileTab (void) /*@globals filetab@*/ ;
+static int refTable_lookup (/*@notnull@*/ usymtab p_ut, int p_level, int p_index);
+static bool usymtab_mustBreak (usymtab p_s);
+static bool usymtab_mustEscape (usymtab p_s);
+
+static void recordFunctionType (uentry ue)
+{
+    llassert (uentry_isDatatype (ue) || uentry_isAnyTag (ue)
+	    || uentry_isEnumConstant (ue));
+
+  /*@-temptrans@*/
+  functypes = uentryList_add (functypes, ue);
+  /*@=temptrans@*/
+}
+
+static void clearFunctionTypes (void)
+  /*@modifies globtab@*/
+{
+  uentryList_elements (functypes, el)
+    {
+      if (cstring_isDefined (uentry_rawName (el)))
+	{
+	  if (globtab->htable != NULL)
+	    {
+	      hashTable_remove (globtab->htable, uentry_rawName (el));
+	    }
+
+	  uentry_setName (el, cstring_undefined);
+	}
+
+      /*@access uentry@*/ 
+      llassert (uentry_isValid (el));
+      el->sref = sRef_undefined;
+      /*@noaccess uentry@*/
+    } end_uentryList_elements ;
+
+  uentryList_clear (functypes);
+}
+
+static /*@falsenull@*/ bool usymtab_isBranch (usymtab u)
+{
+  return (usymtab_isDefined (u) && 
+	  (u->kind == US_TBRANCH || u->kind == US_FBRANCH
+	   || u->kind == US_CBRANCH || u->kind == US_SWITCH));
+}
+
+static bool usymtab_mustBreak (usymtab s)
+{
+  llassert (s != GLOBAL_ENV);
+  return (s->mustBreak);
+}
+
+static bool usymtab_mustEscape (usymtab s)
+{
+  llassert (s != GLOBAL_ENV);
+  return (exitkind_mustEscape (s->exitCode));
+}
+
+void usymtab_setMustBreak () 
+  /*@modifies utab@*/
+{
+  llassert (utab != GLOBAL_ENV);
+  utab->mustBreak = TRUE;
+}
+
+void usymtab_setExitCode (exitkind ex) 
+   /*@modifies utab@*/
+{
+  llassert (utab != GLOBAL_ENV);
+
+  utab->exitCode = ex;
+  
+  if (exitkind_mustEscape (ex))
+    {
+      utab->mustBreak = TRUE;
+    }
+}
+
+bool usymtab_isAltProbablyDeepNull (sRef s)
+{
+  return (sRef_deepPred (usymtab_isProbableNullAltBranch, s));
+}
+
+static bool usymtab_isProbableNullAltBranch (sRef s) 
+   /*@globals utab@*/
+{
+  guardSet t;
+  bool res;
+
+  t = utab->guards;
+
+  llassert (utab->env != NULL);
+
+  /*@-mods@*/ /* These modifications are cancelled. */
+  utab->guards = utab->env->guards;
+  utab->env->guards = t;
+  /*@=mods@*/
+
+  llassert (usymtab_isDefined (utab));
+  res = usymtab_isProbableNull (s);
+
+  /*
+  ** This reports a spurious error.  It is okay, because of
+  ** the nesting relationship of usymtab environments.
+  */
+
+  /*@-mods@*/ /* Cancelling modifications. */
+  /*@i1@*/ utab->env->guards = utab->guards;
+  /*@i1@*/ utab->guards = t;
+  /*@=mods@*/ 
+
+  return res;
+}
+
+static /*@notnull@*/ /*@special@*/ usymtab
+  usymtab_create (uskind kind, /*@keep@*/ usymtab env, bool nextlevel)
+  /*@defines result@*/
+  /*@post:isnull result->htable, result->guards, result->aliases@*/
+{
+  usymtab t = (usymtab) dmalloc (sizeof (*t));
+  
+  t->nentries = 0;
+  t->nspace = CBASESIZE;
+  t->entries = (uentry *) dmalloc (sizeof (*t->entries) * CBASESIZE);
+  t->reftable = (nextlevel 
+		 ? NULL
+		 : (refentry *) dmalloc (sizeof (*t->reftable) * CBASESIZE));
+  
+  t->kind = kind;
+  t->lexlevel = (env == GLOBAL_ENV ? 0 : env->lexlevel) + (nextlevel ? 1 : 0); 
+
+  t->env = env;
+  t->htable = NULL;
+
+  t->guards = guardSet_undefined;
+  t->aliases = aliasTable_undefined;
+
+    t->mustBreak = FALSE;
+  t->exitCode = XK_NEVERESCAPE;
+
+  return t;
+}
+
+/*
+** constructors
+*/
+
+static /*@only@*/ /*@notnull@*/ usymtab
+  usymtab_createRoot (void) /*@modifies nothing@*/
+{
+  usymtab u = (usymtab) dmalloc (sizeof (*u));
+  
+  u->nentries = 0;
+  u->nspace = CGLOBBASESIZE;
+  u->entries = (uentry *) dmalloc (sizeof (*u->entries) * CGLOBBASESIZE);
+  u->env = GLOBAL_ENV;
+  u->lexlevel = 0;
+  u->htable = hashTable_create (CGLOBHASHSIZE);
+  u->reftable = NULL;
+
+  u->guards = guardSet_new ();
+  u->aliases = aliasTable_new ();
+
+  u->mustBreak = FALSE;
+  u->exitCode = XK_NEVERESCAPE;
+  u->kind = US_NORMAL;
+
+  return (u);
+}
+
+void
+usymtab_initMod (void)
+   /*@globals undef utab, undef oldtab, undef globtab, undef filetab @*/
+   /*@modifies utab, globtab, filetab, oldtab @*/
+{
+  utab = usymtab_createRoot ();
+  globtab = utab;
+  filetab = usymtab_undefined;
+  oldtab = usymtab_undefined;
+}
+
+/*
+** utab should be empty?  (requires?)
+**
+** Adds bool types to symbol table (these are built in for now)
+** Only do this is there is no library!
+*/
+
+void
+usymtab_initBool ()
+{
+  if (context_getFlag (FLG_NOLIB))
+    {
+      ctype boolt = ctype_bool;
+
+      if (context_getFlag (FLG_ABSTRACTBOOL))
+	{
+	  uentry boolentry = uentry_makeBoolDatatype (YES);
+	  
+	  usymtab_supGlobalEntry (boolentry);
+	  context_addBoolAccess ();
+	}
+      else
+	{
+	  uentry boolentry = uentry_makeBoolDatatype (NO);
+	  
+	  usymtab_supGlobalEntry (boolentry);
+	}
+      
+      /*
+      ** We supply values 0 and 1 for the constants, so things like
+      ** while (TRUE) can be interpreted correctly.
+      */
+
+      usymtab_supGlobalEntry 
+	(uentry_makeConstantAux (context_getFalseName (), boolt, 
+				 fileloc_getBuiltin (), FALSE,
+				 multiVal_makeInt (0)));
+      usymtab_supGlobalEntry 
+	(uentry_makeConstantAux (context_getTrueName (), boolt, 
+				 fileloc_getBuiltin (), FALSE,
+				 multiVal_makeInt (1)));
+    }
+}
+
+/*
+** mutators 
+*/
+
+static void
+usymtab_grow (/*@notnull@*/ usymtab s)
+{
+  int i;
+  o_uentry *oldsyms = s->entries;
+
+  s->nspace = CBASESIZE;
+  s->entries = (uentry *) dmalloc (sizeof (*s->entries) 
+				   * (s->nentries + s->nspace));
+
+  for (i = 0; i < s->nentries; i++)
+    {
+      s->entries[i] = oldsyms[i];
+    }
+
+  sfree (oldsyms);
+
+  if (s->reftable != NULL)
+    {
+      refTable oldRefs = s->reftable;
+
+      s->reftable = (refentry *) dmalloc (sizeof (*s->reftable)
+					  * (s->nentries + CBASESIZE + 1));
+      
+      for (i = 0; i < s->nentries; i++)
+	{
+	  s->reftable[i] = oldRefs[i];
+	}
+
+      /*@-compdestroy@*/ 
+      sfree (oldRefs);
+      /*@=compdestroy@*/ 
+    }
+      
+}
+
+static void
+usymtab_addEntryQuiet (/*@notnull@*/ usymtab s, /*@keep@*/ uentry e)
+{
+  if (!(s->lexlevel > fileScope || !sRef_modInFunction ()))
+    {
+      if (uentry_isDatatype (e) 
+	  || uentry_isFunction (e)
+	  || uentry_isAnyTag (e)
+	  || uentry_isEnumConstant (e)
+	  || context_inMacro ())
+	{
+	  /* 
+	  ** Not a bug.  Code like,
+	  **    int f (void) { typedef int tint; ... }
+	  ** is legal.
+	  */
+	  
+	  /* was nothing here! */
+	  /*@i@*/ e->sref = sRef_saveCopy (e->sref);
+	}
+      else
+	{
+	  llparseerror 
+	    (cstring_makeLiteral ("Declaration outside function scope"));
+
+	  llcontbug (message ("usymtab_addEntryQuiet: inconsistent state "
+			      "(lexlevel = %d, modFunction = %s) adding: %q", 
+			      s->lexlevel, bool_unparse (sRef_modInFunction ()), 
+			      uentry_unparse (e)));
+	  sRef_setGlobalScope ();
+	  /* make sure the sRef is not bashed! */
+	  /*@i@*/ e->sref = sRef_saveCopy (e->sref);
+	}
+    }
+
+  if (s->nspace <= 0)
+    {
+      usymtab_grow (s);
+    }
+  
+  s->nspace--;
+  s->entries[s->nentries] = e;
+
+# ifdef DOANNOTS
+  if (s == globtab || s == filetab)
+    {
+      if (!fileloc_isLib (g_currentloc))
+	{
+	  uentry_tallyAnnots (e, AN_UNKNOWN);
+	}
+    }
+# endif
+
+  if (s->htable != NULL)
+    {
+      hashTable_insert (s->htable, uentry_rawName (e), s->nentries);
+    }
+
+  s->nentries++;
+}
+
+static /*@observer@*/ uentry /*@alt void@*/
+usymtab_addEntryBase (/*@notnull@*/ usymtab s, /*@only@*/ uentry e)
+{
+  /* 
+  ** In theory, we shouldn't need this test because it this is
+  ** only called when a library is being read, and it shouldn't
+  ** ever have a duplicate entry.  In practice, its safer to
+  ** leave it in, though.
+  */
+
+  uentry old;
+
+  if (uentry_isValid (old = usymtab_lookupQuiet (s, uentry_rawName (e))))
+    {
+      DPRINTF (("Duplicate entry: %s", uentry_unparse (e)));
+      uentry_free (e); /* duplicate */
+      return old;
+    }
+  else
+    {
+      int thisentry = s->nentries;  
+      
+      if (uentry_isVar (e))
+	{
+	  uentry_setSref (e, sRef_makeCvar (globScope, thisentry, 
+					    uentry_getType (e)));
+	}
+      
+      usymtab_addEntryQuiet (s, e);
+      return e;
+    }
+}
+
+static usymId
+usymtab_addEntryAux (/*@notnull@*/ usymtab st, /*@keep@*/ uentry e, bool isSref)
+     /*@globals globtab@*/
+     /*@modifies st, e@*/
+{
+  usymId thisentry = st->nentries;
+
+  llassert (!uentry_isElipsisMarker (e));
+
+  /*
+  ** not true for tags
+  **  llassert (usymtab_lookupSafe (uentry_rawName (e)) == uentry_undefined);
+  **/
+
+  llassertprint (uentry_isAnyTag (e) ? st == globtab : TRUE, 
+		 ("non-global tag: %s / %d", uentry_unparseFull (e), st->lexlevel));
+
+  if (st->lexlevel == fileScope 
+      && (!(uentry_isStatic (e)) || uentry_isAnyTag (e))) 
+    {
+      st = globtab;
+    }
+
+  if (isSref)
+    {
+      ctype ct = uentry_getType (e);
+
+      if (uentry_isFunction (e) && ctype_isFunction (ct))
+	{
+	  ct = ctype_returnValue (ct);
+	}
+
+      if (uentry_isStatic (e))
+	{
+	  sRef sr = sRef_makeCvar (st->lexlevel, thisentry, ct);
+
+	  if (sRef_isStack (sr) || sRef_isLocalState (sr))
+	    {
+	      sRef_setAliasKind (sr, AK_STATIC, uentry_whereLast (e));
+	      sRef_setDefined (sr, uentry_whereLast (e));
+	    }
+	  
+	  uentry_setSref (e, sr);
+	}
+      else
+	{
+	  uentry_setSref (e, sRef_makeCvar (st->lexlevel, thisentry, ct));
+	}
+
+          }
+
+  if (uentry_isDatatype (e))
+    {
+      
+      uentry_setDatatype (e, thisentry);
+    }
+
+  if (uentry_isFunction (e))
+    {
+      ctype ct = uentry_getType (e);
+
+      if (ctype_isFunction (ct)
+	  && uentryList_isMissingParams (ctype_argsFunction (ct)))
+	{
+	  if (uentry_isDeclared (e))
+	    {
+	      voptgenerror 
+		(FLG_NOPARAMS,
+		 message ("Function %q declared without parameter list",
+			  uentry_getName (e)),
+		 uentry_whereDeclared (e));
+	    }
+	  else
+	    {
+	      voptgenerror
+		(FLG_NOPARAMS,
+		 message ("Function %q specified without parameter list",
+			  uentry_getName (e)),
+		 uentry_whereSpecified (e));
+	    }
+	}
+    }
+
+  if (st == globtab && !uentry_isSpecified (e))
+    {
+      exprChecks_checkExport (e);
+    }
+  
+  
+  uentry_checkName (e);
+  
+  usymtab_addEntryQuiet (st, e);
+  return (thisentry);
+}
+
+usymId
+usymtab_addEntry (uentry e) 
+   /*@globals utab, globtab@*/
+   /*@modifies utab, e@*/
+{
+  
+  llassertprint (!usymtab_exists (uentry_rawName (e)),
+		 ("Entry already exists: %s", uentry_unparse (e)));
+
+  return usymtab_addEntryAux (utab, e, FALSE);
+}
+
+void
+usymtab_addGlobalEntry (uentry e)
+   /*@modifies globtab, e@*/ 
+{
+  DPRINTF (("Add global: %s / %s", uentry_unparse (e), bool_unparse (uentry_isForward (e))));
+
+  (void) usymtab_addEntryAux (globtab, e, FALSE);
+}
+
+/*
+** supercede and replace entry use elements of entries array, and
+** assign an element to a new value, and then free the old value.
+** Need -deparrays to avoid errors for this. 
+*/
+
+/*@-deparrays@*/ 
+
+static usymId
+usymtab_supEntryAux (/*@notnull@*/ usymtab st, 
+		     /*@only@*/ uentry e, bool isSref)
+   /*@globals globtab, filetab@*/
+   /*@modifies st, globtab, e@*/
+{
+  cstring ename = uentry_rawName (e);
+  bool staticEntry = FALSE;
+  int eindex;
+
+  DPRINTF (("Sup entry aux: %s", uentry_unparseFull (e)));
+
+  /* static tags in global scope */
+  if (st->lexlevel == fileScope 
+      && (!(uentry_isStatic (e)) || uentry_isAnyTag (e))) 
+    {
+      eindex = usymtab_getIndex (st, ename);
+
+      if (eindex != NOT_FOUND)
+	{
+	  uentry ce = st->entries[eindex];      
+	  
+	  if (optgenerror
+	      (FLG_SHADOW,
+	       message ("%s %q shadows static declaration",
+			ekind_capName (uentry_getKind (e)),
+			uentry_getName (e)),
+	       uentry_whereDeclared (e)))
+	    {
+	      uentry_showWhereLast (ce);
+	    }
+
+	  if (eindex == st->nentries - 1)
+	    {
+	     ;
+	    }
+	  else
+	    {
+	      st->entries[eindex] = st->entries[st->nentries - 1];
+	    }
+
+	  if (st->htable != NULL)
+	    {
+	      hashTable_replaceKey (st->htable, uentry_rawName (ce), 
+				    uentry_rawName (e));
+	    }
+
+	  uentry_free (ce);
+	  st->nentries--;
+	}
+      
+      st = globtab;
+    }
+
+  if (uentry_isStatic (e)) {
+    if (uentry_isFunction (e)) {
+      /* Static function declarations are at the file level, even if they are in a deeped scope. */
+      st = usymtab_getFileTab ();
+      staticEntry = TRUE;
+    } else {
+      if (!uentry_isAnyTag (e) && st == globtab) 
+	{
+	  st = usymtab_getFileTab ();
+	  staticEntry = TRUE;
+	  DPRINTF (("Static entry!"));
+	}
+    }
+  }
+
+  DPRINTF (("Using symtab: %s", usymtab_unparseLocalAux (st)));
+
+  eindex = usymtab_getIndex (st, ename);
+      
+  if (eindex != NOT_FOUND)
+    {
+      uentry ce = st->entries[eindex];
+
+      DPRINTF (("Found entry: %s", uentry_unparse (ce)));
+
+      if (uentry_isPriv (ce)
+	  /* || (fileloc_isImport (uentry_whereSpecified (ce))) */
+	  || (uentry_isStatic (ce) 
+	      && uentry_isAnyTag (ce)
+	      && (uentry_isDeclared (ce) 
+		  && !fileloc_sameFile (uentry_whereDefined (ce),
+					uentry_whereDefined (e)))))
+	{
+	  /*
+          ** overload entry 
+	  **    if overloading import should do some checks!
+	  */
+
+	  llassert ((st->lexlevel > fileScope || !sRef_modInFunction ()));
+	  
+	  st->entries[eindex] = e;
+
+	  if (uentry_isDatatype (e))
+	    {
+	      uentry_setDatatype (e, eindex);
+	    }
+	  
+	  if (st == globtab && !uentry_isSpecified (e))
+	    {
+	      exprChecks_checkExport (e);
+	    }
+
+	  if (st->htable != NULL)
+	    {
+	      hashTable_replaceKey (st->htable, uentry_rawName (ce), 
+				    uentry_rawName (e));
+	    }
+
+	  uentry_free (ce);
+	  ce = e; 
+	}
+      else if (uentry_isSpecified (ce))
+	{
+	  if (uentry_isSpecified (e))
+	    {
+	      if (fileloc_isImport (uentry_whereSpecified (ce)))
+		{
+		  
+		  if (st->htable != NULL)
+		    {
+		      hashTable_replaceKey (st->htable, 
+					    uentry_rawName (ce), 
+					    uentry_rawName (e));
+		    }
+		  
+		  uentry_free (ce); 
+		  st->entries[eindex] = e;
+		  ce = e;
+
+		  if (uentry_isDatatype (e)) uentry_setDatatype (e, eindex);
+		}
+	      else 
+		{
+		  if (fileloc_isImport (uentry_whereSpecified (e)))
+		    {
+		      uentry_free (e);
+		    }
+		  else
+		    {
+		      /* respecification errors already reported */
+  
+		      if (uentry_isDatatype (e)) 
+			{
+			  uentry_setDatatype (e, eindex);
+			}
+		      
+		      if (st->htable != NULL)
+			{
+			  hashTable_replaceKey (st->htable, 
+						uentry_rawName (ce), 
+						uentry_rawName (e));
+			}
+		      
+		      llassert ((st->lexlevel > fileScope || !sRef_modInFunction ()));
+		      uentry_free (ce);
+		      st->entries[eindex] = e;
+		      ce = e;
+		    } 
+		}
+	    }
+	  else /* e not specified */
+	    {
+	      if (uentry_isDeclared (ce))
+		{
+		  llassert ((st->lexlevel > fileScope || !sRef_modInFunction ()));
+		  uentry_mergeDefinition (ce, e);
+		}
+	      else 
+		{
+		  llassert ((st->lexlevel > fileScope || !sRef_modInFunction ()));
+		  uentry_mergeEntries (ce, e);
+		}
+	    }
+	}
+      else /* ce not specified */
+	{
+	  if (!(st->lexlevel > fileScope || !sRef_modInFunction ()))
+	    {
+	      if (uentry_isDatatype (e) || uentry_isAnyTag (e)
+		  || uentry_isEnumConstant (e))
+		{
+		  ; /* 
+		     ** Not a bug.  Code like,
+		     **    int f (void) { typedef int tint; ... }
+		     ** is legal.
+		     */
+		}
+	      else
+		{
+		  llcontbug (message ("usymtab_supEntryAux: inconsistent state "
+				      "(lexlevel = %d, modFunction = %s) adding: %q", 
+				      st->lexlevel, bool_unparse (sRef_modInFunction ()), 
+				      uentry_unparse (e)));
+
+		  if (sRef_modInFunction ())
+		    {
+		      /* make sure the sRef is not bashed! */
+		      /*@i@*/ e->sref = sRef_saveCopy (e->sref);
+		    }
+		}
+	    }
+	  
+	  uentry_mergeDefinition (ce, e);
+	}
+      
+      if (isSref)
+	{
+	  ctype ct = uentry_getType (ce);
+	  
+	  if (uentry_isFunction (ce) && ctype_isFunction (ct))
+	    {
+	      ct = ctype_returnValue (ct);
+	    }
+	  
+	  uentry_setSref (ce, sRef_makeCvar (st->lexlevel, eindex, ct));
+	  	}
+    }
+  else /* no previous entry */
+    {
+      uentry outer;
+
+      if (st->lexlevel == globScope 
+	  && !uentry_isStatic (e)
+	  && !uentry_isExtern (e)
+	  && usymtab_isDefined (filetab))
+	{
+	  /*
+	  ** check if there is a static entry:  (i.e.,
+	  **   
+	  **    static int f ();
+	  **    ...
+	  **    int f (); 
+	  */
+	  
+	  eindex = usymtab_getIndex (filetab, ename);
+	  
+	  if (eindex != NOT_FOUND)
+	    {
+	      uentry ce = filetab->entries[eindex];
+
+	      uentry_setStatic (e);
+	      uentry_mergeDefinition (ce, e);
+	      staticEntry = TRUE;
+	      goto exitPoint;
+	    }
+	}
+      
+      outer = usymtab_lookupQuiet (st->env, ename);
+
+      /*
+      ** no previous definition, add the new one
+      */
+      
+      if (!noshadowerror 
+	  && uentry_isValid (outer)
+	  && !(uentry_isYield (e) || uentry_isYield (outer))
+	  && fileloc_isDefined (uentry_whereLast (e))
+	  && fileloc_isDefined (uentry_whereLast (outer)))
+	{
+	  if (!uentry_sameKind (outer, e))
+	    {
+	      ; /* no error */
+	    }
+	  else
+	    {
+	      if (ctype_isUnknown (uentry_getType (outer))
+		  || uentry_isForward (outer))
+		{
+		  ;
+		}
+	      else
+		{
+		  if (optgenerror 
+		      (FLG_SHADOW,
+		       message ("%s %q shadows outer declaration",
+				ekind_capName (uentry_getKind (e)),
+				uentry_getName (e)),
+		       uentry_whereLast (e)))
+		    {
+		      uentry_showWhereLast (outer);
+		    }
+		}
+	    }
+	}
+      
+      if (st == globtab && context_getFlag (FLG_NEWDECL))
+	{
+	  voptgenerror 
+	    (FLG_NEWDECL,
+	     message ("New declaration: %q", uentry_getName (e)),
+	     uentry_whereLast (e));
+	}
+
+      eindex = usymtab_addEntryAux (st, e, isSref);
+    }
+
+ exitPoint:
+    return (staticEntry ? USYMIDINVALID : eindex);
+}
+
+# ifndef NOLCL
+static void
+usymtab_replaceEntryAux (/*@notnull@*/ usymtab st, /*@only@*/ uentry e)
+   /*@globals globtab@*/ /*@modifies st, e@*/
+{
+  cstring ename = uentry_rawName (e);
+  int eindex;
+
+  /* static tags in global scope */
+  eindex = usymtab_getIndex (st, ename);
+  
+  if (eindex != NOT_FOUND)
+    {
+      uentry ce = st->entries[eindex];      
+      
+      if (st->htable != NULL)
+	{
+	  hashTable_replaceKey (st->htable, uentry_rawName (ce), uentry_rawName (e));
+	}
+
+      uentry_free (ce);
+      st->entries[eindex] = e;
+    }
+  else
+    {
+      eindex = usymtab_addEntryAux (st, e, FALSE);
+    }
+}
+# endif
+
+/*@=deparrays@*/ 
+
+void usymtab_supEntry (uentry e)
+   /*@globals utab, filetab, globtab@*/
+   /*@modifies utab, globtab, e@*/
+{
+    (void) usymtab_supEntryAux (utab, e, FALSE);
+}
+
+/*
+** this should be lots more efficient!
+*/
+
+static /*@exposed@*/ uentry 
+  usymtab_supEntryReturnAux (/*@notnull@*/ usymtab tab, 
+			     /*@only@*/ uentry e, bool isref)
+  /*@globals globtab, filetab@*/
+  /*@modifies tab, globtab, e@*/
+{
+  cstring rawName = cstring_copy (uentry_rawName (e));
+  bool stat = (tab == globtab) && uentry_isStatic (e);
+  uentry ret;
+
+    
+  (void) usymtab_supEntryAux (tab, e, isref);
+
+  if (stat)
+    {
+      ret = usymtab_lookupAux (filetab, rawName);
+    }
+  else
+    {
+      ret = usymtab_lookupAux (tab, rawName);
+
+      if (uentry_isInvalid (ret) && usymtab_isDefined (filetab))
+	{
+	  ret = usymtab_lookupAux (filetab, rawName);
+	}
+    }
+  
+  cstring_free (rawName);
+  return ret;
+}
+
+/*@dependent@*/ /*@exposed@*/ uentry 
+  usymtab_supEntryReturn (/*@only@*/ uentry e)
+  /*@globals utab, filetab, globtab@*/
+  /*@modifies utab, globtab, e@*/
+{
+  return (usymtab_supEntryReturnAux (utab, e, FALSE));
+}
+
+/*@dependent@*/ /*@exposed@*/ uentry 
+  usymtab_supEntrySrefReturn (/*@only@*/ uentry e)
+  /*@globals utab, globtab, filetab@*/
+  /*@modifies utab, globtab, e@*/
+{
+  return (usymtab_supEntryReturnAux (utab, e, TRUE));
+}
+
+/*@dependent@*/ /*@exposed@*/ uentry 
+  usymtab_supGlobalEntryReturn (uentry e)
+  /*@globals globtab, filetab@*/
+  /*@modifies globtab, e@*/
+{
+  uentry ret;
+
+  ret = usymtab_supEntryReturnAux (globtab, e, FALSE);
+
+  if (sRef_modInFunction ())
+    {
+      recordFunctionType (ret);
+    }
+
+  return (ret);
+}
+
+ctype
+usymtab_supTypeEntry (/*@only@*/ uentry e)
+  /*@globals globtab, filetab@*/
+  /*@modifies globtab, e@*/
+{
+  usymId uid;
+  ctype ret;
+
+  if (uentry_isAbstractDatatype (e))
+    {
+      uid = usymtab_supAbstractTypeEntry (e, FALSE);
+      ret = ctype_createAbstract (uid);
+    }
+  else
+    {
+      uid = usymtab_supEntryAux (globtab, e, FALSE);
+      ret = ctype_createUser (uid);
+    }
+
+  if (sRef_modInFunction ())
+    {
+      recordFunctionType (globtab->entries[uid]);
+    }
+
+  return ret;
+}
+
+uentry
+usymtab_supReturnTypeEntry (/*@only@*/ uentry e)
+  /*@globals globtab, filetab@*/
+  /*@modifies globtab@*/
+{
+  usymId uid;
+
+  if (uentry_isAbstractDatatype (e))
+    {
+            uid = usymtab_supAbstractTypeEntry (e, FALSE);
+    }
+  else
+    {
+            uid = usymtab_supEntryAux (globtab, e, FALSE);
+    }
+
+  if (sRef_modInFunction ())
+    {
+      recordFunctionType (globtab->entries[uid]);
+    }
+
+    return (globtab->entries[uid]);
+}
+
+usymId
+usymtab_supAbstractTypeEntry (/*@only@*/ uentry e, bool dodef)
+  /*@globals globtab, filetab@*/
+  /*@modifies globtab, e@*/
+{
+  usymId uid;
+
+  uid = usymtab_supEntryAux (globtab, e, FALSE);
+
+  if (dodef)
+    {
+      uentry ue = usymtab_getTypeEntry (uid);
+
+      uentry_setDatatype (ue, uid);
+    }
+
+  if (context_getFlag (FLG_ACCESSMODULE))
+    {
+      context_addFileAccessType (uid);
+    }
+
+  if (sRef_modInFunction ())
+    {
+      recordFunctionType (globtab->entries[uid]);
+    }
+
+  return (uid);
+}
+
+# ifndef NOLCL
+usymId
+usymtab_supExposedTypeEntry (/*@only@*/ uentry e, bool dodef)
+  /*@globals globtab, filetab@*/
+  /*@modifies globtab, e@*/
+{
+  usymId uid;
+
+  uid = usymtab_supEntryAux (globtab, e, FALSE);
+
+  if (dodef)
+    {
+      uentry ue = usymtab_getTypeEntry (uid);
+
+      uentry_setDatatype (ue, uid);
+    }
+
+  if (sRef_modInFunction ())
+    {
+      recordFunctionType (globtab->entries[uid]);
+    }
+
+  return (uid);
+}
+# endif
+
+ctype
+usymtab_supForwardTypeEntry (/*@only@*/ uentry e)
+  /*@globals globtab, filetab@*/
+  /*@modifies globtab, e@*/
+{
+  usymId uid = usymtab_supEntryAux (globtab, e, FALSE);
+  uentry ue = usymtab_getTypeEntry (uid);
+
+    uentry_setDatatype (ue, uid);
+
+  if (sRef_modInFunction ())
+    {
+      recordFunctionType (globtab->entries[uid]);
+    }
+
+  return (uentry_getAbstractType (ue));
+}
+
+void
+  usymtab_supEntrySref (uentry e)
+  /*@globals utab, globtab, filetab@*/
+  /*@modifies utab, globtab, e@*/
+{
+  sRef old = uentry_getSref (e);
+
+  
+  if (sRef_isType (old))
+    {
+      uentry ue = usymtab_supEntryReturnAux (utab, e, TRUE);
+
+      /*@access uentry@*/
+      if (uentry_isValid (ue)) 
+	{
+	  sRef uref = uentry_getSref (ue);
+
+	  sRef_mergeStateQuiet (uref, old); 
+	  sRef_clearDerived (uref);
+	}
+      /*@noaccess uentry@*/
+    }
+  else if (sRef_isKnown (old))
+    {
+      usymtab_supEntry (e);
+    }
+  else
+    {
+      (void) usymtab_supEntryAux (utab, e, TRUE);
+    }
+}
+
+void usymtab_supGlobalEntry (/*@only@*/ uentry e)
+  /*@globals globtab, filetab@*/
+  /*@modifies globtab, filetab, e@*/
+{
+  usymId uid;
+
+  DPRINTF (("Sup global entry: %s", uentry_unparse (e)));
+
+  uid = usymtab_supEntryAux (globtab, e, FALSE);
+
+  if (sRef_modInFunction ())
+    {
+      recordFunctionType (globtab->entries[uid]);
+    }
+}
+
+uentry
+  usymtab_supReturnFileEntry (/*@only@*/ uentry e)
+  /*@globals filetab, globtab@*/
+  /*@modifies filetab, globtab, e@*/
+{
+  llassert (filetab != usymtab_undefined);
+  DPRINTF (("File entry: %s", uentry_unparse (e)));
+  return (usymtab_supEntryReturnAux (filetab, e, FALSE));
+}
+
+/*
+** observers
+*/
+
+bool
+usymtab_inDeepScope () /*@globals utab@*/
+{
+  return (utab->lexlevel > paramsScope);
+}
+
+static int
+usymtab_getIndex (/*@notnull@*/ usymtab s, cstring k)
+{
+  int i;
+
+  if (s->htable != NULL)
+    {
+      i = hashTable_lookup (s->htable, k);
+
+      return i;
+    }
+  else
+    {
+      for (i = 0; i < s->nentries; i++)
+	{
+	  uentry current = s->entries[i];
+
+	  if (!uentry_isUndefined (current) 
+	      && cstring_equal (uentry_rawName (current), k))
+	    {
+	      return i;
+	    }
+	}
+
+      return NOT_FOUND;
+    }
+}
+
+static uentry
+usymtab_fetchIndex (/*@notnull@*/ usymtab s, int i)
+{
+  llassert (i >= 0 && i < s->nentries);
+  return (s->entries[i]);
+}
+
+usymId
+usymtab_getTypeId (cstring k) /*@globals globtab@*/
+{
+  usymId uid = usymtab_getIndex (globtab, k);
+
+  if (uid == NOT_FOUND) return USYMIDINVALID;
+  if (!(uentry_isDatatype (usymtab_getTypeEntry (uid)))) return USYMIDINVALID;
+
+  return uid;
+}
+
+/*@dependent@*/ uentry
+usymtab_lookupStructTag (cstring k)
+{
+  cstring sname = makeStruct (k);
+  uentry ue = usymtab_lookupGlob (sname);
+    cstring_free (sname);
+  return (ue);
+}
+
+/*@dependent@*/ uentry
+usymtab_lookupUnionTag (cstring k)
+{
+  cstring uname = makeUnion (k);
+  uentry res = usymtab_lookupGlob (uname);
+
+  cstring_free (uname);
+  return res;
+}
+
+/*@dependent@*/ uentry
+usymtab_lookupEnumTag (cstring k)
+{
+  cstring ename = makeEnum (k);
+  uentry res = usymtab_lookupGlob (ename);
+
+  cstring_free (ename);
+  return res;
+}
+
+usymId
+usymtab_getId (cstring k) /*@globals globtab@*/
+{
+  usymId uid = usymtab_getIndex (globtab, k);
+  uentry ue;
+
+  if (uid == NOT_FOUND)
+    {
+      return USYMIDINVALID;
+    }
+
+  ue = usymtab_getGlobalEntry (uid);
+
+  if (uentry_isPriv (ue))
+    {
+      return USYMIDINVALID;
+    }
+
+  return uid;
+}
+
+static /*@exposed@*/ uentry 
+usymtab_getEntryAux (/*@notnull@*/ usymtab s, usymId uid)
+{
+  llassert (uid != USYMIDINVALID);
+ 
+  if (uid < 0 || uid >= s->nentries)
+    {
+      llcontbug (message ("usymtab_getEntry: out of range: level = %d [%d]",
+			  s->lexlevel, uid));
+      return uentry_undefined;
+    }
+
+  llassertprint (uentry_isValid (s->entries[uid]),
+		 ("entry undefined: %d", uid));
+
+  return s->entries[uid];
+}
+
+/*@dependent@*/ /*@observer@*/ uentry 
+  usymtab_getGlobalEntry (usymId uid)
+  /*@globals utab, globtab@*/
+{
+  if (dbgfree) return (uentry_undefined);
+  
+  if (utab->lexlevel > paramsScope)
+    {
+      /* need to do this the awkward way, since it could be in conditional scope */
+     return (usymtab_lookupSafe (uentry_rawName (globtab->entries[uid])));
+    }
+  else
+    {
+      return (globtab->entries[uid]);
+    }
+}
+
+/*@dependent@*/ /*@exposed@*/ uentry 
+  usymtab_getTypeEntry (usymId uid)
+  /*@globals globtab@*/
+{
+  if (dbgload)
+    {
+      if (uid >= 0 && uid < globtab->nentries)
+	{
+	  return (globtab->entries[uid]);
+	}
+      else
+	{
+	  return (uentry_undefined);
+	}
+    }
+  else
+    {
+      llassert (uid >= 0 && uid < globtab->nentries);
+      
+      return (globtab->entries[uid]);
+    }
+}
+
+/*
+** in load files
+*/
+
+/*@dependent@*/ /*@exposed@*/ uentry 
+  usymtab_getTypeEntrySafe (usymId uid)
+  /*@globals globtab@*/
+{
+  if (uid < 0 || uid >= globtab->nentries)
+    {
+      return uentry_undefined;
+    }
+
+      return (globtab->entries[uid]);
+}
+
+bool
+  usymtab_isBoolType (usymId uid)
+  /*@globals globtab@*/
+{
+  llassert (uid >= 0 && uid < globtab->nentries);
+
+  return (cstring_equal (uentry_rawName (globtab->entries[uid]),
+			 context_getBoolName ()));
+}
+ 
+cstring
+usymtab_getTypeEntryName (usymId uid)
+   /*@globals globtab@*/
+{
+  uentry ue;
+
+  if (dbgfree)
+    {
+      return (cstring_makeLiteral (""));
+    }
+
+  ue = usymtab_getTypeEntry (uid);
+
+  if (dbgload && !uentry_isValid (ue))
+    {
+      return (message ("", uid));
+    }
+
+  llassertprint (uentry_isValid (ue), ("type undefined: %d", uid));
+
+  return (uentry_getName (ue));
+}
+
+static void
+usymtab_rehash (/*@notnull@*/ usymtab s)
+{
+  int i;
+  
+  if (s->htable != NULL)
+    {
+      hashTable_free (s->htable);
+    }
+  
+  s->htable = hashTable_create (LLHASHSIZE);
+
+  for (i = 0; i < s->nentries; i++)
+    {
+      hashTable_insert (s->htable, uentry_rawName (s->entries[i]), i);
+    }
+}
+
+/*
+** superficial copy of usymtab
+**
+** DO copy spec entries 
+*/
+
+static /*@only@*/ /*@notnull@*/ usymtab
+usymtab_shallowCopy (/*@notnull@*/ usymtab s) /*@*/
+{
+  usymtab copytab = usymtab_createRoot ();
+  int i;
+
+  for (i = 0; i < s->nentries; i++)
+    {
+      usymtab_addEntryBase (copytab, s->entries[i]);
+    }
+
+  return copytab;
+}
+
+static void
+usymtab_shallowFree (/*@only@*/ /*@notnull@*/ usymtab s)
+{
+  aliasTable_free (s->aliases);
+  refTable_free (s->reftable, s->nentries);
+  sfree (s->entries);
+  /*@-compdestroy@*/ sfree (s); /*@=compdestroy@*/
+}
+
+/*
+** converts usymId from old table to sorted one
+*/
+
+usymId 
+  usymtab_convertId (usymId uid)
+  /*@globals oldtab, utab@*/
+{
+  uentry ue;
+  usymId ret;
+  cstring name;
+
+  llassert (usymtab_isDefined (oldtab));
+
+  ue = usymtab_getEntryAux (oldtab, uid);
+
+  llassertprint (uentry_isValid (ue), ("convertId: undefined: %d", uid));
+
+  name = uentry_rawName (ue);
+
+  ret = usymtab_getIndex (utab, name);
+
+  llassertprint (ret != USYMIDINVALID, ("convertId: return is invalid"));
+
+  return (ret);
+}
+
+void
+usymtab_prepareDump (void)
+   /*@globals oldtab, utab@*/
+   /*@modifies oldtab, utab@*/
+{
+  llassert (usymtab_inGlobalScope ());
+
+  llassert (oldtab == usymtab_undefined);
+
+  oldtab = usymtab_shallowCopy (utab);
+
+  /* 
+     alpha compare - make sure order is same on different platforms
+     error messages appear in same order 
+  */
+
+  qsort (utab->entries, (size_t)utab->nentries, 
+	 sizeof (*utab->entries), (int (*)(const void *, const void *)) uentry_xcomparealpha);
+
+  usymtab_rehash (utab);
+}
+
+void
+  usymtab_dump (FILE *fout)
+  /*@globals utab, oldtab@*/
+{
+  int i;
+  bool neednl = FALSE;
+  uentry lastentry = uentry_undefined;
+  ekind lastekind = KINVALID;
+  int linelen = 0;
+
+  /*
+  ** must call prepareDump first
+  */
+
+  llassert (oldtab != usymtab_undefined);
+
+  for (i = 0; i < utab->nentries; i++)
+    {
+      uentry thisentry = utab->entries[i];
+      ekind  thisekind = uentry_getKind (thisentry);
+
+      
+      if (uentry_hasRealName (thisentry)) {
+	if (thisekind != lastekind)
+	  {
+	    if (neednl)
+	      {
+		check (fputc ('\n', fout) == (int) '\n');
+	      }
+	    
+	    neednl = FALSE;
+	    lastentry = uentry_undefined;
+	    fprintf (fout, "*%d (%s)\n", ekind_toInt (thisekind),  
+		     cstring_toCharsSafe (ekind_capName (thisekind)));
+	    lastekind = thisekind;
+	    linelen = 0;
+	  }
+	
+	if (uentry_isInvalid (lastentry) || !uentry_equiv (lastentry, thisentry)
+	    || (linelen > (MAX_DUMP_LINE_LENGTH - (2 * MAX_NAME_LENGTH))))
+	  {
+	    cstring cdump = uentry_dump (thisentry);
+	    
+	    lastentry = thisentry;
+	    if (neednl)
+	      {
+		check (fputc ('\n', fout) == (int) '\n');
+		linelen = 0;
+	      }
+	    
+	    linelen += cstring_length (cdump);
+	    
+	    /* no new line here! */
+	    if (cstring_length (cdump) > 0) 
+	      {
+		check (fputs (cstring_toCharsSafe (cdump), fout) != EOF);
+	      }
+	    
+	    cstring_free (cdump);
+	    neednl = TRUE;
+	  }
+	else
+	  {
+	    cstring cdump = uentry_rawName (thisentry);
+	    	    linelen += cstring_length (cdump);
+	    fprintf (fout, "#%s", cstring_toCharsSafe (cdump));
+	  }
+      }
+    }
+
+  if (neednl)
+    {
+      check (fputc ('\n', fout) == (int) '\n');
+    }
+}
+
+void usymtab_load (FILE *f)
+  /*@globals utab, globtab@*/
+  /*@modifies utab, *f@*/
+{
+  char *s = mstring_create (MAX_DUMP_LINE_LENGTH);
+  char *os = s;
+  ekind kind = KINVALID;
+  fileloc loc = g_currentloc;
+  char c;
+  uentry ue;
+
+  dbgload = TRUE;
+
+  llassert (utab == globtab);
+  llassert (utab->nentries == 0);
+
+  while (fgets (s, MAX_DUMP_LINE_LENGTH, f) != NULL 
+	 && *s == ';')
+    {
+      ; /* ignore ;-comments */
+    }
+
+  while (s != NULL && *s != ';')
+    {
+      
+      if (*s == '*')
+	{
+	  s++;
+	  kind = ekind_fromInt (getInt (&s));
+
+	  	  goto nextiter;
+	}
+
+      if (*s == '$')
+	{
+	  llfatalerror
+	    (cstring_makeLiteral 
+	     ("Library is in obsolete format.  Use lclint +whichlib "
+	      "to see which library is being loaded."));
+	}
+
+      ue = uentry_undump (kind, loc, &s);
+      DPRINTF (("Load: %s", uentry_unparseFull (ue)));
+
+      if (uentry_isValid (ue))
+	{	
+	  ue = usymtab_addEntryBase (utab, ue);
+	  /*@-branchstate@*/ 
+	} 
+      /*@=branchstate@*/
+
+      /*
+      ** now, any other names are the same uentry
+      */
+
+      while (*(s++) == '#')
+	{
+	  cstring name = cstring_fromCharsO (getWord (&s));
+	  uentry nue = uentry_nameCopy (name, ue);
+
+	  DPRINTF (("Name copy: %s", uentry_unparseFull (nue)));
+	  usymtab_addEntryBase (utab, nue);
+	}
+
+      while ((c = *s) != '\0' && (c !='\n'))
+	{
+	  if (c != ' ' || c != '\t') 
+	    {
+	      llbuglit ("Junk in load file");
+	    }
+
+	  s++;
+	}
+
+    nextiter:
+      s = fgets (os, MAX_DUMP_LINE_LENGTH, f);
+    }
+
+  dbgload = FALSE;
+  sfree (os);
+}
+
+/*
+** file scope for static variables
+*/
+
+void
+usymtab_enterFile ()
+  /*@globals utab, globtab, filetab@*/
+  /*@modifies filetab@*/
+{
+  llassert (utab == globtab);
+
+  # if 0
+  /* check globals */
+  
+  usymtab_entries (globtab, ue)
+    {
+      if (sRef_hasDerived (uentry_getSref (ue)))
+	{
+	  fprintf (g_msgstream, "Derived Global: %s\n", uentry_unparse (ue));
+	  fprintf (g_msgstream, "sRef: %s\n", sRef_unparseFull (ue->sref));
+	}
+    } end_usymtab_entries ;
+
+  # endif
+
+  usymtab_enterScope ();
+  filetab = utab;
+}
+
+void
+usymtab_exitFile ()
+   /*@globals utab, filetab@*/
+   /*@modifies filetab, utab@*/
+{
+  
+  llassert (utab->lexlevel == 1);
+
+  usymtab_exitScope (exprNode_undefined);
+  filetab = NULL;
+}
+
+void
+usymtab_enterScope ()
+  /*@globals utab, globtab, filetab@*/
+  /*@modifies utab@*/
+{
+  usymtab t = usymtab_create (US_NORMAL, utab, TRUE);
+    	  
+  /* unconditional scope: optimize to avoid copy */
+  t->aliases = aliasTable_copy (utab->aliases); 
+  utab = t;
+  
+  llassert (usymtab_isDefined (t->env));
+  
+  if (t->env->lexlevel == paramsScope && context_inFunctionLike ())
+    {
+      noshadowerror = TRUE;
+      usymtab_handleParams ();
+      noshadowerror = FALSE;
+    }
+}
+
+/*
+** setup external references:
+**    o only, unique params alias external args
+**    o other params may alias anything of their type
+*/
+ 
+static void
+usymtab_handleParams (void)
+  /*@globals utab, globtab, filetab@*/
+  /*@modifies utab, globtab@*/
+{
+  usymtab ptab = utab->env;
+  uentry fcn = context_getHeader ();
+
+  
+  usymtab_entries (ptab, param)
+    {
+      uentry ue;
+
+      if (!uentry_isYield (param))
+	{
+	  sRef uref;
+	  sRef pref = uentry_getSref (param);
+	  
+	  llassertprint (uentry_isAnyParam (param), 
+			 ("not param: %s", 
+			  uentry_unparseFull (param)));
+	  
+	  
+	  ue = uentry_makeVariable (fixParamName (uentry_rawName (param)),
+				    uentry_getType (param),
+				    fileloc_copy (uentry_whereDeclared (param)),
+				    FALSE);
+
+	  uentry_copyState (ue, param);
+	  uentry_setRefParam (ue);
+	  
+	  ue = usymtab_supEntrySrefReturn (ue);
+	  	  
+	  /* must be after supercede! */
+	  
+	  if (!sRef_stateKnown (pref))
+	    {
+	      uentry_setDefState (ue, SS_DEFINED);
+	      uentry_setDefState (param, SS_DEFINED);
+	    }
+	  else
+	    {
+	      if (sRef_isStateSpecial (pref))
+		{
+		  uentry_setDefState (ue, SS_ALLOCATED);
+		}
+	      else
+		{
+		  uentry_setDefState (ue, sRef_getDefState (pref));
+		}
+	    }
+
+	  uref = uentry_getSref (ue);
+	  
+	  if (sRef_isStack (uref))
+	    {
+	      alkind pkind = sRef_getAliasKind (pref);
+
+	      if (alkind_isKnown (pkind) && !alkind_isLocal (pkind)
+		  && !alkind_isStack (pkind))
+		{
+		  sRef_setAliasKind (uref, pkind, fileloc_undefined);
+		  sRef_setOrigAliasKind (uref, pkind);
+		}
+	      else
+		{
+		  sRef_setAliasKind (uref, AK_IMPTEMP, fileloc_undefined);
+		  sRef_setOrigAliasKind (uref, AK_IMPTEMP);
+
+		  if (uentry_isOut (param))
+		    {
+		      ;
+		    }
+		  else
+		    {
+		      sRef_setDefined (uref, fileloc_undefined);
+		    }
+		}
+
+	      	    }
+
+	  	  usymtab_addMustAlias (uref, pref);   
+
+	  if (!(uentry_isOnly (param) || uentry_isUnique (param)))
+	    {
+	      sRef s = sRef_makeExternal (uref);
+
+	      	      usymtab_addMustAlias (uref, s);   
+	    }
+	  
+	  if (sRef_isKillRef (pref))
+	    {
+	      sRef_setAliasKind (uref, AK_NEWREF, fileloc_undefined);
+	      sRef_setOrigAliasKind (uref, AK_KILLREF);
+	    }
+	  else if (sRef_isRefCounted (uref))
+	    {
+	      sRef_setOrigAliasKind (uref, AK_REFCOUNTED);
+	    }
+	  else
+	    {
+	      /* was AK_UNIQUE */
+	      sRef_setOrigAliasKind (uref, AK_LOCAL);
+	    }
+	}
+      else
+	{
+	  	}
+    } end_usymtab_entries;
+
+
+  if (uentry_hasSpecialClauses (fcn))
+    {
+      specialClauses clauses = uentry_getSpecialClauses (fcn);
+
+      specialClauses_preElements (clauses, cl)
+	{
+	  sRefSet refs = specialClause_getRefs (cl);
+	  sRefMod modf = specialClause_getEntryFunction (cl);
+
+	  
+	  sRefSet_elements (refs, el)
+	    {
+	      sRef base = sRef_getRootBase (el);
+	      
+	      if (sRef_isResult (base))
+		{
+		  ; /* nothing to do before */
+		}
+	      else if (sRef_isParam (base))
+		{
+		  if (modf != NULL)
+		    {
+		      sRef sb = sRef_updateSref (el);
+		      sRefSet aliases = usymtab_allAliases (sb);
+		      
+		      		      modf (sb, fileloc_undefined);
+		      		      
+		      sRefSet_elements (aliases, sr)
+			{
+			  			  modf (sr, fileloc_undefined);
+			  			} end_sRefSet_elements ;
+
+		      sRefSet_free (aliases);
+		    }
+		}
+	      else
+		{
+		  if (sRef_isValid (base))
+		    {
+		      BADBRANCH;
+		    }
+		}
+	    } end_sRefSet_elements ; 	  
+	} end_specialClauses_preElements ;
+    }
+  }
+  
+void
+usymtab_enterFunctionScope (uentry fcn)
+  /*@globals utab, filetab, globtab@*/
+  /*@modifies utab@*/
+{
+  usymtab t = usymtab_create (US_NORMAL, utab, TRUE);
+
+  if (utab->lexlevel != fileScope)
+    {
+      if (utab->lexlevel > fileScope)
+	{
+	  llparseerror (cstring_makeLiteral ("New function scope inside function."));
+	  
+	  while (utab->lexlevel > fileScope)
+	    {
+	      /*@i@*/ utab = usymtab_dropEnv (utab);
+              /*@-branchstate@*/
+            }
+	  /*@=branchstate@*/
+	}
+      else
+	{
+	  llfatalbug (cstring_makeLiteral ("New function not inside file."));
+	}
+    /*@-branchstate@*/ } /*@=branchstate@*/
+
+  globSet_allElements (uentry_getGlobs (fcn), el)
+    {
+      
+      if (sRef_isUndefGlob (el))
+	{
+	  int index = sRef_getScopeIndex (el);
+	  sRef sr = sRef_updateSref (el);
+	  fileloc loc = uentry_whereEarliest (fcn);
+	  
+	  if (sRef_isFileStatic (el))
+	    {
+	      ctype ct = sRef_getType (el);
+	      uentry ue;
+	      
+	      llassert (usymtab_isDefined (filetab));
+
+	      ue = usymtab_fetchIndex (filetab, index);
+	      
+	      if (ctype_isRealArray (ct) || ctype_isRealSU (ct))
+		{
+		  sRef_setAllocated (sr, loc);
+		}
+	      else
+		{
+		  sRef_setUndefined (sr, loc);
+		}
+	    }
+	  else
+	    {
+	      uentry ue = globtab->entries[index];
+	      ctype ct = uentry_getType (ue);
+	      
+	      if (ctype_isArray (ct) || ctype_isSU (ct))
+		{
+		  sRef_setAllocated (sr, loc);
+		}
+	      else
+		{
+		  sRef_setUndefined (sr, loc);
+		}
+	    }
+	}
+      else if (sRef_isAllocated (el))
+	{
+	  sRef sr = sRef_updateSref (el);
+	  fileloc loc = uentry_whereEarliest (fcn);
+	  
+	  sRef_setAllocated (sr, loc);
+	}
+      else if (sRef_isPartial (el))
+	{
+	  sRef sr = sRef_updateSref (el);
+	  fileloc loc = uentry_whereEarliest (fcn);
+
+	  sRef_setPartial (sr, loc);
+	}
+      else
+	{
+	  /* defined */ ;
+	}
+    } end_globSet_allElements;
+
+  utab = t;
+}
+
+static void
+usymtab_caseBranch (void)
+  /*@modifies utab@*/
+{
+  usymtab t = usymtab_create (US_CBRANCH, utab, FALSE);
+  utab = t;
+}
+
+void
+usymtab_switchBranch (/*@unused@*/ exprNode s)
+  /*@modifies utab@*/
+{
+  usymtab t = usymtab_create (US_SWITCH, utab, FALSE);
+
+  t->aliases = aliasTable_copy (utab->aliases);
+    utab = t;
+}
+
+void
+usymtab_trueBranch (/*@only@*/ guardSet guards)
+  /*@modifies utab@*/
+{
+  usymtab t = usymtab_create (US_TBRANCH, utab, FALSE);
+
+  /*
+  ** not true! (could be in a macro)
+  **
+  ** llassertprint (utab->lexlevel > paramsScope,
+  ** ("not in scope: %s", usymtab_unparseLocal ()));
+  **
+  */
+
+  guardSet_free (t->guards);
+  t->guards = guards;
+
+    aliasTable_free (t->aliases);
+  t->aliases = aliasTable_copy (utab->aliases);
+  
+    utab = t;
+}
+
+/*
+** consider,
+** 
+**   { int a; if (...) a = 3; < a may be undefined here!
+**
+*/
+
+void
+usymtab_popTrueBranch (exprNode pred, exprNode expr, clause cl)
+{
+  /*
+  ** add a false branch
+  ** (could be done more efficiently as a special case, but
+  ** it is better to only maintain one version of the code)
+  */
+
+  usymtab_altBranch (guardSet_invert (exprNode_getGuards (pred)));
+  usymtab_popBranches (pred, expr, exprNode_undefined, TRUE, cl);
+}
+
+void
+usymtab_popCaseBranch () /*@modifies utab@*/
+{
+  llassert (utab->kind == US_CBRANCH);
+  usymtab_quietPlainExitScope ();
+}
+
+void
+usymtab_popTrueExecBranch (exprNode pred, exprNode expr, clause cl)
+{
+  /*
+  ** add a false branch that must return --- that is,
+  ** the true branch is always executed!
+  */
+  
+  usymtab_altBranch (guardSet_invert (exprNode_getGuards (pred)));
+  usymtab_popBranches (pred, expr, exprNode_makeMustExit (), FALSE, cl);
+}
+
+void
+usymtab_popOrBranch (exprNode pred, exprNode expr)
+  /*@modifies utab@*/
+{
+  bool mustReturn;
+  usymtab env = utab->env;
+  usymtab otab = utab;
+  int i = 0;
+
+  llassert (env != NULL);
+
+  if (exprNode_isError (expr))
+    {
+      mustReturn = FALSE;
+    }
+  else
+    {
+      mustReturn = exprNode_mustEscape (expr);
+    }
+
+  
+  llassert (utab->kind == US_TBRANCH);
+
+  /*
+  ** merge each entry in table with its original
+  ** unless execution cannot continue after this branch
+  */
+
+  for (i = 0; i < utab->nentries; i++)
+    {
+      uentry current = utab->entries[i];
+      uentry old = usymtab_lookupAux (env, uentry_rawName (current));
+
+      uentry_mergeState (old, current, exprNode_loc (expr), 
+			 mustReturn, FALSE, TRUE, ORCLAUSE);
+    }
+  
+  
+  if (mustReturn)
+    {
+      env->guards = guardSet_levelUnionFree (env->guards, 
+					     guardSet_invert (exprNode_getGuards (pred)), 
+					     env->lexlevel);
+    }
+  else
+    {
+      env->aliases = aliasTable_levelUnion (env->aliases, otab->aliases, env->lexlevel);
+    }
+ 
+  /* env is now utab */
+  usymtab_quietPlainExitScope ();
+}
+
+/*
+** case syntax in C is very unrestricted.  This is unfortunate.
+**
+** A switch case is ended either by a new case or default, or
+** a close } that may close the switch or some other control
+** structure.  
+*/
+
+bool
+usymtab_newCase (/*@unused@*/ exprNode pred, exprNode last)
+  /*@modifies utab@*/
+{
+  bool mustBreak = usymtab_mustBreak (utab);
+  bool mustReturn = usymtab_mustEscape (utab);
+  usymtab stab = utab;
+
+  /*
+  ** Find last case (or outer switch)
+  */
+
+  while (stab->kind != US_CBRANCH && stab->kind != US_SWITCH)
+    {
+      stab = stab->env;
+      llassert (stab != GLOBAL_ENV);
+    }
+
+  /* ??? */
+
+  while (stab->kind == US_CBRANCH)
+    {
+      stab = stab->env;
+      llassert (stab != GLOBAL_ENV);
+    }
+  
+  /*
+  ** if its a fall through case, merge in outside entries and last case.
+  **
+  ** e.g.,
+  **        ...
+  **        switch
+  **          case 1: x = 3; 
+  **          case 2: << x may not be defined
+  **
+  */
+
+  if (!mustBreak && !mustReturn && utab->kind == US_CBRANCH)
+    {
+      llassert (stab->kind == US_SWITCH || stab->kind == US_NORMAL);
+
+      usymtab_entries (utab, ue)  /* but, keep track of used variables */
+	{
+	  uentry old = usymtab_lookupAux (stab, uentry_rawName (ue));
+
+	  llassert (uentry_isValid (old));
+
+	  /* modifies ue, not old */
+	  
+	  uentry_mergeState (ue, old, exprNode_loc (last),
+			     FALSE, FALSE, TRUE, CASECLAUSE); 
+	} end_usymtab_entries;
+
+      utab->aliases = aliasTable_levelUnion (utab->aliases, 
+					     stab->aliases, utab->lexlevel);
+      
+      /* 
+      ** No need for a new branch.
+      */
+      
+      return FALSE;
+    }
+  else
+    {
+      usymtab_caseBranch ();
+      /*@-mustfree@*/ /*< utab->aliases >*/
+      utab->aliases = aliasTable_copy (stab->aliases);
+      /*@=mustfree@*/
+      
+      return TRUE;
+    }
+}
+
+/*
+** for && (both pred and expr are executed)
+*/
+
+void
+usymtab_popAndBranch (exprNode pred, /*@unused@*/ exprNode expr)
+  /*@modifies utab@*/
+{
+  usymtab env = utab->env;
+  usymtab otab= utab;
+  int i = 0;
+
+    llassert (utab->kind == US_TBRANCH);
+
+  /*
+  ** merge each entry in table with its original
+  ** unless execution cannot continue after this branch
+  */
+
+  for (i = 0; i < utab->nentries; i++)
+    {
+      uentry current = utab->entries[i];
+      sRef   tref = uentry_getSref (current);
+      uentry old = usymtab_lookupAux (env, uentry_rawName (current));
+      sRef   oref = uentry_getSref (old);
+
+      /* note that is current is in a nested branch,
+	 it may create a "new" old entry. */
+
+      llassert (uentry_isValid (old));
+      uentry_mergeState (old, current, exprNode_loc (expr), 
+			 FALSE, FALSE, TRUE, ANDCLAUSE);
+
+      /*
+      ** if is it defined by the second clause, then it should be defined.
+      */
+
+      if (sRef_isAnyDefined (tref)
+	  && (sRef_isAllocated (oref) || sRef_isStateUndefined (oref)))
+	{
+	  sRef_setDefined (oref, g_currentloc);
+	}
+    }
+
+  utab->guards = guardSet_levelUnionFree (utab->guards, 
+					  guardSet_invert (exprNode_getGuards (pred)), 
+					  utab->lexlevel);
+  utab->aliases = aliasTable_levelUnion (utab->aliases, otab->aliases, utab->lexlevel);
+
+  usymtab_quietPlainExitScope ();
+
+  }
+
+/*
+** Stack should be [ US_CBRANCH+ US_SWITCH ]
+** Only branches which do not return (except possibly the last branch) are included.
+**
+** Conditionally merge state from all CBRANCHes.
+**
+** If allpaths is TRUE, then all possible executions go through some switch 
+** case, and the original scope is not merged.
+*/
+
+void
+usymtab_exitSwitch (/*@unused@*/ exprNode sw, bool allpaths)
+  /*@modifies utab@*/
+{
+  usymtab ttab = utab;
+  usymtab stab = ttab;
+  usymtab ltab = ttab;
+  bool lastMustReturn = usymtab_mustEscape (utab);
+  int i;
+  
+    
+  while (stab->kind == US_CBRANCH)
+    {
+      stab = stab->env;
+      llassert (stab != GLOBAL_ENV);
+    }
+
+  while (stab->kind == US_NORMAL)
+    {
+      stab = stab->env;
+      llassert (stab != GLOBAL_ENV);
+    }
+
+  llassert (stab->kind == US_SWITCH);
+
+  /* go to the scope outside the switch (US_SWITCH is just a marker! */
+  stab = stab->env; 
+  llassert (stab != GLOBAL_ENV);
+
+  
+  ttab = ttab->env;
+  llassert (usymtab_isDefined (ttab));
+  
+  if (ttab->kind == US_CBRANCH)
+    {
+      /* was quietPlainExitScope --- but, can't free it yet! */
+      utab = utab->env;
+      llassert (utab != GLOBAL_ENV);
+
+      while (ttab->kind == US_CBRANCH)
+	{
+	  /*
+	  ** (from popTrueBranch)
+	  */	  
+	  
+	  bool mustReturn = usymtab_mustEscape (ttab);
+	  bool mustBreak = usymtab_mustBreak (ttab);
+	  
+	  usymtab_entries (ttab, current)
+	    {
+	      uentry old = /*@-compmempass@*/ usymtab_lookupAux (ltab, uentry_rawName (current));
+       	                   /*@=compmempass@*/ 
+	      
+	      /*
+	      ** note that is this is in a nested branch,
+	      ** it may create a "new" old entry. 
+	      */
+	   
+	      if (uentry_isValid (old))
+		{
+		  if (lastMustReturn)
+		    {
+		      uentry_mergeUses (current, old);
+		      uentry_setState (old, current);
+		    }
+		  else
+		    {
+		      uentry_mergeState (old, current, exprNode_loc (sw),
+					 mustReturn, FALSE, TRUE, SWITCHCLAUSE);
+		    }
+		}
+	      else
+		{
+		  ;
+		}
+	    } end_usymtab_entries;
+	  
+	  /*
+	  ** if entry is not in symbol table for this case, merge with pre-switch
+	  ** table
+	  */
+	  
+	  if (!mustReturn && !mustBreak)
+	    {
+	      usymtab_entries (stab, current)
+		{
+		  if (usymtab_getIndex (ttab, uentry_rawName (current)) == NOT_FOUND)
+		    {
+		      uentry old = /*@-compmempass@*/
+			usymtab_lookupAux (ltab, uentry_rawName (current));
+		      /*@=compmempass@*/
+
+		      llassert (uentry_isValid (old));
+		      uentry_mergeState (old, current, exprNode_loc (sw),
+					 FALSE, FALSE, TRUE, SWITCHCLAUSE);
+		    }
+		} end_usymtab_entries;
+	    }
+	  
+	  ltab->env = ttab->env; 
+	  ttab = ltab->env;
+
+	  /*
+	  ** Suprious error, becuase of environments.
+	  */
+
+	  /*@i1@*/ utab = ltab;
+
+	  lastMustReturn = FALSE;
+	  /*@-branchstate@*/ 
+	}
+    }
+  /*@=branchstate@*/
+
+  /*
+  ** now, there is one US_CBRANCH.  Merge this with the stab.
+  */
+  
+    
+  for (i = 0; i < ltab->nentries; i++)
+    {
+      uentry current = ltab->entries[i];
+      uentry old = usymtab_lookupAux (stab, uentry_rawName (current));
+      
+      /* note that is this is in a nested branch,
+	 it may create a "new" old entry. */
+      
+         
+      if (uentry_isValid (old))
+	{
+	  if (allpaths)
+	    {
+	      uentry_mergeUses (current, old);
+	      uentry_setState (old, current);
+	    }
+	  else
+	    {
+	      uentry_mergeState (old, current, exprNode_loc (sw), 
+				 FALSE, FALSE, TRUE, SWITCHCLAUSE);
+	    }
+	}
+      else
+	{
+	  	}
+    }
+  
+  /*
+  ** exit the switch
+  */
+  
+  
+  /*
+  ** switch may or may not be followed by a new scope
+  */
+
+  if (utab->kind == US_SWITCH)
+    {
+      usymtab_quietPlainExitScope ();  
+    }
+  else
+    {
+      usymtab_quietPlainExitScope ();
+      llassert (utab->kind == US_SWITCH);
+      usymtab_quietPlainExitScope ();   
+    }
+
+  }
+
+static void 
+updateNullState (sRef el, /*@notnull@*/ usymtab ttab, 
+		 /*@notnull@*/ usymtab ftab, bool trueGuard)
+{
+  sRef base = sRef_getRootBase (el);
+  int level = sRef_lexLevel (base);
+  
+        
+    
+  if (sRef_isCvar (base))
+    {
+      usymId index = sRef_getScopeIndex (base);
+      uentry ue = usymtab_getRefTab (ttab, level, index);
+
+      if (!uentry_isLset (ue)) 
+	{
+	  sRef sr = uentry_getSref (ue);
+
+	  if (trueGuard)
+	    {
+	      sRef_setDerivNullState (sr, el, NS_NOTNULL);
+	    }
+	  else 
+	    {
+	      if (!guardSet_isGuarded (ttab->guards, el) 
+		  && !sRef_isNotNull (sr))
+		{
+		  sRef_setDerivNullState (sr, el, NS_DEFNULL);
+		  		}
+	    }
+	}
+      else
+	{
+	  	}
+      
+      ue = usymtab_getRefTab (ftab, level, index);
+      
+      if (!uentry_isLset (ue)) 
+	{
+	  sRef sr = uentry_getSref (ue);
+	  
+	  
+	  if (!trueGuard) /* yikes!  forgot the ! */
+	    {
+	      sRef_setDerivNullState (sr, el, NS_NOTNULL);
+	    }
+	  else 
+	    {
+	      
+	      if (!guardSet_isGuarded (ftab->guards, el)
+		  && !sRef_isNotNull (sr))
+		{
+		  sRef_setDerivNullState (sr, el, NS_DEFNULL);
+		  		}
+	    }
+	}
+      else
+	{
+	  	}
+      
+          }
+
+      }
+
+void
+usymtab_popBranches (exprNode pred, exprNode tbranch, exprNode fbranch, 
+		     bool isOpt, clause cl)
+     /*@modifies utab@*/
+{
+  int i = 0;
+  usymtab ftab = utab;
+  usymtab ttab = utab->env;
+
+  fileloc loc;
+  usymtab env;
+  guardSet guards = exprNode_getGuards (pred);
+  sRefSet tguards = guardSet_getTrueGuards (guards);
+  sRefSet fguards = guardSet_getFalseGuards (guards);
+  bool mustReturnT = exprNode_mustEscape (tbranch);
+  bool mustReturnF = exprNode_mustEscape (fbranch);
+  
+  if (exprNode_isDefined (fbranch))
+    {
+      loc = exprNode_loc (fbranch);
+    }
+  else
+    {
+      loc = exprNode_loc (tbranch);
+    }
+
+  llassert (usymtab_isDefined (ttab));
+  
+  env = ttab->env;
+  
+  llassert (usymtab_isDefined (env));
+  llassert (ftab->kind == US_FBRANCH);
+  llassert (ttab->kind == US_TBRANCH);
+
+  /*
+  ** For each element that is true guarded (i.e., if (x != NULL)) 
+  **          make x = null in false branch,
+  **          and x = notnull in true branch.
+  **          unless x was set locally in that branch.
+  ** For each element that is false guarded (x == NULL) 
+  **          make x = null in true, notnull in false.
+  **                      
+  ** For each element that is either guarded (pred(x)) 
+  **     
+  */
+  
+  sRefSet_allElements (tguards, el)
+    {
+      updateNullState (el, ttab, ftab, TRUE);
+    } end_sRefSet_allElements;
+    
+  sRefSet_allElements (fguards, el)
+    {
+      updateNullState (el, ttab, ftab, FALSE);
+    } end_sRefSet_allElements;
+
+  /*
+  ** 
+  ** if an entry is in both true and false, merge the entries,
+  ** then replace original with new state.
+  **
+  ** if an entry is in one table, merge it with the original.
+  */
+    
+  for (i = 0; i < ftab->nentries; i++)
+    {
+      uentry fthis = ftab->entries[i];
+      uentry old = usymtab_lookupAux (env, uentry_rawName (fthis));
+      int    tindex = usymtab_getIndex (ttab, uentry_rawName (fthis));
+      
+      if (uentry_isUndefined (old))
+	{
+	  /* possible entry was added as an undefined id */
+	  continue;
+	}
+      
+      if (tindex != NOT_FOUND)
+	{
+	  uentry tthis = ttab->entries[tindex];
+	  
+	  /* note that is this is in a nested branch,
+	     it may create a "new" old entry. */
+	  
+	  if (!mustReturnF)
+	    {
+	      if (!mustReturnT)
+		{
+		  
+		  uentry_mergeState (fthis, tthis, loc,
+				     mustReturnT, FALSE, FALSE, cl);
+		}
+	      else
+		{
+		  uentry_mergeUses (fthis, tthis);
+		}
+	      
+	      uentry_setState (old, fthis);
+	      
+	      /*@-mustfree@*/ 
+	    } 
+	  /*@=mustfree@*/
+	  else
+	    {
+	      uentry_setState (old, tthis);
+	      uentry_mergeState (old, fthis, loc, mustReturnF, 
+				 TRUE, FALSE, cl);
+	    }
+	  
+	  ttab->entries[tindex] = uentry_undefined;
+	  uentry_free (tthis);
+	}
+      else
+	{
+	  uentry_mergeState (old, fthis, loc, mustReturnF, TRUE, FALSE, cl);
+	}
+    }
+
+  for (i = 0; i < ttab->nentries; i++)
+    {
+      uentry current = ttab->entries[i];
+      
+      if (!uentry_isUndefined (current)) 
+	{
+	  uentry old = usymtab_lookupAux (env, uentry_rawName (current));
+
+	  llassertprint (!uentry_isUndefined (old), ("name: <%s>", 
+						     uentry_rawName (current)));
+	  if (mustReturnF)
+	    {
+	      uentry_mergeUses (current, old); 
+	      uentry_setState (old, current);
+	    }
+	  else
+	    {
+	      /*
+              ** assumes false branch is a fall-through if
+              ** fbranch is not defined.  This is true, unless
+              ** where was some greivous error in processing
+              ** the else branch of an if-then, in which case
+              ** this is probably the right thing to do anyway.
+              */
+
+	      uentry_mergeState (old, current, loc, mustReturnT, 
+				 FALSE, isOpt, cl);
+	    }
+	}
+    }
+
+  
+  /*
+  ** Plain levelUnion doesn't work, since we need to use the sRef's in env->aliases
+  ** if they are present.
+  */
+
+  llassert (NOALIAS (env->aliases, ttab->aliases));
+  llassert (NOALIAS (env->aliases, ftab->aliases));
+
+  aliasTable_free (env->aliases);  
+
+  env->aliases = aliasTable_levelUnionNew (ttab->aliases, 
+					   ftab->aliases, env->lexlevel);
+
+  aliasTable_fixSrefs (env->aliases);
+  
+  /* exit true and false scopes */
+  usymtab_quietPlainExitScope ();
+  usymtab_quietPlainExitScope ();
+  
+  if (mustReturnT)
+    {
+      utab->guards = guardSet_levelUnionFree 
+	(utab->guards, 
+	 guardSet_invert (exprNode_getGuards (pred)), 
+	 utab->lexlevel);
+    }
+
+  if (mustReturnF)
+    {
+      utab->guards = guardSet_levelUnion (utab->guards, 
+					  exprNode_getGuards (pred), 
+					  utab->lexlevel);
+    }
+
+  DPRINTF (("Here."));
+}
+
+static void usymtab_fixCases (void) /*@modifies utab@*/ {
+  while (utab->kind == US_CBRANCH)
+    {
+      usymtab_quietPlainExitScope ();
+    }
+
+  llassert (utab->kind != US_CBRANCH);
+}
+
+void
+usymtab_altBranch (/*@only@*/ guardSet guards)
+  /*@modifies utab@*/
+{
+  usymtab t = usymtab_create (US_FBRANCH, utab, FALSE);
+  usymtab parent = utab->env;
+
+  /*
+  ** If we are in a case, need to close it.  The C syntax
+  ** is very liberal, so this kludge is necessary.
+  */
+
+  usymtab_fixCases ();
+
+  DPRINTF (("Current kind: %s", usymtab_unparseStack ()));
+  llassert (utab->kind == US_TBRANCH);
+  llassert (parent != GLOBAL_ENV);
+
+  guardSet_free (t->guards);
+  t->guards = guards;
+
+  aliasTable_free (t->aliases);
+  t->aliases = aliasTable_copy (parent->aliases);
+    
+  utab = t;
+}
+
+void
+usymtab_allDefined (void)
+   /*@globals utab, globtab@*/
+{
+  int i;
+
+  llassert (utab == globtab);
+
+  for (i = 0; i < utab->nentries; i++)
+    {
+      uentry e = utab->entries[i];
+
+      if (uentry_isPriv (e))
+	{
+	 ; /* no need to define it */
+	}
+      else
+	{
+	  if (context_getFlag (FLG_SPECUNDECL))
+	    {
+	      fileloc sloc = uentry_whereSpecified (e);
+	      fileloc dloc = uentry_whereDeclared (e);
+
+	      if (fileloc_isDefined (sloc) 
+		  && !uentry_isFakeTag (e)
+		  && !fileloc_isDefined (dloc))
+		{
+		  voptgenerror 
+		    (FLG_SPECUNDECL,
+		     message ("%s %q specified but not declared",
+			      ekind_capName (uentry_getKind (e)),
+			      uentry_getName (e)),
+		     sloc);
+		}
+	    }
+	  
+	  if (!uentry_isCodeDefined (e))
+	    {
+	      fileloc dloc = uentry_whereDeclared (e);
+	      
+	      if (fileloc_isLib (dloc))
+		{
+		 ;
+		}
+	      else if (fileloc_isDefined (dloc))
+		{
+		  if (!uentry_isAnyTag (e))
+		    {
+		      if (fileloc_isUser (dloc))
+			{
+			  voptgenerror 
+			    (FLG_DECLUNDEF,
+			     message ("%s %q declared but not defined",
+				      ekind_capName (uentry_getKind (e)),
+				      uentry_getName (e)),
+			     dloc);
+			}
+		    }
+		}
+	      else
+		{
+		  fileloc sloc = uentry_whereSpecified (e);
+
+		  if (fileloc_isDefined (sloc) 
+		      && !fileloc_isImport (sloc)
+		      && !fileloc_isLib (sloc)
+		      && !fileloc_isPreproc (sloc)
+		      && !uentry_isFakeTag (e))
+		    {
+		      if (uentry_isVariable (e) || uentry_isFunction (e))
+			{
+			  voptgenerror 
+			    (FLG_SPECUNDEF,
+			     message ("%s %q specified but not declared or defined",
+				      ekind_capName (uentry_getKind (e)),
+				      uentry_getName (e)),
+			     sloc);
+			}
+		      else
+			{
+			  voptgenerror 
+			    (FLG_SPECUNDEF,
+			     message ("%s %q specified but not defined",
+				      ekind_capName (uentry_getKind (e)),
+				      uentry_getName (e)),
+			     sloc);
+			}
+		    }
+		}
+	    }
+	}
+    }
+}
+
+void usymtab_exportHeader (void)
+     /*@globals utab@*/
+{
+  int i;
+
+  for (i = 0; i < utab->nentries; i++)
+    {
+      uentry ce = utab->entries[i];
+
+      if (!uentry_isDatatype (ce) 
+	  && !uentry_isAnyTag (ce) 
+	  && !uentry_isEitherConstant (ce) && !uentry_isStatic (ce)
+	  && !uentry_isExternal (ce)
+	  && !uentry_isForward (ce))
+	{
+	  fileloc fwhere = uentry_whereDeclared (ce);
+
+	  if (fileloc_isUndefined (fwhere)
+	      && uentry_isFunction (ce))
+	    {
+	      fwhere = uentry_whereDefined (ce);
+	    }
+
+	  if (fileloc_isDefined (fwhere) 
+	      && !fileloc_isHeader (fwhere)
+	      && !(fileloc_isSpecialFile (fwhere)
+		   && !context_getFlag (FLG_UNUSEDSPECIAL)))
+	    {
+	      if (uentry_isVariable (ce))
+		{
+		  if (optgenerror
+		      (FLG_EXPORTHEADERVAR,
+		       message ("%s %q exported but not declared in header file", 
+				ekind_capName (uentry_getKind (ce)),
+				uentry_getName (ce)),
+		       fwhere))
+		    {
+		      uentry_showDefSpecInfo (ce, fwhere);
+		    }
+		}
+	      else
+		{
+		  if (!uentry_isIter (ce)
+		      && !uentry_isEndIter (ce)
+		      && !uentry_isExpandedMacro (ce))
+		    {
+		      if (uentry_isFunction (ce) 
+			  && cstring_equalLit (uentry_rawName (ce), "main"))
+			{
+			  ; /* no error for main */
+			}
+		      else
+			{
+			  if (optgenerror
+			      (FLG_EXPORTHEADER,
+			       message ("%s %q exported but not declared "
+					"in header file", 
+					ekind_capName (uentry_getKind (ce)),
+					uentry_getName (ce)),
+			       fwhere))
+			    {
+			      uentry_showDefSpecInfo (ce, fwhere);
+			    }
+			}
+		    }
+		}
+	    }
+	}
+    }
+}
+
+void usymtab_exportLocal (void)
+   /*@globals utab@*/
+{
+  int i;
+
+  
+  for (i = 0; i < utab->nentries; i++)
+    {
+      uentry ce = utab->entries[i];
+
+      
+      if (!uentry_isDatatype (ce) && !uentry_isAnyTag (ce) 
+	  && !uentry_isEitherConstant (ce) 
+	  && !uentry_isIter (ce)
+	  && !uentry_isEndIter (ce)
+	  && !uentry_isExpandedMacro (ce)
+	  && uentry_isUsed (ce))
+	{
+	  /* check static uses */
+	  filelocList fuses = uentry_getUses (ce);
+	  fileloc mod = uentry_whereDefined (ce);
+	  bool ok = filelocList_isEmpty (fuses);
+	  fileloc fwhere = uentry_whereDeclared (ce);
+
+	  if (fileloc_isSpecialFile (fwhere)
+	      && !context_getFlag (FLG_UNUSEDSPECIAL))
+	    {
+	      ok = TRUE; /* no errors for special files */
+	    }
+	  else
+	    {
+	      filelocList_elements (fuses, uloc)
+		{
+		  if (fileloc_isUndefined (uloc) || !fileloc_sameModule (uloc, mod))
+		    {
+		      ok = TRUE;
+		      /*@innerbreak@*/ break;
+		    }
+		} end_filelocList_elements;
+	    }
+
+	  if (!ok)
+	    {
+	      if (optgenerror
+		  (FLG_EXPORTLOCAL,
+		   message ("%s exported but not used outside %s: %q", 
+			    ekind_capName (uentry_getKind (ce)),
+			    fileloc_getBase (mod),
+			    uentry_getName (ce)),
+		   fwhere))
+		{
+		  uentry_showDefSpecInfo (ce, fwhere);
+		}
+	    }
+	}
+    }
+}
+
+void
+usymtab_allUsed (void)
+  /*@globals utab@*/
+{
+  int i;
+  bool isFileStatic = usymtab_inFileScope ();
+  cstring last_file = cstring_undefined;
+
+  for (i = 0; i < utab->nentries; i++)
+    {
+      bool hasError = FALSE;
+      uentry ce = utab->entries[i];
+      fileloc fwhere = uentry_whereDeclared (ce);
+
+      if (fileloc_isUndefined (fwhere))
+	{
+	  fwhere = uentry_whereDefined (ce);
+	}
+
+      if (fileloc_isInvalid (fwhere) 
+	  || fileloc_isLib (fwhere) 
+	  || fileloc_isBuiltin (fwhere)
+	  || ((fileloc_isSpecialFile (fwhere)
+	       || fileloc_isSpecialFile (uentry_whereDefined (ce)))
+	      && !context_getFlag (FLG_UNUSEDSPECIAL)))
+	{
+	  ;
+	}
+      else if (!uentry_wasUsed (ce) && !uentry_isAnyTag (ce))
+	{
+	  cstring fname = fileloc_filename (fwhere);
+
+	  if (cstring_isUndefined (last_file))
+	    {
+	      last_file = fname;
+	    }
+	  else if (cstring_equal (fname, last_file))
+	    {
+	    }
+	  else
+	    {
+	      cleanupMessages ();
+	      last_file = fname;
+	    } 
+	  
+	  if (uentry_isParam (ce))
+	    {
+	      if (context_inMacro ())
+		{
+		  sRef cref = uentry_getSref (ce);
+
+		  if (uentry_isYield (ce))
+		    {
+		      ; /* no checks (for now) */
+		    }
+		  else if (sRef_isSafe (cref))
+		    {
+		      ; /* no error */
+		    }
+		  else
+		    {
+		      if (uentry_hasRealName (ce))
+			{
+			  hasError = 
+			    optgenerror (FLG_MACROPARAMS,
+					 message ("Macro parameter %q not used", 
+						  uentry_getName (ce)),
+					 fwhere);
+			}
+		    }
+		}
+	      else 
+		{
+		  if (cstring_equalFree (uentry_getName (ce), 
+					 cstring_makeLiteral ("...")))
+		    {
+		      ;
+		    }
+		  else
+		    {
+		      hasError = optgenerror (FLG_PARAMUNUSED,
+					      message ("Parameter %q not used",
+						       uentry_getName (ce)),
+					      fwhere);
+		    }
+		}
+	    } /* isParam */
+	  else if (uentry_isFunction (ce) || uentry_isIter (ce))
+	    {
+	      if (fileloc_isUser (fwhere))
+		{
+		  hasError = optgenerror
+		    (FLG_FUNCUNUSED, 
+		     message ("%q %q declared but not used", 
+			      cstring_makeLiteral 
+			      (uentry_isIter (ce) ? "Iterator" 
+			       : (isFileStatic ? "File static function" : "Function")),
+			      uentry_getName (ce)),
+		     fwhere);
+		}
+	    }
+	  else if (uentry_isEndIter (ce))
+	    {
+	      ; /* no error (already reported for iter */
+	    }
+	  else if (uentry_isEnumConstant (ce))
+	    {
+	      if (fileloc_isUser (fwhere))
+		{
+		  hasError = optgenerror
+		    (FLG_ENUMMEMUNUSED,
+		     message ("Enum member %q not used", 
+			      uentry_getName (ce)),
+		     fwhere);
+		}
+	    }
+	  else if (uentry_isConstant (ce))
+	    {
+	      if (fileloc_isUser (fwhere))
+		{
+		  hasError = optgenerror
+		    (FLG_CONSTUNUSED,
+		     message ("Constant %q declared but not used", 
+			      uentry_getName (ce)),
+		     fwhere);
+		}
+	    }
+	  else if (uentry_isDatatype (ce))
+	    {
+	      if (fileloc_isUser (fwhere))
+		{
+		  hasError = optgenerror
+		    (FLG_TYPEUNUSED,
+		     message ("Type %q declared but not used", 
+			      uentry_getName (ce)),
+		     fwhere);
+		}
+	    }
+	  else if (!uentry_isRefParam (ce) && !uentry_isExpandedMacro (ce))
+	    { /* errors for ref params will be reported in the next scope */
+	      llassertprint (uentry_isVar (ce), 
+			     ("ce: %s", uentry_unparseFull (ce)));
+
+	      if (ctype_isFunction (uentry_getType (ce)))
+		{
+		  if (fileloc_isUser (fwhere))
+		    {
+		      hasError = optgenerror
+			(FLG_FUNCUNUSED,
+			 message ("%q %q declared but not used", 
+				  cstring_makeLiteral 
+				  (isFileStatic ? "File static function" 
+				   : "Function"),
+				  uentry_getName (ce)),
+			 fwhere);
+		    }
+		}
+	      else 
+		{
+		  if (fileloc_isUser (fwhere))
+		    {
+		      
+		      
+		      hasError = optgenerror 
+			(FLG_VARUNUSED,
+			 message ("%q %q declared but not used", 
+				  cstring_makeLiteral 
+				  (isFileStatic ? "File static variable" 
+				   : "Variable"), 
+				  uentry_getName (ce)),
+			 fwhere);
+		    }
+		}
+	    }
+	  else
+	    {
+	      ; /* no errors */
+	    }
+	} /* unused */
+      else if (uentry_isDatatype (ce) || uentry_isAnyTag (ce))
+	{ /* check all fields */
+	  ctype ct = uentry_getRealType (ce); 
+
+	  
+	  while (ctype_isAP (ct))
+	    {
+	      ct = ctype_getBaseType (ct);
+	    }
+
+	  
+	  if (ctype_isSU (ct))
+	    {
+	      uentryList fields = ctype_getFields (ct);
+
+	      uentryList_elements (fields, field)
+		{
+		  if (!uentry_isUsed (field))
+		    {
+		      if (uentry_hasName (ce))
+			{
+			  hasError |= optgenerror 
+			    (FLG_FIELDUNUSED,
+			     message ("Field %q of %s %q declared but not used", 
+				      uentry_getName (field),
+				      cstring_makeLiteralTemp
+				      (ctype_isStruct (ct) ? "structure" : "union"),
+				      uentry_getName (ce)),
+			     uentry_whereEarliest (field));
+			}
+		      else
+			{
+			  hasError |= optgenerror 
+			    (FLG_FIELDUNUSED,
+			     message ("Field %q of unnamed %s declared but not used", 
+				      uentry_getName (field),
+				      cstring_makeLiteralTemp
+				      (ctype_isStruct (ct) ? "structure" : "union")),
+			     uentry_whereEarliest (field));
+			}
+		      
+		      uentry_setUsed (field, fileloc_undefined);
+		    }
+		} end_uentryList_elements;
+	    }
+	}
+      else
+	{
+	  ; /* no errors */
+	}
+
+      if (hasError)
+	{
+	  if (uentry_isParam (ce) && context_inMacro ())
+	    {
+	      if (fileloc_isDefined (uentry_whereSpecified (ce)))
+		{
+		  uentry_showWhereSpecified (ce);
+		}
+	    }
+	  else
+	    {
+	      uentry_showDefSpecInfo (ce, fwhere);
+	    }
+
+	  uentry_setUsed (ce, fileloc_undefined);
+	}
+    }
+}
+
+static void
+checkGlobalReturn (uentry glob, sRef orig)
+{
+  sRef sr = uentry_getSref (glob);
+  
+  
+  if (context_getFlag (FLG_GLOBSTATE))
+    {
+      if (sRef_isKilledGlob (orig))
+	{
+	  if (sRef_isStateUndefined (sr)
+	      || sRef_isUnuseable (sr)
+	      || sRef_isStateUnknown (sr)
+	      || sRef_isDead (sr))
+	    {
+	      ;
+	    }
+	  else
+	    {
+	      ctype ct = ctype_realType (uentry_getType (glob));
+
+	      if (ctype_isVisiblySharable (ct))
+		{
+		  if (optgenerror 
+		      (FLG_GLOBSTATE,
+		       message 
+		       ("Killed global %q not released before return",
+			uentry_getName (glob)),
+		       g_currentloc))
+		    {
+		      sRef_showStateInfo (sr);
+		      		    }
+		}
+	      else
+		{
+		  		  sRef_protectDerivs ();
+		  (void) checkGlobalDestroyed (sr, g_currentloc);
+		  sRef_clearProtectDerivs ();
+		}
+	    }
+	}
+      else
+	{
+	  if (sRef_isStateUndefined (sr))
+	    {
+	      if (optgenerror (FLG_GLOBSTATE,
+			       message 
+			       ("Function returns with global %q undefined",
+				uentry_getName (glob)),
+			       g_currentloc))
+		{
+		  sRef_showStateInfo (sr);
+		}
+	    }
+	  else 
+	    {
+	      if (sRef_isDead (sr))
+		{
+		  if (optgenerror 
+		      (FLG_GLOBSTATE,
+		       message ("Function returns with global %q "
+				"referencing released storage",
+				uentry_getName (glob)),
+		       g_currentloc))
+		    {
+		      sRef_showStateInfo (sr);
+		      sRef_setDefState (sr, SS_UNKNOWN, fileloc_undefined);
+		    }
+		}
+	      
+	      if (ctype_isRealPointer (uentry_getType (glob)) &&
+		  sRef_possiblyNull (sr) && !uentry_possiblyNull (glob))
+		{
+		  if (optgenerror 
+		      (FLG_GLOBSTATE,
+		       message ("Function returns with non-null global %q "
+				"referencing null storage",
+				uentry_getName (glob)),
+		       g_currentloc))
+		    {
+		      sRef_showNullInfo (sr);
+		    }
+		}
+	      else
+		{
+		  checkGlobReturn (glob);
+		}
+	    }
+	}
+    }
+}
+
+/*
+** remember: check alias globals
+*/
+
+void usymtab_checkFinalScope (bool isReturn)
+  /*@globals utab@*/
+{
+  bool mustFree = context_getFlag (FLG_MUSTFREE);
+  bool mustDefine = context_getFlag (FLG_MUSTDEFINE);
+  /* bool mustNotAlias = context_getFlag (FLG_MUSTNOTALIAS); */
+  sRefSet checked = sRefSet_new ();
+  usymtab stab = utab;
+  int i;
+    
+  /*
+  ** need to check all scopes out to function parameters.
+  */
+
+  do 
+    {
+      for (i = 0; i < stab->nentries; i++)
+	{
+	  uentry ce = stab->entries[i];
+	  sRef sr = uentry_getSref (ce);
+	  sRef rb = sRef_getRootBase (sr);
+
+	  if (ctype_isFunction (uentry_getType (ce)))
+	    {
+	      /*@innercontinue@*/ continue;
+	    }
+
+	  if (mustFree)
+	    {
+	      DPRINTF (("Check entry: %s", uentry_unparseFull (ce)));
+
+	      if (!sRefSet_member (checked, sr) && !sRef_isGlobal (rb))
+		{
+		  if (ctype_isRealSU (uentry_getType (ce))
+		      && !uentry_isAnyParam (ce)
+		      && !uentry_isRefParam (ce)
+		      && !uentry_isStatic (ce)
+		      && !sRef_isDependent (sr)
+		      && !sRef_isOwned (sr))
+		    {
+		      sRefSet als = usymtab_allAliases (sr);
+
+		      
+		      if (sRefSet_isEmpty (als))
+			{
+			  checkLocalDestroyed (sr, g_currentloc);
+			}
+		      else
+			{
+			  /* aliased, no problem */ ;
+			}
+
+		      sRefSet_free (als);
+		    }
+		  else if
+		    (!uentry_isStatic (ce)
+		     && ((sRef_isNewRef (sr))
+			 || (((sRef_isOnly (sr) || sRef_isFresh (sr) 
+			       || sRef_isKeep (sr) || sRef_isOwned (sr))
+			      && !sRef_isDead (sr))
+			     && (!sRef_definitelyNull (sr))
+			     && (!usymtab_isProbableNull (sr)))))
+		      {
+			bool hasError = TRUE;
+			
+			/*
+    	     	        ** If its a scope exit, check if there is an alias.
+			** If so, make it only.  If not, there is an error.
+			*/
+			
+			if (!isReturn)
+			  {
+			    if (canLoseReference (sr, g_currentloc))
+			      {
+				hasError = FALSE;
+			      }
+			  }
+			
+			if (hasError)
+			  {
+			    if (sRef_hasLastReference (sr))
+			      {
+				sRef ar = sRef_getAliasInfoRef (sr);
+				
+				if (optgenerror 
+				    (FLG_MUSTFREE,
+				     message
+				     ("Last reference %q to %s storage %qnot %q before %q",
+				      sRef_unparse (sr),
+				      alkind_unparse (sRef_getAliasKind (sr)),
+				      sRef_unparseOpt (ar),
+				      cstring_makeLiteral (sRef_isKeep (sr) 
+							   ? "transferred" : "released"),
+				      cstring_makeLiteral (isReturn 
+							   ? "return" : "scope exit")),
+				     g_currentloc))
+				  {
+				    sRef_showRefLost (sr);
+				  }
+			      }
+			    else if (sRef_isNewRef (sr))
+			      {
+				if (optgenerror
+				    (FLG_MUSTFREE,
+				     message 
+				     ("%q %q not released before %q",
+				      cstring_makeLiteral 
+				      (alkind_isKillRef (sRef_getOrigAliasKind (sr))
+				       ? "Kill reference parameter" : "New reference"),
+				      uentry_getName (ce),
+				      cstring_makeLiteral (isReturn
+							   ? "return" : "scope exit")),
+				     g_currentloc))
+				  {
+				    sRef_showAliasInfo (sr);
+				  }
+			      }
+			    else 
+			      {
+				if (ctype_isRealSU (sRef_getType (sr)))
+				  {
+				    				    checkStructDestroyed (sr, g_currentloc);
+				  }
+				else
+				  {
+				    if (optgenerror
+					(FLG_MUSTFREE,
+					 message 
+					 ("%s storage %q not %q before %q",
+					  alkind_capName (sRef_getAliasKind (sr)),
+					  uentry_getName (ce),
+					  cstring_makeLiteral (sRef_isKeep (sr) 
+							       ? "transferred" : "released"),
+					  cstring_makeLiteral (isReturn 
+							       ? "return" : "scope exit")),
+					 g_currentloc))
+				      {
+					sRef_showAliasInfo (sr);
+				      }
+				  }
+			      }
+			  }
+		      }
+		  else
+		    {
+		      ;
+		    }
+		}
+	      else if (mustDefine && uentry_isOut (ce))
+		{
+		  if (!ynm_toBoolStrict (sRef_isReadable (sr)))
+		    {
+		      voptgenerror 
+			(FLG_MUSTDEFINE,
+			 message ("Out storage %q not defined before %q",
+				  uentry_getName (ce),
+				  cstring_makeLiteral 
+				  (isReturn ? "return" : "scope exit")),
+			 g_currentloc);
+		      
+		      /* uentry_showWhereDeclared (ce); */
+		    }
+		}
+	      else
+		{
+		  ; 
+		}
+	      
+	      /*
+	      ** also check state is okay
+	      */
+
+	      if (usymtab_lexicalLevel () > functionScope
+		  && uentry_isVariable (ce)
+		  && (sRef_isLocalVar (sr)
+		      && (sRef_isDependent (sr) || sRef_isLocalState (sr))))
+		{
+		  sRefSet ab = usymtab_aliasedBy (sr);
+
+		  /* should do something more efficient here */
+
+		  if (sRefSet_isEmpty (ab))
+		    {
+		      /* and no local ref */
+		      checkLoseRef (ce);
+		    }
+		  else
+		    {
+		      ;
+		    }
+		  
+		  sRefSet_free (ab);
+		}
+	      else 
+		{
+		  ;
+		}
+	      
+	      checked = sRefSet_insert (checked, sr);
+	    }
+	}
+      llassert (usymtab_isDefined (stab->env));
+
+      if (usymtab_isBranch (stab))
+	{
+	  stab = usymtab_dropEnv (stab);
+	}
+      else
+	{
+	  stab = stab->env;
+	}
+
+      llassert (stab != usymtab_undefined);
+    } while (isReturn && (stab->lexlevel >= paramsScope));
+
+    sRefSet_free (checked);
+
+  /*
+  ** for returns:
+  **      all globals are appropriately defined
+  **      all parameters are appropriately defined
+  **      special clauses are followed
+  */
+
+  if (isReturn || (utab->lexlevel == paramsScope))
+    {
+      uentry fcn = context_getHeader ();
+      uentryList params = context_getParams ();
+      globSet uglobs = context_getUsedGlobs ();
+      globSet sglobs = context_getGlobs ();
+
+            
+      if (isReturn && context_maybeSet (FLG_GLOBALIAS))
+	{ 
+	  aliasTable_checkGlobs (utab->aliases); 
+	}
+
+      /*
+      ** special clauses (defines, sets, allocates, releases) 
+      */
+
+      if (uentry_hasSpecialClauses (fcn))
+	{
+	  specialClauses clauses = uentry_getSpecialClauses (fcn);
+
+	  specialClauses_elements (clauses, cl)
+	    {
+	      sRefTest tst = specialClause_getPostTestFunction (cl);
+	      sRefSet rfs = specialClause_getRefs (cl);
+
+	      
+	      sRefSet_elements (rfs, el)
+		{
+		  sRef base = sRef_getRootBase (el);
+
+		  if (sRef_isResult (base))
+		    {
+		      ; 
+		    }
+		  else if (sRef_isParam (base))
+		    {
+		      sRef sr = sRef_updateSref (base);
+
+		      sr = sRef_fixBase (el, sr);
+
+		      
+		      if (tst != NULL && !tst (sr))
+			{
+			  if (optgenerror 
+			      (specialClause_postErrorCode (cl),
+			       message ("%s storage %qcorresponds to "
+					"storage listed in %q clause",
+					specialClause_postErrorString (cl, sr),
+					sRef_unparseOpt (sr),
+					specialClause_unparseKind (cl)),
+			       g_currentloc))
+			    {
+			      sRefShower ss = specialClause_getPostTestShower (cl);
+
+			      if (ss != NULL)
+				{
+				  ss (sr);
+				}
+			    }
+			  
+			  			}
+		    }
+		  else
+		    {
+		      if (sRef_isMeaningful (el))
+			{
+			  BADBRANCH;
+			}
+		    }
+		} end_sRefSet_elements ;
+
+	    } end_specialClauses_elements ;
+	}
+
+
+      /*
+      ** check parameters on return
+      */
+
+      uentryList_elements (params, arg)
+	{
+	  if (!uentry_isElipsisMarker (arg))
+	    {
+	      ctype rt = ctype_realType (uentry_getType (arg));
+
+	      if (ctype_isMutable (rt) || ctype_isSU (rt))
+		{
+		  uentry param = usymtab_lookupQuiet (utab, uentry_rawName (arg));
+		  checkParamReturn (param);
+		}
+	    }
+	} end_uentryList_elements;
+      
+      globSet_allElements (sglobs, el)
+	{
+	  uentry current = sRef_getUentry (el);
+
+	  if (uentry_isVariable (current) && !uentry_isRealFunction (current))
+	    {
+	      checkGlobalReturn (current, el);
+	    }
+	} end_globSet_allElements;
+
+      globSet_allElements (uglobs, el)
+	{
+	  if (!globSet_member (sglobs, el))
+	    {
+	      uentry current = sRef_getUentry (el);
+	      
+	      	      
+	      if (uentry_isVariable (current)
+		  && !uentry_isRealFunction (current))
+		{
+		  checkGlobalReturn (current, sRef_undefined);
+		}
+	    }
+	} end_globSet_allElements;
+    }
+  
+  }
+
+void
+usymtab_quietExitScope (fileloc loc) 
+   /*@globals utab, globtab, filetab; @*/ 
+   /*@modifies utab@*/
+{
+  usymtab t = utab->env;
+
+  if (utab->reftable != NULL)
+    {
+      int i;
+
+      for (i = 0; i < utab->nentries; i++)
+	{
+	  uentry current = utab->entries[i];	  
+	  uentry old = usymtab_lookupAux (t, uentry_rawName (current));
+
+	  uentry_mergeState (old, current, loc, FALSE, FALSE, FALSE, NOCLAUSE);
+	}
+    }
+
+  llassert (t != NULL);
+
+  if (t->lexlevel > paramsScope)
+    {
+      t->guards = guardSet_levelUnion (t->guards, utab->guards, t->lexlevel);
+      t->aliases = aliasTable_levelUnionSeq (t->aliases, utab->aliases, 
+					     t->lexlevel);
+      utab->aliases = aliasTable_undefined;
+    }
+
+  t->mustBreak = utab->mustBreak;
+  t->exitCode = utab->exitCode;
+
+  usymtab_freeLevel (utab);
+
+  utab = t;
+}
+
+/*
+** Exit a scope with no checking, lose alias states.
+** (When should this be used?)
+*/
+
+void usymtab_quietPlainExitScope (void)
+     /*@globals utab, globtab, filetab@*/
+     /*@modifies utab@*/
+{
+  usymtab t = utab->env;
+
+  llassert (t != NULL);
+  llassert (NOALIAS (utab->aliases, t->aliases));
+  usymtab_freeLevel (utab);
+  utab = t;
+}
+
+void usymtab_exitScope (exprNode expr)
+  /*@globals utab, filetab, globtab@*/
+  /*@modifies utab, globtab@*/
+{
+  usymtab ctab = usymtab_undefined;
+  usymtab lctab = usymtab_undefined;
+  bool mustReturn = exprNode_mustEscape (expr);
+  
+  if (utab->kind == US_CBRANCH)
+    {
+      /*
+      ** save the case branches, remove the first non-cbranch
+      */
+
+      ctab = utab;
+
+      while (utab->kind == US_CBRANCH) 
+	{
+	  lctab = utab;
+	  utab = utab->env;
+	  llassert (utab != GLOBAL_ENV);
+	}
+    }
+  
+  llassertprint (utab->kind != US_TBRANCH && utab->kind != US_FBRANCH
+		 && utab->kind != US_CBRANCH && utab->kind != US_SWITCH,
+		 ("exitScope: in branch: %s", usymtab_unparseStack()));
+
+  /*
+  ** check all variables in scope were used
+  */
+
+  /*
+  ** bogus errors if this is the normal inside a switch,
+  ** since cases have not been merged yet.  Should probably
+  ** still check this, but I'm too lazy at the moment...
+  */
+
+  llassertfatal (utab->env != GLOBAL_ENV);
+
+  if (utab->env->kind != US_SWITCH)
+    {
+      usymtab_allUsed ();
+    }
+
+  /*
+  ** check aliasing: all only params are released (dead)
+  **     definition: all out params are defined, all modified params 
+  **                     are completely defined
+  **
+  ** NOTE: note for exiting paramsScope, since checkReturn should be
+  ** called first.
+  */
+
+  if (!mustReturn && (usymtab_lexicalLevel () > functionScope))
+    {
+      /*
+      ** should only call this is end of scope is reachable...
+      */
+
+      usymtab_checkFinalScope (FALSE);
+    }
+
+  if (usymtab_lexicalLevel () == paramsScope && context_inFunctionLike ())
+    {
+      /*
+      ** leaving a function, need to fix up globals
+      */
+
+      uentryList params = context_getParams ();
+      globSet    globs = context_getUsedGlobs ();
+
+                  
+      uentryList_elements (params, ue)
+	{
+	  uentry_fixupSref (ue);
+	} end_uentryList_elements;
+
+      clearFunctionTypes ();
+
+      
+      globSet_allElements (globs, el)
+	{
+	  if (sRef_isCvar (el))
+	    {
+	      uentry current;
+	      int index = sRef_getScopeIndex (el);
+	      
+	      if (sRef_isFileStatic (el))
+		{
+		  llassert (usymtab_isDefined (filetab));
+		  current = usymtab_fetchIndex (filetab, index);
+		}
+	      else
+		{
+		  current = usymtab_fetchIndex (globtab, index);
+		}
+	      
+	      if (uentry_isVariable (current))
+		{
+		  uentry_fixupSref (current);
+		}
+	      else
+		{
+		  sRef_clearDerived (uentry_getSref (current));
+		}
+	    }
+	} end_globSet_allElements;
+    }
+  
+  usymtab_quietExitScope (exprNode_loc (expr));
+  
+  if (lctab != usymtab_undefined)
+    {
+      /*@i@*/ lctab->env = utab;  
+      /*@i@*/ utab = ctab;
+    /*@-branchstate@*/ } /*@=branchstate@*/
+/*@-globstate@*/
+}
+/*@=globstate@*/
+
+/*
+** yikes!  don't let the '170 kids see this one...
+*/
+
+int
+uentry_directParamNo (uentry ue)
+{
+  if (uentry_isVar (ue))
+    {
+      sRef sr = uentry_getSref (ue);
+
+      if (sRef_lexLevel (sr) == functionScope)
+	{
+	  /*@access sRef@*/ /*@-null@*/
+	  int index = sr->info->cvar->index;
+	  /*@noaccess sRef@*/ /*@=null@*/
+
+	  if (index < uentryList_size (context_getParams ()))
+	    {
+	      return index;
+	    }
+	}
+    }
+  return -1;
+}
+
+/*@dependent@*/ /*@exposed@*/ uentry
+  usymtab_getParam (int paramno)
+  /*@globals utab@*/
+{
+  /*
+  ** requires in a function context (checked)
+  **
+  ** depends on no nested functions --- the function
+  ** parameters are ALWAYS one scope inside the global scope
+  ** and entered in order!
+  */
+  usymtab s = utab;
+
+  if (!context_inFunctionLike ())
+    llfatalbug (message ("usymtab_getParam: not in function context: %q", 
+			 context_unparse ()));
+
+  while (s->lexlevel > paramsScope) 
+    {
+      s = s->env;
+    }
+
+  llassert (usymtab_isDefined (s));
+
+  if (paramno >= s->nentries)
+    {
+      /*  
+      ** Parse errors lead to this. 
+      */
+
+      uentry err = uentry_makeVariableLoc (cstring_makeLiteralTemp (""),
+					   ctype_unknown);
+      
+      uentry_markOwned (err);
+      return (err);
+    }
+
+  return (s->entries[paramno]);
+}
+
+static /*@dependent@*/ /*@exposed@*/ uentry 
+usymtab_getRefTab (/*@notnull@*/ usymtab u, int level, usymId index)
+{
+  uentry ue;
+
+  
+  ue = usymtab_getRefNoisy (u, level, index);
+
+  
+  if (uentry_isUndefined (ue))
+    {
+      llbug (message ("usymtab_getRef: out of range: %d. level = %d",
+		    index, level));
+    }
+
+  
+  return ue;
+}
+
+static /*@dependent@*/ /*@exposed@*/ usymtab 
+  usymtab_dropEnv (/*@notnull@*/ usymtab s)
+{
+  if (s->kind == US_CBRANCH)
+    {
+      usymtab t = s;
+
+      do 
+	{
+	  t = s;
+	  s = s->env;
+	  llassert (s != GLOBAL_ENV);
+	} while (s->kind == US_CBRANCH); 
+      /* drop all cases (except in nested scopes */ 
+
+      s = t;
+      llassert (s != GLOBAL_ENV);
+    }
+
+  if (s->kind == US_FBRANCH)
+    {
+      s = s->env; /* skip the true branch */
+      llassert (usymtab_isDefined (s));
+      llassert (s->kind == US_TBRANCH);
+    }
+
+  llassert (s != GLOBAL_ENV);
+  s = s->env;
+
+  return s;
+}
+
+/*@dependent@*/ /*@exposed@*/ uentry
+  usymtab_getRefQuiet (int level, usymId index)
+  /*@globals utab@*/
+{
+  usymtab s = utab;
+  
+  
+  llassert (s != NULL);
+  llassert (index >= 0);
+
+  if (level > s->lexlevel)
+    {
+            
+      return uentry_undefined;
+    }
+
+  llassertprint (level <= s->lexlevel, ("level: %d / lexlevel: %d", 
+					level, s->lexlevel)); 
+
+  while (s->lexlevel > level)
+    {
+      if (usymtab_isBranch (s))
+	{
+	  int eindex = refTable_lookup (s, level, index);
+
+	  if (eindex != NOT_FOUND)
+	    {
+	      return (s->entries[eindex]);
+	    }
+	}
+
+      s = usymtab_dropEnv (s);
+    }
+
+  while (usymtab_isBranch (s) && s->lexlevel == level)
+    {
+      int eindex = refTable_lookup (s, level, index);
+      
+      if (eindex != NOT_FOUND)
+	{
+	  return (s->entries[eindex]);
+	}
+
+      s = usymtab_dropEnv (s);
+    }
+ 
+  if (index >= s->nentries)
+    {
+      return uentry_undefined;
+    }
+
+  llassert (!uentry_isUndefined (s->entries[index]));
+
+  return s->entries[index];
+}
+
+static /*@dependent@*/ /*@exposed@*/ uentry
+usymtab_getRefNoisy (/*@notnull@*/ usymtab s, int level, usymId index)
+{
+  usymtab otab = s;
+  uentry ue = uentry_undefined;
+
+  
+  llassert (index >= 0);
+
+  
+  while (s->lexlevel > level)
+    {
+      
+      if (usymtab_isBranch (s))
+	{
+	  int eindex = refTable_lookup (s, level, index);
+
+	  if (eindex != NOT_FOUND)
+	    {
+	      ue = s->entries[eindex];
+
+	      if (s != otab)
+		{
+		  while (!usymtab_isBranch (otab))
+		    {
+		      otab = usymtab_dropEnv (otab);
+		      llassert (otab != GLOBAL_ENV);
+		    }
+		
+		  if (refTable_lookup (otab, level, index) == NOT_FOUND)
+		    {
+		      ue = usymtab_addRefEntry (otab, uentry_rawName (ue));
+		    }
+		  else
+		    {
+		      ;
+		    }
+		}
+	      
+	      return ue;
+	    }
+	}
+
+      s = usymtab_dropEnv (s);
+    }
+
+  llassert (usymtab_isDefined (s));
+
+  while (usymtab_isBranch (s) && s->lexlevel == level)
+    {
+      int eindex = refTable_lookup (s, level, index);
+
+      
+      if (eindex != NOT_FOUND)
+	{
+	  ue = s->entries[eindex];
+	  
+	  if (s != otab)
+	    {
+	      while (!usymtab_isBranch (otab))
+		{
+		  otab = usymtab_dropEnv (otab);
+		  llassert (otab != GLOBAL_ENV);
+		}
+
+	      ue = usymtab_addRefEntry (otab, uentry_rawName (ue));
+	    }
+	  else
+	    {
+	      ;
+	    } 
+
+	  return ue;
+	}
+
+      s = usymtab_dropEnv (s);
+          }
+
+  if (s->lexlevel == level && (index < s->nentries))
+    {
+      ue = s->entries[index];
+      
+      if (uentry_isValid (ue))
+	{
+	  if (s != otab)
+	    {
+	      while (!usymtab_isBranch (otab))
+		{
+		  otab = usymtab_dropEnv (otab);
+		  
+		  if (otab == GLOBAL_ENV)
+		    {
+		      return ue;
+		    }
+		}
+	      
+	      ue = usymtab_addRefEntry (otab, uentry_rawName (ue));
+	    }
+	  else
+	    {
+	      	    }
+	}
+
+      return ue;
+    }
+
+  
+  if (index >= s->nentries)
+    {
+      return uentry_undefined;
+    }
+
+  llassert (!uentry_isUndefined (s->entries[index]));
+
+  return s->entries[index];
+}
+
+/*
+** looking up entries
+**
+** If entry is inside a branch, then copy it, and put it into 
+** the branch table.
+*/
+
+static
+int refTable_lookup (/*@notnull@*/ usymtab ut, int level, int index)
+{
+  refTable rt = ut->reftable;
+  int i;
+
+  llassert (rt != NULL);
+
+  
+  for (i = 0; i < ut->nentries; i++)
+    {
+      if (rt[i]->level == level && rt[i]->index == index)
+	{
+	  	  return i;
+	}
+    }
+
+    return NOT_FOUND;
+}
+  
+static
+/*@only@*/ refentry refentry_create (int level, int index)
+{
+  refentry r = (refentry) dmalloc (sizeof (*r));
+
+  r->level = level;
+  r->index = index;
+
+  return r;
+}
+
+static /*@dependent@*/ /*@exposed@*/ uentry
+usymtab_addRefEntry (/*@notnull@*/ usymtab s, cstring k)
+{
+  int eindex;
+  usymtab ut = s;
+
+  llassert (ut->reftable != NULL);
+
+  while (s != GLOBAL_ENV)
+    {
+      eindex = usymtab_getIndex (s, k);
+      
+      if (eindex != NOT_FOUND)
+	{
+	  uentry current = s->entries[eindex];
+
+	  if (uentry_isVar (current) && !ctype_isFunction (uentry_getType (current)))
+	    {
+	      uentry ue;
+
+	      DPRINTF (("Here: copying %s", uentry_unparseFull (current)));
+
+	      ue = uentry_copy (current);
+
+	      DPRINTF (("Here: copying %s", uentry_unparseFull (ue)));
+
+	      usymtab_addEntryQuiet (ut, ue);
+
+	      if (s->reftable != NULL)
+		{
+		  refentry ref = s->reftable[eindex];
+
+		  
+		  ut->reftable[ut->nentries - 1] 
+		    = refentry_create (ref->level, ref->index);
+		}
+	      else
+		{
+		  ut->reftable[ut->nentries - 1] 
+		    = refentry_create (s->lexlevel, eindex);
+		}
+	      
+	      return (ue);
+	    }
+	  else
+	    {
+	      return (current);
+	    }
+	}
+
+      s = usymtab_dropEnv (s);
+    }
+
+  return uentry_undefined;
+}
+
+static uentry usymtab_lookupAux (usymtab s, cstring k)
+{
+  DPRINTF (("Lookup: %s", k));
+
+  while (s != GLOBAL_ENV)
+    {
+      int eindex = usymtab_getIndex (s, k);
+
+      if (eindex != NOT_FOUND)
+	{
+	  uentry ret = s->entries[eindex];
+	  
+	  DPRINTF (("Found: %s", uentry_unparseFull (ret)));
+	  return (ret);
+	}
+
+      if (s->kind == US_TBRANCH || s->kind == US_FBRANCH 
+	  || s->kind == US_CBRANCH)
+	{
+	  uentry ret = usymtab_addRefEntry (s, k);
+	  DPRINTF (("Ref entry: %s", uentry_unparseFull (ret)));
+	  return ret;
+	}
+      
+      s = s->env;
+    }
+  
+  return uentry_undefined;
+}
+
+static /*@dependent@*/ /*@exposed@*/ uentry
+usymtab_lookupQuiet (usymtab s, cstring k)
+{
+  int eindex;
+
+  while (s != GLOBAL_ENV)
+    {
+      eindex = usymtab_getIndex (s, k);
+      
+      if (eindex != NOT_FOUND)
+	{
+	  uentry ret = s->entries[eindex];
+	  return (ret);
+	}
+      
+      s = s->env;
+    }
+
+  return uentry_undefined;
+}
+
+/*@dependent@*/ /*@observer@*/ uentry
+  usymtab_lookupSafe (cstring k)
+  /*@globals utab@*/
+{
+  DPRINTF (("Lookup safe: %s", k));
+  return (usymtab_lookupAux (utab, k));
+}
+
+uentry
+  usymtab_lookupExpose (cstring k)
+  /*@globals utab@*/
+{
+  uentry ce = usymtab_lookupAux (utab, k);
+
+  if (uentry_isUndefined (ce))
+    {
+      llfatalbug (message ("usymtab_lookup: not found: *%s*", k));
+    }
+
+  if (uentry_isPriv (ce))
+    {
+      llfatalbug (message ("usymtab_lookup: private: *%s*", k));
+    }
+
+  return ce;
+}
+
+uentry usymtab_lookupExposeGlob (cstring k)
+{
+  return (usymtab_lookupGlobSafe (k));
+}
+
+uentry usymtab_lookupGlob (cstring k)
+  /*@globals globtab@*/
+{
+  uentry ce = usymtab_lookupAux (globtab, k);
+
+  if (uentry_isUndefined (ce))
+    llfatalbug (message ("usymtab_lookup: not found: %s", k));
+
+  if (uentry_isPriv (ce))
+    llfatalbug (message ("usymtab_lookup: private: %s", k));
+
+  return ce;
+}
+
+/*@observer@*/ uentry
+  usymtab_lookupGlobSafe (cstring k)
+  /*@globals globtab@*/
+{
+  uentry ce = usymtab_lookupAux (globtab, k);
+
+  return ce;
+}
+
+uentry usymtab_lookupEither (cstring k)
+   /*@globals utab@*/
+{
+  uentry ce = usymtab_lookupSafe (k);
+
+  if (uentry_isUndefined (ce))
+    llfatalerror (message ("usymtab_lookup: not found: %s", k));
+
+  return ce;
+}
+
+# ifndef NOLCL
+ctype
+usymtab_lookupType (cstring k)
+   /*@globals globtab@*/
+{
+  usymId uid = usymtab_getTypeId (k);
+
+  if (uid == USYMIDINVALID)
+    {
+      llcontbug (message ("usymtab_lookupType: not found: %s", k));
+      return ctype_unknown;
+    }
+  
+  return (uentry_getRealType (usymtab_getTypeEntry (uid)));
+}
+# endif
+
+ctype
+usymtab_lookupAbstractType (cstring k) /*@globals globtab@*/
+{
+  usymId uid = usymtab_getTypeId (k);
+
+  if (uid == USYMIDINVALID)
+    {
+      llcontbug (message ("usymtab_lookupType: not found: %s", k));
+      return ctype_unknown; 
+    }
+  
+  return (uentry_getAbstractType (usymtab_getTypeEntry (uid)));
+}
+  
+/*
+** if there is an unnamed lcl-specified struct tag matching
+** the uentryList, return its datatype.  Otherwise, returns
+** ctype_undefined.
+*/
+
+ctype
+usymtab_structFieldsType (uentryList f)
+   /*@globals globtab@*/
+{
+  return (usymtab_suFieldsType (f, TRUE));
+}
+
+ctype
+usymtab_unionFieldsType (uentryList f)
+   /*@globals globtab@*/
+{
+  return (usymtab_suFieldsType (f, FALSE));
+}
+
+static ctype
+usymtab_suFieldsType (uentryList f, bool isStruct)
+  /*@globals globtab@*/
+{
+  int i;
+
+  if (fileloc_isSpec (g_currentloc)) return (ctype_undefined);
+
+  for (i = 0; i < globtab->nentries; i++)
+    {
+      uentry current = globtab->entries[i];
+
+      if ((isStruct 
+	   ? uentry_isStructTag (current) : uentry_isUnionTag (current)))
+	{
+	  if (isFakeTag (uentry_rawName (current)))
+	    {
+	      ctype ct = uentry_getType (current);
+
+	      if ((isStruct ? ctype_isStruct (ct) : ctype_isUnion (ct))
+		  && (uentryList_matchFields (f, ctype_getFields (ct))))
+		{
+		  		  return uentry_getAbstractType (current);
+		}
+	    }
+	}
+    }
+  
+    return ctype_undefined;
+}
+
+ctype
+  usymtab_enumEnumNameListType (enumNameList f)
+  /*@globals globtab@*/
+{
+  int i;
+
+  for (i = 0; i < globtab->nentries; i++)
+    {
+      uentry current = globtab->entries[i];
+
+      if (uentry_isEnumTag (current))
+	{
+	  if (isFakeTag (uentry_rawName (current)))
+	    {
+	      ctype ct = uentry_getType (current);
+
+	      if (ctype_isEnum (ct) && (enumNameList_match (f, ctype_elist (ct))))
+		{
+		  return uentry_getType (current);
+		}
+	    }
+	}
+    }
+  
+  return ctype_undefined;
+}
+
+bool
+usymtab_exists (cstring k)
+   /*@globals utab@*/
+{
+  uentry ce = usymtab_lookupSafe (k);
+
+  return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)));
+}
+
+bool
+usymtab_existsReal (cstring k)
+   /*@globals utab@*/
+{
+  uentry ce = usymtab_lookupSafe (k);
+
+  return (!(uentry_isUndefined (ce)) 
+	  && !(uentry_isPriv (ce))
+	  && !(uentry_isExpandedMacro (ce)));
+}
+
+bool
+  usymtab_existsGlob (cstring k)
+  /*@globals globtab@*/
+{
+  uentry ce = usymtab_lookupAux (globtab, k);
+
+  return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)));
+}
+
+# ifndef NOLCL
+bool
+usymtab_existsEither (cstring k)
+  /*@globals utab@*/
+{
+  uentry ce = usymtab_lookupAux (utab, k);
+  
+  return (uentry_isValid (ce));
+}
+
+bool
+  usymtab_existsGlobEither (cstring k)
+  /*@globals globtab@*/
+{
+  uentry ce = usymtab_lookupAux (globtab, k);
+  
+  return (uentry_isValid (ce));
+}
+# endif
+
+bool
+usymtab_existsType (cstring k)
+  /*@globals globtab@*/
+{
+  uentry ce = usymtab_lookupAux (globtab, k);
+
+  return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)) && uentry_isDatatype (ce));
+}
+
+bool
+usymtab_existsTypeEither (cstring k)
+  /*@globals globtab@*/
+{
+  uentry ce = usymtab_lookupAux (globtab, k);
+
+    return (uentry_isValid (ce) && uentry_isDatatype (ce));
+}
+
+bool
+usymtab_existsStructTag (cstring k) /*@globals globtab@*/
+{
+  cstring sname = makeStruct (k);
+  uentry ce = usymtab_lookupAux (globtab, sname);
+
+  cstring_free (sname);
+
+  
+  return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)));
+}
+
+bool
+usymtab_existsUnionTag (cstring k) /*@globals globtab@*/
+{
+  cstring uname = makeUnion (k);
+  uentry ce = usymtab_lookupAux (globtab, uname);
+
+  cstring_free (uname);
+
+  return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)));
+}
+
+bool
+usymtab_existsEnumTag (cstring k) /*@globals globtab@*/
+{
+  cstring ename = makeEnum (k);
+  uentry ce = usymtab_lookupAux (globtab, ename);
+
+  cstring_free (ename);
+  return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)));
+}
+
+# ifndef NOLCL
+bool usymtab_existsVar (cstring k)
+   /*@globals utab@*/
+{
+  uentry ce = usymtab_lookupSafe (k);
+
+  return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)) && (uentry_isVar (ce)));
+}
+# endif
+
+/*
+** destructors
+*/
+
+static void
+refTable_free (/*@only@*/ /*@null@*/ refTable x, int nentries)
+{
+  if (x != NULL)
+    {
+      int i;
+
+      for (i = 0; i < nentries; i++)
+	{
+	  sfree (x[i]);
+	}
+      
+      sfree (x);
+    }
+}
+  
+static void
+usymtab_freeLevel (/*@notnull@*/ /*@only@*/ usymtab u)
+  /*@globals globtab, utab, filetab@*/
+{
+  int i;
+
+  aliasTable_free (u->aliases);
+
+  refTable_free (u->reftable, u->nentries);
+
+  if (u == filetab || u == globtab)
+    {
+      for (i = 0; i < u->nentries; i++)
+	{
+	  uentry_freeComplete (u->entries[i]);
+	}
+    }
+  else
+    {
+      for (i = 0; i < u->nentries; i++)
+	{
+	  uentry_free (u->entries[i]);
+	}
+    }
+
+  guardSet_free (u->guards);
+  sfree (u->entries);
+
+  if (u != globtab 
+      && u != utab
+      && u != filetab)
+    {
+      llassert (u->htable == NULL);
+      sfree (u);
+    }
+
+/*@-mustfree@*/
+} /*@=mustfree@*/
+
+static void
+usymtab_freeAux (/*@only@*/ usymtab u)
+   /*@globals globtab, utab, filetab@*/
+   /*@modifies u@*/
+{
+  while (u != GLOBAL_ENV)
+    {
+      usymtab t = u->env;
+      usymtab_freeLevel (u);
+      u = t;
+      /*@-branchstate@*/ 
+    } 
+  /*@=branchstate@*/
+}
+
+void usymtab_free () 
+  /*@globals killed utab, globtab, filetab@*/ 
+  /*@modifies utab@*/
+{
+  dbgfree = TRUE;
+  usymtab_freeAux (utab);
+}
+
+static int usymtab_lexicalLevel (void) /*@globals utab@*/
+{
+  return (utab->lexlevel);
+}
+
+bool usymtab_inGlobalScope () /*@globals utab, globtab@*/
+{
+  return (utab == globtab);
+}
+
+bool usymtab_inFileScope () /*@globals utab@*/
+{
+  return (utab->lexlevel == fileScope);
+}
+
+bool usymtab_inFunctionScope () /*@globals utab@*/
+{
+  return (utab->lexlevel == functionScope);
+}
+
+# ifndef NOLCL
+void
+usymtab_replaceEntry (uentry s)
+  /*@globals utab, globtab@*/
+  /*@modifies utab, s@*/
+{
+  usymtab_replaceEntryAux (utab, s);
+}
+# endif
+
+bool
+usymtab_matchForwardStruct (usymId u1, usymId u2)
+   /*@globals globtab@*/
+{
+  uentry ue1 = usymtab_getTypeEntry (u1);
+  uentry ue2 = usymtab_getTypeEntry (u2);
+
+  if (uentry_isAnyTag (ue2))
+    {
+      ctype reptype = uentry_getType (ue1);
+      
+      if (ctype_isPointer (reptype))
+	{
+	  ctype repbase = ctype_getBaseType (reptype);
+  
+	  if (ctype_isUA (repbase))
+	    {
+	      typeId rtuid = ctype_typeId (repbase);
+
+	      if (u2 == rtuid) return TRUE;
+	      
+	      if (usymId_isValid (rtuid))
+		{
+		  reptype = uentry_getType (usymtab_getTypeEntry (rtuid));
+		  
+		  return (ctype_isUA (reptype) && (u2 == (ctype_typeId (reptype))));
+		}
+	    }
+	}
+    }
+  
+  return FALSE;
+}
+
+void usymtab_addGuards (guardSet guards)
+  /*@modifies utab@*/
+{
+  utab->guards = guardSet_union (utab->guards, guards);
+  }
+
+static bool usymtab_isGuardedAux (sRef s)
+  /*@globals utab@*/
+{
+  usymtab tab = utab;
+  sRef base = sRef_getRootBase (s);
+  int lowlevel = paramsScope;
+  int baselevel = sRef_lexLevel (base);
+
+  if (sRef_isCvar (base))
+    {
+      lowlevel = baselevel;
+      if (lowlevel < paramsScope) lowlevel = paramsScope;
+    }
+  
+  while (tab->lexlevel >= lowlevel)
+    {
+      if (guardSet_isGuarded (tab->guards, s))
+	{
+	  /*
+	  if (!sRef_definitelyNull (s))
+	    {
+	      sRef_setNotNull (s, fileloc_undefined);
+	    }
+	    */
+	  return TRUE;
+	}
+
+      tab = usymtab_dropEnv (tab);
+    }
+  
+  return FALSE;
+}
+
+void usymtab_unguard (sRef s) /*@modifies utab@*/
+{
+  usymtab tab = utab;
+  sRef base = sRef_getRootBase (s);
+  int lowlevel = paramsScope;
+  int baselevel = sRef_lexLevel (base);
+  
+  if (sRef_isCvar (base))
+    {
+      lowlevel = baselevel;
+      if (lowlevel < paramsScope) lowlevel = paramsScope;
+    }
+
+  while (tab->lexlevel >= lowlevel)
+    {
+      if (guardSet_isGuarded (tab->guards, s))
+	{
+	  guardSet_delete (tab->guards, s);
+	}
+      
+      tab = usymtab_dropEnv (tab);
+    }
+}
+
+bool usymtab_isGuarded (sRef s)
+{
+  
+  return (sRef_aliasCompleteSimplePred (usymtab_isGuardedAux, s));
+}
+
+bool usymtab_isProbableNull (sRef s)
+{
+  return (sRef_aliasCheckSimplePred (usymtab_isProbableNullAux, s));
+}
+
+bool usymtab_isProbableDeepNull (sRef s)
+{
+  return (sRef_deepPred (usymtab_isProbableNull, s));
+}
+
+static bool usymtab_isProbableNullAux (sRef s)
+  /*@globals utab@*/
+{
+  usymtab tab = utab;
+  sRef base = sRef_getRootBase (s);
+  int  lowlevel = paramsScope;
+  
+  if (sRef_isCvar (base))
+    {
+      lowlevel = sRef_lexLevel (base);
+      if (lowlevel < paramsScope) lowlevel = paramsScope;
+    }
+  
+  while (tab->lexlevel >= lowlevel)
+    {
+      if (guardSet_isProbableNull (tab->guards, s))
+	{
+	  return TRUE;
+	}
+      
+      while (tab->kind == US_CBRANCH) 
+	{
+	  tab = tab->env;
+	}
+
+      llassert (usymtab_isDefined (tab));
+
+      if (tab->kind == US_FBRANCH)
+	{
+	  tab = tab->env;
+	  llassert (tab->kind == US_TBRANCH);
+	}
+      
+      tab = tab->env;
+    }
+
+  return FALSE;
+}
+
+void
+usymtab_printGuards ()
+  /*@globals utab, globtab@*/
+{
+  usymtab ttab = utab;
+
+  while (ttab != globtab)
+    {
+      llmsg (message ("Guards [%d]: %q", ttab->lexlevel,
+		      guardSet_unparse (ttab->guards)));
+      ttab = ttab->env;
+    }
+}
+
+void
+usymtab_displayAllUses ()
+  /*@globals utab, globtab@*/
+{
+  usymtab copy;
+
+  /* only in top scope */
+  llassert (utab == globtab);
+
+  /* need a copy, so order is not messed up by sort! */  
+  copy = usymtab_shallowCopy (globtab); 
+  
+  qsort (copy->entries, (size_t)copy->nentries, 
+	 sizeof (*copy->entries), (int (*)(const void *, const void *)) uentry_xcompareuses);
+
+  usymtab_entries (copy, ue)
+    {
+      if (uentry_isValid (ue))
+	{
+	  filelocList uses = uentry_getUses (ue);
+	  int size = filelocList_realSize (uses);
+
+	  if (fileloc_isDefined (uentry_whereDefined (ue)) 
+	      && !fileloc_isLib (uentry_whereDefined (ue))
+	      && (size > 0))
+	    {
+	      llmsg (message ("%q (%q), %d use%p:\n   %q", 
+			      uentry_getName (ue),
+			      fileloc_unparse (uentry_whereDefined (ue)),
+			      size, filelocList_unparseUses (uses)));
+	    }
+	}
+    } end_usymtab_entries;
+  
+  usymtab_shallowFree (copy);
+}
+
+static /*@dependent@*/ /*@exposed@*/ usymtab
+usymtab_getFileTab ()
+  /*@globals filetab@*/
+{
+  llassert (filetab != NULL);
+
+  return filetab;
+}
+
+/*@only@*/ cstring
+usymtab_unparseStack ()
+  /*@globals utab@*/
+{
+  return (usymtab_unparseStackTab (utab));
+}
+ 
+static /*@only@*/ cstring
+usymtab_unparseStackTab (usymtab t)
+{
+  bool firstOne = TRUE;
+  cstring ret = cstring_makeLiteral ("[");
+
+  while (t != GLOBAL_ENV)
+    {
+      if (firstOne)
+	{
+	  ret = message ("%q %q", ret, usymtab_typeName (t));
+	  firstOne = FALSE;
+	}
+      else
+	{
+	  ret = message ("%q, %q", ret, usymtab_typeName (t));
+	}
+      t = t->env;
+    }
+
+  ret = message ("%q ]", ret);
+  return ret;
+}
+
+static /*@only@*/ cstring
+usymtab_typeName (/*@notnull@*/ usymtab t)
+{
+  switch (t->kind)
+    {
+    case US_GLOBAL:  return cstring_makeLiteral ("global");
+    case US_NORMAL:  return cstring_makeLiteral ("normal");
+    case US_TBRANCH: return cstring_makeLiteral ("true");
+    case US_FBRANCH: return cstring_makeLiteral ("false");
+    case US_CBRANCH: return cstring_makeLiteral ("case");
+    case US_SWITCH:  return cstring_makeLiteral ("switch");
+    }
+  
+  BADEXIT;
+}
+
+void usymtab_addMustAlias (sRef s, sRef al)
+  /*@modifies utab@*/
+{
+  if (sRef_isMeaningful (s) && sRef_isMeaningful (al)
+      && !(sRef_isConst (s) || sRef_isConst (al))
+      && !(sRef_isAddress (al) && sRef_isDirectParam (sRef_getBase (al)))
+      && !(sRef_similar (s, al)))
+    {
+      utab->aliases = aliasTable_addMustAlias (utab->aliases, s, al); 
+      DPRINTF (("Must alias: %s", aliasTable_unparse (utab->aliases)));
+
+      /*
+      ** for local variable, aliasing is symmetric 
+      */
+      
+      if (sRef_isLocalVar (s) && sRef_isLocalVar (al))
+	{
+	  utab->aliases = aliasTable_addMustAlias (utab->aliases, al, s); 
+	}
+    }
+  else
+    {
+      ;
+    }
+}
+
+/*
+** Same as usymtab_addMustAlias, except does not check sRef_isSimilar.
+*/
+
+void usymtab_addForceMustAlias (sRef s, sRef al)
+  /*@modifies utab@*/
+{
+  if (sRef_isMeaningful (s) 
+      && sRef_isMeaningful (al)
+      && !(sRef_isConst (s) || sRef_isConst (al))
+      && !(sRef_isAddress (al) && sRef_isDirectParam (sRef_getBase (al))))
+    {
+      utab->aliases = aliasTable_addMustAlias (utab->aliases, s, al); 
+      DPRINTF (("Must alias: %s", aliasTable_unparse (utab->aliases)));
+
+      /*
+      ** for local variable, aliasing is symmetric 
+      */
+      
+      if (sRef_isLocalVar (s) && sRef_isLocalVar (al))
+	{
+	  utab->aliases = aliasTable_addMustAlias (utab->aliases, al, s); 
+	}
+    }
+  else
+    {
+      ;
+    }
+}
+
+void usymtab_clearAlias (sRef s)
+  /*@modifies utab, s@*/
+{
+  
+  aliasTable_clearAliases (utab->aliases, s); 
+}
+
+sRefSet usymtab_allAliases (sRef s)
+   /*@globals utab@*/  
+{
+  if (sRef_isMeaningful (s))
+    {
+      sRefSet ret;
+
+            
+      ret = sRefSet_unionFree (aliasTable_aliasedBy (utab->aliases, s),
+			       aliasTable_canAlias (utab->aliases, s));
+            return (ret);
+    }
+  else
+    {
+      return sRefSet_undefined;
+    }
+}
+
+/*@only@*/ sRefSet usymtab_canAlias (sRef s)
+  /*@globals utab@*/
+{
+  if (sRef_isMeaningful (s))
+    {
+      sRefSet res = aliasTable_canAlias (utab->aliases, s);
+
+      return res;
+    }
+
+  return sRefSet_undefined;
+}
+
+/*@only@*/ sRefSet usymtab_aliasedBy (sRef s)
+  /*@globals utab@*/
+{
+  return (aliasTable_aliasedBy (utab->aliases, s));
+}
+
+/*@only@*/ cstring usymtab_unparseAliases ()
+  /*@globals utab@*/
+{
+  return (aliasTable_unparse (utab->aliases));
+}
+
+/*
+** Debugging routines:
+**    okay to leak storage here, only for debugging 
+*/
+
+/*@-mustfree@*/ 
+
+void
+usymtab_printOut (void)
+  /*@globals utab@*/
+{
+  int i;
+  usymtab s = utab;
+  int depth = 0;
+  char *ind = mstring_copy ("               ");
+
+  fprintf (g_msgstream, "<<< [symbol table] >>>\n");
+  
+  while (s != GLOBAL_ENV && s->env != GLOBAL_ENV)
+    {
+      cstring tname = usymtab_typeName (s);
+
+      if (depth < 5)
+	{
+	  ind[depth * 3 + 1] = '\0';
+	}
+     
+      fprintf (g_msgstream, "level: %d (%s)\n", s->lexlevel,
+	       cstring_toCharsSafe (tname));
+
+      cstring_free (tname);
+
+      for (i = 0; i < s->nentries; i++)
+	{
+	  cstring us = uentry_unparseFull (s->entries[i]);
+	  fprintf (g_msgstream, "%s\n", cstring_toCharsSafe (us));
+	  cstring_free (us);
+	}
+      
+      if (s->reftable != NULL && s->nentries > 0)
+	{
+	  fprintf (g_msgstream, "\t<< Ref table >>\n");
+
+	  for (i = 0; i < s->nentries; i++)
+	    {
+	      fprintf (g_msgstream, "\t%s %3d: %d, %d\n", ind, i, 
+		       s->reftable[i]->level,
+		       s->reftable[i]->index);
+	    }
+	}
+
+      ind[depth * 3 + 1] = ' ';
+      depth++;
+      s = s->env;
+    }
+  fprintf (g_msgstream, "<<< end usymtab >>>\n");
+  mstring_free (ind);
+  return;
+}
+
+void
+usymtab_printTypes ()
+  /*@globals globtab@*/
+{
+  usymtab_printAllAux (globtab);
+}
+
+void 
+usymtab_printAll (void)
+  /*@globals utab@*/
+{
+  usymtab_printAllAux (utab);
+}
+
+static void
+usymtab_printAllAux (usymtab s)
+   /*@modifies g_msgstream@*/
+{
+  int i;
+  int depth = 0;
+  char *ind = mstring_copy ("               ");
+
+  printf ("[[[ usymtab ]]]");
+
+  while (s != GLOBAL_ENV)
+    {
+      if (depth < 5)
+	ind[depth * 3 + 1] = '\0';
+      
+      if (s->env == GLOBAL_ENV)
+	{
+	  int looplow;
+
+	  printf ("level: %d / break: %s / exit: %s\n", s->lexlevel,
+		  cstring_toCharsSafe (bool_unparse (s->mustBreak)), 
+		  cstring_toCharsSafe (exitkind_unparse (s->exitCode)));
+
+	  looplow = 0;
+
+	  for (i = looplow; i < s->nentries; i++)
+	    {
+	      printf ("%s%3d. %s\n", ind, i, 
+		      cstring_toCharsSafe (uentry_unparseFull (s->entries[i])));
+	    }
+	}
+      else
+	{
+	  printf ("level: %d / break: %s / exit: %s\n", s->lexlevel,
+		  cstring_toCharsSafe (bool_unparse (s->mustBreak)),
+		  cstring_toCharsSafe (exitkind_unparse (s->exitCode)));
+
+	  for (i = 0; i < s->nentries; i++)
+	    {
+	      printf ("%s%3d %s\n", ind, i, 
+		     cstring_toCharsSafe (uentry_unparseFull (s->entries[i])));
+	    }
+	}
+      
+      ind[depth * 3 + 1] = ' ';
+      depth++;
+      s = s->env;
+    }
+  printf ("----------\n");
+}
+
+void
+usymtab_printComplete ()
+  /*@globals utab@*/
+{
+  int i;
+  int depth = 0;
+  char *ind = mstring_copy ("               ");
+  usymtab s = utab;
+
+  while (s != GLOBAL_ENV)
+    {
+      if (depth < 5)
+	{
+	  ind[depth * 3 + 1] = '\0';
+	}
+      
+      if (s->env == GLOBAL_ENV)
+	{
+	  int looplow;
+
+	  printf ("level: %d\n", s->lexlevel);
+
+	  looplow = 0;
+
+	  for (i = looplow; i < s->nentries; i++)
+	    {
+	      printf ("%s%3d %s\n", ind, i, 
+		      cstring_toCharsSafe (uentry_unparse (s->entries[i])));
+	    }
+	}
+      else
+	{
+	  printf ("level: %d\n", s->lexlevel);
+	  for (i = 0; i < s->nentries; i++)
+	    {
+	      printf ("%s%3d %s\n", ind, i, 
+		     cstring_toCharsSafe (uentry_unparse (s->entries[i])));
+	    }
+	}
+      
+      ind[depth * 3 + 1] = ' ';
+      depth++;
+      s = s->env;
+    }
+
+  printf ("----------\n");
+  mstring_free (ind);
+}
+
+static /*@only@*/ cstring /*@unused@*/ 
+usymtab_unparseLocalAux (/*@notnull@*/ usymtab s)
+{
+  cstring c = message ("lexlevel: %d\n", s->lexlevel);
+  int i;
+
+  for (i = 0; i < s->nentries; i++)
+    {
+      c = message ("%q\n%q", c, uentry_unparseFull (s->entries[i]));
+    }
+
+  c = message ("%q\n=========", c);
+  return (c);
+}
+
+static cstring /*@unused@*/ /*@only@*/ 
+usymtab_unparseLocalList (/*@notnull@*/ usymtab s)
+{
+  cstring c = message ("[%d/%s/%s] ", s->lexlevel, 
+		       bool_unparse (s->mustBreak), 
+		       exitkind_unparse (s->exitCode));
+  int i;
+
+  for (i = 0; i < s->nentries; i++)
+    {
+      sRef sr = uentry_getSref (s->entries[i]);
+
+      if (i == 0)
+	{
+	  c = message ("%q: %q [%b]", c, uentry_getName (s->entries[i]), 
+		       sRef_isStateDefined (sr));
+	}
+      else
+	{
+	  c = message ("%q, %q [%b]", c, uentry_getName (s->entries[i]), 
+		       sRef_isStateDefined (sr));
+	}
+
+    }
+
+  return (c);
+}
+
+void
+usymtab_printLocal (void)
+  /*@globals utab@*/
+{
+  int i;
+  usymtab s = utab;
+
+  printf ("lexlevel: %d\n", s->lexlevel);
+
+  for (i = 0; i < s->nentries; i++)
+    {
+      printf ("%s\n", cstring_toCharsSafe (uentry_unparseFull (s->entries[i])));
+    }
+  
+  while (s->lexlevel > 1)
+    {
+      s = s->env;
+    }
+
+  llassert (usymtab_isDefined (s));
+
+  printf ("Params:\n");
+
+  for (i = 0; i < s->nentries; i++)
+    {
+      printf ("%d: %s\n", i, 
+	      cstring_toCharsSafe (uentry_unparseFull (s->entries[i])));
+    }
+}
+/*@=mustfree@*/
+
+static bool checkDistinctExternalName (uentry e)
+  /*@globals globtab@*/
+  /*@modifies *g_msgstream@*/
+{
+  int checklen = context_getValue (FLG_EXTERNALNAMELEN);
+  bool ignorecase = context_getFlag (FLG_EXTERNALNAMECASEINSENSITIVE);
+  bool gotone = FALSE;
+  bool extras = FALSE;
+  bool hasError = FALSE;
+  cstring name = uentry_rawName (e);
+  usymtab st = globtab;
+
+  if (checklen == 0)
+    {
+      ;
+    }
+  else
+    {
+      if (uentry_isAnyTag (e)) 
+	{
+	  checklen++;  /* the tag marker doesn't count */
+	}
+    }
+
+  usymtab_entries (st, oe)
+    {
+      if (uentry_sameObject (oe, e))
+	{
+	  continue;
+	}
+
+      if (checklen == 0)
+	{
+	  if (cstring_equalCaseInsensitive (uentry_rawName (oe), name))
+	    {
+	      if (gotone)
+		{
+		  extras = TRUE;
+		  break;
+		}
+	      
+	      if (optgenerror 
+		  (FLG_DISTINCTEXTERNALNAMES,
+		   message 
+		   ("External identifier %q is not distinguishable from %q "
+		    "because alphabetical case is ignored",
+		    uentry_getName (e),
+		    uentry_getName (oe)),
+		   uentry_whereLast (e)))
+		{
+		  uentry_showWhereAny (oe);
+		  uentry_setHasNameError (oe);
+		  gotone = TRUE;
+		}
+	    }
+	}
+      else
+	{
+	  if (ignorecase)
+	    {
+	      if (cstring_equalLenCaseInsensitive (uentry_rawName (oe),
+						   name, checklen))
+		{
+		  if (gotone)
+		    {
+		      extras = TRUE;
+		      break;
+		    }
+		  
+		  if (cstring_equalLen (uentry_rawName (oe), name, checklen))
+		    {
+		      if (optgenerror 
+			  (FLG_DISTINCTEXTERNALNAMES,
+			   /*@-sefparams@*/
+			   message 
+			   ("External identifier %q is not distinguishable from %q "
+			    "in the first %d characters (%q)",
+			    uentry_getName (e),
+			    uentry_getName (oe),
+			    checklen,
+			    cstring_clip (uentry_getName (e), checklen)),
+			   /*@=sefparams@*/
+			   uentry_whereLast (e)))
+			{
+			  uentry_showWhereAny (oe);
+			  uentry_setHasNameError (oe);
+			  gotone = TRUE;
+			}
+		    }
+		  else
+		    {
+		      if (gotone)
+			{
+			  extras = TRUE;
+			  break;
+			}
+		      
+		      if (optgenerror 
+			  (FLG_DISTINCTEXTERNALNAMES,
+			   message 
+			   ("External identifier %q is not distinguishable from %q "
+			    "in the first %d characters because alphabetical case "
+			    "is ignored",
+			    uentry_getName (e),
+			    uentry_getName (oe),
+			    checklen),
+			   uentry_whereLast (e)))
+			{
+			  uentry_showWhereAny (oe);
+			  uentry_setHasNameError (oe);
+			  gotone = TRUE;
+			}
+		    }
+		}
+	    }
+	  else if (cstring_equalLen (uentry_rawName (oe), name, checklen))
+	    {
+	      if (gotone)
+		{
+		  extras = TRUE;
+		  break;
+		}
+	      
+	      if (optgenerror 
+		  (FLG_DISTINCTEXTERNALNAMES,
+		   /*@-sefparams@*/
+		   message 
+		   ("External identifier %q is not distinguishable from %q "
+		    "in the first %d characters (%q)",
+		    uentry_getName (e),
+		    uentry_getName (oe),
+		    checklen,
+		    cstring_clip (uentry_getName (e), checklen)),
+		   /*@=sefparams@*/
+		   uentry_whereLast (e)))
+		{
+		  uentry_showWhereAny (oe);
+		  uentry_setHasNameError (oe);
+		  gotone = TRUE;
+		}
+	    }
+	  else
+	    {
+	      ; /* okay */
+	    }
+	}
+    } end_usymtab_entries ;
+
+  hasError = gotone;
+  
+  if (extras)
+    {
+      llgenindentmsgnoloc
+	(cstring_makeLiteral ("One or more additional "
+			      "indistinguishable external "
+			      "names not reported"));
+    }
+
+  return hasError;
+}
+
+static bool checkDistinctInternalName (uentry e)
+  /*@globals utab@*/
+  /*@modifies *g_msgstream@*/
+{
+  usymtab ttab = utab;
+  cstring name = uentry_rawName (e);
+  int numchars = context_getValue (FLG_INTERNALNAMELEN);
+  bool caseinsensitive = context_getFlag (FLG_INTERNALNAMECASEINSENSITIVE);
+  bool lookalike = context_getFlag (FLG_INTERNALNAMELOOKALIKE);
+
+  if (uentry_isAnyTag (e) && (numchars != 0))
+    {
+      numchars++;  /* the tag marker doesn't count */
+    }
+  
+  while (usymtab_isDefined (ttab))
+    {
+      usymtab_entries (ttab, oe)
+	{
+	  if (uentry_sameObject (oe, e))
+	    {
+	      /*@innercontinue@*/ continue;
+	    }
+
+	  switch (cstring_genericEqual
+		  (name, uentry_rawName (oe),
+		   numchars, caseinsensitive, lookalike))
+	    {
+	    case CGE_DISTINCT: /* okay */
+	      /*@switchbreak@*/ 
+	      break;
+	    case CGE_SAME:
+	      if (cstring_equal (name, uentry_rawName (oe)))
+		{
+		  ; /* got a shadow error */
+		}
+	      else
+		{
+		  if (optgenerror 
+		      (FLG_DISTINCTINTERNALNAMES,
+		       /*@-sefparams@*/
+		       message 
+		       ("Internal identifier %q is not distinguishable from %q "
+			"in the first %d characters (%q)",
+			uentry_getName (e),
+			uentry_getName (oe),
+			numchars,
+			cstring_clip (uentry_getName (e), numchars)),
+		       /*@=sefparams@*/
+		       uentry_whereLast (e)))
+		    {
+		      uentry_showWhereAny (oe);
+		      uentry_setHasNameError (oe);
+		      return TRUE;
+		    }
+		}
+	      /*@switchbreak@*/
+	      break;
+	    case CGE_CASE:
+	      if (numchars == 0 
+		  || (cstring_length (name) <= numchars))
+		{
+		  if (optgenerror 
+		      (FLG_DISTINCTINTERNALNAMES,
+		       message 
+		       ("Internal identifier %q is not distinguishable from %q "
+			"without case sensitivity",
+			uentry_getName (e),
+			uentry_getName (oe)),
+		       uentry_whereLast (e)))
+		    {
+		      uentry_showWhereAny (oe);
+		      uentry_setHasNameError (oe);
+		      return TRUE;
+		    }
+		}
+	      else 
+		{
+		  if (optgenerror 
+		      (FLG_DISTINCTINTERNALNAMES,
+		       message 
+		       ("Internal identifier %q is not distinguishable from %q "
+			"in the first %d characters without case sensitivity",
+			uentry_getName (e),
+			uentry_getName (oe),
+			numchars),
+		       uentry_whereLast (e)))
+		    {
+		      uentry_showWhereAny (oe);
+		      uentry_setHasNameError (oe);
+		      return TRUE;
+		    }
+		}
+	      /*@switchbreak@*/ 
+	      break;
+	    case CGE_LOOKALIKE:
+	      if (numchars == 0 
+		  || (cstring_length (name) <= numchars))
+		{
+		  if (optgenerror 
+		      (FLG_DISTINCTINTERNALNAMES,
+		       message 
+		       ("Internal identifier %q is not distinguishable from %q "
+			"except by lookalike characters",
+			uentry_getName (e),
+			uentry_getName (oe)),
+		       uentry_whereLast (e)))
+		    {
+		      uentry_showWhereAny (oe);
+		      uentry_setHasNameError (oe);
+		      return TRUE;
+		    }
+		}
+	      else 
+		{
+		  if (optgenerror 
+		      (FLG_DISTINCTINTERNALNAMES,
+		       message 
+		       ("Internal identifier %q is not distinguishable from %q "
+			"in the first %d characters except by lookalike characters",
+			uentry_getName (e),
+			uentry_getName (oe),
+			numchars),
+		       uentry_whereLast (e)))
+		    {
+		      uentry_showWhereAny (oe);
+		      uentry_setHasNameError (oe);
+		      return TRUE;
+		    }
+		}
+	    }
+	} end_usymtab_entries ;
+      
+      ttab = ttab->env;
+    }
+
+  return FALSE;
+}
+
+void usymtab_checkDistinctName (uentry e, int scope)
+   /*@globals utab, globtab@*/
+{
+  bool hasError = FALSE;
+  fileloc where = uentry_whereLast (e);
+
+  if (!fileloc_isPreproc (where)  && !fileloc_isBuiltin (where))
+    {
+      if (scope == globScope)
+	{
+	  if (context_getFlag (FLG_DISTINCTEXTERNALNAMES))
+	    {
+	      hasError = checkDistinctExternalName (e);
+	    }
+	}
+      
+      if (!hasError && context_getFlag (FLG_DISTINCTINTERNALNAMES))
+	{
+	  hasError = checkDistinctInternalName (e);
+	}
+    }
+
+  if (hasError)
+    {
+            uentry_setHasNameError (e);
+    }
+}
+
diff --git a/src/usymtab_interface.c b/src/usymtab_interface.c
new file mode 100644
index 0000000..9d486d2
--- /dev/null
+++ b/src/usymtab_interface.c
@@ -0,0 +1,1733 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** usymtab_interface.c
+**
+** Grammar interface to symtab.
+**
+** The LCLint parser will build symbol tables for abstract types and
+** function declarations.
+**
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+# include "gram.h"
+# include "lclscan.h"
+# include "lclsyntable.h"
+# include "lslparse.h"
+# include "usymtab_interface.h"
+# include "structNames.h"
+
+static void 
+  declareFcnAux (fcnNode p_f, /*@only@*/ qtype p_qt, ctype p_ct, typeId p_tn, 
+		 bool p_priv, bool p_spec);
+
+static uentryList paramNodeList_toUentryList (paramNodeList p_p);
+static /*@observer@*/ cstring getVarName (/*@null@*/ typeExpr p_x);
+static qtype convertLclTypeSpecNode (/*@null@*/ lclTypeSpecNode p_n);
+static ctype convertTypeExpr (ctype p_c, /*@null@*/ typeExpr p_x);
+static ctype convertCTypeExpr (ctype p_c, /*@null@*/ typeExpr p_x);
+static /*@exposed@*/ sRef fixTermNode (termNode p_n, fcnNode p_f, uentryList p_cl);
+static sRefSet fixModifies (fcnNode p_f, uentryList p_cl);
+
+static uentryList
+  convertuentryList (stDeclNodeList x)
+{
+  uentryList fl = uentryList_new ();
+
+  
+  stDeclNodeList_elements (x, i)
+  {
+    declaratorNodeList d = i->declarators;
+    qtype q = convertLclTypeSpecNode (i->lcltypespec);
+
+    declaratorNodeList_elements (d, j)
+    {
+      idDecl id;
+
+      qtype_setType (q, convertTypeExpr (qtype_getType (q), j->type));
+      id = idDecl_create (cstring_copy (getVarName (j->type)), qtype_copy (q));
+      fl = uentryList_add (fl, uentry_makeIdVariable (id));
+      idDecl_free (id);
+    } end_declaratorNodeList_elements;
+
+    qtype_free (q);
+  } end_stDeclNodeList_elements;
+
+  
+  return (fl);
+}
+
+static uentryList
+  convert_uentryList (paramNodeList x)
+{
+  uentryList p = uentryList_undefined;
+  bool first_one = TRUE;
+
+  
+  paramNodeList_elements (x, i)
+  {
+    if (i != (paramNode) 0)
+      {
+	if (paramNode_isElipsis (i))
+	  {
+	    first_one = FALSE;
+	    p = uentryList_add (p, uentry_makeElipsisMarker ());
+	  }
+	else
+	  {
+	    qtype q = convertLclTypeSpecNode (i->type);
+	    typeExpr t = i->paramdecl;
+	    
+	    qtype_setType (q, convertTypeExpr (qtype_getType (q), t));
+	    
+	    /* note: has to be like this to hack around void  ???? still */ 
+
+	    if (first_one)
+	      {
+		if (ctype_isVoid (qtype_getType (q)))
+		  {
+		    llassert (uentryList_isUndefined (p));
+		    qtype_free (q);
+		    return (p);
+		  }
+		
+		first_one = FALSE;
+	      }
+	    
+	    /*
+	    ** don't do qualifiers here, will get errors later
+	    */
+
+	    p = uentryList_add (p, uentry_makeUnnamedVariable (qtype_getType (q)));
+	    qtype_free (q);
+	  }
+      }
+    else
+      {
+	llbug (cstring_makeLiteral ("convertuentryList: null paramNode"));
+      }
+  } end_paramNodeList_elements;
+  
+  if (first_one)
+    {
+      llassert (uentryList_isUndefined (p));
+      
+      p = uentryList_makeMissingParams ();
+    }
+
+  return p;
+}
+
+/*
+** convertTypeExpr
+**
+** modify c with pointer, array, function
+**
+** (based on printTypeExpr2 from abstract.c)
+**
+*/
+
+static ctype
+convertTypeExpr (ctype c, typeExpr x)
+{
+  if (x == (typeExpr) 0)
+    {
+      return c;
+    }
+  
+  switch (x->kind)
+    {
+    case TEXPR_BASE:
+      return (c);
+    case TEXPR_PTR:
+      return (convertTypeExpr (ctype_makePointer (c), x->content.pointer));
+    case TEXPR_ARRAY:
+      return (convertTypeExpr (ctype_makeArray (c), x->content.array.elementtype));
+    case TEXPR_FCN:
+      {
+	ctype rv = convertTypeExpr (c, x->content.function.returntype);
+	uentryList p = paramNodeList_toUentryList (x->content.function.args);
+	
+	if (x->content.function.returntype != NULL
+	    && x->content.function.returntype->wrapped == 1 
+	    && ctype_isPointer (rv))
+	  {
+	    rv = ctype_baseArrayPtr (rv);
+	  }
+
+	return (ctype_makeParamsFunction (rv, p));
+      }
+    default:
+      {
+	llfatalbug (message ("convertTypeExpr: unknown typeExprKind: %d",
+			     (int) x->kind));
+      }
+    }
+
+  BADEXIT;
+}
+
+static 
+ctype convertCTypeExpr (ctype c, typeExpr x)
+{
+  if (x == (typeExpr) 0)
+    {
+      return c;
+    }
+
+  switch (x->kind)
+    {
+    case TEXPR_BASE:     return (c);
+    case TEXPR_PTR:  return (convertCTypeExpr (ctype_makePointer (c), 
+						 x->content.pointer));
+    case TEXPR_ARRAY:    return (convertCTypeExpr (ctype_makeArray (c), 
+						 x->content.array.elementtype));
+    case TEXPR_FCN:
+      {
+	ctype rv = convertCTypeExpr (c, x->content.function.returntype);
+	uentryList p = convert_uentryList (x->content.function.args);
+
+	return (ctype_makeParamsFunction (rv, p));
+      }
+    default:
+      {
+	llfatalbug (message ("convertCTypeExpr: unknown typeExprKind: %d", (int) x->kind));
+      }
+    }
+  BADEXIT;
+}
+
+/*
+** convertLclTypeSpecNode
+**
+** LclTypeSpecNode --> ctype
+** this is the base type only!
+*/
+
+/*
+** convertLeaves
+**
+** for now, assume only last leaf is relevant.
+** this should be a safe assumption in general???
+*/
+
+static ctype
+  convertLeaves (ltokenList f)
+{
+  ctype c = ctype_unknown;
+  
+  ltokenList_reset (f);
+  
+  ltokenList_elements (f, current)
+    {
+      switch (ltoken_getCode (current))
+	{
+	case LLT_TYPEDEF_NAME:
+	  {
+	    cstring tn = ltoken_getRawString (current);
+
+	    if (usymtab_existsTypeEither (tn))
+	      {
+		c = ctype_combine (uentry_getAbstractType 
+				   (usymtab_lookupEither (tn)), c);
+	      }
+	    else if (cstring_equalLit (tn, "bool"))
+	      {
+		/*
+		** Bogus...keep consistent with old lcl builtin.
+		*/
+		c = ctype_bool;
+	      }
+	    else
+	      {
+		fileloc loc = fileloc_fromTok (current);
+
+		voptgenerror (FLG_UNRECOG, 
+			      message ("Unrecognized type: %s", tn), loc);
+		fileloc_free (loc);
+		
+		usymtab_supEntry 
+		  (uentry_makeDatatype 
+		   (tn, ctype_unknown, MAYBE, NO, fileloc_getBuiltin ()));
+		
+	      }
+	    /*@switchbreak@*/ break;
+	  }
+	case LLT_CHAR:
+	  c = ctype_combine (ctype_char, c);
+	  /*@switchbreak@*/ break;
+	  
+	case LLT_DOUBLE:
+	  c = ctype_combine (ctype_double, c);
+	  /*@switchbreak@*/ break;
+	case LLT_FLOAT:     
+	  c = ctype_combine (ctype_float, c);
+	  /*@switchbreak@*/ break;
+	case LLT_CONST:    
+	case LLT_VOLATILE: 
+	  /*@switchbreak@*/ break;
+	case LLT_INT:      
+	  c = ctype_combine (ctype_int, c);
+	  /*@switchbreak@*/ break;
+	case LLT_LONG:  
+	  c = ctype_combine (c, ctype_lint); 
+	  /*@switchbreak@*/ break;
+	case LLT_SHORT:    
+	  c = ctype_combine (c, ctype_sint);
+	  /*@switchbreak@*/ break;
+	case LLT_SIGNED:    
+	  c = ctype_combine (c, ctype_int); 
+	  /*@switchbreak@*/ break;
+	case LLT_UNSIGNED:  
+	  c = ctype_combine (c, ctype_uint);
+	  /*@switchbreak@*/ break;
+	case LLT_UNKNOWN:   
+	  c = ctype_combine (ctype_unknown, c);
+	  /*@switchbreak@*/ break;
+	case LLT_VOID:      
+	  c = ctype_combine (ctype_void, c); 
+	  /*@switchbreak@*/ break;
+	case LLT_ENUM:
+	  llcontbug (cstring_makeLiteral ("convertLeaves: enum"));
+	  c = ctype_int; 
+	  /*@switchbreak@*/ break;
+	default:
+	  llfatalbug (message ("convertLeaves: bad token: %q", 
+			       ltoken_unparseCodeName (current)));
+	}
+    } end_ltokenList_elements;
+
+  return c;
+}
+
+static enumNameList
+  convertEnumList (ltokenList enums)
+{
+  enumNameList el = enumNameList_new ();
+
+  if (ltokenList_isDefined (enums))
+    {
+      ltokenList_elements (enums, i)
+	{
+	  enumNameList_addh 
+	    (el, enumName_create (cstring_copy (ltoken_unparse (i))));
+	} end_ltokenList_elements;
+    }
+
+  return el;
+}
+
+static /*@only@*/ qtype 
+  convertLclTypeSpecNode (/*@null@*/ lclTypeSpecNode n)
+{
+  
+  if (n != (lclTypeSpecNode) 0)
+    {
+      qtype result;
+      
+      switch (n->kind)
+	{
+	case LTS_CONJ:
+	  {
+	    qtype c1 = convertLclTypeSpecNode (n->content.conj->a);
+	    qtype c2 = convertLclTypeSpecNode (n->content.conj->b);
+
+	    /*
+	    ** Is it explicit?
+	    */
+
+	    if (fileloc_isLib (g_currentloc)
+		|| fileloc_isStandardLibrary (g_currentloc))
+	      {
+		result = qtype_mergeImplicitAlt (c1, c2);
+	      }
+	    else
+	      {
+		result = qtype_mergeAlt (c1, c2);
+	      }
+	    
+	    break;
+	  }
+	case LTS_TYPE:
+	  llassert (n->content.type != NULL);
+	  result = qtype_create (convertLeaves (n->content.type->ctypes));
+	  break;
+	case LTS_STRUCTUNION:
+	  {
+	    strOrUnionNode sn;
+	    cstring cn = cstring_undefined;
+
+	    sn = n->content.structorunion;
+
+	    llassert (sn != (strOrUnionNode) 0);
+
+	    if (!ltoken_isUndefined (sn->opttagid))
+	      {
+		cn = cstring_copy (ltoken_getRawString (sn->opttagid));
+	      }
+	    else
+	      {
+		cn = fakeTag ();
+	      }
+
+	    switch (sn->kind)
+	      {
+	      case SU_STRUCT:
+		if (usymtab_existsStructTag (cn))
+		  {
+		    
+		    result = qtype_create (uentry_getAbstractType
+					   (usymtab_lookupStructTag (cn)));
+		    cstring_free (cn);
+		  }
+		else
+		  {
+		    uentryList fl = convertuentryList (sn->structdecls);
+		    ctype ct;
+
+		    		    ct = ctype_createStruct (cstring_copy (cn), fl);
+
+		    /*
+		    ** If it was a forward declaration, this could add it to
+		    ** the table.  Need to check if it exists again...
+		    */
+
+		    if (usymtab_existsStructTag (cn))
+		      {
+			result = qtype_create (uentry_getAbstractType
+					       (usymtab_lookupStructTag (cn)));
+		      }
+		    else
+		      {
+			fileloc loc = fileloc_fromTok (n->content.structorunion->tok);
+			uentry ue = uentry_makeStructTag (cn, ct, loc);
+
+			result = qtype_create (usymtab_supTypeEntry (ue));
+		      }
+			
+		    cstring_free (cn);
+		  }
+		/*@switchbreak@*/ break;
+	      case SU_UNION:
+		if (usymtab_existsUnionTag (cn))
+		  {
+		    
+		    result = qtype_create (uentry_getAbstractType
+					   (usymtab_lookupUnionTag (cn)));
+		    cstring_free (cn);
+		  }
+		else
+		  {
+		    uentryList fl;
+		    ctype ct;
+		    
+		    fl = convertuentryList (sn->structdecls);
+		    ct = ctype_createUnion (cstring_copy (cn), fl);
+
+		    /*
+		    ** If it was a forward declaration, this could add it to
+		    ** the table.  Need to check if it exists again...
+		    */
+
+		    
+		    
+		    if (usymtab_existsUnionTag (cn))
+		      {
+			
+			result = qtype_create (uentry_getAbstractType
+					       (usymtab_lookupUnionTag (cn)));
+		      }
+		    else
+		      {
+			fileloc loc = fileloc_fromTok (n->content.structorunion->tok);
+			uentry ue = uentry_makeUnionTag (cn, ct, loc);
+
+			result = qtype_create (usymtab_supTypeEntry (ue));
+		      }
+			
+		    cstring_free (cn);
+		  }
+		/*@switchbreak@*/ break;
+	      BADDEFAULT
+	      }
+	    break;
+	  }
+	case LTS_ENUM:
+	  {
+	    enumSpecNode e = n->content.enumspec;
+	    enumNameList el;
+	    cstring ename;
+	    bool first = TRUE;
+	    ctype ta;
+	    ctype cet;
+
+	    llassert (e != NULL);
+	    el = convertEnumList (e->enums);
+
+	    if (!ltoken_isUndefined (e->opttagid))	/* named enumerator */
+	      {
+		ename = cstring_copy (ltoken_getRawString (e->opttagid));
+	      }
+	    else
+	      {
+		ename = fakeTag ();
+	      }
+
+	    cet = ctype_createEnum (ename, el);
+	    
+	    if (usymtab_existsEnumTag (ename))
+	      {
+		ta = uentry_getAbstractType (usymtab_lookupEnumTag (ename));
+	      }
+	    else
+	      {	
+		fileloc loc = fileloc_fromTok (e->tok);
+		uentry ue = uentry_makeEnumTag (ename, cet, loc);
+
+		ta = usymtab_supTypeEntry (ue);
+	      }
+
+	    enumNameList_elements (el, en)
+	      {
+		uentry ue;
+		fileloc loc;
+
+		if (first)
+		  {
+		    ltokenList_reset (e->enums);
+		    first = FALSE;
+		  }
+		else
+		  {
+		    ltokenList_advance (e->enums);
+		  }
+
+		loc = fileloc_fromTok (ltokenList_current (e->enums));
+		ue = uentry_makeSpecEnumConstant (en, cet, loc);
+
+		/*
+		** Can't check name here, might not have
+		** type yet.  Will check in .lh file?
+		*/
+		
+		ue = usymtab_supGlobalEntryReturn (ue);
+		
+		if (context_inLCLLib ())
+		  {
+		    uentry_setDefined (ue, loc);
+		  }
+	      } end_enumNameList_elements;
+	    
+	    result = qtype_create (ta);
+	  }
+	  break;
+	default:
+	  {
+	    llfatalbug (message ("convertLclTypeSpecNode: unknown lclTypeSpec kind: %d",
+				 (int) n->kind));
+	  }
+	}
+      
+      result = qtype_addQualList (result, n->quals);
+
+      if (n->pointers > 0)
+	{
+	  qtype_adjustPointers (n->pointers, result);
+	}
+
+      return result;
+    }
+  else
+    {
+      llcontbug (cstring_makeLiteral ("convertLclTypeSpecNode: null"));
+      return qtype_unknown (); 
+    }
+  BADEXIT;
+} 
+
+static /*@only@*/ multiVal
+  literalValue (ctype ct, ltoken lit)
+{
+  cstring text = cstring_fromChars (lsymbol_toChars (ltoken_getText (lit)));
+  char first;
+
+  if (cstring_length (text) > 0)
+    {
+      first = cstring_firstChar (text);
+    }
+  else
+    {
+      return multiVal_unknown ();
+    }
+
+  
+  if /*@-usedef@*/ (first == '\"') /*@=usedef@*/
+    {
+      int len = cstring_length (text) - 2;
+      char *val = mstring_create (len);
+      
+      llassert (cstring_lastChar (text) == '\"');
+      strncpy (val, cstring_toCharsSafe (text) + 1, size_fromInt (len));
+      return (multiVal_makeString (cstring_fromCharsO (val)));
+    }
+
+  if (ctype_isDirectInt (ct) || ctype_isPointer (ct))
+    {
+      long val = 0;
+     
+      if (sscanf (cstring_toCharsSafe (text), "%ld", &val) == 1)
+	{
+	  return multiVal_makeInt (val);
+	}
+    }
+
+  return multiVal_unknown ();
+}
+
+
+/*
+** declareConstant
+**
+** unfortunately, because the abstract types are different, this
+** cannot be easily subsumed into declareVar.
+*/
+
+void
+doDeclareConstant (constDeclarationNode c, bool priv)
+{
+  lclTypeSpecNode t;
+  ctype ctx;
+  qtype qt;
+  
+  if (c == (constDeclarationNode) 0)
+    {
+      return;
+    }
+
+  t = c->type;
+  qt = convertLclTypeSpecNode (t);
+
+  ctx = qtype_getType (qt);
+
+  initDeclNodeList_elements (c->decls, i)
+    {
+      ctype ct = convertTypeExpr (ctx, i->declarator->type);
+      cstring s = getVarName (i->declarator->type);
+
+      if (ctype_isFunction (ct))
+	{
+	  fcnNode fcn = fcnNode_fromDeclarator (lclTypeSpecNode_copy (t), 
+						declaratorNode_copy (i->declarator));
+
+	  /* FALSE == unspecified function, only a declaration */
+
+	  doDeclareFcn (fcn, typeId_invalid, priv, FALSE);
+	  fcnNode_free (fcn);
+	}
+      else
+	{
+	  uentry ue;
+	  fileloc loc = fileloc_fromTok (i->declarator->id);
+
+	  if (i->value != (termNode)0 &&
+	      i->value->kind == TRM_LITERAL)
+	    {
+	      ue = uentry_makeConstantAux (s, ct, loc, priv, 
+					   literalValue (ct, i->value->literal));
+	    }
+	  else
+	    {
+	      ue = uentry_makeConstantAux (s, ct, loc, priv, multiVal_unknown ());
+	    }
+
+	  	  uentry_reflectQualifiers (ue, qtype_getQuals (qt));
+
+	  
+	  if (context_inLCLLib () && !priv)
+	    {
+	      uentry_setDefined (ue, loc);
+	    }
+
+	  usymtab_supGlobalEntry (ue);
+	}
+    } end_initDeclNodeList_elements;
+
+  qtype_free (qt);
+}
+
+static cstring
+getVarName (/*@null@*/ typeExpr x)
+{
+  cstring s = cstring_undefined;
+
+  if (x != (typeExpr) 0)
+    {
+      switch (x->kind)
+	{
+	case TEXPR_BASE:
+	  s = ltoken_getRawString (x->content.base);
+	  break;
+	case TEXPR_PTR:
+	  s = getVarName (x->content.pointer);
+	  break;
+	case TEXPR_ARRAY:
+	  s = getVarName (x->content.array.elementtype);
+	  break;
+	case TEXPR_FCN:
+	  s = getVarName (x->content.function.returntype);
+	  break;
+	default:
+	  llfatalbug (message ("getVarName: unknown typeExprKind: %d", (int) x->kind));
+	}
+    }
+
+  return s;
+}
+
+void
+doDeclareVar (varDeclarationNode v, bool priv)
+{
+  lclTypeSpecNode t;
+  qtype c;
+
+  if (v == (varDeclarationNode) 0)
+    {
+      return;
+    }
+
+  t = v->type;
+  c = convertLclTypeSpecNode (t);
+
+  initDeclNodeList_elements (v->decls, i)
+    {
+      ctype ct = convertTypeExpr (qtype_getType (c), i->declarator->type);
+      cstring s = getVarName (i->declarator->type);
+
+      qtype_setType (c, ct);
+
+      if (ctype_isFunction (ct))
+	{
+	  fcnNode fcn;
+
+	  	  
+	  fcn = fcnNode_fromDeclarator (lclTypeSpecNode_copy (t), 
+					declaratorNode_copy (i->declarator));
+
+	  /* FALSE == unspecified function, only a declaration */
+	  declareFcnAux (fcn, qtype_unknown (), ct,
+			 typeId_invalid, priv, FALSE);
+	  fcnNode_free (fcn);
+	}
+      else
+	{
+	  fileloc loc = fileloc_fromTok (i->declarator->id);
+	  uentry le = uentry_makeVariable (s, ct, loc, priv);
+	  
+	  uentry_reflectQualifiers (le, qtype_getQuals (c));
+	  
+	  if (uentry_isCheckedUnknown (le))
+	    {
+	      if (context_getFlag (FLG_IMPCHECKEDSTRICTSPECGLOBALS))
+		{
+		  uentry_setCheckedStrict (le);
+		}
+	      else if (context_getFlag (FLG_IMPCHECKEDSPECGLOBALS))
+		{
+		  uentry_setChecked (le);
+		}
+	      else if (context_getFlag (FLG_IMPCHECKMODSPECGLOBALS))
+		{
+		  uentry_setCheckMod (le);
+		}
+	      else
+		{
+		  ; /* okay */
+		}
+	    }
+
+	  if (context_inLCLLib () && !priv)
+	    {
+	      uentry_setDefined (le, loc);
+	    }
+
+	  if (initDeclNode_isRedeclaration (i))
+	    {
+	      usymtab_replaceEntry (le);
+	    }
+	  else
+	    {
+	      le = usymtab_supEntrySrefReturn (le);
+	    }
+	}
+    } end_initDeclNodeList_elements;
+
+  qtype_free (c);
+}
+
+static globSet
+processGlob (/*@returned@*/ globSet globs, varDeclarationNode v)
+{
+  if (v == (varDeclarationNode) 0)
+    {
+      return globs;
+    }
+
+  if (v->isSpecial)
+    {
+      globs = globSet_insert (globs, v->sref);
+    }
+  else
+    {
+      lclTypeSpecNode t = v->type;
+      qtype qt = convertLclTypeSpecNode (t);
+      ctype c = qtype_getType (qt);
+      cstring s;      
+
+      initDeclNodeList_elements (v->decls, i)
+	{
+	  ctype ct;
+	  uentry ue;
+	  qualList quals = qtype_getQuals (qt);
+	  
+	  s = getVarName (i->declarator->type);
+	  ue = usymtab_lookupGlobSafe (s);
+	  
+	  if (uentry_isInvalid (ue))
+	    {
+	      ; /* error already reported */ 
+	    }
+	  else
+	    {
+	      if (uentry_isPriv (ue))
+		{
+		  globs = globSet_insert (globs, sRef_makeSpecState ());
+		}
+	      else
+		{
+		  uentry ce = uentry_copy (ue);
+		  ctype lt = uentry_getType (ce);
+		  fileloc loc = fileloc_fromTok (i->declarator->id);
+		  
+		  ct = convertTypeExpr (c, i->declarator->type);
+		  
+		  if (!ctype_match (lt, ct))
+		    {
+		      (void) gentypeerror
+			(lt, exprNode_undefined,
+			 ct, exprNode_undefined,
+			 message ("Global type mismatch %s (%t, %t)",
+				  s, lt, ct), 
+			 loc);
+		    }
+		  
+		  uentry_reflectQualifiers (ce, quals);
+		  globs = globSet_insert (globs,
+					  sRef_copy (uentry_getSref (ce)));
+		  fileloc_free (loc);
+		  uentry_free (ce);
+		}
+	    }
+	} end_initDeclNodeList_elements;
+
+      qtype_free (qt);
+    }
+
+  return globs;
+}
+
+static void
+declareAbstractType (abstractNode n, bool priv)
+{
+  cstring tn;
+  fileloc loc;
+  uentry ue;
+  usymId uid;
+  abstBodyNode ab;
+
+  if (n == (abstractNode) 0)
+    {
+      return;
+    }
+
+  
+  tn = ltoken_getRawString (n->name);
+
+  loc = fileloc_fromTok (n->tok);
+  
+  ue = uentry_makeDatatypeAux (tn, ctype_unknown, 
+			       ynm_fromBool (n->isMutable), YES, loc, priv);
+
+  if (n->isRefCounted)
+    {
+      uentry_setRefCounted (ue);
+    }
+
+  if (context_inLCLLib () && !priv)
+    {
+      uentry_setDefined (ue, loc);
+    }
+
+  uid = usymtab_supAbstractTypeEntry (ue, context_inLCLLib() && !priv);
+  
+
+  if (!priv && (ab = n->body) != (abstBodyNode) 0)
+    {
+      fcnNodeList ops = ab->fcns;
+
+      if (!fcnNodeList_isEmpty (ops))
+	{
+	  fcnNodeList_elements (ops, i)
+	  {
+	    if (i->typespec == (lclTypeSpecNode) 0)
+	      {
+		cstring fname = ltoken_getRawString (i->name);
+
+		if (usymtab_exists (fname))
+		  {
+		    uentry e = usymtab_lookup (fname);
+		    fileloc floc = fileloc_fromTok (i->declarator->id);
+
+		    if (uentry_isForward (e))
+		      {
+			usymtab_supEntry  
+			  (uentry_makeTypeListFunction 
+			   (fname, typeIdSet_insert (uentry_accessType (e), uid), 
+			    floc));
+		      }
+		    else
+		      {
+			usymtab_supEntry 
+			  (uentry_makeSpecFunction 
+			   (fname, uentry_getType (e),
+			    typeIdSet_insert (uentry_accessType (e), uid),
+			    globSet_undefined,
+			    sRefSet_undefined,
+			    floc));
+			
+			if (context_inLCLLib ())
+			  {
+			    llbuglit ("Jolly jeepers Wilma, it ain't dead after all!");
+			  }
+		      }
+		  }
+		else
+		  {
+		    usymtab_supEntry 
+		      (uentry_makeForwardFunction (fname, uid, loc));
+		  }
+	      }
+	    else
+	      {
+		declareFcn (i, uid);
+	      }
+	  } end_fcnNodeList_elements;
+	}
+    }
+}
+
+static void
+  declareExposedType (exposedNode n, bool priv)
+{
+  usymId uid;
+  qtype c;
+  cstring s;
+
+  
+  if (n == (exposedNode) 0)
+    {
+      return;
+    }
+
+  c = convertLclTypeSpecNode (n->type);
+
+  declaratorInvNodeList_elements (n->decls, i)
+  {
+    ctype realType = convertTypeExpr (qtype_getType (c), i->declarator->type);
+    fileloc loc = fileloc_fromTok (i->declarator->id);
+    uentry ue;
+
+    s = getVarName (i->declarator->type);
+
+    ue = uentry_makeDatatypeAux (s, realType, MAYBE, NO, loc, priv);
+
+    uentry_reflectQualifiers (ue, qtype_getQuals (c));
+    
+    if (context_inLCLLib () && !priv)
+      {
+	uentry_setDefined (ue, loc);
+      }
+
+    uid = usymtab_supExposedTypeEntry (ue, context_inLCLLib () && !priv);
+  } end_declaratorInvNodeList_elements;
+
+  qtype_free (c);
+}
+
+/*
+** ah...remember ye old days...
+**
+** wow...same thing in THREE symbol tables!  talk about space efficiency
+** (or as Joe Theory once said, its only a constant factor)
+*/
+
+void
+doDeclareType (typeNode t, bool priv)
+{
+  
+  if (t != (typeNode) 0)
+    {
+      switch (t->kind)
+	{
+	case TK_ABSTRACT:
+	  declareAbstractType (t->content.abstract, priv);
+	  break;
+	  
+	case TK_EXPOSED:
+	  declareExposedType (t->content.exposed, priv);
+	  break;
+	  
+	case TK_UNION:
+	default:
+	  {
+	    llfatalbug (message ("declareType ERROR: unknown kind: %q",
+				 cstring_fromCharsO (FormatInt ((int)t->kind))));
+	  }
+	}
+    }
+  
+}
+
+extern void
+declareIter (iterNode iter)
+{
+  fileloc loc = fileloc_fromTok (iter->name);
+  uentry ue = 
+    uentry_makeIter (ltoken_unparse (iter->name), 
+		     ctype_makeFunction 
+		     (ctype_void,
+		      paramNodeList_toUentryList (iter->params)), 
+		     fileloc_copy (loc));
+  
+  usymtab_supEntry (ue);
+  usymtab_supEntry 
+    (uentry_makeEndIter (ltoken_unparse (iter->name), loc));
+}
+
+/*
+** declareFcn
+*/
+
+static void
+declareFcnAux (fcnNode f, /*@only@*/ qtype qt, ctype ct,
+	       typeId tn, bool priv, bool spec)
+{
+  globalList globals;
+  typeIdSet acct;
+  sRefSet sl = sRefSet_undefined;
+  globSet globlist = globSet_undefined;
+  cstring s = getVarName (f->declarator->type);
+  fileloc loc = fileloc_fromTok (f->declarator->id);
+  uentryList args;
+
+  /*
+  ** type conversion generates args 
+  */
+
+  if (ctype_isFunction (ct))
+    {
+      args = ctype_argsFunction (ct);
+    }
+  else
+    {
+      llcontbug (message ("Not function: %s", ctype_unparse (ct)));
+      args = uentryList_undefined;
+    }
+
+  
+  fileloc_setColumnUndefined (loc);
+
+  if (spec)
+    {
+      globals = f->globals;
+      
+            sl = fixModifies (f, args);
+
+      /*
+      ** Bind let declarations in modifies list 
+      */
+
+      varDeclarationNodeList_elements (globals, glob)
+	{
+	  globlist = processGlob (globlist, glob);
+	} end_varDeclarationNodeList_elements;
+      
+      
+      if (f->checks != (lclPredicateNode) 0)
+	/* push stderr on globalList */
+	/* modifies *stderr^ */
+	{
+	  uentry ue;
+
+	  if (!(usymtab_existsVar (cstring_makeLiteralTemp ("stderr"))))
+	    {
+	      ctype tfile;
+	      
+	      llmsglit ("Global stderr implied by checks clause, "
+			"not declared in initializations.");
+
+	      tfile = usymtab_lookupType (cstring_makeLiteralTemp ("FILE"));
+	      
+	      if (ctype_isUndefined (tfile))
+		{
+		  llmsglit ("FILE datatype implied by checks clause not defined.");
+		  tfile = ctype_unknown;
+		}
+	      
+	      usymtab_supGlobalEntry 
+		(uentry_makeVariable (cstring_makeLiteralTemp ("stderr"), 
+				     tfile, fileloc_getBuiltin (), FALSE));
+	    }
+	  
+	  ue = usymtab_lookupGlob (cstring_makeLiteralTemp ("stderr"));
+	  
+	  	  globlist = globSet_insert (globlist, sRef_copy (uentry_getSref (ue)));
+	  sl = sRefSet_insert (sl, sRef_buildPointer (uentry_getSref (ue)));
+
+	}
+    }
+
+  if (usymId_isInvalid (tn))
+    {
+      acct = context_fileAccessTypes ();
+    }
+  else
+    {
+      acct = typeIdSet_single (tn);
+    }
+  
+  if (usymtab_exists (s))
+    {
+      uentry l = usymtab_lookup (s);
+      uentry ue;
+
+      if (uentry_isForward (l) || (fileloc_isLib (uentry_whereSpecified (l))))
+	{
+	  typeIdSet accessType;
+
+	  if (uentry_isFunction (l))
+	    {
+	      accessType = typeIdSet_union (uentry_accessType (l), 
+					    context_fileAccessTypes ());
+	    }
+	  else
+	    {
+	      accessType = context_fileAccessTypes ();
+	    }
+
+	  if (spec)
+	    {
+	      ue = uentry_makeSpecFunction (s, ct, accessType, globlist, sl, loc);
+	    }
+	  else
+	    {
+	      sRefSet_free (sl);
+	      globSet_free (globlist);
+
+	      ue = uentry_makeUnspecFunction (s, ct, accessType, loc);
+	    }
+
+	  uentry_reflectQualifiers (ue, qtype_getQuals (qt));
+
+	  usymtab_supEntry (ue);
+	}
+      else
+	{
+	  /*
+	  ** error reported by symtable already
+          **
+	  ** llgenerror (message ("Function redeclared: %s (previous declaration: %s)", s,
+	  **		      fileloc_unparse (uentry_whereSpecified (l))),
+	  **	      loc);
+          */
+
+	  
+	  fileloc_free (loc);
+	  sRefSet_free (sl);
+	  globSet_free (globlist);
+	}
+    }
+  else
+    {
+      uentry le;
+      
+      if (spec)
+	{
+	  if (priv)
+	    {
+	      le = uentry_makePrivFunction2 (s, ct, acct, globlist, sl, loc);
+	    }
+	  else
+	    {
+	      le = uentry_makeSpecFunction (s, ct, acct, globlist, sl, loc);
+	    }
+	}
+      else
+	{
+	  le = uentry_makeUnspecFunction (s, ct, acct, loc);
+
+	  sRefSet_free (sl);
+	  globSet_free (globlist);
+	}
+
+      if (context_inLCLLib () && !priv)
+	{
+	  uentry_setDefined (le, loc);
+	}      
+
+      uentry_reflectQualifiers (le, qtype_getQuals (qt));
+
+      switch (f->special)
+	{
+	case QU_UNKNOWN:     break;
+	case QU_PRINTFLIKE:  uentry_setPrintfLike (le); break;
+	case QU_SCANFLIKE:   uentry_setScanfLike (le); break;
+	case QU_MESSAGELIKE: uentry_setMessageLike (le); break;
+	BADDEFAULT;
+	}
+
+      usymtab_supEntry (le);
+    }
+
+  qtype_free (qt);
+}
+
+extern void
+doDeclareFcn (fcnNode f, typeId tn, bool priv, bool spec)
+{
+  qtype qt = convertLclTypeSpecNode (f->typespec);
+  ctype ct = convertTypeExpr (qtype_getType (qt), f->declarator->type);
+
+    declareFcnAux (f, qt, ct, tn, priv, spec);
+}
+
+/*
+** is s is an argument to f, return its arg no.
+** otherwise, return 0
+*/
+
+static int
+getParamNo (cstring s, fcnNode f)
+{
+  /* gasp, maybe should do run-time checks here */
+  paramNodeList params;
+  typeExpr fd = f->declarator->type;
+  
+  /* is this a bug in the LCL grammar? */
+
+  while (fd != NULL && (fd->kind == TEXPR_PTR || fd->kind == TEXPR_ARRAY))
+    {
+      if (fd->kind == TEXPR_PTR)
+	{
+	  fd = fd->content.pointer;
+	}
+      else
+	{
+	  /*@-null@*/ fd = fd->content.array.elementtype; /*@=null@*/
+         
+          /*
+          ** This is a bug in checking, that I should eventually fix.
+	  ** Need some way of deleting the guard from the true branch,
+	  ** but adding it back in the false branch...
+	  */
+	}
+    }
+
+  llassert (fd != NULL);
+
+  if (fd->kind != TEXPR_FCN)
+    {
+      llfatalbug (message ("getParamNo: not a function: %q (%d)",
+			   typeExpr_unparse (fd), (int) fd->kind));
+    }
+
+  params = fd->content.function.args;
+
+  if (paramNodeList_empty (params))
+    {
+      return -1;
+    }
+  else
+    {
+      int pno = 0;
+
+      paramNodeList_elements (params, i)
+	{
+	  if (i->paramdecl != (typeExpr) 0)	/* handle (void) */
+	    {
+	      if (cstring_equal (s, getVarName (i->paramdecl)))
+		{
+		  return pno;
+		}
+	    }
+	  pno++;
+	} end_paramNodeList_elements;
+      return -1;
+    }
+}
+
+static /*@null@*/ /*@observer@*/ termNode
+getLetDecl (cstring s, fcnNode f)
+{
+  letDeclNodeList x = f->lets;
+
+  letDeclNodeList_elements (x, i)
+  {
+    if (cstring_equal (s, ltoken_getRawString (i->varid)))
+      {
+	if (i->sortspec != NULL)
+	  {
+	    llbuglit ("getLetDecl: cannot return sort!");
+	  }
+	else
+	  {			/* is a termNode */
+	    return i->term;
+	  }
+      }
+  } end_letDeclNodeList_elements;
+
+  return (termNode) 0;
+}
+
+/*
+** processTermNode --- based on printTermNode2
+*/
+
+static /*@exposed@*/ sRef 
+  processTermNode (/*@null@*/ opFormNode op, termNodeList args, 
+		   fcnNode f, uentryList cl)
+{
+  if (op != (opFormNode) 0)
+    {
+      switch (op->kind)
+	{
+	case OPF_IF:
+	  llcontbuglit ("processTermNode: OPF_IF: not handled");
+	  break;
+	case OPF_ANYOP:
+	  llcontbuglit ("processTermNode: OPF_ANYOP: not handled");
+	  break;
+	case OPF_MANYOP:
+	  {
+	    int size = termNodeList_size (args);
+
+	    if (size == 1 
+		&& (cstring_equalLit (ltoken_getRawString (op->content.anyop), "'") ||
+		    cstring_equalLit (ltoken_getRawString (op->content.anyop), "^")))
+	      {
+		return (fixTermNode (termNodeList_head (args), f, cl));
+	      }
+	    else 
+	      {
+		;
+	      }
+	    break;
+	  }
+	case OPF_ANYOPM:
+	  {
+	    int size = termNodeList_size (args);
+
+	    if (size == 1 
+		&& (cstring_equalLit (ltoken_getRawString (op->content.anyop), "*")))
+	      {
+		sRef ft;
+		sRef res;
+
+		ft = fixTermNode (termNodeList_head (args), f, cl);
+		res = sRef_buildPointer (ft);
+		return (res);
+	      }
+	    else
+	      {
+		;
+	      }
+	    break;
+	  }
+	case OPF_MANYOPM:
+	  llcontbuglit ("OPF_MANYOPM: not handled\n");
+	  break;
+	case OPF_MIDDLE:
+	  llcontbuglit ("OPF_MIDDLE: not handled\n");
+	  break;
+	case OPF_MMIDDLE:
+	  llcontbuglit ("OPF_MMIDDLE: not handled\n");
+	  break;
+	case OPF_MIDDLEM:
+	  llcontbuglit ("OPF_MIDDLEM: not handled\n");
+	  break;
+	case OPF_MMIDDLEM:
+	  llcontbuglit ("OPF_MMIDDLEM: not handled\n");
+	  break;
+	case OPF_BMIDDLE:
+	  if (op->content.middle == 1)
+	    llbug (message ("array fetch: [%q]",
+			    termNodeList_unparse (args)));
+	  else
+	    llcontbuglit ("OPF_BMIDDLE: bad\n");
+	  break;
+
+	case OPF_BMMIDDLE:
+	  if (op->content.middle <= 1)
+	    {
+	      sRef arr = fixTermNode (termNodeList_head (args), f, cl);
+	      sRef ret;
+
+	      if (op->content.middle == 1)
+		{
+		  termNode t = (termNodeList_reset (args),
+				termNodeList_advance (args),
+				termNodeList_current (args));
+		  
+		  if (t->kind == TRM_LITERAL)
+		    {
+		      int i;
+
+		      if (sscanf 
+			  (cstring_toCharsSafe 
+			   (ltoken_getRawString (t->literal)),
+			   "%d", &i) == 1)
+			{
+			  ret = sRef_buildArrayFetchKnown (arr, i);
+			}
+		      else
+			{
+			  ret = sRef_buildArrayFetch (arr);
+			}
+
+		      return (ret);
+		    }
+		}
+	      	      
+	      /* unknown index */
+
+	      ret = sRef_buildArrayFetch (arr);
+
+	      return (ret);
+	    }
+	  else 
+	    {
+	      llcontbug (message ("op->content.middle = %d", 
+				  op->content.middle));
+	      break;
+	    }
+
+	case OPF_BMIDDLEM:
+	  llcontbuglit ("OPF_BMIDDLEM not handled");
+	  break; 
+
+	case OPF_BMMIDDLEM:
+	  llcontbuglit ("OPF_BMMIDDLEM not handled");
+	  break;
+
+	case OPF_SELECT:
+	  llcontbug (message ("select: .%s", 
+			      ltoken_getRawString (op->content.id)));
+	  break; 
+
+	case OPF_MAP:
+	  llcontbug (message ("map: .%s", 
+			      ltoken_getRawString (op->content.id)));
+	  break;
+
+	case OPF_MSELECT:
+	  {
+	    sRef rec = fixTermNode (termNodeList_head (args), f, cl);
+	    sRef ret; 
+	    ctype ct = ctype_realType (sRef_deriveType (rec, cl));
+	    cstring fieldname = ltoken_getRawString (op->content.id);
+
+	    ct = ctype_realType (ct);
+
+	    /*
+            ** does it correspond to a typedef struct field
+            **
+            ** (kind of kludgey, but there is no direct way to
+            **  tell if it is an lsl operator instead)
+	    */
+	    
+	    if (ctype_isStructorUnion (ct) &&
+		uentry_isValid 
+		(uentryList_lookupField (ctype_getFields (ct), fieldname)))
+	      {
+		cstring fname = cstring_copy (fieldname);
+
+		ret = sRef_buildField (rec, fname);
+		cstring_markOwned (fname);
+	      }
+	    else
+	      {
+		ret = sRef_undefined;
+	      }
+
+	    return ret;
+	  }
+	case OPF_MMAP: 
+	  {
+	    sRef rec = fixTermNode (termNodeList_head (args), f, cl);
+	    sRef ret = sRef_undefined;
+	    ctype ct = ctype_realType (sRef_deriveType (rec, cl));
+	    cstring fieldname = ltoken_getRawString (op->content.id);
+
+	    /*
+	    ** does it correspond to a typedef struct field
+	    */
+	    
+	    if (ctype_isPointer (ct))
+	      {
+		ctype ctb = ctype_realType (ctype_baseArrayPtr (ct));
+
+		if (ctype_isStructorUnion (ctb) &&
+		    uentry_isValid (uentryList_lookupField
+				    (ctype_getFields (ctb), fieldname)))
+		  {
+		    cstring fname = cstring_copy (fieldname);
+
+ 		    ret = sRef_buildArrow (rec, fname);
+		    cstring_markOwned (fname);
+		  }
+	      }
+
+	    return ret;
+	  }
+	}
+    }
+
+  return sRef_undefined;
+}
+
+/*
+** fixModifies
+**
+** o replace anything in modifies that is bound with let with value
+** o replace spec variables with internal state 
+** o replace paramaters with paramno identifiers
+** o replace globals with their usymid's
+** o make everything sRefs
+*/
+
+static /*@exposed@*/ sRef fixTermNode (termNode n, fcnNode f, uentryList cl)
+{
+  if (n != (termNode) 0)
+    {
+      switch (n->kind)
+	{
+	case TRM_LITERAL:
+	  break;
+	case TRM_CONST:
+	case TRM_VAR:
+	case TRM_ZEROARY:
+	  {
+	    cstring s = ltoken_getRawString (n->literal);
+	    termNode tl = getLetDecl (s, f);
+
+	    if (tl != (termNode) 0)
+	      {
+		return (fixTermNode (tl, f, cl));
+	      }
+	    else
+	      {
+		int i = getParamNo (s, f);
+
+		if (i < 0)
+		  {
+		    usymId usym = usymtab_getId (s);
+		    
+		    if (usymId_isInvalid (usym))
+		      {
+			if (usymtab_existsEither (s))
+			  {
+			    return sRef_makeSpecState ();
+			  }
+			else
+			  {
+			    llcontbuglit ("Invalid symbol in modifies list");
+			    return sRef_undefined;
+			  }
+		      }
+		    else
+		      return (sRef_makeGlobal (usym, ctype_unknown));
+		  }
+		
+		else
+		  {
+		    sRef p = sRef_makeParam (i, ctype_unknown);
+
+		    		    return (p);
+		  }
+	      }
+	  }
+	case TRM_APPLICATION:
+	  {
+	    nameNode nn = n->name;
+
+	    if (nn != (nameNode) 0)
+	      {
+		if (nn->isOpId)
+		  {
+		    /* must we handle n->given ? skip for now */
+
+		    llfatalbug 
+		      (message ("fixTermNode: expect non-empty nameNode: "
+				"TRM_APPLICATION: %q",
+				nameNode_unparse (nn)));
+		  }
+		else
+		  {
+		    sRef sr;
+
+		    sr = processTermNode (nn->content.opform, n->args, f, cl);
+		    		    return (sr);
+		  }
+	      }
+	    
+	    return sRef_undefined;
+	  }
+	case TRM_UNCHANGEDALL:      
+	case TRM_UNCHANGEDOTHERS:
+	case TRM_SIZEOF:
+	case TRM_QUANTIFIER:
+	  return sRef_undefined;
+	}
+    }
+
+  return sRef_undefined;
+}
+
+static 
+/*@only@*/ sRefSet fixModifies (fcnNode f, uentryList cl)
+{
+  static bool shownWarning = FALSE;
+  modifyNode m = f->modify;
+  sRefSet sl = sRefSet_new ();
+
+  if (m != (modifyNode) 0)
+    {
+      if (m->hasStoreRefList)
+	{
+	  storeRefNodeList srefs = m->list;
+
+	  storeRefNodeList_elements (srefs, i)
+	    {
+	      if (storeRefNode_isObj (i) || storeRefNode_isType (i))
+		{
+		  if (!shownWarning)
+		    {
+		      fileloc loc = fileloc_fromTok (f->name);
+		  
+		      llmsg (message
+			     ("%q: Warning: object and type modifications "
+			      "not understood by LCLint",
+			      fileloc_unparse (loc)));
+		      fileloc_free (loc);
+		      shownWarning = TRUE;
+		    }
+		}
+	      else if (storeRefNode_isSpecial (i))
+		{
+		  sl = sRefSet_insert (sl, i->content.ref);
+		}
+	      else if (storeRefNode_isTerm (i))
+		{
+		  sRef s = fixTermNode (i->content.term, f, cl);
+
+		  if (sRef_isKnown (s)) 
+		    {
+		      sl = sRefSet_insert (sl, s);
+		    }
+		}
+	      else
+		{
+		  BADEXIT;
+		}
+	    } end_storeRefNodeList_elements;
+	  
+	}
+    }
+
+  return sl;
+}
+
+static /*@only@*/ cstring
+paramNode_name (paramNode x)
+{
+  return (typeExpr_name (x->paramdecl));
+}
+
+static /*@only@*/ uentry
+paramNode_toUentry (paramNode p)
+{
+  if (p != (paramNode) 0)
+    {
+      if (p->kind == PELIPSIS)
+	{
+	  return uentry_makeElipsisMarker ();
+	}
+      else
+	{
+	  qtype ct = convertLclTypeSpecNode (p->type);
+	  ctype cr = convertTypeExpr (qtype_getType (ct), p->paramdecl);
+	  cstring pname = (p->paramdecl == (typeExpr)0) ? cstring_undefined 
+	                                                : paramNode_name (p);
+	  uentry ue = uentry_makeVariableParam (pname, cr);
+
+	  uentry_reflectQualifiers (ue, qtype_getQuals (ct));
+	  qtype_free (ct);
+	  return (ue);
+	}
+    }
+  else
+    {
+      llcontbuglit ("paramNode_toUentry: NULL");
+      return uentry_undefined;
+    }
+  BADEXIT;
+}
+
+static uentryList
+  paramNodeList_toUentryList (paramNodeList p)
+{
+  uentryList cl = uentryList_new ();
+
+  if (paramNodeList_isNull (p)) return (cl);
+
+  paramNodeList_elements (p, current)
+    {
+      cl = uentryList_add (cl, paramNode_toUentry (current));
+    } end_paramNodeList_elements;
+
+  return cl;
+}
+
+
diff --git a/src/varDeclarationNodeList.c b/src/varDeclarationNodeList.c
new file mode 100644
index 0000000..fbacc41
--- /dev/null
+++ b/src/varDeclarationNodeList.c
@@ -0,0 +1,107 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** varDeclarationNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+varDeclarationNodeList varDeclarationNodeList_new ()
+{
+  varDeclarationNodeList s = (varDeclarationNodeList) dmalloc (sizeof (*s));
+   
+  s->nelements = 0;
+  s->nspace = varDeclarationNodeListBASESIZE;
+  s->elements = (varDeclarationNode *) 
+    dmalloc (sizeof (*s->elements) * varDeclarationNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+varDeclarationNodeList_grow (varDeclarationNodeList s)
+{
+  int i;
+  varDeclarationNode *newelements; 
+
+  s->nspace += varDeclarationNodeListBASESIZE;
+
+  newelements = (varDeclarationNode *) dmalloc (sizeof (*newelements) 
+						* (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i];
+    }
+
+  sfree (s->elements);
+  s->elements = newelements;
+}
+
+void 
+varDeclarationNodeList_addh (varDeclarationNodeList s, /*@keep@*/ varDeclarationNode el)
+{
+  if (s->nspace <= 0)
+    varDeclarationNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+}
+
+/*@only@*/ cstring
+varDeclarationNodeList_unparse (varDeclarationNodeList s)
+{
+  cstring st = cstring_undefined;
+
+  varDeclarationNodeList_elements (s, current)
+  {
+    if (current->isPrivate)
+      st = message ("%q private ", st);
+
+    st = message ("%q%q %q;\n", st, lclTypeSpecNode_unparse (current->type),
+		  initDeclNodeList_unparse (current->decls));
+  } end_varDeclarationNodeList_elements;
+
+  return st;
+}
+
+
+void
+varDeclarationNodeList_free (varDeclarationNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      varDeclarationNode_free (s->elements[i]); 
+    }
+
+  sfree (s->elements);
+  sfree (s);
+}
diff --git a/src/varKinds.c b/src/varKinds.c
new file mode 100644
index 0000000..1864dc3
--- /dev/null
+++ b/src/varKinds.c
@@ -0,0 +1,623 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** varKinds.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+alkind alkind_fromInt (int n)
+{
+  /*@+enumint@*/
+  llassert (n >= AK_UNKNOWN && n <= AK_LOCAL);
+  /*@=enumint@*/
+
+  return ((alkind)n);
+}
+
+nstate nstate_fromInt (int n)
+{
+  /*@+enumint@*/
+  llassert (n >= NS_ERROR && n <= NS_ABSNULL);
+  /*@=enumint@*/
+
+  return ((nstate)n);
+}
+
+sstate sstate_fromInt (int n)
+{
+  /*@+enumint@*/
+  llassert (n >= SS_UNKNOWN && n < SS_LAST);
+  /*@=enumint@*/
+
+  return ((sstate)n);
+}
+
+exkind exkind_fromInt (int n)
+{
+  /*@+enumint@*/
+  llassert (n >= XO_UNKNOWN && n <= XO_OBSERVER);
+  /*@=enumint@*/
+
+  return ((exkind) n);
+}
+
+cstring sstate_unparse (sstate s)
+{
+  switch (s)
+    {
+    case SS_UNKNOWN:   return cstring_makeLiteralTemp ("unknown");
+    case SS_UNUSEABLE: return cstring_makeLiteralTemp ("unuseable");
+    case SS_UNDEFINED: return cstring_makeLiteralTemp ("undefined");
+    case SS_MUNDEFINED:return cstring_makeLiteralTemp ("possibly undefined");
+    case SS_ALLOCATED: return cstring_makeLiteralTemp ("allocated");
+    case SS_PDEFINED:  return cstring_makeLiteralTemp ("partially defined");
+    case SS_DEFINED:   return cstring_makeLiteralTemp ("defined");
+    case SS_PARTIAL:   return cstring_makeLiteralTemp ("partial");
+    case SS_SPECIAL:   return cstring_makeLiteralTemp ("special");
+    case SS_DEAD:      return cstring_makeLiteralTemp ("dead");
+    case SS_HOFFA:     return cstring_makeLiteralTemp ("probably dead");
+    case SS_FIXED:     return cstring_makeLiteralTemp ("unmodifiable");
+    case SS_RELDEF:    return cstring_makeLiteralTemp ("reldef");
+    case SS_LAST:      llcontbuglit ("sstate_unparse: last");
+                       return cstring_makeLiteralTemp ("");
+    case SS_UNDEFGLOB:     return cstring_makeLiteralTemp ("undefglob");
+    case SS_KILLED:    return cstring_makeLiteralTemp ("killed");
+    case SS_UNDEFKILLED:
+      return cstring_makeLiteralTemp ("undefkilled");
+    }
+
+  BADEXIT;
+}
+
+bool nstate_possiblyNull (nstate n)
+{
+  /*
+  ** note: not NS_UNKNOWN or NS_ERROR 
+  */
+
+  return ((n >= NS_CONSTNULL) && (n <= NS_ABSNULL));
+}
+
+bool nstate_perhapsNull (nstate n)
+{
+  /*
+  ** note: not NS_UNKNOWN or NS_ERROR 
+  */
+
+  return ((n >= NS_RELNULL) && (n <= NS_ABSNULL));
+}
+
+cstring nstate_unparse (nstate n)
+{
+  switch (n)
+    {
+    case NS_ERROR:     return cstring_makeLiteralTemp ("");
+    case NS_UNKNOWN:   return cstring_makeLiteralTemp ("implicitly non-null");
+    case NS_POSNULL:   return cstring_makeLiteralTemp ("null");
+    case NS_DEFNULL:   return cstring_makeLiteralTemp ("null");
+    case NS_NOTNULL:   return cstring_makeLiteralTemp ("notnull");
+    case NS_MNOTNULL:  return cstring_makeLiteralTemp ("notnull");
+    case NS_ABSNULL:   return cstring_makeLiteralTemp ("null");
+    case NS_RELNULL:   return cstring_makeLiteralTemp ("relnull");
+    case NS_CONSTNULL: return cstring_makeLiteralTemp ("null");
+    }
+
+  BADEXIT;
+}
+
+/*
+** ??? (used to do something different for guarded)
+*/
+
+int nstate_compare (nstate n1, nstate n2)
+{
+  return (generic_compare (n1, n2));
+}
+
+/*
+** This occurs when we select a field with alkind inner, 
+** from a structure with alkind outer.  It is probably
+** unnecessary.
+*/
+
+alkind alkind_derive (alkind outer, alkind inner)
+{
+  switch (outer)
+    {
+    case AK_ERROR:
+    case AK_UNKNOWN: return inner;
+    case AK_KEPT:
+    case AK_KEEP:
+    case AK_ONLY: 
+    case AK_IMPONLY:
+    case AK_OWNED:
+    case AK_IMPDEPENDENT:
+    case AK_DEPENDENT:
+      if (inner == AK_SHARED) return AK_SHARED;
+      else return outer;
+      /* not so sure about these? */
+    case AK_REFCOUNTED:
+    case AK_NEWREF:
+    case AK_KILLREF:
+    case AK_REFS:
+    case AK_STACK:
+    case AK_STATIC:
+      return outer;
+    case AK_TEMP: 
+    case AK_IMPTEMP:
+    case AK_SHARED:
+    case AK_UNIQUE:
+    case AK_LOCAL: 
+    case AK_FRESH:
+    case AK_RETURNED:
+      if (alkind_isKnown (inner)) return inner; 
+      else return outer;
+    }
+  BADEXIT;
+}
+
+cstring alkind_unparse (alkind a)
+{
+  switch (a)
+    {
+    case AK_ERROR:           return cstring_makeLiteralTemp ("");
+    case AK_UNKNOWN:         return cstring_makeLiteralTemp ("unqualified");
+    case AK_ONLY:            return cstring_makeLiteralTemp ("only");
+    case AK_IMPONLY:         return cstring_makeLiteralTemp ("implicitly only");
+    case AK_OWNED:           return cstring_makeLiteralTemp ("owned");
+    case AK_IMPDEPENDENT:    return cstring_makeLiteralTemp ("implicitly dependent");
+    case AK_DEPENDENT:       return cstring_makeLiteralTemp ("dependent");
+    case AK_KEEP:            return cstring_makeLiteralTemp ("keep");
+    case AK_KEPT:            return cstring_makeLiteralTemp ("kept");
+    case AK_IMPTEMP:         return cstring_makeLiteralTemp ("implicitly temp");
+    case AK_TEMP:            return cstring_makeLiteralTemp ("temp");
+    case AK_SHARED:          return cstring_makeLiteralTemp ("shared");
+    case AK_UNIQUE:          return cstring_makeLiteralTemp ("unique");
+    case AK_RETURNED:        return cstring_makeLiteralTemp ("returned");
+    case AK_FRESH:           return cstring_makeLiteralTemp ("fresh");
+    case AK_STACK:           return cstring_makeLiteralTemp ("stack");
+    case AK_REFCOUNTED:      return cstring_makeLiteralTemp ("refcounted");
+    case AK_REFS:            return cstring_makeLiteralTemp ("refs");
+    case AK_KILLREF:         return cstring_makeLiteralTemp ("killref");
+    case AK_NEWREF:          return cstring_makeLiteralTemp ("newref");
+    case AK_LOCAL:           return cstring_makeLiteralTemp ("local");
+    case AK_STATIC:          return cstring_makeLiteralTemp ("unqualified static");
+    }
+    BADEXIT;
+}
+
+cstring exkind_unparse (exkind a)
+{
+  switch (a)
+    {
+    case XO_UNKNOWN:         return cstring_makeLiteralTemp ("unknown");
+    case XO_NORMAL:          return cstring_makeLiteralTemp ("unexposed");
+    case XO_EXPOSED:         return cstring_makeLiteralTemp ("exposed");
+    case XO_OBSERVER:        return cstring_makeLiteralTemp ("observer");
+    }
+  BADEXIT;
+}
+
+cstring exkind_capName (exkind a)
+{
+  switch (a)
+    {
+    case XO_UNKNOWN:         return cstring_makeLiteralTemp ("Unknown");
+    case XO_NORMAL:          return cstring_makeLiteralTemp ("Unexposed");
+    case XO_EXPOSED:         return cstring_makeLiteralTemp ("Exposed");
+    case XO_OBSERVER:        return cstring_makeLiteralTemp ("Observer");
+    }
+  BADEXIT;
+}
+
+cstring exkind_unparseError (exkind a)
+{
+  switch (a)
+    {
+    case XO_UNKNOWN:         return cstring_makeLiteralTemp ("unqualified");
+    case XO_NORMAL:          return cstring_makeLiteralTemp ("unqualifier");
+    case XO_EXPOSED:         return cstring_makeLiteralTemp ("exposed");
+    case XO_OBSERVER:        return cstring_makeLiteralTemp ("observer");
+    }
+  BADEXIT;
+}
+
+cstring alkind_capName (alkind a)
+{
+  switch (a)
+    {
+    case AK_ERROR:    
+      return cstring_makeLiteralTemp ("");
+    case AK_UNKNOWN:     
+      return cstring_makeLiteralTemp ("Unqualified");
+    case AK_ONLY:  
+      return cstring_makeLiteralTemp ("Only");
+    case AK_IMPONLY:
+      return cstring_makeLiteralTemp ("Implicitly only");
+    case AK_OWNED:
+      return cstring_makeLiteralTemp ("Owned");
+    case AK_IMPDEPENDENT:  
+      return cstring_makeLiteralTemp ("Implicitly dependent");
+    case AK_DEPENDENT:  
+      return cstring_makeLiteralTemp ("Dependent");
+    case AK_KEEP:     
+      return cstring_makeLiteralTemp ("Keep");
+    case AK_KEPT:    
+      return cstring_makeLiteralTemp ("Kept");
+    case AK_IMPTEMP:   
+      return cstring_makeLiteralTemp ("Implicitly temp");
+    case AK_TEMP:    
+      return cstring_makeLiteralTemp ("Temp");
+    case AK_SHARED:
+      return cstring_makeLiteralTemp ("Shared");
+    case AK_UNIQUE:    
+      return cstring_makeLiteralTemp ("Unique");
+    case AK_RETURNED:
+      return cstring_makeLiteralTemp ("Returned");
+    case AK_FRESH:   
+      return cstring_makeLiteralTemp ("Fresh");
+    case AK_STACK:      
+      return cstring_makeLiteralTemp ("Stack");
+    case AK_REFCOUNTED: 
+      return cstring_makeLiteralTemp ("Refcounted");
+    case AK_REFS:
+      return cstring_makeLiteralTemp ("Refs");
+    case AK_KILLREF: 
+      return cstring_makeLiteralTemp ("Killref");
+    case AK_NEWREF:    
+      return cstring_makeLiteralTemp ("Newref");
+    case AK_LOCAL:    
+      return cstring_makeLiteralTemp ("Local");
+    case AK_STATIC: 
+      return cstring_makeLiteralTemp ("Unqualified static");
+    }
+  BADEXIT;
+}
+
+exkind
+exkind_fromQual (qual q)
+{
+  if (qual_isExposed (q))     return XO_EXPOSED;
+  if (qual_isObserver (q))    return XO_OBSERVER;
+  else
+    {
+      llcontbug (message ("exkind_fromQual: not exp qualifier: %d" , (int)q));
+      return XO_UNKNOWN;
+    }
+}
+
+sstate
+sstate_fromQual (qual q)
+{
+  if (qual_isOut (q))          return SS_ALLOCATED;
+  if (qual_isIn (q))           return SS_DEFINED;
+  else if (qual_isPartial (q)) return SS_PARTIAL;
+  else if (qual_isRelDef (q))  return SS_RELDEF;
+  else if (qual_isUndef (q))   return SS_UNDEFGLOB;
+  else if (qual_isKilled (q))  return SS_KILLED;
+  else if (qual_isSpecial (q)) return SS_SPECIAL;
+  else
+    {
+      llcontbug (message ("sstate_fromQual: not alias qualifier: %s (%d)" , 
+			  qual_unparse (q),
+			  (int)q));
+      return SS_UNKNOWN;
+    }
+}
+
+exitkind
+exitkind_fromQual (qual q)
+{
+  if (qual_isExits (q))     return XK_MUSTEXIT;
+  if (qual_isMayExit (q))   return XK_MAYEXIT;
+  if (qual_isTrueExit (q))  return XK_TRUEEXIT;
+  if (qual_isFalseExit (q)) return XK_FALSEEXIT;
+  if (qual_isNeverExit (q)) return XK_NEVERESCAPE;
+  else
+    {
+      llcontbug (message ("exitkind_fromQual: not exit qualifier: %s",
+			  qual_unparse (q)));
+      return XK_UNKNOWN;
+    }
+}
+
+alkind
+alkind_fromQual (qual q)
+{
+  if (qual_isOnly (q))       return AK_ONLY;
+  if (qual_isImpOnly (q))    return AK_IMPONLY;
+  if (qual_isKeep (q))       return AK_KEEP;
+  if (qual_isKept (q))       return AK_KEPT;
+  if (qual_isTemp (q))       return AK_TEMP;
+  if (qual_isShared (q))     return AK_SHARED;
+  if (qual_isUnique (q))     return AK_UNIQUE;
+  if (qual_isRefCounted (q)) return AK_REFCOUNTED;
+  if (qual_isRefs (q))       return AK_REFS;
+  if (qual_isNewRef (q))     return AK_NEWREF;
+  if (qual_isKillRef (q))    return AK_KILLREF;
+  if (qual_isTempRef (q))    return AK_KILLREF; /* kludge? use kill ref for this */
+  if (qual_isOwned (q))      return AK_OWNED;
+  if (qual_isDependent (q))  return AK_DEPENDENT;
+
+  llcontbug (message ("alkind_fromQual: not alias qualifier: %d" , (int)q));
+  return AK_ERROR;
+}    
+
+static bool alkind_isMeaningless (alkind a1)
+{
+  return (a1 == AK_ERROR || a1 == AK_UNKNOWN || a1 == AK_RETURNED
+	  || a1 == AK_STACK || a1 == AK_REFCOUNTED
+	  || a1 == AK_REFS || a1 == AK_KILLREF || a1 == AK_NEWREF
+	  || a1 == AK_LOCAL);
+}
+
+bool alkind_compatible (alkind a1, alkind a2)
+{
+  if (a1 == a2) return TRUE;
+  if (a2 == AK_ERROR) return TRUE;
+  if (a2 == AK_UNKNOWN)
+    {
+      return (alkind_isMeaningless (a1) || (a1 == AK_IMPTEMP));
+    }
+
+  switch (a1)
+    {
+    case AK_ERROR:               return TRUE;
+    case AK_UNKNOWN:             return (alkind_isMeaningless (a2)
+					 || (a2 == AK_IMPTEMP));
+    case AK_IMPONLY:             return (a2 == AK_KEEP || a2 == AK_FRESH 
+					 || a2 == AK_ONLY);
+    case AK_ONLY:                return (a2 == AK_KEEP || a2 == AK_FRESH
+					 || a2 == AK_IMPONLY);
+    case AK_OWNED:               return FALSE;
+    case AK_IMPDEPENDENT:        return (a2 == AK_DEPENDENT);
+    case AK_DEPENDENT:           return (a2 == AK_IMPDEPENDENT);
+    case AK_KEEP:                return (a2 == AK_ONLY || a2 == AK_FRESH
+					 || a2 == AK_IMPONLY);
+    case AK_KEPT:                return FALSE;
+    case AK_IMPTEMP:             return (a2 == AK_TEMP);
+    case AK_TEMP:                return (a2 == AK_IMPTEMP);
+    case AK_SHARED:              return FALSE;
+    case AK_UNIQUE:              return (a2 == AK_TEMP);
+    case AK_RETURNED:            return (alkind_isMeaningless (a2));
+    case AK_FRESH:               return (alkind_isOnly (a2));
+    case AK_STACK:               return (alkind_isMeaningless (a2));
+    case AK_REFCOUNTED:          return (alkind_isMeaningless (a2));
+    case AK_REFS:                return (alkind_isMeaningless (a2));
+    case AK_KILLREF:             return (alkind_isMeaningless (a2));
+    case AK_NEWREF:              return (alkind_isMeaningless (a2));
+    case AK_LOCAL:               return (alkind_isMeaningless (a2));
+    case AK_STATIC:              return (alkind_isMeaningless (a2));
+    }
+  BADEXIT;
+}
+
+bool alkind_equal (alkind a1, alkind a2)
+{
+  if (a1 == a2) return TRUE;
+  if (a2 == AK_ERROR) return TRUE;
+
+  switch (a1)
+    {
+    case AK_ERROR:               return TRUE;
+    case AK_IMPONLY:             return (a2 == AK_ONLY);
+    case AK_ONLY:                return (a2 == AK_IMPONLY);
+    case AK_IMPDEPENDENT:        return (a2 == AK_DEPENDENT);
+    case AK_DEPENDENT:           return (a2 == AK_IMPDEPENDENT);
+    case AK_IMPTEMP:             return (a2 == AK_TEMP);
+    case AK_TEMP:                return (a2 == AK_IMPTEMP);
+    default:                     return FALSE;
+    }
+
+  BADEXIT;
+}
+
+alkind
+alkind_fixImplicit (alkind a)
+{
+  if (a == AK_IMPTEMP) return AK_TEMP;
+  if (a == AK_IMPONLY) return AK_IMPONLY;
+  if (a == AK_IMPDEPENDENT) return AK_DEPENDENT;
+
+  return a;
+}
+
+cstring exitkind_unparse (exitkind k)
+{
+  switch (k)
+    {
+    case XK_ERROR:       return (cstring_makeLiteralTemp (""));
+    case XK_UNKNOWN:     return (cstring_makeLiteralTemp ("?"));
+    case XK_NEVERESCAPE: return (cstring_makeLiteralTemp ("never escape"));
+    case XK_MAYEXIT:     return (cstring_makeLiteralTemp ("mayexit"));
+    case XK_MUSTEXIT:    return (cstring_makeLiteralTemp ("exits"));
+    case XK_TRUEEXIT:    return (cstring_makeLiteralTemp ("trueexit"));
+    case XK_FALSEEXIT:   return (cstring_makeLiteralTemp ("falseexit"));
+    case XK_MUSTRETURN:  return (cstring_makeLiteralTemp ("mustreturn"));
+    case XK_MAYRETURN:   return (cstring_makeLiteralTemp ("mayreturn"));
+    case XK_MUSTRETURNEXIT: return (cstring_makeLiteralTemp ("mustreturnexit"));
+    case XK_MAYRETURNEXIT: return (cstring_makeLiteralTemp ("mayreturnexit"));
+    case XK_GOTO:        return (cstring_makeLiteralTemp ("goto"));
+    case XK_MAYGOTO:     return (cstring_makeLiteralTemp ("maygoto"));
+    }
+  
+ BADEXIT;
+}
+
+exitkind exitkind_makeConditional (exitkind k)
+{
+  switch (k)
+    {
+    case XK_TRUEEXIT:
+    case XK_FALSEEXIT: 
+    case XK_MUSTEXIT:       return XK_MAYEXIT;
+    case XK_MUSTRETURN:     return XK_MAYRETURN;
+    case XK_MUSTRETURNEXIT: return XK_MAYRETURNEXIT;
+    case XK_GOTO:           return XK_MAYGOTO;
+    default:                return k;
+    }
+}
+
+exitkind exitkind_combine (exitkind k1, exitkind k2)
+{
+  if (k1 == k2)
+    {
+      return k1;
+    }
+
+  if (k2 == XK_ERROR)
+    {
+      return XK_ERROR;
+    }
+
+  switch (k1)
+    {
+    case XK_ERROR: return XK_ERROR;
+    case XK_UNKNOWN:     
+    case XK_NEVERESCAPE: return (exitkind_makeConditional (k2));
+    case XK_MUSTEXIT:    
+      switch (k2)
+	{
+	case XK_MUSTRETURNEXIT:
+	case XK_MUSTRETURN: return XK_MUSTRETURNEXIT;
+	case XK_MAYRETURNEXIT:
+	case XK_MAYRETURN:  return XK_MAYRETURNEXIT;
+	default:             return XK_MAYEXIT;
+	}
+      BADEXIT;
+
+    case XK_MAYEXIT:     
+    case XK_TRUEEXIT:    
+    case XK_FALSEEXIT:   
+      switch (k2)
+	{
+	case XK_MUSTRETURNEXIT:
+	case XK_MAYRETURNEXIT:
+	case XK_MAYRETURN:
+	case XK_MUSTRETURN: return XK_MAYRETURNEXIT;
+	default:             return XK_MAYEXIT;
+	}
+      BADEXIT;
+
+    case XK_MUSTRETURN:
+      switch (k2)
+	{
+	case XK_MUSTRETURNEXIT:
+	case XK_MUSTEXIT:    return XK_MUSTRETURNEXIT;
+	case XK_MAYRETURNEXIT:
+	case XK_TRUEEXIT:
+	case XK_FALSEEXIT:
+	case XK_MAYEXIT:     return XK_MAYRETURNEXIT;
+	default:              return XK_MAYRETURN;
+	}
+      BADEXIT;
+
+    case XK_MAYRETURN:
+      if (exitkind_couldExit (k2))
+	{
+	  return XK_MAYRETURNEXIT;
+	}
+      else
+	{
+	  return XK_MAYRETURN;
+	}
+
+    case XK_MUSTRETURNEXIT: 
+      switch (k2)
+	{
+	case XK_MUSTRETURN:
+	case XK_MUSTEXIT:    return XK_MUSTRETURNEXIT;
+	default:              return XK_MAYRETURNEXIT;
+	}
+      BADEXIT;
+
+    case XK_MAYRETURNEXIT:   return XK_MAYRETURNEXIT;
+    case XK_GOTO:
+    case XK_MAYGOTO:         
+      if (exitkind_couldExit (k2))
+	{
+	  return XK_MAYRETURNEXIT;
+	}
+      return XK_MAYGOTO;
+    }
+  
+ BADEXIT;
+}
+
+bool exitkind_couldExit (exitkind e)
+{
+  switch (e)
+    {
+    case XK_MAYEXIT:
+    case XK_MUSTEXIT:
+    case XK_TRUEEXIT:
+    case XK_FALSEEXIT:
+    case XK_MAYRETURNEXIT:
+    case XK_MUSTRETURNEXIT: 
+    case XK_GOTO:
+    case XK_MAYGOTO: return TRUE;
+    default: return FALSE;
+    }
+}
+
+static bool exitkind_couldReturn (exitkind e) /*@*/ 
+{
+  switch (e)
+    {
+    case XK_MUSTRETURN:
+    case XK_MAYRETURN:
+    case XK_MAYRETURNEXIT:
+    case XK_MUSTRETURNEXIT:  return TRUE;
+    default: return FALSE;
+    }
+}
+
+static bool exitkind_couldGoto (exitkind e) /*@*/
+{
+  return (e == XK_GOTO || e == XK_MAYGOTO);
+}
+
+bool exitkind_couldEscape (exitkind e)
+{
+  return exitkind_couldReturn (e) || exitkind_couldExit (e)
+    || exitkind_couldGoto (e);
+}
+
+exitkind exitkind_fromInt (int x)
+{
+  /*@+enumint@*/
+  llassert (x >= XK_ERROR && x <= XK_LAST);
+  /*@=enumint@*/
+
+  return (exitkind) x;
+}
+
+
+
+
+
+
+
diff --git a/src/varNodeList.c b/src/varNodeList.c
new file mode 100644
index 0000000..a471484
--- /dev/null
+++ b/src/varNodeList.c
@@ -0,0 +1,138 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** varNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+varNodeList varNodeList_new ()
+{
+  varNodeList s = (varNodeList) dmalloc (sizeof (*s));
+
+  s->nelements = 0;
+  s->nspace = varNodeListBASESIZE;
+  s->elements = (varNode *)
+    dmalloc (sizeof (*s->elements) * varNodeListBASESIZE);
+
+  return (s);
+}
+
+static void
+varNodeList_grow (varNodeList s)
+{
+  int i;
+  varNode *newelements; 
+
+  s->nspace += varNodeListBASESIZE;
+  newelements = (varNode *) dmalloc (sizeof (*newelements)
+				     * (s->nelements + s->nspace));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i] = s->elements[i]; 
+    }
+
+  sfree (s->elements); 
+  s->elements = newelements;
+}
+
+varNodeList 
+varNodeList_add (varNodeList s, varNode el)
+{
+  if (s->nspace <= 0)
+    varNodeList_grow (s);
+
+  s->nspace--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+  return s;
+}
+
+cstring
+varNodeList_unparse (varNodeList s)
+{
+  int i;
+  cstring st = cstring_undefined;
+  bool first = TRUE;
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      cstring type = cstring_undefined;
+      varNode current = s->elements[i];
+
+      if (current->isObj)
+	{
+	  type = cstring_makeLiteral ("obj ");
+	}
+
+      if (current->type != NULL)
+	{
+	  type = message (": %q%q", type, lclTypeSpecNode_unparse (current->type));
+	}
+
+      if (first)
+	{
+	  st = type;
+	  first = FALSE;
+	}
+      else
+	{
+	  st = message ("%q, %q", st, type);
+	}
+    }
+
+  return st;
+}
+
+void
+varNodeList_free (varNodeList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      varNode_free (s->elements[i]); 
+    }
+
+  sfree (s->elements);
+  sfree (s);
+}
+
+varNodeList
+varNodeList_copy (varNodeList s)
+{
+  varNodeList ret = varNodeList_new ();
+
+  varNodeList_elements (s, el)
+    {
+      ret = varNodeList_add (ret, varNode_copy (el));
+    } end_varNodeList_elements;
+
+  return ret;
+}
diff --git a/src/ynm.c b/src/ynm.c
new file mode 100644
index 0000000..fe5c0e2
--- /dev/null
+++ b/src/ynm.c
@@ -0,0 +1,54 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** ynm.c
+*/
+
+# include "lclintMacros.nf"
+# include "basic.h"
+
+ynm ynm_fromCodeChar (char c)
+{
+  switch (c)
+    {
+    case '+': return YES;
+    case '-': return NO;
+    case '=': return MAYBE;
+    BADDEFAULT;
+    }
+}
+
+int ynm_compare (ynm x, ynm y)
+{
+  switch (x)
+    {
+    case YES: if (y == YES) return 0; else return 1;
+    case NO:  if (y == NO)  return 0; else return -1;
+    case MAYBE: if (y == MAYBE) return 0; else return 1;
+    }
+
+  BADEXIT;
+}
+      
+      
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 0000000..9206dc8
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,603 @@
+##################################################
+###                                            ###
+### Makefile for LCLint testing                ###
+###                                            ### 
+### designed for use with GNU make             ### 
+###                                            ###
+##################################################
+
+.PHONY: all fulltest quicktest funcpointer cast abstract
+.PHONY:	version help abstptr abstract alias alttypes ansireserved 
+.PHONY: argorder args blocks break cases cast charlit 
+.PHONY: clauses commentchar 
+.PHONY: compdestroy controldepth csyntax czechnames czechoslovaknames 
+.PHONY: decl enum exports external fields flags funcpointer glob globals 
+.PHONY: impabstract init inparam internal iter keep libs lintcomments 
+.PHONY: list macros macrosef merge modifies modtest moduncon mongoincludes 
+.PHONY: null observer oldstyle outglob outparam preds prefixes printflike rc 
+.PHONY: refcounts release repexpose sharing slovaknames special
+.PHONY: specclauses stack staticarray
+.PHONY: strings structassign
+.PHONY: typequals ud ulstypes union unreachable unused 
+.PHONY: db1 db2 db3 tests2.2 tests2.2a tests2.4
+.PHONY: all test fulltest expects quicktest
+
+.SUFFIXES: .out .expect .c .lcl .h .lh .diff
+
+SHELL = /bin/csh -f
+
+# Command to run lclint
+LCLINT  = lclint
+LCLINTP = $(LCLINT)
+
+# Make sure .lclintrc files are not used so test results do not
+# depend on local settings.
+LCLINTRN = $(LCLINTP) -nof -hints -booltype "bool"
+LCLINTR = $(LCLINTRN) -exportlocal
+
+UNITTESTS = help abstptr abstract alias alttypes ansireserved argorder args blocks break cases cast charlit clauses commentchar compdestroy controldepth csyntax czechnames czechoslovaknames decl enum exports external fields flags funcpointer glob globals impabstract init inparam internal iter keep libs lintcomments list macros macrosef merge modifies modtest moduncon mongoincludes null observer oldstyle outglob outparam preds prefixes printflike rc refcounts release repexpose sharing slovaknames specclauses special stack staticarray strings structassign typequals ud ulstypes union unreachable unused tests2.2 tests2.2a tests2.4
+
+UNITEXPECTS  = $(addsuffix .expect, $(UNITTESTS))
+
+INTEGTESTS = db1 db2 db3
+INTEGEXPECTS  = $(addsuffix .expect, $(INTEGTESTS))
+
+LCLINTTESTS = $(UNITTESTS) $(INTEGTESTS)
+
+all: fulltest
+test: fulltest
+
+GREP = grep
+DIFF = diff
+CLEANOUTPUT = $(GREP) -v "LCLint 2." | $(GREP) -v "make -e" | $(GREP) -v "make\[" | $(GREP) -v "lclint -nof" | $(GREP) -v "make  -e"
+
+### not real .c
+
+.c.expect:
+	$(MAKE) -e $(*) |& $(CLEANOUTPUT) > $(*).expect ; \
+	cat $(*).expect
+
+.c.diff:
+	$(MAKE) -e $(*) |& $(CLEANOUTPUT) > $(*).out ; \
+        diff $(*).expect $(*).out
+
+expects:
+	echo "Saving old expects: " ; \
+        more *.expect | cat > expects-`date +"%y-%m-%d-%H"`
+	@$(foreach test, $(UNITTESTS),  \
+	   echo "Making "$(test)".expect: " ; \
+           $(MAKE) -e $(test) |& $(CLEANOUTPUT) > $(test).expect ; \
+	   cat $(test).expect ; ) 
+	@echo "Integration Tests"	
+	@$(foreach test, $(INTEGTESTS),  \
+	   echo "Making "$(test)".expect: "; \
+           $(MAKE) -e $(test) |& $(CLEANOUTPUT) > $(test).expect ; \
+	   cat $(test).expect ; ) 
+
+fulltest:
+	@echo ''
+	@echo 'Testing '$(LCLINTP)
+	@echo ''
+	@echo 'Version:'
+	@echo ''
+	@$(LCLINTP) -help version
+	@$(LCLINTP) -help vars
+	@echo ''
+	@echo "Unit Tests:"
+	@echo ''
+	@$(foreach test, $(UNITTESTS),  \
+	   echo "Checking "$(test)"... " ; \
+           $(MAKE) -e $(test) |& $(CLEANOUTPUT) > $(test).out ; \
+	   $(DIFF) $(test).expect $(test).out ; \
+	   if ($$status) echo "*** FAIL ***" ; \
+	   ) 
+	@echo ''
+	@echo "Integration Tests"	
+	@echo ''
+	@$(foreach test, $(INTEGTESTS),  \
+	   echo "Checking "$(test)"... "; \
+           $(MAKE) -e $(test) |& $(CLEANOUTPUT) > $(test).out ; \
+	   $(DIFF) $(test).expect $(test).out ; )
+
+quicktest: $(LCLINTTESTS)
+
+###
+### Unit Tests
+###
+
+version:
+	-$(LCLINTP) -help version
+
+help:
+	-@$(LCLINTP)
+	-@setenv LARCH_PATH "/dev/null"; $(LCLINTP) empty.lcl
+	-@$(LCLINTP) -help
+	-@$(LCLINTP) -asdf
+	-@$(LCLINTP) +boolint +boolint 
+	-@$(LCLINTP) -help flags alpha
+	-@$(LCLINTP) -help flags all
+
+abstptr:
+	$(LCLINTR) abstptr -expect 9
+	$(LCLINTR) abstptr +voidabstract -expect 6
+
+abstract:
+	$(LCLINTR) abst_t.lcl commentcmd.c -expect 15
+
+alias:
+	$(LCLINTR) +lh mut
+	$(LCLINTR) mut alias +globalias -expect 19
+	$(LCLINTR) mut alias2 +globalias -expect 17
+	$(LCLINTR) +lh alias3 -expect 14 
+	$(LCLINTR) +lh alias4 +boolint
+	$(LCLINTR) alias4 -pred +retalias -expect 6
+	$(LCLINTR) +lh alias5 +memchecks -null -specundef -expect 5
+
+alttypes:
+	$(LCLINTR) alttypes.c -expect 2
+
+ansireserved:
+	$(LCLINTR) ansireserved.c +ansireserved -nolib -expect 8
+	$(LCLINTR) ansireserved.c +ansireserved +ansireservedlocal -nolib -expect 11
+	$(LCLINTRN) ansireserved.c +checks -exportlocal -exportheadervar -exportheader -expect 9
+
+argorder:
+	$(LCLINTR) argorder.c -expect 4
+	$(LCLINTR) argorder2  -expect 5
+	$(LCLINTR) argorder3.c -expect 8
+	$(LCLINTR) argorder4 -expect 9
+	$(LCLINTR) argorder4 -evalorder -expect 1
+	$(LCLINTR) argorder5.c +evalorderuncon -expect 3
+
+args:
+	$(LCLINTR) args -noeffect -expect 12
+
+blocks:
+	$(LCLINTR) blocks.c -expect 4
+	$(LCLINTR) blocks.c +ifblock +elseifcomplete -expect 7
+	$(LCLINTR) blocks.c -ifempty +whileempty +whileblock -expect 3
+	$(LCLINTR) blocks.c -ifempty +forempty +forblock -expect 3
+	$(LCLINTR) blocks.c +allempty -expect 6
+	$(LCLINTRN) blocks.c +strict -exportlocal +partial -exportheader -expect 11
+
+break:
+	$(LCLINTR) break.c -expect 4
+	$(LCLINTR) break.c +deepbreak -expect 6
+	$(LCLINTR) break.c +deepbreak -looploopbreak -expect 5
+
+cases: 
+	$(LCLINTR) cases.c -expect 5
+	$(LCLINTR) cases2.c -expect 2
+	$(LCLINTRN) cases2.c +checks -exportlocal -exportheader -expect 3
+	$(LCLINTRN) cases2.c +checks -exportlocal -exportheader -branchstate -expect 3
+
+cast:
+	$(LCLINTR) cast -accessmodule -expect 20
+	$(LCLINTRN) cast2.c +checks -exportlocal -exportheader -expect 3
+
+charlit:
+	$(LCLINTR) +hints charlit.c -expect 4
+	$(LCLINTR) +hints -numliteral charlit.c -expect 5
+	$(LCLINTR) +hints charlit.c +charintliteral +ignoresigns
+
+clauses: 
+	$(LCLINTR) clauses.c +memchecks -expect 4
+	$(LCLINTR) clauses2.c +memchecks 
+	$(LCLINTR) clauses3.c +memchecks -expect 2
+	$(LCLINTR) clauses3.c +memchecks +unixlib -expect 3
+
+commentchar:
+	$(LCLINTR) commentchar.c -expect 4
+	$(LCLINTR) -commentchar '#' commentchar.c -expect 4
+
+controldepth:
+	$(LCLINTR) +hints -controlnestdepth 2 controldepth.c -expect 2
+	$(LCLINTR) +hints -controlnestdepth 1 controldepth.c -expect 2
+
+compdestroy:
+	$(LCLINTRN) compdestroy.c +checks -exportlocal -exportheader -expect 1
+	$(LCLINTRN) compdestroy.c +checks -exportlocal -exportheader +strictdestroy -expect 2
+	$(LCLINTRN) compdestroy.c +checks -exportlocal -exportheader +strictdestroy +strictusereleased -expect 3
+	$(LCLINTRN) compdestroy.c +strict +partial -exportheader -expect 3
+
+csyntax:
+	$(LCLINTR) +quiet -incondefs csyntax.c 
+	$(LCLINTR) +quiet csyntax2.c
+	$(LCLINTR) +quiet csyntax3.c
+	$(LCLINTR) +quiet -incondefs csyntax4.c
+	$(LCLINTR) +quiet csyntax5.c
+	$(LCLINTR) +quiet csyntax6.c
+	$(LCLINTR) +quiet csyntax7.c
+	$(LCLINTR) +quiet csyntax8.c
+	$(LCLINTR) +quiet csyntax9.c
+	$(LCLINTR) +quiet csyntax10.c
+	$(LCLINTR) +quiet csyntax11.c
+	$(LCLINTR) +quiet csyntax12.c
+	$(LCLINTR) +quiet csyntax13.c
+	$(LCLINTR) +quiet csyntax14.c
+	$(LCLINTR) +quiet csyntax15.c
+	$(LCLINTR) +quiet csyntax16.c
+	$(LCLINTR) +quiet csyntax17.c
+
+czechnames:
+	$(LCLINTR) czechnames.c
+	$(LCLINTR) +hints +czech czechnames.c -expect 2
+	$(LCLINTR) +hints +czech -czechvars czechnames.c -expect 1
+	$(LCLINTR) +hints +czech -accessczech czechnames.c -expect 6
+
+czechoslovaknames:
+	$(LCLINTR) +hints +czechoslovak czechnames.c -expect 1
+	$(LCLINTR) +hints +czechoslovak slovaknames.c -expect 1
+	$(LCLINTR) +hints +czechoslovak +slovakvars slovaknames.c -expect 2
+
+#
+# Was expect 3 before 2.4.  Earlier versions did not handle implicit
+# function pointers correctly.
+#
+
+decl:
+	$(LCLINTR) decl.c -expect 2
+	$(LCLINTRN) decl.c +strict -exportlocal -expect 5
+	$(LCLINTR) decl2 -expect 4
+
+enum:
+	$(LCLINTR) enum -expect 16
+	$(LCLINTR) enum -misscase -expect 14
+
+exports:
+	$(LCLINTR) exports.c +exporttype +exportvar +exportfcn +topuse +typeuse -expect 6
+	$(LCLINTR) exports.c +exportany -expect 3
+	$(LCLINTR) exports.c
+
+external:
+	$(LCLINTR) external.c +partial
+	$(LCLINTR) external.c +partial +distinctexternalnames -expect 2
+	$(LCLINTR) external.c -nolib +partial -externalnamelength 3 -expect 3
+	$(LCLINTR) external.c -nolib +partial -externalnamelength 3 +externalnamecaseinsensitive -expect 3
+	$(LCLINTR) external.c +partial -externalnamelength 3 -expect 4
+
+fields:
+	$(LCLINTR) fields.c +memchecks -expect 6
+	$(LCLINTR) fields2.c +memchecks -expect 5
+	$(LCLINTR) fields3.c +memchecks
+
+flags:
+	$(LCLINTR) flags.c -expect 8
+	$(LCLINTR) +nocomments flags.c -expect 2
+
+# two new errors (invalid lhs)
+
+funcpointer:
+	$(LCLINTR) +memchecks +noparams funcpointer.c -expect 18
+
+glob:
+	$(LCLINTR) glob -expect 4
+	$(LCLINTR) glob -globuse -expect 3
+	$(LCLINTR) glob +globunspec -expect 6
+
+globals:
+	$(LCLINTR) -modifies globals.c -expect 5
+	$(LCLINTR) -modifies globals.c +allglobals -expect 6
+	$(LCLINTR) -modifies globals.c +impcheckedglobals -expect 6
+	$(LCLINTR) -modifies globals.c -globals -checkstrictglobals -expect 2
+	$(LCLINTR) -modifies globals.c +globunspec -expect 6
+	$(LCLINTR) -modifies globals.c +globunspec +allglobals -expect 8
+
+impabstract:
+	$(LCLINTR) -accessfile impabstract.c 
+	$(LCLINTR) -accessfile +hints +impabstract impabstract.c -expect 2
+	$(LCLINTR) -accessfile +hints +impabstract impabstract -expect 2
+
+init:
+	$(LCLINTR) init.c -expect 12
+	$(LCLINTRN) init.c +checks -exportlocal -exportheadervar -expect 15
+
+inparam:
+	$(LCLINTR) inparam.c -expect 2
+	$(LCLINTR) +impouts inparam.c -expect 1
+
+internal:
+	$(LCLINTR) internal.c -expect 1
+	$(LCLINTR) internal.c +distinctinternalnames -expect 2
+	$(LCLINTR) internal.c -internalnamelen 28 -expect 3
+	$(LCLINTR) internal.c +internalnamecaseinsensitive -expect 3
+	$(LCLINTR) internal.c +internalnamecaseinsensitive +internalnamelookalike -expect 11
+
+iter:
+	$(LCLINTR) iter -expect 14 -lclexpect 1
+	$(LCLINTR) iter2.c -expect 12
+
+keep:
+	$(LCLINTR) keep.c +memchecks -expect 6
+
+#
+# 2 new errors found (fixed spec of signal)
+#
+
+libs:
+	$(LCLINTR) libs.c +longunsignedunsignedintegral -expect 15
+	$(LCLINTR) libs.c -expect 19
+	$(LCLINTR) libs.c +globunspec +modunspec -expect 22
+	$(LCLINTR) libs.c +strictlib +globunspec +modunspec -expect 39
+
+lintcomments:
+	$(LCLINTR) lintcomments.c -expect 4
+	$(LCLINTR) lintcomments.c -warnlintcomments -expect 1
+	$(LCLINTR) lintcomments.c -lintcomments -expect 4
+
+list:
+	$(LCLINTR) list.c -expect 3
+
+macros:
+	$(LCLINTR) macros -expect 17 
+	$(LCLINTR) macros.c +allmacros -expect 34
+	$(LCLINTR) macros.c +fcnmacros -expect 31
+
+
+macrosef:
+	$(LCLINTR) macrosef -expect 4
+	$(LCLINTR) macrosef.c +allmacros -expect 3
+	$(LCLINTR) macrosef.c +allmacros +sefuncon -expect 4
+
+merge:
+	$(LCLINTRN) merge.c +checks -exportlocal -exportheadervar -exportheader -expect 3
+
+modifies:
+	$(LCLINTR) modifies.c modclient.c +impcheckedstatics +mustmod -expect 7
+
+modtest:
+	$(LCLINTR) modtest -expect 10
+	$(LCLINTR) modtest +modunspec -expect 13
+	$(LCLINTR) modtest +mustmod -expect 14
+
+moduncon:
+	$(LCLINTR) moduncon.c +moduncon -memchecks -expect 4
+	$(LCLINTRN) moduncon.c +strict -exportlocal -expect 22
+
+mongoincludes:
+	$(LCLINTR) mongoincludes.c -includenest 1 -expect 19
+	$(LCLINTR) mongoincludes.c -includenest 2 -expect 10
+	$(LCLINTR) mongoincludes.c -includenest 3 -expect 4
+	$(LCLINTR) mongoincludes.c -includenest 4 -expect 1
+	$(LCLINTR) mongoincludes.c -includenest 5 -expect 0
+
+null: 
+	$(LCLINTR) null1.c -expect 14
+	$(LCLINTR) null1.c -null -expect 4
+	$(LCLINTR) null2.c -expect 10
+	$(LCLINTR) null3.c -expect 15
+	$(LCLINTR) null3.c -warnunixlib +unixlib -expect 16
+	$(LCLINTR) null4.c -expect 1
+	$(LCLINTR) null5.c -expect 4
+	$(LCLINTR) null6 -expect 4
+	$(LCLINTR) +quiet null6.lcl -dump null6
+	$(LCLINTR) null6.c -load null6 -expect 4
+
+#
+# Before 2.4, expected one more because error was reported both as 
+# dependent and observer.
+#
+
+observer:
+	$(LCLINTRN) observer +checks -exportlocal -exportheader -expect 9
+	$(LCLINTRN) observer.c +checks -exportlocal -exportheader -expect 8
+	$(LCLINTR) observer.c -expect 7
+
+oldstyle:
+	$(LCLINTR) oldstyle -expect 3
+
+outglob:
+	$(LCLINTR) outglob -expect 10
+
+outparam:
+	$(LCLINTR) outparam -expect 12
+
+preds:
+	$(LCLINTR) +hints preds.c -expect 6
+	$(LCLINTRN) +hints preds.c -weak -expect 1
+	$(LCLINTRN) +hints preds.c -strict -exportlocal -exportheader -expect 8
+
+prefixes:
+	$(LCLINTR) prefixes.c +partial
+	$(LCLINTRN) prefixes.c +allmacros +checks -exportlocal +partial -exportheader -exportheadervar -expect 4
+	$(LCLINTR) prefixes.c -typeprefix "T" -expect 2
+	$(LCLINTR) prefixes.c -typeprefix "^" -expect 1
+	$(LCLINTR) prefixes.c -typeprefix "^*" -expect 2
+	$(LCLINTR) prefixes.c -typeprefix "^%*" -expect 2
+	$(LCLINTR) prefixes.c -typeprefix "^~*" -expect 2
+	$(LCLINTR) prefixes.c -typeprefix "^" +typeprefixexclude -expect 7
+	$(LCLINTR) prefixes.c -filestaticprefix "^^" -expect 4
+	$(LCLINTR) prefixes.c -filestaticprefix "^#" -expect 5
+	$(LCLINTR) prefixes.c -filestaticprefix "^?&x" -expect 5
+	$(LCLINTR) prefixes.c -globalprefix "G" -expect 1
+	$(LCLINTR) prefixes.c -globalprefix "&G?_^" -expect 1
+	$(LCLINTR) prefixes.c -externalprefix "G" -expect 5
+	$(LCLINTR) prefixes.c -typeprefix "T" -externalprefix "G" -expect 4
+	$(LCLINTR) prefixes.c -localprefix "?*" +localprefixexclude -expect 13
+
+printflike:
+	$(LCLINTR) printflike.c -expect 6
+	$(LCLINTR) printflike.c -warnlintcomments -expect 5
+
+rc:
+	-$(LCLINTR) -DMYSTERY='"a flag\"wicked cool"' rc.c -expect 1
+	-$(LCLINTR) -DMYSTERY=12 rc.c -expect 1
+	-$(LCLINTR) -f rc1.lclintrc rc.c
+	-$(LCLINTR) -UMYSTERY -f rc1.lclintrc rc.c -expect 1
+	-$(LCLINTR) -f rc3.lclintrc rc.c -expect 1
+
+refcounts:
+	$(LCLINTR) refcounts.c -expect 7 
+
+release:
+	$(LCLINTR) release.c +memchecks -expect 1
+
+repexpose:
+	$(LCLINTR) +lh repexpose +memchecks -expect 12
+	$(LCLINTR) repexpose +memchecks +retalias -expect 15
+	$(LCLINTRN) repexpose +checks -exportlocal -expect 27
+
+sharing: 
+	$(LCLINTR) sharing1.c -expect 21
+	$(LCLINTR) sharing3.c -expect  3
+	$(LCLINTR) sharing4.c -expect 13
+	$(LCLINTR) sharing4.c -paramimptemp -expect 12
+	$(LCLINTR) sharing5.c -expect 6
+
+slovaknames:
+	$(LCLINTR) +hints slovaknames.c -expect 1
+	$(LCLINTR) +hints slovaknames.c +accessslovak 
+	$(LCLINTR) +hints +slovak slovaknames.c -expect 3
+	$(LCLINTR) +hints +slovak -slovakvars slovaknames.c -expect 2
+	$(LCLINTR) +hints +slovak -accessslovak slovaknames.c -expect 7
+
+specclauses:
+	$(LCLINTR) specclauses.c -expect 6
+	$(LCLINTR) specclauses2.c -expect 8
+	$(LCLINTR) specclauses3.c -expect 6
+	$(LCLINTR) specclauses4.c -expect 3
+	$(LCLINTR) specclauses5.c -expect 3
+
+special:
+	$(LCLINTR) special -expect 20
+	$(LCLINTR) special -relaxquals -expect 22
+
+stack:
+	$(LCLINTR) stack.c -expect 5
+	$(LCLINTR) stack.c -stackref
+
+staticarray:
+	$(LCLINTR) staticarray.c -expect 3
+
+strings:
+	$(LCLINTR) strings.c -expect 3
+	$(LCLINTR) -readonlystrings -expect 1 strings.c
+	$(LCLINTR) +modobserverstrict -maintype -expect 4 strings.c
+
+structassign:
+	$(LCLINTR) structassign.c -expect 4
+
+typequals:
+	$(LCLINTR) typequals.c tq.lcl -expect 5
+	$(LCLINTR) typequals.c -expect 2
+
+ud:
+	$(LCLINTR) ud.c -expect 9
+	$(LCLINTR) ud2 -specundef -expect 3
+
+ulstypes:
+	$(LCLINTR) ulstypes.c -expect 8
+	$(LCLINTR) ulstypes.c +ignorequals 
+	$(LCLINTRN) ulstypes.c +strict -exportheader -exportheadervar -expect 28
+
+union:
+	$(LCLINTR) +memchecks union.c -expect 8
+
+unreachable:
+	$(LCLINTR) unreachable.c -expect 5
+	$(LCLINTR) -unreachable unreachable.c -expect 2
+	$(LCLINTR) switch.c -expect 4
+
+unused:
+	$(LCLINTRN) unused.c +checks -exportlocal -expect 3
+	$(LCLINTRN) unused.c +checks -exportlocal +topuse -expect 6
+
+###
+### Bugs fixed and new features since version 2.1b
+###
+
+tests2.2:
+	@cd tests2.2 ; \
+	$(LCLINTR) boolops.c -expect 1 ; \
+        $(LCLINTR) bool.lcl booldef.c -expect 1 ; \
+	$(LCLINTR) boolenum.c -booltype BOOLEAN -expect 1 ; \
+        $(LCLINTR) break.c -expect 1 ; \
+        $(LCLINTR) bstring.c -expect 2 ; \
+        $(LCLINTR) decl.c -expect 1 ; \
+        $(LCLINTR) enumbool.c -expect 2 ; \
+        $(LCLINTR) enumbool.c -booltrue "true" -boolfalse "false" ; \
+	$(LCLINTR) extension.c ; \
+	$(LCLINTR) -gnuextensions extension.c ; \
+	$(LCLINTR) modarray.c ; \
+	$(LCLINTR) nestext.c -expect 1 ; \
+	$(LCLINTR) offsetof.c ; \
+	$(LCLINTR) sizeofarray.c -expect 3 ; \
+	$(LCLINTR) rex.c -expect 1 ; \
+	$(LCLINTR) struct.c -expect 1
+
+tests2.2a:
+	@cd tests2.2a ; \
+	$(LCLINTR) erik.c -expect 1 ; \
+	$(LCLINTR) boolcomp.c -expect 5 ; \
+	$(LCLINTR) boolenum.c ; \
+	$(LCLINTR) addassign.c -expect 1; \
+	$(LCLINTR) toralf.c -expect 5 ; \
+	$(LCLINTR) fred.c -booltype Bool ; \
+	$(LCLINTR) sizeof.c ; \
+	$(LCLINTR) arrayparam.c -expect 5 ; \
+	$(LCLINTR) notreached.c ; \
+	$(LCLINTR) duff.c -casebreak -expect 1 ; \
+	$(LCLINTR) obviousloop.c -expect 4 ; \
+	$(LCLINTR) bitops.c +bitwisesigned -expect 11 ; \
+	$(LCLINTR) bitops.c -expect 5 ; \
+	$(LCLINTR) isalpha.c +strictlib -expect 1 ; \
+	$(LCLINTR) isalpha.c -expect 1 ; \
+	$(LCLINTR) dobb.c ; \
+	$(LCLINTR) popik.c -expect 11
+
+tests2.4:
+	@cd tests2.4 ; \
+	$(LCLINTR) emptycase.c ; \
+	$(LCLINTR) enumtest.c ; \
+	$(LCLINTR) duffs.c ; \
+	$(LCLINTR) bitfields.c ; \
+	$(LCLINTR) bug1.c ; \
+	$(LCLINTR) bug2.c -expect 5 ; \
+	$(LCLINTR) bug3.c ; \
+	$(LCLINTR) test0.c ; \
+	$(LCLINTR) test1.c ; \
+	$(LCLINTR) test2.c ; \
+	$(LCLINTR) hexconstants.c -expect 1 ; \
+	$(LCLINTR) +checks hexconstants.c -expect 4 ; \
+	$(LCLINTR) innercomment.c ; \
+	$(LCLINTR) nothing.c ; \
+	$(LCLINTR) offsetof.c -expect 2 ; \
+	$(LCLINTR) komazi.c ; \
+	$(LCLINTR) print.c ; \
+	$(LCLINTR) syslog.c -warnunixlib +unixlib ; \
+	$(LCLINTR) error.c -expect 1 ; \
+	$(LCLINTR) ulrich.c ; \
+	$(LCLINTR) cpptest.c '-D__P(x)=x' ; \
+	$(LCLINTR) longlong.c -expect 4; \
+	$(LCLINTR) subdir/main.c subdir/main.lcl ; \
+	$(LCLINTR) fink.c ; \
+	$(LCLINTR) driverstub.c ; \
+	$(LCLINTR) alignof.c -expect 2 ; \
+	$(LCLINTR) -D DBL_MANT_DIG=25 source.c
+
+###
+### Integration Tests
+###
+
+db1:
+	setenv LCLINT '$(LCLINTRN)'; cd db1; $(MAKE) -e test
+
+db2:
+	setenv LCLINT '$(LCLINTRN)'; cd db2; $(MAKE) -e test
+
+db3:
+	setenv LCLINT '$(LCLINTRN)'; cd db3; $(MAKE) -e test
+
+###
+### More integration tests are used locally.  If you are developing 
+### LCLint send mail to evs@larch.lcs.mit.edu to obtain extra 
+### integration test cases.
+
+clean:
+	-rm -f *~ #*# *.o *.lcs a.out 
+	-cd db1 ; $(MAKE) clean
+	-cd db2 ; $(MAKE) clean
+	-cd db3 ; $(MAKE) clean
+
+
+
diff --git a/test/abst_t.lcl b/test/abst_t.lcl
new file mode 100644
index 0000000..2c01f12
--- /dev/null
+++ b/test/abst_t.lcl
@@ -0,0 +1,3 @@
+mutable type abst1;
+mutable type abst2;
+mutable type abst3;
diff --git a/test/abst_t.lcs b/test/abst_t.lcs
new file mode 100644
index 0000000..580177b
--- /dev/null
+++ b/test/abst_t.lcs
@@ -0,0 +1,131 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort abst1 immutable nil nil
+%LCLsort _abst1_Obj mutable abst1 nil
+%LCLsort abst2 immutable nil nil
+%LCLsort _abst2_Obj mutable abst2 nil
+%LCLsort abst3 immutable nil nil
+%LCLsort _abst3_Obj mutable abst3 nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :abst1 -> int
+%LCLop sizeof :abst2 -> int
+%LCLop sizeof :abst3 -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype abst1 _abst1_Obj mutable
+%LCLtype abst2 _abst2_Obj mutable
+%LCLtype abst3 _abst3_Obj mutable
+%LCLSymbolTableEnd
diff --git a/test/abstptr.c b/test/abstptr.c
new file mode 100644
index 0000000..3b89af5
--- /dev/null
+++ b/test/abstptr.c
@@ -0,0 +1,24 @@
+typedef int *abst;
+
+/*@noaccess abst*/
+int main (void)
+{
+  abst a;
+  int b = 3;
+  abst *ap = (abst *) NULL;
+  abst *ap2 = NULL;
+  void *vp;
+  int *ip;
+
+  vp = ap ; /* 1. Assignment of abst * to void *: vp = ap */
+  ip = ap2; /* 2. Assignment of abst * to int *: ip = ap2 */
+  ap = ip ; /* 3. Assignment of int * to abst *: ap = ip */
+  vp = (void *) ap ; /* 4. Cast from underlying abstract type abst *: (void *)ap */
+  a = *ap ; /* 5. Possible dereference of null pointer: *ap */    
+  *ap = a ;
+  vp = (void *)&a ; /* 6. Cast from underlying abstract type abst *: (void *)&a */
+  ap = (abst *)&b ; /* 7. Cast to underlying abstract type abst *: (abst *)&b */
+  ap = &b; /* 8. Assignment of int * to abst *: ap = &b */
+  *ap = b; /* 9. Assignment of int to abst: *ap = b */
+  return 12;
+}
diff --git a/test/abstptr.expect b/test/abstptr.expect
new file mode 100644
index 0000000..1b1d5a3
--- /dev/null
+++ b/test/abstptr.expect
@@ -0,0 +1,25 @@
+
+abstptr.c: (in function main)
+abstptr.c:13:3: Assignment of abst * to void *: vp = ap
+abstptr.c:14:3: Assignment of abst * to int *: ip = ap2
+abstptr.c:15:3: Assignment of int * to abst *: ap = ip
+abstptr.c:16:17: Cast from underlying abstract type abst *: (void *)ap
+abstptr.c:17:8: Dereference of null pointer ap: *ap
+   abstptr.c:15:8: Storage ap becomes null
+abstptr.c:19:16: Cast from underlying abstract type abst *: (void *)&a
+abstptr.c:20:16: Cast to underlying abstract type abst *: (abst *)&b
+abstptr.c:21:3: Assignment of int * to abst *: ap = &b
+abstptr.c:22:3: Assignment of int to abst: *ap = b
+
+Finished LCLint checking --- 9 code errors found, as expected
+
+abstptr.c: (in function main)
+abstptr.c:14:3: Assignment of abst * to int *: ip = ap2
+abstptr.c:15:3: Assignment of int * to abst *: ap = ip
+abstptr.c:17:8: Dereference of null pointer ap: *ap
+   abstptr.c:15:8: Storage ap becomes null
+abstptr.c:20:16: Cast to underlying abstract type abst *: (abst *)&b
+abstptr.c:21:3: Assignment of int * to abst *: ap = &b
+abstptr.c:22:3: Assignment of int to abst: *ap = b
+
+Finished LCLint checking --- 6 code errors found, as expected
diff --git a/test/abstptr.lcl b/test/abstptr.lcl
new file mode 100644
index 0000000..9c4562b
--- /dev/null
+++ b/test/abstptr.lcl
@@ -0,0 +1 @@
+mutable type abst ;
diff --git a/test/abstptr.lcs b/test/abstptr.lcs
new file mode 100644
index 0000000..11be134
--- /dev/null
+++ b/test/abstptr.lcs
@@ -0,0 +1,123 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort abst immutable nil nil
+%LCLsort _abst_Obj mutable abst nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :abst -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype abst _abst_Obj mutable
+%LCLSymbolTableEnd
diff --git a/test/abstptr.out b/test/abstptr.out
new file mode 100644
index 0000000..1b1d5a3
--- /dev/null
+++ b/test/abstptr.out
@@ -0,0 +1,25 @@
+
+abstptr.c: (in function main)
+abstptr.c:13:3: Assignment of abst * to void *: vp = ap
+abstptr.c:14:3: Assignment of abst * to int *: ip = ap2
+abstptr.c:15:3: Assignment of int * to abst *: ap = ip
+abstptr.c:16:17: Cast from underlying abstract type abst *: (void *)ap
+abstptr.c:17:8: Dereference of null pointer ap: *ap
+   abstptr.c:15:8: Storage ap becomes null
+abstptr.c:19:16: Cast from underlying abstract type abst *: (void *)&a
+abstptr.c:20:16: Cast to underlying abstract type abst *: (abst *)&b
+abstptr.c:21:3: Assignment of int * to abst *: ap = &b
+abstptr.c:22:3: Assignment of int to abst: *ap = b
+
+Finished LCLint checking --- 9 code errors found, as expected
+
+abstptr.c: (in function main)
+abstptr.c:14:3: Assignment of abst * to int *: ip = ap2
+abstptr.c:15:3: Assignment of int * to abst *: ap = ip
+abstptr.c:17:8: Dereference of null pointer ap: *ap
+   abstptr.c:15:8: Storage ap becomes null
+abstptr.c:20:16: Cast to underlying abstract type abst *: (abst *)&b
+abstptr.c:21:3: Assignment of int * to abst *: ap = &b
+abstptr.c:22:3: Assignment of int to abst: *ap = b
+
+Finished LCLint checking --- 6 code errors found, as expected
diff --git a/test/abstract.expect b/test/abstract.expect
new file mode 100644
index 0000000..815b38b
--- /dev/null
+++ b/test/abstract.expect
@@ -0,0 +1,22 @@
+
+commentcmd.c:1:13: Mutable abstract type abst1 declared without pointer
+                      indirection: int (violates assignment semantics)
+commentcmd.c:1:20: Mutable abstract type abst2 declared without pointer
+                      indirection: int (violates assignment semantics)
+commentcmd.c:2:13: Mutable abstract type abst3 declared without pointer
+                      indirection: int (violates assignment semantics)
+commentcmd.c: (in function main)
+commentcmd.c:11:22: Cast to abstract type abst2: (abst2)i
+commentcmd.c:16:22: Cast to abstract type abst1: (abst1)i
+commentcmd.c:17:22: Cast to abstract type abst2: (abst2)i
+commentcmd.c:18:22: Cast to abstract type abst3: (abst3)i
+commentcmd.c:22:22: Cast to abstract type abst1: (abst1)i
+commentcmd.c:24:22: Cast to abstract type abst3: (abst3)i
+commentcmd.c:34:22: Cast to abstract type abst1: (abst1)i
+commentcmd.c:40:22: Cast to abstract type abst1: (abst1)i
+commentcmd.c:41:22: Cast to abstract type abst2: (abst2)i
+commentcmd.c:46:22: Cast to abstract type abst1: (abst1)i
+commentcmd.c:47:22: Cast to abstract type abst2: (abst2)i
+commentcmd.c:48:22: Cast to abstract type abst3: (abst3)i
+
+Finished LCLint checking --- 15 code errors found, as expected
diff --git a/test/abstract.out b/test/abstract.out
new file mode 100644
index 0000000..815b38b
--- /dev/null
+++ b/test/abstract.out
@@ -0,0 +1,22 @@
+
+commentcmd.c:1:13: Mutable abstract type abst1 declared without pointer
+                      indirection: int (violates assignment semantics)
+commentcmd.c:1:20: Mutable abstract type abst2 declared without pointer
+                      indirection: int (violates assignment semantics)
+commentcmd.c:2:13: Mutable abstract type abst3 declared without pointer
+                      indirection: int (violates assignment semantics)
+commentcmd.c: (in function main)
+commentcmd.c:11:22: Cast to abstract type abst2: (abst2)i
+commentcmd.c:16:22: Cast to abstract type abst1: (abst1)i
+commentcmd.c:17:22: Cast to abstract type abst2: (abst2)i
+commentcmd.c:18:22: Cast to abstract type abst3: (abst3)i
+commentcmd.c:22:22: Cast to abstract type abst1: (abst1)i
+commentcmd.c:24:22: Cast to abstract type abst3: (abst3)i
+commentcmd.c:34:22: Cast to abstract type abst1: (abst1)i
+commentcmd.c:40:22: Cast to abstract type abst1: (abst1)i
+commentcmd.c:41:22: Cast to abstract type abst2: (abst2)i
+commentcmd.c:46:22: Cast to abstract type abst1: (abst1)i
+commentcmd.c:47:22: Cast to abstract type abst2: (abst2)i
+commentcmd.c:48:22: Cast to abstract type abst3: (abst3)i
+
+Finished LCLint checking --- 15 code errors found, as expected
diff --git a/test/alias.c b/test/alias.c
new file mode 100644
index 0000000..9cdb18e
--- /dev/null
+++ b/test/alias.c
@@ -0,0 +1,58 @@
+# include "mut.h"
+
+int glob;
+int *globp;
+
+int f(int *a, int b, int **c)
+{
+  int *x, *y, *z;
+
+  x = a;   
+  *x = 3;  /* 1. modifies *a */
+  x = a;
+  y = x;
+  *y = 4;  /* 2. modifies *a */
+
+  globp = a;  /* 3. modifies *globp */
+  if (*x == 3) return 3; /* 4. returns aliasing globp */
+
+  if (*x == 4) 
+    {
+      globp = z; /* 5, 6. z use before def, modifies globp */
+      return 4; /* okay */
+    }
+  
+  *globp = 4; /* 7, 8. modifies *a, *globp */
+
+  x = globp;
+  *x = 7;     /* 9, 10. modifies *globp, *a */
+
+  x = &glob;
+  *x = 4;    /* 11. modifies glob */
+
+  x = &b;  /* okay */
+  *x = 3;  /* okay */
+  b = 3;   /* okay */
+  *x = b;  /* okay */
+  x = *c;  /* okay */
+  *x = 4;  /* 12. modifies **c */
+  a = *c;  /* okay */
+  *a = 4;  /* 13. modifies **c (but not *a) */
+  *globp = 3; /* 14, 15. modifies *globp, modifies *a */
+  return 4;   /* 16. returns with globp aliasing a */
+}
+
+int h (mut a, mut b) 
+{ 
+  mut c = mut_create();
+
+  mut_mod (a);  /* 17. modifies a */
+  a = b;
+  mut_mod (a);  /* 18. modifies b */
+  b = c; 
+  mut_mod (b);  /* okay */
+
+  return 3;     /* 19. locally allocated storage c not released */
+}
+
+
diff --git a/test/alias.expect b/test/alias.expect
new file mode 100644
index 0000000..06edf4f
--- /dev/null
+++ b/test/alias.expect
@@ -0,0 +1,125 @@
+
+Finished LCLint checking --- no code errors found
+
+alias.c: (in function f)
+alias.c:11:3: Possible undocumented modification of *a through alias *x: *x = 3
+alias.c:14:3: Possible undocumented modification of *a through alias *y: *y = 4
+alias.c:16:3: Undocumented modification of globp: globp = a
+alias.c:17:25: Function returns with global variable globp aliasing parameter a
+alias.c:21:7: Undocumented modification of globp: globp = z
+alias.c:21:15: Variable z used before definition
+alias.c:25:3: Undocumented modification of *globp: *globp = 4
+alias.c:25:3: Possible undocumented modification of *a through alias *globp:
+                 *globp = 4
+alias.c:28:3: Possible undocumented modification of *globp through alias *x:
+                 *x = 7
+alias.c:28:3: Possible undocumented modification of *a through alias *x: *x = 7
+alias.c:31:3: Possible undocumented modification of glob through alias *x:
+                 *x = 4
+alias.c:38:3: Possible undocumented modification of **c through alias *x:
+                 *x = 4
+alias.c:40:3: Possible undocumented modification of **c through alias *a:
+                 *a = 4
+alias.c:41:3: Undocumented modification of *globp: *globp = 3
+alias.c:41:3: Possible undocumented modification of *a through alias *globp:
+                 *globp = 3
+alias.c:42:12: Function returns with global variable globp aliasing parameter a
+alias.c: (in function h)
+alias.c:49:3: Undocumented modification of a possible from call to mut_mod:
+                 mut_mod(a)
+alias.c:51:3: Undocumented modification of b possible from call to mut_mod
+                 (through alias a): mut_mod(a)
+alias.c:55:12: Owned storage b not released before return
+   alias.c:52:3: Storage b becomes owned
+
+Finished LCLint checking --- 19 code errors found, as expected
+
+alias2.c: (in function f)
+alias2.c:17:3: Variable lx used before definition
+alias2.c:20:7: Possible undocumented modification of *a through alias *lx:
+                  *lx = 4
+alias2.c:29:7: Possible undocumented modification of *a through alias *x:
+                  *x = 3
+alias2.c:34:7: Possible undocumented modification of **c through alias *x:
+                  *x = 3
+alias2.c:38:3: Possible undocumented modification of *a through alias *x:
+                  *x = 4
+alias2.c:38:3: Possible undocumented modification of **c through alias *x:
+                  *x = 4
+alias2.c:41:8: Undocumented modification of **c: **c = b
+alias2.c:43:7: Possible undocumented modification of glob through alias *y:
+                  *y = 3
+alias2.c:43:7: Possible undocumented modification of *globp through alias *y:
+                  *y = 3
+alias2.c:44:7: Undocumented modification of globp: globp = a
+alias2.c:53:3: Possible undocumented modification of glob through alias *a:
+                  *a = 3
+alias2.c:53:3: Undocumented modification of *a: *a = 3
+alias2.c:54:3: Possible undocumented modification of *globp through alias *z:
+                  *z = 6
+alias2.c:54:3: Possible undocumented modification of *a through alias *z:
+                  *z = 6
+alias2.c:55:3: Undocumented modification of *globp: *globp = 5
+alias2.c:55:3: Possible undocumented modification of *a through alias *globp:
+                  *globp = 5
+alias2.c:56:12: Function returns with global variable globp aliasing parameter
+                   a
+
+Finished LCLint checking --- 17 code errors found, as expected
+
+alias3.c: (in function model)
+alias3.c:16:3: Undocumented modification of gst.a: gst.a = 3
+alias3.c:17:3: Undocumented modification of gu->a: gu->a = 5
+alias3.c: (in function f)
+alias3.c:38:3: Possible undocumented modification of ia[3] through alias *ip:
+                  *ip = 7
+alias3.c:42:3: Possible undocumented modification of ia[] through alias *ip:
+                  *ip = 8
+alias3.c:44:3: Undocumented modification of ia[6] possible from call to model:
+                  model(ia)
+alias3.c:46:3: Undocumented modification of ia[6] possible from call to model
+                  (through alias ip[6]): model(ip)
+alias3.c:49:3: Undocumented modification of *(s1.b): *(s1.b) = 7
+alias3.c:52:3: Undocumented modification of *(s1.b) possible from call to modst
+                  (through alias *(sl.b)): modst(sl)
+alias3.c:56:3: Undocumented modification of *(s1.b): *(s1.b) = 3
+alias3.c:57:3: Possible undocumented modification of *(s1.b) through alias *ip:
+                  *ip = 6
+alias3.c:58:3: Possible undocumented modification of *(s1.b) through alias
+                  *(sl.b): *(sl.b) = 3
+alias3.c:61:3: Undocumented modification of *u1 possible from call to modu
+                  (through alias *ul): modu(ul)
+alias3.c:62:3: Possible undocumented modification of u1->a through alias ul->a:
+                  ul->a = 3
+alias3.c:65:3: Possible undocumented modification of *(u1->s.b) through alias
+                  *(sl.b): *(sl.b) = 6
+
+Finished LCLint checking --- 14 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+alias4.c: (in function f)
+alias4.c:15:10: Function may return reference to parameter a through alias c: c
+alias4.c:15:10: Function may return reference to parameter b through alias c: c
+alias4.c: (in function h)
+alias4.c:26:12: Function returns reference to global glob: &glob
+alias4.c:28:12: Function returns reference to global globp: globp
+alias4.c:30:12: Function returns reference to global globs: (globs.field)
+alias4.c:32:12: Function returns reference to global globs: (&(globs.val))
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+alias5.c: (in function incx1)
+alias5.c:13:3: Possible undocumented modification of p->x through alias p2->x:
+                  p2->x++
+alias5.c: (in function incx2)
+alias5.c:22:2: Fresh storage p2 not released before return
+   alias5.c:20:3: Fresh storage p2 allocated
+alias5.c: (in function incx3)
+alias5.c:27:3: Only storage p2->x not released before assignment: p2->x = p->x
+alias5.c:28:3: Possible undocumented modification of *(p->x) through alias
+                  *(p2->x): *(p2->x) = 3
+alias5.c:30:2: Storage p->x reachable from parameter is kept (should be only)
+   alias5.c:27:3: Storage p->x becomes kept
+
+Finished LCLint checking --- 5 code errors found, as expected
diff --git a/test/alias.lcl b/test/alias.lcl
new file mode 100644
index 0000000..2be8bad
--- /dev/null
+++ b/test/alias.lcl
@@ -0,0 +1,8 @@
+imports mut;
+
+int glob;
+int *globp;
+
+int f (int *a, int b, int **c) int glob; int *globp; { }
+
+int h (mut a, mut b) { }
diff --git a/test/alias.lcs b/test/alias.lcs
new file mode 100644
index 0000000..a740245
--- /dev/null
+++ b/test/alias.lcs
@@ -0,0 +1,165 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort mut immutable nil nil
+%LCLsort _mut_Obj mutable mut nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort ___int_Obj_Ptr_Obj obj __int_Obj_Ptr nil
+%LCLsort ____int_Obj_Ptr_Obj_Ptr ptr ___int_Obj_Ptr_Obj nil
+%LCLsort ____int_Obj_Ptr_Obj_Arr arr ___int_Obj_Ptr_Obj nil
+%LCLsort ___int_Obj_Ptr_Vec vec __int_Obj_Ptr ____int_Obj_Ptr_Obj_Arr
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____int_Obj_Ptr_Obj_Ptr -> ____int_Obj_Ptr_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___int_Obj_Ptr_Vec, int -> __int_Obj_Ptr
+%LCLop __ [__] :____int_Obj_Ptr_Obj_Arr, int -> ___int_Obj_Ptr_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____int_Obj_Ptr_Obj_Ptr, int -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____int_Obj_Ptr_Obj_Ptr -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____int_Obj_Ptr_Obj_Ptr, int -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____int_Obj_Ptr_Obj_Ptr, ____int_Obj_Ptr_Obj_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :mut -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___int_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____int_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype mut _mut_Obj mutable
+%LCLfcn mut_create :  -> _mut_Obj 
+%LCLfcnGlobals 
+%LCLfcn mut_mod : _mut_Obj -> void 
+%LCLfcnGlobals 
+%LCLvar glob _int_Obj
+%LCLvar globp ___int_Obj_Ptr_Obj
+%LCLfcn f : __int_Obj_Ptr, int, ____int_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals _int_Obj glob; ___int_Obj_Ptr_Obj globp; 
+%LCLfcn h : _mut_Obj, _mut_Obj -> int 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/alias.out b/test/alias.out
new file mode 100644
index 0000000..06edf4f
--- /dev/null
+++ b/test/alias.out
@@ -0,0 +1,125 @@
+
+Finished LCLint checking --- no code errors found
+
+alias.c: (in function f)
+alias.c:11:3: Possible undocumented modification of *a through alias *x: *x = 3
+alias.c:14:3: Possible undocumented modification of *a through alias *y: *y = 4
+alias.c:16:3: Undocumented modification of globp: globp = a
+alias.c:17:25: Function returns with global variable globp aliasing parameter a
+alias.c:21:7: Undocumented modification of globp: globp = z
+alias.c:21:15: Variable z used before definition
+alias.c:25:3: Undocumented modification of *globp: *globp = 4
+alias.c:25:3: Possible undocumented modification of *a through alias *globp:
+                 *globp = 4
+alias.c:28:3: Possible undocumented modification of *globp through alias *x:
+                 *x = 7
+alias.c:28:3: Possible undocumented modification of *a through alias *x: *x = 7
+alias.c:31:3: Possible undocumented modification of glob through alias *x:
+                 *x = 4
+alias.c:38:3: Possible undocumented modification of **c through alias *x:
+                 *x = 4
+alias.c:40:3: Possible undocumented modification of **c through alias *a:
+                 *a = 4
+alias.c:41:3: Undocumented modification of *globp: *globp = 3
+alias.c:41:3: Possible undocumented modification of *a through alias *globp:
+                 *globp = 3
+alias.c:42:12: Function returns with global variable globp aliasing parameter a
+alias.c: (in function h)
+alias.c:49:3: Undocumented modification of a possible from call to mut_mod:
+                 mut_mod(a)
+alias.c:51:3: Undocumented modification of b possible from call to mut_mod
+                 (through alias a): mut_mod(a)
+alias.c:55:12: Owned storage b not released before return
+   alias.c:52:3: Storage b becomes owned
+
+Finished LCLint checking --- 19 code errors found, as expected
+
+alias2.c: (in function f)
+alias2.c:17:3: Variable lx used before definition
+alias2.c:20:7: Possible undocumented modification of *a through alias *lx:
+                  *lx = 4
+alias2.c:29:7: Possible undocumented modification of *a through alias *x:
+                  *x = 3
+alias2.c:34:7: Possible undocumented modification of **c through alias *x:
+                  *x = 3
+alias2.c:38:3: Possible undocumented modification of *a through alias *x:
+                  *x = 4
+alias2.c:38:3: Possible undocumented modification of **c through alias *x:
+                  *x = 4
+alias2.c:41:8: Undocumented modification of **c: **c = b
+alias2.c:43:7: Possible undocumented modification of glob through alias *y:
+                  *y = 3
+alias2.c:43:7: Possible undocumented modification of *globp through alias *y:
+                  *y = 3
+alias2.c:44:7: Undocumented modification of globp: globp = a
+alias2.c:53:3: Possible undocumented modification of glob through alias *a:
+                  *a = 3
+alias2.c:53:3: Undocumented modification of *a: *a = 3
+alias2.c:54:3: Possible undocumented modification of *globp through alias *z:
+                  *z = 6
+alias2.c:54:3: Possible undocumented modification of *a through alias *z:
+                  *z = 6
+alias2.c:55:3: Undocumented modification of *globp: *globp = 5
+alias2.c:55:3: Possible undocumented modification of *a through alias *globp:
+                  *globp = 5
+alias2.c:56:12: Function returns with global variable globp aliasing parameter
+                   a
+
+Finished LCLint checking --- 17 code errors found, as expected
+
+alias3.c: (in function model)
+alias3.c:16:3: Undocumented modification of gst.a: gst.a = 3
+alias3.c:17:3: Undocumented modification of gu->a: gu->a = 5
+alias3.c: (in function f)
+alias3.c:38:3: Possible undocumented modification of ia[3] through alias *ip:
+                  *ip = 7
+alias3.c:42:3: Possible undocumented modification of ia[] through alias *ip:
+                  *ip = 8
+alias3.c:44:3: Undocumented modification of ia[6] possible from call to model:
+                  model(ia)
+alias3.c:46:3: Undocumented modification of ia[6] possible from call to model
+                  (through alias ip[6]): model(ip)
+alias3.c:49:3: Undocumented modification of *(s1.b): *(s1.b) = 7
+alias3.c:52:3: Undocumented modification of *(s1.b) possible from call to modst
+                  (through alias *(sl.b)): modst(sl)
+alias3.c:56:3: Undocumented modification of *(s1.b): *(s1.b) = 3
+alias3.c:57:3: Possible undocumented modification of *(s1.b) through alias *ip:
+                  *ip = 6
+alias3.c:58:3: Possible undocumented modification of *(s1.b) through alias
+                  *(sl.b): *(sl.b) = 3
+alias3.c:61:3: Undocumented modification of *u1 possible from call to modu
+                  (through alias *ul): modu(ul)
+alias3.c:62:3: Possible undocumented modification of u1->a through alias ul->a:
+                  ul->a = 3
+alias3.c:65:3: Possible undocumented modification of *(u1->s.b) through alias
+                  *(sl.b): *(sl.b) = 6
+
+Finished LCLint checking --- 14 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+alias4.c: (in function f)
+alias4.c:15:10: Function may return reference to parameter a through alias c: c
+alias4.c:15:10: Function may return reference to parameter b through alias c: c
+alias4.c: (in function h)
+alias4.c:26:12: Function returns reference to global glob: &glob
+alias4.c:28:12: Function returns reference to global globp: globp
+alias4.c:30:12: Function returns reference to global globs: (globs.field)
+alias4.c:32:12: Function returns reference to global globs: (&(globs.val))
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+alias5.c: (in function incx1)
+alias5.c:13:3: Possible undocumented modification of p->x through alias p2->x:
+                  p2->x++
+alias5.c: (in function incx2)
+alias5.c:22:2: Fresh storage p2 not released before return
+   alias5.c:20:3: Fresh storage p2 allocated
+alias5.c: (in function incx3)
+alias5.c:27:3: Only storage p2->x not released before assignment: p2->x = p->x
+alias5.c:28:3: Possible undocumented modification of *(p->x) through alias
+                  *(p2->x): *(p2->x) = 3
+alias5.c:30:2: Storage p->x reachable from parameter is kept (should be only)
+   alias5.c:27:3: Storage p->x becomes kept
+
+Finished LCLint checking --- 5 code errors found, as expected
diff --git a/test/alias2.c b/test/alias2.c
new file mode 100644
index 0000000..bfdf6ee
--- /dev/null
+++ b/test/alias2.c
@@ -0,0 +1,64 @@
+int glob;
+int *globp;
+
+int f(int *a, int b, int **c)
+{
+  int *x, *y, *z;
+
+  {
+    {
+      int *lx;
+
+      x = a;
+      lx = a;
+      {
+	/*@-shadow@*/ int *lx; /*@=shadow@*/
+	
+	*lx = 3; /* 1. use before def */
+	y = *c;
+      }
+      *lx = 4; /* 2. modifies a */
+    }
+    x = y; /* x aliases *c */
+    x = *c;
+  }
+
+  if (b == *a)
+    {
+      x = a;   /* okay - x alias a */
+      *x = 3;  /* 3. modifies *a */
+      y = &glob;
+    }
+  else
+    {
+      *x = 3; /* 4. modifies **c */
+      y = globp;
+    }
+
+  *x = 4; /* 5, 6. bad - may modify *a or **c */
+  z = a;
+
+  if ((**c = b) == 3) /* 7. modifies **c */
+    {
+      *y = 3;    /* 8, 9. may modify glob and *globp */
+      globp = a; /* 10. modifies globp */
+      a = y; 
+      z = globp;
+    }
+  else
+    {
+      a = z;
+    }
+
+  *a = 3;     /* 11, 12. modifies glob, *globp through y and z */
+  *z = 6;     /* 13, 14. modifies *a, *globp */
+  *globp = 5; /* 15, 16. modifies *globp, *a */
+  return 3;   /* 17. leaves globp aliasing a */
+}
+
+
+
+
+
+
+
diff --git a/test/alias2.lcl b/test/alias2.lcl
new file mode 100644
index 0000000..74057f7
--- /dev/null
+++ b/test/alias2.lcl
@@ -0,0 +1,5 @@
+int glob;
+int *globp;
+
+int f (int *a, int b, int **c) int glob; int *globp; { }
+
diff --git a/test/alias2.lcs b/test/alias2.lcs
new file mode 100644
index 0000000..5338dd6
--- /dev/null
+++ b/test/alias2.lcs
@@ -0,0 +1,154 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort mut immutable nil nil
+%LCLsort _mut_Obj mutable mut nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort ___int_Obj_Ptr_Obj obj __int_Obj_Ptr nil
+%LCLsort ____int_Obj_Ptr_Obj_Ptr ptr ___int_Obj_Ptr_Obj nil
+%LCLsort ____int_Obj_Ptr_Obj_Arr arr ___int_Obj_Ptr_Obj nil
+%LCLsort ___int_Obj_Ptr_Vec vec __int_Obj_Ptr ____int_Obj_Ptr_Obj_Arr
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____int_Obj_Ptr_Obj_Ptr -> ____int_Obj_Ptr_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___int_Obj_Ptr_Vec, int -> __int_Obj_Ptr
+%LCLop __ [__] :____int_Obj_Ptr_Obj_Arr, int -> ___int_Obj_Ptr_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____int_Obj_Ptr_Obj_Ptr, int -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____int_Obj_Ptr_Obj_Ptr -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____int_Obj_Ptr_Obj_Ptr, int -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____int_Obj_Ptr_Obj_Ptr, ____int_Obj_Ptr_Obj_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :mut -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___int_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____int_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLvar glob _int_Obj
+%LCLvar globp ___int_Obj_Ptr_Obj
+%LCLfcn f : __int_Obj_Ptr, int, ____int_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals _int_Obj glob; ___int_Obj_Ptr_Obj globp; 
+%LCLSymbolTableEnd
diff --git a/test/alias3.c b/test/alias3.c
new file mode 100644
index 0000000..cee156e
--- /dev/null
+++ b/test/alias3.c
@@ -0,0 +1,67 @@
+/*
+** tests aliasing of arrays, structs and unions
+*/
+
+# include "alias3.lh"
+
+st gst;
+ut *gu;
+
+void model (int ia[])
+{
+  int *ip;
+
+  ip = &(ia[6]);
+  *ip = 3;
+  gst.a = 3; /* 1. Suspect modification of gst.a */
+  gu->a = 5; /* 2. Suspect modification of gu->a */
+}
+
+void modst (st s1)
+{
+  s1.a = 3;
+  *(s1.b) = 6;
+}
+
+void modu (ut *u)
+{
+  u->a = 5;
+}
+
+int f (int ia[], st s1, ut *u1)
+{
+  int *ip;
+  st   sl;
+  ut   *ul;
+
+  ip = &(ia[3]);
+  *ip = 7; /* modifies ia[3] */
+
+  ip = &(ia[*ip]);
+
+  *ip = 8; /* modifies ia[?] */
+
+  model(ia); /* modifies ia[6] */
+  ip = ia;
+  model(ip); /* modifies ia[6] */
+
+  s1.a = 3;    /* okay */
+  *(s1.b) = 7; /* modifies *(s1.b) */
+  
+  sl = s1;     /* okay (sl is NOT an alias for s1) */
+  modst(sl);   /* was: does not modify anything --- structure is passed by value */
+               /* NOT TRUE: does modify sl since *s1.b is the same reference */
+  sl.a = 3;    /* okay */
+  ip = s1.b;   /* okay, ip aliases s1.b */
+  *(s1.b) = 3; /* modifies s1.b */
+  *ip = 6;     /* modifies s1.b */
+  *(sl.b) = 3; /* okay */
+
+  ul = u1;     /* ul aliases u1 */
+  modu(ul);    /* okay */
+  ul->a = 3;   /* modifies u1->a */
+  sl = ul->s;  /* okay */
+  sl.a = 3;    /* okay */
+  *(sl.b) = 6; /* modifies *(u1->s.b) through alias */
+  return 5;
+}
diff --git a/test/alias3.lcl b/test/alias3.lcl
new file mode 100644
index 0000000..92f1b27
--- /dev/null
+++ b/test/alias3.lcl
@@ -0,0 +1,13 @@
+typedef struct { int a; int *b; } st;
+typedef union  { int a; st s; st *t; int **c; } ut;
+
+st gst;
+ut *gu;
+
+int f (int ia[], st s1, ut *u1) st gst; ut *gu; { } 
+
+void model (int ia[]) st gst; ut *gu; { modifies ia[6]; }
+
+void modst (st s1) { modifies *s1.b; }
+
+void modu (ut *u)  { modifies *u; }
\ No newline at end of file
diff --git a/test/alias3.lcs b/test/alias3.lcs
new file mode 100644
index 0000000..fe74934
--- /dev/null
+++ b/test/alias3.lcs
@@ -0,0 +1,226 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _salias30s_Struct str salias30s nil
+%LCLsort b strMem ___int_Obj_Ptr_Obj nil
+%LCLsort a strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort ___int_Obj_Ptr_Obj obj __int_Obj_Ptr nil
+%LCLsort _salias30s_Struct_Tuple tup _salias30s_Struct nil
+%LCLsort __salias30s_Struct_Ptr ptr _salias30s_Struct nil
+%LCLsort __salias30s_Struct_Arr arr _salias30s_Struct nil
+%LCLsort __salias30s_Struct_Tuple_Vec vec _salias30s_Struct_Tuple __salias30s_Struct_Arr
+%LCLsort _st synonym _salias30s_Struct nil
+%LCLsort _ualias30u_Union union ualias30u nil
+%LCLsort c unionMem _____int_Obj_Ptr_Obj_Ptr_Obj nil
+%LCLsort t unionMem ___salias30s_Struct_Ptr_Obj nil
+%LCLsort s unionMem _salias30s_Struct nil
+%LCLsort a unionMem _int_Obj nil
+%LCLsort unionEnd nil nil nil
+%LCLsort ___salias30s_Struct_Ptr_Obj obj __salias30s_Struct_Ptr nil
+%LCLsort ____int_Obj_Ptr_Obj_Ptr ptr ___int_Obj_Ptr_Obj nil
+%LCLsort ____int_Obj_Ptr_Obj_Arr arr ___int_Obj_Ptr_Obj nil
+%LCLsort ___int_Obj_Ptr_Vec vec __int_Obj_Ptr ____int_Obj_Ptr_Obj_Arr
+%LCLsort _____int_Obj_Ptr_Obj_Ptr_Obj obj ____int_Obj_Ptr_Obj_Ptr nil
+%LCLsort _ualias30u_Union_UnionVal unionval _ualias30u_Union nil
+%LCLsort __ualias30u_Union_Ptr ptr _ualias30u_Union nil
+%LCLsort __ualias30u_Union_Arr arr _ualias30u_Union nil
+%LCLsort __ualias30u_Union_UnionVal_Vec vec _ualias30u_Union_UnionVal __ualias30u_Union_Arr
+%LCLsort _ut synonym _ualias30u_Union nil
+%LCLsort ___ualias30u_Union_Ptr_Obj obj __ualias30u_Union_Ptr nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 6 : -> double
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ \select a :_salias30s_Struct_Tuple -> int
+%LCLop __ \select a :_salias30s_Struct -> _int_Obj
+%LCLop __ \select a :_ualias30u_Union_UnionVal -> int
+%LCLop __ \select a :_ualias30u_Union -> _int_Obj
+%LCLop [__, __] :__int_Obj_Ptr, int -> _salias30s_Struct_Tuple
+%LCLop __ \select b :_salias30s_Struct_Tuple -> __int_Obj_Ptr
+%LCLop __ \select b :_salias30s_Struct -> ___int_Obj_Ptr_Obj
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :__salias30s_Struct_Ptr -> __salias30s_Struct_Arr
+%LCLop __ [] :____int_Obj_Ptr_Obj_Ptr -> ____int_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__ualias30u_Union_Ptr -> __ualias30u_Union_Arr
+%LCLop __ \field_arrow a :__salias30s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow a :__ualias30u_Union_Ptr -> int
+%LCLop __ \field_arrow a :__ualias30u_Union_Ptr -> _int_Obj
+%LCLop __ \field_arrow b :__salias30s_Struct_Ptr -> ___int_Obj_Ptr_Obj
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :__salias30s_Struct_Tuple_Vec, int -> _salias30s_Struct_Tuple
+%LCLop __ [__] :__salias30s_Struct_Arr, int -> _salias30s_Struct
+%LCLop __ [__] :___int_Obj_Ptr_Vec, int -> __int_Obj_Ptr
+%LCLop __ [__] :____int_Obj_Ptr_Obj_Arr, int -> ___int_Obj_Ptr_Obj
+%LCLop __ [__] :__ualias30u_Union_UnionVal_Vec, int -> _ualias30u_Union_UnionVal
+%LCLop __ [__] :__ualias30u_Union_Arr, int -> _ualias30u_Union
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop __ \select s :_ualias30u_Union_UnionVal -> _salias30s_Struct_Tuple
+%LCLop __ \select s :_ualias30u_Union -> _salias30s_Struct
+%LCLop __ \select t :_ualias30u_Union_UnionVal -> __salias30s_Struct_Ptr
+%LCLop __ \select t :_ualias30u_Union -> ___salias30s_Struct_Ptr_Obj
+%LCLop __ \field_arrow s :__ualias30u_Union_Ptr -> _salias30s_Struct_Tuple
+%LCLop __ \field_arrow s :__ualias30u_Union_Ptr -> _salias30s_Struct
+%LCLop __ \select c :_ualias30u_Union_UnionVal -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop __ \select c :_ualias30u_Union -> _____int_Obj_Ptr_Obj_Ptr_Obj
+%LCLop __ \field_arrow t :__ualias30u_Union_Ptr -> __salias30s_Struct_Ptr
+%LCLop __ \field_arrow t :__ualias30u_Union_Ptr -> ___salias30s_Struct_Ptr_Obj
+%LCLop __ \field_arrow c :__ualias30u_Union_Ptr -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop __ \field_arrow c :__ualias30u_Union_Ptr -> _____int_Obj_Ptr_Obj_Ptr_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> __salias30s_Struct_Ptr
+%LCLop NIL : -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __ualias30u_Union_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :__salias30s_Struct_Ptr, int -> __salias30s_Struct_Ptr
+%LCLop __ + __  :int, __salias30s_Struct_Ptr -> __salias30s_Struct_Ptr
+%LCLop __ + __  :____int_Obj_Ptr_Obj_Ptr, int -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____int_Obj_Ptr_Obj_Ptr -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__ualias30u_Union_Ptr, int -> __ualias30u_Union_Ptr
+%LCLop __ + __  :int, __ualias30u_Union_Ptr -> __ualias30u_Union_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :__salias30s_Struct_Ptr, int -> __salias30s_Struct_Ptr
+%LCLop __ - __  :__salias30s_Struct_Ptr, __salias30s_Struct_Ptr -> int
+%LCLop __ - __  :____int_Obj_Ptr_Obj_Ptr, int -> ____int_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____int_Obj_Ptr_Obj_Ptr, ____int_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__ualias30u_Union_Ptr, int -> __ualias30u_Union_Ptr
+%LCLop __ - __  :__ualias30u_Union_Ptr, __ualias30u_Union_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :__salias30s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__salias30s_Struct_Arr, int -> bool
+%LCLop isSub :___int_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____int_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__ualias30u_Union_UnionVal_Vec, int -> bool
+%LCLop isSub :__ualias30u_Union_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype st _st exposed
+%LCLtype ut _ut exposed
+%LCLvar gst _salias30s_Struct
+%LCLvar gu ___ualias30u_Union_Ptr_Obj
+%LCLfcn f : __int_Obj_Arr, _salias30s_Struct_Tuple, __ualias30u_Union_Ptr -> int 
+%LCLfcnGlobals _salias30s_Struct gst; ___ualias30u_Union_Ptr_Obj gu; 
+%LCLfcn model : __int_Obj_Arr -> void 
+%LCLfcnGlobals _salias30s_Struct gst; ___ualias30u_Union_Ptr_Obj gu; 
+%LCLfcn modst : _salias30s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn modu : __ualias30u_Union_Ptr -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/alias3.lh b/test/alias3.lh
new file mode 100644
index 0000000..65fd491
--- /dev/null
+++ b/test/alias3.lh
@@ -0,0 +1,27 @@
+/* Output from LCLint 2.5m */
+# include "bool.h"
+
+
+# ifndef EXPOSED_TYPE_st
+typedef struct {
+    int a;
+    int *b;
+    } st;
+# endif
+
+
+# ifndef EXPOSED_TYPE_ut
+typedef union {
+    int a;
+    st s;
+    st *t;
+    int **c;
+    } ut;
+# endif
+
+extern st  gst;
+extern ut  *gu;
+extern int f (int  /* ia */[], st  /* s1 */, ut * /* u1 */);
+extern void model (int  /* ia */[]);
+extern void modst (st  /* s1 */);
+extern void modu (ut * /* u */);
diff --git a/test/alias4.c b/test/alias4.c
new file mode 100644
index 0000000..efcb462
--- /dev/null
+++ b/test/alias4.c
@@ -0,0 +1,34 @@
+# include "alias4.lh"
+
+mut f(mut a, mut b)
+{
+  mut c;
+
+  if (1 == 3)
+    {
+      c = a;
+    }
+  else
+    {
+      c = b;
+    }
+  return c;  /* 2 * bad: may reference parameter a, b */
+}
+
+int g (void)
+{
+  return glob;
+}
+
+int *h (void)
+{
+  if (1 > 3)
+    return &glob; /* returns ref to global glob */
+  else if (2 > 3)
+    return globp; /* return reference to global globp */
+  else if (3 > 3)
+    return (globs.field); /* returns reference to globs */
+  else 
+    return (&(globs.val)); /* returns reference to globs */
+}
+
diff --git a/test/alias4.lcl b/test/alias4.lcl
new file mode 100644
index 0000000..242c7b3
--- /dev/null
+++ b/test/alias4.lcl
@@ -0,0 +1,11 @@
+imports mut;
+
+int glob;
+int *globp;
+struct { int val; int *field; } globs;
+
+mut f(mut a, mut b) { }
+
+int g (void) int glob; { }
+
+int *h (void) int glob; struct { int val; int *field; } globs; int *globp; { }
\ No newline at end of file
diff --git a/test/alias4.lcs b/test/alias4.lcs
new file mode 100644
index 0000000..17c2cce
--- /dev/null
+++ b/test/alias4.lcs
@@ -0,0 +1,205 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort mut immutable nil nil
+%LCLsort _mut_Obj mutable mut nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort ___int_Obj_Ptr_Obj obj __int_Obj_Ptr nil
+%LCLsort _salias40s_Struct str salias40s nil
+%LCLsort field strMem ___int_Obj_Ptr_Obj nil
+%LCLsort val strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _salias40s_Struct_Tuple tup _salias40s_Struct nil
+%LCLsort __salias40s_Struct_Ptr ptr _salias40s_Struct nil
+%LCLsort __salias40s_Struct_Arr arr _salias40s_Struct nil
+%LCLsort __salias40s_Struct_Tuple_Vec vec _salias40s_Struct_Tuple __salias40s_Struct_Arr
+%LCLsort _salias41s_Struct str salias41s nil
+%LCLsort field strMem ___int_Obj_Ptr_Obj nil
+%LCLsort val strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _salias41s_Struct_Tuple tup _salias41s_Struct nil
+%LCLsort __salias41s_Struct_Ptr ptr _salias41s_Struct nil
+%LCLsort __salias41s_Struct_Arr arr _salias41s_Struct nil
+%LCLsort __salias41s_Struct_Tuple_Vec vec _salias41s_Struct_Tuple __salias41s_Struct_Arr
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop [__, __] :__int_Obj_Ptr, int -> _salias40s_Struct_Tuple
+%LCLop [__, __] :__int_Obj_Ptr, int -> _salias41s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :__salias40s_Struct_Ptr -> __salias40s_Struct_Arr
+%LCLop __ [] :__salias41s_Struct_Ptr -> __salias41s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :__salias40s_Struct_Tuple_Vec, int -> _salias40s_Struct_Tuple
+%LCLop __ [__] :__salias40s_Struct_Arr, int -> _salias40s_Struct
+%LCLop __ [__] :__salias41s_Struct_Tuple_Vec, int -> _salias41s_Struct_Tuple
+%LCLop __ [__] :__salias41s_Struct_Arr, int -> _salias41s_Struct
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop __ \select val :_salias40s_Struct_Tuple -> int
+%LCLop __ \select val :_salias40s_Struct -> _int_Obj
+%LCLop __ \select val :_salias41s_Struct_Tuple -> int
+%LCLop __ \select val :_salias41s_Struct -> _int_Obj
+%LCLop __ \select field :_salias40s_Struct_Tuple -> __int_Obj_Ptr
+%LCLop __ \select field :_salias40s_Struct -> ___int_Obj_Ptr_Obj
+%LCLop __ \select field :_salias41s_Struct_Tuple -> __int_Obj_Ptr
+%LCLop __ \select field :_salias41s_Struct -> ___int_Obj_Ptr_Obj
+%LCLop __ \field_arrow val :__salias40s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow val :__salias41s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow field :__salias40s_Struct_Ptr -> ___int_Obj_Ptr_Obj
+%LCLop __ \field_arrow field :__salias41s_Struct_Ptr -> ___int_Obj_Ptr_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> __salias40s_Struct_Ptr
+%LCLop NIL : -> __salias41s_Struct_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :__salias40s_Struct_Ptr, int -> __salias40s_Struct_Ptr
+%LCLop __ + __  :int, __salias40s_Struct_Ptr -> __salias40s_Struct_Ptr
+%LCLop __ + __  :__salias41s_Struct_Ptr, int -> __salias41s_Struct_Ptr
+%LCLop __ + __  :int, __salias41s_Struct_Ptr -> __salias41s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :__salias40s_Struct_Ptr, int -> __salias40s_Struct_Ptr
+%LCLop __ - __  :__salias40s_Struct_Ptr, __salias40s_Struct_Ptr -> int
+%LCLop __ - __  :__salias41s_Struct_Ptr, int -> __salias41s_Struct_Ptr
+%LCLop __ - __  :__salias41s_Struct_Ptr, __salias41s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :mut -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :__salias40s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__salias40s_Struct_Arr, int -> bool
+%LCLop isSub :__salias41s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__salias41s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype mut _mut_Obj mutable
+%LCLfcn mut_create :  -> _mut_Obj 
+%LCLfcnGlobals 
+%LCLfcn mut_mod : _mut_Obj -> void 
+%LCLfcnGlobals 
+%LCLvar glob _int_Obj
+%LCLvar globp ___int_Obj_Ptr_Obj
+%LCLvar globs _salias40s_Struct
+%LCLfcn f : _mut_Obj, _mut_Obj -> _mut_Obj 
+%LCLfcnGlobals 
+%LCLfcn g :  -> int 
+%LCLfcnGlobals _int_Obj glob; 
+%LCLfcn h :  -> __int_Obj_Ptr 
+%LCLfcnGlobals _int_Obj glob; _salias41s_Struct globs; ___int_Obj_Ptr_Obj globp; 
+%LCLSymbolTableEnd
diff --git a/test/alias4.lh b/test/alias4.lh
new file mode 100644
index 0000000..2431208
--- /dev/null
+++ b/test/alias4.lh
@@ -0,0 +1,14 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "mut.h"
+
+extern int  glob;
+extern int  *globp;
+extern struct {
+    int val;
+    int *field;
+    }  globs;
+extern mut f (mut  /* a */, mut  /* b */);
+extern int g (void);
+extern int *h (void);
diff --git a/test/alias5.c b/test/alias5.c
new file mode 100644
index 0000000..66df0a2
--- /dev/null
+++ b/test/alias5.c
@@ -0,0 +1,33 @@
+typedef struct 
+{
+  /*@only@*/ int *x;
+  /*@only@*/ int *y;
+} *pair;  
+
+# include "alias5.lh"
+
+void incx1 (pair p)
+{
+  pair p2 = p;
+
+  p2->x++; /* 1. Suspect modification of p->x through alias p2->x: p2->x++ */
+}
+
+void incx2 (pair p)
+{
+  pair p2 = p;
+
+  p2 = pair_create ();
+  p2->x++;
+} /* 2. Fresh storage p2 not released before return */
+
+void incx3 (pair p)
+{
+  pair p2 = pair_create ();
+  p2->x = p->x; /* 3. Only storage p2->x not released before assignment: p2->x = p->x */
+  *(p2->x) = 3; /* 4. Suspect modification of *(p->x) through alias *(p2->x): */
+  pair_free (p2);
+} /* 5. Storage p->x reachable from parameter is kept (should be only) */ 
+
+
+
diff --git a/test/alias5.lcl b/test/alias5.lcl
new file mode 100644
index 0000000..57cfb3f
--- /dev/null
+++ b/test/alias5.lcl
@@ -0,0 +1,9 @@
+mutable type pair;
+
+void incx1 (pair p) { }
+void incx2 (pair p) { }
+void incx3 (pair p) { }
+void incx4 (pair p) { }
+
+only pair pair_create (void) { }
+void pair_free (out only pair p) { modifies p; }
diff --git a/test/alias5.lcs b/test/alias5.lcs
new file mode 100644
index 0000000..a85e4fe
--- /dev/null
+++ b/test/alias5.lcs
@@ -0,0 +1,135 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort pair immutable nil nil
+%LCLsort _pair_Obj mutable pair nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :pair -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype pair _pair_Obj mutable
+%LCLfcn incx1 : _pair_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn incx2 : _pair_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn incx3 : _pair_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn incx4 : _pair_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn pair_create :  -> _pair_Obj 
+%LCLfcnGlobals 
+%LCLfcn pair_free : _pair_Obj -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/alias5.lh b/test/alias5.lh
new file mode 100644
index 0000000..4a08849
--- /dev/null
+++ b/test/alias5.lh
@@ -0,0 +1,10 @@
+/* Output from LCLint 2.5m */
+# include "bool.h"
+
+
+extern void incx1 (pair  /* p */);
+extern void incx2 (pair  /* p */);
+extern void incx3 (pair  /* p */);
+extern void incx4 (pair  /* p */);
+extern /*@only@*/ pair pair_create (void);
+extern void pair_free (/*@only@*/ /*@out@*/ pair  /* p */);
diff --git a/test/alttypes.c b/test/alttypes.c
new file mode 100644
index 0000000..20708e3
--- /dev/null
+++ b/test/alttypes.c
@@ -0,0 +1,25 @@
+# include "bool.h"
+
+int /*@alt void@*/ f (void) ;
+
+int f (void)
+{
+  return 3;
+}
+
+int g (void)
+{
+  f ();
+
+  return 4;
+}
+
+int /*@alt void@*/ f2 (void) ;
+
+int /*@alt bool@*/ f2 (void) 
+{
+  return 3;
+}
+
+extern int /*@alt char, bool@*/ x;
+int /*@alt char@*/ x;
diff --git a/test/alttypes.expect b/test/alttypes.expect
new file mode 100644
index 0000000..b1c269f
--- /dev/null
+++ b/test/alttypes.expect
@@ -0,0 +1,11 @@
+
+alttypes.c:19:20: Function f2 inconsistently redeclared to return alternate
+    types int | bool (types match, but alternates are not identical, so
+    checking may not be correct)
+   alttypes.c:17:20: Previous declaration of f2: int | void
+alttypes.c:25:20: Variable x inconsistently redeclared with alternate types int
+    | char (types match, but alternates are not identical, so checking may not
+    be correct)
+   alttypes.c:24:33: Previous declaration of x: int | char | bool
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/alttypes.out b/test/alttypes.out
new file mode 100644
index 0000000..b1c269f
--- /dev/null
+++ b/test/alttypes.out
@@ -0,0 +1,11 @@
+
+alttypes.c:19:20: Function f2 inconsistently redeclared to return alternate
+    types int | bool (types match, but alternates are not identical, so
+    checking may not be correct)
+   alttypes.c:17:20: Previous declaration of f2: int | void
+alttypes.c:25:20: Variable x inconsistently redeclared with alternate types int
+    | char (types match, but alternates are not identical, so checking may not
+    be correct)
+   alttypes.c:24:33: Previous declaration of x: int | char | bool
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/ansireserved.c b/test/ansireserved.c
new file mode 100644
index 0000000..de4a15e
--- /dev/null
+++ b/test/ansireserved.c
@@ -0,0 +1,20 @@
+int decimal_point;
+int srand;
+int labs;
+int _x;
+int atan2f (void);
+
+typedef int wcst;
+
+# define EVANS 72
+
+int isaFish (void)
+{
+  /*@unused@*/ int powl;
+  /*@unused@*/ float mem; /* okay */
+  /*@unused@*/ float memory;
+  /*@unused@*/ int wctomb;
+
+  return 3;
+}
+  
diff --git a/test/ansireserved.expect b/test/ansireserved.expect
new file mode 100644
index 0000000..ed0d59a
--- /dev/null
+++ b/test/ansireserved.expect
@@ -0,0 +1,73 @@
+
+ansireserved.c:9: Name EVANS is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+ansireserved.c:1:5: Name decimal_point is reserved for the standard library
+ansireserved.c:2:5: Name srand is reserved for the standard library
+ansireserved.c:3:5: Name labs is reserved for the standard library
+ansireserved.c:4:5: Name _x is in the implementation name space (any identifier
+                       beginning with underscore)
+ansireserved.c:5:5: Name atan2f is reserved for future ANSI library extensions.
+     The names of all existing functions in  suffixed with 'f' or 'l'
+    may be added to . (See ANSI, Section 4.13.4)
+ansireserved.c:7:13: Name wcst is reserved for future ANSI library extensions. 
+    Functions that begin with "mem" or "wcs" and a lowercase letter letter may
+    be added to . (See ANSI, Section 4.13.8)
+ansireserved.c:11:5: Name isaFish is reserved for future ANSI library
+    extensions.  Functions beginning with "is" or "to" and a lowercase letter
+    may be added to . (See ANSI, Section 4.13.2)
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+ansireserved.c:9: Name EVANS is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+ansireserved.c:1:5: Name decimal_point is reserved for the standard library
+ansireserved.c:2:5: Name srand is reserved for the standard library
+ansireserved.c:3:5: Name labs is reserved for the standard library
+ansireserved.c:4:5: Name _x is in the implementation name space (any identifier
+                       beginning with underscore)
+ansireserved.c:5:5: Name atan2f is reserved for future ANSI library extensions.
+     The names of all existing functions in  suffixed with 'f' or 'l'
+    may be added to . (See ANSI, Section 4.13.4)
+ansireserved.c:7:13: Name wcst is reserved for future ANSI library extensions. 
+    Functions that begin with "mem" or "wcs" and a lowercase letter letter may
+    be added to . (See ANSI, Section 4.13.8)
+ansireserved.c:11:5: Name isaFish is reserved for future ANSI library
+    extensions.  Functions beginning with "is" or "to" and a lowercase letter
+    may be added to . (See ANSI, Section 4.13.2)
+ansireserved.c: (in function isaFish)
+ansireserved.c:13:20: Name powl is reserved for future ANSI library extensions.
+     The names of all existing functions in  suffixed with 'f' or 'l'
+    may be added to . (See ANSI, Section 4.13.4)
+ansireserved.c:15:22: Name memory is reserved for future ANSI library
+    extensions.  Functions that begin with "mem" or "wcs" and a lowercase
+    letter letter may be added to . (See ANSI, Section 4.13.8)
+ansireserved.c:16:20: Name wctomb is reserved for the standard library
+
+Finished LCLint checking --- 11 code errors found, as expected
+
+ansireserved.c:9: Name EVANS is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+ansireserved.c:1:5: Name decimal_point is reserved for the standard library
+ansireserved.c:2:5: Function srand inconsistently declared as variable: int
+   load file ansi.lcd: Specification of srand:
+   [function (unsigned int) returns void]
+ansireserved.c:3:5: Function labs inconsistently declared as variable: int
+   load file ansi.lcd: Specification of labs:
+   [function (long int) returns long int]
+ansireserved.c:4:5: Name _x is in the implementation name space (any identifier
+                       beginning with underscore)
+ansireserved.c:5:5: Name atan2f is reserved for future ANSI library extensions.
+     The names of all existing functions in  suffixed with 'f' or 'l'
+    may be added to . (See ANSI, Section 4.13.4)
+ansireserved.c:7:13: Name wcst is reserved for future ANSI library extensions. 
+    Functions that begin with "mem" or "wcs" and a lowercase letter letter may
+    be added to . (See ANSI, Section 4.13.8)
+ansireserved.c:11:5: Name isaFish is reserved for future ANSI library
+    extensions.  Functions beginning with "is" or "to" and a lowercase letter
+    may be added to . (See ANSI, Section 4.13.2)
+ansireserved.c:5:5: Function atan2f declared but not defined
+
+Finished LCLint checking --- 9 code errors found, as expected
diff --git a/test/ansireserved.out b/test/ansireserved.out
new file mode 100644
index 0000000..ed0d59a
--- /dev/null
+++ b/test/ansireserved.out
@@ -0,0 +1,73 @@
+
+ansireserved.c:9: Name EVANS is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+ansireserved.c:1:5: Name decimal_point is reserved for the standard library
+ansireserved.c:2:5: Name srand is reserved for the standard library
+ansireserved.c:3:5: Name labs is reserved for the standard library
+ansireserved.c:4:5: Name _x is in the implementation name space (any identifier
+                       beginning with underscore)
+ansireserved.c:5:5: Name atan2f is reserved for future ANSI library extensions.
+     The names of all existing functions in  suffixed with 'f' or 'l'
+    may be added to . (See ANSI, Section 4.13.4)
+ansireserved.c:7:13: Name wcst is reserved for future ANSI library extensions. 
+    Functions that begin with "mem" or "wcs" and a lowercase letter letter may
+    be added to . (See ANSI, Section 4.13.8)
+ansireserved.c:11:5: Name isaFish is reserved for future ANSI library
+    extensions.  Functions beginning with "is" or "to" and a lowercase letter
+    may be added to . (See ANSI, Section 4.13.2)
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+ansireserved.c:9: Name EVANS is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+ansireserved.c:1:5: Name decimal_point is reserved for the standard library
+ansireserved.c:2:5: Name srand is reserved for the standard library
+ansireserved.c:3:5: Name labs is reserved for the standard library
+ansireserved.c:4:5: Name _x is in the implementation name space (any identifier
+                       beginning with underscore)
+ansireserved.c:5:5: Name atan2f is reserved for future ANSI library extensions.
+     The names of all existing functions in  suffixed with 'f' or 'l'
+    may be added to . (See ANSI, Section 4.13.4)
+ansireserved.c:7:13: Name wcst is reserved for future ANSI library extensions. 
+    Functions that begin with "mem" or "wcs" and a lowercase letter letter may
+    be added to . (See ANSI, Section 4.13.8)
+ansireserved.c:11:5: Name isaFish is reserved for future ANSI library
+    extensions.  Functions beginning with "is" or "to" and a lowercase letter
+    may be added to . (See ANSI, Section 4.13.2)
+ansireserved.c: (in function isaFish)
+ansireserved.c:13:20: Name powl is reserved for future ANSI library extensions.
+     The names of all existing functions in  suffixed with 'f' or 'l'
+    may be added to . (See ANSI, Section 4.13.4)
+ansireserved.c:15:22: Name memory is reserved for future ANSI library
+    extensions.  Functions that begin with "mem" or "wcs" and a lowercase
+    letter letter may be added to . (See ANSI, Section 4.13.8)
+ansireserved.c:16:20: Name wctomb is reserved for the standard library
+
+Finished LCLint checking --- 11 code errors found, as expected
+
+ansireserved.c:9: Name EVANS is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+ansireserved.c:1:5: Name decimal_point is reserved for the standard library
+ansireserved.c:2:5: Function srand inconsistently declared as variable: int
+   load file ansi.lcd: Specification of srand:
+   [function (unsigned int) returns void]
+ansireserved.c:3:5: Function labs inconsistently declared as variable: int
+   load file ansi.lcd: Specification of labs:
+   [function (long int) returns long int]
+ansireserved.c:4:5: Name _x is in the implementation name space (any identifier
+                       beginning with underscore)
+ansireserved.c:5:5: Name atan2f is reserved for future ANSI library extensions.
+     The names of all existing functions in  suffixed with 'f' or 'l'
+    may be added to . (See ANSI, Section 4.13.4)
+ansireserved.c:7:13: Name wcst is reserved for future ANSI library extensions. 
+    Functions that begin with "mem" or "wcs" and a lowercase letter letter may
+    be added to . (See ANSI, Section 4.13.8)
+ansireserved.c:11:5: Name isaFish is reserved for future ANSI library
+    extensions.  Functions beginning with "is" or "to" and a lowercase letter
+    may be added to . (See ANSI, Section 4.13.2)
+ansireserved.c:5:5: Function atan2f declared but not defined
+
+Finished LCLint checking --- 9 code errors found, as expected
diff --git a/test/argorder.c b/test/argorder.c
new file mode 100644
index 0000000..f8e75e2
--- /dev/null
+++ b/test/argorder.c
@@ -0,0 +1,14 @@
+int i;
+int j;
+
+int f(int x, int y, int z)
+{
+  printf("%d %d", x, y);
+  printf("%d %d", y++, z++);  
+  printf("%d %d", z++, z);  /* arg 2 modifies z, used by arg 3 */
+
+  return (f((i++, j++), (i = 3), j)); /* arg 1 modifies i, used by 2,
+					 arg 1 modifies j, used by 3,
+					 arg 2 modifies i, used by 1 */
+}
+  
diff --git a/test/argorder.expect b/test/argorder.expect
new file mode 100644
index 0000000..24b89b9
--- /dev/null
+++ b/test/argorder.expect
@@ -0,0 +1,86 @@
+
+argorder.c: (in function f)
+argorder.c:8:20: Argument 2 modifies z, used by argument 3 (order of evaluation
+                    of actual parameters is undefined): printf("%d %d", z++, z)
+argorder.c:10:13: Argument 1 modifies i, used by argument 2 (order of
+    evaluation of actual parameters is undefined): f((i++, j++), (i = 3), j)
+argorder.c:10:13: Argument 1 modifies j, used by argument 3 (order of
+    evaluation of actual parameters is undefined): f((i++, j++), (i = 3), j)
+argorder.c:10:25: Argument 2 modifies i, used by argument 1 (order of
+    evaluation of actual parameters is undefined): f((i++, j++), (i = 3), j)
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+argorder2.c: (in function g)
+argorder2.c:16:12: Argument 1 modifies i, used by argument 2 (order of
+    evaluation of actual parameters is undefined): f(f(1, 2), f(1, 2))
+argorder2.c:16:21: Argument 2 modifies i, used by argument 1 (order of
+    evaluation of actual parameters is undefined): f(f(1, 2), f(1, 2))
+argorder2.c:17:12: Argument 1 modifies i, used by argument 2 (order of
+    evaluation of actual parameters is undefined): f(f(1, 2), h())
+argorder2.c:18:12: Argument 1 modifies i, used by argument 2 (order of
+    evaluation of actual parameters is undefined): f(f(1, 2), i)
+argorder2.c:19:14: Argument 1 modifies i, used by argument 2 (order of
+                      evaluation of actual parameters is undefined): f(i++, i)
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+argorder3.c: (in function f)
+argorder3.c:7:8: Expression has undefined behavior (value of left operand is
+                    modified by right operand): i = i++
+argorder3.c:8:11: Expression has undefined behavior (left operand uses i,
+                     modified by right operand): a[i] = i++
+argorder3.c:9:12: Expression has undefined behavior (value of right operand
+                     modified by left operand): a[i++] = i
+argorder3.c:10:13: Expression has undefined behavior (value of right operand
+                      modified by left operand): i++ * i
+argorder3.c:11:12: Expression has undefined behavior (value of left operand is
+                      modified by right operand): i * i++
+argorder3.c:12:14: Expression has undefined behavior (left operand uses i,
+                      modified by right operand): --i * ++i
+argorder3.c:12:14: Expression has undefined behavior (left operand modifies i,
+                      used by right operand): --i * ++i
+argorder3.c:13:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+argorder4.c: (in function h)
+argorder4.c:19:21: Expression has undefined behavior (left operand uses glob,
+                      modified by right operand): f() + g()
+argorder4.c:25:18: Expression has undefined behavior (left operand uses glob,
+                      modified by right operand): f() + (++glob)
+argorder4.c:29:18: Expression has undefined behavior (left operand uses glob,
+                      modified by right operand): g() + h()
+argorder4.c:29:18: Expression has undefined behavior (left operand modifies
+                      glob, used by right operand): g() + h()
+argorder4.c:35:16: Argument 1 modifies file system state, used by argument 2
+    (order of evaluation of actual parameters is undefined):
+    add((printf("hullo"), 3), (printf("goodbye"), 4))
+argorder4.c:35:16: Argument 1 modifies *stdout, set by argument 2 (order of
+    evaluation of actual parameters is undefined):
+    add((printf("hullo"), 3), (printf("goodbye"), 4))
+argorder4.c:35:38: Argument 2 modifies file system state, used by argument 1
+    (order of evaluation of actual parameters is undefined):
+    add((printf("hullo"), 3), (printf("goodbye"), 4))
+argorder4.c:35:38: Argument 2 modifies *stdout, set by argument 1 (order of
+    evaluation of actual parameters is undefined):
+    add((printf("hullo"), 3), (printf("goodbye"), 4))
+argorder4.c:35:10: Unreachable code: return (add((pri...
+
+Finished LCLint checking --- 9 code errors found, as expected
+
+argorder4.c: (in function h)
+argorder4.c:35:10: Unreachable code: return (add((pri...
+
+Finished LCLint checking --- 1 code error found, as expected
+
+argorder5.c: (in function f)
+argorder5.c:8:9: Variable name used after being released
+   argorder5.c:8:17: Storage name released
+argorder5.c:9:19: Variable name used after being released
+   argorder5.c:9:12: Storage name released
+argorder5.c:10:28: Argument 2 modifies *name, used by argument 1 (order of
+    evaluation of actual parameters is undefined):
+    test2(copystring(name), f(name))
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/argorder.out b/test/argorder.out
new file mode 100644
index 0000000..24b89b9
--- /dev/null
+++ b/test/argorder.out
@@ -0,0 +1,86 @@
+
+argorder.c: (in function f)
+argorder.c:8:20: Argument 2 modifies z, used by argument 3 (order of evaluation
+                    of actual parameters is undefined): printf("%d %d", z++, z)
+argorder.c:10:13: Argument 1 modifies i, used by argument 2 (order of
+    evaluation of actual parameters is undefined): f((i++, j++), (i = 3), j)
+argorder.c:10:13: Argument 1 modifies j, used by argument 3 (order of
+    evaluation of actual parameters is undefined): f((i++, j++), (i = 3), j)
+argorder.c:10:25: Argument 2 modifies i, used by argument 1 (order of
+    evaluation of actual parameters is undefined): f((i++, j++), (i = 3), j)
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+argorder2.c: (in function g)
+argorder2.c:16:12: Argument 1 modifies i, used by argument 2 (order of
+    evaluation of actual parameters is undefined): f(f(1, 2), f(1, 2))
+argorder2.c:16:21: Argument 2 modifies i, used by argument 1 (order of
+    evaluation of actual parameters is undefined): f(f(1, 2), f(1, 2))
+argorder2.c:17:12: Argument 1 modifies i, used by argument 2 (order of
+    evaluation of actual parameters is undefined): f(f(1, 2), h())
+argorder2.c:18:12: Argument 1 modifies i, used by argument 2 (order of
+    evaluation of actual parameters is undefined): f(f(1, 2), i)
+argorder2.c:19:14: Argument 1 modifies i, used by argument 2 (order of
+                      evaluation of actual parameters is undefined): f(i++, i)
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+argorder3.c: (in function f)
+argorder3.c:7:8: Expression has undefined behavior (value of left operand is
+                    modified by right operand): i = i++
+argorder3.c:8:11: Expression has undefined behavior (left operand uses i,
+                     modified by right operand): a[i] = i++
+argorder3.c:9:12: Expression has undefined behavior (value of right operand
+                     modified by left operand): a[i++] = i
+argorder3.c:10:13: Expression has undefined behavior (value of right operand
+                      modified by left operand): i++ * i
+argorder3.c:11:12: Expression has undefined behavior (value of left operand is
+                      modified by right operand): i * i++
+argorder3.c:12:14: Expression has undefined behavior (left operand uses i,
+                      modified by right operand): --i * ++i
+argorder3.c:12:14: Expression has undefined behavior (left operand modifies i,
+                      used by right operand): --i * ++i
+argorder3.c:13:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+argorder4.c: (in function h)
+argorder4.c:19:21: Expression has undefined behavior (left operand uses glob,
+                      modified by right operand): f() + g()
+argorder4.c:25:18: Expression has undefined behavior (left operand uses glob,
+                      modified by right operand): f() + (++glob)
+argorder4.c:29:18: Expression has undefined behavior (left operand uses glob,
+                      modified by right operand): g() + h()
+argorder4.c:29:18: Expression has undefined behavior (left operand modifies
+                      glob, used by right operand): g() + h()
+argorder4.c:35:16: Argument 1 modifies file system state, used by argument 2
+    (order of evaluation of actual parameters is undefined):
+    add((printf("hullo"), 3), (printf("goodbye"), 4))
+argorder4.c:35:16: Argument 1 modifies *stdout, set by argument 2 (order of
+    evaluation of actual parameters is undefined):
+    add((printf("hullo"), 3), (printf("goodbye"), 4))
+argorder4.c:35:38: Argument 2 modifies file system state, used by argument 1
+    (order of evaluation of actual parameters is undefined):
+    add((printf("hullo"), 3), (printf("goodbye"), 4))
+argorder4.c:35:38: Argument 2 modifies *stdout, set by argument 1 (order of
+    evaluation of actual parameters is undefined):
+    add((printf("hullo"), 3), (printf("goodbye"), 4))
+argorder4.c:35:10: Unreachable code: return (add((pri...
+
+Finished LCLint checking --- 9 code errors found, as expected
+
+argorder4.c: (in function h)
+argorder4.c:35:10: Unreachable code: return (add((pri...
+
+Finished LCLint checking --- 1 code error found, as expected
+
+argorder5.c: (in function f)
+argorder5.c:8:9: Variable name used after being released
+   argorder5.c:8:17: Storage name released
+argorder5.c:9:19: Variable name used after being released
+   argorder5.c:9:12: Storage name released
+argorder5.c:10:28: Argument 2 modifies *name, used by argument 1 (order of
+    evaluation of actual parameters is undefined):
+    test2(copystring(name), f(name))
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/argorder2.c b/test/argorder2.c
new file mode 100644
index 0000000..6ff97a2
--- /dev/null
+++ b/test/argorder2.c
@@ -0,0 +1,20 @@
+int i;
+
+int h()
+{
+  return i;
+}
+
+int f(int x, int y)
+{
+  i = i + x + y;
+  return i;
+}
+  
+int g()
+{
+  (void) f(f(1, 2), f(1, 2)); /* 1, 2. arg1 modifies i, used by arg2, vice versa */
+  (void) f(f(1, 2), h());     /* 3. arg1 modifies i, used by arg2 */
+  (void) f(f(1, 2), i);       /* 4. arg1 modifies i, used by arg2 */
+  return (f(i++, i));         /* 5. arg1 modifies i, used by arg2 */
+}
diff --git a/test/argorder2.lcl b/test/argorder2.lcl
new file mode 100644
index 0000000..b3ed216
--- /dev/null
+++ b/test/argorder2.lcl
@@ -0,0 +1,5 @@
+int i;
+
+int f (int x, int y) int i; { modifies i; }
+int g (void) int i; { modifies i; }
+int h (void) int i; { }
\ No newline at end of file
diff --git a/test/argorder2.lcs b/test/argorder2.lcs
new file mode 100644
index 0000000..2a106ee
--- /dev/null
+++ b/test/argorder2.lcs
@@ -0,0 +1,127 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _int_Obj obj int nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLvar i _int_Obj
+%LCLfcn f : int, int -> int 
+%LCLfcnGlobals _int_Obj i; 
+%LCLfcn g :  -> int 
+%LCLfcnGlobals _int_Obj i; 
+%LCLfcn h :  -> int 
+%LCLfcnGlobals _int_Obj i; 
+%LCLSymbolTableEnd
diff --git a/test/argorder3.c b/test/argorder3.c
new file mode 100644
index 0000000..b0d9ef4
--- /dev/null
+++ b/test/argorder3.c
@@ -0,0 +1,13 @@
+int f (void)
+{
+  int i = 3;
+  int j;
+  int a[10];
+
+  i = i++;        /* bad */
+  a[i] = i++;     /* bad */
+  a[i++] = i;     /* bad */ 
+  j = i++ * i;    /* bad */
+  j = i * i++;    /* bad */
+  j += --i * ++i; /* bad * 2 */
+}
diff --git a/test/argorder4.c b/test/argorder4.c
new file mode 100644
index 0000000..9837f53
--- /dev/null
+++ b/test/argorder4.c
@@ -0,0 +1,39 @@
+int glob;
+
+int add(int x, int y) { return (x + y); }
+
+int f()
+{
+  return (glob);
+}
+
+int g()
+{
+  return (++glob);
+}
+
+int h()
+{
+  if (f() > 3)
+    {
+      return (f() + g()); /* bad --- order of evaluation matters! */
+    }
+  else
+    {
+      if (g() < 2)
+	{
+	  return (f() + (++glob)); /* bad! */
+	}
+      else
+	{
+	  return (g() + h()); /* bad (twice) */
+	}
+    }
+  
+  /* unreachable code here */
+
+  return (add ((printf("hullo"), 3), (printf("goodbye"), 4))); /* bad (wrice) */
+}
+
+
+
diff --git a/test/argorder4.lcl b/test/argorder4.lcl
new file mode 100644
index 0000000..65823a2
--- /dev/null
+++ b/test/argorder4.lcl
@@ -0,0 +1,8 @@
+int glob;
+
+int f (void) int glob; { }
+
+int g (void) int glob; { modifies glob; }
+
+int h (void) int glob; { modifies glob; }
+
diff --git a/test/argorder4.lcs b/test/argorder4.lcs
new file mode 100644
index 0000000..1910eef
--- /dev/null
+++ b/test/argorder4.lcs
@@ -0,0 +1,127 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _int_Obj obj int nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLvar glob _int_Obj
+%LCLfcn f :  -> int 
+%LCLfcnGlobals _int_Obj glob; 
+%LCLfcn g :  -> int 
+%LCLfcnGlobals _int_Obj glob; 
+%LCLfcn h :  -> int 
+%LCLfcnGlobals _int_Obj glob; 
+%LCLSymbolTableEnd
diff --git a/test/argorder5.c b/test/argorder5.c
new file mode 100644
index 0000000..4828c7f
--- /dev/null
+++ b/test/argorder5.c
@@ -0,0 +1,12 @@
+void test (char *s1, int x);
+void test3 (int, char *s1);
+void test2 (/*@only@*/ char *s1, int x);
+char *copystring (char *s);
+
+int f (/*@only@*/ char *name) /*@modifies *name;@*/
+{
+  test (name, f(name));  /* 1. Variable name used after being released */
+  test3 (f(name), name); /* 2. Variable name used after being released */
+  test2 (copystring(name), f(name)); /* 3. Argument 2 modifies *name, used by ... */
+  return 3;
+}
diff --git a/test/args.c b/test/args.c
new file mode 100644
index 0000000..5fa3351
--- /dev/null
+++ b/test/args.c
@@ -0,0 +1,79 @@
+# include 
+# include "bool.h"
+int sumn (int x, ...)
+{
+  int y = 0;
+  void *yaba;
+  va_list args;
+
+  va_start (args, (void *)x); /* okay (args counts as out param) */
+  while (x > 0)
+    {
+      x--;
+      y = va_arg (args, int); /* okay */
+      y = va_arg (args, char *); /* type error */
+      y = va_arg (yaba, int); /* error */
+    }
+  return y;
+}
+
+int test (int x, char *s)
+{
+  x = sumn(); /* bad */
+  x = sumn(x); /* okay */
+  x = sumn(s); /* bad */
+  x = sumn(x, s); /* okay */
+
+  x = test (x, s, x); /* bad */
+  return x;
+}
+
+int missingargs (int x, int y)  /* this is okay */
+{
+  y = x;
+  return x;
+}
+
+int severalargs (char c, int y, bool b) /* first arg: int, second char *, third extra */
+{
+  if (b) { c = 'a'; }
+  return y;
+}
+
+int severalargs2 (int x)  /* bad */
+{
+  return x;
+}
+
+int voidargs (char c) /* bad */
+{
+  c = 'a'; 
+  return 3;
+}
+
+int any (...) /* ok */
+{
+  return 3;
+}
+
+int many1 (int x, char c, float f) /* bad */
+{
+  x;
+  c;
+  f;
+  return x;
+}
+
+int many2 (int x, char c, ...)
+{
+  c;
+  return x;
+}
+
+int many3 (int x) /* bad */
+{
+  return x;
+}
+
+
+
diff --git a/test/args.expect b/test/args.expect
new file mode 100644
index 0000000..38b6a3f
--- /dev/null
+++ b/test/args.expect
@@ -0,0 +1,27 @@
+
+args.c: (in function sumn)
+args.c:14:7: Assignment of char * to int: y = va_arg(args, char *)
+args.c:15:19: First argument to va_arg is not a va_list (type void *): yaba
+args.c: (in function test)
+args.c:22:7: Function sumn called with 0 args, expects at least 1
+args.c:24:12: Function sumn expects arg 1 to be int gets char *: s
+args.c:27:7: Function test called with 3 args, expects 2
+args.c:37:5: Function severalargs declared with 3 args, specified with 2
+   args.lcl:1: Specification of severalargs
+args.c:37:23: Parameter 1, c, of function severalargs has inconsistent type:
+                 declared char, specified int
+   args.lcl:1: Specification of severalargs
+args.c:37:30: Parameter 2, y, of function severalargs has inconsistent type:
+                 declared int, specified char *
+   args.lcl:1: Specification of severalargs
+args.c:43:5: Function severalargs2 declared with 1 arg, specified with 2
+   args.lcl:2: Specification of severalargs2
+args.c:48:5: Function voidargs declared with 1 arg, specified with 0
+   args.lcl:7: Specification of voidargs
+args.c:59:33: Parameter 3, f, of function many1 has inconsistent type:
+                 declared float, specified ...
+   args.lcl:4: Specification of many1
+args.c:73:5: Function many3 declared with 1 arg, specified with 3
+   args.lcl:6: Specification of many3
+
+Finished LCLint checking --- 12 code errors found, as expected
diff --git a/test/args.lcl b/test/args.lcl
new file mode 100644
index 0000000..f552471
--- /dev/null
+++ b/test/args.lcl
@@ -0,0 +1,7 @@
+int severalargs(int x, char *t) { }
+int severalargs2(int x, char *t) { }
+int any(...) { } 
+int many1(int x, char y, ...) { } 
+int many2(int x, char y, ...) { } 
+int many3(int x, char y, ...) { } 
+int voidargs(void) { }
diff --git a/test/args.lcs b/test/args.lcs
new file mode 100644
index 0000000..8cb4c0d
--- /dev/null
+++ b/test/args.lcs
@@ -0,0 +1,133 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLfcn severalargs : int, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn severalargs2 : int, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn any :  -> int 
+%LCLfcnGlobals 
+%LCLfcn many1 : int, char -> int 
+%LCLfcnGlobals 
+%LCLfcn many2 : int, char -> int 
+%LCLfcnGlobals 
+%LCLfcn many3 : int, char -> int 
+%LCLfcnGlobals 
+%LCLfcn voidargs :  -> int 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/args.out b/test/args.out
new file mode 100644
index 0000000..38b6a3f
--- /dev/null
+++ b/test/args.out
@@ -0,0 +1,27 @@
+
+args.c: (in function sumn)
+args.c:14:7: Assignment of char * to int: y = va_arg(args, char *)
+args.c:15:19: First argument to va_arg is not a va_list (type void *): yaba
+args.c: (in function test)
+args.c:22:7: Function sumn called with 0 args, expects at least 1
+args.c:24:12: Function sumn expects arg 1 to be int gets char *: s
+args.c:27:7: Function test called with 3 args, expects 2
+args.c:37:5: Function severalargs declared with 3 args, specified with 2
+   args.lcl:1: Specification of severalargs
+args.c:37:23: Parameter 1, c, of function severalargs has inconsistent type:
+                 declared char, specified int
+   args.lcl:1: Specification of severalargs
+args.c:37:30: Parameter 2, y, of function severalargs has inconsistent type:
+                 declared int, specified char *
+   args.lcl:1: Specification of severalargs
+args.c:43:5: Function severalargs2 declared with 1 arg, specified with 2
+   args.lcl:2: Specification of severalargs2
+args.c:48:5: Function voidargs declared with 1 arg, specified with 0
+   args.lcl:7: Specification of voidargs
+args.c:59:33: Parameter 3, f, of function many1 has inconsistent type:
+                 declared float, specified ...
+   args.lcl:4: Specification of many1
+args.c:73:5: Function many3 declared with 1 arg, specified with 3
+   args.lcl:6: Specification of many3
+
+Finished LCLint checking --- 12 code errors found, as expected
diff --git a/test/blocks.c b/test/blocks.c
new file mode 100644
index 0000000..1879301
--- /dev/null
+++ b/test/blocks.c
@@ -0,0 +1,25 @@
+int f (int x)
+{
+  if (x > 3) ;
+  while (x < 2) ;
+
+  if (x > 3) x++;
+  while (x < 2) x++;
+
+  if (x > 3) { x++; }
+  while (x < 2) { x++; }
+
+  for (; x < 2; x++) ;
+  for (; x < 2; x++) x++;
+
+  if (x == 0) { x = 3; }
+  else if (x == 1) { x = 4; }
+
+  if (x == 0) { x = 3; }
+  else x = 4;
+
+  if (x == 0) ;
+  else ;
+
+  return x;
+}
diff --git a/test/blocks.expect b/test/blocks.expect
new file mode 100644
index 0000000..06db454
--- /dev/null
+++ b/test/blocks.expect
@@ -0,0 +1,64 @@
+
+blocks.c: (in function f)
+blocks.c:3:15: Body of if statement is empty
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:21:16: Body of if clause of if statement is empty
+blocks.c:22:9: Body of else clause of if statement is empty
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+blocks.c: (in function f)
+blocks.c:3:15: Body of if statement is empty
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:6:15: Body of if statement is not a block: x++
+blocks.c:16:12: Incomplete else if logic (no final else): if (x == 1) { x = 4 }
+blocks.c:19:8: Body of else clause of if statement is not a block: x = 4
+blocks.c:21:16: Body of if clause of if statement is empty
+blocks.c:22:9: Body of else clause of if statement is empty
+
+Finished LCLint checking --- 7 code errors found, as expected
+
+blocks.c: (in function f)
+blocks.c:4:18: Body of while statement is empty
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:7:18: Body of while statement is not a block: x++
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+blocks.c: (in function f)
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:12:23: Body of for statement is empty
+blocks.c:13:23: Body of for statement is not a block: x++
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+blocks.c: (in function f)
+blocks.c:3:15: Body of if statement is empty
+blocks.c:4:18: Body of while statement is empty
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:12:23: Body of for statement is empty
+blocks.c:21:16: Body of if clause of if statement is empty
+blocks.c:22:9: Body of else clause of if statement is empty
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+blocks.c: (in function f)
+blocks.c:3:15: Body of if statement is empty
+blocks.c:4:18: Body of while statement is empty
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:6:15: Body of if statement is not a block: x++
+blocks.c:7:18: Body of while statement is not a block: x++
+blocks.c:12:23: Body of for statement is empty
+blocks.c:13:23: Body of for statement is not a block: x++
+blocks.c:16:12: Incomplete else if logic (no final else): if (x == 1) { x = 4 }
+blocks.c:19:8: Body of else clause of if statement is not a block: x = 4
+blocks.c:21:16: Body of if clause of if statement is empty
+blocks.c:22:9: Body of else clause of if statement is empty
+
+Finished LCLint checking --- 11 code errors found, as expected
diff --git a/test/blocks.out b/test/blocks.out
new file mode 100644
index 0000000..06db454
--- /dev/null
+++ b/test/blocks.out
@@ -0,0 +1,64 @@
+
+blocks.c: (in function f)
+blocks.c:3:15: Body of if statement is empty
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:21:16: Body of if clause of if statement is empty
+blocks.c:22:9: Body of else clause of if statement is empty
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+blocks.c: (in function f)
+blocks.c:3:15: Body of if statement is empty
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:6:15: Body of if statement is not a block: x++
+blocks.c:16:12: Incomplete else if logic (no final else): if (x == 1) { x = 4 }
+blocks.c:19:8: Body of else clause of if statement is not a block: x = 4
+blocks.c:21:16: Body of if clause of if statement is empty
+blocks.c:22:9: Body of else clause of if statement is empty
+
+Finished LCLint checking --- 7 code errors found, as expected
+
+blocks.c: (in function f)
+blocks.c:4:18: Body of while statement is empty
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:7:18: Body of while statement is not a block: x++
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+blocks.c: (in function f)
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:12:23: Body of for statement is empty
+blocks.c:13:23: Body of for statement is not a block: x++
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+blocks.c: (in function f)
+blocks.c:3:15: Body of if statement is empty
+blocks.c:4:18: Body of while statement is empty
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:12:23: Body of for statement is empty
+blocks.c:21:16: Body of if clause of if statement is empty
+blocks.c:22:9: Body of else clause of if statement is empty
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+blocks.c: (in function f)
+blocks.c:3:15: Body of if statement is empty
+blocks.c:4:18: Body of while statement is empty
+blocks.c:4:10: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+blocks.c:6:15: Body of if statement is not a block: x++
+blocks.c:7:18: Body of while statement is not a block: x++
+blocks.c:12:23: Body of for statement is empty
+blocks.c:13:23: Body of for statement is not a block: x++
+blocks.c:16:12: Incomplete else if logic (no final else): if (x == 1) { x = 4 }
+blocks.c:19:8: Body of else clause of if statement is not a block: x = 4
+blocks.c:21:16: Body of if clause of if statement is empty
+blocks.c:22:9: Body of else clause of if statement is empty
+
+Finished LCLint checking --- 11 code errors found, as expected
diff --git a/test/bool.h b/test/bool.h
new file mode 100644
index 0000000..d297edc
--- /dev/null
+++ b/test/bool.h
@@ -0,0 +1,34 @@
+#ifndef BOOL_H
+#define BOOL_H
+
+/*@-cppnames@*/
+/*@-exporttype@*/
+typedef int bool;
+/*@=exporttype@*/
+/*@=cppnames@*/
+
+#ifndef FALSE
+/*@constant unused bool FALSE@*/
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+/*@constant unused bool TRUE@*/
+#define TRUE (! FALSE)
+#endif
+
+/*@-slovakfcns@*/
+extern void bool_initMod (void);
+# define bool_initMod()
+
+extern /*@observer@*/ char *bool_unparse (bool);
+# define bool_unparse(b) ((b) ? "true" : "false" )
+
+extern bool bool_not (bool);
+# define bool_not(b) ((b) ? FALSE : TRUE)
+
+extern bool bool_equal (bool, bool);
+# define bool_equal(a,b) ((a) ? (b) : !(b))
+/*@=slovakfcns@*/
+
+# endif
diff --git a/test/break.c b/test/break.c
new file mode 100644
index 0000000..07e9b55
--- /dev/null
+++ b/test/break.c
@@ -0,0 +1,48 @@
+void f (int x)
+{
+  while (x < 3) /* 3 [5]. Suspected infinite loop: no condition values modified */
+    {
+      switch (x)
+	{
+	case 1:
+	  /*@switchbreak@*/ 
+	  break;
+	case 2:
+	  /*@loopbreak@*/ /* 1. Break preceded by loopbreak is breaking a switch */
+	  break; 
+	case 3:
+	  break; /* 2. Break statement in switch inside loop */
+	}
+      
+      while (x > 2) /* 2 [4]. Suspected infinite loop: no condition values modified */
+	{
+	  if (3 > 4)
+	    {
+	      break; /* 3. Break statement in nested loop */
+	    }
+	  else
+	    {
+	      /*@innerbreak@*/ 
+	      break;
+	    }
+	}
+    }
+
+  while (x < 2)
+    {
+      x++;
+      /*@innerbreak@*/ break; /* 4 [6]. Break preceded by innerbreak is not in a deep loop */
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/break.expect b/test/break.expect
new file mode 100644
index 0000000..fa6d9c7
--- /dev/null
+++ b/test/break.expect
@@ -0,0 +1,33 @@
+
+break.c: (in function f)
+break.c:12:4: Break preceded by loopbreak is breaking a switch
+break.c:17:14: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+break.c:3:10: Suspected infinite loop.  No value used in loop test (x) is
+                 modified by test or loop body.
+break.c:34:24: Break preceded by innerbreak is not in a deep loop
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+break.c: (in function f)
+break.c:12:4: Break preceded by loopbreak is breaking a switch
+break.c:14:4: Break statement in switch inside loop
+break.c:21:8: Break statement in nested loop
+break.c:17:14: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+break.c:3:10: Suspected infinite loop.  No value used in loop test (x) is
+                 modified by test or loop body.
+break.c:34:24: Break preceded by innerbreak is not in a deep loop
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+break.c: (in function f)
+break.c:12:4: Break preceded by loopbreak is breaking a switch
+break.c:14:4: Break statement in switch inside loop
+break.c:17:14: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+break.c:3:10: Suspected infinite loop.  No value used in loop test (x) is
+                 modified by test or loop body.
+break.c:34:24: Break preceded by innerbreak is not in a deep loop
+
+Finished LCLint checking --- 5 code errors found, as expected
diff --git a/test/break.out b/test/break.out
new file mode 100644
index 0000000..fa6d9c7
--- /dev/null
+++ b/test/break.out
@@ -0,0 +1,33 @@
+
+break.c: (in function f)
+break.c:12:4: Break preceded by loopbreak is breaking a switch
+break.c:17:14: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+break.c:3:10: Suspected infinite loop.  No value used in loop test (x) is
+                 modified by test or loop body.
+break.c:34:24: Break preceded by innerbreak is not in a deep loop
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+break.c: (in function f)
+break.c:12:4: Break preceded by loopbreak is breaking a switch
+break.c:14:4: Break statement in switch inside loop
+break.c:21:8: Break statement in nested loop
+break.c:17:14: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+break.c:3:10: Suspected infinite loop.  No value used in loop test (x) is
+                 modified by test or loop body.
+break.c:34:24: Break preceded by innerbreak is not in a deep loop
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+break.c: (in function f)
+break.c:12:4: Break preceded by loopbreak is breaking a switch
+break.c:14:4: Break statement in switch inside loop
+break.c:17:14: Suspected infinite loop.  No value used in loop test (x) is
+                  modified by test or loop body.
+break.c:3:10: Suspected infinite loop.  No value used in loop test (x) is
+                 modified by test or loop body.
+break.c:34:24: Break preceded by innerbreak is not in a deep loop
+
+Finished LCLint checking --- 5 code errors found, as expected
diff --git a/test/cases.c b/test/cases.c
new file mode 100644
index 0000000..7e0c011
--- /dev/null
+++ b/test/cases.c
@@ -0,0 +1,41 @@
+extern int g(int x);
+
+int f(int j)
+{
+  int i;
+
+  switch (j) 
+    {
+    case 3: /* okay */
+      i = g(j);
+      printf("3");
+    case 4:  /* 2. Fall through case (no preceeding break) */
+      if (i == 3) /* 1. Variable i used before definition */
+	{
+	  printf("hullo");
+	  return 3;
+	}
+      else
+	{
+	  printf("yabba");
+	  break;
+	}
+    case 5: /* okay */
+      i = g(j++);
+      while (i < 3)
+	{
+	  i++;
+	  if (j == 4) break;
+	}
+    case 6: /* 3. Fall through case (no preceeding break) */
+      printf("high");
+      return 3;
+    case 7: /* okay */
+    case 8: /* okay */
+    case 9:
+      printf("nope");
+    default: /* 4. Fall through case (no preceeding break) */
+      printf("splat");
+   }
+} /* 5. Path with no return in function declared to return int */
+  
diff --git a/test/cases.expect b/test/cases.expect
new file mode 100644
index 0000000..47d9f76
--- /dev/null
+++ b/test/cases.expect
@@ -0,0 +1,42 @@
+
+cases.c: (in function f)
+cases.c:12:10: Fall through case (no preceeding break)
+cases.c:13:11: Variable i used before definition
+cases.c:30:10: Fall through case (no preceeding break)
+cases.c:37:13: Fall through case (no preceeding break)
+cases.c:40:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+cases2.c: (in function f2)
+cases2.c:26:5: Variable x is released in one possible execution, but live in
+                  other possible execution.
+   cases2.c:23:16: Storage x is released
+cases2.c: (in function f3)
+cases2.c:37:5: Variable x is released in one possible execution, but live in
+                  other possible execution.
+   cases2.c:36:16: Storage x is released
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+cases2.c: (in function f2)
+cases2.c:26:5: Variable x is released in one possible execution, but live in
+                  other possible execution.
+   cases2.c:23:16: Storage x is released
+cases2.c: (in function f3)
+cases2.c:37:5: Variable x is released in one possible execution, but live in
+                  other possible execution.
+   cases2.c:36:16: Storage x is released
+cases2.c:1:24: Function g declared but not defined
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+cases2.c: (in function f2)
+cases2.c:28:12: Variable x used after being released
+   cases2.c:23:16: Storage x released
+cases2.c: (in function f3)
+cases2.c:39:12: Variable x used after being released
+   cases2.c:36:16: Storage x released
+cases2.c:1:24: Function g declared but not defined
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/cases.out b/test/cases.out
new file mode 100644
index 0000000..47d9f76
--- /dev/null
+++ b/test/cases.out
@@ -0,0 +1,42 @@
+
+cases.c: (in function f)
+cases.c:12:10: Fall through case (no preceeding break)
+cases.c:13:11: Variable i used before definition
+cases.c:30:10: Fall through case (no preceeding break)
+cases.c:37:13: Fall through case (no preceeding break)
+cases.c:40:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+cases2.c: (in function f2)
+cases2.c:26:5: Variable x is released in one possible execution, but live in
+                  other possible execution.
+   cases2.c:23:16: Storage x is released
+cases2.c: (in function f3)
+cases2.c:37:5: Variable x is released in one possible execution, but live in
+                  other possible execution.
+   cases2.c:36:16: Storage x is released
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+cases2.c: (in function f2)
+cases2.c:26:5: Variable x is released in one possible execution, but live in
+                  other possible execution.
+   cases2.c:23:16: Storage x is released
+cases2.c: (in function f3)
+cases2.c:37:5: Variable x is released in one possible execution, but live in
+                  other possible execution.
+   cases2.c:36:16: Storage x is released
+cases2.c:1:24: Function g declared but not defined
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+cases2.c: (in function f2)
+cases2.c:28:12: Variable x used after being released
+   cases2.c:23:16: Storage x released
+cases2.c: (in function f3)
+cases2.c:39:12: Variable x used after being released
+   cases2.c:36:16: Storage x released
+cases2.c:1:24: Function g declared but not defined
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/cases2.c b/test/cases2.c
new file mode 100644
index 0000000..ffe8502
--- /dev/null
+++ b/test/cases2.c
@@ -0,0 +1,40 @@
+extern /*@only@*/ int *g(/*@only@*/ int *y);
+
+/*@null@*/ /*@only@*/ int *f(/*@only@*/ int *x)
+{
+  switch (*x)
+    {
+    case 1:
+      return g(x);
+    case 2:
+      return g(x);
+    case 3:
+      return g(x);
+    default:
+      return g(x);
+    }
+}
+
+/*@null@*/ /*@only@*/ int *f2(/*@only@*/ int *x)
+{
+  switch (*x)
+    {
+    case 1:
+      return g(x);
+    case 2:
+      return g(x);
+    } /* 1. Variable x is released in one possible execution, but live ... */
+
+  return g(x);
+}
+
+/*@null@*/ /*@only@*/ int *f3(/*@only@*/ int *x)
+{
+  switch (*x)
+    {
+    case 1:
+      return g(x);
+    } 
+
+  return g(x);
+}
diff --git a/test/cast.c b/test/cast.c
new file mode 100644
index 0000000..ab3e6d3
--- /dev/null
+++ b/test/cast.c
@@ -0,0 +1,23 @@
+typedef int abst1, abst2; /* 1, 2. declaration errors (mutable types */
+typedef char *FILE;
+
+int main (void) {
+  abst1 a;    abst1 *ap;
+  abst2 b = 3;  /* 3. wrong type */
+  abst2 *bp = (abst2 *) malloc(sizeof(abst2)); /* 4. cast to underlying abstract */
+  FILE *f;
+  int  *ip = (int *)malloc(sizeof(int));
+
+        *ip = 3;           /* 5. possible null deref */
+        *bp = 5;           /* 6, 7. possible null deref, assignment of int to abst2 */
+/* 13 */ a = (abst1)ip;    /* 8. cast to abstract */
+/* 14 */ ap = (abst1 *)ip; /* 9. cast to underlying abstract */
+         f = (FILE *)ip;   /* 10. cast to underlying abstract */
+         a = (abst1)a;     /* 11. redundant abstract cast */
+/* 17 */ ip = (int *)ap;   /* 12, 13. cast from underlying abstract, allocated ip not released */
+         ip = (int *)f;    /* 13. cast from underlying abstract */
+/* 19 */ ip = (int *)a;    /* 14. cast from underlying abstract */
+/* 20 */ a = (abst1)b;     /* 15, 16. cast from abst2, cast to abst1 */
+/* 21 */ ap = (abst1 *)bp; /* 17, 18. cast to abst1 * , cast from abst2 * */
+         return 0;         /* 19, 20. ip and bp not released */
+}
diff --git a/test/cast.expect b/test/cast.expect
new file mode 100644
index 0000000..a1d0963
--- /dev/null
+++ b/test/cast.expect
@@ -0,0 +1,40 @@
+
+cast.c:1:13: Mutable abstract type abst1 declared without pointer indirection:
+                int (violates assignment semantics)
+cast.c:1:20: Mutable abstract type abst2 declared without pointer indirection:
+                int (violates assignment semantics)
+cast.c: (in function main)
+cast.c:6:13: Variable b initialized to type int, expects abst2: 3
+cast.c:7:25: Cast to underlying abstract type abst2 *:
+                (abst2 *)malloc(sizeof(abst2))
+cast.c:11:10: Dereference of possibly null pointer ip: *ip
+   cast.c:9:14: Storage ip may become null
+cast.c:12:10: Dereference of possibly null pointer bp: *bp
+   cast.c:7:15: Storage bp may become null
+cast.c:12:9: Assignment of int to abst2: *bp = 5
+cast.c:13:21: Cast to abstract type abst1: (abst1)ip
+cast.c:14:24: Cast to underlying abstract type abst1 *: (abst1 *)ip
+cast.c:15:22: Cast to underlying abstract type FILE *: (FILE *)ip
+cast.c:16:21: Redundant cast involving abstract type abst1: (abst1)a
+cast.c:17:22: Cast from underlying abstract type abst1 *: (int *)ap
+cast.c:18:22: Cast from underlying abstract type FILE *: (int *)f
+cast.c:19:22: Cast from underlying abstract type abst1: (int *)a
+cast.c:20:21: Cast from abstract type abst2: (abst1)b
+cast.c:20:21: Cast to abstract type abst1: (abst1)b
+cast.c:21:24: Cast to underlying abstract type abst1 *: (abst1 *)bp
+cast.c:21:24: Cast from underlying abstract type abst2 *: (abst1 *)bp
+cast.c:22:19: Owned storage ap not released before return
+   cast.c:21:10: Storage ap becomes owned
+cast.c:22:19: Last reference ip to owned storage a not released before return
+   cast.c:20:10: Original reference lost
+
+Finished LCLint checking --- 20 code errors found, as expected
+
+cast2.c: (in function f1)
+cast2.c:9:10: Implicitly temp storage x returned as implicitly only: x
+cast2.c:9:10: Function returns reference to parameter x: x
+cast2.c: (in function f2)
+cast2.c:15:10: Implicitly dependent storage x returned as implicitly only:
+                  (abst1)x
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/cast.lcl b/test/cast.lcl
new file mode 100644
index 0000000..e62d0cf
--- /dev/null
+++ b/test/cast.lcl
@@ -0,0 +1,2 @@
+mutable type abst1;
+mutable type abst2;
\ No newline at end of file
diff --git a/test/cast.lcs b/test/cast.lcs
new file mode 100644
index 0000000..0575b47
--- /dev/null
+++ b/test/cast.lcs
@@ -0,0 +1,127 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort abst1 immutable nil nil
+%LCLsort _abst1_Obj mutable abst1 nil
+%LCLsort abst2 immutable nil nil
+%LCLsort _abst2_Obj mutable abst2 nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :abst1 -> int
+%LCLop sizeof :abst2 -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype abst1 _abst1_Obj mutable
+%LCLtype abst2 _abst2_Obj mutable
+%LCLSymbolTableEnd
diff --git a/test/cast.out b/test/cast.out
new file mode 100644
index 0000000..a1d0963
--- /dev/null
+++ b/test/cast.out
@@ -0,0 +1,40 @@
+
+cast.c:1:13: Mutable abstract type abst1 declared without pointer indirection:
+                int (violates assignment semantics)
+cast.c:1:20: Mutable abstract type abst2 declared without pointer indirection:
+                int (violates assignment semantics)
+cast.c: (in function main)
+cast.c:6:13: Variable b initialized to type int, expects abst2: 3
+cast.c:7:25: Cast to underlying abstract type abst2 *:
+                (abst2 *)malloc(sizeof(abst2))
+cast.c:11:10: Dereference of possibly null pointer ip: *ip
+   cast.c:9:14: Storage ip may become null
+cast.c:12:10: Dereference of possibly null pointer bp: *bp
+   cast.c:7:15: Storage bp may become null
+cast.c:12:9: Assignment of int to abst2: *bp = 5
+cast.c:13:21: Cast to abstract type abst1: (abst1)ip
+cast.c:14:24: Cast to underlying abstract type abst1 *: (abst1 *)ip
+cast.c:15:22: Cast to underlying abstract type FILE *: (FILE *)ip
+cast.c:16:21: Redundant cast involving abstract type abst1: (abst1)a
+cast.c:17:22: Cast from underlying abstract type abst1 *: (int *)ap
+cast.c:18:22: Cast from underlying abstract type FILE *: (int *)f
+cast.c:19:22: Cast from underlying abstract type abst1: (int *)a
+cast.c:20:21: Cast from abstract type abst2: (abst1)b
+cast.c:20:21: Cast to abstract type abst1: (abst1)b
+cast.c:21:24: Cast to underlying abstract type abst1 *: (abst1 *)bp
+cast.c:21:24: Cast from underlying abstract type abst2 *: (abst1 *)bp
+cast.c:22:19: Owned storage ap not released before return
+   cast.c:21:10: Storage ap becomes owned
+cast.c:22:19: Last reference ip to owned storage a not released before return
+   cast.c:20:10: Original reference lost
+
+Finished LCLint checking --- 20 code errors found, as expected
+
+cast2.c: (in function f1)
+cast2.c:9:10: Implicitly temp storage x returned as implicitly only: x
+cast2.c:9:10: Function returns reference to parameter x: x
+cast2.c: (in function f2)
+cast2.c:15:10: Implicitly dependent storage x returned as implicitly only:
+                  (abst1)x
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/cast2.c b/test/cast2.c
new file mode 100644
index 0000000..0b177e9
--- /dev/null
+++ b/test/cast2.c
@@ -0,0 +1,26 @@
+typedef /*@abstract@*/ int *abst1;
+typedef /*@abstract@*/ int abst2;
+
+/*@access abst1@*/
+/*@access abst2@*/
+
+abst1 f1 (int *x)
+{
+  return x; /* 1. Function returns reference to parameter x,
+	       2. Implicitly temp storage x returned as implicitly only: x */
+}
+
+abst1 f2 (/*@exposed@*/ int *x)
+{
+  return (abst1) x; /* 3. Implicitly dependent storage x returned as implicitly only */
+}
+
+abst2 g1 (int x)
+{
+  return x;
+}
+
+abst2 g2 (int x)
+{
+  return (abst2) x;
+}
diff --git a/test/charlit.c b/test/charlit.c
new file mode 100644
index 0000000..f930f92
--- /dev/null
+++ b/test/charlit.c
@@ -0,0 +1,12 @@
+int f (void)
+{
+  int x = 'a';
+  double z = 3;
+
+  x = x + 'c' + 2 + z;
+
+  return 'a';
+}
+
+short s[] = { 0, -1 } ;
+unsigned u = -3;
diff --git a/test/charlit.expect b/test/charlit.expect
new file mode 100644
index 0000000..8bf01d4
--- /dev/null
+++ b/test/charlit.expect
@@ -0,0 +1,31 @@
+
+charlit.c: (in function f)
+charlit.c:3:11: Variable x initialized to type char, expects int: 'a'
+  A character constant is used as an int. Use +charintliteral to allow
+  character constants to be used as ints.  (This is safe since the actual type
+  of a char constant is int.)
+charlit.c:6:7: Incompatible types for + (int, char): x + 'c'
+charlit.c:8:10: Return value type char does not match declared type int: 'a'
+charlit.c:12:14: Variable u initialized to type int, expects unsigned int: -3
+  To ignore signs in type comparisons use +ignoresigns
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+charlit.c: (in function f)
+charlit.c:3:11: Variable x initialized to type char, expects int: 'a'
+  A character constant is used as an int. Use +charintliteral to allow
+  character constants to be used as ints.  (This is safe since the actual type
+  of a char constant is int.)
+charlit.c:4:14: Variable z initialized to type int, expects double: 3
+  An int literal is used as any numeric type (including float and long long).
+  Use +numliteral to allow int literals to be used as any numeric type.
+charlit.c:6:7: Incompatible types for + (int, char): x + 'c'
+charlit.c:8:10: Return value type char does not match declared type int: 'a'
+charlit.c:11:18: Initial value of s[1] is type int, expects short int: -1
+  To ignore type qualifiers in type comparisons use +ignorequals.
+charlit.c:12:14: Variable u initialized to type int, expects unsigned int: -3
+  To ignore signs in type comparisons use +ignoresigns
+
+Finished LCLint checking --- 6 code errors found, expected 5
+
+Finished LCLint checking --- no code errors found
diff --git a/test/charlit.out b/test/charlit.out
new file mode 100644
index 0000000..8bf01d4
--- /dev/null
+++ b/test/charlit.out
@@ -0,0 +1,31 @@
+
+charlit.c: (in function f)
+charlit.c:3:11: Variable x initialized to type char, expects int: 'a'
+  A character constant is used as an int. Use +charintliteral to allow
+  character constants to be used as ints.  (This is safe since the actual type
+  of a char constant is int.)
+charlit.c:6:7: Incompatible types for + (int, char): x + 'c'
+charlit.c:8:10: Return value type char does not match declared type int: 'a'
+charlit.c:12:14: Variable u initialized to type int, expects unsigned int: -3
+  To ignore signs in type comparisons use +ignoresigns
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+charlit.c: (in function f)
+charlit.c:3:11: Variable x initialized to type char, expects int: 'a'
+  A character constant is used as an int. Use +charintliteral to allow
+  character constants to be used as ints.  (This is safe since the actual type
+  of a char constant is int.)
+charlit.c:4:14: Variable z initialized to type int, expects double: 3
+  An int literal is used as any numeric type (including float and long long).
+  Use +numliteral to allow int literals to be used as any numeric type.
+charlit.c:6:7: Incompatible types for + (int, char): x + 'c'
+charlit.c:8:10: Return value type char does not match declared type int: 'a'
+charlit.c:11:18: Initial value of s[1] is type int, expects short int: -1
+  To ignore type qualifiers in type comparisons use +ignorequals.
+charlit.c:12:14: Variable u initialized to type int, expects unsigned int: -3
+  To ignore signs in type comparisons use +ignoresigns
+
+Finished LCLint checking --- 6 code errors found, expected 5
+
+Finished LCLint checking --- no code errors found
diff --git a/test/clauses.c b/test/clauses.c
new file mode 100644
index 0000000..d52dcaa
--- /dev/null
+++ b/test/clauses.c
@@ -0,0 +1,24 @@
+int f(/*@only@*/ int *x, /*@only@*/ int *y, /*@only@*/ int *z, /*@only@*/ int *z2)
+{
+  if (3 > 4)
+    {
+      free (x);
+    } /* 1. Variable x is released in true branch, but live in continuation. */
+
+  while (3 < 4)
+    {
+      free (y);
+    } /* 2. Variable y is released in while body, but live if loop is not taken. */
+
+  if (3 > 4)
+    {
+      free (z);
+    }
+  else
+    {
+      free (z2);
+    } /* 3. Variable z2 is released in false branch, but live in true branch. */
+      /* 4. Variable z is released in true branch, but live in false branch. */
+  return 3;
+}
+
diff --git a/test/clauses.expect b/test/clauses.expect
new file mode 100644
index 0000000..0177ee6
--- /dev/null
+++ b/test/clauses.expect
@@ -0,0 +1,40 @@
+
+clauses.c: (in function f)
+clauses.c:6:5: Variable x is released in true branch, but live in continuation.
+   clauses.c:5:13: Storage x is released
+clauses.c:11:5: Variable y is released in while body, but live if loop is not
+                   taken.
+   clauses.c:10:13: Storage y is released
+clauses.c:20:5: Variable z2 is released in false branch, but live in true
+                   branch.
+   clauses.c:19:13: Storage z2 is released
+clauses.c:20:5: Variable z is released in true branch, but live in false
+                   branch.
+   clauses.c:15:13: Storage z is released
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+clauses3.c: (in function h)
+clauses3.c:48:5: Storage x->x is released in one path, but live in another.
+   clauses3.c:46:10: Storage x->x is released
+clauses3.c: (in function m)
+clauses3.c:61:5: Storage x->x is released in one path, but live in another.
+   clauses3.c:60:13: Storage x->x is released
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+Warning: selecting unix library.  Unix library is ad hoc addition to POSIX
+library.  Recommend use +posixlib to select POSIX library instead. Use
+-warnunixlib to suppress this message.
+clauses3.c: (in function h)
+clauses3.c:48:5: Storage x->x is released in one path, but live in another.
+   clauses3.c:46:10: Storage x->x is released
+clauses3.c: (in function m)
+clauses3.c:60:13: Possibly null storage x->x passed as non-null param:
+                     free (x->x)
+clauses3.c:61:5: Storage x->x is released in one path, but live in another.
+   clauses3.c:60:13: Storage x->x is released
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/clauses.out b/test/clauses.out
new file mode 100644
index 0000000..0177ee6
--- /dev/null
+++ b/test/clauses.out
@@ -0,0 +1,40 @@
+
+clauses.c: (in function f)
+clauses.c:6:5: Variable x is released in true branch, but live in continuation.
+   clauses.c:5:13: Storage x is released
+clauses.c:11:5: Variable y is released in while body, but live if loop is not
+                   taken.
+   clauses.c:10:13: Storage y is released
+clauses.c:20:5: Variable z2 is released in false branch, but live in true
+                   branch.
+   clauses.c:19:13: Storage z2 is released
+clauses.c:20:5: Variable z is released in true branch, but live in false
+                   branch.
+   clauses.c:15:13: Storage z is released
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+clauses3.c: (in function h)
+clauses3.c:48:5: Storage x->x is released in one path, but live in another.
+   clauses3.c:46:10: Storage x->x is released
+clauses3.c: (in function m)
+clauses3.c:61:5: Storage x->x is released in one path, but live in another.
+   clauses3.c:60:13: Storage x->x is released
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+Warning: selecting unix library.  Unix library is ad hoc addition to POSIX
+library.  Recommend use +posixlib to select POSIX library instead. Use
+-warnunixlib to suppress this message.
+clauses3.c: (in function h)
+clauses3.c:48:5: Storage x->x is released in one path, but live in another.
+   clauses3.c:46:10: Storage x->x is released
+clauses3.c: (in function m)
+clauses3.c:60:13: Possibly null storage x->x passed as non-null param:
+                     free (x->x)
+clauses3.c:61:5: Storage x->x is released in one path, but live in another.
+   clauses3.c:60:13: Storage x->x is released
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/clauses2.c b/test/clauses2.c
new file mode 100644
index 0000000..92c80f8
--- /dev/null
+++ b/test/clauses2.c
@@ -0,0 +1,19 @@
+extern /*@only@*/ int *new_ip (void);
+
+/*@only@*/ int *f(void)
+{
+  int *x = new_ip ();
+  int *y;
+
+  if (3 > 4)
+    {
+      y = x;
+    }
+  else
+    {
+      free (x);
+      y = new_ip ();
+    }
+
+  return y;
+}
diff --git a/test/clauses3.c b/test/clauses3.c
new file mode 100644
index 0000000..b4d92e9
--- /dev/null
+++ b/test/clauses3.c
@@ -0,0 +1,69 @@
+typedef struct { /*@null@*/ /*@only@*/ int *x; } *st;
+
+void f(/*@only@*/ st x)
+{
+  if (x->x != NULL)
+    {
+      free (x->x);
+    } ;
+
+  free (x);
+}
+
+void f2 (/*@only@*/ st x)
+{
+  if (x->x != NULL)
+    {
+      free (x->x);
+    }
+  else
+    {
+      ;
+    }
+
+  free (x);
+}
+
+void g (/*@only@*/ st x)
+{
+  if (x->x == NULL)
+    {
+    }
+  else
+    {
+      free (x->x);
+    }
+
+  free (x);
+}
+
+void h(/*@only@*/ st x)
+{
+  if (7 > 3)
+    {
+      if (x->x != NULL)
+	{
+	  free (x->x); 
+	}
+    } /* 1. Storage x->x is released in one path, but live in another. */
+
+  free (x);
+}
+
+void m(/*@only@*/ st x)
+{
+  if (7 > 3)
+    {
+    }
+  else
+    {
+      free (x->x); /* 2. Possibly null storage passed as non-null param: x->x */
+    } /* 3. Storage x->x is released in one path, but live in another. */
+
+  free (x);
+}
+  
+
+
+
+
diff --git a/test/commentchar.c b/test/commentchar.c
new file mode 100644
index 0000000..a9face3
--- /dev/null
+++ b/test/commentchar.c
@@ -0,0 +1,15 @@
+int f (void) /*#modifies x#*/;
+
+/*#-commentchar %#*/
+
+/*@ignore@*/ 
+int x = 'c'; /* not ignored */
+/*@end@*/
+
+/*%ignore%*/ 
+int x = 'c'; /* is ignored */
+/*%end%*/
+
+/*%-commentchar @%*/
+/*@-commentchar5*/ 
+/*@=commentchar*/ 
diff --git a/test/commentchar.expect b/test/commentchar.expect
new file mode 100644
index 0000000..caf9346
--- /dev/null
+++ b/test/commentchar.expect
@@ -0,0 +1,17 @@
+
+commentchar.c:14:1: Syntactic commentchar comment is not followed by a
+                       whitespace character: 5
+commentchar.c:15:1: Cannot restore commentchar
+commentchar.c:10:5: Variable x redefined
+   commentchar.c:6:5: Previous definition of x
+commentchar.c:10:9: Variable x initialized to type char, expects int: 'c'
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+commentchar.c:14:1: Syntactic commentchar comment is not followed by a
+                       whitespace character: 5
+commentchar.c:15:1: Cannot restore commentchar
+commentchar.c:1:26: Unrecognized identifier in modifies comment: x
+commentchar.c:6:9: Variable x initialized to type char, expects int: 'c'
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/commentchar.out b/test/commentchar.out
new file mode 100644
index 0000000..caf9346
--- /dev/null
+++ b/test/commentchar.out
@@ -0,0 +1,17 @@
+
+commentchar.c:14:1: Syntactic commentchar comment is not followed by a
+                       whitespace character: 5
+commentchar.c:15:1: Cannot restore commentchar
+commentchar.c:10:5: Variable x redefined
+   commentchar.c:6:5: Previous definition of x
+commentchar.c:10:9: Variable x initialized to type char, expects int: 'c'
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+commentchar.c:14:1: Syntactic commentchar comment is not followed by a
+                       whitespace character: 5
+commentchar.c:15:1: Cannot restore commentchar
+commentchar.c:1:26: Unrecognized identifier in modifies comment: x
+commentchar.c:6:9: Variable x initialized to type char, expects int: 'c'
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/commentcmd.c b/test/commentcmd.c
new file mode 100644
index 0000000..0aa500a
--- /dev/null
+++ b/test/commentcmd.c
@@ -0,0 +1,51 @@
+typedef int abst1, abst2; /* 1, 2. Mutable abstract type abst1 declared without pointer ... */
+typedef int abst3; /* 3. Mutable abstract type abst3 declared without pointer ... */
+
+int main (void)
+{
+  int i = 1;
+  abst1 a1; abst2 a2; abst3 a3;
+
+   /*@access abst1,abst3*/
+/* 10 */ a1 = (abst1)i; /* ok */
+         a2 = (abst2)i; /* 4. Cast to abstract type abst2: (abst2)i */
+         a3 = (abst3)i; /* ok */
+
+   /*@noaccess abst1,abst3*/
+
+/* 16 */ a1 = (abst1)i; /* 5. Cast to abstract type abst1: (abst1)i */
+         a2 = (abst2)i; /* 6. Cast to abstract type abst2: (abst2)i */
+         a3 = (abst3)i; /* 7. Cast to abstract type abst3: (abst3)i */
+
+   /*@access abst2*/
+
+/* 22 */ a1 = (abst1)i; /* 8. Cast to abstract type abst1: (abst1)i */
+         a2 = (abst2)i; /* ok */
+         a3 = (abst3)i; /* 9. Cast to abstract type abst3: (abst3)i */
+
+   /*@access abst1,abst3*/
+
+/* 28 */ a1 = (abst1)i; /* ok */
+         a2 = (abst2)i; /* ok */ 
+         a3 = (abst3)i; /* ok */
+
+   /*@noaccess abst1*/
+
+/* 34 */ a1 = (abst1)i; /* 10. Cast to abstract type abst1: (abst1)i */
+         a2 = (abst2)i; /* ok */
+         a3 = (abst3)i; /* ok */
+
+   /*@noaccess abst2*/
+
+/* 40 */ a1 = (abst1)i; /* 11. Cast to abstract type abst1: (abst1)i */
+         a2 = (abst2)i; /* 12. Cast to abstract type abst2: (abst2)i */
+         a3 = (abst3)i; /* ok */
+
+   /*@noaccess abst3*/
+
+/* 46 */ a1 = (abst1)i; /* 13. Cast to abstract type abst1: (abst1)i */
+         a2 = (abst2)i; /* 14. Cast to abstract type abst2: (abst2)i */
+         a3 = (abst3)i; /* 15. Cast to abstract type abst3: (abst3)i */
+
+  return 3;
+}
diff --git a/test/compdestroy.c b/test/compdestroy.c
new file mode 100644
index 0000000..779798f
--- /dev/null
+++ b/test/compdestroy.c
@@ -0,0 +1,28 @@
+typedef /*@only@*/ int *oip;
+
+typedef /*@abstract@*/ struct
+{
+  oip *ips;
+  int size;
+} *sip;
+
+void sip_free (/*@only@*/ sip x)
+{
+  int i;
+
+  for (i = 0; i < x->size; i++)
+    {
+      free (x->ips[i]);
+      free (x->ips[i]);
+    }
+
+  free (x->ips);
+  free (x);
+}
+
+void sip_free2 (/*@only@*/ sip x)
+{
+  free (x->ips); /* 1. Only storage *(x->ips) (type oip) derived from released */
+  free (x);
+}
+
diff --git a/test/compdestroy.expect b/test/compdestroy.expect
new file mode 100644
index 0000000..1583694
--- /dev/null
+++ b/test/compdestroy.expect
@@ -0,0 +1,39 @@
+
+compdestroy.c: (in function sip_free2)
+compdestroy.c:25:9: Only storage *(x->ips) (type oip) derived from released
+                       storage is not released (memory leak): x->ips
+
+Finished LCLint checking --- 1 code error found, as expected
+
+compdestroy.c: (in function sip_free)
+compdestroy.c:19:9: Only storage x->ips[] (type oip) derived from released
+                       storage may not have been released: x->ips
+compdestroy.c: (in function sip_free2)
+compdestroy.c:25:9: Only storage *(x->ips) (type oip) derived from released
+                       storage is not released (memory leak): x->ips
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+compdestroy.c: (in function sip_free)
+compdestroy.c:16:13: Possibly dead storage x->ips[] passed as out parameter:
+                        x->ips[i]
+   compdestroy.c:15:13: Storage x->ips[] becomes probably dead
+compdestroy.c:19:9: Only storage x->ips[] (type oip) derived from released
+                       storage may not have been released: x->ips
+compdestroy.c: (in function sip_free2)
+compdestroy.c:25:9: Only storage *(x->ips) (type oip) derived from released
+                       storage is not released (memory leak): x->ips
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+compdestroy.c: (in function sip_free)
+compdestroy.c:16:13: Possibly dead storage x->ips[] passed as out parameter:
+                        x->ips[i]
+   compdestroy.c:15:13: Storage x->ips[] becomes probably dead
+compdestroy.c:19:9: Only storage x->ips[] (type oip) derived from released
+                       storage may not have been released: x->ips
+compdestroy.c: (in function sip_free2)
+compdestroy.c:25:9: Only storage *(x->ips) (type oip) derived from released
+                       storage is not released (memory leak): x->ips
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/compdestroy.out b/test/compdestroy.out
new file mode 100644
index 0000000..1583694
--- /dev/null
+++ b/test/compdestroy.out
@@ -0,0 +1,39 @@
+
+compdestroy.c: (in function sip_free2)
+compdestroy.c:25:9: Only storage *(x->ips) (type oip) derived from released
+                       storage is not released (memory leak): x->ips
+
+Finished LCLint checking --- 1 code error found, as expected
+
+compdestroy.c: (in function sip_free)
+compdestroy.c:19:9: Only storage x->ips[] (type oip) derived from released
+                       storage may not have been released: x->ips
+compdestroy.c: (in function sip_free2)
+compdestroy.c:25:9: Only storage *(x->ips) (type oip) derived from released
+                       storage is not released (memory leak): x->ips
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+compdestroy.c: (in function sip_free)
+compdestroy.c:16:13: Possibly dead storage x->ips[] passed as out parameter:
+                        x->ips[i]
+   compdestroy.c:15:13: Storage x->ips[] becomes probably dead
+compdestroy.c:19:9: Only storage x->ips[] (type oip) derived from released
+                       storage may not have been released: x->ips
+compdestroy.c: (in function sip_free2)
+compdestroy.c:25:9: Only storage *(x->ips) (type oip) derived from released
+                       storage is not released (memory leak): x->ips
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+compdestroy.c: (in function sip_free)
+compdestroy.c:16:13: Possibly dead storage x->ips[] passed as out parameter:
+                        x->ips[i]
+   compdestroy.c:15:13: Storage x->ips[] becomes probably dead
+compdestroy.c:19:9: Only storage x->ips[] (type oip) derived from released
+                       storage may not have been released: x->ips
+compdestroy.c: (in function sip_free2)
+compdestroy.c:25:9: Only storage *(x->ips) (type oip) derived from released
+                       storage is not released (memory leak): x->ips
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/controldepth.c b/test/controldepth.c
new file mode 100644
index 0000000..9f29001
--- /dev/null
+++ b/test/controldepth.c
@@ -0,0 +1,26 @@
+void f (int x, int y)
+{
+  if (x > y)
+    { /* depth = 1 */
+      { /* still, depth = 1 */
+	while (x > 3)
+	  /* depth = 2 */
+	  if (y == 2) /* depth = 3 */
+	    x++; 
+	
+	if (y == 2)
+	  x++; /* depth = 2 */
+	else 
+	  { /* depth = 2 */
+	    if (y == 4) /* depth = 3 */
+	      {
+		x++; 
+	      }
+	    else
+	      {
+		y++; 
+	      }
+	  }
+      }
+    }
+}
diff --git a/test/controldepth.expect b/test/controldepth.expect
new file mode 100644
index 0000000..c1cae02
--- /dev/null
+++ b/test/controldepth.expect
@@ -0,0 +1,16 @@
+
+controldepth.c: (in function f)
+controldepth.c:8:15: Maximum control nesting depth (2) exceeded
+  Maximum number of control levels exceeded. (-controlnestdepth will suppress
+  message)
+controldepth.c:15:17: Maximum control nesting depth (2) exceeded
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+controldepth.c: (in function f)
+controldepth.c:6:15: Maximum control nesting depth (1) exceeded
+  Maximum number of control levels exceeded. (-controlnestdepth will suppress
+  message)
+controldepth.c:11:13: Maximum control nesting depth (1) exceeded
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/controldepth.out b/test/controldepth.out
new file mode 100644
index 0000000..c1cae02
--- /dev/null
+++ b/test/controldepth.out
@@ -0,0 +1,16 @@
+
+controldepth.c: (in function f)
+controldepth.c:8:15: Maximum control nesting depth (2) exceeded
+  Maximum number of control levels exceeded. (-controlnestdepth will suppress
+  message)
+controldepth.c:15:17: Maximum control nesting depth (2) exceeded
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+controldepth.c: (in function f)
+controldepth.c:6:15: Maximum control nesting depth (1) exceeded
+  Maximum number of control levels exceeded. (-controlnestdepth will suppress
+  message)
+controldepth.c:11:13: Maximum control nesting depth (1) exceeded
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/csyntax.c b/test/csyntax.c
new file mode 100644
index 0000000..90d88d0
--- /dev/null
+++ b/test/csyntax.c
@@ -0,0 +1,35 @@
+enum opcode { ONE } ;
+struct sopcode { int x; } ;
+union  uopcode { int x; } ;
+
+int f()
+{
+  int opcode = 1;
+  int sopcode = 2;
+  int uopcode = 3; 
+
+  return opcode + sopcode + uopcode;
+}
+
+struct stat_desc 
+{
+  short opcode;
+  enum opcode x;
+} ;
+
+int main(register int x)
+{
+  return x;
+}
+
+extern unsigned x();
+extern unsigned int y;
+
+typedef char *cstring;
+extern cstring add_extension(cstring s, const cstring suffix);
+
+typedef int filename;
+extern cstring filename;
+
+extern int parseOpLine (cstring filename, cstring line);
+
diff --git a/test/csyntax.expect b/test/csyntax.expect
new file mode 100644
index 0000000..2dca99e
--- /dev/null
+++ b/test/csyntax.expect
@@ -0,0 +1,18 @@
+csyntax.c:20:5: Function main declared with 1 arg, should have 2 (int argc,
+                   char *argv[])
+csyntax2.c: (in function mapping_create)
+csyntax2.c:13:3: Assignment of size_t to int: x = sizeof((t))
+csyntax2.c:14:3: Assignment of size_t to int: x = sizeof(*t)
+csyntax3.c:3:4: Function main declared to return a1, should return int
+csyntax13.c: (in function f)
+csyntax13.c:9:11: Variable isrs shadows outer declaration
+   csyntax13.c:7:9: Previous definition of isrs: isr_t
+csyntax16.c: (in function main)
+csyntax16.c:18:11: Variable getbuiltout used before definition
+csyntax16.c: (in function getbuiltout)
+csyntax16.c:43:14: Variable qpolygon used before definition
+csyntax17.c: (in function f)
+csyntax17.c:11:11: Variable x initialized to type EID_UNIT_NUM, expects int:
+                      (EID_UNIT_NUM)3
+csyntax17.c:12:2: Path with no return in function declared to return int
+csyntax17.c:11:7: Variable x declared but not used
diff --git a/test/csyntax.out b/test/csyntax.out
new file mode 100644
index 0000000..2dca99e
--- /dev/null
+++ b/test/csyntax.out
@@ -0,0 +1,18 @@
+csyntax.c:20:5: Function main declared with 1 arg, should have 2 (int argc,
+                   char *argv[])
+csyntax2.c: (in function mapping_create)
+csyntax2.c:13:3: Assignment of size_t to int: x = sizeof((t))
+csyntax2.c:14:3: Assignment of size_t to int: x = sizeof(*t)
+csyntax3.c:3:4: Function main declared to return a1, should return int
+csyntax13.c: (in function f)
+csyntax13.c:9:11: Variable isrs shadows outer declaration
+   csyntax13.c:7:9: Previous definition of isrs: isr_t
+csyntax16.c: (in function main)
+csyntax16.c:18:11: Variable getbuiltout used before definition
+csyntax16.c: (in function getbuiltout)
+csyntax16.c:43:14: Variable qpolygon used before definition
+csyntax17.c: (in function f)
+csyntax17.c:11:11: Variable x initialized to type EID_UNIT_NUM, expects int:
+                      (EID_UNIT_NUM)3
+csyntax17.c:12:2: Path with no return in function declared to return int
+csyntax17.c:11:7: Variable x declared but not used
diff --git a/test/csyntax10.c b/test/csyntax10.c
new file mode 100644
index 0000000..b70baad
--- /dev/null
+++ b/test/csyntax10.c
@@ -0,0 +1,20 @@
+typedef int tint;
+
+int ffunc(tint tint)
+{
+  tint = 3;
+  return tint;
+}
+
+int gfunc()
+{
+  tint tint;
+
+  tint = 3;
+  return tint;
+}
+
+struct x
+{
+  tint tint;
+} ;
diff --git a/test/csyntax11.c b/test/csyntax11.c
new file mode 100644
index 0000000..ab2ba09
--- /dev/null
+++ b/test/csyntax11.c
@@ -0,0 +1,7 @@
+typedef enum { eone } one;
+
+typedef struct
+{
+  int x;
+  one onet;
+} emp;
diff --git a/test/csyntax12.c b/test/csyntax12.c
new file mode 100644
index 0000000..2762dfe
--- /dev/null
+++ b/test/csyntax12.c
@@ -0,0 +1,11 @@
+typedef int gender;
+
+int f()
+{
+  static char *gender[] = { "male", "female", "?" };
+
+  if (*gender[1] == *gender[2])
+    return 3;
+  else
+    return 5;
+}
diff --git a/test/csyntax13.c b/test/csyntax13.c
new file mode 100644
index 0000000..9db1bdc
--- /dev/null
+++ b/test/csyntax13.c
@@ -0,0 +1,12 @@
+/*@-varuse*/
+typedef int isr_t;
+typedef int isrs;
+
+int f()
+{
+  isr_t isrs;
+  {
+    isr_t isrs[3];
+  }
+  return 3;
+}
diff --git a/test/csyntax14.c b/test/csyntax14.c
new file mode 100644
index 0000000..bf496e3
--- /dev/null
+++ b/test/csyntax14.c
@@ -0,0 +1,12 @@
+typedef int atom;
+
+typedef struct atomrep {
+        atom atom;
+        struct atomrep *link;
+} atomrep;
+
+int f()
+{
+/*@-varuse -noreturn*/
+  atomrep * x = (atomrep *) 0;
+}
diff --git a/test/csyntax15.c b/test/csyntax15.c
new file mode 100644
index 0000000..5b9b2ac
--- /dev/null
+++ b/test/csyntax15.c
@@ -0,0 +1,11 @@
+int (f)(int x);
+
+int g()
+{
+  return f(3);
+}
+
+int f(int x)
+{
+  return x;
+}
diff --git a/test/csyntax16.c b/test/csyntax16.c
new file mode 100644
index 0000000..1959a66
--- /dev/null
+++ b/test/csyntax16.c
@@ -0,0 +1,48 @@
+/*
+ * lclfoo.c - test lclint
+ */
+
+#include 
+#include 
+
+int main(int argc, char *argv[])
+{
+   int i = 0, num;
+   float pet = 0.0;
+   int (*qfun)(float *);
+
+   int (*getbuiltout(int))(float *);
+
+   num = (argc > 1) ? atoi(argv[1]) : 0;
+
+   qfun = getbuiltout(num);
+
+   if (qfun != NULL) {
+      i = qfun(&pet);
+      printf("number in float %f and returns %d\n", pet, i);
+      exit(EXIT_SUCCESS);
+   } else exit(EXIT_FAILURE);
+}
+
+/*
+ * should be a function (of one arg - int) returning
+ * a pointer to a function (of one arg - float *) returning int
+ * 
+ * From: cdecl
+ * cdecl> declare getbuiltout as function (verbose as int) returning
+ *        pointer to function (pobj as pointer to float) returning int
+ * int (*getbuiltout(int verbose))(float *pobj) { }
+ */
+
+int (*getbuiltout(int verbose))(float *)
+{
+   int qpolygon(float *);
+
+   switch(verbose) {
+    case 1:
+      return qpolygon;
+    default:
+      return NULL;
+   }
+}
+
diff --git a/test/csyntax17.c b/test/csyntax17.c
new file mode 100644
index 0000000..0cb4588
--- /dev/null
+++ b/test/csyntax17.c
@@ -0,0 +1,13 @@
+typedef char SBYTE;
+typedef SBYTE EID_UNIT_NUM;
+
+struct qry_rsp   
+{
+  int rsp[(EID_UNIT_NUM)16];
+};
+
+int f (void)
+{
+  int x = (EID_UNIT_NUM) 3;
+}
+
diff --git a/test/csyntax2.c b/test/csyntax2.c
new file mode 100644
index 0000000..cbc1925
--- /dev/null
+++ b/test/csyntax2.c
@@ -0,0 +1,17 @@
+typedef int mapping;
+typedef int mappair;
+
+int smalloc();
+
+mapping *
+mapping_create (void)
+{
+  mapping **t;
+  int x;
+
+  t = (mapping **) smalloc (sizeof (mapping *));
+  x = sizeof(t);
+  x = sizeof *t;
+  return *t;
+}
+
diff --git a/test/csyntax3.c b/test/csyntax3.c
new file mode 100644
index 0000000..02bcaa3
--- /dev/null
+++ b/test/csyntax3.c
@@ -0,0 +1,12 @@
+typedef int a1;
+
+a1 main()
+{
+  int x;
+  a1 a1;
+  
+  x = 3;
+  a1 = x;
+  return a1;
+}
+
diff --git a/test/csyntax4.c b/test/csyntax4.c
new file mode 100644
index 0000000..9e26e0d
--- /dev/null
+++ b/test/csyntax4.c
@@ -0,0 +1,12 @@
+/* has parse errors in gcc */
+typedef char *cstring;
+typedef char *filename;
+
+int f(cstring filename, int x); 
+
+cstring filename;
+
+
+
+
+
diff --git a/test/csyntax5.c b/test/csyntax5.c
new file mode 100644
index 0000000..c5e3db2
--- /dev/null
+++ b/test/csyntax5.c
@@ -0,0 +1,7 @@
+typedef int fd_mask;
+
+typedef	struct fd_set {
+  fd_mask fds_bits[sizeof(fd_mask)];
+} fd_set;
+
+
diff --git a/test/csyntax6.c b/test/csyntax6.c
new file mode 100644
index 0000000..1be9dca
--- /dev/null
+++ b/test/csyntax6.c
@@ -0,0 +1 @@
+int f(char *, int);
diff --git a/test/csyntax7.c b/test/csyntax7.c
new file mode 100644
index 0000000..b007fcf
--- /dev/null
+++ b/test/csyntax7.c
@@ -0,0 +1,3 @@
+typedef int tint;
+
+const tint volatile x;
diff --git a/test/csyntax8.c b/test/csyntax8.c
new file mode 100644
index 0000000..19d25cc
--- /dev/null
+++ b/test/csyntax8.c
@@ -0,0 +1,8 @@
+int x;
+
+char y;
+short int z;
+int short w;
+
+int f(int x, int y);
+
diff --git a/test/csyntax9.c b/test/csyntax9.c
new file mode 100644
index 0000000..4c93218
--- /dev/null
+++ b/test/csyntax9.c
@@ -0,0 +1,2 @@
+typedef char *cstring;
+extern cstring add_extension(cstring s, const cstring suffix, cstring cstring);
diff --git a/test/czechnames.c b/test/czechnames.c
new file mode 100644
index 0000000..adc3797
--- /dev/null
+++ b/test/czechnames.c
@@ -0,0 +1,38 @@
+# include "bool.h"
+# include "pivo.h"
+
+int pivo_pyet;
+int michelob_light; /* bad */
+pivo budlight;
+
+/*@constant int pivo_devenast;@*/
+# define pivo_devenast 12
+
+bool pivo_yedno (pivo p)
+{
+  /* pivo is accessible if +accessczech */
+
+  return (p == 1);
+}
+
+/* okay, since no types are accessible */
+int samAdams (int x)
+{
+  return x;
+}
+
+/*@access pivo@*/
+
+int budweiser (int x) /* definitely an error! */
+{
+  return x;
+}
+
+pivo pivo_budvar (int x) /* that's better! */
+{
+  return x;
+}
+  
+
+
+
diff --git a/test/czechnames.expect b/test/czechnames.expect
new file mode 100644
index 0000000..3fe4ae9
--- /dev/null
+++ b/test/czechnames.expect
@@ -0,0 +1,41 @@
+
+Finished LCLint checking --- no code errors found
+
+czechnames.c:5:5: Variable michelob_light name violates Czech naming
+    convention.  Czech prefix michelob is not the name of a type.
+  Variable name is not consistent with Czech naming convention. (-czechvars
+  will suppress message)
+czechnames.c:26:5: Function budweiser name is not consistent with Czech naming
+                      convention.  Accessible types: pivo
+  Function or iterator name is not consistent with Czech naming convention.
+  (-czechfcns will suppress message)
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+czechnames.c:26:5: Function budweiser name is not consistent with Czech naming
+                      convention.  Accessible types: pivo
+  Function or iterator name is not consistent with Czech naming convention.
+  (-czechfcns will suppress message)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+czechnames.c:4:5: Variable pivo_pyet name violates Czech naming convention.
+    Czech prefix pivo names an abstract type that is not accessible.
+  Use +accessczech to allow access to type  in functions named _.
+czechnames.c:5:5: Variable michelob_light name violates Czech naming
+    convention.  Czech prefix michelob is not the name of a type.
+czechnames.c:8:17: Constant pivo_devenast name violates Czech naming
+    convention. Czech prefix pivo names an abstract type that is not
+    accessible.
+  Use +accessczech to allow access to type  in functions named _.
+czechnames.c:11:6: Function pivo_yedno name violates Czech naming convention.
+    Czech prefix pivo names an abstract type that is not accessible.
+  Use +accessczech to allow access to type  in functions named _.
+czechnames.c: (in function pivo_yedno)
+czechnames.c:15:11: Left operand of == is abstract type (pivo): p == 1
+  An abstraction barrier is broken. If necessary, use /*@access @*/ to
+  allow access to an abstract type. (-abstract will suppress message)
+czechnames.c:26:5: Function budweiser name is not consistent with Czech naming
+                      convention.  Accessible types: pivo
+
+Finished LCLint checking --- 6 code errors found, as expected
diff --git a/test/czechnames.out b/test/czechnames.out
new file mode 100644
index 0000000..3fe4ae9
--- /dev/null
+++ b/test/czechnames.out
@@ -0,0 +1,41 @@
+
+Finished LCLint checking --- no code errors found
+
+czechnames.c:5:5: Variable michelob_light name violates Czech naming
+    convention.  Czech prefix michelob is not the name of a type.
+  Variable name is not consistent with Czech naming convention. (-czechvars
+  will suppress message)
+czechnames.c:26:5: Function budweiser name is not consistent with Czech naming
+                      convention.  Accessible types: pivo
+  Function or iterator name is not consistent with Czech naming convention.
+  (-czechfcns will suppress message)
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+czechnames.c:26:5: Function budweiser name is not consistent with Czech naming
+                      convention.  Accessible types: pivo
+  Function or iterator name is not consistent with Czech naming convention.
+  (-czechfcns will suppress message)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+czechnames.c:4:5: Variable pivo_pyet name violates Czech naming convention.
+    Czech prefix pivo names an abstract type that is not accessible.
+  Use +accessczech to allow access to type  in functions named _.
+czechnames.c:5:5: Variable michelob_light name violates Czech naming
+    convention.  Czech prefix michelob is not the name of a type.
+czechnames.c:8:17: Constant pivo_devenast name violates Czech naming
+    convention. Czech prefix pivo names an abstract type that is not
+    accessible.
+  Use +accessczech to allow access to type  in functions named _.
+czechnames.c:11:6: Function pivo_yedno name violates Czech naming convention.
+    Czech prefix pivo names an abstract type that is not accessible.
+  Use +accessczech to allow access to type  in functions named _.
+czechnames.c: (in function pivo_yedno)
+czechnames.c:15:11: Left operand of == is abstract type (pivo): p == 1
+  An abstraction barrier is broken. If necessary, use /*@access @*/ to
+  allow access to an abstract type. (-abstract will suppress message)
+czechnames.c:26:5: Function budweiser name is not consistent with Czech naming
+                      convention.  Accessible types: pivo
+
+Finished LCLint checking --- 6 code errors found, as expected
diff --git a/test/czechoslovaknames.c b/test/czechoslovaknames.c
new file mode 100644
index 0000000..adc3797
--- /dev/null
+++ b/test/czechoslovaknames.c
@@ -0,0 +1,38 @@
+# include "bool.h"
+# include "pivo.h"
+
+int pivo_pyet;
+int michelob_light; /* bad */
+pivo budlight;
+
+/*@constant int pivo_devenast;@*/
+# define pivo_devenast 12
+
+bool pivo_yedno (pivo p)
+{
+  /* pivo is accessible if +accessczech */
+
+  return (p == 1);
+}
+
+/* okay, since no types are accessible */
+int samAdams (int x)
+{
+  return x;
+}
+
+/*@access pivo@*/
+
+int budweiser (int x) /* definitely an error! */
+{
+  return x;
+}
+
+pivo pivo_budvar (int x) /* that's better! */
+{
+  return x;
+}
+  
+
+
+
diff --git a/test/czechoslovaknames.expect b/test/czechoslovaknames.expect
new file mode 100644
index 0000000..ea8ab60
--- /dev/null
+++ b/test/czechoslovaknames.expect
@@ -0,0 +1,25 @@
+
+czechnames.c:26:5: Function budweiser name is not consistent with Czechoslovak
+                      naming convention.
+  Function name is not consistent with Czechoslovak naming convention.
+  (-czechoslovakfcns will suppress message)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+slovaknames.c:32:5: Function budweiser name is not consistent with Czechoslovak
+                       naming convention.
+  Function name is not consistent with Czechoslovak naming convention.
+  (-czechoslovakfcns will suppress message)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+slovaknames.c:5:5: Variable michelobLight name violates Slovak naming
+    convention.  Slovak prefix michelob is not the name of a type.
+  Variable name is not consistent with Slovak naming convention. (-slovakvars
+  will suppress message)
+slovaknames.c:32:5: Function budweiser name is not consistent with Czechoslovak
+                       naming convention.
+  Function name is not consistent with Czechoslovak naming convention.
+  (-czechoslovakfcns will suppress message)
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/czechoslovaknames.out b/test/czechoslovaknames.out
new file mode 100644
index 0000000..ea8ab60
--- /dev/null
+++ b/test/czechoslovaknames.out
@@ -0,0 +1,25 @@
+
+czechnames.c:26:5: Function budweiser name is not consistent with Czechoslovak
+                      naming convention.
+  Function name is not consistent with Czechoslovak naming convention.
+  (-czechoslovakfcns will suppress message)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+slovaknames.c:32:5: Function budweiser name is not consistent with Czechoslovak
+                       naming convention.
+  Function name is not consistent with Czechoslovak naming convention.
+  (-czechoslovakfcns will suppress message)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+slovaknames.c:5:5: Variable michelobLight name violates Slovak naming
+    convention.  Slovak prefix michelob is not the name of a type.
+  Variable name is not consistent with Slovak naming convention. (-slovakvars
+  will suppress message)
+slovaknames.c:32:5: Function budweiser name is not consistent with Czechoslovak
+                       naming convention.
+  Function name is not consistent with Czechoslovak naming convention.
+  (-czechoslovakfcns will suppress message)
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/db1.expect b/test/db1.expect
new file mode 100644
index 0000000..307db06
--- /dev/null
+++ b/test/db1.expect
@@ -0,0 +1,686 @@
+
+< reading spec bool.lcl >
+< reading spec employee.lcl >
+< reading spec eref.lcl >
+< reading spec empset.lcl >
+< reading spec ereftab.lcl >
+< reading spec erc.lcl >
+< reading spec dbase.lcl >
+< preprocessing >
+< checking employee.c >
+employee.c: (in function employee_equal)
+employee.c:24: Function strncmp expects arg 3 to be size_t gets int:
+                  maxEmployeeName
+< checking eref.c >
+< checking empset.c >
+empset.c: (in function empset_insert)
+empset.c:28: Variable er declared but not used
+empset.c: (in function empset_disjointUnion)
+empset.c:85: Undocumented modification of s1 possible from call to
+                erc_iterStart (through alias s2): erc_iterStart(s2)
+empset.c:85: Undocumented modification of s2 possible from call to
+                erc_iterStart: erc_iterStart(s2)
+empset.c: (in function empset_union)
+empset.c:108: Undocumented modification of s2 possible from call to
+                 erc_iterStart (through alias s1): erc_iterStart(s1)
+empset.c:108: Undocumented modification of s1 possible from call to
+                 erc_iterStart: erc_iterStart(s1)
+empset.c: (in function empset_subset)
+empset.c:139: Undocumented modification of s1 possible from call to
+                 erc_iterStart: erc_iterStart(s1)
+empset.c:135: Variable e declared but not used
+< checking ereftab.c >
+ereftab.c: (in function ereftab_lookup)
+ereftab.c:34: Undocumented modification of t possible from call to
+                 erc_iterStart: erc_iterStart(t)
+< checking erc.c >
+erc.c: (in function erc_member)
+erc.c:47: Operands of == are abstract type (eref): tmpc->val == er
+erc.c: (in function erc_delete)
+erc.c:78: Operands of == are abstract type (eref): elem->val == er
+erc.c: (in function erc_sprint)
+erc.c:141: Function malloc expects arg 1 to be size_t gets int:
+              erc_size(c) * (employeePrintSize + 1) + 1
+erc.c:151: Undocumented modification of c possible from call to erc_iterStart:
+              erc_iterStart(c)
+< checking dbase.c >
+dbase.c: (in function query)
+dbase.c:210: Variable er declared but not used
+dbase.c:211: Variable e declared but not used
+< checking drive.c >
+drive.c: (in function main)
+drive.c:123: Return value (type db_status) ignored: hire(e)
+< checking macros bool.h >
+< global checks >
+< cleaning .......... >
+
+Finished LCLint checking --- 16 code errors found, as expected
+
+< reading spec bool.lcl >
+< reading spec employee.lcl >
+< reading spec eref.lcl >
+< reading spec empset.lcl >
+< reading spec ereftab.lcl >
+< reading spec erc.lcl >
+< reading spec dbase.lcl >
+< preprocessing >
+employee.h:2: Name EMPLOYEE_H is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+< more preprocessing . >
+eref.h:2: Name EREF_H is reserved for future ANSI library extensions. Macros
+    beginning with E and a digit or uppercase letter may be added to .
+    (See ANSI, Section 4.13.1)
+< more preprocessing . >
+empset.h:2: Name EMPSET_H is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+< more preprocessing . >
+erc.h:2: Name ERC_H is reserved for future ANSI library extensions. Macros
+    beginning with E and a digit or uppercase letter may be added to .
+    (See ANSI, Section 4.13.1)
+< more preprocessing . >
+ereftab.h:4: Name EREFTAB_H is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+< more preprocessing . >
+< checking employee.c >
+bool.h:20: Modifies list for bool_initMod uses global internal state, not
+              included in globals list.
+   bool.h:20: Declaration of bool_initMod
+employee.c: (in function employee_setName)
+employee.c:11: Body of if statement is not a block: return FALSE
+employee.c:14: Parameter 1 (e->name) to function strcpy is declared unique but
+                  may be aliased externally by parameter 2 (na)
+employee.c: (in function employee_equal)
+employee.c:24: Function strncmp expects arg 3 to be size_t gets int:
+                  maxEmployeeName
+employee.c: (in function employee_sprint)
+employee.c:29: Read-only string literal storage used as initial value for
+                  unqualified storage: gender[0] = "male"
+employee.c:29: Read-only string literal storage used as initial value for
+                  unqualified storage: gender[1] = "female"
+employee.c:29: Read-only string literal storage used as initial value for
+                  unqualified storage: gender[2] = "?"
+employee.c:30: Read-only string literal storage used as initial value for
+                  unqualified storage: jobs[0] = "manager"
+employee.c:30: Read-only string literal storage used as initial value for
+                  unqualified storage: jobs[1] = "non-manager"
+employee.c:30: Read-only string literal storage used as initial value for
+                  unqualified storage: jobs[2] = "?"
+employee.c:33: Array fetch using non-integer, gender: gender[e.gen]
+employee.c:33: Array fetch using non-integer, job: jobs[e.j]
+employee.h: (in macro employee_initMod)
+employee.h:10: Called procedure bool_initMod may access internal state, but
+                  globals list does not include globals internalState
+employee.h:10: Undocumented modification of internal state possible from call
+                  to bool_initMod: bool_initMod()
+< checking eref.c >
+eref.h:9: Constant exported, but not specified: used
+eref.h:9: Constant exported, but not specified: avail
+eref.h:9: Type exported, but not specified: eref_status
+eref.h:14: Type exported, but not specified: eref_ERP
+eref.h:17: Variable exported, but not specified: eref_Pool
+eref.c: (in function eref_alloc)
+eref.c:12: Undocumented use of global eref_Pool
+eref.c:12: Undocumented use of global eref_Pool
+eref.c:12: Body of for statement is empty
+eref.c:12: Undocumented use of global eref_Pool (in post loop test)
+eref.c:16: Undocumented use of global eref_Pool
+eref.c:18: Undocumented use of global eref_Pool
+eref.c:19: Undocumented use of global eref_Pool
+eref.c:20: Undocumented use of global eref_Pool
+eref.c:20: Parameter to sizeof is type employee: sizeof(employee)
+eref.c:19: Undocumented modification of *(eref_Pool.conts) possible from call
+    to realloc: realloc(eref_Pool.conts, 2 * eref_Pool.size * sizeof(employee))
+eref.c:18: Undocumented modification of eref_Pool.conts:
+    eref_Pool.conts = (employee *)realloc(eref_Pool.conts, 2 * eref_Pool.size *
+    sizeof(employee))
+eref.c:22: Undocumented use of global eref_Pool
+eref.c:25: Argument to exit has implementation defined behavior: 1
+eref.c:28: Undocumented use of global eref_Pool
+eref.c:29: Undocumented use of global eref_Pool
+eref.c:30: Undocumented use of global eref_Pool
+eref.c:30: Parameter to sizeof is type eref_status: sizeof(eref_status)
+eref.c:29: Undocumented modification of *(eref_Pool.status) possible from call
+    to realloc: realloc(eref_Pool.status, 2 * eref_Pool.size *
+    sizeof(eref_status))
+eref.c:28: Undocumented modification of eref_Pool.status:
+    eref_Pool.status = (eref_status *)realloc(eref_Pool.status, 2 *
+    eref_Pool.size * sizeof(eref_status))
+eref.c:32: Undocumented use of global eref_Pool
+eref.c:35: Argument to exit has implementation defined behavior: 1
+eref.c:38: Undocumented use of global eref_Pool
+eref.c:38: Undocumented use of global eref_Pool
+eref.c:38: Undocumented modification of eref_Pool.size:
+              eref_Pool.size = 2 * eref_Pool.size
+eref.c:40: Undocumented use of global eref_Pool
+eref.c:41: Undocumented use of global eref_Pool
+eref.c:41: Undocumented modification of eref_Pool.status[]:
+              eref_Pool.status[i] = avail
+eref.c:41: Body of for statement is not a block: eref_Pool.status[i] = avail
+eref.c:41: Undocumented use of global eref_Pool (in post loop test)
+eref.c:44: Undocumented use of global eref_Pool
+eref.c:44: Undocumented modification of eref_Pool.status[]:
+              eref_Pool.status[res] = used
+eref.c: (in function eref_initMod)
+eref.c:53: Undocumented use of file static needsInit
+eref.c:58: Undocumented use of file static needsInit
+eref.c:58: Undocumented modification of needsInit: needsInit = FALSE
+eref.c:60: Statement has no effect: employee_initMod()
+eref.c:62: Undocumented use of global eref_Pool
+eref.c:62: Parameter to sizeof is type employee: sizeof(employee)
+eref.c:62: Undocumented modification of eref_Pool.conts:
+              eref_Pool.conts = (employee *)malloc(size * sizeof(employee))
+eref.c:62: Implicitly only storage eref_Pool.conts not released before
+    assignment: eref_Pool.conts = (employee *)malloc(size * sizeof(employee))
+eref.c:64: Undocumented use of global eref_Pool
+eref.c:67: Argument to exit has implementation defined behavior: 1
+eref.c:70: Undocumented use of global eref_Pool
+eref.c:70: Parameter to sizeof is type eref_status: sizeof(eref_status)
+eref.c:70: Undocumented modification of eref_Pool.status:
+    eref_Pool.status = (eref_status *)malloc(size * sizeof(eref_status))
+eref.c:70: Implicitly only storage eref_Pool.status not released before
+    assignment: eref_Pool.status = (eref_status *)malloc(size *
+    sizeof(eref_status))
+eref.c:72: Undocumented use of global eref_Pool
+eref.c:75: Argument to exit has implementation defined behavior: 1
+eref.c:78: Undocumented use of global eref_Pool
+eref.c:78: Undocumented modification of eref_Pool.size: eref_Pool.size = size
+eref.c:82: Undocumented use of global eref_Pool
+eref.c:82: Undocumented modification of eref_Pool.status[]:
+              eref_Pool.status[i] = avail
+eref.c:84: Global storage *(eref_Pool.conts) contains 4 undefined fields when
+              call returns: ssNum, salary, gen, j
+eref.c:84: Global storage eref_Pool contains 1 undefined field when call
+              returns: status
+eref.h: (in macro eref_free)
+eref.h:23: Undocumented use of global eref_Pool
+eref.h:23: Undocumented modification of eref_Pool.status[]:
+              eref_Pool.status[er] = avail
+eref.h: (in macro eref_assign)
+eref.h:24: Undocumented use of global eref_Pool
+eref.h:24: Macro parameter used without parentheses: e
+eref.h:24: Undocumented modification of eref_Pool.conts[]:
+              eref_Pool.conts[er] = e
+eref.h: (in macro eref_get)
+eref.h:25: Undocumented use of global eref_Pool
+eref.h: (in macro eref_equal)
+eref.h:26: Macro parameter used without parentheses: er1
+eref.h:26: Macro parameter used without parentheses: er2
+< checking empset.c >
+erc.h:6: Type exported, but not specified: ercElem
+erc.h:7: Type exported, but not specified: ercList
+erc.h:8: Type exported, but not specified: ercInfo
+empset.h:10: Variable exported, but not specified: known
+empset.c:5: Name _empset_get is in the implementation name space (any
+               identifier beginning with underscore)
+empset.c: (in function _empset_get)
+empset.c:11: Undocumented modification of s possible from call to
+                erc_iterStart: erc_iterStart(s)
+empset.c:15: Body of if statement is not a block:
+                do { { erc_iterFinal(it) } } while (0)
+empset.c: (in function empset_insert)
+empset.c:30: Undetected modification possible from call to unconstrained
+                function _empset_get: _empset_get
+empset.c:28: Variable er declared but not used
+empset.c: (in function empset_insertUnique)
+empset.c:43: Undocumented use of global known
+empset.c:49: Undocumented use of global known
+empset.c:49: Undocumented modification of known possible from call to
+                ereftab_insert: ereftab_insert(known, e, er)
+empset.c: (in function empset_delete)
+empset.c:59: Undetected modification possible from call to unconstrained
+                function _empset_get: _empset_get
+empset.c: (in function empset_disjointUnion)
+empset.c:85: Undocumented modification of s1 possible from call to
+                erc_iterStart (through alias s2): erc_iterStart(s2)
+empset.c:85: Undocumented modification of s2 possible from call to
+                erc_iterStart: erc_iterStart(s2)
+empset.c:86: Body of for statement is not a block:
+                empset_insertUnique(result, eref_get(er))
+empset.c: (in function empset_union)
+empset.c:108: Undocumented modification of s2 possible from call to
+                 erc_iterStart (through alias s1): erc_iterStart(s1)
+empset.c:108: Undocumented modification of s1 possible from call to
+                 erc_iterStart: erc_iterStart(s1)
+empset.c:110: Body of if statement is not a block: erc_insert(result, er)
+empset.c:109: Body of for statement is not a block:
+                 if (!empset_member(eref_get(er), s2)) erc_insert(result, er)
+empset.c: (in function empset_intersect)
+empset.c:125: Body of if statement is not a block: erc_insert(toDelete, er)
+empset.c:124: Body of for statement is not a block:
+                 if (!empset_member(eref_get(er), s2)) erc_insert(toDelete, er)
+empset.c:128: Return value (type bool) ignored: erc_delete(s1, er)
+empset.c:128: Body of for statement is not a block: erc_delete(s1, er)
+empset.c: (in function empset_subset)
+empset.c:139: Undocumented modification of s1 possible from call to
+                 erc_iterStart: erc_iterStart(s1)
+empset.c:141: Body of if statement is not a block:
+                 do { { erc_iterFinal(it) } } while (0)
+empset.c:140: Body of for statement is not a block:
+    if (!empset_member(eref_get(er), s2)) do { { erc_iterFinal(it) } } while (0)
+empset.c:135: Variable e declared but not used
+empset.c: (in function empset_initMod)
+empset.c:148: Undocumented use of file static initDone
+empset.c:148: Body of if statement is not a block: return
+empset.c:151: Statement has no effect: employee_initMod()
+empset.c:153: Statement has no effect: erc_initMod()
+empset.c:154: Statement has no effect: ereftab_initMod()
+empset.c:155: Undocumented use of global known
+empset.c:155: Undocumented modification of known: known = ereftab_create()
+empset.c:156: Undocumented use of file static initDone
+empset.c:156: Undocumented modification of initDone: initDone = TRUE
+empset.h: (in macro empset_member)
+empset.h:30: Undetected modification possible from call to unconstrained
+                function _empset_get: _empset_get
+< checking ereftab.c >
+ereftab.c: (in function ereftab_delete)
+ereftab.c:24: Return value (type bool) ignored: erc_delete(t, er)
+ereftab.c: (in function ereftab_lookup)
+ereftab.c:34: Undocumented modification of t possible from call to
+                 erc_iterStart: erc_iterStart(t)
+ereftab.c:37: Body of if statement is not a block: return er
+ereftab.c: (in function ereftab_initMod)
+ereftab.c:47: Statement has no effect: erc_initMod()
+< checking erc.c >
+erc.c: (in function erc_create)
+erc.c:8: Parameter to sizeof is type ercInfo: sizeof(ercInfo)
+erc.c:13: Argument to exit has implementation defined behavior: 1
+erc.c:18: Null storage c->vals derivable from return value: c
+   erc.c:16: Storage c->vals becomes null
+erc.c:18: Fresh storage returned as unqualified (should be only): c
+   erc.c:8: Fresh storage c allocated
+erc.c: (in function erc_clear)
+erc.c:34: Function returns with null storage derivable from parameter c->vals
+   erc.c:32: Storage c->vals becomes null
+erc.c: (in function erc_final)
+erc.c:39: Implicitly temp storage c passed as only param: free (c)
+erc.c: (in function erc_member)
+erc.c:47: Operands of == are abstract type (eref): tmpc->val == er
+erc.c:47: Body of if statement is not a block: return TRUE
+erc.c:47: Body of for statement is not a block:
+             if (tmpc->val == er) return TRUE
+erc.c: (in function erc_insert)
+erc.c:55: Parameter to sizeof is type ercElem: sizeof(ercElem)
+erc.c:60: Argument to exit has implementation defined behavior: 1
+erc.c: (in function erc_delete)
+erc.c:78: Operands of == are abstract type (eref): elem->val == er
+erc.c:83: Implicitly only storage prev->next not released before assignment:
+             prev->next = elem->next
+erc.c:83: Clauses exit with elem referencing implicitly only storage in true
+             branch, local storage in false branch
+   erc.c:81: Storage elem becomes implicitly only
+erc.c:83: Storage c->vals->next is kept in one path, but live in another.
+   erc.c:83: Storage c->vals->next becomes kept
+erc.c:81: Body of if clause of if statement is not a block:
+             c->vals = elem->next
+erc.c:83: Body of else clause of if statement is not a block:
+             prev->next = elem->next
+erc.c:87: Released storage c->vals reachable from parameter at return point
+   erc.c:85: Storage c->vals is released
+erc.c: (in function erc_iterStart)
+erc.c:98: Parameter to sizeof is type ercList: sizeof(ercList)
+erc.c:103: Argument to exit has implementation defined behavior: 1
+erc.c:107: Fresh storage returned as unqualified (should be only): result
+   erc.c:98: Fresh storage result allocated
+erc.c:108: Suspect object listed in modifies of erc_iterStart not modified: c
+   erc.lcl:49: Specification of erc_iterStart
+erc.c: (in function erc_yield)
+erc.c:117: Implicitly temp storage it passed as only param: free (it)
+erc.c:117: Unreachable code: free(it)
+erc.c:118: Variable it is released in true branch, but live in continuation.
+   erc.c:117: Storage it is released
+erc.c:121: Only storage *it->next assigned to unqualified: *(it) = (*it)->next
+erc.c: (in function erc_join)
+erc.c:130: Body of for statement is not a block: erc_insert(c1, tmpc->val)
+erc.c: (in function erc_sprint)
+erc.c:141: Function malloc expects arg 1 to be size_t gets int:
+              erc_size(c) * (employeePrintSize + 1) + 1
+erc.c:146: Argument to exit has implementation defined behavior: 1
+erc.c:151: Undocumented modification of c possible from call to erc_iterStart:
+              erc_iterStart(c)
+erc.c:159: Fresh storage returned as unqualified (should be only): result
+   erc.c:140: Fresh storage result allocated
+erc.h: (in macro erc_choose)
+erc.h:15: Macro parameter used without parentheses: c
+erc.h: (in macro erc_initMod)
+erc.h:16: Called procedure bool_initMod may access internal state, but globals
+             list does not include globals internalState
+erc.h:16: Undocumented modification of internal state possible from call to
+             bool_initMod: bool_initMod()
+erc.h:16: Statement has no effect: employee_initMod()
+erc.h: (in macro erc_iterFinal)
+erc.h:20: Implicitly temp storage it passed as only param: free (it)
+< checking dbase.c >
+dbase.c: (in function db_initMod)
+dbase.c:21: Undocumented use of global initDone
+dbase.c:27: Statement has no effect: employee_initMod()
+dbase.c:29: Statement has no effect: erc_initMod()
+dbase.c:30: Statement has no effect: empset_initMod()
+dbase.c:32: Assignment of enum { mMGRS, fMGRS, mNON, fNON } to int: i = mMGRS
+dbase.c:32: Operands of <= have incompatible types (int, enum { mMGRS, fMGRS,
+               mNON, fNON }): i <= fNON
+dbase.c:34: Undocumented use of global db
+dbase.c:34: Undocumented modification of db[]: db[i] = erc_create()
+dbase.c:32: Incompatible types for <= (int, enum { mMGRS, fMGRS, mNON, fNON })
+               (in post loop test): i <= fNON
+dbase.c:37: Undocumented use of global initDone
+dbase.c:37: Undocumented modification of initDone: initDone = TRUE
+dbase.c:40: Name _db_ercKeyGet is in the implementation name space (any
+               identifier beginning with underscore)
+dbase.c: (in function _db_ercKeyGet)
+dbase.c:45: Undocumented modification of c possible from call to erc_iterStart:
+               erc_iterStart(c)
+dbase.c:56: Name _db_keyGet is in the implementation name space (any identifier
+               beginning with underscore)
+dbase.c: (in function _db_keyGet)
+dbase.c:61: Assignment of enum { mMGRS, fMGRS, mNON, fNON } to int: i = mMGRS
+dbase.c:61: Operands of <= have incompatible types (int, enum { mMGRS, fMGRS,
+               mNON, fNON }): i <= fNON
+dbase.c:63: Undocumented use of global db
+dbase.c:63: Undetected modification possible from call to unconstrained
+               function _db_ercKeyGet: _db_ercKeyGet
+dbase.c:61: Incompatible types for <= (int, enum { mMGRS, fMGRS, mNON, fNON })
+               (in post loop test): i <= fNON
+dbase.c:73: Name _db_addEmpls is in the implementation name space (any
+               identifier beginning with underscore)
+dbase.c: (in function _db_addEmpls)
+dbase.c:81: Undocumented modification of c possible from call to erc_iterStart:
+               erc_iterStart(c)
+dbase.c:86: Undocumented modification of s possible from call to empset_insert:
+               empset_insert(s, e)
+dbase.c:86: Return value (type bool) ignored: empset_insert(s, e)
+dbase.c: (in function hire)
+dbase.c:97: Body of if statement is not a block: return genderERR
+dbase.c:100: Body of if statement is not a block: return jobERR
+dbase.c:103: Body of if statement is not a block: return salERR
+dbase.c:105: Undetected modification possible from call to unconstrained
+                function _db_keyGet: _db_keyGet
+dbase.c:106: Body of if statement is not a block: return duplERR
+dbase.c: (in function uncheckedHire)
+dbase.c:121: Undocumented use of global db
+dbase.c:121: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mMGRS]
+dbase.c:121: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[mMGRS], er)
+dbase.c:123: Undocumented use of global db
+dbase.c:123: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:123: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[mNON], er)
+dbase.c:121: Body of if clause of if statement is not a block:
+                erc_insert(db[mMGRS], er)
+dbase.c:123: Body of else clause of if statement is not a block:
+                erc_insert(db[mNON], er)
+dbase.c:126: Undocumented use of global db
+dbase.c:126: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fMGRS]
+dbase.c:126: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[fMGRS], er)
+dbase.c:128: Undocumented use of global db
+dbase.c:128: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:128: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[fNON], er)
+dbase.c:126: Body of if clause of if statement is not a block:
+                erc_insert(db[fMGRS], er)
+dbase.c:128: Body of else clause of if statement is not a block:
+                erc_insert(db[fNON], er)
+dbase.c:123: Body of if clause of if statement is not a block:
+    if (e.j == MGR) erc_insert(db[mMGRS], er) else erc_insert(db[mNON], er)
+dbase.c: (in function fire)
+dbase.c:137: Assignment of enum { mMGRS, fMGRS, mNON, fNON } to int: i = mMGRS
+dbase.c:137: Operands of <= have incompatible types (int, enum { mMGRS, fMGRS,
+                mNON, fNON }): i <= fNON
+dbase.c:138: Undocumented use of global db
+dbase.c:138: Undocumented modification of db[] possible from call to
+                erc_iterStart: erc_iterStart(db[i])
+dbase.c:142: Undocumented use of global db
+dbase.c:142: Undocumented modification of db[] possible from call to
+                erc_delete: erc_delete(db[i], er)
+dbase.c:142: Return value (type bool) ignored: erc_delete(db[i]...
+dbase.c:139: Body of for statement is not a block:
+                if (eref_get(er).ssNum == ssNum) { erc_iterFinal(it) }
+dbase.c:139: Body of for statement is not a block:
+    for (er = erc_yield(it = erc_iterStart(db[i])); !eref_equal(er, erefNIL);
+    er = erc_yield(it)) if (eref_get(er).ssNum == ssNum) { erc_iterFinal(it) }
+dbase.c:137: Incompatible types for <= (int, enum { mMGRS, fMGRS, mNON, fNON })
+                (in post loop test): i <= fNON
+dbase.c: (in function promote)
+dbase.c:156: Undocumented use of global db
+dbase.c:156: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:156: Undetected modification possible from call to unconstrained
+                function _db_ercKeyGet: _db_ercKeyGet
+dbase.c:160: Undocumented use of global db
+dbase.c:160: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:160: Undetected modification possible from call to unconstrained
+                function _db_ercKeyGet: _db_ercKeyGet
+dbase.c:162: Body of if statement is not a block: return FALSE
+dbase.c:172: Undocumented use of global db
+dbase.c:172: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:172: Undocumented modification of db[] possible from call to
+                erc_delete: erc_delete(db[mNON], er)
+dbase.c:172: Return value (type bool) ignored: erc_delete(db[mN...
+dbase.c:173: Undocumented use of global db
+dbase.c:173: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mMGRS]
+dbase.c:173: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[mMGRS], er)
+dbase.c:177: Undocumented use of global db
+dbase.c:177: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:177: Undocumented modification of db[] possible from call to
+                erc_delete: erc_delete(db[fNON], er)
+dbase.c:177: Return value (type bool) ignored: erc_delete(db[fN...
+dbase.c:178: Undocumented use of global db
+dbase.c:178: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fMGRS]
+dbase.c:178: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[fMGRS], er)
+dbase.c: (in function setSalary)
+dbase.c:194: Undetected modification possible from call to unconstrained
+                function _db_keyGet: _db_keyGet
+dbase.c: (in function query)
+dbase.c:226: Assignment of enum { mMGRS, fMGRS, mNON, fNON } to int: i = mMGRS
+dbase.c:226: Operands of <= have incompatible types (int, enum { mMGRS, fMGRS,
+                mNON, fNON }): i <= fNON
+dbase.c:227: Undocumented use of global db
+dbase.c:227: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:227: Body of for statement is not a block:
+                numAdded += _db_addEmpls(db[i], l, h, s)
+dbase.c:226: Incompatible types for <= (int, enum { mMGRS, fMGRS, mNON, fNON })
+                (in post loop test): i <= fNON
+dbase.c:230: Undocumented use of global db
+dbase.c:230: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mMGRS]
+dbase.c:230: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:231: Undocumented use of global db
+dbase.c:231: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fMGRS]
+dbase.c:231: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:234: Undocumented use of global db
+dbase.c:234: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:234: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:235: Undocumented use of global db
+dbase.c:235: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:235: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:242: Undocumented use of global db
+dbase.c:242: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mMGRS]
+dbase.c:242: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:243: Undocumented use of global db
+dbase.c:243: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:243: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:246: Undocumented use of global db
+dbase.c:246: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mMGRS]
+dbase.c:246: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:248: Undocumented use of global db
+dbase.c:248: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:248: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:254: Undocumented use of global db
+dbase.c:254: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fMGRS]
+dbase.c:254: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:255: Undocumented use of global db
+dbase.c:255: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:255: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:258: Undocumented use of global db
+dbase.c:258: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fMGRS]
+dbase.c:258: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:260: Undocumented use of global db
+dbase.c:260: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:260: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:210: Variable er declared but not used
+dbase.c:211: Variable e declared but not used
+dbase.c:263: Suspect object listed in modifies of query not modified: s
+   dbase.lcl:49: Specification of query
+dbase.c: (in function db_print)
+dbase.c:272: Assignment of enum { mMGRS, fMGRS, mNON, fNON } to int: i = mMGRS
+dbase.c:272: Operands of <= have incompatible types (int, enum { mMGRS, fMGRS,
+                mNON, fNON }): i <= fNON
+dbase.c:274: Undocumented use of global db
+dbase.c:272: Incompatible types for <= (int, enum { mMGRS, fMGRS, mNON, fNON })
+                (in post loop test): i <= fNON
+< checking drive.c >
+drive.c: (in function main)
+drive.c:22: Statement has no effect: employee_initMod()
+drive.c:23: Statement has no effect: empset_initMod()
+drive.c:48: Return value (type bool) ignored: employee_setName...
+drive.c:49: Return value (type bool) ignored: empset_insert(em...
+drive.c:64: Return value (type bool) ignored: employee_setName...
+drive.c:65: Return value (type bool) ignored: empset_delete(em...
+drive.c:82: Return value (type bool) ignored: employee_setName...
+drive.c:83: Return value (type bool) ignored: empset_insert(em...
+drive.c:107: Return value (type bool) ignored: empset_delete(em...
+drive.c:116: Body of if clause of if statement is not a block: e.gen = MALE
+drive.c:116: Body of else clause of if statement is not a block: e.gen = FEMALE
+drive.c:117: Body of if clause of if statement is not a block: e.j = NONMGR
+drive.c:117: Body of else clause of if statement is not a block: e.j = MGR
+drive.c:119: Return value (type bool) ignored: employee_setName...
+drive.c:123: Return value (type db_status) ignored: hire(e)
+drive.c:127: Assignment of db_status to int: j = hire(e)
+drive.c:131: Variable j used before definition
+drive.c:134: Return value (type bool) ignored: fire(17)
+drive.c:158: Return value (type bool) ignored: fire(empset_choo...
+drive.c:11: Parameter argv not used
+< checking macros bool.h >
+< global checks >
+dbase.c:11: Type employeeKinds declared but not used
+eref.lh:8: Function exported but not used outside eref: eref_free
+   eref.h:23: Definition of eref_free
+empset.lh:8: Function exported but not used outside empset: empset_final
+   empset.h:29: Definition of empset_final
+empset.lh:9: Function exported but not used outside empset: empset_clear
+   empset.c:24: Definition of empset_clear
+empset.lh:11: Function exported but not used outside empset:
+                 empset_insertUnique
+   empset.c:53: Definition of empset_insertUnique
+empset.lh:17: Function exported but not used outside empset: empset_member
+   empset.h:30: Definition of empset_member
+empset.lh:18: Function exported but not used outside empset: empset_subset
+   empset.c:144: Definition of empset_subset
+ereftab.lh:10: Function exported but not used outside ereftab: ereftab_delete
+   ereftab.c:26: Definition of ereftab_delete
+dbase.c:13: Variable exported but not used outside dbase: db
+dbase.lh:27: Function exported but not used outside dbase: promote
+   dbase.c:182: Definition of promote
+dbase.lh:28: Function exported but not used outside dbase: setSalary
+   dbase.c:206: Definition of setSalary
+empset.h:10: Variable exported but not used outside empset: known
+dbase.c:15: Variable exported but not used outside dbase: initDone
+dbase.c:40: Function exported but not used outside dbase: _db_ercKeyGet
+   dbase.c:54: Definition of _db_ercKeyGet
+dbase.c:56: Function exported but not used outside dbase: _db_keyGet
+   dbase.c:71: Definition of _db_keyGet
+dbase.c:73: Function exported but not used outside dbase: _db_addEmpls
+   dbase.c:92: Definition of _db_addEmpls
+dbase.c:13: Variable db exported but not declared in header file
+empset.c:5: Function _empset_get exported but not declared in header file
+   empset.c:19: Definition of _empset_get
+dbase.c:15: Variable initDone exported but not declared in header file
+dbase.c:40: Function _db_ercKeyGet exported but not declared in header file
+   dbase.c:54: Definition of _db_ercKeyGet
+dbase.c:56: Function _db_keyGet exported but not declared in header file
+   dbase.c:71: Definition of _db_keyGet
+dbase.c:73: Function _db_addEmpls exported but not declared in header file
+   dbase.c:92: Definition of _db_addEmpls
+< cleaning .......... >
+
+Error Type                Reported  Suppressed
+===================       ========  =========
+abstract                     2           0
+mayaliasunique               1           0
+exitarg                      8           0
+unreachable                  1           0
+forempty                     1           0
+forblock                    11           0
+ifblock                     24           0
+usedef                       1           0
+noeffect                    11           0
+exporttype                   5           0
+exportvar                    2           0
+exportconst                  2           0
+globs                       64           1
+internalglobs                2           0
+warnmissingglobs             1           6
+retvalother                  1           0
+retvalbool                  16           0
+macroparens                  4           0
+usereleased                  1           0
+compdef                      2           0
+mustfree                     3           0
+branchstate                  3           2
+onlytrans                    1           0
+freshtrans                   3           0
+temptrans                    3           2
+readonlytrans                6           0
+mods                        38           0
+mustmod                      2           0
+modfilesys                   0          25
+modnomods                    4           0
+moduncon                    20           0
+modunconnomods               1           0
+ansireserved                 9           0
+nullret                      1           0
+nullstate                    1           0
+sizeoftype                   7           0
+formalarray                  0          17
+type                         1           0
+enumindex                   24           0
+relaxtypes                  15           0
+matchanyintegral             2           0
+exportlocal                 15           0
+exportheader                 4           0
+exportheadervar              2           0
+paramuse                     1           0
+typeuse                      1           0
+varuse                       4           0
+                          ========  =========
+Total                      331          53
+
+Finished LCLint checking --- 331 code errors found, as expected
diff --git a/test/db1.out b/test/db1.out
new file mode 100644
index 0000000..307db06
--- /dev/null
+++ b/test/db1.out
@@ -0,0 +1,686 @@
+
+< reading spec bool.lcl >
+< reading spec employee.lcl >
+< reading spec eref.lcl >
+< reading spec empset.lcl >
+< reading spec ereftab.lcl >
+< reading spec erc.lcl >
+< reading spec dbase.lcl >
+< preprocessing >
+< checking employee.c >
+employee.c: (in function employee_equal)
+employee.c:24: Function strncmp expects arg 3 to be size_t gets int:
+                  maxEmployeeName
+< checking eref.c >
+< checking empset.c >
+empset.c: (in function empset_insert)
+empset.c:28: Variable er declared but not used
+empset.c: (in function empset_disjointUnion)
+empset.c:85: Undocumented modification of s1 possible from call to
+                erc_iterStart (through alias s2): erc_iterStart(s2)
+empset.c:85: Undocumented modification of s2 possible from call to
+                erc_iterStart: erc_iterStart(s2)
+empset.c: (in function empset_union)
+empset.c:108: Undocumented modification of s2 possible from call to
+                 erc_iterStart (through alias s1): erc_iterStart(s1)
+empset.c:108: Undocumented modification of s1 possible from call to
+                 erc_iterStart: erc_iterStart(s1)
+empset.c: (in function empset_subset)
+empset.c:139: Undocumented modification of s1 possible from call to
+                 erc_iterStart: erc_iterStart(s1)
+empset.c:135: Variable e declared but not used
+< checking ereftab.c >
+ereftab.c: (in function ereftab_lookup)
+ereftab.c:34: Undocumented modification of t possible from call to
+                 erc_iterStart: erc_iterStart(t)
+< checking erc.c >
+erc.c: (in function erc_member)
+erc.c:47: Operands of == are abstract type (eref): tmpc->val == er
+erc.c: (in function erc_delete)
+erc.c:78: Operands of == are abstract type (eref): elem->val == er
+erc.c: (in function erc_sprint)
+erc.c:141: Function malloc expects arg 1 to be size_t gets int:
+              erc_size(c) * (employeePrintSize + 1) + 1
+erc.c:151: Undocumented modification of c possible from call to erc_iterStart:
+              erc_iterStart(c)
+< checking dbase.c >
+dbase.c: (in function query)
+dbase.c:210: Variable er declared but not used
+dbase.c:211: Variable e declared but not used
+< checking drive.c >
+drive.c: (in function main)
+drive.c:123: Return value (type db_status) ignored: hire(e)
+< checking macros bool.h >
+< global checks >
+< cleaning .......... >
+
+Finished LCLint checking --- 16 code errors found, as expected
+
+< reading spec bool.lcl >
+< reading spec employee.lcl >
+< reading spec eref.lcl >
+< reading spec empset.lcl >
+< reading spec ereftab.lcl >
+< reading spec erc.lcl >
+< reading spec dbase.lcl >
+< preprocessing >
+employee.h:2: Name EMPLOYEE_H is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+< more preprocessing . >
+eref.h:2: Name EREF_H is reserved for future ANSI library extensions. Macros
+    beginning with E and a digit or uppercase letter may be added to .
+    (See ANSI, Section 4.13.1)
+< more preprocessing . >
+empset.h:2: Name EMPSET_H is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+< more preprocessing . >
+erc.h:2: Name ERC_H is reserved for future ANSI library extensions. Macros
+    beginning with E and a digit or uppercase letter may be added to .
+    (See ANSI, Section 4.13.1)
+< more preprocessing . >
+ereftab.h:4: Name EREFTAB_H is reserved for future ANSI library extensions.
+    Macros beginning with E and a digit or uppercase letter may be added to
+    . (See ANSI, Section 4.13.1)
+< more preprocessing . >
+< checking employee.c >
+bool.h:20: Modifies list for bool_initMod uses global internal state, not
+              included in globals list.
+   bool.h:20: Declaration of bool_initMod
+employee.c: (in function employee_setName)
+employee.c:11: Body of if statement is not a block: return FALSE
+employee.c:14: Parameter 1 (e->name) to function strcpy is declared unique but
+                  may be aliased externally by parameter 2 (na)
+employee.c: (in function employee_equal)
+employee.c:24: Function strncmp expects arg 3 to be size_t gets int:
+                  maxEmployeeName
+employee.c: (in function employee_sprint)
+employee.c:29: Read-only string literal storage used as initial value for
+                  unqualified storage: gender[0] = "male"
+employee.c:29: Read-only string literal storage used as initial value for
+                  unqualified storage: gender[1] = "female"
+employee.c:29: Read-only string literal storage used as initial value for
+                  unqualified storage: gender[2] = "?"
+employee.c:30: Read-only string literal storage used as initial value for
+                  unqualified storage: jobs[0] = "manager"
+employee.c:30: Read-only string literal storage used as initial value for
+                  unqualified storage: jobs[1] = "non-manager"
+employee.c:30: Read-only string literal storage used as initial value for
+                  unqualified storage: jobs[2] = "?"
+employee.c:33: Array fetch using non-integer, gender: gender[e.gen]
+employee.c:33: Array fetch using non-integer, job: jobs[e.j]
+employee.h: (in macro employee_initMod)
+employee.h:10: Called procedure bool_initMod may access internal state, but
+                  globals list does not include globals internalState
+employee.h:10: Undocumented modification of internal state possible from call
+                  to bool_initMod: bool_initMod()
+< checking eref.c >
+eref.h:9: Constant exported, but not specified: used
+eref.h:9: Constant exported, but not specified: avail
+eref.h:9: Type exported, but not specified: eref_status
+eref.h:14: Type exported, but not specified: eref_ERP
+eref.h:17: Variable exported, but not specified: eref_Pool
+eref.c: (in function eref_alloc)
+eref.c:12: Undocumented use of global eref_Pool
+eref.c:12: Undocumented use of global eref_Pool
+eref.c:12: Body of for statement is empty
+eref.c:12: Undocumented use of global eref_Pool (in post loop test)
+eref.c:16: Undocumented use of global eref_Pool
+eref.c:18: Undocumented use of global eref_Pool
+eref.c:19: Undocumented use of global eref_Pool
+eref.c:20: Undocumented use of global eref_Pool
+eref.c:20: Parameter to sizeof is type employee: sizeof(employee)
+eref.c:19: Undocumented modification of *(eref_Pool.conts) possible from call
+    to realloc: realloc(eref_Pool.conts, 2 * eref_Pool.size * sizeof(employee))
+eref.c:18: Undocumented modification of eref_Pool.conts:
+    eref_Pool.conts = (employee *)realloc(eref_Pool.conts, 2 * eref_Pool.size *
+    sizeof(employee))
+eref.c:22: Undocumented use of global eref_Pool
+eref.c:25: Argument to exit has implementation defined behavior: 1
+eref.c:28: Undocumented use of global eref_Pool
+eref.c:29: Undocumented use of global eref_Pool
+eref.c:30: Undocumented use of global eref_Pool
+eref.c:30: Parameter to sizeof is type eref_status: sizeof(eref_status)
+eref.c:29: Undocumented modification of *(eref_Pool.status) possible from call
+    to realloc: realloc(eref_Pool.status, 2 * eref_Pool.size *
+    sizeof(eref_status))
+eref.c:28: Undocumented modification of eref_Pool.status:
+    eref_Pool.status = (eref_status *)realloc(eref_Pool.status, 2 *
+    eref_Pool.size * sizeof(eref_status))
+eref.c:32: Undocumented use of global eref_Pool
+eref.c:35: Argument to exit has implementation defined behavior: 1
+eref.c:38: Undocumented use of global eref_Pool
+eref.c:38: Undocumented use of global eref_Pool
+eref.c:38: Undocumented modification of eref_Pool.size:
+              eref_Pool.size = 2 * eref_Pool.size
+eref.c:40: Undocumented use of global eref_Pool
+eref.c:41: Undocumented use of global eref_Pool
+eref.c:41: Undocumented modification of eref_Pool.status[]:
+              eref_Pool.status[i] = avail
+eref.c:41: Body of for statement is not a block: eref_Pool.status[i] = avail
+eref.c:41: Undocumented use of global eref_Pool (in post loop test)
+eref.c:44: Undocumented use of global eref_Pool
+eref.c:44: Undocumented modification of eref_Pool.status[]:
+              eref_Pool.status[res] = used
+eref.c: (in function eref_initMod)
+eref.c:53: Undocumented use of file static needsInit
+eref.c:58: Undocumented use of file static needsInit
+eref.c:58: Undocumented modification of needsInit: needsInit = FALSE
+eref.c:60: Statement has no effect: employee_initMod()
+eref.c:62: Undocumented use of global eref_Pool
+eref.c:62: Parameter to sizeof is type employee: sizeof(employee)
+eref.c:62: Undocumented modification of eref_Pool.conts:
+              eref_Pool.conts = (employee *)malloc(size * sizeof(employee))
+eref.c:62: Implicitly only storage eref_Pool.conts not released before
+    assignment: eref_Pool.conts = (employee *)malloc(size * sizeof(employee))
+eref.c:64: Undocumented use of global eref_Pool
+eref.c:67: Argument to exit has implementation defined behavior: 1
+eref.c:70: Undocumented use of global eref_Pool
+eref.c:70: Parameter to sizeof is type eref_status: sizeof(eref_status)
+eref.c:70: Undocumented modification of eref_Pool.status:
+    eref_Pool.status = (eref_status *)malloc(size * sizeof(eref_status))
+eref.c:70: Implicitly only storage eref_Pool.status not released before
+    assignment: eref_Pool.status = (eref_status *)malloc(size *
+    sizeof(eref_status))
+eref.c:72: Undocumented use of global eref_Pool
+eref.c:75: Argument to exit has implementation defined behavior: 1
+eref.c:78: Undocumented use of global eref_Pool
+eref.c:78: Undocumented modification of eref_Pool.size: eref_Pool.size = size
+eref.c:82: Undocumented use of global eref_Pool
+eref.c:82: Undocumented modification of eref_Pool.status[]:
+              eref_Pool.status[i] = avail
+eref.c:84: Global storage *(eref_Pool.conts) contains 4 undefined fields when
+              call returns: ssNum, salary, gen, j
+eref.c:84: Global storage eref_Pool contains 1 undefined field when call
+              returns: status
+eref.h: (in macro eref_free)
+eref.h:23: Undocumented use of global eref_Pool
+eref.h:23: Undocumented modification of eref_Pool.status[]:
+              eref_Pool.status[er] = avail
+eref.h: (in macro eref_assign)
+eref.h:24: Undocumented use of global eref_Pool
+eref.h:24: Macro parameter used without parentheses: e
+eref.h:24: Undocumented modification of eref_Pool.conts[]:
+              eref_Pool.conts[er] = e
+eref.h: (in macro eref_get)
+eref.h:25: Undocumented use of global eref_Pool
+eref.h: (in macro eref_equal)
+eref.h:26: Macro parameter used without parentheses: er1
+eref.h:26: Macro parameter used without parentheses: er2
+< checking empset.c >
+erc.h:6: Type exported, but not specified: ercElem
+erc.h:7: Type exported, but not specified: ercList
+erc.h:8: Type exported, but not specified: ercInfo
+empset.h:10: Variable exported, but not specified: known
+empset.c:5: Name _empset_get is in the implementation name space (any
+               identifier beginning with underscore)
+empset.c: (in function _empset_get)
+empset.c:11: Undocumented modification of s possible from call to
+                erc_iterStart: erc_iterStart(s)
+empset.c:15: Body of if statement is not a block:
+                do { { erc_iterFinal(it) } } while (0)
+empset.c: (in function empset_insert)
+empset.c:30: Undetected modification possible from call to unconstrained
+                function _empset_get: _empset_get
+empset.c:28: Variable er declared but not used
+empset.c: (in function empset_insertUnique)
+empset.c:43: Undocumented use of global known
+empset.c:49: Undocumented use of global known
+empset.c:49: Undocumented modification of known possible from call to
+                ereftab_insert: ereftab_insert(known, e, er)
+empset.c: (in function empset_delete)
+empset.c:59: Undetected modification possible from call to unconstrained
+                function _empset_get: _empset_get
+empset.c: (in function empset_disjointUnion)
+empset.c:85: Undocumented modification of s1 possible from call to
+                erc_iterStart (through alias s2): erc_iterStart(s2)
+empset.c:85: Undocumented modification of s2 possible from call to
+                erc_iterStart: erc_iterStart(s2)
+empset.c:86: Body of for statement is not a block:
+                empset_insertUnique(result, eref_get(er))
+empset.c: (in function empset_union)
+empset.c:108: Undocumented modification of s2 possible from call to
+                 erc_iterStart (through alias s1): erc_iterStart(s1)
+empset.c:108: Undocumented modification of s1 possible from call to
+                 erc_iterStart: erc_iterStart(s1)
+empset.c:110: Body of if statement is not a block: erc_insert(result, er)
+empset.c:109: Body of for statement is not a block:
+                 if (!empset_member(eref_get(er), s2)) erc_insert(result, er)
+empset.c: (in function empset_intersect)
+empset.c:125: Body of if statement is not a block: erc_insert(toDelete, er)
+empset.c:124: Body of for statement is not a block:
+                 if (!empset_member(eref_get(er), s2)) erc_insert(toDelete, er)
+empset.c:128: Return value (type bool) ignored: erc_delete(s1, er)
+empset.c:128: Body of for statement is not a block: erc_delete(s1, er)
+empset.c: (in function empset_subset)
+empset.c:139: Undocumented modification of s1 possible from call to
+                 erc_iterStart: erc_iterStart(s1)
+empset.c:141: Body of if statement is not a block:
+                 do { { erc_iterFinal(it) } } while (0)
+empset.c:140: Body of for statement is not a block:
+    if (!empset_member(eref_get(er), s2)) do { { erc_iterFinal(it) } } while (0)
+empset.c:135: Variable e declared but not used
+empset.c: (in function empset_initMod)
+empset.c:148: Undocumented use of file static initDone
+empset.c:148: Body of if statement is not a block: return
+empset.c:151: Statement has no effect: employee_initMod()
+empset.c:153: Statement has no effect: erc_initMod()
+empset.c:154: Statement has no effect: ereftab_initMod()
+empset.c:155: Undocumented use of global known
+empset.c:155: Undocumented modification of known: known = ereftab_create()
+empset.c:156: Undocumented use of file static initDone
+empset.c:156: Undocumented modification of initDone: initDone = TRUE
+empset.h: (in macro empset_member)
+empset.h:30: Undetected modification possible from call to unconstrained
+                function _empset_get: _empset_get
+< checking ereftab.c >
+ereftab.c: (in function ereftab_delete)
+ereftab.c:24: Return value (type bool) ignored: erc_delete(t, er)
+ereftab.c: (in function ereftab_lookup)
+ereftab.c:34: Undocumented modification of t possible from call to
+                 erc_iterStart: erc_iterStart(t)
+ereftab.c:37: Body of if statement is not a block: return er
+ereftab.c: (in function ereftab_initMod)
+ereftab.c:47: Statement has no effect: erc_initMod()
+< checking erc.c >
+erc.c: (in function erc_create)
+erc.c:8: Parameter to sizeof is type ercInfo: sizeof(ercInfo)
+erc.c:13: Argument to exit has implementation defined behavior: 1
+erc.c:18: Null storage c->vals derivable from return value: c
+   erc.c:16: Storage c->vals becomes null
+erc.c:18: Fresh storage returned as unqualified (should be only): c
+   erc.c:8: Fresh storage c allocated
+erc.c: (in function erc_clear)
+erc.c:34: Function returns with null storage derivable from parameter c->vals
+   erc.c:32: Storage c->vals becomes null
+erc.c: (in function erc_final)
+erc.c:39: Implicitly temp storage c passed as only param: free (c)
+erc.c: (in function erc_member)
+erc.c:47: Operands of == are abstract type (eref): tmpc->val == er
+erc.c:47: Body of if statement is not a block: return TRUE
+erc.c:47: Body of for statement is not a block:
+             if (tmpc->val == er) return TRUE
+erc.c: (in function erc_insert)
+erc.c:55: Parameter to sizeof is type ercElem: sizeof(ercElem)
+erc.c:60: Argument to exit has implementation defined behavior: 1
+erc.c: (in function erc_delete)
+erc.c:78: Operands of == are abstract type (eref): elem->val == er
+erc.c:83: Implicitly only storage prev->next not released before assignment:
+             prev->next = elem->next
+erc.c:83: Clauses exit with elem referencing implicitly only storage in true
+             branch, local storage in false branch
+   erc.c:81: Storage elem becomes implicitly only
+erc.c:83: Storage c->vals->next is kept in one path, but live in another.
+   erc.c:83: Storage c->vals->next becomes kept
+erc.c:81: Body of if clause of if statement is not a block:
+             c->vals = elem->next
+erc.c:83: Body of else clause of if statement is not a block:
+             prev->next = elem->next
+erc.c:87: Released storage c->vals reachable from parameter at return point
+   erc.c:85: Storage c->vals is released
+erc.c: (in function erc_iterStart)
+erc.c:98: Parameter to sizeof is type ercList: sizeof(ercList)
+erc.c:103: Argument to exit has implementation defined behavior: 1
+erc.c:107: Fresh storage returned as unqualified (should be only): result
+   erc.c:98: Fresh storage result allocated
+erc.c:108: Suspect object listed in modifies of erc_iterStart not modified: c
+   erc.lcl:49: Specification of erc_iterStart
+erc.c: (in function erc_yield)
+erc.c:117: Implicitly temp storage it passed as only param: free (it)
+erc.c:117: Unreachable code: free(it)
+erc.c:118: Variable it is released in true branch, but live in continuation.
+   erc.c:117: Storage it is released
+erc.c:121: Only storage *it->next assigned to unqualified: *(it) = (*it)->next
+erc.c: (in function erc_join)
+erc.c:130: Body of for statement is not a block: erc_insert(c1, tmpc->val)
+erc.c: (in function erc_sprint)
+erc.c:141: Function malloc expects arg 1 to be size_t gets int:
+              erc_size(c) * (employeePrintSize + 1) + 1
+erc.c:146: Argument to exit has implementation defined behavior: 1
+erc.c:151: Undocumented modification of c possible from call to erc_iterStart:
+              erc_iterStart(c)
+erc.c:159: Fresh storage returned as unqualified (should be only): result
+   erc.c:140: Fresh storage result allocated
+erc.h: (in macro erc_choose)
+erc.h:15: Macro parameter used without parentheses: c
+erc.h: (in macro erc_initMod)
+erc.h:16: Called procedure bool_initMod may access internal state, but globals
+             list does not include globals internalState
+erc.h:16: Undocumented modification of internal state possible from call to
+             bool_initMod: bool_initMod()
+erc.h:16: Statement has no effect: employee_initMod()
+erc.h: (in macro erc_iterFinal)
+erc.h:20: Implicitly temp storage it passed as only param: free (it)
+< checking dbase.c >
+dbase.c: (in function db_initMod)
+dbase.c:21: Undocumented use of global initDone
+dbase.c:27: Statement has no effect: employee_initMod()
+dbase.c:29: Statement has no effect: erc_initMod()
+dbase.c:30: Statement has no effect: empset_initMod()
+dbase.c:32: Assignment of enum { mMGRS, fMGRS, mNON, fNON } to int: i = mMGRS
+dbase.c:32: Operands of <= have incompatible types (int, enum { mMGRS, fMGRS,
+               mNON, fNON }): i <= fNON
+dbase.c:34: Undocumented use of global db
+dbase.c:34: Undocumented modification of db[]: db[i] = erc_create()
+dbase.c:32: Incompatible types for <= (int, enum { mMGRS, fMGRS, mNON, fNON })
+               (in post loop test): i <= fNON
+dbase.c:37: Undocumented use of global initDone
+dbase.c:37: Undocumented modification of initDone: initDone = TRUE
+dbase.c:40: Name _db_ercKeyGet is in the implementation name space (any
+               identifier beginning with underscore)
+dbase.c: (in function _db_ercKeyGet)
+dbase.c:45: Undocumented modification of c possible from call to erc_iterStart:
+               erc_iterStart(c)
+dbase.c:56: Name _db_keyGet is in the implementation name space (any identifier
+               beginning with underscore)
+dbase.c: (in function _db_keyGet)
+dbase.c:61: Assignment of enum { mMGRS, fMGRS, mNON, fNON } to int: i = mMGRS
+dbase.c:61: Operands of <= have incompatible types (int, enum { mMGRS, fMGRS,
+               mNON, fNON }): i <= fNON
+dbase.c:63: Undocumented use of global db
+dbase.c:63: Undetected modification possible from call to unconstrained
+               function _db_ercKeyGet: _db_ercKeyGet
+dbase.c:61: Incompatible types for <= (int, enum { mMGRS, fMGRS, mNON, fNON })
+               (in post loop test): i <= fNON
+dbase.c:73: Name _db_addEmpls is in the implementation name space (any
+               identifier beginning with underscore)
+dbase.c: (in function _db_addEmpls)
+dbase.c:81: Undocumented modification of c possible from call to erc_iterStart:
+               erc_iterStart(c)
+dbase.c:86: Undocumented modification of s possible from call to empset_insert:
+               empset_insert(s, e)
+dbase.c:86: Return value (type bool) ignored: empset_insert(s, e)
+dbase.c: (in function hire)
+dbase.c:97: Body of if statement is not a block: return genderERR
+dbase.c:100: Body of if statement is not a block: return jobERR
+dbase.c:103: Body of if statement is not a block: return salERR
+dbase.c:105: Undetected modification possible from call to unconstrained
+                function _db_keyGet: _db_keyGet
+dbase.c:106: Body of if statement is not a block: return duplERR
+dbase.c: (in function uncheckedHire)
+dbase.c:121: Undocumented use of global db
+dbase.c:121: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mMGRS]
+dbase.c:121: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[mMGRS], er)
+dbase.c:123: Undocumented use of global db
+dbase.c:123: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:123: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[mNON], er)
+dbase.c:121: Body of if clause of if statement is not a block:
+                erc_insert(db[mMGRS], er)
+dbase.c:123: Body of else clause of if statement is not a block:
+                erc_insert(db[mNON], er)
+dbase.c:126: Undocumented use of global db
+dbase.c:126: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fMGRS]
+dbase.c:126: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[fMGRS], er)
+dbase.c:128: Undocumented use of global db
+dbase.c:128: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:128: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[fNON], er)
+dbase.c:126: Body of if clause of if statement is not a block:
+                erc_insert(db[fMGRS], er)
+dbase.c:128: Body of else clause of if statement is not a block:
+                erc_insert(db[fNON], er)
+dbase.c:123: Body of if clause of if statement is not a block:
+    if (e.j == MGR) erc_insert(db[mMGRS], er) else erc_insert(db[mNON], er)
+dbase.c: (in function fire)
+dbase.c:137: Assignment of enum { mMGRS, fMGRS, mNON, fNON } to int: i = mMGRS
+dbase.c:137: Operands of <= have incompatible types (int, enum { mMGRS, fMGRS,
+                mNON, fNON }): i <= fNON
+dbase.c:138: Undocumented use of global db
+dbase.c:138: Undocumented modification of db[] possible from call to
+                erc_iterStart: erc_iterStart(db[i])
+dbase.c:142: Undocumented use of global db
+dbase.c:142: Undocumented modification of db[] possible from call to
+                erc_delete: erc_delete(db[i], er)
+dbase.c:142: Return value (type bool) ignored: erc_delete(db[i]...
+dbase.c:139: Body of for statement is not a block:
+                if (eref_get(er).ssNum == ssNum) { erc_iterFinal(it) }
+dbase.c:139: Body of for statement is not a block:
+    for (er = erc_yield(it = erc_iterStart(db[i])); !eref_equal(er, erefNIL);
+    er = erc_yield(it)) if (eref_get(er).ssNum == ssNum) { erc_iterFinal(it) }
+dbase.c:137: Incompatible types for <= (int, enum { mMGRS, fMGRS, mNON, fNON })
+                (in post loop test): i <= fNON
+dbase.c: (in function promote)
+dbase.c:156: Undocumented use of global db
+dbase.c:156: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:156: Undetected modification possible from call to unconstrained
+                function _db_ercKeyGet: _db_ercKeyGet
+dbase.c:160: Undocumented use of global db
+dbase.c:160: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:160: Undetected modification possible from call to unconstrained
+                function _db_ercKeyGet: _db_ercKeyGet
+dbase.c:162: Body of if statement is not a block: return FALSE
+dbase.c:172: Undocumented use of global db
+dbase.c:172: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:172: Undocumented modification of db[] possible from call to
+                erc_delete: erc_delete(db[mNON], er)
+dbase.c:172: Return value (type bool) ignored: erc_delete(db[mN...
+dbase.c:173: Undocumented use of global db
+dbase.c:173: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mMGRS]
+dbase.c:173: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[mMGRS], er)
+dbase.c:177: Undocumented use of global db
+dbase.c:177: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:177: Undocumented modification of db[] possible from call to
+                erc_delete: erc_delete(db[fNON], er)
+dbase.c:177: Return value (type bool) ignored: erc_delete(db[fN...
+dbase.c:178: Undocumented use of global db
+dbase.c:178: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fMGRS]
+dbase.c:178: Undocumented modification of db[] possible from call to
+                erc_insert: erc_insert(db[fMGRS], er)
+dbase.c: (in function setSalary)
+dbase.c:194: Undetected modification possible from call to unconstrained
+                function _db_keyGet: _db_keyGet
+dbase.c: (in function query)
+dbase.c:226: Assignment of enum { mMGRS, fMGRS, mNON, fNON } to int: i = mMGRS
+dbase.c:226: Operands of <= have incompatible types (int, enum { mMGRS, fMGRS,
+                mNON, fNON }): i <= fNON
+dbase.c:227: Undocumented use of global db
+dbase.c:227: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:227: Body of for statement is not a block:
+                numAdded += _db_addEmpls(db[i], l, h, s)
+dbase.c:226: Incompatible types for <= (int, enum { mMGRS, fMGRS, mNON, fNON })
+                (in post loop test): i <= fNON
+dbase.c:230: Undocumented use of global db
+dbase.c:230: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mMGRS]
+dbase.c:230: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:231: Undocumented use of global db
+dbase.c:231: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fMGRS]
+dbase.c:231: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:234: Undocumented use of global db
+dbase.c:234: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:234: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:235: Undocumented use of global db
+dbase.c:235: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:235: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:242: Undocumented use of global db
+dbase.c:242: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mMGRS]
+dbase.c:242: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:243: Undocumented use of global db
+dbase.c:243: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:243: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:246: Undocumented use of global db
+dbase.c:246: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mMGRS]
+dbase.c:246: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:248: Undocumented use of global db
+dbase.c:248: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[mNON]
+dbase.c:248: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:254: Undocumented use of global db
+dbase.c:254: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fMGRS]
+dbase.c:254: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:255: Undocumented use of global db
+dbase.c:255: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:255: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:258: Undocumented use of global db
+dbase.c:258: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fMGRS]
+dbase.c:258: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:260: Undocumented use of global db
+dbase.c:260: Array fetch using non-integer, enum { mMGRS, fMGRS, mNON, fNON }:
+                db[fNON]
+dbase.c:260: Undetected modification possible from call to unconstrained
+                function _db_addEmpls: _db_addEmpls
+dbase.c:210: Variable er declared but not used
+dbase.c:211: Variable e declared but not used
+dbase.c:263: Suspect object listed in modifies of query not modified: s
+   dbase.lcl:49: Specification of query
+dbase.c: (in function db_print)
+dbase.c:272: Assignment of enum { mMGRS, fMGRS, mNON, fNON } to int: i = mMGRS
+dbase.c:272: Operands of <= have incompatible types (int, enum { mMGRS, fMGRS,
+                mNON, fNON }): i <= fNON
+dbase.c:274: Undocumented use of global db
+dbase.c:272: Incompatible types for <= (int, enum { mMGRS, fMGRS, mNON, fNON })
+                (in post loop test): i <= fNON
+< checking drive.c >
+drive.c: (in function main)
+drive.c:22: Statement has no effect: employee_initMod()
+drive.c:23: Statement has no effect: empset_initMod()
+drive.c:48: Return value (type bool) ignored: employee_setName...
+drive.c:49: Return value (type bool) ignored: empset_insert(em...
+drive.c:64: Return value (type bool) ignored: employee_setName...
+drive.c:65: Return value (type bool) ignored: empset_delete(em...
+drive.c:82: Return value (type bool) ignored: employee_setName...
+drive.c:83: Return value (type bool) ignored: empset_insert(em...
+drive.c:107: Return value (type bool) ignored: empset_delete(em...
+drive.c:116: Body of if clause of if statement is not a block: e.gen = MALE
+drive.c:116: Body of else clause of if statement is not a block: e.gen = FEMALE
+drive.c:117: Body of if clause of if statement is not a block: e.j = NONMGR
+drive.c:117: Body of else clause of if statement is not a block: e.j = MGR
+drive.c:119: Return value (type bool) ignored: employee_setName...
+drive.c:123: Return value (type db_status) ignored: hire(e)
+drive.c:127: Assignment of db_status to int: j = hire(e)
+drive.c:131: Variable j used before definition
+drive.c:134: Return value (type bool) ignored: fire(17)
+drive.c:158: Return value (type bool) ignored: fire(empset_choo...
+drive.c:11: Parameter argv not used
+< checking macros bool.h >
+< global checks >
+dbase.c:11: Type employeeKinds declared but not used
+eref.lh:8: Function exported but not used outside eref: eref_free
+   eref.h:23: Definition of eref_free
+empset.lh:8: Function exported but not used outside empset: empset_final
+   empset.h:29: Definition of empset_final
+empset.lh:9: Function exported but not used outside empset: empset_clear
+   empset.c:24: Definition of empset_clear
+empset.lh:11: Function exported but not used outside empset:
+                 empset_insertUnique
+   empset.c:53: Definition of empset_insertUnique
+empset.lh:17: Function exported but not used outside empset: empset_member
+   empset.h:30: Definition of empset_member
+empset.lh:18: Function exported but not used outside empset: empset_subset
+   empset.c:144: Definition of empset_subset
+ereftab.lh:10: Function exported but not used outside ereftab: ereftab_delete
+   ereftab.c:26: Definition of ereftab_delete
+dbase.c:13: Variable exported but not used outside dbase: db
+dbase.lh:27: Function exported but not used outside dbase: promote
+   dbase.c:182: Definition of promote
+dbase.lh:28: Function exported but not used outside dbase: setSalary
+   dbase.c:206: Definition of setSalary
+empset.h:10: Variable exported but not used outside empset: known
+dbase.c:15: Variable exported but not used outside dbase: initDone
+dbase.c:40: Function exported but not used outside dbase: _db_ercKeyGet
+   dbase.c:54: Definition of _db_ercKeyGet
+dbase.c:56: Function exported but not used outside dbase: _db_keyGet
+   dbase.c:71: Definition of _db_keyGet
+dbase.c:73: Function exported but not used outside dbase: _db_addEmpls
+   dbase.c:92: Definition of _db_addEmpls
+dbase.c:13: Variable db exported but not declared in header file
+empset.c:5: Function _empset_get exported but not declared in header file
+   empset.c:19: Definition of _empset_get
+dbase.c:15: Variable initDone exported but not declared in header file
+dbase.c:40: Function _db_ercKeyGet exported but not declared in header file
+   dbase.c:54: Definition of _db_ercKeyGet
+dbase.c:56: Function _db_keyGet exported but not declared in header file
+   dbase.c:71: Definition of _db_keyGet
+dbase.c:73: Function _db_addEmpls exported but not declared in header file
+   dbase.c:92: Definition of _db_addEmpls
+< cleaning .......... >
+
+Error Type                Reported  Suppressed
+===================       ========  =========
+abstract                     2           0
+mayaliasunique               1           0
+exitarg                      8           0
+unreachable                  1           0
+forempty                     1           0
+forblock                    11           0
+ifblock                     24           0
+usedef                       1           0
+noeffect                    11           0
+exporttype                   5           0
+exportvar                    2           0
+exportconst                  2           0
+globs                       64           1
+internalglobs                2           0
+warnmissingglobs             1           6
+retvalother                  1           0
+retvalbool                  16           0
+macroparens                  4           0
+usereleased                  1           0
+compdef                      2           0
+mustfree                     3           0
+branchstate                  3           2
+onlytrans                    1           0
+freshtrans                   3           0
+temptrans                    3           2
+readonlytrans                6           0
+mods                        38           0
+mustmod                      2           0
+modfilesys                   0          25
+modnomods                    4           0
+moduncon                    20           0
+modunconnomods               1           0
+ansireserved                 9           0
+nullret                      1           0
+nullstate                    1           0
+sizeoftype                   7           0
+formalarray                  0          17
+type                         1           0
+enumindex                   24           0
+relaxtypes                  15           0
+matchanyintegral             2           0
+exportlocal                 15           0
+exportheader                 4           0
+exportheadervar              2           0
+paramuse                     1           0
+typeuse                      1           0
+varuse                       4           0
+                          ========  =========
+Total                      331          53
+
+Finished LCLint checking --- 331 code errors found, as expected
diff --git a/test/db1/Makefile b/test/db1/Makefile
new file mode 100644
index 0000000..9c865c7
--- /dev/null
+++ b/test/db1/Makefile
@@ -0,0 +1,73 @@
+###
+### LCLint db1 test
+###
+### Taken from sample, second iteration: weakchecks
+###
+
+.SUFFIXES: .lcl .lcs .lh .h .c .o
+.PHONY: check
+
+SHELL = /bin/csh -f
+
+LCLINT = lclint
+LCL = $(LCLINT) -specundef +lh +quiet -nof
+LCLINTLH = $(LCLINT) +lh
+LCSFILES = bool.lcs dbase.lcs employee.lcs empset.lcs erc.lcs eref.lcs ereftab.lcs 
+
+MODULES = bool.lcl employee eref empset ereftab erc dbase drive.c
+OBJS = dbase.o employee.o empset.o erc.o eref.o ereftab.o 
+
+test: 
+	$(MAKE) -e clean
+	$(MAKE) -e check
+
+check: $(LCSFILES)
+	$(LCLINT) -showcol -weak +showscan $(MODULES) -expect 16
+	$(LCLINT) -showcol +strict -modfilesystem +showscan +showsummary $(MODULES) -expect 331
+
+### The following rules generate .lh and .lcs files from .lcl files.  They also
+### ensure that .h files appear to be updated whenever the corresponding .lh
+### file is updated.
+
+.lcl.lh:
+	$(LCL) $*.lcl
+
+.lcl.lcs:
+	$(LCL) $*.lcl
+
+.lh.h:
+	touch $*.h
+
+.c.o:
+	$(GCC) -c $*.c 
+
+###
+### Clean removes junk and all derived files.
+### Tidy removes junk and object and executable files.
+###
+
+clean: tidy
+	-@rm -f *.c.html *.lcl.html *.h.html *.lh.html *.lcs *.lh >& /dev/null
+
+tidy:
+	-@rm -f ,* .,* *.CKP *.BAK .emacs_[0-9]* core a.out *.*~ *~ *.o drive >& /dev/null
+
+### The following dependencies ensure that imported LCL specs 
+### are checked before the specs that import them.
+
+dbase.lcs:   employee.lcs empset.lcs 
+empset.lcs:  employee.lcs
+erc.lcs:     eref.lcs
+eref.lcl:    employee.lcs
+ereftab.lcs: employee.lcs eref.lcs
+
+### The following dependencies ensure that a .o file is recompiled when the
+### corresponding .c file, or one of the .h files it #includes, is changed.
+
+dbase.o:    dbase.c bool.h dbase.h employee.h empset.h
+drive.o:    drive.c bool.h dbase.h employee.h empset.h erc.h eref.h ereftab.h 
+employee.o: employee.c employee.h 
+empset.o:   empset.c bool.h empset.h erc.h eref.h employee.h employee.h 
+erc.o:      erc.c bool.h erc.h eref.h employee.h 
+eref.o:     eref.c eref.h employee.h 
+ereftab.o:  ereftab.c bool.h ereftab.h erc.h eref.h employee.h 
diff --git a/test/db1/README b/test/db1/README
new file mode 100644
index 0000000..54536b8
--- /dev/null
+++ b/test/db1/README
@@ -0,0 +1,18 @@
+     This directory contains the specifications and source code for the
+database example in Chapter 5 of ``Larch: Languages and Tools for Formal
+Specifications.''  Most of the files in this directory were used to typeset the
+figures in Chapter 5.  As a result, they do not adhere to our usual standards
+for specifications and code: they lack comments (because they are described in
+Chapter 5) and their layout is constrained by the horizontal and vertical space
+limitations of the book.
+
+     This directory also contains a Makefile, which can serve as a model for
+constructing Makefiles that can be used to check the specifications and compile
+the code for other programs.
+
+     This directory also contains two files, stdio.lcl and file.lsl, which are
+not shown in Chapter 5.  These files are the bare beginnings of an approach to
+specifying the semantics of the FILE data type in C; they serve little more
+than to enable the LCL Checker to check the specifications for db_print in
+dbase.lcl.
+
diff --git a/test/db1/bool.h b/test/db1/bool.h
new file mode 100644
index 0000000..ca1058b
--- /dev/null
+++ b/test/db1/bool.h
@@ -0,0 +1,34 @@
+#ifndef BOOL_H
+#define BOOL_H
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE (!FALSE)
+#endif
+/*@-cppnames@*/
+typedef int bool;
+/*@=cppnames@*/
+/*
+** bool_initMod has no real effect
+** Declared with modifies internalState, so no noeffect errors are 
+** reported when it is called.)
+*/
+
+extern /*@unused@*/ void bool_initMod (void) /*@modifies internalState@*/ ;
+/*@-mustmod@*/
+# define bool_initMod()
+/*@=mustmod@*/
+
+extern /*@unused@*/ /*@observer@*/ char *bool_unparse (bool) /*@*/ ;
+# define bool_unparse(b) ((b) ? "true" : "false" )
+
+extern /*@unused@*/ bool bool_not (bool) /*@*/ ;
+# define bool_not(b) ((b) ? FALSE : TRUE)
+
+extern /*@unused@*/ bool bool_equal (bool, bool) /*@*/ ;
+# define bool_equal(a,b) ((a) ? (b) : !(b))
+
+# endif
diff --git a/test/db1/bool.lcl b/test/db1/bool.lcl
new file mode 100644
index 0000000..e70461e
--- /dev/null
+++ b/test/db1/bool.lcl
@@ -0,0 +1,5 @@
+immutable type bool;
+
+constant bool TRUE;
+constant bool FALSE;
+
diff --git a/test/db1/bool.lcs b/test/db1/bool.lcs
new file mode 100644
index 0000000..fa3d2a7
--- /dev/null
+++ b/test/db1/bool.lcs
@@ -0,0 +1,121 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLconst TRUE bool
+%LCLconst FALSE bool
+%LCLSymbolTableEnd
diff --git a/test/db1/bool.lh b/test/db1/bool.lh
new file mode 100644
index 0000000..278c27d
--- /dev/null
+++ b/test/db1/bool.lh
@@ -0,0 +1,4 @@
+/* Output from LCLint 2.5m */
+# include "bool.h"
+
+
diff --git a/test/db1/dbase.c b/test/db1/dbase.c
new file mode 100644
index 0000000..3257ce0
--- /dev/null
+++ b/test/db1/dbase.c
@@ -0,0 +1,278 @@
+# include 
+# include "dbase.h"
+
+# define firstERC mMGRS
+# define lastERC fNON
+# define numERCS (lastERC - firstERC + 1)
+
+typedef enum
+{
+  mMGRS, fMGRS, mNON, fNON
+} employeeKinds;
+
+erc db[numERCS];
+
+bool initDone = FALSE;
+
+void db_initMod (void)
+{
+  int i;
+  
+  if (initDone)
+    {
+      return;
+    }
+  
+  bool_initMod ();
+  employee_initMod ();
+  eref_initMod ();
+  erc_initMod ();
+  empset_initMod ();
+  
+  for (i = firstERC; i <= lastERC; i++)
+    {
+      db[i] = erc_create ();
+    }
+  
+  initDone = TRUE;
+}
+
+eref _db_ercKeyGet (erc c, int key) 
+{
+  eref er;
+  ercIter it;
+  
+  for_ercElems (er, it, c)
+    {
+      if (eref_get (er).ssNum == key)
+	{
+	  erc_iterReturn (it, er);
+	}
+    }
+  
+  return erefNIL;
+}
+
+eref _db_keyGet (int key)
+{
+  int i;
+  eref er;
+  
+  for (i = firstERC; i <= lastERC; i++)
+    {
+      er = _db_ercKeyGet (db[i], key);
+      if (!eref_equal (er, erefNIL))
+	{
+	  return er;
+	}
+    }
+  
+  return erefNIL;
+}
+
+int _db_addEmpls (erc c, int l, int h, empset s)
+{
+  eref er;
+  ercIter it;
+  employee e;
+  int numAdded;
+  numAdded = 0;
+  
+  for_ercElems (er, it, c)
+    {
+      e = eref_get (er);
+      if ((e.salary >= l) && (e.salary <= h))
+	{
+	  empset_insert (s, e);
+	  numAdded++;
+	}
+    }
+  
+  return numAdded;
+}
+
+db_status hire (employee e)
+{
+  if (e.gen == gender_ANY)
+    return genderERR;
+
+  if (e.j == job_ANY)
+    return jobERR;
+
+  if (e.salary < 0)
+    return salERR;
+
+  if (!eref_equal (_db_keyGet (e.ssNum), erefNIL))
+    return duplERR;
+
+  uncheckedHire (e);
+  return db_OK;
+}
+
+void uncheckedHire (employee e)
+{
+  eref er;
+  
+  er = eref_alloc ();
+  eref_assign (er, e);
+  
+  if (e.gen == MALE)
+    if (e.j == MGR)
+      erc_insert (db[mMGRS], er);
+    else
+      erc_insert (db[mNON], er);
+  else
+    if (e.j == MGR)
+      erc_insert (db[fMGRS], er);
+    else
+      erc_insert (db[fNON], er);
+}
+
+bool fire (int ssNum)
+{
+  int i;
+  eref er;
+  ercIter it;
+  
+  for (i = firstERC; i <= lastERC; i++)
+    for_ercElems (er, it, db[i])
+      if (eref_get (er).ssNum == ssNum)
+	{
+	  erc_iterFinal (it);
+	  erc_delete (db[i], er);
+	  return TRUE;
+	}
+  
+  return FALSE;
+}
+
+bool promote (int ssNum)
+{
+  eref er;
+  employee e;
+  gender g;
+  
+  g = MALE;
+  er = _db_ercKeyGet (db[mNON], ssNum);
+  
+  if (eref_equal (er, erefNIL))
+    {
+      er = _db_ercKeyGet (db[fNON], ssNum);
+      if (eref_equal (er, erefNIL))
+	return FALSE;
+      g = FEMALE;
+    }
+  
+  e = eref_get (er);
+  e.j = MGR;
+  eref_assign (er, e);
+  
+  if (g == MALE)
+    {
+      erc_delete (db[mNON], er);
+      erc_insert (db[mMGRS], er);
+    } 
+  else
+    {
+      erc_delete (db[fNON], er);
+      erc_insert (db[fMGRS], er);
+    }
+  
+  return TRUE;
+}
+
+db_status setSalary (int ssNum, int sal)
+{
+  eref er;
+  employee e;
+  
+  if (sal < 0)
+    {
+      return salERR;
+    }
+
+  er = _db_keyGet (ssNum);
+
+  if (eref_equal (er, erefNIL))
+    {
+      return missERR;
+    }
+
+  e = eref_get (er);
+  e.salary = sal;
+  eref_assign (er, e);
+
+  return db_OK;
+}
+
+int query (db_q q, empset s)
+{
+  eref er;	       
+  employee e;		
+  int numAdded;
+  int l, h;
+  int i;
+
+  l = q.l;
+  h = q.h;
+
+  switch (q.g)
+    {
+    case gender_ANY:
+      switch (q.j)
+	{
+	case job_ANY:
+	  numAdded = 0;
+	  for (i = firstERC; i <= lastERC; i++)
+	    numAdded += _db_addEmpls (db[i], l, h, s);
+	  return numAdded;
+	case MGR:
+	  numAdded = _db_addEmpls (db[mMGRS], l, h, s);
+	  numAdded += _db_addEmpls (db[fMGRS], l, h, s);
+	  return numAdded;
+	case NONMGR:
+	  numAdded = _db_addEmpls (db[mNON], l, h, s);
+	  numAdded += _db_addEmpls (db[fNON], l, h, s);
+	  return numAdded;
+	}
+    case MALE:
+      switch (q.j)
+	{
+	case job_ANY:
+	  numAdded = _db_addEmpls (db[mMGRS], l, h, s);
+	  numAdded += _db_addEmpls (db[mNON], l, h, s);
+	  return numAdded;
+	case MGR:
+	  return _db_addEmpls (db[mMGRS], l, h, s);
+	case NONMGR:
+	  return _db_addEmpls (db[mNON], l, h, s);
+	}
+    case FEMALE:
+      switch (q.j)
+	{
+	case job_ANY:
+	  numAdded = _db_addEmpls (db[fMGRS], l, h, s);
+	  numAdded += _db_addEmpls (db[fNON], l, h, s);
+	  return numAdded;
+	case MGR:
+	  return _db_addEmpls (db[fMGRS], l, h, s);
+	case NONMGR:
+	  return _db_addEmpls (db[fNON], l, h, s);
+	}
+    }
+}
+
+void db_print (void)
+{
+  int i;
+  char *printVal;
+  
+  printf ("Employees:\n");
+
+  for (i = firstERC; i <= lastERC; i++)
+    {
+      printVal = erc_sprint (db[i]);
+      printf ("%s", printVal);
+      free (printVal);
+    }
+}
diff --git a/test/db1/dbase.h b/test/db1/dbase.h
new file mode 100644
index 0000000..c684fc5
--- /dev/null
+++ b/test/db1/dbase.h
@@ -0,0 +1,9 @@
+# ifndef DBASE_H
+# define DBASE_H
+
+# include "eref.h"
+# include "erc.h"
+
+# include "dbase.lh"
+
+# endif
diff --git a/test/db1/dbase.lcl b/test/db1/dbase.lcl
new file mode 100644
index 0000000..1443a79
--- /dev/null
+++ b/test/db1/dbase.lcl
@@ -0,0 +1,96 @@
+imports employee, empset, ;
+
+typedef struct{gender g; job j; int l; int h;} db_q;
+typedef enum {db_OK, salERR, genderERR, jobERR,
+              duplERR, missERR} db_status;
+spec immutable type db;
+spec db d;
+
+claims UniqueKeys (employee e1, employee e2) db d; 
+{	
+ /* ensures
+     (e1 \in d\any /\ e2 \in d\any  /\ e1.ssNum = e2.ssNum)
+       => (e1 = e2);
+ */
+}	
+
+db_status hire(employee e) db d; 
+{
+  modifies d;
+  /* ensures
+     (if result = db_OK
+      then d' = hire(e, d^) else d' = d^)
+        /\ result =
+          (if e.gen = gender_ANY then genderERR
+           else if e.j = job_ANY then jobERR
+           else if e.salary < 0 then salERR
+           else if employed(d^, e.ssNum) then duplERR
+           else db_OK);
+  */
+}
+
+void uncheckedHire(employee e) db d; 
+{
+  /* requires e.gen \neq gender_ANY /\ e.j \neq job_ANY
+            /\ e.salary >= 0 /\ ~employed(d^, e.ssNum);
+  */
+  modifies d;
+  /* ensures d' = hire(e, d^); */
+}
+
+bool fire(int ssNum) db d; 
+{
+  modifies d;
+  /* ensures result = employed(d^, ssNum)
+       /\ d' = fire(d^, ssNum);
+  */
+}
+
+int query(db_q q, empset s) db d; 
+{
+  modifies s;
+  /* ensures s' = s^ \U query(d^, q)
+       /\ result = size(query(d^, q));
+  */
+}
+
+bool promote(int ssNum) db d; 
+{
+  modifies d;
+  /* ensures
+       result = (employed(d^, ssNum)
+                /\ find(d^, ssNum).j = NONMGR)
+          /\ (if result then d' = promote(d^, ssNum)
+              else d' = d^);
+  */
+}
+
+db_status setSalary(int ssNum, int sal) db d; 
+{
+  modifies d;
+  /* 
+  ensures
+      result =
+        (if employed(d^, ssNum)
+           then (if sal < 0 then salERR else db_OK)
+           else missERR)
+      /\ (if result = db_OK
+            then d' = setSal(d^, ssNum, sal)
+            else d' = d^);
+  */
+}
+
+void db_print(void) db d; FILE *stdout; 
+{
+  modifies *stdout^;
+  /*
+  ensures 
+    \exists s:ioStream ((*stdout^)' = write((*stdout^)^, s) /\ isSprint(d^, s));
+  */
+}
+
+void db_initMod(void) db d; 
+{
+  modifies d;
+  /* ensures d' = new; */
+}
diff --git a/test/db1/dbase.lcs b/test/db1/dbase.lcs
new file mode 100644
index 0000000..e774f8d
--- /dev/null
+++ b/test/db1/dbase.lcs
@@ -0,0 +1,691 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLsort ereftab immutable nil nil
+%LCLsort _ereftab_Obj mutable ereftab nil
+%LCLsort erc immutable nil nil
+%LCLsort _erc_Obj mutable erc nil
+%LCLsort ercIter immutable nil nil
+%LCLsort _ercIter_Obj mutable ercIter nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _sdbase1s_Struct str sdbase1s nil
+%LCLsort h strMem _int_Obj nil
+%LCLsort l strMem _int_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort g strMem __eemployee0e_Enum_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sdbase1s_Struct_Tuple tup _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Ptr ptr _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Arr arr _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Tuple_Vec vec _sdbase1s_Struct_Tuple __sdbase1s_Struct_Arr
+%LCLsort _db_q synonym _sdbase1s_Struct nil
+%LCLsort _edbase2e_Enum enum edbase2e nil
+%LCLsort missERR enumMem nil nil
+%LCLsort duplERR enumMem nil nil
+%LCLsort jobERR enumMem nil nil
+%LCLsort genderERR enumMem nil nil
+%LCLsort salERR enumMem nil nil
+%LCLsort db_OK enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _db_status synonym _edbase2e_Enum nil
+%LCLsort db immutable nil nil
+%LCLsort _db_Obj obj db nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLtag eemployee0e enum
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLtag sstdlib1s struct
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag eemployee1e enum
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLtag semployee0s struct
+%LCLop db_OK : -> _edbase2e_Enum
+%LCLop salERR : -> _edbase2e_Enum
+%LCLop genderERR : -> _edbase2e_Enum
+%LCLop jobERR : -> _edbase2e_Enum
+%LCLop duplERR : -> _edbase2e_Enum
+%LCLop missERR : -> _edbase2e_Enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__sdbase1s_Struct_Ptr -> __sdbase1s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__sdbase1s_Struct_Tuple_Vec, int -> _sdbase1s_Struct_Tuple
+%LCLop __ [__] :__sdbase1s_Struct_Arr, int -> _sdbase1s_Struct
+%LCLop [__, __, __, __] :int, int, _eemployee1e_Enum, _eemployee0e_Enum -> _sdbase1s_Struct_Tuple
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \select g :_sdbase1s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select g :_sdbase1s_Struct -> __eemployee0e_Enum_Obj
+%LCLop null : -> char
+%LCLop __ \select l :_sdbase1s_Struct_Tuple -> int
+%LCLop __ \select l :_sdbase1s_Struct -> _int_Obj
+%LCLop __ \field_arrow g :__sdbase1s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \select h :_sdbase1s_Struct_Tuple -> int
+%LCLop __ \select h :_sdbase1s_Struct -> _int_Obj
+%LCLop __ \field_arrow l :__sdbase1s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow h :__sdbase1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \select j :_sdbase1s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_sdbase1s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow j :__sdbase1s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __sdbase1s_Struct_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__sdbase1s_Struct_Ptr, int -> __sdbase1s_Struct_Ptr
+%LCLop __ + __  :int, __sdbase1s_Struct_Ptr -> __sdbase1s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__sdbase1s_Struct_Ptr, int -> __sdbase1s_Struct_Ptr
+%LCLop __ - __  :__sdbase1s_Struct_Ptr, __sdbase1s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop sizeof :ereftab -> int
+%LCLop sizeof :erc -> int
+%LCLop sizeof :ercIter -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_edbase2e_Enum -> int
+%LCLop sizeof :db -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__sdbase1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sdbase1s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLconst TRUE bool
+%LCLconst FALSE bool
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLconst TRUE bool
+%LCLconst FALSE bool
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype empset _empset_Obj mutable
+%LCLfcn empset_create :  -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_final : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_clear : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_insert : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_insertUnique : _empset_Obj, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_delete : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_union : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_disjointUnion : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_intersect : _empset_Obj, _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_size : _empset_Obj -> int 
+%LCLfcnGlobals 
+%LCLfcn empset_member : _semployee0s_Struct_Tuple, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_subset : _empset_Obj, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_choose : _empset_Obj -> _semployee0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn empset_sprint : _empset_Obj -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn empset_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype db_q _db_q exposed
+%LCLenumConst db_OK _edbase2e_Enum
+%LCLenumConst salERR _edbase2e_Enum
+%LCLenumConst genderERR _edbase2e_Enum
+%LCLenumConst jobERR _edbase2e_Enum
+%LCLenumConst duplERR _edbase2e_Enum
+%LCLenumConst missERR _edbase2e_Enum
+%LCLtype db_status _db_status exposed
+%LCLtype db db immutable
+%LCLvar d _db_Obj
+%LCLfcn hire : _semployee0s_Struct_Tuple -> _edbase2e_Enum 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn uncheckedHire : _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn fire : int -> bool 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn query : _sdbase1s_Struct_Tuple, _empset_Obj -> int 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn promote : int -> bool 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn setSalary : int, int -> _edbase2e_Enum 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn db_print :  -> void 
+%LCLfcnGlobals _db_Obj d; ___FILE_Obj_Ptr_Obj stdout; 
+%LCLfcn db_initMod :  -> void 
+%LCLfcnGlobals _db_Obj d; 
+%LCLSymbolTableEnd
diff --git a/test/db1/dbase.lh b/test/db1/dbase.lh
new file mode 100644
index 0000000..082439b
--- /dev/null
+++ b/test/db1/dbase.lh
@@ -0,0 +1,30 @@
+/* Output from LCLint 2.5m */
+
+# include 
+# include "bool.h"
+# include "employee.h"
+# include "empset.h"
+
+
+# ifndef EXPOSED_TYPE_db_q
+typedef struct {
+    gender g;
+    job j;
+    int l;
+    int h;
+    } db_q;
+# endif
+
+
+# ifndef EXPOSED_TYPE_db_status
+typedef enum {db_OK, salERR, genderERR, jobERR, duplERR, missERR} db_status;
+# endif
+
+extern db_status hire (employee  /* e */);
+extern void uncheckedHire (employee  /* e */);
+extern bool fire (int  /* ssNum */);
+extern int query (db_q  /* q */, empset  /* s */);
+extern bool promote (int  /* ssNum */);
+extern db_status setSalary (int  /* ssNum */, int  /* sal */);
+extern void db_print (void);
+extern void db_initMod (void);
diff --git a/test/db1/drive.c b/test/db1/drive.c
new file mode 100644
index 0000000..4f5368c
--- /dev/null
+++ b/test/db1/drive.c
@@ -0,0 +1,163 @@
+/* Part of a driver used to test dbase  */
+
+/* Include those modules that export things that are used explicitly here */
+ 
+# include 
+# include "bool.h"
+# include "employee.h"
+# include "empset.h"
+# include "dbase.h"
+
+int main(int argc, char *argv[]) 
+{
+  employee e;
+  empset em1, em2, em3;
+  char na[10000];
+  char * sprintResult;
+  int i, j;
+  db_q q;
+  
+  /* Initialize all of the LCL-specified modules that were included */
+  bool_initMod();
+  employee_initMod();
+  empset_initMod();
+  db_initMod();
+  
+  if (argc != 1) 
+    {
+      printf ("FormatPos: Wrong number of arguments. Given %d needs 0.\n",
+	      argc - 1);
+      return 1;
+    }
+  
+  /* Unit test empset */
+  em1 = empset_create();
+
+  if (!(empset_size(em1) == 0))
+    {
+      printf("Size should be 0.\n");
+    }
+
+  for (i = 0; i < 500; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 100000;
+      e.gen = MALE;
+      e.j = MGR;
+      (void) sprintf(na, "S.S. Doe %d", i);
+      employee_setName(&e, na);
+      empset_insert(em1, e);
+    }
+
+  if (!(empset_size(em1) == 500)) 
+    {
+      printf("Size should be 500.\n");
+    }
+
+  for (i = 0; i < 250; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 100000;
+      e.gen = MALE;
+      e.j = MGR;
+      (void) sprintf(na, "S.S. Doe %d", i);
+      employee_setName(&e, na);
+      empset_delete(em1, e);
+    }
+
+  if (!(empset_size(em1) == 250)) 
+    {
+      printf("Size should be 250.\n");
+    }
+
+  em2 = empset_create();
+
+  for (i = 0; i < 100; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 100000;
+      e.gen = MALE;
+      e.j = MGR;
+      (void) sprintf(na, "S.S. Doe %d", i);
+      employee_setName(&e, na);
+      empset_insert(em2, e);
+    }
+
+  em3 = empset_union(em1, em2);
+
+  if (!(empset_size(em3) == 350))
+    {
+      printf("Size should be 350.\n");
+    }
+
+  empset_intersect(em3, em3);
+
+  if (!(empset_size(em3) == 350))
+    {
+      printf("Size should be 350.\n");
+    }
+
+  printf("Print two different employees:\n");
+
+  for (i = 0; i < 2; i++) 
+    {
+      e = empset_choose(em3);
+      employee_sprint(na, e);
+      printf("%s\n", &(na[0]));
+      empset_delete(em3, e);
+    }
+  
+  /* Test dbase  */
+
+  for (i = 0; i < 20; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 10 * i;
+      if (i < 10) e.gen = MALE; else e.gen = FEMALE;
+      if (i < 15) e.j = NONMGR; else e.j = MGR;
+      (void) sprintf(na, "J. Doe %d", i);
+      employee_setName(&e, na);
+
+      if ((i/2)*2 == i) 
+	{
+	  hire(e); 
+	}
+      else 
+	{
+	  uncheckedHire(e); j = hire(e);
+	}
+    }
+  
+  printf("Should print 4: %d\n", j); 
+  printf("Employees 0 - 19\n");
+  db_print();
+  fire(17);
+  q.g = FEMALE; q.j = job_ANY; q.l = 158; q.h = 185;
+  printf("Employees 0 - 16, 18 - 19\n");
+  db_print();
+
+  i = query(q, em1 = empset_create());
+  sprintResult = empset_sprint(em1);
+  printf("Should get two females: %d\n%s\n", i, sprintResult);
+  free(sprintResult);
+
+  q.g = MALE; q.j = NONMGR; q.l = 0; q.h = 185;
+  i = query(q, em2 = empset_create());
+  em3 = empset_disjointUnion(em2, em1);
+  sprintResult = empset_sprint(em3);
+  i = empset_size(em3);
+  printf("Should get two females and ten males: %d\n%s\n", i, sprintResult);
+  free(sprintResult);
+  
+  empset_intersect(em1, em3);
+  sprintResult = empset_sprint(em1);
+  i = empset_size(em1);
+  printf("Should get two females: %d\n%s\n", i, sprintResult);
+  free(sprintResult); 
+
+  fire(empset_choose(em3).ssNum);
+  printf("Should get 18 employees\n");
+  db_print();
+  
+  return 0;
+}
diff --git a/test/db1/employee.c b/test/db1/employee.c
new file mode 100644
index 0000000..76354e9
--- /dev/null
+++ b/test/db1/employee.c
@@ -0,0 +1,35 @@
+# include 
+# include 
+# include "employee.h"
+
+bool employee_setName (employee *e, char na []) 
+{
+  int i;
+  
+  for (i = 0; na[i] != '\0'; i++)
+    {
+      if (i == maxEmployeeName) return FALSE;
+    }
+
+  strcpy (e->name, na);
+  return TRUE;
+}
+
+bool employee_equal (employee * e1, employee * e2) 
+{
+  return ((e1->ssNum == e2->ssNum)
+	  && (e1->salary == e2->salary)
+	  && (e1->gen == e2->gen)
+	  && (e1->j == e2->j)
+	  && (strncmp (e1->name, e2->name, maxEmployeeName) == 0));
+}
+
+void employee_sprint (char s[], employee e) 
+{
+  static char *gender[] ={ "male", "female", "?" };
+  static char *jobs[] = { "manager", "non-manager", "?" };
+  
+  (void) sprintf (s, employeeFormat, e.ssNum, e.name,
+		  gender[e.gen], jobs[e.j], e.salary);
+}
+
diff --git a/test/db1/employee.h b/test/db1/employee.h
new file mode 100644
index 0000000..b632612
--- /dev/null
+++ b/test/db1/employee.h
@@ -0,0 +1,11 @@
+# ifndef EMPLOYEE_H
+# define EMPLOYEE_H
+
+# define maxEmployeeName (20)
+# define employeeFormat "%9d  %-20s  %-6s  %-11s  %6d.00"
+# define employeePrintSize (63)
+
+# include "employee.lh"
+
+# define employee_initMod()  bool_initMod()
+# endif
diff --git a/test/db1/employee.lcl b/test/db1/employee.lcl
new file mode 100644
index 0000000..c986c3e
--- /dev/null
+++ b/test/db1/employee.lcl
@@ -0,0 +1,53 @@
+imports bool;
+
+constant int maxEmployeeName;
+constant int employeePrintSize;
+
+typedef enum { MALE, FEMALE, gender_ANY } gender;
+typedef enum { MGR, NONMGR, job_ANY } job;
+
+typedef struct 
+{
+  int ssNum;
+  char name[maxEmployeeName];
+  int salary;
+  gender gen;
+  job j;
+} employee;
+
+void employee_sprint (out char s[], employee e) 
+{
+  /* requires maxIndex(s) >= employeePrintSize; */
+  modifies s;
+  /* ensures isSprint(s', e)
+        /\ lenStr(s') = employeePrintSize;
+  */
+}
+
+bool employee_equal (employee *e1, employee *e2) 
+{
+  /* ensures result = sameStr(e1->name^, e2->name^)
+           /\ (e1->ssNum^ = e2->ssNum^)
+           /\ (e1->salary^ = e2->salary^)
+           /\ (e1->gen^ = e2->gen^)
+           /\ (e1->j^ = e2->j^);
+  */
+}
+
+bool employee_setName(employee *e, char na[]) 
+{
+  /* requires nullTerminated(na^); */
+  modifies e->name;
+  /* ensures result = lenStr(na^) < maxEmployeeName
+           /\ (if result
+               then sameStr(e->name', na^)
+                     /\ nullTerminated(e->name')
+               else e->name' = e->name^);
+  */
+}
+
+void employee_initMod(void) 
+{
+  ensures true;
+}
+
diff --git a/test/db1/employee.lcs b/test/db1/employee.lcs
new file mode 100644
index 0000000..92ba154
--- /dev/null
+++ b/test/db1/employee.lcs
@@ -0,0 +1,205 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLconst TRUE bool
+%LCLconst FALSE bool
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db1/employee.lh b/test/db1/employee.lh
new file mode 100644
index 0000000..00da3ca
--- /dev/null
+++ b/test/db1/employee.lh
@@ -0,0 +1,30 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "bool.h"
+
+
+# ifndef EXPOSED_TYPE_gender
+typedef enum {MALE, FEMALE, gender_ANY} gender;
+# endif
+
+
+# ifndef EXPOSED_TYPE_job
+typedef enum {MGR, NONMGR, job_ANY} job;
+# endif
+
+
+# ifndef EXPOSED_TYPE_employee
+typedef struct {
+    int ssNum;
+    char name[maxEmployeeName];
+    int salary;
+    gender gen;
+    job j;
+    } employee;
+# endif
+
+extern void employee_sprint (/*@out@*/ char  /* s */[], employee  /* e */);
+extern bool employee_equal (employee * /* e1 */, employee * /* e2 */);
+extern bool employee_setName (employee * /* e */, char  /* na */[]);
+extern void employee_initMod (void);
diff --git a/test/db1/empset.c b/test/db1/empset.c
new file mode 100644
index 0000000..472d9b3
--- /dev/null
+++ b/test/db1/empset.c
@@ -0,0 +1,157 @@
+# include "empset.h"
+
+static bool initDone = FALSE;
+
+eref _empset_get (employee e, erc s) 
+{
+  eref er;
+  ercIter it;
+  employee e1;
+
+  for_ercElems (er, it, s) 
+    {
+      e1 = eref_get (er);
+      if (employee_equal (&e1, &e))
+	erc_iterReturn (it, er);
+    }
+  
+  return erefNIL;
+}
+
+void empset_clear (empset s) 
+{
+  erc_clear (s);
+}
+
+bool empset_insert (empset s, employee e) 
+{
+  eref er; 
+  
+  if (!eref_equal (_empset_get (e, s), erefNIL)) 
+    {
+      return FALSE;
+    }
+  
+  empset_insertUnique (s, e);
+  return TRUE;
+}
+
+void empset_insertUnique (empset s, employee e) 
+{
+  eref er;
+
+  er = ereftab_lookup (e, known);
+
+  if (eref_equal (er, erefNIL)) 
+    {
+      er = eref_alloc ( );
+      eref_assign (er,e);
+      ereftab_insert (known, e, er);
+    }
+  
+  erc_insert (s, er);
+}
+
+bool empset_delete (empset s, employee e) 
+{
+  eref er;
+
+  er = _empset_get (e, s);
+
+  if (eref_equal (er, erefNIL)) 
+    {
+      return FALSE;
+    }
+  return erc_delete (s, er);
+}
+
+empset empset_disjointUnion (empset s1, empset s2) 
+{
+  erc result;
+  ercIter it;
+  eref er;
+  empset tmp;
+  
+  result = erc_create ( );
+
+  if (erc_size (s1) > erc_size (s2)) 
+    {
+      tmp = s1;
+      s1 = s2;
+      s2 = tmp;
+    }
+  
+  erc_join (result, s1);
+  for_ercElems (er, it, s2)
+    empset_insertUnique (result, eref_get (er));
+
+  return result;
+}
+
+empset empset_union (empset s1, empset s2) 
+{
+  eref er;
+  ercIter it;
+  erc result;
+  empset tmp;
+
+  result = erc_create ();
+
+  if (erc_size (s1) > erc_size (s2)) 
+    {
+      tmp = s1;
+      s1 = s2;
+      s2 = tmp;
+    }
+  erc_join (result, s2);
+
+  for_ercElems (er, it, s1) 
+    if (!empset_member (eref_get (er), s2))
+      erc_insert (result, er);
+
+  return result;
+}
+
+void empset_intersect (empset s1, empset s2) 
+{
+  eref er;
+  ercIter it;
+  erc toDelete;
+
+  toDelete = erc_create ();
+
+  for_ercElems (er, it, s1)
+    if (!empset_member (eref_get (er), s2))
+      erc_insert (toDelete, er);
+  
+  for_ercElems (er, it, toDelete)
+    erc_delete (s1, er);
+
+  erc_final (toDelete);
+}
+
+bool empset_subset (empset s1, empset s2) 
+{
+  employee e; 
+  eref er;
+  ercIter it;
+  
+  for_ercElems (er, it, s1) 
+    if (!empset_member (eref_get (er), s2))
+      erc_iterReturn (it, FALSE);
+  
+  return TRUE;
+}
+
+void empset_initMod (void) 
+{
+  if (initDone) return;
+
+  bool_initMod ();
+  employee_initMod ();
+  eref_initMod ();
+  erc_initMod ();
+  ereftab_initMod ();
+  known = ereftab_create ();
+  initDone = TRUE;
+}
diff --git a/test/db1/empset.h b/test/db1/empset.h
new file mode 100644
index 0000000..a6d329b
--- /dev/null
+++ b/test/db1/empset.h
@@ -0,0 +1,36 @@
+# ifndef EMPSET_H
+# define EMPSET_H
+
+# include "eref.h"
+# include "erc.h"
+# include "ereftab.h"
+
+typedef erc empset;
+
+ereftab known;
+
+/*
+  Abstraction function, toEmpSet:
+    e \in toEmpSet(s) == 
+      exists er (count(er, s.val) = 1
+        /\ getERef(known, e) = er)
+
+  Rep invariant:
+    forall s: empset
+      (forall er: eref (count(er, s.val) <= 1)
+      /\ s.activeIters = 0
+      /\ forall er: eref (count(er, s.val) = 1
+        => in(known, er)))
+*/
+
+# include "empset.lh"
+
+# define empset_create()  (erc_create())
+# define empset_final(s) (erc_final(s))
+# define empset_member(e, s) \
+         (!(eref_equal(_empset_get(e, s), erefNIL)))
+# define empset_size(es) (erc_size(es))
+# define empset_choose(es) (eref_get(erc_choose(es)))
+# define empset_sprint(es) (erc_sprint(es))
+
+# endif
diff --git a/test/db1/empset.lcl b/test/db1/empset.lcl
new file mode 100644
index 0000000..aff92f9
--- /dev/null
+++ b/test/db1/empset.lcl
@@ -0,0 +1,86 @@
+imports employee;
+mutable type empset;
+
+empset empset_create(void) 
+{
+  /* ensures fresh(result) /\ result' = { }; */
+}
+
+void empset_final(empset s) 
+{
+  modifies s;
+  /* ensures trashed(s); */
+}
+
+void empset_clear(empset s) 
+{
+  modifies s;
+  /* ensures s' = { }; */
+}
+
+bool empset_insert(empset s, employee e) 
+{
+  modifies s;
+  /* ensures result = ~(e \in s^) /\ s' = insert(e, s^); */
+}
+
+void empset_insertUnique(empset s, employee e) 
+{
+  /* requires ~(e \in s^); */
+  modifies s;
+  /* ensures s' = insert(e, s^); */
+}
+
+bool empset_delete(empset s, employee e) 
+{
+  modifies s;
+  /* ensures result = e \in s^ /\ s' = delete(e, s^); */
+}
+
+empset empset_union(empset s1, empset s2) 
+{
+  /* ensures result' = s1^ \U s2^ /\ fresh(result); */
+}
+
+empset empset_disjointUnion(empset s1, empset s2) 
+{
+  /* requires s1^ \I s2^ = { }; */
+  /* ensures result' = s1^ \U s2^ /\ fresh(result); */
+}
+
+void empset_intersect(empset s1, empset s2) 
+{
+  modifies s1;
+  /* ensures s1' = s1^ \I s2^; */
+}
+
+int empset_size(empset s) 
+{
+  /* ensures result = size(s^); */
+}
+
+bool empset_member(employee e, empset s) 
+{
+  /* ensures result = e \in s^; */
+}
+
+bool empset_subset(empset s1, empset s2) 
+{
+  /* ensures result = s1^ \subseteq s2^; */
+}
+
+employee empset_choose(empset s) 
+{
+  /* requires s^ \neq { }; */
+  /* ensures result \in s^; */
+}
+
+char *empset_sprint(empset s) 
+{
+  /* ensures isSprint(result[]', s^) /\ fresh(result[]); */
+}
+
+void empset_initMod(void) 
+{
+  ensures true;
+}
diff --git a/test/db1/empset.lcs b/test/db1/empset.lcs
new file mode 100644
index 0000000..83a4b0e
--- /dev/null
+++ b/test/db1/empset.lcs
@@ -0,0 +1,251 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort MALE enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort MGR enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLtag eemployee0e enum
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag eemployee1e enum
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLtag semployee0s struct
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLconst TRUE bool
+%LCLconst FALSE bool
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype empset _empset_Obj mutable
+%LCLfcn empset_create :  -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_final : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_clear : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_insert : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_insertUnique : _empset_Obj, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_delete : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_union : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_disjointUnion : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_intersect : _empset_Obj, _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_size : _empset_Obj -> int 
+%LCLfcnGlobals 
+%LCLfcn empset_member : _semployee0s_Struct_Tuple, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_subset : _empset_Obj, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_choose : _empset_Obj -> _semployee0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn empset_sprint : _empset_Obj -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn empset_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db1/empset.lh b/test/db1/empset.lh
new file mode 100644
index 0000000..8e249b8
--- /dev/null
+++ b/test/db1/empset.lh
@@ -0,0 +1,21 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "employee.h"
+
+
+extern empset empset_create (void);
+extern void empset_final (empset  /* s */);
+extern void empset_clear (empset  /* s */);
+extern bool empset_insert (empset  /* s */, employee  /* e */);
+extern void empset_insertUnique (empset  /* s */, employee  /* e */);
+extern bool empset_delete (empset  /* s */, employee  /* e */);
+extern empset empset_union (empset  /* s1 */, empset  /* s2 */);
+extern empset empset_disjointUnion (empset  /* s1 */, empset  /* s2 */);
+extern void empset_intersect (empset  /* s1 */, empset  /* s2 */);
+extern int empset_size (empset  /* s */);
+extern bool empset_member (employee  /* e */, empset  /* s */);
+extern bool empset_subset (empset  /* s1 */, empset  /* s2 */);
+extern employee empset_choose (empset  /* s */);
+extern char *empset_sprint (empset  /* s */);
+extern void empset_initMod (void);
diff --git a/test/db1/erc.c b/test/db1/erc.c
new file mode 100644
index 0000000..ab616fe
--- /dev/null
+++ b/test/db1/erc.c
@@ -0,0 +1,161 @@
+# include 
+# include "erc.h"
+
+erc erc_create (void) 
+{
+  erc c;
+
+  c = (erc) malloc (sizeof (ercInfo));
+
+  if (c == 0) 
+    {
+      printf ("Malloc returned null in erc_create\n");
+      exit (1);
+    }
+  
+  c->vals = 0;
+  c->size = 0;
+  return c;
+}
+
+void erc_clear (erc c) 
+{
+  ercList elem;
+  ercList next;
+
+  for (elem = c->vals; elem != 0; elem = next) 
+    {
+      next = elem->next;
+      free (elem);
+    }
+  
+  c->vals = 0;
+  c->size = 0;
+}
+
+void erc_final (erc c) 
+{
+  erc_clear (c);
+  free (c); 
+}
+
+bool erc_member (eref er, erc c) 
+{
+  ercList tmpc;
+
+  for (tmpc = c->vals; tmpc != 0; tmpc = tmpc->next)
+    if (tmpc->val == er) return TRUE; 
+
+  return FALSE;
+}
+
+void erc_insert (erc c, eref er) 
+{
+  ercList newElem;
+  newElem = (ercElem *) malloc (sizeof (ercElem));
+
+  if (newElem == 0) 
+    {
+      printf ("Malloc returned null in erc_insert\n");
+      exit (1);
+    }
+
+  newElem->val = er;
+  newElem->next = c->vals;
+  c->vals = newElem;
+  c->size++;
+}
+
+bool erc_delete (erc c, eref er) 
+{
+  ercList elem;
+  ercList prev;
+  
+  for (prev = 0, elem = c->vals;
+       elem != 0;
+       prev = elem, elem = elem->next) 
+    {
+      if (elem->val == er) 
+	{ 
+	  if (prev == 0)
+	    c->vals = elem->next;
+	  else 
+	    prev->next = elem->next;
+	  
+	  free (elem); 
+	  c->size--;
+	  return TRUE;
+	}
+    }
+  
+  return FALSE;
+}
+
+ercIter erc_iterStart (erc c) 
+{
+  ercIter result;
+
+  result = (ercIter) malloc (sizeof (ercList));
+
+  if (result == 0) 
+    {
+      printf ("Malloc returned null in erc_iterStart\n");
+      exit (1);
+    }
+  
+  *result = c->vals;
+  return result;
+} 
+
+eref erc_yield (ercIter it) 
+{
+  eref result;
+
+  if (*it == 0) 
+    {
+      return erefNIL;
+      free (it); 
+    }
+  
+  result = (*it)->val;
+  *(it) = (*it)->next;
+  return result;
+}
+
+void erc_join (erc c1, erc c2) 
+{
+  ercList tmpc;
+
+  for (tmpc = c2->vals; tmpc != 0; tmpc = tmpc->next)
+    erc_insert (c1, tmpc->val);
+}
+
+char *erc_sprint (erc c)
+{
+  int len;
+  eref er;
+  ercIter it;
+  char *result;
+
+  result = (char *) 
+    malloc (erc_size (c) * (employeePrintSize + 1) + 1);
+
+  if (result == 0) 
+    {
+      printf ("Malloc returned null in erc_sprint\n");
+      exit (1);
+    }
+
+  len = 0;
+
+  for_ercElems (er, it, c) 
+    { 
+      employee_sprint (&(result[len]), eref_get (er));
+      len += employeePrintSize;
+      result[len++] = '\n';
+    }
+  
+  result[len] = '\0';
+  return result;
+}
+
diff --git a/test/db1/erc.h b/test/db1/erc.h
new file mode 100644
index 0000000..7cba640
--- /dev/null
+++ b/test/db1/erc.h
@@ -0,0 +1,30 @@
+# ifndef ERC_H
+# define ERC_H
+
+# include "eref.h"
+
+typedef struct _elem { eref val; struct _elem *next; } ercElem;
+typedef ercElem *ercList;
+typedef struct { ercList vals; int size; } ercInfo;
+typedef ercInfo *erc;
+typedef ercList *ercIter;
+
+# include "erc.lh"
+
+# define erc_size(c) ((c)->size)
+# define erc_choose(c) ((c->vals)->val)
+# define erc_initMod() \
+    do { bool_initMod(); employee_initMod();\
+         eref_initMod(); } while (0)
+
+# define erc_iterFinal(it) (free(it)) 
+
+# define erc_iterReturn(it, result) \
+    do { erc_iterFinal(it); return result; } while (0)
+
+# define for_ercElems(er, it, c)\
+    for (er = erc_yield (it = erc_iterStart (c)); \
+         !eref_equal (er, erefNIL); \
+         er = erc_yield (it))
+
+# endif
diff --git a/test/db1/erc.lcl b/test/db1/erc.lcl
new file mode 100644
index 0000000..50e8717
--- /dev/null
+++ b/test/db1/erc.lcl
@@ -0,0 +1,97 @@
+imports eref;
+
+mutable type erc;
+mutable type ercIter;
+
+erc erc_create(void) 
+{
+  /* ensures fresh(result) /\ result' = { }; */
+}
+
+void erc_clear(erc c) 
+{
+  /* requires c^.activeIters = 0; */
+  modifies c;
+  /* ensures c' = { }; */
+}
+
+void erc_insert(erc c, eref er) 
+{
+  /* requires c^.activeIters = 0 /\ er \neq erefNIL; */
+  modifies c;
+  /* ensures c' = [insert(er, c^.val), 0]; */
+}
+
+bool erc_delete(erc c, eref er) 
+{
+  /* requires c^.activeIters = 0; */
+  modifies c;
+  /* ensures result = er \in c^.val
+     /\ c' = [delete(er, c^.val), 0]; */
+}
+
+bool erc_member(eref er, erc c) 
+{
+  /* ensures result = er \in c^.val; */
+}
+
+eref erc_choose(erc c) 
+{
+  /* requires size(c^.val) \neq 0; */
+  /* ensures result \in c^.val; */
+}
+
+int erc_size(erc c) 
+{
+  /* ensures result = size(c^.val); */
+}
+
+ercIter erc_iterStart(erc c) 
+{
+  modifies c;
+  /* ensures fresh(result) /\ result' = [c^.val, c]
+        /\ c' = startIter(c^);
+  */
+}
+
+eref erc_yield(ercIter it) 
+{
+  modifies it; /* , it^.eObj */ 
+  /* ensures if it^.toYield \neq { }
+     then yielded(result, it^, it')
+       /\ (it^.eObj)' = (it^.eObj)^
+     else result = erefNIL /\ trashed(it)
+       /\ (it^.eObj)' = endIter((it^.eObj)^);
+ */
+}
+
+void erc_iterFinal(ercIter it) 
+{
+  modifies it; /* , it^.eObj; */
+  /* ensures trashed(it)
+     /\ (it^.eObj)' = endIter((it^.eObj)^);
+  */
+}
+
+void erc_join(erc c1, erc c2) 
+{
+  /* requires c1^.activeIters = 0; */
+  modifies c1;
+  /* ensures c1' = [c1^.val \U c2^.val, 0]; */
+}
+
+char *erc_sprint(erc c) 
+{
+  /* ensures isSprint(result[]', c^) /\ fresh(result[]); */
+}
+
+void erc_final(erc c) 
+{
+  modifies c;
+  /* ensures trashed(c); */
+}
+
+void erc_initMod(void) 
+{
+  ensures true;
+}
diff --git a/test/db1/erc.lcs b/test/db1/erc.lcs
new file mode 100644
index 0000000..669b65e
--- /dev/null
+++ b/test/db1/erc.lcs
@@ -0,0 +1,279 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLsort ereftab immutable nil nil
+%LCLsort _ereftab_Obj mutable ereftab nil
+%LCLsort erc immutable nil nil
+%LCLsort _erc_Obj mutable erc nil
+%LCLsort ercIter immutable nil nil
+%LCLsort _ercIter_Obj mutable ercIter nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLtag eemployee0e enum
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag eemployee1e enum
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLtag semployee0s struct
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop sizeof :ereftab -> int
+%LCLop sizeof :erc -> int
+%LCLop sizeof :ercIter -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLconst TRUE bool
+%LCLconst FALSE bool
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype eref eref immutable
+%LCLtype map map immutable
+%LCLvar m _map_Obj
+%LCLconst erefNIL eref
+%LCLfcn eref_alloc :  -> eref 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_free : eref -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_assign : eref, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_get : eref -> _semployee0s_Struct 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_equal : eref, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn eref_initMod :  -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLtype erc _erc_Obj mutable
+%LCLtype ercIter _ercIter_Obj mutable
+%LCLfcn erc_create :  -> _erc_Obj 
+%LCLfcnGlobals 
+%LCLfcn erc_clear : _erc_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_insert : _erc_Obj, eref -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_delete : _erc_Obj, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn erc_member : eref, _erc_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn erc_choose : _erc_Obj -> eref 
+%LCLfcnGlobals 
+%LCLfcn erc_size : _erc_Obj -> int 
+%LCLfcnGlobals 
+%LCLfcn erc_iterStart : _erc_Obj -> _ercIter_Obj 
+%LCLfcnGlobals 
+%LCLfcn erc_yield : _ercIter_Obj -> eref 
+%LCLfcnGlobals 
+%LCLfcn erc_iterFinal : _ercIter_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_join : _erc_Obj, _erc_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_sprint : _erc_Obj -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn erc_final : _erc_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db1/erc.lh b/test/db1/erc.lh
new file mode 100644
index 0000000..0130ac9
--- /dev/null
+++ b/test/db1/erc.lh
@@ -0,0 +1,21 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "eref.h"
+
+
+
+extern erc erc_create (void);
+extern void erc_clear (erc  /* c */);
+extern void erc_insert (erc  /* c */, eref  /* er */);
+extern bool erc_delete (erc  /* c */, eref  /* er */);
+extern bool erc_member (eref  /* er */, erc  /* c */);
+extern eref erc_choose (erc  /* c */);
+extern int erc_size (erc  /* c */);
+extern ercIter erc_iterStart (erc  /* c */);
+extern eref erc_yield (ercIter  /* it */);
+extern void erc_iterFinal (ercIter  /* it */);
+extern void erc_join (erc  /* c1 */, erc  /* c2 */);
+extern char *erc_sprint (erc  /* c */);
+extern void erc_final (erc  /* c */);
+extern void erc_initMod (void);
diff --git a/test/db1/eref.c b/test/db1/eref.c
new file mode 100644
index 0000000..33dda3f
--- /dev/null
+++ b/test/db1/eref.c
@@ -0,0 +1,87 @@
+# include 
+# include 
+# include "eref.h"
+
+eref_ERP eref_Pool;            /* private */
+static bool needsInit = TRUE;  /* private */
+
+eref eref_alloc (void) 
+{
+  int i, res;
+  
+  for (i=0; (eref_Pool.status[i] == used) && (i < eref_Pool.size); i++);
+  
+  res = i;
+
+  if (res == eref_Pool.size) 
+    {
+      eref_Pool.conts =
+	(employee *) realloc (eref_Pool.conts,
+			      2 * eref_Pool.size * sizeof (employee));
+      
+      if (eref_Pool.conts == 0) 
+	{
+	  printf ("Malloc returned null in eref_alloc\n");
+	  exit (1);
+	}
+      
+      eref_Pool.status =
+	(eref_status *) realloc (eref_Pool.status,
+				 2 * eref_Pool.size * sizeof (eref_status));
+
+      if (eref_Pool.status == 0) 
+	{
+	  printf ("Malloc returned null in eref_alloc\n");
+	  exit (1);
+	}
+      
+      eref_Pool.size = 2*eref_Pool.size;
+
+      for (i = res+1; i < eref_Pool.size; i++)
+        eref_Pool.status[i] = avail;
+    }
+  
+  eref_Pool.status[res] = used;
+  return (eref) res;
+}
+
+void eref_initMod (void) 
+{
+  int i;
+  const int size = 16;
+  
+  if (needsInit == FALSE) 
+    {
+      return;
+    }
+
+  needsInit = FALSE;
+  bool_initMod ();
+  employee_initMod ();
+
+  eref_Pool.conts = (employee *) malloc (size * sizeof (employee));
+
+  if (eref_Pool.conts == 0) 
+    {
+      printf ("Malloc returned null in eref_initMod\n");
+      exit (1);
+    }
+  
+  eref_Pool.status = (eref_status *) malloc (size * sizeof (eref_status));
+
+  if (eref_Pool.status == 0) 
+    {
+      printf ("Malloc returned null in eref_initMod\n");
+      exit (1);
+    }
+  
+  eref_Pool.size = size;
+
+  for (i = 0; i < size; i++)
+    {
+      eref_Pool.status[i] = avail;
+    }
+}
+
+
+
diff --git a/test/db1/eref.h b/test/db1/eref.h
new file mode 100644
index 0000000..718bc41
--- /dev/null
+++ b/test/db1/eref.h
@@ -0,0 +1,28 @@
+# ifndef EREF_H
+# define EREF_H
+
+# include "employee.h"
+
+typedef int eref;
+
+/* Private typedefs used in macros  */
+typedef enum { used, avail } eref_status;
+typedef struct {
+  employee *conts;
+  eref_status *status;
+  int size;
+} eref_ERP;
+
+/* Declared here so that macros can use it  */
+extern eref_ERP eref_Pool;
+
+# include "eref.lh"
+
+# define erefNIL -1
+
+# define eref_free(er)        (eref_Pool.status[er] = avail)
+# define eref_assign(er, e)   (eref_Pool.conts[er] = e) 
+# define eref_get(er)         (eref_Pool.conts[er])
+# define eref_equal(er1, er2) (er1 == er2) 
+
+# endif
diff --git a/test/db1/eref.lcl b/test/db1/eref.lcl
new file mode 100644
index 0000000..b792ff0
--- /dev/null
+++ b/test/db1/eref.lcl
@@ -0,0 +1,44 @@
+imports employee;
+
+immutable type eref;
+spec immutable type map;
+
+spec map m;
+constant eref erefNIL;
+
+eref eref_alloc(void) map m; 
+{
+  modifies m;
+  /* ensures newInd(result, m^, m'); */
+}
+
+void eref_free(eref er) map m; 
+{
+  /* requires er \in domain(m^); */
+  modifies m;
+  /* ensures m' = delete(m^, er); */
+}
+
+void eref_assign(eref er, employee e) map m; 
+{
+  /* requires er \in domain(m^); */
+  modifies m;
+  /* ensures m' = assign(m^, er, e); */
+}
+
+employee eref_get(eref er) map m; 
+{
+  /* requires er \in domain(m^); */
+  /* ensures result = m^[er]; */
+}
+
+bool eref_equal(eref er1, eref er2) 
+{
+  /* ensures result = (er1 = er2); */
+}
+
+void eref_initMod(void) map m; 
+{
+  modifies m;
+  /* ensures m' = new; */
+}
diff --git a/test/db1/eref.lcs b/test/db1/eref.lcs
new file mode 100644
index 0000000..8f635c9
--- /dev/null
+++ b/test/db1/eref.lcs
@@ -0,0 +1,233 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort MALE enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort MGR enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLtag eemployee0e enum
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag eemployee1e enum
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLtag semployee0s struct
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLconst TRUE bool
+%LCLconst FALSE bool
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype eref eref immutable
+%LCLtype map map immutable
+%LCLvar m _map_Obj
+%LCLconst erefNIL eref
+%LCLfcn eref_alloc :  -> eref 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_free : eref -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_assign : eref, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_get : eref -> _semployee0s_Struct 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_equal : eref, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn eref_initMod :  -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLSymbolTableEnd
diff --git a/test/db1/eref.lh b/test/db1/eref.lh
new file mode 100644
index 0000000..93200af
--- /dev/null
+++ b/test/db1/eref.lh
@@ -0,0 +1,12 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "employee.h"
+
+
+extern eref eref_alloc (void);
+extern void eref_free (eref  /* er */);
+extern void eref_assign (eref  /* er */, employee  /* e */);
+extern employee eref_get (eref  /* er */);
+extern bool eref_equal (eref  /* er1 */, eref  /* er2 */);
+extern void eref_initMod (void);
diff --git a/test/db1/ereftab.c b/test/db1/ereftab.c
new file mode 100644
index 0000000..a51acbf
--- /dev/null
+++ b/test/db1/ereftab.c
@@ -0,0 +1,49 @@
+/*
+** This is not a good implementation.  I should probably replace
+** the erc with a hash table.  
+*/
+
+# include "ereftab.h"
+
+ereftab ereftab_create (void) 
+{
+  return erc_create ();
+}
+
+void ereftab_insert (ereftab t, employee e, eref er) 
+{
+  eref_assign (er, e);
+  erc_insert (t, er);
+}
+
+bool ereftab_delete (ereftab t, eref er) 
+{
+  bool result;
+  
+  result = erc_member (er, t);  
+  erc_delete (t, er);
+  return result;
+}
+
+eref ereftab_lookup (employee e, ereftab t) 
+{
+  eref er;
+  employee e1;
+  ercIter it;
+  
+  for_ercElems (er, it, t) 
+    { 
+      e1 = eref_get (er);
+      if (employee_equal (&e, &e1)) return er;
+    }
+
+  return erefNIL;
+}
+
+void ereftab_initMod (void) 
+{
+  bool_initMod ();
+  eref_initMod ();
+  erc_initMod ();
+}
+
diff --git a/test/db1/ereftab.h b/test/db1/ereftab.h
new file mode 100644
index 0000000..f49e096
--- /dev/null
+++ b/test/db1/ereftab.h
@@ -0,0 +1,13 @@
+/* ereftab.h  */
+
+# ifndef EREFTAB_H
+# define EREFTAB_H
+
+# include "erc.h"
+# include "eref.h"
+
+typedef erc ereftab;
+
+# include "ereftab.lh"
+# endif
+
diff --git a/test/db1/ereftab.lcl b/test/db1/ereftab.lcl
new file mode 100644
index 0000000..16359cd
--- /dev/null
+++ b/test/db1/ereftab.lcl
@@ -0,0 +1,31 @@
+imports employee, eref;
+
+mutable type ereftab; 
+
+ereftab ereftab_create(void) 
+{
+  /* ensures result' = empty; */
+}
+
+void ereftab_insert(ereftab t, employee e, eref er) 
+{
+  /* requires getERef(t^, e) = erefNIL; */
+  modifies t;
+  /* ensures t' = add(t^, e, er); */
+}
+
+bool ereftab_delete(ereftab t, eref er) 
+{
+  modifies t;
+  /* ensures result = in(t^, er) /\ t' = delete(t^, er); */
+}
+
+eref ereftab_lookup(employee e, ereftab t) 
+{
+  /* ensures result = getERef(t^, e); */
+}
+
+void ereftab_initMod(void) 
+{
+  ensures true;
+}
diff --git a/test/db1/ereftab.lcs b/test/db1/ereftab.lcs
new file mode 100644
index 0000000..a2c3ffa
--- /dev/null
+++ b/test/db1/ereftab.lcs
@@ -0,0 +1,283 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLsort ereftab immutable nil nil
+%LCLsort _ereftab_Obj mutable ereftab nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLtag eemployee0e enum
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag eemployee1e enum
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLtag semployee0s struct
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop sizeof :ereftab -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLconst TRUE bool
+%LCLconst FALSE bool
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLconst TRUE bool
+%LCLconst FALSE bool
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype eref eref immutable
+%LCLtype map map immutable
+%LCLvar m _map_Obj
+%LCLconst erefNIL eref
+%LCLfcn eref_alloc :  -> eref 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_free : eref -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_assign : eref, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_get : eref -> _semployee0s_Struct 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_equal : eref, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn eref_initMod :  -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLtype ereftab _ereftab_Obj mutable
+%LCLfcn ereftab_create :  -> _ereftab_Obj 
+%LCLfcnGlobals 
+%LCLfcn ereftab_insert : _ereftab_Obj, _semployee0s_Struct_Tuple, eref -> void 
+%LCLfcnGlobals 
+%LCLfcn ereftab_delete : _ereftab_Obj, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn ereftab_lookup : _semployee0s_Struct_Tuple, _ereftab_Obj -> eref 
+%LCLfcnGlobals 
+%LCLfcn ereftab_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db1/ereftab.lh b/test/db1/ereftab.lh
new file mode 100644
index 0000000..5204a87
--- /dev/null
+++ b/test/db1/ereftab.lh
@@ -0,0 +1,12 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "employee.h"
+# include "eref.h"
+
+
+extern ereftab ereftab_create (void);
+extern void ereftab_insert (ereftab  /* t */, employee  /* e */, eref  /* er */);
+extern bool ereftab_delete (ereftab  /* t */, eref  /* er */);
+extern eref ereftab_lookup (employee  /* e */, ereftab  /* t */);
+extern void ereftab_initMod (void);
diff --git a/test/db2.expect b/test/db2.expect
new file mode 100644
index 0000000..9ad7275
--- /dev/null
+++ b/test/db2.expect
@@ -0,0 +1,169 @@
+
+< reading spec employee.lcl >
+< reading spec eref.lcl >
+< reading spec empset.lcl >
+< reading spec ereftab.lcl >
+< reading spec erc.lcl >
+< reading spec dbase.lcl >
+< preprocessing >
+< checking employee.c >
+employee.c: (in function employee_setName)
+employee.c:14: Parameter 1 (e->name) to function strcpy is declared unique but
+                  may be aliased externally by parameter 2 (na)
+< checking eref.c >
+eref.c: (in function eref_alloc)
+eref.c:19: Unqualified storage eref_Pool.conts passed as only param:
+              realloc (eref_Pool.conts, ...)
+eref.c:29: Unqualified storage eref_Pool.status passed as only param:
+              realloc (eref_Pool.status, ...)
+eref.c:45: Storage eref_Pool.status reachable from global is only (should be
+              unqualified)
+   eref.c:30: Storage eref_Pool.status becomes only
+eref.c:45: Storage eref_Pool.conts reachable from global is only (should be
+              unqualified)
+   eref.c:20: Storage eref_Pool.conts becomes only
+eref.c: (in function eref_initMod)
+eref.c:84: Storage eref_Pool.conts reachable from global is fresh (should be
+              unqualified)
+   eref.c:62: Fresh storage eref_Pool.conts allocated
+eref.c:84: Global storage *(eref_Pool.conts) contains 4 undefined fields when
+              call returns: ssNum, salary, gen, j
+eref.c:84: Storage eref_Pool.status reachable from global is fresh (should be
+              unqualified)
+   eref.c:70: Fresh storage eref_Pool.status allocated
+eref.c:84: Global storage eref_Pool contains 1 undefined field when call
+              returns: status
+< checking empset.c >
+< checking ereftab.c >
+< checking erc.c >
+erc.c: (in function erc_create)
+erc.c:33: Null storage c->vals derivable from return value: c
+   erc.c:31: Storage c->vals becomes null
+erc.c:33: Fresh storage returned as unqualified (should be only): c
+   erc.c:23: Fresh storage c allocated
+erc.c: (in function erc_clear)
+erc.c:49: Function returns with null storage derivable from parameter c->vals
+   erc.c:47: Storage c->vals becomes null
+erc.c: (in function erc_final)
+erc.c:54: Implicitly temp storage c passed as only param: free (c)
+erc.c: (in function erc_delete)
+erc.c:102: Released storage c->vals reachable from parameter at return point
+   erc.c:100: Storage c->vals is released
+erc.c: (in function erc_sprint)
+erc.c:141: Fresh storage returned as unqualified (should be only): result
+   erc.c:122: Fresh storage result allocated
+< checking dbase.c >
+< checking drive.c >
+< checking macros bool.h >
+< global checks >
+
+Finished LCLint checking --- 15 code errors found, as expected
+
+< reading spec employee.lcl >
+< reading spec eref.lcl >
+< reading spec empset.lcl >
+< reading spec ereftab.lcl >
+< reading spec erc.lcl >
+< reading spec dbase.lcl >
+< preprocessing >
+< checking employee.c >
+employee.c: (in function employee_setName)
+employee.c:14: Parameter 1 (e->name) to function strcpy is declared unique but
+                  may be aliased externally by parameter 2 (na)
+< checking eref.c >
+eref.c: (in function eref_initMod)
+eref.c:62: Implicitly only storage eref_Pool.conts not released before
+    assignment: eref_Pool.conts = (employee *)malloc(size * sizeof(employee))
+eref.c:70: Implicitly only storage eref_Pool.status not released before
+    assignment: eref_Pool.status = (eref_status *)malloc(size *
+    sizeof(eref_status))
+eref.c:84: Global storage *(eref_Pool.conts) contains 4 undefined fields when
+              call returns: ssNum, salary, gen, j
+eref.c:84: Global storage eref_Pool contains 1 undefined field when call
+              returns: status
+< checking empset.c >
+empset.c: (in function empset_insertUnique)
+empset.c:44: Clauses exit with er referencing fresh storage in true branch,
+                local storage in continuation
+   empset.c:41: Fresh storage er allocated
+empset.c: (in function empset_intersect)
+empset.c:126: Fresh storage toDelete not released before return
+   empset.c:112: Fresh storage toDelete allocated
+< checking ereftab.c >
+< checking erc.c >
+erc.c: (in function erc_create)
+erc.c:33: Null storage c->vals derivable from return value: c
+   erc.c:31: Storage c->vals becomes null
+erc.c: (in function erc_clear)
+erc.c:49: Function returns with null storage derivable from parameter c->vals
+   erc.c:47: Storage c->vals becomes null
+erc.c: (in function erc_final)
+erc.c:54: Implicitly temp storage c passed as only param: free (c)
+erc.c: (in function erc_delete)
+erc.c:98: Implicitly only storage prev->next not released before assignment:
+             prev->next = elem->next
+erc.c:98: Clauses exit with elem referencing implicitly only storage in true
+             branch, local storage in false branch
+   erc.c:96: Storage elem becomes implicitly only
+erc.c:98: Storage c->vals->next is kept in one path, but live in another.
+   erc.c:98: Storage c->vals->next becomes kept
+erc.c:102: Released storage c->vals reachable from parameter at return point
+   erc.c:100: Storage c->vals is released
+< checking dbase.c >
+dbase.c: (in function uncheckedHire)
+dbase.c:121: Fresh storage er not released before return
+   dbase.c:108: Fresh storage er allocated
+< checking drive.c >
+drive.c: (in function main)
+drive.c:49: Variable m_res name is not a macro variable (it is a local
+               variable), but matches the macro variable namespace prefix "m_"
+drive.c:65: Variable m_res name is not a macro variable (it is a local
+               variable), but matches the macro variable namespace prefix "m_"
+drive.c:83: Variable m_res name is not a macro variable (it is a local
+               variable), but matches the macro variable namespace prefix "m_"
+drive.c:120: Variable m_res name is not a macro variable (it is a local
+                variable), but matches the macro variable namespace prefix "m_"
+drive.c:124: Variable m_res name is not a macro variable (it is a local
+                variable), but matches the macro variable namespace prefix "m_"
+drive.c:135: Variable m_res name is not a macro variable (it is a local
+                variable), but matches the macro variable namespace prefix "m_"
+drive.c:140: Fresh storage em1 not released before assignment:
+                em1 = empset_create()
+   drive.c:35: Fresh storage em1 allocated
+drive.c:146: Fresh storage em2 not released before assignment:
+                em2 = empset_create()
+   drive.c:74: Fresh storage em2 allocated
+drive.c:147: Fresh storage em3 not released before assignment:
+                em3 = empset_disjointUnion(em2, em1)
+   drive.c:87: Fresh storage em3 allocated
+drive.c:159: Variable m_res name is not a macro variable (it is a local
+                variable), but matches the macro variable namespace prefix "m_"
+drive.c:163: Fresh storage em1 not released before return
+   drive.c:140: Fresh storage em1 allocated
+drive.c:163: Fresh storage em2 not released before return
+   drive.c:146: Fresh storage em2 allocated
+drive.c:163: Fresh storage em3 not released before return
+   drive.c:147: Fresh storage em3 allocated
+< checking macros bool.h >
+< global checks >
+
+Finished LCLint checking --- 28 code errors found, as expected
+
+< reading spec employee.lcl >
+< reading spec eref.lcl >
+< reading spec empset.lcl >
+< reading spec ereftab.lcl >
+< reading spec erc.lcl >
+< reading spec dbase.lcl >
+< preprocessing >
+< checking employee.c >
+< checking eref.c >
+< checking empset.c >
+< checking ereftab.c >
+< checking erc.c >
+< checking dbase.c >
+< checking drive.c >
+< checking macros bool.h >
+< global checks >
+
+Finished LCLint checking --- no code errors found
diff --git a/test/db2.out b/test/db2.out
new file mode 100644
index 0000000..9ad7275
--- /dev/null
+++ b/test/db2.out
@@ -0,0 +1,169 @@
+
+< reading spec employee.lcl >
+< reading spec eref.lcl >
+< reading spec empset.lcl >
+< reading spec ereftab.lcl >
+< reading spec erc.lcl >
+< reading spec dbase.lcl >
+< preprocessing >
+< checking employee.c >
+employee.c: (in function employee_setName)
+employee.c:14: Parameter 1 (e->name) to function strcpy is declared unique but
+                  may be aliased externally by parameter 2 (na)
+< checking eref.c >
+eref.c: (in function eref_alloc)
+eref.c:19: Unqualified storage eref_Pool.conts passed as only param:
+              realloc (eref_Pool.conts, ...)
+eref.c:29: Unqualified storage eref_Pool.status passed as only param:
+              realloc (eref_Pool.status, ...)
+eref.c:45: Storage eref_Pool.status reachable from global is only (should be
+              unqualified)
+   eref.c:30: Storage eref_Pool.status becomes only
+eref.c:45: Storage eref_Pool.conts reachable from global is only (should be
+              unqualified)
+   eref.c:20: Storage eref_Pool.conts becomes only
+eref.c: (in function eref_initMod)
+eref.c:84: Storage eref_Pool.conts reachable from global is fresh (should be
+              unqualified)
+   eref.c:62: Fresh storage eref_Pool.conts allocated
+eref.c:84: Global storage *(eref_Pool.conts) contains 4 undefined fields when
+              call returns: ssNum, salary, gen, j
+eref.c:84: Storage eref_Pool.status reachable from global is fresh (should be
+              unqualified)
+   eref.c:70: Fresh storage eref_Pool.status allocated
+eref.c:84: Global storage eref_Pool contains 1 undefined field when call
+              returns: status
+< checking empset.c >
+< checking ereftab.c >
+< checking erc.c >
+erc.c: (in function erc_create)
+erc.c:33: Null storage c->vals derivable from return value: c
+   erc.c:31: Storage c->vals becomes null
+erc.c:33: Fresh storage returned as unqualified (should be only): c
+   erc.c:23: Fresh storage c allocated
+erc.c: (in function erc_clear)
+erc.c:49: Function returns with null storage derivable from parameter c->vals
+   erc.c:47: Storage c->vals becomes null
+erc.c: (in function erc_final)
+erc.c:54: Implicitly temp storage c passed as only param: free (c)
+erc.c: (in function erc_delete)
+erc.c:102: Released storage c->vals reachable from parameter at return point
+   erc.c:100: Storage c->vals is released
+erc.c: (in function erc_sprint)
+erc.c:141: Fresh storage returned as unqualified (should be only): result
+   erc.c:122: Fresh storage result allocated
+< checking dbase.c >
+< checking drive.c >
+< checking macros bool.h >
+< global checks >
+
+Finished LCLint checking --- 15 code errors found, as expected
+
+< reading spec employee.lcl >
+< reading spec eref.lcl >
+< reading spec empset.lcl >
+< reading spec ereftab.lcl >
+< reading spec erc.lcl >
+< reading spec dbase.lcl >
+< preprocessing >
+< checking employee.c >
+employee.c: (in function employee_setName)
+employee.c:14: Parameter 1 (e->name) to function strcpy is declared unique but
+                  may be aliased externally by parameter 2 (na)
+< checking eref.c >
+eref.c: (in function eref_initMod)
+eref.c:62: Implicitly only storage eref_Pool.conts not released before
+    assignment: eref_Pool.conts = (employee *)malloc(size * sizeof(employee))
+eref.c:70: Implicitly only storage eref_Pool.status not released before
+    assignment: eref_Pool.status = (eref_status *)malloc(size *
+    sizeof(eref_status))
+eref.c:84: Global storage *(eref_Pool.conts) contains 4 undefined fields when
+              call returns: ssNum, salary, gen, j
+eref.c:84: Global storage eref_Pool contains 1 undefined field when call
+              returns: status
+< checking empset.c >
+empset.c: (in function empset_insertUnique)
+empset.c:44: Clauses exit with er referencing fresh storage in true branch,
+                local storage in continuation
+   empset.c:41: Fresh storage er allocated
+empset.c: (in function empset_intersect)
+empset.c:126: Fresh storage toDelete not released before return
+   empset.c:112: Fresh storage toDelete allocated
+< checking ereftab.c >
+< checking erc.c >
+erc.c: (in function erc_create)
+erc.c:33: Null storage c->vals derivable from return value: c
+   erc.c:31: Storage c->vals becomes null
+erc.c: (in function erc_clear)
+erc.c:49: Function returns with null storage derivable from parameter c->vals
+   erc.c:47: Storage c->vals becomes null
+erc.c: (in function erc_final)
+erc.c:54: Implicitly temp storage c passed as only param: free (c)
+erc.c: (in function erc_delete)
+erc.c:98: Implicitly only storage prev->next not released before assignment:
+             prev->next = elem->next
+erc.c:98: Clauses exit with elem referencing implicitly only storage in true
+             branch, local storage in false branch
+   erc.c:96: Storage elem becomes implicitly only
+erc.c:98: Storage c->vals->next is kept in one path, but live in another.
+   erc.c:98: Storage c->vals->next becomes kept
+erc.c:102: Released storage c->vals reachable from parameter at return point
+   erc.c:100: Storage c->vals is released
+< checking dbase.c >
+dbase.c: (in function uncheckedHire)
+dbase.c:121: Fresh storage er not released before return
+   dbase.c:108: Fresh storage er allocated
+< checking drive.c >
+drive.c: (in function main)
+drive.c:49: Variable m_res name is not a macro variable (it is a local
+               variable), but matches the macro variable namespace prefix "m_"
+drive.c:65: Variable m_res name is not a macro variable (it is a local
+               variable), but matches the macro variable namespace prefix "m_"
+drive.c:83: Variable m_res name is not a macro variable (it is a local
+               variable), but matches the macro variable namespace prefix "m_"
+drive.c:120: Variable m_res name is not a macro variable (it is a local
+                variable), but matches the macro variable namespace prefix "m_"
+drive.c:124: Variable m_res name is not a macro variable (it is a local
+                variable), but matches the macro variable namespace prefix "m_"
+drive.c:135: Variable m_res name is not a macro variable (it is a local
+                variable), but matches the macro variable namespace prefix "m_"
+drive.c:140: Fresh storage em1 not released before assignment:
+                em1 = empset_create()
+   drive.c:35: Fresh storage em1 allocated
+drive.c:146: Fresh storage em2 not released before assignment:
+                em2 = empset_create()
+   drive.c:74: Fresh storage em2 allocated
+drive.c:147: Fresh storage em3 not released before assignment:
+                em3 = empset_disjointUnion(em2, em1)
+   drive.c:87: Fresh storage em3 allocated
+drive.c:159: Variable m_res name is not a macro variable (it is a local
+                variable), but matches the macro variable namespace prefix "m_"
+drive.c:163: Fresh storage em1 not released before return
+   drive.c:140: Fresh storage em1 allocated
+drive.c:163: Fresh storage em2 not released before return
+   drive.c:146: Fresh storage em2 allocated
+drive.c:163: Fresh storage em3 not released before return
+   drive.c:147: Fresh storage em3 allocated
+< checking macros bool.h >
+< global checks >
+
+Finished LCLint checking --- 28 code errors found, as expected
+
+< reading spec employee.lcl >
+< reading spec eref.lcl >
+< reading spec empset.lcl >
+< reading spec ereftab.lcl >
+< reading spec erc.lcl >
+< reading spec dbase.lcl >
+< preprocessing >
+< checking employee.c >
+< checking eref.c >
+< checking empset.c >
+< checking ereftab.c >
+< checking erc.c >
+< checking dbase.c >
+< checking drive.c >
+< checking macros bool.h >
+< global checks >
+
+Finished LCLint checking --- no code errors found
diff --git a/test/db2/Makefile b/test/db2/Makefile
new file mode 100644
index 0000000..e5a183b
--- /dev/null
+++ b/test/db2/Makefile
@@ -0,0 +1,74 @@
+###
+### LCLint db2 test
+###
+### Taken from sample, fifth iteration: memchecks1
+###
+
+.SUFFIXES: .lcl .lcs .lh .h .c .o
+.PHONY: check
+
+SHELL = /bin/csh -f
+
+LCLINT = lclint
+LCL = $(LCLINT) -specundef +lh +quiet -nof
+LCLINTLH = $(LCLINT) +lh
+LCSFILES = dbase.lcs employee.lcs empset.lcs erc.lcs eref.lcs ereftab.lcs 
+
+MODULES = employee eref empset ereftab erc dbase drive.c
+OBJS = dbase.o employee.o empset.o erc.o eref.o ereftab.o 
+
+test: 
+	$(MAKE) -e clean
+	$(MAKE) -e check
+
+check: $(LCSFILES)
+	$(LCLINT) -exportlocal -showcol -allimponly -macrovarprefixexclude +showscan $(MODULES) -expect 15
+	$(LCLINT) -exportlocal -showcol +allimponly +showscan $(MODULES) -expect 28
+	$(LCLINT) -exportlocal -showcol -memchecks -macrovarprefixexclude +showscan $(MODULES)
+
+### The following rules generate .lh and .lcs files from .lcl files.  They also
+### ensure that .h files appear to be updated whenever the corresponding .lh
+### file is updated.
+
+.lcl.lh:
+	$(LCL) $*.lcl
+
+.lcl.lcs:
+	$(LCL) $*.lcl
+
+.lh.h:
+	touch $*.h
+
+.c.o:
+	$(GCC) -c $*.c 
+
+###
+### Clean removes junk and all derived files.
+### Tidy removes junk and object and executable files.
+###
+
+clean: tidy
+	-@rm -f *.c.html *.lcl.html *.h.html *.lh.html *.lcs *.lh >& /dev/null
+
+tidy:
+	-@rm -f ,* .,* *.CKP *.BAK .emacs_[0-9]* core a.out *.*~ *~ *.o drive >& /dev/null
+
+### The following dependencies ensure that imported LCL specs 
+### are checked before the specs that import them.
+
+dbase.lcs:   employee.lcs empset.lcs 
+empset.lcs:  employee.lcs
+erc.lcs:     eref.lcs
+eref.lcl:    employee.lcs
+ereftab.lcs: employee.lcs eref.lcs
+
+### The following dependencies ensure that a .o file is recompiled when the
+### corresponding .c file, or one of the .h files it #includes, is changed.
+
+dbase.o:    dbase.c bool.h dbase.h employee.h empset.h
+drive.o:    drive.c bool.h dbase.h employee.h empset.h erc.h eref.h ereftab.h 
+employee.o: employee.c employee.h 
+empset.o:   empset.c bool.h empset.h erc.h eref.h employee.h employee.h 
+erc.o:      erc.c bool.h erc.h eref.h employee.h 
+eref.o:     eref.c eref.h employee.h 
+ereftab.o:  ereftab.c bool.h ereftab.h erc.h eref.h employee.h 
diff --git a/test/db2/bool.h b/test/db2/bool.h
new file mode 100644
index 0000000..c360bca
--- /dev/null
+++ b/test/db2/bool.h
@@ -0,0 +1,38 @@
+#ifndef BOOL_H
+#define BOOL_H
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE (!FALSE)
+#endif
+
+typedef int bool;
+
+/*
+** bool_initMod has no real effect
+** Declared with modifies internalState, so no noeffect errors are 
+** reported when it is called.)
+*/
+
+extern /*@unused@*/ void bool_initMod (void) /*@modifies internalState@*/ ;
+/*@-mustmod@*/
+# define bool_initMod()
+/*@=mustmod@*/
+
+extern /*@unused@*/ /*@observer@*/ char *bool_unparse (bool b) /*@*/ ;
+# define bool_unparse(b) ((b) ? "true" : "false" )
+
+extern /*@unused@*/ bool bool_not (bool b) /*@*/ ;
+# define bool_not(b) ((b) ? FALSE : TRUE)
+
+extern /*@unused@*/ bool bool_equal (bool b1, bool b2) /*@*/ ;
+# define bool_equal(a,b) ((a) ? (b) : !(b))
+
+extern /*@falseexit@*/ void check (bool x);
+# define check(x) \
+  do { bool m_res = x; assert (m_res); } while (FALSE)
+
+# endif
diff --git a/test/db2/dbase.c b/test/db2/dbase.c
new file mode 100644
index 0000000..819b35b
--- /dev/null
+++ b/test/db2/dbase.c
@@ -0,0 +1,269 @@
+# include 
+# include "dbase.h"
+
+# define firstERC mMGRS
+# define lastERC fNON
+# define numERCS (lastERC - firstERC + 1)
+
+typedef enum
+{
+  mMGRS, fMGRS, mNON, fNON
+} employeeKinds;
+
+erc db[numERCS];
+
+bool initDone = FALSE;
+
+void db_initMod (void)
+{
+  int i;
+  
+  if (initDone)
+    {
+      return;
+    }
+  
+  bool_initMod ();
+  employee_initMod ();
+  eref_initMod ();
+  erc_initMod ();
+  empset_initMod ();
+  
+  for (i = firstERC; i <= lastERC; i++)
+    {
+      db[i] = erc_create ();
+    }
+  
+  initDone = TRUE;
+}
+
+eref _db_ercKeyGet (erc c, int key) 
+{
+  erc_elements(c, er)
+    {
+      if (eref_get(er).ssNum == key) return (er);
+    } end_erc_elements ;
+
+  return erefNIL;
+}
+
+eref _db_keyGet (int key)
+{
+  int i;
+  eref er;
+  
+  for (i = firstERC; i <= lastERC; i++)
+    {
+      er = _db_ercKeyGet (db[i], key);
+      if (!eref_equal (er, erefNIL))
+	{
+	  return er;
+	}
+    }
+  
+  return erefNIL;
+}
+
+int _db_addEmpls (erc c, int l, int h, empset s)
+{
+  employee e;
+  int numAdded;
+  numAdded = 0;
+  
+  erc_elements (c, er) 
+    {
+      e = eref_get(er);
+      if ((e.salary >= l) && (e.salary <= h)) 
+	{
+	  empset_insert(s, e);
+	  numAdded++;
+	}
+    } end_erc_elements ;
+
+  return numAdded;
+}
+
+db_status hire (employee e)
+{
+  if (e.gen == gender_ANY)
+    return genderERR;
+
+  if (e.j == job_ANY)
+    return jobERR;
+
+  if (e.salary < 0)
+    return salERR;
+
+  if (!eref_equal (_db_keyGet (e.ssNum), erefNIL))
+    return duplERR;
+
+  uncheckedHire (e);
+  return db_OK;
+}
+
+void uncheckedHire (employee e)
+{
+  eref er;
+  
+  er = eref_alloc ();
+  eref_assign (er, e);
+  
+  if (e.gen == MALE)
+    if (e.j == MGR)
+      erc_insert (db[mMGRS], er);
+    else
+      erc_insert (db[mNON], er);
+  else
+    if (e.j == MGR)
+      erc_insert (db[fMGRS], er);
+    else
+      erc_insert (db[fNON], er);
+}
+
+bool fire (int ssNum)
+{
+  int i;
+  
+  for (i = firstERC; i <= lastERC; i++)
+    {
+      erc_elements(db[i], er)
+	{
+	  if (eref_get(er).ssNum == ssNum) 
+	    {
+	      erc_delete(db[i], er);
+	      return TRUE;
+	    } 
+	} end_erc_elements ;
+    }
+  
+  return FALSE;
+}
+
+bool promote (int ssNum)
+{
+  eref er;
+  employee e;
+  gender g;
+  
+  g = MALE;
+  er = _db_ercKeyGet (db[mNON], ssNum);
+  
+  if (eref_equal (er, erefNIL))
+    {
+      er = _db_ercKeyGet (db[fNON], ssNum);
+      if (eref_equal (er, erefNIL))
+	return FALSE;
+      g = FEMALE;
+    }
+  
+  e = eref_get (er);
+  e.j = MGR;
+  eref_assign (er, e);
+  
+  if (g == MALE)
+    {
+      erc_delete (db[mNON], er);
+      erc_insert (db[mMGRS], er);
+    } 
+  else
+    {
+      erc_delete (db[fNON], er);
+      erc_insert (db[fMGRS], er);
+    }
+  
+  return TRUE;
+}
+
+db_status setSalary (int ssNum, int sal)
+{
+  eref er;
+  employee e;
+  
+  if (sal < 0)
+    {
+      return salERR;
+    }
+
+  er = _db_keyGet (ssNum);
+
+  if (eref_equal (er, erefNIL))
+    {
+      return missERR;
+    }
+
+  e = eref_get (er);
+  e.salary = sal;
+  eref_assign (er, e);
+
+  return db_OK;
+}
+
+int query (db_q q, empset s)
+{
+  int numAdded;
+  int l, h;
+  int i;
+
+  l = q.l;
+  h = q.h;
+
+  switch (q.g)
+    {
+    case gender_ANY:
+      switch (q.j)
+	{
+	case job_ANY:
+	  numAdded = 0;
+	  for (i = firstERC; i <= lastERC; i++)
+	    numAdded += _db_addEmpls (db[i], l, h, s);
+	  return numAdded;
+	case MGR:
+	  numAdded = _db_addEmpls (db[mMGRS], l, h, s);
+	  numAdded += _db_addEmpls (db[fMGRS], l, h, s);
+	  return numAdded;
+	case NONMGR:
+	  numAdded = _db_addEmpls (db[mNON], l, h, s);
+	  numAdded += _db_addEmpls (db[fNON], l, h, s);
+	  return numAdded;
+	}
+    case MALE:
+      switch (q.j)
+	{
+	case job_ANY:
+	  numAdded = _db_addEmpls (db[mMGRS], l, h, s);
+	  numAdded += _db_addEmpls (db[mNON], l, h, s);
+	  return numAdded;
+	case MGR:
+	  return _db_addEmpls (db[mMGRS], l, h, s);
+	case NONMGR:
+	  return _db_addEmpls (db[mNON], l, h, s);
+	}
+    case FEMALE:
+      switch (q.j)
+	{
+	case job_ANY:
+	  numAdded = _db_addEmpls (db[fMGRS], l, h, s);
+	  numAdded += _db_addEmpls (db[fNON], l, h, s);
+	  return numAdded;
+	case MGR:
+	  return _db_addEmpls (db[fMGRS], l, h, s);
+	case NONMGR:
+	  return _db_addEmpls (db[fNON], l, h, s);
+	}
+    }
+}
+
+void db_print (void)
+{
+  int i;
+  char *printVal;
+  
+  printf ("Employees:\n");
+
+  for (i = firstERC; i <= lastERC; i++)
+    {
+      printVal = erc_sprint (db[i]);
+      printf ("%s", printVal);
+      free (printVal);
+    }
+}
diff --git a/test/db2/dbase.h b/test/db2/dbase.h
new file mode 100644
index 0000000..c684fc5
--- /dev/null
+++ b/test/db2/dbase.h
@@ -0,0 +1,9 @@
+# ifndef DBASE_H
+# define DBASE_H
+
+# include "eref.h"
+# include "erc.h"
+
+# include "dbase.lh"
+
+# endif
diff --git a/test/db2/dbase.lcl b/test/db2/dbase.lcl
new file mode 100644
index 0000000..1443a79
--- /dev/null
+++ b/test/db2/dbase.lcl
@@ -0,0 +1,96 @@
+imports employee, empset, ;
+
+typedef struct{gender g; job j; int l; int h;} db_q;
+typedef enum {db_OK, salERR, genderERR, jobERR,
+              duplERR, missERR} db_status;
+spec immutable type db;
+spec db d;
+
+claims UniqueKeys (employee e1, employee e2) db d; 
+{	
+ /* ensures
+     (e1 \in d\any /\ e2 \in d\any  /\ e1.ssNum = e2.ssNum)
+       => (e1 = e2);
+ */
+}	
+
+db_status hire(employee e) db d; 
+{
+  modifies d;
+  /* ensures
+     (if result = db_OK
+      then d' = hire(e, d^) else d' = d^)
+        /\ result =
+          (if e.gen = gender_ANY then genderERR
+           else if e.j = job_ANY then jobERR
+           else if e.salary < 0 then salERR
+           else if employed(d^, e.ssNum) then duplERR
+           else db_OK);
+  */
+}
+
+void uncheckedHire(employee e) db d; 
+{
+  /* requires e.gen \neq gender_ANY /\ e.j \neq job_ANY
+            /\ e.salary >= 0 /\ ~employed(d^, e.ssNum);
+  */
+  modifies d;
+  /* ensures d' = hire(e, d^); */
+}
+
+bool fire(int ssNum) db d; 
+{
+  modifies d;
+  /* ensures result = employed(d^, ssNum)
+       /\ d' = fire(d^, ssNum);
+  */
+}
+
+int query(db_q q, empset s) db d; 
+{
+  modifies s;
+  /* ensures s' = s^ \U query(d^, q)
+       /\ result = size(query(d^, q));
+  */
+}
+
+bool promote(int ssNum) db d; 
+{
+  modifies d;
+  /* ensures
+       result = (employed(d^, ssNum)
+                /\ find(d^, ssNum).j = NONMGR)
+          /\ (if result then d' = promote(d^, ssNum)
+              else d' = d^);
+  */
+}
+
+db_status setSalary(int ssNum, int sal) db d; 
+{
+  modifies d;
+  /* 
+  ensures
+      result =
+        (if employed(d^, ssNum)
+           then (if sal < 0 then salERR else db_OK)
+           else missERR)
+      /\ (if result = db_OK
+            then d' = setSal(d^, ssNum, sal)
+            else d' = d^);
+  */
+}
+
+void db_print(void) db d; FILE *stdout; 
+{
+  modifies *stdout^;
+  /*
+  ensures 
+    \exists s:ioStream ((*stdout^)' = write((*stdout^)^, s) /\ isSprint(d^, s));
+  */
+}
+
+void db_initMod(void) db d; 
+{
+  modifies d;
+  /* ensures d' = new; */
+}
diff --git a/test/db2/dbase.lcs b/test/db2/dbase.lcs
new file mode 100644
index 0000000..0959890
--- /dev/null
+++ b/test/db2/dbase.lcs
@@ -0,0 +1,1048 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLsort ereftab immutable nil nil
+%LCLsort _ereftab_Obj mutable ereftab nil
+%LCLsort erc immutable nil nil
+%LCLsort _erc_Obj mutable erc nil
+%LCLsort _sdbase1s_Struct str sdbase1s nil
+%LCLsort h strMem _int_Obj nil
+%LCLsort l strMem _int_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort g strMem __eemployee0e_Enum_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sdbase1s_Struct_Tuple tup _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Ptr ptr _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Arr arr _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Tuple_Vec vec _sdbase1s_Struct_Tuple __sdbase1s_Struct_Arr
+%LCLsort _db_q synonym _sdbase1s_Struct nil
+%LCLsort _edbase2e_Enum enum edbase2e nil
+%LCLsort missERR enumMem nil nil
+%LCLsort duplERR enumMem nil nil
+%LCLsort jobERR enumMem nil nil
+%LCLsort genderERR enumMem nil nil
+%LCLsort salERR enumMem nil nil
+%LCLsort db_OK enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _db_status synonym _edbase2e_Enum nil
+%LCLsort db immutable nil nil
+%LCLsort _db_Obj obj db nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLop db_OK : -> _edbase2e_Enum
+%LCLop salERR : -> _edbase2e_Enum
+%LCLtag eemployee0e enum
+%LCLop genderERR : -> _edbase2e_Enum
+%LCLop jobERR : -> _edbase2e_Enum
+%LCLop duplERR : -> _edbase2e_Enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop missERR : -> _edbase2e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ [] :__sdbase1s_Struct_Ptr -> __sdbase1s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ [__] :__sdbase1s_Struct_Tuple_Vec, int -> _sdbase1s_Struct_Tuple
+%LCLop __ [__] :__sdbase1s_Struct_Arr, int -> _sdbase1s_Struct
+%LCLop [__, __, __, __] :int, int, _eemployee1e_Enum, _eemployee0e_Enum -> _sdbase1s_Struct_Tuple
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \select g :_sdbase1s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select g :_sdbase1s_Struct -> __eemployee0e_Enum_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \select l :_sdbase1s_Struct_Tuple -> int
+%LCLop __ \select l :_sdbase1s_Struct -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow g :__sdbase1s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \select h :_sdbase1s_Struct_Tuple -> int
+%LCLop __ \select h :_sdbase1s_Struct -> _int_Obj
+%LCLop __ \field_arrow l :__sdbase1s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow h :__sdbase1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop NIL : -> __sdbase1s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \select j :_sdbase1s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_sdbase1s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow j :__sdbase1s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :__sdbase1s_Struct_Ptr, int -> __sdbase1s_Struct_Ptr
+%LCLop __ + __  :int, __sdbase1s_Struct_Ptr -> __sdbase1s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop __ - __  :__sdbase1s_Struct_Ptr, int -> __sdbase1s_Struct_Ptr
+%LCLop __ - __  :__sdbase1s_Struct_Ptr, __sdbase1s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop sizeof :ereftab -> int
+%LCLop sizeof :erc -> int
+%LCLop sizeof :_edbase2e_Enum -> int
+%LCLop sizeof :db -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop isSub :__sdbase1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sdbase1s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype empset _empset_Obj mutable
+%LCLfcn empset_create :  -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_final : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_clear : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_insert : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_insertUnique : _empset_Obj, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_delete : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_union : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_disjointUnion : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_intersect : _empset_Obj, _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_size : _empset_Obj -> int 
+%LCLfcnGlobals 
+%LCLfcn empset_member : _semployee0s_Struct_Tuple, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_subset : _empset_Obj, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_choose : _empset_Obj -> _semployee0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn empset_sprint : _empset_Obj -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn empset_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype db_q _db_q exposed
+%LCLenumConst db_OK _edbase2e_Enum
+%LCLenumConst salERR _edbase2e_Enum
+%LCLenumConst genderERR _edbase2e_Enum
+%LCLenumConst jobERR _edbase2e_Enum
+%LCLenumConst duplERR _edbase2e_Enum
+%LCLenumConst missERR _edbase2e_Enum
+%LCLtype db_status _db_status exposed
+%LCLtype db db immutable
+%LCLvar d _db_Obj
+%LCLfcn hire : _semployee0s_Struct_Tuple -> _edbase2e_Enum 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn uncheckedHire : _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn fire : int -> bool 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn query : _sdbase1s_Struct_Tuple, _empset_Obj -> int 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn promote : int -> bool 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn setSalary : int, int -> _edbase2e_Enum 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn db_print :  -> void 
+%LCLfcnGlobals _db_Obj d; ___FILE_Obj_Ptr_Obj stdout; 
+%LCLfcn db_initMod :  -> void 
+%LCLfcnGlobals _db_Obj d; 
+%LCLSymbolTableEnd
diff --git a/test/db2/dbase.lh b/test/db2/dbase.lh
new file mode 100644
index 0000000..082439b
--- /dev/null
+++ b/test/db2/dbase.lh
@@ -0,0 +1,30 @@
+/* Output from LCLint 2.5m */
+
+# include 
+# include "bool.h"
+# include "employee.h"
+# include "empset.h"
+
+
+# ifndef EXPOSED_TYPE_db_q
+typedef struct {
+    gender g;
+    job j;
+    int l;
+    int h;
+    } db_q;
+# endif
+
+
+# ifndef EXPOSED_TYPE_db_status
+typedef enum {db_OK, salERR, genderERR, jobERR, duplERR, missERR} db_status;
+# endif
+
+extern db_status hire (employee  /* e */);
+extern void uncheckedHire (employee  /* e */);
+extern bool fire (int  /* ssNum */);
+extern int query (db_q  /* q */, empset  /* s */);
+extern bool promote (int  /* ssNum */);
+extern db_status setSalary (int  /* ssNum */, int  /* sal */);
+extern void db_print (void);
+extern void db_initMod (void);
diff --git a/test/db2/drive.c b/test/db2/drive.c
new file mode 100644
index 0000000..daedcf9
--- /dev/null
+++ b/test/db2/drive.c
@@ -0,0 +1,164 @@
+/* Part of a driver used to test dbase  */
+
+/* Include those modules that export things that are used explicitly here */
+ 
+# include 
+# include 
+# include "bool.h"
+# include "employee.h"
+# include "empset.h"
+# include "dbase.h"
+
+int main (int argc, /*@unused@*/ char *argv[]) 
+{
+  employee e;
+  empset em1, em2, em3;
+  char na[10000];
+  char * sprintResult;
+  int i, j;
+  db_q q;
+  
+  /* Initialize all of the LCL-specified modules that were included */
+  bool_initMod();
+  employee_initMod();
+  empset_initMod();
+  db_initMod();
+  
+  if (argc != 1) 
+    {
+      printf ("FormatPos: Wrong number of arguments. Given %d needs 0.\n",
+	      argc - 1);
+      return 1;
+    }
+  
+  /* Unit test empset */
+  em1 = empset_create();
+
+  if (!(empset_size(em1) == 0))
+    {
+      printf("Size should be 0.\n");
+    }
+
+  for (i = 0; i < 500; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 100000;
+      e.gen = MALE;
+      e.j = MGR;
+      (void) sprintf(na, "S.S. Doe %d", i);
+      check (employee_setName(&e, na));
+      empset_insert(em1, e);
+    }
+
+  if (!(empset_size(em1) == 500)) 
+    {
+      printf("Size should be 500.\n");
+    }
+
+  for (i = 0; i < 250; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 100000;
+      e.gen = MALE;
+      e.j = MGR;
+      (void) sprintf(na, "S.S. Doe %d", i);
+      check (employee_setName(&e, na));
+      empset_delete(em1, e);
+    }
+
+  if (!(empset_size(em1) == 250)) 
+    {
+      printf("Size should be 250.\n");
+    }
+
+  em2 = empset_create();
+
+  for (i = 0; i < 100; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 100000;
+      e.gen = MALE;
+      e.j = MGR;
+      (void) sprintf(na, "S.S. Doe %d", i);
+      check (employee_setName(&e, na));
+      empset_insert(em2, e);
+    }
+
+  em3 = empset_union(em1, em2);
+
+  if (!(empset_size(em3) == 350))
+    {
+      printf("Size should be 350.\n");
+    }
+
+  empset_intersect(em3, em3);
+
+  if (!(empset_size(em3) == 350))
+    {
+      printf("Size should be 350.\n");
+    }
+
+  printf("Print two different employees:\n");
+
+  for (i = 0; i < 2; i++) 
+    {
+      e = empset_choose(em3);
+      employee_sprint(na, e);
+      printf("%s\n", &(na[0]));
+      empset_delete(em3, e);
+    }
+  
+  /* Test dbase  */
+
+  for (i = 0; i < 20; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 10 * i;
+      if (i < 10) e.gen = MALE; else e.gen = FEMALE;
+      if (i < 15) e.j = NONMGR; else e.j = MGR;
+      (void) sprintf(na, "J. Doe %d", i);
+      check (employee_setName(&e, na));
+
+      if ((i/2)*2 == i) 
+	{
+	  check (hire(e) == db_OK); 
+	}
+      else 
+	{
+	  uncheckedHire(e); j = hire(e);
+	}
+    }
+  
+  printf("Should print 4: %d\n", /*@-usedef@*/ j /*@=usedef@*/); 
+  printf("Employees 0 - 19\n");
+  db_print();
+  check (fire(17));
+  q.g = FEMALE; q.j = job_ANY; q.l = 158; q.h = 185;
+  printf("Employees 0 - 16, 18 - 19\n");
+  db_print();
+
+  i = query(q, em1 = empset_create());
+  sprintResult = empset_sprint(em1);
+  printf("Should get two females: %d\n%s\n", i, sprintResult);
+  free(sprintResult);
+
+  q.g = MALE; q.j = NONMGR; q.l = 0; q.h = 185;
+  i = query(q, em2 = empset_create());
+  em3 = empset_disjointUnion(em2, em1);
+  sprintResult = empset_sprint(em3);
+  i = empset_size(em3);
+  printf("Should get two females and ten males: %d\n%s\n", i, sprintResult);
+  free(sprintResult);
+  
+  empset_intersect(em1, em3);
+  sprintResult = empset_sprint(em1);
+  i = empset_size(em1);
+  printf("Should get two females: %d\n%s\n", i, sprintResult);
+  free(sprintResult); 
+
+  check (fire(empset_choose(em3).ssNum));
+  printf("Should get 18 employees\n");
+  db_print();
+  
+  return 0;
+}
diff --git a/test/db2/employee.c b/test/db2/employee.c
new file mode 100644
index 0000000..f858544
--- /dev/null
+++ b/test/db2/employee.c
@@ -0,0 +1,35 @@
+# include 
+# include 
+# include "employee.h"
+
+bool employee_setName (employee *e, char na []) 
+{
+  size_t i;
+  
+  for (i = 0; na[i] != '\0'; i++)
+    {
+      if (i == maxEmployeeName) return FALSE;
+    }
+
+  strcpy (e->name, na);
+  return TRUE;
+}
+
+bool employee_equal (employee * e1, employee * e2) 
+{
+  return ((e1->ssNum == e2->ssNum)
+	  && (e1->salary == e2->salary)
+	  && (e1->gen == e2->gen)
+	  && (e1->j == e2->j)
+	  && (strncmp (e1->name, e2->name, maxEmployeeName) == 0));
+}
+
+void employee_sprint (char s[], employee e) 
+{
+  static char *gender[] ={ "male", "female", "?" };
+  static char *jobs[] = { "manager", "non-manager", "?" };
+  
+  (void) sprintf (s, employeeFormat, e.ssNum, e.name,
+		  gender[e.gen], jobs[e.j], e.salary);
+}
+
diff --git a/test/db2/employee.h b/test/db2/employee.h
new file mode 100644
index 0000000..b632612
--- /dev/null
+++ b/test/db2/employee.h
@@ -0,0 +1,11 @@
+# ifndef EMPLOYEE_H
+# define EMPLOYEE_H
+
+# define maxEmployeeName (20)
+# define employeeFormat "%9d  %-20s  %-6s  %-11s  %6d.00"
+# define employeePrintSize (63)
+
+# include "employee.lh"
+
+# define employee_initMod()  bool_initMod()
+# endif
diff --git a/test/db2/employee.lcl b/test/db2/employee.lcl
new file mode 100644
index 0000000..03eea9a
--- /dev/null
+++ b/test/db2/employee.lcl
@@ -0,0 +1,54 @@
+imports  ;
+
+constant size_t maxEmployeeName;
+constant int employeePrintSize;
+
+typedef enum { MALE, FEMALE, gender_ANY } gender;
+typedef enum { MGR, NONMGR, job_ANY } job;
+
+typedef struct 
+{
+  int ssNum;
+  char name[maxEmployeeName];
+  int salary;
+  gender gen;
+  job j;
+} employee;
+
+void employee_sprint (out char s[], employee e) 
+{
+  /* requires maxIndex(s) >= employeePrintSize; */
+  modifies s;
+  /* ensures isSprint(s', e)
+        /\ lenStr(s') = employeePrintSize;
+  */
+}
+
+bool employee_equal (employee *e1, employee *e2) 
+{
+  /* ensures result = sameStr(e1->name^, e2->name^)
+           /\ (e1->ssNum^ = e2->ssNum^)
+           /\ (e1->salary^ = e2->salary^)
+           /\ (e1->gen^ = e2->gen^)
+           /\ (e1->j^ = e2->j^);
+  */
+}
+
+bool employee_setName(employee *e, char na[]) 
+{
+  /* requires nullTerminated(na^); */
+  modifies e->name;
+  /* ensures result = lenStr(na^) < maxEmployeeName
+           /\ (if result
+               then sameStr(e->name', na^)
+                     /\ nullTerminated(e->name')
+               else e->name' = e->name^);
+  */
+}
+
+void employee_initMod(void) 
+{
+  modifies internalState;
+  ensures true;
+}
+
diff --git a/test/db2/employee.lcs b/test/db2/employee.lcs
new file mode 100644
index 0000000..1a9f545
--- /dev/null
+++ b/test/db2/employee.lcs
@@ -0,0 +1,518 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db2/employee.lh b/test/db2/employee.lh
new file mode 100644
index 0000000..bf31c41
--- /dev/null
+++ b/test/db2/employee.lh
@@ -0,0 +1,30 @@
+/* Output from LCLint 2.5m */
+
+# include 
+# include "bool.h"
+
+
+# ifndef EXPOSED_TYPE_gender
+typedef enum {MALE, FEMALE, gender_ANY} gender;
+# endif
+
+
+# ifndef EXPOSED_TYPE_job
+typedef enum {MGR, NONMGR, job_ANY} job;
+# endif
+
+
+# ifndef EXPOSED_TYPE_employee
+typedef struct {
+    int ssNum;
+    char name[maxEmployeeName];
+    int salary;
+    gender gen;
+    job j;
+    } employee;
+# endif
+
+extern void employee_sprint (/*@out@*/ char  /* s */[], employee  /* e */);
+extern bool employee_equal (employee * /* e1 */, employee * /* e2 */);
+extern bool employee_setName (employee * /* e */, char  /* na */[]);
+extern void employee_initMod (void);
diff --git a/test/db2/empset.c b/test/db2/empset.c
new file mode 100644
index 0000000..d17ae53
--- /dev/null
+++ b/test/db2/empset.c
@@ -0,0 +1,149 @@
+# include "empset.h"
+
+static bool initDone = FALSE;
+
+eref _empset_get (employee e, erc s) 
+{
+  erc_elements(s, er)
+    {
+      employee e1 = eref_get(er);
+      if (employee_equal(&e1, &e))
+	return er;
+    } end_erc_elements ;
+  
+  return erefNIL;
+}
+
+void empset_clear (empset s) 
+{
+  erc_clear (s);
+}
+
+bool /*@alt void@*/ empset_insert (empset s, employee e) 
+{
+  if (!eref_equal (_empset_get (e, s), erefNIL)) 
+    {
+      return FALSE;
+    }
+  
+  empset_insertUnique (s, e);
+  return TRUE;
+}
+
+void empset_insertUnique (empset s, employee e) 
+{
+  eref er;
+
+  er = ereftab_lookup (e, known);
+
+  if (eref_equal (er, erefNIL)) 
+    {
+      er = eref_alloc ( );
+      eref_assign (er,e);
+      ereftab_insert (known, e, er);
+    }
+  
+  erc_insert (s, er);
+}
+
+bool /*@alt void@*/ empset_delete (empset s, employee e) 
+{
+  eref er;
+
+  er = _empset_get (e, s);
+
+  if (eref_equal (er, erefNIL)) 
+    {
+      return FALSE;
+    }
+  return erc_delete (s, er);
+}
+
+empset empset_disjointUnion (empset s1, empset s2) 
+{
+  erc result;
+  empset tmp;
+  
+  result = erc_create ( );
+
+  if (erc_size (s1) > erc_size (s2)) 
+    {
+      tmp = s1;
+      s1 = s2;
+      s2 = tmp;
+    }
+  
+  erc_join (result, s1);
+
+  empset_elements(s2, emp)
+    {
+      empset_insertUnique(result, emp);
+    } end_empset_elements ;
+
+  return result;
+}
+
+empset empset_union (empset s1, empset s2) 
+{
+  erc result;
+  empset tmp;
+
+  result = erc_create ();
+
+  if (erc_size (s1) > erc_size (s2)) 
+    {
+      tmp = s1;
+      s1 = s2;
+      s2 = tmp;
+    }
+  erc_join (result, s2);
+
+  empset_elements (s1, emp)
+    {
+      if (!empset_member(emp, s2))
+	empset_insert(result, emp);
+    } end_empset_elements ;
+
+  return result;
+}
+
+void empset_intersect (empset s1, empset s2) 
+{
+  erc toDelete = erc_create();
+
+  empset_elements (s2, emp)
+    {
+      if (!empset_member(emp, s2))
+	empset_insert(toDelete, emp);
+    } end_empset_elements ;
+
+  empset_elements (toDelete, emp)
+    {
+      empset_delete(s1, emp);
+    } end_empset_elements;
+
+  erc_final (toDelete);
+}
+
+bool empset_subset (empset s1, empset s2) 
+{
+  empset_elements(s1, emp)
+    {
+      if (!empset_member(emp, s2)) return FALSE;
+    } end_empset_elements ;
+
+  return TRUE;
+}
+
+void empset_initMod (void) 
+{
+  if (initDone) return;
+
+  bool_initMod ();
+  employee_initMod ();
+  eref_initMod ();
+  erc_initMod ();
+  ereftab_initMod ();
+  known = ereftab_create ();
+  initDone = TRUE;
+}
diff --git a/test/db2/empset.h b/test/db2/empset.h
new file mode 100644
index 0000000..cc4c61d
--- /dev/null
+++ b/test/db2/empset.h
@@ -0,0 +1,40 @@
+# ifndef EMPSET_H
+# define EMPSET_H
+
+# include "eref.h"
+# include "erc.h"
+# include "ereftab.h"
+
+typedef erc empset;
+
+ereftab known;
+
+/*
+  Abstraction function, toEmpSet:
+    e \in toEmpSet(s) == 
+      exists er (count(er, s.val) = 1
+        /\ getERef(known, e) = er)
+
+  Rep invariant:
+    forall s: empset
+      (forall er: eref (count(er, s.val) <= 1)
+      /\ s.activeIters = 0
+      /\ forall er: eref (count(er, s.val) = 1
+        => in(known, er)))
+*/
+
+# include "empset.lh"
+
+# define empset_create()  (erc_create())
+# define empset_final(s) (erc_final(s))
+# define empset_member(e, s) \
+         (!(eref_equal(_empset_get(e, s), erefNIL)))
+# define empset_size(es) (erc_size(es))
+# define empset_choose(es) (eref_get(erc_choose(es)))
+# define empset_sprint(es) (erc_sprint(es))
+
+#define empset_elements(e, m_x) \
+   erc_elements(e, m_y) { employee m_x = eref_get(m_y);
+#define end_empset_elements        } end_erc_elements
+
+# endif
diff --git a/test/db2/empset.lcl b/test/db2/empset.lcl
new file mode 100644
index 0000000..62ae172
--- /dev/null
+++ b/test/db2/empset.lcl
@@ -0,0 +1,90 @@
+imports employee;
+mutable type empset;
+
+empset empset_create(void) 
+{
+  /* ensures fresh(result) /\ result' = { }; */
+}
+
+void empset_final(empset s) 
+{
+  modifies s;
+  /* ensures trashed(s); */
+}
+
+void empset_clear(empset s) 
+{
+  modifies s;
+  /* ensures s' = { }; */
+}
+
+| bool : void | empset_insert(empset s, employee e) 
+{
+  modifies s;
+  /* ensures result = ~(e \in s^) /\ s' = insert(e, s^); */
+}
+
+void empset_insertUnique(empset s, employee e) 
+{
+  /* requires ~(e \in s^); */
+  modifies s;
+  /* ensures s' = insert(e, s^); */
+}
+
+| bool : void | empset_delete(empset s, employee e) 
+{
+  modifies s;
+  /* ensures result = e \in s^ /\ s' = delete(e, s^); */
+}
+
+empset empset_union(empset s1, empset s2) 
+{
+  /* ensures result' = s1^ \U s2^ /\ fresh(result); */
+}
+
+empset empset_disjointUnion(empset s1, empset s2) 
+{
+  /* requires s1^ \I s2^ = { }; */
+  /* ensures result' = s1^ \U s2^ /\ fresh(result); */
+}
+
+void empset_intersect(empset s1, empset s2) 
+{
+  modifies s1;
+  /* ensures s1' = s1^ \I s2^; */
+}
+
+int empset_size(empset s) 
+{
+  /* ensures result = size(s^); */
+}
+
+bool empset_member(employee e, empset s) 
+{
+  /* ensures result = e \in s^; */
+}
+
+bool empset_subset(empset s1, empset s2) 
+{
+  /* ensures result = s1^ \subseteq s2^; */
+}
+
+employee empset_choose(empset s) 
+{
+  /* requires s^ \neq { }; */
+  /* ensures result \in s^; */
+}
+
+char *empset_sprint(empset s) 
+{
+  /* ensures isSprint(result[]', s^) /\ fresh(result[]); */
+}
+
+void empset_initMod(void) 
+{
+  modifies internalState;
+  ensures true;
+}
+
+iter empset_elements (empset s, yield employee x);
+
diff --git a/test/db2/empset.lcs b/test/db2/empset.lcs
new file mode 100644
index 0000000..985701f
--- /dev/null
+++ b/test/db2/empset.lcs
@@ -0,0 +1,564 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort MALE enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort MGR enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLtag eemployee0e enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype empset _empset_Obj mutable
+%LCLfcn empset_create :  -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_final : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_clear : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_insert : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_insertUnique : _empset_Obj, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_delete : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_union : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_disjointUnion : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_intersect : _empset_Obj, _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_size : _empset_Obj -> int 
+%LCLfcnGlobals 
+%LCLfcn empset_member : _semployee0s_Struct_Tuple, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_subset : _empset_Obj, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_choose : _empset_Obj -> _semployee0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn empset_sprint : _empset_Obj -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn empset_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db2/empset.lh b/test/db2/empset.lh
new file mode 100644
index 0000000..35e75e3
--- /dev/null
+++ b/test/db2/empset.lh
@@ -0,0 +1,21 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "employee.h"
+
+
+extern empset empset_create (void);
+extern void empset_final (empset  /* s */);
+extern void empset_clear (empset  /* s */);
+extern bool /*@alt void@*/ empset_insert (empset  /* s */, employee  /* e */);
+extern void empset_insertUnique (empset  /* s */, employee  /* e */);
+extern bool /*@alt void@*/ empset_delete (empset  /* s */, employee  /* e */);
+extern empset empset_union (empset  /* s1 */, empset  /* s2 */);
+extern empset empset_disjointUnion (empset  /* s1 */, empset  /* s2 */);
+extern void empset_intersect (empset  /* s1 */, empset  /* s2 */);
+extern int empset_size (empset  /* s */);
+extern bool empset_member (employee  /* e */, empset  /* s */);
+extern bool empset_subset (empset  /* s1 */, empset  /* s2 */);
+extern employee empset_choose (empset  /* s */);
+extern char *empset_sprint (empset  /* s */);
+extern void empset_initMod (void);
diff --git a/test/db2/erc.c b/test/db2/erc.c
new file mode 100644
index 0000000..2e2a672
--- /dev/null
+++ b/test/db2/erc.c
@@ -0,0 +1,143 @@
+# include 
+# include "erc.h"
+
+static size_t int_toSize (int x)
+{
+  size_t res = (size_t) x;
+
+  if ((int) res != x)
+    {
+      fprintf (stderr, "Error: int_toSize failure: %d", x);
+      return 0;
+    }
+  else
+    {
+      return res;
+    }
+}
+
+erc erc_create (void) 
+{
+  erc c;
+
+  c = (erc) malloc (sizeof (ercInfo));
+
+  if (c == 0) 
+    {
+      printf ("Malloc returned null in erc_create\n");
+      exit (EXIT_FAILURE);
+    }
+  
+  c->vals = 0;
+  c->size = 0;
+  return c;
+}
+
+void erc_clear (erc c) 
+{
+  ercList elem;
+  ercList next;
+
+  for (elem = c->vals; elem != 0; elem = next) 
+    {
+      next = elem->next;
+      free (elem);
+    }
+  
+  c->vals = 0;
+  c->size = 0;
+}
+
+void erc_final (erc c) 
+{
+  erc_clear (c);
+  free (c); 
+}
+
+bool erc_member (eref er, erc c) 
+{
+  ercList tmpc;
+
+  for (tmpc = c->vals; tmpc != 0; tmpc = tmpc->next)
+    if (eref_equal (tmpc->val, er)) return TRUE; 
+
+  return FALSE;
+}
+
+void erc_insert (erc c, eref er) 
+{
+  ercList newElem;
+  newElem = (ercElem *) malloc (sizeof (ercElem));
+
+  if (newElem == 0) 
+    {
+      printf ("Malloc returned null in erc_insert\n");
+      exit (EXIT_FAILURE);
+    }
+
+  newElem->val = er;
+  newElem->next = c->vals;
+  c->vals = newElem;
+  c->size++;
+}
+
+bool erc_delete (erc c, eref er) 
+{
+  ercList elem;
+  ercList prev;
+  
+  for (prev = 0, elem = c->vals;
+       elem != 0;
+       prev = elem, elem = elem->next) 
+    {
+      if (eref_equal (elem->val, er))
+	{ 
+	  if (prev == 0)
+	    c->vals = elem->next;
+	  else 
+	    prev->next = elem->next;
+	  
+	  free (elem); 
+	  c->size--;
+	  return TRUE;
+	}
+    }
+  
+  return FALSE;
+}
+
+void erc_join (erc c1, erc c2) 
+{
+  ercList tmpc;
+
+  for (tmpc = c2->vals; tmpc != 0; tmpc = tmpc->next)
+    erc_insert (c1, tmpc->val);
+}
+
+char *erc_sprint (erc c)
+{
+  int len;
+  char *result;
+
+  result = (char *) 
+    malloc (int_toSize (erc_size (c) * (employeePrintSize + 1) + 1));
+
+  if (result == 0) 
+    {
+      printf ("Malloc returned null in erc_sprint\n");
+      exit (EXIT_FAILURE);
+    }
+
+  len = 0;
+
+  erc_elements(c, er)
+    {
+      employee_sprint(&(result[len]), eref_get(er));
+      len += employeePrintSize;
+      result[len++] = '\n';
+    } end_erc_elements;
+
+  result[len] = '\0';
+  return result;
+}
+
diff --git a/test/db2/erc.h b/test/db2/erc.h
new file mode 100644
index 0000000..7c197ae
--- /dev/null
+++ b/test/db2/erc.h
@@ -0,0 +1,26 @@
+# ifndef ERC_H
+# define ERC_H
+
+# include "eref.h"
+
+typedef struct _elem { eref val; struct _elem *next; } ercElem;
+typedef ercElem *ercList;
+typedef struct { ercList vals; int size; } ercInfo;
+typedef ercInfo *erc;
+
+# include "erc.lh"
+
+# define erc_size(c) ((c)->size)
+# define erc_choose(c) (((c)->vals)->val)
+# define erc_initMod() \
+    do { bool_initMod(); employee_initMod();\
+         eref_initMod(); } while (0)
+
+# define erc_elements(c, m_x) \
+  { erc m_c = (c); ercElem *m_ec = (m_c)->vals; int m_i = 0; \
+    while (m_i < (m_c)->size) { \
+      eref m_x = m_ec->val; m_ec = m_ec->next; m_i++; 
+
+# define end_erc_elements }}
+
+# endif
diff --git a/test/db2/erc.lcl b/test/db2/erc.lcl
new file mode 100644
index 0000000..97b72fd
--- /dev/null
+++ b/test/db2/erc.lcl
@@ -0,0 +1,72 @@
+imports eref;
+
+mutable type erc;
+
+erc erc_create(void) 
+{
+  /* ensures fresh(result) /\ result' = { }; */
+}
+
+void erc_clear(erc c) 
+{
+  /* requires c^.activeIters = 0; */
+  modifies c;
+  /* ensures c' = { }; */
+}
+
+void erc_insert(erc c, eref er) 
+{
+  /* requires c^.activeIters = 0 /\ er \neq erefNIL; */
+  modifies c;
+  /* ensures c' = [insert(er, c^.val), 0]; */
+}
+
+| bool : void | erc_delete(erc c, eref er) 
+{
+  /* requires c^.activeIters = 0; */
+  modifies c;
+  /* ensures result = er \in c^.val
+     /\ c' = [delete(er, c^.val), 0]; */
+}
+
+bool erc_member(eref er, erc c) 
+{
+  /* ensures result = er \in c^.val; */
+}
+
+eref erc_choose(erc c) 
+{
+  /* requires size(c^.val) \neq 0; */
+  /* ensures result \in c^.val; */
+}
+
+int erc_size(erc c) 
+{
+  /* ensures result = size(c^.val); */
+}
+
+void erc_join(erc c1, erc c2) 
+{
+  /* requires c1^.activeIters = 0; */
+  modifies c1;
+  /* ensures c1' = [c1^.val \U c2^.val, 0]; */
+}
+
+char *erc_sprint(erc c) 
+{
+  /* ensures isSprint(result[]', c^) /\ fresh(result[]); */
+}
+
+void erc_final(erc c) 
+{
+  modifies c;
+  /* ensures trashed(c); */
+}
+
+void erc_initMod(void) 
+{
+  modifies internalState;
+  ensures true;
+}
+
+iter erc_elements (erc c, yield eref el);  
diff --git a/test/db2/erc.lcs b/test/db2/erc.lcs
new file mode 100644
index 0000000..e11d128
--- /dev/null
+++ b/test/db2/erc.lcs
@@ -0,0 +1,582 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLsort ereftab immutable nil nil
+%LCLsort _ereftab_Obj mutable ereftab nil
+%LCLsort erc immutable nil nil
+%LCLsort _erc_Obj mutable erc nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLtag eemployee0e enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop sizeof :ereftab -> int
+%LCLop sizeof :erc -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype eref eref immutable
+%LCLtype map map immutable
+%LCLvar m _map_Obj
+%LCLconst erefNIL eref
+%LCLfcn eref_alloc :  -> eref 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_free : eref -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_assign : eref, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_get : eref -> _semployee0s_Struct 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_equal : eref, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn eref_initMod :  -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLtype erc _erc_Obj mutable
+%LCLfcn erc_create :  -> _erc_Obj 
+%LCLfcnGlobals 
+%LCLfcn erc_clear : _erc_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_insert : _erc_Obj, eref -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_delete : _erc_Obj, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn erc_member : eref, _erc_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn erc_choose : _erc_Obj -> eref 
+%LCLfcnGlobals 
+%LCLfcn erc_size : _erc_Obj -> int 
+%LCLfcnGlobals 
+%LCLfcn erc_join : _erc_Obj, _erc_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_sprint : _erc_Obj -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn erc_final : _erc_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db2/erc.lh b/test/db2/erc.lh
new file mode 100644
index 0000000..76bddbc
--- /dev/null
+++ b/test/db2/erc.lh
@@ -0,0 +1,17 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "eref.h"
+
+
+extern erc erc_create (void);
+extern void erc_clear (erc  /* c */);
+extern void erc_insert (erc  /* c */, eref  /* er */);
+extern bool /*@alt void@*/ erc_delete (erc  /* c */, eref  /* er */);
+extern bool erc_member (eref  /* er */, erc  /* c */);
+extern eref erc_choose (erc  /* c */);
+extern int erc_size (erc  /* c */);
+extern void erc_join (erc  /* c1 */, erc  /* c2 */);
+extern char *erc_sprint (erc  /* c */);
+extern void erc_final (erc  /* c */);
+extern void erc_initMod (void);
diff --git a/test/db2/eref.c b/test/db2/eref.c
new file mode 100644
index 0000000..c1d8d2a
--- /dev/null
+++ b/test/db2/eref.c
@@ -0,0 +1,85 @@
+# include 
+# include 
+# include "eref.h"
+
+eref_ERP eref_Pool;            /* private */
+static bool needsInit = TRUE;  /* private */
+
+eref eref_alloc (void) 
+{
+  int i, res;
+  
+  for (i=0; (eref_Pool.status[i] == used) && (i < eref_Pool.size); i++);
+  
+  res = i;
+
+  if (res == eref_Pool.size) 
+    {
+      eref_Pool.conts =
+	(employee *) realloc (eref_Pool.conts,
+			      2 * eref_Pool.size * sizeof (employee));
+      
+      if (eref_Pool.conts == 0) 
+	{
+	  printf ("Malloc returned null in eref_alloc\n");
+	  exit (EXIT_FAILURE);
+	}
+      
+      eref_Pool.status =
+	(eref_status *) realloc (eref_Pool.status,
+				 2 * eref_Pool.size * sizeof (eref_status));
+
+      if (eref_Pool.status == 0) 
+	{
+	  printf ("Malloc returned null in eref_alloc\n");
+	  exit (EXIT_FAILURE);
+	}
+      
+      eref_Pool.size = 2*eref_Pool.size;
+
+      for (i = res+1; i < eref_Pool.size; i++)
+        eref_Pool.status[i] = avail;
+    }
+  
+  eref_Pool.status[res] = used;
+  return (eref) res;
+}
+
+void eref_initMod (void) 
+{
+  int i;
+  const int size = 16;
+  
+  if (!needsInit) 
+    {
+      return;
+    }
+
+  needsInit = FALSE;
+  bool_initMod ();
+  employee_initMod ();
+
+  eref_Pool.conts = (employee *) malloc (size * sizeof (employee));
+
+  if (eref_Pool.conts == 0) 
+    {
+      printf ("Malloc returned null in eref_initMod\n");
+      exit (EXIT_FAILURE);
+    }
+  
+  eref_Pool.status = (eref_status *) malloc (size * sizeof (eref_status));
+
+  if (eref_Pool.status == 0) 
+    {
+      printf ("Malloc returned null in eref_initMod\n");
+      exit (EXIT_FAILURE);
+    }
+  
+  eref_Pool.size = size;
+
+  for (i = 0; i < size; i++)
+    {
+      eref_Pool.status[i] = avail;
+    }
+}
+
diff --git a/test/db2/eref.h b/test/db2/eref.h
new file mode 100644
index 0000000..8492f21
--- /dev/null
+++ b/test/db2/eref.h
@@ -0,0 +1,28 @@
+# ifndef EREF_H
+# define EREF_H
+
+# include "employee.h"
+
+typedef int eref;
+
+/* Private typedefs used in macros  */
+typedef enum { used, avail } eref_status;
+typedef struct {
+  employee *conts;
+  eref_status *status;
+  int size;
+} eref_ERP;
+
+/* Declared here so that macros can use it  */
+extern eref_ERP eref_Pool;
+
+# include "eref.lh"
+
+# define erefNIL -1
+
+# define eref_free(er)        (eref_Pool.status[er] = avail)
+# define eref_assign(er, e)   (eref_Pool.conts[er] = (e))
+# define eref_get(er)         (eref_Pool.conts[er])
+# define eref_equal(er1, er2) ((er1) == (er2))
+
+# endif
diff --git a/test/db2/eref.lcl b/test/db2/eref.lcl
new file mode 100644
index 0000000..b792ff0
--- /dev/null
+++ b/test/db2/eref.lcl
@@ -0,0 +1,44 @@
+imports employee;
+
+immutable type eref;
+spec immutable type map;
+
+spec map m;
+constant eref erefNIL;
+
+eref eref_alloc(void) map m; 
+{
+  modifies m;
+  /* ensures newInd(result, m^, m'); */
+}
+
+void eref_free(eref er) map m; 
+{
+  /* requires er \in domain(m^); */
+  modifies m;
+  /* ensures m' = delete(m^, er); */
+}
+
+void eref_assign(eref er, employee e) map m; 
+{
+  /* requires er \in domain(m^); */
+  modifies m;
+  /* ensures m' = assign(m^, er, e); */
+}
+
+employee eref_get(eref er) map m; 
+{
+  /* requires er \in domain(m^); */
+  /* ensures result = m^[er]; */
+}
+
+bool eref_equal(eref er1, eref er2) 
+{
+  /* ensures result = (er1 = er2); */
+}
+
+void eref_initMod(void) map m; 
+{
+  modifies m;
+  /* ensures m' = new; */
+}
diff --git a/test/db2/eref.lcs b/test/db2/eref.lcs
new file mode 100644
index 0000000..ebac697
--- /dev/null
+++ b/test/db2/eref.lcs
@@ -0,0 +1,546 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort MALE enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort MGR enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLtag eemployee0e enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype eref eref immutable
+%LCLtype map map immutable
+%LCLvar m _map_Obj
+%LCLconst erefNIL eref
+%LCLfcn eref_alloc :  -> eref 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_free : eref -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_assign : eref, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_get : eref -> _semployee0s_Struct 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_equal : eref, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn eref_initMod :  -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLSymbolTableEnd
diff --git a/test/db2/eref.lh b/test/db2/eref.lh
new file mode 100644
index 0000000..93200af
--- /dev/null
+++ b/test/db2/eref.lh
@@ -0,0 +1,12 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "employee.h"
+
+
+extern eref eref_alloc (void);
+extern void eref_free (eref  /* er */);
+extern void eref_assign (eref  /* er */, employee  /* e */);
+extern employee eref_get (eref  /* er */);
+extern bool eref_equal (eref  /* er1 */, eref  /* er2 */);
+extern void eref_initMod (void);
diff --git a/test/db2/ereftab.c b/test/db2/ereftab.c
new file mode 100644
index 0000000..43d188c
--- /dev/null
+++ b/test/db2/ereftab.c
@@ -0,0 +1,46 @@
+/*
+** This is not a good implementation.  I should probably replace
+** the erc with a hash table.  
+*/
+
+# include "ereftab.h"
+
+ereftab ereftab_create (void) 
+{
+  return erc_create ();
+}
+
+void ereftab_insert (ereftab t, employee e, eref er) 
+{
+  eref_assign (er, e);
+  erc_insert (t, er);
+}
+
+bool ereftab_delete (ereftab t, eref er) 
+{
+  bool result;
+  
+  result = erc_member (er, t);  
+  erc_delete (t, er);
+  return result;
+}
+
+eref ereftab_lookup (employee e, ereftab t) 
+{
+  employee e1;
+
+  ereftab_elements(t, er)
+    {
+      e1 = eref_get(er);
+      if (employee_equal(&e, &e1)) return er;
+    } end_ereftab_elements ;
+  return erefNIL;
+}
+
+void ereftab_initMod (void) 
+{
+  bool_initMod ();
+  eref_initMod ();
+  erc_initMod ();
+}
+
diff --git a/test/db2/ereftab.h b/test/db2/ereftab.h
new file mode 100644
index 0000000..07b94b0
--- /dev/null
+++ b/test/db2/ereftab.h
@@ -0,0 +1,16 @@
+/* ereftab.h  */
+
+# ifndef EREFTAB_H
+# define EREFTAB_H
+
+# include "erc.h"
+# include "eref.h"
+
+typedef erc ereftab;
+
+# include "ereftab.lh"
+# define ereftab_elements(s, m_x) erc_elements(s, m_x)
+# define end_ereftab_elements     end_erc_elements
+
+# endif
+
diff --git a/test/db2/ereftab.lcl b/test/db2/ereftab.lcl
new file mode 100644
index 0000000..ea2b0f8
--- /dev/null
+++ b/test/db2/ereftab.lcl
@@ -0,0 +1,36 @@
+imports employee, eref;
+
+mutable type ereftab; 
+
+ereftab ereftab_create(void) 
+{
+  /* ensures result' = empty; */
+}
+
+void ereftab_insert(ereftab t, employee e, eref er) 
+{
+  /* requires getERef(t^, e) = erefNIL; */
+  modifies t;
+  /* ensures t' = add(t^, e, er); */
+}
+
+bool ereftab_delete(ereftab t, eref er) 
+{
+  modifies t;
+  /* ensures result = in(t^, er) /\ t' = delete(t^, er); */
+}
+
+eref ereftab_lookup(employee e, ereftab t) 
+{
+  /* ensures result = getERef(t^, e); */
+}
+
+void ereftab_initMod(void) 
+{
+  modifies internalState;
+  ensures true;
+}
+
+iter ereftab_elements(ereftab s, yield eref x);
+
+
diff --git a/test/db2/ereftab.lcs b/test/db2/ereftab.lcs
new file mode 100644
index 0000000..484988c
--- /dev/null
+++ b/test/db2/ereftab.lcs
@@ -0,0 +1,776 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort gender_ANY enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort job_ANY enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLsort ereftab immutable nil nil
+%LCLsort _ereftab_Obj mutable ereftab nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop gender_ANY : -> _eemployee0e_Enum
+%LCLtag eemployee0e enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop job_ANY : -> _eemployee1e_Enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop sizeof :ereftab -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst gender_ANY _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst job_ANY _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype eref eref immutable
+%LCLtype map map immutable
+%LCLvar m _map_Obj
+%LCLconst erefNIL eref
+%LCLfcn eref_alloc :  -> eref 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_free : eref -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_assign : eref, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_get : eref -> _semployee0s_Struct 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_equal : eref, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn eref_initMod :  -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLtype ereftab _ereftab_Obj mutable
+%LCLfcn ereftab_create :  -> _ereftab_Obj 
+%LCLfcnGlobals 
+%LCLfcn ereftab_insert : _ereftab_Obj, _semployee0s_Struct_Tuple, eref -> void 
+%LCLfcnGlobals 
+%LCLfcn ereftab_delete : _ereftab_Obj, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn ereftab_lookup : _semployee0s_Struct_Tuple, _ereftab_Obj -> eref 
+%LCLfcnGlobals 
+%LCLfcn ereftab_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db2/ereftab.lh b/test/db2/ereftab.lh
new file mode 100644
index 0000000..5204a87
--- /dev/null
+++ b/test/db2/ereftab.lh
@@ -0,0 +1,12 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "employee.h"
+# include "eref.h"
+
+
+extern ereftab ereftab_create (void);
+extern void ereftab_insert (ereftab  /* t */, employee  /* e */, eref  /* er */);
+extern bool ereftab_delete (ereftab  /* t */, eref  /* er */);
+extern eref ereftab_lookup (employee  /* e */, ereftab  /* t */);
+extern void ereftab_initMod (void);
diff --git a/test/db2/etest.c b/test/db2/etest.c
new file mode 100644
index 0000000..3c1435b
--- /dev/null
+++ b/test/db2/etest.c
@@ -0,0 +1,49 @@
+# include 
+# include 
+# include "eref.h"
+
+eref_ERP eref_Pool;            /* private */
+static bool needsInit = TRUE;  /* private */
+
+void eref_initMod (void) 
+{
+  int i;
+  const int size = 16;
+  
+  if (!needsInit) 
+    {
+      return;
+    }
+
+  needsInit = FALSE;
+  bool_initMod ();
+  employee_initMod ();
+
+  eref_Pool.conts = (employee *) malloc (size * sizeof (employee));
+
+  if (eref_Pool.conts == 0) 
+    {
+      printf ("Malloc returned null in eref_initMod\n");
+      exit (EXIT_FAILURE);
+    }
+  
+  eref_Pool.status = (eref_status *) malloc (size * sizeof (eref_status));
+
+  if (eref_Pool.status == 0) 
+    {
+      printf ("Malloc returned null in eref_initMod\n");
+      exit (EXIT_FAILURE);
+    }
+  
+  eref_Pool.size = size;
+
+  if (size > 3)
+    {
+      eref_Pool.status[0] = avail;
+    }
+  else
+    {
+      ;
+    }
+}
+
diff --git a/test/db2/etest.lcl b/test/db2/etest.lcl
new file mode 100644
index 0000000..b792ff0
--- /dev/null
+++ b/test/db2/etest.lcl
@@ -0,0 +1,44 @@
+imports employee;
+
+immutable type eref;
+spec immutable type map;
+
+spec map m;
+constant eref erefNIL;
+
+eref eref_alloc(void) map m; 
+{
+  modifies m;
+  /* ensures newInd(result, m^, m'); */
+}
+
+void eref_free(eref er) map m; 
+{
+  /* requires er \in domain(m^); */
+  modifies m;
+  /* ensures m' = delete(m^, er); */
+}
+
+void eref_assign(eref er, employee e) map m; 
+{
+  /* requires er \in domain(m^); */
+  modifies m;
+  /* ensures m' = assign(m^, er, e); */
+}
+
+employee eref_get(eref er) map m; 
+{
+  /* requires er \in domain(m^); */
+  /* ensures result = m^[er]; */
+}
+
+bool eref_equal(eref er1, eref er2) 
+{
+  /* ensures result = (er1 = er2); */
+}
+
+void eref_initMod(void) map m; 
+{
+  modifies m;
+  /* ensures m' = new; */
+}
diff --git a/test/db3.expect b/test/db3.expect
new file mode 100644
index 0000000..8c4e8fb
--- /dev/null
+++ b/test/db3.expect
@@ -0,0 +1,141 @@
+
+
+Error Type                Reported  Suppressed
+===================       ========  =========
+usedef                       0           1
+exporttype                   0           3
+compdef                      0           1
+modfilesys                   0          25
+formalarray                  0          17
+                          ========  =========
+Total                        0          47
+
+Finished LCLint checking --- no code errors found
+
+eref.c: (in function eref_alloc)
+eref.c:36: Called procedure printf may access global stdout
+eref.c:36: Undocumented modification of *stdout possible from call to printf:
+              printf("Malloc returned null in eref_alloc\n")
+eref.c:36: Return value (type int) ignored: printf("Malloc r...
+eref.c:46: Called procedure printf may access global stdout
+eref.c:46: Undocumented modification of *stdout possible from call to printf:
+              printf("Malloc returned null in eref_alloc\n")
+eref.c:46: Return value (type int) ignored: printf("Malloc r...
+eref.c: (in function eref_initMod)
+eref.c:82: Called procedure printf may access global stdout
+eref.c:82: Undocumented modification of *stdout possible from call to printf:
+              printf("Malloc returned null in eref_initMod\n")
+eref.c:82: Return value (type int) ignored: printf("Malloc r...
+eref.c:90: Called procedure printf may access global stdout
+eref.c:90: Undocumented modification of *stdout possible from call to printf:
+              printf("Malloc returned null in eref_initMod\n")
+eref.c:90: Return value (type int) ignored: printf("Malloc r...
+erc.c: (in function int_toSize)
+erc.c:11: Undocumented use of global stderr
+erc.c:11: Undocumented modification of *stderr possible from call to fprintf:
+             fprintf(stderr, "Error: int_toSize failure: %d", x)
+erc.c:11: Return value (type int) ignored: fprintf(stderr, ...
+erc.c: (in function erc_create)
+erc.c:28: Called procedure printf may access global stdout
+erc.c:28: Undocumented modification of *stdout possible from call to printf:
+             printf("Malloc returned null in erc_create\n")
+erc.c:28: Return value (type int) ignored: printf("Malloc r...
+erc.c: (in function erc_insert)
+erc.c:80: Called procedure printf may access global stdout
+erc.c:80: Undocumented modification of *stdout possible from call to printf:
+             printf("Malloc returned null in erc_insert\n")
+erc.c:80: Return value (type int) ignored: printf("Malloc r...
+erc.c: (in function erc_sprint)
+erc.c:145: Called procedure printf may access global stdout
+erc.c:145: Undocumented modification of *stdout possible from call to printf:
+              printf("Malloc returned null in erc_sprint\n")
+erc.c:145: Return value (type int) ignored: printf("Malloc r...
+dbase.c: (in function db_print)
+dbase.c:307: Return value (type int) ignored: printf("Employee...
+dbase.c:312: Return value (type int) ignored: printf("%s", pri...
+drive.c: (in function main)
+drive.c:31: Called procedure printf may access global stdout
+drive.c:31: Undocumented modification of *stdout possible from call to printf:
+    printf("FormatPos: Wrong number of arguments. Given %d needs 0.\n", argc -
+    1)
+drive.c:31: Return value (type int) ignored: printf("FormatPo...
+drive.c:41: Called procedure printf may access global stdout
+drive.c:41: Undocumented modification of *stdout possible from call to printf:
+               printf("Size should be 0.\n")
+drive.c:41: Return value (type int) ignored: printf("Size sho...
+drive.c:57: Called procedure printf may access global stdout
+drive.c:57: Undocumented modification of *stdout possible from call to printf:
+               printf("Size should be 500.\n")
+drive.c:57: Return value (type int) ignored: printf("Size sho...
+drive.c:73: Called procedure printf may access global stdout
+drive.c:73: Undocumented modification of *stdout possible from call to printf:
+               printf("Size should be 250.\n")
+drive.c:73: Return value (type int) ignored: printf("Size sho...
+drive.c:93: Called procedure printf may access global stdout
+drive.c:93: Undocumented modification of *stdout possible from call to printf:
+               printf("Size should be 350.\n")
+drive.c:93: Return value (type int) ignored: printf("Size sho...
+drive.c:100: Called procedure printf may access global stdout
+drive.c:100: Undocumented modification of *stdout possible from call to printf:
+                printf("Size should be 350.\n")
+drive.c:100: Return value (type int) ignored: printf("Size sho...
+drive.c:103: Called procedure printf may access global stdout
+drive.c:103: Undocumented modification of *stdout possible from call to printf:
+                printf("Print two different employees:\n")
+drive.c:103: Return value (type int) ignored: printf("Print tw...
+drive.c:109: Called procedure printf may access global stdout
+drive.c:109: Undocumented modification of *stdout possible from call to printf:
+                printf("%s\n", &(na[0]))
+drive.c:109: Return value (type int) ignored: printf("%s\n", &...
+drive.c:151: Called procedure printf may access global stdout
+drive.c:151: Undocumented modification of *stdout possible from call to printf:
+    printf("Should print true: %s\n", bool_unparse(status == DBS_DUPLERR))
+drive.c:151: Return value (type int) ignored: printf("Should p...
+drive.c:154: Called procedure printf may access global stdout
+drive.c:154: Undocumented modification of *stdout possible from call to printf:
+                printf("Employees 0 - 19\n")
+drive.c:154: Return value (type int) ignored: printf("Employee...
+drive.c:155: Called procedure db_print may access global stdout
+drive.c:155: Undocumented modification of *stdout possible from call to
+                db_print: db_print()
+drive.c:158: Called procedure printf may access global stdout
+drive.c:158: Undocumented modification of *stdout possible from call to printf:
+                printf("Employees 0 - 16, 18 - 19\n")
+drive.c:158: Return value (type int) ignored: printf("Employee...
+drive.c:159: Called procedure db_print may access global stdout
+drive.c:159: Undocumented modification of *stdout possible from call to
+                db_print: db_print()
+drive.c:164: Called procedure printf may access global stdout
+drive.c:164: Undocumented modification of *stdout possible from call to printf:
+                printf("Should get two females: %d\n%s\n", i, sprintResult)
+drive.c:164: Return value (type int) ignored: printf("Should g...
+drive.c:174: Called procedure printf may access global stdout
+drive.c:174: Undocumented modification of *stdout possible from call to printf:
+    printf("Should get two females and ten males: %d\n%s\n", i, sprintResult)
+drive.c:174: Return value (type int) ignored: printf("Should g...
+drive.c:180: Called procedure printf may access global stdout
+drive.c:180: Undocumented modification of *stdout possible from call to printf:
+                printf("Should get two females: %d\n%s\n", i, sprintResult)
+drive.c:180: Return value (type int) ignored: printf("Should g...
+drive.c:184: Called procedure printf may access global stdout
+drive.c:184: Undocumented modification of *stdout possible from call to printf:
+                printf("Should get 18 employees\n")
+drive.c:184: Return value (type int) ignored: printf("Should g...
+drive.c:185: Called procedure db_print may access global stdout
+drive.c:185: Undocumented modification of *stdout possible from call to
+                db_print: db_print()
+
+Error Type                Reported  Suppressed
+===================       ========  =========
+usedef                       0           1
+exporttype                   0           3
+globs                       26           0
+retvalint                   25           0
+compdef                      0           1
+mods                        26           0
+modfilesys                   0          25
+formalarray                  0          17
+                          ========  =========
+Total                       77          47
+
+Finished LCLint checking --- 77 code errors found, as expected
diff --git a/test/db3.out b/test/db3.out
new file mode 100644
index 0000000..8c4e8fb
--- /dev/null
+++ b/test/db3.out
@@ -0,0 +1,141 @@
+
+
+Error Type                Reported  Suppressed
+===================       ========  =========
+usedef                       0           1
+exporttype                   0           3
+compdef                      0           1
+modfilesys                   0          25
+formalarray                  0          17
+                          ========  =========
+Total                        0          47
+
+Finished LCLint checking --- no code errors found
+
+eref.c: (in function eref_alloc)
+eref.c:36: Called procedure printf may access global stdout
+eref.c:36: Undocumented modification of *stdout possible from call to printf:
+              printf("Malloc returned null in eref_alloc\n")
+eref.c:36: Return value (type int) ignored: printf("Malloc r...
+eref.c:46: Called procedure printf may access global stdout
+eref.c:46: Undocumented modification of *stdout possible from call to printf:
+              printf("Malloc returned null in eref_alloc\n")
+eref.c:46: Return value (type int) ignored: printf("Malloc r...
+eref.c: (in function eref_initMod)
+eref.c:82: Called procedure printf may access global stdout
+eref.c:82: Undocumented modification of *stdout possible from call to printf:
+              printf("Malloc returned null in eref_initMod\n")
+eref.c:82: Return value (type int) ignored: printf("Malloc r...
+eref.c:90: Called procedure printf may access global stdout
+eref.c:90: Undocumented modification of *stdout possible from call to printf:
+              printf("Malloc returned null in eref_initMod\n")
+eref.c:90: Return value (type int) ignored: printf("Malloc r...
+erc.c: (in function int_toSize)
+erc.c:11: Undocumented use of global stderr
+erc.c:11: Undocumented modification of *stderr possible from call to fprintf:
+             fprintf(stderr, "Error: int_toSize failure: %d", x)
+erc.c:11: Return value (type int) ignored: fprintf(stderr, ...
+erc.c: (in function erc_create)
+erc.c:28: Called procedure printf may access global stdout
+erc.c:28: Undocumented modification of *stdout possible from call to printf:
+             printf("Malloc returned null in erc_create\n")
+erc.c:28: Return value (type int) ignored: printf("Malloc r...
+erc.c: (in function erc_insert)
+erc.c:80: Called procedure printf may access global stdout
+erc.c:80: Undocumented modification of *stdout possible from call to printf:
+             printf("Malloc returned null in erc_insert\n")
+erc.c:80: Return value (type int) ignored: printf("Malloc r...
+erc.c: (in function erc_sprint)
+erc.c:145: Called procedure printf may access global stdout
+erc.c:145: Undocumented modification of *stdout possible from call to printf:
+              printf("Malloc returned null in erc_sprint\n")
+erc.c:145: Return value (type int) ignored: printf("Malloc r...
+dbase.c: (in function db_print)
+dbase.c:307: Return value (type int) ignored: printf("Employee...
+dbase.c:312: Return value (type int) ignored: printf("%s", pri...
+drive.c: (in function main)
+drive.c:31: Called procedure printf may access global stdout
+drive.c:31: Undocumented modification of *stdout possible from call to printf:
+    printf("FormatPos: Wrong number of arguments. Given %d needs 0.\n", argc -
+    1)
+drive.c:31: Return value (type int) ignored: printf("FormatPo...
+drive.c:41: Called procedure printf may access global stdout
+drive.c:41: Undocumented modification of *stdout possible from call to printf:
+               printf("Size should be 0.\n")
+drive.c:41: Return value (type int) ignored: printf("Size sho...
+drive.c:57: Called procedure printf may access global stdout
+drive.c:57: Undocumented modification of *stdout possible from call to printf:
+               printf("Size should be 500.\n")
+drive.c:57: Return value (type int) ignored: printf("Size sho...
+drive.c:73: Called procedure printf may access global stdout
+drive.c:73: Undocumented modification of *stdout possible from call to printf:
+               printf("Size should be 250.\n")
+drive.c:73: Return value (type int) ignored: printf("Size sho...
+drive.c:93: Called procedure printf may access global stdout
+drive.c:93: Undocumented modification of *stdout possible from call to printf:
+               printf("Size should be 350.\n")
+drive.c:93: Return value (type int) ignored: printf("Size sho...
+drive.c:100: Called procedure printf may access global stdout
+drive.c:100: Undocumented modification of *stdout possible from call to printf:
+                printf("Size should be 350.\n")
+drive.c:100: Return value (type int) ignored: printf("Size sho...
+drive.c:103: Called procedure printf may access global stdout
+drive.c:103: Undocumented modification of *stdout possible from call to printf:
+                printf("Print two different employees:\n")
+drive.c:103: Return value (type int) ignored: printf("Print tw...
+drive.c:109: Called procedure printf may access global stdout
+drive.c:109: Undocumented modification of *stdout possible from call to printf:
+                printf("%s\n", &(na[0]))
+drive.c:109: Return value (type int) ignored: printf("%s\n", &...
+drive.c:151: Called procedure printf may access global stdout
+drive.c:151: Undocumented modification of *stdout possible from call to printf:
+    printf("Should print true: %s\n", bool_unparse(status == DBS_DUPLERR))
+drive.c:151: Return value (type int) ignored: printf("Should p...
+drive.c:154: Called procedure printf may access global stdout
+drive.c:154: Undocumented modification of *stdout possible from call to printf:
+                printf("Employees 0 - 19\n")
+drive.c:154: Return value (type int) ignored: printf("Employee...
+drive.c:155: Called procedure db_print may access global stdout
+drive.c:155: Undocumented modification of *stdout possible from call to
+                db_print: db_print()
+drive.c:158: Called procedure printf may access global stdout
+drive.c:158: Undocumented modification of *stdout possible from call to printf:
+                printf("Employees 0 - 16, 18 - 19\n")
+drive.c:158: Return value (type int) ignored: printf("Employee...
+drive.c:159: Called procedure db_print may access global stdout
+drive.c:159: Undocumented modification of *stdout possible from call to
+                db_print: db_print()
+drive.c:164: Called procedure printf may access global stdout
+drive.c:164: Undocumented modification of *stdout possible from call to printf:
+                printf("Should get two females: %d\n%s\n", i, sprintResult)
+drive.c:164: Return value (type int) ignored: printf("Should g...
+drive.c:174: Called procedure printf may access global stdout
+drive.c:174: Undocumented modification of *stdout possible from call to printf:
+    printf("Should get two females and ten males: %d\n%s\n", i, sprintResult)
+drive.c:174: Return value (type int) ignored: printf("Should g...
+drive.c:180: Called procedure printf may access global stdout
+drive.c:180: Undocumented modification of *stdout possible from call to printf:
+                printf("Should get two females: %d\n%s\n", i, sprintResult)
+drive.c:180: Return value (type int) ignored: printf("Should g...
+drive.c:184: Called procedure printf may access global stdout
+drive.c:184: Undocumented modification of *stdout possible from call to printf:
+                printf("Should get 18 employees\n")
+drive.c:184: Return value (type int) ignored: printf("Should g...
+drive.c:185: Called procedure db_print may access global stdout
+drive.c:185: Undocumented modification of *stdout possible from call to
+                db_print: db_print()
+
+Error Type                Reported  Suppressed
+===================       ========  =========
+usedef                       0           1
+exporttype                   0           3
+globs                       26           0
+retvalint                   25           0
+compdef                      0           1
+mods                        26           0
+modfilesys                   0          25
+formalarray                  0          17
+                          ========  =========
+Total                       77          47
+
+Finished LCLint checking --- 77 code errors found, as expected
diff --git a/test/db3/.lclintrc b/test/db3/.lclintrc
new file mode 100644
index 0000000..389d73c
--- /dev/null
+++ b/test/db3/.lclintrc
@@ -0,0 +1,6 @@
+-allimponly
++allmacros
++czech +distinctexternalnames -externalnamelength 14 
++distinctinternalnames +internalnamelookalike 
+-uncheckedmacroprefix ^~* 
+-enumprefix ^^~*
diff --git a/test/db3/Makefile b/test/db3/Makefile
new file mode 100644
index 0000000..52c8498
--- /dev/null
+++ b/test/db3/Makefile
@@ -0,0 +1,80 @@
+###
+### LCLint db3 test
+###
+### Taken from sample, thirteenth iteration: strictlib
+###
+
+.SUFFIXES: .lcl .lcs .lh .h .c .o
+.PHONY: check
+
+SHELL = /bin/csh -f
+
+LCLINT = lclint
+LCLINTF = $(LCLINT) -f ./.lclintrc
+LCL = $(LCLINTF) -specundef +lh +quiet -nof
+LCLINTLH = $(LCLINTF) +lh 
+LCSFILES = dbase.lcs employee.lcs empset.lcs erc.lcs eref.lcs ereftab.lcs bool.lcs check.lcs
+MODULES = employee eref empset ereftab erc dbase drive.c bool.lcl check.lcl
+OBJS = dbase.o employee.o empset.o erc.o eref.o ereftab.o 
+
+test: 
+	$(MAKE) -e clean
+	$(MAKE) -e check
+
+### Note there is a .lclint file used for checking!
+
+check: $(LCSFILES)
+	$(LCLINTF) -showcol $(MODULES) +strict -modfilesystem +showsummary -exportconstant -exportlocal 
+	$(LCLINTF) -showcol $(MODULES) +strict -modfilesystem +showsummary -exportconstant -exportlocal +strictlib -expect 77
+
+
+### The following rules generate .lh and .lcs files from .lcl files.  They also
+### ensure that .h files appear to be updated whenever the corresponding .lh
+### file is updated.
+
+.lcl.lh:
+	$(LCL) $*.lcl
+
+.lcl.lcs:
+	$(LCL) $*.lcl
+
+.lh.h:
+	touch $*.h
+
+.c.o:
+	$(GCC) -c $*.c 
+
+###
+### Clean removes junk and all derived files.
+### Tidy removes junk and object and executable files.
+###
+
+clean: tidy
+	-@rm -f *.c.html *.lcl.html *.h.html *.lh.html *.lcs *.lh >& /dev/null
+
+tidy:
+	-@rm -f ,* .,* *.CKP *.BAK .emacs_[0-9]* core a.out *.*~ *~ *.o drive >& /dev/null
+
+### The following dependencies ensure that imported LCL specs 
+### are checked before the specs that import them.
+
+dbase.lcs:   employee.lcs empset.lcs 
+empset.lcs:  employee.lcs
+erc.lcs:     eref.lcs
+eref.lcl:    employee.lcs
+ereftab.lcs: employee.lcs eref.lcs
+
+### The following dependencies ensure that a .o file is recompiled when the
+### corresponding .c file, or one of the .h files it #includes, is changed.
+
+dbase.o:    dbase.c bool.h dbase.h employee.h empset.h
+drive.o:    drive.c bool.h dbase.h employee.h empset.h erc.h eref.h ereftab.h 
+employee.o: employee.c employee.h 
+empset.o:   empset.c bool.h empset.h erc.h eref.h employee.h employee.h 
+erc.o:      erc.c bool.h erc.h eref.h employee.h 
+eref.o:     eref.c eref.h employee.h 
+ereftab.o:  ereftab.c bool.h ereftab.h erc.h eref.h employee.h 
+
+
+
+
diff --git a/test/db3/README b/test/db3/README
new file mode 100644
index 0000000..54536b8
--- /dev/null
+++ b/test/db3/README
@@ -0,0 +1,18 @@
+     This directory contains the specifications and source code for the
+database example in Chapter 5 of ``Larch: Languages and Tools for Formal
+Specifications.''  Most of the files in this directory were used to typeset the
+figures in Chapter 5.  As a result, they do not adhere to our usual standards
+for specifications and code: they lack comments (because they are described in
+Chapter 5) and their layout is constrained by the horizontal and vertical space
+limitations of the book.
+
+     This directory also contains a Makefile, which can serve as a model for
+constructing Makefiles that can be used to check the specifications and compile
+the code for other programs.
+
+     This directory also contains two files, stdio.lcl and file.lsl, which are
+not shown in Chapter 5.  These files are the bare beginnings of an approach to
+specifying the semantics of the FILE data type in C; they serve little more
+than to enable the LCL Checker to check the specifications for db_print in
+dbase.lcl.
+
diff --git a/test/db3/bool.h b/test/db3/bool.h
new file mode 100644
index 0000000..e1134d6
--- /dev/null
+++ b/test/db3/bool.h
@@ -0,0 +1,40 @@
+#ifndef BOOL_H
+#define BOOL_H
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE (!FALSE)
+#endif
+/*@-cppnames@*/
+typedef int bool;
+/*@=cppnames@*/
+/*
+** bool_initMod has no real effect
+** Declared with modifies internalState, so no noeffect errors are 
+** reported when it is called.)
+*/
+
+extern /*@unused@*/ void bool_initMod (void)
+  /*@globals internalState@*/ /*@modifies internalState@*/ ;
+/*@-mustmod@*/
+# define bool_initMod() do { ; } while (FALSE)
+/*@=mustmod@*/
+
+extern /*@unused@*/ /*@observer@*/ char *bool_unparse (bool) /*@*/ ;
+# define bool_unparse(b) ((b) ? "true" : "false" )
+
+extern /*@unused@*/ bool bool_not (bool) /*@*/ ;
+# define bool_not(b) ((b) ? FALSE : TRUE)
+
+extern /*@unused@*/ bool bool_equal (bool, bool) /*@*/ ;
+# define bool_equal(a,b) ((a) ? (b) : !(b))
+
+/*@noaccess bool@*/
+extern /*@falseexit@*/ void check (bool);
+# define check(x) \
+  do { bool m_res = x; assert (m_res); } while (FALSE)
+
+# endif
diff --git a/test/db3/bool.lcl b/test/db3/bool.lcl
new file mode 100644
index 0000000..667508e
--- /dev/null
+++ b/test/db3/bool.lcl
@@ -0,0 +1,9 @@
+immutable type bool;
+
+constant bool TRUE;
+constant bool FALSE;
+
+void bool_initMod (void) internalState; { modifies internalState; }
+observer char *bool_unparse (bool b) { modifies nothing; } 
+bool bool_not (bool b) { modifies nothing; }
+bool bool_equal (bool b1, bool b2) { modifies nothing; }
diff --git a/test/db3/bool.lcs b/test/db3/bool.lcs
new file mode 100644
index 0000000..4406ae4
--- /dev/null
+++ b/test/db3/bool.lcs
@@ -0,0 +1,393 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort GENDER_UNKNOWN enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort JOB_UNKNOWN enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLsort ereftab immutable nil nil
+%LCLsort _ereftab_Obj mutable ereftab nil
+%LCLsort erc immutable nil nil
+%LCLsort _erc_Obj mutable erc nil
+%LCLsort _sdbase1s_Struct str sdbase1s nil
+%LCLsort h strMem _int_Obj nil
+%LCLsort l strMem _int_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort g strMem __eemployee0e_Enum_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sdbase1s_Struct_Tuple tup _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Ptr ptr _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Arr arr _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Tuple_Vec vec _sdbase1s_Struct_Tuple __sdbase1s_Struct_Arr
+%LCLsort _db_q synonym _sdbase1s_Struct nil
+%LCLsort _edbase2e_Enum enum edbase2e nil
+%LCLsort DBS_MISSERR enumMem nil nil
+%LCLsort DBS_DUPLERR enumMem nil nil
+%LCLsort DBS_JOBERR enumMem nil nil
+%LCLsort DBS_GENDERERR enumMem nil nil
+%LCLsort DBS_SALERR enumMem nil nil
+%LCLsort DBS_OK enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _db_status synonym _edbase2e_Enum nil
+%LCLsort db immutable nil nil
+%LCLsort _db_Obj obj db nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop GENDER_UNKNOWN : -> _eemployee0e_Enum
+%LCLop DBS_OK : -> _edbase2e_Enum
+%LCLtag eemployee0e enum
+%LCLop DBS_SALERR : -> _edbase2e_Enum
+%LCLop DBS_GENDERERR : -> _edbase2e_Enum
+%LCLop DBS_JOBERR : -> _edbase2e_Enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop DBS_DUPLERR : -> _edbase2e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop DBS_MISSERR : -> _edbase2e_Enum
+%LCLop JOB_UNKNOWN : -> _eemployee1e_Enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ [] :__sdbase1s_Struct_Ptr -> __sdbase1s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ [__] :__sdbase1s_Struct_Tuple_Vec, int -> _sdbase1s_Struct_Tuple
+%LCLop __ [__] :__sdbase1s_Struct_Arr, int -> _sdbase1s_Struct
+%LCLop [__, __, __, __] :int, int, _eemployee1e_Enum, _eemployee0e_Enum -> _sdbase1s_Struct_Tuple
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \select g :_sdbase1s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select g :_sdbase1s_Struct -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select l :_sdbase1s_Struct_Tuple -> int
+%LCLop __ \select l :_sdbase1s_Struct -> _int_Obj
+%LCLop __ \field_arrow g :__sdbase1s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \select h :_sdbase1s_Struct_Tuple -> int
+%LCLop __ \select h :_sdbase1s_Struct -> _int_Obj
+%LCLop __ \field_arrow l :__sdbase1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \field_arrow h :__sdbase1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop NIL : -> __sdbase1s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \select j :_sdbase1s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_sdbase1s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow j :__sdbase1s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :__sdbase1s_Struct_Ptr, int -> __sdbase1s_Struct_Ptr
+%LCLop __ + __  :int, __sdbase1s_Struct_Ptr -> __sdbase1s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop __ - __  :__sdbase1s_Struct_Ptr, int -> __sdbase1s_Struct_Ptr
+%LCLop __ - __  :__sdbase1s_Struct_Ptr, __sdbase1s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop sizeof :ereftab -> int
+%LCLop sizeof :erc -> int
+%LCLop sizeof :_edbase2e_Enum -> int
+%LCLop sizeof :db -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop isSub :__sdbase1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sdbase1s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLconst TRUE bool
+%LCLconst FALSE bool
+%LCLfcn bool_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLfcn bool_unparse : bool -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn bool_not : bool -> bool 
+%LCLfcnGlobals 
+%LCLfcn bool_equal : bool, bool -> bool 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db3/bool.lh b/test/db3/bool.lh
new file mode 100644
index 0000000..be96ac9
--- /dev/null
+++ b/test/db3/bool.lh
@@ -0,0 +1,8 @@
+/* Output from LCLint 2.5m */
+# include "bool.h"
+
+
+extern void bool_initMod (void);
+extern /*@observer@*/ char *bool_unparse (bool  /* b */);
+extern bool bool_not (bool  /* b */);
+extern bool bool_equal (bool  /* b1 */, bool  /* b2 */);
diff --git a/test/db3/check.lcl b/test/db3/check.lcl
new file mode 100644
index 0000000..ac1d2da
--- /dev/null
+++ b/test/db3/check.lcl
@@ -0,0 +1,3 @@
+imports bool;
+
+falseexit void check (bool x) { modifies nothing; }
diff --git a/test/db3/check.lcs b/test/db3/check.lcs
new file mode 100644
index 0000000..55c4294
--- /dev/null
+++ b/test/db3/check.lcs
@@ -0,0 +1,401 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort MALE enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort GENDER_UNKNOWN enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort MGR enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort JOB_UNKNOWN enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLsort ereftab immutable nil nil
+%LCLsort _ereftab_Obj mutable ereftab nil
+%LCLsort erc immutable nil nil
+%LCLsort _erc_Obj mutable erc nil
+%LCLsort _sdbase1s_Struct str sdbase1s nil
+%LCLsort g strMem __eemployee0e_Enum_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort l strMem _int_Obj nil
+%LCLsort h strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sdbase1s_Struct_Tuple tup _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Ptr ptr _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Arr arr _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Tuple_Vec vec _sdbase1s_Struct_Tuple __sdbase1s_Struct_Arr
+%LCLsort _db_q synonym _sdbase1s_Struct nil
+%LCLsort _edbase2e_Enum enum edbase2e nil
+%LCLsort DBS_OK enumMem nil nil
+%LCLsort DBS_SALERR enumMem nil nil
+%LCLsort DBS_GENDERERR enumMem nil nil
+%LCLsort DBS_JOBERR enumMem nil nil
+%LCLsort DBS_DUPLERR enumMem nil nil
+%LCLsort DBS_MISSERR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _db_status synonym _edbase2e_Enum nil
+%LCLsort db immutable nil nil
+%LCLsort _db_Obj obj db nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLtag sdbase1s struct
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop GENDER_UNKNOWN : -> _eemployee0e_Enum
+%LCLop DBS_OK : -> _edbase2e_Enum
+%LCLtag eemployee0e enum
+%LCLop DBS_SALERR : -> _edbase2e_Enum
+%LCLop DBS_GENDERERR : -> _edbase2e_Enum
+%LCLop DBS_JOBERR : -> _edbase2e_Enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop DBS_DUPLERR : -> _edbase2e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop DBS_MISSERR : -> _edbase2e_Enum
+%LCLop JOB_UNKNOWN : -> _eemployee1e_Enum
+%LCLtag edbase2e enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ [] :__sdbase1s_Struct_Ptr -> __sdbase1s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ [__] :__sdbase1s_Struct_Tuple_Vec, int -> _sdbase1s_Struct_Tuple
+%LCLop __ [__] :__sdbase1s_Struct_Arr, int -> _sdbase1s_Struct
+%LCLop [__, __, __, __] :int, int, _eemployee1e_Enum, _eemployee0e_Enum -> _sdbase1s_Struct_Tuple
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \select g :_sdbase1s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select g :_sdbase1s_Struct -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select l :_sdbase1s_Struct_Tuple -> int
+%LCLop __ \select l :_sdbase1s_Struct -> _int_Obj
+%LCLop __ \field_arrow g :__sdbase1s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \select h :_sdbase1s_Struct_Tuple -> int
+%LCLop __ \select h :_sdbase1s_Struct -> _int_Obj
+%LCLop __ \field_arrow l :__sdbase1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \field_arrow h :__sdbase1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop NIL : -> __sdbase1s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \select j :_sdbase1s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_sdbase1s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow j :__sdbase1s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :__sdbase1s_Struct_Ptr, int -> __sdbase1s_Struct_Ptr
+%LCLop __ + __  :int, __sdbase1s_Struct_Ptr -> __sdbase1s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop __ - __  :__sdbase1s_Struct_Ptr, int -> __sdbase1s_Struct_Ptr
+%LCLop __ - __  :__sdbase1s_Struct_Ptr, __sdbase1s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop sizeof :ereftab -> int
+%LCLop sizeof :erc -> int
+%LCLop sizeof :_edbase2e_Enum -> int
+%LCLop sizeof :db -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop isSub :__sdbase1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sdbase1s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLconst TRUE bool
+%LCLconst FALSE bool
+%LCLfcn bool_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLfcn bool_unparse : bool -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn bool_not : bool -> bool 
+%LCLfcnGlobals 
+%LCLfcn bool_equal : bool, bool -> bool 
+%LCLfcnGlobals 
+%LCLfcn check : bool -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db3/check.lh b/test/db3/check.lh
new file mode 100644
index 0000000..816e5ae
--- /dev/null
+++ b/test/db3/check.lh
@@ -0,0 +1,6 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "bool.h"
+
+extern /*@falseexit@*/ void check (bool  /* x */);
diff --git a/test/db3/dbase.c b/test/db3/dbase.c
new file mode 100644
index 0000000..fba3146
--- /dev/null
+++ b/test/db3/dbase.c
@@ -0,0 +1,315 @@
+# include 
+# include "dbase.h"
+
+typedef enum
+{
+  KND_MMGRS, KND_FMGRS, KND_MNON, KND_FNON
+} employeeKinds;
+
+/*@constant static employeeKinds firstERC;@*/
+# define firstERC KND_MMGRS
+
+/*@constant static employeeKinds lastERC;@*/
+# define lastERC KND_FNON
+
+/*@constant static int numERCS;@*/
+# define numERCS (/*@+enumint@*/ (lastERC - firstERC + 1) /*@=enumint@*/)
+
+typedef /*@only@*/ erc o_erc;
+static o_erc db[numERCS];
+
+/*@iter employeeKinds_all (yield employeeKinds ek); @*/
+# define employeeKinds_all(m_ek) \
+  { employeeKinds m_ek; for (m_ek = firstERC; m_ek <= lastERC; m_ek++) {
+
+# define end_employeeKinds_all }}
+
+static bool initDone = FALSE;
+
+void db_initMod (void)
+  /*@globals initDone, undef db, internalState@*/
+  /*@modifies initDone, db, internalState@*/
+{
+  if (initDone)
+    {
+      return;
+    }
+  
+  bool_initMod ();
+  employee_initMod ();
+  eref_initMod ();
+  erc_initMod ();
+  empset_initMod ();
+  
+  employeeKinds_all (ek)
+    {
+      db[(int)ek] = erc_create ();
+    } end_employeeKinds_all ;
+  
+  initDone = TRUE;
+}
+
+static eref db_ercKeyGet(erc c, int key)  /*@*/
+{
+  erc_elements(c, er)
+    {
+      if (eref_get(er).ssNum == key) 
+	{
+	  return (er);
+	}
+    } end_erc_elements ;
+
+  return eref_undefined;
+}
+
+static eref db_keyGet (int key) /*@globals db@*/
+{
+  eref er;
+  
+  employeeKinds_all (ek)
+    {
+      er = db_ercKeyGet (db[(int) ek], key);
+
+      if (eref_isDefined (er))
+	{
+	  return er;
+	}
+    } end_employeeKinds_all ;
+  
+  return eref_undefined;
+}
+
+static int db_addEmpls (erc c, int l, int h, empset s)
+  /*@globals internalState@*/
+  /*@modifies s, internalState@*/
+{
+  employee e;
+  int numAdded;
+  numAdded = 0;
+  
+  erc_elements (c, er) 
+    {
+      e = eref_get(er);
+      if ((e.salary >= l) && (e.salary <= h)) 
+	{
+	  empset_insert(s, e);
+	  numAdded++;
+	}
+    } end_erc_elements ;
+
+  return numAdded;
+}
+
+db_status db_hire (employee e) /*@globals db@*/
+{
+  if (e.gen == GENDER_UNKNOWN)
+    {
+      return DBS_GENDERERR;
+    }
+
+  if (e.j == JOB_UNKNOWN)
+    {
+      return DBS_JOBERR;
+    }
+
+  if (e.salary < 0)
+    {
+      return DBS_SALERR;
+    }
+
+  if (eref_isDefined (db_keyGet (e.ssNum)))
+    {
+      return DBS_DUPLERR;
+    }
+
+  db_uncheckedHire (e);
+  return DBS_OK;
+}
+
+void db_uncheckedHire (employee e)
+   /*@globals db@*/ /*@modifies db@*/
+{
+  eref er;
+  
+  er = eref_alloc ();
+  eref_assign (er, e);
+  
+  if (e.gen == MALE)
+    {
+      if (e.j == MGR)
+	{
+	  erc_insert (db[(int) KND_MMGRS], er);
+	}
+      else
+	{
+	  erc_insert (db[(int) KND_MNON], er);
+	}
+    }
+  else
+    {
+      if (e.j == MGR)
+	{
+	  erc_insert (db[(int) KND_FMGRS], er);
+	}
+      else
+	{
+	  erc_insert (db[(int) KND_FNON], er);
+	}
+    }
+}
+
+bool db_fire (int ssNum)
+  /*@globals db@*/ /*@modifies db@*/
+{
+  employeeKinds_all (ek)
+    {
+      erc_elements (db[(int) ek], er)
+	{
+	  if (eref_get(er).ssNum == ssNum) 
+	    {
+	      erc_delete (db[(int) ek], er);
+	      return TRUE;
+	    } 
+	} end_erc_elements ;
+    } end_employeeKinds_all ;
+  
+  return FALSE;
+}
+
+bool db_promote (int ssNum)
+  /*@globals db@*/ /*@modifies db@*/
+{
+  eref er;
+  employee e;
+  gender g;
+  
+  g = MALE;
+  er = db_ercKeyGet (db[(int) KND_MNON], ssNum);
+  
+  if (!eref_isDefined (er))
+    {
+      er = db_ercKeyGet (db[(int) KND_FNON], ssNum);
+
+      if (!eref_isDefined (er))
+	{
+	  return FALSE;
+	}
+
+      g = FEMALE;
+    }
+  
+  e = eref_get (er);
+  e.j = MGR;
+  eref_assign (er, e);
+  
+  if (g == MALE)
+    {
+      erc_delete (db[(int) KND_MNON], er);
+      erc_insert (db[(int) KND_MMGRS], er);
+    } 
+  else
+    {
+      erc_delete (db[(int) KND_FNON], er);
+      erc_insert (db[(int) KND_FMGRS], er);
+    }
+  
+  return TRUE;
+}
+
+db_status db_setSalary (int ssNum, int sal) /*@globals db@*/
+{
+  eref er;
+  employee e;
+  
+  if (sal < 0)
+    {
+      return DBS_SALERR;
+    }
+
+  er = db_keyGet (ssNum);
+
+  if (!eref_isDefined (er))
+    {
+      return DBS_MISSERR;
+    }
+
+  e = eref_get (er);
+  e.salary = sal;
+  eref_assign (er, e);
+
+  return DBS_OK;
+}
+
+int db_query (db_q q, empset s)
+  /*@globals db@*/
+{
+  int numAdded;
+  int l, h;
+
+  l = q.l;
+  h = q.h;
+
+  switch (q.g)
+    {
+    case GENDER_UNKNOWN:
+      switch (q.j)
+	{
+	case JOB_UNKNOWN:
+	  numAdded = 0;
+
+	  employeeKinds_all (ek)
+	    {
+	      numAdded += db_addEmpls (db[(int) ek], l, h, s);
+	    } end_employeeKinds_all
+
+	  return numAdded;
+	case MGR:
+	  numAdded = db_addEmpls (db[(int) KND_MMGRS], l, h, s);
+	  numAdded += db_addEmpls (db[(int) KND_FMGRS], l, h, s);
+	  return numAdded;
+	case NONMGR:
+	  numAdded = db_addEmpls (db[(int) KND_MNON], l, h, s);
+	  numAdded += db_addEmpls (db[(int) KND_FNON], l, h, s);
+	  return numAdded;
+	}
+    case MALE:
+      switch (q.j)
+	{
+	case JOB_UNKNOWN:
+	  numAdded = db_addEmpls (db[(int) KND_MMGRS], l, h, s);
+	  numAdded += db_addEmpls (db[(int) KND_MNON], l, h, s);
+	  return numAdded;
+	case MGR:
+	  return db_addEmpls (db[(int) KND_MMGRS], l, h, s);
+	case NONMGR:
+	  return db_addEmpls (db[(int) KND_MNON], l, h, s);
+	}
+    case FEMALE:
+      switch (q.j)
+	{
+	case JOB_UNKNOWN:
+	  numAdded = db_addEmpls (db[(int) KND_FMGRS], l, h, s);
+	  numAdded += db_addEmpls (db[(int) KND_FNON], l, h, s);
+	  return numAdded;
+	case MGR:
+	  return db_addEmpls (db[(int) KND_FMGRS], l, h, s);
+	case NONMGR:
+	  return db_addEmpls (db[(int) KND_FNON], l, h, s);
+	}
+    }
+}
+
+void db_print (void)
+  /*@globals db@*/
+{
+  char *printVal;
+  
+  printf ("Employees:\n");
+
+  employeeKinds_all (ek)
+    {
+      printVal = erc_sprint (db[(int) ek]);
+      printf ("%s", printVal);
+      free (printVal);
+    } end_employeeKinds_all ;
+}
diff --git a/test/db3/dbase.h b/test/db3/dbase.h
new file mode 100644
index 0000000..c684fc5
--- /dev/null
+++ b/test/db3/dbase.h
@@ -0,0 +1,9 @@
+# ifndef DBASE_H
+# define DBASE_H
+
+# include "eref.h"
+# include "erc.h"
+
+# include "dbase.lh"
+
+# endif
diff --git a/test/db3/dbase.lcl b/test/db3/dbase.lcl
new file mode 100644
index 0000000..e8d74c5
--- /dev/null
+++ b/test/db3/dbase.lcl
@@ -0,0 +1,97 @@
+imports employee, empset, ;
+
+typedef struct{gender g; job j; int l; int h;} db_q;
+typedef enum { DBS_OK, DBS_SALERR, DBS_GENDERERR, DBS_JOBERR,
+               DBS_DUPLERR, DBS_MISSERR } db_status;
+spec immutable type db;
+spec db d;
+
+claims UniqueKeys (employee e1, employee e2) db d; 
+{	
+ /* ensures
+     (e1 \in d\any /\ e2 \in d\any  /\ e1.ssNum = e2.ssNum)
+       => (e1 = e2);
+ */
+}	
+
+db_status db_hire (employee e) db d; 
+{
+  modifies d;
+  /* ensures
+     (if result = db_OK
+      then d' = hire(e, d^) else d' = d^)
+        /\ result =
+          (if e.gen = gender_ANY then genderERR
+           else if e.j = job_ANY then jobERR
+           else if e.salary < 0 then salERR
+           else if employed(d^, e.ssNum) then duplERR
+           else db_OK);
+  */
+}
+
+void db_uncheckedHire (employee e) db d; 
+{
+  /* requires e.gen \neq gender_ANY /\ e.j \neq job_ANY
+            /\ e.salary >= 0 /\ ~employed(d^, e.ssNum);
+  */
+  modifies d;
+  /* ensures d' = hire(e, d^); */
+}
+
+bool db_fire (int ssNum) db d; internalState;
+{
+  modifies d, internalState;
+  /* ensures result = employed(d^, ssNum)
+       /\ d' = fire(d^, ssNum);
+  */
+}
+
+int db_query (db_q q, empset s) db d; internalState;
+{
+  modifies s, internalState;
+  /* ensures s' = s^ \U query(d^, q)
+       /\ result = size(query(d^, q));
+  */
+}
+
+bool db_promote (int ssNum) db d; 
+{
+  modifies d;
+  /* ensures
+       result = (employed(d^, ssNum)
+                /\ find(d^, ssNum).j = NONMGR)
+          /\ (if result then d' = promote(d^, ssNum)
+              else d' = d^);
+  */
+}
+
+db_status db_setSalary (int ssNum, int sal) db d; 
+{
+  modifies d;
+  /* 
+  ensures
+      result =
+        (if employed(d^, ssNum)
+           then (if sal < 0 then salERR else db_OK)
+           else missERR)
+      /\ (if result = db_OK
+            then d' = setSal(d^, ssNum, sal)
+            else d' = d^);
+  */
+}
+
+void db_print(void) db d; FILE *stdout; 
+{
+  modifies *stdout^;
+  /*
+  ensures 
+    \exists s:ioStream ((*stdout^)' = write((*stdout^)^, s) /\ isSprint(d^, s));
+  */
+}
+
+void db_initMod(void) db d; internalState;
+{
+  modifies d, internalState;
+  /* ensures d' = new; */
+}
+
diff --git a/test/db3/dbase.lcs b/test/db3/dbase.lcs
new file mode 100644
index 0000000..b314ef0
--- /dev/null
+++ b/test/db3/dbase.lcs
@@ -0,0 +1,1048 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort GENDER_UNKNOWN enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort JOB_UNKNOWN enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLsort ereftab immutable nil nil
+%LCLsort _ereftab_Obj mutable ereftab nil
+%LCLsort erc immutable nil nil
+%LCLsort _erc_Obj mutable erc nil
+%LCLsort _sdbase1s_Struct str sdbase1s nil
+%LCLsort h strMem _int_Obj nil
+%LCLsort l strMem _int_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort g strMem __eemployee0e_Enum_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sdbase1s_Struct_Tuple tup _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Ptr ptr _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Arr arr _sdbase1s_Struct nil
+%LCLsort __sdbase1s_Struct_Tuple_Vec vec _sdbase1s_Struct_Tuple __sdbase1s_Struct_Arr
+%LCLsort _db_q synonym _sdbase1s_Struct nil
+%LCLsort _edbase2e_Enum enum edbase2e nil
+%LCLsort DBS_MISSERR enumMem nil nil
+%LCLsort DBS_DUPLERR enumMem nil nil
+%LCLsort DBS_JOBERR enumMem nil nil
+%LCLsort DBS_GENDERERR enumMem nil nil
+%LCLsort DBS_SALERR enumMem nil nil
+%LCLsort DBS_OK enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _db_status synonym _edbase2e_Enum nil
+%LCLsort db immutable nil nil
+%LCLsort _db_Obj obj db nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop GENDER_UNKNOWN : -> _eemployee0e_Enum
+%LCLop DBS_OK : -> _edbase2e_Enum
+%LCLtag eemployee0e enum
+%LCLop DBS_SALERR : -> _edbase2e_Enum
+%LCLop DBS_GENDERERR : -> _edbase2e_Enum
+%LCLop DBS_JOBERR : -> _edbase2e_Enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop DBS_DUPLERR : -> _edbase2e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop DBS_MISSERR : -> _edbase2e_Enum
+%LCLop JOB_UNKNOWN : -> _eemployee1e_Enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ [] :__sdbase1s_Struct_Ptr -> __sdbase1s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ [__] :__sdbase1s_Struct_Tuple_Vec, int -> _sdbase1s_Struct_Tuple
+%LCLop __ [__] :__sdbase1s_Struct_Arr, int -> _sdbase1s_Struct
+%LCLop [__, __, __, __] :int, int, _eemployee1e_Enum, _eemployee0e_Enum -> _sdbase1s_Struct_Tuple
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \select g :_sdbase1s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select g :_sdbase1s_Struct -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select l :_sdbase1s_Struct_Tuple -> int
+%LCLop __ \select l :_sdbase1s_Struct -> _int_Obj
+%LCLop __ \field_arrow g :__sdbase1s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \select h :_sdbase1s_Struct_Tuple -> int
+%LCLop __ \select h :_sdbase1s_Struct -> _int_Obj
+%LCLop __ \field_arrow l :__sdbase1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \field_arrow h :__sdbase1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop NIL : -> __sdbase1s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \select j :_sdbase1s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_sdbase1s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow j :__sdbase1s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :__sdbase1s_Struct_Ptr, int -> __sdbase1s_Struct_Ptr
+%LCLop __ + __  :int, __sdbase1s_Struct_Ptr -> __sdbase1s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop __ - __  :__sdbase1s_Struct_Ptr, int -> __sdbase1s_Struct_Ptr
+%LCLop __ - __  :__sdbase1s_Struct_Ptr, __sdbase1s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop sizeof :ereftab -> int
+%LCLop sizeof :erc -> int
+%LCLop sizeof :_edbase2e_Enum -> int
+%LCLop sizeof :db -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop isSub :__sdbase1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sdbase1s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst GENDER_UNKNOWN _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst JOB_UNKNOWN _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst GENDER_UNKNOWN _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst JOB_UNKNOWN _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype empset _empset_Obj mutable
+%LCLfcn empset_create :  -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_final : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_clear : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_insert : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_insertUnique : _empset_Obj, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_delete : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_union : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_disjointUnion : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_intersect : _empset_Obj, _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_size : _empset_Obj -> int 
+%LCLfcnGlobals 
+%LCLfcn empset_member : _semployee0s_Struct_Tuple, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_subset : _empset_Obj, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_choose : _empset_Obj -> _semployee0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn empset_sprint : _empset_Obj -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn empset_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype db_q _db_q exposed
+%LCLenumConst DBS_OK _edbase2e_Enum
+%LCLenumConst DBS_SALERR _edbase2e_Enum
+%LCLenumConst DBS_GENDERERR _edbase2e_Enum
+%LCLenumConst DBS_JOBERR _edbase2e_Enum
+%LCLenumConst DBS_DUPLERR _edbase2e_Enum
+%LCLenumConst DBS_MISSERR _edbase2e_Enum
+%LCLtype db_status _db_status exposed
+%LCLtype db db immutable
+%LCLvar d _db_Obj
+%LCLfcn db_hire : _semployee0s_Struct_Tuple -> _edbase2e_Enum 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn db_uncheckedHire : _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn db_fire : int -> bool 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn db_query : _sdbase1s_Struct_Tuple, _empset_Obj -> int 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn db_promote : int -> bool 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn db_setSalary : int, int -> _edbase2e_Enum 
+%LCLfcnGlobals _db_Obj d; 
+%LCLfcn db_print :  -> void 
+%LCLfcnGlobals _db_Obj d; ___FILE_Obj_Ptr_Obj stdout; 
+%LCLfcn db_initMod :  -> void 
+%LCLfcnGlobals _db_Obj d; 
+%LCLSymbolTableEnd
diff --git a/test/db3/dbase.lh b/test/db3/dbase.lh
new file mode 100644
index 0000000..5422e65
--- /dev/null
+++ b/test/db3/dbase.lh
@@ -0,0 +1,30 @@
+/* Output from LCLint 2.5m */
+
+# include 
+# include "bool.h"
+# include "employee.h"
+# include "empset.h"
+
+
+# ifndef EXPOSED_TYPE_db_q
+typedef struct {
+    gender g;
+    job j;
+    int l;
+    int h;
+    } db_q;
+# endif
+
+
+# ifndef EXPOSED_TYPE_db_status
+typedef enum {DBS_OK, DBS_SALERR, DBS_GENDERERR, DBS_JOBERR, DBS_DUPLERR, DBS_MISSERR} db_status;
+# endif
+
+extern db_status db_hire (employee  /* e */);
+extern void db_uncheckedHire (employee  /* e */);
+extern bool db_fire (int  /* ssNum */);
+extern int db_query (db_q  /* q */, empset  /* s */);
+extern bool db_promote (int  /* ssNum */);
+extern db_status db_setSalary (int  /* ssNum */, int  /* sal */);
+extern void db_print (void);
+extern void db_initMod (void);
diff --git a/test/db3/drive.c b/test/db3/drive.c
new file mode 100644
index 0000000..459c008
--- /dev/null
+++ b/test/db3/drive.c
@@ -0,0 +1,191 @@
+/* Part of a driver used to test dbase  */
+
+/* Include those modules that export things that are used explicitly here */
+ 
+# include 
+# include 
+# include "bool.h"
+# include "employee.h"
+# include "empset.h"
+# include "dbase.h"
+
+int main (int argc, /*@unused@*/ char *argv[]) 
+  /*@globals internalState@*/ /*@modifies internalState@*/
+{
+  employee e;
+  empset em1, em2, em3;
+  char na[10000];
+  char * sprintResult;
+  int i;
+  db_status status;
+  db_q q;
+  
+  /* Initialize all of the LCL-specified modules that were included */
+  bool_initMod();
+  employee_initMod();
+  empset_initMod();
+  db_initMod();
+  
+  if (argc != 1) 
+    {
+      printf ("FormatPos: Wrong number of arguments. Given %d needs 0.\n",
+	      argc - 1);
+      return 1;
+    }
+  
+  /* Unit test empset */
+  em1 = empset_create();
+
+  if (!(empset_size(em1) == 0))
+    {
+      printf("Size should be 0.\n");
+    }
+
+  for (i = 0; i < 500; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 100000;
+      e.gen = MALE;
+      e.j = MGR;
+      (void) sprintf(na, "S.S. Doe %d", i);
+      check (employee_setName(&e, na));
+      empset_insert(em1, e);
+    }
+
+  if (!(empset_size(em1) == 500)) 
+    {
+      printf("Size should be 500.\n");
+    }
+
+  for (i = 0; i < 250; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 100000;
+      e.gen = MALE;
+      e.j = MGR;
+      (void) sprintf(na, "S.S. Doe %d", i);
+      check (employee_setName(&e, na));
+      empset_delete(em1, e);
+    }
+
+  if (!(empset_size(em1) == 250)) 
+    {
+      printf("Size should be 250.\n");
+    }
+
+  em2 = empset_create();
+
+  for (i = 0; i < 100; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 100000;
+      e.gen = MALE;
+      e.j = MGR;
+      (void) sprintf(na, "S.S. Doe %d", i);
+      check (employee_setName(&e, na));
+      empset_insert(em2, e);
+    }
+
+  em3 = empset_union(em1, em2);
+
+  if (!(empset_size(em3) == 350))
+    {
+      printf("Size should be 350.\n");
+    }
+
+  empset_intersect(em3, em3);
+
+  if (!(empset_size(em3) == 350))
+    {
+      printf("Size should be 350.\n");
+    }
+
+  printf("Print two different employees:\n");
+
+  for (i = 0; i < 2; i++) 
+    {
+      e = empset_choose(em3);
+      employee_sprint(na, e);
+      printf("%s\n", &(na[0]));
+      empset_delete(em3, e);
+    }
+  
+  /* Test dbase  */
+
+  for (i = 0; i < 20; i++) 
+    {
+      e.ssNum = i;
+      e.salary = 10 * i;
+
+      if (i < 10) 
+	{
+	  e.gen = MALE; 
+	}
+      else 
+	{
+	  e.gen = FEMALE;
+	}
+
+      if (i < 15) 
+	{
+	  e.j = NONMGR; 
+	}
+      else
+	{
+	  e.j = MGR;
+	}
+
+      (void) sprintf(na, "J. Doe %d", i);
+      check (employee_setName(&e, na));
+
+      if ((i/2)*2 == i) 
+	{
+	  check (db_hire(e) == DBS_OK); 
+	}
+      else 
+	{
+	  db_uncheckedHire(e); status = db_hire(e);
+	}
+    }
+  
+  printf("Should print true: %s\n", 
+	 bool_unparse (/*@-usedef@*/ status == DBS_DUPLERR /*@=usedef@*/)); 
+
+  printf("Employees 0 - 19\n");
+  db_print();
+  check (db_fire(17));
+  q.g = FEMALE; q.j = JOB_UNKNOWN; q.l = 158; q.h = 185;
+  printf("Employees 0 - 16, 18 - 19\n");
+  db_print();
+
+  empset_final (em1);
+  i = db_query(q, em1 = empset_create());
+  sprintResult = empset_sprint(em1);
+  printf("Should get two females: %d\n%s\n", i, sprintResult);
+  free(sprintResult);
+
+  q.g = MALE; q.j = NONMGR; q.l = 0; q.h = 185;
+  empset_final (em2);
+  i = db_query(q, em2 = empset_create());
+  empset_final (em3);
+  em3 = empset_disjointUnion(em2, em1);
+  sprintResult = empset_sprint(em3);
+  i = empset_size(em3);
+  printf("Should get two females and ten males: %d\n%s\n", i, sprintResult);
+  free(sprintResult);
+  
+  empset_intersect(em1, em3);
+  sprintResult = empset_sprint(em1);
+  i = empset_size(em1);
+  printf("Should get two females: %d\n%s\n", i, sprintResult);
+  free(sprintResult); 
+
+  check (db_fire(empset_choose(em3).ssNum));
+  printf("Should get 18 employees\n");
+  db_print();
+
+  empset_final (em1);
+  empset_final (em2);
+  empset_final (em3);
+  return 0;
+}
diff --git a/test/db3/employee.c b/test/db3/employee.c
new file mode 100644
index 0000000..3055bbb
--- /dev/null
+++ b/test/db3/employee.c
@@ -0,0 +1,40 @@
+# include 
+# include 
+# include "employee.h"
+
+bool employee_setName (employee *e, char na []) 
+{
+  size_t i;
+  
+  for (i = 0; na[i] != '\0'; i++)
+    {
+      if (i == maxEmployeeName) 
+	{
+	  return FALSE;
+	}
+    }
+
+  strcpy (e->name, na);
+  return TRUE;
+}
+
+bool employee_equal (employee * e1, employee * e2) 
+{
+  return ((e1->ssNum == e2->ssNum)
+	  && (e1->salary == e2->salary)
+	  && (e1->gen == e2->gen)
+	  && (e1->j == e2->j)
+	  && (strncmp (e1->name, e2->name, maxEmployeeName) == 0));
+}
+
+typedef /*@observer@*/ char *obscharp;
+
+void employee_sprint (char s[], employee e) 
+{
+  static obscharp gender[] ={ "male", "female", "?" };
+  static obscharp jobs[] = { "manager", "non-manager", "?" };
+  
+  (void) sprintf (s, FORMATEMPLOYEE, e.ssNum, e.name,
+		  gender[(int) e.gen], jobs[(int) e.j], e.salary);
+}
+
diff --git a/test/db3/employee.h b/test/db3/employee.h
new file mode 100644
index 0000000..6489fba
--- /dev/null
+++ b/test/db3/employee.h
@@ -0,0 +1,14 @@
+# ifndef EMPLOYEE_H
+# define EMPLOYEE_H
+
+# define maxEmployeeName ((size_t) 20)
+# define employeePrintSize (63)
+
+/*@notfunction@*/
+# define FORMATEMPLOYEE "%9d  %-20s  %-6s  %-11s  %6d.00"
+
+
+# include "employee.lh"
+
+# define employee_initMod()  bool_initMod()
+# endif
diff --git a/test/db3/employee.lcl b/test/db3/employee.lcl
new file mode 100644
index 0000000..459384b
--- /dev/null
+++ b/test/db3/employee.lcl
@@ -0,0 +1,54 @@
+imports  ;
+
+constant size_t maxEmployeeName;
+constant int employeePrintSize;
+
+typedef enum { MALE, FEMALE, GENDER_UNKNOWN } gender;
+typedef enum { MGR, NONMGR, JOB_UNKNOWN } job;
+
+typedef struct 
+{
+  int ssNum;
+  char name[maxEmployeeName];
+  int salary;
+  gender gen;
+  job j;
+} employee;
+
+void employee_sprint (out char s[], employee e) 
+{
+  /* requires maxIndex(s) >= employeePrintSize; */
+  modifies s;
+  /* ensures isSprint(s', e)
+        /\ lenStr(s') = employeePrintSize;
+  */
+}
+
+bool employee_equal (employee *e1, employee *e2) 
+{
+  /* ensures result = sameStr(e1->name^, e2->name^)
+           /\ (e1->ssNum^ = e2->ssNum^)
+           /\ (e1->salary^ = e2->salary^)
+           /\ (e1->gen^ = e2->gen^)
+           /\ (e1->j^ = e2->j^);
+  */
+}
+
+bool employee_setName (employee *e, unique char na[]) 
+{
+  /* requires nullTerminated(na^); */
+  modifies e->name;
+  /* ensures result = lenStr(na^) < maxEmployeeName
+           /\ (if result
+               then sameStr(e->name', na^)
+                     /\ nullTerminated(e->name')
+               else e->name' = e->name^);
+  */
+}
+
+void employee_initMod(void) internalState;
+{
+  modifies internalState;
+  ensures true;
+}
+
diff --git a/test/db3/employee.lcs b/test/db3/employee.lcs
new file mode 100644
index 0000000..4c23f7d
--- /dev/null
+++ b/test/db3/employee.lcs
@@ -0,0 +1,518 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort GENDER_UNKNOWN enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort JOB_UNKNOWN enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop GENDER_UNKNOWN : -> _eemployee0e_Enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop JOB_UNKNOWN : -> _eemployee1e_Enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst GENDER_UNKNOWN _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst JOB_UNKNOWN _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db3/employee.lh b/test/db3/employee.lh
new file mode 100644
index 0000000..b9d1909
--- /dev/null
+++ b/test/db3/employee.lh
@@ -0,0 +1,30 @@
+/* Output from LCLint 2.5m */
+
+# include 
+# include "bool.h"
+
+
+# ifndef EXPOSED_TYPE_gender
+typedef enum {MALE, FEMALE, GENDER_UNKNOWN} gender;
+# endif
+
+
+# ifndef EXPOSED_TYPE_job
+typedef enum {MGR, NONMGR, JOB_UNKNOWN} job;
+# endif
+
+
+# ifndef EXPOSED_TYPE_employee
+typedef struct {
+    int ssNum;
+    char name[maxEmployeeName];
+    int salary;
+    gender gen;
+    job j;
+    } employee;
+# endif
+
+extern void employee_sprint (/*@out@*/ char  /* s */[], employee  /* e */);
+extern bool employee_equal (employee * /* e1 */, employee * /* e2 */);
+extern bool employee_setName (employee * /* e */, /*@unique@*/ char  /* na */[]);
+extern void employee_initMod (void);
diff --git a/test/db3/empset.c b/test/db3/empset.c
new file mode 100644
index 0000000..4133228
--- /dev/null
+++ b/test/db3/empset.c
@@ -0,0 +1,177 @@
+# include "empset.h"
+
+static bool initDone = FALSE;
+static /*@only@*/ ereftab known;
+
+static eref empset_get (employee e, erc s) /*@*/
+{
+  erc_elements(s, er)
+    {
+      employee e1 = eref_get(er);
+
+      if (employee_equal(&e1, &e))
+	{
+	  return er;
+	}
+    } end_erc_elements ;
+  
+  return eref_undefined;
+}
+
+bool empset_member (employee e, erc s)
+{
+  return (eref_isDefined (empset_get (e, s)));
+}
+
+void empset_clear (empset s) 
+{
+  erc_clear (s);
+}
+
+bool /*@alt void@*/ empset_insert (empset s, employee e) 
+  /*@globals internalState@*/
+  /*@modifies internalState@*/
+{
+  if (eref_isDefined (empset_get (e, s)))
+    {
+      return FALSE;
+    }
+  
+  empset_insertUnique (s, e);
+  return TRUE;
+}
+
+void empset_insertUnique (empset s, employee e) 
+   /*@globals known@*/
+   /*@modifies known@*/
+{
+  eref er;
+
+  er = ereftab_lookup (e, known);
+
+  if (!eref_isDefined (er))
+    {
+      er = eref_alloc ( );
+      eref_assign (er,e);
+      ereftab_insert (known, e, er);
+    }
+  
+  erc_insert (s, er);
+}
+
+bool /*@alt void@*/ empset_delete (empset s, employee e) 
+{
+  eref er;
+
+  er = empset_get (e, s);
+
+  if (!eref_isDefined (er))
+    {
+      return FALSE;
+    }
+
+  return erc_delete (s, er);
+}
+
+empset empset_disjointUnion (empset s1, empset s2) 
+   /*@globals known@*/
+   /*@modifies known@*/
+{
+  erc result;
+  empset tmp;
+  
+  result = erc_create ( );
+
+  if (erc_size (s1) > erc_size (s2)) 
+    {
+      tmp = s1;
+      s1 = s2;
+      s2 = tmp;
+    }
+  
+  erc_join (result, s1);
+
+  empset_elements(s2, emp)
+    {
+      empset_insertUnique(result, emp);
+    } end_empset_elements ;
+
+  return result;
+}
+
+empset empset_union (empset s1, empset s2) 
+{
+  erc result;
+  empset tmp;
+
+  result = erc_create ();
+
+  if (erc_size (s1) > erc_size (s2)) 
+    {
+      tmp = s1;
+      s1 = s2;
+      s2 = tmp;
+    }
+  erc_join (result, s2);
+
+  empset_elements (s1, emp)
+    {
+      if (!empset_member(emp, s2))
+	{
+	  empset_insert(result, emp);
+	}
+    } end_empset_elements ;
+
+  return result;
+}
+
+void empset_intersect (empset s1, empset s2) 
+{
+  erc toDelete = erc_create();
+
+  empset_elements (s2, emp)
+    {
+      if (!empset_member(emp, s2))
+	{
+	  empset_insert(toDelete, emp);
+	}
+    } end_empset_elements ;
+
+  empset_elements (toDelete, emp)
+    {
+      empset_delete(s1, emp);
+    } end_empset_elements;
+
+  erc_final (toDelete);
+}
+
+bool empset_subset (empset s1, empset s2) 
+{
+  empset_elements(s1, emp)
+    {
+      if (!empset_member(emp, s2)) 
+	{
+	  return FALSE;
+	}
+    } end_empset_elements ;
+
+  return TRUE;
+}
+
+void empset_initMod (void) 
+  /*@globals initDone, undef known@*/
+  /*@modifies initDone, known@*/
+{
+  if (initDone) 
+    {
+      /*@-globstate@*/ return; /*@=globstate@*/
+    }
+
+  bool_initMod ();
+  employee_initMod ();
+  eref_initMod ();
+  erc_initMod ();
+  ereftab_initMod ();
+  known = ereftab_create ();
+  initDone = TRUE;
+}
diff --git a/test/db3/empset.h b/test/db3/empset.h
new file mode 100644
index 0000000..73ef6fd
--- /dev/null
+++ b/test/db3/empset.h
@@ -0,0 +1,36 @@
+# ifndef F_EMPSET_H
+# define F_EMPSET_H
+
+# include "eref.h"
+# include "erc.h"
+# include "ereftab.h"
+
+typedef erc empset;
+
+/*
+  Abstraction function, toEmpSet:
+    e \in toEmpSet(s) == 
+      exists er (count(er, s.val) = 1
+        /\ getERef(known, e) = er)
+
+  Rep invariant:
+    forall s: empset
+      (forall er: eref (count(er, s.val) <= 1)
+      /\ s.activeIters = 0
+      /\ forall er: eref (count(er, s.val) = 1
+        => in(known, er)))
+*/
+
+# include "empset.lh"
+
+# define empset_create()  (erc_create())
+# define empset_final(s) (erc_final(s))
+# define empset_size(es) (erc_size(es))
+# define empset_choose(es) (eref_get(erc_choose(es)))
+# define empset_sprint(es) (erc_sprint(es))
+
+#define empset_elements(e, m_x) \
+   erc_elements(e, m_y) { employee m_x = eref_get(m_y);
+#define end_empset_elements        } end_erc_elements
+
+# endif
diff --git a/test/db3/empset.lcl b/test/db3/empset.lcl
new file mode 100644
index 0000000..b47f772
--- /dev/null
+++ b/test/db3/empset.lcl
@@ -0,0 +1,91 @@
+imports employee;
+mutable type empset;
+
+only empset empset_create(void) 
+{
+  /* ensures fresh(result) /\ result' = { }; */
+}
+
+void empset_final (only empset s) 
+{
+  modifies s;
+  /* ensures trashed(s); */
+}
+
+void empset_clear(empset s) 
+{
+  modifies s;
+  /* ensures s' = { }; */
+}
+
+| bool : void | empset_insert (empset s, employee e) internalState; 
+{
+  modifies s, internalState;
+  /* ensures result = ~(e \in s^) /\ s' = insert(e, s^); */
+}
+
+void empset_insertUnique (empset s, employee e) internalState;
+{
+  /* requires ~(e \in s^); */
+  modifies s, internalState;
+  /* ensures s' = insert(e, s^); */
+}
+
+| bool : void | empset_delete(empset s, employee e) 
+{
+  modifies s;
+  /* ensures result = e \in s^ /\ s' = delete(e, s^); */
+}
+
+only empset empset_union(empset s1, empset s2) internalState;
+{
+  modifies internalState;
+  /* ensures result' = s1^ \U s2^ /\ fresh(result); */
+}
+
+only empset empset_disjointUnion (empset s1, empset s2) internalState;
+{
+  modifies internalState;
+  /* requires s1^ \I s2^ = { }; */
+  /* ensures result' = s1^ \U s2^ /\ fresh(result); */
+}
+
+void empset_intersect (empset s1, empset s2) internalState;
+{
+  modifies s1, internalState;
+  /* ensures s1' = s1^ \I s2^; */
+}
+
+int empset_size(empset s) 
+{
+  /* ensures result = size(s^); */
+}
+
+bool empset_member(employee e, empset s) 
+{
+  /* ensures result = e \in s^; */
+}
+
+bool empset_subset(empset s1, empset s2) 
+{
+  /* ensures result = s1^ \subseteq s2^; */
+}
+
+employee empset_choose(empset s) 
+{
+  /* requires s^ \neq { }; */
+  /* ensures result \in s^; */
+}
+
+only char *empset_sprint(empset s) 
+{
+  /* ensures isSprint(result[]', s^) /\ fresh(result[]); */
+}
+
+void empset_initMod (void) internalState;
+{
+  modifies internalState;
+  ensures true;
+}
+
+iter empset_elements (empset s, yield employee x);
diff --git a/test/db3/empset.lcs b/test/db3/empset.lcs
new file mode 100644
index 0000000..3c40345
--- /dev/null
+++ b/test/db3/empset.lcs
@@ -0,0 +1,564 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort MALE enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort GENDER_UNKNOWN enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort MGR enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort JOB_UNKNOWN enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop GENDER_UNKNOWN : -> _eemployee0e_Enum
+%LCLtag eemployee0e enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop JOB_UNKNOWN : -> _eemployee1e_Enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst GENDER_UNKNOWN _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst JOB_UNKNOWN _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype empset _empset_Obj mutable
+%LCLfcn empset_create :  -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_final : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_clear : _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_insert : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_insertUnique : _empset_Obj, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_delete : _empset_Obj, _semployee0s_Struct_Tuple -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_union : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_disjointUnion : _empset_Obj, _empset_Obj -> _empset_Obj 
+%LCLfcnGlobals 
+%LCLfcn empset_intersect : _empset_Obj, _empset_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn empset_size : _empset_Obj -> int 
+%LCLfcnGlobals 
+%LCLfcn empset_member : _semployee0s_Struct_Tuple, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_subset : _empset_Obj, _empset_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn empset_choose : _empset_Obj -> _semployee0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn empset_sprint : _empset_Obj -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn empset_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db3/empset.lh b/test/db3/empset.lh
new file mode 100644
index 0000000..8b29492
--- /dev/null
+++ b/test/db3/empset.lh
@@ -0,0 +1,21 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "employee.h"
+
+
+extern /*@only@*/ empset empset_create (void);
+extern void empset_final (/*@only@*/ empset  /* s */);
+extern void empset_clear (empset  /* s */);
+extern bool /*@alt void@*/ empset_insert (empset  /* s */, employee  /* e */);
+extern void empset_insertUnique (empset  /* s */, employee  /* e */);
+extern bool /*@alt void@*/ empset_delete (empset  /* s */, employee  /* e */);
+extern /*@only@*/ empset empset_union (empset  /* s1 */, empset  /* s2 */);
+extern /*@only@*/ empset empset_disjointUnion (empset  /* s1 */, empset  /* s2 */);
+extern void empset_intersect (empset  /* s1 */, empset  /* s2 */);
+extern int empset_size (empset  /* s */);
+extern bool empset_member (employee  /* e */, empset  /* s */);
+extern bool empset_subset (empset  /* s1 */, empset  /* s2 */);
+extern employee empset_choose (empset  /* s */);
+extern /*@only@*/ char *empset_sprint (empset  /* s */);
+extern void empset_initMod (void);
diff --git a/test/db3/erc.c b/test/db3/erc.c
new file mode 100644
index 0000000..2170a35
--- /dev/null
+++ b/test/db3/erc.c
@@ -0,0 +1,166 @@
+# include 
+
+# include "erc.h"
+
+static size_t int_toSize (int x) /*@*/
+{
+  size_t res = (size_t) x;
+
+  if ((int) res != x)
+    {
+      fprintf (stderr, "Error: int_toSize failure: %d", x);
+      return 0;
+    }
+  else
+    {
+      return res;
+    }
+}
+
+erc erc_create (void) 
+{
+  erc c;
+
+  c = (erc) malloc (sizeof (*c));
+
+  if (c == 0) 
+    {
+      printf ("Malloc returned null in erc_create\n");
+      exit (EXIT_FAILURE);
+    }
+  
+  c->vals = 0;
+  c->size = 0;
+  return c;
+}
+
+void erc_clear (erc c) 
+{
+  ercList elem;
+  ercList next;
+
+  for (elem = c->vals; elem != 0; elem = next) 
+    {
+      next = elem->next;
+      free (elem);
+    }
+  
+  c->vals = 0;
+  c->size = 0;
+}
+
+void erc_final (erc c) 
+{
+  erc_clear (c);
+  free (c); 
+}
+
+bool erc_member (eref er, erc c) 
+{
+  ercList tmpc;
+
+  for (tmpc = c->vals; tmpc != 0; tmpc = tmpc->next)
+    {
+      if (eref_equal (tmpc->val, er)) 
+	{
+	  return TRUE; 
+	}
+    }
+
+  return FALSE;
+}
+
+void erc_insert (erc c, eref er) 
+{
+  ercList newElem;
+  newElem = (ercElem *) malloc (sizeof (*newElem));
+
+  if (newElem == 0) 
+    {
+      printf ("Malloc returned null in erc_insert\n");
+      exit (EXIT_FAILURE);
+    }
+
+  newElem->val = er;
+  newElem->next = c->vals;
+  c->vals = newElem;
+  c->size++;
+}
+
+bool erc_delete (erc c, eref er) 
+{
+  ercList elem = c->vals;
+
+  if (elem != NULL)
+    {
+      if (eref_equal (elem->val, er))
+	{
+	  c->vals = elem->next;
+	  free (elem);
+	  c->size--;
+	  return TRUE;
+	}
+      else
+	{
+	  ercList prev = elem;
+	  elem = elem->next;
+
+	  for (; elem != 0; prev = elem, elem = elem->next) 
+	    {
+	      if (eref_equal (elem->val, er))
+		{ 
+		  assert (prev != NULL);
+		  prev->next = elem->next;
+		  free (elem); 
+		  c->size--;
+		  return TRUE;
+		}
+	    }
+	}
+    }
+  
+  return FALSE;
+}
+
+void erc_join (erc c1, erc c2) 
+{
+  ercList tmpc;
+
+  for (tmpc = c2->vals; tmpc != 0; tmpc = tmpc->next)
+    {
+      erc_insert (c1, tmpc->val);
+    }
+}
+
+char *erc_sprint (erc c)
+{
+  int len;
+  char *result;
+
+  result = (char *) 
+    malloc (int_toSize (erc_size (c) * (employeePrintSize + 1) + 1));
+
+  if (result == 0) 
+    {
+      printf ("Malloc returned null in erc_sprint\n");
+      exit (EXIT_FAILURE);
+    }
+
+  len = 0;
+
+  erc_elements(c, er)
+    {
+      employee_sprint(&(result[len]), eref_get(er));
+      len += employeePrintSize;
+      result[len++] = '\n';
+    } end_erc_elements;
+
+  result[len] = '\0';
+  return result;
+}
+
+eref erc_choose (erc c) 
+{
+  assert (c->vals != NULL);
+  return c->vals->val;
+}
diff --git a/test/db3/erc.h b/test/db3/erc.h
new file mode 100644
index 0000000..f6fdb9b
--- /dev/null
+++ b/test/db3/erc.h
@@ -0,0 +1,30 @@
+# ifndef F_ERC_H
+# define F_ERC_H
+
+# include 
+# include "eref.h"
+
+/*@-exporttype@*/ /* These types should not be exported, but are used in macros. */
+typedef struct _elem { eref val; /*@null@*/ struct _elem *next; } ercElem;
+typedef ercElem *ercList;
+typedef struct { /*@null@*/ ercList vals; int size; } ercInfo;
+/*@=exporttype@*/
+
+typedef ercInfo *erc;
+
+# include "erc.lh"
+
+# define erc_size(c) ((c)->size)
+
+# define erc_initMod() \
+    do { bool_initMod(); employee_initMod();\
+         eref_initMod(); } while (0)
+
+# define erc_elements(c, m_x) \
+  { erc m_c = (c); ercElem *m_ec = (m_c)->vals; int m_i = 0; \
+    while (m_i < (m_c)->size) { \
+      eref m_x; assert (m_ec != NULL); m_x = m_ec->val; m_ec = m_ec->next; m_i++; 
+
+# define end_erc_elements }}
+
+# endif
diff --git a/test/db3/erc.lcl b/test/db3/erc.lcl
new file mode 100644
index 0000000..4078e29
--- /dev/null
+++ b/test/db3/erc.lcl
@@ -0,0 +1,72 @@
+imports eref;
+
+mutable type erc;
+
+only erc erc_create(void) 
+{
+  /* ensures fresh(result) /\ result' = { }; */
+}
+
+void erc_clear(erc c) 
+{
+  /* requires c^.activeIters = 0; */
+  modifies c;
+  /* ensures c' = { }; */
+}
+
+void erc_insert(erc c, eref er) 
+{
+  /* requires c^.activeIters = 0 /\ er \neq erefNIL; */
+  modifies c;
+  /* ensures c' = [insert(er, c^.val), 0]; */
+}
+
+| bool : void | erc_delete(erc c, eref er) 
+{
+  /* requires c^.activeIters = 0; */
+  modifies c;
+  /* ensures result = er \in c^.val
+     /\ c' = [delete(er, c^.val), 0]; */
+}
+
+bool erc_member(eref er, erc c) 
+{
+  /* ensures result = er \in c^.val; */
+}
+
+eref erc_choose(erc c) 
+{
+  /* requires size(c^.val) \neq 0; */
+  /* ensures result \in c^.val; */
+}
+
+int erc_size(erc c) 
+{
+  /* ensures result = size(c^.val); */
+}
+
+void erc_join(erc c1, erc c2) 
+{
+  /* requires c1^.activeIters = 0; */
+  modifies c1;
+  /* ensures c1' = [c1^.val \U c2^.val, 0]; */
+}
+
+only char *erc_sprint(erc c) 
+{
+  /* ensures isSprint(result[]', c^) /\ fresh(result[]); */
+}
+
+void erc_final (only erc c) 
+{
+  modifies c;
+  /* ensures trashed(c); */
+}
+
+void erc_initMod (void) internalState;
+{
+  modifies internalState;
+  ensures true;
+}
+
+iter erc_elements (erc c, yield eref el);  
diff --git a/test/db3/erc.lcs b/test/db3/erc.lcs
new file mode 100644
index 0000000..b2406b2
--- /dev/null
+++ b/test/db3/erc.lcs
@@ -0,0 +1,584 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort GENDER_UNKNOWN enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort JOB_UNKNOWN enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLsort ereftab immutable nil nil
+%LCLsort _ereftab_Obj mutable ereftab nil
+%LCLsort erc immutable nil nil
+%LCLsort _erc_Obj mutable erc nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop GENDER_UNKNOWN : -> _eemployee0e_Enum
+%LCLtag eemployee0e enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop JOB_UNKNOWN : -> _eemployee1e_Enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop sizeof :ereftab -> int
+%LCLop sizeof :erc -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst GENDER_UNKNOWN _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst JOB_UNKNOWN _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype eref eref immutable
+%LCLconst eref_undefined eref
+%LCLtype map map immutable
+%LCLvar m _map_Obj
+%LCLfcn eref_alloc :  -> eref 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_isDefined : eref -> bool 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_free : eref -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_assign : eref, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_get : eref -> _semployee0s_Struct 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_equal : eref, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn eref_initMod :  -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLtype erc _erc_Obj mutable
+%LCLfcn erc_create :  -> _erc_Obj 
+%LCLfcnGlobals 
+%LCLfcn erc_clear : _erc_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_insert : _erc_Obj, eref -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_delete : _erc_Obj, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn erc_member : eref, _erc_Obj -> bool 
+%LCLfcnGlobals 
+%LCLfcn erc_choose : _erc_Obj -> eref 
+%LCLfcnGlobals 
+%LCLfcn erc_size : _erc_Obj -> int 
+%LCLfcnGlobals 
+%LCLfcn erc_join : _erc_Obj, _erc_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_sprint : _erc_Obj -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn erc_final : _erc_Obj -> void 
+%LCLfcnGlobals 
+%LCLfcn erc_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db3/erc.lh b/test/db3/erc.lh
new file mode 100644
index 0000000..d2e99c4
--- /dev/null
+++ b/test/db3/erc.lh
@@ -0,0 +1,17 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "eref.h"
+
+
+extern /*@only@*/ erc erc_create (void);
+extern void erc_clear (erc  /* c */);
+extern void erc_insert (erc  /* c */, eref  /* er */);
+extern bool /*@alt void@*/ erc_delete (erc  /* c */, eref  /* er */);
+extern bool erc_member (eref  /* er */, erc  /* c */);
+extern eref erc_choose (erc  /* c */);
+extern int erc_size (erc  /* c */);
+extern void erc_join (erc  /* c1 */, erc  /* c2 */);
+extern /*@only@*/ char *erc_sprint (erc  /* c */);
+extern void erc_final (/*@only@*/ erc  /* c */);
+extern void erc_initMod (void);
diff --git a/test/db3/eref.c b/test/db3/eref.c
new file mode 100644
index 0000000..5a8dcc9
--- /dev/null
+++ b/test/db3/eref.c
@@ -0,0 +1,122 @@
+# include 
+# include 
+# include "eref.h"
+
+typedef enum { ST_USED, ST_AVAIL } erefStatus;
+typedef struct {
+  /*@reldef@*/ /*@only@*/ employee *conts;
+  /*@only@*/ erefStatus *status;
+  int size;
+} erefTable;
+
+static erefTable eref_Pool;     /* private */
+static bool needsInit = TRUE;  /* private */
+
+eref eref_alloc (void) 
+   /*@globals eref_Pool@*/
+   /*@modifies eref_Pool@*/
+{
+  int i, res;
+  
+  for (i=0; (eref_Pool.status[i] == ST_USED) && (i < eref_Pool.size); i++)
+    {
+      ;
+    }
+  
+  res = i;
+
+  if (res == eref_Pool.size) 
+    {
+      eref_Pool.conts =
+	(employee *) realloc (eref_Pool.conts,
+			      2 * eref_Pool.size * sizeof (*eref_Pool.conts));
+      
+      if (eref_Pool.conts == 0) 
+	{
+	  printf ("Malloc returned null in eref_alloc\n");
+	  exit (EXIT_FAILURE);
+	}
+      
+      eref_Pool.status =
+	(erefStatus *) realloc (eref_Pool.status,
+				 2 * eref_Pool.size * sizeof (*eref_Pool.status));
+
+      if (eref_Pool.status == 0) 
+	{
+	  printf ("Malloc returned null in eref_alloc\n");
+	  exit (EXIT_FAILURE);
+	}
+      
+      eref_Pool.size = 2*eref_Pool.size;
+
+      for (i = res+1; i < eref_Pool.size; i++)
+	{
+	  eref_Pool.status[i] = ST_AVAIL;
+	}
+    }
+  
+  eref_Pool.status[res] = ST_USED;
+  return (eref) res;
+}
+
+void eref_initMod (void) 
+   /*@globals undef eref_Pool, needsInit, internalState@*/
+   /*@modifies eref_Pool, needsInit, internalState@*/
+{
+  int i;
+  const int size = 16;
+  
+  if (!needsInit) 
+    {
+      /*@-compdef@*/ return; /*@=compdef@*/
+    }
+
+  needsInit = FALSE;
+  bool_initMod ();
+  employee_initMod ();
+
+  eref_Pool.conts = (employee *) malloc (size * sizeof (*eref_Pool.conts));
+
+  if (eref_Pool.conts == 0) 
+    {
+      printf ("Malloc returned null in eref_initMod\n");
+      exit (EXIT_FAILURE);
+    }
+  
+  eref_Pool.status = (erefStatus *) malloc (size * sizeof (*eref_Pool.status));
+
+  if (eref_Pool.status == 0) 
+    {
+      printf ("Malloc returned null in eref_initMod\n");
+      exit (EXIT_FAILURE);
+    }
+  
+  eref_Pool.size = size;
+
+  /*@+loopexec@*/
+  for (i = 0; i < size; i++)
+    {
+      eref_Pool.status[i] = ST_AVAIL;
+    }
+  /*@=loopexec@*/
+}
+
+void eref_free (eref er)
+  /*@globals eref_Pool@*/
+  /*@modifies eref_Pool@*/
+{
+  eref_Pool.status[er] = ST_AVAIL;
+}
+
+void eref_assign (eref er, employee e) 
+  /*@globals eref_Pool@*/
+  /*@modifies eref_Pool@*/
+{
+  eref_Pool.conts[er] = e;
+}
+
+employee eref_get (eref er) 
+   /*@globals eref_Pool@*/
+{
+  return eref_Pool.conts[er];
+}
diff --git a/test/db3/eref.h b/test/db3/eref.h
new file mode 100644
index 0000000..b20c49d
--- /dev/null
+++ b/test/db3/eref.h
@@ -0,0 +1,16 @@
+# ifndef F_EREF_H
+# define F_EREF_H
+
+# include "employee.h"
+
+typedef int eref;
+
+# include "eref.lh"
+
+# define eref_undefined -1
+
+# define eref_isDefined(e)    ((e) != eref_undefined)
+# define eref_equal(er1, er2) ((er1) == (er2))
+
+# endif
+
diff --git a/test/db3/eref.lcl b/test/db3/eref.lcl
new file mode 100644
index 0000000..8b4c335
--- /dev/null
+++ b/test/db3/eref.lcl
@@ -0,0 +1,47 @@
+imports employee;
+
+immutable type eref;
+constant eref eref_undefined;
+
+spec immutable type map;
+
+spec map m;
+
+eref eref_alloc(void) map m; 
+{
+  modifies m;
+  /* ensures newInd(result, m^, m'); */
+}
+
+bool eref_isDefined (eref er) map m; { }
+
+void eref_free(eref er) map m; 
+{
+  /* requires er \in domain(m^); */
+  modifies m;
+  /* ensures m' = delete(m^, er); */
+}
+
+void eref_assign(eref er, employee e) map m; 
+{
+  /* requires er \in domain(m^); */
+  modifies m;
+  /* ensures m' = assign(m^, er, e); */
+}
+
+employee eref_get(eref er) map m; 
+{
+  /* requires er \in domain(m^); */
+  /* ensures result = m^[er]; */
+}
+
+bool eref_equal(eref er1, eref er2) 
+{
+  /* ensures result = (er1 = er2); */
+}
+
+void eref_initMod(void) map m; internalState;
+{
+  modifies m, internalState;
+  /* ensures m' = new; */
+}
diff --git a/test/db3/eref.lcs b/test/db3/eref.lcs
new file mode 100644
index 0000000..d4b88c2
--- /dev/null
+++ b/test/db3/eref.lcs
@@ -0,0 +1,548 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort MALE enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort GENDER_UNKNOWN enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort MGR enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort JOB_UNKNOWN enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop GENDER_UNKNOWN : -> _eemployee0e_Enum
+%LCLtag eemployee0e enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop JOB_UNKNOWN : -> _eemployee1e_Enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst GENDER_UNKNOWN _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst JOB_UNKNOWN _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype eref eref immutable
+%LCLconst eref_undefined eref
+%LCLtype map map immutable
+%LCLvar m _map_Obj
+%LCLfcn eref_alloc :  -> eref 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_isDefined : eref -> bool 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_free : eref -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_assign : eref, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_get : eref -> _semployee0s_Struct 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_equal : eref, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn eref_initMod :  -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLSymbolTableEnd
diff --git a/test/db3/eref.lh b/test/db3/eref.lh
new file mode 100644
index 0000000..54507a0
--- /dev/null
+++ b/test/db3/eref.lh
@@ -0,0 +1,13 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "employee.h"
+
+
+extern eref eref_alloc (void);
+extern bool eref_isDefined (eref  /* er */);
+extern void eref_free (eref  /* er */);
+extern void eref_assign (eref  /* er */, employee  /* e */);
+extern employee eref_get (eref  /* er */);
+extern bool eref_equal (eref  /* er1 */, eref  /* er2 */);
+extern void eref_initMod (void);
diff --git a/test/db3/ereftab.c b/test/db3/ereftab.c
new file mode 100644
index 0000000..50fa48b
--- /dev/null
+++ b/test/db3/ereftab.c
@@ -0,0 +1,51 @@
+/*
+** This is not a good implementation.  I should probably replace
+** the erc with a hash table.  
+*/
+
+# include "ereftab.h"
+
+ereftab ereftab_create (void) 
+{
+  return erc_create ();
+}
+
+void ereftab_insert (ereftab t, employee e, eref er) 
+{
+  eref_assign (er, e);
+  erc_insert (t, er);
+}
+
+bool ereftab_delete (ereftab t, eref er) 
+{
+  bool result;
+  
+  result = erc_member (er, t);  
+  erc_delete (t, er);
+  return result;
+}
+
+eref ereftab_lookup (employee e, ereftab t) 
+{
+  employee e1;
+
+  ereftab_elements(t, er)
+    {
+      e1 = eref_get(er);
+
+      if (employee_equal(&e, &e1)) 
+	{
+	  return er;
+	}
+    } end_ereftab_elements ;
+
+  return eref_undefined;
+}
+
+void ereftab_initMod (void) 
+{
+  bool_initMod ();
+  eref_initMod ();
+  erc_initMod ();
+}
+
diff --git a/test/db3/ereftab.h b/test/db3/ereftab.h
new file mode 100644
index 0000000..3fe5476
--- /dev/null
+++ b/test/db3/ereftab.h
@@ -0,0 +1,14 @@
+# ifndef F_EREFTAB_H
+# define F_EREFTAB_H
+
+# include "erc.h"
+# include "eref.h"
+
+typedef erc ereftab;
+
+# include "ereftab.lh"
+# define ereftab_elements(s, m_x) erc_elements(s, m_x)
+# define end_ereftab_elements     end_erc_elements
+
+# endif
+
diff --git a/test/db3/ereftab.lcl b/test/db3/ereftab.lcl
new file mode 100644
index 0000000..1e81f20
--- /dev/null
+++ b/test/db3/ereftab.lcl
@@ -0,0 +1,36 @@
+imports employee, eref;
+
+mutable type ereftab; 
+
+only ereftab ereftab_create(void) 
+{
+  /* ensures result' = empty; */
+}
+
+void ereftab_insert(ereftab t, employee e, eref er) 
+{
+  /* requires getERef(t^, e) = erefNIL; */
+  modifies t;
+  /* ensures t' = add(t^, e, er); */
+}
+
+bool ereftab_delete(ereftab t, eref er) 
+{
+  modifies t;
+  /* ensures result = in(t^, er) /\ t' = delete(t^, er); */
+}
+
+eref ereftab_lookup(employee e, ereftab t) 
+{
+  /* ensures result = getERef(t^, e); */
+}
+
+void ereftab_initMod (void) internalState;
+{
+  modifies internalState;
+  ensures true;
+}
+
+iter ereftab_elements(ereftab s, yield eref x);
+
+
diff --git a/test/db3/ereftab.lcs b/test/db3/ereftab.lcs
new file mode 100644
index 0000000..c743ebb
--- /dev/null
+++ b/test/db3/ereftab.lcs
@@ -0,0 +1,778 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _size_t synonym int nil
+%LCLsort _wchar_t synonym int nil
+%LCLsort _sstdlib0s_Struct str sstdlib0s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _sstdlib0s_Struct_Tuple tup _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Ptr ptr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Arr arr _sstdlib0s_Struct nil
+%LCLsort __sstdlib0s_Struct_Tuple_Vec vec _sstdlib0s_Struct_Tuple __sstdlib0s_Struct_Arr
+%LCLsort _div_t synonym _sstdlib0s_Struct nil
+%LCLsort _sstdlib1s_Struct str sstdlib1s nil
+%LCLsort rem strMem _int_Obj nil
+%LCLsort quot strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _sstdlib1s_Struct_Tuple tup _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Ptr ptr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Arr arr _sstdlib1s_Struct nil
+%LCLsort __sstdlib1s_Struct_Tuple_Vec vec _sstdlib1s_Struct_Tuple __sstdlib1s_Struct_Arr
+%LCLsort _ldiv_t synonym _sstdlib1s_Struct nil
+%LCLsort _void_Obj obj void nil
+%LCLsort __void_Obj_Ptr ptr _void_Obj nil
+%LCLsort __void_Obj_Arr arr _void_Obj nil
+%LCLsort _void_Vec vec void __void_Obj_Arr
+%LCLsort _HOF_sort_32 hof nil nil
+%LCLsort _HOF_sort_33 hof nil nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _HOF_sort_37 hof nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort FILE immutable nil nil
+%LCLsort _va_list synonym __void_Obj_Ptr nil
+%LCLsort _fpos_t synonym __void_Obj_Ptr nil
+%LCLsort _FILE_Obj obj FILE nil
+%LCLsort __FILE_Obj_Ptr ptr _FILE_Obj nil
+%LCLsort __FILE_Obj_Arr arr _FILE_Obj nil
+%LCLsort _FILE_Vec vec FILE __FILE_Obj_Arr
+%LCLsort ___FILE_Obj_Ptr_Obj obj __FILE_Obj_Ptr nil
+%LCLsort ___void_Obj_Ptr_Obj obj __void_Obj_Ptr nil
+%LCLsort ____void_Obj_Ptr_Obj_Ptr ptr ___void_Obj_Ptr_Obj nil
+%LCLsort ____void_Obj_Ptr_Obj_Arr arr ___void_Obj_Ptr_Obj nil
+%LCLsort ___void_Obj_Ptr_Vec vec __void_Obj_Ptr ____void_Obj_Ptr_Obj_Arr
+%LCLsort _eemployee0e_Enum enum eemployee0e nil
+%LCLsort GENDER_UNKNOWN enumMem nil nil
+%LCLsort FEMALE enumMem nil nil
+%LCLsort MALE enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _gender synonym _eemployee0e_Enum nil
+%LCLsort _eemployee1e_Enum enum eemployee1e nil
+%LCLsort JOB_UNKNOWN enumMem nil nil
+%LCLsort NONMGR enumMem nil nil
+%LCLsort MGR enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _job synonym _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct str semployee0s nil
+%LCLsort j strMem __eemployee1e_Enum_Obj nil
+%LCLsort gen strMem __eemployee0e_Enum_Obj nil
+%LCLsort salary strMem _int_Obj nil
+%LCLsort name strMem __char_Obj_Arr nil
+%LCLsort ssNum strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __eemployee0e_Enum_Obj obj _eemployee0e_Enum nil
+%LCLsort __eemployee1e_Enum_Obj obj _eemployee1e_Enum nil
+%LCLsort _semployee0s_Struct_Tuple tup _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Ptr ptr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Arr arr _semployee0s_Struct nil
+%LCLsort __semployee0s_Struct_Tuple_Vec vec _semployee0s_Struct_Tuple __semployee0s_Struct_Arr
+%LCLsort _employee synonym _semployee0s_Struct nil
+%LCLsort eref immutable nil nil
+%LCLsort map immutable nil nil
+%LCLsort _map_Obj obj map nil
+%LCLsort empset immutable nil nil
+%LCLsort _empset_Obj mutable empset nil
+%LCLsort ereftab immutable nil nil
+%LCLsort _ereftab_Obj mutable ereftab nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag sstdlib0s struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLtag sstdlib1s struct
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop MALE : -> _eemployee0e_Enum
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop FEMALE : -> _eemployee0e_Enum
+%LCLop { __ } :char -> _char_Vec
+%LCLop GENDER_UNKNOWN : -> _eemployee0e_Enum
+%LCLtag eemployee0e enum
+%LCLop MGR : -> _eemployee1e_Enum
+%LCLop NONMGR : -> _eemployee1e_Enum
+%LCLop JOB_UNKNOWN : -> _eemployee1e_Enum
+%LCLtag eemployee1e enum
+%LCLop [__, __] :int, int -> _sstdlib0s_Struct_Tuple
+%LCLop [__, __] :int, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Arr
+%LCLop __ [] :__sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Arr
+%LCLop __ [] :__void_Obj_Ptr -> __void_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__FILE_Obj_Ptr -> __FILE_Obj_Arr
+%LCLop __ [] :____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__semployee0s_Struct_Ptr -> __semployee0s_Struct_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__sstdlib0s_Struct_Tuple_Vec, int -> _sstdlib0s_Struct_Tuple
+%LCLop __ [__] :__sstdlib0s_Struct_Arr, int -> _sstdlib0s_Struct
+%LCLop __ [__] :__sstdlib1s_Struct_Tuple_Vec, int -> _sstdlib1s_Struct_Tuple
+%LCLop __ [__] :__sstdlib1s_Struct_Arr, int -> _sstdlib1s_Struct
+%LCLop __ [__] :_void_Vec, int -> void
+%LCLop __ [__] :__void_Obj_Arr, int -> _void_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_FILE_Vec, int -> FILE
+%LCLop __ [__] :__FILE_Obj_Arr, int -> _FILE_Obj
+%LCLop __ [__] :___void_Obj_Ptr_Vec, int -> __void_Obj_Ptr
+%LCLop __ [__] :____void_Obj_Ptr_Obj_Arr, int -> ___void_Obj_Ptr_Obj
+%LCLop __ [__] :__semployee0s_Struct_Tuple_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ [__] :__semployee0s_Struct_Arr, int -> _semployee0s_Struct
+%LCLop __ \select quot :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select quot :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select quot :_sstdlib1s_Struct -> _int_Obj
+%LCLtag semployee0s struct
+%LCLop [__, __, __, __, __] :_eemployee1e_Enum, _eemployee0e_Enum, int, _char_Vec, int -> _semployee0s_Struct_Tuple
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \field_arrow quot :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow quot :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select rem :_sstdlib0s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib0s_Struct -> _int_Obj
+%LCLop __ \select rem :_sstdlib1s_Struct_Tuple -> int
+%LCLop __ \select rem :_sstdlib1s_Struct -> _int_Obj
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \field_arrow rem :__sstdlib0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow rem :__sstdlib1s_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \select ssNum :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select ssNum :_semployee0s_Struct -> _int_Obj
+%LCLop __ \select name :_semployee0s_Struct_Tuple -> _char_Vec
+%LCLop __ \select name :_semployee0s_Struct -> __char_Obj_Arr
+%LCLop __ \field_arrow ssNum :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select salary :_semployee0s_Struct_Tuple -> int
+%LCLop __ \select salary :_semployee0s_Struct -> _int_Obj
+%LCLop __ \field_arrow name :__semployee0s_Struct_Ptr -> __char_Obj_Arr
+%LCLop __ \select gen :_semployee0s_Struct_Tuple -> _eemployee0e_Enum
+%LCLop __ \select gen :_semployee0s_Struct -> __eemployee0e_Enum_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __sstdlib0s_Struct_Ptr
+%LCLop NIL : -> __sstdlib1s_Struct_Ptr
+%LCLop NIL : -> __void_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __FILE_Obj_Ptr
+%LCLop NIL : -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __semployee0s_Struct_Ptr
+%LCLop __ \field_arrow salary :__semployee0s_Struct_Ptr -> _int_Obj
+%LCLop __ \select j :_semployee0s_Struct_Tuple -> _eemployee1e_Enum
+%LCLop __ \select j :_semployee0s_Struct -> __eemployee1e_Enum_Obj
+%LCLop __ \field_arrow gen :__semployee0s_Struct_Ptr -> __eemployee0e_Enum_Obj
+%LCLop __ \field_arrow j :__semployee0s_Struct_Ptr -> __eemployee1e_Enum_Obj
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib0s_Struct_Ptr -> __sstdlib0s_Struct_Ptr
+%LCLop __ + __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :int, __sstdlib1s_Struct_Ptr -> __sstdlib1s_Struct_Ptr
+%LCLop __ + __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ + __  :int, __void_Obj_Ptr -> __void_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ + __  :int, __FILE_Obj_Ptr -> __FILE_Obj_Ptr
+%LCLop __ + __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____void_Obj_Ptr_Obj_Ptr -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ + __  :int, __semployee0s_Struct_Ptr -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, int -> __sstdlib0s_Struct_Ptr
+%LCLop __ - __  :__sstdlib0s_Struct_Ptr, __sstdlib0s_Struct_Ptr -> int
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, int -> __sstdlib1s_Struct_Ptr
+%LCLop __ - __  :__sstdlib1s_Struct_Ptr, __sstdlib1s_Struct_Ptr -> int
+%LCLop __ - __  :__void_Obj_Ptr, int -> __void_Obj_Ptr
+%LCLop __ - __  :__void_Obj_Ptr, __void_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__FILE_Obj_Ptr, int -> __FILE_Obj_Ptr
+%LCLop __ - __  :__FILE_Obj_Ptr, __FILE_Obj_Ptr -> int
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, int -> ____void_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____void_Obj_Ptr_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__semployee0s_Struct_Ptr, int -> __semployee0s_Struct_Ptr
+%LCLop __ - __  :__semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :FILE -> int
+%LCLop sizeof :_eemployee0e_Enum -> int
+%LCLop sizeof :_eemployee1e_Enum -> int
+%LCLop sizeof :eref -> int
+%LCLop sizeof :map -> int
+%LCLop sizeof :empset -> int
+%LCLop sizeof :ereftab -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib0s_Struct_Arr, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__sstdlib1s_Struct_Arr, int -> bool
+%LCLop isSub :_void_Vec, int -> bool
+%LCLop isSub :__void_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_FILE_Vec, int -> bool
+%LCLop isSub :__FILE_Obj_Arr, int -> bool
+%LCLop isSub :___void_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____void_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :__semployee0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__semployee0s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst GENDER_UNKNOWN _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst JOB_UNKNOWN _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype size_t _size_t exposed
+%LCLtype wchar_t _wchar_t exposed
+%LCLtype div_t _div_t exposed
+%LCLtype ldiv_t _ldiv_t exposed
+%LCLconst NULL __void_Obj_Ptr
+%LCLconst EXIT_FAILURE int
+%LCLconst EXIT_SUCCESS int
+%LCLconst RAND_MAX int
+%LCLconst MB_CUR_MAX int
+%LCLfcn abort :  -> void 
+%LCLfcnGlobals 
+%LCLfcn abs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn atexit : _HOF_sort_32 -> int 
+%LCLfcnGlobals 
+%LCLfcn atof : __char_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn atoi : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn atol : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn bsearch : __void_Obj_Ptr, __void_Obj_Ptr, int, int, _HOF_sort_33 -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn calloc : int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn div : int, int -> _sstdlib0s_Struct 
+%LCLfcnGlobals 
+%LCLfcn exit : int -> void 
+%LCLfcnGlobals 
+%LCLfcn free : __void_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn getenv : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn labs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn ldiv : int, int -> _sstdlib1s_Struct 
+%LCLfcnGlobals 
+%LCLfcn malloc : int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn mblen : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbstowcs : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn mbtowc : __int_Obj_Ptr, __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn qsort : __void_Obj_Ptr, int, int, _HOF_sort_37 -> void 
+%LCLfcnGlobals 
+%LCLfcn rand :  -> int 
+%LCLfcnGlobals 
+%LCLfcn realloc : __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn srand : int -> void 
+%LCLfcnGlobals 
+%LCLfcn strtod : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> double 
+%LCLfcnGlobals 
+%LCLfcn strtol : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn strtoul : __char_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn system : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn wcstombs : __char_Obj_Ptr, __int_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn wctomb : __char_Obj_Ptr, int -> int 
+%LCLfcnGlobals 
+%LCLfcn bcopy : __char_Obj_Ptr, __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn bcmp : __char_Obj_Ptr, __char_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn bzero : __char_Obj_Ptr, int -> void 
+%LCLfcnGlobals 
+%LCLfcn ffs : int -> int 
+%LCLfcnGlobals 
+%LCLfcn memccpy : __void_Obj_Ptr, __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memchr : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memcmp : __void_Obj_Ptr, __void_Obj_Ptr, int -> bool 
+%LCLfcnGlobals 
+%LCLfcn memcpy : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memset : __void_Obj_Ptr, int, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn memmove : __void_Obj_Ptr, __void_Obj_Ptr, int -> __void_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLtype FILE FILE immutable
+%LCLtype va_list _va_list exposed
+%LCLtype fpos_t _fpos_t exposed
+%LCLvar stdin ___FILE_Obj_Ptr_Obj
+%LCLvar stdout ___FILE_Obj_Ptr_Obj
+%LCLvar stderr ___FILE_Obj_Ptr_Obj
+%LCLconst EOF int
+%LCLfcn getc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn getchar :  -> int 
+%LCLfcnGlobals 
+%LCLfcn putc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn putchar : int -> int 
+%LCLfcnGlobals 
+%LCLfcn feof : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ferror : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fileno : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _filbuf : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn _flsbuf : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn clearerr : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn fclose : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fdopen : int, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fflush : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetc : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fgets : __char_Obj_Ptr, int, __FILE_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fopen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn sprintf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputc : int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fputs : __char_Obj_Ptr, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fread : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn freopen : __char_Obj_Ptr, __char_Obj_Ptr, __FILE_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn fscanf : __FILE_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fseek : __FILE_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn fsetpos : __FILE_Obj_Ptr, ____void_Obj_Ptr_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn ftell : __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn fwrite : __void_Obj_Ptr, int, int, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn gets : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn perror : __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn popen : __char_Obj_Ptr, __char_Obj_Ptr -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn ungetc : char, __FILE_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn printf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn puts : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn remove : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rename : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn rewind : __FILE_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn scanf : __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn setbuf : __FILE_Obj_Ptr, __char_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn setvbuf : __FILE_Obj_Ptr, __char_Obj_Ptr, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn sscanf : __char_Obj_Ptr, __char_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLfcn tmpfile :  -> __FILE_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn tmpnam : __char_Obj_Ptr -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLconst maxEmployeeName int
+%LCLconst employeePrintSize int
+%LCLenumConst MALE _eemployee0e_Enum
+%LCLenumConst FEMALE _eemployee0e_Enum
+%LCLenumConst GENDER_UNKNOWN _eemployee0e_Enum
+%LCLtype gender _gender exposed
+%LCLenumConst MGR _eemployee1e_Enum
+%LCLenumConst NONMGR _eemployee1e_Enum
+%LCLenumConst JOB_UNKNOWN _eemployee1e_Enum
+%LCLtype job _job exposed
+%LCLtype employee _employee exposed
+%LCLfcn employee_sprint : __char_Obj_Arr, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals 
+%LCLfcn employee_equal : __semployee0s_Struct_Ptr, __semployee0s_Struct_Ptr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_setName : __semployee0s_Struct_Ptr, __char_Obj_Arr -> bool 
+%LCLfcnGlobals 
+%LCLfcn employee_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLtype eref eref immutable
+%LCLconst eref_undefined eref
+%LCLtype map map immutable
+%LCLvar m _map_Obj
+%LCLfcn eref_alloc :  -> eref 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_isDefined : eref -> bool 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_free : eref -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_assign : eref, _semployee0s_Struct_Tuple -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_get : eref -> _semployee0s_Struct 
+%LCLfcnGlobals _map_Obj m; 
+%LCLfcn eref_equal : eref, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn eref_initMod :  -> void 
+%LCLfcnGlobals _map_Obj m; 
+%LCLtype ereftab _ereftab_Obj mutable
+%LCLfcn ereftab_create :  -> _ereftab_Obj 
+%LCLfcnGlobals 
+%LCLfcn ereftab_insert : _ereftab_Obj, _semployee0s_Struct_Tuple, eref -> void 
+%LCLfcnGlobals 
+%LCLfcn ereftab_delete : _ereftab_Obj, eref -> bool 
+%LCLfcnGlobals 
+%LCLfcn ereftab_lookup : _semployee0s_Struct_Tuple, _ereftab_Obj -> eref 
+%LCLfcnGlobals 
+%LCLfcn ereftab_initMod :  -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/db3/ereftab.lh b/test/db3/ereftab.lh
new file mode 100644
index 0000000..788b634
--- /dev/null
+++ b/test/db3/ereftab.lh
@@ -0,0 +1,12 @@
+/* Output from LCLint 2.5m */
+
+# include "bool.h"
+# include "employee.h"
+# include "eref.h"
+
+
+extern /*@only@*/ ereftab ereftab_create (void);
+extern void ereftab_insert (ereftab  /* t */, employee  /* e */, eref  /* er */);
+extern bool ereftab_delete (ereftab  /* t */, eref  /* er */);
+extern eref ereftab_lookup (employee  /* e */, ereftab  /* t */);
+extern void ereftab_initMod (void);
diff --git a/test/decl.c b/test/decl.c
new file mode 100644
index 0000000..1fc1c1d
--- /dev/null
+++ b/test/decl.c
@@ -0,0 +1,8 @@
+int test(int);
+
+int main()
+{
+  int (*y)(int) = &test;
+  int (**x)(int) = &y;
+  x(10);  /* called object is not a function */
+}
diff --git a/test/decl.expect b/test/decl.expect
new file mode 100644
index 0000000..ede7398
--- /dev/null
+++ b/test/decl.expect
@@ -0,0 +1,27 @@
+
+decl.c: (in function main)
+decl.c:7:3: Call to non-function (type [function (int) returns int] **): x
+decl.c:8:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+decl.c:3:5: Function main declared without parameter list
+decl.c: (in function main)
+decl.c:7:3: Call to non-function (type [function (int) returns int] **): x
+decl.c:8:2: Path with no return in function declared to return int
+decl.c:1:5: Function test declared but not defined
+decl.c:1:5: Function test exported but not declared in header file
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+decl2.c:3:6: Variable glob2 defined with inconsistent type (arrays and pointers
+                are not identical in variable declarations): int *
+   decl2.h:3:12: Previous declaration of glob2: int []
+decl2.c:4:5: Variable glob2 redefined
+   decl2.c:3:6: Previous definition of glob2
+decl2.c:6:6: Variable glob3 redeclared with inconsistent type: char
+   decl2.h:4:12: Previous declaration of glob3: int
+decl2.c:9:5: Variable glob redefined
+   decl2.c:8:5: Previous definition of glob
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/decl.out b/test/decl.out
new file mode 100644
index 0000000..ede7398
--- /dev/null
+++ b/test/decl.out
@@ -0,0 +1,27 @@
+
+decl.c: (in function main)
+decl.c:7:3: Call to non-function (type [function (int) returns int] **): x
+decl.c:8:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+decl.c:3:5: Function main declared without parameter list
+decl.c: (in function main)
+decl.c:7:3: Call to non-function (type [function (int) returns int] **): x
+decl.c:8:2: Path with no return in function declared to return int
+decl.c:1:5: Function test declared but not defined
+decl.c:1:5: Function test exported but not declared in header file
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+decl2.c:3:6: Variable glob2 defined with inconsistent type (arrays and pointers
+                are not identical in variable declarations): int *
+   decl2.h:3:12: Previous declaration of glob2: int []
+decl2.c:4:5: Variable glob2 redefined
+   decl2.c:3:6: Previous definition of glob2
+decl2.c:6:6: Variable glob3 redeclared with inconsistent type: char
+   decl2.h:4:12: Previous declaration of glob3: int
+decl2.c:9:5: Variable glob redefined
+   decl2.c:8:5: Previous definition of glob
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/decl2.c b/test/decl2.c
new file mode 100644
index 0000000..7b92f51
--- /dev/null
+++ b/test/decl2.c
@@ -0,0 +1,9 @@
+# include "decl2.h"
+
+int *glob2;
+int glob2[];
+
+char glob3;
+
+int glob;
+int glob;
diff --git a/test/decl2.h b/test/decl2.h
new file mode 100644
index 0000000..e17905f
--- /dev/null
+++ b/test/decl2.h
@@ -0,0 +1,4 @@
+extern int glob;
+extern int glob;
+extern int glob2[];
+extern int glob3;
diff --git a/test/decl2.lcl b/test/decl2.lcl
new file mode 100644
index 0000000..74e1971
--- /dev/null
+++ b/test/decl2.lcl
@@ -0,0 +1 @@
+int glob;
diff --git a/test/decl2.lcs b/test/decl2.lcs
new file mode 100644
index 0000000..818f016
--- /dev/null
+++ b/test/decl2.lcs
@@ -0,0 +1,121 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _int_Obj obj int nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLvar glob _int_Obj
+%LCLSymbolTableEnd
diff --git a/test/empty.lcl b/test/empty.lcl
new file mode 100644
index 0000000..e69de29
diff --git a/test/enum.c b/test/enum.c
new file mode 100644
index 0000000..31d0e74
--- /dev/null
+++ b/test/enum.c
@@ -0,0 +1,64 @@
+typedef enum { one, two, three } etype;
+typedef enum { cero, uno, dos, tres } stype;
+typedef enum _mtag { threem, four } mtype; /* 4. Enum three declared with members ... */
+typedef enum _itag { siete } itype;  /* 5. Enumerator member siete declared with inconsistent type: ... */
+typedef struct _st { int a; int b; } st ; 
+typedef struct { int a; int b; } st2 ; /* 5. Structure st2 declared with fields ... */
+                                       /* (5. in enum.lcl) */
+int f (void)
+{
+  etype x;
+  mtype m;
+  int y;
+  int a[];
+
+  y = a[one]; /* 6. Value a[] used before definition */
+  x = two;
+  y = one;
+  x = three; /* 7. Assignment of enum _mtag { three, four } to etype: x = three */
+
+  switch (x)
+    {
+    case one: break;
+    } /* 8. Missing case in switch: two */
+
+  switch (x)
+    {
+    case one:
+      switch (m)
+      {
+      case three:
+	printf("one!");
+	break;
+      case four:
+	printf("yabba");
+	break;
+      }
+      break;
+    case one: /* 9. Duplicate case in switch: one */
+      break; 
+    case 5:
+      break; /* case in switch not in enum */
+    default:
+      break;
+    case two:
+      break; /* okay (unreachable case) */
+    }
+} /* 10. Path with no return in function declared to return int */
+
+/* 11. in enum.lcl */
+
+enum { hasta, pasta, yummy } ;
+
+enum { e1, e2 = e1, e3 = e2 } ;
+
+struct adsf
+{
+  enum { A, B, C } e;
+} ;
+
+void f5 (struct adsf s)
+{
+  s.e = B;
+}
+
diff --git a/test/enum.expect b/test/enum.expect
new file mode 100644
index 0000000..7491c1e
--- /dev/null
+++ b/test/enum.expect
@@ -0,0 +1,72 @@
+
+enum.c:2:16: Enumerator member cero declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:16: Specification of cero: enum { cero, uno, dos }
+enum.c:2:22: Enumerator member uno declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:22: Specification of uno: enum { cero, uno, dos }
+enum.c:2:27: Enumerator member dos declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:27: Specification of dos: enum { cero, uno, dos }
+enum.c:2:39: Enum stype declared with members { cero, uno, dos, tres } but
+                specified with members { cero, uno, dos }
+   enum.lcl:2:33: Specification of stype
+enum.c:4:22: Enumerator member siete declared with inconsistent type:
+                enum _itag { siete }
+   enum.lcl:3:23: Specification of siete: enum _ietag { siete }
+enum.c:6:34: Structure st2 declared with fields { int a; int b; }, specified
+                with fields { int a; int b; int c; }
+   enum.lcl:6:41: Specification of st2
+   enum.lcl:7:1: Field present in specification, missing in declaration: int c
+enum.c: (in function f)
+enum.c:15:7: Value a[] used before definition
+enum.c:23:6: Missing cases in switch: two, three
+enum.c:30:12: Case in switch not mtype member: three
+enum.c:36:8: Missing case in switch: threem
+enum.c:38:10: Duplicate case in switch: one
+enum.c:47:2: Path with no return in function declared to return int
+enum.c:51:8: Enumerator member hasta declared with inconsistent type:
+                enum { hasta, pasta, yummy }
+   enum.lcl:8:8: Specification of hasta: enum { hasta, pasta, yasta }
+enum.c:51:15: Enumerator member pasta declared with inconsistent type:
+                 enum { hasta, pasta, yummy }
+   enum.lcl:8:15: Specification of pasta: enum { hasta, pasta, yasta }
+enum.lcl:3:9: Enum tag enum _ietag specified but not defined
+enum.lcl:8:22: Enum member yasta specified but not defined
+
+Finished LCLint checking --- 16 code errors found, as expected
+
+enum.c:2:16: Enumerator member cero declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:16: Specification of cero: enum { cero, uno, dos }
+enum.c:2:22: Enumerator member uno declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:22: Specification of uno: enum { cero, uno, dos }
+enum.c:2:27: Enumerator member dos declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:27: Specification of dos: enum { cero, uno, dos }
+enum.c:2:39: Enum stype declared with members { cero, uno, dos, tres } but
+                specified with members { cero, uno, dos }
+   enum.lcl:2:33: Specification of stype
+enum.c:4:22: Enumerator member siete declared with inconsistent type:
+                enum _itag { siete }
+   enum.lcl:3:23: Specification of siete: enum _ietag { siete }
+enum.c:6:34: Structure st2 declared with fields { int a; int b; }, specified
+                with fields { int a; int b; int c; }
+   enum.lcl:6:41: Specification of st2
+   enum.lcl:7:1: Field present in specification, missing in declaration: int c
+enum.c: (in function f)
+enum.c:15:7: Value a[] used before definition
+enum.c:30:12: Case in switch not mtype member: three
+enum.c:38:10: Duplicate case in switch: one
+enum.c:47:2: Path with no return in function declared to return int
+enum.c:51:8: Enumerator member hasta declared with inconsistent type:
+                enum { hasta, pasta, yummy }
+   enum.lcl:8:8: Specification of hasta: enum { hasta, pasta, yasta }
+enum.c:51:15: Enumerator member pasta declared with inconsistent type:
+                 enum { hasta, pasta, yummy }
+   enum.lcl:8:15: Specification of pasta: enum { hasta, pasta, yasta }
+enum.lcl:3:9: Enum tag enum _ietag specified but not defined
+enum.lcl:8:22: Enum member yasta specified but not defined
+
+Finished LCLint checking --- 14 code errors found, as expected
diff --git a/test/enum.lcl b/test/enum.lcl
new file mode 100644
index 0000000..be174b5
--- /dev/null
+++ b/test/enum.lcl
@@ -0,0 +1,8 @@
+typedef enum { one, two, three } etype; 
+typedef enum { cero, uno, dos } stype; 
+typedef enum _ietag { siete } itype; /* 11. enum _ietag specified but not defined */
+
+typedef struct { int a; int b; } st;
+typedef struct { int a; int b; int c; } st2; /* (5. Field  present in spec...) */
+
+enum { hasta, pasta, yasta } ;
\ No newline at end of file
diff --git a/test/enum.lcs b/test/enum.lcs
new file mode 100644
index 0000000..ff360ca
--- /dev/null
+++ b/test/enum.lcs
@@ -0,0 +1,227 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _eenum0e_Enum enum eenum0e nil
+%LCLsort three enumMem nil nil
+%LCLsort two enumMem nil nil
+%LCLsort one enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _etype synonym _eenum0e_Enum nil
+%LCLsort _eenum1e_Enum enum eenum1e nil
+%LCLsort dos enumMem nil nil
+%LCLsort uno enumMem nil nil
+%LCLsort cero enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _stype synonym _eenum1e_Enum nil
+%LCLsort __ietag_Enum enum _ietag nil
+%LCLsort siete enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLsort _itype synonym __ietag_Enum nil
+%LCLsort _senum0s_Struct str senum0s nil
+%LCLsort b strMem _int_Obj nil
+%LCLsort a strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort _senum0s_Struct_Tuple tup _senum0s_Struct nil
+%LCLsort __senum0s_Struct_Ptr ptr _senum0s_Struct nil
+%LCLsort __senum0s_Struct_Arr arr _senum0s_Struct nil
+%LCLsort __senum0s_Struct_Tuple_Vec vec _senum0s_Struct_Tuple __senum0s_Struct_Arr
+%LCLsort _st synonym _senum0s_Struct nil
+%LCLsort _senum1s_Struct str senum1s nil
+%LCLsort c strMem _int_Obj nil
+%LCLsort b strMem _int_Obj nil
+%LCLsort a strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _senum1s_Struct_Tuple tup _senum1s_Struct nil
+%LCLsort __senum1s_Struct_Ptr ptr _senum1s_Struct nil
+%LCLsort __senum1s_Struct_Arr arr _senum1s_Struct nil
+%LCLsort __senum1s_Struct_Tuple_Vec vec _senum1s_Struct_Tuple __senum1s_Struct_Arr
+%LCLsort _st2 synonym _senum1s_Struct nil
+%LCLsort _eenum2e_Enum enum eenum2e nil
+%LCLsort yasta enumMem nil nil
+%LCLsort pasta enumMem nil nil
+%LCLsort hasta enumMem nil nil
+%LCLsort enumEnd nil nil nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop one : -> _eenum0e_Enum
+%LCLop two : -> _eenum0e_Enum
+%LCLop three : -> _eenum0e_Enum
+%LCLop cero : -> _eenum1e_Enum
+%LCLop uno : -> _eenum1e_Enum
+%LCLop dos : -> _eenum1e_Enum
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLtag _ietag enum
+%LCLop siete : -> __ietag_Enum
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop [__, __] :int, int -> _senum0s_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__senum0s_Struct_Ptr -> __senum0s_Struct_Arr
+%LCLop __ [] :__senum1s_Struct_Ptr -> __senum1s_Struct_Arr
+%LCLop [__, __, __] :int, int, int -> _senum1s_Struct_Tuple
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :__senum0s_Struct_Tuple_Vec, int -> _senum0s_Struct_Tuple
+%LCLop __ [__] :__senum0s_Struct_Arr, int -> _senum0s_Struct
+%LCLop __ [__] :__senum1s_Struct_Tuple_Vec, int -> _senum1s_Struct_Tuple
+%LCLop __ [__] :__senum1s_Struct_Arr, int -> _senum1s_Struct
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop hasta : -> _eenum2e_Enum
+%LCLop null : -> char
+%LCLop pasta : -> _eenum2e_Enum
+%LCLop yasta : -> _eenum2e_Enum
+%LCLop __ \select a :_senum0s_Struct_Tuple -> int
+%LCLop __ \select a :_senum0s_Struct -> _int_Obj
+%LCLop __ \select a :_senum1s_Struct_Tuple -> int
+%LCLop __ \select a :_senum1s_Struct -> _int_Obj
+%LCLop __ \select b :_senum0s_Struct_Tuple -> int
+%LCLop __ \select b :_senum0s_Struct -> _int_Obj
+%LCLop __ \select b :_senum1s_Struct_Tuple -> int
+%LCLop __ \select b :_senum1s_Struct -> _int_Obj
+%LCLop __ \field_arrow a :__senum0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow a :__senum1s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow b :__senum0s_Struct_Ptr -> _int_Obj
+%LCLop __ \field_arrow b :__senum1s_Struct_Ptr -> _int_Obj
+%LCLop __ \select c :_senum1s_Struct_Tuple -> int
+%LCLop __ \select c :_senum1s_Struct -> _int_Obj
+%LCLop __ \field_arrow c :__senum1s_Struct_Ptr -> _int_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __senum0s_Struct_Ptr
+%LCLop NIL : -> __senum1s_Struct_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__senum0s_Struct_Ptr, int -> __senum0s_Struct_Ptr
+%LCLop __ + __  :int, __senum0s_Struct_Ptr -> __senum0s_Struct_Ptr
+%LCLop __ + __  :__senum1s_Struct_Ptr, int -> __senum1s_Struct_Ptr
+%LCLop __ + __  :int, __senum1s_Struct_Ptr -> __senum1s_Struct_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__senum0s_Struct_Ptr, int -> __senum0s_Struct_Ptr
+%LCLop __ - __  :__senum0s_Struct_Ptr, __senum0s_Struct_Ptr -> int
+%LCLop __ - __  :__senum1s_Struct_Ptr, int -> __senum1s_Struct_Ptr
+%LCLop __ - __  :__senum1s_Struct_Ptr, __senum1s_Struct_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :_eenum0e_Enum -> int
+%LCLop sizeof :_eenum1e_Enum -> int
+%LCLop sizeof :__ietag_Enum -> int
+%LCLop sizeof :_eenum2e_Enum -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :__senum0s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__senum0s_Struct_Arr, int -> bool
+%LCLop isSub :__senum1s_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :__senum1s_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLenumConst one _eenum0e_Enum
+%LCLenumConst two _eenum0e_Enum
+%LCLenumConst three _eenum0e_Enum
+%LCLtype etype _etype exposed
+%LCLenumConst cero _eenum1e_Enum
+%LCLenumConst uno _eenum1e_Enum
+%LCLenumConst dos _eenum1e_Enum
+%LCLtype stype _stype exposed
+%LCLenumConst siete __ietag_Enum
+%LCLtype itype _itype exposed
+%LCLtype st _st exposed
+%LCLtype st2 _st2 exposed
+%LCLenumConst hasta _eenum2e_Enum
+%LCLenumConst pasta _eenum2e_Enum
+%LCLenumConst yasta _eenum2e_Enum
+%LCLSymbolTableEnd
diff --git a/test/enum.out b/test/enum.out
new file mode 100644
index 0000000..7491c1e
--- /dev/null
+++ b/test/enum.out
@@ -0,0 +1,72 @@
+
+enum.c:2:16: Enumerator member cero declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:16: Specification of cero: enum { cero, uno, dos }
+enum.c:2:22: Enumerator member uno declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:22: Specification of uno: enum { cero, uno, dos }
+enum.c:2:27: Enumerator member dos declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:27: Specification of dos: enum { cero, uno, dos }
+enum.c:2:39: Enum stype declared with members { cero, uno, dos, tres } but
+                specified with members { cero, uno, dos }
+   enum.lcl:2:33: Specification of stype
+enum.c:4:22: Enumerator member siete declared with inconsistent type:
+                enum _itag { siete }
+   enum.lcl:3:23: Specification of siete: enum _ietag { siete }
+enum.c:6:34: Structure st2 declared with fields { int a; int b; }, specified
+                with fields { int a; int b; int c; }
+   enum.lcl:6:41: Specification of st2
+   enum.lcl:7:1: Field present in specification, missing in declaration: int c
+enum.c: (in function f)
+enum.c:15:7: Value a[] used before definition
+enum.c:23:6: Missing cases in switch: two, three
+enum.c:30:12: Case in switch not mtype member: three
+enum.c:36:8: Missing case in switch: threem
+enum.c:38:10: Duplicate case in switch: one
+enum.c:47:2: Path with no return in function declared to return int
+enum.c:51:8: Enumerator member hasta declared with inconsistent type:
+                enum { hasta, pasta, yummy }
+   enum.lcl:8:8: Specification of hasta: enum { hasta, pasta, yasta }
+enum.c:51:15: Enumerator member pasta declared with inconsistent type:
+                 enum { hasta, pasta, yummy }
+   enum.lcl:8:15: Specification of pasta: enum { hasta, pasta, yasta }
+enum.lcl:3:9: Enum tag enum _ietag specified but not defined
+enum.lcl:8:22: Enum member yasta specified but not defined
+
+Finished LCLint checking --- 16 code errors found, as expected
+
+enum.c:2:16: Enumerator member cero declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:16: Specification of cero: enum { cero, uno, dos }
+enum.c:2:22: Enumerator member uno declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:22: Specification of uno: enum { cero, uno, dos }
+enum.c:2:27: Enumerator member dos declared with inconsistent type:
+                enum { cero, uno, dos, tres }
+   enum.lcl:2:27: Specification of dos: enum { cero, uno, dos }
+enum.c:2:39: Enum stype declared with members { cero, uno, dos, tres } but
+                specified with members { cero, uno, dos }
+   enum.lcl:2:33: Specification of stype
+enum.c:4:22: Enumerator member siete declared with inconsistent type:
+                enum _itag { siete }
+   enum.lcl:3:23: Specification of siete: enum _ietag { siete }
+enum.c:6:34: Structure st2 declared with fields { int a; int b; }, specified
+                with fields { int a; int b; int c; }
+   enum.lcl:6:41: Specification of st2
+   enum.lcl:7:1: Field present in specification, missing in declaration: int c
+enum.c: (in function f)
+enum.c:15:7: Value a[] used before definition
+enum.c:30:12: Case in switch not mtype member: three
+enum.c:38:10: Duplicate case in switch: one
+enum.c:47:2: Path with no return in function declared to return int
+enum.c:51:8: Enumerator member hasta declared with inconsistent type:
+                enum { hasta, pasta, yummy }
+   enum.lcl:8:8: Specification of hasta: enum { hasta, pasta, yasta }
+enum.c:51:15: Enumerator member pasta declared with inconsistent type:
+                 enum { hasta, pasta, yummy }
+   enum.lcl:8:15: Specification of pasta: enum { hasta, pasta, yasta }
+enum.lcl:3:9: Enum tag enum _ietag specified but not defined
+enum.lcl:8:22: Enum member yasta specified but not defined
+
+Finished LCLint checking --- 14 code errors found, as expected
diff --git a/test/exports.c b/test/exports.c
new file mode 100644
index 0000000..bf8ea65
--- /dev/null
+++ b/test/exports.c
@@ -0,0 +1,8 @@
+# include "exports.h"
+
+int glob;
+
+int f(int a, int b)
+{
+  return (a + b);
+}
diff --git a/test/exports.expect b/test/exports.expect
new file mode 100644
index 0000000..d77c753
--- /dev/null
+++ b/test/exports.expect
@@ -0,0 +1,20 @@
+
+Warning: setting +typeuse redundant with current value
+exports.h:1:13: Type exported, but not specified: myint
+exports.h:3:12: Variable exported, but not specified: glob
+exports.h:5:12: Function exported, but not specified: f
+exports.h:1:13: Type myint declared but not used
+exports.h:3:12: Variable glob declared but not used
+   exports.c:3:5: Definition of glob
+exports.h:5:12: Function f declared but not used
+   exports.c:8:1: Definition of f
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+exports.h:1:13: Type exported, but not specified: myint
+exports.h:3:12: Variable exported, but not specified: glob
+exports.h:5:12: Function exported, but not specified: f
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
diff --git a/test/exports.h b/test/exports.h
new file mode 100644
index 0000000..c6a8681
--- /dev/null
+++ b/test/exports.h
@@ -0,0 +1,5 @@
+typedef int myint;
+
+extern int glob;
+
+extern int f(int a, int b);
diff --git a/test/exports.out b/test/exports.out
new file mode 100644
index 0000000..d77c753
--- /dev/null
+++ b/test/exports.out
@@ -0,0 +1,20 @@
+
+Warning: setting +typeuse redundant with current value
+exports.h:1:13: Type exported, but not specified: myint
+exports.h:3:12: Variable exported, but not specified: glob
+exports.h:5:12: Function exported, but not specified: f
+exports.h:1:13: Type myint declared but not used
+exports.h:3:12: Variable glob declared but not used
+   exports.c:3:5: Definition of glob
+exports.h:5:12: Function f declared but not used
+   exports.c:8:1: Definition of f
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+exports.h:1:13: Type exported, but not specified: myint
+exports.h:3:12: Variable exported, but not specified: glob
+exports.h:5:12: Function exported, but not specified: f
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
diff --git a/test/external.c b/test/external.c
new file mode 100644
index 0000000..532dd45
--- /dev/null
+++ b/test/external.c
@@ -0,0 +1,11 @@
+int func (int x, int y);
+int Func (int x, int y);
+
+int small1 (void);
+int small2 (void);
+
+int longfunction1 (void);
+int longfunction2 (void);
+
+static /*@unused@*/ int slongfunction1 (void);
+static /*@unused@*/ int slongfunction2 (void);
diff --git a/test/external.expect b/test/external.expect
new file mode 100644
index 0000000..68932d7
--- /dev/null
+++ b/test/external.expect
@@ -0,0 +1,52 @@
+
+Finished LCLint checking --- no code errors found
+
+external.c:2:5: External identifier Func is not distinguishable from func in
+                   the first 6 characters because alphabetical case is ignored
+   external.c:1:5: Declaration of func
+external.c:8:5: External identifier longfunction2 is not distinguishable from
+                   longfunction1 in the first 6 characters (longfu)
+   external.c:7:5: Declaration of longfunction1
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+external.c:2:5: External identifier Func is not distinguishable from func in
+                   the first 3 characters because alphabetical case is ignored
+   external.c:1:5: Declaration of func
+external.c:5:5: External identifier small2 is not distinguishable from small1
+                   in the first 3 characters (sma)
+   external.c:4:5: Declaration of small1
+external.c:8:5: External identifier longfunction2 is not distinguishable from
+                   longfunction1 in the first 3 characters (lon)
+   external.c:7:5: Declaration of longfunction1
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+external.c:2:5: External identifier Func is not distinguishable from func in
+                   the first 3 characters because alphabetical case is ignored
+   external.c:1:5: Declaration of func
+external.c:5:5: External identifier small2 is not distinguishable from small1
+                   in the first 3 characters (sma)
+   external.c:4:5: Declaration of small1
+external.c:8:5: External identifier longfunction2 is not distinguishable from
+                   longfunction1 in the first 3 characters (lon)
+   external.c:7:5: Declaration of longfunction1
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+external.c:2:5: External identifier Func is not distinguishable from func in
+                   the first 3 characters because alphabetical case is ignored
+   external.c:1:5: Declaration of func
+external.c:5:5: External identifier small2 is not distinguishable from small1
+                   in the first 3 characters (sma)
+   external.c:4:5: Declaration of small1
+external.c:7:5: External identifier longfunction1 is not distinguishable from
+    LONG_MAX in the first 3 characters because alphabetical case is ignored
+   load file ansi.lcd: Specification of LONG_MAX
+   One or more additional indistinguishable external names not reported
+external.c:8:5: External identifier longfunction2 is not distinguishable from
+    LONG_MAX in the first 3 characters because alphabetical case is ignored
+   load file ansi.lcd: Specification of LONG_MAX
+   One or more additional indistinguishable external names not reported
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/external.out b/test/external.out
new file mode 100644
index 0000000..68932d7
--- /dev/null
+++ b/test/external.out
@@ -0,0 +1,52 @@
+
+Finished LCLint checking --- no code errors found
+
+external.c:2:5: External identifier Func is not distinguishable from func in
+                   the first 6 characters because alphabetical case is ignored
+   external.c:1:5: Declaration of func
+external.c:8:5: External identifier longfunction2 is not distinguishable from
+                   longfunction1 in the first 6 characters (longfu)
+   external.c:7:5: Declaration of longfunction1
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+external.c:2:5: External identifier Func is not distinguishable from func in
+                   the first 3 characters because alphabetical case is ignored
+   external.c:1:5: Declaration of func
+external.c:5:5: External identifier small2 is not distinguishable from small1
+                   in the first 3 characters (sma)
+   external.c:4:5: Declaration of small1
+external.c:8:5: External identifier longfunction2 is not distinguishable from
+                   longfunction1 in the first 3 characters (lon)
+   external.c:7:5: Declaration of longfunction1
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+external.c:2:5: External identifier Func is not distinguishable from func in
+                   the first 3 characters because alphabetical case is ignored
+   external.c:1:5: Declaration of func
+external.c:5:5: External identifier small2 is not distinguishable from small1
+                   in the first 3 characters (sma)
+   external.c:4:5: Declaration of small1
+external.c:8:5: External identifier longfunction2 is not distinguishable from
+                   longfunction1 in the first 3 characters (lon)
+   external.c:7:5: Declaration of longfunction1
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+external.c:2:5: External identifier Func is not distinguishable from func in
+                   the first 3 characters because alphabetical case is ignored
+   external.c:1:5: Declaration of func
+external.c:5:5: External identifier small2 is not distinguishable from small1
+                   in the first 3 characters (sma)
+   external.c:4:5: Declaration of small1
+external.c:7:5: External identifier longfunction1 is not distinguishable from
+    LONG_MAX in the first 3 characters because alphabetical case is ignored
+   load file ansi.lcd: Specification of LONG_MAX
+   One or more additional indistinguishable external names not reported
+external.c:8:5: External identifier longfunction2 is not distinguishable from
+    LONG_MAX in the first 3 characters because alphabetical case is ignored
+   load file ansi.lcd: Specification of LONG_MAX
+   One or more additional indistinguishable external names not reported
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/fields.c b/test/fields.c
new file mode 100644
index 0000000..9f2c94e
--- /dev/null
+++ b/test/fields.c
@@ -0,0 +1,77 @@
+typedef struct 
+{
+  /*@owned@*/ int *x;
+  /*@owned@*/ int *y;
+  /*@dependent@*/ int *z;
+} *pair;
+
+extern /*@only@*/ /*@out@*/ void *smalloc (size_t);
+
+/*@only@*/ pair pair_create (void)
+{
+  pair p = (pair) smalloc (sizeof (*p));
+
+  p->x = smalloc (sizeof (int));
+  p->y = smalloc (sizeof (int));
+  p->z = p->y;
+
+  *(p->x) = 3;
+  *(p->y) = 12;
+
+  return p;
+}
+
+/*@only@*/ pair pair_create1 (void)
+{
+  pair p = (pair) smalloc (sizeof (*p));
+
+  p->x = smalloc (sizeof (int));
+  p->y = smalloc (sizeof (int));
+  p->z = p->y;
+  *(p->y) = 12;
+
+  *(p->x) = 3;
+  p->y = smalloc (sizeof (int));
+  *(p->y) = 12;
+
+  return p; /* 1. Returned storage p->z is only (should be dependant): p */
+}
+
+void mangle (/*@temp@*/ pair p)
+{
+  free (p->x);
+} /* 2. Released storage p->x reachable from parameter */
+
+void mangle2 (/*@temp@*/ pair p)
+{
+  free (p->x);
+  p->x = p->y; 
+} /* 3. Storage p->y reachable from parameter is dependant */
+
+/*@only@*/ pair mangle3 (/*@only@*/ pair p)
+{
+  free (p->x);
+  p->x = p->y;
+  return p; /* 4. Storage p->y reachable from return value is dependant (should be */
+}
+
+int f (pair p)
+{
+  p->x = NULL; /* 5. Only storage p->x not released before assignment: p->x = NULL */
+
+  return *(p->y);
+}
+
+void swap (pair p)
+{
+  int *tmp = p->x;
+
+  p->x = p->y;
+  p->y = tmp;
+}
+
+void mangleok (/*@temp@*/ pair p)
+{
+  int *loc = p->x;
+  *loc = 8;
+} 
diff --git a/test/fields.expect b/test/fields.expect
new file mode 100644
index 0000000..b958566
--- /dev/null
+++ b/test/fields.expect
@@ -0,0 +1,43 @@
+
+fields.c: (in function pair_create1)
+fields.c:37:10: Storage p->z reachable from return value is owned (should be
+                   dependent)
+   fields.c:34:3: Storage p->z becomes owned
+fields.c: (in function mangle)
+fields.c:43:2: Released storage p->x reachable from parameter at return point
+   fields.c:42:9: Storage p->x is released
+fields.c: (in function mangle2)
+fields.c:49:2: Storage p->y reachable from parameter is dependent (should be
+                  owned)
+   fields.c:48:3: Storage p->y becomes dependent
+fields.c: (in function mangle3)
+fields.c:55:10: Storage p->y reachable from return value is dependent (should
+                   be owned)
+   fields.c:54:3: Storage p->y becomes dependent
+fields.c: (in function f)
+fields.c:60:3: Owned storage p->x not released before assignment: p->x = NULL
+fields.c:62:18: Function returns with null storage derivable from parameter
+                   p->x
+   fields.c:60:10: Storage p->x becomes null
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+fields2.c: (in function pair_copy)
+fields2.c:21:16: Storage p->x reachable from parameter is kept (should be
+                    implicitly only)
+   fields2.c:17:3: Storage p->x becomes kept
+fields2.c:21:16: Storage p->y reachable from parameter is kept (should be
+                    implicitly only)
+   fields2.c:18:3: Storage p->y becomes kept
+fields2.c: (in function pair_create)
+fields2.c:30:3: Only storage p->y assigned to dependent: p->z = p->y
+fields2.c:35:10: Storage p->y reachable from return value is unqualified
+                    (should be implicitly only)
+fields2.c: (in function pair_swankle)
+fields2.c:43:14: Storage p->x reachable from passed parameter is kept (should
+                    be implicitly only): p
+   fields2.c:42:3: Storage p->x becomes kept
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
diff --git a/test/fields.out b/test/fields.out
new file mode 100644
index 0000000..b958566
--- /dev/null
+++ b/test/fields.out
@@ -0,0 +1,43 @@
+
+fields.c: (in function pair_create1)
+fields.c:37:10: Storage p->z reachable from return value is owned (should be
+                   dependent)
+   fields.c:34:3: Storage p->z becomes owned
+fields.c: (in function mangle)
+fields.c:43:2: Released storage p->x reachable from parameter at return point
+   fields.c:42:9: Storage p->x is released
+fields.c: (in function mangle2)
+fields.c:49:2: Storage p->y reachable from parameter is dependent (should be
+                  owned)
+   fields.c:48:3: Storage p->y becomes dependent
+fields.c: (in function mangle3)
+fields.c:55:10: Storage p->y reachable from return value is dependent (should
+                   be owned)
+   fields.c:54:3: Storage p->y becomes dependent
+fields.c: (in function f)
+fields.c:60:3: Owned storage p->x not released before assignment: p->x = NULL
+fields.c:62:18: Function returns with null storage derivable from parameter
+                   p->x
+   fields.c:60:10: Storage p->x becomes null
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+fields2.c: (in function pair_copy)
+fields2.c:21:16: Storage p->x reachable from parameter is kept (should be
+                    implicitly only)
+   fields2.c:17:3: Storage p->x becomes kept
+fields2.c:21:16: Storage p->y reachable from parameter is kept (should be
+                    implicitly only)
+   fields2.c:18:3: Storage p->y becomes kept
+fields2.c: (in function pair_create)
+fields2.c:30:3: Only storage p->y assigned to dependent: p->z = p->y
+fields2.c:35:10: Storage p->y reachable from return value is unqualified
+                    (should be implicitly only)
+fields2.c: (in function pair_swankle)
+fields2.c:43:14: Storage p->x reachable from passed parameter is kept (should
+                    be implicitly only): p
+   fields2.c:42:3: Storage p->x becomes kept
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
diff --git a/test/fields2.c b/test/fields2.c
new file mode 100644
index 0000000..5e40451
--- /dev/null
+++ b/test/fields2.c
@@ -0,0 +1,47 @@
+typedef struct 
+{
+  int *x;
+  int *y;
+  /*@dependent@*/ int *z;
+} *pair;
+
+extern void pair_keep (/*@keep@*/ pair p);
+
+extern /*@only@*/ /*@out@*/ void *smalloc (size_t);
+extern /*@partial@*/ pair pair_part (void);
+
+/*@only@*/ pair pair_copy (pair p)
+{
+  pair ret = (pair) smalloc (sizeof (*ret));
+
+  ret->x = p->x;
+  ret->y = p->y;
+  ret->z = p->z;
+
+  return (ret); /* 1. Storage p->x reachable from parameter is kept (should be only) */
+}               /* 2. Storage p->y reachable from parameter is kept (should be only) */
+
+/*@only@*/ pair pair_create (void)
+{
+  pair p = (pair) smalloc (sizeof (*p));
+
+  p->x = smalloc (sizeof (int));
+  p->y = smalloc (sizeof (int));
+  p->z = p->y; /* 3. Only storage p->y assigned to dependent: p->z = p-y */
+
+  *(p->x) = 3;
+  *(p->y) = 12;
+
+  return p; /* 4. Storage p->y reachable from return value is unqualified */
+}
+
+pair pair_swankle (/*@keep@*/ pair p)
+{
+  pair ret = pair_part ();
+ 
+  ret->x = p->x;
+  pair_keep (p); /* 5. Storage p->x reachable from passed parameter is kept */ 
+  p->x = smalloc (sizeof (int));
+  *p->x = 3;
+  return ret;
+}
diff --git a/test/fields3.c b/test/fields3.c
new file mode 100644
index 0000000..416bbd3
--- /dev/null
+++ b/test/fields3.c
@@ -0,0 +1,40 @@
+typedef struct 
+{
+  int *x;
+  int *y;
+} *pair;
+
+void pair_free (/*@only@*/ pair p)
+{
+  int i = 3;
+
+  free (p->x);
+
+  if (i < 2)
+    {
+      *(p->y) = 3;
+      i++;
+    }
+
+  free (p->y);
+  free (p);
+}
+
+void pair_free2 (/*@only@*/ pair p)
+{
+  int i = 3;
+
+  free (p->x);
+
+  if (i < 2)
+    {
+      *(p->y) = 3;
+    }
+  else
+    {
+      *(p->y) = 12;
+    }
+
+  free (p->y);
+  free (p);
+}
diff --git a/test/flags.c b/test/flags.c
new file mode 100644
index 0000000..3cf623f
--- /dev/null
+++ b/test/flags.c
@@ -0,0 +1,18 @@
+int x = 'c';
+
+/*@-linelen 25@*/
+
+int y = 'c';
+
+/*@+linelen 13@*/
+/*@+internalnamelen 2@*/
+
+int xx1;
+int xx2;
+
+/*@=linelen 25@*/
+/*@-linelen 70@*/
+/*@-dump asdf@*/
+/*@-macrovarprefix@*/
+/*@-macrovarprefix    @*/
+/*@-linelen asdf@*/
diff --git a/test/flags.expect b/test/flags.expect
new file mode 100644
index 0000000..a38bd24
--- /dev/null
+++ b/test/flags.expect
@@ -0,0 +1,42 @@
+
+flags.c:1:9: Variable x initialized to type char, expects int: 'c'
+flags.c:5:9: Variable y
+    initialized to type
+    char, expects int:
+    'c'
+flags.c:7:18: Warning:
+    Value for linelen
+    must be at least 20
+    (given 13)
+flags.c:11:5:
+    Internal identifier
+    xx2 is not
+    distinguishable
+    from xx1 in the
+    first 2 characters
+    (xx)
+   flags.c:10:5:
+   Declaration of
+   xx1
+flags.c:13:18:
+    Stylized comment
+    attempts to restore
+    flag linelen.  A
+    flag for setting a
+    value cannot be
+    restored.
+flags.c:15:17: Stylized comment attempts to set global flag dump.  A
+                  global flag cannot be set locally.
+flags.c:16:22: Flag macrovarprefix (in stylized comment) must be
+                  followed by an argument
+flags.c:17:26: Flag macrovarprefix (in stylized comment) must be
+                  followed by an argument
+flags.c:18:20: Flag linelen must be followed by a positive number
+                  number.  Followed by asdf
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+flags.c:1:9: Variable x initialized to type char, expects int: 'c'
+flags.c:5:9: Variable y initialized to type char, expects int: 'c'
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/flags.out b/test/flags.out
new file mode 100644
index 0000000..a38bd24
--- /dev/null
+++ b/test/flags.out
@@ -0,0 +1,42 @@
+
+flags.c:1:9: Variable x initialized to type char, expects int: 'c'
+flags.c:5:9: Variable y
+    initialized to type
+    char, expects int:
+    'c'
+flags.c:7:18: Warning:
+    Value for linelen
+    must be at least 20
+    (given 13)
+flags.c:11:5:
+    Internal identifier
+    xx2 is not
+    distinguishable
+    from xx1 in the
+    first 2 characters
+    (xx)
+   flags.c:10:5:
+   Declaration of
+   xx1
+flags.c:13:18:
+    Stylized comment
+    attempts to restore
+    flag linelen.  A
+    flag for setting a
+    value cannot be
+    restored.
+flags.c:15:17: Stylized comment attempts to set global flag dump.  A
+                  global flag cannot be set locally.
+flags.c:16:22: Flag macrovarprefix (in stylized comment) must be
+                  followed by an argument
+flags.c:17:26: Flag macrovarprefix (in stylized comment) must be
+                  followed by an argument
+flags.c:18:20: Flag linelen must be followed by a positive number
+                  number.  Followed by asdf
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+flags.c:1:9: Variable x initialized to type char, expects int: 'c'
+flags.c:5:9: Variable y initialized to type char, expects int: 'c'
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/funcpointer.c b/test/funcpointer.c
new file mode 100644
index 0000000..7c86347
--- /dev/null
+++ b/test/funcpointer.c
@@ -0,0 +1,80 @@
+# include 
+
+typedef int ***(**f1)(void);       /* f1 is a pointer to a function taking no args, returning int ***  */
+typedef int (*f2)(void);           /* f2 is a function taking no args, returning an int */
+typedef int **(*f3)(void);         /* f3 is a function taking no args, returning a pointer to a pointer to an int */
+typedef int *(*f4[])(void);        /* f4 is an array of functions taking no args, returning pointers to ints */
+typedef int *(f5)(int);            /* f5 is a function taking an int, returning a pointer to an int */ 
+typedef int *(*f6(int,int))(int);  /* f6 is a function taking 2 int args, returns a function taking an int and
+				     returning a pointer to an int */
+             /* gcc complains if the pointer before f6 is omitted.  why? */
+/*@-paramuse*/
+int func1(void) { return 3;}
+int *func2(void) { return (int *)malloc(sizeof(int));} 
+     /* 1. Possibly null storage returned as non-null
+     ** 2. Returned storage not completely defined (allocated only)
+     */
+/*@null@*/ int **func3(void) { return (int **)0;}
+/*@null@*/ int ***func4(void) { return (int ***)0;}
+int *func5(int i) { return &i; } /* 3. Immediate address &i returned as only: &i */
+     /* 4. Return value references stack-allocated storage i: &i */
+int *(*func6(int x, int y))(int) { return func5; }
+
+int main (void)
+{
+  f1 t1; f2 t2; f3 t3; f3 *t3p; f4 *t4; f6 t6;
+  int x, *xp, ***xppp;
+
+  t1 = func1; /* 5. Assignment of int () * to f1 */        
+  t1 = func4; /* 6. Assignment of int * * * () * to f1 */
+  *t1 = func4; 
+
+  t2 = func1; 
+  t2 = func2; /* 7. Assignment of int * () * to f2 */
+
+  t3 = func3;  
+  t3p = func3; /* 8. Assignment of int * * () * to f3 *: t3p = func3 */
+
+  t4 = func2; /* 9. Assignment of int * () * to f4 *: t4 = func2 */
+
+  xppp = (*t1)(); 
+  x = (t1)(); /* 10. Call to non-function (type f1): (t1) */
+  x = (t2)(); 
+  xp = (*t1)(); /* 11. Assignment of int * * * to int *: xp = (*t1)() */
+  xp = (t4)(); /* 12. Call to non-function (type f4 *): (t4) */
+
+  t6 = func1; /* 13. Assignment of int () * to f6: t6 = func1 */
+  t6 = func6; /* funcpointer.c:43: invalid lvalue in assignment */ 
+  (void) (t6)(); /* 14. Function (t6) called with 0 args, expects 2 */
+  (void) (t6)(3); /* 15. Function (t6) called with 1 args, expects 2 */
+  (void) ((t6)(3))(); /* 16. Function (t6) called with 1 args, expects 2 */
+                      /* 17. Function ((t6)(3)) called with 0 args, expects 1 */
+  (void) ((t6)(5, 3))(7); 
+  return 3;
+}
+  
+/* function pointer bug, provided by Marc Espie */
+
+typedef void (*func)(void);
+
+void (*f[10])(void);
+func g[10];
+
+void a(void)
+{
+}
+
+void b(void)
+{
+  func *h;
+  
+  h = f;
+  f[0] = a;
+  g[0] = a;
+  f[1] = g[0];
+  h[2] = a;
+}
+
+
+
+
diff --git a/test/funcpointer.expect b/test/funcpointer.expect
new file mode 100644
index 0000000..33be783
--- /dev/null
+++ b/test/funcpointer.expect
@@ -0,0 +1,32 @@
+
+funcpointer.c: (in function func2)
+funcpointer.c:13:27: Possibly null storage returned as non-null:
+                        (int *)malloc(sizeof(int))
+funcpointer.c:13:27: Returned storage not completely defined (storage pointed
+    to by [result of malloc] is undefined): (int *)malloc(sizeof(int))
+funcpointer.c: (in function func5)
+funcpointer.c:19:28: Immediate address &i returned as implicitly only: &i
+funcpointer.c: (in function main)
+funcpointer.c:28:3: Assignment of [function (void) returns int] to f1:
+                       t1 = func1
+funcpointer.c:29:3: Assignment of [function (void) returns int ***] to f1:
+                       t1 = func4
+funcpointer.c:33:3: Assignment of [function (void) returns int *] to f2:
+                       t2 = func2
+funcpointer.c:36:3: Assignment of [function (void) returns int **] to f3 *:
+                       t3p = func3
+funcpointer.c:38:3: Assignment of [function (void) returns int *] to f4 *:
+                       t4 = func2
+funcpointer.c:41:7: Call to non-function (type f1): (t1)
+funcpointer.c:43:3: Assignment of int *** to int *: xp = (*t1)()
+funcpointer.c:44:8: Call to non-function (type f4 *): (t4)
+funcpointer.c:46:3: Assignment of [function (void) returns int] to f6:
+                       t6 = func1
+funcpointer.c:46:3: Invalid left-hand side of assignment (function type f6): t6
+funcpointer.c:47:3: Invalid left-hand side of assignment (function type f6): t6
+funcpointer.c:48:10: Function (t6) called with 0 args, expects 2
+funcpointer.c:49:10: Function (t6) called with 1 args, expects 2
+funcpointer.c:50:11: Function (t6) called with 1 args, expects 2
+funcpointer.c:50:10: Function ((t6)(3)) called with 0 args, expects 1
+
+Finished LCLint checking --- 18 code errors found, as expected
diff --git a/test/funcpointer.out b/test/funcpointer.out
new file mode 100644
index 0000000..33be783
--- /dev/null
+++ b/test/funcpointer.out
@@ -0,0 +1,32 @@
+
+funcpointer.c: (in function func2)
+funcpointer.c:13:27: Possibly null storage returned as non-null:
+                        (int *)malloc(sizeof(int))
+funcpointer.c:13:27: Returned storage not completely defined (storage pointed
+    to by [result of malloc] is undefined): (int *)malloc(sizeof(int))
+funcpointer.c: (in function func5)
+funcpointer.c:19:28: Immediate address &i returned as implicitly only: &i
+funcpointer.c: (in function main)
+funcpointer.c:28:3: Assignment of [function (void) returns int] to f1:
+                       t1 = func1
+funcpointer.c:29:3: Assignment of [function (void) returns int ***] to f1:
+                       t1 = func4
+funcpointer.c:33:3: Assignment of [function (void) returns int *] to f2:
+                       t2 = func2
+funcpointer.c:36:3: Assignment of [function (void) returns int **] to f3 *:
+                       t3p = func3
+funcpointer.c:38:3: Assignment of [function (void) returns int *] to f4 *:
+                       t4 = func2
+funcpointer.c:41:7: Call to non-function (type f1): (t1)
+funcpointer.c:43:3: Assignment of int *** to int *: xp = (*t1)()
+funcpointer.c:44:8: Call to non-function (type f4 *): (t4)
+funcpointer.c:46:3: Assignment of [function (void) returns int] to f6:
+                       t6 = func1
+funcpointer.c:46:3: Invalid left-hand side of assignment (function type f6): t6
+funcpointer.c:47:3: Invalid left-hand side of assignment (function type f6): t6
+funcpointer.c:48:10: Function (t6) called with 0 args, expects 2
+funcpointer.c:49:10: Function (t6) called with 1 args, expects 2
+funcpointer.c:50:11: Function (t6) called with 1 args, expects 2
+funcpointer.c:50:10: Function ((t6)(3)) called with 0 args, expects 1
+
+Finished LCLint checking --- 18 code errors found, as expected
diff --git a/test/glob.c b/test/glob.c
new file mode 100644
index 0000000..f0a4687
--- /dev/null
+++ b/test/glob.c
@@ -0,0 +1,28 @@
+int x;
+int y;
+int z;
+
+int useGlob (int a)
+{
+  a = x + y;
+  return (a + x + y) ;
+}
+
+int dontuseGlob (int a)
+{
+  return (x + a);
+}
+
+int unspec (int a)
+{
+  return (y + z + a);
+}
+
+int callsUseGlob (int a)
+{
+  return (useGlob(a));
+}
+
+
+
+
diff --git a/test/glob.expect b/test/glob.expect
new file mode 100644
index 0000000..fc0a32c
--- /dev/null
+++ b/test/glob.expect
@@ -0,0 +1,31 @@
+
+glob.c: (in function useGlob)
+glob.lcl:3: Global z listed but not used
+glob.c: (in function dontuseGlob)
+glob.c:13:11: Undocumented use of global x
+glob.c: (in function callsUseGlob)
+glob.c:23:11: Called procedure useGlob may access global y
+glob.c:23:11: Called procedure useGlob may access global z
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+glob.c: (in function dontuseGlob)
+glob.c:13:11: Undocumented use of global x
+glob.c: (in function callsUseGlob)
+glob.c:23:11: Called procedure useGlob may access global y
+glob.c:23:11: Called procedure useGlob may access global z
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+glob.c: (in function useGlob)
+glob.lcl:3: Global z listed but not used
+glob.c: (in function dontuseGlob)
+glob.c:13:11: Undocumented use of global x
+glob.c: (in function unspec)
+glob.c:18:11: Undocumented use of global y
+glob.c:18:15: Undocumented use of global z
+glob.c: (in function callsUseGlob)
+glob.c:23:11: Called procedure useGlob may access global y
+glob.c:23:11: Called procedure useGlob may access global z
+
+Finished LCLint checking --- 6 code errors found, as expected
diff --git a/test/glob.lcl b/test/glob.lcl
new file mode 100644
index 0000000..285f126
--- /dev/null
+++ b/test/glob.lcl
@@ -0,0 +1,16 @@
+int x, y, z;
+
+int useGlob (int a) int x, y, z; 
+{
+   ensures true;
+}
+
+int dontuseGlob (int a)
+{
+   ensures true;
+}
+
+int callsUseGlob (int a) int x;
+{
+  ensures true;
+}
diff --git a/test/glob.lcs b/test/glob.lcs
new file mode 100644
index 0000000..fb57a24
--- /dev/null
+++ b/test/glob.lcs
@@ -0,0 +1,129 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _int_Obj obj int nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLvar x _int_Obj
+%LCLvar y _int_Obj
+%LCLvar z _int_Obj
+%LCLfcn useGlob : int -> int 
+%LCLfcnGlobals _int_Obj x; _int_Obj y; _int_Obj z; 
+%LCLfcn dontuseGlob : int -> int 
+%LCLfcnGlobals 
+%LCLfcn callsUseGlob : int -> int 
+%LCLfcnGlobals _int_Obj x; 
+%LCLSymbolTableEnd
diff --git a/test/glob.out b/test/glob.out
new file mode 100644
index 0000000..fc0a32c
--- /dev/null
+++ b/test/glob.out
@@ -0,0 +1,31 @@
+
+glob.c: (in function useGlob)
+glob.lcl:3: Global z listed but not used
+glob.c: (in function dontuseGlob)
+glob.c:13:11: Undocumented use of global x
+glob.c: (in function callsUseGlob)
+glob.c:23:11: Called procedure useGlob may access global y
+glob.c:23:11: Called procedure useGlob may access global z
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+glob.c: (in function dontuseGlob)
+glob.c:13:11: Undocumented use of global x
+glob.c: (in function callsUseGlob)
+glob.c:23:11: Called procedure useGlob may access global y
+glob.c:23:11: Called procedure useGlob may access global z
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+glob.c: (in function useGlob)
+glob.lcl:3: Global z listed but not used
+glob.c: (in function dontuseGlob)
+glob.c:13:11: Undocumented use of global x
+glob.c: (in function unspec)
+glob.c:18:11: Undocumented use of global y
+glob.c:18:15: Undocumented use of global z
+glob.c: (in function callsUseGlob)
+glob.c:23:11: Called procedure useGlob may access global y
+glob.c:23:11: Called procedure useGlob may access global z
+
+Finished LCLint checking --- 6 code errors found, as expected
diff --git a/test/globals.c b/test/globals.c
new file mode 100644
index 0000000..1c0bca1
--- /dev/null
+++ b/test/globals.c
@@ -0,0 +1,22 @@
+int imp;
+/*@checked@*/ int check;
+/*@unchecked@*/ int uncheck;
+/*@checkedstrict@*/ int checkstrict;
+/*@checked@*/ /*@checked@*/ int doubled; /* 1. Redundant checked qualifier on doubled */
+/*@checked@*/ /*@unchecked@*/ int contradict; /* 2. Contradictory checked and unchecked qualifiers on contradict */
+
+void noglobs (void)
+{
+  imp++;         /* if +globunspec +allglobals */
+  check++;       /* if +globunspec */
+  uncheck++;
+  checkstrict++; /* 3. Unauthorized use of global checkstrict */
+}
+
+void specglobs (void) /*@*/
+{
+  imp++;   /* +  if +allglobals, +impcheckedglobals */
+  check++; /* 4. Unauthorized use of global check */
+  uncheck++;
+  checkstrict++; /* 5. Unauthorized use of global checkstrict */
+}
diff --git a/test/globals.expect b/test/globals.expect
new file mode 100644
index 0000000..a8b08b3
--- /dev/null
+++ b/test/globals.expect
@@ -0,0 +1,61 @@
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+globals.c: (in function noglobs)
+globals.c:13:3: Undocumented use of global checkstrict
+globals.c: (in function specglobs)
+globals.c:19:3: Undocumented use of global check
+globals.c:21:3: Undocumented use of global checkstrict
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+globals.c: (in function noglobs)
+globals.c:13:3: Undocumented use of global checkstrict
+globals.c: (in function specglobs)
+globals.c:18:3: Undocumented use of global imp
+globals.c:19:3: Undocumented use of global check
+globals.c:21:3: Undocumented use of global checkstrict
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+globals.c: (in function noglobs)
+globals.c:13:3: Undocumented use of global checkstrict
+globals.c: (in function specglobs)
+globals.c:18:3: Undocumented use of global imp
+globals.c:19:3: Undocumented use of global check
+globals.c:21:3: Undocumented use of global checkstrict
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+globals.c: (in function noglobs)
+globals.c:11:3: Undocumented use of global check
+globals.c:13:3: Undocumented use of global checkstrict
+globals.c: (in function specglobs)
+globals.c:19:3: Undocumented use of global check
+globals.c:21:3: Undocumented use of global checkstrict
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+globals.c: (in function noglobs)
+globals.c:10:3: Undocumented use of global imp
+globals.c:11:3: Undocumented use of global check
+globals.c:13:3: Undocumented use of global checkstrict
+globals.c: (in function specglobs)
+globals.c:18:3: Undocumented use of global imp
+globals.c:19:3: Undocumented use of global check
+globals.c:21:3: Undocumented use of global checkstrict
+
+Finished LCLint checking --- 8 code errors found, as expected
diff --git a/test/globals.out b/test/globals.out
new file mode 100644
index 0000000..a8b08b3
--- /dev/null
+++ b/test/globals.out
@@ -0,0 +1,61 @@
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+globals.c: (in function noglobs)
+globals.c:13:3: Undocumented use of global checkstrict
+globals.c: (in function specglobs)
+globals.c:19:3: Undocumented use of global check
+globals.c:21:3: Undocumented use of global checkstrict
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+globals.c: (in function noglobs)
+globals.c:13:3: Undocumented use of global checkstrict
+globals.c: (in function specglobs)
+globals.c:18:3: Undocumented use of global imp
+globals.c:19:3: Undocumented use of global check
+globals.c:21:3: Undocumented use of global checkstrict
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+globals.c: (in function noglobs)
+globals.c:13:3: Undocumented use of global checkstrict
+globals.c: (in function specglobs)
+globals.c:18:3: Undocumented use of global imp
+globals.c:19:3: Undocumented use of global check
+globals.c:21:3: Undocumented use of global checkstrict
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+globals.c: (in function noglobs)
+globals.c:11:3: Undocumented use of global check
+globals.c:13:3: Undocumented use of global checkstrict
+globals.c: (in function specglobs)
+globals.c:19:3: Undocumented use of global check
+globals.c:21:3: Undocumented use of global checkstrict
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+globals.c:5:41: Redundant checked qualifier on doubled
+globals.c:6:46: Contradictory checked and unchecked qualifiers on contradict
+globals.c: (in function noglobs)
+globals.c:10:3: Undocumented use of global imp
+globals.c:11:3: Undocumented use of global check
+globals.c:13:3: Undocumented use of global checkstrict
+globals.c: (in function specglobs)
+globals.c:18:3: Undocumented use of global imp
+globals.c:19:3: Undocumented use of global check
+globals.c:21:3: Undocumented use of global checkstrict
+
+Finished LCLint checking --- 8 code errors found, as expected
diff --git a/test/help.expect b/test/help.expect
new file mode 100644
index 0000000..19632a3
--- /dev/null
+++ b/test/help.expect
@@ -0,0 +1,985 @@
+
+Source files are .c, .h and .lcl files.  If there is no suffix,
+   LCLint will look for .c and .lcl.
+
+Use lclint -help  for more information
+
+Topics:
+
+   annotations (describes source-code annotations)
+   comments (describes control comments)
+   flags (describes flag categories)
+   flags  (describes flags in category)
+   flags all (short description of all flags)
+   flags alpha (list all flags alphabetically)
+   flags full (full description of all flags)
+   mail (information on mailing lists)
+   modes (show mode settings)
+   parseerrors (help on handling parser errors)
+   prefixcodes (character codes in namespace prefixes)
+   references (sources for more information)
+   vars (environment variables)
+   version (information on compilation, maintainer)
+
+
+Cannot find standard library: ansi.lcd
+     Check LARCH_PATH environment variable.
+Continuing without LCL init file: lclinit.lci
+Continuing without LSL init file: lslinit.lsi
+Unable to find CTrait.syms or CTrait.lsl.  Check LARCH_PATH environment
+variable.
+
+Source files are .c, .h and .lcl files.  If there is no suffix,
+   LCLint will look for .c and .lcl.
+
+Use lclint -help  for more information
+
+Topics:
+
+   annotations (describes source-code annotations)
+   comments (describes control comments)
+   flags (describes flag categories)
+   flags  (describes flags in category)
+   flags all (short description of all flags)
+   flags alpha (list all flags alphabetically)
+   flags full (full description of all flags)
+   mail (information on mailing lists)
+   modes (show mode settings)
+   parseerrors (help on handling parser errors)
+   prefixcodes (character codes in namespace prefixes)
+   references (sources for more information)
+   vars (environment variables)
+   version (information on compilation, maintainer)
+
+
+Unrecognized option: asdf
+
+
+Finished LCLint checking --- no code processed
+
+Warning: setting +boolint redundant with current value
+
+Finished LCLint checking --- no code processed
+
+   D              
+   I                
+   S                
+   U              
+   abstract                    
+   accessall                   
+   accessczech                 
+   accessczechoslovak          
+   accessfile                  
+   accessmodule                
+   accessslovak                
+   aliasunique                 
+   allblock                    
+   allempty                    
+   allglobs                    
+   allimponly                  
+   allmacros                   
+   ansilib                     
+   ansilimits                  
+   ansireserved                
+   ansireservedinternal        
+   assignexpose                
+   badflag                     
+   bitwisesigned               
+   bool                        
+   boolcompare                 
+   boolfalse                   
+   boolint                     
+   boolops                     
+   booltrue                    
+   booltype                    
+   branchstate                 
+   casebreak                   
+   castexpose                  
+   castfcnptr                  
+   charindex                   
+   charint                     
+   charintliteral              
+   charunsignedchar            
+   checkedglobalias            
+   checkmodglobalias           
+   checkstrictglobalias        
+   checkstrictglobs            
+   codeimponly                 
+   commentchar                 
+   compdef                     
+   compdestroy                 
+   compmempass                 
+   constmacros                 
+   constprefix                 
+   constprefixexclude          
+   constuse                    
+   continuecomment             
+   controlnestdepth            
+   cppnames                    
+   czech                       
+   czechconsts                 
+   czechfcns                   
+   czechmacros                 
+   czechoslovak                
+   czechoslovakconsts          
+   czechoslovakfcns            
+   czechoslovakmacros          
+   czechoslovaktypes           
+   czechoslovakvars            
+   czechtypes                  
+   czechvars                   
+   declundef                   
+   deepbreak                   
+   deparrays                   
+   dependenttrans              
+   distinctexternalnames       
+   distinctinternalnames       
+   dump                        
+   duplicatequals              
+   elseifcomplete              
+   enumindex                   
+   enumint                     
+   enummembers                 
+   enummemuse                  
+   enumprefix                  
+   enumprefixexclude           
+   evalorder                   
+   evalorderuncon              
+   exitarg                     
+   expect                      
+   exportany                   
+   exportconst                 
+   exportfcn                   
+   exportheader                
+   exportheadervar             
+   exportiter                  
+   exportlocal                 
+   exportmacro                 
+   exporttype                  
+   exportvar                   
+   exposetrans                 
+   externalnamecaseinsensitive 
+   externalnamelen             
+   externalprefix              
+   externalprefixexclude       
+   f                           
+   fcnderef                    
+   fcnmacros                   
+   fcnuse                      
+   fielduse                    
+   filestaticprefix            
+   filestaticprefixexclude     
+   firstcase                   
+   fixedformalarray            
+   floatdouble                 
+   forblock                    
+   forcehints                  
+   forempty                    
+   formalarray                 
+   formatcode                  
+   formattype                  
+   forwarddecl                 
+   freshtrans                  
+   fullinitblock               
+   globalias                   
+   globalprefix                
+   globalprefixexclude         
+   globimponly                 
+   globnoglobs                 
+   globs                       
+   globsimpmodsnothing         
+   globstate                   
+   globuse                     
+   gnuextensions               
+   hasyield                    
+   help                        
+   hints                       
+   i                           
+   ifblock                     
+   ifempty                     
+   ignorequals                 
+   ignoresigns                 
+   immediatetrans              
+   impabstract                 
+   impcheckedglobs             
+   impcheckedspecglobs         
+   impcheckedstatics           
+   impcheckedstrictglobs       
+   impcheckedstrictspecglobs   
+   impcheckedstrictstatics     
+   impcheckmodglobs            
+   impcheckmodinternals        
+   impcheckmodspecglobs        
+   impcheckmodstatics          
+   impconj                     
+   impouts                     
+   imptype                     
+   includenest                 
+   incompletetype              
+   incondefs                   
+   incondefslib                
+   infloops                    
+   infloopsuncon               
+   internalglobs               
+   internalglobsnoglobs        
+   internalnamecaseinsensitive 
+   internalnamelen             
+   internalnamelookalike       
+   iterprefix                  
+   iterprefixexclude           
+   keeptrans                   
+   kepttrans                   
+   larchpath                   
+   lclexpect                   
+   lclimportdir                
+   lcs                         
+   lh                          
+   libmacros                   
+   likelybool                  
+   limit                       
+   linelen                     
+   lintcomments                
+   load                        
+   localprefix                 
+   localprefixexclude          
+   longintegral                
+   longsignedintegral          
+   longunsignedintegral        
+   longunsignedunsignedintegral
+   loopexec                    
+   looploopbreak               
+   looploopcontinue            
+   loopswitchbreak             
+   macroassign                 
+   macroconstdecl              
+   macrodecl                   
+   macroempty                  
+   macrofcndecl                
+   macromatchname              
+   macroparams                 
+   macroparens                 
+   macroredef                  
+   macrostmt                   
+   macrounrecog                
+   macrovarprefix              
+   macrovarprefixexclude       
+   maintype                    
+   matchanyintegral            
+   matchfields                 
+   mayaliasunique              
+   memchecks                   
+   memimp                      
+   memtrans                    
+   misscase                    
+   modfilesys                  
+   modglobs                    
+   modglobsnomods              
+   modglobsunchecked           
+   modinternalstrict           
+   modnomods                   
+   modobserver                 
+   modobserveruncon            
+   mods                        
+   modsimpnoglobs              
+   modstrictglobsnomods        
+   moduncon                    
+   modunconnomods              
+   modunspec                   
+   mustdefine                  
+   mustfree                    
+   mustmod                     
+   mustnotalias                
+   mutrep                      
+   namechecks                  
+   needspec                    
+   nestcomment                 
+   nestedextern                
+   neverinclude                
+   newdecl                     
+   newreftrans                 
+   nextlinemacros              
+   noaccess                    
+   nocomments                  
+   noeffect                    
+   noeffectuncon               
+   nof                         
+   nolib                       
+   noparams                    
+   noret                       
+   null                        
+   nullassign                  
+   nullderef                   
+   nullpass                    
+   nullptrarith                
+   nullret                     
+   nullstate                   
+   numenummembers              
+   numliteral                  
+   numstructfields             
+   observertrans               
+   oldstyle                    
+   onlytrans                   
+   onlyunqglobaltrans          
+   overload                    
+   ownedtrans                  
+   paramimptemp                
+   paramuse                    
+   parenfileformat             
+   partial                     
+   passunknown                 
+   posixlib                    
+   posixstrictlib              
+   predassign                  
+   predbool                    
+   predboolint                 
+   predboolothers              
+   predboolptr                 
+   protoparammatch             
+   protoparamname              
+   protoparamprefix            
+   protoparamprefixexclude     
+   ptrarith                    
+   ptrcompare                  
+   ptrnegate                   
+   quiet                       
+   readonlystrings             
+   readonlytrans               
+   realcompare                 
+   redecl                      
+   redef                       
+   refcounttrans               
+   relaxquals                  
+   relaxtypes                  
+   repeatunrecog               
+   repexpose                   
+   retalias                    
+   retexpose                   
+   retimponly                  
+   retval                      
+   retvalbool                  
+   retvalint                   
+   retvalother                 
+   sefparams                   
+   sefuncon                    
+   shadow                      
+   sharedtrans                 
+   shiftsigned                 
+   showallconjs                
+   showalluses                 
+   showcolumn                  
+   showfunc                    
+   showscan                    
+   showsummary                 
+   singleinclude               
+   sizeofformalarray           
+   sizeoftype                  
+   skipansiheaders             
+   skipposixheaders            
+   skipsysheaders              
+   slovak                      
+   slovakconsts                
+   slovakfcns                  
+   slovakmacros                
+   slovaktypes                 
+   slovakvars                  
+   specglobimponly             
+   specimponly                 
+   specmacros                  
+   specretimponly              
+   specstructimponly           
+   specundecl                  
+   specundef                   
+   stackref                    
+   staticinittrans             
+   statictrans                 
+   stats                       
+   strictbranchstate           
+   strictdestroy               
+   strictlib                   
+   strictops                   
+   strictusereleased           
+   stringliterallen            
+   structimponly               
+   supcounts                   
+   switchloopbreak             
+   switchswitchbreak           
+   syntax                      
+   sysdirerrors                
+   sysdirexpandmacros          
+   sysdirs                     
+   sysunrecog                  
+   tagprefix                   
+   tagprefixexclude            
+   temptrans                   
+   timedist                    
+   tmpcomments                 
+   tmpdir                      
+   topuse                      
+   trytorecover                
+   type                        
+   typeprefix                  
+   typeprefixexclude           
+   typeuse                     
+   uncheckedglobalias          
+   uncheckedmacroprefix        
+   uncheckedmacroprefixexclude 
+   uniondef                    
+   unixlib                     
+   unixstrictlib               
+   unqualifiedinittrans        
+   unqualifiedtrans            
+   unreachable                 
+   unrecog                     
+   unrecogcomments             
+   unusedspecial               
+   usedef                      
+   usereleased                 
+   usestderr                   
+   usevarargs                  
+   varuse                      
+   voidabstract                
+   warnflags                   
+   warnlintcomments            
+   warnmissingglobs            
+   warnmissingglobsnoglobs     
+   warnposixheaders            
+   warnunixlib                 
+   whichlib                    
+   whileblock                  
+   whileempty                  
+
+
+bool --- boolean type is abstract
+likelybool --- type name is probably a boolean type but does not match default
+boolean type name, "bool", and alternate name is not set
+impabstract --- assume user type definitions are abstract (unless
+/*@concrete@*/ is used)
+accessall --- set accessmodule, accessfile and accessczech
+accessmodule --- allow access to abstract types in definition module
+accessfile --- allow access to abstract types by file name convention
+accessczech --- allow access to abstract types by czech naming convention
+accessslovak --- allow access to abstract types by slovak naming convention
+accessczechoslovak --- allow access to abstract types by czechoslovak naming
+convention
+abstract --- data abstraction barriers
+mutrep --- representation of mutable type has sharing semantics
+globalias --- function returns with global aliasing external state (sets
+checkstrictglobalias, checkedglobalias, checkmodglobalias and
+uncheckedglobalias)
+checkstrictglobalias --- function returns with a checkstrict global aliasing
+external state
+checkedglobalias --- function returns with a checked global aliasing external
+state
+checkmodglobalias --- function returns with a checkmod global aliasing external
+state
+uncheckedglobalias --- function returns with an unchecked global aliasing
+external state
+aliasunique --- unique parameter is aliased
+mayaliasunique --- unique parameter may be aliased
+mustnotalias --- temp storage aliased at return point or scope exit
+retalias --- function returns alias to parameter or global
+noparams --- function declaration has no parameter list
+oldstyle --- old style function definition
+gnuextensions --- support some gnu (gcc) language extensions
+usevarargs --- non-standard  included
+warnposixheaders --- a POSIX header is included, but the POSIX library is not
+used
+exitarg --- argument to exit has implementation defined behavior
+evalorder --- code has unspecified or implementation-dependent behavior because
+of order of evaluation
+evalorderuncon --- code involving call to unspecified function has undefined or
+implementation-dependent behavior
+boolfalse --- set name of boolean false (default FALSE)
+booltype --- set name of boolean type (default bool)
+booltrue --- set name of boolean true (default TRUE)
+noaccess --- ignore access comments
+nocomments --- ignore all stylized comments
+unrecogcomments --- stylized comment is unrecognized
+continuecomment --- line continuation marker (\) in comment before */ on same
+line
+nestcomment --- comment begins inside comment
+tmpcomments --- interpret t comments (ignore errors in lines marked with
+/*@t@*/
+lintcomments --- interpret traditional lint comments (/*FALLTHROUGH*/,
+/*NOTREACHED*/)
+warnlintcomments --- print a warning and suggest an alternative when a
+traditional lint comment is used
+declundef --- function or variable declared but never defined
+specundef --- function or variable specified but never defined
+specundecl --- function or variable specified but never declared in a source
+file
+loopexec --- assume all loops execute at least once
+infloops --- likely infinite loop is detected
+infloopsuncon --- likely infinite loop is detected (may result from
+unconstrained function)
+deepbreak --- break inside nested while or for or switch
+looploopbreak --- break inside nested while or for
+switchloopbreak --- break in loop inside switch
+loopswitchbreak --- break in switch inside loop
+switchswitchbreak --- break in switch inside switch
+looploopcontinue --- continue inside nested loop
+unreachable --- unreachable code detected
+whileempty --- a while statement has no body
+whileblock --- the body of a while statement is not a block
+forempty --- a for statement has no body
+forblock --- the body of a for statement is not a block
+ifempty --- an if statement has no body
+ifblock --- the body of an if statement is not a block
+allempty --- an if, while or for statement has no body (sets ifempty,
+whileempty and forempty
+allblock --- the body of an if, while or for statement is not a block (sets
+ifblock, whileblock and forblock)
+elseifcomplete --- if ... else if chains must have final else
+noret --- path with no return detected in non-void function
+casebreak --- non-empty case in a switch without preceding break
+misscase --- switch on enum type missing case for some value
+firstcase --- first statement in switch is not a case
+shadow --- declaration reuses name visible in outer scope
+incondefslib --- function, variable or constant defined in a library is
+redefined with inconsistent type
+overload --- library function overloaded
+nestedextern --- an extern declaration is inside a function scope
+redecl --- function or variable redeclared
+redef --- function or variable redefined
+incondefs --- function, variable or constant redefined with inconsistent type
+imptype --- variable declaration has unknown (implicitly int) type
+matchfields --- struct or enum type redefined with inconsistent fields or
+members
+usedef --- use before definition
+impouts --- pointer parameters to unspecified functions may be implicit out
+parameters
+tmpdir --- set directory for writing temp files
+larchpath --- set path for searching for library files (overrides LARCH_PATH
+environment variable)
+lclimportdir --- set directory to search for LCL import files (overrides
+LCLIMPORTDIR)
+sysdirs --- set directories for system files (default /usr/include). Separate
+directories with colons (e.g., "/usr/include:/usr/local/lib"). Flag settings
+propagate to files in a system directory. If -sysdirerrors is set, no errors
+are reported for files in system directories.
+skipansiheaders --- prevent inclusion of header files in a system directory
+with names that match standard ANSI headers. The symbolic information in the
+standard library is used instead.  Flag in effect only if a library including
+the ANSI library is loaded.  The ANSI headers are:
+assert, ctype, errno, float, limits, locale, math, setjmp, signal, stdarg,
+stddef, stdio, stdlib, strings, string, time, and wchar.
+skipposixheaders --- prevent inclusion of header files in a system directory
+with names that match standard POSIX headers. The symbolic information in the
+posix library is used instead.  The POSIX headers are:
+dirent, fcntl, grp, pwd, termios, sys/stat, sys/times, sys/types, sys/utsname,
+sys/wait, unistd, and utime.
+sysdirerrors --- report errors in files in system directories (set by -sysdirs)
+sysdirexpandmacros --- expand macros in system directories regardless of other
+settings, except for macros corresponding to names defined in a load library
+I --- add to C include path
+S --- add to spec path
+quiet --- suppress herald and error count
+usestderr --- send error messages to standard error (instead of standard out)
+showsummary --- show summary of all errors reported and suppressed
+showscan --- show file names are they are processed
+stats --- display lines processed and time
+timedist --- display time distribution
+showalluses --- show sorted list of uses of all globals
+noeffect --- statement with no effect
+noeffectuncon --- statement with no effect (except possibly through call to
+unconstrained function)
+exportany --- variable, function or type exported but not specified
+exportfcn --- function exported but not specified
+exportmacro --- expanded macro exported but not specified
+exporttype --- type definition exported but not specified
+exportvar --- variable exported but not specified
+exportconst --- constant exported but not specified
+exportiter --- constant exported but not specified
+repexpose --- abstract representation is exposed (sets assignexpose, retexpose,
+and castexpose)
+retexpose --- abstract representation is exposed (return values only)
+assignexpose --- abstract representation is exposed (assignments only)
+castexpose --- abstract representation is exposed through a cast
+linelen --- set length of messages (number of chars)
+showcolumn --- show column number where error is found
+parenfileformat --- show column number where error is found
+showfunc --- show name of function containing error
+showallconjs --- show all possible types
+impconj --- make all alternate types implicit (useful for making system
+libraries
+expect --- expect  code errors
+lclexpect --- expect  spec errors
+partial --- check as partial system (-specundef, -declundef, -exportlocal,
+don't check macros in headers without corresponding .c files)
+globs --- undocumented use of a checked global variable
+globuse --- global listed for a function not used
+internalglobs --- use of internalState
+internalglobsnoglobs --- use of internalState (in function with no globals
+list)
+warnmissingglobs --- global variable used in modifies clause is not listed in
+globals list
+warnmissingglobsnoglobs --- global variable used in modifies clause in a
+function with no globals list
+globnoglobs --- use of checked global in a function with no globals list or
+specification
+allglobs --- report use and modification errors for globals not annotated with
+unchecked
+checkstrictglobs --- report use and modification errors for checkedstrict
+globals
+impcheckedspecglobs --- assume checked qualifier for unqualified global
+declarations in .lcl files
+impcheckmodspecglobs --- assume checkmod qualifier for unqualified global
+declarations in .lcl files
+impcheckedstrictspecglobs --- assume checkmod qualifier for unqualified global
+declarations in .lcl files
+impcheckedglobs --- assume checked qualifier for unqualified global
+declarations
+impcheckmodglobs --- assume checkmod qualifier for unqualified global
+declarations
+impcheckedstrictglobs --- assume checkedstrict qualifier for unqualified global
+declarations
+impcheckedstatics --- assume checked qualifier for unqualified file static
+declarations
+impcheckmodstatics --- assume checkmod qualifier for unqualified file static
+declarations
+impcheckmodinternals --- assume checkmod qualifier for unqualified local static
+declarations (for internal state modifications)
+impcheckedstrictstatics --- assume checkedstrict qualifier for unqualified file
+static declarations
+modglobs --- undocumented modification of a checked global variable
+modglobsnomods --- undocumented modification of a checked global variable in a
+function declared with no modifies clause
+modstrictglobsnomods --- undocumented modification of a strict checked global
+variable in a function declared with no modifies clause
+modglobsunchecked --- undocumented modification of an unchecked checked global
+variable
+lh --- generate .lh files
+lcs --- generate .lcs files
+singleinclude --- optimize header inclusion to eliminate redundant includes
+neverinclude --- optimize header inclusion to not include any header files
+skipsysheaders --- do not include header files in system directories (set by
+-sysdirs)
+warnflags --- warn when command line sets flag to default value in mode
+warnunixlib --- warn when the unix library is used
+badflag --- a flag is not recognized or used in an incorrect way
+forcehints --- provide hints for all errors reported
+help --- -help  will describe flags
+hints --- provide hints on using lclint (hint only reported for first related
+error)
+retval --- return value ignored (sets retvalint, retvalbool and retvalother)
+retvalother --- return value of type other than bool or int ignored
+retvalbool --- return value of type bool ignored
+retvalint --- return value of type int ignored
+f --- load options file (default ~/.lclintrc not loaded)
+i --- set LCL initilization file
+nof --- do not read options file
+needspec --- information in specifications is not also included in syntactic
+comments
+newdecl --- report new global declarations in source files
+hasyield --- iter declaration has no yield parameters
+dump --- save state for merging (default suffix .lcd)
+load --- load state from dump file (default suffix .lcd)
+nolib --- do not load standard library
+ansilib --- use ANSI (ISO) standard library
+strictlib --- interpret standard library strictly
+unixlib --- use UNIX (sort-of) standard library
+unixstrictlib --- use strict version of UNIX (sort-of) library
+posixlib --- use POSIX standard library
+posixstrictlib --- use strict POSIX standard library
+whichlib --- show standard library filename
+commentchar --- set marker character for syntactic comments (default is '@')
+allmacros --- sets fcnmacros and constmacros
+libmacros --- check all macros with declarations in library as functions
+specmacros --- check all macros corresponding to specified functions or
+constants
+fcnmacros --- check all macros with parameter lists as functions
+constmacros --- check all macros without parameter lists as constants
+macromatchname --- macro definition does not match iter or constant declaration
+nextlinemacros --- the line after a constant or iter declaration must be a
+macro definition
+macrostmt --- macro definition is syntactically not equivalent to function
+macroempty --- macro definition for is empty
+macroparams --- macro parameter not used exactly once
+macroassign --- assignment to a macro parameter
+sefparams --- a parameter with side-effects is passed as a sef parameter
+sefuncon --- a parameter with unconstrained side-effects is passed as a sef
+parameter
+macroparens --- macro parameter used without parentheses (in potentially
+dangerous context)
+macrodecl --- macro without prototype or specification (sets macrofcndecl and
+macroconstdecl)
+macrofcndecl --- parameterized macro without prototype or specification
+macroconstdecl --- non-parameterized macro without prototype or specification
+macroredef --- macro redefined
+macrounrecog --- unrecognized identifier in macro
+stackref --- external reference to stack-allocated storage is created
+usereleased --- storage used after release
+strictusereleased --- element used after it may have been released
+compdef --- parameter, return value or global completely defined
+compmempass --- actual parameter matches alias kind of formal parameter
+completely 
+mustdefine --- out storage not defined before return or scope exit
+uniondef --- at least one field of a union must be defined
+memimp --- memory errors for unqualified storage
+paramimptemp --- assume unannotated parameter is temp
+allimponly --- sets globimponly, retimponly, structimponly, specglobimponly,
+specretimponly and specstructimponly
+codeimponly --- sets globimponly, retimponly and structimponly
+specimponly --- sets specglobimponly, specretimponly and specstructimponly
+globimponly --- assume unannotated global storage is only
+retimponly --- assume unannotated returned storage is only
+structimponly --- assume unannotated structure field is only
+specglobimponly --- assume unannotated global storage is only
+specretimponly --- assume unannotated returned storage is only
+specstructimponly --- assume unannotated structure field is only
+deparrays --- array elements are dependent storage
+compdestroy --- all only references derivable from void pointer out only
+parameter are released
+strictdestroy --- report complete destruction errors for array elements that
+may have been released
+mustfree --- only storage not released before return or scope exit
+branchstate --- storage has inconsistent states of alternate paths through a
+branch
+strictbranchstate --- storage through array fetch has inconsistent states of
+alternate paths through a branch
+memchecks --- sets all dynamic memory checking flags (memimplicit, mustfree,
+mustdefine, mustnotalias, null, memtrans)
+memtrans --- memory transfer errors (sets all *trans flags)
+exposetrans --- exposure transfer errors
+observertrans --- observer transfer errors
+dependenttrans --- dependent transfer errors
+newreftrans --- new reference transfer to reference counted reference
+onlytrans --- only storage transferred to non-only reference (memory leak)
+onlyunqglobaltrans --- only storage transferred to an unqualified global or
+static reference (memory leak)
+ownedtrans --- owned storage transferred to non-owned reference (memory leak)
+freshtrans --- fresh storage transferred to non-only reference (memory leak)
+sharedtrans --- shared storage transferred to non-shared reference
+temptrans --- temp storage transferred to non-temporary reference
+kepttrans --- kept storage transferred to non-temporary reference
+keeptrans --- keep storage transferred inconsistently
+immediatetrans --- an immediate address (result of &) is transferred
+inconsistently
+refcounttrans --- reference counted storage is transferred in an inconsistent
+way
+statictrans --- static storage is transferred in an inconsistent way
+unqualifiedtrans --- unqualified storage is transferred in an inconsistent way
+staticinittrans --- static storage is used as an initial value in an
+inconsistent way
+unqualifiedinittrans --- unqualified storage is used as an initial value in an
+inconsistent way
+readonlystrings --- string literals are read-only (error if one is modified or
+released)
+readonlytrans --- report memory transfer errors for initializations to
+read-only string literals
+passunknown --- passing a value as an un-annotated parameter clears its
+annotation
+mods --- unspecified modification of caller-visible state
+mustmod --- specified modification is not detected
+modobserver --- possible modification of observer storage
+modobserveruncon --- possible modification of observer storage through
+unconstrained call
+modinternalstrict --- possible modification of internal storage through
+function call
+modfilesys --- report undocumented file system modifications (applies to
+unspecified functions if modnomods is set)
+modunspec --- modification in unspecified functions (sets modnomods,
+modglobunspec and modstrictglobsunspec)
+modnomods --- modification in a function with no modifies clause
+moduncon --- possible modification through a call to an unconstrained function
+modunconnomods --- possible modification through a call to an unconstrained
+function in a function with no modifies clause
+globsimpmodsnothing --- functions declared with a globals list but no modifies
+clause are assumed to modify nothing
+modsimpnoglobs --- functions declared with a modifies clause but no globals
+list are assumed to use no globals
+namechecks --- controls name checking without changing other settings
+czech --- czech naming convention (sets accessczech, czechfunctions, czechvars,
+czechconstants, czechenums, and czechmacros)
+czechfcns --- czech naming convention violated in a function or iterator
+declaration
+czechvars --- czech naming convention violated in a variable declaration
+czechmacros --- czech naming convention violated in an expanded macro name
+czechconsts --- czech naming convention violated in a constant declaration
+czechtypes --- czech naming convention violated in a user-defined type
+definition
+slovak --- slovak naming convention violated
+slovakfcns --- slovak naming convention violated in a function or iterator
+declaration
+slovakmacros --- slovak naming convention violated in an expanded macro name
+slovakvars --- slovak naming convention violated in a variable declaration
+slovakconsts --- slovak naming convention violated in a constant declaration
+slovaktypes --- slovak naming convention violated in a use-defined type
+definition
+czechoslovak --- czech or slovak naming convention violated
+czechoslovakfcns --- czechoslovak naming convention violated in a function or
+iterator declaration
+czechoslovakmacros --- czechoslovak naming convention violated in an expanded
+macro name
+czechoslovakvars --- czechoslovak naming convention violated in a variable
+declaration
+czechoslovakconsts --- czechoslovak naming convention violated in a constant
+declaration
+czechoslovaktypes --- czechoslovak naming convention violated in a user-defined
+type definition
+ansireserved --- external name conflicts with name reserved for system or
+standard library
+cppnames --- external or internal name is a C++ keyword or reserved word
+ansireservedinternal --- internal name conflicts with name reserved for system
+or standard library
+distinctexternalnames --- external name is not distinguishable from another
+external name using the number of significant characters
+externalnamelen --- set the number of significant characters in an external
+name
+externalnamecaseinsensitive --- alphabetic comparisons for external names are
+case-insensitive
+distinctinternalnames --- internal name is not distinguishable from another
+internal name using the number of significant characters
+internalnamelen --- set the number of significant characters in an internal
+name
+internalnamecaseinsensitive --- set whether case is significant an internal
+names (-internalnamecaseinsensitive means case is significant)
+internalnamelookalike --- lookalike characters match in internal names
+macrovarprefix --- set namespace prefix for variables declared in a macro body
+macrovarprefixexclude --- the macrovarprefix may not be used for non-macro
+variables
+tagprefix --- set namespace prefix for struct, union and enum tags
+tagprefixexclude --- the tagprefix may not be used for non-tag identifiers
+enumprefix --- set namespace prefix for enum members
+enumprefixexclude --- the enumprefix may not be used for non-enum member
+identifiers
+filestaticprefix --- set namespace prefix for file static declarations
+filestaticprefixexclude --- the filestaticprefix may not be used for
+identifiers that are not file static
+globalprefix --- set namespace prefix for global variables
+globalprefixexclude --- the globalprefix may not be used for non-global
+identifiers
+typeprefix --- set namespace prefix for user-defined types
+typeprefixexclude --- the typeprefix may not be used for identifiers that are
+not type names
+externalprefix --- set namespace prefix for external identifiers
+externalprefixexclude --- the externalprefix may not be used for non-external
+identifiers
+localprefix --- set namespace prefix for local variables
+localprefixexclude --- the localprefix may not be used for non-local
+identifiers
+uncheckedmacroprefix --- set namespace prefix for unchecked macros
+uncheckedmacroprefixexclude --- the uncheckmacroprefix may not be used for
+identifiers that are not unchecked macros
+constprefix --- set namespace prefix for constants
+constprefixexclude --- the constprefix may not be used for non-constant
+identifiers
+iterprefix --- set namespace prefix for iterators
+iterprefixexclude --- the iterprefix may not be used for non-iter identifiers
+protoparamprefix --- set namespace prefix for parameters in function prototype
+declarations
+protoparamname --- a parameter in a function prototype has a name
+protoparammatch --- the name of a parameter in a function prototype and
+corresponding declaration must match (after removing the protoparamprefix
+protoparamprefixexclude --- the protoparamprefix may not be used for
+non-declaraction parameter identifiers
+controlnestdepth --- set maximum nesting depth of compound statements,
+iteration control structures, and selection control structures (ANSI minimum is
+15)
+stringliterallen --- set maximum length of string literals (ANSI minimum is
+509)
+numstructfields --- set maximum number of fields in a struct or union (ANSI
+minimum is 127)
+numenummembers --- set maximum number of members of an enum (ANSI minimum is
+127)
+includenest --- set maximum number of nested #include files
+ansilimits --- check for violations of standard limits (controlnestdepth,
+stringliterallen, includenest, numstructfields, numenummembers)
+null --- misuses of null pointer
+nullderef --- possible dereferencce of null pointer
+fcnderef --- dereferencce of a function type
+nullpass --- possibly null pointer passed as formal with no null annotation
+nullret --- possibly null pointer returned as result with no null annotation
+nullstate --- possibly null pointer reachable from a reference with no null
+annotation
+nullassign --- inconsistent assignment or initialization involving null pointer
+boolcompare --- comparison between bools (dangerous because of multiple TRUE
+values)
+realcompare --- dangerous comparison between reals (dangerous because of
+inexact floating point representations)
+ptrarith --- arithmetic involving pointer and integer
+nullptrarith --- arithmetic involving possibly null pointer and integer
+ptrcompare --- comparison between pointer and number
+strictops --- primitive operation does not type check strictly
+bitwisesigned --- a bitwise logical operator does not have unsigned operands
+shiftsigned --- a shift operator does not have unsigned operands
+boolops --- primitive operation (!, && or ||) does not has a boolean argument
+ptrnegate --- allow ! to be used on pointer operand
+sizeoftype --- sizeof operator has a type argument
+sizeofformalarray --- sizeof operator has an array formal parameter argument
+fixedformalarray --- formal parameter of type array is declared with size
+incompletetype --- formal parameter has an incomplete type
+formalarray --- formal parameter is an array
+predassign --- condition test (if, while or for) is an assignment
+predbool --- type of condition test (if, while or for) not bool (sets
+predboolint, predboolptr and predboolothers)
+predboolint --- type of condition test (if, while or for) is an integral type
+predboolothers --- type of condition test (if, while or for) not bool, int or
+pointer
+predboolptr --- type of condition test (if, while or for) is a pointer
+D --- passed to pre-processor
+U --- passed to pre-processor
+globstate --- returns with global in inconsistent state (null or undefined)
+supcounts --- The number of errors detected does not match number in
+/*@i@*/.
+limit --- limit  consecutive repeated errors
+syntax --- syntax error in parsing
+trytorecover --- try to recover from parse error
+type --- type mismatch
+fullinitblock --- initializer sets all fields
+enummembers --- enum members must be int values
+maintype --- type of main does not match expected type
+formattype --- type-mismatch in parameter corresponding to format code in a
+printf or scanf-like function
+formatcode --- invalid format code in format string for printf or scanf-like
+function
+forwarddecl --- forward declarations of pointers to abstract representation
+match abstract type
+voidabstract --- void * matches pointers to abstract types, casting ok
+(dangerous)
+castfcnptr --- a pointer to a function is cast to a pointer to void (or vice
+versa)
+charindex --- char can be used to index arrays
+enumindex --- enum can be used to index arrays
+boolint --- bool and int are equivalent
+charint --- char and int are equivalent
+enumint --- enum and int are equivalent
+floatdouble --- float and double are equivalent
+ignorequals --- ignore type qualifiers (long, short, unsigned)
+duplicatequals --- report duplicate type qualifiers (e.g., long long)
+ignoresigns --- ignore signs in type comparisons (unsigned matches signed)
+numliteral --- int literals can be reals
+charintliteral --- character constants (e.g., 'a') can be used as ints
+relaxquals --- report qualifier mismatches only if dangerous
+relaxtypes --- allow all numeric types to match
+charunsignedchar --- allow char and unsigned char types to match
+matchanyintegral --- allow any intergral type to match an arbitrary integral
+type (e.g., dev_t)
+longunsignedintegral --- allow long unsigned type to match an arbitrary
+integral type (e.g., dev_t)
+longintegral --- allow long type to match an arbitrary integral type (e.g.,
+dev_t)
+longunsignedunsignedintegral --- allow long unsigned type to match an arbitrary
+unsigned integral type (e.g., size_t)
+longsignedintegral --- allow long type to match an arbitrary signed integral
+type (e.g., ssize_t)
+zeroptr --- 0 is treated as a pointer
+repeatunrecog --- do not suppress repeated unrecognized identifier messages
+(instead of only reporting the first error)
+sysunrecog --- report unrecognized identifiers with system (__) prefix
+unrecog --- unrecognized identifier
+topuse --- declaration at top level not used
+exportlocal --- a declaration is exported but not used outside this module
+exportheader --- a declaration is exported but does not appear in a header file
+exportheadervar --- a variable declaration is exported but does not appear in a
+header file
+fielduse --- field of structure type not used
+enummemuse --- member of an enum type not used
+constuse --- constant declared but not used
+fcnuse --- function declared but not used
+paramuse --- function parameter not used 
+typeuse --- type declared but not used
+varuse --- variable declared but not used
+unusedspecial --- unused declaration in special file (corresponding to .l or .y
+file)
+
diff --git a/test/help.out b/test/help.out
new file mode 100644
index 0000000..19632a3
--- /dev/null
+++ b/test/help.out
@@ -0,0 +1,985 @@
+
+Source files are .c, .h and .lcl files.  If there is no suffix,
+   LCLint will look for .c and .lcl.
+
+Use lclint -help  for more information
+
+Topics:
+
+   annotations (describes source-code annotations)
+   comments (describes control comments)
+   flags (describes flag categories)
+   flags  (describes flags in category)
+   flags all (short description of all flags)
+   flags alpha (list all flags alphabetically)
+   flags full (full description of all flags)
+   mail (information on mailing lists)
+   modes (show mode settings)
+   parseerrors (help on handling parser errors)
+   prefixcodes (character codes in namespace prefixes)
+   references (sources for more information)
+   vars (environment variables)
+   version (information on compilation, maintainer)
+
+
+Cannot find standard library: ansi.lcd
+     Check LARCH_PATH environment variable.
+Continuing without LCL init file: lclinit.lci
+Continuing without LSL init file: lslinit.lsi
+Unable to find CTrait.syms or CTrait.lsl.  Check LARCH_PATH environment
+variable.
+
+Source files are .c, .h and .lcl files.  If there is no suffix,
+   LCLint will look for .c and .lcl.
+
+Use lclint -help  for more information
+
+Topics:
+
+   annotations (describes source-code annotations)
+   comments (describes control comments)
+   flags (describes flag categories)
+   flags  (describes flags in category)
+   flags all (short description of all flags)
+   flags alpha (list all flags alphabetically)
+   flags full (full description of all flags)
+   mail (information on mailing lists)
+   modes (show mode settings)
+   parseerrors (help on handling parser errors)
+   prefixcodes (character codes in namespace prefixes)
+   references (sources for more information)
+   vars (environment variables)
+   version (information on compilation, maintainer)
+
+
+Unrecognized option: asdf
+
+
+Finished LCLint checking --- no code processed
+
+Warning: setting +boolint redundant with current value
+
+Finished LCLint checking --- no code processed
+
+   D              
+   I                
+   S                
+   U              
+   abstract                    
+   accessall                   
+   accessczech                 
+   accessczechoslovak          
+   accessfile                  
+   accessmodule                
+   accessslovak                
+   aliasunique                 
+   allblock                    
+   allempty                    
+   allglobs                    
+   allimponly                  
+   allmacros                   
+   ansilib                     
+   ansilimits                  
+   ansireserved                
+   ansireservedinternal        
+   assignexpose                
+   badflag                     
+   bitwisesigned               
+   bool                        
+   boolcompare                 
+   boolfalse                   
+   boolint                     
+   boolops                     
+   booltrue                    
+   booltype                    
+   branchstate                 
+   casebreak                   
+   castexpose                  
+   castfcnptr                  
+   charindex                   
+   charint                     
+   charintliteral              
+   charunsignedchar            
+   checkedglobalias            
+   checkmodglobalias           
+   checkstrictglobalias        
+   checkstrictglobs            
+   codeimponly                 
+   commentchar                 
+   compdef                     
+   compdestroy                 
+   compmempass                 
+   constmacros                 
+   constprefix                 
+   constprefixexclude          
+   constuse                    
+   continuecomment             
+   controlnestdepth            
+   cppnames                    
+   czech                       
+   czechconsts                 
+   czechfcns                   
+   czechmacros                 
+   czechoslovak                
+   czechoslovakconsts          
+   czechoslovakfcns            
+   czechoslovakmacros          
+   czechoslovaktypes           
+   czechoslovakvars            
+   czechtypes                  
+   czechvars                   
+   declundef                   
+   deepbreak                   
+   deparrays                   
+   dependenttrans              
+   distinctexternalnames       
+   distinctinternalnames       
+   dump                        
+   duplicatequals              
+   elseifcomplete              
+   enumindex                   
+   enumint                     
+   enummembers                 
+   enummemuse                  
+   enumprefix                  
+   enumprefixexclude           
+   evalorder                   
+   evalorderuncon              
+   exitarg                     
+   expect                      
+   exportany                   
+   exportconst                 
+   exportfcn                   
+   exportheader                
+   exportheadervar             
+   exportiter                  
+   exportlocal                 
+   exportmacro                 
+   exporttype                  
+   exportvar                   
+   exposetrans                 
+   externalnamecaseinsensitive 
+   externalnamelen             
+   externalprefix              
+   externalprefixexclude       
+   f                           
+   fcnderef                    
+   fcnmacros                   
+   fcnuse                      
+   fielduse                    
+   filestaticprefix            
+   filestaticprefixexclude     
+   firstcase                   
+   fixedformalarray            
+   floatdouble                 
+   forblock                    
+   forcehints                  
+   forempty                    
+   formalarray                 
+   formatcode                  
+   formattype                  
+   forwarddecl                 
+   freshtrans                  
+   fullinitblock               
+   globalias                   
+   globalprefix                
+   globalprefixexclude         
+   globimponly                 
+   globnoglobs                 
+   globs                       
+   globsimpmodsnothing         
+   globstate                   
+   globuse                     
+   gnuextensions               
+   hasyield                    
+   help                        
+   hints                       
+   i                           
+   ifblock                     
+   ifempty                     
+   ignorequals                 
+   ignoresigns                 
+   immediatetrans              
+   impabstract                 
+   impcheckedglobs             
+   impcheckedspecglobs         
+   impcheckedstatics           
+   impcheckedstrictglobs       
+   impcheckedstrictspecglobs   
+   impcheckedstrictstatics     
+   impcheckmodglobs            
+   impcheckmodinternals        
+   impcheckmodspecglobs        
+   impcheckmodstatics          
+   impconj                     
+   impouts                     
+   imptype                     
+   includenest                 
+   incompletetype              
+   incondefs                   
+   incondefslib                
+   infloops                    
+   infloopsuncon               
+   internalglobs               
+   internalglobsnoglobs        
+   internalnamecaseinsensitive 
+   internalnamelen             
+   internalnamelookalike       
+   iterprefix                  
+   iterprefixexclude           
+   keeptrans                   
+   kepttrans                   
+   larchpath                   
+   lclexpect                   
+   lclimportdir                
+   lcs                         
+   lh                          
+   libmacros                   
+   likelybool                  
+   limit                       
+   linelen                     
+   lintcomments                
+   load                        
+   localprefix                 
+   localprefixexclude          
+   longintegral                
+   longsignedintegral          
+   longunsignedintegral        
+   longunsignedunsignedintegral
+   loopexec                    
+   looploopbreak               
+   looploopcontinue            
+   loopswitchbreak             
+   macroassign                 
+   macroconstdecl              
+   macrodecl                   
+   macroempty                  
+   macrofcndecl                
+   macromatchname              
+   macroparams                 
+   macroparens                 
+   macroredef                  
+   macrostmt                   
+   macrounrecog                
+   macrovarprefix              
+   macrovarprefixexclude       
+   maintype                    
+   matchanyintegral            
+   matchfields                 
+   mayaliasunique              
+   memchecks                   
+   memimp                      
+   memtrans                    
+   misscase                    
+   modfilesys                  
+   modglobs                    
+   modglobsnomods              
+   modglobsunchecked           
+   modinternalstrict           
+   modnomods                   
+   modobserver                 
+   modobserveruncon            
+   mods                        
+   modsimpnoglobs              
+   modstrictglobsnomods        
+   moduncon                    
+   modunconnomods              
+   modunspec                   
+   mustdefine                  
+   mustfree                    
+   mustmod                     
+   mustnotalias                
+   mutrep                      
+   namechecks                  
+   needspec                    
+   nestcomment                 
+   nestedextern                
+   neverinclude                
+   newdecl                     
+   newreftrans                 
+   nextlinemacros              
+   noaccess                    
+   nocomments                  
+   noeffect                    
+   noeffectuncon               
+   nof                         
+   nolib                       
+   noparams                    
+   noret                       
+   null                        
+   nullassign                  
+   nullderef                   
+   nullpass                    
+   nullptrarith                
+   nullret                     
+   nullstate                   
+   numenummembers              
+   numliteral                  
+   numstructfields             
+   observertrans               
+   oldstyle                    
+   onlytrans                   
+   onlyunqglobaltrans          
+   overload                    
+   ownedtrans                  
+   paramimptemp                
+   paramuse                    
+   parenfileformat             
+   partial                     
+   passunknown                 
+   posixlib                    
+   posixstrictlib              
+   predassign                  
+   predbool                    
+   predboolint                 
+   predboolothers              
+   predboolptr                 
+   protoparammatch             
+   protoparamname              
+   protoparamprefix            
+   protoparamprefixexclude     
+   ptrarith                    
+   ptrcompare                  
+   ptrnegate                   
+   quiet                       
+   readonlystrings             
+   readonlytrans               
+   realcompare                 
+   redecl                      
+   redef                       
+   refcounttrans               
+   relaxquals                  
+   relaxtypes                  
+   repeatunrecog               
+   repexpose                   
+   retalias                    
+   retexpose                   
+   retimponly                  
+   retval                      
+   retvalbool                  
+   retvalint                   
+   retvalother                 
+   sefparams                   
+   sefuncon                    
+   shadow                      
+   sharedtrans                 
+   shiftsigned                 
+   showallconjs                
+   showalluses                 
+   showcolumn                  
+   showfunc                    
+   showscan                    
+   showsummary                 
+   singleinclude               
+   sizeofformalarray           
+   sizeoftype                  
+   skipansiheaders             
+   skipposixheaders            
+   skipsysheaders              
+   slovak                      
+   slovakconsts                
+   slovakfcns                  
+   slovakmacros                
+   slovaktypes                 
+   slovakvars                  
+   specglobimponly             
+   specimponly                 
+   specmacros                  
+   specretimponly              
+   specstructimponly           
+   specundecl                  
+   specundef                   
+   stackref                    
+   staticinittrans             
+   statictrans                 
+   stats                       
+   strictbranchstate           
+   strictdestroy               
+   strictlib                   
+   strictops                   
+   strictusereleased           
+   stringliterallen            
+   structimponly               
+   supcounts                   
+   switchloopbreak             
+   switchswitchbreak           
+   syntax                      
+   sysdirerrors                
+   sysdirexpandmacros          
+   sysdirs                     
+   sysunrecog                  
+   tagprefix                   
+   tagprefixexclude            
+   temptrans                   
+   timedist                    
+   tmpcomments                 
+   tmpdir                      
+   topuse                      
+   trytorecover                
+   type                        
+   typeprefix                  
+   typeprefixexclude           
+   typeuse                     
+   uncheckedglobalias          
+   uncheckedmacroprefix        
+   uncheckedmacroprefixexclude 
+   uniondef                    
+   unixlib                     
+   unixstrictlib               
+   unqualifiedinittrans        
+   unqualifiedtrans            
+   unreachable                 
+   unrecog                     
+   unrecogcomments             
+   unusedspecial               
+   usedef                      
+   usereleased                 
+   usestderr                   
+   usevarargs                  
+   varuse                      
+   voidabstract                
+   warnflags                   
+   warnlintcomments            
+   warnmissingglobs            
+   warnmissingglobsnoglobs     
+   warnposixheaders            
+   warnunixlib                 
+   whichlib                    
+   whileblock                  
+   whileempty                  
+
+
+bool --- boolean type is abstract
+likelybool --- type name is probably a boolean type but does not match default
+boolean type name, "bool", and alternate name is not set
+impabstract --- assume user type definitions are abstract (unless
+/*@concrete@*/ is used)
+accessall --- set accessmodule, accessfile and accessczech
+accessmodule --- allow access to abstract types in definition module
+accessfile --- allow access to abstract types by file name convention
+accessczech --- allow access to abstract types by czech naming convention
+accessslovak --- allow access to abstract types by slovak naming convention
+accessczechoslovak --- allow access to abstract types by czechoslovak naming
+convention
+abstract --- data abstraction barriers
+mutrep --- representation of mutable type has sharing semantics
+globalias --- function returns with global aliasing external state (sets
+checkstrictglobalias, checkedglobalias, checkmodglobalias and
+uncheckedglobalias)
+checkstrictglobalias --- function returns with a checkstrict global aliasing
+external state
+checkedglobalias --- function returns with a checked global aliasing external
+state
+checkmodglobalias --- function returns with a checkmod global aliasing external
+state
+uncheckedglobalias --- function returns with an unchecked global aliasing
+external state
+aliasunique --- unique parameter is aliased
+mayaliasunique --- unique parameter may be aliased
+mustnotalias --- temp storage aliased at return point or scope exit
+retalias --- function returns alias to parameter or global
+noparams --- function declaration has no parameter list
+oldstyle --- old style function definition
+gnuextensions --- support some gnu (gcc) language extensions
+usevarargs --- non-standard  included
+warnposixheaders --- a POSIX header is included, but the POSIX library is not
+used
+exitarg --- argument to exit has implementation defined behavior
+evalorder --- code has unspecified or implementation-dependent behavior because
+of order of evaluation
+evalorderuncon --- code involving call to unspecified function has undefined or
+implementation-dependent behavior
+boolfalse --- set name of boolean false (default FALSE)
+booltype --- set name of boolean type (default bool)
+booltrue --- set name of boolean true (default TRUE)
+noaccess --- ignore access comments
+nocomments --- ignore all stylized comments
+unrecogcomments --- stylized comment is unrecognized
+continuecomment --- line continuation marker (\) in comment before */ on same
+line
+nestcomment --- comment begins inside comment
+tmpcomments --- interpret t comments (ignore errors in lines marked with
+/*@t@*/
+lintcomments --- interpret traditional lint comments (/*FALLTHROUGH*/,
+/*NOTREACHED*/)
+warnlintcomments --- print a warning and suggest an alternative when a
+traditional lint comment is used
+declundef --- function or variable declared but never defined
+specundef --- function or variable specified but never defined
+specundecl --- function or variable specified but never declared in a source
+file
+loopexec --- assume all loops execute at least once
+infloops --- likely infinite loop is detected
+infloopsuncon --- likely infinite loop is detected (may result from
+unconstrained function)
+deepbreak --- break inside nested while or for or switch
+looploopbreak --- break inside nested while or for
+switchloopbreak --- break in loop inside switch
+loopswitchbreak --- break in switch inside loop
+switchswitchbreak --- break in switch inside switch
+looploopcontinue --- continue inside nested loop
+unreachable --- unreachable code detected
+whileempty --- a while statement has no body
+whileblock --- the body of a while statement is not a block
+forempty --- a for statement has no body
+forblock --- the body of a for statement is not a block
+ifempty --- an if statement has no body
+ifblock --- the body of an if statement is not a block
+allempty --- an if, while or for statement has no body (sets ifempty,
+whileempty and forempty
+allblock --- the body of an if, while or for statement is not a block (sets
+ifblock, whileblock and forblock)
+elseifcomplete --- if ... else if chains must have final else
+noret --- path with no return detected in non-void function
+casebreak --- non-empty case in a switch without preceding break
+misscase --- switch on enum type missing case for some value
+firstcase --- first statement in switch is not a case
+shadow --- declaration reuses name visible in outer scope
+incondefslib --- function, variable or constant defined in a library is
+redefined with inconsistent type
+overload --- library function overloaded
+nestedextern --- an extern declaration is inside a function scope
+redecl --- function or variable redeclared
+redef --- function or variable redefined
+incondefs --- function, variable or constant redefined with inconsistent type
+imptype --- variable declaration has unknown (implicitly int) type
+matchfields --- struct or enum type redefined with inconsistent fields or
+members
+usedef --- use before definition
+impouts --- pointer parameters to unspecified functions may be implicit out
+parameters
+tmpdir --- set directory for writing temp files
+larchpath --- set path for searching for library files (overrides LARCH_PATH
+environment variable)
+lclimportdir --- set directory to search for LCL import files (overrides
+LCLIMPORTDIR)
+sysdirs --- set directories for system files (default /usr/include). Separate
+directories with colons (e.g., "/usr/include:/usr/local/lib"). Flag settings
+propagate to files in a system directory. If -sysdirerrors is set, no errors
+are reported for files in system directories.
+skipansiheaders --- prevent inclusion of header files in a system directory
+with names that match standard ANSI headers. The symbolic information in the
+standard library is used instead.  Flag in effect only if a library including
+the ANSI library is loaded.  The ANSI headers are:
+assert, ctype, errno, float, limits, locale, math, setjmp, signal, stdarg,
+stddef, stdio, stdlib, strings, string, time, and wchar.
+skipposixheaders --- prevent inclusion of header files in a system directory
+with names that match standard POSIX headers. The symbolic information in the
+posix library is used instead.  The POSIX headers are:
+dirent, fcntl, grp, pwd, termios, sys/stat, sys/times, sys/types, sys/utsname,
+sys/wait, unistd, and utime.
+sysdirerrors --- report errors in files in system directories (set by -sysdirs)
+sysdirexpandmacros --- expand macros in system directories regardless of other
+settings, except for macros corresponding to names defined in a load library
+I --- add to C include path
+S --- add to spec path
+quiet --- suppress herald and error count
+usestderr --- send error messages to standard error (instead of standard out)
+showsummary --- show summary of all errors reported and suppressed
+showscan --- show file names are they are processed
+stats --- display lines processed and time
+timedist --- display time distribution
+showalluses --- show sorted list of uses of all globals
+noeffect --- statement with no effect
+noeffectuncon --- statement with no effect (except possibly through call to
+unconstrained function)
+exportany --- variable, function or type exported but not specified
+exportfcn --- function exported but not specified
+exportmacro --- expanded macro exported but not specified
+exporttype --- type definition exported but not specified
+exportvar --- variable exported but not specified
+exportconst --- constant exported but not specified
+exportiter --- constant exported but not specified
+repexpose --- abstract representation is exposed (sets assignexpose, retexpose,
+and castexpose)
+retexpose --- abstract representation is exposed (return values only)
+assignexpose --- abstract representation is exposed (assignments only)
+castexpose --- abstract representation is exposed through a cast
+linelen --- set length of messages (number of chars)
+showcolumn --- show column number where error is found
+parenfileformat --- show column number where error is found
+showfunc --- show name of function containing error
+showallconjs --- show all possible types
+impconj --- make all alternate types implicit (useful for making system
+libraries
+expect --- expect  code errors
+lclexpect --- expect  spec errors
+partial --- check as partial system (-specundef, -declundef, -exportlocal,
+don't check macros in headers without corresponding .c files)
+globs --- undocumented use of a checked global variable
+globuse --- global listed for a function not used
+internalglobs --- use of internalState
+internalglobsnoglobs --- use of internalState (in function with no globals
+list)
+warnmissingglobs --- global variable used in modifies clause is not listed in
+globals list
+warnmissingglobsnoglobs --- global variable used in modifies clause in a
+function with no globals list
+globnoglobs --- use of checked global in a function with no globals list or
+specification
+allglobs --- report use and modification errors for globals not annotated with
+unchecked
+checkstrictglobs --- report use and modification errors for checkedstrict
+globals
+impcheckedspecglobs --- assume checked qualifier for unqualified global
+declarations in .lcl files
+impcheckmodspecglobs --- assume checkmod qualifier for unqualified global
+declarations in .lcl files
+impcheckedstrictspecglobs --- assume checkmod qualifier for unqualified global
+declarations in .lcl files
+impcheckedglobs --- assume checked qualifier for unqualified global
+declarations
+impcheckmodglobs --- assume checkmod qualifier for unqualified global
+declarations
+impcheckedstrictglobs --- assume checkedstrict qualifier for unqualified global
+declarations
+impcheckedstatics --- assume checked qualifier for unqualified file static
+declarations
+impcheckmodstatics --- assume checkmod qualifier for unqualified file static
+declarations
+impcheckmodinternals --- assume checkmod qualifier for unqualified local static
+declarations (for internal state modifications)
+impcheckedstrictstatics --- assume checkedstrict qualifier for unqualified file
+static declarations
+modglobs --- undocumented modification of a checked global variable
+modglobsnomods --- undocumented modification of a checked global variable in a
+function declared with no modifies clause
+modstrictglobsnomods --- undocumented modification of a strict checked global
+variable in a function declared with no modifies clause
+modglobsunchecked --- undocumented modification of an unchecked checked global
+variable
+lh --- generate .lh files
+lcs --- generate .lcs files
+singleinclude --- optimize header inclusion to eliminate redundant includes
+neverinclude --- optimize header inclusion to not include any header files
+skipsysheaders --- do not include header files in system directories (set by
+-sysdirs)
+warnflags --- warn when command line sets flag to default value in mode
+warnunixlib --- warn when the unix library is used
+badflag --- a flag is not recognized or used in an incorrect way
+forcehints --- provide hints for all errors reported
+help --- -help  will describe flags
+hints --- provide hints on using lclint (hint only reported for first related
+error)
+retval --- return value ignored (sets retvalint, retvalbool and retvalother)
+retvalother --- return value of type other than bool or int ignored
+retvalbool --- return value of type bool ignored
+retvalint --- return value of type int ignored
+f --- load options file (default ~/.lclintrc not loaded)
+i --- set LCL initilization file
+nof --- do not read options file
+needspec --- information in specifications is not also included in syntactic
+comments
+newdecl --- report new global declarations in source files
+hasyield --- iter declaration has no yield parameters
+dump --- save state for merging (default suffix .lcd)
+load --- load state from dump file (default suffix .lcd)
+nolib --- do not load standard library
+ansilib --- use ANSI (ISO) standard library
+strictlib --- interpret standard library strictly
+unixlib --- use UNIX (sort-of) standard library
+unixstrictlib --- use strict version of UNIX (sort-of) library
+posixlib --- use POSIX standard library
+posixstrictlib --- use strict POSIX standard library
+whichlib --- show standard library filename
+commentchar --- set marker character for syntactic comments (default is '@')
+allmacros --- sets fcnmacros and constmacros
+libmacros --- check all macros with declarations in library as functions
+specmacros --- check all macros corresponding to specified functions or
+constants
+fcnmacros --- check all macros with parameter lists as functions
+constmacros --- check all macros without parameter lists as constants
+macromatchname --- macro definition does not match iter or constant declaration
+nextlinemacros --- the line after a constant or iter declaration must be a
+macro definition
+macrostmt --- macro definition is syntactically not equivalent to function
+macroempty --- macro definition for is empty
+macroparams --- macro parameter not used exactly once
+macroassign --- assignment to a macro parameter
+sefparams --- a parameter with side-effects is passed as a sef parameter
+sefuncon --- a parameter with unconstrained side-effects is passed as a sef
+parameter
+macroparens --- macro parameter used without parentheses (in potentially
+dangerous context)
+macrodecl --- macro without prototype or specification (sets macrofcndecl and
+macroconstdecl)
+macrofcndecl --- parameterized macro without prototype or specification
+macroconstdecl --- non-parameterized macro without prototype or specification
+macroredef --- macro redefined
+macrounrecog --- unrecognized identifier in macro
+stackref --- external reference to stack-allocated storage is created
+usereleased --- storage used after release
+strictusereleased --- element used after it may have been released
+compdef --- parameter, return value or global completely defined
+compmempass --- actual parameter matches alias kind of formal parameter
+completely 
+mustdefine --- out storage not defined before return or scope exit
+uniondef --- at least one field of a union must be defined
+memimp --- memory errors for unqualified storage
+paramimptemp --- assume unannotated parameter is temp
+allimponly --- sets globimponly, retimponly, structimponly, specglobimponly,
+specretimponly and specstructimponly
+codeimponly --- sets globimponly, retimponly and structimponly
+specimponly --- sets specglobimponly, specretimponly and specstructimponly
+globimponly --- assume unannotated global storage is only
+retimponly --- assume unannotated returned storage is only
+structimponly --- assume unannotated structure field is only
+specglobimponly --- assume unannotated global storage is only
+specretimponly --- assume unannotated returned storage is only
+specstructimponly --- assume unannotated structure field is only
+deparrays --- array elements are dependent storage
+compdestroy --- all only references derivable from void pointer out only
+parameter are released
+strictdestroy --- report complete destruction errors for array elements that
+may have been released
+mustfree --- only storage not released before return or scope exit
+branchstate --- storage has inconsistent states of alternate paths through a
+branch
+strictbranchstate --- storage through array fetch has inconsistent states of
+alternate paths through a branch
+memchecks --- sets all dynamic memory checking flags (memimplicit, mustfree,
+mustdefine, mustnotalias, null, memtrans)
+memtrans --- memory transfer errors (sets all *trans flags)
+exposetrans --- exposure transfer errors
+observertrans --- observer transfer errors
+dependenttrans --- dependent transfer errors
+newreftrans --- new reference transfer to reference counted reference
+onlytrans --- only storage transferred to non-only reference (memory leak)
+onlyunqglobaltrans --- only storage transferred to an unqualified global or
+static reference (memory leak)
+ownedtrans --- owned storage transferred to non-owned reference (memory leak)
+freshtrans --- fresh storage transferred to non-only reference (memory leak)
+sharedtrans --- shared storage transferred to non-shared reference
+temptrans --- temp storage transferred to non-temporary reference
+kepttrans --- kept storage transferred to non-temporary reference
+keeptrans --- keep storage transferred inconsistently
+immediatetrans --- an immediate address (result of &) is transferred
+inconsistently
+refcounttrans --- reference counted storage is transferred in an inconsistent
+way
+statictrans --- static storage is transferred in an inconsistent way
+unqualifiedtrans --- unqualified storage is transferred in an inconsistent way
+staticinittrans --- static storage is used as an initial value in an
+inconsistent way
+unqualifiedinittrans --- unqualified storage is used as an initial value in an
+inconsistent way
+readonlystrings --- string literals are read-only (error if one is modified or
+released)
+readonlytrans --- report memory transfer errors for initializations to
+read-only string literals
+passunknown --- passing a value as an un-annotated parameter clears its
+annotation
+mods --- unspecified modification of caller-visible state
+mustmod --- specified modification is not detected
+modobserver --- possible modification of observer storage
+modobserveruncon --- possible modification of observer storage through
+unconstrained call
+modinternalstrict --- possible modification of internal storage through
+function call
+modfilesys --- report undocumented file system modifications (applies to
+unspecified functions if modnomods is set)
+modunspec --- modification in unspecified functions (sets modnomods,
+modglobunspec and modstrictglobsunspec)
+modnomods --- modification in a function with no modifies clause
+moduncon --- possible modification through a call to an unconstrained function
+modunconnomods --- possible modification through a call to an unconstrained
+function in a function with no modifies clause
+globsimpmodsnothing --- functions declared with a globals list but no modifies
+clause are assumed to modify nothing
+modsimpnoglobs --- functions declared with a modifies clause but no globals
+list are assumed to use no globals
+namechecks --- controls name checking without changing other settings
+czech --- czech naming convention (sets accessczech, czechfunctions, czechvars,
+czechconstants, czechenums, and czechmacros)
+czechfcns --- czech naming convention violated in a function or iterator
+declaration
+czechvars --- czech naming convention violated in a variable declaration
+czechmacros --- czech naming convention violated in an expanded macro name
+czechconsts --- czech naming convention violated in a constant declaration
+czechtypes --- czech naming convention violated in a user-defined type
+definition
+slovak --- slovak naming convention violated
+slovakfcns --- slovak naming convention violated in a function or iterator
+declaration
+slovakmacros --- slovak naming convention violated in an expanded macro name
+slovakvars --- slovak naming convention violated in a variable declaration
+slovakconsts --- slovak naming convention violated in a constant declaration
+slovaktypes --- slovak naming convention violated in a use-defined type
+definition
+czechoslovak --- czech or slovak naming convention violated
+czechoslovakfcns --- czechoslovak naming convention violated in a function or
+iterator declaration
+czechoslovakmacros --- czechoslovak naming convention violated in an expanded
+macro name
+czechoslovakvars --- czechoslovak naming convention violated in a variable
+declaration
+czechoslovakconsts --- czechoslovak naming convention violated in a constant
+declaration
+czechoslovaktypes --- czechoslovak naming convention violated in a user-defined
+type definition
+ansireserved --- external name conflicts with name reserved for system or
+standard library
+cppnames --- external or internal name is a C++ keyword or reserved word
+ansireservedinternal --- internal name conflicts with name reserved for system
+or standard library
+distinctexternalnames --- external name is not distinguishable from another
+external name using the number of significant characters
+externalnamelen --- set the number of significant characters in an external
+name
+externalnamecaseinsensitive --- alphabetic comparisons for external names are
+case-insensitive
+distinctinternalnames --- internal name is not distinguishable from another
+internal name using the number of significant characters
+internalnamelen --- set the number of significant characters in an internal
+name
+internalnamecaseinsensitive --- set whether case is significant an internal
+names (-internalnamecaseinsensitive means case is significant)
+internalnamelookalike --- lookalike characters match in internal names
+macrovarprefix --- set namespace prefix for variables declared in a macro body
+macrovarprefixexclude --- the macrovarprefix may not be used for non-macro
+variables
+tagprefix --- set namespace prefix for struct, union and enum tags
+tagprefixexclude --- the tagprefix may not be used for non-tag identifiers
+enumprefix --- set namespace prefix for enum members
+enumprefixexclude --- the enumprefix may not be used for non-enum member
+identifiers
+filestaticprefix --- set namespace prefix for file static declarations
+filestaticprefixexclude --- the filestaticprefix may not be used for
+identifiers that are not file static
+globalprefix --- set namespace prefix for global variables
+globalprefixexclude --- the globalprefix may not be used for non-global
+identifiers
+typeprefix --- set namespace prefix for user-defined types
+typeprefixexclude --- the typeprefix may not be used for identifiers that are
+not type names
+externalprefix --- set namespace prefix for external identifiers
+externalprefixexclude --- the externalprefix may not be used for non-external
+identifiers
+localprefix --- set namespace prefix for local variables
+localprefixexclude --- the localprefix may not be used for non-local
+identifiers
+uncheckedmacroprefix --- set namespace prefix for unchecked macros
+uncheckedmacroprefixexclude --- the uncheckmacroprefix may not be used for
+identifiers that are not unchecked macros
+constprefix --- set namespace prefix for constants
+constprefixexclude --- the constprefix may not be used for non-constant
+identifiers
+iterprefix --- set namespace prefix for iterators
+iterprefixexclude --- the iterprefix may not be used for non-iter identifiers
+protoparamprefix --- set namespace prefix for parameters in function prototype
+declarations
+protoparamname --- a parameter in a function prototype has a name
+protoparammatch --- the name of a parameter in a function prototype and
+corresponding declaration must match (after removing the protoparamprefix
+protoparamprefixexclude --- the protoparamprefix may not be used for
+non-declaraction parameter identifiers
+controlnestdepth --- set maximum nesting depth of compound statements,
+iteration control structures, and selection control structures (ANSI minimum is
+15)
+stringliterallen --- set maximum length of string literals (ANSI minimum is
+509)
+numstructfields --- set maximum number of fields in a struct or union (ANSI
+minimum is 127)
+numenummembers --- set maximum number of members of an enum (ANSI minimum is
+127)
+includenest --- set maximum number of nested #include files
+ansilimits --- check for violations of standard limits (controlnestdepth,
+stringliterallen, includenest, numstructfields, numenummembers)
+null --- misuses of null pointer
+nullderef --- possible dereferencce of null pointer
+fcnderef --- dereferencce of a function type
+nullpass --- possibly null pointer passed as formal with no null annotation
+nullret --- possibly null pointer returned as result with no null annotation
+nullstate --- possibly null pointer reachable from a reference with no null
+annotation
+nullassign --- inconsistent assignment or initialization involving null pointer
+boolcompare --- comparison between bools (dangerous because of multiple TRUE
+values)
+realcompare --- dangerous comparison between reals (dangerous because of
+inexact floating point representations)
+ptrarith --- arithmetic involving pointer and integer
+nullptrarith --- arithmetic involving possibly null pointer and integer
+ptrcompare --- comparison between pointer and number
+strictops --- primitive operation does not type check strictly
+bitwisesigned --- a bitwise logical operator does not have unsigned operands
+shiftsigned --- a shift operator does not have unsigned operands
+boolops --- primitive operation (!, && or ||) does not has a boolean argument
+ptrnegate --- allow ! to be used on pointer operand
+sizeoftype --- sizeof operator has a type argument
+sizeofformalarray --- sizeof operator has an array formal parameter argument
+fixedformalarray --- formal parameter of type array is declared with size
+incompletetype --- formal parameter has an incomplete type
+formalarray --- formal parameter is an array
+predassign --- condition test (if, while or for) is an assignment
+predbool --- type of condition test (if, while or for) not bool (sets
+predboolint, predboolptr and predboolothers)
+predboolint --- type of condition test (if, while or for) is an integral type
+predboolothers --- type of condition test (if, while or for) not bool, int or
+pointer
+predboolptr --- type of condition test (if, while or for) is a pointer
+D --- passed to pre-processor
+U --- passed to pre-processor
+globstate --- returns with global in inconsistent state (null or undefined)
+supcounts --- The number of errors detected does not match number in
+/*@i@*/.
+limit --- limit  consecutive repeated errors
+syntax --- syntax error in parsing
+trytorecover --- try to recover from parse error
+type --- type mismatch
+fullinitblock --- initializer sets all fields
+enummembers --- enum members must be int values
+maintype --- type of main does not match expected type
+formattype --- type-mismatch in parameter corresponding to format code in a
+printf or scanf-like function
+formatcode --- invalid format code in format string for printf or scanf-like
+function
+forwarddecl --- forward declarations of pointers to abstract representation
+match abstract type
+voidabstract --- void * matches pointers to abstract types, casting ok
+(dangerous)
+castfcnptr --- a pointer to a function is cast to a pointer to void (or vice
+versa)
+charindex --- char can be used to index arrays
+enumindex --- enum can be used to index arrays
+boolint --- bool and int are equivalent
+charint --- char and int are equivalent
+enumint --- enum and int are equivalent
+floatdouble --- float and double are equivalent
+ignorequals --- ignore type qualifiers (long, short, unsigned)
+duplicatequals --- report duplicate type qualifiers (e.g., long long)
+ignoresigns --- ignore signs in type comparisons (unsigned matches signed)
+numliteral --- int literals can be reals
+charintliteral --- character constants (e.g., 'a') can be used as ints
+relaxquals --- report qualifier mismatches only if dangerous
+relaxtypes --- allow all numeric types to match
+charunsignedchar --- allow char and unsigned char types to match
+matchanyintegral --- allow any intergral type to match an arbitrary integral
+type (e.g., dev_t)
+longunsignedintegral --- allow long unsigned type to match an arbitrary
+integral type (e.g., dev_t)
+longintegral --- allow long type to match an arbitrary integral type (e.g.,
+dev_t)
+longunsignedunsignedintegral --- allow long unsigned type to match an arbitrary
+unsigned integral type (e.g., size_t)
+longsignedintegral --- allow long type to match an arbitrary signed integral
+type (e.g., ssize_t)
+zeroptr --- 0 is treated as a pointer
+repeatunrecog --- do not suppress repeated unrecognized identifier messages
+(instead of only reporting the first error)
+sysunrecog --- report unrecognized identifiers with system (__) prefix
+unrecog --- unrecognized identifier
+topuse --- declaration at top level not used
+exportlocal --- a declaration is exported but not used outside this module
+exportheader --- a declaration is exported but does not appear in a header file
+exportheadervar --- a variable declaration is exported but does not appear in a
+header file
+fielduse --- field of structure type not used
+enummemuse --- member of an enum type not used
+constuse --- constant declared but not used
+fcnuse --- function declared but not used
+paramuse --- function parameter not used 
+typeuse --- type declared but not used
+varuse --- variable declared but not used
+unusedspecial --- unused declaration in special file (corresponding to .l or .y
+file)
+
diff --git a/test/impabstract.c b/test/impabstract.c
new file mode 100644
index 0000000..b527c11
--- /dev/null
+++ b/test/impabstract.c
@@ -0,0 +1,17 @@
+typedef int mint;
+typedef /*@concrete@*/ int cint;
+
+int f (mint m, cint c)
+{
+  if (c > 3)
+    {
+      return c;
+    }
+
+  if (m < 2)
+    {
+      return m;
+    }
+
+  return 3;
+}
diff --git a/test/impabstract.expect b/test/impabstract.expect
new file mode 100644
index 0000000..17b15c4
--- /dev/null
+++ b/test/impabstract.expect
@@ -0,0 +1,26 @@
+
+Finished LCLint checking --- no code errors found
+
+impabstract.c: (in function f)
+impabstract.c:11:7: Left operand of < is abstract type (mint): m < 2
+  An abstraction barrier is broken. If necessary, use /*@access @*/ to
+  allow access to an abstract type. (-abstract will suppress message)
+impabstract.c:13:14: Return value type mint does not match declared type int: m
+  Underlying types match, but mint is an abstract type that is not accessible
+  here.
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+impabstract.c:2:28: Mutable abstract type cint declared without pointer
+                       indirection: int (violates assignment semantics)
+  LCL semantics requires that a mutable type exhibits sharing semantics. In
+  order for objects to be shared a indirection is necessary in the
+  representation. A mutable type may be represented by a pointer or an abstract
+  mutable type. Handles into static data are fine, too, but will generate this
+  error message unless it is suppressed. (-mutrep will suppress message)
+impabstract.c:2:28: Datatype cint inconsistently declared as concrete type
+  A function, variable or constant is redefined with a different type.
+  (-incondefs will suppress message)
+   impabstract.lcl:2:1: Specification of cint
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/impabstract.lcl b/test/impabstract.lcl
new file mode 100644
index 0000000..c9c70d6
--- /dev/null
+++ b/test/impabstract.lcl
@@ -0,0 +1,2 @@
+typedef int mint;
+mutable type cint;
\ No newline at end of file
diff --git a/test/impabstract.lcs b/test/impabstract.lcs
new file mode 100644
index 0000000..90e9b90
--- /dev/null
+++ b/test/impabstract.lcs
@@ -0,0 +1,125 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _mint synonym int nil
+%LCLsort cint immutable nil nil
+%LCLsort _cint_Obj mutable cint nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :cint -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype mint _mint exposed
+%LCLtype cint _cint_Obj mutable
+%LCLSymbolTableEnd
diff --git a/test/impabstract.out b/test/impabstract.out
new file mode 100644
index 0000000..17b15c4
--- /dev/null
+++ b/test/impabstract.out
@@ -0,0 +1,26 @@
+
+Finished LCLint checking --- no code errors found
+
+impabstract.c: (in function f)
+impabstract.c:11:7: Left operand of < is abstract type (mint): m < 2
+  An abstraction barrier is broken. If necessary, use /*@access @*/ to
+  allow access to an abstract type. (-abstract will suppress message)
+impabstract.c:13:14: Return value type mint does not match declared type int: m
+  Underlying types match, but mint is an abstract type that is not accessible
+  here.
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+impabstract.c:2:28: Mutable abstract type cint declared without pointer
+                       indirection: int (violates assignment semantics)
+  LCL semantics requires that a mutable type exhibits sharing semantics. In
+  order for objects to be shared a indirection is necessary in the
+  representation. A mutable type may be represented by a pointer or an abstract
+  mutable type. Handles into static data are fine, too, but will generate this
+  error message unless it is suppressed. (-mutrep will suppress message)
+impabstract.c:2:28: Datatype cint inconsistently declared as concrete type
+  A function, variable or constant is redefined with a different type.
+  (-incondefs will suppress message)
+   impabstract.lcl:2:1: Specification of cint
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/init.c b/test/init.c
new file mode 100644
index 0000000..195c6c0
--- /dev/null
+++ b/test/init.c
@@ -0,0 +1,16 @@
+char c[][] = { NULL, "hullo", { 'a', 'b', 3 }, NULL };
+
+struct { char *name; int x[]; char *uname; int y; } st 
+  = { "bob", { 1, 2}, NULL, 1.2 }; 
+
+struct { char *name; int x[]; char *uname; int y; } st2[] 
+  = { { "bob", { 1, 2}, NULL }, 
+      { "charly", 3, NULL, 4 } } ;
+
+int a[10] = { 1, 2, 3, 4, 3.4, 6, 4 } ;
+
+int aa[][] = { { 1, 2, 3} , { 1, 3.2, 3} };
+
+int b[10] = { { 1, 2} , {3, 4} } ;
+
+
diff --git a/test/init.expect b/test/init.expect
new file mode 100644
index 0000000..c2dbded
--- /dev/null
+++ b/test/init.expect
@@ -0,0 +1,38 @@
+
+init.c:1:16: Global c[0] initialized to null value: c[0] = NULL
+init.c:1:43: Initial value of c[2][2] is type int, expects char: 3
+init.c:1:48: Global c[3] initialized to null value: c[3] = NULL
+init.c:4:23: Global st.uname initialized to null value: st.uname = NULL
+init.c:4:29: Initial value of st.y is type double, expects int: 1.2
+init.c:7:7: Initializer block for st2[0] has 3 fields, but struct has 4 fields:
+               "bob", { 1, 2 }, NULL
+init.c:8:19: Initial value of st2[1].x is type int, expects int []: 3
+init.c:8:22: Global st2[1].uname initialized to null value: st2[1].uname = NULL
+init.c:10:27: Initial value of a[4] is type double, expects int: 3.4
+init.c:12:34: Initial value of aa[1][1] is type double, expects int: 3.2
+init.c:14:15: Initializer block used for b[0] where int is expected: { 1, 2 }
+init.c:14:25: Initializer block used for b[1] where int is expected: { 3, 4 }
+
+Finished LCLint checking --- 12 code errors found, as expected
+
+init.c:1:16: Global c[0] initialized to null value: c[0] = NULL
+init.c:1:22: Read-only string literal storage used as initial value for
+                unqualified storage: c[1] = "hullo"
+init.c:1:43: Initial value of c[2][2] is type int, expects char: 3
+init.c:1:48: Global c[3] initialized to null value: c[3] = NULL
+init.c:4:7: Read-only string literal storage used as initial value for
+               unqualified storage: st.name = "bob"
+init.c:4:23: Global st.uname initialized to null value: st.uname = NULL
+init.c:4:29: Initial value of st.y is type double, expects int: 1.2
+init.c:7:7: Initializer block for st2[0] has 3 fields, but struct has 4 fields:
+               "bob", { 1, 2 }, NULL
+init.c:8:9: Read-only string literal storage used as initial value for
+               unqualified storage: st2[1].name = "charly"
+init.c:8:19: Initial value of st2[1].x is type int, expects int []: 3
+init.c:8:22: Global st2[1].uname initialized to null value: st2[1].uname = NULL
+init.c:10:27: Initial value of a[4] is type double, expects int: 3.4
+init.c:12:34: Initial value of aa[1][1] is type double, expects int: 3.2
+init.c:14:15: Initializer block used for b[0] where int is expected: { 1, 2 }
+init.c:14:25: Initializer block used for b[1] where int is expected: { 3, 4 }
+
+Finished LCLint checking --- 15 code errors found, as expected
diff --git a/test/init.out b/test/init.out
new file mode 100644
index 0000000..c2dbded
--- /dev/null
+++ b/test/init.out
@@ -0,0 +1,38 @@
+
+init.c:1:16: Global c[0] initialized to null value: c[0] = NULL
+init.c:1:43: Initial value of c[2][2] is type int, expects char: 3
+init.c:1:48: Global c[3] initialized to null value: c[3] = NULL
+init.c:4:23: Global st.uname initialized to null value: st.uname = NULL
+init.c:4:29: Initial value of st.y is type double, expects int: 1.2
+init.c:7:7: Initializer block for st2[0] has 3 fields, but struct has 4 fields:
+               "bob", { 1, 2 }, NULL
+init.c:8:19: Initial value of st2[1].x is type int, expects int []: 3
+init.c:8:22: Global st2[1].uname initialized to null value: st2[1].uname = NULL
+init.c:10:27: Initial value of a[4] is type double, expects int: 3.4
+init.c:12:34: Initial value of aa[1][1] is type double, expects int: 3.2
+init.c:14:15: Initializer block used for b[0] where int is expected: { 1, 2 }
+init.c:14:25: Initializer block used for b[1] where int is expected: { 3, 4 }
+
+Finished LCLint checking --- 12 code errors found, as expected
+
+init.c:1:16: Global c[0] initialized to null value: c[0] = NULL
+init.c:1:22: Read-only string literal storage used as initial value for
+                unqualified storage: c[1] = "hullo"
+init.c:1:43: Initial value of c[2][2] is type int, expects char: 3
+init.c:1:48: Global c[3] initialized to null value: c[3] = NULL
+init.c:4:7: Read-only string literal storage used as initial value for
+               unqualified storage: st.name = "bob"
+init.c:4:23: Global st.uname initialized to null value: st.uname = NULL
+init.c:4:29: Initial value of st.y is type double, expects int: 1.2
+init.c:7:7: Initializer block for st2[0] has 3 fields, but struct has 4 fields:
+               "bob", { 1, 2 }, NULL
+init.c:8:9: Read-only string literal storage used as initial value for
+               unqualified storage: st2[1].name = "charly"
+init.c:8:19: Initial value of st2[1].x is type int, expects int []: 3
+init.c:8:22: Global st2[1].uname initialized to null value: st2[1].uname = NULL
+init.c:10:27: Initial value of a[4] is type double, expects int: 3.4
+init.c:12:34: Initial value of aa[1][1] is type double, expects int: 3.2
+init.c:14:15: Initializer block used for b[0] where int is expected: { 1, 2 }
+init.c:14:25: Initializer block used for b[1] where int is expected: { 3, 4 }
+
+Finished LCLint checking --- 15 code errors found, as expected
diff --git a/test/inparam.c b/test/inparam.c
new file mode 100644
index 0000000..8b61d12
--- /dev/null
+++ b/test/inparam.c
@@ -0,0 +1,14 @@
+extern unknown (int *x);
+extern inparam (/*@in@*/ int *x);
+
+void f (/*@out@*/ int *x)
+{
+  if (3 > 4)
+    {
+      unknown (x);
+    }
+  else
+    {
+      inparam (x);
+    }
+}
diff --git a/test/inparam.expect b/test/inparam.expect
new file mode 100644
index 0000000..72a0e1e
--- /dev/null
+++ b/test/inparam.expect
@@ -0,0 +1,14 @@
+
+inparam.c: (in function f)
+inparam.c:8:16: Passed storage x not completely defined (*x is undefined):
+                   unknown (x)
+inparam.c:12:16: Passed storage x not completely defined (*x is undefined):
+                    inparam (x)
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+inparam.c: (in function f)
+inparam.c:12:16: Passed storage x not completely defined (*x is undefined):
+                    inparam (x)
+
+Finished LCLint checking --- 1 code error found, as expected
diff --git a/test/inparam.out b/test/inparam.out
new file mode 100644
index 0000000..72a0e1e
--- /dev/null
+++ b/test/inparam.out
@@ -0,0 +1,14 @@
+
+inparam.c: (in function f)
+inparam.c:8:16: Passed storage x not completely defined (*x is undefined):
+                   unknown (x)
+inparam.c:12:16: Passed storage x not completely defined (*x is undefined):
+                    inparam (x)
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+inparam.c: (in function f)
+inparam.c:12:16: Passed storage x not completely defined (*x is undefined):
+                    inparam (x)
+
+Finished LCLint checking --- 1 code error found, as expected
diff --git a/test/internal.c b/test/internal.c
new file mode 100644
index 0000000..dc5c366
--- /dev/null
+++ b/test/internal.c
@@ -0,0 +1,31 @@
+/*@-varuse@*/
+  /*1234567890123456789012345678901XXXXXXXX*/
+int iwonderhowmanycharactersaresignificant1 (void);
+int iwonderhowmanycharactersaresignificant2 (void);
+int manycharactersaresignificant1 (void);
+int manycharactersaresignificant2 (void);
+
+extern int fl;
+
+void f1 (void)
+{
+  int e1;
+  char *el; 
+  int alphabet;
+  int *Alphabet;
+  int alphabet1soup;
+  int *alphabetlsoup;
+  int lcase;
+
+  {
+    int e1;
+    int a1phabet;
+    char *lcAse;
+    int s52;
+    int sS2;
+    int s5Z;
+    int numO;
+    int num0;
+  }
+}
+  
diff --git a/test/internal.expect b/test/internal.expect
new file mode 100644
index 0000000..38ad1f9
--- /dev/null
+++ b/test/internal.expect
@@ -0,0 +1,78 @@
+
+internal.c: (in function f1)
+internal.c:21:9: Variable e1 shadows outer declaration
+   internal.c:12:7: Previous definition of e1: int
+
+Finished LCLint checking --- 1 code error found, as expected
+
+internal.c:4:5: Internal identifier iwonderhowmanycharactersaresignificant2 is
+    not distinguishable from iwonderhowmanycharactersaresignificant1 in the
+    first 31 characters (iwonderhowmanycharactersaresign)
+   internal.c:3:5: Declaration of iwonderhowmanycharactersaresignificant1
+internal.c: (in function f1)
+internal.c:21:9: Variable e1 shadows outer declaration
+   internal.c:12:7: Previous definition of e1: int
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+internal.c:4:5: Internal identifier iwonderhowmanycharactersaresignificant2 is
+    not distinguishable from iwonderhowmanycharactersaresignificant1 in the
+    first 28 characters (iwonderhowmanycharactersares)
+   internal.c:3:5: Declaration of iwonderhowmanycharactersaresignificant1
+internal.c:6:5: Internal identifier manycharactersaresignificant2 is not
+    distinguishable from manycharactersaresignificant1 in the first 28
+    characters (manycharactersaresignificant)
+   internal.c:5:5: Declaration of manycharactersaresignificant1
+internal.c: (in function f1)
+internal.c:21:9: Variable e1 shadows outer declaration
+   internal.c:12:7: Previous definition of e1: int
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+internal.c: (in function f1)
+internal.c:15:8: Internal identifier Alphabet is not distinguishable from
+                    alphabet without case sensitivity
+   internal.c:14:7: Declaration of alphabet
+internal.c:21:9: Variable e1 shadows outer declaration
+   internal.c:12:7: Previous definition of e1: int
+internal.c:23:11: Internal identifier lcAse is not distinguishable from lcase
+                     without case sensitivity
+   internal.c:18:7: Declaration of lcase
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+internal.c:10:6: Internal identifier f1 is not distinguishable from fl except
+                    by lookalike characters
+   internal.c:8:12: Declaration of fl
+internal.c: (in function f1)
+internal.c:13:9: Internal identifier el is not distinguishable from e1 except
+                    by lookalike characters
+   internal.c:12:7: Declaration of e1
+internal.c:15:8: Internal identifier Alphabet is not distinguishable from
+                    alphabet without case sensitivity
+   internal.c:14:7: Declaration of alphabet
+internal.c:17:8: Internal identifier alphabetlsoup is not distinguishable from
+                    alphabet1soup except by lookalike characters
+   internal.c:16:7: Declaration of alphabet1soup
+internal.c:21:9: Variable e1 shadows outer declaration
+   internal.c:12:7: Previous definition of e1: int
+internal.c:21:9: Internal identifier e1 is not distinguishable from el except
+                    by lookalike characters
+   internal.c:13:9: Declaration of el
+internal.c:22:9: Internal identifier a1phabet is not distinguishable from
+                    alphabet except by lookalike characters
+   internal.c:14:7: Declaration of alphabet
+internal.c:23:11: Internal identifier lcAse is not distinguishable from lcase
+                     without case sensitivity
+   internal.c:18:7: Declaration of lcase
+internal.c:25:9: Internal identifier sS2 is not distinguishable from s52 except
+                    by lookalike characters
+   internal.c:24:9: Declaration of s52
+internal.c:26:9: Internal identifier s5Z is not distinguishable from s52 except
+                    by lookalike characters
+   internal.c:24:9: Declaration of s52
+internal.c:28:9: Internal identifier num0 is not distinguishable from numO
+                    except by lookalike characters
+   internal.c:27:9: Declaration of numO
+
+Finished LCLint checking --- 11 code errors found, as expected
diff --git a/test/internal.out b/test/internal.out
new file mode 100644
index 0000000..38ad1f9
--- /dev/null
+++ b/test/internal.out
@@ -0,0 +1,78 @@
+
+internal.c: (in function f1)
+internal.c:21:9: Variable e1 shadows outer declaration
+   internal.c:12:7: Previous definition of e1: int
+
+Finished LCLint checking --- 1 code error found, as expected
+
+internal.c:4:5: Internal identifier iwonderhowmanycharactersaresignificant2 is
+    not distinguishable from iwonderhowmanycharactersaresignificant1 in the
+    first 31 characters (iwonderhowmanycharactersaresign)
+   internal.c:3:5: Declaration of iwonderhowmanycharactersaresignificant1
+internal.c: (in function f1)
+internal.c:21:9: Variable e1 shadows outer declaration
+   internal.c:12:7: Previous definition of e1: int
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+internal.c:4:5: Internal identifier iwonderhowmanycharactersaresignificant2 is
+    not distinguishable from iwonderhowmanycharactersaresignificant1 in the
+    first 28 characters (iwonderhowmanycharactersares)
+   internal.c:3:5: Declaration of iwonderhowmanycharactersaresignificant1
+internal.c:6:5: Internal identifier manycharactersaresignificant2 is not
+    distinguishable from manycharactersaresignificant1 in the first 28
+    characters (manycharactersaresignificant)
+   internal.c:5:5: Declaration of manycharactersaresignificant1
+internal.c: (in function f1)
+internal.c:21:9: Variable e1 shadows outer declaration
+   internal.c:12:7: Previous definition of e1: int
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+internal.c: (in function f1)
+internal.c:15:8: Internal identifier Alphabet is not distinguishable from
+                    alphabet without case sensitivity
+   internal.c:14:7: Declaration of alphabet
+internal.c:21:9: Variable e1 shadows outer declaration
+   internal.c:12:7: Previous definition of e1: int
+internal.c:23:11: Internal identifier lcAse is not distinguishable from lcase
+                     without case sensitivity
+   internal.c:18:7: Declaration of lcase
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+internal.c:10:6: Internal identifier f1 is not distinguishable from fl except
+                    by lookalike characters
+   internal.c:8:12: Declaration of fl
+internal.c: (in function f1)
+internal.c:13:9: Internal identifier el is not distinguishable from e1 except
+                    by lookalike characters
+   internal.c:12:7: Declaration of e1
+internal.c:15:8: Internal identifier Alphabet is not distinguishable from
+                    alphabet without case sensitivity
+   internal.c:14:7: Declaration of alphabet
+internal.c:17:8: Internal identifier alphabetlsoup is not distinguishable from
+                    alphabet1soup except by lookalike characters
+   internal.c:16:7: Declaration of alphabet1soup
+internal.c:21:9: Variable e1 shadows outer declaration
+   internal.c:12:7: Previous definition of e1: int
+internal.c:21:9: Internal identifier e1 is not distinguishable from el except
+                    by lookalike characters
+   internal.c:13:9: Declaration of el
+internal.c:22:9: Internal identifier a1phabet is not distinguishable from
+                    alphabet except by lookalike characters
+   internal.c:14:7: Declaration of alphabet
+internal.c:23:11: Internal identifier lcAse is not distinguishable from lcase
+                     without case sensitivity
+   internal.c:18:7: Declaration of lcase
+internal.c:25:9: Internal identifier sS2 is not distinguishable from s52 except
+                    by lookalike characters
+   internal.c:24:9: Declaration of s52
+internal.c:26:9: Internal identifier s5Z is not distinguishable from s52 except
+                    by lookalike characters
+   internal.c:24:9: Declaration of s52
+internal.c:28:9: Internal identifier num0 is not distinguishable from numO
+                    except by lookalike characters
+   internal.c:27:9: Declaration of numO
+
+Finished LCLint checking --- 11 code errors found, as expected
diff --git a/test/iter.c b/test/iter.c
new file mode 100644
index 0000000..5dc59ce
--- /dev/null
+++ b/test/iter.c
@@ -0,0 +1,34 @@
+# include "iter.h"
+
+int test (void)
+{
+  char c;
+  int i;
+  int *a;
+
+  intFor(2,5,x,z) /* 2. Unrecognized identifier: x */
+    {
+      printf("%d\n", z);
+    } end_intFor;
+
+  intFor(2,c,x,i) /* 3. Yield parameter shadows local declaration: i 
+		     5. Iter intFor expects arg 2 to be int gets char: c */
+    {
+      ;
+    } ; /* 4. Iter intFor not balanced with end_intFor */
+
+  intFor(2, 12, x, i+3) /* 6, 7. Variable i used before definition
+			         Yield parameter is not simple identifier: i + 3 */
+    {
+      ;
+    } end_arrayElements; /* 8. Iter intFor not balanced with end_intFor: end_arrayElements */
+
+  arrayElements(1, 10, a, el)
+    {
+      printf("%d\n", el);
+    } end_arrayElements;
+  return 3;
+}
+
+
+
diff --git a/test/iter.expect b/test/iter.expect
new file mode 100644
index 0000000..bd0c082
--- /dev/null
+++ b/test/iter.expect
@@ -0,0 +1,52 @@
+
+iter.lcl:3,6: Iterator has no yield parameters: noYield
+iter.c: (in function test)
+iter.c:9:14: Unrecognized identifier: x
+iter.c:14:16: Yield parameter shadows local declaration: i
+   iter.c:6:7: Declaration of i
+iter.c:18:8: Iter intFor not balanced with end_intFor
+iter.c:14:12: Iter intFor expects arg 2 to be int gets char: c
+iter.c:20:20: Variable i used before definition
+iter.c:20:20: Yield parameter is not simple identifier: i + 3
+iter.c:24:24: Iter intFor not balanced with end_intFor: end_arrayElements
+iter.h: (in iter intFor)
+iter.h:1:27: Parameter ___x name is not consistent with macro variable
+                namespace prefix "m_"
+iter.h: (in iter arrayElements)
+iter.h:7:31: Parameter ___x name is not consistent with macro variable
+                namespace prefix "m_"
+iter.h:7:43: Variable ___c name is not consistent with macro variable namespace
+                prefix "m_"
+iter.h:7:55: Variable ___b name is not consistent with macro variable namespace
+                prefix "m_"
+iter.h:8:1: Macro parameter j used in conditionally executed code (may or may
+               not be evaluated exactly once) (in post loop test)
+iter.lcl:3:6: Iterator noYield specified but not defined
+iter.lcl:3:6: Iterator finalizer end_noYield specified but not defined
+
+Finished LCLint checking --- 1 spec error found, as expected
+       14 code errors found, as expected
+
+iter2.c: (in function test)
+iter2.c:9:14: Unrecognized identifier: x
+iter2.c:14:16: Yield parameter shadows local declaration: i
+   iter2.c:6:7: Declaration of i
+iter2.c:17:8: Iter intFor not balanced with end_intFor
+iter2.c:14:12: Iter intFor expects arg 2 to be int gets char: c
+iter2.c:19:17: Variable i used before definition
+iter2.c:19:17: Yield parameter is not simple identifier: i + 3
+iter2.c:22:24: Iter intFor not balanced with end_intFor: end_arrayElements
+iter2.h: (in iter intFor)
+iter2.h:2:27: Parameter ___x name is not consistent with macro variable
+                 namespace prefix "m_"
+iter2.h: (in iter arrayElements)
+iter2.h:8:31: Parameter ___x name is not consistent with macro variable
+                 namespace prefix "m_"
+iter2.h:8:43: Variable ___c name is not consistent with macro variable
+                 namespace prefix "m_"
+iter2.h:8:55: Variable ___b name is not consistent with macro variable
+                 namespace prefix "m_"
+iter2.h:9:1: Macro parameter j used in conditionally executed code (may or may
+                not be evaluated exactly once) (in post loop test)
+
+Finished LCLint checking --- 12 code errors found, as expected
diff --git a/test/iter.h b/test/iter.h
new file mode 100644
index 0000000..bf96b99
--- /dev/null
+++ b/test/iter.h
@@ -0,0 +1,13 @@
+# define intFor(i, j, k, ___x) \
+  { int ___x = (i);  while ((___x) <= (j)) { (___x) += (k); 
+
+# define end_intFor }}
+
+# define arrayElements(i,j,a,___x)\ /* 9. Macro parameter j used more than once (in post loop test) */
+ { int ___c; int *(___b) = a; for (___c = (i); ___c <= (j); ___c++) { int ___x = *(___b); 
+   /* 9. j used more than once (in loop test) */
+
+# define end_arrayElements \
+  (___b)++; }}
+
+
diff --git a/test/iter.lcl b/test/iter.lcl
new file mode 100644
index 0000000..87ed7c7
--- /dev/null
+++ b/test/iter.lcl
@@ -0,0 +1,5 @@
+iter intFor (int from, int to, int by, yield int x) ;
+
+iter noYield (int from, int to) ; /* 1 . no yield param, 9, 10. noYield, end_noYield not defined */
+
+iter arrayElements (int from, int to, int *a, yield int x) ;
\ No newline at end of file
diff --git a/test/iter.lcs b/test/iter.lcs
new file mode 100644
index 0000000..ac73f8e
--- /dev/null
+++ b/test/iter.lcs
@@ -0,0 +1,119 @@
+%FAILED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLSymbolTableEnd
diff --git a/test/iter.out b/test/iter.out
new file mode 100644
index 0000000..bd0c082
--- /dev/null
+++ b/test/iter.out
@@ -0,0 +1,52 @@
+
+iter.lcl:3,6: Iterator has no yield parameters: noYield
+iter.c: (in function test)
+iter.c:9:14: Unrecognized identifier: x
+iter.c:14:16: Yield parameter shadows local declaration: i
+   iter.c:6:7: Declaration of i
+iter.c:18:8: Iter intFor not balanced with end_intFor
+iter.c:14:12: Iter intFor expects arg 2 to be int gets char: c
+iter.c:20:20: Variable i used before definition
+iter.c:20:20: Yield parameter is not simple identifier: i + 3
+iter.c:24:24: Iter intFor not balanced with end_intFor: end_arrayElements
+iter.h: (in iter intFor)
+iter.h:1:27: Parameter ___x name is not consistent with macro variable
+                namespace prefix "m_"
+iter.h: (in iter arrayElements)
+iter.h:7:31: Parameter ___x name is not consistent with macro variable
+                namespace prefix "m_"
+iter.h:7:43: Variable ___c name is not consistent with macro variable namespace
+                prefix "m_"
+iter.h:7:55: Variable ___b name is not consistent with macro variable namespace
+                prefix "m_"
+iter.h:8:1: Macro parameter j used in conditionally executed code (may or may
+               not be evaluated exactly once) (in post loop test)
+iter.lcl:3:6: Iterator noYield specified but not defined
+iter.lcl:3:6: Iterator finalizer end_noYield specified but not defined
+
+Finished LCLint checking --- 1 spec error found, as expected
+       14 code errors found, as expected
+
+iter2.c: (in function test)
+iter2.c:9:14: Unrecognized identifier: x
+iter2.c:14:16: Yield parameter shadows local declaration: i
+   iter2.c:6:7: Declaration of i
+iter2.c:17:8: Iter intFor not balanced with end_intFor
+iter2.c:14:12: Iter intFor expects arg 2 to be int gets char: c
+iter2.c:19:17: Variable i used before definition
+iter2.c:19:17: Yield parameter is not simple identifier: i + 3
+iter2.c:22:24: Iter intFor not balanced with end_intFor: end_arrayElements
+iter2.h: (in iter intFor)
+iter2.h:2:27: Parameter ___x name is not consistent with macro variable
+                 namespace prefix "m_"
+iter2.h: (in iter arrayElements)
+iter2.h:8:31: Parameter ___x name is not consistent with macro variable
+                 namespace prefix "m_"
+iter2.h:8:43: Variable ___c name is not consistent with macro variable
+                 namespace prefix "m_"
+iter2.h:8:55: Variable ___b name is not consistent with macro variable
+                 namespace prefix "m_"
+iter2.h:9:1: Macro parameter j used in conditionally executed code (may or may
+                not be evaluated exactly once) (in post loop test)
+
+Finished LCLint checking --- 12 code errors found, as expected
diff --git a/test/iter2.c b/test/iter2.c
new file mode 100644
index 0000000..8011373
--- /dev/null
+++ b/test/iter2.c
@@ -0,0 +1,32 @@
+# include "iter2.h"
+
+int test (void)
+{
+  char c;
+  int i;
+  int *a;
+
+  intFor(2,5,x,z) /* 1. unrecognized identifier: x */
+    {
+      printf("%d\n", z);
+    } end_intFor;
+
+  intFor(2,c,x,i) /* 2, 3, 5. yield param shadows local, variable i declared but not used, type mismatch c */
+    {
+      ;
+    } ; /* 4. not balanced with end_intFor */
+
+  intFor(2,12,x,i+3) /* 6, 7. use i before def, yield param not simple */
+    {
+      ;
+    } end_arrayElements; /* 8. not balanced with end_intFor */
+
+  arrayElements(1, 10, a, el)
+    {
+      printf("%d\n", el);
+    } end_arrayElements;
+  return 3;
+}
+
+
+
diff --git a/test/iter2.h b/test/iter2.h
new file mode 100644
index 0000000..d2d1d8f
--- /dev/null
+++ b/test/iter2.h
@@ -0,0 +1,15 @@
+/*@iter intFor (int i, int j, int k, yield int val); @*/
+# define intFor(i, j, k, ___x) \
+  { int ___x = (i);  while ((___x) <= (j)) { (___x) += (k); 
+
+# define end_intFor }}
+
+/*@iter arrayElements (int i, int j, int *a, yield int el); @*/
+# define arrayElements(i,j,a,___x)\
+ { int ___c; int *(___b) = a; for (___c = (i); ___c <= (j); ___c++) { int ___x = *(___b); 
+   /* 9. j used more than once (in loop test) */
+
+# define end_arrayElements \
+  (___b)++; }}
+
+
diff --git a/test/keep.c b/test/keep.c
new file mode 100644
index 0000000..f7f14e4
--- /dev/null
+++ b/test/keep.c
@@ -0,0 +1,66 @@
+/*@only@*/ int *oglob;
+/*@keep@*/ int *kglob;
+
+void f1 (/*@keep@*/ int *x)
+{
+  kglob = x;
+  return;
+}
+
+void f2 (/*@keep@*/ int *x)
+{
+  free (x); /* 1. Keep storage passed as only param: x */
+}
+
+int f3 (/*@keep@*/ int *x)
+{
+  int *y = malloc (sizeof (int));
+
+  if (y == NULL) return 3; /* 2. Keep storage not transferred before return: x */
+
+  *y = 3;
+
+  f1 (x);
+  f1 (y);
+
+  return *x;
+}
+
+int f4 (/*@only@*/ int *x)
+{
+  return (f3 (x)); 
+}
+
+void f5 (/*@unused@*/ /*@keep@*/ int *x)
+{
+  return; /* 3. Keep storage not transferred before return: x */
+}
+
+void f6 (/*@keep@*/ int *x)
+{
+  if (*x > 3)
+    {
+      f2 (x);
+    } /* 4. Variable x is kept in true branch, but live in continuation. */
+
+  f2 (x); /* 5. Kept storage passed as keep: f2 (x) */
+}
+
+/*@null@*/ int *f7 (/*@null@*/ /*@keep@*/ int *x)
+{
+  if (x == NULL)
+    {
+      ;
+    }
+  else
+    {
+      f2 (x);
+    } 
+
+  return x; /* 6. Kept storage x returned as implicitly only: x */
+}
+
+
+
+
+
diff --git a/test/keep.expect b/test/keep.expect
new file mode 100644
index 0000000..41d75c5
--- /dev/null
+++ b/test/keep.expect
@@ -0,0 +1,20 @@
+
+keep.c: (in function f2)
+keep.c:12:9: Keep storage passed as only param: free (x)
+   keep.c:10:26: Storage x becomes keep
+keep.c: (in function f3)
+keep.c:19:27: Keep storage x not transferred before return
+   keep.c:15:25: Storage x becomes keep
+keep.c: (in function f5)
+keep.c:36:10: Keep storage x not transferred before return
+   keep.c:34:39: Storage x becomes keep
+keep.c: (in function f6)
+keep.c:44:5: Variable x is kept in true branch, but not kept in continuation.
+   keep.c:43:11: Storage x becomes kept
+keep.c:46:7: Kept storage x passed as keep param: f2 (x)
+   keep.c:44:5: Storage x becomes kept
+keep.c: (in function f7)
+keep.c:60:10: Kept storage x returned as implicitly only: x
+   keep.c:58:5: Storage x becomes kept
+
+Finished LCLint checking --- 6 code errors found, as expected
diff --git a/test/keep.out b/test/keep.out
new file mode 100644
index 0000000..41d75c5
--- /dev/null
+++ b/test/keep.out
@@ -0,0 +1,20 @@
+
+keep.c: (in function f2)
+keep.c:12:9: Keep storage passed as only param: free (x)
+   keep.c:10:26: Storage x becomes keep
+keep.c: (in function f3)
+keep.c:19:27: Keep storage x not transferred before return
+   keep.c:15:25: Storage x becomes keep
+keep.c: (in function f5)
+keep.c:36:10: Keep storage x not transferred before return
+   keep.c:34:39: Storage x becomes keep
+keep.c: (in function f6)
+keep.c:44:5: Variable x is kept in true branch, but not kept in continuation.
+   keep.c:43:11: Storage x becomes kept
+keep.c:46:7: Kept storage x passed as keep param: f2 (x)
+   keep.c:44:5: Storage x becomes kept
+keep.c: (in function f7)
+keep.c:60:10: Kept storage x returned as implicitly only: x
+   keep.c:58:5: Storage x becomes kept
+
+Finished LCLint checking --- 6 code errors found, as expected
diff --git a/test/libs.c b/test/libs.c
new file mode 100644
index 0000000..edd9431
--- /dev/null
+++ b/test/libs.c
@@ -0,0 +1,60 @@
+/*
+** test of standard library
+*/
+
+int compare (int x, int y)
+{
+  x = y;
+  return (3);
+}
+
+char *compare2 (int x, int y)
+{
+  x = y;
+  return "ok";
+}
+
+void
+leave (int i)
+{
+  exit ("hullo"); /* 1. Function exit expects arg 1 to be int gets char * */
+  exit (i);       /* 2. Unreachable code */
+} 
+
+void
+print (char *s, FILE *f)
+{
+  char c;
+
+  fprintf (f, s);
+  printf(s);
+  fprintf (stderr, s);
+
+  c = fgetc(f); /* 3. Assignment of int to char: c = fgetc(f) */
+  c = getc (f); /* 4. Assignment of int to char: c = getc(f) */
+}
+
+int
+main (void)
+{
+  unsigned int x;
+
+  x = NULL;
+  
+  /*@-null@*/ /* suppress errors for passing NULL's */
+  /*@-noeffect@*/
+  (void) bsearch (NULL, NULL, sizeof(int), compare) ;  /* 5, 6  */
+  (void) bsearch (NULL, NULL, sizeof(int), sizeof(int), (int (*) ()) compare) ; /* ok */
+  bsearch (NULL, NULL, sizeof(int), sizeof(int), (char (*) ()) compare2) ; /* 7, 8 */
+  /*@=noeffect@*/
+
+  qsort (NULL, x, x, (int (*)()) compare);
+  qsort (x, x, x, (char (*)()) compare2); /* 9, 10. */
+
+  signal (SIGHUP, compare); /* 11. */
+  signal (SIGHUP, leave);
+
+  return 23;
+}
+
+
diff --git a/test/libs.expect b/test/libs.expect
new file mode 100644
index 0000000..76f7fc2
--- /dev/null
+++ b/test/libs.expect
@@ -0,0 +1,172 @@
+
+libs.c: (in function compare2)
+libs.c:14:10: Observer storage returned without qualification: "ok"
+   libs.c:14:10: Storage becomes observer
+libs.c: (in function leave)
+libs.c:20:9: Function exit expects arg 1 to be int gets char *: "hullo"
+libs.c:21:3: Unreachable code: exit(i)
+libs.c: (in function print)
+libs.c:33:3: Assignment of int to char: c = fgetc(f)
+libs.c:34:3: Assignment of int to char: c = getc(f)
+libs.c: (in function main)
+libs.c:46:44: Function bsearch expects arg 4 to be size_t gets [function (int,
+                 int) returns int]: compare
+libs.c:46:10: Function bsearch called with 4 args, expects 5
+libs.c:48:50: Function bsearch expects arg 5 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:48:3: Return value (type void *) ignored: bsearch(NULL, NU...
+libs.c:52:10: Function qsort expects arg 1 to be void * gets unsigned int: x
+libs.c:52:19: Function qsort expects arg 4 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:54:11: Unrecognized identifier: SIGHUP
+libs.c:54:19: Function signal expects arg 2 to be [function (int) returns void]
+                 * gets [function (int, int) returns int]: compare
+libs.c:54:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, c...
+libs.c:55:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, l...
+
+Finished LCLint checking --- 15 code errors found, as expected
+
+libs.c: (in function compare2)
+libs.c:14:10: Observer storage returned without qualification: "ok"
+   libs.c:14:10: Storage becomes observer
+libs.c: (in function leave)
+libs.c:20:9: Function exit expects arg 1 to be int gets char *: "hullo"
+libs.c:21:3: Unreachable code: exit(i)
+libs.c: (in function print)
+libs.c:33:3: Assignment of int to char: c = fgetc(f)
+libs.c:34:3: Assignment of int to char: c = getc(f)
+libs.c: (in function main)
+libs.c:46:44: Function bsearch expects arg 4 to be size_t gets [function (int,
+                 int) returns int]: compare
+libs.c:46:10: Function bsearch called with 4 args, expects 5
+libs.c:48:50: Function bsearch expects arg 5 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:48:3: Return value (type void *) ignored: bsearch(NULL, NU...
+libs.c:51:16: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:51:19: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:52:10: Function qsort expects arg 1 to be void * gets unsigned int: x
+libs.c:52:13: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:52:16: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:52:19: Function qsort expects arg 4 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:54:11: Unrecognized identifier: SIGHUP
+libs.c:54:19: Function signal expects arg 2 to be [function (int) returns void]
+                 * gets [function (int, int) returns int]: compare
+libs.c:54:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, c...
+libs.c:55:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, l...
+
+Finished LCLint checking --- 19 code errors found, as expected
+
+libs.c: (in function compare2)
+libs.c:14:10: Observer storage returned without qualification: "ok"
+   libs.c:14:10: Storage becomes observer
+libs.c: (in function leave)
+libs.c:20:9: Function exit expects arg 1 to be int gets char *: "hullo"
+libs.c:21:3: Unreachable code: exit(i)
+libs.c: (in function print)
+libs.c:29:3: Undocumented modification of *f possible from call to fprintf:
+                fprintf(f, s)
+libs.c:33:7: Undocumented modification of *f possible from call to fgetc:
+                fgetc(f)
+libs.c:33:3: Assignment of int to char: c = fgetc(f)
+libs.c:34:7: Undocumented modification of *f possible from call to getc:
+                getc(f)
+libs.c:34:3: Assignment of int to char: c = getc(f)
+libs.c: (in function main)
+libs.c:46:44: Function bsearch expects arg 4 to be size_t gets [function (int,
+                 int) returns int]: compare
+libs.c:46:10: Function bsearch called with 4 args, expects 5
+libs.c:48:50: Function bsearch expects arg 5 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:48:3: Return value (type void *) ignored: bsearch(NULL, NU...
+libs.c:51:16: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:51:19: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:52:10: Function qsort expects arg 1 to be void * gets unsigned int: x
+libs.c:52:13: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:52:16: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:52:19: Function qsort expects arg 4 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:54:11: Unrecognized identifier: SIGHUP
+libs.c:54:19: Function signal expects arg 2 to be [function (int) returns void]
+                 * gets [function (int, int) returns int]: compare
+libs.c:54:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, c...
+libs.c:55:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, l...
+
+Finished LCLint checking --- 22 code errors found, as expected
+
+libs.c: (in function compare2)
+libs.c:14:10: Observer storage returned without qualification: "ok"
+   libs.c:14:10: Storage becomes observer
+libs.c: (in function leave)
+libs.c:20:9: Function exit expects arg 1 to be int gets char *: "hullo"
+libs.c:21:3: Unreachable code: exit(i)
+libs.c: (in function print)
+libs.c:29:3: Undocumented modification of *f possible from call to fprintf:
+                fprintf(f, s)
+libs.c:29:3: Return value (type int) ignored: fprintf(f, s)
+libs.c:30:3: Called procedure printf may access global stdout
+libs.c:30:3: Undocumented modification of *stdout possible from call to printf:
+                printf(s)
+libs.c:30:3: Return value (type int) ignored: printf(s)
+libs.c:31:12: Undocumented use of global stderr
+libs.c:31:3: Undocumented modification of *stderr possible from call to
+                fprintf: fprintf(stderr, s)
+libs.c:31:3: Return value (type int) ignored: fprintf(stderr, s)
+libs.c:33:7: Called procedure fgetc may access global errno
+libs.c:33:7: Undocumented modification of *f possible from call to fgetc:
+                fgetc(f)
+libs.c:33:7: Undocumented modification of errno possible from call to fgetc:
+                fgetc(f)
+libs.c:33:3: Assignment of int to char: c = fgetc(f)
+libs.c:34:7: Undocumented modification of *f possible from call to getc:
+                getc(f)
+libs.c:34:3: Assignment of int to char: c = getc(f)
+libs.c: (in function main)
+libs.c:46:44: Function bsearch expects arg 4 to be size_t gets [function (int,
+                 int) returns int]: compare
+libs.c:46:10: Function bsearch called with 4 args, expects 5
+libs.c:48:50: Function bsearch expects arg 5 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:48:3: Return value (type void *) ignored: bsearch(NULL, NU...
+libs.c:51:16: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:51:19: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:51:3: Called procedure qsort may access global errno
+libs.c:51:3: Undocumented modification of errno possible from call to qsort:
+                qsort(NULL, x, x, ([function () returns int] *)compare)
+libs.c:52:10: Function qsort expects arg 1 to be void * gets unsigned int: x
+libs.c:52:13: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:52:16: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:52:19: Function qsort expects arg 4 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:52:3: Called procedure qsort may access global errno
+libs.c:52:3: Undocumented modification of errno possible from call to qsort:
+                qsort(x, x, x, ([function () returns char] *)compare2)
+libs.c:54:11: Unrecognized identifier: SIGHUP
+libs.c:54:19: Function signal expects arg 2 to be [function (int) returns void]
+                 * gets [function (int, int) returns int]: compare
+libs.c:54:3: Called procedure signal may access global errno
+libs.c:54:3: Undocumented modification of errno possible from call to signal:
+                signal(SIGHUP, compare)
+libs.c:54:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, c...
+libs.c:55:3: Called procedure signal may access global errno
+libs.c:55:3: Undocumented modification of errno possible from call to signal:
+                signal(SIGHUP, leave)
+libs.c:55:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, l...
+
+Finished LCLint checking --- 39 code errors found, as expected
diff --git a/test/libs.out b/test/libs.out
new file mode 100644
index 0000000..76f7fc2
--- /dev/null
+++ b/test/libs.out
@@ -0,0 +1,172 @@
+
+libs.c: (in function compare2)
+libs.c:14:10: Observer storage returned without qualification: "ok"
+   libs.c:14:10: Storage becomes observer
+libs.c: (in function leave)
+libs.c:20:9: Function exit expects arg 1 to be int gets char *: "hullo"
+libs.c:21:3: Unreachable code: exit(i)
+libs.c: (in function print)
+libs.c:33:3: Assignment of int to char: c = fgetc(f)
+libs.c:34:3: Assignment of int to char: c = getc(f)
+libs.c: (in function main)
+libs.c:46:44: Function bsearch expects arg 4 to be size_t gets [function (int,
+                 int) returns int]: compare
+libs.c:46:10: Function bsearch called with 4 args, expects 5
+libs.c:48:50: Function bsearch expects arg 5 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:48:3: Return value (type void *) ignored: bsearch(NULL, NU...
+libs.c:52:10: Function qsort expects arg 1 to be void * gets unsigned int: x
+libs.c:52:19: Function qsort expects arg 4 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:54:11: Unrecognized identifier: SIGHUP
+libs.c:54:19: Function signal expects arg 2 to be [function (int) returns void]
+                 * gets [function (int, int) returns int]: compare
+libs.c:54:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, c...
+libs.c:55:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, l...
+
+Finished LCLint checking --- 15 code errors found, as expected
+
+libs.c: (in function compare2)
+libs.c:14:10: Observer storage returned without qualification: "ok"
+   libs.c:14:10: Storage becomes observer
+libs.c: (in function leave)
+libs.c:20:9: Function exit expects arg 1 to be int gets char *: "hullo"
+libs.c:21:3: Unreachable code: exit(i)
+libs.c: (in function print)
+libs.c:33:3: Assignment of int to char: c = fgetc(f)
+libs.c:34:3: Assignment of int to char: c = getc(f)
+libs.c: (in function main)
+libs.c:46:44: Function bsearch expects arg 4 to be size_t gets [function (int,
+                 int) returns int]: compare
+libs.c:46:10: Function bsearch called with 4 args, expects 5
+libs.c:48:50: Function bsearch expects arg 5 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:48:3: Return value (type void *) ignored: bsearch(NULL, NU...
+libs.c:51:16: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:51:19: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:52:10: Function qsort expects arg 1 to be void * gets unsigned int: x
+libs.c:52:13: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:52:16: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:52:19: Function qsort expects arg 4 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:54:11: Unrecognized identifier: SIGHUP
+libs.c:54:19: Function signal expects arg 2 to be [function (int) returns void]
+                 * gets [function (int, int) returns int]: compare
+libs.c:54:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, c...
+libs.c:55:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, l...
+
+Finished LCLint checking --- 19 code errors found, as expected
+
+libs.c: (in function compare2)
+libs.c:14:10: Observer storage returned without qualification: "ok"
+   libs.c:14:10: Storage becomes observer
+libs.c: (in function leave)
+libs.c:20:9: Function exit expects arg 1 to be int gets char *: "hullo"
+libs.c:21:3: Unreachable code: exit(i)
+libs.c: (in function print)
+libs.c:29:3: Undocumented modification of *f possible from call to fprintf:
+                fprintf(f, s)
+libs.c:33:7: Undocumented modification of *f possible from call to fgetc:
+                fgetc(f)
+libs.c:33:3: Assignment of int to char: c = fgetc(f)
+libs.c:34:7: Undocumented modification of *f possible from call to getc:
+                getc(f)
+libs.c:34:3: Assignment of int to char: c = getc(f)
+libs.c: (in function main)
+libs.c:46:44: Function bsearch expects arg 4 to be size_t gets [function (int,
+                 int) returns int]: compare
+libs.c:46:10: Function bsearch called with 4 args, expects 5
+libs.c:48:50: Function bsearch expects arg 5 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:48:3: Return value (type void *) ignored: bsearch(NULL, NU...
+libs.c:51:16: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:51:19: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:52:10: Function qsort expects arg 1 to be void * gets unsigned int: x
+libs.c:52:13: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:52:16: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:52:19: Function qsort expects arg 4 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:54:11: Unrecognized identifier: SIGHUP
+libs.c:54:19: Function signal expects arg 2 to be [function (int) returns void]
+                 * gets [function (int, int) returns int]: compare
+libs.c:54:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, c...
+libs.c:55:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, l...
+
+Finished LCLint checking --- 22 code errors found, as expected
+
+libs.c: (in function compare2)
+libs.c:14:10: Observer storage returned without qualification: "ok"
+   libs.c:14:10: Storage becomes observer
+libs.c: (in function leave)
+libs.c:20:9: Function exit expects arg 1 to be int gets char *: "hullo"
+libs.c:21:3: Unreachable code: exit(i)
+libs.c: (in function print)
+libs.c:29:3: Undocumented modification of *f possible from call to fprintf:
+                fprintf(f, s)
+libs.c:29:3: Return value (type int) ignored: fprintf(f, s)
+libs.c:30:3: Called procedure printf may access global stdout
+libs.c:30:3: Undocumented modification of *stdout possible from call to printf:
+                printf(s)
+libs.c:30:3: Return value (type int) ignored: printf(s)
+libs.c:31:12: Undocumented use of global stderr
+libs.c:31:3: Undocumented modification of *stderr possible from call to
+                fprintf: fprintf(stderr, s)
+libs.c:31:3: Return value (type int) ignored: fprintf(stderr, s)
+libs.c:33:7: Called procedure fgetc may access global errno
+libs.c:33:7: Undocumented modification of *f possible from call to fgetc:
+                fgetc(f)
+libs.c:33:7: Undocumented modification of errno possible from call to fgetc:
+                fgetc(f)
+libs.c:33:3: Assignment of int to char: c = fgetc(f)
+libs.c:34:7: Undocumented modification of *f possible from call to getc:
+                getc(f)
+libs.c:34:3: Assignment of int to char: c = getc(f)
+libs.c: (in function main)
+libs.c:46:44: Function bsearch expects arg 4 to be size_t gets [function (int,
+                 int) returns int]: compare
+libs.c:46:10: Function bsearch called with 4 args, expects 5
+libs.c:48:50: Function bsearch expects arg 5 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:48:3: Return value (type void *) ignored: bsearch(NULL, NU...
+libs.c:51:16: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:51:19: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:51:3: Called procedure qsort may access global errno
+libs.c:51:3: Undocumented modification of errno possible from call to qsort:
+                qsort(NULL, x, x, ([function () returns int] *)compare)
+libs.c:52:10: Function qsort expects arg 1 to be void * gets unsigned int: x
+libs.c:52:13: Function qsort expects arg 2 to be size_t gets unsigned int: x
+libs.c:52:16: Function qsort expects arg 3 to be size_t gets unsigned int: x
+libs.c:52:19: Function qsort expects arg 4 to be [function (void *, void *)
+    returns int] * gets [function () returns char] *:
+    ([function () returns char] *)compare2
+libs.c:52:3: Called procedure qsort may access global errno
+libs.c:52:3: Undocumented modification of errno possible from call to qsort:
+                qsort(x, x, x, ([function () returns char] *)compare2)
+libs.c:54:11: Unrecognized identifier: SIGHUP
+libs.c:54:19: Function signal expects arg 2 to be [function (int) returns void]
+                 * gets [function (int, int) returns int]: compare
+libs.c:54:3: Called procedure signal may access global errno
+libs.c:54:3: Undocumented modification of errno possible from call to signal:
+                signal(SIGHUP, compare)
+libs.c:54:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, c...
+libs.c:55:3: Called procedure signal may access global errno
+libs.c:55:3: Undocumented modification of errno possible from call to signal:
+                signal(SIGHUP, leave)
+libs.c:55:3: Return value (type [function (int) returns void]) ignored:
+                signal(SIGHUP, l...
+
+Finished LCLint checking --- 39 code errors found, as expected
diff --git a/test/lintcomments.c b/test/lintcomments.c
new file mode 100644
index 0000000..49f2290
--- /dev/null
+++ b/test/lintcomments.c
@@ -0,0 +1,28 @@
+int f (int x)
+{
+  int i = 0;
+
+  switch (x)
+    {
+    case 1: i++; /*@fallthrough@*/
+    case 2: i++; /*FALLTHROUGH*/
+    case 3: i++; /*FALLTHRU*/
+    case 4: i++;
+    default: i++;
+    }
+
+  if (i > 2)
+    {
+      return i;
+      /*@notreached@*/
+      i++;
+    }
+  else
+    {
+      return i;
+      /*NOTREACHED*/
+      i++;
+    }
+
+  /*@notreached@*/ return 3; 
+}
diff --git a/test/lintcomments.expect b/test/lintcomments.expect
new file mode 100644
index 0000000..f2a2fe2
--- /dev/null
+++ b/test/lintcomments.expect
@@ -0,0 +1,27 @@
+
+lintcomments.c: (in function f)
+lintcomments.c:8:33: Traditional lint comment /*FALLTHROUGH*/ used.  This is
+    interpreted by LCLint in the same way as most Unix lints, but it is
+    preferable to replace it with the /*@fallthrough@*/ stylized comment
+lintcomments.c:9:30: Traditional lint comment /*FALLTHRU*/ used.  This is
+    interpreted by LCLint in the same way as most Unix lints, but it is
+    preferable to replace it with the /*@fallthrough@*/ stylized comment
+lintcomments.c:11:13: Fall through case (no preceeding break)
+lintcomments.c:23:21: Traditional lint comment /*NOTREACHED*/ used.  This is
+    interpreted by LCLint in the same way as most Unix lints, but it is
+    preferable to replace it with the /*@notreached@*/ stylized comment.
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+lintcomments.c: (in function f)
+lintcomments.c:11:13: Fall through case (no preceeding break)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+lintcomments.c: (in function f)
+lintcomments.c:9:10: Fall through case (no preceeding break)
+lintcomments.c:10:10: Fall through case (no preceeding break)
+lintcomments.c:11:13: Fall through case (no preceeding break)
+lintcomments.c:24:8: Unreachable code: i++
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/lintcomments.out b/test/lintcomments.out
new file mode 100644
index 0000000..f2a2fe2
--- /dev/null
+++ b/test/lintcomments.out
@@ -0,0 +1,27 @@
+
+lintcomments.c: (in function f)
+lintcomments.c:8:33: Traditional lint comment /*FALLTHROUGH*/ used.  This is
+    interpreted by LCLint in the same way as most Unix lints, but it is
+    preferable to replace it with the /*@fallthrough@*/ stylized comment
+lintcomments.c:9:30: Traditional lint comment /*FALLTHRU*/ used.  This is
+    interpreted by LCLint in the same way as most Unix lints, but it is
+    preferable to replace it with the /*@fallthrough@*/ stylized comment
+lintcomments.c:11:13: Fall through case (no preceeding break)
+lintcomments.c:23:21: Traditional lint comment /*NOTREACHED*/ used.  This is
+    interpreted by LCLint in the same way as most Unix lints, but it is
+    preferable to replace it with the /*@notreached@*/ stylized comment.
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+lintcomments.c: (in function f)
+lintcomments.c:11:13: Fall through case (no preceeding break)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+lintcomments.c: (in function f)
+lintcomments.c:9:10: Fall through case (no preceeding break)
+lintcomments.c:10:10: Fall through case (no preceeding break)
+lintcomments.c:11:13: Fall through case (no preceeding break)
+lintcomments.c:24:8: Unreachable code: i++
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/list.c b/test/list.c
new file mode 100644
index 0000000..dbcd288
--- /dev/null
+++ b/test/list.c
@@ -0,0 +1,41 @@
+typedef /*@null@*/ struct _list
+{
+  /*@only@*/ char *this;
+  /*@null@*/ /*@only@*/ struct _list *next;
+} *list;
+
+extern /*@out@*/ /*@only@*/ void *
+  smalloc (size_t);
+
+void
+list_addh (/*@temp@*/ list l, 
+	   /*@only@*/ char *e)
+{
+  if (l != NULL)
+    {
+      while (l->next != NULL) 
+	{
+	  l = l->next;
+	}
+      
+      l->next = (list) 
+	smalloc (sizeof (*l->next));
+      l->next->this = e;
+    }
+}
+
+void
+list_addh2 (/*@temp@*/ list l, 
+	    /*@only@*/ char *e)
+{
+  list new;
+
+  assert (l != NULL);
+  assert (l->next == NULL);
+
+  new = (list) smalloc (sizeof (*l->next));
+  new->this = e;
+  l->next = new;
+}
+
+      
diff --git a/test/list.expect b/test/list.expect
new file mode 100644
index 0000000..ee785f8
--- /dev/null
+++ b/test/list.expect
@@ -0,0 +1,11 @@
+
+list.c: (in function list_addh)
+list.c:24:5: Variable e is kept in true branch, but not kept in continuation.
+   list.c:23:7: Storage e becomes kept
+list.c:25:2: Storage *(l->next) reachable from parameter contains 1 undefined
+                field: next
+list.c: (in function list_addh2)
+list.c:39:2: Storage *(l->next) reachable from parameter contains 1 undefined
+                field: next
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/list.out b/test/list.out
new file mode 100644
index 0000000..ee785f8
--- /dev/null
+++ b/test/list.out
@@ -0,0 +1,11 @@
+
+list.c: (in function list_addh)
+list.c:24:5: Variable e is kept in true branch, but not kept in continuation.
+   list.c:23:7: Storage e becomes kept
+list.c:25:2: Storage *(l->next) reachable from parameter contains 1 undefined
+                field: next
+list.c: (in function list_addh2)
+list.c:39:2: Storage *(l->next) reachable from parameter contains 1 undefined
+                field: next
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/macros.c b/test/macros.c
new file mode 100644
index 0000000..56d0f85
--- /dev/null
+++ b/test/macros.c
@@ -0,0 +1,29 @@
+# include "bool.h"
+
+# define mustard(a,b) ((a) + b + a) /* 1, 2, 3, 4. no proto, 2 no parens, a used twice */
+# define ketchup(a)   (a) /* 5. no proto */
+
+# define ok(a, b) ((a) + (b))
+#define needparen(a, b) (a + b)           /* 6, 7. no parens a and b */
+# define needuse(a, b) (a)                /* 8. b not used */
+# define multuse(a, b) ((a) + (a) + (b))  /* 9. a used twice */
+# define badassign(a,b) ((a) = (b))       /* 10. assignment to macro */
+# define badassign(a,b) ((a)++, ++(b))    /* 11, 12, 13. badassign already defined,
+					                 ++ on macro param */
+
+# define predok(a,b) (((a) == 9) ? (b) : -(b)) 
+# define predbad(a,b) (((a) == 8) ? (b) : -3)  /* 14. b not used on false */
+# define predbad2(a, b) (((a) == 2) ? (a) : (b) + (b)) /* 15, 16, 17. a used twice, 
+							  b used twice, not in true */
+# define badorder(a,b) ((b)+(a)) /* ok */
+# define okorder(a,b,c) (((a) == 2) ? (b) + (c) : (b) - (c))
+# define okorder2(a,b,c) (((a) == 2) ? (((b) == 3) ? (c) : -(c)) : (b) - (c))
+
+# define badval(a, b) ((a) == (b)) /* 18. return value */
+# define badconst 5                /* 19. type */
+# define goodconst ((5) == (3))
+# define worseconst(a) ((a) == 7)  /* 20. constant as parameterized macro */
+
+# define var 5                     /* 21. var as macro */
+# define var2(x) ((x) + (x))       /* 22, 23. var as parameterized macro, x used twice */
+typedef int twerp ;
diff --git a/test/macros.expect b/test/macros.expect
new file mode 100644
index 0000000..3f1aab7
--- /dev/null
+++ b/test/macros.expect
@@ -0,0 +1,129 @@
+
+macros.c: (in macro needparen)
+macros.c:7:26: Macro parameter used without parentheses: a
+macros.c:7:30: Macro parameter used without parentheses: b
+macros.c: (in macro needuse)
+macros.c:8:21: Macro parameter b not used
+   macros.lcl:6:1: Specification of b
+macros.c: (in macro multuse)
+macros.c:9:18: Macro parameter a used more than once
+macros.c: (in macro badassign)
+macros.c:10:26: Assignment to macro parameter: a
+macros.c:11: Macro badassign already defined
+   macros.c:10: Previous definition of badassign
+macros.c: (in macro badassign)
+macros.c:11:26: Operand of ++ is macro parameter (non-functional): (a)++
+macros.c:11:35: Operand of ++ is macro parameter (non-functional): ++(b)
+macros.c: (in macro predbad)
+macros.c:15:20: Macro parameter b used in true clause, but not in false clause
+macros.c: (in macro predbad2)
+macros.c:16:19: Macro parameter a used more than once
+macros.c:16:22: Macro parameter b used more than once
+macros.c: (in macro badval)
+macros.c:22:23: Function badval specified to return int, implemented as macro
+                   having type bool: ((a) == (b))
+   macros.lcl:14: Specification of badval
+macros.c: (in macro badconst)
+macros.c:23:20: Constant badconst specified as bool, but defined as int: 5
+   macros.lcl:18:15: Specification of badconst
+macros.c:25:21: Constant worseconst implemented as parameterized macro
+   macros.lcl:20:14: Specification of worseconst
+macros.c:27: Variable var implemented by a macro
+   macros.lcl:22:5: Specification of var
+macros.c:28: Variable var2 implemented as parameterized macro
+   macros.lcl:23:5: Specification of var2
+macros.c: (in macro var2)
+macros.c:28:15: Macro parameter x used more than once
+
+Finished LCLint checking --- 17 code errors found, as expected
+
+macros.c:3: Parameterized macro has no prototype or specification: mustard 
+macros.c: (in macro mustard)
+macros.c:3:30: Macro parameter used without parentheses: b
+macros.c:3:18: Macro parameter a used more than once
+macros.c:3:34: Macro parameter used without parentheses: a
+macros.c:4: Parameterized macro has no prototype or specification: ketchup 
+macros.c:6: Parameterized macro has no prototype or specification: ok 
+macros.c:7: Parameterized macro has no prototype or specification: needparen 
+macros.c: (in macro needparen)
+macros.c:7:26: Macro parameter used without parentheses: a
+macros.c:7:30: Macro parameter used without parentheses: b
+macros.c:8: Parameterized macro has no prototype or specification: needuse 
+macros.c: (in macro needuse)
+macros.c:8:21: Macro parameter b not used
+macros.c:9: Parameterized macro has no prototype or specification: multuse 
+macros.c: (in macro multuse)
+macros.c:9:18: Macro parameter a used more than once
+macros.c:10: Parameterized macro has no prototype or specification: badassign 
+macros.c: (in macro badassign)
+macros.c:10:26: Assignment to macro parameter: a
+macros.c:11: Macro badassign already defined
+   macros.c:10: Previous definition of badassign
+macros.c: (in macro badassign)
+macros.c:11:26: Operand of ++ is macro parameter (non-functional): (a)++
+macros.c:11:35: Operand of ++ is macro parameter (non-functional): ++(b)
+macros.c:14: Parameterized macro has no prototype or specification: predok 
+macros.c:15: Parameterized macro has no prototype or specification: predbad 
+macros.c: (in macro predbad)
+macros.c:15:20: Macro parameter b used in true clause, but not in false clause
+macros.c:16: Parameterized macro has no prototype or specification: predbad2 
+macros.c: (in macro predbad2)
+macros.c:16:19: Macro parameter a used more than once
+macros.c:16:22: Macro parameter b used more than once
+macros.c:18: Parameterized macro has no prototype or specification: badorder 
+macros.c:19: Parameterized macro has no prototype or specification: okorder 
+macros.c:20: Parameterized macro has no prototype or specification: okorder2 
+macros.c:22: Parameterized macro has no prototype or specification: badval 
+macros.c:23: Macro constant badconst not declared
+macros.c:24: Macro constant goodconst not declared
+macros.c:25: Parameterized macro has no prototype or specification: worseconst 
+macros.c:27: Macro constant var not declared
+macros.c:28: Parameterized macro has no prototype or specification: var2 
+macros.c: (in macro var2)
+macros.c:28:15: Macro parameter x used more than once
+
+Finished LCLint checking --- 34 code errors found, as expected
+
+macros.c:3: Parameterized macro has no prototype or specification: mustard 
+macros.c: (in macro mustard)
+macros.c:3:30: Macro parameter used without parentheses: b
+macros.c:3:18: Macro parameter a used more than once
+macros.c:3:34: Macro parameter used without parentheses: a
+macros.c:4: Parameterized macro has no prototype or specification: ketchup 
+macros.c:6: Parameterized macro has no prototype or specification: ok 
+macros.c:7: Parameterized macro has no prototype or specification: needparen 
+macros.c: (in macro needparen)
+macros.c:7:26: Macro parameter used without parentheses: a
+macros.c:7:30: Macro parameter used without parentheses: b
+macros.c:8: Parameterized macro has no prototype or specification: needuse 
+macros.c: (in macro needuse)
+macros.c:8:21: Macro parameter b not used
+macros.c:9: Parameterized macro has no prototype or specification: multuse 
+macros.c: (in macro multuse)
+macros.c:9:18: Macro parameter a used more than once
+macros.c:10: Parameterized macro has no prototype or specification: badassign 
+macros.c: (in macro badassign)
+macros.c:10:26: Assignment to macro parameter: a
+macros.c:11: Macro badassign already defined
+   macros.c:10: Previous definition of badassign
+macros.c: (in macro badassign)
+macros.c:11:26: Operand of ++ is macro parameter (non-functional): (a)++
+macros.c:11:35: Operand of ++ is macro parameter (non-functional): ++(b)
+macros.c:14: Parameterized macro has no prototype or specification: predok 
+macros.c:15: Parameterized macro has no prototype or specification: predbad 
+macros.c: (in macro predbad)
+macros.c:15:20: Macro parameter b used in true clause, but not in false clause
+macros.c:16: Parameterized macro has no prototype or specification: predbad2 
+macros.c: (in macro predbad2)
+macros.c:16:19: Macro parameter a used more than once
+macros.c:16:22: Macro parameter b used more than once
+macros.c:18: Parameterized macro has no prototype or specification: badorder 
+macros.c:19: Parameterized macro has no prototype or specification: okorder 
+macros.c:20: Parameterized macro has no prototype or specification: okorder2 
+macros.c:22: Parameterized macro has no prototype or specification: badval 
+macros.c:25: Parameterized macro has no prototype or specification: worseconst 
+macros.c:28: Parameterized macro has no prototype or specification: var2 
+macros.c: (in macro var2)
+macros.c:28:15: Macro parameter x used more than once
+
+Finished LCLint checking --- 31 code errors found, as expected
diff --git a/test/macros.lcl b/test/macros.lcl
new file mode 100644
index 0000000..3f4ddf5
--- /dev/null
+++ b/test/macros.lcl
@@ -0,0 +1,23 @@
+immutable type twerp { mustard, ketchup } ;
+
+int ok (int a, int b) { }
+int needparen (int a, int b) { }
+int needuse (int a, int b) { }
+int multuse (int a, int b) { }
+int badassign (int a, int b) { }
+int predok (int a, int b) { }
+int predbad (int a, int b) { }
+int predbad2 (int a, int b) { }
+int badorder (int a, int b) { } 
+int okorder (int a, int b, int c) { } 
+int okorder2 (int a, int b, int c) { }
+int badval (int a, int b) { } 
+
+immutable type bool;
+
+constant bool badconst;
+constant bool goodconst;
+constant int worseconst;
+
+int var;
+int var2;
\ No newline at end of file
diff --git a/test/macros.lcs b/test/macros.lcs
new file mode 100644
index 0000000..4d71723
--- /dev/null
+++ b/test/macros.lcs
@@ -0,0 +1,152 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort twerp immutable nil nil
+%LCLsort _int_Obj obj int nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :twerp -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype twerp twerp immutable
+%LCLfcn ok : int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn needparen : int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn needuse : int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn multuse : int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn badassign : int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn predok : int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn predbad : int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn predbad2 : int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn badorder : int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn okorder : int, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn okorder2 : int, int, int -> int 
+%LCLfcnGlobals 
+%LCLfcn badval : int, int -> int 
+%LCLfcnGlobals 
+%LCLconst badconst bool
+%LCLconst goodconst bool
+%LCLconst worseconst int
+%LCLvar var _int_Obj
+%LCLvar var2 _int_Obj
+%LCLSymbolTableEnd
diff --git a/test/macros.out b/test/macros.out
new file mode 100644
index 0000000..3f1aab7
--- /dev/null
+++ b/test/macros.out
@@ -0,0 +1,129 @@
+
+macros.c: (in macro needparen)
+macros.c:7:26: Macro parameter used without parentheses: a
+macros.c:7:30: Macro parameter used without parentheses: b
+macros.c: (in macro needuse)
+macros.c:8:21: Macro parameter b not used
+   macros.lcl:6:1: Specification of b
+macros.c: (in macro multuse)
+macros.c:9:18: Macro parameter a used more than once
+macros.c: (in macro badassign)
+macros.c:10:26: Assignment to macro parameter: a
+macros.c:11: Macro badassign already defined
+   macros.c:10: Previous definition of badassign
+macros.c: (in macro badassign)
+macros.c:11:26: Operand of ++ is macro parameter (non-functional): (a)++
+macros.c:11:35: Operand of ++ is macro parameter (non-functional): ++(b)
+macros.c: (in macro predbad)
+macros.c:15:20: Macro parameter b used in true clause, but not in false clause
+macros.c: (in macro predbad2)
+macros.c:16:19: Macro parameter a used more than once
+macros.c:16:22: Macro parameter b used more than once
+macros.c: (in macro badval)
+macros.c:22:23: Function badval specified to return int, implemented as macro
+                   having type bool: ((a) == (b))
+   macros.lcl:14: Specification of badval
+macros.c: (in macro badconst)
+macros.c:23:20: Constant badconst specified as bool, but defined as int: 5
+   macros.lcl:18:15: Specification of badconst
+macros.c:25:21: Constant worseconst implemented as parameterized macro
+   macros.lcl:20:14: Specification of worseconst
+macros.c:27: Variable var implemented by a macro
+   macros.lcl:22:5: Specification of var
+macros.c:28: Variable var2 implemented as parameterized macro
+   macros.lcl:23:5: Specification of var2
+macros.c: (in macro var2)
+macros.c:28:15: Macro parameter x used more than once
+
+Finished LCLint checking --- 17 code errors found, as expected
+
+macros.c:3: Parameterized macro has no prototype or specification: mustard 
+macros.c: (in macro mustard)
+macros.c:3:30: Macro parameter used without parentheses: b
+macros.c:3:18: Macro parameter a used more than once
+macros.c:3:34: Macro parameter used without parentheses: a
+macros.c:4: Parameterized macro has no prototype or specification: ketchup 
+macros.c:6: Parameterized macro has no prototype or specification: ok 
+macros.c:7: Parameterized macro has no prototype or specification: needparen 
+macros.c: (in macro needparen)
+macros.c:7:26: Macro parameter used without parentheses: a
+macros.c:7:30: Macro parameter used without parentheses: b
+macros.c:8: Parameterized macro has no prototype or specification: needuse 
+macros.c: (in macro needuse)
+macros.c:8:21: Macro parameter b not used
+macros.c:9: Parameterized macro has no prototype or specification: multuse 
+macros.c: (in macro multuse)
+macros.c:9:18: Macro parameter a used more than once
+macros.c:10: Parameterized macro has no prototype or specification: badassign 
+macros.c: (in macro badassign)
+macros.c:10:26: Assignment to macro parameter: a
+macros.c:11: Macro badassign already defined
+   macros.c:10: Previous definition of badassign
+macros.c: (in macro badassign)
+macros.c:11:26: Operand of ++ is macro parameter (non-functional): (a)++
+macros.c:11:35: Operand of ++ is macro parameter (non-functional): ++(b)
+macros.c:14: Parameterized macro has no prototype or specification: predok 
+macros.c:15: Parameterized macro has no prototype or specification: predbad 
+macros.c: (in macro predbad)
+macros.c:15:20: Macro parameter b used in true clause, but not in false clause
+macros.c:16: Parameterized macro has no prototype or specification: predbad2 
+macros.c: (in macro predbad2)
+macros.c:16:19: Macro parameter a used more than once
+macros.c:16:22: Macro parameter b used more than once
+macros.c:18: Parameterized macro has no prototype or specification: badorder 
+macros.c:19: Parameterized macro has no prototype or specification: okorder 
+macros.c:20: Parameterized macro has no prototype or specification: okorder2 
+macros.c:22: Parameterized macro has no prototype or specification: badval 
+macros.c:23: Macro constant badconst not declared
+macros.c:24: Macro constant goodconst not declared
+macros.c:25: Parameterized macro has no prototype or specification: worseconst 
+macros.c:27: Macro constant var not declared
+macros.c:28: Parameterized macro has no prototype or specification: var2 
+macros.c: (in macro var2)
+macros.c:28:15: Macro parameter x used more than once
+
+Finished LCLint checking --- 34 code errors found, as expected
+
+macros.c:3: Parameterized macro has no prototype or specification: mustard 
+macros.c: (in macro mustard)
+macros.c:3:30: Macro parameter used without parentheses: b
+macros.c:3:18: Macro parameter a used more than once
+macros.c:3:34: Macro parameter used without parentheses: a
+macros.c:4: Parameterized macro has no prototype or specification: ketchup 
+macros.c:6: Parameterized macro has no prototype or specification: ok 
+macros.c:7: Parameterized macro has no prototype or specification: needparen 
+macros.c: (in macro needparen)
+macros.c:7:26: Macro parameter used without parentheses: a
+macros.c:7:30: Macro parameter used without parentheses: b
+macros.c:8: Parameterized macro has no prototype or specification: needuse 
+macros.c: (in macro needuse)
+macros.c:8:21: Macro parameter b not used
+macros.c:9: Parameterized macro has no prototype or specification: multuse 
+macros.c: (in macro multuse)
+macros.c:9:18: Macro parameter a used more than once
+macros.c:10: Parameterized macro has no prototype or specification: badassign 
+macros.c: (in macro badassign)
+macros.c:10:26: Assignment to macro parameter: a
+macros.c:11: Macro badassign already defined
+   macros.c:10: Previous definition of badassign
+macros.c: (in macro badassign)
+macros.c:11:26: Operand of ++ is macro parameter (non-functional): (a)++
+macros.c:11:35: Operand of ++ is macro parameter (non-functional): ++(b)
+macros.c:14: Parameterized macro has no prototype or specification: predok 
+macros.c:15: Parameterized macro has no prototype or specification: predbad 
+macros.c: (in macro predbad)
+macros.c:15:20: Macro parameter b used in true clause, but not in false clause
+macros.c:16: Parameterized macro has no prototype or specification: predbad2 
+macros.c: (in macro predbad2)
+macros.c:16:19: Macro parameter a used more than once
+macros.c:16:22: Macro parameter b used more than once
+macros.c:18: Parameterized macro has no prototype or specification: badorder 
+macros.c:19: Parameterized macro has no prototype or specification: okorder 
+macros.c:20: Parameterized macro has no prototype or specification: okorder2 
+macros.c:22: Parameterized macro has no prototype or specification: badval 
+macros.c:25: Parameterized macro has no prototype or specification: worseconst 
+macros.c:28: Parameterized macro has no prototype or specification: var2 
+macros.c: (in macro var2)
+macros.c:28:15: Macro parameter x used more than once
+
+Finished LCLint checking --- 31 code errors found, as expected
diff --git a/test/macrosef.c b/test/macrosef.c
new file mode 100644
index 0000000..f4a7f7e
--- /dev/null
+++ b/test/macrosef.c
@@ -0,0 +1,15 @@
+int f(/*@sef@*/ int x, int y);
+# define f(x,y) ((x) + (x) + (y) + (y)) /* 1. */
+
+int g (int *p)
+{
+  *p++;
+  return *p;
+}
+
+int m (int *p)
+{
+  int x = f ((printf ("yo\n"), 3), g(p));
+
+  return (f (g (p), x));
+}
diff --git a/test/macrosef.expect b/test/macrosef.expect
new file mode 100644
index 0000000..ea001c1
--- /dev/null
+++ b/test/macrosef.expect
@@ -0,0 +1,34 @@
+
+macrosef.c: (in macro f)
+macrosef.c:2:14: Macro parameter y used more than once
+macrosef.c: (in function m)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     file system state: (printf("yo\n"), 3)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     *stdout: (printf("yo\n"), 3)
+macrosef.c:14:14: Parameter 1 to f is declared sef, but the argument may modify
+                     *p: g(p)
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+macrosef.c: (in macro f)
+macrosef.c:2:14: Macro parameter y used more than once
+macrosef.c: (in function m)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     file system state: (printf("yo\n"), 3)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     *stdout: (printf("yo\n"), 3)
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+macrosef.c: (in macro f)
+macrosef.c:2:14: Macro parameter y used more than once
+macrosef.c: (in function m)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     file system state: (printf("yo\n"), 3)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     *stdout: (printf("yo\n"), 3)
+macrosef.c:14:14: Parameter 1 to f is declared sef, but the argument calls
+    unconstrained function g (no guarantee it will not modify something): g(p)
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/macrosef.lcl b/test/macrosef.lcl
new file mode 100644
index 0000000..69a94a5
--- /dev/null
+++ b/test/macrosef.lcl
@@ -0,0 +1,3 @@
+int f (sef int x, int y);
+
+int g (int *x) { modifies *x; }
\ No newline at end of file
diff --git a/test/macrosef.lcs b/test/macrosef.lcs
new file mode 100644
index 0000000..bfd6a5f
--- /dev/null
+++ b/test/macrosef.lcs
@@ -0,0 +1,137 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _HOF_sort_13 hof nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLvar f _HOF_sort_13
+%LCLfcn g : __int_Obj_Ptr -> int 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/macrosef.out b/test/macrosef.out
new file mode 100644
index 0000000..ea001c1
--- /dev/null
+++ b/test/macrosef.out
@@ -0,0 +1,34 @@
+
+macrosef.c: (in macro f)
+macrosef.c:2:14: Macro parameter y used more than once
+macrosef.c: (in function m)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     file system state: (printf("yo\n"), 3)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     *stdout: (printf("yo\n"), 3)
+macrosef.c:14:14: Parameter 1 to f is declared sef, but the argument may modify
+                     *p: g(p)
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+macrosef.c: (in macro f)
+macrosef.c:2:14: Macro parameter y used more than once
+macrosef.c: (in function m)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     file system state: (printf("yo\n"), 3)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     *stdout: (printf("yo\n"), 3)
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+macrosef.c: (in macro f)
+macrosef.c:2:14: Macro parameter y used more than once
+macrosef.c: (in function m)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     file system state: (printf("yo\n"), 3)
+macrosef.c:12:14: Parameter 1 to f is declared sef, but the argument may modify
+                     *stdout: (printf("yo\n"), 3)
+macrosef.c:14:14: Parameter 1 to f is declared sef, but the argument calls
+    unconstrained function g (no guarantee it will not modify something): g(p)
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/merge.c b/test/merge.c
new file mode 100644
index 0000000..a6a5e4b
--- /dev/null
+++ b/test/merge.c
@@ -0,0 +1,55 @@
+/*@null@*/ int *x;
+
+void f1 (void)
+{
+  int *y = x;
+
+  if (3 > 4)
+    {
+      ;
+    }
+  else
+    {
+      x = NULL;
+      if (y != NULL) free (y);
+    }
+  /* y is unuseable...but no error yet */
+}
+
+void f2 (void)
+{
+  int *y = x;
+
+  if (3 > 4)
+    {
+      ;
+    }
+  else
+    {
+      x = NULL;
+      if (y != NULL) free (y);
+    }
+
+  *y = 23; /* 1. Variable y used in inconsistent state */
+}          /* 2. Dereference of possibly null pointer y: *y */
+
+void f3 (void)
+{
+  int *y = x;
+
+  if (3 > 4)
+    {
+      ;
+    }
+  else
+    {
+      x = NULL;
+      if (y != NULL) free (y);
+    }
+
+  y = x;
+  *y = 23; /* 3. Dereference of possibly null pointer y: *y */
+}
+
+
+
diff --git a/test/merge.expect b/test/merge.expect
new file mode 100644
index 0000000..3b93b60
--- /dev/null
+++ b/test/merge.expect
@@ -0,0 +1,11 @@
+
+merge.c: (in function f2)
+merge.c:33:4: Variable y used in inconsistent state
+   merge.c:30:28: Storage y becomes inconsistent (released on one branch)
+merge.c:33:4: Dereference of possibly null pointer y: *y
+   merge.c:21:12: Storage y may become null
+merge.c: (in function f3)
+merge.c:51:4: Dereference of possibly null pointer y: *y
+   merge.c:50:7: Storage y may become null
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/merge.out b/test/merge.out
new file mode 100644
index 0000000..3b93b60
--- /dev/null
+++ b/test/merge.out
@@ -0,0 +1,11 @@
+
+merge.c: (in function f2)
+merge.c:33:4: Variable y used in inconsistent state
+   merge.c:30:28: Storage y becomes inconsistent (released on one branch)
+merge.c:33:4: Dereference of possibly null pointer y: *y
+   merge.c:21:12: Storage y may become null
+merge.c: (in function f3)
+merge.c:51:4: Dereference of possibly null pointer y: *y
+   merge.c:50:7: Storage y may become null
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/minc1.h b/test/minc1.h
new file mode 100644
index 0000000..4912c4d
--- /dev/null
+++ b/test/minc1.h
@@ -0,0 +1,4 @@
+# include "minc4.h"
+# include "minc5.h"
+# include "minc2.h"
+# include "minc3.h"
diff --git a/test/minc2.h b/test/minc2.h
new file mode 100644
index 0000000..1791d49
--- /dev/null
+++ b/test/minc2.h
@@ -0,0 +1,3 @@
+# include "minc3.h"
+# include "minc4.h"
+# include "minc5.h"
diff --git a/test/minc3.h b/test/minc3.h
new file mode 100644
index 0000000..24afd5c
--- /dev/null
+++ b/test/minc3.h
@@ -0,0 +1,2 @@
+# include "minc4.h"
+# include "minc5.h"
diff --git a/test/minc4.h b/test/minc4.h
new file mode 100644
index 0000000..ac95244
--- /dev/null
+++ b/test/minc4.h
@@ -0,0 +1 @@
+# include "minc5.h"
diff --git a/test/minc5.h b/test/minc5.h
new file mode 100644
index 0000000..83e1cc6
--- /dev/null
+++ b/test/minc5.h
@@ -0,0 +1 @@
+/* yabba */
diff --git a/test/modclient.c b/test/modclient.c
new file mode 100644
index 0000000..e0088c6
--- /dev/null
+++ b/test/modclient.c
@@ -0,0 +1,7 @@
+int mod (int p[])
+{
+  (void) f1 (p); /* 6. Statement has no effect: (void)f1(p) */
+  (void) f2 (p);
+
+  return 5;
+}
diff --git a/test/modifies.c b/test/modifies.c
new file mode 100644
index 0000000..854d01d
--- /dev/null
+++ b/test/modifies.c
@@ -0,0 +1,37 @@
+# include "modifies.h"
+
+static int mstat;
+static /*@unused@*/ int internalState;
+
+int f3 (int p[]) 
+   /*@modifies internalState, fileSystem;@*/ ; /* 1. Modifies list uses ... */
+
+int f4 (int p[]) 
+   /*@modifies p[3];@*/;
+
+int f5 (int fileSystem) 
+   /*@modifies fileSystem;@*/ ; /* 2. Modifies list uses fileSystem ... */
+
+int f6 (void);
+
+int f6 (void) /*@modifies mstat;@*/ /* 3. Implementation modifies list for ... */
+{ 
+  return (mstat++);
+}
+
+int f1 (/*@unused@*/ int p[])
+{
+  mstat++; /* 4. Suspect modification of mstat: mstat++ */
+  return mstat;
+}
+
+int f2 (/*@unused@*/ int p[]) /*@modifies mstat;@*/
+{
+  mstat++;
+  return 3;
+}
+
+int g2 (/*@unused@*/ int p[]) 
+{
+  return 3;
+} /* 5. Function g2 specified to modify internal state but no internal */
diff --git a/test/modifies.expect b/test/modifies.expect
new file mode 100644
index 0000000..09ac059
--- /dev/null
+++ b/test/modifies.expect
@@ -0,0 +1,22 @@
+
+modifies.c:7:29: Modifies list uses internalState which is a variable and has
+    special meaning in a modifies list.  (Special meaning assumed.)
+   modifies.c:4:25: Declaration of internalState
+modifies.c:13:26: Modifies list uses fileSystem which is a parameter and has
+    special meaning in a modifies list.  (Special meaning assumed.)
+modifies.c:17:5: Globals list for f6 includes internal state, mstat, but
+                    previously declared without globals internalState.
+   modifies.c:15:5: Declaration of f6
+modifies.c:17:5: Modifies list for f6 includes internal state, but previously
+                    declared without modifies internal.
+   modifies.c:15:5: Declaration of f6
+modifies.c: (in function f1)
+modifies.c:24:3: Undocumented modification of mstat: mstat++
+modifies.c: (in function g2)
+modifies.c:37:1: Function g2 specified to modify internal state but no internal
+                    state is modified
+   modifies.h:3:12: Declaration of g2
+modclient.c: (in function mod)
+modclient.c:3:3: Statement has no effect: (void)f1(p)
+
+Finished LCLint checking --- 7 code errors found, as expected
diff --git a/test/modifies.h b/test/modifies.h
new file mode 100644
index 0000000..4aa95b0
--- /dev/null
+++ b/test/modifies.h
@@ -0,0 +1,4 @@
+extern int f1 (int p[]) /*@modifies nothing @*/ ;
+extern int f2 (int p[]) /*@modifies internalState @*/ ;
+extern int g2 (int p[]) /*@modifies internalState @*/ ;
+
diff --git a/test/modifies.out b/test/modifies.out
new file mode 100644
index 0000000..09ac059
--- /dev/null
+++ b/test/modifies.out
@@ -0,0 +1,22 @@
+
+modifies.c:7:29: Modifies list uses internalState which is a variable and has
+    special meaning in a modifies list.  (Special meaning assumed.)
+   modifies.c:4:25: Declaration of internalState
+modifies.c:13:26: Modifies list uses fileSystem which is a parameter and has
+    special meaning in a modifies list.  (Special meaning assumed.)
+modifies.c:17:5: Globals list for f6 includes internal state, mstat, but
+                    previously declared without globals internalState.
+   modifies.c:15:5: Declaration of f6
+modifies.c:17:5: Modifies list for f6 includes internal state, but previously
+                    declared without modifies internal.
+   modifies.c:15:5: Declaration of f6
+modifies.c: (in function f1)
+modifies.c:24:3: Undocumented modification of mstat: mstat++
+modifies.c: (in function g2)
+modifies.c:37:1: Function g2 specified to modify internal state but no internal
+                    state is modified
+   modifies.h:3:12: Declaration of g2
+modclient.c: (in function mod)
+modclient.c:3:3: Statement has no effect: (void)f1(p)
+
+Finished LCLint checking --- 7 code errors found, as expected
diff --git a/test/modtest.c b/test/modtest.c
new file mode 100644
index 0000000..458a16a
--- /dev/null
+++ b/test/modtest.c
@@ -0,0 +1,37 @@
+int x, y, ai[], bi[];
+
+typedef struct _ts { int a; int b; } tst;
+
+tst ts;
+
+tst *tstp;
+
+int g (int a[], int *p)
+{
+  return 7;
+}
+
+int f (int i[], int *j)
+{
+  i[3] = y;
+  j[2] = x;
+  ai[3] = 5;
+  ai[4] = 8;   /* not a modification error ai[x'] */
+  i = j;
+  x++;
+  y++;
+  ts.a = i[2];
+  ts.b = tstp->a;
+  tstp->b = 6;
+  g(j, i);
+
+  return 3;
+}
+
+int h(int a[])
+{
+  y++;
+  (void) g(a, &x);
+  return y;
+}
+
diff --git a/test/modtest.expect b/test/modtest.expect
new file mode 100644
index 0000000..b91492f
--- /dev/null
+++ b/test/modtest.expect
@@ -0,0 +1,59 @@
+
+modtest.c: (in function g)
+modtest.lcl:15: Global x listed but not used
+modtest.lcl:15: Global y listed but not used
+modtest.c:9:12: Parameter a not used
+modtest.c:9:22: Parameter p not used
+modtest.c: (in function f)
+modtest.c:16:3: Undocumented modification of i[3]: i[3] = y
+modtest.c:17:3: Undocumented modification of j[2]: j[2] = x
+modtest.c:22:3: Undocumented modification of y: y++
+modtest.c:25:3: Undocumented modification of tstp->b: tstp->b = 6
+modtest.c:26:3: Undocumented modification of y possible from call to g: g(j, i)
+modtest.c:26:3: Return value (type int) ignored: g(j, i)
+
+Finished LCLint checking --- 10 code errors found, as expected
+
+modtest.c: (in function g)
+modtest.lcl:15: Global x listed but not used
+modtest.lcl:15: Global y listed but not used
+modtest.c:9:12: Parameter a not used
+modtest.c:9:22: Parameter p not used
+modtest.c: (in function f)
+modtest.c:16:3: Undocumented modification of i[3]: i[3] = y
+modtest.c:17:3: Undocumented modification of j[2]: j[2] = x
+modtest.c:22:3: Undocumented modification of y: y++
+modtest.c:25:3: Undocumented modification of tstp->b: tstp->b = 6
+modtest.c:26:3: Undocumented modification of y possible from call to g: g(j, i)
+modtest.c:26:3: Return value (type int) ignored: g(j, i)
+modtest.c: (in function h)
+modtest.c:33:3: Undocumented modification of y: y++
+modtest.c:34:10: Undocumented modification of x possible from call to g:
+                    g(a, &x)
+modtest.c:34:10: Undocumented modification of y possible from call to g:
+                    g(a, &x)
+
+Finished LCLint checking --- 13 code errors found, as expected
+
+modtest.c: (in function g)
+modtest.lcl:15: Global x listed but not used
+modtest.lcl:15: Global y listed but not used
+modtest.c:12:1: Suspect object listed in modifies of g not modified: x
+   modtest.lcl:15: Specification of g
+modtest.c:12:1: Suspect object listed in modifies of g not modified: y
+   modtest.lcl:15: Specification of g
+modtest.c:9:12: Parameter a not used
+modtest.c:9:22: Parameter p not used
+modtest.c: (in function f)
+modtest.c:16:3: Undocumented modification of i[3]: i[3] = y
+modtest.c:17:3: Undocumented modification of j[2]: j[2] = x
+modtest.c:22:3: Undocumented modification of y: y++
+modtest.c:25:3: Undocumented modification of tstp->b: tstp->b = 6
+modtest.c:26:3: Undocumented modification of y possible from call to g: g(j, i)
+modtest.c:26:3: Return value (type int) ignored: g(j, i)
+modtest.c:29:1: Suspect object listed in modifies of f not modified: ai[6]
+   modtest.lcl:8: Specification of f
+modtest.c:29:1: Suspect object listed in modifies of f not modified: tstp->a
+   modtest.lcl:8: Specification of f
+
+Finished LCLint checking --- 14 code errors found, as expected
diff --git a/test/modtest.lcl b/test/modtest.lcl
new file mode 100644
index 0000000..2840f75
--- /dev/null
+++ b/test/modtest.lcl
@@ -0,0 +1,20 @@
+int x, y;
+int ai[];
+int bi[];
+typedef struct _ts { int a; int b; } tst;
+tst ts;
+tst *tstp ;
+
+int f (int i[], int *j) int ai[]; int x, y; tst ts; tst* tstp; 
+{
+  let elt be ai[6];
+  modifies elt, x, ai[3], ai[3+6], ai[x'], ts.a, tstp'->a, ts;
+  ensures true;
+}
+
+int g (int a[], int *p) int x, y;
+{
+   modifies x, y;
+   ensures true;
+}
+
diff --git a/test/modtest.lcs b/test/modtest.lcs
new file mode 100644
index 0000000..c3a68ae
--- /dev/null
+++ b/test/modtest.lcs
@@ -0,0 +1,174 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort __ts_Struct str _ts nil
+%LCLsort b strMem _int_Obj nil
+%LCLsort a strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort __ts_Struct_Tuple tup __ts_Struct nil
+%LCLsort ___ts_Struct_Ptr ptr __ts_Struct nil
+%LCLsort ___ts_Struct_Arr arr __ts_Struct nil
+%LCLsort ___ts_Struct_Tuple_Vec vec __ts_Struct_Tuple ___ts_Struct_Arr
+%LCLsort _tst synonym __ts_Struct nil
+%LCLsort ____ts_Struct_Ptr_Obj obj ___ts_Struct_Ptr nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 3 : -> double
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 6 : -> double
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLtag _ts struct
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop [__, __] :int, int -> __ts_Struct_Tuple
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :___ts_Struct_Ptr -> ___ts_Struct_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ [__] :___ts_Struct_Tuple_Vec, int -> __ts_Struct_Tuple
+%LCLop __ [__] :___ts_Struct_Arr, int -> __ts_Struct
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop __ \select a :__ts_Struct_Tuple -> int
+%LCLop __ \select a :__ts_Struct -> _int_Obj
+%LCLop __ \select b :__ts_Struct_Tuple -> int
+%LCLop __ \select b :__ts_Struct -> _int_Obj
+%LCLop __ \field_arrow a :___ts_Struct_Ptr -> _int_Obj
+%LCLop null : -> char
+%LCLop __ \field_arrow b :___ts_Struct_Ptr -> _int_Obj
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> ___ts_Struct_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :___ts_Struct_Ptr, int -> ___ts_Struct_Ptr
+%LCLop __ + __  :int, ___ts_Struct_Ptr -> ___ts_Struct_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :___ts_Struct_Ptr, int -> ___ts_Struct_Ptr
+%LCLop __ - __  :___ts_Struct_Ptr, ___ts_Struct_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop isSub :___ts_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :___ts_Struct_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLvar x _int_Obj
+%LCLvar y _int_Obj
+%LCLvar ai __int_Obj_Arr
+%LCLvar bi __int_Obj_Arr
+%LCLtype tst _tst exposed
+%LCLvar ts __ts_Struct
+%LCLvar tstp ____ts_Struct_Ptr_Obj
+%LCLfcn f : __int_Obj_Arr, __int_Obj_Ptr -> int 
+%LCLfcnGlobals __int_Obj_Arr ai; _int_Obj x; _int_Obj y; __ts_Struct ts; ____ts_Struct_Ptr_Obj tstp; 
+%LCLfcn g : __int_Obj_Arr, __int_Obj_Ptr -> int 
+%LCLfcnGlobals _int_Obj x; _int_Obj y; 
+%LCLSymbolTableEnd
diff --git a/test/modtest.out b/test/modtest.out
new file mode 100644
index 0000000..b91492f
--- /dev/null
+++ b/test/modtest.out
@@ -0,0 +1,59 @@
+
+modtest.c: (in function g)
+modtest.lcl:15: Global x listed but not used
+modtest.lcl:15: Global y listed but not used
+modtest.c:9:12: Parameter a not used
+modtest.c:9:22: Parameter p not used
+modtest.c: (in function f)
+modtest.c:16:3: Undocumented modification of i[3]: i[3] = y
+modtest.c:17:3: Undocumented modification of j[2]: j[2] = x
+modtest.c:22:3: Undocumented modification of y: y++
+modtest.c:25:3: Undocumented modification of tstp->b: tstp->b = 6
+modtest.c:26:3: Undocumented modification of y possible from call to g: g(j, i)
+modtest.c:26:3: Return value (type int) ignored: g(j, i)
+
+Finished LCLint checking --- 10 code errors found, as expected
+
+modtest.c: (in function g)
+modtest.lcl:15: Global x listed but not used
+modtest.lcl:15: Global y listed but not used
+modtest.c:9:12: Parameter a not used
+modtest.c:9:22: Parameter p not used
+modtest.c: (in function f)
+modtest.c:16:3: Undocumented modification of i[3]: i[3] = y
+modtest.c:17:3: Undocumented modification of j[2]: j[2] = x
+modtest.c:22:3: Undocumented modification of y: y++
+modtest.c:25:3: Undocumented modification of tstp->b: tstp->b = 6
+modtest.c:26:3: Undocumented modification of y possible from call to g: g(j, i)
+modtest.c:26:3: Return value (type int) ignored: g(j, i)
+modtest.c: (in function h)
+modtest.c:33:3: Undocumented modification of y: y++
+modtest.c:34:10: Undocumented modification of x possible from call to g:
+                    g(a, &x)
+modtest.c:34:10: Undocumented modification of y possible from call to g:
+                    g(a, &x)
+
+Finished LCLint checking --- 13 code errors found, as expected
+
+modtest.c: (in function g)
+modtest.lcl:15: Global x listed but not used
+modtest.lcl:15: Global y listed but not used
+modtest.c:12:1: Suspect object listed in modifies of g not modified: x
+   modtest.lcl:15: Specification of g
+modtest.c:12:1: Suspect object listed in modifies of g not modified: y
+   modtest.lcl:15: Specification of g
+modtest.c:9:12: Parameter a not used
+modtest.c:9:22: Parameter p not used
+modtest.c: (in function f)
+modtest.c:16:3: Undocumented modification of i[3]: i[3] = y
+modtest.c:17:3: Undocumented modification of j[2]: j[2] = x
+modtest.c:22:3: Undocumented modification of y: y++
+modtest.c:25:3: Undocumented modification of tstp->b: tstp->b = 6
+modtest.c:26:3: Undocumented modification of y possible from call to g: g(j, i)
+modtest.c:26:3: Return value (type int) ignored: g(j, i)
+modtest.c:29:1: Suspect object listed in modifies of f not modified: ai[6]
+   modtest.lcl:8: Specification of f
+modtest.c:29:1: Suspect object listed in modifies of f not modified: tstp->a
+   modtest.lcl:8: Specification of f
+
+Finished LCLint checking --- 14 code errors found, as expected
diff --git a/test/moduncon.c b/test/moduncon.c
new file mode 100644
index 0000000..0ca5dbd
--- /dev/null
+++ b/test/moduncon.c
@@ -0,0 +1,15 @@
+int *mmod (int *);
+int *umod (int *);
+
+int f (int *x)
+{
+  (void) umod (mmod (umod (x)));
+  return *x;
+}
+
+int g (int *x) /*@*/
+{
+  (void) umod (x);
+  (void) umod (mmod (umod (x)));
+  return *x;
+}
diff --git a/test/moduncon.expect b/test/moduncon.expect
new file mode 100644
index 0000000..160777d
--- /dev/null
+++ b/test/moduncon.expect
@@ -0,0 +1,57 @@
+
+moduncon.c: (in function g)
+moduncon.c:12:10: Undetected modification possible from call to unconstrained
+                     function umod: umod
+moduncon.c:13:22: Undetected modification possible from call to unconstrained
+                     function umod: umod
+moduncon.c:13:16: Undetected modification possible from call to unconstrained
+                     function mmod: mmod
+moduncon.c:13:10: Undetected modification possible from call to unconstrained
+                     function umod: umod
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+moduncon.c: (in function f)
+moduncon.c:6:22: Undetected modification possible from call to unconstrained
+                    function umod: umod
+moduncon.c:6:22: New fresh storage passed as implicitly temp (not released):
+                    umod(x)
+moduncon.c:6:16: Undetected modification possible from call to unconstrained
+                    function mmod: mmod
+moduncon.c:6:16: New fresh storage passed as implicitly temp (not released):
+                    mmod(umod(x))
+moduncon.c:6:10: Undetected modification possible from call to unconstrained
+                    function umod: umod
+moduncon.c:6:3: Statement has no effect (possible undected modification through
+    call to unconstrained functions umod, mmod): (void)umod(mmod(...
+moduncon.c: (in function g)
+moduncon.c:12:10: Undetected modification possible from call to unconstrained
+                     function umod: umod
+moduncon.c:12:3: Statement has no effect (possible undected modification
+                    through call to unconstrained function umod): (void)umod(x)
+moduncon.c:13:22: Undetected modification possible from call to unconstrained
+                     function umod: umod
+moduncon.c:13:22: New fresh storage passed as implicitly temp (not released):
+                     umod(x)
+moduncon.c:13:16: Undetected modification possible from call to unconstrained
+                     function mmod: mmod
+moduncon.c:13:16: New fresh storage passed as implicitly temp (not released):
+                     mmod(umod(x))
+moduncon.c:13:10: Undetected modification possible from call to unconstrained
+                     function umod: umod
+moduncon.c:13:3: Statement has no effect (possible undected modification
+    through call to unconstrained functions umod, mmod): (void)umod(mmod(...
+moduncon.c:1:6: Function mmod declared but not defined
+moduncon.c:2:6: Function umod declared but not defined
+moduncon.c:4:5: Function f declared but not used
+   moduncon.c:8:1: Definition of f
+moduncon.c:10:5: Function g declared but not used
+   moduncon.c:15:1: Definition of g
+moduncon.c:1:6: Function mmod exported but not declared in header file
+moduncon.c:2:6: Function umod exported but not declared in header file
+moduncon.c:4:5: Function f exported but not declared in header file
+   moduncon.c:8:1: Definition of f
+moduncon.c:10:5: Function g exported but not declared in header file
+   moduncon.c:15:1: Definition of g
+
+Finished LCLint checking --- 22 code errors found, as expected
diff --git a/test/moduncon.out b/test/moduncon.out
new file mode 100644
index 0000000..160777d
--- /dev/null
+++ b/test/moduncon.out
@@ -0,0 +1,57 @@
+
+moduncon.c: (in function g)
+moduncon.c:12:10: Undetected modification possible from call to unconstrained
+                     function umod: umod
+moduncon.c:13:22: Undetected modification possible from call to unconstrained
+                     function umod: umod
+moduncon.c:13:16: Undetected modification possible from call to unconstrained
+                     function mmod: mmod
+moduncon.c:13:10: Undetected modification possible from call to unconstrained
+                     function umod: umod
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+moduncon.c: (in function f)
+moduncon.c:6:22: Undetected modification possible from call to unconstrained
+                    function umod: umod
+moduncon.c:6:22: New fresh storage passed as implicitly temp (not released):
+                    umod(x)
+moduncon.c:6:16: Undetected modification possible from call to unconstrained
+                    function mmod: mmod
+moduncon.c:6:16: New fresh storage passed as implicitly temp (not released):
+                    mmod(umod(x))
+moduncon.c:6:10: Undetected modification possible from call to unconstrained
+                    function umod: umod
+moduncon.c:6:3: Statement has no effect (possible undected modification through
+    call to unconstrained functions umod, mmod): (void)umod(mmod(...
+moduncon.c: (in function g)
+moduncon.c:12:10: Undetected modification possible from call to unconstrained
+                     function umod: umod
+moduncon.c:12:3: Statement has no effect (possible undected modification
+                    through call to unconstrained function umod): (void)umod(x)
+moduncon.c:13:22: Undetected modification possible from call to unconstrained
+                     function umod: umod
+moduncon.c:13:22: New fresh storage passed as implicitly temp (not released):
+                     umod(x)
+moduncon.c:13:16: Undetected modification possible from call to unconstrained
+                     function mmod: mmod
+moduncon.c:13:16: New fresh storage passed as implicitly temp (not released):
+                     mmod(umod(x))
+moduncon.c:13:10: Undetected modification possible from call to unconstrained
+                     function umod: umod
+moduncon.c:13:3: Statement has no effect (possible undected modification
+    through call to unconstrained functions umod, mmod): (void)umod(mmod(...
+moduncon.c:1:6: Function mmod declared but not defined
+moduncon.c:2:6: Function umod declared but not defined
+moduncon.c:4:5: Function f declared but not used
+   moduncon.c:8:1: Definition of f
+moduncon.c:10:5: Function g declared but not used
+   moduncon.c:15:1: Definition of g
+moduncon.c:1:6: Function mmod exported but not declared in header file
+moduncon.c:2:6: Function umod exported but not declared in header file
+moduncon.c:4:5: Function f exported but not declared in header file
+   moduncon.c:8:1: Definition of f
+moduncon.c:10:5: Function g exported but not declared in header file
+   moduncon.c:15:1: Definition of g
+
+Finished LCLint checking --- 22 code errors found, as expected
diff --git a/test/mongoincludes.c b/test/mongoincludes.c
new file mode 100644
index 0000000..12f20df
--- /dev/null
+++ b/test/mongoincludes.c
@@ -0,0 +1,3 @@
+# include "minc1.h"
+# include "minc2.h"
+# include "minc3.h"
diff --git a/test/mongoincludes.expect b/test/mongoincludes.expect
new file mode 100644
index 0000000..a996071
--- /dev/null
+++ b/test/mongoincludes.expect
@@ -0,0 +1,124 @@
+
+minc1.h:1: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:1: Include site
+   mongoincludes.c:1: Include site
+minc1.h:2: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:1: Include site
+minc1.h:3: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:1: Include site
+minc2.h:1: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:1: Maximum include nesting depth (1, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (1, current depth 5) exceeded
+   minc3.h:1: Include site
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:2: Maximum include nesting depth (1, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc2.h:2: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (1, current depth 4) exceeded
+   minc2.h:2: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc2.h:3: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc1.h:4: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:1: Include site
+minc3.h:1: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:4: Include site
+   mongoincludes.c:1: Include site
+minc3.h:2: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:4: Include site
+   mongoincludes.c:1: Include site
+minc2.h:1: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:2: Include site
+minc2.h:2: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:2: Include site
+minc2.h:3: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:2: Include site
+minc3.h:1: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:3: Include site
+minc3.h:2: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:3: Include site
+
+Finished LCLint checking --- 19 code errors found, as expected
+
+minc4.h:1: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:1: Include site
+   mongoincludes.c:1: Include site
+minc2.h:1: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:1: Maximum include nesting depth (2, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (2, current depth 5) exceeded
+   minc3.h:1: Include site
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:2: Maximum include nesting depth (2, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc2.h:2: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (2, current depth 4) exceeded
+   minc2.h:2: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc2.h:3: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:1: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:4: Include site
+   mongoincludes.c:1: Include site
+minc3.h:2: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:4: Include site
+   mongoincludes.c:1: Include site
+
+Finished LCLint checking --- 10 code errors found, as expected
+
+minc3.h:1: Maximum include nesting depth (3, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (3, current depth 5) exceeded
+   minc3.h:1: Include site
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:2: Maximum include nesting depth (3, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (3, current depth 4) exceeded
+   minc2.h:2: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+minc4.h:1: Maximum include nesting depth (4, current depth 5) exceeded
+   minc3.h:1: Include site
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+
+Finished LCLint checking --- 1 code error found, as expected
+
+Finished LCLint checking --- no code errors found
diff --git a/test/mongoincludes.out b/test/mongoincludes.out
new file mode 100644
index 0000000..a996071
--- /dev/null
+++ b/test/mongoincludes.out
@@ -0,0 +1,124 @@
+
+minc1.h:1: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:1: Include site
+   mongoincludes.c:1: Include site
+minc1.h:2: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:1: Include site
+minc1.h:3: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:1: Include site
+minc2.h:1: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:1: Maximum include nesting depth (1, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (1, current depth 5) exceeded
+   minc3.h:1: Include site
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:2: Maximum include nesting depth (1, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc2.h:2: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (1, current depth 4) exceeded
+   minc2.h:2: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc2.h:3: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc1.h:4: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:1: Include site
+minc3.h:1: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:4: Include site
+   mongoincludes.c:1: Include site
+minc3.h:2: Maximum include nesting depth (1, current depth 3) exceeded
+   minc1.h:4: Include site
+   mongoincludes.c:1: Include site
+minc2.h:1: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:2: Include site
+minc2.h:2: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:2: Include site
+minc2.h:3: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:2: Include site
+minc3.h:1: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:3: Include site
+minc3.h:2: Maximum include nesting depth (1, current depth 2) exceeded
+   mongoincludes.c:3: Include site
+
+Finished LCLint checking --- 19 code errors found, as expected
+
+minc4.h:1: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:1: Include site
+   mongoincludes.c:1: Include site
+minc2.h:1: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:1: Maximum include nesting depth (2, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (2, current depth 5) exceeded
+   minc3.h:1: Include site
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:2: Maximum include nesting depth (2, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc2.h:2: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (2, current depth 4) exceeded
+   minc2.h:2: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc2.h:3: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:1: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:4: Include site
+   mongoincludes.c:1: Include site
+minc3.h:2: Maximum include nesting depth (2, current depth 3) exceeded
+   minc1.h:4: Include site
+   mongoincludes.c:1: Include site
+
+Finished LCLint checking --- 10 code errors found, as expected
+
+minc3.h:1: Maximum include nesting depth (3, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (3, current depth 5) exceeded
+   minc3.h:1: Include site
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc3.h:2: Maximum include nesting depth (3, current depth 4) exceeded
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+minc4.h:1: Maximum include nesting depth (3, current depth 4) exceeded
+   minc2.h:2: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+minc4.h:1: Maximum include nesting depth (4, current depth 5) exceeded
+   minc3.h:1: Include site
+   minc2.h:1: Include site
+   minc1.h:3: Include site
+   mongoincludes.c:1: Include site
+
+Finished LCLint checking --- 1 code error found, as expected
+
+Finished LCLint checking --- no code errors found
diff --git a/test/mut.c b/test/mut.c
new file mode 100644
index 0000000..691863c
--- /dev/null
+++ b/test/mut.c
@@ -0,0 +1,18 @@
+# include "mut.h"
+
+void mut_mod (mut a)
+{
+  *a = 3;
+}
+
+mut mut_create (void)
+{
+  int *x = (int *) malloc(sizeof(int));
+
+  if (x == NULL)
+    {
+      exit (EXIT_FAILURE);
+    }
+  *x = 3;    
+  return x;
+}
diff --git a/test/mut.h b/test/mut.h
new file mode 100644
index 0000000..f7353e5
--- /dev/null
+++ b/test/mut.h
@@ -0,0 +1,3 @@
+typedef int *mut;
+
+# include "mut.lh"
diff --git a/test/mut.lcl b/test/mut.lcl
new file mode 100644
index 0000000..8b271e9
--- /dev/null
+++ b/test/mut.lcl
@@ -0,0 +1,5 @@
+mutable type mut;
+
+only mut mut_create (void) { } 
+void mut_mod (mut a) { modifies a; } 
+
diff --git a/test/mut.lcs b/test/mut.lcs
new file mode 100644
index 0000000..8c51b3f
--- /dev/null
+++ b/test/mut.lcs
@@ -0,0 +1,127 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort mut immutable nil nil
+%LCLsort _mut_Obj mutable mut nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :mut -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype mut _mut_Obj mutable
+%LCLfcn mut_create :  -> _mut_Obj 
+%LCLfcnGlobals 
+%LCLfcn mut_mod : _mut_Obj -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/mut.lh b/test/mut.lh
new file mode 100644
index 0000000..7ac5790
--- /dev/null
+++ b/test/mut.lh
@@ -0,0 +1,6 @@
+/* Output from LCLint 2.5m */
+# include "bool.h"
+
+
+extern /*@only@*/ mut mut_create (void);
+extern void mut_mod (mut  /* a */);
diff --git a/test/mut.lh.expect b/test/mut.lh.expect
new file mode 100644
index 0000000..ed372c6
--- /dev/null
+++ b/test/mut.lh.expect
@@ -0,0 +1,6 @@
+/* Output from LCLint 2.2c+ */
+# include "bool.h"
+
+
+extern /*@only@*/ mut mut_create (void);
+extern void mut_mod (mut  /* a */);
diff --git a/test/null.expect b/test/null.expect
new file mode 100644
index 0000000..2b1ac3d
--- /dev/null
+++ b/test/null.expect
@@ -0,0 +1,176 @@
+
+null1.c: (in function f)
+null1.c:19:20: Implicitly temp storage x returned as only: x
+null1.c:19:20: Possibly null storage x returned as non-null: x
+   null1.c:10:35: Storage x may become null
+null1.c:19:22: Fresh storage y not released before return
+   null1.c:12:41: Fresh storage y allocated
+null1.c:31:4: Dereference of possibly null pointer y: *y
+   null1.c:12:12: Storage y may become null
+null1.c:34:5: Possibly null storage z passed as non-null param: g (z)
+   null1.c:25:7: Storage z may become null
+null1.c:34:5: Passed storage z not completely defined (*z is undefined): g (z)
+null1.c:39:14: Dereference of null pointer z: *z
+   null1.c:25:7: Storage z becomes null
+null1.c:43:22: Dereference of possibly null pointer z4: *z4
+   null1.c:42:8: Storage z4 may become null
+null1.c:46:25: Dereference of possibly null pointer z2: *z2
+   null1.c:26:8: Storage z2 may become null
+null1.c:49:11: Dereference of possibly null pointer z3: *z3
+   null1.c:27:8: Storage z3 may become null
+null1.c:55:4: Dereference of possibly null pointer z2: *z2
+   null1.c:51:8: Storage z2 may become null
+null1.c:59:23: Dereference of possibly null pointer z5: *z5
+   null1.c:57:8: Storage z5 may become null
+null1.c:67:10: Possibly null storage z returned as non-null: z
+   null1.c:25:7: Storage z may become null
+null1.c:67:12: Fresh storage z3 not released before return
+   null1.c:27:3: Fresh storage z3 allocated
+
+Finished LCLint checking --- 14 code errors found, as expected
+
+null1.c: (in function f)
+null1.c:19:20: Implicitly temp storage x returned as only: x
+null1.c:19:22: Fresh storage y not released before return
+   null1.c:12:41: Fresh storage y allocated
+null1.c:34:5: Passed storage z not completely defined (*z is undefined): g (z)
+null1.c:67:12: Fresh storage z3 not released before return
+   null1.c:27:3: Fresh storage z3 allocated
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+null2.c: (in function f)
+null2.c:15:10: Left operand of && is non-boolean (int *): x1 && (*x1 == 3)
+null2.c:16:19: Dereference of possibly null pointer x2: *x2
+   null2.c:10:55: Storage x2 may become null
+null2.c:17:18: Dereference of possibly null pointer x3: *x3
+   null2.c:11:21: Storage x3 may become null
+null2.c:17:10: Left operand of || is non-boolean (int *): x3 || (*x3 == 3)
+null2.c:20:27: Dereference of possibly null pointer x1: *x1
+   null2.c:10:35: Storage x1 may become null
+null2.c:23:7: Left operand of && is non-boolean (int *): x4 && (*x4 == 3)
+null2.c:30:8: Dereference of possibly null pointer x4: *x4
+   null2.c:11:41: Storage x4 may become null
+null2.c:35:14: Implicitly temp storage x3 returned as only: (x3)
+null2.c:35:14: Possibly null storage x3 returned as non-null: (x3)
+   null2.c:11:21: Storage x3 may become null
+null2.c:39:10: Implicitly temp storage x1 returned as only: (x1)
+
+Finished LCLint checking --- 10 code errors found, as expected
+
+null3.c: (in function f3)
+null3.c:16:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:3:25: Storage gnip may become null
+null3.c: (in function f)
+null3.c:27:4: Dereference of possibly null pointer arg0: *arg0
+null3.c:37:8: Dereference of possibly null pointer z: *z
+   null3.c:25:12: Storage z may become null
+null3.c:38:16: Only storage aip not released before return
+   null3.c:22:66: Storage aip becomes only
+null3.c:44:4: Dereference of possibly null pointer arg2: *arg2
+null3.c:52:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:51:10: Storage gnip may become null
+null3.c:53:9: Variable z used after being released
+   null3.c:51:3: Storage z released
+null3.c:53:3: Only storage gip not released before assignment (z aliases gnip):
+                 gip = z
+   null3.c:5:17: Storage gip becomes only
+null3.c:55:3: Only storage gnip not released before assignment: gnip = aip
+   null3.c:53:3: Storage gnip becomes only
+null3.c:60:14: Returned storage y not completely defined (*y is undefined): y
+null3.c:60:16: Function returns with non-null global gip referencing null
+                  storage
+   null3.c:53:9: Storage gip may become null
+null3.c:65:14: Possibly null storage y returned as non-null: y
+   null3.c:24:12: Storage y may become null
+null3.c:65:14: Returned storage y not completely defined (*y is undefined): y
+null3.c:65:16: Function returns with non-null global gip referencing null
+                  storage
+   null3.c:53:9: Storage gip may become null
+null3.c: (in function f2)
+null3.c:73:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:55:10: Storage gnip may become null
+
+Finished LCLint checking --- 15 code errors found, as expected
+
+null3.c: (in function f3)
+null3.c:16:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:3:25: Storage gnip may become null
+null3.c: (in function f)
+null3.c:27:4: Dereference of possibly null pointer arg0: *arg0
+null3.c:35:13: Possibly null storage y passed as non-null param: free (y)
+   null3.c:24:12: Storage y may become null
+null3.c:37:8: Dereference of possibly null pointer z: *z
+   null3.c:25:12: Storage z may become null
+null3.c:38:16: Only storage aip not released before return
+   null3.c:22:66: Storage aip becomes only
+null3.c:44:4: Dereference of possibly null pointer arg2: *arg2
+null3.c:52:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:51:10: Storage gnip may become null
+null3.c:53:9: Variable z used after being released
+   null3.c:51:3: Storage z released
+null3.c:53:3: Only storage gip not released before assignment (z aliases gnip):
+                 gip = z
+   null3.c:5:17: Storage gip becomes only
+null3.c:55:3: Only storage gnip not released before assignment: gnip = aip
+   null3.c:53:3: Storage gnip becomes only
+null3.c:60:14: Returned storage y not completely defined (*y is undefined): y
+null3.c:60:16: Function returns with non-null global gip referencing null
+                  storage
+   null3.c:53:9: Storage gip may become null
+null3.c:65:14: Possibly null storage y returned as non-null: y
+   null3.c:24:12: Storage y may become null
+null3.c:65:14: Returned storage y not completely defined (*y is undefined): y
+null3.c:65:16: Function returns with non-null global gip referencing null
+                  storage
+   null3.c:53:9: Storage gip may become null
+null3.c: (in function f2)
+null3.c:73:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:55:10: Storage gnip may become null
+
+Finished LCLint checking --- 16 code errors found, as expected
+
+null4.c: (in function g)
+null4.c:43:3: Only storage p not released before assignment: p = malloc(24)
+   null4.c:3:28: Storage p becomes only
+
+Finished LCLint checking --- 1 code error found, as expected
+
+null5.c:5:57: Qualifier falsenull used with function returning char (should
+                 return bool)
+null5.c:6:66: Qualifier falsenull used with function having 2 arguments (should
+                 have 1)
+null5.c: (in function g2)
+null5.c:26:15: Dereference of possibly null pointer y: *y
+   null5.c:18:25: Storage y may become null
+null5.c: (in function g3)
+null5.c:37:11: Dereference of null pointer y: *y
+   null5.c:30:25: Storage y becomes null
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+null6.c:7:36: Function f1 declared with notnull parameter x of abstract type
+                 mnull
+null6.c: (in function f)
+null6.c:11:11: Dereference of possibly null pointer x: *x
+null6.c: (in function f6)
+null6.c:68:10: Possibly null storage x returned as non-null: x
+   null6.c:61:31: Storage x may become null
+null6.c: (in function f7)
+null6.c:84:10: Possibly null storage x returned as non-null: x
+   null6.c:81:11: Storage x may become null
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+null6.c:7:36: Function f1 declared with notnull parameter x of abstract type
+                 mnull
+null6.c: (in function f)
+null6.c:11:11: Dereference of possibly null pointer x: *x
+null6.c: (in function f6)
+null6.c:68:10: Possibly null storage x returned as non-null: x
+   null6.c:61:31: Storage x may become null
+null6.c: (in function f7)
+null6.c:84:10: Possibly null storage x returned as non-null: x
+   null6.c:81:11: Storage x may become null
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/null.out b/test/null.out
new file mode 100644
index 0000000..2b1ac3d
--- /dev/null
+++ b/test/null.out
@@ -0,0 +1,176 @@
+
+null1.c: (in function f)
+null1.c:19:20: Implicitly temp storage x returned as only: x
+null1.c:19:20: Possibly null storage x returned as non-null: x
+   null1.c:10:35: Storage x may become null
+null1.c:19:22: Fresh storage y not released before return
+   null1.c:12:41: Fresh storage y allocated
+null1.c:31:4: Dereference of possibly null pointer y: *y
+   null1.c:12:12: Storage y may become null
+null1.c:34:5: Possibly null storage z passed as non-null param: g (z)
+   null1.c:25:7: Storage z may become null
+null1.c:34:5: Passed storage z not completely defined (*z is undefined): g (z)
+null1.c:39:14: Dereference of null pointer z: *z
+   null1.c:25:7: Storage z becomes null
+null1.c:43:22: Dereference of possibly null pointer z4: *z4
+   null1.c:42:8: Storage z4 may become null
+null1.c:46:25: Dereference of possibly null pointer z2: *z2
+   null1.c:26:8: Storage z2 may become null
+null1.c:49:11: Dereference of possibly null pointer z3: *z3
+   null1.c:27:8: Storage z3 may become null
+null1.c:55:4: Dereference of possibly null pointer z2: *z2
+   null1.c:51:8: Storage z2 may become null
+null1.c:59:23: Dereference of possibly null pointer z5: *z5
+   null1.c:57:8: Storage z5 may become null
+null1.c:67:10: Possibly null storage z returned as non-null: z
+   null1.c:25:7: Storage z may become null
+null1.c:67:12: Fresh storage z3 not released before return
+   null1.c:27:3: Fresh storage z3 allocated
+
+Finished LCLint checking --- 14 code errors found, as expected
+
+null1.c: (in function f)
+null1.c:19:20: Implicitly temp storage x returned as only: x
+null1.c:19:22: Fresh storage y not released before return
+   null1.c:12:41: Fresh storage y allocated
+null1.c:34:5: Passed storage z not completely defined (*z is undefined): g (z)
+null1.c:67:12: Fresh storage z3 not released before return
+   null1.c:27:3: Fresh storage z3 allocated
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+null2.c: (in function f)
+null2.c:15:10: Left operand of && is non-boolean (int *): x1 && (*x1 == 3)
+null2.c:16:19: Dereference of possibly null pointer x2: *x2
+   null2.c:10:55: Storage x2 may become null
+null2.c:17:18: Dereference of possibly null pointer x3: *x3
+   null2.c:11:21: Storage x3 may become null
+null2.c:17:10: Left operand of || is non-boolean (int *): x3 || (*x3 == 3)
+null2.c:20:27: Dereference of possibly null pointer x1: *x1
+   null2.c:10:35: Storage x1 may become null
+null2.c:23:7: Left operand of && is non-boolean (int *): x4 && (*x4 == 3)
+null2.c:30:8: Dereference of possibly null pointer x4: *x4
+   null2.c:11:41: Storage x4 may become null
+null2.c:35:14: Implicitly temp storage x3 returned as only: (x3)
+null2.c:35:14: Possibly null storage x3 returned as non-null: (x3)
+   null2.c:11:21: Storage x3 may become null
+null2.c:39:10: Implicitly temp storage x1 returned as only: (x1)
+
+Finished LCLint checking --- 10 code errors found, as expected
+
+null3.c: (in function f3)
+null3.c:16:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:3:25: Storage gnip may become null
+null3.c: (in function f)
+null3.c:27:4: Dereference of possibly null pointer arg0: *arg0
+null3.c:37:8: Dereference of possibly null pointer z: *z
+   null3.c:25:12: Storage z may become null
+null3.c:38:16: Only storage aip not released before return
+   null3.c:22:66: Storage aip becomes only
+null3.c:44:4: Dereference of possibly null pointer arg2: *arg2
+null3.c:52:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:51:10: Storage gnip may become null
+null3.c:53:9: Variable z used after being released
+   null3.c:51:3: Storage z released
+null3.c:53:3: Only storage gip not released before assignment (z aliases gnip):
+                 gip = z
+   null3.c:5:17: Storage gip becomes only
+null3.c:55:3: Only storage gnip not released before assignment: gnip = aip
+   null3.c:53:3: Storage gnip becomes only
+null3.c:60:14: Returned storage y not completely defined (*y is undefined): y
+null3.c:60:16: Function returns with non-null global gip referencing null
+                  storage
+   null3.c:53:9: Storage gip may become null
+null3.c:65:14: Possibly null storage y returned as non-null: y
+   null3.c:24:12: Storage y may become null
+null3.c:65:14: Returned storage y not completely defined (*y is undefined): y
+null3.c:65:16: Function returns with non-null global gip referencing null
+                  storage
+   null3.c:53:9: Storage gip may become null
+null3.c: (in function f2)
+null3.c:73:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:55:10: Storage gnip may become null
+
+Finished LCLint checking --- 15 code errors found, as expected
+
+null3.c: (in function f3)
+null3.c:16:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:3:25: Storage gnip may become null
+null3.c: (in function f)
+null3.c:27:4: Dereference of possibly null pointer arg0: *arg0
+null3.c:35:13: Possibly null storage y passed as non-null param: free (y)
+   null3.c:24:12: Storage y may become null
+null3.c:37:8: Dereference of possibly null pointer z: *z
+   null3.c:25:12: Storage z may become null
+null3.c:38:16: Only storage aip not released before return
+   null3.c:22:66: Storage aip becomes only
+null3.c:44:4: Dereference of possibly null pointer arg2: *arg2
+null3.c:52:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:51:10: Storage gnip may become null
+null3.c:53:9: Variable z used after being released
+   null3.c:51:3: Storage z released
+null3.c:53:3: Only storage gip not released before assignment (z aliases gnip):
+                 gip = z
+   null3.c:5:17: Storage gip becomes only
+null3.c:55:3: Only storage gnip not released before assignment: gnip = aip
+   null3.c:53:3: Storage gnip becomes only
+null3.c:60:14: Returned storage y not completely defined (*y is undefined): y
+null3.c:60:16: Function returns with non-null global gip referencing null
+                  storage
+   null3.c:53:9: Storage gip may become null
+null3.c:65:14: Possibly null storage y returned as non-null: y
+   null3.c:24:12: Storage y may become null
+null3.c:65:14: Returned storage y not completely defined (*y is undefined): y
+null3.c:65:16: Function returns with non-null global gip referencing null
+                  storage
+   null3.c:53:9: Storage gip may become null
+null3.c: (in function f2)
+null3.c:73:4: Dereference of possibly null pointer gnip: *gnip
+   null3.c:55:10: Storage gnip may become null
+
+Finished LCLint checking --- 16 code errors found, as expected
+
+null4.c: (in function g)
+null4.c:43:3: Only storage p not released before assignment: p = malloc(24)
+   null4.c:3:28: Storage p becomes only
+
+Finished LCLint checking --- 1 code error found, as expected
+
+null5.c:5:57: Qualifier falsenull used with function returning char (should
+                 return bool)
+null5.c:6:66: Qualifier falsenull used with function having 2 arguments (should
+                 have 1)
+null5.c: (in function g2)
+null5.c:26:15: Dereference of possibly null pointer y: *y
+   null5.c:18:25: Storage y may become null
+null5.c: (in function g3)
+null5.c:37:11: Dereference of null pointer y: *y
+   null5.c:30:25: Storage y becomes null
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+null6.c:7:36: Function f1 declared with notnull parameter x of abstract type
+                 mnull
+null6.c: (in function f)
+null6.c:11:11: Dereference of possibly null pointer x: *x
+null6.c: (in function f6)
+null6.c:68:10: Possibly null storage x returned as non-null: x
+   null6.c:61:31: Storage x may become null
+null6.c: (in function f7)
+null6.c:84:10: Possibly null storage x returned as non-null: x
+   null6.c:81:11: Storage x may become null
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+null6.c:7:36: Function f1 declared with notnull parameter x of abstract type
+                 mnull
+null6.c: (in function f)
+null6.c:11:11: Dereference of possibly null pointer x: *x
+null6.c: (in function f6)
+null6.c:68:10: Possibly null storage x returned as non-null: x
+   null6.c:61:31: Storage x may become null
+null6.c: (in function f7)
+null6.c:84:10: Possibly null storage x returned as non-null: x
+   null6.c:81:11: Storage x may become null
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/null1.c b/test/null1.c
new file mode 100644
index 0000000..2155fe2
--- /dev/null
+++ b/test/null1.c
@@ -0,0 +1,71 @@
+# include "bool.h"
+
+void g(/*@temp@*/ int *y);
+
+/*@truenull@*/ bool ptrpred (/*@out@*/ /*@null@*/ int *x)
+{
+  return (x == NULL);
+}
+
+/*@only@*/ int *f(/*@null@*/ int *x)
+{
+  int *y = (int *)malloc (sizeof (int));
+  int *z;
+  int *z2;
+  int *z3;
+  int *z4;
+  int *z5;
+
+  if (!x) { return x; /* 1. Unqualified storage returned as only: x,
+		      ** 2. Possibly null storage returned as non-null: x
+		      ** 3. Fresh storage y not released before return 
+                      */
+	  } 
+
+  z = (int *) malloc (sizeof (int));
+  z2 = (int *)malloc (sizeof (int));
+  z3 = (int *)malloc (sizeof (int));
+
+  *x = 7; 
+
+  *y = 3; /* 4. Possible dereference of null pointer: *y */
+  free (y);
+
+  g(z);   /* 5. Possibly null storage passed as non-null param: z
+          ** 6. Passed storage z not completely defined (allocated only): z
+          */
+  if (z) { *z = 3; } /* okay */
+
+  if (!z) { *z = 3; } /* 7. Possible dereference of null pointer: *z */
+  else { *z = 4; }    /* okay */
+
+  z4 = (int *)malloc (sizeof (int));
+  if (z4 == NULL) { *z4 = 3; } /* 8. Possible dereference of null pointer: *z4 */
+  else { free (z4); } /* [ not any more: 12. Clauses exit... ] */
+
+  if (!(z2 != NULL)) { *z2 = 3; } /* 9. Possible dereference of null pointer: *z2 */
+
+  if (z3 != NULL) { *z3 = 5; /* okay */ }
+  else { *z3 = 3; } /* 10. Possible dereference of null pointer: *z3 */
+  if (z2) free (z2);
+  z2 = (int *)malloc (sizeof (int));
+  
+  if (z2 != NULL) { *z2 = 5; } ;
+
+  *z2 = 7; /* 11. Possible dereference of null pointer: *z2 */
+
+  z5 = (int *) malloc (sizeof (int));
+
+  if (ptrpred(z5)) { *z5 = 3; }  /* 12. Possible dereference of null pointer: *z5 */
+  if (!ptrpred(z5)) { *z5 = 3; } 
+
+  if (ptrpred(z5)) { *z5 = 3; } 
+  else { free (z5); } 
+
+  free (z2);
+
+  return z; /* 13. Fresh storage z3 not released */
+}
+
+
+
diff --git a/test/null2.c b/test/null2.c
new file mode 100644
index 0000000..b7ac9e5
--- /dev/null
+++ b/test/null2.c
@@ -0,0 +1,43 @@
+# include "bool.h"
+
+void g(int *y);
+
+/*@truenull@*/ bool ptrpred (/*@out@*/ /*@null@*/ int *x)
+{
+  return (x == NULL);
+}
+
+/*@only@*/ int *f(/*@null@*/ int *x1, /*@null@*/ int *x2, 
+		  /*@null@*/ int *x3, /*@null@*/ int *x4) 
+{
+  bool test;
+
+  test = x1 && (*x1 == 3);  /* okay */
+  test = !x2 && (*x2 == 3); /* 1. Possible dereference of null pointer: *x2 */
+  test = x3 || (*x3 == 3);  /* 2. Possible dereference of null pointer: *x3 */
+  test = !x4 || (*x4 == 3);  /* okay */
+
+  test = ptrpred(x1) && (*x1 == 3); /* 3. Possible dereference of null pointer: *x1 */
+  test = !ptrpred(x1) && (*x1 == 3); /* okay */
+
+  if (x4 && (*x4 == 3))
+    {
+      *x4 = 6; /* okay */
+    }
+
+  if (!x4 || (*x4 == 6))
+    {
+      *x4 = 12; /* 4. Possible dereference of null pointer: *x4 */
+    }
+
+  if (!x1 || (*x1 == 6))
+    {
+      return (x3); /* 5, 6. Unqualified storage returned as only: (x3),
+		            Possibly null storage returned as non-null: (x3) */
+    }
+
+  return (x1); /* 7. Unqualified storage returned as only: (x1) 
+		     not: null as non-null (because of || semantics) */
+}
+
+
diff --git a/test/null3.c b/test/null3.c
new file mode 100644
index 0000000..7f65dcf
--- /dev/null
+++ b/test/null3.c
@@ -0,0 +1,79 @@
+# include "bool.h"
+
+typedef /*@null@*/ int *nip;
+/*@only@*/ nip gnip;
+/*@only@*/ int *gip;
+
+void g(int *y);
+
+/*@truenull@*/ bool ptrpred (nip x)
+{
+  return (x == NULL);
+}
+
+void f3 (/*@only@*/ nip x)
+{
+  *gnip = 3; /* 1. Possible dereference of null pointer: *gnip */
+  *gip = 3;  /* okay */
+
+  if (x) free (x); 
+}
+
+/*@only@*/ int *f (nip arg0, nip arg1, nip arg2, /*@only@*/ int *aip)
+{
+  int *y = (int *) malloc (sizeof (int));
+  int *z = (int *) malloc (sizeof (int));
+
+  *arg0 = 3; /* 2. Possible dereference of null pointer: *arg0 */
+
+  if (arg1)
+    {
+      *arg1 = 7; /* okay */
+    }
+  else
+    {
+      free (y); /* 3. Possibly null storage passed as non-null param: y */
+      
+      *z = 3;   /* 4. Possible dereference of null pointer: *z */
+      return z; /* 5. Only storage not released before return: aip */
+    }
+
+  /* arg1 is guarded */
+
+  *arg1 = 3; /* okay */
+  *arg2 = 5; /* 6. Possible dereference of null pointer: *arg2 */
+  *gip = 6;  /* okay */
+
+  if (z) { *z = 3; }
+
+  if (gnip) { free (gnip); } else { ; } /* okay */
+
+  gnip = z;  /* okay */
+  *gnip = 3; /* 7. Possible dereference of null pointer: *gnip */
+  gip = z;   /* 8, 9. uses z after release, only z not released */
+             /* Note: gip is possibly null now  +++ kept*/
+  gnip = aip; /* 10. Only storage gnip not released before assignment: gnip = aip */
+  *gnip = 3; /* okay */
+
+  if (y)
+    {
+      return y; /* 11, 12. Returned storage y not completely defined, 
+                   Function returns with non-null global gip referencing null */
+    }
+  else
+    {
+      return y; /* 13, 14, 15. Possibly null storage returned as non-null: y,
+		   Returned storage y not completely defined,
+		   Function returns with non-null global gip referencing null */
+    }
+}
+
+void f2 (void)
+{
+  *gnip = 3; /* 16. Possible dereference of null pointer: *gnip */
+  *gip = 3;  /* okay */
+}
+
+
+
+
diff --git a/test/null4.c b/test/null4.c
new file mode 100644
index 0000000..190a3e6
--- /dev/null
+++ b/test/null4.c
@@ -0,0 +1,47 @@
+# include "bool.h"
+
+/*@only@*/ /*@null@*/ int *p;
+
+extern /*@truenull@*/ bool isNull (/*@null@*/ int *p);
+
+void f (void)
+{
+  if (p != NULL) return;
+  else 
+    {
+      p = malloc (24);  
+      if (p == NULL) exit (EXIT_FAILURE);
+      *p = 3;
+    }
+}
+
+void f1 (void)
+{
+  if (p != NULL) return;
+
+  p = malloc (24);  
+  if (p == NULL) exit (EXIT_FAILURE);
+  *p = 3;
+}
+
+int f2 (void)
+{
+  if (p == NULL) return 0;
+  return *p;
+}
+
+int f3 (void)
+{
+  if (isNull(p)) return 0;
+  return *p;
+}
+
+void g (void)
+{
+  if (p == NULL) return;
+
+  p = malloc (24);  /* 1. Only storage p not released before assignment */
+  if (p == NULL) exit (EXIT_FAILURE);
+  *p = 3;
+}
+
diff --git a/test/null5.c b/test/null5.c
new file mode 100644
index 0000000..169e09a
--- /dev/null
+++ b/test/null5.c
@@ -0,0 +1,38 @@
+# include "bool.h"
+
+extern /*@truenull@*/ bool isnull(/*@null@*/ int *x);
+extern /*@falsenull@*/ bool notnull(/*@null@*/ int *x);
+extern /*@falsenull@*/ char badnull (/*@null@*/ int *x);
+extern /*@falsenull@*/ bool worsenull (/*@null@*/ int *x, int t);
+
+int g1 (/*@null@*/ int *y)
+{
+  if (isnull (y))
+    {
+      return 0;
+    }
+
+  return *y;
+}
+
+int g2 (/*@null@*/ int *y)
+{
+  if (notnull (y))
+    {
+      return 0;
+    }
+  else
+    {
+      return *y;
+    }
+}
+
+int g3 (/*@null@*/ int *y)
+{
+  if (notnull (y))
+    {
+      return 0;
+    }
+
+  return *y;
+}
diff --git a/test/null6.c b/test/null6.c
new file mode 100644
index 0000000..0a848ed
--- /dev/null
+++ b/test/null6.c
@@ -0,0 +1,85 @@
+# include "bool.h"
+
+typedef /*@null@*/ int *mnull;
+
+extern /*@notnull@*/ mnull mnull_create (void);
+
+extern int f1 (/*@notnull@*/ mnull x); /* 1. Function f1 declared with notnull ... */
+
+int f (mnull x)
+{
+  return *x; /* 2. Possible dereference of null pointer: *x */
+}
+
+static /*@unused@*/ int f2 (/*@notnull@*/ mnull x)
+{
+  return *x;
+}
+
+extern /*@falsenull@*/ bool isThree (mnull x);
+
+static /*@unused@*/ int f3 (/*@notnull@*/ mnull x)
+{
+  if (isThree (x)) /* the parameter was missing before 2.4! */
+    {
+      *x = 4;
+    }
+  else
+    {
+      *x = 5;
+    }
+
+  return (*x);
+}
+
+/*@notnull@*/ mnull f4 (void)
+{
+  mnull x = NULL;
+
+  if (x == NULL)
+    {
+      x = mnull_create ();
+    } 
+
+  return x;
+}
+
+/*@notnull@*/ mnull f5 (void)
+{
+  static /*@only@*/ mnull x = NULL;
+
+  if (x == NULL)
+    {
+      x = mnull_create ();
+    } 
+
+  return x;
+}
+
+/*@notnull@*/ mnull f6 (void)
+{
+  static /*@only@*/ mnull x = NULL;
+
+  if (x != NULL)
+    {
+      x = mnull_create ();
+    } 
+
+  return x; /* 3. Possibly null storage returned as non-null */
+}
+
+/*@notnull@*/ mnull f7 (void)
+{
+  static /*@only@*/ mnull x = NULL;
+
+  if (x == NULL)
+    {
+      x = mnull_create ();
+    } 
+  else
+    {
+      x = NULL;
+    }
+
+  return x; /* 4. Possibly null storage returned as non-null */
+}
diff --git a/test/null6.lcd b/test/null6.lcd
new file mode 100644
index 0000000..20315e7
--- /dev/null
+++ b/test/null6.lcd
@@ -0,0 +1,896 @@
+;;LCLint Dump: null6.lcd
+;;LCLint 2.5m --- 20 May 2000
+;;lib:167
+;;ctTable
+0 u-2 19 38
+0 p1|-2 20 39
+0 b-2 21 40
+0 p3|-2 22 41
+0 p4|-2 23 42
+0 p5|-2 24 43
+0 p6|-2 25 44
+0 p7|-2 26 45
+0 p8|-2 27 46
+0 p9|-2 28 47
+0 p10|-2 29 48
+0 p11|-2 30 49
+0 p12|-2 31 50
+0 p13|-2 32 51
+0 p14|-2 33 52
+0 p15|-2 34 53
+0 p16|-2 35 54
+0 p17|-2 36 55
+0 p18|-2 37 56
+1 t0|0 314 -1
+1 t1|1&
+1 t2|2&
+1 t3|3&
+1 t4|4 315 -1
+1 t5|5&
+1 t6|6&
+1 t7|7&
+1 t8|8&
+1 t9|9&
+1 t10|10&
+1 t11|11&
+1 t12|12&
+1 t13|13&
+1 t14|14&
+1 t15|15&
+1 t16|16&
+1 t17|17&
+1 t18|18&
+2 y0|0&
+2 y1|1&
+2 y2|2&
+2 y3|3&
+2 y4|4&
+2 y5|5&
+2 y6|6&
+2 y7|7&
+2 y8|8&
+2 y9|9&
+2 y10|10&
+2 y11|11&
+2 y12|12&
+2 y13|13&
+2 y14|14&
+2 y15|15&
+2 y16|16&
+2 y17|17&
+2 y18|18&
+-2 ?!
+0 s2|&
+0 s3|&
+0 s4|&
+0 s5|&
+0 s6|&
+0 s15|&
+0 s16|&
+0 s7|-1 383 -1
+0 s8|&
+0 a0|-1 401 -1
+3 C0.5/20|!
+3 C0.68/2|!
+3 C0.2/5|!
+3 f0 (70|@7|$#,)!
+3 f1 (70|@7|$#,)!
+3 C0.4/5|!
+3 C0.3/5|!
+3 f0 (74|$#,)!
+3 f2 (74|$#,)!
+3 f70 (74|$#,)!
+3 f0 (74|$#,)!
+3 f2 (74|$#,)!
+3 f70 (74|$#,)!
+3 f0 (74|$#,)!
+3 f2 (74|$#,)!
+3 f70 (74|$#,)!
+3 f0 (74|$#,)!
+3 f2 (74|$#,)!
+3 f70 (74|$#,)!
+3 C0.2/5|!
+3 f0 (74|$#,)!
+3 f2 (74|$#,)!
+3 f87 (74|$#,)!
+3 C0.4/5|!
+3 C0.3/5|!
+3 f0 (92|$#,)!
+3 f2 (92|$#,)!
+3 f87 (92|$#,)!
+3 f0 (92|$#,)!
+3 f2 (92|$#,)!
+3 f87 (92|$#,)!
+3 f0 (92|$#,)!
+3 f2 (92|$#,)!
+3 f87 (92|$#,)!
+3 f0 (92|$#,)!
+3 f2 (92|$#,)!
+3 C0.2/5|!
+3 f104 (92|$#,)!
+3 f0 (92|$#,)!
+3 f2 (92|$#,)!
+3 f104 (92|$#,)!
+3 C0.4/5|!
+3 C0.3/5|!
+3 f0 (110|$#,)!
+3 f2 (110|$#,)!
+3 f104 (110|$#,)!
+3 f0 (110|$#,)!
+3 f4 (110|$#,)!
+3 f109 (110|$#,)!
+3 f0 (110|$#,)!
+3 f4 (110|$#,)!
+3 f109 (110|$#,)!
+3 Slconv{23|@1|0@0@3&#decimal_point,23|@1|0@0@3&#thousands_sep,23|@1|0@0@3&#grouping,23|@1|0@0@3&#int_curr_symbol,23|@1|0@0@3&#currency_symbol,23|@1|0@0@3&#mon_decimal_point,23|@1|0@0@3&#mon_thousands_sep,23|@1|0@0@3&#mon_grouping,23|@1|0@0@3&#positive_sign,23|@1|0@0@3&#negative_sign,4|@1|$#int_frac_digits,4|@1|$#frac_digits,4|@1|$#p_cs_precedes,4|@1|$#p_sep_by_space,4|@1|$#n_cs_precedes,4|@1|$#n_sep_by_space,4|@1|$#p_sign_posn,4|@1|$#n_sign_posn,}!
+0 s342|-1 127 -1
+3 f0 (5|$#,23|0@5@7&#,)!
+3 f19 (5|$#,23|0@5@7&#,)!
+3 f23 (5|$#,23|0@5@7&#,)!
+3 f0 ()!
+3 f19 ()!
+1 t121|121&
+3 f127 ()!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,17|$#,)!
+3 f17 (17|$#,17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,5|$#,)!
+3 f17 (17|$#,5|$#,)!
+3 f0 (17|$#,24|4@0@7&#,)!
+3 f17 (17|$#,24|4@0@7&#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,17|$#,)!
+3 f17 (17|$#,17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,)!
+3 f17 (17|$#,)!
+3 f0 (17|$#,36|4@0@7&#,)!
+3 f17 (17|$#,36|4@0@7&#,)!
+3 f0 (17|$#,17|$#,)!
+3 f17 (17|$#,17|$#,)!
+0 a17|&
+3 f0 (173|4@0@7&#,)!
+3 f5 (173|4@0@7&#,)!
+3 f0 (173|$#,5|$#,)!
+3 f1 (173|$#,5|$#,)!
+0 s9|&
+3 ?!
+3 f179 (5|$#,)!
+3 f1 (5|$#,)^182
+1 t181|181&
+3 ?!
+3 f183 (5|$#,)!
+3 f1 (5|$#,)^186
+1 t185|185&
+3 ?!
+3 f187 (5|$#,)!
+3 f1 (5|$#,)^190
+1 t189|189&
+3 ?!
+3 f191 (5|$#,)!
+3 f1 (5|$#,)^194
+1 t193|193&
+3 f0 (5|$#,194|0@5@7&#,)!
+3 f19 (5|$#,194|0@5@7&#,)^197
+1 t196|196&
+3 ?!
+3 f198 (5|$#,)!
+3 f19 (5|$#,)!
+3 f1 (5|$#,194|0@5@7&#,)!
+3 f1 (5|$#,)!
+3 f202 (5|$#,194|0@5@7&#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+0 a18|&
+3 f0 (206|4@0@7&#,!.,)!
+3 f1 (206|4@0@7&#,!.,)!
+3 f0 (206|$#,)!
+3 f1 (206|$#,)!
+0 a19|-1 213 -1
+0 a20|-1 289 -1
+1 t211|211&
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f5 (23|$#,23|$#,)!
+3 f0 ()!
+3 f19 ()!
+3 f213 ()!
+3 f0 (23|@5|4@5@7&#,)!
+3 f19 (23|@5|4@5@7&#,)!
+3 f23 (23|@5|4@5@7&#,)!
+3 f0 (213|$#,)!
+3 f5 (213|$#,)!
+3 f0 (213|0@5@7&#,)!
+3 f5 (213|0@5@7&#,)!
+3 f0 (23|$#,23|$#,)!
+3 f19 (23|$#,23|$#,)!
+3 f213 (23|$#,23|$#,)!
+3 f0 (23|$#,23|$#,213|$#,)!
+3 f19 (23|$#,23|$#,213|$#,)!
+3 f213 (23|$#,23|$#,213|$#,)!
+3 f0 (213|$#,23|0@5@19@2@0#,)!
+3 f1 (213|$#,23|0@5@19@2@0#,)!
+3 f0 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)!
+3 f5 (213|$#,23|0@5@19@2@0#,5|$#,63|$#,)!
+3 C0.5/1|!
+3 f0 (213|$#,23|$#,!.,)!
+3 f5 (213|$#,23|$#,!.,)!
+3 f238 (213|$#,23|$#,!.,)!
+3 f0 (213|$#,23|$#,!.,)!
+3 f5 (213|$#,23|$#,!.,)!
+3 f0 (23|$#,!.,)!
+3 f5 (23|$#,!.,)!
+3 f238 (23|$#,!.,)!
+3 f0 (23|$#,!.,)!
+3 f5 (23|$#,!.,)!
+3 f0 (23|4@0@7&#,23|$#,!.,)!
+3 f5 (23|4@0@7&#,23|$#,!.,)!
+3 f238 (23|4@0@7&#,23|$#,!.,)!
+3 f0 (23|4@0@7&#,23|$#,!.,)!
+3 f5 (23|4@0@7&#,23|$#,!.,)!
+3 f0 (213|$#,23|$#,206|$#,)!
+3 f5 (213|$#,23|$#,206|$#,)!
+3 f0 (23|$#,206|$#,)!
+3 f5 (23|$#,206|$#,)!
+3 f0 (23|4@0@7&#,23|$#,206|$#,)!
+3 f5 (23|4@0@7&#,23|$#,206|$#,)!
+3 f0 (213|$#,)!
+3 f5 (213|$#,)!
+3 f0 (23|@5|4@0@7&#,5|$#,213|$#,)!
+3 f19 (23|@5|4@0@7&#,5|$#,213|$#,)!
+3 f23 (23|@5|4@0@7&#,5|$#,213|$#,)!
+3 C0.5/4|!
+3 f0 (265|$#,213|$#,)!
+3 f5 (265|$#,213|$#,)!
+3 f0 (23|$#,213|$#,)!
+3 f5 (23|$#,213|$#,)!
+3 f0 (213|@7|$#,)!
+3 f5 (213|@7|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (23|4@0@7&#,)!
+3 f19 (23|4@0@7&#,)!
+3 f23 (23|4@0@7&#,)!
+3 f0 (265|$#,213|@7|$#,)!
+3 f5 (265|$#,213|@7|$#,)!
+3 f0 (265|$#,)!
+3 f5 (265|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (265|$#,213|$#,)!
+3 f5 (265|$#,213|$#,)!
+3 f0 (20|4@0@7&#,63|$#,63|$#,213|$#,)!
+3 f63 (20|4@0@7&#,63|$#,63|$#,213|$#,)!
+3 f0 (20|$#,63|$#,63|$#,213|$#,)!
+3 f63 (20|$#,63|$#,63|$#,213|$#,)!
+1 t212|212&
+3 f0 (213|$#,289|4@0@7&#,)!
+3 f5 (213|$#,289|4@0@7&#,)!
+3 f0 (213|$#,9|$#,5|$#,)!
+3 f5 (213|$#,9|$#,5|$#,)!
+3 f0 (213|$#,289|$#,)!
+3 f5 (213|$#,289|$#,)!
+3 f0 (213|$#,)!
+3 f9 (213|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (213|$#,)!
+3 f1 (213|$#,)!
+3 f0 (213|$#,)!
+3 f5 (213|$#,)!
+3 f0 (213|$#,)!
+3 f5 (213|$#,)!
+3 f0 (23|0@5@7&#,)!
+3 f1 (23|0@5@7&#,)!
+3 f0 (23|$#,)!
+3 f17 (23|$#,)!
+3 f0 (23|$#,)!
+3 f5 (23|$#,)!
+3 f0 (23|$#,)!
+3 f9 (23|$#,)!
+1 t19|19&
+1 t23|23&
+3 f0 (23|$#,315|4@5@7&#,)!
+3 f17 (23|$#,315|4@5@7&#,)!
+3 f0 (23|$#,315|4@5@7&#,5|$#,)!
+3 f9 (23|$#,315|4@5@7&#,5|$#,)!
+3 f0 (23|$#,315|4@5@7&#,5|$#,)!
+3 f10 (23|$#,315|4@5@7&#,5|$#,)!
+3 f0 ()!
+3 f5 ()!
+3 f0 (6|$#,)!
+3 f1 (6|$#,)!
+3 f0 (63|$#,63|$#,)!
+3 f19 (63|$#,63|$#,)!
+3 f20 (63|$#,63|$#,)!
+3 f0 (63|$#,)!
+3 f19 (63|$#,)!
+3 f20 (63|$#,)!
+3 f0 (20|@5|4@5@2&#,63|$#,)!
+3 f19 (20|@5|4@5@2&#,63|$#,)!
+3 f20 (20|@5|4@5@2&#,63|$#,)!
+3 f0 (20|4@5@2&#,)!
+3 f1 (20|4@5@2&#,)!
+3 f0 ()!
+3 f1 ()!
+3 f0 (5|$#,)!
+3 f1 (5|$#,)!
+3 ?!
+3 f341 ()!
+3 f1 ()^344
+1 t343|343&
+3 f0 (344|$#,)!
+3 f5 (344|$#,)!
+3 f0 (23|$#,)!
+3 f19 (23|$#,)!
+3 f23 (23|$#,)!
+3 f0 (23|0@5@7&#,)!
+3 f5 (23|0@5@7&#,)!
+3 ?!
+3 f352 (20|$#,20|$#,)!
+3 f5 (20|$#,20|$#,)^355
+1 t354|354&
+3 f0 (20|$#,20|$#,63|$#,63|$#,355|$#,)!
+3 f19 (20|$#,20|$#,63|$#,63|$#,355|$#,)!
+3 f20 (20|$#,20|$#,63|$#,63|$#,355|$#,)!
+3 ?!
+3 f359 (20|$#,20|$#,)!
+3 f5 (20|$#,20|$#,)^362
+1 t361|361&
+3 f0 (20|$#,63|$#,63|$#,362|$#,)!
+3 f1 (20|$#,63|$#,63|$#,362|$#,)!
+3 f0 (5|$#,)!
+3 f5 (5|$#,)!
+3 S!2{5|@1|$#quot,5|@1|$#rem,}!
+0 s339|&
+0 s21|&
+3 f0 (5|$#,5|$#,)!
+3 f369 (5|$#,5|$#,)!
+3 f0 (9|$#,)!
+3 f9 (9|$#,)!
+3 S!3{9|@1|$#quot,9|@1|$#rem,}!
+0 s340|&
+0 s22|&
+3 f0 (9|$#,9|$#,)!
+3 f376 (9|$#,9|$#,)!
+3 f0 (5|$#,)!
+3 f66 (5|$#,)!
+3 f0 (213|$#,)!
+3 f66 (213|$#,)!
+1 t65|65 465 -1
+3 f0 (383|@5|$#,5|$#,213|$#,)!
+3 f19 (383|@5|$#,5|$#,213|$#,)!
+3 f383 (383|@5|$#,5|$#,213|$#,)!
+3 f0 (65|$#,213|$#,)!
+3 f66 (65|$#,213|$#,)!
+3 f0 (383|$#,213|$#,)!
+3 f5 (383|$#,213|$#,)!
+3 f0 (213|$#,5|$#,)!
+3 f5 (213|$#,5|$#,)!
+3 f0 (213|$#,383|$#,!.,)!
+3 f5 (213|$#,383|$#,!.,)!
+3 f0 (213|$#,383|$#,!.,)!
+3 f5 (213|$#,383|$#,!.,)!
+3 f0 (213|@7|$#,)!
+3 f66 (213|@7|$#,)!
+3 f0 ()!
+3 f66 ()!
+1 t67|67&
+3 f0 (23|$#,63|$#,401|0@5@7&#,)!
+3 f63 (23|$#,63|$#,401|0@5@7&#,)!
+3 f0 (383|0@5@7&#,23|$#,63|$#,401|0@5@7&#,)!
+3 f63 (383|0@5@7&#,23|$#,63|$#,401|0@5@7&#,)!
+3 f0 (401|0@5@7&#,)!
+3 f5 (401|0@5@7&#,)!
+3 f0 (383|0@5@7&#,315|$#,63|$#,401|0@5@7&#,)!
+3 f63 (383|0@5@7&#,315|$#,63|$#,401|0@5@7&#,)!
+3 f0 (65|$#,213|@7|$#,)!
+3 f66 (65|$#,213|@7|$#,)!
+3 f0 (65|$#,)!
+3 f66 (65|$#,)!
+3 f0 (383|$#,63|$#,383|$#,!.,)!
+3 f5 (383|$#,63|$#,383|$#,!.,)!
+3 f0 (383|$#,383|$#,!.,)!
+3 f5 (383|$#,383|$#,!.,)!
+3 f0 (66|$#,213|$#,)!
+3 f66 (66|$#,213|$#,)!
+3 f0 (213|$#,383|$#,206|$#,)!
+3 f5 (213|$#,383|$#,206|$#,)!
+3 f0 (383|$#,63|$#,383|$#,206|$#,)!
+3 f5 (383|$#,63|$#,383|$#,206|$#,)!
+3 f0 (383|$#,206|$#,)!
+3 f5 (383|$#,206|$#,)!
+3 f0 (23|4@5@7&#,65|$#,401|0@5@7&#,)!
+3 f63 (23|4@5@7&#,65|$#,401|0@5@7&#,)!
+3 C0.1/383|!
+3 f0 (383|@5|4@0@9&#,383|$#,)!
+3 f1 (383|@5|4@0@9&#,383|$#,)!
+3 f428 (383|@5|4@0@9&#,383|$#,)!
+3 f0 (383|@5|$#,65|$#,)!
+3 f19 (383|@5|$#,65|$#,)!
+3 f383 (383|@5|$#,65|$#,)!
+3 f0 (383|$#,383|$#,)!
+3 f5 (383|$#,383|$#,)!
+3 f0 (383|$#,383|$#,)!
+3 f5 (383|$#,383|$#,)!
+3 f0 (383|@5|4@0@9&#,383|$#,)!
+3 f1 (383|@5|4@0@9&#,383|$#,)!
+3 f428 (383|@5|4@0@9&#,383|$#,)!
+3 f0 (383|$#,383|$#,)!
+3 f63 (383|$#,383|$#,)!
+0 s341|-1 445 -1
+1 t444|444&
+3 f0 (383|4@0@7&#,63|$#,383|$#,445|$#,)!
+3 f63 (383|4@0@7&#,63|$#,383|$#,445|$#,)!
+3 f0 (383|$#,)!
+3 f63 (383|$#,)!
+3 C0.1/383|!
+3 f0 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f1 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f450 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f0 (383|$#,383|$#,63|$#,)!
+3 f5 (383|$#,383|$#,63|$#,)!
+3 f0 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f1 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f450 (383|@5|4@0@9&#,383|$#,63|$#,)!
+3 f0 (383|@5|$#,383|$#,)!
+3 f19 (383|@5|$#,383|$#,)!
+3 f383 (383|@5|$#,383|$#,)!
+3 f0 (383|@5|$#,65|$#,)!
+3 f19 (383|@5|$#,65|$#,)!
+3 f383 (383|@5|$#,65|$#,)!
+1 t383|383&
+3 f0 (23|0@5@7&#,465|$#,63|$#,401|0@5@7&#,)!
+3 f63 (23|0@5@7&#,465|$#,63|$#,401|0@5@7&#,)!
+3 f0 (383|$#,383|$#,)!
+3 f63 (383|$#,383|$#,)!
+3 f0 (383|$#,383|$#,)!
+3 f19 (383|$#,383|$#,)!
+3 f383 (383|$#,383|$#,)!
+3 f0 (383|$#,465|0@5@7&#,)!
+3 f17 (383|$#,465|0@5@7&#,)!
+3 f0 (383|0@5@7&#,383|$#,465|$#,)!
+3 f19 (383|0@5@7&#,383|$#,465|$#,)!
+3 f383 (383|0@5@7&#,383|$#,465|$#,)!
+3 f0 (383|$#,465|0@5@7&#,5|$#,)!
+3 f9 (383|$#,465|0@5@7&#,5|$#,)!
+3 f0 (383|$#,465|0@5@7&#,5|$#,)!
+3 f10 (383|$#,465|0@5@7&#,5|$#,)!
+3 f0 (383|0@5@7&#,383|$#,63|$#,)!
+3 f63 (383|0@5@7&#,383|$#,63|$#,)!
+3 f0 (66|$#,)!
+3 f5 (66|$#,)!
+3 f0 (383|$#,65|$#,63|$#,)!
+3 f19 (383|$#,65|$#,63|$#,)!
+3 f383 (383|$#,65|$#,63|$#,)!
+3 f0 (383|$#,383|$#,63|$#,)!
+3 f5 (383|$#,383|$#,63|$#,)!
+3 f0 (383|@5|$#,383|$#,63|$#,)!
+3 f19 (383|@5|$#,383|$#,63|$#,)!
+3 f383 (383|@5|$#,383|$#,63|$#,)!
+3 f0 (383|@5|$#,383|$#,63|$#,)!
+3 f19 (383|@5|$#,383|$#,63|$#,)!
+3 f383 (383|@5|$#,383|$#,63|$#,)!
+3 f0 (383|@5|$#,65|$#,63|$#,)!
+3 f19 (383|@5|$#,65|$#,63|$#,)!
+3 f383 (383|@5|$#,65|$#,63|$#,)!
+3 f0 (383|$#,!.,)!
+3 f5 (383|$#,!.,)!
+3 f0 (383|$#,!.,)!
+3 f5 (383|$#,!.,)!
+0 s10|&
+0 s11|&
+3 C0.2/5|!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f506 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f506 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f506 (66|$#,)!
+3 f0 (66|$#,504|$#,)!
+3 f2 (66|$#,504|$#,)!
+3 f506 (66|$#,504|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f506 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 C0.2/5|!
+3 f524 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f524 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f524 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f524 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f524 (66|$#,)!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f524 (66|$#,)!
+3 C0.2/5|!
+3 f0 (66|$#,)!
+3 f2 (66|$#,)!
+3 f541 (66|$#,)!
+3 C0.66/5|!
+3 f0 (66|$#,505|$#,)!
+3 f66 (66|$#,505|$#,)!
+3 f545 (66|$#,505|$#,)!
+3 f0 (66|$#,)!
+3 f66 (66|$#,)!
+3 f545 (66|$#,)!
+3 f0 (66|$#,)!
+3 f66 (66|$#,)!
+3 f545 (66|$#,)!
+3 f0 (23|$#,)!
+3 f505 (23|$#,)!
+3 f0 (23|$#,)!
+3 f504 (23|$#,)!
+3 f0 (23|$#,63|$#,)!
+3 f5 (23|$#,63|$#,)!
+3 f0 (383|0@5@7&#,23|0@5@7&#,63|$#,)!
+3 f5 (383|0@5@7&#,23|0@5@7&#,63|$#,)!
+3 f0 (23|4@5@7&#,65|$#,)!
+3 f5 (23|4@5@7&#,65|$#,)!
+3 f0 (383|4@0@7&#,23|$#,63|$#,)!
+3 f63 (383|4@0@7&#,23|$#,63|$#,)!
+3 f0 (23|4@0@7&#,383|$#,63|$#,)!
+3 f63 (23|4@0@7&#,383|$#,63|$#,)!
+3 C0.1/20|!
+3 f0 (20|@5|4@0@9&#,20|$#,63|$#,)!
+3 f1 (20|@5|4@0@9&#,20|$#,63|$#,)!
+3 f569 (20|@5|4@0@9&#,20|$#,63|$#,)!
+3 f0 (20|@5|4@0@7&#,20|$#,63|$#,)!
+3 f1 (20|@5|4@0@7&#,20|$#,63|$#,)!
+3 f569 (20|@5|4@0@7&#,20|$#,63|$#,)!
+3 C0.1/23|!
+3 f0 (23|@5|4@0@9&#,23|$#,)!
+3 f1 (23|@5|4@0@9&#,23|$#,)!
+3 f576 (23|@5|4@0@9&#,23|$#,)!
+3 f0 (23|@5|4@0@9&#,23|$#,63|$#,)!
+3 f1 (23|@5|4@0@9&#,23|$#,63|$#,)!
+3 f576 (23|@5|4@0@9&#,23|$#,63|$#,)!
+3 f0 (23|@5|4@0@9&#,23|$#,)!
+3 f1 (23|@5|4@0@9&#,23|$#,)!
+3 f576 (23|@5|4@0@9&#,23|$#,)!
+3 f0 (23|@5|4@0@9&#,23|$#,5|$#,)!
+3 f1 (23|@5|4@0@9&#,23|$#,5|$#,)!
+3 f576 (23|@5|4@0@9&#,23|$#,5|$#,)!
+3 f0 (20|$#,20|$#,63|$#,)!
+3 f5 (20|$#,20|$#,63|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f5 (23|$#,23|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f5 (23|$#,23|$#,)!
+3 f0 (23|$#,23|$#,63|$#,)!
+3 f5 (23|$#,23|$#,63|$#,)!
+3 f0 (23|4@5@7&#,23|$#,63|$#,)!
+3 f63 (23|4@5@7&#,23|$#,63|$#,)!
+3 f0 (20|$#,5|$#,63|$#,)!
+3 f19 (20|$#,5|$#,63|$#,)!
+3 f20 (20|$#,5|$#,63|$#,)!
+3 f0 (23|@5|$#,265|$#,)!
+3 f19 (23|@5|$#,265|$#,)!
+3 f23 (23|@5|$#,265|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f63 (23|$#,23|$#,)!
+3 f0 (23|@5|$#,23|$#,)!
+3 f19 (23|@5|$#,23|$#,)!
+3 f23 (23|@5|$#,23|$#,)!
+3 f0 (23|@5|$#,265|$#,)!
+3 f19 (23|@5|$#,265|$#,)!
+3 f23 (23|@5|$#,265|$#,)!
+3 f0 (23|$#,23|$#,)!
+3 f63 (23|$#,23|$#,)!
+3 f0 (23|@5|0@0@9&#,23|$#,)!
+3 f19 (23|@5|0@0@9&#,23|$#,)!
+3 f23 (23|@5|0@0@9&#,23|$#,)!
+3 f0 (23|@5|0@5@7&#,23|$#,)!
+3 f19 (23|@5|0@5@7&#,23|$#,)!
+3 f23 (23|@5|0@5@7&#,23|$#,)!
+3 C0.1/20|!
+3 f0 (20|@5|4@0@7&#,5|$#,63|$#,)!
+3 f1 (20|@5|4@0@7&#,5|$#,63|$#,)!
+3 f621 (20|@5|4@0@7&#,5|$#,63|$#,)!
+3 f0 (5|$#,)!
+3 f19 (5|$#,)!
+3 f23 (5|$#,)!
+3 f0 (23|$#,)!
+3 f63 (23|$#,)!
+0 s12|&
+0 s13|-1 639 -1
+3 Stm{5|@1|$#tm_sec,5|@1|$#tm_min,5|@1|$#tm_hour,5|@1|$#tm_mday,5|@1|$#tm_mon,5|@1|$#tm_year,5|@1|$#tm_wday,5|@1|$#tm_yday,5|@1|$#tm_isdst,}!
+3 f0 ()!
+3 f630 ()!
+3 f0 (631|$#,631|$#,)!
+3 f17 (631|$#,631|$#,)!
+3 f0 (445|$#,)!
+3 f631 (445|$#,)!
+1 t631|631&
+3 f0 (639|4@5@7&#,)!
+3 f631 (639|4@5@7&#,)!
+3 f0 (445|$#,)!
+3 f19 (445|$#,)!
+3 f23 (445|$#,)!
+3 f0 (639|$#,)!
+3 f19 (639|$#,)!
+3 f23 (639|$#,)!
+3 f0 (639|$#,)!
+3 f19 (639|$#,)!
+3 f445 (639|$#,)!
+3 f0 (639|$#,)!
+3 f19 (639|$#,)!
+3 f445 (639|$#,)!
+3 f0 (23|4@0@7&#,63|$#,23|$#,445|$#,)!
+3 f63 (23|4@0@7&#,63|$#,23|$#,445|$#,)!
+0 a1|&
+0 s14|&
+;;tistable
+0
+0,17
+17
+0,17,18
+18
+0,17,18,19
+19
+0,17,18,19,20
+20
+1
+;;symTable
+*0 (Datatype)
+0@+@=@0@7@0@0@67#mbstate_t
+0@+@+@0@7@0@0@656#mnull
+2@-@-@0@0@0@0@2#lltX_bool
+13@-@-@0@0@0@0@59#__SIZE_TYPE__
+13@-@-@0@0@0@0@60#__PTRDIFF_TYPE__
+13@-@-@0@0@0@0@61#__WCHAR_TYPE__
+13@-@-@0@0@0@0@62#ptrdiff_t
+13@-@-@0@0@0@0@65#wchar_t
+13@-@-@0@0@0@0@66#wint_t
+13@-@-@0@0@0@0@178#sig_atomic_t
+13@-@-@0@0@0@0@504#wctype_t
+13@-@-@0@0@0@0@505#wctrans_t
+13@-@-@0@0@0@0@630#clock_t
+13@-@-@0@0@0@0@631#time_t
+13@-@-@0@0@0@0@657#__PTRDIFF_TYPE__ 
+14@-@-@0@0@0@0@63#size_t
+15@-@-@0@0@0@0@64#ssize_t
+20@+@+@0@0@0@0@173#jmp_buf
+20@+@+@0@0@0@0@206#va_list
+20@+@+@0@0@0@0@211#FILE
+20@+@+@0@0@0@0@212#fpos_t
+367@-@-@0@0@0@0@369#div_t
+374@-@-@0@0@0@0@376#ldiv_t
+*1 (Constant)
+0@i0@0@6#NULL
+2$#NDEBUG
+2@i1@0@0#TRUE
+2@i0@0@6#FALSE
+3$#UCHAR_MAX#UCHAR_MIN
+4$#CHAR_MAX#CHAR_MIN#SCHAR_MAX#SCHAR_MIN
+5$#BUFSIZ#CHAR_BIT#CLOCKS_PER_SEC#EDOM#EILSEQ#EOF#ERANGE#EXIT_FAILURE#EXIT_SUCCESS#FILENAME_MAX#FLT_RADIX#FOPEN_MAX#INT_MAX#INT_MIN#LC_ALL#LC_COLLATE#LC_CTYPE#LC_MONETARY#LC_NUMERIC#LC_TIME#L_tmpnam#RAND_MAX#SEEK_CUR#SEEK_END#SEEK_SET#SIGABRT#SIGFPE#SIGILL#SIGINT#SIGSEGV#SIGTERM#TMP_MAX#WCHAR_MAX#WCHAR_MIN#_IOFBF#_IOLBF#_IONBF#__INCLUDE_LEVEL__#__LCLINT__#__LINE__
+6$#UINT_MAX
+7$#SHRT_MAX#SHRT_MIN
+8$#USHRT_MAX
+9$#LONG_MAX#LONG_MIN#MB_LEN_MAX
+10$#ULONG_MAX
+17$#HUGE_VAL
+23$#__BASE_FILE__#__DATE__#__FILE__#__REGISTER_PREFIX__#__TIME__#__USER_LABEL_PREFIX__#__VERSION__
+63$#MB_CUR_MAX
+66$#WEOF
+182$#SIG_DFL
+186$#SIG_ERR
+190$#SIG_IGN
+*3 (Variable)
+5|@1|0@0@0@0@1#DBL_DIG#DBL_MANT_DIG#DBL_MAX_10_EXP#DBL_MAX_EXP#DBL_MIN_10_EXP#DBL_MIN_EXP#FLT_DIG#FLT_MANT_DIG#FLT_MAX_10_EXP#FLT_MAX_EXP#FLT_MIN_10_EXP#FLT_MIN_EXP#FLT_ROUNDS#LDBL_DIG#LDBL_MANT_DIG#LDBL_MAX_10_EXP#LDBL_MAX_EXP#LDBL_MIN_10_EXP#LDBL_MIN_EXP#errno
+16|@1|0@0@0@0@1#FLT_EPSILON#FLT_MAX#FLT_MIN
+17|@1|0@0@0@0@1#DBL_EPSILON#DBL_MAX#DBL_MIN
+18|@1|0@0@0@0@1#LDBL_EPSILON#LDBL_MAX#LDBL_MIN
+213|@1|0@0@0@0@1#stderr#stdin#stdout
+*4 (Function)
+364$@0@g113@0@0@1@tp0,g113$@0#qsort
+177@6@0@5@0@0@1@@1@s0$@0#longjmp
+208$@0@@1@p0$@0#va_start
+235$@0@s3@1@s3,tp0,tp1$@0#setbuf
+340@6@0@6@0@0@1@@1@s0$@0#exit
+325$@0@s1@1@s1$@0#srand
+336$@0@@1@tp0$@0#free
+307$@1@g113@0@0,g123@0@0,s3@1@s3,tg123$@0#perror
+210$@0@@1@p0$@0#va_end
+301$@0@@1@tp0$@0#clearerr#rewind
+72@6@0@8@0@0@1@@1@s0$@0#assert
+338@6@0@6@0@0@1@@1@s0$@0#abort
+237$@0@s3@1@s3,tp0,tp1$@0#setvbuf
+423$@0@@1@tp0$@0#vswprintf
+415@6@0@1@1@0@0@@1@tp0$@0#swprintf
+590$@1@@1@s0$@0#memcmp
+596$@1@@1@s0$@0#strncmp
+259$@0@@1@tp0,p2$@0#vsprintf
+253@6@0@1@2@0@1@@1@s0$@0#sscanf
+293$@0@s3,g113@0@0@1@s3,tp0,g113$@0#fseek
+255$@0@s3,g113@0@0@1@s3,tp0,p2,g113$@0#vfprintf
+243@6@0@1@2@0@0@s3@1@s3,tp0$@0#fscanf
+421$@0@s3@1@s3,tp0$@0#vfwprintf
+394@6@0@1@1@0@0@s3@1@tp0,s3$@0#fwprintf
+396@6@0@1@2@0@0@s3@1@tp0,s3$@0#fwscanf
+455$@1@@1@s0$@0#wcsncmp#wmemcmp
+417@6@0@1@2@0@0@g124@0@0@1@tg124$@0#swscanf
+562$@0@@1@tp0$@0#mbtowc
+217$@0@s3,g113@0@0@1@s3,g113$@0#rename
+592$@1@@1@s0$@0#strcmp#strcoll
+560$@1@@1@s0$@0#mblen
+257$@1@g125@0@0,s3@1@s3,p1,tg125$@0#vprintf
+269$@0@s3@1@s3,tp1$@0#fputs
+248@6@0@1@2@0@1@g124@0@0,s3@1@s3,tg124$@0#scanf
+564$@0@@1@tp0$@0#wctomb
+392$@1@@1@s0$@0#fwide
+295$@0@s3,g113@0@0@1@s3,tp0,g113$@0#fsetpos
+291$@0@g113@0@0@1@tp1,g113$@0#fgetpos
+425$@0@s3,g125@0@0@1@s3,tg125$@0#vwprintf
+390$@0@s3@1@s3,tp1$@0#fputws
+436$@1@@1@s0$@0#wcscmp#wcscoll
+501@6@0@1@1@0@1@g125@0@0,g113@0@0@1@g113,tg125$@0#wprintf
+503@6@0@1@2@0@1@g124@0@0,g113@0@0@1@g113,tg124$@0#wscanf
+267$@0@s3,g113@0@0@1@s3,tp1,g113$@0#fputc#ungetc
+278$@0@s3@1@s3,tp1$@0#putc
+366$@1@@1@s0$@0#abs
+205@6@0@5@0@0$$@0#raise
+215$@0@s3,g113@0@0@1@s3,g113$@0#remove
+282$@1@g125@0@0,s3@1@s3,tg125$@0#puts
+311$@1@@1@s0$@0#atoi
+351$@0@s3@1@s3$@0#system
+485$@1@@1@s0$@0#wctob
+175$@0@@1@p0$@0#setjmp
+225$@0@g113@0@0,s3@1@tp0,g113,s3$@0#fclose#fgetc
+303$@0@g113@0@0@1@g113$@0#feof#ferror
+271$@0@s3@1@s3,tp0$@0#getc
+227$@0@g113@0@0,s3@1@tp0,g113,s3$@0#fflush
+346$@0@s1@1@s1$@0#atexit
+407$@1@@1@s0$@0#mbsinit
+280$@1@g125@0@0,s3@1@s3,tg125$@0#putchar
+323$@0@s1@1@s1$@0#rand
+273$@1@g124@0@0,s3@1@s3,tg124$@0#getchar
+319$@0@g113@0@0@1@tp1,g113$@0#strtol
+479$@0@@1@tp1$@0#wcstol
+373$@1@@1@s0$@0#labs
+313$@1@@1@s0$@0#atol
+297$@0@g113@0@0@1@g113$@0#ftell
+321$@0@g113@0@0@1@tp1,g113$@0#strtoul
+481$@0@@1@tp1$@0#wcstoul
+152$@0@g113@0@0@1@g113$@0#ldexp
+160$@0@g113@0@0@1@g113$@0#pow
+142$@1@@1@s0$@0#atan2#fmod
+154$@0@@1@tp1$@0#frexp
+170$@0@@1@tp1$@0#modf
+317$@0@g113@0@0@1@tp1,g113$@0#strtod
+474$@0@@1@tp1$@0#wcstod
+636$@1@@1@s0$@0#difftime
+138$@0@g113@0@0@1@g113$@0#acos#asin#cosh#exp#log#log10#sqrt
+140$@1@@1@s0$@0#atan#ceil#cos#fabs#floor#sin#sinh#tan#tanh
+309$@1@@1@s0$@0#atof
+358@6@5@1@0@0@1@@1@s0@18@0@0#bsearch
+601@6@5@1@0@0@1@@1@s0@3@0@0#memchr
+334@6@5@1@0@0@0@@1@tp0@2@0@0#realloc
+328@6@5@1@0@0@1@@1@s0@2@0@0#calloc
+331@4@5@1@0@0@1@@1@s0@2@0@0#malloc
+264@6@5@1@0@0@0@s3,g113@0@0@1@s3,tp0,tp2,g113$@0#fgets
+124@6@5@1@0@0@0@s1,g113@0@0@1@s1,g113@19@3@0#setlocale
+609@6@5@1@0@0@1@@1@s0@19@2@0#strpbrk
+604@6@5@1@0@0@1@@1@s0@19@2@0#strchr#strrchr
+620@6@5@1@0@0@0@s1,g113@0@0@1@tp0,s1,g113@19@2@0#strtok
+617@6@5@1@0@0@1@@1@s0@19@2@0#strstr
+627$@1@@1@s0@19@3@0#strerror
+349@6@5@1@0@0@1@@1@s0@19@3@0#getenv
+276@6@5@1@0@0@1@g124@0@0,s3,g113@0@0@1@s3,tp0,tg124,g113@3@0@0#gets
+223$@0@s1@1@tp0,s1@19@3@0#tmpnam
+644$@0@g113@0@0@1@g113@19@3@0#asctime
+647$@1@@1@s0@19@3@0#ctime
+288$@0@s3,g113@0@0@1@s3,tp3,g113$@0#fwrite
+286$@0@s3,g113@0@0@1@s3,tp0,tp3,g113$@0#fread
+467$@0@@1@tp1$@0#wcsrtombs
+655$@0@@1@tp0$@0#strftime
+405$@0@@1@tp0$@0#mbrtowc
+409$@0@@1@tp0$@0#mbsrtowcs
+447$@0@@1@tp0$@0#wcsftime
+403$@1@@1@s0$@0#mbrlen
+568$@0@@1@tp0$@0#wcstombs
+598$@0@@1@tp0$@0#strxfrm
+427$@0@@1@tp0$@0#wcrtomb
+483$@0@@1@tp0$@0#wcsxfrm
+566$@0@@1@tp0$@0#mbstowcs
+606$@1@@1@s0$@0#strcspn#strspn
+443$@1@@1@s0$@0#wcscspn#wcsspn
+629$@1@@1@s0$@0#strlen
+449$@1@@1@s0$@0#wcslen
+388$@0@s3@1@s3,tp1$@0#fputwc
+411$@0@s3@1@s3,tp1$@0#putwc
+419$@0@s3@1@s3,tp1$@0#ungetwc
+380$@1@@1@s0$@0#btowc
+413$@0@s3,g125@0@0@1@s3,tg125$@0#putwchar
+382$@0@s3@1@s3,tp0$@0#fgetwc
+398$@0@s3@1@s3,tp0$@0#getwc
+400$@0@s3,g124@0@0@1@s3,tg124$@0#getwchar
+128$@1@@1@s0@3@0@0#localeconv
+233@6@5@1@0@0@0@s3,g113@0@0@1@tp2,s3,g113@3@0@0#freopen
+230@6@5@1@0@0@0@s3@1@s3@18@0@0#fopen
+220@6@5@1@0@0@0@s3@1@s3@3@0@0#tmpfile
+371$@1@@1@s0$@0#div
+378$@1@@1@s0$@0#ldiv
+488@6@5@1@0@0@1@@1@s0@3@0@0#wmemchr
+386@6@5@1@0@0@0@s3@1@s3,tp0,tp2$@0#fgetws
+499$@0@@1@tp0$@0#wmemset
+493$@0@@1@tp0$@0#wmemcpy#wmemmove
+477@6@5@1@0@0@0@@1@tp2@3@0@0#wcstok
+472@6@5@1@0@0@1@@1@s0@3@0@0#wcsstr
+464@6@5@1@0@0@1@@1@s0$@0#wcsrchr
+434@6@5@1@0@0@1@@1@s0@19@2@0#wcschr
+461@6@5@1@0@0@1@@1@s0$@0#wcspbrk
+653@6@5@1@0@0@0@g113@0@0@1@g113@19@3@0#localtime
+650@6@5@1@0@0@1@@1@s0@19@3@0#gmtime
+558$@1@@1@s0$@0#wctype
+556$@1@@1@s0$@0#wctrans
+634$@0@s1@1@s1$@0#clock
+638$@1@@1@s0$@0#mktime
+641$@0@@1@tp0$@0#time
+203@6@5@1@0@0@0@s1,g113@0@0@1@s1,g113$@0#signal
+624$@0@@1@tp0$@0#memset
+575$@0@@1@tp0$@0#memmove
+572$@0@@1@tp0$@0#memcpy
+588$@0@@1@tp0$@0#strncat
+582$@0@@1@tp0$@0#strncpy
+585$@0@@1@tp0$@0#strcat#strcpy
+453$@0@@1@tp0$@0#wcsncat#wcsncpy
+431$@0@@1@tp0$@0#wcscat#wcscpy
+518$@1@@1@s0$@0#iswctype
+509$@1@@1@s0$@0#iswalnum#iswalpha#iswcntrl#iswdigit#iswgraph#iswlower#iswprint#iswpunct#iswspace#iswupper#iswxdigit
+77$@1@@1@s0$@0#isalnum#isalpha#iscntrl#isdigit#isgraph#islower#isprint#ispunct#isspace#isupper#isxdigit
+116$@1@@1@s0$@0#tolower#toupper
+251@6@0@1@1@0@0@@1@tp0$@0#sprintf
+241@6@0@1@1@0@0@s3@1@s3,tp0$@0#fprintf
+246@6@0@1@1@0@1@g125@0@0,s3@1@s3,tg125$@0#printf
+548$@1@@1@s0$@0#towctrans
+551$@1@@1@s0$@0#towlower#towupper
+*7 (Struct tag)
+367@368#@!2
+374@375#@!3
+632@444#@tm
+120@121#@lconv
+;; Modules access
+ansi#8@
+null6#10@
+;;End
diff --git a/test/null6.lcl b/test/null6.lcl
new file mode 100644
index 0000000..28c13fc
--- /dev/null
+++ b/test/null6.lcl
@@ -0,0 +1 @@
+mutable type mnull;
\ No newline at end of file
diff --git a/test/null6.lcs b/test/null6.lcs
new file mode 100644
index 0000000..4c89dbb
--- /dev/null
+++ b/test/null6.lcs
@@ -0,0 +1,123 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort mnull immutable nil nil
+%LCLsort _mnull_Obj mutable mnull nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :mnull -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype mnull _mnull_Obj mutable
+%LCLSymbolTableEnd
diff --git a/test/observer.c b/test/observer.c
new file mode 100644
index 0000000..86cb9d2
--- /dev/null
+++ b/test/observer.c
@@ -0,0 +1,51 @@
+typedef struct _stx
+{
+  /*@only@*/ char *name;
+  int   val;
+} *stx;
+
+/*@only@*/ char *stx_name (stx x)
+{
+  return (x->name); /* 1. Function returns reference to parameter x: (x->name)
+		    ** [2]. Return value exposes rep of stx: (x->name)
+		    ** 3. Released storage x->name reachable from parameter 
+		    */
+}
+
+/*@observer@*/ char *stx_observeName (stx x)
+{
+  return (x->name); 
+}
+
+/*@exposed@*/ char *stx_exposeName (stx x)
+{
+  return (x->name); /* okay */
+}
+
+char *f (stx x)
+{
+  char *s;
+
+  s = stx_name (x);
+  free (s);  /* okay */
+
+  s = stx_observeName (x);
+  *s = 'x'; /* 4. Modification of observer */
+  free (s); /* 5. Pass observer as only */
+
+  s = stx_exposeName (x);
+  *s = 'x'; /* okay */
+  free (s); /* 6. Pass exposed as only */
+
+  s = stx_observeName (x);
+  return s; /* 7. Observer storage s returned without qualification: s
+	    ** 8. Dependent storage s returned as unqualified: s
+	    */
+}
+
+
+
+
+
+
+
diff --git a/test/observer.expect b/test/observer.expect
new file mode 100644
index 0000000..4cbd66e
--- /dev/null
+++ b/test/observer.expect
@@ -0,0 +1,54 @@
+
+observer.c: (in function stx_name)
+observer.c:9:10: Function returns reference to parameter x: (x->name)
+observer.c:9:10: Return value exposes rep of stx: (x->name)
+observer.c:9:20: Released storage x->name reachable from parameter at return
+                    point
+   observer.c:9:10: Storage x->name is released
+observer.c: (in function f)
+observer.c:33:3: Suspect modification of observer s: *s = 'x'
+observer.c:34:9: Function call may modify observer *s: s
+observer.c:34:9: Observer storage s passed as only param: free (s)
+   observer.c:32:7: Storage s becomes observer
+observer.c:38:9: Exposed storage s passed as only param: free (s)
+   observer.c:36:3: Storage s becomes exposed
+observer.c:41:10: Observer storage *s reachable from unqualified return value
+observer.c:41:10: Observer storage s returned without qualification: s
+   observer.c:40:7: Storage s becomes observer
+
+Finished LCLint checking --- 9 code errors found, as expected
+
+observer.c: (in function stx_name)
+observer.c:9:10: Function returns reference to parameter x: (x->name)
+observer.c:9:20: Released storage x->name reachable from parameter at return
+                    point
+   observer.c:9:10: Storage x->name is released
+observer.c: (in function f)
+observer.c:33:3: Suspect modification of observer s: *s = 'x'
+observer.c:34:9: Function call may modify observer *s: s
+observer.c:34:9: Observer storage s passed as only param: free (s)
+   observer.c:32:7: Storage s becomes observer
+observer.c:38:9: Exposed storage s passed as only param: free (s)
+   observer.c:36:3: Storage s becomes exposed
+observer.c:41:10: Observer storage *s reachable from unqualified return value
+observer.c:41:10: Observer storage s returned without qualification: s
+   observer.c:40:7: Storage s becomes observer
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+observer.c: (in function stx_name)
+observer.c:9:20: Released storage x->name reachable from parameter at return
+                    point
+   observer.c:9:10: Storage x->name is released
+observer.c: (in function f)
+observer.c:33:3: Suspect modification of observer s: *s = 'x'
+observer.c:34:9: Function call may modify observer *s: s
+observer.c:34:9: Observer storage s passed as only param: free (s)
+   observer.c:32:7: Storage s becomes observer
+observer.c:38:9: Exposed storage s passed as only param: free (s)
+   observer.c:36:3: Storage s becomes exposed
+observer.c:41:10: Observer storage *s reachable from unqualified return value
+observer.c:41:10: Observer storage s returned without qualification: s
+   observer.c:40:7: Storage s becomes observer
+
+Finished LCLint checking --- 7 code errors found, as expected
diff --git a/test/observer.lcl b/test/observer.lcl
new file mode 100644
index 0000000..bcf8f14
--- /dev/null
+++ b/test/observer.lcl
@@ -0,0 +1,3 @@
+mutable type stx;
+
+only char *stx_name (stx x) { }
\ No newline at end of file
diff --git a/test/observer.lcs b/test/observer.lcs
new file mode 100644
index 0000000..ea2325a
--- /dev/null
+++ b/test/observer.lcs
@@ -0,0 +1,125 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort stx immutable nil nil
+%LCLsort _stx_Obj mutable stx nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :stx -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype stx _stx_Obj mutable
+%LCLfcn stx_name : _stx_Obj -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/observer.out b/test/observer.out
new file mode 100644
index 0000000..4cbd66e
--- /dev/null
+++ b/test/observer.out
@@ -0,0 +1,54 @@
+
+observer.c: (in function stx_name)
+observer.c:9:10: Function returns reference to parameter x: (x->name)
+observer.c:9:10: Return value exposes rep of stx: (x->name)
+observer.c:9:20: Released storage x->name reachable from parameter at return
+                    point
+   observer.c:9:10: Storage x->name is released
+observer.c: (in function f)
+observer.c:33:3: Suspect modification of observer s: *s = 'x'
+observer.c:34:9: Function call may modify observer *s: s
+observer.c:34:9: Observer storage s passed as only param: free (s)
+   observer.c:32:7: Storage s becomes observer
+observer.c:38:9: Exposed storage s passed as only param: free (s)
+   observer.c:36:3: Storage s becomes exposed
+observer.c:41:10: Observer storage *s reachable from unqualified return value
+observer.c:41:10: Observer storage s returned without qualification: s
+   observer.c:40:7: Storage s becomes observer
+
+Finished LCLint checking --- 9 code errors found, as expected
+
+observer.c: (in function stx_name)
+observer.c:9:10: Function returns reference to parameter x: (x->name)
+observer.c:9:20: Released storage x->name reachable from parameter at return
+                    point
+   observer.c:9:10: Storage x->name is released
+observer.c: (in function f)
+observer.c:33:3: Suspect modification of observer s: *s = 'x'
+observer.c:34:9: Function call may modify observer *s: s
+observer.c:34:9: Observer storage s passed as only param: free (s)
+   observer.c:32:7: Storage s becomes observer
+observer.c:38:9: Exposed storage s passed as only param: free (s)
+   observer.c:36:3: Storage s becomes exposed
+observer.c:41:10: Observer storage *s reachable from unqualified return value
+observer.c:41:10: Observer storage s returned without qualification: s
+   observer.c:40:7: Storage s becomes observer
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+observer.c: (in function stx_name)
+observer.c:9:20: Released storage x->name reachable from parameter at return
+                    point
+   observer.c:9:10: Storage x->name is released
+observer.c: (in function f)
+observer.c:33:3: Suspect modification of observer s: *s = 'x'
+observer.c:34:9: Function call may modify observer *s: s
+observer.c:34:9: Observer storage s passed as only param: free (s)
+   observer.c:32:7: Storage s becomes observer
+observer.c:38:9: Exposed storage s passed as only param: free (s)
+   observer.c:36:3: Storage s becomes exposed
+observer.c:41:10: Observer storage *s reachable from unqualified return value
+observer.c:41:10: Observer storage s returned without qualification: s
+   observer.c:40:7: Storage s becomes observer
+
+Finished LCLint checking --- 7 code errors found, as expected
diff --git a/test/oldstyle.c b/test/oldstyle.c
new file mode 100644
index 0000000..173b38e
--- /dev/null
+++ b/test/oldstyle.c
@@ -0,0 +1,24 @@
+int f1 (x, y)
+{
+  int z;
+
+  z = *y; /* 1. Dereference of non-pointer (int): *y */
+
+  return z + x;
+}
+
+int f2 (/*@unused@*/ x) /* 2. Function f2 declared with 1 arg, specified with 2 */
+{
+  return 3;
+}
+
+int f3 (x, y)
+   int x;
+   /*@unused@*/ char y; /* 3. Parameter 2, y, of function f3 has inconsistent type */
+{
+  return x;
+}
+
+
+
+
diff --git a/test/oldstyle.expect b/test/oldstyle.expect
new file mode 100644
index 0000000..6f1bbde
--- /dev/null
+++ b/test/oldstyle.expect
@@ -0,0 +1,10 @@
+
+oldstyle.c: (in function f1)
+oldstyle.c:5:8: Dereference of non-pointer (int): *y
+oldstyle.c:10:5: Function f2 declared with 1 arg, specified with 2
+   oldstyle.lcl:2: Specification of f2
+oldstyle.c:15:12: Parameter 2, y, of function f3 has inconsistent type:
+                     declared char, specified char *
+   oldstyle.lcl:4:1: Specification of y: char *
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/oldstyle.lcl b/test/oldstyle.lcl
new file mode 100644
index 0000000..ab93a28
--- /dev/null
+++ b/test/oldstyle.lcl
@@ -0,0 +1,3 @@
+int f1 (int x, int y);
+int f2 (int x, char y);
+int f3 (int x, char *y);
\ No newline at end of file
diff --git a/test/oldstyle.lcs b/test/oldstyle.lcs
new file mode 100644
index 0000000..9269ae5
--- /dev/null
+++ b/test/oldstyle.lcs
@@ -0,0 +1,125 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _HOF_sort_13 hof nil nil
+%LCLsort _HOF_sort_14 hof nil nil
+%LCLsort _HOF_sort_15 hof nil nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLvar f1 _HOF_sort_13
+%LCLvar f2 _HOF_sort_14
+%LCLvar f3 _HOF_sort_15
+%LCLSymbolTableEnd
diff --git a/test/oldstyle.out b/test/oldstyle.out
new file mode 100644
index 0000000..6f1bbde
--- /dev/null
+++ b/test/oldstyle.out
@@ -0,0 +1,10 @@
+
+oldstyle.c: (in function f1)
+oldstyle.c:5:8: Dereference of non-pointer (int): *y
+oldstyle.c:10:5: Function f2 declared with 1 arg, specified with 2
+   oldstyle.lcl:2: Specification of f2
+oldstyle.c:15:12: Parameter 2, y, of function f3 has inconsistent type:
+                     declared char, specified char *
+   oldstyle.lcl:4:1: Specification of y: char *
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/outglob.c b/test/outglob.c
new file mode 100644
index 0000000..de36d75
--- /dev/null
+++ b/test/outglob.c
@@ -0,0 +1,54 @@
+int x1, x2, x3;
+
+int g()
+{
+  return x1 + x2 + x3; /* 1. uses x3 before definition */
+}
+
+int f()
+{
+  int loc;
+
+  if (3 > 4)
+    {
+      loc = 3;
+      return x1; /* 2, 3, 4. bad --- x1 not defined, x2, x3 not defined */ 
+    }
+  else  
+    { 
+      if (4 > 6)
+	{
+	  loc = x1;  /* 5. x1 not defined */
+	  loc = g(); /* 6. bad --- x1, x2 not defined before call (defines x2 and x3) */
+	  loc = x3; 
+	}
+      else if (2 > 3)
+	{
+	  loc = x3; /* 7. x3 not defined */
+	  x1 = 6;
+	  x2 = 7;
+	  return g(); 
+	}
+      else
+	{
+	  x1 = 6;
+	  x2 = 7;
+	  
+	  return 12; /* 8. returns with x3 not defined */
+	}
+    }
+
+  return 12; /* NO! [9, 10. returns with x2 and x3 undefined (x1 IS defined on all branches!)] */
+}
+
+int h (void)
+{
+  return x1; /* okay */
+}
+
+
+
+
+
+
+
diff --git a/test/outglob.expect b/test/outglob.expect
new file mode 100644
index 0000000..2d60d5b
--- /dev/null
+++ b/test/outglob.expect
@@ -0,0 +1,20 @@
+
+outglob.c: (in function g)
+outglob.c:5:20: Undef global x3 used before definition
+outglob.c: (in function f)
+outglob.c:15:14: Undef global x1 used before definition
+outglob.c:15:17: Function returns with global x2 undefined
+   outglob.lcl:3: Storage x2 becomes undefined
+outglob.c:15:17: Function returns with global x3 undefined
+   outglob.lcl:3: Storage x3 becomes undefined
+outglob.c:21:10: Undef global x1 used before definition
+outglob.c:22:10: Global x2 used by function undefined before call: g
+outglob.c:27:10: Undef global x3 used before definition
+outglob.c:37:14: Function returns with global x3 undefined
+   outglob.lcl:3: Storage x3 becomes undefined
+outglob.c:41:13: Function returns with global x2 undefined
+   outglob.lcl:3: Storage x2 becomes undefined
+outglob.c:41:13: Function returns with global x3 undefined
+   outglob.lcl:3: Storage x3 becomes undefined
+
+Finished LCLint checking --- 10 code errors found, as expected
diff --git a/test/outglob.lcl b/test/outglob.lcl
new file mode 100644
index 0000000..a99f2c7
--- /dev/null
+++ b/test/outglob.lcl
@@ -0,0 +1,7 @@
+int x1, x2, x3;
+
+int f (void) undef int x1; undef int x2; undef int x3;
+{ modifies x1, x2, x3; }
+	
+int g (void) int x1, x2; undef int x3;
+{ modifies x3; }
diff --git a/test/outglob.lcs b/test/outglob.lcs
new file mode 100644
index 0000000..79bceba
--- /dev/null
+++ b/test/outglob.lcs
@@ -0,0 +1,127 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _int_Obj obj int nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLvar x1 _int_Obj
+%LCLvar x2 _int_Obj
+%LCLvar x3 _int_Obj
+%LCLfcn f :  -> int 
+%LCLfcnGlobals _int_Obj x1; _int_Obj x2; _int_Obj x3; 
+%LCLfcn g :  -> int 
+%LCLfcnGlobals _int_Obj x1; _int_Obj x2; _int_Obj x3; 
+%LCLSymbolTableEnd
diff --git a/test/outglob.out b/test/outglob.out
new file mode 100644
index 0000000..2d60d5b
--- /dev/null
+++ b/test/outglob.out
@@ -0,0 +1,20 @@
+
+outglob.c: (in function g)
+outglob.c:5:20: Undef global x3 used before definition
+outglob.c: (in function f)
+outglob.c:15:14: Undef global x1 used before definition
+outglob.c:15:17: Function returns with global x2 undefined
+   outglob.lcl:3: Storage x2 becomes undefined
+outglob.c:15:17: Function returns with global x3 undefined
+   outglob.lcl:3: Storage x3 becomes undefined
+outglob.c:21:10: Undef global x1 used before definition
+outglob.c:22:10: Global x2 used by function undefined before call: g
+outglob.c:27:10: Undef global x3 used before definition
+outglob.c:37:14: Function returns with global x3 undefined
+   outglob.lcl:3: Storage x3 becomes undefined
+outglob.c:41:13: Function returns with global x2 undefined
+   outglob.lcl:3: Storage x2 becomes undefined
+outglob.c:41:13: Function returns with global x3 undefined
+   outglob.lcl:3: Storage x3 becomes undefined
+
+Finished LCLint checking --- 10 code errors found, as expected
diff --git a/test/outparam.c b/test/outparam.c
new file mode 100644
index 0000000..1fd19b3
--- /dev/null
+++ b/test/outparam.c
@@ -0,0 +1,52 @@
+typedef struct _st { int a; int b; } *st;
+
+void h(st s, st t)
+{
+  int i;
+  st u1, u2;
+
+  u1->a = 3; /* 1. Variable u1 used before definition */
+  u2 = u1;
+  i = u2->a; 
+
+  i = (*s).a; /* 2. Field s->a used before definition */
+  t->a = i;  
+}
+
+void f(/*@out@*/ int *a, int *b)
+{
+  int x;
+  int *y;
+
+  x = *a;  /* 3. Value *a used before definition */
+  x = *a;  /* not reported */
+  x = *a;  /* not reported */
+  x = *b; 
+
+  y = a;  
+  *a = 3; 
+}
+
+int g()
+{
+  int *b;
+  int *c, *d;
+  st s, t, t2, t3, t4;
+  struct _st u;
+
+  f(c, b);      /* 4, 5. Unallocated storage c passed as out parameter: c,
+	                 Variable b used before definition */
+  f(d, c);      /* 6. Unallocated storage d passed as out parameter: d */
+  *c = *d; 
+  s = t;        /* 7. Variable t used before definition */
+  s = t2->a;    /* 8, 9. Variable t2 used before definition, 
+		         Assignment of int to st: s = t2->a */
+  t3->a = 3;   /* 10. Variable t3 used before definition */
+  u.a = 3;   
+  t4 = (st)malloc(sizeof(struct _st));
+  t4->a = 3;   /* 11. Possible arrow access from null pointer: t4 */
+  return *b;   /* 10. Fresh storage not released before return: t4 */
+}
+
+
+
diff --git a/test/outparam.expect b/test/outparam.expect
new file mode 100644
index 0000000..524362c
--- /dev/null
+++ b/test/outparam.expect
@@ -0,0 +1,20 @@
+
+outparam.c: (in function h)
+outparam.c:8:3: Variable u1 used before definition
+outparam.c:12:7: Field s->a used before definition
+outparam.c: (in function f)
+outparam.c:21:7: Value *a used before definition
+outparam.c: (in function g)
+outparam.c:37:5: Unallocated storage c passed as out parameter: c
+outparam.c:37:8: Variable b used before definition
+outparam.c:39:5: Unallocated storage d passed as out parameter: d
+outparam.c:41:7: Variable t used before definition
+outparam.c:42:7: Variable t2 used before definition
+outparam.c:42:3: Assignment of int to st: s = t2->a
+outparam.c:44:3: Variable t3 used before definition
+outparam.c:47:3: Arrow access from possibly null pointer t4: t4->a
+   outparam.c:46:8: Storage t4 may become null
+outparam.c:48:13: Fresh storage t4 not released before return
+   outparam.c:46:3: Fresh storage t4 allocated
+
+Finished LCLint checking --- 12 code errors found, as expected
diff --git a/test/outparam.lcl b/test/outparam.lcl
new file mode 100644
index 0000000..050ecbc
--- /dev/null
+++ b/test/outparam.lcl
@@ -0,0 +1,7 @@
+typedef struct _st { int a; int b; } *st;
+
+void f(out int *a, int *b) { modifies *a; }
+void h(out st s, out st t) { modifies *t; }
+int g (void) { } 
+
+	
\ No newline at end of file
diff --git a/test/outparam.lcs b/test/outparam.lcs
new file mode 100644
index 0000000..be7319d
--- /dev/null
+++ b/test/outparam.lcs
@@ -0,0 +1,167 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort __st_Struct str _st nil
+%LCLsort b strMem _int_Obj nil
+%LCLsort a strMem _int_Obj nil
+%LCLsort strEnd nil nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __st_Struct_Tuple tup __st_Struct nil
+%LCLsort ___st_Struct_Ptr ptr __st_Struct nil
+%LCLsort ___st_Struct_Arr arr __st_Struct nil
+%LCLsort ___st_Struct_Tuple_Vec vec __st_Struct_Tuple ___st_Struct_Arr
+%LCLsort _st synonym ___st_Struct_Ptr nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLtag _st struct
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop [__, __] :int, int -> __st_Struct_Tuple
+%LCLop __ \select a :__st_Struct_Tuple -> int
+%LCLop __ \select a :__st_Struct -> _int_Obj
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :___st_Struct_Ptr -> ___st_Struct_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ \select b :__st_Struct_Tuple -> int
+%LCLop __ \select b :__st_Struct -> _int_Obj
+%LCLop __ \field_arrow a :___st_Struct_Ptr -> _int_Obj
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :___st_Struct_Tuple_Vec, int -> __st_Struct_Tuple
+%LCLop __ [__] :___st_Struct_Arr, int -> __st_Struct
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ \field_arrow b :___st_Struct_Ptr -> _int_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> ___st_Struct_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :___st_Struct_Ptr, int -> ___st_Struct_Ptr
+%LCLop __ + __  :int, ___st_Struct_Ptr -> ___st_Struct_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :___st_Struct_Ptr, int -> ___st_Struct_Ptr
+%LCLop __ - __  :___st_Struct_Ptr, ___st_Struct_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :___st_Struct_Tuple_Vec, int -> bool
+%LCLop isSub :___st_Struct_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype st _st exposed
+%LCLfcn f : __int_Obj_Ptr, __int_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn h : ___st_Struct_Ptr, ___st_Struct_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn g :  -> int 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/outparam.out b/test/outparam.out
new file mode 100644
index 0000000..524362c
--- /dev/null
+++ b/test/outparam.out
@@ -0,0 +1,20 @@
+
+outparam.c: (in function h)
+outparam.c:8:3: Variable u1 used before definition
+outparam.c:12:7: Field s->a used before definition
+outparam.c: (in function f)
+outparam.c:21:7: Value *a used before definition
+outparam.c: (in function g)
+outparam.c:37:5: Unallocated storage c passed as out parameter: c
+outparam.c:37:8: Variable b used before definition
+outparam.c:39:5: Unallocated storage d passed as out parameter: d
+outparam.c:41:7: Variable t used before definition
+outparam.c:42:7: Variable t2 used before definition
+outparam.c:42:3: Assignment of int to st: s = t2->a
+outparam.c:44:3: Variable t3 used before definition
+outparam.c:47:3: Arrow access from possibly null pointer t4: t4->a
+   outparam.c:46:8: Storage t4 may become null
+outparam.c:48:13: Fresh storage t4 not released before return
+   outparam.c:46:3: Fresh storage t4 allocated
+
+Finished LCLint checking --- 12 code errors found, as expected
diff --git a/test/pivo.h b/test/pivo.h
new file mode 100644
index 0000000..ad29e40
--- /dev/null
+++ b/test/pivo.h
@@ -0,0 +1 @@
+typedef /*@abstract@*/ int pivo;
diff --git a/test/preds.c b/test/preds.c
new file mode 100644
index 0000000..397f011
--- /dev/null
+++ b/test/preds.c
@@ -0,0 +1,49 @@
+# include "bool.h"
+
+int f (bool b1, bool b2, char c, int *p)
+{
+  if (!p)
+    {
+      return 3;
+    }
+
+  if (*p)
+    {
+      return 4;
+    }
+
+  if (!(*p))
+    {
+      return 4;
+    }
+
+  if (b1 = b2)
+    {
+      return 5;
+    }
+  
+  if ((c = 'a'))
+    {
+      return 5;
+    }  
+
+  if (b1 == b2)
+    {
+      return 5;
+    }
+  
+  if (c)
+    {
+      return 2;
+    }
+
+  return 12;
+}
+
+
+
+
+
+
+
+
diff --git a/test/preds.expect b/test/preds.expect
new file mode 100644
index 0000000..2ab97d2
--- /dev/null
+++ b/test/preds.expect
@@ -0,0 +1,65 @@
+
+preds.c: (in function f)
+preds.c:10:7: Test expression for if not bool, type int: *p
+  Test expression type is not boolean or int. (-predboolint will suppress
+  message)
+preds.c:15:8: Operand of ! is non-boolean (int): !(*p)
+  The operand of a boolean operator is not a boolean. Use +ptrnegate to allow !
+  to be used on pointers. (-boolops will suppress message)
+preds.c:20:7: Test expression for if is assignment expression: b1 = b2
+  The condition test is an assignment expression. Probably, you mean to use ==
+  instead of =. If an assignment is intended, add an extra parentheses nesting
+  (e.g., if ((a = b)) ...) to suppress this message. (-predassign will suppress
+  message)
+preds.c:25:7: Test expression for if not bool, type char: (c = 'a')
+  Test expression type is not boolean. (-predboolothers will suppress message)
+preds.c:30:7: Use of == with bool variables (risks inconsistency because of
+                 multiple true values): b1 == b2
+  Two bool values are compared directly using a C primitive. This may produce
+  unexpected results since all non-zero values are considered TRUE, so
+  different TRUE values may not be equal. The file bool.h (included in
+  lclint/lib) provides bool_equal for safe bool comparisons. (-boolcompare will
+  suppress message)
+preds.c:35:7: Test expression for if not bool, type char: c
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+preds.c: (in function f)
+preds.c:20:7: Test expression for if is assignment expression: b1 = b2
+  The condition test is an assignment expression. Probably, you mean to use ==
+  instead of =. If an assignment is intended, add an extra parentheses nesting
+  (e.g., if ((a = b)) ...) to suppress this message. (-predassign will suppress
+  message)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+preds.c: (in function f)
+preds.c:5:8: Operand of ! is non-boolean (int *): !p
+  The operand of ! operator is a pointer. (+ptrnegate will suppress message)
+preds.c:10:7: Test expression for if not bool, type int: *p
+  Test expression type is not boolean or int. (-predboolint will suppress
+  message)
+preds.c:15:8: Operand of ! is non-boolean (int): !(*p)
+  The operand of a boolean operator is not a boolean. Use +ptrnegate to allow !
+  to be used on pointers. (-boolops will suppress message)
+preds.c:20:7: Test expression for if is assignment expression: b1 = b2
+  The condition test is an assignment expression. Probably, you mean to use ==
+  instead of =. If an assignment is intended, add an extra parentheses nesting
+  (e.g., if ((a = b)) ...) to suppress this message. (-predassign will suppress
+  message)
+preds.c:25:7: Test expression for if not bool, type char: (c = 'a')
+  Test expression type is not boolean. (-predboolothers will suppress message)
+preds.c:30:7: Use of == with bool variables (risks inconsistency because of
+                 multiple true values): b1 == b2
+  Two bool values are compared directly using a C primitive. This may produce
+  unexpected results since all non-zero values are considered TRUE, so
+  different TRUE values may not be equal. The file bool.h (included in
+  lclint/lib) provides bool_equal for safe bool comparisons. (-boolcompare will
+  suppress message)
+preds.c:35:7: Test expression for if not bool, type char: c
+preds.c:3:5: Function f declared but not used
+  A function is declared but not used. Use /*@unused@*/ in front of function
+  header to suppress message. (-fcnuse will suppress message)
+   preds.c:41:1: Definition of f
+
+Finished LCLint checking --- 8 code errors found, as expected
diff --git a/test/preds.out b/test/preds.out
new file mode 100644
index 0000000..2ab97d2
--- /dev/null
+++ b/test/preds.out
@@ -0,0 +1,65 @@
+
+preds.c: (in function f)
+preds.c:10:7: Test expression for if not bool, type int: *p
+  Test expression type is not boolean or int. (-predboolint will suppress
+  message)
+preds.c:15:8: Operand of ! is non-boolean (int): !(*p)
+  The operand of a boolean operator is not a boolean. Use +ptrnegate to allow !
+  to be used on pointers. (-boolops will suppress message)
+preds.c:20:7: Test expression for if is assignment expression: b1 = b2
+  The condition test is an assignment expression. Probably, you mean to use ==
+  instead of =. If an assignment is intended, add an extra parentheses nesting
+  (e.g., if ((a = b)) ...) to suppress this message. (-predassign will suppress
+  message)
+preds.c:25:7: Test expression for if not bool, type char: (c = 'a')
+  Test expression type is not boolean. (-predboolothers will suppress message)
+preds.c:30:7: Use of == with bool variables (risks inconsistency because of
+                 multiple true values): b1 == b2
+  Two bool values are compared directly using a C primitive. This may produce
+  unexpected results since all non-zero values are considered TRUE, so
+  different TRUE values may not be equal. The file bool.h (included in
+  lclint/lib) provides bool_equal for safe bool comparisons. (-boolcompare will
+  suppress message)
+preds.c:35:7: Test expression for if not bool, type char: c
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+preds.c: (in function f)
+preds.c:20:7: Test expression for if is assignment expression: b1 = b2
+  The condition test is an assignment expression. Probably, you mean to use ==
+  instead of =. If an assignment is intended, add an extra parentheses nesting
+  (e.g., if ((a = b)) ...) to suppress this message. (-predassign will suppress
+  message)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+preds.c: (in function f)
+preds.c:5:8: Operand of ! is non-boolean (int *): !p
+  The operand of ! operator is a pointer. (+ptrnegate will suppress message)
+preds.c:10:7: Test expression for if not bool, type int: *p
+  Test expression type is not boolean or int. (-predboolint will suppress
+  message)
+preds.c:15:8: Operand of ! is non-boolean (int): !(*p)
+  The operand of a boolean operator is not a boolean. Use +ptrnegate to allow !
+  to be used on pointers. (-boolops will suppress message)
+preds.c:20:7: Test expression for if is assignment expression: b1 = b2
+  The condition test is an assignment expression. Probably, you mean to use ==
+  instead of =. If an assignment is intended, add an extra parentheses nesting
+  (e.g., if ((a = b)) ...) to suppress this message. (-predassign will suppress
+  message)
+preds.c:25:7: Test expression for if not bool, type char: (c = 'a')
+  Test expression type is not boolean. (-predboolothers will suppress message)
+preds.c:30:7: Use of == with bool variables (risks inconsistency because of
+                 multiple true values): b1 == b2
+  Two bool values are compared directly using a C primitive. This may produce
+  unexpected results since all non-zero values are considered TRUE, so
+  different TRUE values may not be equal. The file bool.h (included in
+  lclint/lib) provides bool_equal for safe bool comparisons. (-boolcompare will
+  suppress message)
+preds.c:35:7: Test expression for if not bool, type char: c
+preds.c:3:5: Function f declared but not used
+  A function is declared but not used. Use /*@unused@*/ in front of function
+  header to suppress message. (-fcnuse will suppress message)
+   preds.c:41:1: Definition of f
+
+Finished LCLint checking --- 8 code errors found, as expected
diff --git a/test/prefixes.c b/test/prefixes.c
new file mode 100644
index 0000000..055c62f
--- /dev/null
+++ b/test/prefixes.c
@@ -0,0 +1,24 @@
+typedef int Tin_ty;
+typedef int QINT;
+typedef int tint;
+
+/*@-varuse@*/
+static int FSint;
+static int TYint;
+static int V3int;
+static int sint;
+static int Xqmxt;
+static int XqmXt;
+/*@=varuse@*/
+
+extern int Gint;
+extern int aGb_Xint;
+
+/*@external@*/ int f (void);
+extern int g (void);
+
+# define mf() \
+  do { int m_x; { int y; }} while (FALSE)
+
+
+
diff --git a/test/prefixes.expect b/test/prefixes.expect
new file mode 100644
index 0000000..ccc63c5
--- /dev/null
+++ b/test/prefixes.expect
@@ -0,0 +1,161 @@
+
+Finished LCLint checking --- no code errors found
+
+prefixes.c:20: Parameterized macro has no prototype or specification: mf 
+prefixes.c: (in macro mf)
+prefixes.c:20:37: Variable y name is not consistent with macro variable
+                     namespace prefix "m_"
+prefixes.c:20:37: Variable y declared but not used
+prefixes.c:20:26: Variable m_x declared but not used
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+prefixes.c:2:13: Datatype QINT name is not consistent with user-defined type
+                    namespace prefix "T"
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "T"
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "^"
+
+Finished LCLint checking --- 1 code error found, as expected
+
+prefixes.c:1:13: Datatype Tin_ty name is not consistent with user-defined type
+                    namespace prefix "^*"
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "^*"
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+prefixes.c:2:13: Datatype QINT name is not consistent with user-defined type
+                    namespace prefix "^%*"
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "^%*"
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+prefixes.c:1:13: Datatype Tin_ty name is not consistent with user-defined type
+                    namespace prefix "^~*"
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "^~*"
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "^"
+prefixes.c:6:12: Variable FSint name is not a user-defined type (it is a file
+    static), but matches the user-defined type namespace prefix "^"
+prefixes.c:7:12: Variable TYint name is not a user-defined type (it is a file
+    static), but matches the user-defined type namespace prefix "^"
+prefixes.c:8:12: Variable V3int name is not a user-defined type (it is a file
+    static), but matches the user-defined type namespace prefix "^"
+prefixes.c:10:12: Variable Xqmxt name is not a user-defined type (it is a file
+    static), but matches the user-defined type namespace prefix "^"
+prefixes.c:11:12: Variable XqmXt name is not a user-defined type (it is a file
+    static), but matches the user-defined type namespace prefix "^"
+prefixes.c:14:12: Variable Gint name is not a user-defined type (it is a
+    external), but matches the user-defined type namespace prefix "^"
+
+Finished LCLint checking --- 7 code errors found, as expected
+
+prefixes.c:8:12: Variable V3int name is not consistent with file static
+                    namespace prefix "^^"
+prefixes.c:9:12: Variable sint name is not consistent with file static
+                    namespace prefix "^^"
+prefixes.c:10:12: Variable Xqmxt name is not consistent with file static
+                     namespace prefix "^^"
+prefixes.c:11:12: Variable XqmXt name is not consistent with file static
+                     namespace prefix "^^"
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+prefixes.c:6:12: Variable FSint name is not consistent with file static
+                    namespace prefix "^#"
+prefixes.c:7:12: Variable TYint name is not consistent with file static
+                    namespace prefix "^#"
+prefixes.c:9:12: Variable sint name is not consistent with file static
+                    namespace prefix "^#"
+prefixes.c:10:12: Variable Xqmxt name is not consistent with file static
+                     namespace prefix "^#"
+prefixes.c:11:12: Variable XqmXt name is not consistent with file static
+                     namespace prefix "^#"
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+prefixes.c:6:12: Variable FSint name is not consistent with file static
+                    namespace prefix "^?&x"
+prefixes.c:7:12: Variable TYint name is not consistent with file static
+                    namespace prefix "^?&x"
+prefixes.c:8:12: Variable V3int name is not consistent with file static
+                    namespace prefix "^?&x"
+prefixes.c:9:12: Variable sint name is not consistent with file static
+                    namespace prefix "^?&x"
+prefixes.c:11:12: Variable XqmXt name is not consistent with file static
+                     namespace prefix "^?&x"
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+prefixes.c:15:12: Variable aGb_Xint name is not consistent with global variable
+                     namespace prefix "G"
+
+Finished LCLint checking --- 1 code error found, as expected
+
+prefixes.c:14:12: Variable Gint name is not consistent with global variable
+                     namespace prefix "&G?_^"
+
+Finished LCLint checking --- 1 code error found, as expected
+
+prefixes.c:1:13: Datatype Tin_ty name is not consistent with external namespace
+                    prefix "G"
+prefixes.c:2:13: Datatype QINT name is not consistent with external namespace
+                    prefix "G"
+prefixes.c:3:13: Datatype tint name is not consistent with external namespace
+                    prefix "G"
+prefixes.c:15:12: Variable aGb_Xint name is not consistent with external
+                     namespace prefix "G"
+prefixes.c:18:12: Function g name is not consistent with external namespace
+                     prefix "G"
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+prefixes.c:2:13: Datatype QINT name is not consistent with user-defined type
+                    namespace prefix "T"
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "T"
+prefixes.c:15:12: Variable aGb_Xint name is not consistent with external
+                     namespace prefix "G"
+prefixes.c:18:12: Function g name is not consistent with external namespace
+                     prefix "G"
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+prefixes.c:20: Expanded macro mf name is not a local variable (it is a
+    unchecked macro), but matches the local variable namespace prefix "?*"
+prefixes.c:1:13: Datatype Tin_ty name is not a local variable (it is a
+    external), but matches the local variable namespace prefix "?*"
+prefixes.c:2:13: Datatype QINT name is not a local variable (it is a external),
+                    but matches the local variable namespace prefix "?*"
+prefixes.c:3:13: Datatype tint name is not a local variable (it is a external),
+                    but matches the local variable namespace prefix "?*"
+prefixes.c:6:12: Variable FSint name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:7:12: Variable TYint name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:8:12: Variable V3int name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:9:12: Variable sint name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:10:12: Variable Xqmxt name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:11:12: Variable XqmXt name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:14:12: Variable Gint name is not a local variable (it is a
+    external), but matches the local variable namespace prefix "?*"
+prefixes.c:15:12: Variable aGb_Xint name is not a local variable (it is a
+    external), but matches the local variable namespace prefix "?*"
+prefixes.c:18:12: Function g name is not a local variable (it is a external),
+                     but matches the local variable namespace prefix "?*"
+
+Finished LCLint checking --- 13 code errors found, as expected
diff --git a/test/prefixes.out b/test/prefixes.out
new file mode 100644
index 0000000..ccc63c5
--- /dev/null
+++ b/test/prefixes.out
@@ -0,0 +1,161 @@
+
+Finished LCLint checking --- no code errors found
+
+prefixes.c:20: Parameterized macro has no prototype or specification: mf 
+prefixes.c: (in macro mf)
+prefixes.c:20:37: Variable y name is not consistent with macro variable
+                     namespace prefix "m_"
+prefixes.c:20:37: Variable y declared but not used
+prefixes.c:20:26: Variable m_x declared but not used
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+prefixes.c:2:13: Datatype QINT name is not consistent with user-defined type
+                    namespace prefix "T"
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "T"
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "^"
+
+Finished LCLint checking --- 1 code error found, as expected
+
+prefixes.c:1:13: Datatype Tin_ty name is not consistent with user-defined type
+                    namespace prefix "^*"
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "^*"
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+prefixes.c:2:13: Datatype QINT name is not consistent with user-defined type
+                    namespace prefix "^%*"
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "^%*"
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+prefixes.c:1:13: Datatype Tin_ty name is not consistent with user-defined type
+                    namespace prefix "^~*"
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "^~*"
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "^"
+prefixes.c:6:12: Variable FSint name is not a user-defined type (it is a file
+    static), but matches the user-defined type namespace prefix "^"
+prefixes.c:7:12: Variable TYint name is not a user-defined type (it is a file
+    static), but matches the user-defined type namespace prefix "^"
+prefixes.c:8:12: Variable V3int name is not a user-defined type (it is a file
+    static), but matches the user-defined type namespace prefix "^"
+prefixes.c:10:12: Variable Xqmxt name is not a user-defined type (it is a file
+    static), but matches the user-defined type namespace prefix "^"
+prefixes.c:11:12: Variable XqmXt name is not a user-defined type (it is a file
+    static), but matches the user-defined type namespace prefix "^"
+prefixes.c:14:12: Variable Gint name is not a user-defined type (it is a
+    external), but matches the user-defined type namespace prefix "^"
+
+Finished LCLint checking --- 7 code errors found, as expected
+
+prefixes.c:8:12: Variable V3int name is not consistent with file static
+                    namespace prefix "^^"
+prefixes.c:9:12: Variable sint name is not consistent with file static
+                    namespace prefix "^^"
+prefixes.c:10:12: Variable Xqmxt name is not consistent with file static
+                     namespace prefix "^^"
+prefixes.c:11:12: Variable XqmXt name is not consistent with file static
+                     namespace prefix "^^"
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+prefixes.c:6:12: Variable FSint name is not consistent with file static
+                    namespace prefix "^#"
+prefixes.c:7:12: Variable TYint name is not consistent with file static
+                    namespace prefix "^#"
+prefixes.c:9:12: Variable sint name is not consistent with file static
+                    namespace prefix "^#"
+prefixes.c:10:12: Variable Xqmxt name is not consistent with file static
+                     namespace prefix "^#"
+prefixes.c:11:12: Variable XqmXt name is not consistent with file static
+                     namespace prefix "^#"
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+prefixes.c:6:12: Variable FSint name is not consistent with file static
+                    namespace prefix "^?&x"
+prefixes.c:7:12: Variable TYint name is not consistent with file static
+                    namespace prefix "^?&x"
+prefixes.c:8:12: Variable V3int name is not consistent with file static
+                    namespace prefix "^?&x"
+prefixes.c:9:12: Variable sint name is not consistent with file static
+                    namespace prefix "^?&x"
+prefixes.c:11:12: Variable XqmXt name is not consistent with file static
+                     namespace prefix "^?&x"
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+prefixes.c:15:12: Variable aGb_Xint name is not consistent with global variable
+                     namespace prefix "G"
+
+Finished LCLint checking --- 1 code error found, as expected
+
+prefixes.c:14:12: Variable Gint name is not consistent with global variable
+                     namespace prefix "&G?_^"
+
+Finished LCLint checking --- 1 code error found, as expected
+
+prefixes.c:1:13: Datatype Tin_ty name is not consistent with external namespace
+                    prefix "G"
+prefixes.c:2:13: Datatype QINT name is not consistent with external namespace
+                    prefix "G"
+prefixes.c:3:13: Datatype tint name is not consistent with external namespace
+                    prefix "G"
+prefixes.c:15:12: Variable aGb_Xint name is not consistent with external
+                     namespace prefix "G"
+prefixes.c:18:12: Function g name is not consistent with external namespace
+                     prefix "G"
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+prefixes.c:2:13: Datatype QINT name is not consistent with user-defined type
+                    namespace prefix "T"
+prefixes.c:3:13: Datatype tint name is not consistent with user-defined type
+                    namespace prefix "T"
+prefixes.c:15:12: Variable aGb_Xint name is not consistent with external
+                     namespace prefix "G"
+prefixes.c:18:12: Function g name is not consistent with external namespace
+                     prefix "G"
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+prefixes.c:20: Expanded macro mf name is not a local variable (it is a
+    unchecked macro), but matches the local variable namespace prefix "?*"
+prefixes.c:1:13: Datatype Tin_ty name is not a local variable (it is a
+    external), but matches the local variable namespace prefix "?*"
+prefixes.c:2:13: Datatype QINT name is not a local variable (it is a external),
+                    but matches the local variable namespace prefix "?*"
+prefixes.c:3:13: Datatype tint name is not a local variable (it is a external),
+                    but matches the local variable namespace prefix "?*"
+prefixes.c:6:12: Variable FSint name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:7:12: Variable TYint name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:8:12: Variable V3int name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:9:12: Variable sint name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:10:12: Variable Xqmxt name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:11:12: Variable XqmXt name is not a local variable (it is a file
+    static), but matches the local variable namespace prefix "?*"
+prefixes.c:14:12: Variable Gint name is not a local variable (it is a
+    external), but matches the local variable namespace prefix "?*"
+prefixes.c:15:12: Variable aGb_Xint name is not a local variable (it is a
+    external), but matches the local variable namespace prefix "?*"
+prefixes.c:18:12: Function g name is not a local variable (it is a external),
+                     but matches the local variable namespace prefix "?*"
+
+Finished LCLint checking --- 13 code errors found, as expected
diff --git a/test/printflike.c b/test/printflike.c
new file mode 100644
index 0000000..4898a16
--- /dev/null
+++ b/test/printflike.c
@@ -0,0 +1,18 @@
+/*@printflike@*/ 
+int mprint (int x);
+
+/*@printflike@*/ 
+int kprint (int x, char *s);
+
+/*@scanflike@*/ 
+int sprint (void);
+
+/*@scanflike@*/ 
+int uprint ();
+
+/*PRINTFLIKE*/
+int qprint (int x, char *s, ...);
+
+/*@printflike@*/ /*@messagelike@*/
+int qxprint (int x, char *s, int f, ...);
+
diff --git a/test/printflike.expect b/test/printflike.expect
new file mode 100644
index 0000000..8527939
--- /dev/null
+++ b/test/printflike.expect
@@ -0,0 +1,30 @@
+
+printflike.c:2:5: Function mprint is marked printflike, but has no elipsis
+                     parameter
+printflike.c:5:5: Function kprint is marked printflike, but has no elipsis
+                     parameter
+printflike.c:8:5: Function sprint is marked scanflike, but has no elipsis
+                     parameter
+printflike.c:13:15: Traditional lint comment /*PRINTFLIKE*/ used.  This is
+    interpreted by LCLint in the same way as most Unix lints, but it is
+    preferable to replace it with either /*@printflike@*/, /*@scanflike@*/ or
+    /*@messagelike@*/.
+printflike.c:16:35: Multiple special function codes:
+                       printflike, messagelike (first code is ignored)
+printflike.c:17:5: Function qxprint is marked messagelike, but the argument
+                      before the elipsis has type int (should be char *)
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+printflike.c:2:5: Function mprint is marked printflike, but has no elipsis
+                     parameter
+printflike.c:5:5: Function kprint is marked printflike, but has no elipsis
+                     parameter
+printflike.c:8:5: Function sprint is marked scanflike, but has no elipsis
+                     parameter
+printflike.c:16:35: Multiple special function codes:
+                       printflike, messagelike (first code is ignored)
+printflike.c:17:5: Function qxprint is marked messagelike, but the argument
+                      before the elipsis has type int (should be char *)
+
+Finished LCLint checking --- 5 code errors found, as expected
diff --git a/test/printflike.out b/test/printflike.out
new file mode 100644
index 0000000..8527939
--- /dev/null
+++ b/test/printflike.out
@@ -0,0 +1,30 @@
+
+printflike.c:2:5: Function mprint is marked printflike, but has no elipsis
+                     parameter
+printflike.c:5:5: Function kprint is marked printflike, but has no elipsis
+                     parameter
+printflike.c:8:5: Function sprint is marked scanflike, but has no elipsis
+                     parameter
+printflike.c:13:15: Traditional lint comment /*PRINTFLIKE*/ used.  This is
+    interpreted by LCLint in the same way as most Unix lints, but it is
+    preferable to replace it with either /*@printflike@*/, /*@scanflike@*/ or
+    /*@messagelike@*/.
+printflike.c:16:35: Multiple special function codes:
+                       printflike, messagelike (first code is ignored)
+printflike.c:17:5: Function qxprint is marked messagelike, but the argument
+                      before the elipsis has type int (should be char *)
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+printflike.c:2:5: Function mprint is marked printflike, but has no elipsis
+                     parameter
+printflike.c:5:5: Function kprint is marked printflike, but has no elipsis
+                     parameter
+printflike.c:8:5: Function sprint is marked scanflike, but has no elipsis
+                     parameter
+printflike.c:16:35: Multiple special function codes:
+                       printflike, messagelike (first code is ignored)
+printflike.c:17:5: Function qxprint is marked messagelike, but the argument
+                      before the elipsis has type int (should be char *)
+
+Finished LCLint checking --- 5 code errors found, as expected
diff --git a/test/rc.c b/test/rc.c
new file mode 100644
index 0000000..f49b9e7
--- /dev/null
+++ b/test/rc.c
@@ -0,0 +1,4 @@
+char *f (void)
+{
+  return MYSTERY;
+}
diff --git a/test/rc.expect b/test/rc.expect
new file mode 100644
index 0000000..8722300
--- /dev/null
+++ b/test/rc.expect
@@ -0,0 +1,33 @@
+
+rc.c: (in function f)
+rc.c:3:10: Observer storage returned without qualification:
+              "a flag\"wicked cool"
+   rc.c:3:10: Storage becomes observer
+
+Finished LCLint checking --- 1 code error found, as expected
+
+rc.c: (in function f)
+rc.c:3:10: Return value type int does not match declared type char *: 12
+
+Finished LCLint checking --- 1 code error found, as expected
+
+rc2.lclintrc:1:18: Warning: setting +boolint redundant with current value
+rc.c: (in function f)
+rc.c:3:10: Observer storage returned without qualification: "a silly\"flag\"\\"
+   rc.c:3:10: Storage becomes observer
+
+Finished LCLint checking --- 1 code error found
+
+rc2.lclintrc:1:18: Warning: setting +boolint redundant with current value
+rc.c: (in function f)
+rc.c:3:10: Unrecognized identifier: MYSTERY
+
+Finished LCLint checking --- 1 code error found, as expected
+
+rc3.lclintrc:2:1: Bad flag syntax (+ or - expected, + is assumed):
+                                    internalnamelen	73
+rc3.lclintrc:5:24: Flag dump must be followed by an argument
+rc.c: (in function f)
+rc.c:3:10: Unrecognized identifier: MYSTERY
+
+Finished LCLint checking --- 1 code error found, as expected
diff --git a/test/rc.out b/test/rc.out
new file mode 100644
index 0000000..8722300
--- /dev/null
+++ b/test/rc.out
@@ -0,0 +1,33 @@
+
+rc.c: (in function f)
+rc.c:3:10: Observer storage returned without qualification:
+              "a flag\"wicked cool"
+   rc.c:3:10: Storage becomes observer
+
+Finished LCLint checking --- 1 code error found, as expected
+
+rc.c: (in function f)
+rc.c:3:10: Return value type int does not match declared type char *: 12
+
+Finished LCLint checking --- 1 code error found, as expected
+
+rc2.lclintrc:1:18: Warning: setting +boolint redundant with current value
+rc.c: (in function f)
+rc.c:3:10: Observer storage returned without qualification: "a silly\"flag\"\\"
+   rc.c:3:10: Storage becomes observer
+
+Finished LCLint checking --- 1 code error found
+
+rc2.lclintrc:1:18: Warning: setting +boolint redundant with current value
+rc.c: (in function f)
+rc.c:3:10: Unrecognized identifier: MYSTERY
+
+Finished LCLint checking --- 1 code error found, as expected
+
+rc3.lclintrc:2:1: Bad flag syntax (+ or - expected, + is assumed):
+                                    internalnamelen	73
+rc3.lclintrc:5:24: Flag dump must be followed by an argument
+rc.c: (in function f)
+rc.c:3:10: Unrecognized identifier: MYSTERY
+
+Finished LCLint checking --- 1 code error found, as expected
diff --git a/test/rc1.lclintrc b/test/rc1.lclintrc
new file mode 100644
index 0000000..470619d
--- /dev/null
+++ b/test/rc1.lclintrc
@@ -0,0 +1,7 @@
+#
+# rc1.lclintrc
+#
+
+-DMYSTERY="a silly\"flag\"\\"
+
+-f rc2.lclintrc
\ No newline at end of file
diff --git a/test/rc2.lclintrc b/test/rc2.lclintrc
new file mode 100644
index 0000000..2497a3f
--- /dev/null
+++ b/test/rc2.lclintrc
@@ -0,0 +1 @@
++boolint +boolint
\ No newline at end of file
diff --git a/test/rc3.lclintrc b/test/rc3.lclintrc
new file mode 100644
index 0000000..7d937a9
--- /dev/null
+++ b/test/rc3.lclintrc
@@ -0,0 +1,6 @@
+-externalnamelen 		23
+internalnamelen	73
++tmpdir /tmp/
+-tmpdir /tmp
+                  -dump
+  
\ No newline at end of file
diff --git a/test/refcounts.c b/test/refcounts.c
new file mode 100644
index 0000000..4c35738
--- /dev/null
+++ b/test/refcounts.c
@@ -0,0 +1,75 @@
+extern /*@out@*/ /*@only@*/ void *smalloc (size_t);
+
+typedef /*@refcounted@*/ struct _rp
+{
+  /*@refs@*/ int refs;
+  /*@only@*/ int *p;
+} *rp;
+
+extern rp rp_create2 (void);
+
+void rp_release (/*@killref@*/ rp x)
+{
+  x->refs--;
+
+  if (x->refs == 0)
+    {
+      free (x->p);
+      free (x); /* 1. Reference counted storage passed as only param: free (x) */
+    }
+}
+
+/*@tempref@*/ rp rp_temp (void)
+{
+  return rp_create2 (); /* 2. New reference returned as temp reference: rp_create2() */
+}
+
+void rp_f (/*@killref@*/ rp r1, /*@killref@*/ rp r2)
+{
+  rp rt = rp_temp ();
+
+  rp_release (r1);  
+  r2 = rp_temp (); /* 3. Kill reference parameter r2 not released before assignment */
+  rp_release (rt); 
+}
+
+rp rp_create (/*@only@*/ int *p)
+{
+  rp r = (rp) smalloc (sizeof(rp));
+
+  r->refs = 1;
+  r->p = p;
+
+  return r;
+}
+
+rp rp_ref (rp x)
+{
+  return x; /* 4. Reference counted storage returned without modifying ... */
+}
+
+rp rp_refok (rp x)
+{
+  x->refs++;
+  return x; 
+}
+
+rp rp_waste (/*@only@*/ int *p)
+{
+  rp z1 = rp_create (p);
+  rp z2 = rp_ref (z1);
+
+  z2->p++;
+  return z1; /* 5. New reference z2 not released before return */
+}
+
+rp rp_waste2 (/*@only@*/ int *p)
+{
+  rp z1 = rp_create (p);
+  rp z2 = rp_ref (z1);
+
+  z2 = rp_ref (z1); /* 6. New reference z2 not released before assignment */
+  return z1; /* 7. New reference z2 not released ... */
+}
+
+
diff --git a/test/refcounts.expect b/test/refcounts.expect
new file mode 100644
index 0000000..c6eda45
--- /dev/null
+++ b/test/refcounts.expect
@@ -0,0 +1,23 @@
+
+refcounts.c: (in function rp_release)
+refcounts.c:18:13: Reference counted storage passed as only param: free (x)
+refcounts.c: (in function rp_temp)
+refcounts.c:24:10: New reference returned as temp reference: rp_create2()
+refcounts.c: (in function rp_f)
+refcounts.c:32:3: Kill reference parameter r2 not released before assignment:
+                     r2 = rp_temp()
+   refcounts.c:27:50: Storage r2 becomes newref
+refcounts.c: (in function rp_ref)
+refcounts.c:48:10: Reference counted storage returned without modifying
+                      reference count: x
+refcounts.c: (in function rp_waste)
+refcounts.c:63:13: New reference z2 not released before return
+   refcounts.c:60:23: Storage z2 becomes newref
+refcounts.c: (in function rp_waste2)
+refcounts.c:71:3: New reference z2 not released before assignment:
+                     z2 = rp_ref(z1)
+   refcounts.c:69:23: Storage z2 becomes newref
+refcounts.c:72:13: New reference z2 not released before return
+   refcounts.c:71:3: Storage z2 becomes newref
+
+Finished LCLint checking --- 7 code errors found, as expected
diff --git a/test/refcounts.out b/test/refcounts.out
new file mode 100644
index 0000000..c6eda45
--- /dev/null
+++ b/test/refcounts.out
@@ -0,0 +1,23 @@
+
+refcounts.c: (in function rp_release)
+refcounts.c:18:13: Reference counted storage passed as only param: free (x)
+refcounts.c: (in function rp_temp)
+refcounts.c:24:10: New reference returned as temp reference: rp_create2()
+refcounts.c: (in function rp_f)
+refcounts.c:32:3: Kill reference parameter r2 not released before assignment:
+                     r2 = rp_temp()
+   refcounts.c:27:50: Storage r2 becomes newref
+refcounts.c: (in function rp_ref)
+refcounts.c:48:10: Reference counted storage returned without modifying
+                      reference count: x
+refcounts.c: (in function rp_waste)
+refcounts.c:63:13: New reference z2 not released before return
+   refcounts.c:60:23: Storage z2 becomes newref
+refcounts.c: (in function rp_waste2)
+refcounts.c:71:3: New reference z2 not released before assignment:
+                     z2 = rp_ref(z1)
+   refcounts.c:69:23: Storage z2 becomes newref
+refcounts.c:72:13: New reference z2 not released before return
+   refcounts.c:71:3: Storage z2 becomes newref
+
+Finished LCLint checking --- 7 code errors found, as expected
diff --git a/test/release.c b/test/release.c
new file mode 100644
index 0000000..cbf94df
--- /dev/null
+++ b/test/release.c
@@ -0,0 +1,26 @@
+/*@only@*/ /*@null@*/ int *f(void)
+{
+  int *x = NULL;
+  int *z;
+
+  if (3 > 4)
+    {
+      int *y1 = malloc (sizeof (int));
+      int *y2 = malloc (sizeof (int));
+
+      if (y1 != NULL)
+	{
+	  *y1 = 3;
+	}
+
+      if (y2 != NULL)
+	{
+	  *y2 = 3;
+	}
+
+      x = y1;
+      z = y2;
+    }
+
+  return x;
+}
diff --git a/test/release.expect b/test/release.expect
new file mode 100644
index 0000000..026e363
--- /dev/null
+++ b/test/release.expect
@@ -0,0 +1,6 @@
+
+release.c: (in function f)
+release.c:25:12: Owned storage z not released before return
+   release.c:22:7: Storage z becomes owned
+
+Finished LCLint checking --- 1 code error found, as expected
diff --git a/test/release.out b/test/release.out
new file mode 100644
index 0000000..026e363
--- /dev/null
+++ b/test/release.out
@@ -0,0 +1,6 @@
+
+release.c: (in function f)
+release.c:25:12: Owned storage z not released before return
+   release.c:22:7: Storage z becomes owned
+
+Finished LCLint checking --- 1 code error found, as expected
diff --git a/test/repexpose.c b/test/repexpose.c
new file mode 100644
index 0000000..dd2e121
--- /dev/null
+++ b/test/repexpose.c
@@ -0,0 +1,66 @@
+# include "repexpose.h"
+
+abst abst_create (/*@dependent@*/ abst p, /*@only@*/ char *x, int i)
+{
+  abst a = (abst) malloc (sizeof (struct _abst));
+  abst b = p;
+
+  a->name = x;            /* 1. Arrow access from possibly null pointer a */
+  a->val = i;
+  a->parent = p;          /* [3. exposes rep] */
+  a->parent = b;          /* [4. exposes rep through alias] */
+  a->parent = p->parent;  /* [5, 6. exposes rep] */
+  a->parent = b->parent;  /* 2. Suspect modification of p->parent through alias a->parent */
+                          /* [7, 8. exposes rep through alias] 3. modifies p */
+  b = a;                 
+  a->name = *globstring;  /* [9, 10.] exposes rep through global */
+  b->name = *globstring;  /* ??? NO? 3. Suspect modification of *globstring through alias a->name */
+                          /* [11, 12.] exposes rep through global and alias */
+  return a; /* 4. Storage a->name reachable from return value is kept */
+            /* 5. Returned storage *a contains 1 undefined field: im */
+            /* 6. Storage *globstring reachable from global is kept */
+}
+
+/*@only@*/ char *abst_name (abst a)
+{
+  return a->name;   /* 7. Released storage a->name reachable from parameter */
+      	            /* [15, 16.] reference to parameter, exposes rep */
+}
+
+int abst_val (abst a)
+{
+  return a->val;
+}
+
+int *abst_aval(abst a)
+{
+  return (&(a->val));  /* 9. [17, 18] reference to parameter, exposes rep */
+}
+
+abst abst_parent (abst a)
+{
+  abst b = a;
+
+  if (TRUE) return b;     /* [19] reference to parameter a */
+  else return b->parent;  /* 8. Dependent storage b->parent returned as only */
+                          /* 9. Only storage a not released before return */
+}
+
+/*@dependent@*/ char *immut_name (immut im)
+{
+  return (im->name);  /* 10. Only storage im->name returned as dependent: (im->name) */ 
+                      /* [23, 24] exposes rep, reference to parameter */
+}
+
+void abst_setIm (abst a, immut im)
+{
+  a->im = im;  /* 11. Suspect modification of a->im: a->im = im */
+               /* 13. [25] modifies a, NO rep exposure since it is immutable! */
+}
+
+immut abst_getIm (abst a)
+{
+  return (a->im); /* NO rep exposure since it is immutable */
+}
+
+
diff --git a/test/repexpose.expect b/test/repexpose.expect
new file mode 100644
index 0000000..f0d9fab
--- /dev/null
+++ b/test/repexpose.expect
@@ -0,0 +1,124 @@
+
+repexpose.c: (in function abst_create)
+repexpose.c:8:3: Arrow access from possibly null pointer a: a->name
+   repexpose.c:5:12: Storage a may become null
+repexpose.c:13:3: Possible undocumented modification of p->parent through alias
+                     a->parent: a->parent = b->parent
+repexpose.c:16:3: Unqualified storage *globstring assigned to implicitly only:
+                     a->name = *globstring
+repexpose.c:17:3: Kept storage *globstring assigned to implicitly only:
+                     b->name = *globstring
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c:19:10: Storage a->name reachable from return value is kept (should
+                      be implicitly only)
+   repexpose.c:17:3: Storage a->name becomes kept
+repexpose.c:19:10: Returned storage *a contains 1 undefined field: im
+repexpose.c:19:12: Storage *globstring reachable from global is kept (should be
+                      unqualified)
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c: (in function abst_name)
+repexpose.c:26:18: Released storage a->name reachable from parameter at return
+                      point
+   repexpose.c:26:10: Storage a->name is released
+repexpose.c: (in function abst_parent)
+repexpose.c:45:15: Dependent storage b->parent returned as only: b->parent
+repexpose.c:45:25: Only storage a not released before return
+   repexpose.c:40:24: Storage a becomes only
+repexpose.c: (in function immut_name)
+repexpose.c:51:10: Only storage im->name returned as dependent: (im->name)
+repexpose.c: (in function abst_setIm)
+repexpose.c:57:3: Undocumented modification of a->im: a->im = im
+
+Finished LCLint checking --- 12 code errors found, as expected
+
+repexpose.c: (in function abst_create)
+repexpose.c:8:3: Arrow access from possibly null pointer a: a->name
+   repexpose.c:5:12: Storage a may become null
+repexpose.c:13:3: Possible undocumented modification of p->parent through alias
+                     a->parent: a->parent = b->parent
+repexpose.c:16:3: Unqualified storage *globstring assigned to implicitly only:
+                     a->name = *globstring
+repexpose.c:17:3: Kept storage *globstring assigned to implicitly only:
+                     b->name = *globstring
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c:19:10: Storage a->name reachable from return value is kept (should
+                      be implicitly only)
+   repexpose.c:17:3: Storage a->name becomes kept
+repexpose.c:19:10: Returned storage *a contains 1 undefined field: im
+repexpose.c:19:12: Storage *globstring reachable from global is kept (should be
+                      unqualified)
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c: (in function abst_name)
+repexpose.c:26:10: Function returns reference to parameter a: a->name
+repexpose.c:26:18: Released storage a->name reachable from parameter at return
+                      point
+   repexpose.c:26:10: Storage a->name is released
+repexpose.c: (in function abst_aval)
+repexpose.c:37:10: Function returns reference to parameter a: (&(a->val))
+repexpose.c: (in function abst_parent)
+repexpose.c:45:15: Dependent storage b->parent returned as only: b->parent
+repexpose.c:45:25: Only storage a not released before return
+   repexpose.c:40:24: Storage a becomes only
+repexpose.c: (in function immut_name)
+repexpose.c:51:10: Only storage im->name returned as dependent: (im->name)
+repexpose.c:51:10: Function returns reference to parameter im: (im->name)
+repexpose.c: (in function abst_setIm)
+repexpose.c:57:3: Undocumented modification of a->im: a->im = im
+
+Finished LCLint checking --- 15 code errors found, as expected
+
+repexpose.c: (in function abst_create)
+repexpose.c:8:3: Arrow access from possibly null pointer a: a->name
+   repexpose.c:5:12: Storage a may become null
+repexpose.c:10:3: Assignment of mutable parameter p to component of abstract
+                     type abst exposes rep: a->parent = p
+repexpose.c:11:3: Assignment of mutable parameter p (through alias b) to
+                     component of abstract type abst exposes rep: a->parent = b
+repexpose.c:12:3: Assignment of mutable component of parameter p to component
+                     of abstract type abst exposes rep: a->parent = p->parent
+repexpose.c:13:3: Possible undocumented modification of p->parent through alias
+                     a->parent: a->parent = b->parent
+repexpose.c:13:3: Assignment of mutable component of parameter p (through alias
+    b->parent) to component of abstract type abst exposes rep:
+    a->parent = b->parent
+repexpose.c:16:3: Assignment of global globstring to component of abstract type
+                     abst exposes rep: a->name = *globstring
+repexpose.c:16:3: Unqualified storage *globstring assigned to implicitly only:
+                     a->name = *globstring
+repexpose.c:17:3: Assignment of global globstring to component of abstract type
+                     abst exposes rep: b->name = *globstring
+repexpose.c:17:3: Kept storage *globstring assigned to implicitly only:
+                     b->name = *globstring
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c:19:10: Storage a->name reachable from return value is kept (should
+                      be implicitly only)
+   repexpose.c:17:3: Storage a->name becomes kept
+repexpose.c:19:10: Returned storage *a contains 1 undefined field: im
+repexpose.c:19:12: Storage *globstring reachable from global is kept (should be
+                      unqualified)
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c: (in function abst_name)
+repexpose.c:26:10: Function returns reference to parameter a: a->name
+repexpose.c:26:10: Return value exposes rep of abst: a->name
+repexpose.c:26:18: Released storage a->name reachable from parameter at return
+                      point
+   repexpose.c:26:10: Storage a->name is released
+repexpose.c: (in function abst_aval)
+repexpose.c:37:10: Function returns reference to parameter a: (&(a->val))
+repexpose.c:37:10: Return value exposes rep of abst: (&(a->val))
+repexpose.c: (in function abst_parent)
+repexpose.c:45:15: Dependent storage b->parent returned as only: b->parent
+repexpose.c:45:15: Return value exposes rep of abst: b->parent
+repexpose.c:45:15: Return value may expose rep of abst through alias a:
+                      b->parent
+repexpose.c:45:25: Only storage a not released before return
+   repexpose.c:40:24: Storage a becomes only
+repexpose.c: (in function immut_name)
+repexpose.c:51:10: Only storage im->name returned as dependent: (im->name)
+repexpose.c:51:10: Function returns reference to parameter im: (im->name)
+repexpose.c:51:10: Return value exposes rep of immut: (im->name)
+repexpose.c: (in function abst_setIm)
+repexpose.c:57:3: Undocumented modification of a->im: a->im = im
+repexpose.lh:6:16: Variable globstring declared but not defined
+
+Finished LCLint checking --- 27 code errors found, as expected
diff --git a/test/repexpose.h b/test/repexpose.h
new file mode 100644
index 0000000..abcd636
--- /dev/null
+++ b/test/repexpose.h
@@ -0,0 +1,20 @@
+# include "bool.h"
+
+typedef struct _abst *abst;
+
+typedef struct _immut
+{
+  char *name;
+  int val;
+} *immut;
+
+struct _abst
+{
+  char *name;
+  int   val;
+  /*@dependent@*/ abst  parent;
+  immut im;
+} ;
+
+
+# include "repexpose.lh"
diff --git a/test/repexpose.lcl b/test/repexpose.lcl
new file mode 100644
index 0000000..069a9fd
--- /dev/null
+++ b/test/repexpose.lcl
@@ -0,0 +1,17 @@
+mutable type abst ;
+immutable type immut ;
+
+char **globstring;
+
+only abst abst_create (dependent abst p, only char *x, int i) 
+   char **globstring; { }
+
+only char *abst_name (abst a) { }
+int abst_val (abst a) { }
+int *abst_aval (abst a) { }
+only abst abst_parent (only abst a) { }
+dependent char *immut_name (immut im) { }
+void abst_setIm (abst a, immut im) { }
+immut abst_getIm (abst a) { } 
+
+
diff --git a/test/repexpose.lcs b/test/repexpose.lcs
new file mode 100644
index 0000000..cc7b403
--- /dev/null
+++ b/test/repexpose.lcs
@@ -0,0 +1,172 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort abst immutable nil nil
+%LCLsort _abst_Obj mutable abst nil
+%LCLsort immut immutable nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort _____char_Obj_Ptr_Obj_Ptr_Obj obj ____char_Obj_Ptr_Obj_Ptr nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :abst -> int
+%LCLop sizeof :immut -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype abst _abst_Obj mutable
+%LCLtype immut immut immutable
+%LCLvar globstring _____char_Obj_Ptr_Obj_Ptr_Obj
+%LCLfcn abst_create : _abst_Obj, __char_Obj_Ptr, int -> _abst_Obj 
+%LCLfcnGlobals _____char_Obj_Ptr_Obj_Ptr_Obj globstring; 
+%LCLfcn abst_name : _abst_Obj -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn abst_val : _abst_Obj -> int 
+%LCLfcnGlobals 
+%LCLfcn abst_aval : _abst_Obj -> __int_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn abst_parent : _abst_Obj -> _abst_Obj 
+%LCLfcnGlobals 
+%LCLfcn immut_name : immut -> __char_Obj_Ptr 
+%LCLfcnGlobals 
+%LCLfcn abst_setIm : _abst_Obj, immut -> void 
+%LCLfcnGlobals 
+%LCLfcn abst_getIm : _abst_Obj -> immut 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/repexpose.lh b/test/repexpose.lh
new file mode 100644
index 0000000..ce45beb
--- /dev/null
+++ b/test/repexpose.lh
@@ -0,0 +1,14 @@
+/* Output from LCLint 2.5m */
+# include "bool.h"
+
+
+
+extern char  **globstring;
+extern /*@only@*/ abst abst_create (/*@dependent@*/ abst  /* p */, /*@only@*/ char * /* x */, int  /* i */);
+extern /*@only@*/ char *abst_name (abst  /* a */);
+extern int abst_val (abst  /* a */);
+extern int *abst_aval (abst  /* a */);
+extern /*@only@*/ abst abst_parent (/*@only@*/ abst  /* a */);
+extern /*@dependent@*/ char *immut_name (immut  /* im */);
+extern void abst_setIm (abst  /* a */, immut  /* im */);
+extern immut abst_getIm (abst  /* a */);
diff --git a/test/repexpose.lh.expect b/test/repexpose.lh.expect
new file mode 100644
index 0000000..2c7a734
--- /dev/null
+++ b/test/repexpose.lh.expect
@@ -0,0 +1,14 @@
+/* Output from LCLint 2.2c+ */
+# include "bool.h"
+
+
+
+extern char  **globstring;
+extern /*@only@*/ abst abst_create (/*@dependent@*/ abst  /* p */, /*@only@*/ char * /* x */, int  /* i */);
+extern /*@only@*/ char *abst_name (abst  /* a */);
+extern int abst_val (abst  /* a */);
+extern int *abst_aval (abst  /* a */);
+extern /*@only@*/ abst abst_parent (/*@only@*/ abst  /* a */);
+extern /*@dependent@*/ char *immut_name (immut  /* im */);
+extern void abst_setIm (abst  /* a */, immut  /* im */);
+extern immut abst_getIm (abst  /* a */);
diff --git a/test/repexpose.out b/test/repexpose.out
new file mode 100644
index 0000000..f0d9fab
--- /dev/null
+++ b/test/repexpose.out
@@ -0,0 +1,124 @@
+
+repexpose.c: (in function abst_create)
+repexpose.c:8:3: Arrow access from possibly null pointer a: a->name
+   repexpose.c:5:12: Storage a may become null
+repexpose.c:13:3: Possible undocumented modification of p->parent through alias
+                     a->parent: a->parent = b->parent
+repexpose.c:16:3: Unqualified storage *globstring assigned to implicitly only:
+                     a->name = *globstring
+repexpose.c:17:3: Kept storage *globstring assigned to implicitly only:
+                     b->name = *globstring
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c:19:10: Storage a->name reachable from return value is kept (should
+                      be implicitly only)
+   repexpose.c:17:3: Storage a->name becomes kept
+repexpose.c:19:10: Returned storage *a contains 1 undefined field: im
+repexpose.c:19:12: Storage *globstring reachable from global is kept (should be
+                      unqualified)
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c: (in function abst_name)
+repexpose.c:26:18: Released storage a->name reachable from parameter at return
+                      point
+   repexpose.c:26:10: Storage a->name is released
+repexpose.c: (in function abst_parent)
+repexpose.c:45:15: Dependent storage b->parent returned as only: b->parent
+repexpose.c:45:25: Only storage a not released before return
+   repexpose.c:40:24: Storage a becomes only
+repexpose.c: (in function immut_name)
+repexpose.c:51:10: Only storage im->name returned as dependent: (im->name)
+repexpose.c: (in function abst_setIm)
+repexpose.c:57:3: Undocumented modification of a->im: a->im = im
+
+Finished LCLint checking --- 12 code errors found, as expected
+
+repexpose.c: (in function abst_create)
+repexpose.c:8:3: Arrow access from possibly null pointer a: a->name
+   repexpose.c:5:12: Storage a may become null
+repexpose.c:13:3: Possible undocumented modification of p->parent through alias
+                     a->parent: a->parent = b->parent
+repexpose.c:16:3: Unqualified storage *globstring assigned to implicitly only:
+                     a->name = *globstring
+repexpose.c:17:3: Kept storage *globstring assigned to implicitly only:
+                     b->name = *globstring
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c:19:10: Storage a->name reachable from return value is kept (should
+                      be implicitly only)
+   repexpose.c:17:3: Storage a->name becomes kept
+repexpose.c:19:10: Returned storage *a contains 1 undefined field: im
+repexpose.c:19:12: Storage *globstring reachable from global is kept (should be
+                      unqualified)
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c: (in function abst_name)
+repexpose.c:26:10: Function returns reference to parameter a: a->name
+repexpose.c:26:18: Released storage a->name reachable from parameter at return
+                      point
+   repexpose.c:26:10: Storage a->name is released
+repexpose.c: (in function abst_aval)
+repexpose.c:37:10: Function returns reference to parameter a: (&(a->val))
+repexpose.c: (in function abst_parent)
+repexpose.c:45:15: Dependent storage b->parent returned as only: b->parent
+repexpose.c:45:25: Only storage a not released before return
+   repexpose.c:40:24: Storage a becomes only
+repexpose.c: (in function immut_name)
+repexpose.c:51:10: Only storage im->name returned as dependent: (im->name)
+repexpose.c:51:10: Function returns reference to parameter im: (im->name)
+repexpose.c: (in function abst_setIm)
+repexpose.c:57:3: Undocumented modification of a->im: a->im = im
+
+Finished LCLint checking --- 15 code errors found, as expected
+
+repexpose.c: (in function abst_create)
+repexpose.c:8:3: Arrow access from possibly null pointer a: a->name
+   repexpose.c:5:12: Storage a may become null
+repexpose.c:10:3: Assignment of mutable parameter p to component of abstract
+                     type abst exposes rep: a->parent = p
+repexpose.c:11:3: Assignment of mutable parameter p (through alias b) to
+                     component of abstract type abst exposes rep: a->parent = b
+repexpose.c:12:3: Assignment of mutable component of parameter p to component
+                     of abstract type abst exposes rep: a->parent = p->parent
+repexpose.c:13:3: Possible undocumented modification of p->parent through alias
+                     a->parent: a->parent = b->parent
+repexpose.c:13:3: Assignment of mutable component of parameter p (through alias
+    b->parent) to component of abstract type abst exposes rep:
+    a->parent = b->parent
+repexpose.c:16:3: Assignment of global globstring to component of abstract type
+                     abst exposes rep: a->name = *globstring
+repexpose.c:16:3: Unqualified storage *globstring assigned to implicitly only:
+                     a->name = *globstring
+repexpose.c:17:3: Assignment of global globstring to component of abstract type
+                     abst exposes rep: b->name = *globstring
+repexpose.c:17:3: Kept storage *globstring assigned to implicitly only:
+                     b->name = *globstring
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c:19:10: Storage a->name reachable from return value is kept (should
+                      be implicitly only)
+   repexpose.c:17:3: Storage a->name becomes kept
+repexpose.c:19:10: Returned storage *a contains 1 undefined field: im
+repexpose.c:19:12: Storage *globstring reachable from global is kept (should be
+                      unqualified)
+   repexpose.c:16:3: Storage *globstring becomes kept
+repexpose.c: (in function abst_name)
+repexpose.c:26:10: Function returns reference to parameter a: a->name
+repexpose.c:26:10: Return value exposes rep of abst: a->name
+repexpose.c:26:18: Released storage a->name reachable from parameter at return
+                      point
+   repexpose.c:26:10: Storage a->name is released
+repexpose.c: (in function abst_aval)
+repexpose.c:37:10: Function returns reference to parameter a: (&(a->val))
+repexpose.c:37:10: Return value exposes rep of abst: (&(a->val))
+repexpose.c: (in function abst_parent)
+repexpose.c:45:15: Dependent storage b->parent returned as only: b->parent
+repexpose.c:45:15: Return value exposes rep of abst: b->parent
+repexpose.c:45:15: Return value may expose rep of abst through alias a:
+                      b->parent
+repexpose.c:45:25: Only storage a not released before return
+   repexpose.c:40:24: Storage a becomes only
+repexpose.c: (in function immut_name)
+repexpose.c:51:10: Only storage im->name returned as dependent: (im->name)
+repexpose.c:51:10: Function returns reference to parameter im: (im->name)
+repexpose.c:51:10: Return value exposes rep of immut: (im->name)
+repexpose.c: (in function abst_setIm)
+repexpose.c:57:3: Undocumented modification of a->im: a->im = im
+repexpose.lh:6:16: Variable globstring declared but not defined
+
+Finished LCLint checking --- 27 code errors found, as expected
diff --git a/test/sharing.expect b/test/sharing.expect
new file mode 100644
index 0000000..44b94f7
--- /dev/null
+++ b/test/sharing.expect
@@ -0,0 +1,153 @@
+
+sharing1.c: (in function f)
+sharing1.c:12:12: Only storage x not released before return
+   sharing1.c:8:24: Storage x becomes only
+sharing1.c:13:2: Only storage x not released before return
+   sharing1.c:8:24: Storage x becomes only
+sharing1.c: (in function f2)
+sharing1.c:19:12: Only storage y not released before return
+   sharing1.c:15:43: Storage y becomes only
+sharing1.c: (in function f3)
+sharing1.c:24:3: Only storage x assigned to shared: globshared1 = x
+   sharing1.c:22:25: Storage x becomes only
+sharing1.c:25:2: Only storage x not released before return
+   sharing1.c:22:25: Storage x becomes only
+sharing1.c: (in function f4)
+sharing1.c:29:3: Only storage zonly not released before assignment: zonly = x
+   sharing1.c:6:19: Storage zonly becomes only
+sharing1.c: (in function g)
+sharing1.c:41:7: Implicitly temp storage imp passed as only param: f3 (imp)
+sharing1.c:42:4: Variable imp used after being released
+   sharing1.c:41:7: Storage imp released
+sharing1.c:44:12: Immediate address &x passed as only param: f (&x, ...)
+sharing1.c:44:12: Parameter 1 (&x) to function f is declared only but is
+                     aliased by parameter 2 (&x)
+sharing1.c:48:14: Possibly null storage y3 passed as non-null param:
+                     f2 (y3, ...)
+   sharing1.c:37:13: Storage y3 may become null
+sharing1.c:48:14: Passed storage y3 not completely defined (*y3 is undefined):
+                     f2 (y3, ...)
+sharing1.c:48:18: Parameter 2 (y3) to function f2 is declared only but is
+                     aliased by parameter 1 (y3)
+sharing1.c:50:4: Variable y3 used after being released
+   sharing1.c:48:18: Storage y3 released
+sharing1.c:51:12: Possibly null storage y passed as non-null param: f (y, ...)
+   sharing1.c:35:12: Storage y may become null
+sharing1.c:51:12: Passed storage y not completely defined (*y is undefined):
+                     f (y, ...)
+sharing1.c:52:12: Shared storage globshared1 passed as only param:
+                     f (globshared1, ...)
+   sharing1.c:4:19: Storage globshared1 becomes shared
+sharing1.c:56:9: Shared storage globshared2 passed as only param:
+                    free (globshared2)
+   sharing1.c:5:19: Storage globshared2 becomes shared
+sharing1.c:59:11: Variable y used after being released
+   sharing1.c:51:12: Storage y released
+sharing1.c:59:13: Fresh storage y2 not released before return
+   sharing1.c:36:33: Fresh storage y2 allocated
+sharing1.c:59:13: Function returns with global globonly referencing released
+                     storage
+   sharing1.c:57:9: Storage globonly is released
+
+Finished LCLint checking --- 21 code errors found, as expected
+
+sharing3.c: (in function string_copy)
+sharing3.c:17:10: Implicitly temp storage s returned as only: s
+sharing3.c: (in function string_free1)
+sharing3.c:32:9: Implicitly temp storage s passed as only param: free (s)
+sharing3.c: (in function string_free3)
+sharing3.c:45:2: Fresh storage t not released before return
+   sharing3.c:42:29: Fresh storage t allocated
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+sharing4.c: (in function f)
+sharing4.c:18:3: Only storage globonly1 not released before assignment:
+                    globonly1 = only1
+   sharing4.c:1:20: Storage globonly1 becomes only
+sharing4.c:23:3: Only storage globonly4 not released before assignment:
+                    globonly4 = shared1
+   sharing4.c:4:20: Storage globonly4 becomes only
+sharing4.c:23:3: Shared storage shared1 assigned to only: globonly4 = shared1
+   sharing4.c:14:26: Storage shared1 becomes shared
+sharing4.c:27:3: Only storage globonly5 assigned to shared:
+                    globshared1 = globonly5
+   sharing4.c:5:20: Storage globonly5 becomes only
+sharing4.c:30:3: Only storage globonly1 assigned to shared (local1 aliases
+                    globonly1): globshared1 = local1
+   sharing4.c:1:20: Storage globonly1 becomes only
+sharing4.c:30:3: Kept storage only1 assigned to shared (local1 aliases only1):
+                    globshared1 = local1
+   sharing4.c:18:3: Storage only1 becomes kept
+sharing4.c:32:3: Only storage assigned to shared:
+                    globshared1 = string_copy(local1)
+sharing4.c:34:3: Temp storage temp2 assigned to shared: globshared2 = temp2
+   sharing4.c:13:37: Storage temp2 becomes temp
+sharing4.c:35:3: Only storage globonly4 not released before assignment:
+                    globonly4 = temp1
+   sharing4.c:4:20: Storage globonly4 becomes only
+sharing4.c:35:3: Implicitly temp storage temp1 assigned to only:
+                    globonly4 = temp1
+sharing4.c:38:9: Shared storage shared1 passed as only param: free (shared1)
+   sharing4.c:14:26: Storage shared1 becomes shared
+sharing4.c:42:12: Only storage only3 not released before return
+   sharing4.c:12:72: Storage only3 becomes only
+sharing4.c:42:12: Function returns with global globonly3 referencing released
+                     storage
+   sharing4.c:21:9: Storage globonly3 is released
+
+Finished LCLint checking --- 13 code errors found, as expected
+
+sharing4.c: (in function f)
+sharing4.c:18:3: Only storage globonly1 not released before assignment:
+                    globonly1 = only1
+   sharing4.c:1:20: Storage globonly1 becomes only
+sharing4.c:23:3: Only storage globonly4 not released before assignment:
+                    globonly4 = shared1
+   sharing4.c:4:20: Storage globonly4 becomes only
+sharing4.c:23:3: Shared storage shared1 assigned to only: globonly4 = shared1
+   sharing4.c:14:26: Storage shared1 becomes shared
+sharing4.c:27:3: Only storage globonly5 assigned to shared:
+                    globshared1 = globonly5
+   sharing4.c:5:20: Storage globonly5 becomes only
+sharing4.c:30:3: Only storage globonly1 assigned to shared (local1 aliases
+                    globonly1): globshared1 = local1
+   sharing4.c:1:20: Storage globonly1 becomes only
+sharing4.c:30:3: Kept storage only1 assigned to shared (local1 aliases only1):
+                    globshared1 = local1
+   sharing4.c:18:3: Storage only1 becomes kept
+sharing4.c:32:3: Only storage assigned to shared:
+                    globshared1 = string_copy(local1)
+sharing4.c:34:3: Temp storage temp2 assigned to shared: globshared2 = temp2
+   sharing4.c:13:37: Storage temp2 becomes temp
+sharing4.c:35:3: Only storage globonly4 not released before assignment:
+                    globonly4 = temp1
+   sharing4.c:4:20: Storage globonly4 becomes only
+sharing4.c:38:9: Shared storage shared1 passed as only param: free (shared1)
+   sharing4.c:14:26: Storage shared1 becomes shared
+sharing4.c:42:12: Only storage only3 not released before return
+   sharing4.c:12:72: Storage only3 becomes only
+sharing4.c:42:12: Function returns with global globonly3 referencing released
+                     storage
+   sharing4.c:21:9: Storage globonly3 is released
+
+Finished LCLint checking --- 12 code errors found, as expected
+
+sharing5.c: (in function f)
+sharing5.c:13:4: Variable only1 used after being released
+   sharing5.c:12:9: Storage only1 released
+sharing5.c:22:5: Clauses exit with local2 referencing local storage in true
+                    branch, shared storage in false branch
+   sharing5.c:21:7: Storage local2 becomes shared
+sharing5.c:24:9: Shared storage shared passed as only param (local2 aliases
+                    shared): free (local2)
+   sharing5.c:5:27: Storage shared becomes shared
+sharing5.c:27:4: Dereference of possibly null pointer localp: *localp
+   sharing5.c:26:12: Storage localp may become null
+sharing5.c:32:3: Fresh storage localp not released before assignment:
+                    localp = &only3
+   sharing5.c:26:3: Fresh storage localp allocated
+sharing5.c:33:2: Only storage only3 not released before return
+   sharing5.c:4:73: Storage only3 becomes only
+
+Finished LCLint checking --- 6 code errors found, as expected
diff --git a/test/sharing.out b/test/sharing.out
new file mode 100644
index 0000000..44b94f7
--- /dev/null
+++ b/test/sharing.out
@@ -0,0 +1,153 @@
+
+sharing1.c: (in function f)
+sharing1.c:12:12: Only storage x not released before return
+   sharing1.c:8:24: Storage x becomes only
+sharing1.c:13:2: Only storage x not released before return
+   sharing1.c:8:24: Storage x becomes only
+sharing1.c: (in function f2)
+sharing1.c:19:12: Only storage y not released before return
+   sharing1.c:15:43: Storage y becomes only
+sharing1.c: (in function f3)
+sharing1.c:24:3: Only storage x assigned to shared: globshared1 = x
+   sharing1.c:22:25: Storage x becomes only
+sharing1.c:25:2: Only storage x not released before return
+   sharing1.c:22:25: Storage x becomes only
+sharing1.c: (in function f4)
+sharing1.c:29:3: Only storage zonly not released before assignment: zonly = x
+   sharing1.c:6:19: Storage zonly becomes only
+sharing1.c: (in function g)
+sharing1.c:41:7: Implicitly temp storage imp passed as only param: f3 (imp)
+sharing1.c:42:4: Variable imp used after being released
+   sharing1.c:41:7: Storage imp released
+sharing1.c:44:12: Immediate address &x passed as only param: f (&x, ...)
+sharing1.c:44:12: Parameter 1 (&x) to function f is declared only but is
+                     aliased by parameter 2 (&x)
+sharing1.c:48:14: Possibly null storage y3 passed as non-null param:
+                     f2 (y3, ...)
+   sharing1.c:37:13: Storage y3 may become null
+sharing1.c:48:14: Passed storage y3 not completely defined (*y3 is undefined):
+                     f2 (y3, ...)
+sharing1.c:48:18: Parameter 2 (y3) to function f2 is declared only but is
+                     aliased by parameter 1 (y3)
+sharing1.c:50:4: Variable y3 used after being released
+   sharing1.c:48:18: Storage y3 released
+sharing1.c:51:12: Possibly null storage y passed as non-null param: f (y, ...)
+   sharing1.c:35:12: Storage y may become null
+sharing1.c:51:12: Passed storage y not completely defined (*y is undefined):
+                     f (y, ...)
+sharing1.c:52:12: Shared storage globshared1 passed as only param:
+                     f (globshared1, ...)
+   sharing1.c:4:19: Storage globshared1 becomes shared
+sharing1.c:56:9: Shared storage globshared2 passed as only param:
+                    free (globshared2)
+   sharing1.c:5:19: Storage globshared2 becomes shared
+sharing1.c:59:11: Variable y used after being released
+   sharing1.c:51:12: Storage y released
+sharing1.c:59:13: Fresh storage y2 not released before return
+   sharing1.c:36:33: Fresh storage y2 allocated
+sharing1.c:59:13: Function returns with global globonly referencing released
+                     storage
+   sharing1.c:57:9: Storage globonly is released
+
+Finished LCLint checking --- 21 code errors found, as expected
+
+sharing3.c: (in function string_copy)
+sharing3.c:17:10: Implicitly temp storage s returned as only: s
+sharing3.c: (in function string_free1)
+sharing3.c:32:9: Implicitly temp storage s passed as only param: free (s)
+sharing3.c: (in function string_free3)
+sharing3.c:45:2: Fresh storage t not released before return
+   sharing3.c:42:29: Fresh storage t allocated
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+sharing4.c: (in function f)
+sharing4.c:18:3: Only storage globonly1 not released before assignment:
+                    globonly1 = only1
+   sharing4.c:1:20: Storage globonly1 becomes only
+sharing4.c:23:3: Only storage globonly4 not released before assignment:
+                    globonly4 = shared1
+   sharing4.c:4:20: Storage globonly4 becomes only
+sharing4.c:23:3: Shared storage shared1 assigned to only: globonly4 = shared1
+   sharing4.c:14:26: Storage shared1 becomes shared
+sharing4.c:27:3: Only storage globonly5 assigned to shared:
+                    globshared1 = globonly5
+   sharing4.c:5:20: Storage globonly5 becomes only
+sharing4.c:30:3: Only storage globonly1 assigned to shared (local1 aliases
+                    globonly1): globshared1 = local1
+   sharing4.c:1:20: Storage globonly1 becomes only
+sharing4.c:30:3: Kept storage only1 assigned to shared (local1 aliases only1):
+                    globshared1 = local1
+   sharing4.c:18:3: Storage only1 becomes kept
+sharing4.c:32:3: Only storage assigned to shared:
+                    globshared1 = string_copy(local1)
+sharing4.c:34:3: Temp storage temp2 assigned to shared: globshared2 = temp2
+   sharing4.c:13:37: Storage temp2 becomes temp
+sharing4.c:35:3: Only storage globonly4 not released before assignment:
+                    globonly4 = temp1
+   sharing4.c:4:20: Storage globonly4 becomes only
+sharing4.c:35:3: Implicitly temp storage temp1 assigned to only:
+                    globonly4 = temp1
+sharing4.c:38:9: Shared storage shared1 passed as only param: free (shared1)
+   sharing4.c:14:26: Storage shared1 becomes shared
+sharing4.c:42:12: Only storage only3 not released before return
+   sharing4.c:12:72: Storage only3 becomes only
+sharing4.c:42:12: Function returns with global globonly3 referencing released
+                     storage
+   sharing4.c:21:9: Storage globonly3 is released
+
+Finished LCLint checking --- 13 code errors found, as expected
+
+sharing4.c: (in function f)
+sharing4.c:18:3: Only storage globonly1 not released before assignment:
+                    globonly1 = only1
+   sharing4.c:1:20: Storage globonly1 becomes only
+sharing4.c:23:3: Only storage globonly4 not released before assignment:
+                    globonly4 = shared1
+   sharing4.c:4:20: Storage globonly4 becomes only
+sharing4.c:23:3: Shared storage shared1 assigned to only: globonly4 = shared1
+   sharing4.c:14:26: Storage shared1 becomes shared
+sharing4.c:27:3: Only storage globonly5 assigned to shared:
+                    globshared1 = globonly5
+   sharing4.c:5:20: Storage globonly5 becomes only
+sharing4.c:30:3: Only storage globonly1 assigned to shared (local1 aliases
+                    globonly1): globshared1 = local1
+   sharing4.c:1:20: Storage globonly1 becomes only
+sharing4.c:30:3: Kept storage only1 assigned to shared (local1 aliases only1):
+                    globshared1 = local1
+   sharing4.c:18:3: Storage only1 becomes kept
+sharing4.c:32:3: Only storage assigned to shared:
+                    globshared1 = string_copy(local1)
+sharing4.c:34:3: Temp storage temp2 assigned to shared: globshared2 = temp2
+   sharing4.c:13:37: Storage temp2 becomes temp
+sharing4.c:35:3: Only storage globonly4 not released before assignment:
+                    globonly4 = temp1
+   sharing4.c:4:20: Storage globonly4 becomes only
+sharing4.c:38:9: Shared storage shared1 passed as only param: free (shared1)
+   sharing4.c:14:26: Storage shared1 becomes shared
+sharing4.c:42:12: Only storage only3 not released before return
+   sharing4.c:12:72: Storage only3 becomes only
+sharing4.c:42:12: Function returns with global globonly3 referencing released
+                     storage
+   sharing4.c:21:9: Storage globonly3 is released
+
+Finished LCLint checking --- 12 code errors found, as expected
+
+sharing5.c: (in function f)
+sharing5.c:13:4: Variable only1 used after being released
+   sharing5.c:12:9: Storage only1 released
+sharing5.c:22:5: Clauses exit with local2 referencing local storage in true
+                    branch, shared storage in false branch
+   sharing5.c:21:7: Storage local2 becomes shared
+sharing5.c:24:9: Shared storage shared passed as only param (local2 aliases
+                    shared): free (local2)
+   sharing5.c:5:27: Storage shared becomes shared
+sharing5.c:27:4: Dereference of possibly null pointer localp: *localp
+   sharing5.c:26:12: Storage localp may become null
+sharing5.c:32:3: Fresh storage localp not released before assignment:
+                    localp = &only3
+   sharing5.c:26:3: Fresh storage localp allocated
+sharing5.c:33:2: Only storage only3 not released before return
+   sharing5.c:4:73: Storage only3 becomes only
+
+Finished LCLint checking --- 6 code errors found, as expected
diff --git a/test/sharing1.c b/test/sharing1.c
new file mode 100644
index 0000000..703533b
--- /dev/null
+++ b/test/sharing1.c
@@ -0,0 +1,65 @@
+/*@-paramuse@*/
+
+/*@only@*/   int *globonly;
+/*@shared@*/ int *globshared1;
+/*@shared@*/ int *globshared2;
+/*@only@*/   int *zonly;
+
+void f(/*@only@*/ int *x, /*@temp@*/ int *y, /*@shared@*/ int *z)
+{
+  *x = 3;
+  if (3 > *x)
+    return; /* 1. bad x not released */
+} /* 2. bad x not released */
+
+int f2(/*@temp@*/ int *x, /*@only@*/ int *y)
+{
+  *x = 3;
+  *y = 6;
+  return 3; /* 3. bad y not released */
+}
+
+void f3(/*@only@*/ int *x)
+{
+  globshared1 = x; /* 4. bad shared globshared1 <- only x */
+} /* 5. Only storage x not released before return */
+
+void f4(/*@only@*/ int *x)
+{
+  zonly = x; /* 6. bad - didn't release zonly */ 
+} /* okay */
+
+int g(int *imp) 
+{
+  int x = 3;
+  int *y = malloc(sizeof(int));
+  int *y2 = malloc(sizeof(int));
+  int *y3 = malloc(sizeof(int));
+
+  if (y2) *y2 = 3;
+
+  f3 (imp); /* 7. bad if +memimplicit --- unqualified as only */
+  *imp = 5; /* 8. uses released */
+
+  (void) f(&x,  /* 9, 10. pass immediate as only, only parameter aliased */ 
+	   &x, 
+	   globshared1);  
+
+  (void) f2 (y3, y3); /* 11-15. --- 2 * null passed as nonnull, 2 * not completely def
+                          only parameter y3 aliased */
+  *y3 = 6; /* 16, 17. bad --- y3 was released, null */
+  (void) f(y, globshared1, globshared1); /* 18, 19. null as non-null, y not completely def */
+  (void) f(globshared1, /* 20. pass shared as only */
+	   globshared2, 
+	   globshared2);
+
+  free (globshared2); /* 21. bad --- free's shared! (pass shared as only) */
+  free (globonly);    
+
+  return *y; /* 22-25. y used after release, possible null, 
+                       locally allocated y2 not released, 
+       		       globonly is released */
+} 
+
+
+
diff --git a/test/sharing2.c b/test/sharing2.c
new file mode 100644
index 0000000..0fdd148
--- /dev/null
+++ b/test/sharing2.c
@@ -0,0 +1,48 @@
+extern /*@out@*/ /*@only@*/ void *smalloc (unsigned int size);
+
+typedef int mint;
+
+typedef struct _st
+{
+  int a;
+  /*@only@*/ int *b;
+  /*@shared@*/ mint *c;
+  int d;
+} *st;
+
+/*@only@*/ st st_create1 ()
+{
+  st res = (st) smalloc (sizeof(struct _st));
+  int *z;
+
+  res->a = 3; 
+  z = res->b;   /* res->b not defined */
+  z = (*res).c; /* (*res).c not defined */
+
+  return res;   /* res->d not defined */
+}
+
+void f1(/*@only@*/ st x)
+{
+  free (x->b);
+  free (x);
+} /* correct */
+
+void f2(/*@only@*/ st x) 
+{
+  free (x);
+} /* bad --- didn't release x->b */
+     
+void f3(/*@only@*/ st x) 
+{
+  free (x->c); /* bad --- x->c is shared */
+} /* bad --- didn't release x */
+
+/*@only@*/ st st_create ()
+{
+  st res = (st) smalloc(sizeof(struct _st));
+  res->a = 3; 
+  return res; /* 6, 7, 8. res->b, res->c, res->d not defined */
+}
+
+
diff --git a/test/sharing3.c b/test/sharing3.c
new file mode 100644
index 0000000..45532a1
--- /dev/null
+++ b/test/sharing3.c
@@ -0,0 +1,61 @@
+extern /*@only@*/ char *string_copyext (char *s) ;
+
+void f (void)
+{
+  char *s;
+
+  if (3 < 4)
+    {
+      s = string_copyext ("asdf");
+      free (s);
+    }
+}
+
+
+/*@only@*/ char *string_copy (char *s) 
+{ 
+  return s; /* 1. returns temp as only! */
+}
+
+/*@only@*/ char *copy_string1 (char *s)
+{
+  return string_copy (s); /* okay */
+}
+
+/*@only@*/ char *copy_string2 (char *s)
+{
+  return string_copyext (s); /* okay */
+}
+
+void string_free1 (char *s)
+{
+  free (s); /* 2. unqualified as only */
+}
+
+void string_free2 (/*@only@*/ char *s)
+{
+  free (s);
+}
+
+void string_free3 (/*@only@*/ char *s)
+{
+  char *t = string_copy (s);
+  string_free2 (s);
+  *t = 'a';
+} /* 3. bad, t not released */
+
+void string_free4 (/*@only@*/ char *s)
+{
+  char *t;
+  int i;
+
+  for (i = 0; i < 3; i++)
+    {
+      t = string_copy (s);
+      *t = 'a';
+      free (t);
+    }
+
+  free (s);
+} /* okay */
+
diff --git a/test/sharing4.c b/test/sharing4.c
new file mode 100644
index 0000000..0e2ed80
--- /dev/null
+++ b/test/sharing4.c
@@ -0,0 +1,47 @@
+/*@only@*/   char *globonly1;
+/*@only@*/   char *globonly2;
+/*@only@*/   char *globonly3;
+/*@only@*/   char *globonly4;
+/*@only@*/   char *globonly5;
+/*@shared@*/ char *globshared1;
+/*@shared@*/ char *globshared2;
+
+extern void free (/*@out@*/ /*@only@*/ void *s);
+extern /*@only@*/ char *string_copy (char *s) /*@modifies nothing;@*/ ;
+
+int f(/*@only@*/ char *only1, /*@only@*/ char *only2, /*@only@*/ char *only3, 
+      char *temp1, /*@temp@*/ char *temp2, 
+      /*@shared@*/ char *shared1, /*@shared@*/ char *shared2)
+{
+  char *local1;
+
+  globonly1 = only1;   /* 1. Only storage globonly1 not released before assignment */
+  free (globonly2);  
+  globonly2 = only2; 
+  free (globonly3);     /* okay...for now */
+
+  globonly4 = shared1; /* 2. Only storage globonly4 not released before assignment
+			  3. Shared storage assigned to only */
+  globshared1 = shared2;         
+  globshared1 = globshared2;
+  globshared1 = globonly5; /* 4. Only storage assigned to shared */
+
+  local1 = globonly1;   
+  globshared1 = local1; /* 5. Only storage globonly1 assigned to shared (local1 aliases */
+                        /* 6. Kept storage only1 assigned to shared (local1 aliases */
+  globshared1 = string_copy (local1); /* 7. Only storage assigned to shared */
+  
+  globshared2 = temp2; /* 8. Temp storage temp2 assigned to shared */
+  globonly4 = temp1;   /* 9. Only storage globonly4 not released before assignment
+			 10. Temp storage temp1 assigned to only: globonly4 = temp1 */
+
+  free (shared1); /* 11. Shared storage shared1 passed as only param */
+  *only3 = 'a';
+  *shared2 = 'c';
+
+  return 3; /* 12. Only storage only3 not released before return */
+	    /* 13. Function returns with global globonly3 referencing released */
+}
+
+
+
diff --git a/test/sharing5.c b/test/sharing5.c
new file mode 100644
index 0000000..fd585a5
--- /dev/null
+++ b/test/sharing5.c
@@ -0,0 +1,41 @@
+extern void free (/*@out@*/ /*@only@*/ void *s);
+extern /*@only@*/ char *string_copy (char *s);
+
+void f(/*@only@*/ char *only1, /*@only@*/ char *only2, /*@only@*/ char *only3,
+       /*@shared@*/ char *shared)
+{
+  char *local1, *local2, *local4;
+  char **localp;
+
+  local1 = only1;
+  *only1 = 'c';      /* okay */
+  free (local1);     /* okay --- kills only1 */
+  *only1 = 'c';      /* 1. bad --- only1 is dead */
+
+  if (3 > 4)
+    {
+      local2 = only2;
+    }
+  else
+    {
+      local2 = shared;
+    } /* 2. Clauses exit with local2 referencing dependant storage in true */
+
+  free (local2);     /* 3. bad --- could free shared2 (may kill only2) */
+
+  localp = malloc(sizeof(char *));
+  *localp = only3; /* 4. possible null deref */
+
+  local4 = only3;
+  local4 = NULL;  /* okay */
+
+  localp = &only3;   /* 5. new storage not released */
+} /* 6. only3 may not be released [[[ only2 ??? ]]] */ 
+
+
+
+
+
+
+
+
diff --git a/test/slovaknames.c b/test/slovaknames.c
new file mode 100644
index 0000000..b2541d0
--- /dev/null
+++ b/test/slovaknames.c
@@ -0,0 +1,44 @@
+# include "bool.h"
+# include "pivo.h"
+
+int pivoPyet;
+int michelobLight; /* bad */
+pivo budlight;
+
+/*@constant int pivoDevenast;@*/
+# define pivoDevenast 12
+
+bool pivoYedno (pivo p)
+{
+  /* pivo is accessible if +accessczech */
+
+  return (p == 1);
+}
+
+/* no types are accessible (error for +slovakfcns) */
+int samAdams (int x)
+{
+  return x;
+}
+
+/* no types are accessible (okay for +slovakfcns) */
+int samuel_adams (int x)
+{
+  return x;
+}
+
+/*@access pivo@*/
+
+int budweiser (int x) /* definitely an error! */
+{
+  return x;
+}
+
+pivo pivoBudvar (int x) /* that's better! */
+{
+  return x;
+}
+  
+
+
+
diff --git a/test/slovaknames.expect b/test/slovaknames.expect
new file mode 100644
index 0000000..1e6d375
--- /dev/null
+++ b/test/slovaknames.expect
@@ -0,0 +1,54 @@
+
+slovaknames.c: (in function pivoYedno)
+slovaknames.c:15:11: Left operand of == is abstract type (pivo): p == 1
+  An abstraction barrier is broken. If necessary, use /*@access @*/ to
+  allow access to an abstract type. (-abstract will suppress message)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+Finished LCLint checking --- no code errors found
+
+slovaknames.c:5:5: Variable michelobLight name violates Slovak naming
+    convention.  Slovak prefix michelob is not the name of a type.
+  Variable name is not consistent with Slovak naming convention. (-slovakvars
+  will suppress message)
+slovaknames.c:19:5: Function samAdams name violates Slovak naming convention. 
+                       Slovak prefix sam is not the name of a type.
+  Function or iterator name is not consistent with Slovak naming convention.
+  (-slovakfcns will suppress message)
+slovaknames.c:32:5: Function budweiser name is not consistent with Slovak
+                       naming convention.  Accessible types: pivo
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+slovaknames.c:19:5: Function samAdams name violates Slovak naming convention. 
+                       Slovak prefix sam is not the name of a type.
+  Function or iterator name is not consistent with Slovak naming convention.
+  (-slovakfcns will suppress message)
+slovaknames.c:32:5: Function budweiser name is not consistent with Slovak
+                       naming convention.  Accessible types: pivo
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+slovaknames.c:4:5: Variable pivoPyet name violates Slovak naming convention.
+    Slovak prefix pivo names an abstract type that is not accessible.
+  Use +accessslovak to allow access to type  in functions named _.
+slovaknames.c:5:5: Variable michelobLight name violates Slovak naming
+    convention.  Slovak prefix michelob is not the name of a type.
+slovaknames.c:8:17: Constant pivoDevenast name violates Slovak naming
+    convention. Slovak prefix pivo names an abstract type that is not
+    accessible.
+  Use +accessslovak to allow access to type  in functions named _.
+slovaknames.c:11:6: Function pivoYedno name violates Slovak naming convention.
+    Slovak prefix pivo names an abstract type that is not accessible.
+  Use +accessslovak to allow access to type  in functions named _.
+slovaknames.c: (in function pivoYedno)
+slovaknames.c:15:11: Left operand of == is abstract type (pivo): p == 1
+  An abstraction barrier is broken. If necessary, use /*@access @*/ to
+  allow access to an abstract type. (-abstract will suppress message)
+slovaknames.c:19:5: Function samAdams name violates Slovak naming convention. 
+                       Slovak prefix sam is not the name of a type.
+slovaknames.c:32:5: Function budweiser name is not consistent with Slovak
+                       naming convention.  Accessible types: pivo
+
+Finished LCLint checking --- 7 code errors found, as expected
diff --git a/test/slovaknames.out b/test/slovaknames.out
new file mode 100644
index 0000000..1e6d375
--- /dev/null
+++ b/test/slovaknames.out
@@ -0,0 +1,54 @@
+
+slovaknames.c: (in function pivoYedno)
+slovaknames.c:15:11: Left operand of == is abstract type (pivo): p == 1
+  An abstraction barrier is broken. If necessary, use /*@access @*/ to
+  allow access to an abstract type. (-abstract will suppress message)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+Finished LCLint checking --- no code errors found
+
+slovaknames.c:5:5: Variable michelobLight name violates Slovak naming
+    convention.  Slovak prefix michelob is not the name of a type.
+  Variable name is not consistent with Slovak naming convention. (-slovakvars
+  will suppress message)
+slovaknames.c:19:5: Function samAdams name violates Slovak naming convention. 
+                       Slovak prefix sam is not the name of a type.
+  Function or iterator name is not consistent with Slovak naming convention.
+  (-slovakfcns will suppress message)
+slovaknames.c:32:5: Function budweiser name is not consistent with Slovak
+                       naming convention.  Accessible types: pivo
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+slovaknames.c:19:5: Function samAdams name violates Slovak naming convention. 
+                       Slovak prefix sam is not the name of a type.
+  Function or iterator name is not consistent with Slovak naming convention.
+  (-slovakfcns will suppress message)
+slovaknames.c:32:5: Function budweiser name is not consistent with Slovak
+                       naming convention.  Accessible types: pivo
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+slovaknames.c:4:5: Variable pivoPyet name violates Slovak naming convention.
+    Slovak prefix pivo names an abstract type that is not accessible.
+  Use +accessslovak to allow access to type  in functions named _.
+slovaknames.c:5:5: Variable michelobLight name violates Slovak naming
+    convention.  Slovak prefix michelob is not the name of a type.
+slovaknames.c:8:17: Constant pivoDevenast name violates Slovak naming
+    convention. Slovak prefix pivo names an abstract type that is not
+    accessible.
+  Use +accessslovak to allow access to type  in functions named _.
+slovaknames.c:11:6: Function pivoYedno name violates Slovak naming convention.
+    Slovak prefix pivo names an abstract type that is not accessible.
+  Use +accessslovak to allow access to type  in functions named _.
+slovaknames.c: (in function pivoYedno)
+slovaknames.c:15:11: Left operand of == is abstract type (pivo): p == 1
+  An abstraction barrier is broken. If necessary, use /*@access @*/ to
+  allow access to an abstract type. (-abstract will suppress message)
+slovaknames.c:19:5: Function samAdams name violates Slovak naming convention. 
+                       Slovak prefix sam is not the name of a type.
+slovaknames.c:32:5: Function budweiser name is not consistent with Slovak
+                       naming convention.  Accessible types: pivo
+
+Finished LCLint checking --- 7 code errors found, as expected
diff --git a/test/specclauses.c b/test/specclauses.c
new file mode 100644
index 0000000..637f642
--- /dev/null
+++ b/test/specclauses.c
@@ -0,0 +1,45 @@
+typedef struct
+{
+  char *name;
+  char *id;
+  int year;
+} record;
+
+extern void setName (/*@special@*/ record *r, /*@only@*/ char *name)
+  /*@defines r->name@*/ ;
+
+extern /*@observer@*/ char *getName (/*@special@*/ record r)
+  /*@uses r.name@*/ ;
+
+extern void freeName (/*@special@*/ record r)
+  /*@releases r.name@*/ ;
+
+extern /*@observer@*/ char *f (/*@only@*/ char *name, char *id)
+{
+  record r;
+
+  if (0 == 1)
+    {
+      setName (&r, name);
+      return (getName (r)); /* r.name not released */
+    }
+  else if (1 == 2)
+    {
+      return (getName (r)); /* r.name not defined */
+    }
+  else if (2 == 3)
+    {
+      r.name = malloc (sizeof (char) * 12);
+      setName (&r, name); /* r.name allocated, memory leak */
+      return id; /* r.name not released */
+    }
+  else
+    {
+      setName (&r, name);
+      freeName (r);
+      printf ("%s\n", r.name); /* dead! */
+      freeName (r);
+      return id;
+    }
+}
+
diff --git a/test/specclauses.expect b/test/specclauses.expect
new file mode 100644
index 0000000..5165507
--- /dev/null
+++ b/test/specclauses.expect
@@ -0,0 +1,84 @@
+
+specclauses.c: (in function f)
+specclauses.c:24:28: Only storage r.name (type char *) derived from variable
+                        declared in this scope is not released (memory leak)
+specclauses.c:28:24: Undefined storage r.name corresponds to storage listed in
+                        uses clause of called function: r
+specclauses.c:28:28: Only storage name not released before return
+   specclauses.c:17:49: Storage name becomes only
+specclauses.c:33:16: Allocated storage r.name corresponds to storage listed in
+                        defines clause of called function: &r
+specclauses.c:34:17: Only storage r.name (type char *) derived from variable
+                        declared in this scope is not released (memory leak)
+specclauses.c:40:23: Field r.name used after being released
+   specclauses.c:39:17: Storage r.name released
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+specclauses2.c:12:2: Special clause allocates includes *.year of
+                        non-dynamically allocatated type int
+specclauses2.c: (in function allocYear)
+specclauses2.c:14:2: Unallocated storage r->year corresponds to storage listed
+                        in allocates clause
+specclauses2.c: (in function setName1)
+specclauses2.c:26:2: Undefined storage r->name corresponds to storage listed in
+                        defines clause
+specclauses2.c: (in function setName3)
+specclauses2.c:37:2: Undefined storage r->name corresponds to storage listed in
+                        sets clause
+   This sub-reference is undefined: *(r->name)
+specclauses2.c: (in function setName4)
+specclauses2.c:42:3: Implicitly only storage r->name not released before
+                        assignment: r->name = name
+specclauses2.c: (in function allocName2)
+specclauses2.c:54:2: Unallocated storage r->name corresponds to storage listed
+                        in allocates clause
+specclauses2.c: (in function freeName2)
+specclauses2.c:65:2: Unreleased storage r.name corresponds to storage listed in
+                        releases clause
+specclauses2.c: (in function freeName4)
+specclauses2.c:76:2: Unreleased storage r->name corresponds to storage listed
+                        in releases clause
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+specclauses3.c:7:6: Function result is used in defines clause of badResult but
+                       not annotated with special: *(result).name
+specclauses3.c:7:6: Special clause accesses field of non-struct or union result
+                       (int): *(result).name
+specclauses3.c: (in function badResult)
+specclauses3.c:12:10: Null storage returned as non-null: NULL
+specclauses3.c: (in function createName2)
+specclauses3.c:29:10: Undefined storage res->name corresponds to storage listed
+                         in defines clause: res
+specclauses3.c:29:10: Possibly null storage res returned as non-null: res
+   specclauses3.c:28:16: Storage res may become null
+specclauses3.c: (in function createName4)
+specclauses3.c:55:10: Unallocated storage res->name corresponds to storage
+                         listed in allocates clause: res
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+specclauses4.c: (in function usename)
+specclauses4.c:13:4: Dereference of null pointer *name: **name
+specclauses4.c: (in function callname)
+specclauses4.c:27:12: Non-null storage *s corresponds to storage listed in
+                         pre:isnull clause of called function: s
+specclauses4.c: (in function nullname2)
+specclauses4.c:42:2: Non-null storage *name corresponds to storage listed in
+                        post:isnull clause
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+specclauses5.c: (in function createrecord2)
+specclauses5.c:31:10: Null storage r->name derivable from return value: r
+   specclauses5.c:30:26: Storage r->name becomes null
+specclauses5.c: (in function newrecord2)
+specclauses5.c:43:10: Non-observer storage r->name corresponds to storage
+                         listed in post:observer clause: r
+specclauses5.c: (in function createrecordx)
+specclauses5.c:49:10: Observer storage r->name reachable from unqualified
+                         return value
+   specclauses5.c:48:27: Storage r->name becomes observer
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/specclauses.out b/test/specclauses.out
new file mode 100644
index 0000000..5165507
--- /dev/null
+++ b/test/specclauses.out
@@ -0,0 +1,84 @@
+
+specclauses.c: (in function f)
+specclauses.c:24:28: Only storage r.name (type char *) derived from variable
+                        declared in this scope is not released (memory leak)
+specclauses.c:28:24: Undefined storage r.name corresponds to storage listed in
+                        uses clause of called function: r
+specclauses.c:28:28: Only storage name not released before return
+   specclauses.c:17:49: Storage name becomes only
+specclauses.c:33:16: Allocated storage r.name corresponds to storage listed in
+                        defines clause of called function: &r
+specclauses.c:34:17: Only storage r.name (type char *) derived from variable
+                        declared in this scope is not released (memory leak)
+specclauses.c:40:23: Field r.name used after being released
+   specclauses.c:39:17: Storage r.name released
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+specclauses2.c:12:2: Special clause allocates includes *.year of
+                        non-dynamically allocatated type int
+specclauses2.c: (in function allocYear)
+specclauses2.c:14:2: Unallocated storage r->year corresponds to storage listed
+                        in allocates clause
+specclauses2.c: (in function setName1)
+specclauses2.c:26:2: Undefined storage r->name corresponds to storage listed in
+                        defines clause
+specclauses2.c: (in function setName3)
+specclauses2.c:37:2: Undefined storage r->name corresponds to storage listed in
+                        sets clause
+   This sub-reference is undefined: *(r->name)
+specclauses2.c: (in function setName4)
+specclauses2.c:42:3: Implicitly only storage r->name not released before
+                        assignment: r->name = name
+specclauses2.c: (in function allocName2)
+specclauses2.c:54:2: Unallocated storage r->name corresponds to storage listed
+                        in allocates clause
+specclauses2.c: (in function freeName2)
+specclauses2.c:65:2: Unreleased storage r.name corresponds to storage listed in
+                        releases clause
+specclauses2.c: (in function freeName4)
+specclauses2.c:76:2: Unreleased storage r->name corresponds to storage listed
+                        in releases clause
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+specclauses3.c:7:6: Function result is used in defines clause of badResult but
+                       not annotated with special: *(result).name
+specclauses3.c:7:6: Special clause accesses field of non-struct or union result
+                       (int): *(result).name
+specclauses3.c: (in function badResult)
+specclauses3.c:12:10: Null storage returned as non-null: NULL
+specclauses3.c: (in function createName2)
+specclauses3.c:29:10: Undefined storage res->name corresponds to storage listed
+                         in defines clause: res
+specclauses3.c:29:10: Possibly null storage res returned as non-null: res
+   specclauses3.c:28:16: Storage res may become null
+specclauses3.c: (in function createName4)
+specclauses3.c:55:10: Unallocated storage res->name corresponds to storage
+                         listed in allocates clause: res
+
+Finished LCLint checking --- 6 code errors found, as expected
+
+specclauses4.c: (in function usename)
+specclauses4.c:13:4: Dereference of null pointer *name: **name
+specclauses4.c: (in function callname)
+specclauses4.c:27:12: Non-null storage *s corresponds to storage listed in
+                         pre:isnull clause of called function: s
+specclauses4.c: (in function nullname2)
+specclauses4.c:42:2: Non-null storage *name corresponds to storage listed in
+                        post:isnull clause
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+specclauses5.c: (in function createrecord2)
+specclauses5.c:31:10: Null storage r->name derivable from return value: r
+   specclauses5.c:30:26: Storage r->name becomes null
+specclauses5.c: (in function newrecord2)
+specclauses5.c:43:10: Non-observer storage r->name corresponds to storage
+                         listed in post:observer clause: r
+specclauses5.c: (in function createrecordx)
+specclauses5.c:49:10: Observer storage r->name reachable from unqualified
+                         return value
+   specclauses5.c:48:27: Storage r->name becomes observer
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/specclauses2.c b/test/specclauses2.c
new file mode 100644
index 0000000..b83b91a
--- /dev/null
+++ b/test/specclauses2.c
@@ -0,0 +1,76 @@
+/*@-paramuse@*/
+
+typedef struct
+{
+  char *name;
+  char *id;
+  int year;
+} record;
+
+extern void allocYear (/*@special@*/ record *r)
+  /*@allocates r->year@*/  /* 1. Allocates clause includes *.year of ... */
+{
+  r->year = 23;
+} /* 2. Unallocated storage r->year corresponds to storage listed ... */
+
+extern void setName (/*@special@*/ record *r, /*@only@*/ char *name)
+  /*@defines r->name@*/ 
+{
+  r->name = name;
+}
+
+extern void setName1 (/*@special@*/ record *r, /*@only@*/ char *name)
+  /*@defines r->name@*/ 
+{
+  free (name);
+} /* 3. Storage r->name listed in defines clause not defined at ... */
+
+extern void setName2 (/*@special@*/ record *r, char *name)
+  /*@sets r->name@*/ 
+{
+  strcpy (r->name, name);
+}
+
+extern void setName3 (/*@special@*/ record *r, char *name)
+  /*@sets r->name@*/ 
+{
+} /* 4. Storage *(r->name) listed in sets clause not defined at ... */
+
+extern void setName4 (/*@special@*/ record *r, /*@only@*/ char *name)
+  /*@sets r->name@*/ 
+{
+  r->name = name; /* 5. Implicitly only storage r->name not released before ... */
+}
+
+extern void allocName (/*@special@*/ record *r)
+  /*@allocates r->name@*/ 
+{
+  r->name = (char *) malloc (sizeof (char) * 20);
+}
+
+extern void allocName2 (/*@special@*/ record *r)
+  /*@allocates r->name@*/ 
+{
+} /* 6. Storage r->name listed in allocates clauses is not ... */
+
+extern void freeName (/*@special@*/ record r)
+  /*@releases r.name@*/
+{
+  free (r.name); 
+}
+
+extern void freeName2 (/*@special@*/ record r)
+  /*@releases r.name@*/
+{
+} /* 7. Storage r.name listed in releases clause not released */
+
+extern void freeName3 (/*@special@*/ record *r)
+  /*@releases r->name@*/
+{
+  free (r->name);
+}
+
+extern void freeName4 (/*@special@*/ record *r)
+  /*@releases r->name@*/
+{
+} /* 8. Storage r->name listed in releases clause not released ... */
diff --git a/test/specclauses3.c b/test/specclauses3.c
new file mode 100644
index 0000000..1b0ad1c
--- /dev/null
+++ b/test/specclauses3.c
@@ -0,0 +1,61 @@
+typedef struct 
+{
+  int id;
+  char *name;
+} *record;
+
+int *badResult (void)  
+  /* 1. Function result is used in defines clause of badResult but ...
+     2. Special clause accesses field of non-struct or union result */
+   /*@defines result->name@*/ 
+{
+  return NULL; /* 3. Null storage returned as non-null: NULL */
+} 
+
+/*@special@*/ record createName (/*@only@*/ char *name)
+   /*@defines result->name@*/ 
+{
+  record res = (record) malloc (sizeof (*res));
+
+  assert (res != NULL);
+  res->name = name;
+  return res;
+}
+
+/*@special@*/ record createName2 (void)
+   /*@defines result->name@*/ 
+{
+  record res = (record) malloc (sizeof (*res));
+  return res; /* 4. Undefined storage res->name corresponds to storage listed ...
+		 5. Possibly null storage res returned as non-null: res */
+}
+
+/*@special@*/ record createName3 (void)
+   /*@defines result->id@*/ 
+   /*@allocates result->name@*/
+{
+  record res = (record) malloc (sizeof (*res));
+
+  assert (res != NULL);
+
+  res->name = (char *) malloc (sizeof (char) * 23);
+  res->id = 21;
+  return res;
+}
+
+/*@special@*/ record createName4 (void)
+   /*@defines result->id@*/ 
+   /*@allocates result->name@*/
+{
+  record res = (record) malloc (sizeof (*res));
+
+  assert (res != NULL);
+
+  res->id = 21;
+  return res; /* 6. Unallocated storage res->name corresponds to storage ... */
+}
+
+
+
+
+
diff --git a/test/specclauses4.c b/test/specclauses4.c
new file mode 100644
index 0000000..7882917
--- /dev/null
+++ b/test/specclauses4.c
@@ -0,0 +1,47 @@
+/*@-paramuse@*/ 
+
+typedef struct 
+{
+  int id;
+  char *name;
+} *record;
+
+void usename (/*@special@*/ char **name)
+   /*@uses *name@*/
+   /*@pre:isnull *name@*/
+{
+  **name = 'a'; /* 1. Dereference of null pointer *name: **name */
+}
+
+void callname (void)
+{
+  char **s;
+
+  s = (char **) malloc (sizeof (char *));
+  assert (s != NULL);
+  *s = (char *) malloc (sizeof (char));
+  assert (*s != NULL);
+
+  **s = 'a';
+
+  usename (s); /* 2. Non-null storage *s corresponds to storage listed in ... */
+  free (*s);
+  free (s);
+}
+
+void nullname (/*@special@*/ char **name)
+   /*@post:isnull *name@*/
+{
+  *name = NULL;
+}
+
+void nullname2 (/*@special@*/ char **name)
+   /*@post:isnull *name@*/
+{
+  ;
+} /* 3. Non-null storage *name corresponds to storage listed in ... */
+
+
+
+
+
diff --git a/test/specclauses5.c b/test/specclauses5.c
new file mode 100644
index 0000000..25a168d
--- /dev/null
+++ b/test/specclauses5.c
@@ -0,0 +1,52 @@
+/*@-paramuse@*/ 
+
+typedef struct 
+{
+  int id;
+  char *name;
+} *record;
+
+/*@special@*/ record newrecord (void)
+  /*@defines result@*/
+  /*@post:isnull result->name@*/
+{
+  record r = (record) malloc (sizeof (*r));
+
+  assert (r != NULL);
+  r->id = 3;
+  r->name = NULL;
+  return r;
+}
+
+record createrecord (/*@only@*/ char *name)
+{
+  record r = newrecord ();
+  r->name = name;
+  return r;
+}
+
+record createrecord2 (void)
+{
+  record r = newrecord ();
+  return r; /* 1. Null storage r->name derivable from return value: r */
+}
+
+/*@special@*/ record newrecord2 (void)
+  /*@defines *result@*/
+  /*@post:observer result->name@*/
+{
+  record r = (record) malloc (sizeof (*r));
+
+  assert (r != NULL);
+  r->id = 3;
+  r->name = NULL;
+  return r; /* 2. Non-observer storage r->name corresponds to storage ... */
+}
+
+record createrecordx (void)
+{
+  record r = newrecord2 ();
+  return r; /* 3. Observer storage r->name reachable from observer return */
+}
+
+
diff --git a/test/special.c b/test/special.c
new file mode 100644
index 0000000..7c9fc86
--- /dev/null
+++ b/test/special.c
@@ -0,0 +1,47 @@
+char gc; 
+int  gi;
+char *gs;
+
+int f()
+{
+  char c;
+  unsigned char uc;
+  int i;
+  long int li = 23;
+  short int silly = 3;
+  char *s;
+
+  printf("hullo this is a %s !", "test");
+  (void) scanf("hullo, welcome to %d", &i); /* defines i */
+
+  printf("even %d %c harder", i, c); /* 1. Variable c used before definition */
+  uc = 'a';
+  printf("even %d %c harder", li, uc); /* 2. printf format arg 1 (%d) expects int gets long int: li */
+  printf("even %ld %d %hd %hd %d harder", i, li, i, silly, silly);  /* 3, 4. [5, 6.]
+								     * arg1 (expects long), 
+								     arg2 (expects int),
+								     arg3 (expects short),
+								     * (okay if +relaxquals) arg5 (expects int) */
+  
+  (void) scanf("%*d okay"); /* [NO! 5. Statement has no effect] */
+  printf("%s %s", s, s); /* 5. Variable s used before definition */
+
+  printf("a real %+14.3i", c, i); /* 6, 7. printf format arg 1 (%i) expects int gets char: c, extra arg */
+  fprintf(stdout, "a real %+14.33i", c, i); /* 8, 9. fprintf format arg 1 (%i) expects int gets char: c, extra */
+  printf("%% %d %f %f", c, i); /* 10, 11, 12. printf format arg 1, arg2, missing arg 3 */
+
+  (void) scanf("hullo, welcome to %d", &i);
+  (void) scanf("hullo, welcome to %d", i); /* 13. scanf format arg 1 (%d) expects int * gets int: i */
+
+  /* 3 type errors */
+  (void) fscanf(stdin, "hullo, welcome to %d %c %s", i, c, &s); /* 14, 15, 16. arg1, arg2, arg3 */
+
+  /* 3 modification errors */
+  (void) fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs); /* 17, 18, 19. modifies g1, gc, gs */
+  /* 1 modification error */
+  (void) fscanf(stdin, "hullo, welcome to %*23d %*c %s", gs); /* 20. modifies gs */
+
+  return 3;
+}
+
+
diff --git a/test/special.expect b/test/special.expect
new file mode 100644
index 0000000..d3edd07
--- /dev/null
+++ b/test/special.expect
@@ -0,0 +1,89 @@
+
+special.c: (in function f)
+special.c:17:34: Variable c used before definition
+special.c:19:31: Format argument 1 to printf (%d) expects int gets long int: li
+   special.c:19:17: Corresponding format code
+special.c:20:46: Format argument 2 to printf (%d) expects int gets long int: li
+   special.c:20:21: Corresponding format code
+special.c:20:50: Format argument 3 to printf (%d) expects short int gets int: i
+   special.c:20:25: Corresponding format code
+special.c:27:19: Variable s used before definition
+special.c:29:28: Format argument 1 to printf (%i) expects int gets char: c
+   special.c:29:24: Corresponding format code
+special.c:29:3: Format string for printf has 1 arg, given 2
+special.c:30:38: Format argument 1 to fprintf (%i) expects int gets char: c
+   special.c:30:34: Corresponding format code
+special.c:30:3: Format string for fprintf has 1 arg, given 2
+special.c:31:25: Format argument 1 to printf (%d) expects int gets char: c
+   special.c:31:15: Corresponding format code
+special.c:31:28: Format argument 2 to printf (%f) expects double gets int: i
+   special.c:31:18: Corresponding format code
+special.c:31:3: No argument corresponding to printf format code 3 (%f):
+                   "%% %d %f %f"
+   special.c:31:21: Corresponding format code
+special.c:34:40: Format argument 1 to scanf (%d) expects int * gets int: i
+   special.c:34:36: Corresponding format code
+special.c:37:54: Format argument 1 to fscanf (%d) expects int * gets int: i
+   special.c:37:44: Corresponding format code
+special.c:37:57: Format argument 2 to fscanf (%c) expects char * gets char: c
+   special.c:37:47: Corresponding format code
+special.c:37:60: Format argument 3 to fscanf (%s) expects char * gets char **:
+                    &s
+   special.c:37:50: Corresponding format code
+special.c:40:10: Undocumented modification of gi possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:40:10: Undocumented modification of gc possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:40:10: Undocumented modification of gs possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:42:10: Undocumented modification of gs possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %*23d %*c %s", gs)
+
+Finished LCLint checking --- 20 code errors found, as expected
+
+special.c: (in function f)
+special.c:17:34: Variable c used before definition
+special.c:19:31: Format argument 1 to printf (%d) expects int gets long int: li
+   special.c:19:17: Corresponding format code
+special.c:20:43: Format argument 1 to printf (%d) expects long int gets int: i
+   special.c:20:18: Corresponding format code
+special.c:20:46: Format argument 2 to printf (%d) expects int gets long int: li
+   special.c:20:21: Corresponding format code
+special.c:20:50: Format argument 3 to printf (%d) expects short int gets int: i
+   special.c:20:25: Corresponding format code
+special.c:20:60: Format argument 5 to printf (%d) expects int gets short int:
+                    silly
+   special.c:20:32: Corresponding format code
+special.c:27:19: Variable s used before definition
+special.c:29:28: Format argument 1 to printf (%i) expects int gets char: c
+   special.c:29:24: Corresponding format code
+special.c:29:3: Format string for printf has 1 arg, given 2
+special.c:30:38: Format argument 1 to fprintf (%i) expects int gets char: c
+   special.c:30:34: Corresponding format code
+special.c:30:3: Format string for fprintf has 1 arg, given 2
+special.c:31:25: Format argument 1 to printf (%d) expects int gets char: c
+   special.c:31:15: Corresponding format code
+special.c:31:28: Format argument 2 to printf (%f) expects double gets int: i
+   special.c:31:18: Corresponding format code
+special.c:31:3: No argument corresponding to printf format code 3 (%f):
+                   "%% %d %f %f"
+   special.c:31:21: Corresponding format code
+special.c:34:40: Format argument 1 to scanf (%d) expects int * gets int: i
+   special.c:34:36: Corresponding format code
+special.c:37:54: Format argument 1 to fscanf (%d) expects int * gets int: i
+   special.c:37:44: Corresponding format code
+special.c:37:57: Format argument 2 to fscanf (%c) expects char * gets char: c
+   special.c:37:47: Corresponding format code
+special.c:37:60: Format argument 3 to fscanf (%s) expects char * gets char **:
+                    &s
+   special.c:37:50: Corresponding format code
+special.c:40:10: Undocumented modification of gi possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:40:10: Undocumented modification of gc possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:40:10: Undocumented modification of gs possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:42:10: Undocumented modification of gs possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %*23d %*c %s", gs)
+
+Finished LCLint checking --- 22 code errors found, as expected
diff --git a/test/special.lcl b/test/special.lcl
new file mode 100644
index 0000000..5b041ce
--- /dev/null
+++ b/test/special.lcl
@@ -0,0 +1,5 @@
+char gc; 
+int  gi;
+char *gs;
+
+int f (void) char gc; int gi; char *gs; { }
\ No newline at end of file
diff --git a/test/special.lcs b/test/special.lcs
new file mode 100644
index 0000000..6c2ea35
--- /dev/null
+++ b/test/special.lcs
@@ -0,0 +1,126 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLvar gc _char_Obj
+%LCLvar gi _int_Obj
+%LCLvar gs ___char_Obj_Ptr_Obj
+%LCLfcn f :  -> int 
+%LCLfcnGlobals _char_Obj gc; _int_Obj gi; ___char_Obj_Ptr_Obj gs; 
+%LCLSymbolTableEnd
diff --git a/test/special.out b/test/special.out
new file mode 100644
index 0000000..d3edd07
--- /dev/null
+++ b/test/special.out
@@ -0,0 +1,89 @@
+
+special.c: (in function f)
+special.c:17:34: Variable c used before definition
+special.c:19:31: Format argument 1 to printf (%d) expects int gets long int: li
+   special.c:19:17: Corresponding format code
+special.c:20:46: Format argument 2 to printf (%d) expects int gets long int: li
+   special.c:20:21: Corresponding format code
+special.c:20:50: Format argument 3 to printf (%d) expects short int gets int: i
+   special.c:20:25: Corresponding format code
+special.c:27:19: Variable s used before definition
+special.c:29:28: Format argument 1 to printf (%i) expects int gets char: c
+   special.c:29:24: Corresponding format code
+special.c:29:3: Format string for printf has 1 arg, given 2
+special.c:30:38: Format argument 1 to fprintf (%i) expects int gets char: c
+   special.c:30:34: Corresponding format code
+special.c:30:3: Format string for fprintf has 1 arg, given 2
+special.c:31:25: Format argument 1 to printf (%d) expects int gets char: c
+   special.c:31:15: Corresponding format code
+special.c:31:28: Format argument 2 to printf (%f) expects double gets int: i
+   special.c:31:18: Corresponding format code
+special.c:31:3: No argument corresponding to printf format code 3 (%f):
+                   "%% %d %f %f"
+   special.c:31:21: Corresponding format code
+special.c:34:40: Format argument 1 to scanf (%d) expects int * gets int: i
+   special.c:34:36: Corresponding format code
+special.c:37:54: Format argument 1 to fscanf (%d) expects int * gets int: i
+   special.c:37:44: Corresponding format code
+special.c:37:57: Format argument 2 to fscanf (%c) expects char * gets char: c
+   special.c:37:47: Corresponding format code
+special.c:37:60: Format argument 3 to fscanf (%s) expects char * gets char **:
+                    &s
+   special.c:37:50: Corresponding format code
+special.c:40:10: Undocumented modification of gi possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:40:10: Undocumented modification of gc possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:40:10: Undocumented modification of gs possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:42:10: Undocumented modification of gs possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %*23d %*c %s", gs)
+
+Finished LCLint checking --- 20 code errors found, as expected
+
+special.c: (in function f)
+special.c:17:34: Variable c used before definition
+special.c:19:31: Format argument 1 to printf (%d) expects int gets long int: li
+   special.c:19:17: Corresponding format code
+special.c:20:43: Format argument 1 to printf (%d) expects long int gets int: i
+   special.c:20:18: Corresponding format code
+special.c:20:46: Format argument 2 to printf (%d) expects int gets long int: li
+   special.c:20:21: Corresponding format code
+special.c:20:50: Format argument 3 to printf (%d) expects short int gets int: i
+   special.c:20:25: Corresponding format code
+special.c:20:60: Format argument 5 to printf (%d) expects int gets short int:
+                    silly
+   special.c:20:32: Corresponding format code
+special.c:27:19: Variable s used before definition
+special.c:29:28: Format argument 1 to printf (%i) expects int gets char: c
+   special.c:29:24: Corresponding format code
+special.c:29:3: Format string for printf has 1 arg, given 2
+special.c:30:38: Format argument 1 to fprintf (%i) expects int gets char: c
+   special.c:30:34: Corresponding format code
+special.c:30:3: Format string for fprintf has 1 arg, given 2
+special.c:31:25: Format argument 1 to printf (%d) expects int gets char: c
+   special.c:31:15: Corresponding format code
+special.c:31:28: Format argument 2 to printf (%f) expects double gets int: i
+   special.c:31:18: Corresponding format code
+special.c:31:3: No argument corresponding to printf format code 3 (%f):
+                   "%% %d %f %f"
+   special.c:31:21: Corresponding format code
+special.c:34:40: Format argument 1 to scanf (%d) expects int * gets int: i
+   special.c:34:36: Corresponding format code
+special.c:37:54: Format argument 1 to fscanf (%d) expects int * gets int: i
+   special.c:37:44: Corresponding format code
+special.c:37:57: Format argument 2 to fscanf (%c) expects char * gets char: c
+   special.c:37:47: Corresponding format code
+special.c:37:60: Format argument 3 to fscanf (%s) expects char * gets char **:
+                    &s
+   special.c:37:50: Corresponding format code
+special.c:40:10: Undocumented modification of gi possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:40:10: Undocumented modification of gc possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:40:10: Undocumented modification of gs possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %23d %c %s", &gi, &gc, gs)
+special.c:42:10: Undocumented modification of gs possible from call to fscanf:
+                    fscanf(stdin, "hullo, welcome to %*23d %*c %s", gs)
+
+Finished LCLint checking --- 22 code errors found, as expected
diff --git a/test/stack.c b/test/stack.c
new file mode 100644
index 0000000..be41aa0
--- /dev/null
+++ b/test/stack.c
@@ -0,0 +1,40 @@
+int *glob;
+
+void stack1 (int **x)
+{
+  int sa[3] = { 0, 1, 2 } ;
+  int loc = 3;
+
+  glob = &loc;
+  *x = &sa[0];
+} /* 1. Stack-allocated storage *x reachable from parameter x,
+     2. Stack-allocated storage glob reachable from global glob
+  */
+
+/*@dependent@*/ int *f (int c)
+{
+  int x = 3;
+  
+  if (c == 0)
+    {
+      return &x; /* 3. Stack-allocated storage &x reachable from return value */ 
+    }
+  else
+    {
+      int sa[10];
+
+      sa[0] = 35;
+      sa[2] = 37;      
+
+      if (c == 1)
+	{
+	  return sa; /* 4. Stack-allocated storage sa reachable ... */
+	}
+      else
+	{
+	  return &sa[0]; /* 5. Stack-allocated storage sa reachable ... */
+	}
+    }
+}
+
+
diff --git a/test/stack.expect b/test/stack.expect
new file mode 100644
index 0000000..c9f5661
--- /dev/null
+++ b/test/stack.expect
@@ -0,0 +1,14 @@
+
+stack.c: (in function stack1)
+stack.c:10:2: Stack-allocated storage *x reachable from parameter x
+   stack.c:9:3: Storage *x becomes stack
+stack.c:10:2: Stack-allocated storage glob reachable from global glob
+   stack.c:8:3: Storage glob becomes stack
+stack.c: (in function f)
+stack.c:20:14: Stack-allocated storage &x reachable from return value: &x
+stack.c:31:11: Stack-allocated storage sa reachable from return value: sa
+stack.c:35:11: Stack-allocated storage sa reachable from return value: &sa[0]
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
diff --git a/test/stack.out b/test/stack.out
new file mode 100644
index 0000000..c9f5661
--- /dev/null
+++ b/test/stack.out
@@ -0,0 +1,14 @@
+
+stack.c: (in function stack1)
+stack.c:10:2: Stack-allocated storage *x reachable from parameter x
+   stack.c:9:3: Storage *x becomes stack
+stack.c:10:2: Stack-allocated storage glob reachable from global glob
+   stack.c:8:3: Storage glob becomes stack
+stack.c: (in function f)
+stack.c:20:14: Stack-allocated storage &x reachable from return value: &x
+stack.c:31:11: Stack-allocated storage sa reachable from return value: sa
+stack.c:35:11: Stack-allocated storage sa reachable from return value: &sa[0]
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
diff --git a/test/staticarray.c b/test/staticarray.c
new file mode 100644
index 0000000..7e92d53
--- /dev/null
+++ b/test/staticarray.c
@@ -0,0 +1,28 @@
+#include 
+#include 
+ 
+char *foo1(void)
+{
+  static char buf[1000];
+  
+  strcpy(buf, "hello");
+  return buf;
+}
+
+/*@observer@*/ char *foo2(void)
+{
+  static char buf[1000];
+  
+  strcpy(buf, "hello");
+  return buf;
+}
+
+char *f (char outstr[])
+{
+  return outstr; 
+}
+
+char *g (char *outstr)
+{
+  return outstr; 
+}
diff --git a/test/staticarray.expect b/test/staticarray.expect
new file mode 100644
index 0000000..2a44323
--- /dev/null
+++ b/test/staticarray.expect
@@ -0,0 +1,12 @@
+
+staticarray.c: (in function foo1)
+staticarray.c:9:10: Unqualified static storage buf returned as implicitly only:
+                       buf
+staticarray.c: (in function f)
+staticarray.c:22:10: Implicitly temp storage outstr returned as implicitly
+                        only: outstr
+staticarray.c: (in function g)
+staticarray.c:27:10: Implicitly temp storage outstr returned as implicitly
+                        only: outstr
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/staticarray.out b/test/staticarray.out
new file mode 100644
index 0000000..2a44323
--- /dev/null
+++ b/test/staticarray.out
@@ -0,0 +1,12 @@
+
+staticarray.c: (in function foo1)
+staticarray.c:9:10: Unqualified static storage buf returned as implicitly only:
+                       buf
+staticarray.c: (in function f)
+staticarray.c:22:10: Implicitly temp storage outstr returned as implicitly
+                        only: outstr
+staticarray.c: (in function g)
+staticarray.c:27:10: Implicitly temp storage outstr returned as implicitly
+                        only: outstr
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/strings.c b/test/strings.c
new file mode 100644
index 0000000..ad52ceb
--- /dev/null
+++ b/test/strings.c
@@ -0,0 +1,26 @@
+/*
+** checks read-only strings
+*/
+
+char f1 (char *x)
+{
+  return *x;
+}
+
+char f2 (char *x) /*@modifies *x;@*/
+{
+  *x = 'a';
+  return *x;
+}
+
+void f3 (/*@only@*/ char *x)
+{
+  free (x);
+}
+
+void main (void)
+{
+  (void) f1 ("hullo");
+  (void) f2 ("hullo");
+  f3 ("hullo");
+}
diff --git a/test/strings.expect b/test/strings.expect
new file mode 100644
index 0000000..19b5d44
--- /dev/null
+++ b/test/strings.expect
@@ -0,0 +1,23 @@
+
+strings.c:21:6: Function main declared to return void, should return int
+strings.c: (in function main)
+strings.c:24:14: Function call may modify observer: "hullo"
+strings.c:25:7: Observer storage passed as only param: f3 ("hullo")
+   strings.c:25:7: Storage becomes observer
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+strings.c:21:6: Function main declared to return void, should return int
+
+Finished LCLint checking --- 1 code error found, as expected
+
+strings.c: (in function main)
+strings.c:23:14: Call to unconstrained function f1 may modify observer: "hullo"
+   strings.c:23:14: Storage becomes observer
+strings.c:24:14: Function call may modify observer: "hullo"
+strings.c:25:7: Call to unconstrained function f3 may modify observer: "hullo"
+   strings.c:25:7: Storage becomes observer
+strings.c:25:7: Observer storage passed as only param: f3 ("hullo")
+   strings.c:25:7: Storage becomes observer
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/strings.out b/test/strings.out
new file mode 100644
index 0000000..19b5d44
--- /dev/null
+++ b/test/strings.out
@@ -0,0 +1,23 @@
+
+strings.c:21:6: Function main declared to return void, should return int
+strings.c: (in function main)
+strings.c:24:14: Function call may modify observer: "hullo"
+strings.c:25:7: Observer storage passed as only param: f3 ("hullo")
+   strings.c:25:7: Storage becomes observer
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+strings.c:21:6: Function main declared to return void, should return int
+
+Finished LCLint checking --- 1 code error found, as expected
+
+strings.c: (in function main)
+strings.c:23:14: Call to unconstrained function f1 may modify observer: "hullo"
+   strings.c:23:14: Storage becomes observer
+strings.c:24:14: Function call may modify observer: "hullo"
+strings.c:25:7: Call to unconstrained function f3 may modify observer: "hullo"
+   strings.c:25:7: Storage becomes observer
+strings.c:25:7: Observer storage passed as only param: f3 ("hullo")
+   strings.c:25:7: Storage becomes observer
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/structassign.c b/test/structassign.c
new file mode 100644
index 0000000..96e325b
--- /dev/null
+++ b/test/structassign.c
@@ -0,0 +1,46 @@
+# include 
+# include 
+# include 
+# include 
+
+typedef struct
+{
+  int x;
+  char *name;
+} record;
+
+record copyrecord (record x)
+{
+  record copy = x;
+  return copy; /* 1. Released storage x.name reachable from parameter at ... */
+}
+
+record copyrecord2 (record x)
+{
+  record copy;
+
+  copy = x;
+  return copy; /* 2. Released storage x.name reachable from parameter at ... */
+}
+
+record copyrecord3 (record x)
+{
+  return x; /* 3. Released storage x.name reachable from parameter at ... */
+}
+
+int main ()
+{
+  record r;
+  record rc;
+
+  r.x = 3;
+  r.name = (char *) malloc (sizeof (char) * 100);
+  assert (r.name != NULL);
+  strcpy (r.name, "yo");
+
+  rc = r;
+
+  printf ("rc: %s", rc.name);
+
+  return r.x; /* 4. Only storage rc.name (type char *) derived from variable ... */
+}
diff --git a/test/structassign.expect b/test/structassign.expect
new file mode 100644
index 0000000..1543558
--- /dev/null
+++ b/test/structassign.expect
@@ -0,0 +1,18 @@
+
+structassign.c: (in function copyrecord)
+structassign.c:15:15: Released storage x.name reachable from parameter at
+                         return point
+   structassign.c:14:19: Storage x.name is released
+structassign.c: (in function copyrecord2)
+structassign.c:23:15: Released storage x.name reachable from parameter at
+                         return point
+   structassign.c:22:3: Storage x.name is released
+structassign.c: (in function copyrecord3)
+structassign.c:28:12: Released storage x.name reachable from parameter at
+                         return point
+   structassign.c:28:12: Storage x.name is released
+structassign.c: (in function main)
+structassign.c:45:14: Only storage rc.name (type char *) derived from variable
+                         declared in this scope is not released (memory leak)
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/structassign.out b/test/structassign.out
new file mode 100644
index 0000000..1543558
--- /dev/null
+++ b/test/structassign.out
@@ -0,0 +1,18 @@
+
+structassign.c: (in function copyrecord)
+structassign.c:15:15: Released storage x.name reachable from parameter at
+                         return point
+   structassign.c:14:19: Storage x.name is released
+structassign.c: (in function copyrecord2)
+structassign.c:23:15: Released storage x.name reachable from parameter at
+                         return point
+   structassign.c:22:3: Storage x.name is released
+structassign.c: (in function copyrecord3)
+structassign.c:28:12: Released storage x.name reachable from parameter at
+                         return point
+   structassign.c:28:12: Storage x.name is released
+structassign.c: (in function main)
+structassign.c:45:14: Only storage rc.name (type char *) derived from variable
+                         declared in this scope is not released (memory leak)
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/switch.c b/test/switch.c
new file mode 100644
index 0000000..c91ad53
--- /dev/null
+++ b/test/switch.c
@@ -0,0 +1,73 @@
+int f1(int x)
+{
+  switch (x)
+    {
+    case 0: return 3;
+    case 1: return 4;
+    default: return 6;
+    }
+}
+
+typedef enum _et { ONE, TWO, THREE } et;
+
+int f2 (et x)
+{
+  switch (x)
+    {
+    case ONE: return 3;
+    case TWO: return 8;
+    case THREE: return 12;
+    }
+}
+
+int f3 (et x)
+{
+  switch (x)
+    {
+    case ONE: return 3;
+    case TWO: break;
+    default:  return 12;
+    }
+} /* 1. Path with no return in function declared to return int */
+
+int f4 (et x)
+{
+  switch (x)
+    {
+    case ONE: return 3;
+    case TWO: return 14;
+    default:  return 12;
+    }
+}
+
+int f5 (et x)
+{
+  switch (x)
+    {
+    case ONE: return 3;
+    case TWO: return 14;
+    } /* 2. Missing case in switch: THREE */
+} /* 3. Path with no return in function declared to return int */
+
+int f6 (et x)
+{
+  switch (x)
+    {
+    case ONE: 
+      if (3 > 4)
+	{
+	  return 3;
+	}
+      else
+	{
+	  return 12;
+	}
+    case TWO: 
+      if (3 > 4) break;
+      return 14;
+    default:  return 12;
+    }
+} /* 4. Path with no return in function declared to return int */
+
+
+
diff --git a/test/tests2.2.expect b/test/tests2.2.expect
new file mode 100644
index 0000000..639a551
--- /dev/null
+++ b/test/tests2.2.expect
@@ -0,0 +1,78 @@
+
+boolops.c: (in function main)
+boolops.c:12:3: Assignment of int to Kzam: b = 12
+
+Finished LCLint checking --- 1 code error found, as expected
+
+mbool.h:1:17: Type implemented as macro: bool
+
+Finished LCLint checking --- 1 code error found, as expected
+
+boolenum.c: (in function main)
+boolenum.c:11:8: Use of == with BOOLEAN variables (risks inconsistency because
+                    of multiple true values): a == TRUE
+
+Finished LCLint checking --- 1 code error found, as expected
+
+break.c: (in function f)
+break.c:9:4: Dereference of possibly null pointer x: *x
+   break.c:1:24: Storage x may become null
+
+Finished LCLint checking --- 1 code error found, as expected
+
+bstring.c:4:14: Initial value of s4[0] is type char *, expects char: "hullo"
+bstring.c:4:23: Initial value of s4[1] is type char *, expects char: "g'bye"
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+decl.c:3:21: Structure struct tm declared with fields { int x; }, specified
+                with fields { int tm_sec; int tm_min; int tm_hour;, ... }
+   load file ansi.lcd: Specification of struct tm
+   decl.c:3:17: Field tm_sec in specified corresponds to x in declaration
+   load file ansi.lcd: Specification of tm_sec
+
+Finished LCLint checking --- 1 code error found, as expected
+
+enumbool.c:1:34: Member of boolean enumerated type definition does not match
+                    name set to represent TRUE or FALSE: false
+enumbool.c:1:34: Member of boolean enumerated type definition does not match
+                    name set to represent TRUE or FALSE: true
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+extension.c:3:1: Parse Error. (For help on parse errors, see lclint -help
+               parseerrors.)
+*** Cannot continue.
+
+Finished LCLint checking --- no code errors found
+
+nestext.c: (in function f)
+nestext.c:3:26: Declaration using extern inside function scope: int test(void)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+Finished LCLint checking --- no code errors found
+
+sizeofarray.c:1:12: Function parameter x declared as manifest array (size
+                       constant is meaningless)
+sizeofarray.c: (in function f)
+sizeofarray.c:5:13: Parameter to sizeof is an array-type function parameter:
+                       sizeof((x))
+sizeofarray.c:10:16: Return value type size_t does not match declared type int:
+                        sizeof((a))
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+rex.c: (in function main)
+rex.c:19:12: Only storage re.parent (type struct rx_hash *) derived from
+                variable declared in this scope is not released (memory leak)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+struct.c:13:6: Function main declared to return void, should return int
+
+Finished LCLint checking --- 1 code error found, as expected
diff --git a/test/tests2.2.out b/test/tests2.2.out
new file mode 100644
index 0000000..639a551
--- /dev/null
+++ b/test/tests2.2.out
@@ -0,0 +1,78 @@
+
+boolops.c: (in function main)
+boolops.c:12:3: Assignment of int to Kzam: b = 12
+
+Finished LCLint checking --- 1 code error found, as expected
+
+mbool.h:1:17: Type implemented as macro: bool
+
+Finished LCLint checking --- 1 code error found, as expected
+
+boolenum.c: (in function main)
+boolenum.c:11:8: Use of == with BOOLEAN variables (risks inconsistency because
+                    of multiple true values): a == TRUE
+
+Finished LCLint checking --- 1 code error found, as expected
+
+break.c: (in function f)
+break.c:9:4: Dereference of possibly null pointer x: *x
+   break.c:1:24: Storage x may become null
+
+Finished LCLint checking --- 1 code error found, as expected
+
+bstring.c:4:14: Initial value of s4[0] is type char *, expects char: "hullo"
+bstring.c:4:23: Initial value of s4[1] is type char *, expects char: "g'bye"
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+decl.c:3:21: Structure struct tm declared with fields { int x; }, specified
+                with fields { int tm_sec; int tm_min; int tm_hour;, ... }
+   load file ansi.lcd: Specification of struct tm
+   decl.c:3:17: Field tm_sec in specified corresponds to x in declaration
+   load file ansi.lcd: Specification of tm_sec
+
+Finished LCLint checking --- 1 code error found, as expected
+
+enumbool.c:1:34: Member of boolean enumerated type definition does not match
+                    name set to represent TRUE or FALSE: false
+enumbool.c:1:34: Member of boolean enumerated type definition does not match
+                    name set to represent TRUE or FALSE: true
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+extension.c:3:1: Parse Error. (For help on parse errors, see lclint -help
+               parseerrors.)
+*** Cannot continue.
+
+Finished LCLint checking --- no code errors found
+
+nestext.c: (in function f)
+nestext.c:3:26: Declaration using extern inside function scope: int test(void)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+Finished LCLint checking --- no code errors found
+
+sizeofarray.c:1:12: Function parameter x declared as manifest array (size
+                       constant is meaningless)
+sizeofarray.c: (in function f)
+sizeofarray.c:5:13: Parameter to sizeof is an array-type function parameter:
+                       sizeof((x))
+sizeofarray.c:10:16: Return value type size_t does not match declared type int:
+                        sizeof((a))
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+rex.c: (in function main)
+rex.c:19:12: Only storage re.parent (type struct rx_hash *) derived from
+                variable declared in this scope is not released (memory leak)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+struct.c:13:6: Function main declared to return void, should return int
+
+Finished LCLint checking --- 1 code error found, as expected
diff --git a/test/tests2.2/arbints.c b/test/tests2.2/arbints.c
new file mode 100644
index 0000000..32bff69
--- /dev/null
+++ b/test/tests2.2/arbints.c
@@ -0,0 +1,34 @@
+typedef /*@integraltype@*/ a_int;
+typedef /*@unsignedintegraltype@*/ u_int;
+typedef /*@signedintegraltype@*/ s_int;
+
+int f (a_int a, u_int u, s_int s)
+{
+  unsigned long ul;
+  long l;
+  
+  printf ("the values are: %d %ld %ud", a, u, s); /* expect 3 errors */
+  ul = a; /* Assignment of a_int to unsigned long int: ul = a */
+
+  /*@+longunsignedintegral@*/
+  ul = a;
+
+  /*@+longintegral@*/
+  ul = a;
+
+  if (u == a) printf ("yo!");
+
+  /*@+matchanyintegral@*/
+  if (u == l) printf ("yo!");
+  if (u == a) printf ("yo!");
+  /*@=matchanyintegral@*/
+
+  /*@+longsignedintegral@*/
+  printf ("i'm okay: %ld", s);
+
+  /*@+longunsignedunsignedintegral@*/
+  printf ("you're not! %ld", u);
+  printf ("you're not! %ud", u);
+
+  return a;
+}
diff --git a/test/tests2.2/arrayfcn.c b/test/tests2.2/arrayfcn.c
new file mode 100644
index 0000000..50c78f2
--- /dev/null
+++ b/test/tests2.2/arrayfcn.c
@@ -0,0 +1,6 @@
+char *text (int i);
+
+int main (void)
+{
+  printf ("%s", text[i]);
+}
diff --git a/test/tests2.2/bool.lcl b/test/tests2.2/bool.lcl
new file mode 100644
index 0000000..3046dcc
--- /dev/null
+++ b/test/tests2.2/bool.lcl
@@ -0,0 +1 @@
+immutable type bool;
\ No newline at end of file
diff --git a/test/tests2.2/bool.lcs b/test/tests2.2/bool.lcs
new file mode 100644
index 0000000..965719a
--- /dev/null
+++ b/test/tests2.2/bool.lcs
@@ -0,0 +1,119 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLSymbolTableEnd
diff --git a/test/tests2.2/booldef.c b/test/tests2.2/booldef.c
new file mode 100644
index 0000000..97cdfd2
--- /dev/null
+++ b/test/tests2.2/booldef.c
@@ -0,0 +1 @@
+# include "mbool.h"
diff --git a/test/tests2.2/boolenum.c b/test/tests2.2/boolenum.c
new file mode 100644
index 0000000..e054d46
--- /dev/null
+++ b/test/tests2.2/boolenum.c
@@ -0,0 +1,20 @@
+typedef enum {
+        FALSE = 0,
+        TRUE = 1
+} BOOLEAN;
+
+int
+main ()
+{
+   BOOLEAN a = TRUE;
+
+   if (a == TRUE) {
+       return 1; 
+   } else {
+       return 0;
+   }
+}
+
+
+
+
diff --git a/test/tests2.2/boolops.c b/test/tests2.2/boolops.c
new file mode 100644
index 0000000..1a21de0
--- /dev/null
+++ b/test/tests2.2/boolops.c
@@ -0,0 +1,21 @@
+/*@-booltype Kzam@*/
+typedef int Kzam;
+
+enum { TRUE, FALSE } ;
+
+int main() {
+  Kzam b = TRUE;
+  Kzam b1 = b;
+
+  b = TRUE;
+  b = b1;
+  b = 12; /* Assignment of int to Kzam: b = 12 */
+
+  b = TRUE && FALSE;
+  b = b && FALSE;
+  b = FALSE && b;
+
+  if ((b && FALSE) == 0)
+    return(0);
+  return(0);
+}
diff --git a/test/tests2.2/break.c b/test/tests2.2/break.c
new file mode 100644
index 0000000..3ea0072
--- /dev/null
+++ b/test/tests2.2/break.c
@@ -0,0 +1,11 @@
+int f (/*@null@*/ int *x)
+{
+  while (3 > 4)
+    {
+      if (x == NULL) continue; 
+      *x = 3;
+    }
+
+  *x = 3;
+  return 5;
+}
diff --git a/test/tests2.2/bstring.c b/test/tests2.2/bstring.c
new file mode 100644
index 0000000..1ef3c17
--- /dev/null
+++ b/test/tests2.2/bstring.c
@@ -0,0 +1,4 @@
+char *s1 = { "hullo" } ;
+char *s2 = "hullo";
+char *s3 = { 'h', 'u', 'l', 'l', 'o' };
+char *s4 = { "hullo", "g'bye" } ;
diff --git a/test/tests2.2/decl.c b/test/tests2.2/decl.c
new file mode 100644
index 0000000..cbeb127
--- /dev/null
+++ b/test/tests2.2/decl.c
@@ -0,0 +1,8 @@
+# include 
+
+struct tm { int x; }
+
+int f (struct tm s)
+{
+  return s.x;
+}
diff --git a/test/tests2.2/enumbool.c b/test/tests2.2/enumbool.c
new file mode 100644
index 0000000..76b49dd
--- /dev/null
+++ b/test/tests2.2/enumbool.c
@@ -0,0 +1,13 @@
+typedef enum { false = 0, true } bool;
+
+bool f (bool b)
+{
+  if (b)
+    {
+      return ( 3 > 4);
+    }
+  else
+    {
+      return false;
+    }
+}
diff --git a/test/tests2.2/extension.c b/test/tests2.2/extension.c
new file mode 100644
index 0000000..1c1a850
--- /dev/null
+++ b/test/tests2.2/extension.c
@@ -0,0 +1,2 @@
+extern void __eprintf (const char *, const char *, unsigned, const char *)
+    __attribute__ ((noreturn));
diff --git a/test/tests2.2/libraries.c b/test/tests2.2/libraries.c
new file mode 100644
index 0000000..ac62d31
--- /dev/null
+++ b/test/tests2.2/libraries.c
@@ -0,0 +1,3 @@
+# include "sys/types.h"
+
+dev_t x = 3;
diff --git a/test/tests2.2/libraries.lcd b/test/tests2.2/libraries.lcd
new file mode 100644
index 0000000..a4c4dc1
--- /dev/null
+++ b/test/tests2.2/libraries.lcd
@@ -0,0 +1,2068 @@
+;;LCLint Dump: libraries.lcd
+;;LCLint 2.3h --- 02 Sep 97
+;;lib:167
+;;ctTable
+0 u-2 17 34
+0 p1|-2 18 35
+0 b-2 19 36
+0 p3|-2 20 37
+0 p4|-2 21 38
+0 p5|-2 22 39
+0 p6|-2 23 40
+0 p7|-2 24 41
+0 p8|-2 25 42
+0 p9|-2 26 43
+0 p10|-2 27 44
+0 p11|-2 28 45
+0 p12|-2 29 46
+0 p13|-2 30 47
+0 p14|-2 31 48
+0 p15|-2 32 49
+0 p16|-2 33 50
+1 t0|0 501 1497
+1 t1|1&
+1 t2|2&
+1 t3|3&
+1 t4|4 502 1498
+1 t5|5&
+1 t6|6&
+1 t7|7&
+1 t8|8&
+1 t9|9&
+1 t10|10&
+1 t11|11&
+1 t12|12&
+1 t13|13&
+1 t14|14&
+1 t15|15&
+1 t16|16&
+2 y0|0&
+2 y1|1&
+2 y2|2&
+2 y3|3&
+2 y4|4&
+2 y5|5&
+2 y6|6&
+2 y7|7&
+2 y8|8&
+2 y9|9&
+2 y10|10&
+2 y11|11&
+2 y12|12&
+2 y13|13&
+2 y14|14&
+2 y15|15&
+2 y16|16&
+-2 ?!
+0 s2|&
+0 s3|&
+0 s19|&
+0 s20|&
+0 s4|-1 622 -1
+0 s5|&
+0 a0|-1 657 -1
+3 C0.5/18|!
+3 C0.59/2|!
+3 C0.5/2|!
+3 f0 (61|@7|$#,)^63
+1 t62|62&
+3 f1 (61|@7|$#,)^65
+1 t64|64&
+3 C0.5/4|!
+3 C0.6/4|!
+3 f0 (67|$#,)^69
+1 t68|68&
+3 f5 (67|$#,)^71
+1 t70|70&
+3 f61 (67|$#,)^73
+1 t72|72&
+3 f0 (67|$#,)^75
+1 t74|74&
+3 f5 (67|$#,)^77
+1 t76|76&
+3 f61 (67|$#,)^79
+1 t78|78&
+3 f0 (67|$#,)^81
+1 t80|80&
+3 f5 (67|$#,)^83
+1 t82|82&
+3 f61 (67|$#,)^85
+1 t84|84&
+3 C0.6/4|!
+3 f0 (86|$#,)^88
+1 t87|87&
+3 f5 (86|$#,)^90
+1 t89|89&
+3 f61 (86|$#,)^92
+1 t91|91&
+3 f0 (86|$#,)^94
+1 t93|93&
+3 f5 (86|$#,)^96
+1 t95|95&
+3 f61 (86|$#,)^98
+1 t97|97&
+3 f0 (86|$#,)^100
+1 t99|99&
+3 f5 (86|$#,)^102
+1 t101|101&
+3 f61 (86|$#,)^104
+1 t103|103&
+3 C0.6/4|!
+3 f0 (105|$#,)^107
+1 t106|106&
+3 f5 (105|$#,)^109
+1 t108|108&
+3 f61 (105|$#,)^111
+1 t110|110&
+3 f0 (105|$#,)^113
+1 t112|112&
+3 f5 (105|$#,)^115
+1 t114|114&
+3 f61 (105|$#,)^117
+1 t116|116&
+3 f0 (105|$#,)^119
+1 t118|118&
+3 f5 (105|$#,)^121
+1 t120|120&
+3 f61 (105|$#,)^123
+1 t122|122&
+3 C0.6/4|!
+3 f0 (124|$#,)^126
+1 t125|125&
+3 f5 (124|$#,)^128
+1 t127|127&
+3 f61 (124|$#,)^130
+1 t129|129&
+3 f0 (124|$#,)^132
+1 t131|131&
+3 f5 (124|$#,)^134
+1 t133|133&
+3 f61 (124|$#,)^136
+1 t135|135&
+3 f0 (124|$#,)^138
+1 t137|137&
+3 f5 (124|$#,)^140
+1 t139|139&
+3 f66 (124|$#,)^142
+1 t141|141&
+3 C0.6/4|!
+3 f0 (143|$#,)^145
+1 t144|144&
+3 f5 (143|$#,)^147
+1 t146|146&
+3 f66 (143|$#,)^149
+1 t148|148&
+3 Slconv{21|@1|0@0@3&#decimal_point,21|@1|0@0@3&#thousands_sep,21|@1|0@0@3&#grouping,21|@1|0@0@3&#int_curr_symbol,21|@1|0@0@3&#currency_symbol,21|@1|0@0@3&#mon_decimal_point,21|@1|0@0@3&#mon_thousands_sep,21|@1|0@0@3&#mon_grouping,21|@1|0@0@3&#positive_sign,21|@1|0@0@3&#negative_sign,4|@1|$#int_frac_digits,4|@1|$#frac_digits,4|@1|$#p_cs_precedes,4|@1|$#p_sep_by_space,4|@1|$#n_cs_precedes,4|@1|$#n_sep_by_space,4|@1|$#p_sign_posn,4|@1|$#n_sign_posn,}!
+0 s675|-1 162 -1
+3 f0 (5|$#,21|0@5@7&#,)^153
+1 t152|152&
+3 f17 (5|$#,21|0@5@7&#,)^155
+1 t154|154&
+3 f21 (5|$#,21|0@5@7&#,)^157
+1 t156|156&
+3 f0 (1|$#,)^159
+1 t158|158&
+3 f17 (1|$#,)^161
+1 t160|160&
+1 t151|151&
+3 f162 (1|$#,)^164
+1 t163|163&
+3 f0 (15|$#,)^166
+1 t165|165&
+3 f15 (15|$#,)^168
+1 t167|167&
+3 f0 (15|$#,)^170
+1 t169|169&
+3 f15 (15|$#,)^172
+1 t171|171&
+3 f0 (15|$#,)^174
+1 t173|173&
+3 f15 (15|$#,)^176
+1 t175|175&
+3 f0 (15|$#,)^178
+1 t177|177&
+3 f15 (15|$#,)^180
+1 t179|179&
+3 f0 (15|$#,)^182
+1 t181|181&
+3 f15 (15|$#,)^184
+1 t183|183&
+3 f0 (15|$#,)^186
+1 t185|185&
+3 f15 (15|$#,)^188
+1 t187|187&
+3 f0 (15|$#,15|$#,)^190
+1 t189|189&
+3 f15 (15|$#,15|$#,)^192
+1 t191|191&
+3 f0 (15|$#,)^194
+1 t193|193&
+3 f15 (15|$#,)^196
+1 t195|195&
+3 f0 (15|$#,)^198
+1 t197|197&
+3 f15 (15|$#,)^200
+1 t199|199&
+3 f0 (15|$#,)^202
+1 t201|201&
+3 f15 (15|$#,)^204
+1 t203|203&
+3 f0 (15|$#,)^206
+1 t205|205&
+3 f15 (15|$#,)^208
+1 t207|207&
+3 f0 (15|$#,5|$#,)^210
+1 t209|209&
+3 f15 (15|$#,5|$#,)^212
+1 t211|211&
+3 f0 (15|$#,22|4@0@7&#,)^214
+1 t213|213&
+3 f15 (15|$#,22|4@0@7&#,)^216
+1 t215|215&
+3 f0 (15|$#,)^218
+1 t217|217&
+3 f15 (15|$#,)^220
+1 t219|219&
+3 f0 (15|$#,)^222
+1 t221|221&
+3 f15 (15|$#,)^224
+1 t223|223&
+3 f0 (15|$#,15|$#,)^226
+1 t225|225&
+3 f15 (15|$#,15|$#,)^228
+1 t227|227&
+3 f0 (15|$#,)^230
+1 t229|229&
+3 f15 (15|$#,)^232
+1 t231|231&
+3 f0 (15|$#,)^234
+1 t233|233&
+3 f15 (15|$#,)^236
+1 t235|235&
+3 f0 (15|$#,)^238
+1 t237|237&
+3 f15 (15|$#,)^240
+1 t239|239&
+3 f0 (15|$#,)^242
+1 t241|241&
+3 f15 (15|$#,)^244
+1 t243|243&
+3 f0 (15|$#,32|4@0@7&#,)^246
+1 t245|245&
+3 f15 (15|$#,32|4@0@7&#,)^248
+1 t247|247&
+3 f0 (15|$#,15|$#,)^250
+1 t249|249&
+3 f15 (15|$#,15|$#,)^252
+1 t251|251&
+0 a21|&
+3 f0 (253|4@0@7&#,)^255
+1 t254|254&
+3 f5 (253|4@0@7&#,)^257
+1 t256|256&
+3 f0 (253|$#,5|$#,)^259
+1 t258|258&
+3 f1 (253|$#,5|$#,)^261
+1 t260|260&
+0 s6|&
+3 ?!
+3 f263 (5|$#,)^265
+1 t264|264&
+3 f1 (5|$#,)^267
+1 t266|266&
+3 ?!
+3 f268 (5|$#,)^270
+1 t269|269&
+3 f1 (5|$#,)^272
+1 t271|271&
+3 ?!
+3 f273 (5|$#,)^275
+1 t274|274&
+3 f1 (5|$#,)^277
+1 t276|276&
+3 ?!
+3 ?!
+3 f279 (5|$#,)^281
+1 t280|280&
+3 f1 (5|$#,)^283
+1 t282|282&
+3 f278 (5|$#,283|0@5@7&#,)^285
+1 t284|284&
+3 f1 (5|$#,283|0@5@7&#,)^287
+1 t286|286&
+3 f0 (5|$#,)^289
+1 t288|288&
+3 f5 (5|$#,)^291
+1 t290|290&
+0 a22|&
+3 f0 (292|4@0@7&#,!.,)^294
+1 t293|293&
+3 f1 (292|4@0@7&#,!.,)^296
+1 t295|295&
+3 f0 (292|$#,)^298
+1 t297|297&
+3 f1 (292|$#,)^300
+1 t299|299&
+0 a23|-1 303 -1
+0 a24|-1 452 -1
+1 t301|301&
+3 f0 (21|$#,)^305
+1 t304|304&
+3 f5 (21|$#,)^307
+1 t306|306&
+3 f0 (21|$#,21|$#,)^309
+1 t308|308&
+3 f5 (21|$#,21|$#,)^311
+1 t310|310&
+3 f0 (1|$#,)^313
+1 t312|312&
+3 f17 (1|$#,)^315
+1 t314|314&
+3 f303 (1|$#,)^317
+1 t316|316&
+3 f0 (21|@5|4@5@7&#,)^319
+1 t318|318&
+3 f17 (21|@5|4@5@7&#,)^321
+1 t320|320&
+3 f21 (21|@5|4@5@7&#,)^323
+1 t322|322&
+3 f0 (303|$#,)^325
+1 t324|324&
+3 f5 (303|$#,)^327
+1 t326|326&
+3 f0 (303|0@5@7&#,)^329
+1 t328|328&
+3 f5 (303|0@5@7&#,)^331
+1 t330|330&
+3 f0 (21|$#,21|$#,)^333
+1 t332|332&
+3 f17 (21|$#,21|$#,)^335
+1 t334|334&
+3 f303 (21|$#,21|$#,)^337
+1 t336|336&
+3 f0 (21|$#,21|$#,303|$#,)^339
+1 t338|338&
+3 f17 (21|$#,21|$#,303|$#,)^341
+1 t340|340&
+3 f303 (21|$#,21|$#,303|$#,)^343
+1 t342|342&
+3 f0 (303|$#,21|0@5@19@2@0#,)^345
+1 t344|344&
+3 f1 (303|$#,21|0@5@19@2@0#,)^347
+1 t346|346&
+3 f0 (303|$#,21|0@5@19@2@0#,5|$#,54|$#,)^349
+1 t348|348&
+3 f5 (303|$#,21|0@5@19@2@0#,5|$#,54|$#,)^351
+1 t350|350&
+3 C0.5/1|!
+3 f0 (303|$#,21|$#,!.,)^354
+1 t353|353&
+3 f5 (303|$#,21|$#,!.,)^356
+1 t355|355&
+3 f352 (303|$#,21|$#,!.,)^358
+1 t357|357&
+3 f0 (303|$#,21|$#,!.,)^360
+1 t359|359&
+3 f5 (303|$#,21|$#,!.,)^362
+1 t361|361&
+3 f0 (21|$#,!.,)^364
+1 t363|363&
+3 f5 (21|$#,!.,)^366
+1 t365|365&
+3 f352 (21|$#,!.,)^368
+1 t367|367&
+3 f0 (21|$#,!.,)^370
+1 t369|369&
+3 f5 (21|$#,!.,)^372
+1 t371|371&
+3 C0.5/1|!
+3 f0 (21|4@0@7&#,21|$#,!.,)^375
+1 t374|374&
+3 f5 (21|4@0@7&#,21|$#,!.,)^377
+1 t376|376&
+3 f373 (21|4@0@7&#,21|$#,!.,)^379
+1 t378|378&
+3 f0 (21|4@0@7&#,21|$#,!.,)^381
+1 t380|380&
+3 f5 (21|4@0@7&#,21|$#,!.,)^383
+1 t382|382&
+3 f0 (303|$#,21|$#,292|$#,)^385
+1 t384|384&
+3 f5 (303|$#,21|$#,292|$#,)^387
+1 t386|386&
+3 f0 (21|$#,292|$#,)^389
+1 t388|388&
+3 f5 (21|$#,292|$#,)^391
+1 t390|390&
+3 f0 (21|4@0@7&#,21|$#,292|$#,)^393
+1 t392|392&
+3 f5 (21|4@0@7&#,21|$#,292|$#,)^395
+1 t394|394&
+3 f0 (303|$#,)^397
+1 t396|396&
+3 f5 (303|$#,)^399
+1 t398|398&
+3 f0 (21|@5|4@0@7&#,5|$#,303|$#,)^401
+1 t400|400&
+3 f17 (21|@5|4@0@7&#,5|$#,303|$#,)^403
+1 t402|402&
+3 f21 (21|@5|4@0@7&#,5|$#,303|$#,)^405
+1 t404|404&
+3 f0 (66|$#,303|$#,)^407
+1 t406|406&
+3 f5 (66|$#,303|$#,)^409
+1 t408|408&
+3 f0 (21|$#,303|$#,)^411
+1 t410|410&
+3 f5 (21|$#,303|$#,)^413
+1 t412|412&
+3 f0 (303|@7|$#,)^415
+1 t414|414&
+3 f5 (303|@7|$#,)^417
+1 t416|416&
+3 f0 (1|$#,)^419
+1 t418|418&
+3 f5 (1|$#,)^421
+1 t420|420&
+3 f0 (21|4@0@7&#,)^423
+1 t422|422&
+3 f17 (21|4@0@7&#,)^425
+1 t424|424&
+3 f21 (21|4@0@7&#,)^427
+1 t426|426&
+3 f0 (66|$#,303|@7|$#,)^429
+1 t428|428&
+3 f5 (66|$#,303|@7|$#,)^431
+1 t430|430&
+3 f0 (66|$#,)^433
+1 t432|432&
+3 f5 (66|$#,)^435
+1 t434|434&
+3 f0 (21|$#,)^437
+1 t436|436&
+3 f5 (21|$#,)^439
+1 t438|438&
+3 f0 (66|$#,303|$#,)^441
+1 t440|440&
+3 f5 (66|$#,303|$#,)^443
+1 t442|442&
+3 f0 (18|4@0@7&#,54|$#,54|$#,303|$#,)^445
+1 t444|444&
+3 f54 (18|4@0@7&#,54|$#,54|$#,303|$#,)^447
+1 t446|446&
+3 f0 (18|$#,54|$#,54|$#,303|$#,)^449
+1 t448|448&
+3 f54 (18|$#,54|$#,54|$#,303|$#,)^451
+1 t450|450&
+1 t302|302&
+3 f0 (303|$#,452|4@0@7&#,)^454
+1 t453|453&
+3 f5 (303|$#,452|4@0@7&#,)^456
+1 t455|455&
+3 f0 (303|$#,9|$#,5|$#,)^458
+1 t457|457&
+3 f5 (303|$#,9|$#,5|$#,)^460
+1 t459|459&
+3 f0 (303|$#,452|$#,)^462
+1 t461|461&
+3 f5 (303|$#,452|$#,)^464
+1 t463|463&
+3 f0 (303|$#,)^466
+1 t465|465&
+3 f9 (303|$#,)^468
+1 t467|467&
+3 f0 (303|$#,)^470
+1 t469|469&
+3 f1 (303|$#,)^472
+1 t471|471&
+3 f0 (303|$#,)^474
+1 t473|473&
+3 f1 (303|$#,)^476
+1 t475|475&
+3 f0 (303|$#,)^478
+1 t477|477&
+3 f5 (303|$#,)^480
+1 t479|479&
+3 f0 (303|$#,)^482
+1 t481|481&
+3 f5 (303|$#,)^484
+1 t483|483&
+3 f0 (21|0@5@7&#,)^486
+1 t485|485&
+3 f1 (21|0@5@7&#,)^488
+1 t487|487&
+3 f0 (21|$#,)^490
+1 t489|489&
+3 f15 (21|$#,)^492
+1 t491|491&
+3 f0 (21|$#,)^494
+1 t493|493&
+3 f5 (21|$#,)^496
+1 t495|495&
+3 f0 (21|$#,)^498
+1 t497|497&
+3 f9 (21|$#,)^500
+1 t499|499&
+1 t17|17&
+1 t21|21&
+3 f0 (21|$#,502|4@5@7&#,)^504
+1 t503|503&
+3 f15 (21|$#,502|4@5@7&#,)^506
+1 t505|505&
+3 f0 (21|$#,502|4@5@7&#,5|$#,)^508
+1 t507|507&
+3 f9 (21|$#,502|4@5@7&#,5|$#,)^510
+1 t509|509&
+3 f0 (21|$#,502|4@5@7&#,5|$#,)^512
+1 t511|511&
+3 f10 (21|$#,502|4@5@7&#,5|$#,)^514
+1 t513|513&
+3 f0 (1|$#,)^516
+1 t515|515&
+3 f5 (1|$#,)^518
+1 t517|517&
+3 f0 (6|$#,)^520
+1 t519|519&
+3 f1 (6|$#,)^522
+1 t521|521&
+3 f0 (54|$#,54|$#,)^524
+1 t523|523&
+3 f17 (54|$#,54|$#,)^526
+1 t525|525&
+3 f18 (54|$#,54|$#,)^528
+1 t527|527&
+3 f0 (54|$#,)^530
+1 t529|529&
+3 f17 (54|$#,)^532
+1 t531|531&
+3 f18 (54|$#,)^534
+1 t533|533&
+3 f0 (18|@5|4@5@2&#,54|$#,)^536
+1 t535|535&
+3 f17 (18|@5|4@5@2&#,54|$#,)^538
+1 t537|537&
+3 f18 (18|@5|4@5@2&#,54|$#,)^540
+1 t539|539&
+3 f0 (18|4@5@2&#,)^542
+1 t541|541&
+3 f1 (18|4@5@2&#,)^544
+1 t543|543&
+3 f0 (1|$#,)^546
+1 t545|545&
+3 f1 (1|$#,)^548
+1 t547|547&
+3 f0 (5|$#,)^550
+1 t549|549&
+3 f1 (5|$#,)^552
+1 t551|551&
+3 ?!
+3 f553 (1|$#,)^555
+1 t554|554&
+3 f1 (1|$#,)^557
+1 t556|556&
+3 f0 (557|$#,)^559
+1 t558|558&
+3 f5 (557|$#,)^561
+1 t560|560&
+3 f0 (21|$#,)^563
+1 t562|562&
+3 f17 (21|$#,)^565
+1 t564|564&
+3 f21 (21|$#,)^567
+1 t566|566&
+3 f0 (21|0@5@7&#,)^569
+1 t568|568&
+3 f5 (21|0@5@7&#,)^571
+1 t570|570&
+3 ?!
+3 f572 (18|$#,18|$#,)^574
+1 t573|573&
+3 f5 (18|$#,18|$#,)^576
+1 t575|575&
+3 f0 (18|$#,18|$#,54|$#,54|$#,576|$#,)^578
+1 t577|577&
+3 f17 (18|$#,18|$#,54|$#,54|$#,576|$#,)^580
+1 t579|579&
+3 f18 (18|$#,18|$#,54|$#,54|$#,576|$#,)^582
+1 t581|581&
+3 ?!
+3 f583 (18|$#,18|$#,)^585
+1 t584|584&
+3 f5 (18|$#,18|$#,)^587
+1 t586|586&
+3 f0 (18|$#,54|$#,54|$#,587|$#,)^589
+1 t588|588&
+3 f1 (18|$#,54|$#,54|$#,587|$#,)^591
+1 t590|590&
+3 f0 (5|$#,)^593
+1 t592|592&
+3 f5 (5|$#,)^595
+1 t594|594&
+3 S!2{5|@1|$#quot,5|@1|$#rem,}!
+0 s664|&
+0 s27|&
+3 f0 (5|$#,5|$#,)^600
+1 t599|599&
+3 f598 (5|$#,5|$#,)^602
+1 t601|601&
+3 f0 (9|$#,)^604
+1 t603|603&
+3 f9 (9|$#,)^606
+1 t605|605&
+3 S!3{9|@1|$#quot,9|@1|$#rem,}!
+0 s665|&
+0 s28|&
+3 f0 (9|$#,9|$#,)^611
+1 t610|610&
+3 f609 (9|$#,9|$#,)^613
+1 t612|612&
+3 f0 (5|$#,)^615
+1 t614|614&
+3 f57 (5|$#,)^617
+1 t616|616&
+3 f0 (303|$#,)^619
+1 t618|618&
+3 f57 (303|$#,)^621
+1 t620|620&
+1 t56|56 781 -1
+3 f0 (622|@5|$#,5|$#,303|$#,)^624
+1 t623|623&
+3 f17 (622|@5|$#,5|$#,303|$#,)^626
+1 t625|625&
+3 f622 (622|@5|$#,5|$#,303|$#,)^628
+1 t627|627&
+3 f0 (56|$#,303|$#,)^630
+1 t629|629&
+3 f57 (56|$#,303|$#,)^632
+1 t631|631&
+3 f0 (622|$#,303|$#,)^634
+1 t633|633&
+3 f5 (622|$#,303|$#,)^636
+1 t635|635&
+3 f0 (303|$#,5|$#,)^638
+1 t637|637&
+3 f5 (303|$#,5|$#,)^640
+1 t639|639&
+3 f0 (303|$#,622|$#,!.,)^642
+1 t641|641&
+3 f5 (303|$#,622|$#,!.,)^644
+1 t643|643&
+3 f0 (303|$#,622|$#,!.,)^646
+1 t645|645&
+3 f5 (303|$#,622|$#,!.,)^648
+1 t647|647&
+3 f0 (303|@7|$#,)^650
+1 t649|649&
+3 f57 (303|@7|$#,)^652
+1 t651|651&
+3 f0 (1|$#,)^654
+1 t653|653&
+3 f57 (1|$#,)^656
+1 t655|655&
+1 t58|58&
+3 f0 (21|$#,54|$#,657|0@5@7&#,)^659
+1 t658|658&
+3 f54 (21|$#,54|$#,657|0@5@7&#,)^661
+1 t660|660&
+3 f0 (622|0@5@7&#,21|$#,54|$#,657|0@5@7&#,)^663
+1 t662|662&
+3 f54 (622|0@5@7&#,21|$#,54|$#,657|0@5@7&#,)^665
+1 t664|664&
+3 f0 (657|0@5@7&#,)^667
+1 t666|666&
+3 f5 (657|0@5@7&#,)^669
+1 t668|668&
+3 f0 (622|0@5@7&#,502|$#,54|$#,657|0@5@7&#,)^671
+1 t670|670&
+3 f54 (622|0@5@7&#,502|$#,54|$#,657|0@5@7&#,)^673
+1 t672|672&
+3 f0 (56|$#,303|@7|$#,)^675
+1 t674|674&
+3 f57 (56|$#,303|@7|$#,)^677
+1 t676|676&
+3 f0 (56|$#,)^679
+1 t678|678&
+3 f57 (56|$#,)^681
+1 t680|680&
+3 f0 (622|$#,54|$#,622|$#,!.,)^683
+1 t682|682&
+3 f5 (622|$#,54|$#,622|$#,!.,)^685
+1 t684|684&
+3 f0 (622|$#,622|$#,!.,)^687
+1 t686|686&
+3 f5 (622|$#,622|$#,!.,)^689
+1 t688|688&
+3 f0 (57|$#,303|$#,)^691
+1 t690|690&
+3 f57 (57|$#,303|$#,)^693
+1 t692|692&
+3 f0 (303|$#,622|$#,292|$#,)^695
+1 t694|694&
+3 f5 (303|$#,622|$#,292|$#,)^697
+1 t696|696&
+3 f0 (622|$#,54|$#,622|$#,292|$#,)^699
+1 t698|698&
+3 f5 (622|$#,54|$#,622|$#,292|$#,)^701
+1 t700|700&
+3 f0 (622|$#,292|$#,)^703
+1 t702|702&
+3 f5 (622|$#,292|$#,)^705
+1 t704|704&
+3 f0 (21|4@5@7&#,56|$#,657|0@5@7&#,)^707
+1 t706|706&
+3 f54 (21|4@5@7&#,56|$#,657|0@5@7&#,)^709
+1 t708|708&
+3 C0.1/622|!
+3 f0 (622|@5|4@0@9&#,622|$#,)^712
+1 t711|711&
+3 f1 (622|@5|4@0@9&#,622|$#,)^714
+1 t713|713&
+3 f710 (622|@5|4@0@9&#,622|$#,)^716
+1 t715|715&
+3 f0 (622|@5|$#,56|$#,)^718
+1 t717|717&
+3 f17 (622|@5|$#,56|$#,)^720
+1 t719|719&
+3 f622 (622|@5|$#,56|$#,)^722
+1 t721|721&
+3 f0 (622|$#,622|$#,)^724
+1 t723|723&
+3 f5 (622|$#,622|$#,)^726
+1 t725|725&
+3 f0 (622|$#,622|$#,)^728
+1 t727|727&
+3 f5 (622|$#,622|$#,)^730
+1 t729|729&
+3 C0.1/622|!
+3 f0 (622|@5|4@0@9&#,622|$#,)^733
+1 t732|732&
+3 f1 (622|@5|4@0@9&#,622|$#,)^735
+1 t734|734&
+3 f731 (622|@5|4@0@9&#,622|$#,)^737
+1 t736|736&
+3 f0 (622|$#,622|$#,)^739
+1 t738|738&
+3 f54 (622|$#,622|$#,)^741
+1 t740|740&
+0 s673|-1 743 -1
+1 t742|742&
+3 f0 (622|4@0@7&#,54|$#,622|$#,743|$#,)^745
+1 t744|744&
+3 f54 (622|4@0@7&#,54|$#,622|$#,743|$#,)^747
+1 t746|746&
+3 f0 (622|$#,)^749
+1 t748|748&
+3 f54 (622|$#,)^751
+1 t750|750&
+3 C0.1/622|!
+3 f0 (622|@5|4@0@9&#,622|$#,54|$#,)^754
+1 t753|753&
+3 f1 (622|@5|4@0@9&#,622|$#,54|$#,)^756
+1 t755|755&
+3 f752 (622|@5|4@0@9&#,622|$#,54|$#,)^758
+1 t757|757&
+3 f0 (622|$#,622|$#,54|$#,)^760
+1 t759|759&
+3 f5 (622|$#,622|$#,54|$#,)^762
+1 t761|761&
+3 f0 (622|@5|4@0@9&#,622|$#,54|$#,)^764
+1 t763|763&
+3 f1 (622|@5|4@0@9&#,622|$#,54|$#,)^766
+1 t765|765&
+3 f752 (622|@5|4@0@9&#,622|$#,54|$#,)^768
+1 t767|767&
+3 f0 (622|@5|$#,622|$#,)^770
+1 t769|769&
+3 f17 (622|@5|$#,622|$#,)^772
+1 t771|771&
+3 f622 (622|@5|$#,622|$#,)^774
+1 t773|773&
+3 f0 (622|@5|$#,56|$#,)^776
+1 t775|775&
+3 f17 (622|@5|$#,56|$#,)^778
+1 t777|777&
+3 f622 (622|@5|$#,56|$#,)^780
+1 t779|779&
+1 t622|622&
+3 f0 (21|0@5@7&#,781|$#,54|$#,657|0@5@7&#,)^783
+1 t782|782&
+3 f54 (21|0@5@7&#,781|$#,54|$#,657|0@5@7&#,)^785
+1 t784|784&
+3 f0 (622|$#,622|$#,)^787
+1 t786|786&
+3 f54 (622|$#,622|$#,)^789
+1 t788|788&
+3 f0 (622|$#,622|$#,)^791
+1 t790|790&
+3 f17 (622|$#,622|$#,)^793
+1 t792|792&
+3 f622 (622|$#,622|$#,)^795
+1 t794|794&
+3 f0 (622|$#,781|0@5@7&#,)^797
+1 t796|796&
+3 f15 (622|$#,781|0@5@7&#,)^799
+1 t798|798&
+3 f0 (622|0@5@7&#,622|$#,781|$#,)^801
+1 t800|800&
+3 f17 (622|0@5@7&#,622|$#,781|$#,)^803
+1 t802|802&
+3 f622 (622|0@5@7&#,622|$#,781|$#,)^805
+1 t804|804&
+3 f0 (622|$#,781|0@5@7&#,5|$#,)^807
+1 t806|806&
+3 f9 (622|$#,781|0@5@7&#,5|$#,)^809
+1 t808|808&
+3 f0 (622|$#,781|0@5@7&#,5|$#,)^811
+1 t810|810&
+3 f10 (622|$#,781|0@5@7&#,5|$#,)^813
+1 t812|812&
+3 f0 (622|0@5@7&#,622|$#,54|$#,)^815
+1 t814|814&
+3 f54 (622|0@5@7&#,622|$#,54|$#,)^817
+1 t816|816&
+3 f0 (57|$#,)^819
+1 t818|818&
+3 f5 (57|$#,)^821
+1 t820|820&
+3 f0 (622|$#,56|$#,54|$#,)^823
+1 t822|822&
+3 f17 (622|$#,56|$#,54|$#,)^825
+1 t824|824&
+3 f622 (622|$#,56|$#,54|$#,)^827
+1 t826|826&
+3 f0 (622|$#,622|$#,54|$#,)^829
+1 t828|828&
+3 f5 (622|$#,622|$#,54|$#,)^831
+1 t830|830&
+3 f0 (622|@5|$#,622|$#,54|$#,)^833
+1 t832|832&
+3 f17 (622|@5|$#,622|$#,54|$#,)^835
+1 t834|834&
+3 f622 (622|@5|$#,622|$#,54|$#,)^837
+1 t836|836&
+3 f0 (622|@5|$#,622|$#,54|$#,)^839
+1 t838|838&
+3 f17 (622|@5|$#,622|$#,54|$#,)^841
+1 t840|840&
+3 f622 (622|@5|$#,622|$#,54|$#,)^843
+1 t842|842&
+3 f0 (622|@5|$#,56|$#,54|$#,)^845
+1 t844|844&
+3 f17 (622|@5|$#,56|$#,54|$#,)^847
+1 t846|846&
+3 f622 (622|@5|$#,56|$#,54|$#,)^849
+1 t848|848&
+3 f0 (622|$#,!.,)^851
+1 t850|850&
+3 f5 (622|$#,!.,)^853
+1 t852|852&
+3 f0 (622|$#,!.,)^855
+1 t854|854&
+3 f5 (622|$#,!.,)^857
+1 t856|856&
+0 s7|&
+0 s8|&
+3 f0 (57|$#,)^861
+1 t860|860&
+3 f5 (57|$#,)^863
+1 t862|862&
+3 f61 (57|$#,)^865
+1 t864|864&
+3 f0 (57|$#,)^867
+1 t866|866&
+3 f5 (57|$#,)^869
+1 t868|868&
+3 f61 (57|$#,)^871
+1 t870|870&
+3 f0 (57|$#,)^873
+1 t872|872&
+3 f5 (57|$#,)^875
+1 t874|874&
+3 f61 (57|$#,)^877
+1 t876|876&
+3 f0 (57|$#,858|$#,)^879
+1 t878|878&
+3 f5 (57|$#,858|$#,)^881
+1 t880|880&
+3 f61 (57|$#,858|$#,)^883
+1 t882|882&
+3 f0 (57|$#,)^885
+1 t884|884&
+3 f5 (57|$#,)^887
+1 t886|886&
+3 f61 (57|$#,)^889
+1 t888|888&
+3 f0 (57|$#,)^891
+1 t890|890&
+3 f5 (57|$#,)^893
+1 t892|892&
+3 f61 (57|$#,)^895
+1 t894|894&
+3 f0 (57|$#,)^897
+1 t896|896&
+3 f5 (57|$#,)^899
+1 t898|898&
+3 f61 (57|$#,)^901
+1 t900|900&
+3 f0 (57|$#,)^903
+1 t902|902&
+3 f5 (57|$#,)^905
+1 t904|904&
+3 f61 (57|$#,)^907
+1 t906|906&
+3 f0 (57|$#,)^909
+1 t908|908&
+3 f5 (57|$#,)^911
+1 t910|910&
+3 f61 (57|$#,)^913
+1 t912|912&
+3 f0 (57|$#,)^915
+1 t914|914&
+3 f5 (57|$#,)^917
+1 t916|916&
+3 f61 (57|$#,)^919
+1 t918|918&
+3 f0 (57|$#,)^921
+1 t920|920&
+3 f5 (57|$#,)^923
+1 t922|922&
+3 f61 (57|$#,)^925
+1 t924|924&
+3 f0 (57|$#,)^927
+1 t926|926&
+3 f5 (57|$#,)^929
+1 t928|928&
+3 f61 (57|$#,)^931
+1 t930|930&
+3 C0.5/57|!
+3 f0 (57|$#,859|$#,)^934
+1 t933|933&
+3 f5 (57|$#,859|$#,)^936
+1 t935|935&
+3 f932 (57|$#,859|$#,)^938
+1 t937|937&
+3 f0 (57|$#,)^940
+1 t939|939&
+3 f5 (57|$#,)^942
+1 t941|941&
+3 f932 (57|$#,)^944
+1 t943|943&
+3 f0 (57|$#,)^946
+1 t945|945&
+3 f5 (57|$#,)^948
+1 t947|947&
+3 C0.5/57|!
+3 f949 (57|$#,)^951
+1 t950|950&
+3 f0 (21|$#,)^953
+1 t952|952&
+3 f859 (21|$#,)^955
+1 t954|954&
+3 f0 (21|$#,)^957
+1 t956|956&
+3 f858 (21|$#,)^959
+1 t958|958&
+3 f0 (21|$#,54|$#,)^961
+1 t960|960&
+3 f5 (21|$#,54|$#,)^963
+1 t962|962&
+3 f0 (622|0@5@7&#,21|0@5@7&#,54|$#,)^965
+1 t964|964&
+3 f5 (622|0@5@7&#,21|0@5@7&#,54|$#,)^967
+1 t966|966&
+3 f0 (21|4@5@7&#,56|$#,)^969
+1 t968|968&
+3 f5 (21|4@5@7&#,56|$#,)^971
+1 t970|970&
+3 f0 (622|4@0@7&#,21|$#,54|$#,)^973
+1 t972|972&
+3 f54 (622|4@0@7&#,21|$#,54|$#,)^975
+1 t974|974&
+3 f0 (21|4@0@7&#,622|$#,54|$#,)^977
+1 t976|976&
+3 f54 (21|4@0@7&#,622|$#,54|$#,)^979
+1 t978|978&
+3 C0.1/18|!
+3 f0 (18|@5|4@0@9&#,18|$#,54|$#,)^982
+1 t981|981&
+3 f1 (18|@5|4@0@9&#,18|$#,54|$#,)^984
+1 t983|983&
+3 f980 (18|@5|4@0@9&#,18|$#,54|$#,)^986
+1 t985|985&
+3 f0 (18|@5|4@0@7&#,18|$#,54|$#,)^988
+1 t987|987&
+3 f1 (18|@5|4@0@7&#,18|$#,54|$#,)^990
+1 t989|989&
+3 f980 (18|@5|4@0@7&#,18|$#,54|$#,)^992
+1 t991|991&
+3 C0.1/21|!
+3 f0 (21|@5|4@0@9&#,21|$#,)^995
+1 t994|994&
+3 f1 (21|@5|4@0@9&#,21|$#,)^997
+1 t996|996&
+3 f993 (21|@5|4@0@9&#,21|$#,)^999
+1 t998|998&
+3 f0 (21|@5|4@0@9&#,21|$#,54|$#,)^1001
+1 t1000|1000&
+3 f1 (21|@5|4@0@9&#,21|$#,54|$#,)^1003
+1 t1002|1002&
+3 f993 (21|@5|4@0@9&#,21|$#,54|$#,)^1005
+1 t1004|1004&
+3 f0 (21|@5|4@0@9&#,21|$#,)^1007
+1 t1006|1006&
+3 f1 (21|@5|4@0@9&#,21|$#,)^1009
+1 t1008|1008&
+3 C0.1/21|!
+3 f1010 (21|@5|4@0@9&#,21|$#,)^1012
+1 t1011|1011&
+3 f0 (21|@5|4@0@9&#,21|$#,5|$#,)^1014
+1 t1013|1013&
+3 f1 (21|@5|4@0@9&#,21|$#,5|$#,)^1016
+1 t1015|1015&
+3 f1010 (21|@5|4@0@9&#,21|$#,5|$#,)^1018
+1 t1017|1017&
+3 f0 (18|$#,18|$#,54|$#,)^1020
+1 t1019|1019&
+3 f5 (18|$#,18|$#,54|$#,)^1022
+1 t1021|1021&
+3 f0 (21|$#,21|$#,)^1024
+1 t1023|1023&
+3 f5 (21|$#,21|$#,)^1026
+1 t1025|1025&
+3 f0 (21|$#,21|$#,)^1028
+1 t1027|1027&
+3 f5 (21|$#,21|$#,)^1030
+1 t1029|1029&
+3 f0 (21|$#,21|$#,54|$#,)^1032
+1 t1031|1031&
+3 f5 (21|$#,21|$#,54|$#,)^1034
+1 t1033|1033&
+3 f0 (21|4@5@7&#,21|$#,54|$#,)^1036
+1 t1035|1035&
+3 f54 (21|4@5@7&#,21|$#,54|$#,)^1038
+1 t1037|1037&
+3 f0 (18|$#,5|$#,54|$#,)^1040
+1 t1039|1039&
+3 f17 (18|$#,5|$#,54|$#,)^1042
+1 t1041|1041&
+3 f18 (18|$#,5|$#,54|$#,)^1044
+1 t1043|1043&
+3 f0 (21|@5|$#,66|$#,)^1046
+1 t1045|1045&
+3 f17 (21|@5|$#,66|$#,)^1048
+1 t1047|1047&
+3 f21 (21|@5|$#,66|$#,)^1050
+1 t1049|1049&
+3 f0 (21|$#,21|$#,)^1052
+1 t1051|1051&
+3 f54 (21|$#,21|$#,)^1054
+1 t1053|1053&
+3 f0 (21|@5|$#,21|$#,)^1056
+1 t1055|1055&
+3 f17 (21|@5|$#,21|$#,)^1058
+1 t1057|1057&
+3 f21 (21|@5|$#,21|$#,)^1060
+1 t1059|1059&
+3 f0 (21|@5|$#,66|$#,)^1062
+1 t1061|1061&
+3 f17 (21|@5|$#,66|$#,)^1064
+1 t1063|1063&
+3 f21 (21|@5|$#,66|$#,)^1066
+1 t1065|1065&
+3 f0 (21|$#,21|$#,)^1068
+1 t1067|1067&
+3 f54 (21|$#,21|$#,)^1070
+1 t1069|1069&
+3 f0 (21|@5|0@0@9&#,21|$#,)^1072
+1 t1071|1071&
+3 f17 (21|@5|0@0@9&#,21|$#,)^1074
+1 t1073|1073&
+3 f21 (21|@5|0@0@9&#,21|$#,)^1076
+1 t1075|1075&
+3 f0 (21|@5|0@5@7&#,21|$#,)^1078
+1 t1077|1077&
+3 f17 (21|@5|0@5@7&#,21|$#,)^1080
+1 t1079|1079&
+3 f21 (21|@5|0@5@7&#,21|$#,)^1082
+1 t1081|1081&
+3 C0.1/18|!
+3 f0 (18|@5|4@0@7&#,5|$#,54|$#,)^1085
+1 t1084|1084&
+3 f1 (18|@5|4@0@7&#,5|$#,54|$#,)^1087
+1 t1086|1086&
+3 f1083 (18|@5|4@0@7&#,5|$#,54|$#,)^1089
+1 t1088|1088&
+3 f0 (5|$#,)^1091
+1 t1090|1090&
+3 f17 (5|$#,)^1093
+1 t1092|1092&
+3 f21 (5|$#,)^1095
+1 t1094|1094&
+3 f0 (21|$#,)^1097
+1 t1096|1096&
+3 f54 (21|$#,)^1099
+1 t1098|1098&
+0 s9|&
+0 s10|-1 1115 -1
+3 Stm{5|@1|$#tm_sec,5|@1|$#tm_min,5|@1|$#tm_hour,5|@1|$#tm_mday,5|@1|$#tm_mon,5|@1|$#tm_year,5|@1|$#tm_wday,5|@1|$#tm_yday,5|@1|$#tm_isdst,}!
+3 f0 (1|$#,)^1104
+1 t1103|1103&
+3 f1100 (1|$#,)^1106
+1 t1105|1105&
+3 f0 (1101|$#,1101|$#,)^1108
+1 t1107|1107&
+3 f15 (1101|$#,1101|$#,)^1110
+1 t1109|1109&
+3 f0 (743|$#,)^1112
+1 t1111|1111&
+3 f1101 (743|$#,)^1114
+1 t1113|1113&
+1 t1101|1101&
+3 f0 (1115|4@5@7&#,)^1117
+1 t1116|1116&
+3 f1101 (1115|4@5@7&#,)^1119
+1 t1118|1118&
+3 f0 (743|$#,)^1121
+1 t1120|1120&
+3 f17 (743|$#,)^1123
+1 t1122|1122&
+3 f21 (743|$#,)^1125
+1 t1124|1124&
+3 f0 (1115|$#,)^1127
+1 t1126|1126&
+3 f17 (1115|$#,)^1129
+1 t1128|1128&
+3 f21 (1115|$#,)^1131
+1 t1130|1130&
+3 f0 (1115|$#,)^1133
+1 t1132|1132&
+3 f17 (1115|$#,)^1135
+1 t1134|1134&
+3 f743 (1115|$#,)^1137
+1 t1136|1136&
+3 f0 (1115|$#,)^1139
+1 t1138|1138&
+3 f17 (1115|$#,)^1141
+1 t1140|1140&
+3 f743 (1115|$#,)^1143
+1 t1142|1142&
+3 f0 (21|4@0@7&#,54|$#,21|$#,743|$#,)^1145
+1 t1144|1144&
+3 f54 (21|4@0@7&#,54|$#,21|$#,743|$#,)^1147
+1 t1146|1146&
+0 s11|&
+0 s12|-1 -1 1537
+0 s13|&
+0 s14|&
+0 s15|&
+0 s16|&
+0 s17|&
+0 s18|&
+0 a25|-1 1159 -1
+3 Sdirent{38|@1|$#d_name,}!
+0 s662|-1 1174 -1
+1 t1156|1156&
+3 f0 (1159|$#,)^1161
+1 t1160|1160&
+3 f5 (1159|$#,)^1163
+1 t1162|1162&
+3 f0 (21|$#,)^1165
+1 t1164|1164&
+3 f17 (21|$#,)^1167
+1 t1166|1166&
+3 f1159 (21|$#,)^1169
+1 t1168|1168&
+3 f0 (1159|$#,)^1171
+1 t1170|1170&
+3 f17 (1159|$#,)^1173
+1 t1172|1172&
+1 t1158|1158&
+3 f1174 (1159|$#,)^1176
+1 t1175|1175&
+3 f0 (1159|$#,)^1178
+1 t1177|1177&
+3 f1 (1159|$#,)^1180
+1 t1179|1179&
+3 Sflock{7|@1|$#l_type,7|@1|$#l_whence,1153|@1|$#l_start,1153|@1|$#l_len,1154|@1|$#l_pid,}!
+0 s670|&
+3 f0 (21|$#,1151|$#,)^1184
+1 t1183|1183&
+3 f5 (21|$#,1151|$#,)^1186
+1 t1185|1185&
+3 f0 (5|$#,5|$#,!.,)^1188
+1 t1187|1187&
+3 f5 (5|$#,5|$#,!.,)^1190
+1 t1189|1189&
+3 f0 (21|$#,5|$#,!.,)^1192
+1 t1191|1191&
+3 f5 (21|$#,5|$#,!.,)^1194
+1 t1193|1193&
+3 Sgroup{21|@1|0@0@3&#gr_name,1149|@1|$#gr_gid,502|@1|0@0@3&#gr_mem,}!
+0 s666|-1 1201 -1
+3 f0 (1149|$#,)^1198
+1 t1197|1197&
+3 f17 (1149|$#,)^1200
+1 t1199|1199&
+1 t1196|1196&
+3 f1201 (1149|$#,)^1203
+1 t1202|1202&
+3 f0 (21|$#,)^1205
+1 t1204|1204&
+3 f17 (21|$#,)^1207
+1 t1206|1206&
+3 f1201 (21|$#,)^1209
+1 t1208|1208&
+3 Spasswd{21|@1|0@0@3&#pw_name,1155|@1|$#pw_uid,1149|@1|$#pw_gid,21|@1|0@0@3&#pw_dir,21|@1|0@0@3&#pw_shell,}!
+0 s671|-1 1216 -1
+3 f0 (21|$#,)^1213
+1 t1212|1212&
+3 f17 (21|$#,)^1215
+1 t1214|1214&
+1 t1211|1211&
+3 f1216 (21|$#,)^1218
+1 t1217|1217&
+3 f0 (1155|$#,)^1220
+1 t1219|1219&
+3 f17 (1155|$#,)^1222
+1 t1221|1221&
+3 f1216 (1155|$#,)^1224
+1 t1223|1223&
+0 a26|&
+3 f0 (1225|$#,5|$#,)^1227
+1 t1226|1226&
+3 f1 (1225|$#,5|$#,)^1229
+1 t1228|1228&
+3 f0 (1225|4@0@7&#,5|$#,)^1231
+1 t1230|1230&
+3 f5 (1225|4@0@7&#,5|$#,)^1233
+1 t1232|1232&
+0 a1|-1 1251 -1
+3 ?!
+3 f1235 ()^1237
+1 t1236|1236&
+3 f1 ()^1239
+1 t1238|1238&
+3 Ssigaction{!1239$$$@0#sa_handler,1234|@1|0@0@3&#sa_mask,5|@1|$#sa_flags,}!
+0 s667|-1 1246 -1
+3 f0 (1154|$#,5|$#,)^1243
+1 t1242|1242&
+3 f5 (1154|$#,5|$#,)^1245
+1 t1244|1244&
+1 t1241|1241&
+3 f0 (5|$#,1246|$#,1246|4@5@7&#,)^1248
+1 t1247|1247&
+3 f5 (5|$#,1246|$#,1246|4@5@7&#,)^1250
+1 t1249|1249&
+1 t1234|1234&
+3 f0 (1251|$#,5|$#,)^1253
+1 t1252|1252&
+3 f5 (1251|$#,5|$#,)^1255
+1 t1254|1254&
+3 f0 (1251|$#,5|$#,)^1257
+1 t1256|1256&
+3 f5 (1251|$#,5|$#,)^1259
+1 t1258|1258&
+3 f0 (1251|4@0@7&#,)^1261
+1 t1260|1260&
+3 f5 (1251|4@0@7&#,)^1263
+1 t1262|1262&
+3 f0 (1251|4@0@7&#,)^1265
+1 t1264|1264&
+3 f5 (1251|4@0@7&#,)^1267
+1 t1266|1266&
+3 f0 (1251|$#,5|$#,)^1269
+1 t1268|1268&
+3 f5 (1251|$#,5|$#,)^1271
+1 t1270|1270&
+3 f0 (1251|4@0@7&#,)^1273
+1 t1272|1272&
+3 f5 (1251|4@0@7&#,)^1275
+1 t1274|1274&
+3 f0 (5|$#,1251|0@5@7&#,1251|4@5@7&#,)^1277
+1 t1276|1276&
+3 f5 (5|$#,1251|0@5@7&#,1251|4@5@7&#,)^1279
+1 t1278|1278&
+3 f0 (1251|$#,)^1281
+1 t1280|1280&
+3 f5 (1251|$#,)^1283
+1 t1282|1282&
+3 f0 (5|$#,21|$#,)^1285
+1 t1284|1284&
+3 f17 (5|$#,21|$#,)^1287
+1 t1286|1286&
+3 f303 (5|$#,21|$#,)^1289
+1 t1288|1288&
+3 f0 (303|$#,)^1291
+1 t1290|1290&
+3 f5 (303|$#,)^1293
+1 t1292|1292&
+3 Sstat{1151|@1|$#st_mode,1150|@1|$#st_ino,1148|@1|$#st_dev,1152|@1|$#st_nlink,1155|@1|$#st_uid,1149|@1|$#st_gid,1153|@1|$#st_size,1101|@1|$#st_st_atime,1101|@1|$#st_st_mtime,1101|@1|$#st_st_ctime,}!
+0 s674|-1 1320 -1
+3 f0 (1151|@7|$#,)^1297
+1 t1296|1296&
+3 f2 (1151|@7|$#,)^1299
+1 t1298|1298&
+3 f0 (1151|@7|$#,)^1301
+1 t1300|1300&
+3 f2 (1151|@7|$#,)^1303
+1 t1302|1302&
+3 f0 (1151|@7|$#,)^1305
+1 t1304|1304&
+3 f2 (1151|@7|$#,)^1307
+1 t1306|1306&
+3 f0 (1151|@7|$#,)^1309
+1 t1308|1308&
+3 f2 (1151|@7|$#,)^1311
+1 t1310|1310&
+3 f0 (1151|@7|$#,)^1313
+1 t1312|1312&
+3 f2 (1151|@7|$#,)^1315
+1 t1314|1314&
+3 f0 (21|$#,1151|$#,)^1317
+1 t1316|1316&
+3 f5 (21|$#,1151|$#,)^1319
+1 t1318|1318&
+1 t1295|1295&
+3 f0 (5|$#,1320|4@0@7&#,)^1322
+1 t1321|1321&
+3 f5 (5|$#,1320|4@0@7&#,)^1324
+1 t1323|1323&
+3 f0 (21|$#,1151|$#,)^1326
+1 t1325|1325&
+3 f5 (21|$#,1151|$#,)^1328
+1 t1327|1327&
+3 f0 (21|$#,1151|$#,)^1330
+1 t1329|1329&
+3 f5 (21|$#,1151|$#,)^1332
+1 t1331|1331&
+3 f0 (21|$#,1320|4@0@7&#,)^1334
+1 t1333|1333&
+3 f5 (21|$#,1320|4@0@7&#,)^1336
+1 t1335|1335&
+3 f0 (1151|$#,)^1338
+1 t1337|1337&
+3 f5 (1151|$#,)^1340
+1 t1339|1339&
+3 Stms{1100|@1|$#tms_utime,1100|@1|$#tms_stime,1100|@1|$#tms_cutime,1100|@1|$#tms_cstime,}!
+0 s668|-1 1343 -1
+1 t1342|1342&
+3 f0 (1343|4@0@7&#,)^1345
+1 t1344|1344&
+3 f1100 (1343|4@0@7&#,)^1347
+1 t1346|1346&
+3 Sutsname{38|@1|$#sysname,38|@1|$#nodename,38|@1|$#release,38|@1|$#version,38|@1|$#machine,}!
+0 s672|-1 1350 -1
+1 t1349|1349&
+3 f0 (1350|4@0@7&#,)^1352
+1 t1351|1351&
+3 f5 (1350|4@0@7&#,)^1354
+1 t1353|1353&
+3 f0 (5|$#,)^1356
+1 t1355|1355&
+3 f5 (5|$#,)^1358
+1 t1357|1357&
+3 f0 (5|$#,)^1360
+1 t1359|1359&
+3 f5 (5|$#,)^1362
+1 t1361|1361&
+3 f0 (5|$#,)^1364
+1 t1363|1363&
+3 f5 (5|$#,)^1366
+1 t1365|1365&
+3 f0 (5|$#,)^1368
+1 t1367|1367&
+3 f5 (5|$#,)^1370
+1 t1369|1369&
+3 f0 (5|$#,)^1372
+1 t1371|1371&
+3 f5 (5|$#,)^1374
+1 t1373|1373&
+3 f0 (5|$#,)^1376
+1 t1375|1375&
+3 f5 (5|$#,)^1378
+1 t1377|1377&
+3 f0 (22|4@5@7&#,)^1380
+1 t1379|1379&
+3 f1154 (22|4@5@7&#,)^1382
+1 t1381|1381&
+3 f0 (1154|$#,22|4@0@7&#,5|$#,)^1384
+1 t1383|1383&
+3 f1154 (1154|$#,22|4@0@7&#,5|$#,)^1386
+1 t1385|1385&
+3 C0.4/8|!
+3 C0.3/8|!
+0 s29|&
+3 C0.9/9|!
+3 C0.10/9|!
+0 s30|&
+0 s31|&
+3 Stermios{1393|@1|$#c_iflag,1393|@1|$#c_oflag,1393|@1|$#c_cflag,1393|@1|$#c_lflag,1389|@1|$#c_cc,}!
+0 s669|-1 1396 -1
+1 t1395|1395&
+3 f0 (1396|$#,)^1398
+1 t1397|1397&
+3 f1392 (1396|$#,)^1400
+1 t1399|1399&
+3 f0 (1396|$#,)^1402
+1 t1401|1401&
+3 f1392 (1396|$#,)^1404
+1 t1403|1403&
+3 f0 (1396|$#,)^1406
+1 t1405|1405&
+3 f5 (1396|$#,)^1408
+1 t1407|1407&
+3 f0 (1396|$#,)^1410
+1 t1409|1409&
+3 f5 (1396|$#,)^1412
+1 t1411|1411&
+3 f0 (5|$#,)^1414
+1 t1413|1413&
+3 f5 (5|$#,)^1416
+1 t1415|1415&
+3 f0 (5|$#,5|$#,)^1418
+1 t1417|1417&
+3 f5 (5|$#,5|$#,)^1420
+1 t1419|1419&
+3 f0 (5|$#,5|$#,)^1422
+1 t1421|1421&
+3 f5 (5|$#,5|$#,)^1424
+1 t1423|1423&
+3 f0 (5|$#,1396|4@0@7&#,)^1426
+1 t1425|1425&
+3 f5 (5|$#,1396|4@0@7&#,)^1428
+1 t1427|1427&
+3 f0 (5|$#,5|$#,)^1430
+1 t1429|1429&
+3 f5 (5|$#,5|$#,)^1432
+1 t1431|1431&
+3 f0 (5|$#,5|$#,1396|$#,)^1434
+1 t1433|1433&
+3 f5 (5|$#,5|$#,1396|$#,)^1436
+1 t1435|1435&
+3 f0 (1|$#,)^1438
+1 t1437|1437&
+3 f1 (1|$#,)^1440
+1 t1439|1439&
+3 f0 (5|$#,)^1442
+1 t1441|1441&
+3 f1 (5|$#,)^1444
+1 t1443|1443&
+3 f0 (21|$#,5|$#,)^1446
+1 t1445|1445&
+3 f5 (21|$#,5|$#,)^1448
+1 t1447|1447&
+3 f0 (6|$#,)^1450
+1 t1449|1449&
+3 f6 (6|$#,)^1452
+1 t1451|1451&
+3 f0 (21|$#,)^1454
+1 t1453|1453&
+3 f5 (21|$#,)^1456
+1 t1455|1455&
+3 f0 (21|$#,1155|$#,1149|$#,)^1458
+1 t1457|1457&
+3 f5 (21|$#,1155|$#,1149|$#,)^1460
+1 t1459|1459&
+3 f0 (5|$#,)^1462
+1 t1461|1461&
+3 f5 (5|$#,)^1464
+1 t1463|1463&
+3 f0 (21|@5|4@5@7&#,)^1466
+1 t1465|1465&
+3 f17 (21|@5|4@5@7&#,)^1468
+1 t1467|1467&
+3 f21 (21|@5|4@5@7&#,)^1470
+1 t1469|1469&
+3 f0 (21|4@5@7&#,)^1472
+1 t1471|1471&
+3 f17 (21|4@5@7&#,)^1474
+1 t1473|1473&
+3 f21 (21|4@5@7&#,)^1476
+1 t1475|1475&
+3 f0 (5|$#,5|$#,)^1478
+1 t1477|1477&
+3 f5 (5|$#,5|$#,)^1480
+1 t1479|1479&
+3 f0 (5|$#,)^1482
+1 t1481|1481&
+3 f5 (5|$#,)^1484
+1 t1483|1483&
+3 f0 (21|$#,21|$#,!.,)^1486
+1 t1485|1485&
+3 f5 (21|$#,21|$#,!.,)^1488
+1 t1487|1487&
+3 f0 (21|$#,21|$#,!.,)^1490
+1 t1489|1489&
+3 f5 (21|$#,21|$#,!.,)^1492
+1 t1491|1491&
+3 f0 (21|$#,21|$#,!.,)^1494
+1 t1493|1493&
+3 f5 (21|$#,21|$#,!.,)^1496
+1 t1495|1495&
+2 y17|17&
+2 y21|21&
+3 f0 (21|$#,1498|$#,)^1500
+1 t1499|1499&
+3 f5 (21|$#,1498|$#,)^1502
+1 t1501|1501&
+3 f0 (21|$#,1498|$#,502|$#,)^1504
+1 t1503|1503&
+3 f5 (21|$#,1498|$#,502|$#,)^1506
+1 t1505|1505&
+3 f0 (21|$#,1498|$#,)^1508
+1 t1507|1507&
+3 f5 (21|$#,1498|$#,)^1510
+1 t1509|1509&
+3 f0 (1|$#,)^1512
+1 t1511|1511&
+3 f1154 (1|$#,)^1514
+1 t1513|1513&
+3 f0 (5|$#,5|$#,)^1516
+1 t1515|1515&
+3 f9 (5|$#,5|$#,)^1518
+1 t1517|1517&
+3 f0 (21|@5|4@0@7&#,54|$#,)^1520
+1 t1519|1519&
+3 f17 (21|@5|4@0@7&#,54|$#,)^1522
+1 t1521|1521&
+3 f21 (21|@5|4@0@7&#,54|$#,)^1524
+1 t1523|1523&
+3 f0 (1|$#,)^1526
+1 t1525|1525&
+3 f1149 (1|$#,)^1528
+1 t1527|1527&
+3 f0 (1|$#,)^1530
+1 t1529|1529&
+3 f1155 (1|$#,)^1532
+1 t1531|1531&
+3 f0 (1|$#,)^1534
+1 t1533|1533&
+3 f1149 (1|$#,)^1536
+1 t1535|1535&
+2 y1149|1149&
+3 f0 (5|$#,1537|4@0@7&#,)^1539
+1 t1538|1538&
+3 f5 (5|$#,1537|4@0@7&#,)^1541
+1 t1540|1540&
+3 f0 (1|$#,)^1543
+1 t1542|1542&
+3 f17 (1|$#,)^1545
+1 t1544|1544&
+3 f21 (1|$#,)^1547
+1 t1546|1546&
+3 f0 (1|$#,)^1549
+1 t1548|1548&
+3 f1154 (1|$#,)^1551
+1 t1550|1550&
+3 f0 (1|$#,)^1553
+1 t1552|1552&
+3 f1154 (1|$#,)^1555
+1 t1554|1554&
+3 f0 (1|$#,)^1557
+1 t1556|1556&
+3 f1154 (1|$#,)^1559
+1 t1558|1558&
+3 f0 (1|$#,)^1561
+1 t1560|1560&
+3 f1155 (1|$#,)^1563
+1 t1562|1562&
+3 f0 (5|$#,)^1565
+1 t1564|1564&
+3 f5 (5|$#,)^1567
+1 t1566|1566&
+3 f0 (21|$#,21|$#,)^1569
+1 t1568|1568&
+3 f5 (21|$#,21|$#,)^1571
+1 t1570|1570&
+3 f0 (5|$#,1153|$#,5|$#,)^1573
+1 t1572|1572&
+3 f1153 (5|$#,1153|$#,5|$#,)^1575
+1 t1574|1574&
+3 f0 (21|$#,5|$#,)^1577
+1 t1576|1576&
+3 f9 (21|$#,5|$#,)^1579
+1 t1578|1578&
+3 f0 (1|$#,)^1581
+1 t1580|1580&
+3 f5 (1|$#,)^1583
+1 t1582|1582&
+3 f0 (39|$#,)^1585
+1 t1584|1584&
+3 f5 (39|$#,)^1587
+1 t1586|1586&
+3 f0 (5|$#,18|4@0@7&#,54|$#,)^1589
+1 t1588|1588&
+3 f55 (5|$#,18|4@0@7&#,54|$#,)^1591
+1 t1590|1590&
+3 f0 (21|$#,)^1593
+1 t1592|1592&
+3 f5 (21|$#,)^1595
+1 t1594|1594&
+3 f0 (1149|$#,)^1597
+1 t1596|1596&
+3 f5 (1149|$#,)^1599
+1 t1598|1598&
+3 f0 (1154|$#,1154|$#,)^1601
+1 t1600|1600&
+3 f5 (1154|$#,1154|$#,)^1603
+1 t1602|1602&
+3 f0 (1|$#,)^1605
+1 t1604|1604&
+3 f1154 (1|$#,)^1607
+1 t1606|1606&
+3 f0 (1155|$#,)^1609
+1 t1608|1608&
+3 f5 (1155|$#,)^1611
+1 t1610|1610&
+3 f0 (6|$#,)^1613
+1 t1612|1612&
+3 f6 (6|$#,)^1615
+1 t1614|1614&
+3 f0 (5|$#,)^1617
+1 t1616|1616&
+3 f9 (5|$#,)^1619
+1 t1618|1618&
+3 f0 (5|$#,)^1621
+1 t1620|1620&
+3 f1154 (5|$#,)^1623
+1 t1622|1622&
+3 f0 (5|$#,1154|$#,)^1625
+1 t1624|1624&
+3 f5 (5|$#,1154|$#,)^1627
+1 t1626|1626&
+3 f0 (5|$#,)^1629
+1 t1628|1628&
+3 f17 (5|$#,)^1631
+1 t1630|1630&
+3 f21 (5|$#,)^1633
+1 t1632|1632&
+3 f0 (21|$#,)^1635
+1 t1634|1634&
+3 f5 (21|$#,)^1637
+1 t1636|1636&
+3 f0 (5|$#,18|$#,54|$#,)^1639
+1 t1638|1638&
+3 f55 (5|$#,18|$#,54|$#,)^1641
+1 t1640|1640&
+3 Sutimbuf{1101|@1|$#actime,1101|@1|$#modtime,}!
+0 s663|-1 1644 -1
+1 t1643|1643&
+3 f0 (21|$#,1644|0@5@7&#,)^1646
+1 t1645|1645&
+3 f5 (21|$#,1644|0@5@7&#,)^1648
+1 t1647|1647&
+;;tistable
+0
+0,21
+21
+0,21,22
+22
+0,21,22,23
+23
+0,21,22,23,24
+24
+25
+25,26
+26
+25,26,1
+1
+;;symTable
+*0 (Datatype)
+0@+@=@0@7@0@0@58#mbstate_t
+0@+@=@0@7@0@0@1234#sigset_t
+2@-@-@0@0@0@0@2#bool
+11@-@-@0@0@0@0@53#ptrdiff_t
+11@-@-@0@0@0@0@56#wchar_t
+11@-@-@0@0@0@0@57#wint_t
+11@-@-@0@0@0@0@262#sig_atomic_t
+11@-@-@0@0@0@0@858#wctype_t
+11@-@-@0@0@0@0@859#wctrans_t
+11@-@-@0@0@0@0@1100#clock_t
+11@-@-@0@0@0@0@1101#time_t
+11@-@-@0@0@0@0@1148#dev_t
+11@-@-@0@0@0@0@1149#gid_t
+11@-@-@0@0@0@0@1150#ino_t
+11@-@-@0@0@0@0@1151#mode_t
+11@-@-@0@0@0@0@1152#nlink_t
+11@-@-@0@0@0@0@1153#off_t
+11@-@-@0@0@0@0@1154#pid_t
+11@-@-@0@0@0@0@1155#uid_t
+12@-@-@0@0@0@0@54#size_t
+13@-@-@0@0@0@0@55#ssize_t
+18@+@+@0@0@0@0@253#jmp_buf
+18@+@+@0@0@0@0@292#va_list
+18@+@+@0@0@0@0@301#FILE
+18@+@+@0@0@0@0@302#fpos_t
+18@+@+@0@0@0@0@1156#DIR
+18@+@+@0@0@0@0@1225#sigjmp_buf
+596@-@-@0@0@0@0@598#div_t
+607@-@-@0@0@0@0@609#ldiv_t
+1388@-@-@0@0@0@0@1389#cc_t
+1391@-@-@0@0@0@0@1392#speed_t
+1391@-@-@0@0@0@0@1393#tcflag_t
+*1 (Constant)
+0@i0@0@6#NULL
+2@i1@0@0#TRUE
+2$#NDEBUG
+2@i0@0@6#FALSE
+3$#UCHAR_MAX#UCHAR_MIN
+4$#CHAR_MAX#CHAR_MIN#SCHAR_MAX#SCHAR_MIN
+5$#B0#B110#B1200#B134#B150#B1800#B19200#B200#B2400#B300#B38400#B4800#B50#B600#B75#B9600#BRKINT#BUFSIZ#CHAR_BIT#CLK_TCK#CLOCAL#CLOCKS_PER_SEC#CREAD#CS5#CS6#CS7#CS8#CSIZE#CSTOPB#E2BIG#EACCES#EAGAIN#EBADF#EBUSY#ECHILD#ECHO#ECHOE#ECHOK#ECHONL#EDEADLK#EDOM#EEXIST#EFAULT#EFBIG#EILSEQ#EINTR#EINVAL#EIO#EISDIR#EMFILE#EMLINK#ENAMETOOLONG#ENFILE#ENODEV#ENOENT#ENOEXEC#ENOLCK#ENOMEM#ENOSPC#ENOSYS#ENOTDIR#ENOTEMPTY#ENOTTY#ENXIO#EOF#EPERM#EPIPE#ERANGE#EROFS#ESPIPE#ESRCH#EXDEV#EXIT_FAILURE#EXIT_SUCCESS#FD_CLOEXEC#FILENAME_MAX#FLT_RADIX#FOPEN_MAX#F_DUPFD#F_GETFD#F_GETFL#F_GETLK#F_OK#F_RDLCK#F_SETFD#F_SETFL#F_SETLK#F_SETLKW#F_UNLCK#F_WRLCK#HUPCL#ICANON#ICRNL#IEXTEN#IGNBRK#IGNCR#IGNLCR#IGNPAR#INPCK#INT_MAX#INT_MIN#ISIG#ISTRIP#IXOFF#IXON#LC_ALL#LC_COLLATE#LC_CTYPE#LC_MONETARY#LC_NUMERIC#LC_TIME#L_ctermid#L_cuserid#L_tmpnam#NCCS#NOFLSH#OPOST#O_ACCMODE#O_APPEND#O_CREAT#O_EXCL#O_NOCTTY#O_NONBLOCK#O_RDONLY#O_RDWR#O_TRUNC#O_WRONLY#PARENB#PARMRK#PARODD#RAND_MAX#R_OK#SA_NOCLDSTOP#SEEK_CUR#SEEK_END#SEEK_SET#SIGABRT#SIGALRM#SIGCHLD#SIGCONT#SIGFPE#SIGHUP#SIGILL#SIGINT#SIGKILL#SIGPIPE#SIGQUIT#SIGSEGV#SIGSTOP#SIGTERM#SIGTSTP#SIGTTIN#SIGTTOU#SIGUSR1#SIGUSR2#SIG_BLOCK#SIG_SETMASK#SIG_UNBLOCK#STDERR_FILENO#STDIN_FILENO#STDOUT_FILENO#S_IRGRP#S_IROTH#S_ISGID#S_ISUID#S_IUSR#S_IWGRP#S_IWOTH#S_IWUSR#S_IWXG#S_IWXO#S_IWXU#S_IXGRP#S_IXOTH#S_IXUSR#TCIFLUSH#TCIOFF#TCIOFLUSH#TCION#TCOFLUSH#TCSADRAIN#TCSAFLUSH#TCSANOW#TMP_MAX#TOSTOP#VEOF#VEOL#VERASE#VINTR#VKILL#VMIN#VQUIT#VSTART#VSTOP#VSUSP#VTIME#WCHAR_MAX#WCHAR_MIN#WUNTRACED#W_OK#X_OK#_IOFBF#_IOLBF#_IONBF#_PC_CHOWN_RESTRUCTED#_PC_MAX_CANON#_PC_MAX_INPUT#_PC_NAME_MAX#_PC_NO_TRUNC#_PC_PATH_MAX#_PC_PIPE_BUF#_PC_VDISABLE#_POSIX_CHOWN_RESTRICTED#_POSIX_JOB_CONTROL#_POSIX_NO_TRUNC#_POSIX_SAVED_IDS#_POSIX_VDISABLE#_POSIX_VERSION#_SC_ARG_MAX#_SC_CHILD_MAX#_SC_CLK_TCK#_SC_JOB_CONTROL#_SC_NGROUPS_MAX#_SC_OPEN_MAX#_SC_SAVED_IDS#_SC_STREAM_MAX#_SC_TZNAME_MAX#_SC_VERSION
+6$#UINT_MAX
+7$#SHRT_MAX#SHRT_MIN
+8$#USHRT_MAX
+9$#ARG_MAX#CHILD_MAX#LINK_MAX#LONG_MAX#LONG_MIN#MAX_CANON#MAX_INPUT#MB_LEN_MAX#NAME_MAX#NGROUPS_MAX#OPEN_MAX#PIPE_BUF#SSIZE_MAX#STREAM_MAX#TZNAME_MAX#_POSIX_ARG_MAX#_POSIX_CHILD_MAX#_POSIX_LINK_MAX#_POSIX_MAX_CANON#_POSIX_MAX_INPUT#_POSIX_NAME_MAX#_POSIX_NGROUPS_MAX#_POSIX_OPEN_MAX#_POSIX_PATH_MAX#_POSIX_PIPE_BUF#_POSIX_SSIZE#_POSIX_STREAM#_POSIX_TZNAME_MAX
+10$#ULONG_MAX
+15$#HUGE_VAL
+54$#MB_CUR_MAX
+57$#WEOF
+267$#SIG_DFL
+272$#SIG_ERR
+277$#SIG_IGN
+*3 (Variable)
+0|@11|$#SBOOLINT
+5|@1|0@0@0@0@1#DBL_DIG#DBL_MANT_DIG#DBL_MAX_10_EXP#DBL_MAX_EXP#DBL_MIN_10_EXP#DBL_MIN_EXP#FLT_DIG#FLT_MANT_DIG#FLT_MAX_10_EXP#FLT_MAX_EXP#FLT_MIN_10_EXP#FLT_MIN_EXP#FLT_ROUNDS#LDBL_DIG#LDBL_MANT_DIG#LDBL_MAX_10_EXP#LDBL_MAX_EXP#LDBL_MIN_10_EXP#LDBL_MIN_EXP#errno
+14|@1|0@0@0@0@1#FLT_EPSILON#FLT_MAX#FLT_MIN
+15|@1|0@0@0@0@1#DBL_EPSILON#DBL_MAX#DBL_MIN
+16|@1|0@0@0@0@1#LDBL_EPSILON#LDBL_MAX#LDBL_MIN
+303|@1|0@0@0@0@1#stderr#stdin#stdout
+502|@1|0@0@0@0@1#environ
+1148|@1|6@0@0&#x
+*4 (Function)
+65@6@0@7@0@0@1@@1@s0$@0#assert
+73$@1@@1@s0$@0#isalnum
+79$@1@@1@s0$@0#isalpha
+85$@1@@1@s0$@0#iscntrl
+92$@1@@1@s0$@0#isdigit
+98$@1@@1@s0$@0#isgraph
+104$@1@@1@s0$@0#islower
+111$@1@@1@s0$@0#isprint
+117$@1@@1@s0$@0#ispunct
+123$@1@@1@s0$@0#isspace
+130$@1@@1@s0$@0#isupper
+136$@1@@1@s0$@0#isxdigit
+142$@1@@1@s0$@0#tolower
+149$@1@@1@s0$@0#toupper
+157@6@5@0@0@0@0@s1,g329@0@0@1@s1,g329@19@3@0#setlocale
+164$@1@@1@s0@3@0@0#localeconv
+168$@1@@1@s0$@0#sin
+172$@1@@1@s0$@0#cos
+176$@1@@1@s0$@0#tan
+180$@0@g329@0@0@1@g329$@0#asin
+184$@0@g329@0@0@1@g329$@0#acos
+188$@1@@1@s0$@0#atan
+192$@1@@1@s0$@0#atan2
+196$@1@@1@s0$@0#sinh
+200$@0@g329@0@0@1@g329$@0#cosh
+204$@1@@1@s0$@0#tanh
+208$@0@g329@0@0@1@g329$@0#exp
+212$@0@g329@0@0@1@g329$@0#ldexp
+216$@0@@1@tp1$@0#frexp
+220$@0@g329@0@0@1@g329$@0#log
+224$@0@g329@0@0@1@g329$@0#log10
+228$@0@g329@0@0@1@g329$@0#pow
+232$@0@g329@0@0@1@g329$@0#sqrt
+236$@1@@1@s0$@0#ceil
+240$@1@@1@s0$@0#floor
+244$@1@@1@s0$@0#fabs
+248$@0@@1@tp1$@0#modf
+252$@1@@1@s0$@0#fmod
+257$@0@@1@p0$@0#setjmp
+261@6@0@4@0@0@1@@1@s0$@0#longjmp
+287$@0@s1,g329@0@0@1@s1,g329$@0#signal
+291@6@0@4@0@0$$@0#raise
+296$@0@@1@p0$@0#va_start
+300$@0@@1@p0$@0#va_end
+307$@0@s3,g329@0@0@1@s3,g329$@0#remove
+311$@0@s3,g329@0@0@1@s3,g329$@0#rename
+317@6@5@0@0@0@0@s3@1@s3@3@0@0#tmpfile
+323$@0@s1@1@tp0,s1@19@3@0#tmpnam
+327$@0@g329@0@0,s3@1@tp0,g329,s3$@0#fclose
+331$@0@g329@0@0,s3@1@tp0,g329,s3$@0#fflush
+337@6@5@0@0@0@0@s3@1@s3@18@0@0#fopen
+343@6@5@0@0@0@0@s3,g329@0@0@1@tp2,s3,g329@3@0@0#freopen
+347$@0@s3@1@s3,tp0,tp1$@0#setbuf
+351$@0@s3@1@s3,tp0,tp1$@0#setvbuf
+358@6@0@0@1@0@0@s3@1@s3,tp0$@0#fprintf
+362@6@0@0@2@0@0@s3@1@s3,tp0$@0#fscanf
+368@6@0@0@1@0@1@g341@0@0,s3@1@s3,tg341$@0#printf
+372@6@0@0@2@0@1@g340@0@0,s3@1@s3,tg340$@0#scanf
+379@6@0@0@1@0@0@@1@tp0$@0#sprintf
+383@6@0@0@2@0@1@@1@s0$@0#sscanf
+387$@0@s3,g329@0@0@1@s3,tp0,p2,g329$@0#vfprintf
+391$@1@g341@0@0,s3@1@s3,p1,tg341$@0#vprintf
+395$@0@@1@tp0,p2$@0#vsprintf
+399$@0@s3,g329@0@0@1@s3,tp0,g329$@0#fgetc
+405@6@5@0@0@0@0@s3,g329@0@0@1@s3,tp0,tp2,g329$@0#fgets
+409$@0@s3,g329@0@0@1@s3,tp1,g329$@0#fputc
+413$@0@s3@1@s3,tp1$@0#fputs
+417$@0@s3@1@s3,tp0$@0#getc
+421$@1@g340@0@0,s3@1@s3,tg340$@0#getchar
+427@6@5@0@0@0@1@g340@0@0,s3,g329@0@0@1@s3,tp0,tg340,g329@3@0@0#gets
+431$@0@s3@1@s3,tp1$@0#putc
+435$@1@g341@0@0,s3@1@s3,tg341$@0#putchar
+439$@1@g341@0@0,s3@1@s3,tg341$@0#puts
+443$@0@s3,g329@0@0@1@s3,tp1,g329$@0#ungetc
+447$@0@s3,g329@0@0@1@s3,tp0,tp3,g329$@0#fread
+451$@0@s3,g329@0@0@1@s3,tp3,g329$@0#fwrite
+456$@0@g329@0@0@1@tp1,g329$@0#fgetpos
+460$@0@s3,g329@0@0@1@s3,tp0,g329$@0#fseek
+464$@0@s3,g329@0@0@1@s3,tp0,g329$@0#fsetpos
+468$@0@g329@0@0@1@g329$@0#ftell
+472$@0@@1@tp0$@0#rewind
+476$@0@@1@tp0$@0#clearerr
+480$@0@g329@0@0@1@g329$@0#feof
+484$@0@g329@0@0@1@g329$@0#ferror
+488$@1@g329@0@0,g339@0@0,s3@1@s3,tg339$@0#perror
+492$@1@@1@s0$@0#atof
+496$@1@@1@s0$@0#atoi
+500$@1@@1@s0$@0#atol
+506$@0@g329@0@0@1@tp1,g329$@0#strtod
+510$@0@g329@0@0@1@tp1,g329$@0#strtol
+514$@0@g329@0@0@1@tp1,g329$@0#strtoul
+518$@0@s1@1@s1$@0#rand
+522$@0@s1@1@s1$@0#srand
+528@6@5@0@0@0@1@@1@s0@2@0@0#calloc
+534@4@5@0@0@0@1@@1@s0@2@0@0#malloc
+540@6@5@0@0@0@0@@1@tp0@2@0@0#realloc
+544$@0@@1@tp0$@0#free
+548@6@0@5@0@0@1@@1@s0$@0#abort
+552@6@0@5@0@0@1@@1@s0$@0#exit
+561$@0@s1@1@s1$@0#atexit
+567@6@5@0@0@0@1@@1@s0@19@3@0#getenv
+571$@0@s3@1@s3$@0#system
+582@6@5@0@0@0@1@@1@s0@18@0@0#bsearch
+591$@0@g329@0@0@1@tp0,g329$@0#qsort
+595$@1@@1@s0$@0#abs
+602$@1@@1@s0$@0#div
+606$@1@@1@s0$@0#labs
+613$@1@@1@s0$@0#ldiv
+617$@1@@1@s0$@0#btowc
+621$@0@s3@1@s3,tp0$@0#fgetwc
+628@6@5@0@0@0@0@s3@1@s3,tp0,tp2$@0#fgetws
+632$@0@s3@1@s3,tp1$@0#fputwc
+636$@0@s3@1@s3,tp1$@0#fputws
+640$@1@@1@s0$@0#fwide
+644@6@0@0@1@0@0@s3@1@tp0,s3$@0#fwprintf
+648@6@0@0@2@0@0@s3@1@tp0,s3$@0#fwscanf
+652$@0@s3@1@s3,tp0$@0#getwc
+656$@0@s3,g340@0@0@1@s3,tg340$@0#getwchar
+661$@1@@1@s0$@0#mbrlen
+665$@0@@1@tp0$@0#mbrtowc
+669$@1@@1@s0$@0#mbsinit
+673$@0@@1@tp0$@0#mbsrtowcs
+677$@0@s3@1@s3,tp1$@0#putwc
+681$@0@s3,g341@0@0@1@s3,tg341$@0#putwchar
+685@6@0@0@1@0@0@@1@tp0$@0#swprintf
+689@6@0@0@2@0@0@g340@0@0@1@tg340$@0#swscanf
+693$@0@s3@1@s3,tp1$@0#ungetwc
+697$@0@s3@1@s3,tp0$@0#vfwprintf
+701$@0@@1@tp0$@0#vswprintf
+705$@0@s3,g341@0@0@1@s3,tg341$@0#vwprintf
+709$@0@@1@tp0$@0#wcrtomb
+716$@0@@1@tp0$@0#wcscat
+722@6@5@0@0@0@1@@1@s0@19@2@0#wcschr
+726$@1@@1@s0$@0#wcscmp
+730$@1@@1@s0$@0#wcscoll
+737$@0@@1@tp0$@0#wcscpy
+741$@1@@1@s0$@0#wcscspn
+747$@0@@1@tp0$@0#wcsftime
+751$@1@@1@s0$@0#wcslen
+758$@0@@1@tp0$@0#wcsncat
+762$@1@@1@s0$@0#wcsncmp
+768$@0@@1@tp0$@0#wcsncpy
+774@6@5@0@0@0@1@@1@s0$@0#wcspbrk
+780@6@5@0@0@0@1@@1@s0$@0#wcsrchr
+785$@0@@1@tp1$@0#wcsrtombs
+789$@1@@1@s0$@0#wcsspn
+795@6@5@0@0@0@1@@1@s0@3@0@0#wcsstr
+799$@0@@1@tp1$@0#wcstod
+805@6@5@0@0@0@0@@1@tp2@3@0@0#wcstok
+809$@0@@1@tp1$@0#wcstol
+813$@0@@1@tp1$@0#wcstoul
+817$@0@@1@tp0$@0#wcsxfrm
+821$@1@@1@s0$@0#wctob
+827@6@5@0@0@0@1@@1@s0@3@0@0#wmemchr
+831$@1@@1@s0$@0#wmemcmp
+837$@0@@1@tp0$@0#wmemcpy
+843$@0@@1@tp0$@0#wmemmove
+849$@0@@1@tp0$@0#wmemset
+853@6@0@0@1@0@1@g341@0@0,g329@0@0@1@g329,tg341$@0#wprintf
+857@6@0@0@2@0@1@g340@0@0,g329@0@0@1@g329,tg340$@0#wscanf
+865$@1@@1@s0$@0#iswalnum
+871$@1@@1@s0$@0#iswalpha
+877$@1@@1@s0$@0#iswcntrl
+883$@1@@1@s0$@0#iswctype
+889$@1@@1@s0$@0#iswdigit
+895$@1@@1@s0$@0#iswgraph
+901$@1@@1@s0$@0#iswlower
+907$@1@@1@s0$@0#iswprint
+913$@1@@1@s0$@0#iswpunct
+919$@1@@1@s0$@0#iswspace
+925$@1@@1@s0$@0#iswupper
+931$@1@@1@s0$@0#iswxdigit
+938$@1@@1@s0$@0#towctrans
+944$@1@@1@s0$@0#towlower
+951$@1@@1@s0$@0#towupper
+955$@1@@1@s0$@0#wctrans
+959$@1@@1@s0$@0#wctype
+963$@1@@1@s0$@0#mblen
+967$@0@@1@tp0$@0#mbtowc
+971$@0@@1@tp0$@0#wctomb
+975$@0@@1@tp0$@0#mbstowcs
+979$@0@@1@tp0$@0#wcstombs
+986$@0@@1@tp0$@0#memcpy
+992$@0@@1@tp0$@0#memmove
+999$@0@@1@tp0$@0#strcpy
+1005$@0@@1@tp0$@0#strncpy
+1012$@0@@1@tp0$@0#strcat
+1018$@0@@1@tp0$@0#strncat
+1022$@1@@1@s0$@0#memcmp
+1026$@1@@1@s0$@0#strcmp
+1030$@1@@1@s0$@0#strcoll
+1034$@1@@1@s0$@0#strncmp
+1038$@0@@1@tp0$@0#strxfrm
+1044@6@5@0@0@0@1@@1@s0@3@0@0#memchr
+1050@6@5@0@0@0@1@@1@s0@19@2@0#strchr
+1054$@1@@1@s0$@0#strcspn
+1060@6@5@0@0@0@1@@1@s0@19@2@0#strpbrk
+1066@6@5@0@0@0@1@@1@s0@19@2@0#strrchr
+1070$@1@@1@s0$@0#strspn
+1076@6@5@0@0@0@1@@1@s0@19@2@0#strstr
+1082@6@5@0@0@0@0@s1,g329@0@0@1@tp0,s1,g329@19@2@0#strtok
+1089$@0@@1@tp0$@0#memset
+1095$@1@@1@s0@19@3@0#strerror
+1099$@1@@1@s0$@0#strlen
+1106$@0@s1@1@s1$@0#clock
+1110$@1@@1@s0$@0#difftime
+1114$@1@@1@s0$@0#mktime
+1119$@0@@1@tp0$@0#time
+1125$@0@g329@0@0@1@g329@19@3@0#asctime
+1131$@1@@1@s0@19@3@0#ctime
+1137@6@5@0@0@0@1@@1@s0@19@3@0#gmtime
+1143@6@5@0@0@0@0@g329@0@0@1@g329@19@3@0#localtime
+1147$@0@@1@tp0$@0#strftime
+1163$@0@g329@0@0@1@g329$@0#closedir
+1169@6@5@0@0@0@0@g329@0@0@1@g329@3@0@0#opendir
+1176@6@5@0@0@0@0@g329@0@0@1@g329@3@0@0#readdir
+1180$@1@@1@s0$@0#rewinddir
+1186$@0@g329@0@0@1@g329$@0#creat
+1190$@0@g329@0@0@1@g329$@0#fcntl
+1194$@0@g329@0@0@1@g329$@0#open
+1203@6@5@0@0@0@0@g329@0@0@1@g329@3@0@0#getgrgid
+1209@6@5@0@0@0@0@g329@0@0@1@g329@3@0@0#getgrnam
+1218@6@5@0@0@0@0@g329@0@0@1@g329@19@3@0#getpwnam
+1224@6@5@0@0@0@0@g329@0@0@1@g329@19@3@0#getpwuid
+1229@6@0@4@0@0@1@@1@s0$@0#siglongjmp
+1233$@0@@1@p0$@0#sigsetjmp
+1245@6@0@4@0@0@0@g329@0@0@1@g329$@0#kill
+1250$@0@g329@0@0,s1@1@tp2,g329,s1$@0#sigaction
+1255$@0@g329@0@0@1@tp0,g329$@0#sigaddset
+1259$@0@g329@0@0@1@tp0,g329$@0#sigdelset
+1263$@0@g329@0@0@1@tp0,g329$@0#sigemptyset
+1267$@0@g329@0@0@1@tp0,g329$@0#sigfillset
+1271$@0@g329@0@0@1@g329$@0#sigismember
+1275$@0@g329@0@0@1@tp0,g329$@0#sigpending
+1279$@0@g329@0@0,s1@1@tp2,g329,s1$@0#sigprocmask
+1283$@0@g329@0@0,s1@1@g329,s1$@0#sigsuspend
+1289@6@5@0@0@0@0@g329@0@0,s3@1@g329,s3@18@0@0#fdopen
+1293$@0@g329@0@0@1@g329$@0#fileno
+1299$@1@@1@s0$@0#S_ISBLK
+1303$@1@@1@s0$@0#S_ISCHR
+1307$@1@@1@s0$@0#S_ISDIR
+1311$@1@@1@s0$@0#S_ISFIFO
+1315$@1@@1@s0$@0#S_ISREG
+1319$@0@s3,g329@0@0@1@s3,g329$@0#chmod
+1324$@0@g329@0@0@1@g329,tp1$@0#fstat
+1328$@0@s3,g329@0@0@1@s3,g329$@0#mkdir
+1332$@0@s3,g329@0@0@1@s3,g329$@0#mkfifo
+1336$@0@g329@0@0@1@g329,tp1$@0#stat
+1340$@0@s1@1@s1$@0#umask
+1347$@0@@1@tp0$@0#times
+1354$@0@g329@0@0@1@tp0,g329$@0#uname
+1358$@1@@1@s0$@0#WEXITSTATUS
+1362$@1@@1@s0$@0#WIFEXITED
+1366$@1@@1@s0$@0#WIFSIGNALED
+1370$@1@@1@s0$@0#WIFSTOPPED
+1374$@1@@1@s0$@0#WSTOPSIG
+1378$@1@@1@s0$@0#WTERMSIG
+1382$@0@g329@0@0@1@tp0,g329$@0#wait
+1386$@0@g329@0@0@1@tp1,g329$@0#waitpid
+1400$@1@@1@s0$@0#cfgetispeed
+1404$@1@@1@s0$@0#cfgetospeed
+1408$@0@@1@tp0$@0#cfsetispeed
+1412$@0@@1@tp0$@0#cfsetospeed
+1416$@0@g329@0@0@1@g329$@0#tcdrain
+1420$@0@g329@0@0@1@g329$@0#tcflow
+1424$@0@g329@0@0@1@g329$@0#tcflush
+1428$@0@g329@0@0@1@g329,tp1$@0#tcgetattr
+1432$@0@g329@0@0@1@g329$@0#tcsendbreak
+1436$@0@g329@0@0@1@g329$@0#tcsetattr
+1440$@1@g342@0@0,s1@1@s1$@0#tzset
+1444@6@0@5@0@0@1@@1@s0$@0#_exit
+1448$@0@g329@0@0@1@g329$@0#access
+1452$@0@s1@1@s1$@0#alarm
+1456$@0@g329@0@0@1@g329$@0#chdir
+1460$@0@s3,g329@0@0@1@s3,g329$@0#chown
+1464$@0@s3,g329@0@0,s1@1@s3,g329,s1$@0#close
+1470$@0@s1@1@tp0,s1$@0#ctermid
+1476$@0@@1@tp0@3@0@0#cuserid
+1480$@0@g329@0@0,s3@1@g329,s3$@0#dup2
+1484$@0@g329@0@0,s3@1@g329,s3$@0#dup
+1488@6@0@4@0@0@0@g329@0@0@1@g329$@0#execl
+1492@6@0@4@0@0@0@g329@0@0@1@g329$@0#execle
+1496@6@0@4@0@0@0@g329@0@0@1@g329$@0#execlp
+1502@6@0@4@0@0@0@g329@0@0@1@g329$@0#execv
+1506@6@0@4@0@0@0@g329@0@0@1@g329$@0#execve
+1510@6@0@4@0@0@0@g329@0@0@1@g329$@0#execvp
+1514$@0@s3,g329@0@0@1@s3,g329$@0#fork
+1518$@0@g329@0@0@1@g329$@0#fpathconf
+1524$@0@g329@0@0@1@g329,tp0$@0#getcwd
+1528$@1@@1@s0$@0#getegid
+1532$@1@@1@s0$@0#geteuid
+1536$@1@@1@s0$@0#getgid
+1541$@0@g329@0@0@1@g329,ap1$@0#getgroups
+1547$@1@@1@s0@19@3@0#getlogin
+1551$@1@@1@s0$@0#getpgrp
+1555$@1@@1@s0$@0#getpid
+1559$@1@@1@s0$@0#getppid
+1563$@1@@1@s0$@0#getuid
+1567$@1@@1@s0$@0#isatty
+1571$@0@g329@0@0,s3@1@g329,s3$@0#link
+1575$@0@g329@0@0@1@g329$@0#lseek
+1579$@0@g329@0@0@1@g329$@0#pathconf
+1583$@0@g329@0@0@1@g329$@0#pause
+1587$@0@g329@0@0@1@g329$@0#pipe
+1591$@0@g329@0@0@1@g329,tp1$@0#read
+1595$@0@s3,g329@0@0@1@s3,g329$@0#rmdir
+1599$@0@g329@0@0,s1@1@g329,s1$@0#setgid
+1603$@0@g329@0@0,s1@1@g329,s1$@0#setpgid
+1607$@1@@1@s0$@0#setsid
+1611$@0@g329@0@0,s1@1@g329,s1$@0#setuid
+1615$@1@@1@s0$@0#sleep
+1619$@0@g329@0@0@1@g329$@0#sysconf
+1623$@0@g329@0@0@1@g329$@0#tcgetpgrp
+1627$@0@g329@0@0,s1@1@g329,s1$@0#tcsetpgrp
+1633@6@5@0@0@0@0@g329@0@0@1@g329@19@3@0#ttyname
+1637$@0@s3,g329@0@0@1@s3,g329$@0#unlink
+1641$@0@g329@0@0@1@g329$@0#write
+1648$@0@s3,g329@0@0@1@s3,g329$@0#utime
+*7 (Struct tag)
+1157@1158#@dirent
+1642@1643#@utimbuf
+596@597#@!2
+607@608#@!3
+1195@1196#@group
+1240@1241#@sigaction
+1341@1342#@tms
+1394@1395#@termios
+1181@1182#@flock
+1210@1211#@passwd
+1348@1349#@utsname
+1102@742#@tm
+1294@1295#@stat
+150@151#@lconv
+;; Modules access
+ansi#8@
+posix#13@
+;;End
diff --git a/test/tests2.2/mbool.h b/test/tests2.2/mbool.h
new file mode 100644
index 0000000..c070a3d
--- /dev/null
+++ b/test/tests2.2/mbool.h
@@ -0,0 +1 @@
+# define bool int
diff --git a/test/tests2.2/modarray.c b/test/tests2.2/modarray.c
new file mode 100644
index 0000000..2c57385
--- /dev/null
+++ b/test/tests2.2/modarray.c
@@ -0,0 +1,11 @@
+int main (void) {
+  char buffer[6];
+
+  (void) fgets (buffer, (int) sizeof (buffer), stdin);
+
+  while (buffer[0] != 'x') {
+    (void) fgets (buffer, (int) sizeof (buffer), stdin);
+  }
+
+  return 3;
+}
diff --git a/test/tests2.2/nestext.c b/test/tests2.2/nestext.c
new file mode 100644
index 0000000..8757e0c
--- /dev/null
+++ b/test/tests2.2/nestext.c
@@ -0,0 +1,6 @@
+int f (void)
+{
+  extern int test (void);
+
+  return test();
+}
diff --git a/test/tests2.2/obsolete.lcd b/test/tests2.2/obsolete.lcd
new file mode 100644
index 0000000..55a9917
--- /dev/null
+++ b/test/tests2.2/obsolete.lcd
@@ -0,0 +1,938 @@
+;;LCLint Dump: db.lcd from LCLint 2.0 --- 22 Jan 96
+;;ctTable
+0 u-2 14 28
+0 p1|-2 15 29
+0 b-2 16 30
+0 p3|-2 17 31
+0 p4|-2 18 32
+0 p5|-2 19 33
+0 p6|-2 20 34
+0 p7|-2 21 35
+0 p8|-2 22 36
+0 p9|-2 23 37
+0 p10|-2 24 38
+0 p11|-2 25 39
+0 p12|-2 26 40
+0 p13|-2 27 41
+1 t0|0&
+1 t1|1&
+1 t2|2&
+1 t3|3&
+1 t4|4 103 427
+1 t5|5&
+1 t6|6&
+1 t7|7&
+1 t8|8&
+1 t9|9&
+1 t10|10&
+1 t11|11&
+1 t12|12&
+1 t13|13&
+2 y0|0&
+2 y1|1&
+2 y2|2&
+2 y3|3&
+2 y4|4&
+2 y5|5&
+2 y6|6&
+2 y7|7&
+2 y8|8&
+2 y9|9&
+2 y10|10&
+2 y11|11&
+2 y12|12&
+2 y13|13&
+-2 ?!
+0 s12|&
+0 s17|&
+0 s15|-1 88 -1
+3 S!2{5|@0|$#quot,5|@0|$#rem,}!
+0 s524|&
+0 s20|&
+3 S!3{9|@0|$#quot,9|@0|$#rem,}!
+0 s525|&
+0 s21|&
+3 f1 (1|&#,)^53
+1 t52|52&
+3 f5 (5|&#,)^55
+1 t54|54&
+3 f1 ()^57
+1 t56|56&
+3 f5 (57|&#,)^59
+1 t58|58&
+3 f12 (18|&#,)^61
+1 t60|60&
+3 f5 (18|&#,)^63
+1 t62|62&
+3 f9 (18|&#,)^65
+1 t64|64&
+3 f5 (15|&#,15|&#,)^67
+1 t66|66&
+3 f15 (15|&#,15|@5|6@0@20@2@0#,44|&#,44|&#,67|&#,)^69
+1 t68|68&
+3 f15 (44|&#,44|&#,)^71
+1 t70|70&
+3 f48 (5|&#,5|&#,)^73
+1 t72|72&
+3 f1 (5|&#,)^75
+1 t74|74&
+3 f1 (15|4@0@2&#,)^77
+1 t76|76&
+3 f18 (18|&#,)^79
+1 t78|78&
+3 f9 (9|&#,)^81
+1 t80|80&
+3 f51 (9|&#,9|&#,)^83
+1 t82|82&
+3 f15 (44|&#,)^85
+1 t84|84&
+3 f5 (18|&#,44|&#,)^87
+1 t86|86&
+1 t45|45&
+3 f44 (88|&#,18|&#,44|&#,)^90
+1 t89|89&
+3 f5 (88|&#,18|&#,44|&#,)^92
+1 t91|91&
+3 f5 (15|&#,15|&#,)^94
+1 t93|93&
+3 f1 (15|&#,44|&#,44|&#,94|&#,)^96
+1 t95|95&
+3 f5 (1|&#,)^98
+1 t97|97&
+3 f15 (15|@5|4@0@2&#,44|&#,)^100
+1 t99|99&
+3 f1 (6|&#,)^102
+1 t101|101&
+1 t18|18&
+3 f12 (18|&#,103|6@5@7&#,)^105
+1 t104|104&
+3 f9 (18|&#,103|6@5@7&#,5|&#,)^107
+1 t106|106&
+3 f10 (18|&#,103|6@5@7&#,5|&#,)^109
+1 t108|108&
+3 f5 (18|&#,)^111
+1 t110|110&
+3 f44 (18|&#,88|&#,44|&#,)^113
+1 t112|112&
+3 f5 (18|&#,45|&#,)^115
+1 t114|114&
+3 f1 (18|&#,18|&#,5|&#,)^117
+1 t116|116&
+3 C0.5/2|!
+3 f118 (18|&#,18|&#,5|&#,)^120
+1 t119|119&
+3 f1 (18|&#,5|&#,)^122
+1 t121|121&
+3 f5 (5|&#,)^124
+1 t123|123&
+3 C0.1/15|!
+3 f125 (15|@5|4@0@7&#,15|6@0@9&#,5|&#,44|&#,)^127
+1 t126|126&
+3 f15 (15|6@0@20@2@0#,5|&#,44|&#,)^129
+1 t128|128&
+3 f118 (15|&#,15|&#,44|&#,)^131
+1 t130|130&
+3 f125 (15|@5|4@0@7&#,15|6@0@9&#,44|&#,)^133
+1 t132|132&
+3 f125 (15|@5|4@0@7&#,5|&#,44|&#,)^135
+1 t134|134&
+3 f125 (15|@5|4@0@7&#,15|&#,44|&#,)^137
+1 t136|136&
+3 f118 (18|&#,18|&#,)^139
+1 t138|138&
+3 f118 (18|&#,18|&#,5|&#,)^141
+1 t140|140&
+3 C0.1/18|!
+3 f142 (18|6@0@9&#,18|&#,)^144
+1 t143|143&
+3 f142 (18|6@0@9&#,18|&#,44|&#,)^146
+1 t145|145&
+3 f5 (18|&#,18|&#,)^148
+1 t147|147&
+3 f5 (18|&#,18|&#,44|&#,)^150
+1 t149|149&
+3 f142 (18|@5|4@0@9&#,18|&#,)^152
+1 t151|151&
+3 f142 (18|@5|4@0@9&#,18|&#,44|&#,)^154
+1 t153|153&
+3 f44 (18|&#,)^156
+1 t155|155&
+3 C0.5/4|!
+3 f18 (18|&#,157|&#,)^159
+1 t158|158&
+3 f18 (18|&#,157|&#,)^161
+1 t160|160&
+3 f18 (18|&#,18|&#,)^163
+1 t162|162&
+3 f44 (18|&#,18|&#,)^165
+1 t164|164&
+3 f44 (18|&#,18|&#,)^167
+1 t166|166&
+3 f44 (18|&#,18|&#,44|&#,)^169
+1 t168|168&
+3 f18 (18|&#,18|&#,)^171
+1 t170|170&
+3 f18 (18|@5|&#,4|&#,)^173
+1 t172|172&
+3 f18 (18|@5|&#,4|&#,)^175
+1 t174|174&
+3 f18 (18|6@0@9&#,18|&#,)^177
+1 t176|176&
+0 a0|-1 180 -1
+0 s18|-1 211 -1
+1 t178|178&
+3 f5 (180|&#,)^182
+1 t181|181&
+3 f5 (1|&#,)^184
+1 t183|183&
+3 C0.5/1|!
+3 f185 (157|&#,180|&#,)^187
+1 t186|186&
+3 f5 (157|&#,)^189
+1 t188|188&
+3 f118 (180|&#,)^191
+1 t190|190&
+3 f118 (180|&#,)^193
+1 t192|192&
+3 f5 (180|&#,)^195
+1 t194|194&
+3 f5 (180|&#,)^197
+1 t196|196&
+3 f5 (3|&#,180|&#,)^199
+1 t198|198&
+3 f1 (180|&#,)^201
+1 t200|200&
+3 C0.5/1|!
+3 f202 (180|&#,)^204
+1 t203|203&
+3 f180 (5|&#,18|&#,)^206
+1 t205|205&
+3 f202 (180|&#,)^208
+1 t207|207&
+3 f5 (180|&#,)^210
+1 t209|209&
+1 t179|179&
+3 f5 (180|&#,211|&#,)^213
+1 t212|212&
+3 f18 (18|@5|4@0@7&#,5|&#,180|&#,)^215
+1 t214|214&
+3 f180 (18|&#,18|&#,)^217
+1 t216|216&
+3 f180 (18|&#,18|&#,)^219
+1 t218|218&
+3 C0.5/1|!
+3 f220 (180|&#,)^222
+1 t221|221&
+3 f220 (180|&#,18|&#,!.,)^224
+1 t223|223&
+3 f220 (18|4@0@7&#,18|&#,!.,)^226
+1 t225|225&
+3 f220 (157|&#,180|&#,)^228
+1 t227|227&
+3 f220 (18|&#,180|&#,)^230
+1 t229|229&
+3 f5 (180|&#,211|&#,)^232
+1 t231|231&
+3 f9 (180|&#,)^234
+1 t233|233&
+3 f18 (18|@5|4@0@7&#,)^236
+1 t235|235&
+3 f1 (18|&#,)^238
+1 t237|237&
+3 C0.5/1|!
+3 f239 (5|&#,180|&#,)^241
+1 t240|240&
+3 f239 (18|&#,!.,)^243
+1 t242|242&
+3 f239 (18|&#,)^245
+1 t244|244&
+3 f118 (18|&#,)^247
+1 t246|246&
+3 f118 (18|&#,18|&#,)^249
+1 t248|248&
+3 f1 (180|&#,)^251
+1 t250|250&
+3 f5 (18|&#,!.,)^253
+1 t252|252&
+3 C0.5/1|!
+3 f254 (18|&#,18|&#,!.,)^256
+1 t255|255&
+3 f180 (1|&#,)^258
+1 t257|257&
+3 f18 (18|@5|4@0@7&#,)^260
+1 t259|259&
+3 f18 (18|&#,18|&#,)^262
+1 t261|261&
+3 f1 (118|&#,)^264
+1 t263|263&
+3 f118 (157|&#,)^266
+1 t265|265&
+3 f118 (157|&#,)^268
+1 t267|267&
+3 f118 (157|&#,)^270
+1 t269|269&
+3 f118 (157|&#,)^272
+1 t271|271&
+3 f118 (157|&#,)^274
+1 t273|273&
+3 f118 (157|&#,)^276
+1 t275|275&
+3 f118 (157|&#,)^278
+1 t277|277&
+3 f118 (157|&#,)^280
+1 t279|279&
+3 f118 (157|&#,)^282
+1 t281|281&
+3 f118 (157|&#,)^284
+1 t283|283&
+3 f118 (157|&#,)^286
+1 t285|285&
+3 f118 (157|&#,)^288
+1 t287|287&
+3 f157 (157|&#,)^290
+1 t289|289&
+3 f157 (157|&#,)^292
+1 t291|291&
+3 f157 (157|&#,)^294
+1 t293|293&
+3 e!4{EPERM,ENOENT,ESRCH,EINTR,EIO,ENXIO,E2BIG,ENOEXEC,EBADF,ECHILD,EAGAIN,ENOMEM,EACCES,EFAULT,ENOTBLK,EBUSY,EEXIST,EXDEV,ENODEV,ENOTDIR,EISDIR,EINVAL,ENFILE,EMFILE,ENOTTY,ETXTBSY,EFBIG,ENOSPC,ESPIPE,EROFS,EMLINK,EPIPE,EDOM,ERANGE,EWOULDBLOCK,EINPROGRESS,EALREADY,ENOTSOCK,EDESTADDRREQ,EMSGSIZE,EPROTOTYPE,ENOPROTOOPT,EPROTONOSUPPORT,ESOCKTNOSUPPORT,EOPNOTSUPP,EPFNOSUPPORT,EAFNOSUPPORT,EADDRINUSE,EADDRNOTAVAIL,ENETDOWN,ENETUNREACH,ENETRESET,ECONNABORTED,ECONNRESET,ENOBUFS,EISCONN,ENOTCONN,ESHUTDOWN,ETOOMANYREFS,ETIMEDOUT,ECONNREFUSED,ELOOP,ENAMETOOLONG,EHOSTDOWN,EHOSTUNREACH,ENOTEMPTY,EPROCLIM,EUSERS,EDQUOT,ESTALE,EREMOTE,ENOMSG,EIDRM,EALIGN,EDEADLK,ENOLCK,ENOSYS,EACTIVE,ENOACTIVE,ENORESOURCES,ENOSYSTEM,ENODUST,EDUPNOCONN,EDUPNODISCONN,EDUPNOTCNTD,EDUPNOTIDLE,EDUPNOTWAIT,EDUPNOTRUN,EDUPBADOPCODE,EDUPINTRANSIT,EDUPTOOMANYCPUS}!
+0 s534|&
+3 Slconv{18|@0|$#decimal_point,18|@0|$#thousands_sep,18|@0|$#grouping,18|@0|$#int_curr_symbol,18|@0|$#currency_symbol,18|@0|$#mon_decimal_point,18|@0|$#mon_thousands_sep,18|@0|$#mon_grouping,18|@0|$#positive_sign,18|@0|$#negative_sign,4|@0|$#int_frac_digits,4|@0|$#frac_digits,4|@0|$#p_cs_precedes,4|@0|$#p_sep_by_space,4|@0|$#n_cs_precedes,4|@0|$#n_sep_by_space,4|@0|$#p_sign_posn,4|@0|$#n_sign_posn,}!
+0 s532|-1 299 -1
+1 t298|298&
+3 f299 (1|&#,)^301
+1 t300|300&
+3 f18 (5|&#,18|6@5@7&#,)^303
+1 t302|302&
+3 Sexception{5|@0|$#ttype,18|@0|$#name,12|@0|$#arg1,12|@0|$#arg2,12|@0|$#retval,}!
+0 s530|&
+3 f12 (12|&#,)^307
+1 t306|306&
+3 f12 (12|&#,)^309
+1 t308|308&
+3 f12 (12|&#,)^311
+1 t310|310&
+3 f12 (12|&#,)^313
+1 t312|312&
+3 f12 (12|&#,)^315
+1 t314|314&
+3 f12 (12|&#,)^317
+1 t316|316&
+3 f12 (12|&#,12|&#,)^319
+1 t318|318&
+3 f12 (12|&#,)^321
+1 t320|320&
+3 f12 (12|&#,)^323
+1 t322|322&
+3 f12 (12|&#,)^325
+1 t324|324&
+3 f12 (12|&#,)^327
+1 t326|326&
+3 f12 (12|&#,)^329
+1 t328|328&
+3 f12 (12|&#,)^331
+1 t330|330&
+3 f12 (12|&#,)^333
+1 t332|332&
+3 f12 (12|&#,12|&#,)^335
+1 t334|334&
+3 f12 (12|&#,19|&#,)^337
+1 t336|336&
+3 f12 (12|&#,5|&#,)^339
+1 t338|338&
+3 f12 (12|&#,)^341
+1 t340|340&
+3 f12 (12|&#,)^343
+1 t342|342&
+3 f12 (12|&#,26|&#,)^345
+1 t344|344&
+3 f12 (12|&#,12|&#,)^347
+1 t346|346&
+3 f12 (12|&#,)^349
+1 t348|348&
+3 f12 (12|&#,)^351
+1 t350|350&
+3 f12 (12|&#,)^353
+1 t352|352&
+3 f12 (12|&#,)^355
+1 t354|354&
+3 f12 (12|&#,)^357
+1 t356|356&
+3 f12 (12|&#,)^359
+1 t358|358&
+3 f12 (12|&#,)^361
+1 t360|360&
+3 e!5{DOMAIN,SING,OVERFLOW,UNDERFLOW,TLOSS,PLOSS}!
+0 s535|&
+0 a1|&
+0 a2|&
+3 f1 (364|6@7@7&#,5|&#,)^367
+1 t366|366&
+3 f5 (364|6@7@7&#,)^369
+1 t368|368&
+3 f5 (365|6@7@7&#,5|&#,)^371
+1 t370|370&
+3 f1 (365|6@7@7&#,5|&#,)^373
+1 t372|372&
+0 s16|&
+3 f1 (5|&#,)^376
+1 t375|375&
+0 s22|&
+3 f1 (5|&#,)^379
+1 t378|378&
+3 f1 (5|&#,379|6@5@7&#,)^381
+1 t380|380&
+3 f5 (5|&#,)^383
+1 t382|382&
+0 a3|&
+3 f1 (384|6@7@7&#,)^386
+1 t385|385&
+3 f1 (384|4@7@7&#,!.,)^388
+1 t387|387&
+3 f1 (384|6@7@7&#,15|4@0@7&#,)^390
+1 t389|389&
+3 Stimeval{9|@0|$#tv_sec,9|@0|$#tv_usec,}!
+0 s526|&
+3 Stimezone{5|@0|$#tz_minuteswest,5|@0|$#tz_dsttime,}!
+0 s527|&
+3 e!6{DST_NONE,DST_USA,DST_AUST,DST_WET,DST_MET,DST_EET}!
+0 s536|&
+3 f118 (392|&#,)^398
+1 t397|397&
+3 f1 (392|&#,)^400
+1 t399|399&
+3 Sitimerval{392|@0|$#it_interval,392|@0|$#it_value,}!
+0 s523|&
+3 Stm{5|@0|$#tm_sec,5|@0|$#tm_min,5|@0|$#tm_hour,5|@0|$#tm_mday,5|@0|$#tm_mon,5|@0|$#tm_year,5|@0|$#tm_wday,5|@0|$#tm_yday,5|@0|$#tm_isdst,9|@0|$#tm_gmtoff,18|@0|$#tm_zone,}!
+0 s531|-1 407 -1
+0 s13|-1 412 -1
+0 s14|&
+1 t404|404&
+3 f18 (407|&#,)^409
+1 t408|408&
+3 f406 (1|&#,)^411
+1 t410|410&
+1 t405|405&
+3 f18 (412|&#,)^414
+1 t413|413&
+3 f12 (405|&#,405|&#,)^416
+1 t415|415&
+3 f407 (412|&#,)^418
+1 t417|417&
+3 f407 (412|&#,)^420
+1 t419|419&
+3 f405 (407|&#,)^422
+1 t421|421&
+3 f44 (18|4@0@7&#,44|&#,18|&#,407|&#,)^424
+1 t423|423&
+3 f405 (412|6@5@7&#,)^426
+1 t425|425&
+2 y18|18&
+3 C0.5/1|!
+3 f428 (5|&#,)^430
+1 t429|429&
+3 f428 (18|&#,)^432
+1 t431|431&
+3 f428 (18|&#,18|&#,)^434
+1 t433|433&
+3 f428 (18|&#,18|&#,)^436
+1 t435|435&
+3 f5 (18|&#,18|&#,!.,)^438
+1 t437|437&
+3 f5 (18|&#,427|&#,)^440
+1 t439|439&
+3 f5 (18|&#,18|&#,!.,)^442
+1 t441|441&
+3 f5 (18|&#,427|&#,427|&#,)^444
+1 t443|443&
+3 f5 (18|&#,18|&#,!.,)^446
+1 t445|445&
+3 f5 (18|&#,427|&#,)^448
+1 t447|447&
+3 f1 (180|&#,18|6@5@7&#,)^450
+1 t449|449&
+3 f5 (180|&#,18|6@5@7&#,5|&#,44|&#,)^452
+1 t451|451&
+3 f5 (180|&#,18|6@5@7&#,5|&#,44|&#,)^454
+1 t453|453&
+3 f1 (180|&#,18|6@5@7&#,5|&#,)^456
+1 t455|455&
+3 f1 (180|&#,)^458
+1 t457|457&
+3 f18 (5|&#,)^460
+1 t459|459&
+3 f5 (5|&#,18|4@0@7&#,5|&#,)^462
+1 t461|461&
+3 f44 (15|4@0@7&#,44|&#,44|&#,180|&#,)^464
+1 t463|463&
+3 f44 (15|4@0@7&#,44|&#,44|&#,180|&#,)^466
+1 t465|465&
+3 f44 (15|&#,44|&#,44|&#,180|&#,)^468
+1 t467|467&
+3 f44 (15|&#,44|&#,44|&#,180|&#,)^470
+1 t469|469&
+3 f180 (18|&#,18|&#,180|&#,)^472
+1 t471|471&
+3 f5 (180|&#,18|&#,!.,)^474
+1 t473|473&
+3 C0.5/1|!
+3 f475 (180|&#,9|&#,5|&#,)^477
+1 t476|476&
+3 f1 (180|&#,)^479
+1 t478|478&
+3 f1 (180|&#,)^481
+1 t480|480&
+0 s4|&
+0 s5|&
+0 s25|&
+0 s26|&
+0 s27|-1 520 -1
+0 a6|&
+3 S!7{484|@0|^#g,485|@0|^#j,5|@0|^#l,5|@0|^#h,}!
+0 s528|&
+0 s23|&
+3 e!8{db_OK,salERR,genderERR,jobERR,duplERR,missERR}!
+0 s537|&
+0 s24|&
+0 a10|&
+0 s19|&
+3 f493 (486|6@0@0&#,)^497
+1 t496|496&
+3 f1 (486|6@0@0&#,)^499
+1 t498|498&
+3 f2 (5|6@0@0&#,)^501
+1 t500|500&
+3 f5 (490|6@0@0&#,487|6@7@0&#,)^503
+1 t502|502&
+3 f2 (5|6@0@0&#,)^505
+1 t504|504&
+3 f493 (5|6@0@0&#,5|6@0@0&#,)^507
+1 t506|506&
+3 f1 (1|6@0@0&#,)^509
+1 t508|508&
+3 f1 (1|6@0@0&#,)^511
+1 t510|510&
+3 e!9{MALE,FEMALE,gender_ANY}!
+0 s538|&
+3 e!10{MGR,NONMGR,job_ANY}!
+0 s533|&
+3 S!11{5|@0|^#ssNum,32|@0|^#name,5|@0|^#salary,484|@0|^#gen,485|@0|^#j,}!
+0 s529|&
+3 f1 (32|4@0@0&#,486|6@0@0&#,)^519
+1 t518|518&
+1 t486|486&
+3 f2 (520|6@0@0&#,520|6@0@0&#,)^522
+1 t521|521&
+3 f2 (520|6@0@0&#,32|6@0@0&#,)^524
+1 t523|523&
+3 f1 (1|6@0@0&#,)^526
+1 t525|525&
+3 f487 (1|6@0@0&#,)^528
+1 t527|527&
+3 f1 (487|6@7@0&#,)^530
+1 t529|529&
+3 f1 (487|6@7@0&#,)^532
+1 t531|531&
+3 f2 (487|6@7@0&#,486|6@0@0&#,)^534
+1 t533|533&
+3 f1 (487|6@7@0&#,486|6@0@0&#,)^536
+1 t535|535&
+3 f2 (487|6@7@0&#,486|6@0@0&#,)^538
+1 t537|537&
+3 f487 (487|6@7@0&#,487|6@7@0&#,)^540
+1 t539|539&
+3 f487 (487|6@7@0&#,487|6@7@0&#,)^542
+1 t541|541&
+3 f1 (487|6@7@0&#,487|6@7@0&#,)^544
+1 t543|543&
+3 f5 (487|6@7@0&#,)^546
+1 t545|545&
+3 f2 (486|6@0@0&#,487|6@7@0&#,)^548
+1 t547|547&
+3 f2 (487|6@7@0&#,487|6@7@0&#,)^550
+1 t549|549&
+3 f486 (487|6@7@0&#,)^552
+1 t551|551&
+3 f18 (487|6@7@0&#,)^554
+1 t553|553&
+3 f1 (1|6@0@0&#,)^556
+1 t555|555&
+3 f1 (487|6@7@0&#,486|@3|6@0@0&#,)^558
+1 t557|557&
+0 a7|&
+0 a11|&
+0 a8|&
+3 f561 (1|6@0@0&#,)^563
+1 t562|562&
+3 f1 (561|6@7@0&#,)^565
+1 t564|564&
+3 f1 (561|6@7@0&#,559|6@7@0&#,)^567
+1 t566|566&
+3 f2 (561|6@7@0&#,559|6@7@0&#,)^569
+1 t568|568&
+3 f2 (559|6@7@0&#,561|6@7@0&#,)^571
+1 t570|570&
+3 f559 (561|6@7@0&#,)^573
+1 t572|572&
+3 f5 (561|6@7@0&#,)^575
+1 t574|574&
+3 f1 (561|6@7@0&#,561|6@7@0&#,)^577
+1 t576|576&
+3 f18 (561|6@7@0&#,)^579
+1 t578|578&
+3 f1 (561|6@7@0&#,)^581
+1 t580|580&
+3 f1 (1|6@0@0&#,)^583
+1 t582|582&
+3 f1 (561|6@7@0&#,559|@3|6@7@0&#,)^585
+1 t584|584&
+3 f559 (1|6@0@0&#,)^587
+1 t586|586&
+3 f1 (559|6@7@0&#,)^589
+1 t588|588&
+3 f1 (559|6@7@0&#,486|6@0@0&#,)^591
+1 t590|590&
+3 f486 (559|6@7@0&#,)^593
+1 t592|592&
+3 f2 (559|6@7@0&#,559|6@7@0&#,)^595
+1 t594|594&
+3 f1 (1|6@0@0&#,)^597
+1 t596|596&
+0 a9|&
+3 f598 (1|6@0@0&#,)^600
+1 t599|599&
+3 f1 (598|6@7@0&#,486|6@0@0&#,559|6@7@0&#,)^602
+1 t601|601&
+3 f2 (598|6@7@0&#,559|6@7@0&#,)^604
+1 t603|603&
+3 f559 (486|6@0@0&#,598|6@7@0&#,)^606
+1 t605|605&
+3 f1 (1|6@0@0&#,)^608
+1 t607|607&
+3 f1 (598|6@7@0&#,559|@3|6@7@0&#,)^610
+1 t609|609&
+;;symTable
+*0 (Datatype)
+0@+@+@0@7@0@0@178#FILE
+0@+@+@0@7@0@0@364#jmp_buf
+0@+@+@0@7@0@0@365#sigjmp_buf
+0@+@+@0@7@0@0@384#va_list
+0@-@=@0@0@0@0@482#float
+0@-@=@0@0@0@0@483#___vp
+0@+@+@0@7@0@0@487#empset
+0@+@-@0@7@0@0@559#eref
+0@+@+@0@7@0@0@561#erc
+0@+@+@0@7@0@0@598#ereftab
+0@+@-@0@7@0@0@494#db
+0@+@-@0@7@0@0@560#map
+2@-@-@0@0@0@0@2#bool
+5@-@=@0@0@0@0@405#time_t
+5@-@=@0@0@0@0@406#clock_t
+8@-@=@0@0@0@0@45#wchar_t
+9@-@=@0@0@0@0@374#sig_atomic_t
+10@-@=@0@0@0@0@44#size_t
+15@-@=@0@0@0@0@179#fpos_t
+32@-@=@0@0@0@0@495#cstring
+47@-@=@0@0@0@0@48#div_t
+50@-@=@0@0@0@0@51#ldiv_t
+376@-@=@0@0@0@0@377#__scp
+489@-@=@0@0@0@0@490#db_q
+492@-@=@0@0@0@0@493#db_status
+513@-@=@0@0@0@0@484#gender
+515@-@=@0@0@0@0@485#job
+517@-@=@0@0@0@0@486#employee
+*1 (Constant)
+2$#TRUE#FALSE
+5$#EXIT_FAILURE#FLT_MAX_10_EXP#LDBL_MANT_DIG#FLT_DIG#DBL_DIG#LDBL_MAX_EXP#DBL_MAX_EXP#FLT_MAX_EXP#LDBL_MIN_10_EXP#DBL_MIN_10_EXP#FLT_MIN_10_EXP#LDBL_DIG#FLT_MIN_EXP#DBL_MIN_EXP#LDBL_MIN_EXP#CLOCKS_PER_SEC#LC_MONETARY#LC_TIME#LC_NUMERIC#LC_CTYPE#LC_COLLATE#LC_ALL#NL_LANGMAX#NL_LBLMAX#NL_TEXTMAX#NL_SETMAX#NL_NMAX#NL_MSGMAX#NL_ARGMAX#MB_LEN_MAX#UID_MAX#NZERO#TMP_MAX#SYS_OPEN#SYS_NMLN#STD_BLK#PROC_MAX#PIPE_MAX#BUFSIZ#PIPE_BUF#DBL_MANT_DIG#FLT_MANT_DIG#FLT_ROUNDS#SYSPID_MAX#PID_MAX#PATH_MAX#EOF#ITIMER_VIRTUAL#PASS_MAX#ITIMER_REAL#OPEN_MAX#MAX_CHAR#MAX_CANON#MAX_INPUT#NGROUPS_MAX#NAME_MAX#LONG_BIT#WORD_BIT#USI_MAX#ULONG_MAX#LONG_MAX#LONG_MIN#UINT_MAX#INT_MAX#INT_MIN#USHRT_MAX#SHRT_MAX#SHRT_MIN#LINK_MAX#LOCK_MAX#FLT_RADIX#FCHR_MAX#SEEK_SET#SEEK_CUR#SEEK_END#CHILD_MAX#SCHAR_MAX#SCHAR_MIN#UCHAR_MAX#CHAR_MAX#CHAR_MIN#ITIMER_PROF#CHAR_BIT#ARG_MAX#LDBL_MAX_10_EXP#MB_CUR_MAX#DBL_MAX_10_EXP#SIGTERM#SIGSEGV#SIGINT#SIGILL#SIGFPE#SIGABRT#EXIT_SUCCESS
+9$#RAND_MAX
+12$#M_E#M_LOG10E#M_LOG2E#FLT_MIN#DBL_MIN#LDBL_MIN#FLT_MAX#LDBL_EPSILON#DBL_EPSILON#FLT_EPSILON#M_SQRT2#M_SQRT1_2#MAXFLOAT#M_LN2#HUGE_VAL#M_LN10#DBL_MAX#M_PI#LDBL_MAX#HUGE#M_PI_2#M_PI_4#M_1_PI#M_2_PI#M_2_SQRTPI
+15@i0@@6#NULL
+44$#employeePrintSize#maxEmployeeName
+377$#SIG_IGN#SIG_ERR#SIG_DFL
+559@@@7#erefNIL
+295$#ENFILE#EMFILE#ENOTTY#ETXTBSY#EFBIG#ENOSPC#ESPIPE#EROFS#EMLINK#EPIPE#EDOM#ERANGE#EWOULDBLOCK#EINPROGRESS#EALREADY#ENOTSOCK#EDESTADDRREQ#EMSGSIZE#EPROTOTYPE#ENOPROTOOPT#EPROTONOSUPPORT#ESOCKTNOSUPPORT#EOPNOTSUPP#EPFNOSUPPORT#EAFNOSUPPORT#EADDRINUSE#EADDRNOTAVAIL#ENETDOWN#ENETUNREACH#ENETRESET#ECONNABORTED#ECONNRESET#ENOBUFS#EISCONN#ENOTCONN#ESHUTDOWN#ETOOMANYREFS#ETIMEDOUT#ECONNREFUSED#ELOOP#ENAMETOOLONG#EHOSTDOWN#EHOSTUNREACH#ENOTEMPTY#EPROCLIM#EUSERS#EDQUOT#ESTALE#EREMOTE#ENOMSG#EIDRM#EALIGN#EDEADLK#ENOLCK#ENOSYS#EACTIVE#ENOACTIVE#ENORESOURCES#ENOSYSTEM#ENODUST#EDUPNOCONN#EDUPNODISCONN#EDUPNOTCNTD#EDUPNOTIDLE#EDUPNOTWAIT#EDUPNOTRUN#EDUPBADOPCODE#EPERM#EDUPINTRANSIT#ENOENT#EDUPTOOMANYCPUS#ESRCH#EINTR#EIO#ENXIO#EBADF#ECHILD#EAGAIN#ENOMEM#EACCES#EFAULT#ENOTBLK#EBUSY#E2BIG#EEXIST#ENOEXEC#EXDEV#ENODEV#ENOTDIR#EISDIR#EINVAL
+362$#OVERFLOW#DOMAIN#UNDERFLOW#SING#PLOSS#TLOSS
+395$#DST_AUST#DST_USA#DST_NONE#DST_WET#DST_EET#DST_MET
+*2 (Enum member)
+514$#job_ANY#MGR#NONMGR
+491$#missERR#genderERR#salERR#jobERR#db_OK#duplERR
+512$#FEMALE#MALE#gender_ANY
+*3 (Variable)
+5|@0|0@0@0@0@2#signgam#errno
+180|@0|0@0@0@0@1#stdin#stderr#stdout
+363|@0|0@0@0@0@2#_matherrors
+427|@0|0@0@0@0@2#tzname
+494|@0|0@7@0@0@2#d
+560|@0|0@7@0@0@2#m
+*4 (Function)
+53@6@0@5@0@0^$@#abort
+55$^$@#abs
+59$^$@#atexit
+61$^$@#atof
+63$^$@#atoi
+65$^$@#atol
+69$^@19@2@#bsearch
+71@6@5@0@0@0^@2@0@#calloc
+73$^$@#div
+75@6@0@5@0@0^$@#exit
+77$@1@@1@tp0$@#free
+79$^@19@0@#getenv
+81$^$@#labs
+83$^$@#ldiv
+85@4@5@0@0@0^@2@0@#malloc
+87$^$@#mblen
+90$@1@@1@tp0$@#mbstowcs
+92$@1@@1@tp0$@#mbtowc
+96$@1@@1@tp0$@#qsort
+98$^$@#rand
+100@6@5@0@0@0^@2@0@#realloc
+102$^$@#srand
+105$@1@@1@tp1$@#strtod
+107$@1@@1@tp1$@#strtol
+109$@1@@1@tp1$@#strtoul
+111$@1@@1@s3$@#system
+113$@1@@1@tp0$@#wcstombs
+115$@1@@1@tp0$@#wctomb
+117$@1@@1@tp1$@#bcopy
+120$^$@#bcmp
+122$@1@@1@tp0$@#bzero
+124$^$@#ffs
+127$@1@@1@tp0$@#memccpy
+129$^@19@2@#memchr
+131$^$@#memcmp
+133$@1@@1@tp0$@#memcpy
+135$@1@@1@tp0$@#memset
+137$@1@@1@tp0$@#memmove
+139$^$@#strcasecmp
+141$^$@#strncasecmp
+144$@1@@1@tp0$@#strcat
+146$@1@@1@tp0$@#strncat
+148$^$@#strcmp
+150$^$@#strncmp
+152$@1@@1@tp0$@#strcpy
+154$@1@@1@tp0$@#strncpy
+156$^$@#strlen
+159@6@5@0@0@0^@19@0@#strchr
+161@6@5@0@0@0^@19@0@#strrchr
+163@6@5@0@0@0^@19@0@#strpbrk
+165$^$@#strspn
+167$^$@#strcspn
+169$@1@@1@tp0$@#strxfrm
+171@6@5@0@0@0^@19@0@#strtok
+173@6@5@0@0@0^@19@0@#index
+175@6@5@0@0@0^@19@0@#rindex
+177@6@5@0@0@0^@19@0@#strstr
+182$@1@@1@tp0$@0,1,2,3#getc
+184$@1@g274@1@tg274$@0,1,2,3#getchar
+187$@1@@1@tp1$@0,1,2,3#putc
+189$@1@g276@1@tg276$@0,1,2,3#putchar
+191$^$@0,1,2,3#feof
+193$^$@0,1,2,3#ferror
+195$^$@0,1,2,3#fileno
+197$^$@0,1,2,3#_filbuf
+199$^$@0,1,2,3#_flsbuf
+201$@1@@1@tp0$@0,1,2,3#clearerr
+204$@1@@1@tp0$@0,1,2,3#fclose
+206@6@5@0@0@0^@2@0@0,1,2,3#fdopen
+208$@1@@1@tp0$@0,1,2,3#fflush
+210$@1@@1@tp0$@0,1,2,3#fgetc
+213$^$@0,1,2,3#fgetpos
+215@6@5@0@0@0@1@@1@tp2,tp0$@0,1,2,3#fgets
+217@6@5@0@0@0^@19@0@0,1,2,3#fopen
+219@6@5@0@0@0^@19@0@0,1,2,3#popen
+222$@1@@1@tp0$@0,1,2,3#pclose
+224@6@0@0@1@0@1@@1@tp0$@0,1,2,3#fprintf
+226@6@0@0@1@0@1@@1@tp0$@0,1,2,3#sprintf
+228$@1@@1@tp1$@0,1,2,3#fputc
+230$@1@@1@tp1$@0,1,2,3#fputs
+232$@1@@1@tp0$@0,1,2,3#fsetpos
+234$^$@0,1,2,3#ftell
+236@6@5@0@0@0@1@g274@1@tg274$@0,1,2,3#gets
+238$@1@g275@1@tg275$@0,1,2,3#perror
+241$@1@@1@tp1$@0,1,2,3#ungetc
+243@6@0@0@1@0@1@g276@1@tg276$@0,1,2,3#printf
+245$@1@g276@1@tg276$@0,1,2,3#puts
+247$^$@0,1,2,3#remove
+249$^$@0,1,2,3#rename
+251$@1@@1@tp0$@0,1,2,3#rewind
+253@6@0@0@2@0@1@g274@1@tg274$@0,1,2,3#scanf
+256@6@0@0@2@0^$@0,1,2,3#sscanf
+258$^@2@0@0,1,2,3#tmpfile
+260$^$@0,1,2,3#tmpnam
+262$^@2@0@0,1,2,3#tempnam
+264@6@0@7@0@0^$@0,1,2,3#assert
+266$^$@0,1,2,3#isalnum
+268$^$@0,1,2,3#isalpha
+270$^$@0,1,2,3#isascii
+272$^$@0,1,2,3#iscntrl
+274$^$@0,1,2,3#isdigit
+276$^$@0,1,2,3#isgraph
+278$^$@0,1,2,3#islower
+280$^$@0,1,2,3#isprint
+282$^$@0,1,2,3#ispunct
+284$^$@0,1,2,3#isspace
+286$^$@0,1,2,3#isupper
+288$^$@0,1,2,3#isxdigit
+290$^$@0,1,2,3#toascii
+292$^$@0,1,2,3#tolower
+294$^$@0,1,2,3#toupper
+301$^$@0,1,2,3#localeconv
+303@6@5@0@0@0^@20@3@0,1,2,3#setlocale
+307$^$@0,1,2,3#acos
+309$^$@0,1,2,3#acosh
+311$^$@0,1,2,3#asin
+313$^$@0,1,2,3#asinh
+315$^$@0,1,2,3#atan
+317$^$@0,1,2,3#atanh
+319$^$@0,1,2,3#atan2
+321$^$@0,1,2,3#cbrt
+323$^$@0,1,2,3#ceil
+325$^$@0,1,2,3#cos
+327$^$@0,1,2,3#cosh
+329$^$@0,1,2,3#exp
+331$^$@0,1,2,3#fabs
+333$^$@0,1,2,3#floor
+335$^$@0,1,2,3#fmod
+337$^$@0,1,2,3#frexp
+339$^$@0,1,2,3#ldexp
+341$^$@0,1,2,3#log
+343$^$@0,1,2,3#log10
+345$^$@0,1,2,3#modf
+347$^$@0,1,2,3#pow
+349$^$@0,1,2,3#rint
+351$^$@0,1,2,3#sin
+353$^$@0,1,2,3#sinh
+355$^$@0,1,2,3#sqrt
+357$^$@0,1,2,3#tan
+359$^$@0,1,2,3#tanh
+361$^$@0,1,2,3#trunc
+367@6@0@4@0@0^$@0,1,2,3#longjmp
+369$@1@@1@p0$@0,1,2,3#setjmp
+371$@1@@1@p0$@0,1,2,3#sigsetjmp
+373@6@0@4@0@0^$@0,1,2,3#siglongjmp
+381$$$@0,1,2,3#signal
+383$$$@0,1,2,3#raise
+386$@1@@1@p0$@0,1,2,3#va_end
+388$@1@@1@p0$@0,1,2,3#va_start
+390$@1@@1@p0$@0,1,2,3#va_arg
+398$^$@0,1,2,3#timerisset
+400$$$@0,1,2,3#timerclear
+409$^$@0,1,2,3#asctime
+411$^$@0,1,2,3#clock
+414$$$@0,1,2,3#ctime
+416$^$@0,1,2,3#difftime
+418$^$@0,1,2,3#gmtime
+420$^$@0,1,2,3#localtime
+422$^$@0,1,2,3#mktime
+424$@1@@1@tp0$@0,1,2,3#strftime
+426$^$@0,1,2,3#time
+430$^$@0,1,2,3#close
+432$@1@@1@s3$@0,1,2,3#unlink
+434$@1@@1@s3$@0,1,2,3#link
+436$@1@@1@s3$@0,1,2,3#symlink
+438$^$@0,1,2,3#execl
+440$^$@0,1,2,3#execv
+442$^$@0,1,2,3#execle
+444$^$@0,1,2,3#execve
+446$^$@0,1,2,3#execlp
+448$^$@0,1,2,3#execvp
+450$^$@0,1,2,3#setbuf
+452$^$@0,1,2,3#setvbuf
+454$^$@0,1,2,3#setvbuf_unlocked
+456$^$@0,1,2,3#setbuffer
+458$^$@0,1,2,3#setlinebuf
+460$^@20@3@0,1,2,3#strerror
+462$^$@0,1,2,3#strerror_r
+464$@1@@1@tp3,tp0$@0,1,2,3#fread
+466$@1@@1@tp3,tp0$@0,1,2,3#fread_unlocked
+468$@1@@1@tp3$@0,1,2,3#fwrite
+470$@1@@1@tp3$@0,1,2,3#fwrite_unlocked
+472$@1@@1@tp2$@0,1,2,3#freopen
+474@6@0@0@2@0@1@@1@tp0$@0,1,2,3#fscanf
+477$@1@@1@tp0$@0,1,2,3#fseek
+479$@1@@1@tp0$@0,1,2,3#funlockfile
+481$@1@@1@tp0$@0,1,2,3#flockfile
+497$@1@@1@s2$@10#hire
+499$@1@@1@s2$@10#uncheckedHire
+501$@1@@1@s2$@10#fire
+503$@1@@1@p1$@10#query
+505$@1@@1@s2$@10#promote
+507$@1@@1@s2$@10#setSalary
+509$@1@g276@1@tg276$@10#db_print
+511$@1@@1@s2$@10#db_initMod
+519$@1@@1@p0$@#employee_sprint
+522$^$@#employee_equal
+524$@1@@1@fname.tp0$@#employee_setName
+526$^$@#employee_initMod
+528@6@7@0@0@0^$@6#empset_create
+530$@1@@1@p0$@6#empset_final
+532$@1@@1@p0$@6#empset_clear
+534$@1@@1@p0$@6#empset_insert
+536$@1@@1@p0$@6#empset_insertUnique
+538$@1@@1@p0$@6#empset_delete
+540@6@7@0@0@0^$@6#empset_union
+542@6@7@0@0@0^$@6#empset_disjointUnion
+544$@1@@1@p0$@6#empset_intersect
+546$^$@6#empset_size
+548$^$@6#empset_member
+550$^$@6#empset_subset
+552$^$@6#empset_choose
+554$^$@6#empset_sprint
+556$^$@6#empset_initMod
+563@6@7@0@0@0^$@8#erc_create
+565$@1@@1@p0$@8#erc_clear
+567$@1@@1@p0$@8#erc_insert
+569$@1@@1@p0$@8#erc_delete
+571$^$@8#erc_member
+573@6@7@0@0@0^$@8#erc_choose
+575$^$@8#erc_size
+577$@1@@1@p0$@8#erc_join
+579$^$@8#erc_sprint
+581$@1@@1@p0$@8#erc_final
+583$^$@8#erc_initMod
+587@6@7@0@0@0@1@@1@s2$@7,11#eref_alloc
+589$@1@@1@s2$@7,11#eref_free
+591$@1@@1@s2$@7,11#eref_assign
+593$^$@7,11#eref_get
+595$^$@7,11#eref_equal
+597$@1@@1@s2$@7,11#eref_initMod
+600@6@7@0@0@0^$@9#ereftab_create
+602$@1@@1@p0$@9#ereftab_insert
+604$@1@@1@p0$@9#ereftab_delete
+606@6@7@0@0@0^$@9#ereftab_lookup
+608$^$@9#ereftab_initMod
+*5 (Iterator)
+558@6#empset_elements
+585@8#erc_elements
+610@9#ereftab_elements
+*6 (Iterator finalizer)
+0@6#end_empset_elements
+0@8#end_erc_elements
+0@9#end_ereftab_elements
+*7 (Struct tag)
+401@402#@itimerval
+46@47#@!2
+49@50#@!3
+391@392#@timeval
+393@394#@timezone
+488@489#@!7
+516@517#@!11
+304@305#@exception
+403@404#@tm
+297@298#@lconv
+*9 (Enum tag)
+514@515#&!10
+295@296#&!4
+362@363#&!5
+395@396#&!6
+491@492#&!8
+512@513#&!9
+;; Modules access
+stdlibs#0,1,2,3@
+dbase#10@
+employee#@
+empset#6@
+erc#8@
+eref#7,11@
+ereftab#9@
+;;End
diff --git a/test/tests2.2/offsetof.c b/test/tests2.2/offsetof.c
new file mode 100644
index 0000000..2b2e149
--- /dev/null
+++ b/test/tests2.2/offsetof.c
@@ -0,0 +1,19 @@
+typedef int U_type;
+static int x;
+
+void f3 (/*@null@*/ int *a1, int a2, int *a3, int a4);
+
+typedef struct {
+    char sf3 ;
+} some_struct ;
+
+void f2 (int n_bytes) ;
+
+void f1 (void)
+{
+    f2 ((int) offsetof (some_struct, sf3));
+    f3 (0, 0, (U_type *)&x, 0);
+}
+
+
+
diff --git a/test/tests2.2/oldversion.lcd b/test/tests2.2/oldversion.lcd
new file mode 100644
index 0000000..3d67307
--- /dev/null
+++ b/test/tests2.2/oldversion.lcd
@@ -0,0 +1,1422 @@
+;;LCLint Dump: null6.lcd
+;;LCLint 2.1 --- Tue Aug 8 4:45:29 EDT 1996
+;;lib:-1
+;;ctTable
+0 u-2 17 34
+0 p1|-2 18 35
+0 b-2 19 36
+0 p3|-2 20 37
+0 p4|-2 21 38
+0 p5|-2 22 39
+0 p6|-2 23 40
+0 p7|-2 24 41
+0 p8|-2 25 42
+0 p9|-2 26 43
+0 p10|-2 27 44
+0 p11|-2 28 45
+0 p12|-2 29 46
+0 p13|-2 30 47
+0 p14|-2 31 48
+0 p15|-2 32 49
+0 p16|-2 33 50
+1 t0|0 496 -1
+1 t1|1&
+1 t2|2&
+1 t3|3&
+1 t4|4 497 -1
+1 t5|5&
+1 t6|6&
+1 t7|7&
+1 t8|8&
+1 t9|9&
+1 t10|10&
+1 t11|11&
+1 t12|12&
+1 t13|13&
+1 t14|14&
+1 t15|15&
+1 t16|16&
+2 y0|0&
+2 y1|1&
+2 y2|2&
+2 y3|3&
+2 y4|4&
+2 y5|5&
+2 y6|6&
+2 y7|7&
+2 y8|8&
+2 y9|9&
+2 y10|10&
+2 y11|11&
+2 y12|12&
+2 y13|13&
+2 y14|14&
+2 y15|15&
+2 y16|16&
+-2 ?!
+0 s2|&
+0 s5|&
+0 s11|&
+0 s12|&
+0 s6|-1 615 -1
+0 s7|&
+0 a0|-1 650 -1
+3 C0.5/18|!
+3 C0.59/2|!
+3 C0.5/2|!
+3 f0 (61|@7|$#,)^63
+1 t62|62&
+3 f1 (61|@7|$#,)^65
+1 t64|64&
+3 C0.5/4|!
+3 f0 (66|$#,)^68
+1 t67|67&
+3 f5 (66|$#,)^70
+1 t69|69&
+3 f61 (66|$#,)^72
+1 t71|71&
+3 f0 (66|$#,)^74
+1 t73|73&
+3 f5 (66|$#,)^76
+1 t75|75&
+3 f61 (66|$#,)^78
+1 t77|77&
+3 f0 (66|$#,)^80
+1 t79|79&
+3 f5 (66|$#,)^82
+1 t81|81&
+3 f61 (66|$#,)^84
+1 t83|83&
+3 f0 (66|$#,)^86
+1 t85|85&
+3 f5 (66|$#,)^88
+1 t87|87&
+3 f61 (66|$#,)^90
+1 t89|89&
+3 f0 (66|$#,)^92
+1 t91|91&
+3 f5 (66|$#,)^94
+1 t93|93&
+3 f61 (66|$#,)^96
+1 t95|95&
+3 f0 (66|$#,)^98
+1 t97|97&
+3 f5 (66|$#,)^100
+1 t99|99&
+3 f61 (66|$#,)^102
+1 t101|101&
+3 f0 (66|$#,)^104
+1 t103|103&
+3 f5 (66|$#,)^106
+1 t105|105&
+3 f61 (66|$#,)^108
+1 t107|107&
+3 f0 (66|$#,)^110
+1 t109|109&
+3 f5 (66|$#,)^112
+1 t111|111&
+3 f61 (66|$#,)^114
+1 t113|113&
+3 f0 (66|$#,)^116
+1 t115|115&
+3 f5 (66|$#,)^118
+1 t117|117&
+3 f61 (66|$#,)^120
+1 t119|119&
+3 f0 (66|$#,)^122
+1 t121|121&
+3 f5 (66|$#,)^124
+1 t123|123&
+3 f61 (66|$#,)^126
+1 t125|125&
+3 f0 (66|$#,)^128
+1 t127|127&
+3 f5 (66|$#,)^130
+1 t129|129&
+3 f61 (66|$#,)^132
+1 t131|131&
+3 f0 (66|$#,)^134
+1 t133|133&
+3 f5 (66|$#,)^136
+1 t135|135&
+3 f66 (66|$#,)^138
+1 t137|137&
+3 f0 (66|$#,)^140
+1 t139|139&
+3 f5 (66|$#,)^142
+1 t141|141&
+3 f66 (66|$#,)^144
+1 t143|143&
+3 Slconv{21|@1|0@0@3&#decimal_point,21|@1|0@0@3&#thousands_sep,21|@1|0@0@3&#grouping,21|@1|0@0@3&#int_curr_symbol,21|@1|0@0@3&#currency_symbol,21|@1|0@0@3&#mon_decimal_point,21|@1|0@0@3&#mon_thousands_sep,21|@1|0@0@3&#mon_grouping,21|@1|0@0@3&#positive_sign,21|@1|0@0@3&#negative_sign,4|@1|$#int_frac_digits,4|@1|$#frac_digits,4|@1|$#p_cs_precedes,4|@1|$#p_sep_by_space,4|@1|$#n_cs_precedes,4|@1|$#n_sep_by_space,4|@1|$#p_sign_posn,4|@1|$#n_sign_posn,}!
+0 s327|-1 157 -1
+3 f0 (5|$#,21|0@5@7&#,)^148
+1 t147|147&
+3 f17 (5|$#,21|0@5@7&#,)^150
+1 t149|149&
+3 f21 (5|$#,21|0@5@7&#,)^152
+1 t151|151&
+3 f0 (1|$#,)^154
+1 t153|153&
+3 f17 (1|$#,)^156
+1 t155|155&
+1 t146|146&
+3 f157 (1|$#,)^159
+1 t158|158&
+3 f0 (15|$#,)^161
+1 t160|160&
+3 f15 (15|$#,)^163
+1 t162|162&
+3 f0 (15|$#,)^165
+1 t164|164&
+3 f15 (15|$#,)^167
+1 t166|166&
+3 f0 (15|$#,)^169
+1 t168|168&
+3 f15 (15|$#,)^171
+1 t170|170&
+3 f0 (15|$#,)^173
+1 t172|172&
+3 f15 (15|$#,)^175
+1 t174|174&
+3 f0 (15|$#,)^177
+1 t176|176&
+3 f15 (15|$#,)^179
+1 t178|178&
+3 f0 (15|$#,)^181
+1 t180|180&
+3 f15 (15|$#,)^183
+1 t182|182&
+3 f0 (15|$#,15|$#,)^185
+1 t184|184&
+3 f15 (15|$#,15|$#,)^187
+1 t186|186&
+3 f0 (15|$#,)^189
+1 t188|188&
+3 f15 (15|$#,)^191
+1 t190|190&
+3 f0 (15|$#,)^193
+1 t192|192&
+3 f15 (15|$#,)^195
+1 t194|194&
+3 f0 (15|$#,)^197
+1 t196|196&
+3 f15 (15|$#,)^199
+1 t198|198&
+3 f0 (15|$#,)^201
+1 t200|200&
+3 f15 (15|$#,)^203
+1 t202|202&
+3 f0 (15|$#,5|$#,)^205
+1 t204|204&
+3 f15 (15|$#,5|$#,)^207
+1 t206|206&
+3 f0 (15|$#,22|4@0@7&#,)^209
+1 t208|208&
+3 f15 (15|$#,22|4@0@7&#,)^211
+1 t210|210&
+3 f0 (15|$#,)^213
+1 t212|212&
+3 f15 (15|$#,)^215
+1 t214|214&
+3 f0 (15|$#,)^217
+1 t216|216&
+3 f15 (15|$#,)^219
+1 t218|218&
+3 f0 (15|$#,15|$#,)^221
+1 t220|220&
+3 f15 (15|$#,15|$#,)^223
+1 t222|222&
+3 f0 (15|$#,)^225
+1 t224|224&
+3 f15 (15|$#,)^227
+1 t226|226&
+3 f0 (15|$#,)^229
+1 t228|228&
+3 f15 (15|$#,)^231
+1 t230|230&
+3 f0 (15|$#,)^233
+1 t232|232&
+3 f15 (15|$#,)^235
+1 t234|234&
+3 f0 (15|$#,)^237
+1 t236|236&
+3 f15 (15|$#,)^239
+1 t238|238&
+3 f0 (15|$#,32|4@0@7&#,)^241
+1 t240|240&
+3 f15 (15|$#,32|4@0@7&#,)^243
+1 t242|242&
+3 f0 (15|$#,15|$#,)^245
+1 t244|244&
+3 f15 (15|$#,15|$#,)^247
+1 t246|246&
+0 a13|&
+3 f0 (248|4@0@7&#,)^250
+1 t249|249&
+3 f5 (248|4@0@7&#,)^252
+1 t251|251&
+3 f0 (248|$#,5|$#,)^254
+1 t253|253&
+3 f1 (248|$#,5|$#,)^256
+1 t255|255&
+0 s8|&
+3 ?!
+3 f258 (5|$#,)^260
+1 t259|259&
+3 f1 (5|$#,)^262
+1 t261|261&
+3 ?!
+3 f263 (5|$#,)^265
+1 t264|264&
+3 f1 (5|$#,)^267
+1 t266|266&
+3 ?!
+3 f268 (5|$#,)^270
+1 t269|269&
+3 f1 (5|$#,)^272
+1 t271|271&
+3 ?!
+3 ?!
+3 f274 (5|$#,)^276
+1 t275|275&
+3 f1 (5|$#,)^278
+1 t277|277&
+3 f273 (5|$#,278|0@5@7&#,)^280
+1 t279|279&
+3 f1 (5|$#,278|0@5@7&#,)^282
+1 t281|281&
+3 f0 (5|$#,)^284
+1 t283|283&
+3 f5 (5|$#,)^286
+1 t285|285&
+0 a14|&
+3 f0 (287|4@0@7&#,!.,)^289
+1 t288|288&
+3 f1 (287|4@0@7&#,!.,)^291
+1 t290|290&
+3 f0 (287|$#,)^293
+1 t292|292&
+3 f1 (287|$#,)^295
+1 t294|294&
+0 a15|-1 298 -1
+0 a16|-1 447 -1
+1 t296|296&
+3 f0 (21|$#,)^300
+1 t299|299&
+3 f5 (21|$#,)^302
+1 t301|301&
+3 f0 (21|$#,21|$#,)^304
+1 t303|303&
+3 f5 (21|$#,21|$#,)^306
+1 t305|305&
+3 f0 (1|$#,)^308
+1 t307|307&
+3 f17 (1|$#,)^310
+1 t309|309&
+3 f298 (1|$#,)^312
+1 t311|311&
+3 f0 (21|@5|4@5@7&#,)^314
+1 t313|313&
+3 f17 (21|@5|4@5@7&#,)^316
+1 t315|315&
+3 f21 (21|@5|4@5@7&#,)^318
+1 t317|317&
+3 f0 (298|$#,)^320
+1 t319|319&
+3 f5 (298|$#,)^322
+1 t321|321&
+3 f0 (298|0@5@7&#,)^324
+1 t323|323&
+3 f5 (298|0@5@7&#,)^326
+1 t325|325&
+3 f0 (21|$#,21|$#,)^328
+1 t327|327&
+3 f17 (21|$#,21|$#,)^330
+1 t329|329&
+3 f298 (21|$#,21|$#,)^332
+1 t331|331&
+3 f0 (21|$#,21|$#,298|$#,)^334
+1 t333|333&
+3 f17 (21|$#,21|$#,298|$#,)^336
+1 t335|335&
+3 f298 (21|$#,21|$#,298|$#,)^338
+1 t337|337&
+3 f0 (298|$#,21|0@5@19@2@0#,)^340
+1 t339|339&
+3 f1 (298|$#,21|0@5@19@2@0#,)^342
+1 t341|341&
+3 f0 (298|$#,21|0@5@19@2@0#,5|$#,54|$#,)^344
+1 t343|343&
+3 f5 (298|$#,21|0@5@19@2@0#,5|$#,54|$#,)^346
+1 t345|345&
+3 C0.5/1|!
+3 f0 (298|$#,21|$#,!.,)^349
+1 t348|348&
+3 f5 (298|$#,21|$#,!.,)^351
+1 t350|350&
+3 f347 (298|$#,21|$#,!.,)^353
+1 t352|352&
+3 f0 (298|$#,21|$#,!.,)^355
+1 t354|354&
+3 f5 (298|$#,21|$#,!.,)^357
+1 t356|356&
+3 f0 (21|$#,!.,)^359
+1 t358|358&
+3 f5 (21|$#,!.,)^361
+1 t360|360&
+3 f347 (21|$#,!.,)^363
+1 t362|362&
+3 f0 (21|$#,!.,)^365
+1 t364|364&
+3 f5 (21|$#,!.,)^367
+1 t366|366&
+3 C0.5/1|!
+3 f0 (21|4@0@7&#,21|$#,!.,)^370
+1 t369|369&
+3 f5 (21|4@0@7&#,21|$#,!.,)^372
+1 t371|371&
+3 f368 (21|4@0@7&#,21|$#,!.,)^374
+1 t373|373&
+3 f0 (21|4@0@7&#,21|$#,!.,)^376
+1 t375|375&
+3 f5 (21|4@0@7&#,21|$#,!.,)^378
+1 t377|377&
+3 f0 (298|$#,21|$#,287|$#,)^380
+1 t379|379&
+3 f5 (298|$#,21|$#,287|$#,)^382
+1 t381|381&
+3 f0 (21|$#,287|$#,)^384
+1 t383|383&
+3 f5 (21|$#,287|$#,)^386
+1 t385|385&
+3 f0 (21|4@0@7&#,21|$#,287|$#,)^388
+1 t387|387&
+3 f5 (21|4@0@7&#,21|$#,287|$#,)^390
+1 t389|389&
+3 f0 (298|$#,)^392
+1 t391|391&
+3 f5 (298|$#,)^394
+1 t393|393&
+3 f0 (21|@5|4@0@7&#,5|$#,298|$#,)^396
+1 t395|395&
+3 f17 (21|@5|4@0@7&#,5|$#,298|$#,)^398
+1 t397|397&
+3 f21 (21|@5|4@0@7&#,5|$#,298|$#,)^400
+1 t399|399&
+3 f0 (66|$#,298|$#,)^402
+1 t401|401&
+3 f5 (66|$#,298|$#,)^404
+1 t403|403&
+3 f0 (21|$#,298|$#,)^406
+1 t405|405&
+3 f5 (21|$#,298|$#,)^408
+1 t407|407&
+3 f0 (298|@7|$#,)^410
+1 t409|409&
+3 f5 (298|@7|$#,)^412
+1 t411|411&
+3 f0 (1|$#,)^414
+1 t413|413&
+3 f5 (1|$#,)^416
+1 t415|415&
+3 f0 (21|4@0@7&#,)^418
+1 t417|417&
+3 f17 (21|4@0@7&#,)^420
+1 t419|419&
+3 f21 (21|4@0@7&#,)^422
+1 t421|421&
+3 f0 (66|$#,298|@7|$#,)^424
+1 t423|423&
+3 f5 (66|$#,298|@7|$#,)^426
+1 t425|425&
+3 f0 (66|$#,)^428
+1 t427|427&
+3 f5 (66|$#,)^430
+1 t429|429&
+3 f0 (21|$#,)^432
+1 t431|431&
+3 f5 (21|$#,)^434
+1 t433|433&
+3 f0 (66|$#,298|$#,)^436
+1 t435|435&
+3 f5 (66|$#,298|$#,)^438
+1 t437|437&
+3 f0 (18|4@0@7&#,54|$#,54|$#,298|$#,)^440
+1 t439|439&
+3 f54 (18|4@0@7&#,54|$#,54|$#,298|$#,)^442
+1 t441|441&
+3 f0 (18|$#,54|$#,54|$#,298|$#,)^444
+1 t443|443&
+3 f54 (18|$#,54|$#,54|$#,298|$#,)^446
+1 t445|445&
+1 t297|297&
+3 f0 (298|$#,447|4@0@7&#,)^449
+1 t448|448&
+3 f5 (298|$#,447|4@0@7&#,)^451
+1 t450|450&
+3 f0 (298|$#,9|$#,5|$#,)^453
+1 t452|452&
+3 f5 (298|$#,9|$#,5|$#,)^455
+1 t454|454&
+3 f0 (298|$#,447|$#,)^457
+1 t456|456&
+3 f5 (298|$#,447|$#,)^459
+1 t458|458&
+3 f0 (298|$#,)^461
+1 t460|460&
+3 f9 (298|$#,)^463
+1 t462|462&
+3 f0 (298|$#,)^465
+1 t464|464&
+3 f1 (298|$#,)^467
+1 t466|466&
+3 f0 (298|$#,)^469
+1 t468|468&
+3 f1 (298|$#,)^471
+1 t470|470&
+3 f0 (298|$#,)^473
+1 t472|472&
+3 f5 (298|$#,)^475
+1 t474|474&
+3 f0 (298|$#,)^477
+1 t476|476&
+3 f5 (298|$#,)^479
+1 t478|478&
+3 f0 (21|0@5@7&#,)^481
+1 t480|480&
+3 f1 (21|0@5@7&#,)^483
+1 t482|482&
+3 f0 (21|$#,)^485
+1 t484|484&
+3 f15 (21|$#,)^487
+1 t486|486&
+3 f0 (21|$#,)^489
+1 t488|488&
+3 f5 (21|$#,)^491
+1 t490|490&
+3 f0 (21|$#,)^493
+1 t492|492&
+3 f9 (21|$#,)^495
+1 t494|494&
+1 t17|17&
+1 t21|21&
+3 f0 (21|$#,497|4@5@7&#,)^499
+1 t498|498&
+3 f15 (21|$#,497|4@5@7&#,)^501
+1 t500|500&
+3 f0 (21|$#,497|4@5@7&#,5|$#,)^503
+1 t502|502&
+3 f9 (21|$#,497|4@5@7&#,5|$#,)^505
+1 t504|504&
+3 f0 (21|$#,497|4@5@7&#,5|$#,)^507
+1 t506|506&
+3 f10 (21|$#,497|4@5@7&#,5|$#,)^509
+1 t508|508&
+3 f0 (1|$#,)^511
+1 t510|510&
+3 f5 (1|$#,)^513
+1 t512|512&
+3 f0 (6|$#,)^515
+1 t514|514&
+3 f1 (6|$#,)^517
+1 t516|516&
+3 f0 (54|$#,54|$#,)^519
+1 t518|518&
+3 f17 (54|$#,54|$#,)^521
+1 t520|520&
+3 f18 (54|$#,54|$#,)^523
+1 t522|522&
+3 f0 (54|$#,)^525
+1 t524|524&
+3 f17 (54|$#,)^527
+1 t526|526&
+3 f18 (54|$#,)^529
+1 t528|528&
+3 f0 (18|@5|4@5@2&#,54|$#,)^531
+1 t530|530&
+3 f17 (18|@5|4@5@2&#,54|$#,)^533
+1 t532|532&
+3 f18 (18|@5|4@5@2&#,54|$#,)^535
+1 t534|534&
+3 f0 (18|4@5@2&#,)^537
+1 t536|536&
+3 f1 (18|4@5@2&#,)^539
+1 t538|538&
+3 f0 (1|$#,)^541
+1 t540|540&
+3 f1 (1|$#,)^543
+1 t542|542&
+3 f0 (5|$#,)^545
+1 t544|544&
+3 f1 (5|$#,)^547
+1 t546|546&
+3 ?!
+3 f548 (1|$#,)^550
+1 t549|549&
+3 f1 (1|$#,)^552
+1 t551|551&
+3 f0 (552|$#,)^554
+1 t553|553&
+3 f5 (552|$#,)^556
+1 t555|555&
+3 f0 (21|$#,)^558
+1 t557|557&
+3 f17 (21|$#,)^560
+1 t559|559&
+3 f21 (21|$#,)^562
+1 t561|561&
+3 f0 (21|0@5@7&#,)^564
+1 t563|563&
+3 f5 (21|0@5@7&#,)^566
+1 t565|565&
+3 ?!
+3 f567 (18|$#,18|$#,)^569
+1 t568|568&
+3 f5 (18|$#,18|$#,)^571
+1 t570|570&
+3 f0 (18|$#,18|$#,54|$#,54|$#,571|$#,)^573
+1 t572|572&
+3 f17 (18|$#,18|$#,54|$#,54|$#,571|$#,)^575
+1 t574|574&
+3 f18 (18|$#,18|$#,54|$#,54|$#,571|$#,)^577
+1 t576|576&
+3 ?!
+3 f578 (18|$#,18|$#,)^580
+1 t579|579&
+3 f5 (18|$#,18|$#,)^582
+1 t581|581&
+3 f0 (18|$#,54|$#,54|$#,582|$#,)^584
+1 t583|583&
+3 f1 (18|$#,54|$#,54|$#,582|$#,)^586
+1 t585|585&
+3 f0 (5|$#,)^588
+1 t587|587&
+3 f5 (5|$#,)^590
+1 t589|589&
+3 S!2{5|@1|$#quot,5|@1|$#rem,}!
+0 s325|&
+0 s18|&
+3 f0 (5|$#,5|$#,)^595
+1 t594|594&
+3 f593 (5|$#,5|$#,)^597
+1 t596|596&
+3 f0 (9|$#,)^599
+1 t598|598&
+3 f9 (9|$#,)^601
+1 t600|600&
+0 s17|&
+3 f0 (9|$#,9|$#,)^604
+1 t603|603&
+3 f602 (9|$#,9|$#,)^606
+1 t605|605&
+3 f0 (5|$#,)^608
+1 t607|607&
+3 f57 (5|$#,)^610
+1 t609|609&
+3 f0 (298|$#,)^612
+1 t611|611&
+3 f57 (298|$#,)^614
+1 t613|613&
+1 t56|56 774 -1
+3 f0 (615|@5|$#,5|$#,298|$#,)^617
+1 t616|616&
+3 f17 (615|@5|$#,5|$#,298|$#,)^619
+1 t618|618&
+3 f615 (615|@5|$#,5|$#,298|$#,)^621
+1 t620|620&
+3 f0 (56|$#,298|$#,)^623
+1 t622|622&
+3 f57 (56|$#,298|$#,)^625
+1 t624|624&
+3 f0 (615|$#,298|$#,)^627
+1 t626|626&
+3 f5 (615|$#,298|$#,)^629
+1 t628|628&
+3 f0 (298|$#,5|$#,)^631
+1 t630|630&
+3 f5 (298|$#,5|$#,)^633
+1 t632|632&
+3 f0 (298|$#,615|$#,!.,)^635
+1 t634|634&
+3 f5 (298|$#,615|$#,!.,)^637
+1 t636|636&
+3 f0 (298|$#,615|$#,!.,)^639
+1 t638|638&
+3 f5 (298|$#,615|$#,!.,)^641
+1 t640|640&
+3 f0 (298|@7|$#,)^643
+1 t642|642&
+3 f57 (298|@7|$#,)^645
+1 t644|644&
+3 f0 (1|$#,)^647
+1 t646|646&
+3 f57 (1|$#,)^649
+1 t648|648&
+1 t58|58&
+3 f0 (21|$#,54|$#,650|0@5@7&#,)^652
+1 t651|651&
+3 f54 (21|$#,54|$#,650|0@5@7&#,)^654
+1 t653|653&
+3 f0 (615|0@5@7&#,21|$#,54|$#,650|0@5@7&#,)^656
+1 t655|655&
+3 f54 (615|0@5@7&#,21|$#,54|$#,650|0@5@7&#,)^658
+1 t657|657&
+3 f0 (650|0@5@7&#,)^660
+1 t659|659&
+3 f5 (650|0@5@7&#,)^662
+1 t661|661&
+3 f0 (615|0@5@7&#,497|$#,54|$#,650|0@5@7&#,)^664
+1 t663|663&
+3 f54 (615|0@5@7&#,497|$#,54|$#,650|0@5@7&#,)^666
+1 t665|665&
+3 f0 (56|$#,298|@7|$#,)^668
+1 t667|667&
+3 f57 (56|$#,298|@7|$#,)^670
+1 t669|669&
+3 f0 (56|$#,)^672
+1 t671|671&
+3 f57 (56|$#,)^674
+1 t673|673&
+3 f0 (615|$#,54|$#,615|$#,!.,)^676
+1 t675|675&
+3 f5 (615|$#,54|$#,615|$#,!.,)^678
+1 t677|677&
+3 f0 (615|$#,615|$#,!.,)^680
+1 t679|679&
+3 f5 (615|$#,615|$#,!.,)^682
+1 t681|681&
+3 f0 (57|$#,298|$#,)^684
+1 t683|683&
+3 f57 (57|$#,298|$#,)^686
+1 t685|685&
+3 f0 (298|$#,615|$#,287|$#,)^688
+1 t687|687&
+3 f5 (298|$#,615|$#,287|$#,)^690
+1 t689|689&
+3 f0 (615|$#,54|$#,615|$#,287|$#,)^692
+1 t691|691&
+3 f5 (615|$#,54|$#,615|$#,287|$#,)^694
+1 t693|693&
+3 f0 (615|$#,287|$#,)^696
+1 t695|695&
+3 f5 (615|$#,287|$#,)^698
+1 t697|697&
+3 f0 (21|4@5@7&#,56|$#,650|0@5@7&#,)^700
+1 t699|699&
+3 f54 (21|4@5@7&#,56|$#,650|0@5@7&#,)^702
+1 t701|701&
+3 C0.1/615|!
+3 f0 (615|@5|4@0@9&#,615|$#,)^705
+1 t704|704&
+3 f1 (615|@5|4@0@9&#,615|$#,)^707
+1 t706|706&
+3 f703 (615|@5|4@0@9&#,615|$#,)^709
+1 t708|708&
+3 f0 (615|@5|$#,56|$#,)^711
+1 t710|710&
+3 f17 (615|@5|$#,56|$#,)^713
+1 t712|712&
+3 f615 (615|@5|$#,56|$#,)^715
+1 t714|714&
+3 f0 (615|$#,615|$#,)^717
+1 t716|716&
+3 f5 (615|$#,615|$#,)^719
+1 t718|718&
+3 f0 (615|$#,615|$#,)^721
+1 t720|720&
+3 f5 (615|$#,615|$#,)^723
+1 t722|722&
+3 C0.1/615|!
+3 f0 (615|@5|4@0@9&#,615|$#,)^726
+1 t725|725&
+3 f1 (615|@5|4@0@9&#,615|$#,)^728
+1 t727|727&
+3 f724 (615|@5|4@0@9&#,615|$#,)^730
+1 t729|729&
+3 f0 (615|$#,615|$#,)^732
+1 t731|731&
+3 f54 (615|$#,615|$#,)^734
+1 t733|733&
+0 s326|-1 736 -1
+1 t735|735&
+3 f0 (615|4@0@7&#,54|$#,615|$#,736|$#,)^738
+1 t737|737&
+3 f54 (615|4@0@7&#,54|$#,615|$#,736|$#,)^740
+1 t739|739&
+3 f0 (615|$#,)^742
+1 t741|741&
+3 f54 (615|$#,)^744
+1 t743|743&
+3 C0.1/615|!
+3 f0 (615|@5|4@0@9&#,615|$#,54|$#,)^747
+1 t746|746&
+3 f1 (615|@5|4@0@9&#,615|$#,54|$#,)^749
+1 t748|748&
+3 f745 (615|@5|4@0@9&#,615|$#,54|$#,)^751
+1 t750|750&
+3 f0 (615|$#,615|$#,54|$#,)^753
+1 t752|752&
+3 f5 (615|$#,615|$#,54|$#,)^755
+1 t754|754&
+3 f0 (615|@5|4@0@9&#,615|$#,54|$#,)^757
+1 t756|756&
+3 f1 (615|@5|4@0@9&#,615|$#,54|$#,)^759
+1 t758|758&
+3 f745 (615|@5|4@0@9&#,615|$#,54|$#,)^761
+1 t760|760&
+3 f0 (615|@5|$#,615|$#,)^763
+1 t762|762&
+3 f17 (615|@5|$#,615|$#,)^765
+1 t764|764&
+3 f615 (615|@5|$#,615|$#,)^767
+1 t766|766&
+3 f0 (615|@5|$#,56|$#,)^769
+1 t768|768&
+3 f17 (615|@5|$#,56|$#,)^771
+1 t770|770&
+3 f615 (615|@5|$#,56|$#,)^773
+1 t772|772&
+1 t615|615&
+3 f0 (21|0@5@7&#,774|$#,54|$#,650|0@5@7&#,)^776
+1 t775|775&
+3 f54 (21|0@5@7&#,774|$#,54|$#,650|0@5@7&#,)^778
+1 t777|777&
+3 f0 (615|$#,615|$#,)^780
+1 t779|779&
+3 f54 (615|$#,615|$#,)^782
+1 t781|781&
+3 f0 (615|$#,615|$#,)^784
+1 t783|783&
+3 f17 (615|$#,615|$#,)^786
+1 t785|785&
+3 f615 (615|$#,615|$#,)^788
+1 t787|787&
+3 f0 (615|$#,774|0@5@7&#,)^790
+1 t789|789&
+3 f15 (615|$#,774|0@5@7&#,)^792
+1 t791|791&
+3 f0 (615|0@5@7&#,615|$#,774|$#,)^794
+1 t793|793&
+3 f17 (615|0@5@7&#,615|$#,774|$#,)^796
+1 t795|795&
+3 f615 (615|0@5@7&#,615|$#,774|$#,)^798
+1 t797|797&
+3 f0 (615|$#,774|0@5@7&#,5|$#,)^800
+1 t799|799&
+3 f9 (615|$#,774|0@5@7&#,5|$#,)^802
+1 t801|801&
+3 f0 (615|$#,774|0@5@7&#,5|$#,)^804
+1 t803|803&
+3 f10 (615|$#,774|0@5@7&#,5|$#,)^806
+1 t805|805&
+3 f0 (615|0@5@7&#,615|$#,54|$#,)^808
+1 t807|807&
+3 f54 (615|0@5@7&#,615|$#,54|$#,)^810
+1 t809|809&
+3 f0 (57|$#,)^812
+1 t811|811&
+3 f5 (57|$#,)^814
+1 t813|813&
+3 f0 (615|$#,56|$#,54|$#,)^816
+1 t815|815&
+3 f17 (615|$#,56|$#,54|$#,)^818
+1 t817|817&
+3 f615 (615|$#,56|$#,54|$#,)^820
+1 t819|819&
+3 f0 (615|$#,615|$#,54|$#,)^822
+1 t821|821&
+3 f5 (615|$#,615|$#,54|$#,)^824
+1 t823|823&
+3 f0 (615|@5|$#,615|$#,54|$#,)^826
+1 t825|825&
+3 f17 (615|@5|$#,615|$#,54|$#,)^828
+1 t827|827&
+3 f615 (615|@5|$#,615|$#,54|$#,)^830
+1 t829|829&
+3 f0 (615|@5|$#,615|$#,54|$#,)^832
+1 t831|831&
+3 f17 (615|@5|$#,615|$#,54|$#,)^834
+1 t833|833&
+3 f615 (615|@5|$#,615|$#,54|$#,)^836
+1 t835|835&
+3 f0 (615|@5|$#,56|$#,54|$#,)^838
+1 t837|837&
+3 f17 (615|@5|$#,56|$#,54|$#,)^840
+1 t839|839&
+3 f615 (615|@5|$#,56|$#,54|$#,)^842
+1 t841|841&
+3 f0 (615|$#,!.,)^844
+1 t843|843&
+3 f5 (615|$#,!.,)^846
+1 t845|845&
+3 f0 (615|$#,!.,)^848
+1 t847|847&
+3 f5 (615|$#,!.,)^850
+1 t849|849&
+0 s9|&
+0 s10|&
+3 f0 (57|$#,)^854
+1 t853|853&
+3 f5 (57|$#,)^856
+1 t855|855&
+3 f61 (57|$#,)^858
+1 t857|857&
+3 f0 (57|$#,)^860
+1 t859|859&
+3 f5 (57|$#,)^862
+1 t861|861&
+3 f61 (57|$#,)^864
+1 t863|863&
+3 f0 (57|$#,)^866
+1 t865|865&
+3 f5 (57|$#,)^868
+1 t867|867&
+3 f61 (57|$#,)^870
+1 t869|869&
+3 f0 (57|$#,851|$#,)^872
+1 t871|871&
+3 f5 (57|$#,851|$#,)^874
+1 t873|873&
+3 f61 (57|$#,851|$#,)^876
+1 t875|875&
+3 f0 (57|$#,)^878
+1 t877|877&
+3 f5 (57|$#,)^880
+1 t879|879&
+3 f61 (57|$#,)^882
+1 t881|881&
+3 f0 (57|$#,)^884
+1 t883|883&
+3 f5 (57|$#,)^886
+1 t885|885&
+3 f61 (57|$#,)^888
+1 t887|887&
+3 f0 (57|$#,)^890
+1 t889|889&
+3 f5 (57|$#,)^892
+1 t891|891&
+3 f61 (57|$#,)^894
+1 t893|893&
+3 f0 (57|$#,)^896
+1 t895|895&
+3 f5 (57|$#,)^898
+1 t897|897&
+3 f61 (57|$#,)^900
+1 t899|899&
+3 f0 (57|$#,)^902
+1 t901|901&
+3 f5 (57|$#,)^904
+1 t903|903&
+3 f61 (57|$#,)^906
+1 t905|905&
+3 f0 (57|$#,)^908
+1 t907|907&
+3 f5 (57|$#,)^910
+1 t909|909&
+3 f61 (57|$#,)^912
+1 t911|911&
+3 f0 (57|$#,)^914
+1 t913|913&
+3 f5 (57|$#,)^916
+1 t915|915&
+3 f61 (57|$#,)^918
+1 t917|917&
+3 f0 (57|$#,)^920
+1 t919|919&
+3 f5 (57|$#,)^922
+1 t921|921&
+3 f61 (57|$#,)^924
+1 t923|923&
+3 C0.5/57|!
+3 f0 (57|$#,852|$#,)^927
+1 t926|926&
+3 f5 (57|$#,852|$#,)^929
+1 t928|928&
+3 f925 (57|$#,852|$#,)^931
+1 t930|930&
+3 f0 (57|$#,)^933
+1 t932|932&
+3 f5 (57|$#,)^935
+1 t934|934&
+3 f925 (57|$#,)^937
+1 t936|936&
+3 f0 (57|$#,)^939
+1 t938|938&
+3 f5 (57|$#,)^941
+1 t940|940&
+3 C0.5/57|!
+3 f942 (57|$#,)^944
+1 t943|943&
+3 f0 (21|$#,)^946
+1 t945|945&
+3 f852 (21|$#,)^948
+1 t947|947&
+3 f0 (21|$#,)^950
+1 t949|949&
+3 f851 (21|$#,)^952
+1 t951|951&
+3 f0 (21|$#,54|$#,)^954
+1 t953|953&
+3 f5 (21|$#,54|$#,)^956
+1 t955|955&
+3 f0 (615|0@5@7&#,21|0@5@7&#,54|$#,)^958
+1 t957|957&
+3 f5 (615|0@5@7&#,21|0@5@7&#,54|$#,)^960
+1 t959|959&
+3 f0 (21|4@5@7&#,56|$#,)^962
+1 t961|961&
+3 f5 (21|4@5@7&#,56|$#,)^964
+1 t963|963&
+3 f0 (615|4@0@7&#,21|$#,54|$#,)^966
+1 t965|965&
+3 f54 (615|4@0@7&#,21|$#,54|$#,)^968
+1 t967|967&
+3 f0 (21|4@0@7&#,615|$#,54|$#,)^970
+1 t969|969&
+3 f54 (21|4@0@7&#,615|$#,54|$#,)^972
+1 t971|971&
+3 C0.1/18|!
+3 f0 (18|@5|4@0@9&#,18|$#,54|$#,)^975
+1 t974|974&
+3 f1 (18|@5|4@0@9&#,18|$#,54|$#,)^977
+1 t976|976&
+3 f973 (18|@5|4@0@9&#,18|$#,54|$#,)^979
+1 t978|978&
+3 f0 (18|@5|4@0@7&#,18|$#,54|$#,)^981
+1 t980|980&
+3 f1 (18|@5|4@0@7&#,18|$#,54|$#,)^983
+1 t982|982&
+3 f973 (18|@5|4@0@7&#,18|$#,54|$#,)^985
+1 t984|984&
+3 C0.1/21|!
+3 f0 (21|@5|4@0@9&#,21|$#,)^988
+1 t987|987&
+3 f1 (21|@5|4@0@9&#,21|$#,)^990
+1 t989|989&
+3 f986 (21|@5|4@0@9&#,21|$#,)^992
+1 t991|991&
+3 f0 (21|@5|4@0@9&#,21|$#,54|$#,)^994
+1 t993|993&
+3 f1 (21|@5|4@0@9&#,21|$#,54|$#,)^996
+1 t995|995&
+3 f986 (21|@5|4@0@9&#,21|$#,54|$#,)^998
+1 t997|997&
+3 f0 (21|@5|4@0@9&#,21|$#,)^1000
+1 t999|999&
+3 f1 (21|@5|4@0@9&#,21|$#,)^1002
+1 t1001|1001&
+3 C0.1/21|!
+3 f1003 (21|@5|4@0@9&#,21|$#,)^1005
+1 t1004|1004&
+3 f0 (21|@5|4@0@9&#,21|$#,5|$#,)^1007
+1 t1006|1006&
+3 f1 (21|@5|4@0@9&#,21|$#,5|$#,)^1009
+1 t1008|1008&
+3 f1003 (21|@5|4@0@9&#,21|$#,5|$#,)^1011
+1 t1010|1010&
+3 f0 (18|$#,18|$#,54|$#,)^1013
+1 t1012|1012&
+3 f5 (18|$#,18|$#,54|$#,)^1015
+1 t1014|1014&
+3 f0 (21|$#,21|$#,)^1017
+1 t1016|1016&
+3 f5 (21|$#,21|$#,)^1019
+1 t1018|1018&
+3 f0 (21|$#,21|$#,)^1021
+1 t1020|1020&
+3 f5 (21|$#,21|$#,)^1023
+1 t1022|1022&
+3 f0 (21|$#,21|$#,54|$#,)^1025
+1 t1024|1024&
+3 f5 (21|$#,21|$#,54|$#,)^1027
+1 t1026|1026&
+3 f0 (21|4@5@7&#,21|$#,54|$#,)^1029
+1 t1028|1028&
+3 f54 (21|4@5@7&#,21|$#,54|$#,)^1031
+1 t1030|1030&
+3 f0 (18|$#,5|$#,54|$#,)^1033
+1 t1032|1032&
+3 f17 (18|$#,5|$#,54|$#,)^1035
+1 t1034|1034&
+3 f18 (18|$#,5|$#,54|$#,)^1037
+1 t1036|1036&
+3 f0 (21|@5|$#,66|$#,)^1039
+1 t1038|1038&
+3 f17 (21|@5|$#,66|$#,)^1041
+1 t1040|1040&
+3 f21 (21|@5|$#,66|$#,)^1043
+1 t1042|1042&
+3 f0 (21|$#,21|$#,)^1045
+1 t1044|1044&
+3 f54 (21|$#,21|$#,)^1047
+1 t1046|1046&
+3 f0 (21|@5|$#,21|$#,)^1049
+1 t1048|1048&
+3 f17 (21|@5|$#,21|$#,)^1051
+1 t1050|1050&
+3 f21 (21|@5|$#,21|$#,)^1053
+1 t1052|1052&
+3 f0 (21|@5|$#,66|$#,)^1055
+1 t1054|1054&
+3 f17 (21|@5|$#,66|$#,)^1057
+1 t1056|1056&
+3 f21 (21|@5|$#,66|$#,)^1059
+1 t1058|1058&
+3 f0 (21|$#,21|$#,)^1061
+1 t1060|1060&
+3 f54 (21|$#,21|$#,)^1063
+1 t1062|1062&
+3 f0 (21|@5|0@0@9&#,21|$#,)^1065
+1 t1064|1064&
+3 f17 (21|@5|0@0@9&#,21|$#,)^1067
+1 t1066|1066&
+3 f21 (21|@5|0@0@9&#,21|$#,)^1069
+1 t1068|1068&
+3 f0 (21|@5|0@5@7&#,21|$#,)^1071
+1 t1070|1070&
+3 f17 (21|@5|0@5@7&#,21|$#,)^1073
+1 t1072|1072&
+3 f21 (21|@5|0@5@7&#,21|$#,)^1075
+1 t1074|1074&
+3 C0.1/18|!
+3 f0 (18|@5|4@0@7&#,5|$#,54|$#,)^1078
+1 t1077|1077&
+3 f1 (18|@5|4@0@7&#,5|$#,54|$#,)^1080
+1 t1079|1079&
+3 f1076 (18|@5|4@0@7&#,5|$#,54|$#,)^1082
+1 t1081|1081&
+3 f0 (5|$#,)^1084
+1 t1083|1083&
+3 f17 (5|$#,)^1086
+1 t1085|1085&
+3 f21 (5|$#,)^1088
+1 t1087|1087&
+3 f0 (21|$#,)^1090
+1 t1089|1089&
+3 f54 (21|$#,)^1092
+1 t1091|1091&
+0 s3|&
+0 s4|-1 1108 -1
+3 Stm{5|@1|$#tm_sec,5|@1|$#tm_min,5|@1|$#tm_hour,5|@1|$#tm_mday,5|@1|$#tm_mon,5|@1|$#tm_year,5|@1|$#tm_wday,5|@1|$#tm_yday,5|@1|$#tm_isdst,}!
+3 f0 (1|$#,)^1097
+1 t1096|1096&
+3 f1093 (1|$#,)^1099
+1 t1098|1098&
+3 f0 (1094|$#,1094|$#,)^1101
+1 t1100|1100&
+3 f15 (1094|$#,1094|$#,)^1103
+1 t1102|1102&
+3 f0 (736|$#,)^1105
+1 t1104|1104&
+3 f1094 (736|$#,)^1107
+1 t1106|1106&
+1 t1094|1094&
+3 f0 (1108|4@5@7&#,)^1110
+1 t1109|1109&
+3 f1094 (1108|4@5@7&#,)^1112
+1 t1111|1111&
+3 f0 (736|$#,)^1114
+1 t1113|1113&
+3 f17 (736|$#,)^1116
+1 t1115|1115&
+3 f21 (736|$#,)^1118
+1 t1117|1117&
+3 f0 (1108|$#,)^1120
+1 t1119|1119&
+3 f17 (1108|$#,)^1122
+1 t1121|1121&
+3 f21 (1108|$#,)^1124
+1 t1123|1123&
+3 f0 (1108|$#,)^1126
+1 t1125|1125&
+3 f17 (1108|$#,)^1128
+1 t1127|1127&
+3 f736 (1108|$#,)^1130
+1 t1129|1129&
+3 f0 (1108|$#,)^1132
+1 t1131|1131&
+3 f17 (1108|$#,)^1134
+1 t1133|1133&
+3 f736 (1108|$#,)^1136
+1 t1135|1135&
+3 f0 (21|4@0@7&#,54|$#,21|$#,736|$#,)^1138
+1 t1137|1137&
+3 f54 (21|4@0@7&#,54|$#,21|$#,736|$#,)^1140
+1 t1139|1139&
+0 a1|&
+;;tistable
+0
+0,13
+13
+0,13,14
+14
+0,13,14,15
+15
+0,13,14,15,16
+16
+1
+;;symTable
+*0 (Datatype)
+0@+@=@0@7@0@0@58#mbstate_t
+0@+@+@0@7@0@0@1141#mnull
+2@-@-@0@0@0@0@2#bool
+10@-@-@0@0@0@0@1093#clock_t
+10@-@-@0@0@0@0@1094#time_t
+11@-@-@0@0@0@0@53#ptrdiff_t
+11@-@-@0@0@0@0@56#wchar_t
+11@-@-@0@0@0@0@57#wint_t
+11@-@-@0@0@0@0@257#sig_atomic_t
+11@-@-@0@0@0@0@851#wctype_t
+11@-@-@0@0@0@0@852#wctrans_t
+12@-@-@0@0@0@0@54#size_t
+13@-@-@0@0@0@0@55#ssize_t
+18@+@+@0@0@0@0@248#jmp_buf
+18@+@+@0@0@0@0@287#va_list
+18@+@+@0@0@0@0@296#FILE
+18@+@+@0@0@0@0@297#fpos_t
+592@-@+@0@0@0@0@602#ldiv_t
+591@-@-@0@0@0@0@593#div_t
+*1 (Constant)
+0@i0@0@6#NULL
+2$#TRUE#FALSE#NDEBUG
+3$#UCHAR_MAX#UCHAR_MIN
+4$#CHAR_MAX#SCHAR_MIN#CHAR_MIN#SCHAR_MAX
+5$#SEEK_END#LC_ALL#LC_COLLATE#LC_CTYPE#LC_MONETARY#LC_NUMERIC#LC_TIME#SEEK_SET#TMP_MAX#FLT_RADIX#FLT_ROUNDS#FLT_DIG#RAND_MAX#FLT_MANT_DIG#EXIT_FAILURE#FLT_MAX_EXP#EXIT_SUCCESS#FLT_MIN_EXP#DBL_DIG#CLOCKS_PER_SEC#DBL_MANT_DIG#WCHAR_MIN#DBL_MAX_EXP#WCHAR_MAX#DBL_MIN_EXP#DBL_MAX_10_EXP#DBL_MIN_10_EXP#FLT_MAX_10_EXP#FLT_MIN_10_EXP#LDBL_DIG#EILSEQ#LDBL_MANT_DIG#ERANGE#EDOM#LDBL_MAX_10_EXP#_IOFBF#LDBL_MAX_EXP#_IOLBF#LDBL_MIN_10_EXP#LDBL_MIN_EXP#CHAR_BIT#_IONBF#SIGTERM#INT_MAX#INT_MIN#SIGSEGV#SIGINT#SIGILL#SIGFPE#SIGABRT#BUFSIZ#EOF#FILENAME_MAX#FOPEN_MAX#L_tmpnam#SEEK_CUR
+6$#UINT_MAX
+7$#SHRT_MIN#SHRT_MAX
+8$#USHRT_MAX
+9$#LONG_MAX#MB_LEN_MAX#LONG_MIN
+10$#ULONG_MAX
+14$#FLT_MAX#FLT_MIN#FLT_EPSILON
+15$#DBL_MAX#HUGE_VAL#DBL_MIN#DBL_EPSILON
+16$#LDBL_MAX#LDBL_EPSILON#LDBL_MIN
+54$#MB_CUR_MAX
+57$#WEOF
+262$#SIG_DFL
+267$#SIG_ERR
+272$#SIG_IGN
+*3 (Variable)
+5|@1|0@0@0@0@1#errno
+298|@1|0@0@0@0@1#stdout#stdin#stderr
+*4 (Function)
+65@6@0@7@0@0@1@@1@s0$@0#assert
+72$@1@@1@s0$@0#isalnum
+78$@1@@1@s0$@0#isalpha
+84$@1@@1@s0$@0#iscntrl
+90$@1@@1@s0$@0#isdigit
+96$@1@@1@s0$@0#isgraph
+102$@1@@1@s0$@0#islower
+108$@1@@1@s0$@0#isprint
+114$@1@@1@s0$@0#ispunct
+120$@1@@1@s0$@0#isspace
+126$@1@@1@s0$@0#isupper
+132$@1@@1@s0$@0#isxdigit
+138$@1@@1@s0$@0#tolower
+144$@1@@1@s0$@0#toupper
+152@6@5@0@0@0@0@s1,g108@0@0@1@s1,g108@19@3@0#setlocale
+159$@1@@1@s0@3@0@0#localeconv
+163$@1@@1@s0$@0#sin
+167$@1@@1@s0$@0#cos
+171$@1@@1@s0$@0#tan
+175$@0@g108@0@0@1@g108$@0#asin
+179$@0@g108@0@0@1@g108$@0#acos
+183$@1@@1@s0$@0#atan
+187$@1@@1@s0$@0#atan2
+191$@1@@1@s0$@0#sinh
+195$@0@g108@0@0@1@g108$@0#cosh
+199$@1@@1@s0$@0#tanh
+203$@0@g108@0@0@1@g108$@0#exp
+207$@0@g108@0@0@1@g108$@0#ldexp
+211$@0@@1@tp1$@0#frexp
+215$@0@g108@0@0@1@g108$@0#log
+219$@0@g108@0@0@1@g108$@0#log10
+223$@0@g108@0@0@1@g108$@0#pow
+227$@0@g108@0@0@1@g108$@0#sqrt
+231$@1@@1@s0$@0#ceil
+235$@1@@1@s0$@0#floor
+239$@1@@1@s0$@0#fabs
+243$@0@@1@tp1$@0#modf
+247$@1@@1@s0$@0#fmod
+252$@0@@1@p0$@0#setjmp
+256@6@0@4@0@0@1@@1@s0$@0#longjmp
+282@6@0@4@0@0@0@s1,g108@0@0@1@s1,g108$@0#signal
+286@6@0@4@0@0$$@0#raise
+291$@0@@1@p0$@0#va_start
+295$@0@@1@p0$@0#va_end
+302$@0@s3@1@s3$@0#remove
+306$@0@s3@1@s3$@0#rename
+312@6@5@0@0@0@0@s3@1@s3@3@0@0#tmpfile
+318$@0@s1@1@tp0,s1@19@3@0#tmpnam
+322$@0@g108@0@0,s3@1@tp0,g108,s3$@0#fclose
+326$@0@g108@0@0,s3@1@tp0,g108,s3$@0#fflush
+332@6@5@0@0@0@0@s3@1@s3@18@0@0#fopen
+338@6@5@0@0@0@0@s3,g108@0@0@1@tp2,s3,g108@3@0@0#freopen
+342$@0@s3@1@s3,tp0,tp1$@0#setbuf
+346$@0@s3@1@s3,tp0,tp1$@0#setvbuf
+353@6@0@0@1@0@0@s3@1@s3,tp0$@0#fprintf
+357@6@0@0@2@0@0@s3@1@s3,tp0$@0#fscanf
+363@6@0@0@1@0@1@g109@0@0,s3@1@s3,tg109$@0#printf
+367@6@0@0@2@0@1@g110@0@0,s3@1@s3,tg110$@0#scanf
+374@6@0@0@1@0@0@@1@tp0$@0#sprintf
+378@6@0@0@2@0@1@@1@s0$@0#sscanf
+382$@0@s3,g108@0@0@1@s3,tp0,p2,g108$@0#vfprintf
+386$@1@g109@0@0,s3@1@s3,p1,tg109$@0#vprintf
+390$@0@@1@tp0,p2$@0#vsprintf
+394$@0@s3,g108@0@0@1@s3,tp0,g108$@0#fgetc
+400@6@5@0@0@0@0@s3,g108@0@0@1@s3,tp0,tp2,g108$@0#fgets
+404$@0@s3,g108@0@0@1@s3,tp1,g108$@0#fputc
+408$@0@s3@1@s3,tp1$@0#fputs
+412$@0@s3@1@s3,tp0$@0#getc
+416$@1@g110@0@0,s3@1@s3,tg110$@0#getchar
+422@6@5@0@0@0@1@g110@0@0,s3,g108@0@0@1@s3,tp0,tg110,g108@3@0@0#gets
+426$@0@s3@1@s3,tp1$@0#putc
+430$@1@g109@0@0,s3@1@s3,tg109$@0#putchar
+434$@1@g109@0@0,s3@1@s3,tg109$@0#puts
+438$@0@s3,g108@0@0@1@s3,tp1,g108$@0#ungetc
+442$@0@s3,g108@0@0@1@s3,tp0,tp3,g108$@0#fread
+446$@0@s3,g108@0@0@1@s3,tp3,g108$@0#fwrite
+451$@0@g108@0@0@1@tp1,g108$@0#fgetpos
+455$@0@s3,g108@0@0@1@s3,tp0,g108$@0#fseek
+459$@0@s3,g108@0@0@1@s3,tp0,g108$@0#fsetpos
+463$@0@g108@0@0@1@g108$@0#ftell
+467$@0@@1@tp0$@0#rewind
+471$@0@@1@tp0$@0#clearerr
+475$@0@g108@0@0@1@g108$@0#feof
+479$@0@g108@0@0@1@g108$@0#ferror
+483$@1@g108@0@0,g111@0@0,s3@1@s3,tg111$@0#perror
+487$@1@@1@s0$@0#atof
+491$@1@@1@s0$@0#atoi
+495$@1@@1@s0$@0#atol
+501$@0@g108@0@0@1@tp1,g108$@0#strtod
+505$@0@g108@0@0@1@tp1,g108$@0#strtol
+509$@0@g108@0@0@1@tp1,g108$@0#strtoul
+513$@0@s1@1@s1$@0#rand
+517$@0@s1@1@s1$@0#srand
+523@6@5@0@0@0@1@@1@s0@2@0@0#calloc
+529@4@5@0@0@0@1@@1@s0@2@0@0#malloc
+535@4@5@0@0@0@0@@1@tp0@2@0@0#realloc
+539$@0@@1@tp0$@0#free
+543@6@0@5@0@0@1@@1@s0$@0#abort
+547@6@0@5@0@0@1@@1@s0$@0#exit
+556$@0@s1@1@s1$@0#atexit
+562@6@5@0@0@0@1@@1@s0@19@3@0#getenv
+566$@0@s3@1@s3$@0#system
+577@6@5@0@0@0@1@@1@s0@3@0@0#bsearch
+586$@0@g108@0@0@1@tp0,g108$@0#qsort
+590$@1@@1@s0$@0#abs
+597$@1@@1@s0$@0#div
+601$@1@@1@s0$@0#labs
+606$@1@@1@s0$@0#ldiv
+610$@1@@1@s0$@0#btowc
+614$@0@s3@1@s3,tp0$@0#fgetwc
+621@6@5@0@0@0@0@s3@1@s3,tp0,tp2$@0#fgetws
+625$@0@s3@1@s3,tp1$@0#fputwc
+629$@0@s3@1@s3,tp1$@0#fputws
+633$@1@@1@s0$@0#fwide
+637@6@0@0@1@0@0@s3@1@tp0,s3$@0#fwprintf
+641@6@0@0@2@0@0@s3@1@tp0,s3$@0#fwscanf
+645$@0@s3@1@s3,tp0$@0#getwc
+649$@0@s3,g110@0@0@1@s3,tg110$@0#getwchar
+654$@1@@1@s0$@0#mbrlen
+658$@0@@1@tp0$@0#mbrtowc
+662$@1@@1@s0$@0#mbsinit
+666$@0@@1@tp0$@0#mbsrtowcs
+670$@0@s3@1@s3,tp1$@0#putwc
+674$@0@s3,g109@0@0@1@s3,tg109$@0#putwchar
+678@6@0@0@1@0@0@@1@tp0$@0#swprintf
+682@6@0@0@2@0@0@g110@0@0@1@tg110$@0#swscanf
+686$@0@s3@1@s3,tp1$@0#ungetwc
+690$@0@s3@1@s3,tp0$@0#vfwprintf
+694$@0@@1@tp0$@0#vswprintf
+698$@0@s3,g109@0@0@1@s3,tg109$@0#vwprintf
+702$@0@@1@tp0$@0#wcrtomb
+709$@0@@1@tp0$@0#wcscat
+715@6@5@0@0@0@1@@1@s0@19@2@0#wcschr
+719$@1@@1@s0$@0#wcscmp
+723$@1@@1@s0$@0#wcscoll
+730$@0@@1@tp0$@0#wcscpy
+734$@1@@1@s0$@0#wcscspn
+740$@0@@1@tp0$@0#wcsftime
+744$@1@@1@s0$@0#wcslen
+751$@0@@1@tp0$@0#wcsncat
+755$@1@@1@s0$@0#wcsncmp
+761$@0@@1@tp0$@0#wcsncpy
+767@6@5@0@0@0@1@@1@s0$@0#wcspbrk
+773@6@5@0@0@0@1@@1@s0$@0#wcsrchr
+778$@0@@1@tp1$@0#wcsrtombs
+782$@1@@1@s0$@0#wcsspn
+788@6@5@0@0@0@1@@1@s0@3@0@0#wcsstr
+792$@0@@1@tp1$@0#wcstod
+798@6@5@0@0@0@0@@1@tp2@3@0@0#wcstok
+802$@0@@1@tp1$@0#wcstol
+806$@0@@1@tp1$@0#wcstoul
+810$@0@@1@tp0$@0#wcsxfrm
+814$@1@@1@s0$@0#wctob
+820@6@5@0@0@0@1@@1@s0@3@0@0#wmemchr
+824$@1@@1@s0$@0#wmemcmp
+830$@0@@1@tp0$@0#wmemcpy
+836$@0@@1@tp0$@0#wmemmove
+842$@0@@1@tp0$@0#wmemset
+846@6@0@0@1@0@1@g109@0@0,g108@0@0@1@g108,tg109$@0#wprintf
+850@6@0@0@2@0@1@g110@0@0,g108@0@0@1@g108,tg110$@0#wscanf
+858$@1@@1@s0$@0#iswalnum
+864$@1@@1@s0$@0#iswalpha
+870$@1@@1@s0$@0#iswcntrl
+876$@1@@1@s0$@0#iswctype
+882$@1@@1@s0$@0#iswdigit
+888$@1@@1@s0$@0#iswgraph
+894$@1@@1@s0$@0#iswlower
+900$@1@@1@s0$@0#iswprint
+906$@1@@1@s0$@0#iswpunct
+912$@1@@1@s0$@0#iswspace
+918$@1@@1@s0$@0#iswupper
+924$@1@@1@s0$@0#iswxdigit
+931$@1@@1@s0$@0#towctrans
+937$@1@@1@s0$@0#towlower
+944$@1@@1@s0$@0#towupper
+948$@1@@1@s0$@0#wctrans
+952$@1@@1@s0$@0#wctype
+956$@1@@1@s0$@0#mblen
+960$@0@@1@tp0$@0#mbtowc
+964$@0@@1@tp0$@0#wctomb
+968$@0@@1@tp0$@0#mbstowcs
+972$@0@@1@tp0$@0#wcstombs
+979$@0@@1@tp0$@0#memcpy
+985$@0@@1@tp0$@0#memmove
+992$@0@@1@tp0$@0#strcpy
+998$@0@@1@tp0$@0#strncpy
+1005$@0@@1@tp0$@0#strcat
+1011$@0@@1@tp0$@0#strncat
+1015$@1@@1@s0$@0#memcmp
+1019$@1@@1@s0$@0#strcmp
+1023$@1@@1@s0$@0#strcoll
+1027$@1@@1@s0$@0#strncmp
+1031$@0@@1@tp0$@0#strxfrm
+1037@6@5@0@0@0@1@@1@s0@3@0@0#memchr
+1043@6@5@0@0@0@1@@1@s0@19@2@0#strchr
+1047$@1@@1@s0$@0#strcspn
+1053@6@5@0@0@0@1@@1@s0@19@2@0#strpbrk
+1059@6@5@0@0@0@1@@1@s0@19@2@0#strrchr
+1063$@1@@1@s0$@0#strspn
+1069@6@5@0@0@0@1@@1@s0@19@2@0#strstr
+1075@6@5@0@0@0@0@s1,g108@0@0@1@tp0,s1,g108@19@2@0#strtok
+1082$@0@@1@tp0$@0#memset
+1088$@1@@1@s0@19@3@0#strerror
+1092$@1@@1@s0$@0#strlen
+1099$@0@s1@1@s1$@0#clock
+1103$@1@@1@s0$@0#difftime
+1107$@1@@1@s0$@0#mktime
+1112$@0@@1@tp0$@0#time
+1118$@0@g108@0@0@1@g108@19@3@0#asctime
+1124$@1@@1@s0@19@3@0#ctime
+1130@6@5@0@0@0@1@@1@s0@2@0@0#gmtime
+1136@6@5@0@0@0@0@g108@0@0@1@g108@2@0@0#localtime
+1140$@0@@1@tp0$@0#strftime
+*7 (Struct tag)
+591@592#@!2
+1095@735#@tm
+145@146#@lconv
+;; Modules access
+ansi#8@
+null6#10@
+;;End
diff --git a/test/tests2.2/posix.c b/test/tests2.2/posix.c
new file mode 100644
index 0000000..433c94d
--- /dev/null
+++ b/test/tests2.2/posix.c
@@ -0,0 +1,7 @@
+/* 
+** Should include sys/types is a posix library is not used.
+*/
+
+# include 
+
+dev_t x = 3;
diff --git a/test/tests2.2/realloc.c b/test/tests2.2/realloc.c
new file mode 100644
index 0000000..f0cbba9
--- /dev/null
+++ b/test/tests2.2/realloc.c
@@ -0,0 +1,6 @@
+void f (/*@only@*/ char *s)
+{
+  char *m = realloc (s);
+
+  free (m);
+}
diff --git a/test/tests2.2/rex.c b/test/tests2.2/rex.c
new file mode 100644
index 0000000..c4f8e6f
--- /dev/null
+++ b/test/tests2.2/rex.c
@@ -0,0 +1,27 @@
+#include 
+
+struct rx_hash
+{
+  struct rx_hash *parent;
+  struct rx_hash *children[13];
+};
+
+typedef struct rx_hash regex_t;
+
+void regcomp (/*@out@*/ regex_t *re);
+
+int main (int, char **)
+{
+  regex_t re;
+
+  regcomp (&re);
+
+  return 2;
+}
+
+int f (void)
+{
+  /*@-varuse@*/ regex_t re; /*@=varuse@*/
+  return 3;
+}
+
diff --git a/test/tests2.2/sizeofarray.c b/test/tests2.2/sizeofarray.c
new file mode 100644
index 0000000..8fbaae4
--- /dev/null
+++ b/test/tests2.2/sizeofarray.c
@@ -0,0 +1,11 @@
+int f (int x[32])
+{
+  int a[23];
+
+  if (sizeof(x) == 3)
+    {
+      return 1;
+    }
+
+  return sizeof(a);
+}
diff --git a/test/tests2.2/struct.c b/test/tests2.2/struct.c
new file mode 100644
index 0000000..34b2ab5
--- /dev/null
+++ b/test/tests2.2/struct.c
@@ -0,0 +1,20 @@
+extern double read_double (void);
+
+typedef struct
+{
+   float a;
+} some_type;
+
+typedef struct 
+{
+   double a;
+} another_type;
+
+void main (void)
+{
+  another_type f;
+  double x;
+  
+  x = read_double ();
+  f.a = read_double ();
+}
diff --git a/test/tests2.2a.expect b/test/tests2.2a.expect
new file mode 100644
index 0000000..0e4a8f4
--- /dev/null
+++ b/test/tests2.2a.expect
@@ -0,0 +1,124 @@
+
+erik.c: (in function main)
+erik.c:6:4: Return value (type int) ignored: scanf("%lf %f", ...
+
+Finished LCLint checking --- 1 code error found, as expected
+
+boolcomp.c: (in function f)
+boolcomp.c:5:7: Use of == with bool variables (risks inconsistency because of
+                   multiple true values): a == b
+boolcomp.c:9:13: Use of == with bool variables (risks inconsistency because of
+                    multiple true values): a == b
+boolcomp.c:11:6: Use of != with bool variables (risks inconsistency because of
+                    multiple true values): a != b
+boolcomp.c:16:6: Use of == with bool variables (risks inconsistency because of
+                    multiple true values): b == TRUE
+boolcomp.c:20:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+addassign.c: (in function hash)
+addassign.c:7:7: Incompatible types for += (int, char): h += *name++
+
+Finished LCLint checking --- 1 code error found, as expected
+
+toralf.c: (in function func1)
+toralf.c:14:3: Incompatible types for += (char *, char): s += 'c'
+toralf.c:15:3: Variable i1 used before definition
+toralf.c:15:9: Variable f used before definition
+toralf.c: (in function func2)
+toralf.c:23:8: Variable i2 used before definition
+toralf.c: (in function main)
+toralf.c:28:10: Null storage passed as non-null param: func1 (NULL)
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+arrayparam.c:1:12: Function parameter x is incomplete type (inner array must
+                      have bounds): int [2] []
+arrayparam.c:11:12: Function parameter x is incomplete type (inner array must
+                       have bounds): int [] []
+arrayparam.c:16:12: Function parameter x is incomplete type (inner array must
+                       have bounds): int [] [] [2]
+arrayparam.c:21:12: Function parameter x is incomplete type (inner array must
+                       have bounds): int [2] [] [2]
+arrayparam.c:26:12: Function parameter x declared as manifest array (size
+                       constant is meaningless)
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+duff.c: (in function copy)
+duff.c:15:12: Statement after switch is not a case: do { { case 0: } } while
+                 (--n > 0)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+obviousloop.c: (in function f)
+obviousloop.c:14:3: Unreachable code: x = 12
+obviousloop.c: (in function f1)
+obviousloop.c:36:2: Path with no return in function declared to return int
+obviousloop.c: (in function f1b)
+obviousloop.c:59:3: Unreachable code: x = 12
+obviousloop.c: (in function f2)
+obviousloop.c:75:3: Unreachable code: x = 12
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+bitops.c: (in function f)
+bitops.c:3:11: Left operand of & is not unsigned value (int): i1 & i2
+bitops.c:3:11: Variable x initialized to type unsigned int, expects int:
+                  i1 & i2
+bitops.c:4:21: Right operand of & is not unsigned value (int): u1 & i2
+bitops.c:5:13: Left operand of & is not unsigned value (int): i1 & i2
+bitops.c:5:13: Variable s initialized to type unsigned int, expects short int:
+                  i1 & i2
+bitops.c:6:14: Variable s2 initialized to type int, expects short int: i1 + i2
+bitops.c:9:7: Left operand of << is not unsigned value (int): i1 << 3
+bitops.c:14:7: Left operand of ^ is not unsigned value (int): i1 ^ u1
+bitops.c:15:12: Right operand of ^ is not unsigned value (int): u1 ^ i1
+bitops.c:5:9: Variable s declared but not used
+bitops.c:6:9: Variable s2 declared but not used
+
+Finished LCLint checking --- 11 code errors found, as expected
+
+bitops.c: (in function f)
+bitops.c:5:13: Variable s initialized to type int, expects short int: i1 & i2
+bitops.c:6:14: Variable s2 initialized to type int, expects short int: i1 + i2
+bitops.c:9:7: Left operand of << is not unsigned value (int): i1 << 3
+bitops.c:5:9: Variable s declared but not used
+bitops.c:6:9: Variable s2 declared but not used
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+isalpha.c: (in function f)
+isalpha.c:5:19: Function isalpha expects arg 1 to be unsigned char gets char: c
+
+Finished LCLint checking --- 1 code error found, as expected
+
+isalpha.c: (in function f)
+isalpha.c:5:19: Function isalpha expects arg 1 to be unsigned char gets char: c
+
+Finished LCLint checking --- 1 code error found, as expected
+
+Finished LCLint checking --- no code errors found
+
+popik.c:7:3: Variable has unknown (implicitly int) type: dummy[0]
+popik.c:7:3: Variable has unknown (implicitly int) type: dummy[1]
+popik.c:7:3: Variable has unknown (implicitly int) type: dummy[2]
+popik.c:7:3: Variable has unknown (implicitly int) type: dummy[3]
+popik.c:24:3: Variable has unknown (implicitly int) type: dummy3[0]
+popik.c:24:3: Variable has unknown (implicitly int) type: dummy3[1]
+popik.c:24:3: Variable has unknown (implicitly int) type: dummy3[2]
+popik.c:24:3: Variable has unknown (implicitly int) type: dummy3[3]
+popik.c:1:14: File static variable dummy declared but not used
+popik.c:10:24: File static variable dummy2 declared but not used
+popik.c:18:14: File static variable dummy3 declared but not used
+
+Finished LCLint checking --- 11 code errors found, as expected
diff --git a/test/tests2.2a.out b/test/tests2.2a.out
new file mode 100644
index 0000000..0e4a8f4
--- /dev/null
+++ b/test/tests2.2a.out
@@ -0,0 +1,124 @@
+
+erik.c: (in function main)
+erik.c:6:4: Return value (type int) ignored: scanf("%lf %f", ...
+
+Finished LCLint checking --- 1 code error found, as expected
+
+boolcomp.c: (in function f)
+boolcomp.c:5:7: Use of == with bool variables (risks inconsistency because of
+                   multiple true values): a == b
+boolcomp.c:9:13: Use of == with bool variables (risks inconsistency because of
+                    multiple true values): a == b
+boolcomp.c:11:6: Use of != with bool variables (risks inconsistency because of
+                    multiple true values): a != b
+boolcomp.c:16:6: Use of == with bool variables (risks inconsistency because of
+                    multiple true values): b == TRUE
+boolcomp.c:20:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+addassign.c: (in function hash)
+addassign.c:7:7: Incompatible types for += (int, char): h += *name++
+
+Finished LCLint checking --- 1 code error found, as expected
+
+toralf.c: (in function func1)
+toralf.c:14:3: Incompatible types for += (char *, char): s += 'c'
+toralf.c:15:3: Variable i1 used before definition
+toralf.c:15:9: Variable f used before definition
+toralf.c: (in function func2)
+toralf.c:23:8: Variable i2 used before definition
+toralf.c: (in function main)
+toralf.c:28:10: Null storage passed as non-null param: func1 (NULL)
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+arrayparam.c:1:12: Function parameter x is incomplete type (inner array must
+                      have bounds): int [2] []
+arrayparam.c:11:12: Function parameter x is incomplete type (inner array must
+                       have bounds): int [] []
+arrayparam.c:16:12: Function parameter x is incomplete type (inner array must
+                       have bounds): int [] [] [2]
+arrayparam.c:21:12: Function parameter x is incomplete type (inner array must
+                       have bounds): int [2] [] [2]
+arrayparam.c:26:12: Function parameter x declared as manifest array (size
+                       constant is meaningless)
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+duff.c: (in function copy)
+duff.c:15:12: Statement after switch is not a case: do { { case 0: } } while
+                 (--n > 0)
+
+Finished LCLint checking --- 1 code error found, as expected
+
+obviousloop.c: (in function f)
+obviousloop.c:14:3: Unreachable code: x = 12
+obviousloop.c: (in function f1)
+obviousloop.c:36:2: Path with no return in function declared to return int
+obviousloop.c: (in function f1b)
+obviousloop.c:59:3: Unreachable code: x = 12
+obviousloop.c: (in function f2)
+obviousloop.c:75:3: Unreachable code: x = 12
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+bitops.c: (in function f)
+bitops.c:3:11: Left operand of & is not unsigned value (int): i1 & i2
+bitops.c:3:11: Variable x initialized to type unsigned int, expects int:
+                  i1 & i2
+bitops.c:4:21: Right operand of & is not unsigned value (int): u1 & i2
+bitops.c:5:13: Left operand of & is not unsigned value (int): i1 & i2
+bitops.c:5:13: Variable s initialized to type unsigned int, expects short int:
+                  i1 & i2
+bitops.c:6:14: Variable s2 initialized to type int, expects short int: i1 + i2
+bitops.c:9:7: Left operand of << is not unsigned value (int): i1 << 3
+bitops.c:14:7: Left operand of ^ is not unsigned value (int): i1 ^ u1
+bitops.c:15:12: Right operand of ^ is not unsigned value (int): u1 ^ i1
+bitops.c:5:9: Variable s declared but not used
+bitops.c:6:9: Variable s2 declared but not used
+
+Finished LCLint checking --- 11 code errors found, as expected
+
+bitops.c: (in function f)
+bitops.c:5:13: Variable s initialized to type int, expects short int: i1 & i2
+bitops.c:6:14: Variable s2 initialized to type int, expects short int: i1 + i2
+bitops.c:9:7: Left operand of << is not unsigned value (int): i1 << 3
+bitops.c:5:9: Variable s declared but not used
+bitops.c:6:9: Variable s2 declared but not used
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+isalpha.c: (in function f)
+isalpha.c:5:19: Function isalpha expects arg 1 to be unsigned char gets char: c
+
+Finished LCLint checking --- 1 code error found, as expected
+
+isalpha.c: (in function f)
+isalpha.c:5:19: Function isalpha expects arg 1 to be unsigned char gets char: c
+
+Finished LCLint checking --- 1 code error found, as expected
+
+Finished LCLint checking --- no code errors found
+
+popik.c:7:3: Variable has unknown (implicitly int) type: dummy[0]
+popik.c:7:3: Variable has unknown (implicitly int) type: dummy[1]
+popik.c:7:3: Variable has unknown (implicitly int) type: dummy[2]
+popik.c:7:3: Variable has unknown (implicitly int) type: dummy[3]
+popik.c:24:3: Variable has unknown (implicitly int) type: dummy3[0]
+popik.c:24:3: Variable has unknown (implicitly int) type: dummy3[1]
+popik.c:24:3: Variable has unknown (implicitly int) type: dummy3[2]
+popik.c:24:3: Variable has unknown (implicitly int) type: dummy3[3]
+popik.c:1:14: File static variable dummy declared but not used
+popik.c:10:24: File static variable dummy2 declared but not used
+popik.c:18:14: File static variable dummy3 declared but not used
+
+Finished LCLint checking --- 11 code errors found, as expected
diff --git a/test/tests2.2a/addassign.c b/test/tests2.2a/addassign.c
new file mode 100644
index 0000000..04c4024
--- /dev/null
+++ b/test/tests2.2a/addassign.c
@@ -0,0 +1,11 @@
+int hash (char *name)
+{
+  int h = 0;
+  
+  while (*name != '\0') 
+    {
+      h += *name++; /* error in 2.1b */
+    }
+
+  return h % 137;
+}
diff --git a/test/tests2.2a/arrayparam.c b/test/tests2.2a/arrayparam.c
new file mode 100644
index 0000000..c143c9e
--- /dev/null
+++ b/test/tests2.2a/arrayparam.c
@@ -0,0 +1,30 @@
+int f1(int x[2][]) /* bad */
+{
+  return x[2][3];
+}
+
+int f2(int x[][2]) /* okay */
+{
+  return x[2][3];
+}
+
+int f3(int x[][]) /* bad */
+{
+  return x[2][3];
+}
+
+int f4(int x[][][2]) /* bad */
+{
+  return x[2][3][1];
+}
+
+int f5(int x[2][][2]) /* bad */
+{
+  return x[2][3][1];
+}
+
+int f6(int x[][2][2]) /* okay */
+{
+  return x[2][3][1];
+}
+
diff --git a/test/tests2.2a/bitops.c b/test/tests2.2a/bitops.c
new file mode 100644
index 0000000..01aa23e
--- /dev/null
+++ b/test/tests2.2a/bitops.c
@@ -0,0 +1,30 @@
+int f (int i1, int i2, unsigned u1, unsigned u2)
+{
+  int x = i1 & i2; /* not unsigned */
+  unsigned u = u1 & i2;
+  short s = i1 & i2;  /* not unsigned */
+  short s2 = i1 + i2;
+
+  u = u1 | u2;
+  u = i1 << 3; /* left operand not unsigned */
+  u = u1 >> 4; /* okay */
+  u = u1 >> i1;
+
+  u >>= 3;
+  u = i1 ^ u1; /* ! unsigned */
+  u = u1 ^ i1; /* ! not unsigned */
+
+  return x;
+}
+
+/*
+
+>>, >>=
+<<, <<=
+    warn if not unsigned
+
+&, &=
+|, |=
+^ (XOR), ^=
+   warn if not unsigned
+*/
diff --git a/test/tests2.2a/boolcomp.c b/test/tests2.2a/boolcomp.c
new file mode 100644
index 0000000..c16d4c8
--- /dev/null
+++ b/test/tests2.2a/boolcomp.c
@@ -0,0 +1,20 @@
+# include "../bool.h"
+
+int f (bool a, bool b)
+{
+  if (a == b) /* 1. */
+    {
+      return 3;
+    }
+  else if ((a == b) /* 2. */
+	   == 
+	   (a != b)) /* 3. */
+    {
+      return 5;
+    }
+  else if ((a == FALSE) == 
+	   (b == TRUE)) /* 4. */
+    {
+      return 7;
+    }
+}
diff --git a/test/tests2.2a/boolenum.c b/test/tests2.2a/boolenum.c
new file mode 100644
index 0000000..3e5df5b
--- /dev/null
+++ b/test/tests2.2a/boolenum.c
@@ -0,0 +1 @@
+typedef enum { FALSE, TRUE } bool;
diff --git a/test/tests2.2a/dobb.c b/test/tests2.2a/dobb.c
new file mode 100644
index 0000000..8aba1fb
--- /dev/null
+++ b/test/tests2.2a/dobb.c
@@ -0,0 +1,8 @@
+typedef int t_u_byte;
+
+#define TESTVALUE  (t_u_byte) 7
+typedef enum e_test
+{
+e_c1,
+e_cl = (e_c1 + (((t_u_byte) 7) - 1)),
+} t_test;
diff --git a/test/tests2.2a/duff.c b/test/tests2.2a/duff.c
new file mode 100644
index 0000000..e335eb0
--- /dev/null
+++ b/test/tests2.2a/duff.c
@@ -0,0 +1,17 @@
+void copy ( to, from, count )
+     char* to;
+     char* from; 
+{
+  int n=(count+7)/8;
+  switch (count%8) do {
+  case 0: *to = *from++;
+  case 7: *to = *from++;
+  case 6: *to = *from++;
+  case 5: *to = *from++;
+  case 4: *to = *from++;
+  case 3: *to = *from++;
+  case 2: *to = *from++;
+  case 1: *to = *from++;
+  } while (--n>0);
+}
+
diff --git a/test/tests2.2a/erik.c b/test/tests2.2a/erik.c
new file mode 100644
index 0000000..dd80ee7
--- /dev/null
+++ b/test/tests2.2a/erik.c
@@ -0,0 +1,9 @@
+int main (void)
+{
+   float f;
+   double d;
+
+   scanf("%lf %f",&d, &f);
+   
+   return 0;
+}
diff --git a/test/tests2.2a/floatdouble.c b/test/tests2.2a/floatdouble.c
new file mode 100644
index 0000000..faf705c
--- /dev/null
+++ b/test/tests2.2a/floatdouble.c
@@ -0,0 +1,9 @@
+int f (float f, double d)
+{
+  float f1 = d;  /* bad without +floatdouble */
+  double d1 = f; /* okay relaxed */
+
+  f1 = d + f;
+
+  return 2;
+}
diff --git a/test/tests2.2a/florian.c b/test/tests2.2a/florian.c
new file mode 100644
index 0000000..8f24c93
--- /dev/null
+++ b/test/tests2.2a/florian.c
@@ -0,0 +1,5 @@
+int foo(bar) /*@modifies *bar*/
+     int *bar;
+{
+  return 3;
+}
diff --git a/test/tests2.2a/fred.c b/test/tests2.2a/fred.c
new file mode 100644
index 0000000..0777bbd
--- /dev/null
+++ b/test/tests2.2a/fred.c
@@ -0,0 +1,13 @@
+#include 			/* free, EXIT_SUCCESS */
+
+typedef int Bool;	
+#define False	0
+
+static void CheckQualsSub(Bool Found);
+
+void CheckQuals(void)
+{
+    Bool B = False;
+    
+    CheckQualsSub (B);
+}
diff --git a/test/tests2.2a/isalpha.c b/test/tests2.2a/isalpha.c
new file mode 100644
index 0000000..c530501
--- /dev/null
+++ b/test/tests2.2a/isalpha.c
@@ -0,0 +1,6 @@
+# include "../bool.h"
+
+bool f (char c)
+{
+  return isalpha (c);
+}
diff --git a/test/tests2.2a/notreached.c b/test/tests2.2a/notreached.c
new file mode 100644
index 0000000..d683109
--- /dev/null
+++ b/test/tests2.2a/notreached.c
@@ -0,0 +1,9 @@
+int f (int x)
+{
+  if (x > 3) {
+    /*@notreached@*/ ;
+  } else {
+    return 3;
+    /*@notreached@*/ x = 12;
+  }
+}
diff --git a/test/tests2.2a/obviousloop.c b/test/tests2.2a/obviousloop.c
new file mode 100644
index 0000000..cf87538
--- /dev/null
+++ b/test/tests2.2a/obviousloop.c
@@ -0,0 +1,77 @@
+int f (void)
+{
+  int x = 3;
+
+  while (TRUE)
+    {
+      x++;
+
+      if (x == 12) {
+	return 12;
+      }
+    }
+
+  x = 12; /* unreachable */
+}
+
+int f1 (void)
+{
+  int x = 3;
+
+  while (TRUE)
+    {
+      x++;
+
+      if (x == 12) {
+	return 12;
+      }
+
+      if (x == 8) {
+	break;
+      }
+    }
+
+  x = 12;
+  /* no return */
+}
+
+int f1b (void)
+{
+  int x = 3;
+
+  while (TRUE)
+    {
+      x++;
+
+      if (x == 12) {
+	return 12;
+      }
+
+      if (x == 8) {
+	for (x = 2; x < 2; x++) {
+	  if (x == 4) {
+	    break;
+	  }
+	}
+      }
+    }
+
+  x = 12; /* unreachable */
+}
+
+int f2 (void)
+{
+  int x = 3;
+
+  for (;;)
+    {
+      x++;
+
+      if (x == 12) {
+	return 12;
+      }
+    }
+
+  x = 12; /* unreachable */
+}
+
diff --git a/test/tests2.2a/popik.c b/test/tests2.2a/popik.c
new file mode 100644
index 0000000..8a1875d
--- /dev/null
+++ b/test/tests2.2a/popik.c
@@ -0,0 +1,35 @@
+static const dummy[] = 
+{
+	0x0,
+        0x1,
+        0x1,
+        0x2
+};
+
+
+static const short int dummy2[] = 
+{
+        0x0,
+        0x1,
+        0x1,
+        0x2
+};
+
+static const dummy3[] = 
+{
+        0,
+        1,
+        1,
+        2
+};
+
+/* What this means is that there appear to be some problems with lclint
+   1) doesn't detect the missing typing in the first and last examples
+          - gcc 2.7.2.f.1 doesn't either it compiles this code without a comment
+   2) changing the declaration from 0x0 to 0 has no effect(I expected this),
+      but changing 0x1 & 0x2 to 1 & 2 did and I don't have any explanation.
+
+*/
+
+
+
diff --git a/test/tests2.2a/sizeof.c b/test/tests2.2a/sizeof.c
new file mode 100644
index 0000000..eeb7d93
--- /dev/null
+++ b/test/tests2.2a/sizeof.c
@@ -0,0 +1,4 @@
+size_t f (int x)
+{
+  return sizeof (sizeof (x));
+}
diff --git a/test/tests2.2a/toralf.c b/test/tests2.2a/toralf.c
new file mode 100644
index 0000000..495038c
--- /dev/null
+++ b/test/tests2.2a/toralf.c
@@ -0,0 +1,35 @@
+/** fixed, 8 july 1997 */
+
+/* test file for lclint */
+
+# include 
+
+static void func1 (char *x)
+{
+  char *s = x;
+  int i1;
+  float f;
+  
+  s += 5;
+  s += 'c'; /* bad types */
+  i1 += f; /* i1 used before def, f used before def */
+}
+
+static void func2()
+{
+  int i1;
+  int i2;
+  
+  i1 = i2; /* i2 used before def */
+}
+
+int main ()
+{
+  func1 (NULL); /* null passed */
+  func2 ();
+  return (EXIT_SUCCESS);
+}
+
+
+
+
diff --git a/test/tests2.3.expect b/test/tests2.3.expect
new file mode 100644
index 0000000..ef21070
--- /dev/null
+++ b/test/tests2.3.expect
@@ -0,0 +1,117 @@
+
+pptest.c:26:21: Preprocessor command #else is not within a conditional
+pptest.c:28:30: Unbalanced #endif
+Preprocessing error for file: pptest.c
+*** Cannot continue.
+
+pptest.c:26:21: Preprocessor command #else is not within a conditional
+pptest.c:28:30: Unbalanced #endif
+Preprocessing error for file: pptest.c
+*** Cannot continue.
+
+pptest.c:26:21: Preprocessor command #else is not within a conditional
+pptest.c:28:30: Unbalanced #endif
+Preprocessing error for file: pptest.c
+*** Cannot continue.
+
+pptest.c:15:15: Parameter list for #define is not parseable
+pptest.c:22:41: Division by zero in #if
+pptest.c:26:21: Preprocessor command #else is not within a conditional
+pptest.c:28:30: Unbalanced #endif
+Preprocessing error for file: pptest.c
+*** Cannot continue.
+
+pptest2.c:1:21: invalid macro name
+pptest2.c:1:21: Missing white space after #define 
+pptest2.c:3:13: invalid macro name
+pptest2.c:5:17: `defined' without an identifier
+pptest2.c:5:24: Division by zero in #if
+pptest2.c:5:25: mismatched parentheses in #if
+pptest2.c:11:1: Macro XFIG already defined
+  pptest2.c:10: Previous definition of XFIG
+pptest2.c:12:1: Macro XFIG already defined
+  pptest2.c:11: Previous definition of XFIG
+Preprocessing error for file: pptest2.c
+*** Cannot continue.
+
+Finished LCLint checking --- no code errors found
+
+fielduse.c:7:18: Field bit of unnamed structure declared but not used
+
+Finished LCLint checking --- 1 code error found, as expected
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+func.c: (in function x)
+func.c:17:7: Call to non-function (type [function (void) returns int] **):
+                (&pf)
+func.c:23:7: Call to non-function (type [function (void) returns int] ***):
+                (&ppf)
+func.c:24:7: Call to non-function (type [function (void) returns int] **): ppf
+func.c:29:7: Call to non-function (type [function (void) returns int] ****):
+                (&pppf)
+func.c:30:7: Call to non-function (type [function (void) returns int] ***):
+                pppf
+func.c:31:7: Call to non-function (type [function (void) returns int] **):
+                (*pppf)
+func.c:35:3: Invalid left-hand side of assignment (function type [function
+                (void) returns int]): f
+func.c:37:3: Assignment of [function (void) returns int] * to [function (void)
+                returns int] **: ppf = pf
+func.c:40:3: Assignment of [function (void) returns int] ** to [function (void)
+                returns int] ***: pppf = ppf
+
+Finished LCLint checking --- 9 code errors found, as expected
+Command Line: Setting mode checks after setting mode flags will override set
+                 values of flags: exportlocal
+
+func.c: (in function x)
+func.c:13:9: Dereference of function type ([function (void) returns int]): *f
+func.c:14:10: Dereference of function type ([function (void) returns int]): *f
+func.c:14:9: Dereference of function type ([function (void) returns int]): **f
+func.c:15:11: Dereference of function type ([function (void) returns int]): *f
+func.c:15:10: Dereference of function type ([function (void) returns int]): **f
+func.c:15:9: Dereference of function type ([function (void) returns int]): ***f
+func.c:17:7: Call to non-function (type [function (void) returns int] **):
+                (&pf)
+func.c:20:9: Dereference of function type ([function (void) returns int]): **pf
+func.c:21:10: Dereference of function type ([function (void) returns int]):
+                 **pf
+func.c:21:9: Dereference of function type ([function (void) returns int]):
+                ***pf
+func.c:23:7: Call to non-function (type [function (void) returns int] ***):
+                (&ppf)
+func.c:24:7: Call to non-function (type [function (void) returns int] **): ppf
+func.c:27:9: Dereference of function type ([function (void) returns int]):
+                ***ppf
+func.c:29:7: Call to non-function (type [function (void) returns int] ****):
+                (&pppf)
+func.c:30:7: Call to non-function (type [function (void) returns int] ***):
+                pppf
+func.c:31:7: Call to non-function (type [function (void) returns int] **):
+                (*pppf)
+func.c:35:3: Invalid left-hand side of assignment (function type [function
+                (void) returns int]): f
+func.c:37:3: Assignment of [function (void) returns int] * to [function (void)
+                returns int] **: ppf = pf
+func.c:40:3: Assignment of [function (void) returns int] ** to [function (void)
+                returns int] ***: pppf = ppf
+func.c:3:6: Function x exported but not declared in header file
+   func.c:43:1: Definition of x
+
+Finished LCLint checking --- 20 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+unnamedstruct.c:10:7: Field name reused: x
+unnamedstruct.c:5:9: Previous use of x
+
+Finished LCLint checking --- 1 code error found, as expected
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
diff --git a/test/tests2.4.expect b/test/tests2.4.expect
new file mode 100644
index 0000000..c27a8e9
--- /dev/null
+++ b/test/tests2.4.expect
@@ -0,0 +1,123 @@
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+duffs.c: (in function send)
+duffs.c:7:8: Fall through case (no preceeding break)
+duffs.c:8:8: Fall through case (no preceeding break)
+duffs.c:9:8: Fall through case (no preceeding break)
+duffs.c:10:8: Fall through case (no preceeding break)
+duffs.c:11:8: Fall through case (no preceeding break)
+duffs.c:12:8: Fall through case (no preceeding break)
+duffs.c:13:8: Fall through case (no preceeding break)
+
+Finished LCLint checking --- 7 code errors found
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+bug2.c: (in function main)
+bug2.c:6:8: Fall through case (no preceeding break)
+bug2.c:10:10: Fall through case (no preceeding break)
+bug2.c:16:8: Fall through case (no preceeding break)
+bug2.c:5:5: Statement after switch is not a case: printf("here 1")
+bug2.c:20:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+bug3.c: (in function main)
+bug3.c:8:8: Fall through case (no preceeding break)
+bug3.c:12:21: Variable j used before definition
+bug3.c:13:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 3 code errors found
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+hexconstants.c: (in function f)
+hexconstants.c:5:10: Return value type unsigned int does not match declared
+                        type int: m1 + m2
+
+Finished LCLint checking --- 1 code error found, as expected
+Command Line: Setting mode checks after setting mode flags will override set
+                 values of flags: exportlocal
+
+hexconstants.c: (in function f)
+hexconstants.c:2:21: Variable m1 initialized to type int, expects unsigned int:
+                        0xFF
+hexconstants.c:3:21: Variable m2 initialized to type int, expects unsigned int:
+                        0142
+hexconstants.c:5:10: Return value type unsigned int does not match declared
+                        type int: m1 + m2
+hexconstants.c:1:5: Function f exported but not declared in header file
+   hexconstants.c:6:1: Definition of f
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+innercomment.c:1:17: Start comment inside comment
+innercomment.c:16:3: Start comment inside comment
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+offsetof.c: (in function f)
+offsetof.c:10:3: Assignment of size_t to int: m = offsetof(S,u)
+offsetof.c:12:26: Deep field k in offsetof is not the name of a field of struct
+                     { int m; }: offsetof(S,u.s.k)
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+error.c:5:9: Variable x initialized to type char, expects int: 'a'
+
+Finished LCLint checking --- 1 code error found, as expected
+
+ulrich.c: (in function utl_calloc)
+ulrich.c:14:13: Possibly null storage newblock returned as non-null: newblock
+   ulrich.c:12:16: Storage newblock may become null
+
+Finished LCLint checking --- 1 code error found
+
+cpptest.c: (in function test)
+cpptest.c:2:11: Variable x initialized to type char, expects int: 'a'
+
+Finished LCLint checking --- 1 code error found
+
+longlong.c: (in function llf)
+longlong.c:2:11: Variable m initialized to type long long, expects int: llx
+longlong.c:3:3: Assignment of long long to int: m = 243LL
+longlong.c:6:3: Assignment of long long to long int: lx = 5234LL
+longlong.c:9:3: Assignment of long long to long int: lx = llx
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+alignof.c: (in function f)
+alignof.c:2:23: Variable m initialized to type size_t, expects int: alignof(x)
+alignof.c:3:23: Variable n initialized to type size_t, expects int:
+                   alignof((x))
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+Spec file not found: DBL_MANT_DIG=25.lcl
+Command Line: Malformed option `-D'
+Cannot open file: DBL_MANT_DIG=25.c
+Cannot open file: source.c
+
+Finished LCLint checking --- no code processed
diff --git a/test/tests2.4.out b/test/tests2.4.out
new file mode 100644
index 0000000..c27a8e9
--- /dev/null
+++ b/test/tests2.4.out
@@ -0,0 +1,123 @@
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+duffs.c: (in function send)
+duffs.c:7:8: Fall through case (no preceeding break)
+duffs.c:8:8: Fall through case (no preceeding break)
+duffs.c:9:8: Fall through case (no preceeding break)
+duffs.c:10:8: Fall through case (no preceeding break)
+duffs.c:11:8: Fall through case (no preceeding break)
+duffs.c:12:8: Fall through case (no preceeding break)
+duffs.c:13:8: Fall through case (no preceeding break)
+
+Finished LCLint checking --- 7 code errors found
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+bug2.c: (in function main)
+bug2.c:6:8: Fall through case (no preceeding break)
+bug2.c:10:10: Fall through case (no preceeding break)
+bug2.c:16:8: Fall through case (no preceeding break)
+bug2.c:5:5: Statement after switch is not a case: printf("here 1")
+bug2.c:20:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+bug3.c: (in function main)
+bug3.c:8:8: Fall through case (no preceeding break)
+bug3.c:12:21: Variable j used before definition
+bug3.c:13:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 3 code errors found
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+hexconstants.c: (in function f)
+hexconstants.c:5:10: Return value type unsigned int does not match declared
+                        type int: m1 + m2
+
+Finished LCLint checking --- 1 code error found, as expected
+Command Line: Setting mode checks after setting mode flags will override set
+                 values of flags: exportlocal
+
+hexconstants.c: (in function f)
+hexconstants.c:2:21: Variable m1 initialized to type int, expects unsigned int:
+                        0xFF
+hexconstants.c:3:21: Variable m2 initialized to type int, expects unsigned int:
+                        0142
+hexconstants.c:5:10: Return value type unsigned int does not match declared
+                        type int: m1 + m2
+hexconstants.c:1:5: Function f exported but not declared in header file
+   hexconstants.c:6:1: Definition of f
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+innercomment.c:1:17: Start comment inside comment
+innercomment.c:16:3: Start comment inside comment
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+offsetof.c: (in function f)
+offsetof.c:10:3: Assignment of size_t to int: m = offsetof(S,u)
+offsetof.c:12:26: Deep field k in offsetof is not the name of a field of struct
+                     { int m; }: offsetof(S,u.s.k)
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+error.c:5:9: Variable x initialized to type char, expects int: 'a'
+
+Finished LCLint checking --- 1 code error found, as expected
+
+ulrich.c: (in function utl_calloc)
+ulrich.c:14:13: Possibly null storage newblock returned as non-null: newblock
+   ulrich.c:12:16: Storage newblock may become null
+
+Finished LCLint checking --- 1 code error found
+
+cpptest.c: (in function test)
+cpptest.c:2:11: Variable x initialized to type char, expects int: 'a'
+
+Finished LCLint checking --- 1 code error found
+
+longlong.c: (in function llf)
+longlong.c:2:11: Variable m initialized to type long long, expects int: llx
+longlong.c:3:3: Assignment of long long to int: m = 243LL
+longlong.c:6:3: Assignment of long long to long int: lx = 5234LL
+longlong.c:9:3: Assignment of long long to long int: lx = llx
+
+Finished LCLint checking --- 4 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+Finished LCLint checking --- no code errors found
+
+alignof.c: (in function f)
+alignof.c:2:23: Variable m initialized to type size_t, expects int: alignof(x)
+alignof.c:3:23: Variable n initialized to type size_t, expects int:
+                   alignof((x))
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+Spec file not found: DBL_MANT_DIG=25.lcl
+Command Line: Malformed option `-D'
+Cannot open file: DBL_MANT_DIG=25.c
+Cannot open file: source.c
+
+Finished LCLint checking --- no code processed
diff --git a/test/tests2.4/alignof.c b/test/tests2.4/alignof.c
new file mode 100644
index 0000000..6416ac6
--- /dev/null
+++ b/test/tests2.4/alignof.c
@@ -0,0 +1,6 @@
+int f (float x) {
+  int m = __alignof__ x;
+  int n = __alignof__ (x);
+
+  return n + m;
+}
diff --git a/test/tests2.4/bitfields.c b/test/tests2.4/bitfields.c
new file mode 100644
index 0000000..c86fea8
--- /dev/null
+++ b/test/tests2.4/bitfields.c
@@ -0,0 +1,4 @@
+typedef unsigned S;
+typedef struct {
+  unsigned u: ((S) 4);
+} T;
diff --git a/test/tests2.4/bug1.c b/test/tests2.4/bug1.c
new file mode 100644
index 0000000..2bd13fb
--- /dev/null
+++ b/test/tests2.4/bug1.c
@@ -0,0 +1,16 @@
+int main( void )
+{
+  int a=5,c=1;
+  
+  switch(a)
+    {
+    case 1:
+      while (c>3)
+	{
+	case 3:
+	  ++c;
+	}
+    }     
+  
+  return 7;
+}
diff --git a/test/tests2.4/bug2.c b/test/tests2.4/bug2.c
new file mode 100644
index 0000000..fd0d3ca
--- /dev/null
+++ b/test/tests2.4/bug2.c
@@ -0,0 +1,20 @@
+int main () {
+  int i = 1;
+
+  switch (i) {
+    printf ("here 1"); /* should complain about this! */
+  case 1:
+    printf ("here 2");
+    while (i < 2) {
+      printf ("here 3");
+    case 2:      
+      printf ("here 4");
+      i++;
+      printf ("here 5");
+    }
+    printf ("here 6");
+  case 3:
+    printf ("here 7");
+    i++;
+  }
+}
diff --git a/test/tests2.4/bug3.c b/test/tests2.4/bug3.c
new file mode 100644
index 0000000..996f077
--- /dev/null
+++ b/test/tests2.4/bug3.c
@@ -0,0 +1,14 @@
+int main () {
+  int i = 1;
+  int j;
+
+  switch (i) {
+  case 1:
+    j = 2;
+  case 2:
+
+  }
+
+  printf ("j = %d", j);
+}
+  
diff --git a/test/tests2.4/cpptest.c b/test/tests2.4/cpptest.c
new file mode 100644
index 0000000..18beb50
--- /dev/null
+++ b/test/tests2.4/cpptest.c
@@ -0,0 +1,6 @@
+int test (void) {
+  int x = __P('a');
+
+  return x;
+}
+  
diff --git a/test/tests2.4/driverstub.c b/test/tests2.4/driverstub.c
new file mode 100644
index 0000000..b00b235
--- /dev/null
+++ b/test/tests2.4/driverstub.c
@@ -0,0 +1,8175 @@
+
+
+# 1 "driverstub.c"
+# 1 "/usr/include/sys/types.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+# 1 "/usr/include/features.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+ 
+
+
+
+
+
+
+
+ 
+# 138 "/usr/include/features.h" 3
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 196 "/usr/include/features.h" 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+# 1 "/usr/include/sys/cdefs.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+# 71 "/usr/include/sys/cdefs.h" 3
+
+
+ 
+
+
+
+
+
+
+
+ 
+
+
+
+# 103 "/usr/include/sys/cdefs.h" 3
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+# 250 "/usr/include/features.h" 2 3
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+ 
+
+
+
+
+
+
+
+
+# 1 "/usr/include/gnu/stubs.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 278 "/usr/include/features.h" 2 3
+
+
+
+
+# 26 "/usr/include/sys/types.h" 2 3
+
+
+ 
+
+# 1 "/usr/include/bits/types.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 1 3
+
+
+
+
+
+
+ 
+
+
+# 19 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+ 
+
+
+ 
+
+
+
+
+
+ 
+
+
+# 61 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+ 
+
+# 131 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef unsigned int size_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+# 271 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+# 283 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+# 317 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 29 "/usr/include/bits/types.h" 2 3
+
+
+ 
+typedef unsigned char __u_char;
+typedef unsigned short __u_short;
+typedef unsigned int __u_int;
+typedef unsigned long __u_long;
+
+__extension__ typedef unsigned long long int __u_quad_t;
+__extension__ typedef long long int __quad_t;
+# 48 "/usr/include/bits/types.h" 3
+
+typedef signed char __int8_t;
+typedef unsigned char __uint8_t;
+typedef signed short int __int16_t;
+typedef unsigned short int __uint16_t;
+typedef signed int __int32_t;
+typedef unsigned int __uint32_t;
+
+__extension__ typedef signed long long int __int64_t;
+__extension__ typedef unsigned long long int __uint64_t;
+
+typedef __quad_t *__qaddr_t;
+
+typedef __u_quad_t __dev_t;		 
+typedef __u_int __uid_t;		 
+typedef __u_int __gid_t;		 
+typedef __u_long __ino_t;		 
+typedef __u_int __mode_t;		 
+typedef __u_int __nlink_t; 		 
+typedef long int __off_t;		 
+typedef __quad_t __loff_t;		 
+typedef int __pid_t;			 
+typedef int __ssize_t;			 
+typedef long int __rlim_t;		 
+typedef __quad_t __rlim64_t;		 
+typedef __u_int __id_t;			 
+
+typedef struct
+  {
+    int __val[2];
+  } __fsid_t;				 
+
+ 
+typedef int __daddr_t;			 
+typedef char *__caddr_t;
+typedef long int __time_t;
+typedef long int __swblk_t;		 
+
+typedef long int __clock_t;
+
+ 
+typedef unsigned long int __fd_mask;
+
+ 
+
+
+ 
+
+
+
+
+ 
+typedef struct
+  {
+     
+
+
+
+
+
+    __fd_mask __fds_bits[1024  / (8 * sizeof (__fd_mask)) ];
+
+
+  } __fd_set;
+
+
+typedef int __key_t;
+
+ 
+typedef unsigned short int __ipc_pid_t;
+
+
+ 
+
+ 
+typedef long int __blkcnt_t;
+typedef __quad_t __blkcnt64_t;
+
+ 
+typedef __u_long __fsblkcnt_t;
+typedef __u_quad_t __fsblkcnt64_t;
+
+ 
+typedef __u_long __fsfilcnt_t;
+typedef __u_quad_t __fsfilcnt64_t;
+
+ 
+typedef __u_long __ino64_t;
+
+ 
+typedef __loff_t __off64_t;
+
+ 
+typedef long int __t_scalar_t;
+typedef unsigned long int __t_uscalar_t;
+
+ 
+typedef int __intptr_t;
+
+
+ 
+
+
+
+
+
+# 30 "/usr/include/sys/types.h" 2 3
+
+
+
+typedef __u_char u_char;
+typedef __u_short u_short;
+typedef __u_int u_int;
+typedef __u_long u_long;
+typedef __quad_t quad_t;
+typedef __u_quad_t u_quad_t;
+typedef __fsid_t fsid_t;
+
+
+typedef __loff_t loff_t;
+
+
+
+typedef __ino_t ino_t;
+
+
+
+
+
+
+
+
+
+
+
+typedef __dev_t dev_t;
+
+
+
+
+typedef __gid_t gid_t;
+
+
+
+
+typedef __mode_t mode_t;
+
+
+
+
+typedef __nlink_t nlink_t;
+
+
+
+
+typedef __uid_t uid_t;
+
+
+
+
+
+typedef __off_t off_t;
+
+
+
+
+
+
+
+
+
+
+
+typedef __pid_t pid_t;
+
+
+
+
+typedef __id_t id_t;
+
+
+
+typedef __ssize_t ssize_t;
+
+
+
+
+typedef __daddr_t daddr_t;
+typedef __caddr_t caddr_t;
+
+
+
+typedef __key_t key_t;
+
+
+
+
+
+
+# 1 "/usr/include/time.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 51 "/usr/include/time.h" 3
+
+
+
+# 62 "/usr/include/time.h" 3
+
+
+
+
+
+
+
+
+ 
+typedef __time_t time_t;
+
+
+
+
+
+# 89 "/usr/include/time.h" 3
+
+
+
+
+# 279 "/usr/include/time.h" 3
+
+
+
+# 122 "/usr/include/sys/types.h" 2 3
+
+
+
+# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 1 3
+
+
+
+
+
+
+ 
+
+
+# 19 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+ 
+
+
+ 
+
+
+
+
+
+ 
+
+
+# 61 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+ 
+
+# 131 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+
+# 188 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+# 271 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+# 283 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+# 317 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 125 "/usr/include/sys/types.h" 2 3
+
+
+
+ 
+typedef unsigned long int ulong;
+typedef unsigned short int ushort;
+typedef unsigned int uint;
+
+
+ 
+
+# 159 "/usr/include/sys/types.h" 3
+
+
+ 
+
+
+
+
+
+
+
+typedef int int8_t __attribute__ ((__mode__ (  __QI__ ))) ;
+typedef int int16_t __attribute__ ((__mode__ (  __HI__ ))) ;
+typedef int int32_t __attribute__ ((__mode__ (  __SI__ ))) ;
+typedef int int64_t __attribute__ ((__mode__ (  __DI__ ))) ;
+
+
+typedef unsigned int u_int8_t __attribute__ ((__mode__ (  __QI__ ))) ;
+typedef unsigned int u_int16_t __attribute__ ((__mode__ (  __HI__ ))) ;
+typedef unsigned int u_int32_t __attribute__ ((__mode__ (  __SI__ ))) ;
+typedef unsigned int u_int64_t __attribute__ ((__mode__ (  __DI__ ))) ;
+
+typedef int register_t __attribute__ ((__mode__ (__word__)));
+
+
+ 
+
+
+
+
+
+
+ 
+# 1 "/usr/include/endian.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+# 1 "/usr/include/bits/endian.h" 1 3
+ 
+
+
+
+
+
+
+# 35 "/usr/include/endian.h" 2 3
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 191 "/usr/include/sys/types.h" 2 3
+
+
+ 
+# 1 "/usr/include/sys/select.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+ 
+
+
+ 
+# 1 "/usr/include/bits/select.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 36 "/usr/include/bits/select.h" 3
+
+
+
+
+
+
+
+
+
+
+
+
+# 56 "/usr/include/bits/select.h" 3
+
+# 72 "/usr/include/bits/select.h" 3
+
+# 31 "/usr/include/sys/select.h" 2 3
+
+
+ 
+# 1 "/usr/include/bits/sigset.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef int __sig_atomic_t;
+
+ 
+
+
+typedef struct
+  {
+    unsigned long int __val[(1024 / (8 * sizeof (unsigned long int))) ];
+  } __sigset_t;
+
+
+
+
+ 
+
+
+
+
+
+# 125 "/usr/include/bits/sigset.h" 3
+
+# 34 "/usr/include/sys/select.h" 2 3
+
+
+ 
+
+# 1 "/usr/include/time.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 51 "/usr/include/time.h" 3
+
+
+
+# 62 "/usr/include/time.h" 3
+
+
+
+# 73 "/usr/include/time.h" 3
+
+
+
+
+
+
+
+
+ 
+
+struct timespec
+  {
+    long int tv_sec;		 
+    long int tv_nsec;		 
+  };
+
+
+
+
+
+# 279 "/usr/include/time.h" 3
+
+
+
+# 38 "/usr/include/sys/select.h" 2 3
+
+
+ 
+
+ 
+
+
+
+struct timeval;
+
+typedef __fd_mask fd_mask;
+
+ 
+typedef __fd_set fd_set;
+
+ 
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+
+ 
+
+
+
+
+extern int __select  (int __nfds, __fd_set *__readfds,
+			  __fd_set *__writefds, __fd_set *__exceptfds,
+			  struct timeval *__timeout)    ;
+extern int select  (int __nfds, __fd_set *__readfds,
+			__fd_set *__writefds, __fd_set *__exceptfds,
+			struct timeval *__timeout)    ;
+
+# 91 "/usr/include/sys/select.h" 3
+
+
+ 
+
+
+# 194 "/usr/include/sys/types.h" 2 3
+
+
+ 
+# 1 "/usr/include/sys/sysmacros.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+# 47 "/usr/include/sys/sysmacros.h" 3
+
+
+
+# 197 "/usr/include/sys/types.h" 2 3
+
+
+
+
+ 
+
+typedef __blkcnt_t blkcnt_t;	  
+typedef __fsblkcnt_t fsblkcnt_t;  
+typedef __fsfilcnt_t fsfilcnt_t;  
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+# 1 "driverstub.c" 2
+
+# 1 "/usr/include/sys/ioctl.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+ 
+# 1 "/usr/include/bits/ioctls.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+# 1 "/usr/include/asm/ioctls.h" 1 3
+
+
+
+# 1 "/usr/include/asm/ioctl.h" 1 3
+ 
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+# 4 "/usr/include/asm/ioctls.h" 2 3
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+# 24 "/usr/include/bits/ioctls.h" 2 3
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+		     
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+ 
+
+ 
+
+
+
+
+
+
+ 
+
+
+
+
+# 27 "/usr/include/sys/ioctl.h" 2 3
+
+
+ 
+# 1 "/usr/include/bits/ioctl-types.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+struct winsize
+  {
+    unsigned short int ws_row;
+    unsigned short int ws_col;
+    unsigned short int ws_xpixel;
+    unsigned short int ws_ypixel;
+  };
+
+
+struct termio
+  {
+    unsigned short int c_iflag;		 
+    unsigned short int c_oflag;		 
+    unsigned short int c_cflag;		 
+    unsigned short int c_lflag;		 
+    unsigned char c_line;		 
+    unsigned char c_cc[8 ];		 
+};
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 30 "/usr/include/sys/ioctl.h" 2 3
+
+
+ 
+
+
+
+
+# 1 "/usr/include/sys/ttydefaults.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+# 37 "/usr/include/sys/ioctl.h" 2 3
+
+
+ 
+
+
+extern int ioctl  (int __fd, unsigned long int __request, ...)    ;
+
+ 
+
+
+# 2 "driverstub.c" 2
+
+# 1 "/usr/include/stdlib.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 1 3
+
+
+
+
+
+
+ 
+
+
+# 19 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+ 
+
+
+ 
+
+
+
+
+
+ 
+
+
+# 61 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+ 
+
+# 131 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+
+# 188 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef long int wchar_t;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 283 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+# 317 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 33 "/usr/include/stdlib.h" 2 3
+
+
+ 
+
+
+
+
+ 
+typedef struct
+  {
+    int quot;			 
+    int rem;			 
+  } div_t;
+
+ 
+
+typedef struct
+  {
+    long int quot;		 
+    long int rem;		 
+  } ldiv_t;
+
+
+
+# 65 "/usr/include/stdlib.h" 3
+
+
+
+ 
+
+
+
+ 
+
+
+
+
+
+ 
+
+extern size_t __ctype_get_mb_cur_max  (void)    ;
+
+
+ 
+extern double atof  (__const char *__nptr)    ;
+ 
+extern int atoi  (__const char *__nptr)    ;
+ 
+extern long int atol  (__const char *__nptr)    ;
+
+
+ 
+__extension__ extern long long int atoll  (__const char *__nptr)    ;
+
+
+ 
+extern double strtod  (__const char *   __nptr,
+			   char **   __endptr)    ;
+
+
+
+
+
+
+
+
+
+
+ 
+extern long int strtol  (__const char *   __nptr,
+			     char **   __endptr, int __base)    ;
+ 
+extern unsigned long int strtoul  (__const char *   __nptr,
+				       char **   __endptr,
+				       int __base)    ;
+
+
+ 
+__extension__
+extern long long int strtoq  (__const char *   __nptr,
+				  char **   __endptr, int __base)    ;
+ 
+__extension__
+extern unsigned long long int strtouq  (__const char *   __nptr,
+					    char **   __endptr,
+					    int __base)    ;
+
+
+
+ 
+
+ 
+__extension__
+extern long long int strtoll  (__const char *   __nptr,
+				   char **   __endptr, int __base)    ;
+ 
+__extension__
+extern unsigned long long int strtoull  (__const char *   __nptr,
+					     char **   __endptr,
+					     int __base)    ;
+
+
+
+# 190 "/usr/include/stdlib.h" 3
+
+
+
+ 
+
+
+extern double __strtod_internal  (__const char *   __nptr,
+				      char **   __endptr,
+				      int __group)    ;
+extern float __strtof_internal  (__const char *   __nptr,
+				     char **   __endptr, int __group)    ;
+extern long double  __strtold_internal  (__const char *
+						  __nptr,
+						char **   __endptr,
+						int __group)    ;
+
+extern long int __strtol_internal  (__const char *   __nptr,
+					char **   __endptr,
+					int __base, int __group)    ;
+
+
+
+extern unsigned long int __strtoul_internal  (__const char *
+						    __nptr,
+						  char **   __endptr,
+						  int __base, int __group)    ;
+
+
+
+
+__extension__
+extern long long int __strtoll_internal  (__const char *   __nptr,
+					      char **   __endptr,
+					      int __base, int __group)    ;
+
+
+
+__extension__
+extern unsigned long long int __strtoull_internal  (__const char *
+							  __nptr,
+							char **
+							  __endptr,
+							int __base,
+							int __group)    ;
+
+
+
+
+# 326 "/usr/include/stdlib.h" 3
+
+
+
+
+ 
+
+
+extern char *l64a  (long int __n)    ;
+
+ 
+extern long int a64l  (__const char *__s)    ;
+
+
+
+
+ 
+
+
+
+ 
+extern int32_t random  (void)    ;
+
+ 
+extern void srandom  (unsigned int __seed)    ;
+
+ 
+
+
+
+extern void *  initstate  (unsigned int __seed, void *  __statebuf,
+			       size_t __statelen)    ;
+
+ 
+
+extern void *  setstate  (void *  __statebuf)    ;
+
+
+
+ 
+
+
+
+struct random_data
+  {
+    int32_t *fptr;		 
+    int32_t *rptr;		 
+    int32_t *state;		 
+    int rand_type;		 
+    int rand_deg;		 
+    int rand_sep;		 
+    int32_t *end_ptr;		 
+  };
+
+extern int random_r  (struct random_data *   __buf,
+			  int32_t *   __result)    ;
+
+extern int srandom_r  (unsigned int __seed, struct random_data *__buf)    ;
+
+extern int initstate_r  (unsigned int __seed,
+			     void *    __statebuf,
+			     size_t __statelen,
+			     struct random_data *   __buf)    ;
+
+extern int setstate_r  (void *    __statebuf,
+			    struct random_data *   __buf)    ;
+
+
+
+
+ 
+extern int rand  (void)    ;
+ 
+extern void srand  (unsigned int __seed)    ;
+
+
+ 
+extern int rand_r  (unsigned int *__seed)    ;
+
+
+
+
+ 
+
+ 
+extern double drand48  (void)    ;
+extern double erand48  (unsigned short int __xsubi[3])    ;
+
+ 
+extern long int lrand48  (void)    ;
+extern long int nrand48  (unsigned short int __xsubi[3])    ;
+
+ 
+extern long int mrand48  (void)    ;
+extern long int jrand48  (unsigned short int __xsubi[3])    ;
+
+ 
+extern void srand48  (long int __seedval)    ;
+extern unsigned short int *seed48  (unsigned short int __seed16v[3])    ;
+extern void lcong48  (unsigned short int __param[7])    ;
+
+ 
+struct drand48_data
+  {
+    unsigned short int x[3];	 
+    unsigned short int a[3];	 
+    unsigned short int c;	 
+    unsigned short int old_x[3];  
+    int init;			 
+  };
+
+
+ 
+extern int drand48_r  (struct drand48_data *   __buffer,
+			   double *   __result)    ;
+extern int erand48_r  (unsigned short int __xsubi[3],
+			   struct drand48_data *   __buffer,
+			   double *   __result)    ;
+
+ 
+extern int lrand48_r  (struct drand48_data *   __buffer,
+			   long int *   __result)    ;
+extern int nrand48_r  (unsigned short int __xsubi[3],
+			   struct drand48_data *   __buffer,
+			   long int *   __result)    ;
+
+ 
+extern int mrand48_r  (struct drand48_data *   __buffer,
+			   long int *   __result)    ;
+extern int jrand48_r  (unsigned short int __xsubi[3],
+			   struct drand48_data *   __buffer,
+			   long int *   __result)    ;
+
+ 
+extern int srand48_r  (long int __seedval, struct drand48_data *__buffer)    ;
+
+extern int seed48_r  (unsigned short int __seed16v[3],
+			  struct drand48_data *__buffer)    ;
+
+extern int lcong48_r  (unsigned short int __param[7],
+			   struct drand48_data *__buffer)    ;
+
+
+
+
+
+
+
+ 
+extern void *  malloc  (size_t __size)    ;
+ 
+extern void *  calloc  (size_t __nmemb, size_t __size)    ;
+
+
+
+ 
+
+extern void *  realloc  (void *  __ptr, size_t __size)    ;
+ 
+extern void free  (void *  __ptr)    ;
+
+
+ 
+extern void cfree  (void *  __ptr)    ;
+
+
+
+# 1 "/usr/include/alloca.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 1 3
+
+
+
+
+
+
+ 
+
+
+# 19 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+ 
+
+
+ 
+
+
+
+
+
+ 
+
+
+# 61 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+ 
+
+# 131 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+
+# 188 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+# 271 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+# 283 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+# 317 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 25 "/usr/include/alloca.h" 2 3
+
+
+ 
+
+ 
+
+
+ 
+extern void *  alloca  (size_t __size)    ;
+
+
+
+
+
+ 
+
+
+# 492 "/usr/include/stdlib.h" 2 3
+
+
+
+
+ 
+extern void *  valloc  (size_t __size)    ;
+
+
+
+ 
+extern void abort  (void)     __attribute__ ((__noreturn__));
+
+
+ 
+extern int atexit  (void (*__func) (void))    ;
+
+
+ 
+
+extern int __on_exit  (void (*__func) (int __status, void *  __arg),
+			   void *  __arg)    ;
+extern int on_exit  (void (*__func) (int __status, void *  __arg),
+			 void *  __arg)    ;
+
+
+ 
+
+
+extern void exit  (int __status)     __attribute__ ((__noreturn__));
+
+
+
+
+
+
+
+
+ 
+extern char *getenv  (__const char *__name)    ;
+
+ 
+
+extern char *__secure_getenv  (__const char *__name)    ;
+
+
+ 
+ 
+
+extern int putenv  (char *__string)    ;
+
+
+
+ 
+
+extern int setenv  (__const char *__name, __const char *__value,
+			int __replace)    ;
+
+ 
+extern void unsetenv  (__const char *__name)    ;
+
+
+
+ 
+
+
+extern int clearenv  (void)    ;
+
+
+
+
+ 
+
+
+
+extern char *mktemp  (char *__template)    ;
+
+ 
+
+
+
+
+extern int mkstemp  (char *__template)    ;
+
+
+
+ 
+extern int system  (__const char *__command)    ;
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+extern char *realpath  (__const char *   __name,
+			    char *   __resolved)    ;
+
+
+
+ 
+
+
+typedef int (*__compar_fn_t)  (__const void * , __const void * )  ;
+
+
+
+
+
+
+ 
+
+extern void *  bsearch  (__const void *  __key, __const void *  __base,
+			       size_t __nmemb, size_t __size,
+			       __compar_fn_t __compar)  ;
+
+ 
+
+extern void qsort  (void *  __base, size_t __nmemb, size_t __size,
+			  __compar_fn_t __compar)  ;
+
+
+ 
+extern int abs  (int __x)     __attribute__ ((__const__));
+extern long int labs  (long int __x)     __attribute__ ((__const__));
+
+
+
+
+
+
+ 
+
+ 
+extern div_t div  (int __numer, int __denom)     __attribute__ ((__const__));
+extern ldiv_t ldiv  (long int __numer, long int __denom)    
+     __attribute__ ((__const__));
+
+
+
+
+
+
+
+
+ 
+
+
+ 
+
+
+extern char *ecvt  (double __value, int __ndigit, int *   __decpt,
+			int *   __sign)    ;
+
+ 
+
+
+extern char *fcvt  (double __value, int __ndigit, int *   __decpt,
+			int *   __sign)    ;
+
+ 
+
+
+extern char *gcvt  (double __value, int __ndigit, char *__buf)    ;
+
+ 
+extern char *qecvt  (long double  __value, int __ndigit,
+			 int *   __decpt, int *   __sign)    ;
+extern char *qfcvt  (long double  __value, int __ndigit,
+			 int *   __decpt, int *   __sign)    ;
+extern char *qgcvt  (long double  __value, int __ndigit, char *__buf)    ;
+
+
+
+ 
+
+extern int ecvt_r  (double __value, int __ndigit, int *   __decpt,
+			int *   __sign, char *   __buf,
+			size_t __len)    ;
+extern int fcvt_r  (double __value, int __ndigit, int *   __decpt,
+			int *   __sign, char *   __buf,
+			size_t __len)    ;
+
+extern int qecvt_r  (long double  __value, int __ndigit,
+			 int *   __decpt, int *   __sign,
+			 char *   __buf, size_t __len)    ;
+extern int qfcvt_r  (long double  __value, int __ndigit,
+			 int *   __decpt, int *   __sign,
+			 char *   __buf, size_t __len)    ;
+
+
+
+
+ 
+
+extern int mblen  (__const char *__s, size_t __n)    ;
+ 
+
+extern int mbtowc  (wchar_t *   __pwc,
+			__const char *   __s, size_t __n)    ;
+ 
+
+extern int wctomb  (char *__s, wchar_t __wchar)    ;
+
+
+ 
+extern size_t mbstowcs  (wchar_t *    __pwcs,
+			     __const char *   __s, size_t __n)    ;
+ 
+extern size_t wcstombs  (char *   __s,
+			     __const wchar_t *   __pwcs, size_t __n)    ;
+
+
+
+ 
+
+
+
+extern int rpmatch  (__const char *__response)    ;
+
+
+
+# 732 "/usr/include/stdlib.h" 3
+
+
+
+# 756 "/usr/include/stdlib.h" 3
+
+
+# 766 "/usr/include/stdlib.h" 3
+
+
+
+
+
+ 
+
+
+# 3 "driverstub.c" 2
+
+# 1 "/usr/include/string.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+ 
+
+
+# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 1 3
+
+
+
+
+
+
+ 
+
+
+# 19 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+ 
+
+
+ 
+
+
+
+
+
+ 
+
+
+# 61 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+ 
+
+# 131 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+
+# 188 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+# 271 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+# 283 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+# 317 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 33 "/usr/include/string.h" 2 3
+
+
+
+ 
+extern void *  memcpy  (void *    __dest,
+			    __const void *    __src, size_t __n)    ;
+ 
+
+extern void *  memmove  (void *  __dest, __const void *  __src,
+			     size_t __n)    ;
+
+ 
+
+
+
+extern void *  memccpy  (void *  __dest, __const void *  __src,
+			     int __c, size_t __n)    ;
+
+
+
+ 
+extern void *  memset  (void *  __s, int __c, size_t __n)    ;
+
+ 
+extern int memcmp  (__const void *  __s1, __const void *  __s2,
+			size_t __n)    ;
+
+ 
+extern void *  memchr  (__const void *  __s, int __c, size_t __n)    ;
+
+
+
+
+
+
+
+
+ 
+extern char *strcpy  (char *   __dest,
+			  __const char *   __src)    ;
+ 
+extern char *strncpy  (char *   __dest,
+			   __const char *   __src, size_t __n)    ;
+
+ 
+extern char *strcat  (char *   __dest,
+			  __const char *   __src)    ;
+ 
+extern char *strncat  (char *   __dest,
+			   __const char *   __src, size_t __n)    ;
+
+ 
+extern int strcmp  (__const char *__s1, __const char *__s2)    ;
+ 
+extern int strncmp  (__const char *__s1, __const char *__s2, size_t __n)    ;
+
+ 
+extern int strcoll  (__const char *__s1, __const char *__s2)    ;
+ 
+extern size_t strxfrm  (char *   __dest,
+			    __const char *   __src, size_t __n)    ;
+
+# 107 "/usr/include/string.h" 3
+
+
+
+ 
+extern char *__strdup  (__const char *__s)    ;
+extern char *strdup  (__const char *__s)    ;
+
+
+ 
+
+
+
+
+
+
+# 143 "/usr/include/string.h" 3
+
+
+ 
+extern char *strchr  (__const char *__s, int __c)    ;
+ 
+extern char *strrchr  (__const char *__s, int __c)    ;
+
+
+
+
+
+
+
+ 
+
+extern size_t strcspn  (__const char *__s, __const char *__reject)    ;
+ 
+
+extern size_t strspn  (__const char *__s, __const char *__accept)    ;
+ 
+extern char *strpbrk  (__const char *__s, __const char *__accept)    ;
+ 
+extern char *strstr  (__const char *__haystack, __const char *__needle)    ;
+
+
+
+
+
+
+
+
+
+ 
+extern char *strtok  (char *   __s,
+			  __const char *   __delim)    ;
+
+ 
+
+extern char *__strtok_r  (char *   __s,
+			      __const char *   __delim,
+			      char **   __save_ptr)    ;
+
+extern char *strtok_r  (char *   __s,
+			    __const char *   __delim,
+			    char **   __save_ptr)    ;
+
+
+# 203 "/usr/include/string.h" 3
+
+
+
+ 
+extern size_t strlen  (__const char *__s)    ;
+
+
+
+
+
+
+
+
+ 
+extern char *strerror  (int __errnum)    ;
+
+ 
+
+extern char *__strerror_r  (int __errnum, char *__buf, size_t __buflen)    ;
+extern char *strerror_r  (int __errnum, char *__buf, size_t __buflen)    ;
+
+
+ 
+
+extern void __bzero  (void *  __s, size_t __n)    ;
+
+
+ 
+extern void bcopy  (__const void *  __src, void *  __dest, size_t __n)    ;
+
+ 
+extern void bzero  (void *  __s, size_t __n)    ;
+
+ 
+extern int bcmp  (__const void *  __s1, __const void *  __s2, size_t __n)    ;
+
+ 
+extern char *index  (__const char *__s, int __c)    ;
+
+ 
+extern char *rindex  (__const char *__s, int __c)    ;
+
+ 
+
+extern int __ffs  (int __i)     __attribute__ ((const));
+extern int ffs  (int __i)     __attribute__ ((const));
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+extern int __strcasecmp  (__const char *__s1, __const char *__s2)    ;
+extern int strcasecmp  (__const char *__s1, __const char *__s2)    ;
+
+ 
+extern int strncasecmp  (__const char *__s1, __const char *__s2,
+			     size_t __n)    ;
+
+
+# 277 "/usr/include/string.h" 3
+
+
+
+ 
+
+extern char *strsep  (char **   __stringp,
+			  __const char *   __delim)    ;
+
+
+# 319 "/usr/include/string.h" 3
+
+
+
+
+# 347 "/usr/include/string.h" 3
+
+
+
+ 
+
+
+# 4 "driverstub.c" 2
+
+# 1 "/usr/include/fcntl.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+ 
+
+ 
+
+# 1 "/usr/include/bits/fcntl.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+
+
+struct flock
+  {
+    short int l_type;	 
+    short int l_whence;	 
+
+    __off_t l_start;	 
+    __off_t l_len;	 
+
+
+
+
+    __pid_t l_pid;	 
+  };
+
+# 131 "/usr/include/bits/fcntl.h" 3
+
+
+ 
+
+
+
+
+
+
+
+
+# 33 "/usr/include/fcntl.h" 2 3
+
+
+ 
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+ 
+
+extern int __fcntl  (int __fd, int __cmd, ...)    ;
+extern int fcntl  (int __fd, int __cmd, ...)    ;
+
+ 
+
+
+extern int __open  (__const char *__file, int __oflag, ...)    ;
+
+extern int open  (__const char *__file, int __oflag, ...)    ;
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+extern int creat  (__const char *__file, __mode_t __mode)    ;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+extern int lockf  (int __fd, int __cmd, __off_t __len)    ;
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+# 5 "driverstub.c" 2
+
+# 1 "/usr/include/assert.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+# 32 "/usr/include/assert.h" 3
+
+
+
+
+
+ 
+
+
+
+
+# 56 "/usr/include/assert.h" 3
+
+
+ 
+
+ 
+extern void __assert_fail  (__const char *__assertion,
+				__const char *__file,
+				unsigned int __line,
+				__const char *__function)    
+     __attribute__ ((__noreturn__));
+
+ 
+extern void __assert_perror_fail  (int __errnum,
+				       __const char *__file,
+				       unsigned int __line,
+				       __const char *__function)    
+     __attribute__ ((__noreturn__));
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 6 "driverstub.c" 2
+
+# 1 "/usr/include/ctype.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+enum
+{
+  _ISupper = (( 0 ) < 8 ? ((1 << ( 0 )) << 8) : ((1 << ( 0 )) >> 8)) ,	 
+  _ISlower = (( 1 ) < 8 ? ((1 << ( 1 )) << 8) : ((1 << ( 1 )) >> 8)) ,	 
+  _ISalpha = (( 2 ) < 8 ? ((1 << ( 2 )) << 8) : ((1 << ( 2 )) >> 8)) ,	 
+  _ISdigit = (( 3 ) < 8 ? ((1 << ( 3 )) << 8) : ((1 << ( 3 )) >> 8)) ,	 
+  _ISxdigit = (( 4 ) < 8 ? ((1 << ( 4 )) << 8) : ((1 << ( 4 )) >> 8)) ,	 
+  _ISspace = (( 5 ) < 8 ? ((1 << ( 5 )) << 8) : ((1 << ( 5 )) >> 8)) ,	 
+  _ISprint = (( 6 ) < 8 ? ((1 << ( 6 )) << 8) : ((1 << ( 6 )) >> 8)) ,	 
+  _ISgraph = (( 7 ) < 8 ? ((1 << ( 7 )) << 8) : ((1 << ( 7 )) >> 8)) ,	 
+  _ISblank = (( 8 ) < 8 ? ((1 << ( 8 )) << 8) : ((1 << ( 8 )) >> 8)) ,	 
+  _IScntrl = (( 9 ) < 8 ? ((1 << ( 9 )) << 8) : ((1 << ( 9 )) >> 8)) ,	 
+  _ISpunct = (( 10 ) < 8 ? ((1 << ( 10 )) << 8) : ((1 << ( 10 )) >> 8)) ,	 
+  _ISalnum = (( 11 ) < 8 ? ((1 << ( 11 )) << 8) : ((1 << ( 11 )) >> 8)) 	 
+};
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+extern __const unsigned short int *__ctype_b;	 
+extern __const __int32_t *__ctype_tolower;  
+extern __const __int32_t *__ctype_toupper;  
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+extern int  isalnum   (int)     ;
+extern int  isalpha   (int)     ;
+extern int  iscntrl   (int)     ;
+extern int  isdigit   (int)     ;
+extern int  islower   (int)     ;
+extern int  isgraph   (int)     ;
+extern int  isprint   (int)     ;
+extern int  ispunct   (int)     ;
+extern int  isspace   (int)     ;
+extern int  isupper   (int)     ;
+extern int  isxdigit   (int)     ;
+
+
+
+
+
+
+ 
+extern int tolower  (int __c)    ;
+
+ 
+extern int toupper  (int __c)    ;
+
+
+
+
+ 
+
+extern int isascii  (int __c)    ;
+
+ 
+
+extern int toascii  (int __c)    ;
+
+
+
+
+ 
+
+extern int  _toupper   (int)     ;
+extern int  _tolower   (int)     ;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 164 "/usr/include/ctype.h" 3
+
+
+# 186 "/usr/include/ctype.h" 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 273 "/usr/include/ctype.h" 3
+
+
+ 
+
+
+# 7 "driverstub.c" 2
+
+# 1 "/usr/include/getopt.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+extern char *optarg;
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+extern int optind;
+
+ 
+
+
+extern int opterr;
+
+ 
+
+extern int optopt;
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+struct option
+{
+
+  const char *name;
+
+
+
+   
+
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+ 
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+extern int getopt (int __argc, char *const *__argv, const char *__shortopts);
+
+
+
+
+
+extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts,
+		        const struct option *__longopts, int *__longind);
+extern int getopt_long_only (int __argc, char *const *__argv,
+			     const char *__shortopts,
+		             const struct option *__longopts, int *__longind);
+
+ 
+extern int _getopt_internal (int __argc, char *const *__argv,
+			     const char *__shortopts,
+		             const struct option *__longopts, int *__longind,
+			     int __long_only);
+
+# 160 "/usr/include/getopt.h" 3
+
+
+
+
+
+
+ 
+
+
+
+# 8 "driverstub.c" 2
+
+# 1 "/usr/include/netinet/in.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/limits.h" 1 3
+ 
+
+
+ 
+
+
+
+
+
+ 
+# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/syslimits.h" 1 3
+ 
+
+
+
+
+
+# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/limits.h" 1 3
+ 
+
+
+ 
+
+# 114 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/limits.h" 3
+
+
+
+# 1 "/usr/include/limits.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+# 1 "/usr/include/bits/posix1_lim.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+
+ 
+# 1 "/usr/include/bits/local_lim.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+# 1 "/usr/include/linux/limits.h" 1 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 27 "/usr/include/bits/local_lim.h" 2 3
+
+
+ 
+
+
+
+
+
+ 
+
+ 
+
+
+ 
+
+ 
+
+
+ 
+
+ 
+
+
+ 
+
+
+
+ 
+
+# 126 "/usr/include/bits/posix1_lim.h" 2 3
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+# 30 "/usr/include/limits.h" 2 3
+
+
+
+
+# 1 "/usr/include/bits/posix2_lim.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+ 
+
+
+ 
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+# 34 "/usr/include/limits.h" 2 3
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+# 121 "/usr/include/limits.h" 3
+
+
+
+
+  
+
+
+
+
+
+
+
+
+# 117 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/limits.h" 2 3
+
+
+
+
+# 7 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/syslimits.h" 2 3
+
+
+# 11 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/limits.h" 2 3
+
+
+
+
+
+ 
+
+
+
+ 
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+ 
+
+
+
+
+ 
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+# 107 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/limits.h" 3
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+# 23 "/usr/include/netinet/in.h" 2 3
+
+# 1 "/usr/include/stdint.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 1 3
+
+
+
+
+
+
+ 
+
+
+# 19 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+ 
+
+
+ 
+
+
+
+
+
+ 
+
+
+# 61 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+ 
+
+# 131 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+# 190 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+ 
+
+
+
+
+ 
+
+
+# 269 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+# 283 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+# 317 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 28 "/usr/include/stdint.h" 2 3
+
+# 1 "/usr/include/bits/wordsize.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 29 "/usr/include/stdint.h" 2 3
+
+
+ 
+
+ 
+
+ 
+# 47 "/usr/include/stdint.h" 3
+
+
+ 
+typedef unsigned char		uint8_t;
+typedef unsigned short int	uint16_t;
+typedef unsigned int		uint32_t;
+
+
+
+__extension__
+typedef unsigned long long int	uint64_t;
+
+
+
+ 
+
+ 
+typedef signed char		int_least8_t;
+typedef short int		int_least16_t;
+typedef int			int_least32_t;
+
+
+
+__extension__
+typedef long long int		int_least64_t;
+
+
+ 
+typedef unsigned char		uint_least8_t;
+typedef unsigned short int	uint_least16_t;
+typedef unsigned int		uint_least32_t;
+
+
+
+__extension__
+typedef unsigned long long int	uint_least64_t;
+
+
+
+ 
+
+ 
+typedef signed char		int_fast8_t;
+
+
+
+
+
+typedef int			int_fast16_t;
+typedef int			int_fast32_t;
+__extension__
+typedef long long int		int_fast64_t;
+
+
+ 
+typedef unsigned char		uint_fast8_t;
+
+
+
+
+
+typedef unsigned int		uint_fast16_t;
+typedef unsigned int		uint_fast32_t;
+__extension__
+typedef unsigned long long int	uint_fast64_t;
+
+
+
+ 
+
+
+
+
+
+
+
+
+typedef int			intptr_t;
+
+
+typedef unsigned int		uintptr_t;
+
+
+
+ 
+
+
+
+
+__extension__
+typedef long long int		intmax_t;
+__extension__
+typedef unsigned long long int	uintmax_t;
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+ 
+
+
+ 
+
+
+
+ 
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+ 
+
+
+
+
+
+
+ 
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+
+ 
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+# 24 "/usr/include/netinet/in.h" 2 3
+
+
+
+# 1 "/usr/include/bits/socket.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 1 3
+
+
+
+
+
+
+ 
+
+
+# 19 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+ 
+
+
+ 
+
+
+
+
+
+ 
+
+
+# 61 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+ 
+
+# 131 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+
+# 188 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+# 271 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+# 283 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+ 
+
+ 
+
+# 317 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 29 "/usr/include/bits/socket.h" 2 3
+
+
+# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/limits.h" 1 3
+ 
+
+
+ 
+
+# 114 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/limits.h" 3
+
+
+
+
+
+
+
+# 31 "/usr/include/bits/socket.h" 2 3
+
+
+
+ 
+typedef unsigned int socklen_t;
+
+ 
+enum __socket_type
+{
+  SOCK_STREAM = 1,		 
+
+
+  SOCK_DGRAM = 2,		 
+
+
+  SOCK_RAW = 3,			 
+
+  SOCK_RDM = 4,			 
+
+  SOCK_SEQPACKET = 5,		 
+
+
+  SOCK_PACKET = 10		 
+
+
+
+};
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+ 
+# 1 "/usr/include/bits/sockaddr.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+ 
+typedef unsigned short int sa_family_t;
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+extern int __libc_sa_len  (sa_family_t __af)    ;
+
+
+# 133 "/usr/include/bits/socket.h" 2 3
+
+
+ 
+struct sockaddr
+  {
+    sa_family_t  sa_family ;	 
+    char sa_data[14];		 
+  };
+
+
+ 
+
+
+
+
+
+
+
+
+
+struct sockaddr_storage
+  {
+    sa_family_t  __ss_family ;	 
+    __uint32_t  __ss_align;	 
+    char __ss_padding[(128  - (2 * sizeof (__uint32_t ))) ];
+  };
+
+
+ 
+enum
+  {
+    MSG_OOB		= 0x01,	 
+
+    MSG_PEEK		= 0x02,	 
+
+    MSG_DONTROUTE	= 0x04,	 
+
+
+
+
+
+
+    MSG_CTRUNC		= 0x08,	 
+
+    MSG_PROXY		= 0x10,	 
+
+    MSG_TRUNC		= 0x20,
+
+    MSG_DONTWAIT	= 0x40,  
+
+    MSG_EOR		= 0x80,  
+
+    MSG_WAITALL		= 0x100,  
+
+    MSG_FIN		= 0x200,
+
+    MSG_SYN		= 0x400,
+
+    MSG_URG		= 0x800,
+
+    MSG_RST		= 0x1000,
+
+    MSG_ERRQUEUE	= 0x2000,  
+
+    MSG_NOSIGNAL	= 0x4000   
+
+  };
+
+
+ 
+
+struct msghdr
+  {
+    void *  msg_name;		 
+    socklen_t msg_namelen;	 
+
+    struct iovec *msg_iov;	 
+    size_t msg_iovlen;		 
+
+    void *  msg_control;	 
+    size_t msg_controllen;	 
+
+    int msg_flags;		 
+  };
+
+ 
+struct cmsghdr
+  {
+    size_t cmsg_len;		 
+
+    int cmsg_level;		 
+    int cmsg_type;		 
+
+    unsigned char __cmsg_data[0];  
+     
+
+  };
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern struct cmsghdr *__cmsg_nxthdr  (struct msghdr *__mhdr,
+					   struct cmsghdr *__cmsg)    ;
+# 270 "/usr/include/bits/socket.h" 3
+
+
+ 
+
+enum
+  {
+    SCM_RIGHTS = 0x01,		 
+
+
+    SCM_CREDENTIALS = 0x02,      
+
+
+    __SCM_CONNECT = 0x03	 
+  };
+
+ 
+
+struct ucred
+{
+  pid_t  pid;			 
+  uid_t  uid;			 
+  gid_t  gid;			 
+};
+
+ 
+# 1 "/usr/include/asm/socket.h" 1 3
+
+
+
+# 1 "/usr/include/asm/sockios.h" 1 3
+
+
+
+ 
+
+
+
+
+
+
+
+
+# 4 "/usr/include/asm/socket.h" 2 3
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+ 
+
+
+
+ 
+# 55 "/usr/include/asm/socket.h" 3
+
+
+
+# 295 "/usr/include/bits/socket.h" 2 3
+
+
+
+ 
+struct linger
+  {
+    int l_onoff;		 
+    int l_linger;		 
+  };
+
+
+# 27 "/usr/include/netinet/in.h" 2 3
+
+
+
+ 
+
+ 
+enum
+  {
+    IPPROTO_IP = 0,	    
+    IPPROTO_HOPOPTS = 0,    
+    IPPROTO_ICMP = 1,	    
+    IPPROTO_IGMP = 2,	    
+    IPPROTO_IPIP = 4,	    
+    IPPROTO_TCP = 6,	    
+    IPPROTO_EGP = 8,	    
+    IPPROTO_PUP = 12,	    
+    IPPROTO_UDP = 17,	    
+    IPPROTO_IDP = 22,	    
+    IPPROTO_TP = 29,	    
+    IPPROTO_IPV6 = 41,      
+    IPPROTO_ROUTING = 43,   
+    IPPROTO_FRAGMENT = 44,  
+    IPPROTO_RSVP = 46,	    
+    IPPROTO_GRE = 47,	    
+    IPPROTO_ESP = 50,       
+    IPPROTO_AH = 51,        
+    IPPROTO_ICMPV6 = 58,    
+    IPPROTO_NONE = 59,      
+    IPPROTO_DSTOPTS = 60,   
+    IPPROTO_MTP = 92,	    
+    IPPROTO_ENCAP = 98,	    
+    IPPROTO_PIM = 103,	    
+    IPPROTO_COMP = 108,	    
+    IPPROTO_RAW = 255,	    
+    IPPROTO_MAX
+  };
+
+ 
+enum
+  {
+    IPPORT_ECHO = 7,		 
+    IPPORT_DISCARD = 9,		 
+    IPPORT_SYSTAT = 11,		 
+    IPPORT_DAYTIME = 13,	 
+    IPPORT_NETSTAT = 15,	 
+    IPPORT_FTP = 21,		 
+    IPPORT_TELNET = 23,		 
+    IPPORT_SMTP = 25,		 
+    IPPORT_TIMESERVER = 37,	 
+    IPPORT_NAMESERVER = 42,	 
+    IPPORT_WHOIS = 43,		 
+    IPPORT_MTP = 57,
+
+    IPPORT_TFTP = 69,		 
+    IPPORT_RJE = 77,
+    IPPORT_FINGER = 79,		 
+    IPPORT_TTYLINK = 87,
+    IPPORT_SUPDUP = 95,		 
+
+
+    IPPORT_EXECSERVER = 512,	 
+    IPPORT_LOGINSERVER = 513,	 
+    IPPORT_CMDSERVER = 514,
+    IPPORT_EFSSERVER = 520,
+
+     
+    IPPORT_BIFFUDP = 512,
+    IPPORT_WHOSERVER = 513,
+    IPPORT_ROUTESERVER = 520,
+
+     
+    IPPORT_RESERVED = 1024,
+
+     
+    IPPORT_USERRESERVED = 5000
+  };
+
+
+ 
+struct in_addr
+  {
+    uint32_t s_addr;
+  };
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+ 
+
+ 
+
+
+ 
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+
+ 
+struct in6_addr
+  {
+    union
+      {
+	uint8_t		u6_addr8[16];
+	uint16_t	u6_addr16[8];
+	uint32_t	u6_addr32[4];
+
+
+
+      } in6_u;
+
+
+
+
+  };
+
+extern const struct in6_addr in6addr_any;         
+extern const struct in6_addr in6addr_loopback;    
+
+
+
+
+
+
+ 
+
+
+
+ 
+struct sockaddr_in
+  {
+    sa_family_t  sin_family ;
+    uint16_t sin_port;			 
+    struct in_addr sin_addr;		 
+
+     
+    unsigned char sin_zero[sizeof (struct sockaddr) -
+			   (sizeof (unsigned short int))  -
+			   sizeof (uint16_t) -
+			   sizeof (struct in_addr)];
+  };
+
+ 
+struct sockaddr_in6
+  {
+    sa_family_t  sin6_family ;
+    uint16_t sin6_port;		 
+    uint32_t sin6_flowinfo;	 
+    struct in6_addr sin6_addr;	 
+  };
+
+ 
+struct ipv6_mreq
+  {
+     
+    struct in6_addr ipv6mr_multiaddr;
+
+     
+    unsigned int ipv6mr_interface;
+  };
+
+ 
+# 1 "/usr/include/bits/in.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+
+ 
+
+
+struct ip_opts
+  {
+    struct in_addr ip_dst;	 
+    char ip_opts[40];		 
+  };
+
+ 
+struct ip_mreq
+  {
+    struct in_addr imr_multiaddr;	 
+    struct in_addr imr_interface;	 
+  };
+
+ 
+struct ip_mreqn
+  {
+    struct in_addr imr_multiaddr;	 
+    struct in_addr imr_address;		 
+    int	imr_ifindex;			 
+  };
+
+ 
+struct in_pktinfo
+  {
+    int ipi_ifindex;			 
+    struct in_addr ipi_spec_dst;	 
+    struct in_addr ipi_addr;		 
+  };
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+# 225 "/usr/include/netinet/in.h" 2 3
+
+
+ 
+
+
+
+
+
+
+extern uint32_t ntohl  (uint32_t __netlong)    ;
+extern uint16_t ntohs  (uint16_t __netshort)    ;
+extern uint32_t htonl  (uint32_t __hostlong)    ;
+extern uint16_t htons  (uint16_t __hostshort)    ;
+
+
+
+ 
+# 1 "/usr/include/bits/byteswap.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+# 40 "/usr/include/bits/byteswap.h" 3
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+# 68 "/usr/include/bits/byteswap.h" 3
+# 79 "/usr/include/bits/byteswap.h" 3
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+# 242 "/usr/include/netinet/in.h" 2 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+extern int bindresvport  (int __sockfd, struct sockaddr_in *__sock_in)    ;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+struct in6_pktinfo
+  {
+    struct in6_addr	ipi6_addr;     
+    unsigned int	ipi6_ifindex;  
+  };
+
+ 
+
+
+# 9 "driverstub.c" 2
+
+# 1 "/usr/include/zlib.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 1 "/usr/include/zconf.h" 1 3
+ 
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+# 49 "/usr/include/zconf.h" 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+                         
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+# 155 "/usr/include/zconf.h" 3
+
+
+
+
+
+
+
+
+ 
+# 189 "/usr/include/zconf.h" 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef unsigned char  Byte;   
+
+typedef unsigned int   uInt;   
+typedef unsigned long  uLong;  
+
+
+
+
+
+   typedef Byte    Bytef;
+
+typedef char    charf;
+typedef int     intf;
+typedef uInt    uIntf;
+typedef uLong   uLongf;
+
+
+   typedef void   *voidpf;
+   typedef void     *voidp;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+# 277 "/usr/include/zconf.h" 3
+
+
+
+# 34 "/usr/include/zlib.h" 2 3
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef voidpf (*alloc_func)  (voidpf opaque, uInt items, uInt size)  ;
+typedef void   (*free_func)   (voidpf opaque, voidpf address)  ;
+
+struct internal_state;
+
+typedef struct z_stream_s {
+    Bytef    *next_in;   
+    uInt     avail_in;   
+    uLong    total_in;   
+
+    Bytef    *next_out;  
+    uInt     avail_out;  
+    uLong    total_out;  
+
+    char     *msg;       
+    struct internal_state   *state;  
+
+    alloc_func zalloc;   
+    free_func  zfree;    
+    voidpf     opaque;   
+
+    int     data_type;   
+    uLong   adler;       
+    uLong   reserved;    
+} z_stream;
+
+typedef z_stream   *z_streamp;
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+                         
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+ 
+
+
+
+
+ 
+
+                         
+
+extern  const char *   zlibVersion  (void)  ;
+ 
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  int   deflate  (z_streamp strm, int flush)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  int   deflateEnd  (z_streamp strm)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  int   inflate  (z_streamp strm, int flush)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  int   inflateEnd  (z_streamp strm)  ;
+ 
+
+
+
+
+
+
+
+
+
+                         
+
+ 
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+                            
+extern  int   deflateSetDictionary  (z_streamp strm,
+                                             const Bytef *dictionary,
+                                             uInt  dictLength)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  int   deflateCopy  (z_streamp dest,
+                                    z_streamp source)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  int   deflateReset  (z_streamp strm)  ;
+ 
+
+
+
+
+
+
+
+
+
+extern  int   deflateParams  (z_streamp strm,
+				      int level,
+				      int strategy)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  int   inflateSetDictionary  (z_streamp strm,
+                                             const Bytef *dictionary,
+                                             uInt  dictLength)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  int   inflateSync  (z_streamp strm)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  int   inflateReset  (z_streamp strm)  ;
+ 
+
+
+
+
+
+
+
+
+
+                         
+
+ 
+
+
+
+
+
+
+
+extern  int   compress  (Bytef *dest,   uLongf *destLen,
+                                 const Bytef *source, uLong sourceLen)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+extern  int   compress2  (Bytef *dest,   uLongf *destLen,
+                                  const Bytef *source, uLong sourceLen,
+                                  int level)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+extern  int   uncompress  (Bytef *dest,   uLongf *destLen,
+                                   const Bytef *source, uLong sourceLen)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+typedef voidp gzFile;
+
+extern  gzFile   gzopen   (const char *path, const char *mode)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  gzFile   gzdopen   (int fd, const char *mode)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+extern  int   gzsetparams  (gzFile file, int level, int strategy)  ;
+ 
+
+
+
+
+
+
+extern  int      gzread   (gzFile file, voidp buf, unsigned len)  ;
+ 
+
+
+
+
+
+
+extern  int      gzwrite  (gzFile file, 
+				   const voidp buf, unsigned len)  ;
+ 
+
+
+
+
+
+extern  int     gzprintf  (gzFile file, const char *format, ...)  ;
+ 
+
+
+
+
+
+extern  int   gzputs  (gzFile file, const char *s)  ;
+ 
+
+
+
+
+
+extern  char *   gzgets  (gzFile file, char *buf, int len)  ;
+ 
+
+
+
+
+
+
+
+extern  int      gzputc  (gzFile file, int c)  ;
+ 
+
+
+
+
+extern  int      gzgetc  (gzFile file)  ;
+ 
+
+
+
+
+extern  int      gzflush  (gzFile file, int flush)  ;
+ 
+
+
+
+
+
+
+
+
+extern  long       gzseek  (gzFile file,
+				      long  offset, int whence)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  int      gzrewind  (gzFile file)  ;
+ 
+
+
+
+
+
+extern  long       gztell  (gzFile file)  ;
+ 
+
+
+
+
+
+
+
+extern  int   gzeof  (gzFile file)  ;
+ 
+
+
+
+
+extern  int      gzclose  (gzFile file)  ;
+ 
+
+
+
+
+
+extern  const char *   gzerror  (gzFile file, int *errnum)  ;
+ 
+
+
+
+
+
+
+
+                         
+
+ 
+
+
+
+
+
+extern  uLong   adler32  (uLong adler, const Bytef *buf, uInt len)  ;
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern  uLong   crc32    (uLong crc, const Bytef *buf, uInt len)  ;
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+                         
+
+ 
+
+
+extern  int   deflateInit_  (z_streamp strm, int level,
+                                     const char *version, int stream_size)  ;
+extern  int   inflateInit_  (z_streamp strm,
+                                     const char *version, int stream_size)  ;
+extern  int   deflateInit2_  (z_streamp strm, int  level, int  method,
+                                      int windowBits, int memLevel,
+                                      int strategy, const char *version,
+                                      int stream_size)  ;
+extern  int   inflateInit2_  (z_streamp strm, int  windowBits,
+                                      const char *version, int stream_size)  ;
+
+
+
+
+
+
+
+
+
+
+
+
+    struct internal_state {int dummy;};  
+
+
+extern  const char   *   zError            (int err)  ;
+extern  int              inflateSyncPoint  (z_streamp z)  ;
+extern  const uLongf *   get_crc_table     (void)  ;
+
+
+
+
+
+
+# 10 "driverstub.c" 2
+
+# 1 "/usr/include/signal.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+# 1 "/usr/include/bits/sigset.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 33 "/usr/include/bits/sigset.h" 3
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 97 "/usr/include/bits/sigset.h" 3
+
+
+
+ 
+
+
+extern int __sigismember (__const __sigset_t *, int);
+extern int __sigaddset (__sigset_t *, int);
+extern int __sigdelset (__sigset_t *, int);
+
+# 122 "/usr/include/bits/sigset.h" 3
+
+
+
+
+# 33 "/usr/include/signal.h" 2 3
+
+
+ 
+
+
+
+
+
+typedef __sig_atomic_t sig_atomic_t;
+
+
+
+
+
+
+
+typedef __sigset_t sigset_t;
+
+
+
+
+
+
+# 1 "/usr/include/bits/signum.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+# 56 "/usr/include/signal.h" 2 3
+
+
+# 67 "/usr/include/signal.h" 3
+
+
+
+ 
+typedef void (*__sighandler_t)  (int)  ;
+
+ 
+
+
+extern __sighandler_t __sysv_signal  (int __sig,
+					  __sighandler_t __handler)    ;
+
+
+
+
+ 
+
+
+
+extern __sighandler_t signal  (int __sig, __sighandler_t __handler)    ;
+# 96 "/usr/include/signal.h" 3
+
+
+
+
+
+
+
+
+ 
+
+
+
+extern int kill  (__pid_t __pid, int __sig)    ;
+
+
+
+ 
+
+
+extern int killpg  (__pid_t __pgrp, int __sig)    ;
+
+
+ 
+extern int raise  (int __sig)    ;
+
+
+ 
+extern __sighandler_t ssignal  (int __sig, __sighandler_t __handler)    ;
+extern int gsignal  (int __sig)    ;
+
+
+
+ 
+extern void psignal  (int __sig, __const char *__s)    ;
+
+
+
+ 
+
+
+
+
+extern int __sigpause  (int __sig_or_mask, int __is_sig)    ;
+
+
+ 
+
+extern int sigpause  (int __mask)    ;
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+ 
+
+
+ 
+extern int sigblock  (int __mask)    ;
+
+ 
+extern int sigsetmask  (int __mask)    ;
+
+ 
+extern int siggetmask  (void)    ;
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+typedef __sighandler_t sig_t;
+
+
+
+
+
+ 
+
+# 1 "/usr/include/time.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 51 "/usr/include/time.h" 3
+
+
+
+# 62 "/usr/include/time.h" 3
+
+
+
+# 73 "/usr/include/time.h" 3
+
+
+
+
+# 89 "/usr/include/time.h" 3
+
+
+
+
+# 279 "/usr/include/time.h" 3
+
+
+
+# 191 "/usr/include/signal.h" 2 3
+
+
+ 
+# 1 "/usr/include/bits/siginfo.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+typedef union sigval
+  {
+    int sival_int;
+    void *sival_ptr;
+  } sigval_t;
+
+
+
+
+typedef struct siginfo
+  {
+    int si_signo;		 
+    int si_errno;		 
+
+    int si_code;		 
+
+    union
+      {
+	int _pad[((128  / sizeof (int)) - 3) ];
+
+	  
+	struct
+	  {
+	    __pid_t si_pid;	 
+	    __uid_t si_uid;	 
+	  } _kill;
+
+	 
+	struct
+	  {
+	    unsigned int _timer1;
+	    unsigned int _timer2;
+	  } _timer;
+
+	 
+	struct
+	  {
+	    __pid_t si_pid;	 
+	    __uid_t si_uid;	 
+	    sigval_t si_sigval;	 
+	  } _rt;
+
+	 
+	struct
+	  {
+	    __pid_t si_pid;	 
+	    __uid_t si_uid;	 
+	    int si_status;	 
+	    __clock_t si_utime;
+	    __clock_t si_stime;
+	  } _sigchld;
+
+	 
+	struct
+	  {
+	    void *si_addr;	 
+	  } _sigfault;
+
+	 
+	struct
+	  {
+	    int si_band;	 
+	    int si_fd;
+	  } _sigpoll;
+      } _sifields;
+  } siginfo_t;
+
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+enum
+{
+  SI_SIGIO = -5,		 
+
+  SI_ASYNCIO,			 
+
+  SI_MESGQ,			 
+
+  SI_TIMER,			 
+
+  SI_QUEUE,			 
+
+  SI_USER			 
+
+};
+
+
+ 
+enum
+{
+  ILL_ILLOPC = 1,		 
+
+  ILL_ILLOPN,			 
+
+  ILL_ILLADR,			 
+
+  ILL_ILLTRP,			 
+
+  ILL_PRVOPC,			 
+
+  ILL_PRVREG,			 
+
+  ILL_COPROC,			 
+
+  ILL_BADSTK			 
+
+};
+
+ 
+enum
+{
+  FPE_INTDIV = 1,		 
+
+  FPE_INTOVF,			 
+
+  FPE_FLTDIV,			 
+
+  FPE_FLTOVF,			 
+
+  FPE_FLTUND,			 
+
+  FPE_FLTRES,			 
+
+  FPE_FLTINV,			 
+
+  FPE_FLTSUB			 
+
+};
+
+ 
+enum
+{
+  SEGV_MAPERR = 1,		 
+
+  SEGV_ACCERR			 
+
+};
+
+ 
+enum
+{
+  BUS_ADRALN = 1,		 
+
+  BUS_ADRERR,			 
+
+  BUS_OBJERR			 
+
+};
+
+ 
+enum
+{
+  TRAP_BRKPT = 1,		 
+
+  TRAP_TRACE			 
+
+};
+
+ 
+enum
+{
+  CLD_EXITED = 1,		 
+
+  CLD_KILLED,			 
+
+  CLD_DUMPED,			 
+
+  CLD_TRAPPED,			 
+
+  CLD_STOPPED,			 
+
+  CLD_CONTINUED			 
+
+};
+
+ 
+enum
+{
+  POLL_IN = 1,			 
+
+  POLL_OUT,			 
+
+  POLL_MSG,			 
+
+  POLL_ERR,			 
+
+  POLL_PRI,			 
+
+  POLL_HUP			 
+
+};
+
+
+
+
+
+
+
+
+ 
+
+
+
+typedef struct sigevent
+  {
+    sigval_t sigev_value;
+    int sigev_signo;
+    int sigev_notify;
+
+    union
+      {
+	int _pad[((64  / sizeof (int)) - 3) ];
+
+	struct
+	  {
+	    void (*_function)  (sigval_t)  ;  
+	    void *_attribute;			   
+	  } _sigev_thread;
+      } _sigev_un;
+  } sigevent_t;
+
+ 
+
+
+
+ 
+enum
+{
+  SIGEV_SIGNAL = 0,		 
+
+  SIGEV_NONE,			 
+
+  SIGEV_THREAD			 
+
+};
+
+
+# 194 "/usr/include/signal.h" 2 3
+
+
+
+ 
+extern int sigemptyset  (sigset_t *__set)    ;
+
+ 
+extern int sigfillset  (sigset_t *__set)    ;
+
+ 
+extern int sigaddset  (sigset_t *__set, int __signo)    ;
+
+ 
+extern int sigdelset  (sigset_t *__set, int __signo)    ;
+
+ 
+extern int sigismember  (__const sigset_t *__set, int __signo)    ;
+
+# 223 "/usr/include/signal.h" 3
+
+
+ 
+
+# 1 "/usr/include/bits/sigaction.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+struct sigaction
+  {
+     
+
+    union
+      {
+	 
+	__sighandler_t sa_handler;
+	 
+	void (*sa_sigaction)  (int, siginfo_t *, void *)  ;
+      }
+    __sigaction_handler;
+
+
+
+
+
+
+     
+    __sigset_t sa_mask;
+
+     
+    int sa_flags;
+
+     
+    void (*sa_restorer)  (void)  ;
+  };
+
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+ 
+
+
+
+# 227 "/usr/include/signal.h" 2 3
+
+
+ 
+extern int sigprocmask  (int __how,
+			     __const sigset_t *__set, sigset_t *__oset)    ;
+
+ 
+
+extern int sigsuspend  (__const sigset_t *__set)    ;
+
+ 
+extern int __sigaction  (int __sig, __const struct sigaction *__act,
+			     struct sigaction *__oact)    ;
+extern int sigaction  (int __sig, __const struct sigaction *__act,
+			   struct sigaction *__oact)    ;
+
+ 
+extern int sigpending  (sigset_t *__set)    ;
+
+
+ 
+extern int sigwait  (__const sigset_t *__set, int *__sig)    ;
+
+
+ 
+extern int sigwaitinfo  (__const sigset_t *__set, siginfo_t *__info)    ;
+
+ 
+
+extern int sigtimedwait  (__const sigset_t *__set, siginfo_t *__info,
+			      __const struct timespec *__timeout)    ;
+
+ 
+
+extern int sigqueue  (__pid_t __pid, int __sig,
+			  __const union sigval __val)    ;
+
+
+
+
+
+
+ 
+
+extern __const char *__const _sys_siglist[64 ];
+extern __const char *__const sys_siglist[64 ];
+
+ 
+struct sigvec
+  {
+    __sighandler_t sv_handler;	 
+    int sv_mask;		 
+
+    int sv_flags;		 
+
+  };
+
+ 
+
+
+
+
+
+ 
+
+
+
+
+extern int sigvec  (int __sig, __const struct sigvec *__vec,
+			struct sigvec *__ovec)    ;
+
+
+ 
+# 1 "/usr/include/bits/sigcontext.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+# 1 "/usr/include/asm/sigcontext.h" 1 3
+
+
+
+ 
+
+
+
+
+
+
+
+struct _fpreg {
+	unsigned short significand[4];
+	unsigned short exponent;
+};
+
+struct _fpstate {
+	unsigned long 	cw,
+			sw,
+			tag,
+			ipoff,
+			cssel,
+			dataoff,
+			datasel;
+	struct _fpreg	_st[8];
+	unsigned long	status;
+};
+
+struct sigcontext {
+	unsigned short gs, __gsh;
+	unsigned short fs, __fsh;
+	unsigned short es, __esh;
+	unsigned short ds, __dsh;
+	unsigned long edi;
+	unsigned long esi;
+	unsigned long ebp;
+	unsigned long esp;
+	unsigned long ebx;
+	unsigned long edx;
+	unsigned long ecx;
+	unsigned long eax;
+	unsigned long trapno;
+	unsigned long err;
+	unsigned long eip;
+	unsigned short cs, __csh;
+	unsigned long eflags;
+	unsigned long esp_at_signal;
+	unsigned short ss, __ssh;
+	struct _fpstate * fpstate;
+	unsigned long oldmask;
+	unsigned long cr2;
+};
+
+
+
+# 28 "/usr/include/bits/sigcontext.h" 2 3
+
+
+# 300 "/usr/include/signal.h" 2 3
+
+
+ 
+extern int sigreturn  (struct sigcontext *__scp)    ;
+
+
+
+
+
+
+ 
+
+
+extern int siginterrupt  (int __sig, int __interrupt)    ;
+
+# 1 "/usr/include/bits/sigstack.h" 1 3
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+struct sigstack
+  {
+    void *  ss_sp;		 
+    int ss_onstack;		 
+  };
+
+
+ 
+enum
+{
+  SS_ONSTACK = 1,
+
+  SS_DISABLE
+
+};
+
+ 
+
+
+ 
+
+
+
+ 
+typedef struct sigaltstack
+  {
+    void *  ss_sp;
+    int ss_flags;
+    size_t ss_size;
+  } stack_t;
+# 315 "/usr/include/signal.h" 2 3
+
+
+
+
+
+ 
+
+
+extern int sigstack  (struct sigstack *__ss, struct sigstack *__oss)    ;
+
+ 
+
+extern int sigaltstack  (__const struct sigaltstack *__ss,
+			     struct sigaltstack *__oss)    ;
+
+
+
+# 350 "/usr/include/signal.h" 3
+
+
+ 
+
+
+ 
+extern int __libc_current_sigrtmin  (void)    ;
+ 
+extern int __libc_current_sigrtmax  (void)    ;
+
+
+
+ 
+
+
+# 11 "driverstub.c" 2
diff --git a/test/tests2.4/duffs.c b/test/tests2.4/duffs.c
new file mode 100644
index 0000000..28c83fe
--- /dev/null
+++ b/test/tests2.4/duffs.c
@@ -0,0 +1,16 @@
+void send (int *to, int *from, int count)
+{
+  int n= (count + 7) / 8;
+
+  switch (count % 8) {
+  case 0: do {*to = *from++;
+  case 7: *to = *from++;
+  case 6: *to = *from++;
+  case 5: *to = *from++;
+  case 4: *to = *from++;
+  case 3: *to = *from++;
+  case 2: *to = *from++;
+  case 1: *to = *from++;
+  } while (--n>0);
+  }
+}
diff --git a/test/tests2.4/emptycase.c b/test/tests2.4/emptycase.c
new file mode 100644
index 0000000..aff7ff4
--- /dev/null
+++ b/test/tests2.4/emptycase.c
@@ -0,0 +1,9 @@
+void f (int x) {
+  switch (x) {
+  case 1:
+  }
+
+  switch (x) {
+  default:
+  }
+}
diff --git a/test/tests2.4/enumtest.c b/test/tests2.4/enumtest.c
new file mode 100644
index 0000000..b258f5d
--- /dev/null
+++ b/test/tests2.4/enumtest.c
@@ -0,0 +1,10 @@
+void (**sig_func)(void);
+void (**(sig_func1))(void);
+
+void s_f (int x) {
+  if (x > 3) {
+    (**sig_func)();
+  } else {
+    (****sig_func1)(); /* No error - C apparently allows this... */
+  }
+}
diff --git a/test/tests2.4/error.c b/test/tests2.4/error.c
new file mode 100644
index 0000000..86638d1
--- /dev/null
+++ b/test/tests2.4/error.c
@@ -0,0 +1,5 @@
+# if 0
+# error print this
+# endif
+
+int x = 'a';
diff --git a/test/tests2.4/fink.c b/test/tests2.4/fink.c
new file mode 100644
index 0000000..33fd3d1
--- /dev/null
+++ b/test/tests2.4/fink.c
@@ -0,0 +1,13 @@
+enum {
+      SCM_RIGHTS = 0x01,		/* Transfer file descriptors.  */
+      SCM_ASD = 3.42,
+    __SCM_CONNECT = "asdf"	/* Data array is `struct scm_connect'.  */
+};
+
+__extension__ typedef long long int quad_t;
+
+typedef struct
+{
+  int val[2];
+} fsid_t;				 
+
diff --git a/test/tests2.4/hexconstants.c b/test/tests2.4/hexconstants.c
new file mode 100644
index 0000000..45af12b
--- /dev/null
+++ b/test/tests2.4/hexconstants.c
@@ -0,0 +1,6 @@
+int f (void) {
+  unsigned int m1 = 0xFF;
+  unsigned int m2 = 0142;
+
+  return m1 + m2;
+}
diff --git a/test/tests2.4/innercomment.c b/test/tests2.4/innercomment.c
new file mode 100644
index 0000000..b2f42f5
--- /dev/null
+++ b/test/tests2.4/innercomment.c
@@ -0,0 +1,16 @@
+/* test /* yo */
+
+
+/*
+
+  tyohse
+
+
+  /*
+
+
+asdfhgkjeh
+
+
+adfjkle
+*/
diff --git a/test/tests2.4/komazi.c b/test/tests2.4/komazi.c
new file mode 100644
index 0000000..5b300ac
--- /dev/null
+++ b/test/tests2.4/komazi.c
@@ -0,0 +1,5 @@
+void func(void)
+{
+	goto End;
+End:
+}
diff --git a/test/tests2.4/longlong.c b/test/tests2.4/longlong.c
new file mode 100644
index 0000000..3eabc69
--- /dev/null
+++ b/test/tests2.4/longlong.c
@@ -0,0 +1,14 @@
+long long llf (long long llx, long lx, long double lld) {
+  int m = llx; /* int <- long long */
+  m = 243LL;
+  lld = 3.542L;
+
+  lx = 5234LL;
+  lx = 5342L;
+  llx = lx;
+  lx = llx; /* long <- long long */
+  llx = m;
+
+  return lx;
+}
+
diff --git a/test/tests2.4/nothing.c b/test/tests2.4/nothing.c
new file mode 100644
index 0000000..a048a4f
--- /dev/null
+++ b/test/tests2.4/nothing.c
@@ -0,0 +1,47 @@
+int main()
+{
+  static void nfunc(void);
+  nfunc();
+  return 0;
+}
+static void nfunc(){}
+
+/*
+From: "Johnson, Nathan E. (AZ76)" 
+To: "'lclint-bug'" 
+Subject: Mishandling of prototypes stated within functions
+Date: Wed, 26 May 1999 09:00:24 -0700
+Importance: low
+X-Priority: 5
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2448.0)
+Content-Type: text/plain
+
+Using flags:
++singleinclude
+-warnunixlib
++unixlib
+
+The following program:
+----------------------------
+int main()
+    {
+    static void nothing(void);
+    nothing();
+    return 0;
+    }
+static void nothing(){}
+
+------------------------------
+yields:
+------------------------------
+LCLint 2.4b --- 18 Apr 98
+
+lbug.c:7:13: File static function nothing declared but not used
+  A function is declared but not used. Use @unused@ in front of function
+  header to suppress message. (-fcnuse will suppress message)
+   lbug.c:7:24: Definition of nothing
+
+Finished LCLint checking --- 1 code error found
+
+*/
diff --git a/test/tests2.4/offsetof.c b/test/tests2.4/offsetof.c
new file mode 100644
index 0000000..3cdab85
--- /dev/null
+++ b/test/tests2.4/offsetof.c
@@ -0,0 +1,14 @@
+# include 
+
+typedef struct _S { union { int i; struct { int m; } s; } u; } S;
+
+int f () {
+  size_t t;
+  int m;
+
+  t = offsetof (S, u.i);
+  m = offsetof (S, u);
+  t = offsetof (S, u.s.m);
+  t = offsetof (S, u.s.k);
+  return m;
+}
diff --git a/test/tests2.4/print.c b/test/tests2.4/print.c
new file mode 100644
index 0000000..310ce55
--- /dev/null
+++ b/test/tests2.4/print.c
@@ -0,0 +1,9 @@
+# include 
+
+int main (void) {
+  int i;
+
+  printf ("a%n\n", &i); 
+  printf ("%d\n", i);
+  return 0;
+}
diff --git a/test/tests2.4/subdir/main.c b/test/tests2.4/subdir/main.c
new file mode 100644
index 0000000..6d1a0d4
--- /dev/null
+++ b/test/tests2.4/subdir/main.c
@@ -0,0 +1 @@
+int x;
diff --git a/test/tests2.4/subdir/main.lcl b/test/tests2.4/subdir/main.lcl
new file mode 100644
index 0000000..6d1a0d4
--- /dev/null
+++ b/test/tests2.4/subdir/main.lcl
@@ -0,0 +1 @@
+int x;
diff --git a/test/tests2.4/subdir/main.lcs b/test/tests2.4/subdir/main.lcs
new file mode 100644
index 0000000..be0f662
--- /dev/null
+++ b/test/tests2.4/subdir/main.lcs
@@ -0,0 +1,121 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort _int_Obj obj int nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLvar x _int_Obj
+%LCLSymbolTableEnd
diff --git a/test/tests2.4/syslog.c b/test/tests2.4/syslog.c
new file mode 100644
index 0000000..1ebbbe5
--- /dev/null
+++ b/test/tests2.4/syslog.c
@@ -0,0 +1,3 @@
+void f (char *s) {
+  syslog (LOG_INFO, "error: %m (%s)", s);
+}
diff --git a/test/tests2.4/test0.c b/test/tests2.4/test0.c
new file mode 100644
index 0000000..28416dd
--- /dev/null
+++ b/test/tests2.4/test0.c
@@ -0,0 +1,37 @@
+void test0(int value, int *data, int *result)
+{
+int i;
+int j;
+
+	*result = 0;
+	switch(value)
+	{
+	case 1:
+		for(i=1;i<100;i++)
+		{
+			for(j=0;j<100;j++)
+			{
+				if(data[j] == i)
+					goto RETURN;
+			}
+		}
+		*result = 1;
+		break;
+	case 3:
+		for(i=1;i<100;i++)
+		{
+			for(j=0;j<100;j++)
+			{
+				if(data[j] == 2*i+1)
+					goto RETURN;
+			}
+		}
+		*result = 2;
+		break;
+	default:
+		*result = -1;
+		break;
+	}
+RETURN:
+	/*	*result = 0;	// if this line is not here, lclint fails */
+}
diff --git a/test/tests2.4/test1.c b/test/tests2.4/test1.c
new file mode 100644
index 0000000..235fe94
--- /dev/null
+++ b/test/tests2.4/test1.c
@@ -0,0 +1,37 @@
+void test1(int value, int *data, int *result)
+{
+int i;
+int j;
+
+	*result = 0;
+	switch(value)
+	{
+	case 1:
+		for(i=1;i<100;i++)
+		{
+			for(j=0;j<100;j++)
+			{
+				if(data[j] == i)
+					goto RETURN;
+			}
+		}
+		*result = 1;
+		break;
+	case 3:
+		for(i=1;i<100;i++)
+		{
+			for(j=0;j<100;j++)
+			{
+				if(data[j] == 2*i+1)
+					goto RETURN;
+			}
+		}
+		*result = 2;
+		break;
+	default:
+		*result = -1;
+		break;
+	}
+RETURN:
+//	*result = 0;	// if this line is not here, lclint fails
+}
diff --git a/test/tests2.4/test2.c b/test/tests2.4/test2.c
new file mode 100644
index 0000000..59a2168
--- /dev/null
+++ b/test/tests2.4/test2.c
@@ -0,0 +1,35 @@
+void test2(int value, int *data, int *result)
+{
+int i;
+int j;
+
+	*result = 0;
+	switch(value)
+	{
+	case 1:
+		for(i=1;i<100;i++)
+		{
+			for(j=0;j<100;j++)
+			{
+				if(data[j] == i)
+					goto RETURN;
+			}
+		}
+		*result = 1;
+		break;
+	case 3:
+		for(i=1;i<100;i++)
+		{
+			for(j=0;j<100;j++)
+			{
+				if(data[j] == 2*i+1)
+					goto RETURN;
+			}
+		}
+		*result = 2;
+		break;
+	default:
+		*result = -1;
+	}
+RETURN:
+}
diff --git a/test/tests2.4/ulrich.c b/test/tests2.4/ulrich.c
new file mode 100644
index 0000000..d69dbdc
--- /dev/null
+++ b/test/tests2.4/ulrich.c
@@ -0,0 +1,17 @@
+#include 
+# define x 23
+
+void * utl_calloc
+(
+    const size_t num,
+    const size_t size
+)
+{
+    void *newblock = NULL;
+
+    newblock = calloc(num, size);
+
+#
+    return newblock;
+}
+
diff --git a/test/tq.h b/test/tq.h
new file mode 100644
index 0000000..348ef34
--- /dev/null
+++ b/test/tq.h
@@ -0,0 +1,8 @@
+typedef /*@abstract@*/ /*@mutable@*/ int *tam;
+typedef /*@abstract@*/ /*@immutable@*/ int *tai;
+typedef /*@abstract@*/ /*@immutable@*/ int *tmixm; /* 1. inconsistently declared as immutable */
+typedef /*@abstract@*/ /*@immutable@*/ int *tmixa; /* 2. inconsistently declared as abstract type */
+typedef /*@abstract@*/ /*@mutable@*/   int *tmixi; /* 3. inconsistently declared as mutable */
+typedef /*@mutable@*/ int *tm;
+typedef /*@immutable@*/ int *ti;
+
diff --git a/test/tq.lcl b/test/tq.lcl
new file mode 100644
index 0000000..a5ff94d
--- /dev/null
+++ b/test/tq.lcl
@@ -0,0 +1,5 @@
+mutable type tam;
+immutable type tai;
+mutable type tmixm;
+immutable type tmixi;
+typedef int *tmixa;
diff --git a/test/tq.lcs b/test/tq.lcs
new file mode 100644
index 0000000..90e2e30
--- /dev/null
+++ b/test/tq.lcs
@@ -0,0 +1,149 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort tam immutable nil nil
+%LCLsort _tam_Obj mutable tam nil
+%LCLsort tai immutable nil nil
+%LCLsort tmixm immutable nil nil
+%LCLsort _tmixm_Obj mutable tmixm nil
+%LCLsort tmixi immutable nil nil
+%LCLsort _int_Obj obj int nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLsort _tmixa synonym __int_Obj_Ptr nil
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop sizeof :tam -> int
+%LCLop sizeof :tai -> int
+%LCLop sizeof :tmixm -> int
+%LCLop sizeof :tmixi -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLtype tam _tam_Obj mutable
+%LCLtype tai tai immutable
+%LCLtype tmixm _tmixm_Obj mutable
+%LCLtype tmixi tmixi immutable
+%LCLtype tmixa _tmixa exposed
+%LCLSymbolTableEnd
diff --git a/test/typequals.c b/test/typequals.c
new file mode 100644
index 0000000..06c6b64
--- /dev/null
+++ b/test/typequals.c
@@ -0,0 +1,10 @@
+# include "tq.h"
+
+void f (tam xtam, tai xtai, tm xtm, ti xti)
+   /*@modifies xtam, xtai, xtm, xti@*/
+{
+  *xtam = 3; /* 4. Operand of * is abstract type (tam): *xtam */
+  *xtai = 4; /* 5. Operand of * is abstract type (tai): *xtai */
+  *xtm = 5;
+  *xti = 8;
+}
diff --git a/test/typequals.expect b/test/typequals.expect
new file mode 100644
index 0000000..d9fa2d8
--- /dev/null
+++ b/test/typequals.expect
@@ -0,0 +1,18 @@
+
+tq.h:3:45: Datatype tmixm inconsistently declared as immutable
+   tq.lcl:3:1: Specification of tmixm
+tq.h:4:45: Datatype tmixa inconsistently declared as abstract type
+   tq.lcl:5:14: Specification of tmixa
+tq.h:5:45: Datatype tmixi inconsistently declared as mutable
+   tq.lcl:4:1: Specification of tmixi
+typequals.c: (in function f)
+typequals.c:6:4: Operand of * is abstract type (tam): *xtam
+typequals.c:7:4: Operand of * is abstract type (tai): *xtai
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+typequals.c: (in function f)
+typequals.c:6:4: Operand of * is abstract type (tam): *xtam
+typequals.c:7:4: Operand of * is abstract type (tai): *xtai
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/typequals.out b/test/typequals.out
new file mode 100644
index 0000000..d9fa2d8
--- /dev/null
+++ b/test/typequals.out
@@ -0,0 +1,18 @@
+
+tq.h:3:45: Datatype tmixm inconsistently declared as immutable
+   tq.lcl:3:1: Specification of tmixm
+tq.h:4:45: Datatype tmixa inconsistently declared as abstract type
+   tq.lcl:5:14: Specification of tmixa
+tq.h:5:45: Datatype tmixi inconsistently declared as mutable
+   tq.lcl:4:1: Specification of tmixi
+typequals.c: (in function f)
+typequals.c:6:4: Operand of * is abstract type (tam): *xtam
+typequals.c:7:4: Operand of * is abstract type (tai): *xtai
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+typequals.c: (in function f)
+typequals.c:6:4: Operand of * is abstract type (tam): *xtam
+typequals.c:7:4: Operand of * is abstract type (tai): *xtai
+
+Finished LCLint checking --- 2 code errors found, as expected
diff --git a/test/ud.c b/test/ud.c
new file mode 100644
index 0000000..6f1efec
--- /dev/null
+++ b/test/ud.c
@@ -0,0 +1,69 @@
+int g;
+
+int f(int a, int b)
+{
+  int x, y, z, z2, z3, z4, z5, z6;
+
+  x = a; /* okay */
+  x = y; /* bad */
+  y = b; /* okay */
+  z = z; /* bad */
+  z = g; /* okay */
+
+  if (z == g)
+      z2 = 3;
+  else
+      z2 = 4;
+
+  x = z2; /* okay */
+
+  if (z == g)
+    z3 = 3;
+  else
+    z4 = 4;
+
+  x = z3; /* bad */
+  x = z4; /* bad */
+
+  if (z == g)
+    z6 = 4;
+
+  x = z6; /* bad */
+
+  if (z == g)
+    {
+      int i, j;
+      
+      i = x;  /* okay */
+      i = j;  /* bad */
+      z2 = i; /* okay */
+      z3 = i; /* okay */
+    }
+  else
+    {
+      int i, j;
+
+      {
+	int m;
+
+	j = i;  /* bad */
+	i = z5; /* bad */
+	z3 = j; /* okay */
+	m = x;
+      }
+    }
+  
+  x = z5; /* bad */
+  x = z3; /* okay */
+
+  if (x == z3)
+    {
+      z4 = 7;
+    }
+
+  x = z4; /* < not reported> */
+  return 5;
+}
+
+
+
diff --git a/test/ud.expect b/test/ud.expect
new file mode 100644
index 0000000..ddbf4f0
--- /dev/null
+++ b/test/ud.expect
@@ -0,0 +1,21 @@
+
+ud.c: (in function f)
+ud.c:8:7: Variable y used before definition
+ud.c:10:7: Variable z used before definition
+ud.c:25:7: Variable z3 used before definition
+ud.c:26:7: Variable z4 used before definition
+ud.c:31:7: Variable z6 used before definition
+ud.c:38:11: Variable j used before definition
+ud.c:49:6: Variable i used before definition
+ud.c:50:6: Variable z5 used before definition
+ud.c:56:7: Variable z5 used before definition
+
+Finished LCLint checking --- 9 code errors found, as expected
+
+ud2.c: (in function g)
+ud2.c:9:6: Unallocated storage y passed as out parameter: y
+ud2.c: (in function h)
+ud2.c:20:7: Passed storage x not completely defined: f2 (&x)
+ud2.c:23:7: Variable y used before definition
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/ud.out b/test/ud.out
new file mode 100644
index 0000000..ddbf4f0
--- /dev/null
+++ b/test/ud.out
@@ -0,0 +1,21 @@
+
+ud.c: (in function f)
+ud.c:8:7: Variable y used before definition
+ud.c:10:7: Variable z used before definition
+ud.c:25:7: Variable z3 used before definition
+ud.c:26:7: Variable z4 used before definition
+ud.c:31:7: Variable z6 used before definition
+ud.c:38:11: Variable j used before definition
+ud.c:49:6: Variable i used before definition
+ud.c:50:6: Variable z5 used before definition
+ud.c:56:7: Variable z5 used before definition
+
+Finished LCLint checking --- 9 code errors found, as expected
+
+ud2.c: (in function g)
+ud2.c:9:6: Unallocated storage y passed as out parameter: y
+ud2.c: (in function h)
+ud2.c:20:7: Passed storage x not completely defined: f2 (&x)
+ud2.c:23:7: Variable y used before definition
+
+Finished LCLint checking --- 3 code errors found, as expected
diff --git a/test/ud2.c b/test/ud2.c
new file mode 100644
index 0000000..22ce424
--- /dev/null
+++ b/test/ud2.c
@@ -0,0 +1,24 @@
+void g (void)
+{
+  char *x;
+  char **y;
+
+  f1(&x); 
+  printf("%s\n", x); 
+
+  f1(y); /* 1. Unallocated storage y passed as out parameter: y */
+  printf("%s\n", *y);
+}
+
+void h (void)
+{
+  int z;
+  char *x;
+  char **y;
+
+  f3 (&z); /* okay! */
+  f2 (&x); /* 2. Value &x used before definition, */
+  printf ("%s\n", x);  
+
+  f2 (y);  /* 3. Variable y used before definition */
+}
diff --git a/test/ud2.lcl b/test/ud2.lcl
new file mode 100644
index 0000000..ed69842
--- /dev/null
+++ b/test/ud2.lcl
@@ -0,0 +1,3 @@
+void f1(out char **x) { modifies *x; }
+void f2(char **x) { modifies *x; }
+void f3(out int *y) { modifies *y; }
\ No newline at end of file
diff --git a/test/ud2.lcs b/test/ud2.lcs
new file mode 100644
index 0000000..d1c8f38
--- /dev/null
+++ b/test/ud2.lcs
@@ -0,0 +1,153 @@
+%PASSED Output from LCLint 2.5m
+%LCLimports 
+%LCLSortTable
+%LCLsort bool immutable nil nil
+%LCLsort Bool synonym bool nil
+%LCLsort int primitive nil nil
+%LCLsort char primitive nil nil
+%LCLsort void primitive nil nil
+%LCLsort _char_Obj obj char nil
+%LCLsort __char_Obj_Ptr ptr _char_Obj nil
+%LCLsort __char_Obj_Arr arr _char_Obj nil
+%LCLsort _char_Vec vec char __char_Obj_Arr
+%LCLsort float primitive nil nil
+%LCLsort double primitive nil nil
+%LCLsort ___char_Obj_Ptr_Obj obj __char_Obj_Ptr nil
+%LCLsort ____char_Obj_Ptr_Obj_Ptr ptr ___char_Obj_Ptr_Obj nil
+%LCLsort ____char_Obj_Ptr_Obj_Arr arr ___char_Obj_Ptr_Obj nil
+%LCLsort ___char_Obj_Ptr_Vec vec __char_Obj_Ptr ____char_Obj_Ptr_Obj_Arr
+%LCLsort _int_Obj obj int nil
+%LCLsort __int_Obj_Ptr ptr _int_Obj nil
+%LCLsort __int_Obj_Arr arr _int_Obj nil
+%LCLsort _int_Vec vec int __int_Obj_Arr
+%LCLSortTableEnd
+%LCLSymbolTable
+%LCLop max :int, int -> int
+%LCLop 0 : -> int
+%LCLop 0 : -> double
+%LCLop 1 : -> int
+%LCLop 1 : -> double
+%LCLop __ < __  :int, int -> bool
+%LCLop __ < __  :double, double -> bool
+%LCLop if __ then __ else __  :bool, bool, bool -> bool
+%LCLop if __ then __ else __  :bool, int, int -> int
+%LCLop if __ then __ else __  :bool, double, double -> double
+%LCLop if __ then __ else __  :bool, _char_Vec, _char_Vec -> _char_Vec
+%LCLop if __ then __ else __  :bool, char, char -> char
+%LCLop empty : -> _char_Vec
+%LCLop __ > __  :int, int -> bool
+%LCLop __ > __  :double, double -> bool
+%LCLop count :char, _char_Vec -> int
+%LCLop head :_char_Vec -> char
+%LCLop __ \inv :double -> double
+%LCLop init :_char_Vec -> _char_Vec
+%LCLop isEmpty :_char_Vec -> bool
+%LCLop last :_char_Vec -> char
+%LCLop len :_char_Vec -> int
+%LCLop prefix :_char_Vec, int -> _char_Vec
+%LCLop __ / __  :double, double -> double
+%LCLop removePrefix :_char_Vec, int -> _char_Vec
+%LCLop __ \implies __  :bool, bool -> bool
+%LCLop substring :_char_Vec, int, int -> _char_Vec
+%LCLop __ || __  :_char_Vec, _char_Vec -> _char_Vec
+%LCLop tail :_char_Vec -> _char_Vec
+%LCLop __ \in __  :char, _char_Vec -> bool
+%LCLop nullTerminated :_char_Vec -> bool
+%LCLop throughNull :_char_Vec -> _char_Vec
+%LCLop sameStr :_char_Vec, _char_Vec -> bool
+%LCLop lenStr :_char_Vec -> int
+%LCLop times10plus :int, int -> int
+%LCLop plus1 :int -> int
+%LCLop 2 : -> int
+%LCLop 3 : -> int
+%LCLop 4 : -> int
+%LCLop 5 : -> int
+%LCLop 6 : -> int
+%LCLop 7 : -> int
+%LCLop 8 : -> int
+%LCLop 9 : -> int
+%LCLop __ * __  :int, int -> int
+%LCLop __ * __  :double, double -> double
+%LCLop true : -> bool
+%LCLop false : -> bool
+%LCLop __ \and __  :bool, bool -> bool
+%LCLop __ \or __  :bool, bool -> bool
+%LCLop __ \eq __  :bool, bool -> bool
+%LCLop __ \eq __  :int, int -> bool
+%LCLop __ \eq __  :double, double -> bool
+%LCLop __ \eq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \eq __  :char, char -> bool
+%LCLop \not __  :bool -> bool
+%LCLop __ \neq __  :bool, bool -> bool
+%LCLop __ \neq __  :int, int -> bool
+%LCLop __ \neq __  :double, double -> bool
+%LCLop __ \neq __  :_char_Vec, _char_Vec -> bool
+%LCLop __ \neq __  :char, char -> bool
+%LCLop { __ } :char -> _char_Vec
+%LCLop __ |- __  :_char_Vec, char -> _char_Vec
+%LCLop __ [] :__char_Obj_Ptr -> __char_Obj_Arr
+%LCLop __ [] :____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Arr
+%LCLop __ [] :__int_Obj_Ptr -> __int_Obj_Arr
+%LCLop __ -| __  :char, _char_Vec -> _char_Vec
+%LCLop __ [__] :_char_Vec, int -> char
+%LCLop __ [__] :__char_Obj_Arr, int -> _char_Obj
+%LCLop __ [__] :___char_Obj_Ptr_Vec, int -> __char_Obj_Ptr
+%LCLop __ [__] :____char_Obj_Ptr_Obj_Arr, int -> ___char_Obj_Ptr_Obj
+%LCLop __ [__] :_int_Vec, int -> int
+%LCLop __ [__] :__int_Obj_Arr, int -> _int_Obj
+%LCLop __ \leq __  :int, int -> bool
+%LCLop __ \leq __  :double, double -> bool
+%LCLop __ \geq __  :int, int -> bool
+%LCLop __ \geq __  :double, double -> bool
+%LCLop null : -> char
+%LCLop NIL : -> __char_Obj_Ptr
+%LCLop NIL : -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop NIL : -> __int_Obj_Ptr
+%LCLop - __  :int -> int
+%LCLop - __  :double -> double
+%LCLop __ + __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ + __  :int, __char_Obj_Ptr -> __char_Obj_Ptr
+%LCLop __ + __  :int, int -> int
+%LCLop __ + __  :double, double -> double
+%LCLop __ + __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :int, ____char_Obj_Ptr_Obj_Ptr -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ + __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ + __  :int, __int_Obj_Ptr -> __int_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, int -> __char_Obj_Ptr
+%LCLop __ - __  :__char_Obj_Ptr, __char_Obj_Ptr -> int
+%LCLop __ - __  :int, int -> int
+%LCLop __ - __  :double, double -> double
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, int -> ____char_Obj_Ptr_Obj_Ptr
+%LCLop __ - __  :____char_Obj_Ptr_Obj_Ptr, ____char_Obj_Ptr_Obj_Ptr -> int
+%LCLop __ - __  :__int_Obj_Ptr, int -> __int_Obj_Ptr
+%LCLop __ - __  :__int_Obj_Ptr, __int_Obj_Ptr -> int
+%LCLop sizeof :bool -> int
+%LCLop sizeof :int -> int
+%LCLop sizeof :char -> int
+%LCLop sizeof :void -> int
+%LCLop sizeof :float -> int
+%LCLop sizeof :double -> int
+%LCLop isSub :_char_Vec, int -> bool
+%LCLop isSub :__char_Obj_Arr, int -> bool
+%LCLop isSub :___char_Obj_Ptr_Vec, int -> bool
+%LCLop isSub :____char_Obj_Ptr_Obj_Arr, int -> bool
+%LCLop isSub :_int_Vec, int -> bool
+%LCLop isSub :__int_Obj_Arr, int -> bool
+%LCLop succ :int -> int
+%LCLop pred :int -> int
+%LCLop abs :int -> int
+%LCLop abs :double -> double
+%LCLop div :int, int -> int
+%LCLop mod :int, int -> int
+%LCLop min :int, int -> int
+%LCLtype float float exposed
+%LCLtype bool bool immutable
+%LCLconst FALSE bool
+%LCLconst TRUE bool
+%LCLfcn f1 : ____char_Obj_Ptr_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn f2 : ____char_Obj_Ptr_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLfcn f3 : __int_Obj_Ptr -> void 
+%LCLfcnGlobals 
+%LCLSymbolTableEnd
diff --git a/test/ulstypes.c b/test/ulstypes.c
new file mode 100644
index 0000000..c5689e7
--- /dev/null
+++ b/test/ulstypes.c
@@ -0,0 +1,25 @@
+unsigned int ui;
+long int li;
+long unsigned short si; /* 1. contradictory qualifiers */
+
+long int f (unsigned int x)
+{
+  long int loli = 12;
+  int loc = 3;
+
+  loc = f (li);    /* 2, 3. pass long as unsigned, assign unsigned to int */
+  loc = f (ui);    /* 4. assign unsigned to int */
+  loc = f (loc);   /* 5, 6. pass int as unsigned, assign unsigned to int */
+
+  loli = loc;      /* [7. if -relaxquals] */
+  return x;        /* 7. return unsigned int as long int */
+}
+
+unsigned int x1 = 0;
+unsigned int x2 = 23;
+unsigned int x3 = -15; /* 8. assign -15 to unsigned */
+unsigned int x4 = -15U; 
+long int x5 = 0L;
+long int x6 = 0;
+short int x7 = 14; 
+
diff --git a/test/ulstypes.expect b/test/ulstypes.expect
new file mode 100644
index 0000000..5b7c753
--- /dev/null
+++ b/test/ulstypes.expect
@@ -0,0 +1,54 @@
+
+ulstypes.c:3:23: Contradictory long and short type qualifiers
+ulstypes.c: (in function f)
+ulstypes.c:10:12: Function f expects arg 1 to be unsigned int gets long int: li
+ulstypes.c:10:3: Assignment of long int to int: loc = f(li)
+ulstypes.c:11:3: Assignment of long int to int: loc = f(ui)
+ulstypes.c:12:12: Function f expects arg 1 to be unsigned int gets int: loc
+ulstypes.c:12:3: Assignment of long int to int: loc = f(loc)
+ulstypes.c:15:10: Return value type unsigned int does not match declared type
+                     long int: x
+ulstypes.c:20:19: Variable x3 initialized to type int, expects unsigned int:
+                     -15
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+ulstypes.c:3:23: Contradictory long and short type qualifiers
+ulstypes.c: (in function f)
+ulstypes.c:7:19: Variable loli initialized to type int, expects long int: 12
+ulstypes.c:10:12: Undocumented use of global li
+ulstypes.c:10:12: Function f expects arg 1 to be unsigned int gets long int: li
+ulstypes.c:10:9: Undetected modification possible from call to unconstrained
+                    function f: f
+ulstypes.c:10:3: Assignment of long int to int: loc = f(li)
+ulstypes.c:11:12: Undocumented use of global ui
+ulstypes.c:11:9: Undetected modification possible from call to unconstrained
+                    function f: f
+ulstypes.c:11:3: Assignment of long int to int: loc = f(ui)
+ulstypes.c:12:12: Function f expects arg 1 to be unsigned int gets int: loc
+ulstypes.c:12:9: Undetected modification possible from call to unconstrained
+                    function f: f
+ulstypes.c:12:3: Assignment of long int to int: loc = f(loc)
+ulstypes.c:14:3: Assignment of int to long int: loli = loc
+ulstypes.c:15:10: Return value type unsigned int does not match declared type
+                     long int: x
+ulstypes.c:19:19: Variable x2 initialized to type int, expects unsigned int: 23
+ulstypes.c:20:19: Variable x3 initialized to type int, expects unsigned int:
+                     -15
+ulstypes.c:24:16: Variable x7 initialized to type int, expects short int: 14
+ulstypes.c:3:21: Variable si declared but not used
+ulstypes.c:18:14: Variable x1 declared but not used
+ulstypes.c:19:14: Variable x2 declared but not used
+ulstypes.c:20:14: Variable x3 declared but not used
+ulstypes.c:21:14: Variable x4 declared but not used
+ulstypes.c:22:10: Variable x5 declared but not used
+ulstypes.c:23:10: Variable x6 declared but not used
+ulstypes.c:24:11: Variable x7 declared but not used
+ulstypes.c:1:14: Variable exported but not used outside ulstypes: ui
+ulstypes.c:2:10: Variable exported but not used outside ulstypes: li
+ulstypes.c:5:10: Function exported but not used outside ulstypes: f
+   ulstypes.c:16:1: Definition of f
+
+Finished LCLint checking --- 28 code errors found, as expected
diff --git a/test/ulstypes.out b/test/ulstypes.out
new file mode 100644
index 0000000..5b7c753
--- /dev/null
+++ b/test/ulstypes.out
@@ -0,0 +1,54 @@
+
+ulstypes.c:3:23: Contradictory long and short type qualifiers
+ulstypes.c: (in function f)
+ulstypes.c:10:12: Function f expects arg 1 to be unsigned int gets long int: li
+ulstypes.c:10:3: Assignment of long int to int: loc = f(li)
+ulstypes.c:11:3: Assignment of long int to int: loc = f(ui)
+ulstypes.c:12:12: Function f expects arg 1 to be unsigned int gets int: loc
+ulstypes.c:12:3: Assignment of long int to int: loc = f(loc)
+ulstypes.c:15:10: Return value type unsigned int does not match declared type
+                     long int: x
+ulstypes.c:20:19: Variable x3 initialized to type int, expects unsigned int:
+                     -15
+
+Finished LCLint checking --- 8 code errors found, as expected
+
+Finished LCLint checking --- no code errors found
+
+ulstypes.c:3:23: Contradictory long and short type qualifiers
+ulstypes.c: (in function f)
+ulstypes.c:7:19: Variable loli initialized to type int, expects long int: 12
+ulstypes.c:10:12: Undocumented use of global li
+ulstypes.c:10:12: Function f expects arg 1 to be unsigned int gets long int: li
+ulstypes.c:10:9: Undetected modification possible from call to unconstrained
+                    function f: f
+ulstypes.c:10:3: Assignment of long int to int: loc = f(li)
+ulstypes.c:11:12: Undocumented use of global ui
+ulstypes.c:11:9: Undetected modification possible from call to unconstrained
+                    function f: f
+ulstypes.c:11:3: Assignment of long int to int: loc = f(ui)
+ulstypes.c:12:12: Function f expects arg 1 to be unsigned int gets int: loc
+ulstypes.c:12:9: Undetected modification possible from call to unconstrained
+                    function f: f
+ulstypes.c:12:3: Assignment of long int to int: loc = f(loc)
+ulstypes.c:14:3: Assignment of int to long int: loli = loc
+ulstypes.c:15:10: Return value type unsigned int does not match declared type
+                     long int: x
+ulstypes.c:19:19: Variable x2 initialized to type int, expects unsigned int: 23
+ulstypes.c:20:19: Variable x3 initialized to type int, expects unsigned int:
+                     -15
+ulstypes.c:24:16: Variable x7 initialized to type int, expects short int: 14
+ulstypes.c:3:21: Variable si declared but not used
+ulstypes.c:18:14: Variable x1 declared but not used
+ulstypes.c:19:14: Variable x2 declared but not used
+ulstypes.c:20:14: Variable x3 declared but not used
+ulstypes.c:21:14: Variable x4 declared but not used
+ulstypes.c:22:10: Variable x5 declared but not used
+ulstypes.c:23:10: Variable x6 declared but not used
+ulstypes.c:24:11: Variable x7 declared but not used
+ulstypes.c:1:14: Variable exported but not used outside ulstypes: ui
+ulstypes.c:2:10: Variable exported but not used outside ulstypes: li
+ulstypes.c:5:10: Function exported but not used outside ulstypes: f
+   ulstypes.c:16:1: Definition of f
+
+Finished LCLint checking --- 28 code errors found, as expected
diff --git a/test/union.c b/test/union.c
new file mode 100644
index 0000000..31418c6
--- /dev/null
+++ b/test/union.c
@@ -0,0 +1,84 @@
+typedef union _ut
+{
+  int x;
+  int y;
+  int *ox;
+  /*@dependent@*/ int *dx;
+  struct { int a; int b; int *ip; } st;
+} *ut;
+
+extern /*@only@*/ /*@out@*/ void *smalloc (size_t);
+
+ut ut_create1 (/*@unused@*/ int a)
+{
+  ut u = (ut) smalloc (sizeof (*u));
+
+  return u; /* 1. Returned union u contains no defined field */
+}
+
+ut ut_create2 (int a)
+{
+  ut u = (ut) smalloc (sizeof (*u));
+
+  u->x = a;
+  return u; 
+}
+
+ut ut_create3 (int a)
+{
+  ut u = (ut) smalloc (sizeof (*u));
+
+  u->x = a;
+  u->y = a;
+  return u; /* [Not anymore. Returned union u has 2 defined fields: x, y */
+}
+
+ut ut_create4 (int *t)
+{
+  ut u = (ut) smalloc (sizeof (*u));  
+  
+  u->ox = t; /* 2. Implicitly temp storage t assigned to implicitly only */
+  return u;
+}
+
+ut ut_create5 (int *t)
+{
+  ut u = (ut) smalloc (sizeof (*u));  
+  
+  u->dx = t; /* 3. Implicitly temp storage t assigned to dependent: u->dx = t */
+  return u;
+}
+
+ut ut_create6 (void)
+{
+  ut u = (ut) smalloc (sizeof (*u));  
+
+  u->st.a = 3;
+  return u; /* 4. Returned storage u->st contains 2 undefined fields: b, ip */
+}
+
+ut ut_create7 (int *p)
+{
+  ut u = (ut) smalloc (sizeof (*u));  
+
+  u->st.a = 3;
+  u->st.b = 4;
+  u->st.ip = p; /* 5. Implicitly temp storage p assigned to implicitly only */
+  return u;
+}
+
+void ut_mangle1 (ut u)
+{
+  free (u->ox);
+} /* 6. Released storage u->ox reachable from parameter */
+
+void ut_mangle2 (ut u)
+{
+  free (u->st.ip);
+} /* 7. Released storage u->st.ip reachable from parameter */
+
+void ut_mangle3 (ut u)
+{
+  free (u->st.ip);
+  u->x = 3; /* This one's a toughy... */
+} /* 8. Released storage u->st.ip reachable from parameter */
diff --git a/test/union.expect b/test/union.expect
new file mode 100644
index 0000000..da6edcf
--- /dev/null
+++ b/test/union.expect
@@ -0,0 +1,25 @@
+
+union.c: (in function ut_create1)
+union.c:16:10: Returned union *u has no defined field
+union.c: (in function ut_create4)
+union.c:40:3: Implicitly temp storage t assigned to implicitly only: u->ox = t
+union.c: (in function ut_create5)
+union.c:48:3: Implicitly temp storage t assigned to dependent: u->dx = t
+union.c: (in function ut_create6)
+union.c:57:10: Returned storage u->st contains 2 undefined fields: b, ip
+union.c: (in function ut_create7)
+union.c:66:3: Implicitly temp storage p assigned to implicitly only:
+                 u->st.ip = p
+union.c: (in function ut_mangle1)
+union.c:73:2: Released storage u->ox reachable from parameter at return point
+   union.c:72:9: Storage u->ox is released
+union.c: (in function ut_mangle2)
+union.c:78:2: Released storage u->st.ip reachable from parameter at return
+                 point
+   union.c:77:9: Storage u->st.ip is released
+union.c: (in function ut_mangle3)
+union.c:84:2: Released storage u->st.ip reachable from parameter at return
+                 point
+   union.c:82:9: Storage u->st.ip is released
+
+Finished LCLint checking --- 8 code errors found, as expected
diff --git a/test/union.out b/test/union.out
new file mode 100644
index 0000000..da6edcf
--- /dev/null
+++ b/test/union.out
@@ -0,0 +1,25 @@
+
+union.c: (in function ut_create1)
+union.c:16:10: Returned union *u has no defined field
+union.c: (in function ut_create4)
+union.c:40:3: Implicitly temp storage t assigned to implicitly only: u->ox = t
+union.c: (in function ut_create5)
+union.c:48:3: Implicitly temp storage t assigned to dependent: u->dx = t
+union.c: (in function ut_create6)
+union.c:57:10: Returned storage u->st contains 2 undefined fields: b, ip
+union.c: (in function ut_create7)
+union.c:66:3: Implicitly temp storage p assigned to implicitly only:
+                 u->st.ip = p
+union.c: (in function ut_mangle1)
+union.c:73:2: Released storage u->ox reachable from parameter at return point
+   union.c:72:9: Storage u->ox is released
+union.c: (in function ut_mangle2)
+union.c:78:2: Released storage u->st.ip reachable from parameter at return
+                 point
+   union.c:77:9: Storage u->st.ip is released
+union.c: (in function ut_mangle3)
+union.c:84:2: Released storage u->st.ip reachable from parameter at return
+                 point
+   union.c:82:9: Storage u->st.ip is released
+
+Finished LCLint checking --- 8 code errors found, as expected
diff --git a/test/unreachable.c b/test/unreachable.c
new file mode 100644
index 0000000..d41cd52
--- /dev/null
+++ b/test/unreachable.c
@@ -0,0 +1,48 @@
+/*@exits@*/ void f (void)
+{
+  int x = 3;
+
+  exit(x);
+  x++; /* 1. Unreachable code */
+}
+
+void tu(int y)
+{
+  int x = 16;
+
+  if (x == y)
+    {
+      return;
+    }
+  else
+    {
+      x++;
+      f();
+      return; /* 2. Unreachable code */
+    }
+
+  y++; /* 3. Unreachable code: no longer reported because of previous error. */
+}
+
+int s(int z)
+{
+  switch (z)
+    {
+    case 1: return 3;
+    case 2: return 12;
+    case 3: z++; return z; z--; /* 4. Unreachable code */
+    case 4: /* 5. Fall through case */
+      switch (z + 1)
+	{
+	case 1: return 18;
+	case 2: z++;
+	}
+      return z;
+    default:
+      return 12;
+    }
+  
+  z++; /* 6. Unreachable code */
+}
+
+
diff --git a/test/unreachable.expect b/test/unreachable.expect
new file mode 100644
index 0000000..99bcc60
--- /dev/null
+++ b/test/unreachable.expect
@@ -0,0 +1,27 @@
+
+unreachable.c: (in function f)
+unreachable.c:6:4: Unreachable code: x++
+unreachable.c: (in function tu)
+unreachable.c:21:7: Unreachable code: return
+unreachable.c: (in function s)
+unreachable.c:33:29: Unreachable code: z--
+unreachable.c:34:10: Fall through case (no preceeding break)
+unreachable.c:45:4: Unreachable code: z++
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+unreachable.c: (in function s)
+unreachable.c:34:10: Fall through case (no preceeding break)
+unreachable.c:46:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+switch.c: (in function f3)
+switch.c:31:2: Path with no return in function declared to return int
+switch.c: (in function f5)
+switch.c:49:6: Missing case in switch: THREE
+switch.c:50:2: Path with no return in function declared to return int
+switch.c: (in function f6)
+switch.c:70:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/unreachable.out b/test/unreachable.out
new file mode 100644
index 0000000..99bcc60
--- /dev/null
+++ b/test/unreachable.out
@@ -0,0 +1,27 @@
+
+unreachable.c: (in function f)
+unreachable.c:6:4: Unreachable code: x++
+unreachable.c: (in function tu)
+unreachable.c:21:7: Unreachable code: return
+unreachable.c: (in function s)
+unreachable.c:33:29: Unreachable code: z--
+unreachable.c:34:10: Fall through case (no preceeding break)
+unreachable.c:45:4: Unreachable code: z++
+
+Finished LCLint checking --- 5 code errors found, as expected
+
+unreachable.c: (in function s)
+unreachable.c:34:10: Fall through case (no preceeding break)
+unreachable.c:46:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 2 code errors found, as expected
+
+switch.c: (in function f3)
+switch.c:31:2: Path with no return in function declared to return int
+switch.c: (in function f5)
+switch.c:49:6: Missing case in switch: THREE
+switch.c:50:2: Path with no return in function declared to return int
+switch.c: (in function f6)
+switch.c:70:2: Path with no return in function declared to return int
+
+Finished LCLint checking --- 4 code errors found, as expected
diff --git a/test/unused.c b/test/unused.c
new file mode 100644
index 0000000..02123d9
--- /dev/null
+++ b/test/unused.c
@@ -0,0 +1,28 @@
+typedef int *dumbtype;
+
+typedef struct _st
+{
+  int x;
+  int y;
+  int dumb;
+  struct _inner
+    {
+      int l;
+      int m;
+      int silly;
+    } inner;
+} st;
+
+extern int undef (int x);
+static int r (void);
+
+static int f (int x, st stx)
+{
+  return (x + stx.x + stx.y + stx.inner.l + stx.inner.m + r());
+}
+
+static int r (void)
+{
+  return undef (3);
+}
+
diff --git a/test/unused.expect b/test/unused.expect
new file mode 100644
index 0000000..3f5c117
--- /dev/null
+++ b/test/unused.expect
@@ -0,0 +1,17 @@
+
+unused.c:19:12: File static function f declared but not used
+   unused.c:22:1: Definition of f
+unused.c:16:12: Function undef declared but not defined
+unused.c:16:12: Function undef exported but not declared in header file
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+unused.c:19:12: File static function f declared but not used
+   unused.c:22:1: Definition of f
+unused.c:16:12: Function undef declared but not defined
+unused.c:1:14: Type dumbtype declared but not used
+unused.c:12:11: Field silly of structure struct _inner declared but not used
+unused.c:7:7: Field dumb of structure struct _st declared but not used
+unused.c:16:12: Function undef exported but not declared in header file
+
+Finished LCLint checking --- 6 code errors found, as expected
diff --git a/test/unused.out b/test/unused.out
new file mode 100644
index 0000000..3f5c117
--- /dev/null
+++ b/test/unused.out
@@ -0,0 +1,17 @@
+
+unused.c:19:12: File static function f declared but not used
+   unused.c:22:1: Definition of f
+unused.c:16:12: Function undef declared but not defined
+unused.c:16:12: Function undef exported but not declared in header file
+
+Finished LCLint checking --- 3 code errors found, as expected
+
+unused.c:19:12: File static function f declared but not used
+   unused.c:22:1: Definition of f
+unused.c:16:12: Function undef declared but not defined
+unused.c:1:14: Type dumbtype declared but not used
+unused.c:12:11: Field silly of structure struct _inner declared but not used
+unused.c:7:7: Field dumb of structure struct _st declared but not used
+unused.c:16:12: Function undef exported but not declared in header file
+
+Finished LCLint checking --- 6 code errors found, as expected
-- 
2.45.1